From 026c81b775faeab051e5995d9d2dc7e5560320fd Mon Sep 17 00:00:00 2001 From: lockbitchat Date: Sun, 17 May 2026 18:03:10 -0400 Subject: [PATCH] chore: stop tracking node_modules --- .gitignore | 6 + node_modules/.bin/cssesc | 16 - node_modules/.bin/cssesc.cmd | 17 - node_modules/.bin/cssesc.ps1 | 28 - node_modules/.bin/esbuild | 16 - node_modules/.bin/esbuild.cmd | 17 - node_modules/.bin/esbuild.ps1 | 28 - node_modules/.bin/glob | 16 - node_modules/.bin/glob.cmd | 17 - node_modules/.bin/glob.ps1 | 28 - node_modules/.bin/nanoid | 16 - node_modules/.bin/nanoid.cmd | 17 - node_modules/.bin/nanoid.ps1 | 28 - node_modules/.bin/node-which | 16 - node_modules/.bin/node-which.cmd | 17 - node_modules/.bin/node-which.ps1 | 28 - node_modules/.bin/qrcode | 16 - node_modules/.bin/qrcode.cmd | 17 - node_modules/.bin/qrcode.ps1 | 28 - node_modules/.bin/resolve | 16 - node_modules/.bin/resolve.cmd | 17 - node_modules/.bin/resolve.ps1 | 28 - node_modules/.bin/sucrase | 16 - node_modules/.bin/sucrase-node | 16 - node_modules/.bin/sucrase-node.cmd | 17 - node_modules/.bin/sucrase-node.ps1 | 28 - node_modules/.bin/sucrase.cmd | 17 - node_modules/.bin/sucrase.ps1 | 28 - node_modules/.bin/tailwind | 16 - node_modules/.bin/tailwind.cmd | 17 - node_modules/.bin/tailwind.ps1 | 28 - node_modules/.bin/tailwindcss | 16 - node_modules/.bin/tailwindcss.cmd | 17 - node_modules/.bin/tailwindcss.ps1 | 28 - node_modules/.bin/yaml | 16 - node_modules/.bin/yaml.cmd | 17 - node_modules/.bin/yaml.ps1 | 28 - node_modules/.package-lock.json | 1746 - node_modules/@alloc/quick-lru/index.d.ts | 128 - node_modules/@alloc/quick-lru/index.js | 263 - node_modules/@alloc/quick-lru/license | 9 - node_modules/@alloc/quick-lru/package.json | 43 - node_modules/@alloc/quick-lru/readme.md | 139 - node_modules/@esbuild/win32-x64/README.md | 3 - node_modules/@esbuild/win32-x64/esbuild.exe | Bin 10557952 -> 0 bytes node_modules/@esbuild/win32-x64/package.json | 20 - node_modules/@isaacs/cliui/LICENSE.txt | 14 - node_modules/@isaacs/cliui/README.md | 143 - node_modules/@isaacs/cliui/build/index.cjs | 317 - node_modules/@isaacs/cliui/build/index.d.cts | 43 - node_modules/@isaacs/cliui/build/lib/index.js | 302 - node_modules/@isaacs/cliui/index.mjs | 14 - .../cliui/node_modules/ansi-regex/index.d.ts | 33 - .../cliui/node_modules/ansi-regex/index.js | 14 - .../cliui/node_modules/ansi-regex/license | 9 - .../node_modules/ansi-regex/package.json | 61 - .../cliui/node_modules/ansi-regex/readme.md | 66 - .../cliui/node_modules/ansi-styles/index.d.ts | 236 - .../cliui/node_modules/ansi-styles/index.js | 223 - .../cliui/node_modules/ansi-styles/license | 9 - .../node_modules/ansi-styles/package.json | 54 - .../cliui/node_modules/ansi-styles/readme.md | 173 - .../node_modules/emoji-regex/LICENSE-MIT.txt | 20 - .../cliui/node_modules/emoji-regex/README.md | 137 - .../node_modules/emoji-regex/RGI_Emoji.d.ts | 5 - .../node_modules/emoji-regex/RGI_Emoji.js | 6 - .../emoji-regex/es2015/RGI_Emoji.d.ts | 5 - .../emoji-regex/es2015/RGI_Emoji.js | 6 - .../emoji-regex/es2015/index.d.ts | 5 - .../node_modules/emoji-regex/es2015/index.js | 6 - .../node_modules/emoji-regex/es2015/text.d.ts | 5 - .../node_modules/emoji-regex/es2015/text.js | 6 - .../cliui/node_modules/emoji-regex/index.d.ts | 5 - .../cliui/node_modules/emoji-regex/index.js | 6 - .../node_modules/emoji-regex/package.json | 52 - .../cliui/node_modules/emoji-regex/text.d.ts | 5 - .../cliui/node_modules/emoji-regex/text.js | 6 - .../node_modules/string-width/index.d.ts | 29 - .../cliui/node_modules/string-width/index.js | 54 - .../cliui/node_modules/string-width/license | 9 - .../node_modules/string-width/package.json | 59 - .../cliui/node_modules/string-width/readme.md | 67 - .../cliui/node_modules/strip-ansi/index.d.ts | 15 - .../cliui/node_modules/strip-ansi/index.js | 14 - .../cliui/node_modules/strip-ansi/license | 9 - .../node_modules/strip-ansi/package.json | 59 - .../cliui/node_modules/strip-ansi/readme.md | 37 - .../cliui/node_modules/wrap-ansi/index.d.ts | 41 - .../cliui/node_modules/wrap-ansi/index.js | 214 - .../cliui/node_modules/wrap-ansi/license | 9 - .../cliui/node_modules/wrap-ansi/package.json | 69 - .../cliui/node_modules/wrap-ansi/readme.md | 91 - node_modules/@isaacs/cliui/package.json | 86 - node_modules/@jridgewell/gen-mapping/LICENSE | 19 - .../@jridgewell/gen-mapping/README.md | 227 - .../gen-mapping/dist/gen-mapping.mjs | 292 - .../gen-mapping/dist/gen-mapping.mjs.map | 6 - .../gen-mapping/dist/gen-mapping.umd.js | 358 - .../gen-mapping/dist/gen-mapping.umd.js.map | 6 - .../gen-mapping/dist/types/gen-mapping.d.ts | 88 - .../gen-mapping/dist/types/set-array.d.ts | 32 - .../dist/types/sourcemap-segment.d.ts | 12 - .../gen-mapping/dist/types/types.d.ts | 43 - .../@jridgewell/gen-mapping/package.json | 67 - .../gen-mapping/src/gen-mapping.ts | 614 - .../@jridgewell/gen-mapping/src/set-array.ts | 82 - .../gen-mapping/src/sourcemap-segment.ts | 16 - .../@jridgewell/gen-mapping/src/types.ts | 61 - .../gen-mapping/types/gen-mapping.d.cts | 89 - .../gen-mapping/types/gen-mapping.d.cts.map | 1 - .../gen-mapping/types/gen-mapping.d.mts | 89 - .../gen-mapping/types/gen-mapping.d.mts.map | 1 - .../gen-mapping/types/set-array.d.cts | 33 - .../gen-mapping/types/set-array.d.cts.map | 1 - .../gen-mapping/types/set-array.d.mts | 33 - .../gen-mapping/types/set-array.d.mts.map | 1 - .../gen-mapping/types/sourcemap-segment.d.cts | 13 - .../types/sourcemap-segment.d.cts.map | 1 - .../gen-mapping/types/sourcemap-segment.d.mts | 13 - .../types/sourcemap-segment.d.mts.map | 1 - .../@jridgewell/gen-mapping/types/types.d.cts | 44 - .../gen-mapping/types/types.d.cts.map | 1 - .../@jridgewell/gen-mapping/types/types.d.mts | 44 - .../gen-mapping/types/types.d.mts.map | 1 - node_modules/@jridgewell/resolve-uri/LICENSE | 19 - .../@jridgewell/resolve-uri/README.md | 40 - .../resolve-uri/dist/resolve-uri.mjs | 232 - .../resolve-uri/dist/resolve-uri.mjs.map | 1 - .../resolve-uri/dist/resolve-uri.umd.js | 240 - .../resolve-uri/dist/resolve-uri.umd.js.map | 1 - .../resolve-uri/dist/types/resolve-uri.d.ts | 4 - .../@jridgewell/resolve-uri/package.json | 69 - .../@jridgewell/sourcemap-codec/LICENSE | 19 - .../@jridgewell/sourcemap-codec/README.md | 264 - .../sourcemap-codec/dist/sourcemap-codec.mjs | 423 - .../dist/sourcemap-codec.mjs.map | 6 - .../dist/sourcemap-codec.umd.js | 464 - .../dist/sourcemap-codec.umd.js.map | 6 - .../@jridgewell/sourcemap-codec/package.json | 63 - .../@jridgewell/sourcemap-codec/src/scopes.ts | 345 - .../sourcemap-codec/src/sourcemap-codec.ts | 111 - .../sourcemap-codec/src/strings.ts | 65 - .../@jridgewell/sourcemap-codec/src/vlq.ts | 55 - .../sourcemap-codec/types/scopes.d.cts | 50 - .../sourcemap-codec/types/scopes.d.cts.map | 1 - .../sourcemap-codec/types/scopes.d.mts | 50 - .../sourcemap-codec/types/scopes.d.mts.map | 1 - .../types/sourcemap-codec.d.cts | 9 - .../types/sourcemap-codec.d.cts.map | 1 - .../types/sourcemap-codec.d.mts | 9 - .../types/sourcemap-codec.d.mts.map | 1 - .../sourcemap-codec/types/strings.d.cts | 16 - .../sourcemap-codec/types/strings.d.cts.map | 1 - .../sourcemap-codec/types/strings.d.mts | 16 - .../sourcemap-codec/types/strings.d.mts.map | 1 - .../sourcemap-codec/types/vlq.d.cts | 7 - .../sourcemap-codec/types/vlq.d.cts.map | 1 - .../sourcemap-codec/types/vlq.d.mts | 7 - .../sourcemap-codec/types/vlq.d.mts.map | 1 - .../@jridgewell/trace-mapping/LICENSE | 19 - .../@jridgewell/trace-mapping/README.md | 348 - .../trace-mapping/dist/trace-mapping.mjs | 504 - .../trace-mapping/dist/trace-mapping.mjs.map | 6 - .../trace-mapping/dist/trace-mapping.umd.js | 570 - .../dist/trace-mapping.umd.js.map | 6 - .../@jridgewell/trace-mapping/package.json | 67 - .../trace-mapping/src/binary-search.ts | 115 - .../trace-mapping/src/by-source.ts | 65 - .../trace-mapping/src/flatten-map.ts | 192 - .../@jridgewell/trace-mapping/src/resolve.ts | 16 - .../@jridgewell/trace-mapping/src/sort.ts | 45 - .../trace-mapping/src/sourcemap-segment.ts | 23 - .../trace-mapping/src/strip-filename.ts | 8 - .../trace-mapping/src/trace-mapping.ts | 504 - .../@jridgewell/trace-mapping/src/types.ts | 114 - .../trace-mapping/types/binary-search.d.cts | 33 - .../types/binary-search.d.cts.map | 1 - .../trace-mapping/types/binary-search.d.mts | 33 - .../types/binary-search.d.mts.map | 1 - .../trace-mapping/types/by-source.d.cts | 8 - .../trace-mapping/types/by-source.d.cts.map | 1 - .../trace-mapping/types/by-source.d.mts | 8 - .../trace-mapping/types/by-source.d.mts.map | 1 - .../trace-mapping/types/flatten-map.d.cts | 9 - .../trace-mapping/types/flatten-map.d.cts.map | 1 - .../trace-mapping/types/flatten-map.d.mts | 9 - .../trace-mapping/types/flatten-map.d.mts.map | 1 - .../trace-mapping/types/resolve.d.cts | 4 - .../trace-mapping/types/resolve.d.cts.map | 1 - .../trace-mapping/types/resolve.d.mts | 4 - .../trace-mapping/types/resolve.d.mts.map | 1 - .../trace-mapping/types/sort.d.cts | 3 - .../trace-mapping/types/sort.d.cts.map | 1 - .../trace-mapping/types/sort.d.mts | 3 - .../trace-mapping/types/sort.d.mts.map | 1 - .../types/sourcemap-segment.d.cts | 17 - .../types/sourcemap-segment.d.cts.map | 1 - .../types/sourcemap-segment.d.mts | 17 - .../types/sourcemap-segment.d.mts.map | 1 - .../trace-mapping/types/strip-filename.d.cts | 5 - .../types/strip-filename.d.cts.map | 1 - .../trace-mapping/types/strip-filename.d.mts | 5 - .../types/strip-filename.d.mts.map | 1 - .../trace-mapping/types/trace-mapping.d.cts | 80 - .../types/trace-mapping.d.cts.map | 1 - .../trace-mapping/types/trace-mapping.d.mts | 80 - .../types/trace-mapping.d.mts.map | 1 - .../trace-mapping/types/types.d.cts | 107 - .../trace-mapping/types/types.d.cts.map | 1 - .../trace-mapping/types/types.d.mts | 107 - .../trace-mapping/types/types.d.mts.map | 1 - node_modules/@nodelib/fs.scandir/LICENSE | 21 - node_modules/@nodelib/fs.scandir/README.md | 171 - .../@nodelib/fs.scandir/out/adapters/fs.d.ts | 20 - .../@nodelib/fs.scandir/out/adapters/fs.js | 19 - .../@nodelib/fs.scandir/out/constants.d.ts | 4 - .../@nodelib/fs.scandir/out/constants.js | 17 - .../@nodelib/fs.scandir/out/index.d.ts | 12 - node_modules/@nodelib/fs.scandir/out/index.js | 26 - .../fs.scandir/out/providers/async.d.ts | 7 - .../fs.scandir/out/providers/async.js | 104 - .../fs.scandir/out/providers/common.d.ts | 1 - .../fs.scandir/out/providers/common.js | 13 - .../fs.scandir/out/providers/sync.d.ts | 5 - .../@nodelib/fs.scandir/out/providers/sync.js | 54 - .../@nodelib/fs.scandir/out/settings.d.ts | 20 - .../@nodelib/fs.scandir/out/settings.js | 24 - .../@nodelib/fs.scandir/out/types/index.d.ts | 20 - .../@nodelib/fs.scandir/out/types/index.js | 2 - .../@nodelib/fs.scandir/out/utils/fs.d.ts | 2 - .../@nodelib/fs.scandir/out/utils/fs.js | 19 - .../@nodelib/fs.scandir/out/utils/index.d.ts | 2 - .../@nodelib/fs.scandir/out/utils/index.js | 5 - node_modules/@nodelib/fs.scandir/package.json | 44 - node_modules/@nodelib/fs.stat/LICENSE | 21 - node_modules/@nodelib/fs.stat/README.md | 126 - .../@nodelib/fs.stat/out/adapters/fs.d.ts | 13 - .../@nodelib/fs.stat/out/adapters/fs.js | 17 - node_modules/@nodelib/fs.stat/out/index.d.ts | 12 - node_modules/@nodelib/fs.stat/out/index.js | 26 - .../@nodelib/fs.stat/out/providers/async.d.ts | 4 - .../@nodelib/fs.stat/out/providers/async.js | 36 - .../@nodelib/fs.stat/out/providers/sync.d.ts | 3 - .../@nodelib/fs.stat/out/providers/sync.js | 23 - .../@nodelib/fs.stat/out/settings.d.ts | 16 - node_modules/@nodelib/fs.stat/out/settings.js | 16 - .../@nodelib/fs.stat/out/types/index.d.ts | 4 - .../@nodelib/fs.stat/out/types/index.js | 2 - node_modules/@nodelib/fs.stat/package.json | 37 - node_modules/@nodelib/fs.walk/LICENSE | 21 - node_modules/@nodelib/fs.walk/README.md | 215 - node_modules/@nodelib/fs.walk/out/index.d.ts | 14 - node_modules/@nodelib/fs.walk/out/index.js | 34 - .../@nodelib/fs.walk/out/providers/async.d.ts | 12 - .../@nodelib/fs.walk/out/providers/async.js | 30 - .../@nodelib/fs.walk/out/providers/index.d.ts | 4 - .../@nodelib/fs.walk/out/providers/index.js | 9 - .../fs.walk/out/providers/stream.d.ts | 12 - .../@nodelib/fs.walk/out/providers/stream.js | 34 - .../@nodelib/fs.walk/out/providers/sync.d.ts | 10 - .../@nodelib/fs.walk/out/providers/sync.js | 14 - .../@nodelib/fs.walk/out/readers/async.d.ts | 30 - .../@nodelib/fs.walk/out/readers/async.js | 97 - .../@nodelib/fs.walk/out/readers/common.d.ts | 7 - .../@nodelib/fs.walk/out/readers/common.js | 31 - .../@nodelib/fs.walk/out/readers/reader.d.ts | 6 - .../@nodelib/fs.walk/out/readers/reader.js | 11 - .../@nodelib/fs.walk/out/readers/sync.d.ts | 15 - .../@nodelib/fs.walk/out/readers/sync.js | 59 - .../@nodelib/fs.walk/out/settings.d.ts | 30 - node_modules/@nodelib/fs.walk/out/settings.js | 26 - .../@nodelib/fs.walk/out/types/index.d.ts | 8 - .../@nodelib/fs.walk/out/types/index.js | 2 - node_modules/@nodelib/fs.walk/package.json | 44 - node_modules/@pkgjs/parseargs/.editorconfig | 14 - node_modules/@pkgjs/parseargs/CHANGELOG.md | 147 - node_modules/@pkgjs/parseargs/LICENSE | 201 - node_modules/@pkgjs/parseargs/README.md | 413 - .../parseargs/examples/is-default-value.js | 25 - .../parseargs/examples/limit-long-syntax.js | 35 - .../@pkgjs/parseargs/examples/negate.js | 43 - .../parseargs/examples/no-repeated-options.js | 31 - .../parseargs/examples/ordered-options.mjs | 41 - .../parseargs/examples/simple-hard-coded.js | 26 - node_modules/@pkgjs/parseargs/index.js | 396 - .../@pkgjs/parseargs/internal/errors.js | 47 - .../@pkgjs/parseargs/internal/primordials.js | 393 - .../@pkgjs/parseargs/internal/util.js | 14 - .../@pkgjs/parseargs/internal/validators.js | 89 - node_modules/@pkgjs/parseargs/package.json | 36 - node_modules/@pkgjs/parseargs/utils.js | 198 - node_modules/@types/offscreencanvas/LICENSE | 21 - node_modules/@types/offscreencanvas/README.md | 15 - .../@types/offscreencanvas/index.d.ts | 208 - .../@types/offscreencanvas/package.json | 36 - node_modules/ansi-regex/index.d.ts | 37 - node_modules/ansi-regex/index.js | 10 - node_modules/ansi-regex/license | 9 - node_modules/ansi-regex/package.json | 55 - node_modules/ansi-regex/readme.md | 78 - node_modules/ansi-styles/index.d.ts | 345 - node_modules/ansi-styles/index.js | 163 - node_modules/ansi-styles/license | 9 - node_modules/ansi-styles/package.json | 56 - node_modules/ansi-styles/readme.md | 152 - node_modules/any-promise/.jshintrc | 4 - node_modules/any-promise/.npmignore | 7 - node_modules/any-promise/LICENSE | 19 - node_modules/any-promise/README.md | 161 - node_modules/any-promise/implementation.d.ts | 3 - node_modules/any-promise/implementation.js | 1 - node_modules/any-promise/index.d.ts | 73 - node_modules/any-promise/index.js | 1 - node_modules/any-promise/loader.js | 78 - node_modules/any-promise/optional.js | 6 - node_modules/any-promise/package.json | 45 - node_modules/any-promise/register-shim.js | 18 - node_modules/any-promise/register.d.ts | 17 - node_modules/any-promise/register.js | 94 - .../any-promise/register/bluebird.d.ts | 1 - node_modules/any-promise/register/bluebird.js | 2 - .../any-promise/register/es6-promise.d.ts | 1 - .../any-promise/register/es6-promise.js | 2 - node_modules/any-promise/register/lie.d.ts | 1 - node_modules/any-promise/register/lie.js | 2 - .../register/native-promise-only.d.ts | 1 - .../register/native-promise-only.js | 2 - node_modules/any-promise/register/pinkie.d.ts | 1 - node_modules/any-promise/register/pinkie.js | 2 - .../any-promise/register/promise.d.ts | 1 - node_modules/any-promise/register/promise.js | 2 - node_modules/any-promise/register/q.d.ts | 1 - node_modules/any-promise/register/q.js | 2 - node_modules/any-promise/register/rsvp.d.ts | 1 - node_modules/any-promise/register/rsvp.js | 2 - node_modules/any-promise/register/vow.d.ts | 1 - node_modules/any-promise/register/vow.js | 2 - node_modules/any-promise/register/when.d.ts | 1 - node_modules/any-promise/register/when.js | 2 - node_modules/anymatch/LICENSE | 15 - node_modules/anymatch/README.md | 87 - node_modules/anymatch/index.d.ts | 20 - node_modules/anymatch/index.js | 104 - node_modules/anymatch/package.json | 48 - node_modules/arg/LICENSE.md | 21 - node_modules/arg/README.md | 317 - node_modules/arg/index.d.ts | 44 - node_modules/arg/index.js | 195 - node_modules/arg/package.json | 28 - .../balanced-match/.github/FUNDING.yml | 2 - node_modules/balanced-match/LICENSE.md | 21 - node_modules/balanced-match/README.md | 97 - node_modules/balanced-match/index.js | 62 - node_modules/balanced-match/package.json | 48 - node_modules/base64-js/LICENSE | 21 - node_modules/base64-js/README.md | 34 - node_modules/base64-js/base64js.min.js | 1 - node_modules/base64-js/index.d.ts | 3 - node_modules/base64-js/index.js | 150 - node_modules/base64-js/package.json | 47 - .../binary-extensions/binary-extensions.json | 263 - .../binary-extensions.json.d.ts | 3 - node_modules/binary-extensions/index.d.ts | 14 - node_modules/binary-extensions/index.js | 1 - node_modules/binary-extensions/license | 10 - node_modules/binary-extensions/package.json | 40 - node_modules/binary-extensions/readme.md | 25 - .../brace-expansion/.github/FUNDING.yml | 2 - node_modules/brace-expansion/LICENSE | 21 - node_modules/brace-expansion/README.md | 135 - node_modules/brace-expansion/index.js | 203 - node_modules/brace-expansion/package.json | 49 - node_modules/braces/LICENSE | 21 - node_modules/braces/README.md | 586 - node_modules/braces/index.js | 170 - node_modules/braces/lib/compile.js | 60 - node_modules/braces/lib/constants.js | 57 - node_modules/braces/lib/expand.js | 113 - node_modules/braces/lib/parse.js | 331 - node_modules/braces/lib/stringify.js | 32 - node_modules/braces/lib/utils.js | 122 - node_modules/braces/package.json | 77 - node_modules/camelcase-css/README.md | 27 - node_modules/camelcase-css/index-es5.js | 24 - node_modules/camelcase-css/index.js | 30 - node_modules/camelcase-css/license | 21 - node_modules/camelcase-css/package.json | 34 - node_modules/camelcase/index.d.ts | 63 - node_modules/camelcase/index.js | 76 - node_modules/camelcase/license | 9 - node_modules/camelcase/package.json | 43 - node_modules/camelcase/readme.md | 99 - node_modules/cbor-js/LICENSE | 21 - node_modules/cbor-js/README.md | 53 - node_modules/cbor-js/cbor.js | 406 - node_modules/cbor-js/package.json | 37 - node_modules/chokidar/LICENSE | 21 - node_modules/chokidar/README.md | 308 - node_modules/chokidar/index.js | 973 - node_modules/chokidar/lib/constants.js | 66 - node_modules/chokidar/lib/fsevents-handler.js | 526 - node_modules/chokidar/lib/nodefs-handler.js | 654 - .../node_modules/glob-parent/CHANGELOG.md | 110 - .../chokidar/node_modules/glob-parent/LICENSE | 15 - .../node_modules/glob-parent/README.md | 137 - .../node_modules/glob-parent/index.js | 42 - .../node_modules/glob-parent/package.json | 48 - node_modules/chokidar/package.json | 70 - node_modules/chokidar/types/index.d.ts | 192 - node_modules/cliui/CHANGELOG.md | 76 - node_modules/cliui/LICENSE.txt | 14 - node_modules/cliui/README.md | 115 - node_modules/cliui/index.js | 354 - node_modules/cliui/package.json | 65 - node_modules/color-convert/CHANGELOG.md | 54 - node_modules/color-convert/LICENSE | 21 - node_modules/color-convert/README.md | 68 - node_modules/color-convert/conversions.js | 839 - node_modules/color-convert/index.js | 81 - node_modules/color-convert/package.json | 48 - node_modules/color-convert/route.js | 97 - node_modules/color-name/LICENSE | 8 - node_modules/color-name/README.md | 11 - node_modules/color-name/index.js | 152 - node_modules/color-name/package.json | 28 - node_modules/commander/CHANGELOG.md | 436 - node_modules/commander/LICENSE | 22 - node_modules/commander/Readme.md | 713 - node_modules/commander/index.js | 1649 - node_modules/commander/package.json | 41 - node_modules/commander/typings/index.d.ts | 311 - node_modules/cross-spawn/LICENSE | 21 - node_modules/cross-spawn/README.md | 89 - node_modules/cross-spawn/index.js | 39 - node_modules/cross-spawn/lib/enoent.js | 59 - node_modules/cross-spawn/lib/parse.js | 91 - node_modules/cross-spawn/lib/util/escape.js | 47 - .../cross-spawn/lib/util/readShebang.js | 23 - .../cross-spawn/lib/util/resolveCommand.js | 52 - node_modules/cross-spawn/package.json | 73 - node_modules/cssesc/LICENSE-MIT.txt | 20 - node_modules/cssesc/README.md | 201 - node_modules/cssesc/bin/cssesc | 116 - node_modules/cssesc/cssesc.js | 110 - node_modules/cssesc/man/cssesc.1 | 70 - node_modules/cssesc/package.json | 51 - node_modules/decamelize/index.js | 13 - node_modules/decamelize/license | 21 - node_modules/decamelize/package.json | 38 - node_modules/decamelize/readme.md | 48 - node_modules/didyoumean/LICENSE | 14 - node_modules/didyoumean/README.md | 134 - node_modules/didyoumean/didYouMean-1.2.1.js | 274 - .../didyoumean/didYouMean-1.2.1.min.js | 17 - node_modules/didyoumean/package.json | 27 - node_modules/dijkstrajs/.travis.yml | 4 - node_modules/dijkstrajs/CONTRIBUTING.md | 8 - node_modules/dijkstrajs/LICENSE.md | 19 - node_modules/dijkstrajs/README.md | 18 - node_modules/dijkstrajs/dijkstra.js | 165 - node_modules/dijkstrajs/package.json | 60 - node_modules/dijkstrajs/test/dijkstra.test.js | 96 - node_modules/dlv/README.md | 76 - node_modules/dlv/dist/dlv.es.js | 2 - node_modules/dlv/dist/dlv.es.js.map | 1 - node_modules/dlv/dist/dlv.js | 2 - node_modules/dlv/dist/dlv.js.map | 1 - node_modules/dlv/dist/dlv.umd.js | 2 - node_modules/dlv/dist/dlv.umd.js.map | 1 - node_modules/dlv/index.js | 7 - node_modules/dlv/package.json | 30 - node_modules/eastasianwidth/README.md | 32 - node_modules/eastasianwidth/eastasianwidth.js | 311 - node_modules/eastasianwidth/package.json | 18 - node_modules/emoji-regex/LICENSE-MIT.txt | 20 - node_modules/emoji-regex/README.md | 73 - node_modules/emoji-regex/es2015/index.js | 6 - node_modules/emoji-regex/es2015/text.js | 6 - node_modules/emoji-regex/index.d.ts | 23 - node_modules/emoji-regex/index.js | 6 - node_modules/emoji-regex/package.json | 50 - node_modules/emoji-regex/text.js | 6 - node_modules/esbuild/LICENSE.md | 21 - node_modules/esbuild/README.md | 3 - node_modules/esbuild/bin/esbuild | 223 - node_modules/esbuild/install.js | 289 - node_modules/esbuild/lib/main.d.ts | 716 - node_modules/esbuild/lib/main.js | 2242 - node_modules/esbuild/package.json | 49 - node_modules/fast-glob/LICENSE | 21 - node_modules/fast-glob/README.md | 830 - .../node_modules/glob-parent/CHANGELOG.md | 110 - .../node_modules/glob-parent/LICENSE | 15 - .../node_modules/glob-parent/README.md | 137 - .../node_modules/glob-parent/index.js | 42 - .../node_modules/glob-parent/package.json | 48 - node_modules/fast-glob/out/index.d.ts | 40 - node_modules/fast-glob/out/index.js | 102 - .../fast-glob/out/managers/tasks.d.ts | 22 - node_modules/fast-glob/out/managers/tasks.js | 110 - .../fast-glob/out/providers/async.d.ts | 9 - node_modules/fast-glob/out/providers/async.js | 23 - .../fast-glob/out/providers/filters/deep.d.ts | 16 - .../fast-glob/out/providers/filters/deep.js | 62 - .../out/providers/filters/entry.d.ts | 17 - .../fast-glob/out/providers/filters/entry.js | 85 - .../out/providers/filters/error.d.ts | 8 - .../fast-glob/out/providers/filters/error.js | 15 - .../out/providers/matchers/matcher.d.ts | 33 - .../out/providers/matchers/matcher.js | 45 - .../out/providers/matchers/partial.d.ts | 4 - .../out/providers/matchers/partial.js | 38 - .../fast-glob/out/providers/provider.d.ts | 19 - .../fast-glob/out/providers/provider.js | 48 - .../fast-glob/out/providers/stream.d.ts | 11 - .../fast-glob/out/providers/stream.js | 31 - .../fast-glob/out/providers/sync.d.ts | 9 - node_modules/fast-glob/out/providers/sync.js | 23 - .../out/providers/transformers/entry.d.ts | 8 - .../out/providers/transformers/entry.js | 26 - node_modules/fast-glob/out/readers/async.d.ts | 10 - node_modules/fast-glob/out/readers/async.js | 35 - .../fast-glob/out/readers/reader.d.ts | 15 - node_modules/fast-glob/out/readers/reader.js | 33 - .../fast-glob/out/readers/stream.d.ts | 14 - node_modules/fast-glob/out/readers/stream.js | 55 - node_modules/fast-glob/out/readers/sync.d.ts | 12 - node_modules/fast-glob/out/readers/sync.js | 43 - node_modules/fast-glob/out/settings.d.ts | 164 - node_modules/fast-glob/out/settings.js | 59 - node_modules/fast-glob/out/types/index.d.ts | 31 - node_modules/fast-glob/out/types/index.js | 2 - node_modules/fast-glob/out/utils/array.d.ts | 2 - node_modules/fast-glob/out/utils/array.js | 22 - node_modules/fast-glob/out/utils/errno.d.ts | 2 - node_modules/fast-glob/out/utils/errno.js | 7 - node_modules/fast-glob/out/utils/fs.d.ts | 4 - node_modules/fast-glob/out/utils/fs.js | 19 - node_modules/fast-glob/out/utils/index.d.ts | 8 - node_modules/fast-glob/out/utils/index.js | 17 - node_modules/fast-glob/out/utils/path.d.ts | 13 - node_modules/fast-glob/out/utils/path.js | 68 - node_modules/fast-glob/out/utils/pattern.d.ts | 49 - node_modules/fast-glob/out/utils/pattern.js | 206 - node_modules/fast-glob/out/utils/stream.d.ts | 4 - node_modules/fast-glob/out/utils/stream.js | 17 - node_modules/fast-glob/out/utils/string.d.ts | 2 - node_modules/fast-glob/out/utils/string.js | 11 - node_modules/fast-glob/package.json | 81 - node_modules/fastq/.github/dependabot.yml | 11 - node_modules/fastq/.github/workflows/ci.yml | 75 - node_modules/fastq/LICENSE | 13 - node_modules/fastq/README.md | 312 - node_modules/fastq/SECURITY.md | 15 - node_modules/fastq/bench.js | 66 - node_modules/fastq/example.js | 14 - node_modules/fastq/example.mjs | 11 - node_modules/fastq/index.d.ts | 57 - node_modules/fastq/package.json | 53 - node_modules/fastq/queue.js | 311 - node_modules/fastq/test/example.ts | 83 - node_modules/fastq/test/promise.js | 291 - node_modules/fastq/test/test.js | 653 - node_modules/fastq/test/tsconfig.json | 11 - node_modules/fill-range/LICENSE | 21 - node_modules/fill-range/README.md | 237 - node_modules/fill-range/index.js | 248 - node_modules/fill-range/package.json | 74 - node_modules/find-up/index.d.ts | 137 - node_modules/find-up/index.js | 89 - node_modules/find-up/license | 9 - node_modules/find-up/package.json | 53 - node_modules/find-up/readme.md | 156 - node_modules/foreground-child/LICENSE | 15 - node_modules/foreground-child/README.md | 128 - .../dist/commonjs/all-signals.d.ts | 2 - .../dist/commonjs/all-signals.d.ts.map | 1 - .../dist/commonjs/all-signals.js | 58 - .../dist/commonjs/all-signals.js.map | 1 - .../foreground-child/dist/commonjs/index.d.ts | 58 - .../dist/commonjs/index.d.ts.map | 1 - .../foreground-child/dist/commonjs/index.js | 123 - .../dist/commonjs/index.js.map | 1 - .../dist/commonjs/package.json | 3 - .../dist/commonjs/proxy-signals.d.ts | 6 - .../dist/commonjs/proxy-signals.d.ts.map | 1 - .../dist/commonjs/proxy-signals.js | 38 - .../dist/commonjs/proxy-signals.js.map | 1 - .../dist/commonjs/watchdog.d.ts | 10 - .../dist/commonjs/watchdog.d.ts.map | 1 - .../dist/commonjs/watchdog.js | 50 - .../dist/commonjs/watchdog.js.map | 1 - .../dist/esm/all-signals.d.ts | 2 - .../dist/esm/all-signals.d.ts.map | 1 - .../foreground-child/dist/esm/all-signals.js | 52 - .../dist/esm/all-signals.js.map | 1 - .../foreground-child/dist/esm/index.d.ts | 58 - .../foreground-child/dist/esm/index.d.ts.map | 1 - .../foreground-child/dist/esm/index.js | 115 - .../foreground-child/dist/esm/index.js.map | 1 - .../foreground-child/dist/esm/package.json | 3 - .../dist/esm/proxy-signals.d.ts | 6 - .../dist/esm/proxy-signals.d.ts.map | 1 - .../dist/esm/proxy-signals.js | 34 - .../dist/esm/proxy-signals.js.map | 1 - .../foreground-child/dist/esm/watchdog.d.ts | 10 - .../dist/esm/watchdog.d.ts.map | 1 - .../foreground-child/dist/esm/watchdog.js | 46 - .../foreground-child/dist/esm/watchdog.js.map | 1 - node_modules/foreground-child/package.json | 106 - node_modules/function-bind/.eslintrc | 21 - .../function-bind/.github/FUNDING.yml | 12 - .../function-bind/.github/SECURITY.md | 3 - node_modules/function-bind/.nycrc | 13 - node_modules/function-bind/CHANGELOG.md | 136 - node_modules/function-bind/LICENSE | 20 - node_modules/function-bind/README.md | 46 - node_modules/function-bind/implementation.js | 84 - node_modules/function-bind/index.js | 5 - node_modules/function-bind/package.json | 87 - node_modules/function-bind/test/.eslintrc | 9 - node_modules/function-bind/test/index.js | 252 - node_modules/get-caller-file/LICENSE.md | 6 - node_modules/get-caller-file/README.md | 41 - node_modules/get-caller-file/index.d.ts | 2 - node_modules/get-caller-file/index.js | 22 - node_modules/get-caller-file/index.js.map | 1 - node_modules/get-caller-file/package.json | 42 - node_modules/glob-parent/LICENSE | 15 - node_modules/glob-parent/README.md | 134 - node_modules/glob-parent/index.js | 75 - node_modules/glob-parent/package.json | 54 - node_modules/glob/LICENSE | 15 - node_modules/glob/README.md | 1265 - node_modules/glob/dist/commonjs/glob.d.ts | 388 - node_modules/glob/dist/commonjs/glob.d.ts.map | 1 - node_modules/glob/dist/commonjs/glob.js | 247 - node_modules/glob/dist/commonjs/glob.js.map | 1 - .../glob/dist/commonjs/has-magic.d.ts | 14 - .../glob/dist/commonjs/has-magic.d.ts.map | 1 - node_modules/glob/dist/commonjs/has-magic.js | 27 - .../glob/dist/commonjs/has-magic.js.map | 1 - node_modules/glob/dist/commonjs/ignore.d.ts | 24 - .../glob/dist/commonjs/ignore.d.ts.map | 1 - node_modules/glob/dist/commonjs/ignore.js | 119 - node_modules/glob/dist/commonjs/ignore.js.map | 1 - node_modules/glob/dist/commonjs/index.d.ts | 97 - .../glob/dist/commonjs/index.d.ts.map | 1 - node_modules/glob/dist/commonjs/index.js | 68 - node_modules/glob/dist/commonjs/index.js.map | 1 - node_modules/glob/dist/commonjs/package.json | 3 - node_modules/glob/dist/commonjs/pattern.d.ts | 76 - .../glob/dist/commonjs/pattern.d.ts.map | 1 - node_modules/glob/dist/commonjs/pattern.js | 219 - .../glob/dist/commonjs/pattern.js.map | 1 - .../glob/dist/commonjs/processor.d.ts | 59 - .../glob/dist/commonjs/processor.d.ts.map | 1 - node_modules/glob/dist/commonjs/processor.js | 301 - .../glob/dist/commonjs/processor.js.map | 1 - node_modules/glob/dist/commonjs/walker.d.ts | 97 - .../glob/dist/commonjs/walker.d.ts.map | 1 - node_modules/glob/dist/commonjs/walker.js | 387 - node_modules/glob/dist/commonjs/walker.js.map | 1 - node_modules/glob/dist/esm/bin.d.mts | 3 - node_modules/glob/dist/esm/bin.d.mts.map | 1 - node_modules/glob/dist/esm/bin.mjs | 270 - node_modules/glob/dist/esm/bin.mjs.map | 1 - node_modules/glob/dist/esm/glob.d.ts | 388 - node_modules/glob/dist/esm/glob.d.ts.map | 1 - node_modules/glob/dist/esm/glob.js | 243 - node_modules/glob/dist/esm/glob.js.map | 1 - node_modules/glob/dist/esm/has-magic.d.ts | 14 - node_modules/glob/dist/esm/has-magic.d.ts.map | 1 - node_modules/glob/dist/esm/has-magic.js | 23 - node_modules/glob/dist/esm/has-magic.js.map | 1 - node_modules/glob/dist/esm/ignore.d.ts | 24 - node_modules/glob/dist/esm/ignore.d.ts.map | 1 - node_modules/glob/dist/esm/ignore.js | 115 - node_modules/glob/dist/esm/ignore.js.map | 1 - node_modules/glob/dist/esm/index.d.ts | 97 - node_modules/glob/dist/esm/index.d.ts.map | 1 - node_modules/glob/dist/esm/index.js | 55 - node_modules/glob/dist/esm/index.js.map | 1 - node_modules/glob/dist/esm/package.json | 3 - node_modules/glob/dist/esm/pattern.d.ts | 76 - node_modules/glob/dist/esm/pattern.d.ts.map | 1 - node_modules/glob/dist/esm/pattern.js | 215 - node_modules/glob/dist/esm/pattern.js.map | 1 - node_modules/glob/dist/esm/processor.d.ts | 59 - node_modules/glob/dist/esm/processor.d.ts.map | 1 - node_modules/glob/dist/esm/processor.js | 294 - node_modules/glob/dist/esm/processor.js.map | 1 - node_modules/glob/dist/esm/walker.d.ts | 97 - node_modules/glob/dist/esm/walker.d.ts.map | 1 - node_modules/glob/dist/esm/walker.js | 381 - node_modules/glob/dist/esm/walker.js.map | 1 - node_modules/glob/package.json | 99 - node_modules/hasown/.eslintrc | 5 - node_modules/hasown/.github/FUNDING.yml | 12 - node_modules/hasown/.nycrc | 13 - node_modules/hasown/CHANGELOG.md | 40 - node_modules/hasown/LICENSE | 21 - node_modules/hasown/README.md | 40 - node_modules/hasown/index.d.ts | 3 - node_modules/hasown/index.js | 8 - node_modules/hasown/package.json | 92 - node_modules/hasown/tsconfig.json | 6 - node_modules/html5-qrcode/LICENSE | 201 - node_modules/html5-qrcode/README.md | 398 - .../html5-qrcode/camera/core-impl.d.ts | 7 - node_modules/html5-qrcode/camera/core.d.ts | 41 - .../html5-qrcode/camera/factories.d.ts | 6 - .../html5-qrcode/camera/permissions.d.ts | 3 - .../html5-qrcode/camera/retriever.d.ts | 8 - .../html5-qrcode/cjs/camera/core-impl.d.ts | 7 - .../html5-qrcode/cjs/camera/core-impl.js | 314 - .../html5-qrcode/cjs/camera/core-impl.js.map | 1 - .../html5-qrcode/cjs/camera/core.d.ts | 41 - node_modules/html5-qrcode/cjs/camera/core.js | 3 - .../html5-qrcode/cjs/camera/core.js.map | 1 - .../html5-qrcode/cjs/camera/factories.d.ts | 6 - .../html5-qrcode/cjs/camera/factories.js | 64 - .../html5-qrcode/cjs/camera/factories.js.map | 1 - .../html5-qrcode/cjs/camera/permissions.d.ts | 3 - .../html5-qrcode/cjs/camera/permissions.js | 65 - .../cjs/camera/permissions.js.map | 1 - .../html5-qrcode/cjs/camera/retriever.d.ts | 8 - .../html5-qrcode/cjs/camera/retriever.js | 127 - .../html5-qrcode/cjs/camera/retriever.js.map | 1 - .../html5-qrcode/cjs/code-decoder.d.ts | 16 - node_modules/html5-qrcode/cjs/code-decoder.js | 141 - .../html5-qrcode/cjs/code-decoder.js.map | 1 - node_modules/html5-qrcode/cjs/core.d.ts | 105 - node_modules/html5-qrcode/cjs/core.js | 171 - node_modules/html5-qrcode/cjs/core.js.map | 1 - .../cjs/experimental-features.d.ts | 3 - .../html5-qrcode/cjs/experimental-features.js | 3 - .../cjs/experimental-features.js.map | 1 - .../cjs/html5-qrcode-scanner.d.ts | 67 - .../html5-qrcode/cjs/html5-qrcode-scanner.js | 661 - .../cjs/html5-qrcode-scanner.js.map | 1 - .../html5-qrcode/cjs/html5-qrcode.d.ts | 75 - node_modules/html5-qrcode/cjs/html5-qrcode.js | 843 - .../html5-qrcode/cjs/html5-qrcode.js.map | 1 - .../html5-qrcode/cjs/image-assets.d.ts | 4 - node_modules/html5-qrcode/cjs/image-assets.js | 9 - .../html5-qrcode/cjs/image-assets.js.map | 1 - node_modules/html5-qrcode/cjs/index.d.ts | 6 - node_modules/html5-qrcode/cjs/index.js | 14 - node_modules/html5-qrcode/cjs/index.js.map | 1 - .../cjs/native-bar-code-detector.d.ts | 16 - .../cjs/native-bar-code-detector.js | 148 - .../cjs/native-bar-code-detector.js.map | 1 - .../html5-qrcode/cjs/state-manager.d.ts | 29 - .../html5-qrcode/cjs/state-manager.js | 112 - .../html5-qrcode/cjs/state-manager.js.map | 1 - node_modules/html5-qrcode/cjs/storage.d.ts | 12 - node_modules/html5-qrcode/cjs/storage.js | 55 - node_modules/html5-qrcode/cjs/storage.js.map | 1 - node_modules/html5-qrcode/cjs/strings.d.ts | 45 - node_modules/html5-qrcode/cjs/strings.js | 142 - node_modules/html5-qrcode/cjs/strings.js.map | 1 - node_modules/html5-qrcode/cjs/ui.d.ts | 6 - node_modules/html5-qrcode/cjs/ui.js | 118 - node_modules/html5-qrcode/cjs/ui.js.map | 1 - .../html5-qrcode/cjs/ui/scanner/base.d.ts | 16 - .../html5-qrcode/cjs/ui/scanner/base.js | 36 - .../html5-qrcode/cjs/ui/scanner/base.js.map | 1 - .../cjs/ui/scanner/camera-selection-ui.d.ts | 17 - .../cjs/ui/scanner/camera-selection-ui.js | 89 - .../cjs/ui/scanner/camera-selection-ui.js.map | 1 - .../cjs/ui/scanner/camera-zoom-ui.d.ts | 16 - .../cjs/ui/scanner/camera-zoom-ui.js | 73 - .../cjs/ui/scanner/camera-zoom-ui.js.map | 1 - .../cjs/ui/scanner/file-selection-ui.d.ts | 19 - .../cjs/ui/scanner/file-selection-ui.js | 170 - .../cjs/ui/scanner/file-selection-ui.js.map | 1 - .../cjs/ui/scanner/scan-type-selector.d.ts | 11 - .../cjs/ui/scanner/scan-type-selector.js | 51 - .../cjs/ui/scanner/scan-type-selector.js.map | 1 - .../cjs/ui/scanner/torch-button.d.ts | 28 - .../cjs/ui/scanner/torch-button.js | 171 - .../cjs/ui/scanner/torch-button.js.map | 1 - node_modules/html5-qrcode/cjs/utils.d.ts | 4 - node_modules/html5-qrcode/cjs/utils.js | 38 - node_modules/html5-qrcode/cjs/utils.js.map | 1 - .../cjs/zxing-html5-qrcode-decoder.d.ts | 15 - .../cjs/zxing-html5-qrcode-decoder.js | 109 - .../cjs/zxing-html5-qrcode-decoder.js.map | 1 - node_modules/html5-qrcode/code-decoder.d.ts | 16 - node_modules/html5-qrcode/core.d.ts | 105 - .../html5-qrcode/es2015/camera/core-impl.d.ts | 7 - .../html5-qrcode/es2015/camera/core-impl.js | 236 - .../es2015/camera/core-impl.js.map | 1 - .../html5-qrcode/es2015/camera/core.d.ts | 41 - .../html5-qrcode/es2015/camera/core.js | 2 - .../html5-qrcode/es2015/camera/core.js.map | 1 - .../html5-qrcode/es2015/camera/factories.d.ts | 6 - .../html5-qrcode/es2015/camera/factories.js | 27 - .../es2015/camera/factories.js.map | 1 - .../es2015/camera/permissions.d.ts | 3 - .../html5-qrcode/es2015/camera/permissions.js | 23 - .../es2015/camera/permissions.js.map | 1 - .../html5-qrcode/es2015/camera/retriever.d.ts | 8 - .../html5-qrcode/es2015/camera/retriever.js | 80 - .../es2015/camera/retriever.js.map | 1 - .../html5-qrcode/es2015/code-decoder.d.ts | 16 - .../html5-qrcode/es2015/code-decoder.js | 90 - .../html5-qrcode/es2015/code-decoder.js.map | 1 - node_modules/html5-qrcode/es2015/core.d.ts | 105 - node_modules/html5-qrcode/es2015/core.js | 149 - node_modules/html5-qrcode/es2015/core.js.map | 1 - .../es2015/experimental-features.d.ts | 3 - .../es2015/experimental-features.js | 2 - .../es2015/experimental-features.js.map | 1 - .../es2015/html5-qrcode-scanner.d.ts | 67 - .../es2015/html5-qrcode-scanner.js | 652 - .../es2015/html5-qrcode-scanner.js.map | 1 - .../html5-qrcode/es2015/html5-qrcode.d.ts | 75 - .../html5-qrcode/es2015/html5-qrcode.js | 810 - .../html5-qrcode/es2015/html5-qrcode.js.map | 1 - .../html5-qrcode/es2015/image-assets.d.ts | 4 - .../html5-qrcode/es2015/image-assets.js | 6 - .../html5-qrcode/es2015/image-assets.js.map | 1 - node_modules/html5-qrcode/es2015/index.d.ts | 6 - node_modules/html5-qrcode/es2015/index.js | 6 - node_modules/html5-qrcode/es2015/index.js.map | 1 - .../es2015/native-bar-code-detector.d.ts | 16 - .../es2015/native-bar-code-detector.js | 107 - .../es2015/native-bar-code-detector.js.map | 1 - .../html5-qrcode/es2015/state-manager.d.ts | 29 - .../html5-qrcode/es2015/state-manager.js | 101 - .../html5-qrcode/es2015/state-manager.js.map | 1 - node_modules/html5-qrcode/es2015/storage.d.ts | 12 - node_modules/html5-qrcode/es2015/storage.js | 47 - .../html5-qrcode/es2015/storage.js.map | 1 - node_modules/html5-qrcode/es2015/strings.d.ts | 45 - node_modules/html5-qrcode/es2015/strings.js | 127 - .../html5-qrcode/es2015/strings.js.map | 1 - node_modules/html5-qrcode/es2015/ui.d.ts | 6 - node_modules/html5-qrcode/es2015/ui.js | 109 - node_modules/html5-qrcode/es2015/ui.js.map | 1 - .../html5-qrcode/es2015/ui/scanner/base.d.ts | 16 - .../html5-qrcode/es2015/ui/scanner/base.js | 25 - .../es2015/ui/scanner/base.js.map | 1 - .../ui/scanner/camera-selection-ui.d.ts | 17 - .../es2015/ui/scanner/camera-selection-ui.js | 82 - .../ui/scanner/camera-selection-ui.js.map | 1 - .../es2015/ui/scanner/camera-zoom-ui.d.ts | 16 - .../es2015/ui/scanner/camera-zoom-ui.js | 68 - .../es2015/ui/scanner/camera-zoom-ui.js.map | 1 - .../es2015/ui/scanner/file-selection-ui.d.ts | 19 - .../es2015/ui/scanner/file-selection-ui.js | 165 - .../ui/scanner/file-selection-ui.js.map | 1 - .../es2015/ui/scanner/scan-type-selector.d.ts | 11 - .../es2015/ui/scanner/scan-type-selector.js | 44 - .../ui/scanner/scan-type-selector.js.map | 1 - .../es2015/ui/scanner/torch-button.d.ts | 28 - .../es2015/ui/scanner/torch-button.js | 118 - .../es2015/ui/scanner/torch-button.js.map | 1 - node_modules/html5-qrcode/es2015/utils.d.ts | 4 - node_modules/html5-qrcode/es2015/utils.js | 30 - node_modules/html5-qrcode/es2015/utils.js.map | 1 - .../es2015/zxing-html5-qrcode-decoder.d.ts | 15 - .../es2015/zxing-html5-qrcode-decoder.js | 102 - .../es2015/zxing-html5-qrcode-decoder.js.map | 1 - .../html5-qrcode/esm/camera/core-impl.d.ts | 7 - .../html5-qrcode/esm/camera/core-impl.js | 311 - .../html5-qrcode/esm/camera/core-impl.js.map | 1 - .../html5-qrcode/esm/camera/core.d.ts | 41 - node_modules/html5-qrcode/esm/camera/core.js | 2 - .../html5-qrcode/esm/camera/core.js.map | 1 - .../html5-qrcode/esm/camera/factories.d.ts | 6 - .../html5-qrcode/esm/camera/factories.js | 61 - .../html5-qrcode/esm/camera/factories.js.map | 1 - .../html5-qrcode/esm/camera/permissions.d.ts | 3 - .../html5-qrcode/esm/camera/permissions.js | 62 - .../esm/camera/permissions.js.map | 1 - .../html5-qrcode/esm/camera/retriever.d.ts | 8 - .../html5-qrcode/esm/camera/retriever.js | 124 - .../html5-qrcode/esm/camera/retriever.js.map | 1 - .../html5-qrcode/esm/code-decoder.d.ts | 16 - node_modules/html5-qrcode/esm/code-decoder.js | 138 - .../html5-qrcode/esm/code-decoder.js.map | 1 - node_modules/html5-qrcode/esm/core.d.ts | 105 - node_modules/html5-qrcode/esm/core.js | 165 - node_modules/html5-qrcode/esm/core.js.map | 1 - .../esm/experimental-features.d.ts | 3 - .../html5-qrcode/esm/experimental-features.js | 2 - .../esm/experimental-features.js.map | 1 - .../esm/html5-qrcode-scanner.d.ts | 67 - .../html5-qrcode/esm/html5-qrcode-scanner.js | 658 - .../esm/html5-qrcode-scanner.js.map | 1 - .../html5-qrcode/esm/html5-qrcode.d.ts | 75 - node_modules/html5-qrcode/esm/html5-qrcode.js | 840 - .../html5-qrcode/esm/html5-qrcode.js.map | 1 - .../html5-qrcode/esm/image-assets.d.ts | 4 - node_modules/html5-qrcode/esm/image-assets.js | 6 - .../html5-qrcode/esm/image-assets.js.map | 1 - node_modules/html5-qrcode/esm/index.d.ts | 6 - node_modules/html5-qrcode/esm/index.js | 6 - node_modules/html5-qrcode/esm/index.js.map | 1 - .../esm/native-bar-code-detector.d.ts | 16 - .../esm/native-bar-code-detector.js | 145 - .../esm/native-bar-code-detector.js.map | 1 - .../html5-qrcode/esm/state-manager.d.ts | 29 - .../html5-qrcode/esm/state-manager.js | 109 - .../html5-qrcode/esm/state-manager.js.map | 1 - node_modules/html5-qrcode/esm/storage.d.ts | 12 - node_modules/html5-qrcode/esm/storage.js | 52 - node_modules/html5-qrcode/esm/storage.js.map | 1 - node_modules/html5-qrcode/esm/strings.d.ts | 45 - node_modules/html5-qrcode/esm/strings.js | 139 - node_modules/html5-qrcode/esm/strings.js.map | 1 - node_modules/html5-qrcode/esm/ui.d.ts | 6 - node_modules/html5-qrcode/esm/ui.js | 115 - node_modules/html5-qrcode/esm/ui.js.map | 1 - .../html5-qrcode/esm/ui/scanner/base.d.ts | 16 - .../html5-qrcode/esm/ui/scanner/base.js | 33 - .../html5-qrcode/esm/ui/scanner/base.js.map | 1 - .../esm/ui/scanner/camera-selection-ui.d.ts | 17 - .../esm/ui/scanner/camera-selection-ui.js | 86 - .../esm/ui/scanner/camera-selection-ui.js.map | 1 - .../esm/ui/scanner/camera-zoom-ui.d.ts | 16 - .../esm/ui/scanner/camera-zoom-ui.js | 70 - .../esm/ui/scanner/camera-zoom-ui.js.map | 1 - .../esm/ui/scanner/file-selection-ui.d.ts | 19 - .../esm/ui/scanner/file-selection-ui.js | 167 - .../esm/ui/scanner/file-selection-ui.js.map | 1 - .../esm/ui/scanner/scan-type-selector.d.ts | 11 - .../esm/ui/scanner/scan-type-selector.js | 48 - .../esm/ui/scanner/scan-type-selector.js.map | 1 - .../esm/ui/scanner/torch-button.d.ts | 28 - .../esm/ui/scanner/torch-button.js | 168 - .../esm/ui/scanner/torch-button.js.map | 1 - node_modules/html5-qrcode/esm/utils.d.ts | 4 - node_modules/html5-qrcode/esm/utils.js | 35 - node_modules/html5-qrcode/esm/utils.js.map | 1 - .../esm/zxing-html5-qrcode-decoder.d.ts | 15 - .../esm/zxing-html5-qrcode-decoder.js | 106 - .../esm/zxing-html5-qrcode-decoder.js.map | 1 - .../html5-qrcode/experimental-features.d.ts | 3 - .../html5-qrcode/html5-qrcode-scanner.d.ts | 67 - node_modules/html5-qrcode/html5-qrcode.d.ts | 75 - node_modules/html5-qrcode/html5-qrcode.min.js | 1 - node_modules/html5-qrcode/image-assets.d.ts | 4 - node_modules/html5-qrcode/index.d.ts | 6 - .../native-bar-code-detector.d.ts | 16 - node_modules/html5-qrcode/package.json | 93 - .../html5-qrcode/src/camera/core-impl.d.ts | 7 - .../html5-qrcode/src/camera/core-impl.ts | 340 - .../html5-qrcode/src/camera/core.d.ts | 41 - node_modules/html5-qrcode/src/camera/core.ts | 180 - .../html5-qrcode/src/camera/factories.d.ts | 6 - .../html5-qrcode/src/camera/factories.ts | 33 - .../html5-qrcode/src/camera/permissions.d.ts | 3 - .../html5-qrcode/src/camera/permissions.ts | 34 - .../html5-qrcode/src/camera/retriever.d.ts | 8 - .../html5-qrcode/src/camera/retriever.ts | 93 - .../html5-qrcode/src/code-decoder.d.ts | 16 - node_modules/html5-qrcode/src/code-decoder.ts | 127 - node_modules/html5-qrcode/src/core.d.ts | 105 - node_modules/html5-qrcode/src/core.ts | 353 - .../src/experimental-features.d.ts | 3 - .../html5-qrcode/src/experimental-features.ts | 44 - .../src/html5-qrcode-scanner.d.ts | 67 - .../html5-qrcode/src/html5-qrcode-scanner.ts | 1137 - .../html5-qrcode/src/html5-qrcode.d.ts | 75 - node_modules/html5-qrcode/src/html5-qrcode.ts | 1595 - .../html5-qrcode/src/image-assets.d.ts | 4 - node_modules/html5-qrcode/src/image-assets.ts | 18 - node_modules/html5-qrcode/src/index.d.ts | 6 - node_modules/html5-qrcode/src/index.ts | 32 - .../src/native-bar-code-detector.d.ts | 16 - .../src/native-bar-code-detector.ts | 204 - .../html5-qrcode/src/state-manager.d.ts | 29 - .../html5-qrcode/src/state-manager.ts | 193 - node_modules/html5-qrcode/src/storage.d.ts | 12 - node_modules/html5-qrcode/src/storage.ts | 72 - node_modules/html5-qrcode/src/strings.d.ts | 45 - node_modules/html5-qrcode/src/strings.ts | 200 - node_modules/html5-qrcode/src/ui.d.ts | 6 - node_modules/html5-qrcode/src/ui.ts | 152 - .../html5-qrcode/src/ui/scanner/base.d.ts | 16 - .../html5-qrcode/src/ui/scanner/base.ts | 81 - .../src/ui/scanner/camera-selection-ui.d.ts | 17 - .../src/ui/scanner/camera-selection-ui.ts | 129 - .../src/ui/scanner/camera-zoom-ui.d.ts | 16 - .../src/ui/scanner/camera-zoom-ui.ts | 126 - .../src/ui/scanner/file-selection-ui.d.ts | 19 - .../src/ui/scanner/file-selection-ui.ts | 263 - .../src/ui/scanner/scan-type-selector.d.ts | 11 - .../src/ui/scanner/scan-type-selector.ts | 94 - .../src/ui/scanner/torch-button.d.ts | 28 - .../src/ui/scanner/torch-button.ts | 227 - node_modules/html5-qrcode/src/utils.d.ts | 4 - node_modules/html5-qrcode/src/utils.ts | 53 - .../src/zxing-html5-qrcode-decoder.d.ts | 15 - .../src/zxing-html5-qrcode-decoder.ts | 155 - node_modules/html5-qrcode/state-manager.d.ts | 29 - node_modules/html5-qrcode/storage.d.ts | 12 - node_modules/html5-qrcode/strings.d.ts | 45 - .../third_party/zxing-js.umd.d.ts | 43 - .../html5-qrcode/third_party/zxing-js.umd.js | 23870 ---- node_modules/html5-qrcode/ui.d.ts | 6 - .../html5-qrcode/ui/scanner/base.d.ts | 16 - .../ui/scanner/camera-selection-ui.d.ts | 17 - .../ui/scanner/camera-zoom-ui.d.ts | 16 - .../ui/scanner/file-selection-ui.d.ts | 19 - .../ui/scanner/scan-type-selector.d.ts | 11 - .../html5-qrcode/ui/scanner/torch-button.d.ts | 28 - node_modules/html5-qrcode/utils.d.ts | 4 - .../zxing-html5-qrcode-decoder.d.ts | 15 - node_modules/is-binary-path/index.d.ts | 17 - node_modules/is-binary-path/index.js | 7 - node_modules/is-binary-path/license | 9 - node_modules/is-binary-path/package.json | 40 - node_modules/is-binary-path/readme.md | 34 - node_modules/is-core-module/.eslintrc | 18 - node_modules/is-core-module/.nycrc | 9 - node_modules/is-core-module/CHANGELOG.md | 218 - node_modules/is-core-module/LICENSE | 20 - node_modules/is-core-module/README.md | 40 - node_modules/is-core-module/core.json | 162 - node_modules/is-core-module/index.js | 69 - node_modules/is-core-module/package.json | 76 - node_modules/is-core-module/test/index.js | 157 - node_modules/is-extglob/LICENSE | 21 - node_modules/is-extglob/README.md | 107 - node_modules/is-extglob/index.js | 20 - node_modules/is-extglob/package.json | 69 - .../is-fullwidth-code-point/index.d.ts | 17 - node_modules/is-fullwidth-code-point/index.js | 50 - node_modules/is-fullwidth-code-point/license | 9 - .../is-fullwidth-code-point/package.json | 42 - .../is-fullwidth-code-point/readme.md | 39 - node_modules/is-glob/LICENSE | 21 - node_modules/is-glob/README.md | 206 - node_modules/is-glob/index.js | 150 - node_modules/is-glob/package.json | 81 - node_modules/is-number/LICENSE | 21 - node_modules/is-number/README.md | 187 - node_modules/is-number/index.js | 18 - node_modules/is-number/package.json | 82 - node_modules/isexe/.npmignore | 2 - node_modules/isexe/LICENSE | 15 - node_modules/isexe/README.md | 51 - node_modules/isexe/index.js | 57 - node_modules/isexe/mode.js | 41 - node_modules/isexe/package.json | 31 - node_modules/isexe/test/basic.js | 221 - node_modules/isexe/windows.js | 42 - node_modules/jackspeak/LICENSE.md | 55 - node_modules/jackspeak/README.md | 357 - .../jackspeak/dist/commonjs/index.d.ts | 315 - .../jackspeak/dist/commonjs/index.d.ts.map | 1 - node_modules/jackspeak/dist/commonjs/index.js | 1010 - .../jackspeak/dist/commonjs/index.js.map | 1 - .../jackspeak/dist/commonjs/package.json | 3 - .../dist/commonjs/parse-args-cjs.cjs.map | 1 - .../dist/commonjs/parse-args-cjs.d.cts.map | 1 - .../jackspeak/dist/commonjs/parse-args.d.ts | 4 - .../jackspeak/dist/commonjs/parse-args.js | 50 - node_modules/jackspeak/dist/esm/index.d.ts | 315 - .../jackspeak/dist/esm/index.d.ts.map | 1 - node_modules/jackspeak/dist/esm/index.js | 1000 - node_modules/jackspeak/dist/esm/index.js.map | 1 - node_modules/jackspeak/dist/esm/package.json | 3 - .../jackspeak/dist/esm/parse-args.d.ts | 4 - .../jackspeak/dist/esm/parse-args.d.ts.map | 1 - node_modules/jackspeak/dist/esm/parse-args.js | 26 - .../jackspeak/dist/esm/parse-args.js.map | 1 - node_modules/jackspeak/package.json | 95 - node_modules/lilconfig/LICENSE | 21 - node_modules/lilconfig/package.json | 42 - node_modules/lilconfig/readme.md | 98 - node_modules/lilconfig/src/index.d.ts | 54 - node_modules/lilconfig/src/index.js | 460 - node_modules/lines-and-columns/LICENSE | 21 - node_modules/lines-and-columns/README.md | 33 - .../lines-and-columns/build/index.d.ts | 13 - node_modules/lines-and-columns/build/index.js | 62 - node_modules/lines-and-columns/package.json | 49 - node_modules/locate-path/index.d.ts | 83 - node_modules/locate-path/index.js | 65 - node_modules/locate-path/license | 9 - node_modules/locate-path/package.json | 45 - node_modules/locate-path/readme.md | 122 - node_modules/lru-cache/LICENSE | 15 - node_modules/lru-cache/README.md | 331 - .../lru-cache/dist/commonjs/index.d.ts | 1277 - .../lru-cache/dist/commonjs/index.d.ts.map | 1 - node_modules/lru-cache/dist/commonjs/index.js | 1546 - .../lru-cache/dist/commonjs/index.js.map | 1 - .../lru-cache/dist/commonjs/index.min.js | 2 - .../lru-cache/dist/commonjs/index.min.js.map | 7 - .../lru-cache/dist/commonjs/package.json | 3 - node_modules/lru-cache/dist/esm/index.d.ts | 1277 - .../lru-cache/dist/esm/index.d.ts.map | 1 - node_modules/lru-cache/dist/esm/index.js | 1542 - node_modules/lru-cache/dist/esm/index.js.map | 1 - node_modules/lru-cache/dist/esm/index.min.js | 2 - .../lru-cache/dist/esm/index.min.js.map | 7 - node_modules/lru-cache/dist/esm/package.json | 3 - node_modules/lru-cache/package.json | 116 - node_modules/merge2/LICENSE | 21 - node_modules/merge2/README.md | 144 - node_modules/merge2/index.js | 144 - node_modules/merge2/package.json | 43 - node_modules/micromatch/LICENSE | 21 - node_modules/micromatch/README.md | 1024 - node_modules/micromatch/index.js | 474 - node_modules/micromatch/package.json | 119 - node_modules/minimatch/LICENSE | 15 - node_modules/minimatch/README.md | 454 - .../dist/commonjs/assert-valid-pattern.d.ts | 2 - .../commonjs/assert-valid-pattern.d.ts.map | 1 - .../dist/commonjs/assert-valid-pattern.js | 14 - .../dist/commonjs/assert-valid-pattern.js.map | 1 - node_modules/minimatch/dist/commonjs/ast.d.ts | 20 - .../minimatch/dist/commonjs/ast.d.ts.map | 1 - node_modules/minimatch/dist/commonjs/ast.js | 592 - .../minimatch/dist/commonjs/ast.js.map | 1 - .../dist/commonjs/brace-expressions.d.ts | 8 - .../dist/commonjs/brace-expressions.d.ts.map | 1 - .../dist/commonjs/brace-expressions.js | 152 - .../dist/commonjs/brace-expressions.js.map | 1 - .../minimatch/dist/commonjs/escape.d.ts | 12 - .../minimatch/dist/commonjs/escape.d.ts.map | 1 - .../minimatch/dist/commonjs/escape.js | 22 - .../minimatch/dist/commonjs/escape.js.map | 1 - .../minimatch/dist/commonjs/index.d.ts | 94 - .../minimatch/dist/commonjs/index.d.ts.map | 1 - node_modules/minimatch/dist/commonjs/index.js | 1017 - .../minimatch/dist/commonjs/index.js.map | 1 - .../minimatch/dist/commonjs/package.json | 3 - .../minimatch/dist/commonjs/unescape.d.ts | 17 - .../minimatch/dist/commonjs/unescape.d.ts.map | 1 - .../minimatch/dist/commonjs/unescape.js | 24 - .../minimatch/dist/commonjs/unescape.js.map | 1 - .../dist/esm/assert-valid-pattern.d.ts | 2 - .../dist/esm/assert-valid-pattern.d.ts.map | 1 - .../dist/esm/assert-valid-pattern.js | 10 - .../dist/esm/assert-valid-pattern.js.map | 1 - node_modules/minimatch/dist/esm/ast.d.ts | 20 - node_modules/minimatch/dist/esm/ast.d.ts.map | 1 - node_modules/minimatch/dist/esm/ast.js | 588 - node_modules/minimatch/dist/esm/ast.js.map | 1 - .../minimatch/dist/esm/brace-expressions.d.ts | 8 - .../dist/esm/brace-expressions.d.ts.map | 1 - .../minimatch/dist/esm/brace-expressions.js | 148 - .../dist/esm/brace-expressions.js.map | 1 - node_modules/minimatch/dist/esm/escape.d.ts | 12 - .../minimatch/dist/esm/escape.d.ts.map | 1 - node_modules/minimatch/dist/esm/escape.js | 18 - node_modules/minimatch/dist/esm/escape.js.map | 1 - node_modules/minimatch/dist/esm/index.d.ts | 94 - .../minimatch/dist/esm/index.d.ts.map | 1 - node_modules/minimatch/dist/esm/index.js | 1001 - node_modules/minimatch/dist/esm/index.js.map | 1 - node_modules/minimatch/dist/esm/package.json | 3 - node_modules/minimatch/dist/esm/unescape.d.ts | 17 - .../minimatch/dist/esm/unescape.d.ts.map | 1 - node_modules/minimatch/dist/esm/unescape.js | 20 - .../minimatch/dist/esm/unescape.js.map | 1 - node_modules/minimatch/package.json | 82 - node_modules/minipass/LICENSE | 15 - node_modules/minipass/README.md | 825 - .../minipass/dist/commonjs/index.d.ts | 549 - .../minipass/dist/commonjs/index.d.ts.map | 1 - node_modules/minipass/dist/commonjs/index.js | 1028 - .../minipass/dist/commonjs/index.js.map | 1 - .../minipass/dist/commonjs/package.json | 3 - node_modules/minipass/dist/esm/index.d.ts | 549 - node_modules/minipass/dist/esm/index.d.ts.map | 1 - node_modules/minipass/dist/esm/index.js | 1018 - node_modules/minipass/dist/esm/index.js.map | 1 - node_modules/minipass/dist/esm/package.json | 3 - node_modules/minipass/package.json | 82 - node_modules/mz/HISTORY.md | 66 - node_modules/mz/LICENSE | 22 - node_modules/mz/README.md | 106 - node_modules/mz/child_process.js | 8 - node_modules/mz/crypto.js | 9 - node_modules/mz/dns.js | 16 - node_modules/mz/fs.js | 62 - node_modules/mz/index.js | 8 - node_modules/mz/package.json | 44 - node_modules/mz/readline.js | 64 - node_modules/mz/zlib.js | 13 - node_modules/nanoid/LICENSE | 20 - node_modules/nanoid/README.md | 39 - node_modules/nanoid/async/index.browser.cjs | 69 - node_modules/nanoid/async/index.browser.js | 34 - node_modules/nanoid/async/index.cjs | 71 - node_modules/nanoid/async/index.d.ts | 56 - node_modules/nanoid/async/index.js | 35 - node_modules/nanoid/async/index.native.js | 26 - node_modules/nanoid/async/package.json | 12 - node_modules/nanoid/bin/nanoid.cjs | 55 - node_modules/nanoid/index.browser.cjs | 72 - node_modules/nanoid/index.browser.js | 34 - node_modules/nanoid/index.cjs | 85 - node_modules/nanoid/index.d.cts | 91 - node_modules/nanoid/index.d.ts | 91 - node_modules/nanoid/index.js | 45 - node_modules/nanoid/nanoid.js | 1 - node_modules/nanoid/non-secure/index.cjs | 34 - node_modules/nanoid/non-secure/index.d.ts | 33 - node_modules/nanoid/non-secure/index.js | 21 - node_modules/nanoid/non-secure/package.json | 6 - node_modules/nanoid/package.json | 89 - node_modules/nanoid/url-alphabet/index.cjs | 7 - node_modules/nanoid/url-alphabet/index.js | 3 - node_modules/nanoid/url-alphabet/package.json | 6 - node_modules/normalize-path/LICENSE | 21 - node_modules/normalize-path/README.md | 127 - node_modules/normalize-path/index.js | 35 - node_modules/normalize-path/package.json | 77 - node_modules/object-assign/index.js | 90 - node_modules/object-assign/license | 21 - node_modules/object-assign/package.json | 42 - node_modules/object-assign/readme.md | 61 - node_modules/object-hash/LICENSE | 22 - node_modules/object-hash/dist/object_hash.js | 1 - node_modules/object-hash/index.js | 453 - node_modules/object-hash/package.json | 53 - node_modules/object-hash/readme.markdown | 198 - node_modules/p-limit/index.d.ts | 38 - node_modules/p-limit/index.js | 57 - node_modules/p-limit/license | 9 - node_modules/p-limit/package.json | 52 - node_modules/p-limit/readme.md | 101 - node_modules/p-locate/index.d.ts | 64 - node_modules/p-locate/index.js | 52 - node_modules/p-locate/license | 9 - node_modules/p-locate/package.json | 53 - node_modules/p-locate/readme.md | 90 - node_modules/p-try/index.d.ts | 39 - node_modules/p-try/index.js | 9 - node_modules/p-try/license | 9 - node_modules/p-try/package.json | 42 - node_modules/p-try/readme.md | 58 - .../package-json-from-dist/LICENSE.md | 63 - node_modules/package-json-from-dist/README.md | 110 - .../dist/commonjs/index.d.ts | 89 - .../dist/commonjs/index.d.ts.map | 1 - .../dist/commonjs/index.js | 134 - .../dist/commonjs/index.js.map | 1 - .../dist/commonjs/package.json | 3 - .../dist/esm/index.d.ts | 89 - .../dist/esm/index.d.ts.map | 1 - .../package-json-from-dist/dist/esm/index.js | 129 - .../dist/esm/index.js.map | 1 - .../dist/esm/package.json | 3 - .../package-json-from-dist/package.json | 68 - node_modules/pako/LICENSE | 21 - node_modules/pako/README.md | 177 - node_modules/pako/dist/pako.es5.js | 6688 -- node_modules/pako/dist/pako.es5.min.js | 2 - node_modules/pako/dist/pako.esm.mjs | 6877 -- node_modules/pako/dist/pako.js | 6896 -- node_modules/pako/dist/pako.min.js | 2 - node_modules/pako/dist/pako_deflate.es5.js | 3924 - .../pako/dist/pako_deflate.es5.min.js | 2 - node_modules/pako/dist/pako_deflate.js | 4126 - node_modules/pako/dist/pako_deflate.min.js | 2 - node_modules/pako/dist/pako_inflate.es5.js | 3229 - .../pako/dist/pako_inflate.es5.min.js | 2 - node_modules/pako/dist/pako_inflate.js | 3239 - node_modules/pako/dist/pako_inflate.min.js | 2 - node_modules/pako/index.js | 18 - node_modules/pako/lib/deflate.js | 380 - node_modules/pako/lib/inflate.js | 419 - node_modules/pako/lib/utils/common.js | 48 - node_modules/pako/lib/utils/strings.js | 174 - node_modules/pako/lib/zlib/README | 59 - node_modules/pako/lib/zlib/adler32.js | 51 - node_modules/pako/lib/zlib/constants.js | 68 - node_modules/pako/lib/zlib/crc32.js | 59 - node_modules/pako/lib/zlib/deflate.js | 2048 - node_modules/pako/lib/zlib/gzheader.js | 58 - node_modules/pako/lib/zlib/inffast.js | 344 - node_modules/pako/lib/zlib/inflate.js | 1572 - node_modules/pako/lib/zlib/inftrees.js | 340 - node_modules/pako/lib/zlib/messages.js | 32 - node_modules/pako/lib/zlib/trees.js | 1179 - node_modules/pako/lib/zlib/zstream.js | 47 - node_modules/pako/package.json | 64 - node_modules/path-exists/index.d.ts | 28 - node_modules/path-exists/index.js | 23 - node_modules/path-exists/license | 9 - node_modules/path-exists/package.json | 39 - node_modules/path-exists/readme.md | 52 - node_modules/path-key/index.d.ts | 40 - node_modules/path-key/index.js | 16 - node_modules/path-key/license | 9 - node_modules/path-key/package.json | 39 - node_modules/path-key/readme.md | 61 - node_modules/path-parse/LICENSE | 21 - node_modules/path-parse/README.md | 42 - node_modules/path-parse/index.js | 75 - node_modules/path-parse/package.json | 33 - node_modules/path-scurry/LICENSE.md | 55 - node_modules/path-scurry/README.md | 636 - .../path-scurry/dist/commonjs/index.d.ts | 1116 - .../path-scurry/dist/commonjs/index.d.ts.map | 1 - .../path-scurry/dist/commonjs/index.js | 2014 - .../path-scurry/dist/commonjs/index.js.map | 1 - .../path-scurry/dist/commonjs/package.json | 3 - node_modules/path-scurry/dist/esm/index.d.ts | 1116 - .../path-scurry/dist/esm/index.d.ts.map | 1 - node_modules/path-scurry/dist/esm/index.js | 1979 - .../path-scurry/dist/esm/index.js.map | 1 - .../path-scurry/dist/esm/package.json | 3 - node_modules/path-scurry/package.json | 89 - node_modules/picocolors/LICENSE | 15 - node_modules/picocolors/README.md | 21 - node_modules/picocolors/package.json | 25 - node_modules/picocolors/picocolors.browser.js | 4 - node_modules/picocolors/picocolors.d.ts | 5 - node_modules/picocolors/picocolors.js | 75 - node_modules/picocolors/types.d.ts | 51 - node_modules/picomatch/CHANGELOG.md | 136 - node_modules/picomatch/LICENSE | 21 - node_modules/picomatch/README.md | 708 - node_modules/picomatch/index.js | 3 - node_modules/picomatch/lib/constants.js | 179 - node_modules/picomatch/lib/parse.js | 1091 - node_modules/picomatch/lib/picomatch.js | 342 - node_modules/picomatch/lib/scan.js | 391 - node_modules/picomatch/lib/utils.js | 64 - node_modules/picomatch/package.json | 81 - node_modules/pify/index.js | 68 - node_modules/pify/license | 21 - node_modules/pify/package.json | 48 - node_modules/pify/readme.md | 119 - node_modules/pirates/LICENSE | 21 - node_modules/pirates/README.md | 73 - node_modules/pirates/index.d.ts | 82 - node_modules/pirates/lib/index.js | 155 - node_modules/pirates/package.json | 43 - node_modules/pngjs/.eslintignore | 2 - node_modules/pngjs/.eslintrc.json | 19 - node_modules/pngjs/.prettierignore | 3 - node_modules/pngjs/LICENSE | 20 - node_modules/pngjs/README.md | 429 - node_modules/pngjs/browser.js | 16096 --- .../pngjs/coverage/lcov-report/base.css | 354 - .../coverage/lcov-report/bitmapper.js.html | 881 - .../coverage/lcov-report/bitpacker.js.html | 554 - .../coverage/lcov-report/block-navigation.js | 77 - .../coverage/lcov-report/chunkstream.js.html | 647 - .../coverage/lcov-report/constants.js.html | 176 - .../pngjs/coverage/lcov-report/crc.js.html | 200 - .../pngjs/coverage/lcov-report/favicon.png | Bin 540 -> 0 bytes .../coverage/lcov-report/filter-pack.js.html | 593 - .../lcov-report/filter-parse-async.js.html | 152 - .../lcov-report/filter-parse-sync.js.html | 143 - .../coverage/lcov-report/filter-parse.js.html | 611 - .../lcov-report/format-normaliser.js.html | 359 - .../pngjs/coverage/lcov-report/index.html | 426 - .../coverage/lcov-report/interlace.js.html | 365 - .../coverage/lcov-report/packer-async.js.html | 230 - .../coverage/lcov-report/packer-sync.js.html | 248 - .../pngjs/coverage/lcov-report/packer.js.html | 467 - .../lcov-report/paeth-predictor.js.html | 128 - .../coverage/lcov-report/parser-async.js.html | 575 - .../coverage/lcov-report/parser-sync.js.html | 404 - .../pngjs/coverage/lcov-report/parser.js.html | 950 - .../coverage/lcov-report/png-sync.js.html | 116 - .../pngjs/coverage/lcov-report/png.js.html | 662 - .../pngjs/coverage/lcov-report/prettify.css | 101 - .../pngjs/coverage/lcov-report/prettify.js | 1007 - .../lcov-report/sort-arrow-sprite.png | Bin 209 -> 0 bytes .../pngjs/coverage/lcov-report/sorter.js | 169 - .../coverage/lcov-report/sync-inflate.js.html | 584 - .../coverage/lcov-report/sync-reader.js.html | 215 - node_modules/pngjs/coverage/lcov.info | 2177 - node_modules/pngjs/lib/bitmapper.js | 267 - node_modules/pngjs/lib/bitpacker.js | 158 - node_modules/pngjs/lib/chunkstream.js | 189 - node_modules/pngjs/lib/constants.js | 32 - node_modules/pngjs/lib/crc.js | 40 - node_modules/pngjs/lib/filter-pack.js | 171 - node_modules/pngjs/lib/filter-parse-async.js | 24 - node_modules/pngjs/lib/filter-parse-sync.js | 21 - node_modules/pngjs/lib/filter-parse.js | 177 - node_modules/pngjs/lib/format-normaliser.js | 93 - node_modules/pngjs/lib/interlace.js | 95 - node_modules/pngjs/lib/packer-async.js | 50 - node_modules/pngjs/lib/packer-sync.js | 56 - node_modules/pngjs/lib/packer.js | 129 - node_modules/pngjs/lib/paeth-predictor.js | 16 - node_modules/pngjs/lib/parser-async.js | 165 - node_modules/pngjs/lib/parser-sync.js | 108 - node_modules/pngjs/lib/parser.js | 290 - node_modules/pngjs/lib/png-sync.js | 12 - node_modules/pngjs/lib/png.js | 194 - node_modules/pngjs/lib/sync-inflate.js | 168 - node_modules/pngjs/lib/sync-reader.js | 45 - node_modules/pngjs/package.json | 73 - node_modules/postcss-import/LICENSE | 20 - node_modules/postcss-import/README.md | 244 - node_modules/postcss-import/index.js | 420 - .../postcss-import/lib/assign-layer-names.js | 17 - node_modules/postcss-import/lib/data-url.js | 17 - node_modules/postcss-import/lib/join-layer.js | 9 - node_modules/postcss-import/lib/join-media.js | 28 - .../postcss-import/lib/load-content.js | 12 - .../postcss-import/lib/parse-statements.js | 172 - .../postcss-import/lib/process-content.js | 59 - node_modules/postcss-import/lib/resolve-id.js | 42 - node_modules/postcss-import/package.json | 65 - node_modules/postcss-js/LICENSE | 20 - node_modules/postcss-js/README.md | 22 - node_modules/postcss-js/async.js | 15 - node_modules/postcss-js/index.js | 11 - node_modules/postcss-js/index.mjs | 8 - node_modules/postcss-js/objectifier.js | 85 - node_modules/postcss-js/package.json | 42 - node_modules/postcss-js/parser.js | 104 - node_modules/postcss-js/process-result.js | 11 - node_modules/postcss-js/sync.js | 12 - node_modules/postcss-load-config/LICENSE | 20 - node_modules/postcss-load-config/README.md | 466 - node_modules/postcss-load-config/package.json | 54 - .../postcss-load-config/src/index.d.ts | 65 - node_modules/postcss-load-config/src/index.js | 185 - .../postcss-load-config/src/options.js | 47 - .../postcss-load-config/src/plugins.js | 85 - node_modules/postcss-load-config/src/req.js | 10 - node_modules/postcss-nested/LICENSE | 20 - node_modules/postcss-nested/README.md | 85 - node_modules/postcss-nested/index.d.ts | 41 - node_modules/postcss-nested/index.js | 361 - node_modules/postcss-nested/package.json | 34 - node_modules/postcss-selector-parser/API.md | 872 - .../postcss-selector-parser/CHANGELOG.md | 549 - .../postcss-selector-parser/LICENSE-MIT | 22 - .../postcss-selector-parser/README.md | 49 - .../postcss-selector-parser/dist/index.js | 17 - .../postcss-selector-parser/dist/parser.js | 1015 - .../postcss-selector-parser/dist/processor.js | 170 - .../dist/selectors/attribute.js | 448 - .../dist/selectors/className.js | 50 - .../dist/selectors/combinator.js | 21 - .../dist/selectors/comment.js | 21 - .../dist/selectors/constructors.js | 65 - .../dist/selectors/container.js | 308 - .../dist/selectors/guards.js | 58 - .../dist/selectors/id.js | 25 - .../dist/selectors/index.js | 21 - .../dist/selectors/namespace.js | 80 - .../dist/selectors/nesting.js | 22 - .../dist/selectors/node.js | 192 - .../dist/selectors/pseudo.js | 26 - .../dist/selectors/root.js | 44 - .../dist/selectors/selector.js | 21 - .../dist/selectors/string.js | 21 - .../dist/selectors/tag.js | 21 - .../dist/selectors/types.js | 28 - .../dist/selectors/universal.js | 22 - .../dist/sortAscending.js | 11 - .../dist/tokenTypes.js | 70 - .../postcss-selector-parser/dist/tokenize.js | 239 - .../dist/util/ensureObject.js | 17 - .../dist/util/getProp.js | 18 - .../dist/util/index.js | 13 - .../dist/util/stripComments.js | 21 - .../dist/util/unesc.js | 76 - .../postcss-selector-parser/package.json | 80 - .../postcss-selector-parser.d.ts | 555 - node_modules/postcss-value-parser/LICENSE | 22 - node_modules/postcss-value-parser/README.md | 263 - .../postcss-value-parser/lib/index.d.ts | 177 - .../postcss-value-parser/lib/index.js | 28 - .../postcss-value-parser/lib/parse.js | 321 - .../postcss-value-parser/lib/stringify.js | 48 - node_modules/postcss-value-parser/lib/unit.js | 120 - node_modules/postcss-value-parser/lib/walk.js | 22 - .../postcss-value-parser/package.json | 58 - node_modules/postcss/LICENSE | 20 - node_modules/postcss/README.md | 29 - node_modules/postcss/lib/at-rule.d.ts | 140 - node_modules/postcss/lib/at-rule.js | 25 - node_modules/postcss/lib/comment.d.ts | 68 - node_modules/postcss/lib/comment.js | 13 - node_modules/postcss/lib/container.d.ts | 483 - node_modules/postcss/lib/container.js | 447 - .../postcss/lib/css-syntax-error.d.ts | 248 - node_modules/postcss/lib/css-syntax-error.js | 133 - node_modules/postcss/lib/declaration.d.ts | 151 - node_modules/postcss/lib/declaration.js | 24 - node_modules/postcss/lib/document.d.ts | 69 - node_modules/postcss/lib/document.js | 33 - node_modules/postcss/lib/fromJSON.d.ts | 9 - node_modules/postcss/lib/fromJSON.js | 54 - node_modules/postcss/lib/input.d.ts | 227 - node_modules/postcss/lib/input.js | 265 - node_modules/postcss/lib/lazy-result.d.ts | 190 - node_modules/postcss/lib/lazy-result.js | 550 - node_modules/postcss/lib/list.d.ts | 60 - node_modules/postcss/lib/list.js | 58 - node_modules/postcss/lib/map-generator.js | 368 - node_modules/postcss/lib/no-work-result.d.ts | 46 - node_modules/postcss/lib/no-work-result.js | 138 - node_modules/postcss/lib/node.d.ts | 556 - node_modules/postcss/lib/node.js | 449 - node_modules/postcss/lib/parse.d.ts | 9 - node_modules/postcss/lib/parse.js | 42 - node_modules/postcss/lib/parser.js | 611 - node_modules/postcss/lib/postcss.d.mts | 69 - node_modules/postcss/lib/postcss.d.ts | 458 - node_modules/postcss/lib/postcss.js | 101 - node_modules/postcss/lib/postcss.mjs | 30 - node_modules/postcss/lib/previous-map.d.ts | 81 - node_modules/postcss/lib/previous-map.js | 144 - node_modules/postcss/lib/processor.d.ts | 115 - node_modules/postcss/lib/processor.js | 67 - node_modules/postcss/lib/result.d.ts | 205 - node_modules/postcss/lib/result.js | 42 - node_modules/postcss/lib/root.d.ts | 87 - node_modules/postcss/lib/root.js | 61 - node_modules/postcss/lib/rule.d.ts | 126 - node_modules/postcss/lib/rule.js | 27 - node_modules/postcss/lib/stringifier.d.ts | 46 - node_modules/postcss/lib/stringifier.js | 353 - node_modules/postcss/lib/stringify.d.ts | 9 - node_modules/postcss/lib/stringify.js | 11 - node_modules/postcss/lib/symbols.js | 5 - .../postcss/lib/terminal-highlight.js | 70 - node_modules/postcss/lib/tokenize.js | 266 - node_modules/postcss/lib/warn-once.js | 13 - node_modules/postcss/lib/warning.d.ts | 147 - node_modules/postcss/lib/warning.js | 37 - node_modules/postcss/package.json | 88 - node_modules/qr-scanner/LICENSE | 21 - node_modules/qr-scanner/README.md | 263 - node_modules/qr-scanner/package.json | 59 - .../qr-scanner/qr-scanner-worker.min.js | 98 - .../qr-scanner/qr-scanner-worker.min.js.map | 1 - .../qr-scanner/qr-scanner.legacy.min.js | 56 - .../qr-scanner/qr-scanner.legacy.min.js.map | 1 - node_modules/qr-scanner/qr-scanner.min.js | 31 - node_modules/qr-scanner/qr-scanner.min.js.map | 1 - node_modules/qr-scanner/qr-scanner.umd.min.js | 31 - .../qr-scanner/qr-scanner.umd.min.js.map | 1 - node_modules/qr-scanner/types/qr-scanner.d.ts | 140 - node_modules/qrcode/README.md | 770 - node_modules/qrcode/bin/qrcode | 159 - node_modules/qrcode/helper/to-sjis-browser.js | 2 - node_modules/qrcode/helper/to-sjis.js | 105 - node_modules/qrcode/lib/browser.js | 76 - node_modules/qrcode/lib/can-promise.js | 7 - .../qrcode/lib/core/alignment-pattern.js | 83 - .../qrcode/lib/core/alphanumeric-data.js | 59 - node_modules/qrcode/lib/core/bit-buffer.js | 37 - node_modules/qrcode/lib/core/bit-matrix.js | 65 - node_modules/qrcode/lib/core/byte-data.js | 30 - .../qrcode/lib/core/error-correction-code.js | 135 - .../qrcode/lib/core/error-correction-level.js | 50 - .../qrcode/lib/core/finder-pattern.js | 22 - node_modules/qrcode/lib/core/format-info.js | 29 - node_modules/qrcode/lib/core/galois-field.js | 69 - node_modules/qrcode/lib/core/kanji-data.js | 54 - node_modules/qrcode/lib/core/mask-pattern.js | 234 - node_modules/qrcode/lib/core/mode.js | 167 - node_modules/qrcode/lib/core/numeric-data.js | 43 - node_modules/qrcode/lib/core/polynomial.js | 62 - node_modules/qrcode/lib/core/qrcode.js | 495 - .../qrcode/lib/core/reed-solomon-encoder.js | 56 - node_modules/qrcode/lib/core/regex.js | 31 - node_modules/qrcode/lib/core/segments.js | 330 - node_modules/qrcode/lib/core/utils.js | 63 - node_modules/qrcode/lib/core/version-check.js | 9 - node_modules/qrcode/lib/core/version.js | 163 - node_modules/qrcode/lib/index.js | 12 - node_modules/qrcode/lib/renderer/canvas.js | 63 - node_modules/qrcode/lib/renderer/png.js | 78 - node_modules/qrcode/lib/renderer/svg-tag.js | 81 - node_modules/qrcode/lib/renderer/svg.js | 19 - node_modules/qrcode/lib/renderer/terminal.js | 9 - .../lib/renderer/terminal/terminal-small.js | 85 - .../qrcode/lib/renderer/terminal/terminal.js | 49 - node_modules/qrcode/lib/renderer/utf8.js | 71 - node_modules/qrcode/lib/renderer/utils.js | 99 - node_modules/qrcode/lib/server.js | 138 - node_modules/qrcode/license | 10 - node_modules/qrcode/package.json | 77 - node_modules/queue-microtask/LICENSE | 20 - node_modules/queue-microtask/README.md | 90 - node_modules/queue-microtask/index.d.ts | 2 - node_modules/queue-microtask/index.js | 9 - node_modules/queue-microtask/package.json | 55 - node_modules/read-cache/LICENSE | 20 - node_modules/read-cache/README.md | 46 - node_modules/read-cache/index.js | 78 - node_modules/read-cache/package.json | 34 - node_modules/readdirp/LICENSE | 21 - node_modules/readdirp/README.md | 122 - node_modules/readdirp/index.d.ts | 43 - node_modules/readdirp/index.js | 287 - node_modules/readdirp/package.json | 122 - node_modules/require-directory/.jshintrc | 67 - node_modules/require-directory/.npmignore | 1 - node_modules/require-directory/.travis.yml | 3 - node_modules/require-directory/LICENSE | 22 - .../require-directory/README.markdown | 184 - node_modules/require-directory/index.js | 86 - node_modules/require-directory/package.json | 40 - .../require-main-filename/CHANGELOG.md | 26 - .../require-main-filename/LICENSE.txt | 14 - node_modules/require-main-filename/README.md | 26 - node_modules/require-main-filename/index.js | 18 - .../require-main-filename/package.json | 35 - node_modules/resolve/.editorconfig | 37 - node_modules/resolve/.eslintrc | 65 - node_modules/resolve/.github/FUNDING.yml | 12 - node_modules/resolve/LICENSE | 21 - node_modules/resolve/SECURITY.md | 3 - node_modules/resolve/async.js | 3 - node_modules/resolve/bin/resolve | 50 - node_modules/resolve/example/async.js | 5 - node_modules/resolve/example/sync.js | 3 - node_modules/resolve/index.js | 6 - node_modules/resolve/lib/async.js | 329 - node_modules/resolve/lib/caller.js | 8 - node_modules/resolve/lib/core.js | 12 - node_modules/resolve/lib/core.json | 162 - node_modules/resolve/lib/homedir.js | 24 - node_modules/resolve/lib/is-core.js | 5 - .../resolve/lib/node-modules-paths.js | 42 - node_modules/resolve/lib/normalize-options.js | 10 - node_modules/resolve/lib/sync.js | 208 - node_modules/resolve/package.json | 75 - node_modules/resolve/readme.markdown | 301 - node_modules/resolve/sync.js | 3 - node_modules/resolve/test/core.js | 88 - node_modules/resolve/test/dotdot.js | 29 - node_modules/resolve/test/dotdot/abc/index.js | 2 - node_modules/resolve/test/dotdot/index.js | 1 - node_modules/resolve/test/faulty_basedir.js | 29 - node_modules/resolve/test/filter.js | 34 - node_modules/resolve/test/filter_sync.js | 33 - node_modules/resolve/test/home_paths.js | 127 - node_modules/resolve/test/home_paths_sync.js | 114 - node_modules/resolve/test/mock.js | 315 - node_modules/resolve/test/mock_sync.js | 214 - node_modules/resolve/test/module_dir.js | 56 - .../test/module_dir/xmodules/aaa/index.js | 1 - .../test/module_dir/ymodules/aaa/index.js | 1 - .../test/module_dir/zmodules/bbb/main.js | 1 - .../test/module_dir/zmodules/bbb/package.json | 3 - .../resolve/test/node-modules-paths.js | 143 - node_modules/resolve/test/node_path.js | 70 - .../resolve/test/node_path/x/aaa/index.js | 1 - .../resolve/test/node_path/x/ccc/index.js | 1 - .../resolve/test/node_path/y/bbb/index.js | 1 - .../resolve/test/node_path/y/ccc/index.js | 1 - node_modules/resolve/test/nonstring.js | 9 - node_modules/resolve/test/pathfilter.js | 75 - .../resolve/test/pathfilter/deep_ref/main.js | 0 node_modules/resolve/test/precedence.js | 23 - node_modules/resolve/test/precedence/aaa.js | 1 - .../resolve/test/precedence/aaa/index.js | 1 - .../resolve/test/precedence/aaa/main.js | 1 - node_modules/resolve/test/precedence/bbb.js | 1 - .../resolve/test/precedence/bbb/main.js | 1 - node_modules/resolve/test/resolver.js | 597 - .../resolve/test/resolver/baz/doom.js | 0 .../resolve/test/resolver/baz/package.json | 4 - .../resolve/test/resolver/baz/quux.js | 1 - .../resolve/test/resolver/browser_field/a.js | 0 .../resolve/test/resolver/browser_field/b.js | 0 .../test/resolver/browser_field/package.json | 5 - node_modules/resolve/test/resolver/cup.coffee | 1 - .../resolve/test/resolver/dot_main/index.js | 1 - .../test/resolver/dot_main/package.json | 3 - .../test/resolver/dot_slash_main/index.js | 1 - .../test/resolver/dot_slash_main/package.json | 3 - .../resolve/test/resolver/false_main/index.js | 0 .../test/resolver/false_main/package.json | 4 - node_modules/resolve/test/resolver/foo.js | 1 - .../test/resolver/incorrect_main/index.js | 2 - .../test/resolver/incorrect_main/package.json | 3 - .../test/resolver/invalid_main/package.json | 7 - node_modules/resolve/test/resolver/mug.coffee | 0 node_modules/resolve/test/resolver/mug.js | 0 .../test/resolver/multirepo/lerna.json | 6 - .../test/resolver/multirepo/package.json | 20 - .../multirepo/packages/package-a/index.js | 35 - .../multirepo/packages/package-a/package.json | 14 - .../multirepo/packages/package-b/index.js | 0 .../multirepo/packages/package-b/package.json | 14 - .../resolver/nested_symlinks/mylib/async.js | 26 - .../nested_symlinks/mylib/package.json | 15 - .../resolver/nested_symlinks/mylib/sync.js | 12 - .../test/resolver/other_path/lib/other-lib.js | 0 .../resolve/test/resolver/other_path/root.js | 0 .../resolve/test/resolver/quux/foo/index.js | 1 - .../resolve/test/resolver/same_names/foo.js | 1 - .../test/resolver/same_names/foo/index.js | 1 - .../resolver/symlinked/_/node_modules/foo.js | 0 .../symlinked/_/symlink_target/.gitkeep | 0 .../test/resolver/symlinked/package/bar.js | 1 - .../resolver/symlinked/package/package.json | 3 - .../test/resolver/without_basedir/main.js | 5 - node_modules/resolve/test/resolver_sync.js | 730 - node_modules/resolve/test/shadowed_core.js | 54 - .../shadowed_core/node_modules/util/index.js | 0 node_modules/resolve/test/subdirs.js | 13 - node_modules/resolve/test/symlinks.js | 176 - node_modules/reusify/.github/dependabot.yml | 7 - node_modules/reusify/.github/workflows/ci.yml | 96 - node_modules/reusify/LICENSE | 22 - node_modules/reusify/README.md | 139 - node_modules/reusify/SECURITY.md | 15 - .../benchmarks/createNoCodeFunction.js | 30 - node_modules/reusify/benchmarks/fib.js | 13 - .../reusify/benchmarks/reuseNoCodeFunction.js | 38 - node_modules/reusify/eslint.config.js | 14 - node_modules/reusify/package.json | 50 - node_modules/reusify/reusify.d.ts | 14 - node_modules/reusify/reusify.js | 33 - node_modules/reusify/test.js | 66 - node_modules/reusify/tsconfig.json | 11 - node_modules/run-parallel/LICENSE | 20 - node_modules/run-parallel/README.md | 85 - node_modules/run-parallel/index.js | 51 - node_modules/run-parallel/package.json | 58 - node_modules/set-blocking/CHANGELOG.md | 26 - node_modules/set-blocking/LICENSE.txt | 14 - node_modules/set-blocking/README.md | 31 - node_modules/set-blocking/index.js | 7 - node_modules/set-blocking/package.json | 42 - node_modules/shebang-command/index.js | 19 - node_modules/shebang-command/license | 9 - node_modules/shebang-command/package.json | 34 - node_modules/shebang-command/readme.md | 34 - node_modules/shebang-regex/index.d.ts | 22 - node_modules/shebang-regex/index.js | 2 - node_modules/shebang-regex/license | 9 - node_modules/shebang-regex/package.json | 35 - node_modules/shebang-regex/readme.md | 33 - node_modules/signal-exit/LICENSE.txt | 16 - node_modules/signal-exit/README.md | 74 - .../signal-exit/dist/cjs/browser.d.ts | 12 - .../signal-exit/dist/cjs/browser.d.ts.map | 1 - node_modules/signal-exit/dist/cjs/browser.js | 10 - .../signal-exit/dist/cjs/browser.js.map | 1 - node_modules/signal-exit/dist/cjs/index.d.ts | 48 - .../signal-exit/dist/cjs/index.d.ts.map | 1 - node_modules/signal-exit/dist/cjs/index.js | 279 - .../signal-exit/dist/cjs/index.js.map | 1 - .../signal-exit/dist/cjs/package.json | 3 - .../signal-exit/dist/cjs/signals.d.ts | 29 - .../signal-exit/dist/cjs/signals.d.ts.map | 1 - node_modules/signal-exit/dist/cjs/signals.js | 42 - .../signal-exit/dist/cjs/signals.js.map | 1 - .../signal-exit/dist/mjs/browser.d.ts | 12 - .../signal-exit/dist/mjs/browser.d.ts.map | 1 - node_modules/signal-exit/dist/mjs/browser.js | 4 - .../signal-exit/dist/mjs/browser.js.map | 1 - node_modules/signal-exit/dist/mjs/index.d.ts | 48 - .../signal-exit/dist/mjs/index.d.ts.map | 1 - node_modules/signal-exit/dist/mjs/index.js | 275 - .../signal-exit/dist/mjs/index.js.map | 1 - .../signal-exit/dist/mjs/package.json | 3 - .../signal-exit/dist/mjs/signals.d.ts | 29 - .../signal-exit/dist/mjs/signals.d.ts.map | 1 - node_modules/signal-exit/dist/mjs/signals.js | 39 - .../signal-exit/dist/mjs/signals.js.map | 1 - node_modules/signal-exit/package.json | 106 - node_modules/source-map-js/LICENSE | 28 - node_modules/source-map-js/README.md | 765 - node_modules/source-map-js/lib/array-set.js | 121 - node_modules/source-map-js/lib/base64-vlq.js | 140 - node_modules/source-map-js/lib/base64.js | 67 - .../source-map-js/lib/binary-search.js | 111 - .../source-map-js/lib/mapping-list.js | 79 - node_modules/source-map-js/lib/quick-sort.js | 132 - .../lib/source-map-consumer.d.ts | 1 - .../source-map-js/lib/source-map-consumer.js | 1188 - .../lib/source-map-generator.d.ts | 1 - .../source-map-js/lib/source-map-generator.js | 444 - .../source-map-js/lib/source-node.d.ts | 1 - node_modules/source-map-js/lib/source-node.js | 413 - node_modules/source-map-js/lib/util.js | 594 - node_modules/source-map-js/package.json | 71 - node_modules/source-map-js/source-map.d.ts | 104 - node_modules/source-map-js/source-map.js | 8 - node_modules/string-width-cjs/index.d.ts | 29 - node_modules/string-width-cjs/index.js | 47 - node_modules/string-width-cjs/license | 9 - node_modules/string-width-cjs/package.json | 56 - node_modules/string-width-cjs/readme.md | 50 - node_modules/string-width/index.d.ts | 29 - node_modules/string-width/index.js | 47 - node_modules/string-width/license | 9 - node_modules/string-width/package.json | 56 - node_modules/string-width/readme.md | 50 - node_modules/strip-ansi-cjs/index.d.ts | 17 - node_modules/strip-ansi-cjs/index.js | 4 - node_modules/strip-ansi-cjs/license | 9 - node_modules/strip-ansi-cjs/package.json | 54 - node_modules/strip-ansi-cjs/readme.md | 46 - node_modules/strip-ansi/index.d.ts | 17 - node_modules/strip-ansi/index.js | 4 - node_modules/strip-ansi/license | 9 - node_modules/strip-ansi/package.json | 54 - node_modules/strip-ansi/readme.md | 46 - node_modules/sucrase/LICENSE | 21 - node_modules/sucrase/README.md | 295 - node_modules/sucrase/bin/sucrase | 3 - node_modules/sucrase/bin/sucrase-node | 18 - .../sucrase/dist/CJSImportProcessor.js | 456 - node_modules/sucrase/dist/HelperManager.js | 176 - node_modules/sucrase/dist/NameManager.js | 27 - .../sucrase/dist/Options-gen-types.js | 42 - node_modules/sucrase/dist/Options.js | 101 - node_modules/sucrase/dist/TokenProcessor.js | 357 - node_modules/sucrase/dist/cli.js | 317 - node_modules/sucrase/dist/computeSourceMap.js | 89 - .../sucrase/dist/esm/CJSImportProcessor.js | 456 - .../sucrase/dist/esm/HelperManager.js | 176 - node_modules/sucrase/dist/esm/NameManager.js | 27 - .../sucrase/dist/esm/Options-gen-types.js | 42 - node_modules/sucrase/dist/esm/Options.js | 101 - .../sucrase/dist/esm/TokenProcessor.js | 357 - node_modules/sucrase/dist/esm/cli.js | 317 - .../sucrase/dist/esm/computeSourceMap.js | 89 - .../dist/esm/identifyShadowedGlobals.js | 98 - node_modules/sucrase/dist/esm/index.js | 133 - node_modules/sucrase/dist/esm/parser/index.js | 31 - .../sucrase/dist/esm/parser/plugins/flow.js | 1105 - .../dist/esm/parser/plugins/jsx/index.js | 367 - .../dist/esm/parser/plugins/jsx/xhtml.js | 256 - .../sucrase/dist/esm/parser/plugins/types.js | 37 - .../dist/esm/parser/plugins/typescript.js | 1632 - .../dist/esm/parser/tokenizer/index.js | 1004 - .../dist/esm/parser/tokenizer/keywords.js | 43 - .../dist/esm/parser/tokenizer/readWord.js | 64 - .../dist/esm/parser/tokenizer/readWordTree.js | 671 - .../dist/esm/parser/tokenizer/state.js | 106 - .../dist/esm/parser/tokenizer/types.js | 361 - .../sucrase/dist/esm/parser/traverser/base.js | 60 - .../dist/esm/parser/traverser/expression.js | 1022 - .../dist/esm/parser/traverser/index.js | 18 - .../sucrase/dist/esm/parser/traverser/lval.js | 159 - .../dist/esm/parser/traverser/statement.js | 1332 - .../sucrase/dist/esm/parser/traverser/util.js | 104 - .../sucrase/dist/esm/parser/util/charcodes.js | 115 - .../dist/esm/parser/util/identifier.js | 34 - .../dist/esm/parser/util/whitespace.js | 33 - node_modules/sucrase/dist/esm/register.js | 88 - .../esm/transformers/CJSImportTransformer.js | 916 - .../esm/transformers/ESMImportTransformer.js | 415 - .../dist/esm/transformers/FlowTransformer.js | 182 - .../dist/esm/transformers/JSXTransformer.js | 733 - .../esm/transformers/JestHoistTransformer.js | 111 - .../NumericSeparatorTransformer.js | 20 - .../OptionalCatchBindingTransformer.js | 19 - .../OptionalChainingNullishTransformer.js | 155 - .../ReactDisplayNameTransformer.js | 160 - .../transformers/ReactHotLoaderTransformer.js | 69 - .../dist/esm/transformers/RootTransformer.js | 462 - .../dist/esm/transformers/Transformer.js | 16 - .../esm/transformers/TypeScriptTransformer.js | 279 - .../dist/esm/util/elideImportEquals.js | 29 - .../sucrase/dist/esm/util/formatTokens.js | 74 - .../sucrase/dist/esm/util/getClassInfo.js | 352 - .../dist/esm/util/getDeclarationInfo.js | 40 - .../dist/esm/util/getIdentifierNames.js | 15 - .../esm/util/getImportExportSpecifierInfo.js | 92 - .../sucrase/dist/esm/util/getJSXPragmaInfo.js | 22 - .../dist/esm/util/getNonTypeIdentifiers.js | 43 - .../dist/esm/util/getTSImportedNames.js | 84 - .../sucrase/dist/esm/util/isAsyncOperation.js | 38 - .../sucrase/dist/esm/util/isExportFrom.js | 18 - .../sucrase/dist/esm/util/isIdentifier.js | 81 - .../esm/util/removeMaybeImportAttributes.js | 22 - .../dist/esm/util/shouldElideDefaultExport.js | 38 - .../sucrase/dist/identifyShadowedGlobals.js | 98 - node_modules/sucrase/dist/index.js | 133 - node_modules/sucrase/dist/parser/index.js | 31 - .../sucrase/dist/parser/plugins/flow.js | 1105 - .../sucrase/dist/parser/plugins/jsx/index.js | 367 - .../sucrase/dist/parser/plugins/jsx/xhtml.js | 256 - .../sucrase/dist/parser/plugins/types.js | 37 - .../sucrase/dist/parser/plugins/typescript.js | 1632 - .../sucrase/dist/parser/tokenizer/index.js | 1004 - .../sucrase/dist/parser/tokenizer/keywords.js | 43 - .../sucrase/dist/parser/tokenizer/readWord.js | 64 - .../dist/parser/tokenizer/readWordTree.js | 671 - .../sucrase/dist/parser/tokenizer/state.js | 106 - .../sucrase/dist/parser/tokenizer/types.js | 361 - .../sucrase/dist/parser/traverser/base.js | 60 - .../dist/parser/traverser/expression.js | 1022 - .../sucrase/dist/parser/traverser/index.js | 18 - .../sucrase/dist/parser/traverser/lval.js | 159 - .../dist/parser/traverser/statement.js | 1332 - .../sucrase/dist/parser/traverser/util.js | 104 - .../sucrase/dist/parser/util/charcodes.js | 115 - .../sucrase/dist/parser/util/identifier.js | 34 - .../sucrase/dist/parser/util/whitespace.js | 33 - node_modules/sucrase/dist/register.js | 88 - .../dist/transformers/CJSImportTransformer.js | 916 - .../dist/transformers/ESMImportTransformer.js | 415 - .../dist/transformers/FlowTransformer.js | 182 - .../dist/transformers/JSXTransformer.js | 733 - .../dist/transformers/JestHoistTransformer.js | 111 - .../NumericSeparatorTransformer.js | 20 - .../OptionalCatchBindingTransformer.js | 19 - .../OptionalChainingNullishTransformer.js | 155 - .../ReactDisplayNameTransformer.js | 160 - .../transformers/ReactHotLoaderTransformer.js | 69 - .../dist/transformers/RootTransformer.js | 462 - .../sucrase/dist/transformers/Transformer.js | 16 - .../transformers/TypeScriptTransformer.js | 279 - .../dist/types/CJSImportProcessor.d.ts | 67 - .../sucrase/dist/types/HelperManager.d.ts | 15 - .../sucrase/dist/types/NameManager.d.ts | 7 - .../sucrase/dist/types/Options-gen-types.d.ts | 9 - node_modules/sucrase/dist/types/Options.d.ts | 90 - .../sucrase/dist/types/TokenProcessor.d.ts | 87 - node_modules/sucrase/dist/types/cli.d.ts | 1 - .../sucrase/dist/types/computeSourceMap.d.ts | 17 - .../dist/types/identifyShadowedGlobals.d.ts | 12 - node_modules/sucrase/dist/types/index.d.ts | 26 - .../sucrase/dist/types/parser/index.d.ts | 8 - .../dist/types/parser/plugins/flow.d.ts | 27 - .../dist/types/parser/plugins/jsx/index.d.ts | 2 - .../dist/types/parser/plugins/jsx/xhtml.d.ts | 2 - .../dist/types/parser/plugins/types.d.ts | 5 - .../dist/types/parser/plugins/typescript.d.ts | 49 - .../dist/types/parser/tokenizer/index.d.ts | 93 - .../dist/types/parser/tokenizer/keywords.d.ts | 43 - .../dist/types/parser/tokenizer/readWord.d.ts | 7 - .../types/parser/tokenizer/readWordTree.d.ts | 1 - .../dist/types/parser/tokenizer/state.d.ts | 50 - .../dist/types/parser/tokenizer/types.d.ts | 126 - .../dist/types/parser/traverser/base.d.ts | 16 - .../types/parser/traverser/expression.d.ts | 34 - .../dist/types/parser/traverser/index.d.ts | 2 - .../dist/types/parser/traverser/lval.d.ts | 9 - .../types/parser/traverser/statement.d.ts | 20 - .../dist/types/parser/traverser/util.d.ts | 17 - .../dist/types/parser/util/charcodes.d.ts | 107 - .../dist/types/parser/util/identifier.d.ts | 2 - .../dist/types/parser/util/whitespace.d.ts | 3 - node_modules/sucrase/dist/types/register.d.ts | 14 - .../transformers/CJSImportTransformer.d.ts | 149 - .../transformers/ESMImportTransformer.d.ts | 52 - .../types/transformers/FlowTransformer.d.ts | 79 - .../types/transformers/JSXTransformer.d.ts | 144 - .../transformers/JestHoistTransformer.d.ts | 32 - .../NumericSeparatorTransformer.d.ts | 7 - .../OptionalCatchBindingTransformer.d.ts | 9 - .../OptionalChainingNullishTransformer.d.ts | 36 - .../ReactDisplayNameTransformer.d.ts | 29 - .../ReactHotLoaderTransformer.d.ts | 12 - .../types/transformers/RootTransformer.d.ts | 52 - .../dist/types/transformers/Transformer.d.ts | 6 - .../transformers/TypeScriptTransformer.d.ts | 104 - .../dist/types/util/elideImportEquals.d.ts | 2 - .../sucrase/dist/types/util/formatTokens.d.ts | 2 - .../sucrase/dist/types/util/getClassInfo.d.ts | 34 - .../dist/types/util/getDeclarationInfo.d.ts | 18 - .../dist/types/util/getIdentifierNames.d.ts | 5 - .../util/getImportExportSpecifierInfo.d.ts | 36 - .../dist/types/util/getJSXPragmaInfo.d.ts | 8 - .../types/util/getNonTypeIdentifiers.d.ts | 3 - .../dist/types/util/getTSImportedNames.d.ts | 9 - .../dist/types/util/isAsyncOperation.d.ts | 11 - .../sucrase/dist/types/util/isExportFrom.d.ts | 6 - .../sucrase/dist/types/util/isIdentifier.d.ts | 8 - .../util/removeMaybeImportAttributes.d.ts | 6 - .../types/util/shouldElideDefaultExport.d.ts | 6 - .../sucrase/dist/util/elideImportEquals.js | 29 - .../sucrase/dist/util/formatTokens.js | 74 - .../sucrase/dist/util/getClassInfo.js | 352 - .../sucrase/dist/util/getDeclarationInfo.js | 40 - .../sucrase/dist/util/getIdentifierNames.js | 15 - .../dist/util/getImportExportSpecifierInfo.js | 92 - .../sucrase/dist/util/getJSXPragmaInfo.js | 22 - .../dist/util/getNonTypeIdentifiers.js | 43 - .../sucrase/dist/util/getTSImportedNames.js | 84 - .../sucrase/dist/util/isAsyncOperation.js | 38 - .../sucrase/dist/util/isExportFrom.js | 18 - .../sucrase/dist/util/isIdentifier.js | 81 - .../dist/util/removeMaybeImportAttributes.js | 22 - .../dist/util/shouldElideDefaultExport.js | 38 - node_modules/sucrase/package.json | 88 - node_modules/sucrase/register/index.js | 1 - node_modules/sucrase/register/js.js | 1 - node_modules/sucrase/register/jsx.js | 1 - .../register/ts-legacy-module-interop.js | 1 - node_modules/sucrase/register/ts.js | 1 - .../register/tsx-legacy-module-interop.js | 1 - node_modules/sucrase/register/tsx.js | 1 - node_modules/sucrase/ts-node-plugin/index.js | 83 - .../supports-preserve-symlinks-flag/.eslintrc | 14 - .../.github/FUNDING.yml | 12 - .../supports-preserve-symlinks-flag/.nycrc | 9 - .../CHANGELOG.md | 22 - .../supports-preserve-symlinks-flag/LICENSE | 21 - .../supports-preserve-symlinks-flag/README.md | 42 - .../browser.js | 3 - .../supports-preserve-symlinks-flag/index.js | 9 - .../package.json | 70 - .../test/index.js | 29 - node_modules/tailwindcss/CHANGELOG.md | 2713 - node_modules/tailwindcss/LICENSE | 21 - node_modules/tailwindcss/README.md | 40 - node_modules/tailwindcss/base.css | 1 - node_modules/tailwindcss/colors.d.ts | 3 - node_modules/tailwindcss/colors.js | 2 - node_modules/tailwindcss/components.css | 1 - node_modules/tailwindcss/defaultConfig.d.ts | 3 - node_modules/tailwindcss/defaultConfig.js | 2 - node_modules/tailwindcss/defaultTheme.d.ts | 4 - node_modules/tailwindcss/defaultTheme.js | 2 - .../tailwindcss/lib/cli-peer-dependencies.js | 36 - node_modules/tailwindcss/lib/cli.js | 3 - .../tailwindcss/lib/cli/build/deps.js | 62 - .../tailwindcss/lib/cli/build/index.js | 54 - .../tailwindcss/lib/cli/build/plugin.js | 373 - .../tailwindcss/lib/cli/build/utils.js | 88 - .../tailwindcss/lib/cli/build/watching.js | 182 - .../tailwindcss/lib/cli/help/index.js | 73 - node_modules/tailwindcss/lib/cli/index.js | 230 - .../tailwindcss/lib/cli/init/index.js | 63 - .../tailwindcss/lib/corePluginList.js | 191 - node_modules/tailwindcss/lib/corePlugins.js | 4339 - node_modules/tailwindcss/lib/css/LICENSE | 25 - .../tailwindcss/lib/css/preflight.css | 386 - node_modules/tailwindcss/lib/featureFlags.js | 79 - node_modules/tailwindcss/lib/index.js | 2 - .../tailwindcss/lib/lib/cacheInvalidation.js | 92 - .../lib/lib/collapseAdjacentRules.js | 61 - .../lib/lib/collapseDuplicateDeclarations.js | 85 - node_modules/tailwindcss/lib/lib/content.js | 247 - .../tailwindcss/lib/lib/defaultExtractor.js | 273 - .../lib/lib/evaluateTailwindFunctions.js | 238 - .../tailwindcss/lib/lib/expandApplyAtRules.js | 553 - .../lib/lib/expandTailwindAtRules.js | 279 - .../tailwindcss/lib/lib/findAtConfigPath.js | 46 - .../tailwindcss/lib/lib/generateRules.js | 907 - .../lib/lib/getModuleDependencies.js | 99 - .../tailwindcss/lib/lib/load-config.js | 65 - .../lib/lib/normalizeTailwindDirectives.js | 89 - node_modules/tailwindcss/lib/lib/offsets.js | 355 - .../lib/lib/partitionApplyAtRules.js | 58 - node_modules/tailwindcss/lib/lib/regex.js | 74 - .../tailwindcss/lib/lib/remap-bitfield.js | 89 - .../lib/lib/resolveDefaultsAtRules.js | 165 - .../tailwindcss/lib/lib/setupContextUtils.js | 1298 - .../lib/lib/setupTrackingContext.js | 166 - .../tailwindcss/lib/lib/sharedState.js | 79 - .../lib/lib/substituteScreenAtRules.js | 31 - node_modules/tailwindcss/lib/plugin.js | 48 - .../lib/postcss-plugins/nesting/README.md | 42 - .../lib/postcss-plugins/nesting/index.js | 21 - .../lib/postcss-plugins/nesting/plugin.js | 89 - .../lib/processTailwindFeatures.js | 62 - node_modules/tailwindcss/lib/public/colors.js | 355 - .../tailwindcss/lib/public/create-plugin.js | 17 - .../tailwindcss/lib/public/default-config.js | 18 - .../tailwindcss/lib/public/default-theme.js | 18 - .../tailwindcss/lib/public/load-config.js | 12 - .../tailwindcss/lib/public/resolve-config.js | 24 - .../lib/util/applyImportantSelector.js | 38 - node_modules/tailwindcss/lib/util/bigSign.js | 13 - .../tailwindcss/lib/util/buildMediaQuery.js | 27 - .../tailwindcss/lib/util/cloneDeep.js | 22 - .../tailwindcss/lib/util/cloneNodes.js | 54 - node_modules/tailwindcss/lib/util/color.js | 116 - .../tailwindcss/lib/util/colorNames.js | 752 - .../tailwindcss/lib/util/configurePlugins.js | 23 - .../tailwindcss/lib/util/createPlugin.js | 32 - .../lib/util/createUtilityPlugin.js | 53 - .../tailwindcss/lib/util/dataTypes.js | 444 - node_modules/tailwindcss/lib/util/defaults.js | 27 - .../tailwindcss/lib/util/escapeClassName.js | 24 - .../tailwindcss/lib/util/escapeCommas.js | 13 - .../lib/util/flattenColorPalette.js | 18 - .../lib/util/formatVariantSelector.js | 270 - .../tailwindcss/lib/util/getAllConfigs.js | 50 - .../tailwindcss/lib/util/hashConfig.js | 21 - .../tailwindcss/lib/util/isKeyframeRule.js | 13 - .../tailwindcss/lib/util/isPlainObject.js | 17 - .../util/isSyntacticallyValidPropertyValue.js | 74 - node_modules/tailwindcss/lib/util/log.js | 61 - .../tailwindcss/lib/util/nameClass.js | 49 - .../tailwindcss/lib/util/negateValue.js | 36 - .../tailwindcss/lib/util/normalizeConfig.js | 281 - .../tailwindcss/lib/util/normalizeScreens.js | 178 - .../lib/util/parseAnimationValue.js | 93 - .../lib/util/parseBoxShadowValue.js | 88 - .../tailwindcss/lib/util/parseDependency.js | 47 - .../tailwindcss/lib/util/parseGlob.js | 35 - .../tailwindcss/lib/util/parseObjectStyles.js | 36 - .../tailwindcss/lib/util/pluginUtils.js | 289 - .../tailwindcss/lib/util/prefixSelector.js | 39 - .../tailwindcss/lib/util/pseudoElements.js | 212 - .../lib/util/removeAlphaVariables.js | 33 - .../tailwindcss/lib/util/resolveConfig.js | 256 - .../tailwindcss/lib/util/resolveConfigPath.js | 72 - .../tailwindcss/lib/util/responsive.js | 24 - .../lib/util/splitAtTopLevelOnly.js | 47 - node_modules/tailwindcss/lib/util/tap.js | 14 - .../tailwindcss/lib/util/toColorValue.js | 13 - node_modules/tailwindcss/lib/util/toPath.js | 32 - .../lib/util/transformThemeValue.js | 73 - .../tailwindcss/lib/util/validateConfig.js | 37 - .../lib/util/validateFormalSyntax.js | 26 - .../tailwindcss/lib/util/withAlphaVariable.js | 79 - .../tailwindcss/lib/value-parser/LICENSE | 22 - .../tailwindcss/lib/value-parser/README.md | 3 - .../tailwindcss/lib/value-parser/index.d.js | 2 - .../tailwindcss/lib/value-parser/index.js | 22 - .../tailwindcss/lib/value-parser/parse.js | 259 - .../tailwindcss/lib/value-parser/stringify.js | 38 - .../tailwindcss/lib/value-parser/unit.js | 86 - .../tailwindcss/lib/value-parser/walk.js | 16 - node_modules/tailwindcss/loadConfig.d.ts | 4 - node_modules/tailwindcss/loadConfig.js | 2 - node_modules/tailwindcss/nesting/index.d.ts | 4 - node_modules/tailwindcss/nesting/index.js | 2 - .../tailwindcss/node_modules/.bin/jiti | 16 - .../tailwindcss/node_modules/.bin/jiti.cmd | 17 - .../tailwindcss/node_modules/.bin/jiti.ps1 | 28 - .../tailwindcss/node_modules/jiti/LICENSE | 21 - .../tailwindcss/node_modules/jiti/README.md | 164 - .../tailwindcss/node_modules/jiti/bin/jiti.js | 16 - .../node_modules/jiti/dist/babel.d.ts | 2 - .../node_modules/jiti/dist/babel.js | 227 - .../node_modules/jiti/dist/jiti.d.ts | 20 - .../node_modules/jiti/dist/jiti.js | 1 - .../babel-plugin-transform-import-meta.d.ts | 4 - .../jiti/dist/plugins/import-meta-env.d.ts | 5 - .../node_modules/jiti/dist/types.d.ts | 35 - .../node_modules/jiti/dist/utils.d.ts | 8 - .../node_modules/jiti/lib/index.js | 15 - .../node_modules/jiti/package.json | 81 - .../tailwindcss/node_modules/jiti/register.js | 3 - node_modules/tailwindcss/package.json | 118 - node_modules/tailwindcss/peers/index.js | 97992 ---------------- node_modules/tailwindcss/plugin.d.ts | 11 - node_modules/tailwindcss/plugin.js | 2 - node_modules/tailwindcss/prettier.config.js | 19 - node_modules/tailwindcss/resolveConfig.d.ts | 31 - node_modules/tailwindcss/resolveConfig.js | 2 - node_modules/tailwindcss/screens.css | 1 - .../tailwindcss/scripts/create-plugin-list.js | 10 - .../tailwindcss/scripts/generate-types.js | 104 - .../tailwindcss/scripts/release-channel.js | 18 - .../tailwindcss/scripts/release-notes.js | 21 - .../tailwindcss/scripts/type-utils.js | 27 - .../tailwindcss/src/cli-peer-dependencies.js | 15 - node_modules/tailwindcss/src/cli.js | 3 - .../tailwindcss/src/cli/build/deps.js | 56 - .../tailwindcss/src/cli/build/index.js | 49 - .../tailwindcss/src/cli/build/plugin.js | 441 - .../tailwindcss/src/cli/build/utils.js | 76 - .../tailwindcss/src/cli/build/watching.js | 229 - .../tailwindcss/src/cli/help/index.js | 70 - node_modules/tailwindcss/src/cli/index.js | 216 - .../tailwindcss/src/cli/init/index.js | 79 - .../tailwindcss/src/corePluginList.js | 1 - node_modules/tailwindcss/src/corePlugins.js | 3007 - node_modules/tailwindcss/src/css/LICENSE | 25 - .../tailwindcss/src/css/preflight.css | 386 - node_modules/tailwindcss/src/featureFlags.js | 62 - node_modules/tailwindcss/src/index.js | 1 - .../tailwindcss/src/lib/cacheInvalidation.js | 52 - .../src/lib/collapseAdjacentRules.js | 58 - .../src/lib/collapseDuplicateDeclarations.js | 93 - node_modules/tailwindcss/src/lib/content.js | 295 - .../tailwindcss/src/lib/defaultExtractor.js | 255 - .../src/lib/evaluateTailwindFunctions.js | 272 - .../tailwindcss/src/lib/expandApplyAtRules.js | 637 - .../src/lib/expandTailwindAtRules.js | 282 - .../tailwindcss/src/lib/findAtConfigPath.js | 48 - .../tailwindcss/src/lib/generateRules.js | 951 - .../src/lib/getModuleDependencies.js | 79 - .../tailwindcss/src/lib/load-config.ts | 61 - .../src/lib/normalizeTailwindDirectives.js | 84 - node_modules/tailwindcss/src/lib/offsets.js | 432 - .../src/lib/partitionApplyAtRules.js | 52 - node_modules/tailwindcss/src/lib/regex.js | 74 - .../tailwindcss/src/lib/remap-bitfield.js | 82 - .../src/lib/resolveDefaultsAtRules.js | 165 - .../tailwindcss/src/lib/setupContextUtils.js | 1371 - .../src/lib/setupTrackingContext.js | 169 - .../tailwindcss/src/lib/sharedState.js | 57 - .../src/lib/substituteScreenAtRules.js | 19 - node_modules/tailwindcss/src/plugin.js | 47 - .../src/postcss-plugins/nesting/README.md | 42 - .../src/postcss-plugins/nesting/index.js | 13 - .../src/postcss-plugins/nesting/plugin.js | 80 - .../src/processTailwindFeatures.js | 56 - node_modules/tailwindcss/src/public/colors.js | 322 - .../tailwindcss/src/public/create-plugin.js | 2 - .../tailwindcss/src/public/default-config.js | 4 - .../tailwindcss/src/public/default-theme.js | 4 - .../tailwindcss/src/public/load-config.js | 2 - .../tailwindcss/src/public/resolve-config.js | 7 - .../src/util/applyImportantSelector.js | 26 - node_modules/tailwindcss/src/util/bigSign.js | 3 - .../tailwindcss/src/util/buildMediaQuery.js | 22 - .../tailwindcss/src/util/cloneDeep.js | 11 - .../tailwindcss/src/util/cloneNodes.js | 49 - node_modules/tailwindcss/src/util/color.js | 88 - .../tailwindcss/src/util/colorNames.js | 150 - .../tailwindcss/src/util/configurePlugins.js | 23 - .../tailwindcss/src/util/createPlugin.js | 27 - .../src/util/createUtilityPlugin.js | 37 - .../tailwindcss/src/util/dataTypes.js | 442 - node_modules/tailwindcss/src/util/defaults.js | 17 - .../tailwindcss/src/util/escapeClassName.js | 8 - .../tailwindcss/src/util/escapeCommas.js | 3 - .../src/util/flattenColorPalette.js | 13 - .../src/util/formatVariantSelector.js | 324 - .../tailwindcss/src/util/getAllConfigs.js | 38 - .../tailwindcss/src/util/hashConfig.js | 5 - .../tailwindcss/src/util/isKeyframeRule.js | 3 - .../tailwindcss/src/util/isPlainObject.js | 8 - .../util/isSyntacticallyValidPropertyValue.js | 61 - node_modules/tailwindcss/src/util/log.js | 29 - .../tailwindcss/src/util/nameClass.js | 30 - .../tailwindcss/src/util/negateValue.js | 24 - .../tailwindcss/src/util/normalizeConfig.js | 299 - .../tailwindcss/src/util/normalizeScreens.js | 140 - .../src/util/parseAnimationValue.js | 68 - .../src/util/parseBoxShadowValue.js | 72 - .../tailwindcss/src/util/parseDependency.js | 44 - .../tailwindcss/src/util/parseGlob.js | 23 - .../tailwindcss/src/util/parseObjectStyles.js | 19 - .../tailwindcss/src/util/pluginUtils.js | 307 - .../tailwindcss/src/util/prefixSelector.js | 33 - .../tailwindcss/src/util/pseudoElements.js | 171 - .../src/util/removeAlphaVariables.js | 26 - .../tailwindcss/src/util/resolveConfig.js | 277 - .../tailwindcss/src/util/resolveConfigPath.js | 68 - .../tailwindcss/src/util/responsive.js | 10 - .../src/util/splitAtTopLevelOnly.js | 48 - node_modules/tailwindcss/src/util/tap.js | 4 - .../tailwindcss/src/util/toColorValue.js | 3 - node_modules/tailwindcss/src/util/toPath.js | 26 - .../src/util/transformThemeValue.js | 62 - .../tailwindcss/src/util/validateConfig.js | 26 - .../src/util/validateFormalSyntax.js | 34 - .../tailwindcss/src/util/withAlphaVariable.js | 49 - .../tailwindcss/src/value-parser/LICENSE | 22 - .../tailwindcss/src/value-parser/README.md | 3 - .../tailwindcss/src/value-parser/index.d.ts | 177 - .../tailwindcss/src/value-parser/index.js | 28 - .../tailwindcss/src/value-parser/parse.js | 303 - .../tailwindcss/src/value-parser/stringify.js | 41 - .../tailwindcss/src/value-parser/unit.js | 118 - .../tailwindcss/src/value-parser/walk.js | 18 - node_modules/tailwindcss/stubs/.npmignore | 1 - .../tailwindcss/stubs/.prettierrc.json | 6 - node_modules/tailwindcss/stubs/config.full.js | 1062 - .../tailwindcss/stubs/config.simple.js | 7 - .../tailwindcss/stubs/postcss.config.cjs | 6 - .../tailwindcss/stubs/postcss.config.js | 6 - .../tailwindcss/stubs/tailwind.config.cjs | 2 - .../tailwindcss/stubs/tailwind.config.js | 2 - .../tailwindcss/stubs/tailwind.config.ts | 3 - node_modules/tailwindcss/tailwind.css | 5 - node_modules/tailwindcss/types/config.d.ts | 379 - .../tailwindcss/types/generated/.gitkeep | 0 .../tailwindcss/types/generated/colors.d.ts | 298 - .../types/generated/corePluginList.d.ts | 1 - .../types/generated/default-theme.d.ts | 397 - node_modules/tailwindcss/types/index.d.ts | 11 - node_modules/tailwindcss/utilities.css | 1 - node_modules/tailwindcss/variants.css | 1 - node_modules/thenify-all/History.md | 11 - node_modules/thenify-all/LICENSE | 22 - node_modules/thenify-all/README.md | 66 - node_modules/thenify-all/index.js | 73 - node_modules/thenify-all/package.json | 34 - node_modules/thenify/History.md | 11 - node_modules/thenify/LICENSE | 22 - node_modules/thenify/README.md | 120 - node_modules/thenify/index.js | 77 - node_modules/thenify/package.json | 31 - node_modules/to-regex-range/LICENSE | 21 - node_modules/to-regex-range/README.md | 305 - node_modules/to-regex-range/index.js | 288 - node_modules/to-regex-range/package.json | 88 - node_modules/ts-interface-checker/LICENSE | 201 - node_modules/ts-interface-checker/README.md | 185 - .../ts-interface-checker/dist/index.d.ts | 124 - .../ts-interface-checker/dist/index.js | 224 - .../ts-interface-checker/dist/types.d.ts | 181 - .../ts-interface-checker/dist/types.js | 566 - .../ts-interface-checker/dist/util.d.ts | 55 - .../ts-interface-checker/dist/util.js | 130 - .../ts-interface-checker/package.json | 60 - node_modules/util-deprecate/History.md | 16 - node_modules/util-deprecate/LICENSE | 24 - node_modules/util-deprecate/README.md | 53 - node_modules/util-deprecate/browser.js | 67 - node_modules/util-deprecate/node.js | 6 - node_modules/util-deprecate/package.json | 27 - node_modules/which-module/LICENSE | 13 - node_modules/which-module/README.md | 58 - node_modules/which-module/index.js | 9 - node_modules/which-module/package.json | 41 - node_modules/which/CHANGELOG.md | 166 - node_modules/which/LICENSE | 15 - node_modules/which/README.md | 54 - node_modules/which/bin/node-which | 52 - node_modules/which/package.json | 43 - node_modules/which/which.js | 125 - node_modules/wrap-ansi-cjs/index.js | 216 - node_modules/wrap-ansi-cjs/license | 9 - node_modules/wrap-ansi-cjs/package.json | 62 - node_modules/wrap-ansi-cjs/readme.md | 91 - node_modules/wrap-ansi/index.js | 186 - node_modules/wrap-ansi/license | 9 - node_modules/wrap-ansi/package.json | 61 - node_modules/wrap-ansi/readme.md | 97 - node_modules/y18n/CHANGELOG.md | 35 - node_modules/y18n/LICENSE | 13 - node_modules/y18n/README.md | 109 - node_modules/y18n/index.js | 188 - node_modules/y18n/package.json | 39 - node_modules/yaml/LICENSE | 13 - node_modules/yaml/README.md | 172 - node_modules/yaml/bin.mjs | 11 - .../dist/compose/compose-collection.js | 88 - .../yaml/browser/dist/compose/compose-doc.js | 43 - .../yaml/browser/dist/compose/compose-node.js | 102 - .../browser/dist/compose/compose-scalar.js | 86 - .../yaml/browser/dist/compose/composer.js | 217 - .../browser/dist/compose/resolve-block-map.js | 115 - .../dist/compose/resolve-block-scalar.js | 198 - .../browser/dist/compose/resolve-block-seq.js | 49 - .../yaml/browser/dist/compose/resolve-end.js | 37 - .../dist/compose/resolve-flow-collection.js | 207 - .../dist/compose/resolve-flow-scalar.js | 223 - .../browser/dist/compose/resolve-props.js | 146 - .../dist/compose/util-contains-newline.js | 34 - .../compose/util-empty-scalar-position.js | 26 - .../dist/compose/util-flow-indent-check.js | 15 - .../browser/dist/compose/util-map-includes.js | 13 - .../yaml/browser/dist/doc/Document.js | 335 - node_modules/yaml/browser/dist/doc/anchors.js | 71 - .../yaml/browser/dist/doc/applyReviver.js | 55 - .../yaml/browser/dist/doc/createNode.js | 88 - .../yaml/browser/dist/doc/directives.js | 176 - node_modules/yaml/browser/dist/errors.js | 57 - node_modules/yaml/browser/dist/index.js | 17 - node_modules/yaml/browser/dist/log.js | 11 - node_modules/yaml/browser/dist/nodes/Alias.js | 114 - .../yaml/browser/dist/nodes/Collection.js | 147 - node_modules/yaml/browser/dist/nodes/Node.js | 38 - node_modules/yaml/browser/dist/nodes/Pair.js | 36 - .../yaml/browser/dist/nodes/Scalar.js | 24 - .../yaml/browser/dist/nodes/YAMLMap.js | 144 - .../yaml/browser/dist/nodes/YAMLSeq.js | 113 - .../yaml/browser/dist/nodes/addPairToJSMap.js | 63 - .../yaml/browser/dist/nodes/identity.js | 36 - node_modules/yaml/browser/dist/nodes/toJS.js | 37 - .../yaml/browser/dist/parse/cst-scalar.js | 214 - .../yaml/browser/dist/parse/cst-stringify.js | 61 - .../yaml/browser/dist/parse/cst-visit.js | 97 - node_modules/yaml/browser/dist/parse/cst.js | 98 - node_modules/yaml/browser/dist/parse/lexer.js | 717 - .../yaml/browser/dist/parse/line-counter.js | 39 - .../yaml/browser/dist/parse/parser.js | 967 - node_modules/yaml/browser/dist/public-api.js | 102 - .../yaml/browser/dist/schema/Schema.js | 37 - .../yaml/browser/dist/schema/common/map.js | 17 - .../yaml/browser/dist/schema/common/null.js | 15 - .../yaml/browser/dist/schema/common/seq.js | 17 - .../yaml/browser/dist/schema/common/string.js | 14 - .../yaml/browser/dist/schema/core/bool.js | 19 - .../yaml/browser/dist/schema/core/float.js | 43 - .../yaml/browser/dist/schema/core/int.js | 38 - .../yaml/browser/dist/schema/core/schema.js | 23 - .../yaml/browser/dist/schema/json/schema.js | 62 - node_modules/yaml/browser/dist/schema/tags.js | 96 - .../browser/dist/schema/yaml-1.1/binary.js | 58 - .../yaml/browser/dist/schema/yaml-1.1/bool.js | 26 - .../browser/dist/schema/yaml-1.1/float.js | 46 - .../yaml/browser/dist/schema/yaml-1.1/int.js | 71 - .../browser/dist/schema/yaml-1.1/merge.js | 64 - .../yaml/browser/dist/schema/yaml-1.1/omap.js | 74 - .../browser/dist/schema/yaml-1.1/pairs.js | 78 - .../browser/dist/schema/yaml-1.1/schema.js | 39 - .../yaml/browser/dist/schema/yaml-1.1/set.js | 93 - .../browser/dist/schema/yaml-1.1/timestamp.js | 101 - .../browser/dist/stringify/foldFlowLines.js | 146 - .../yaml/browser/dist/stringify/stringify.js | 128 - .../dist/stringify/stringifyCollection.js | 143 - .../dist/stringify/stringifyComment.js | 20 - .../dist/stringify/stringifyDocument.js | 85 - .../browser/dist/stringify/stringifyNumber.js | 24 - .../browser/dist/stringify/stringifyPair.js | 150 - .../browser/dist/stringify/stringifyString.js | 336 - node_modules/yaml/browser/dist/util.js | 11 - node_modules/yaml/browser/dist/visit.js | 233 - node_modules/yaml/browser/index.js | 5 - node_modules/yaml/browser/package.json | 3 - node_modules/yaml/dist/cli.d.ts | 8 - node_modules/yaml/dist/cli.mjs | 201 - .../yaml/dist/compose/compose-collection.d.ts | 11 - .../yaml/dist/compose/compose-collection.js | 90 - .../yaml/dist/compose/compose-doc.d.ts | 7 - node_modules/yaml/dist/compose/compose-doc.js | 45 - .../yaml/dist/compose/compose-node.d.ts | 29 - .../yaml/dist/compose/compose-node.js | 105 - .../yaml/dist/compose/compose-scalar.d.ts | 5 - .../yaml/dist/compose/compose-scalar.js | 88 - node_modules/yaml/dist/compose/composer.d.ts | 63 - node_modules/yaml/dist/compose/composer.js | 222 - .../yaml/dist/compose/resolve-block-map.d.ts | 6 - .../yaml/dist/compose/resolve-block-map.js | 117 - .../dist/compose/resolve-block-scalar.d.ts | 11 - .../yaml/dist/compose/resolve-block-scalar.js | 200 - .../yaml/dist/compose/resolve-block-seq.d.ts | 6 - .../yaml/dist/compose/resolve-block-seq.js | 51 - .../yaml/dist/compose/resolve-end.d.ts | 6 - node_modules/yaml/dist/compose/resolve-end.js | 39 - .../dist/compose/resolve-flow-collection.d.ts | 7 - .../dist/compose/resolve-flow-collection.js | 209 - .../dist/compose/resolve-flow-scalar.d.ts | 10 - .../yaml/dist/compose/resolve-flow-scalar.js | 225 - .../yaml/dist/compose/resolve-props.d.ts | 23 - .../yaml/dist/compose/resolve-props.js | 148 - .../dist/compose/util-contains-newline.d.ts | 2 - .../dist/compose/util-contains-newline.js | 36 - .../compose/util-empty-scalar-position.d.ts | 2 - .../compose/util-empty-scalar-position.js | 28 - .../dist/compose/util-flow-indent-check.d.ts | 3 - .../dist/compose/util-flow-indent-check.js | 17 - .../yaml/dist/compose/util-map-includes.d.ts | 4 - .../yaml/dist/compose/util-map-includes.js | 15 - node_modules/yaml/dist/doc/Document.d.ts | 141 - node_modules/yaml/dist/doc/Document.js | 337 - node_modules/yaml/dist/doc/anchors.d.ts | 24 - node_modules/yaml/dist/doc/anchors.js | 76 - node_modules/yaml/dist/doc/applyReviver.d.ts | 9 - node_modules/yaml/dist/doc/applyReviver.js | 57 - node_modules/yaml/dist/doc/createNode.d.ts | 17 - node_modules/yaml/dist/doc/createNode.js | 90 - node_modules/yaml/dist/doc/directives.d.ts | 49 - node_modules/yaml/dist/doc/directives.js | 178 - node_modules/yaml/dist/errors.d.ts | 21 - node_modules/yaml/dist/errors.js | 62 - node_modules/yaml/dist/index.d.ts | 25 - node_modules/yaml/dist/index.js | 50 - node_modules/yaml/dist/log.d.ts | 3 - node_modules/yaml/dist/log.js | 19 - node_modules/yaml/dist/nodes/Alias.d.ts | 29 - node_modules/yaml/dist/nodes/Alias.js | 116 - node_modules/yaml/dist/nodes/Collection.d.ts | 73 - node_modules/yaml/dist/nodes/Collection.js | 151 - node_modules/yaml/dist/nodes/Node.d.ts | 53 - node_modules/yaml/dist/nodes/Node.js | 40 - node_modules/yaml/dist/nodes/Pair.d.ts | 22 - node_modules/yaml/dist/nodes/Pair.js | 39 - node_modules/yaml/dist/nodes/Scalar.d.ts | 43 - node_modules/yaml/dist/nodes/Scalar.js | 27 - node_modules/yaml/dist/nodes/YAMLMap.d.ts | 53 - node_modules/yaml/dist/nodes/YAMLMap.js | 147 - node_modules/yaml/dist/nodes/YAMLSeq.d.ts | 60 - node_modules/yaml/dist/nodes/YAMLSeq.js | 115 - .../yaml/dist/nodes/addPairToJSMap.d.ts | 4 - .../yaml/dist/nodes/addPairToJSMap.js | 65 - node_modules/yaml/dist/nodes/identity.d.ts | 23 - node_modules/yaml/dist/nodes/identity.js | 53 - node_modules/yaml/dist/nodes/toJS.d.ts | 29 - node_modules/yaml/dist/nodes/toJS.js | 39 - node_modules/yaml/dist/options.d.ts | 344 - node_modules/yaml/dist/parse/cst-scalar.d.ts | 64 - node_modules/yaml/dist/parse/cst-scalar.js | 218 - .../yaml/dist/parse/cst-stringify.d.ts | 8 - node_modules/yaml/dist/parse/cst-stringify.js | 63 - node_modules/yaml/dist/parse/cst-visit.d.ts | 39 - node_modules/yaml/dist/parse/cst-visit.js | 99 - node_modules/yaml/dist/parse/cst.d.ts | 109 - node_modules/yaml/dist/parse/cst.js | 112 - node_modules/yaml/dist/parse/lexer.d.ts | 87 - node_modules/yaml/dist/parse/lexer.js | 719 - .../yaml/dist/parse/line-counter.d.ts | 22 - node_modules/yaml/dist/parse/line-counter.js | 41 - node_modules/yaml/dist/parse/parser.d.ts | 84 - node_modules/yaml/dist/parse/parser.js | 972 - node_modules/yaml/dist/public-api.d.ts | 44 - node_modules/yaml/dist/public-api.js | 107 - node_modules/yaml/dist/schema/Schema.d.ts | 17 - node_modules/yaml/dist/schema/Schema.js | 39 - node_modules/yaml/dist/schema/common/map.d.ts | 2 - node_modules/yaml/dist/schema/common/map.js | 19 - .../yaml/dist/schema/common/null.d.ts | 4 - node_modules/yaml/dist/schema/common/null.js | 17 - node_modules/yaml/dist/schema/common/seq.d.ts | 2 - node_modules/yaml/dist/schema/common/seq.js | 19 - .../yaml/dist/schema/common/string.d.ts | 2 - .../yaml/dist/schema/common/string.js | 16 - node_modules/yaml/dist/schema/core/bool.d.ts | 4 - node_modules/yaml/dist/schema/core/bool.js | 21 - node_modules/yaml/dist/schema/core/float.d.ts | 4 - node_modules/yaml/dist/schema/core/float.js | 47 - node_modules/yaml/dist/schema/core/int.d.ts | 4 - node_modules/yaml/dist/schema/core/int.js | 42 - .../yaml/dist/schema/core/schema.d.ts | 1 - node_modules/yaml/dist/schema/core/schema.js | 25 - .../yaml/dist/schema/json-schema.d.ts | 69 - .../yaml/dist/schema/json/schema.d.ts | 2 - node_modules/yaml/dist/schema/json/schema.js | 64 - node_modules/yaml/dist/schema/tags.d.ts | 48 - node_modules/yaml/dist/schema/tags.js | 99 - node_modules/yaml/dist/schema/types.d.ts | 92 - .../yaml/dist/schema/yaml-1.1/binary.d.ts | 2 - .../yaml/dist/schema/yaml-1.1/binary.js | 70 - .../yaml/dist/schema/yaml-1.1/bool.d.ts | 7 - .../yaml/dist/schema/yaml-1.1/bool.js | 29 - .../yaml/dist/schema/yaml-1.1/float.d.ts | 4 - .../yaml/dist/schema/yaml-1.1/float.js | 50 - .../yaml/dist/schema/yaml-1.1/int.d.ts | 5 - node_modules/yaml/dist/schema/yaml-1.1/int.js | 76 - .../yaml/dist/schema/yaml-1.1/merge.d.ts | 9 - .../yaml/dist/schema/yaml-1.1/merge.js | 68 - .../yaml/dist/schema/yaml-1.1/omap.d.ts | 22 - .../yaml/dist/schema/yaml-1.1/omap.js | 77 - .../yaml/dist/schema/yaml-1.1/pairs.d.ts | 10 - .../yaml/dist/schema/yaml-1.1/pairs.js | 82 - .../yaml/dist/schema/yaml-1.1/schema.d.ts | 1 - .../yaml/dist/schema/yaml-1.1/schema.js | 41 - .../yaml/dist/schema/yaml-1.1/set.d.ts | 28 - node_modules/yaml/dist/schema/yaml-1.1/set.js | 96 - .../yaml/dist/schema/yaml-1.1/timestamp.d.ts | 6 - .../yaml/dist/schema/yaml-1.1/timestamp.js | 105 - .../yaml/dist/stringify/foldFlowLines.d.ts | 34 - .../yaml/dist/stringify/foldFlowLines.js | 151 - .../yaml/dist/stringify/stringify.d.ts | 21 - node_modules/yaml/dist/stringify/stringify.js | 131 - .../dist/stringify/stringifyCollection.d.ts | 17 - .../dist/stringify/stringifyCollection.js | 145 - .../yaml/dist/stringify/stringifyComment.d.ts | 10 - .../yaml/dist/stringify/stringifyComment.js | 24 - .../dist/stringify/stringifyDocument.d.ts | 4 - .../yaml/dist/stringify/stringifyDocument.js | 87 - .../yaml/dist/stringify/stringifyNumber.d.ts | 2 - .../yaml/dist/stringify/stringifyNumber.js | 26 - .../yaml/dist/stringify/stringifyPair.d.ts | 3 - .../yaml/dist/stringify/stringifyPair.js | 152 - .../yaml/dist/stringify/stringifyString.d.ts | 9 - .../yaml/dist/stringify/stringifyString.js | 338 - node_modules/yaml/dist/test-events.d.ts | 4 - node_modules/yaml/dist/test-events.js | 134 - node_modules/yaml/dist/util.d.ts | 16 - node_modules/yaml/dist/util.js | 28 - node_modules/yaml/dist/visit.d.ts | 102 - node_modules/yaml/dist/visit.js | 236 - node_modules/yaml/package.json | 97 - node_modules/yaml/util.js | 2 - node_modules/yargs-parser/CHANGELOG.md | 601 - node_modules/yargs-parser/LICENSE.txt | 14 - node_modules/yargs-parser/README.md | 449 - node_modules/yargs-parser/index.js | 1032 - .../yargs-parser/lib/tokenize-arg-string.js | 40 - node_modules/yargs-parser/package.json | 46 - node_modules/yargs/CHANGELOG.md | 420 - node_modules/yargs/LICENSE | 21 - node_modules/yargs/README.md | 140 - .../yargs/build/lib/apply-extends.d.ts | 2 - node_modules/yargs/build/lib/apply-extends.js | 65 - node_modules/yargs/build/lib/argsert.d.ts | 2 - node_modules/yargs/build/lib/argsert.js | 65 - node_modules/yargs/build/lib/command.d.ts | 64 - node_modules/yargs/build/lib/command.js | 416 - .../yargs/build/lib/common-types.d.ts | 36 - node_modules/yargs/build/lib/common-types.js | 25 - .../yargs/build/lib/completion-templates.d.ts | 2 - .../yargs/build/lib/completion-templates.js | 50 - node_modules/yargs/build/lib/completion.d.ts | 21 - node_modules/yargs/build/lib/completion.js | 135 - node_modules/yargs/build/lib/is-promise.d.ts | 1 - node_modules/yargs/build/lib/is-promise.js | 9 - node_modules/yargs/build/lib/levenshtein.d.ts | 1 - node_modules/yargs/build/lib/levenshtein.js | 58 - node_modules/yargs/build/lib/middleware.d.ts | 10 - node_modules/yargs/build/lib/middleware.js | 57 - node_modules/yargs/build/lib/obj-filter.d.ts | 1 - node_modules/yargs/build/lib/obj-filter.js | 14 - .../yargs/build/lib/parse-command.d.ts | 11 - node_modules/yargs/build/lib/parse-command.js | 36 - .../yargs/build/lib/process-argv.d.ts | 2 - node_modules/yargs/build/lib/process-argv.js | 31 - node_modules/yargs/build/lib/usage.d.ts | 49 - node_modules/yargs/build/lib/usage.js | 540 - node_modules/yargs/build/lib/validation.d.ts | 34 - node_modules/yargs/build/lib/validation.js | 330 - node_modules/yargs/build/lib/yargs.d.ts | 274 - node_modules/yargs/build/lib/yargs.js | 1190 - node_modules/yargs/build/lib/yerror.d.ts | 4 - node_modules/yargs/build/lib/yerror.js | 11 - node_modules/yargs/index.js | 40 - node_modules/yargs/locales/be.json | 46 - node_modules/yargs/locales/de.json | 46 - node_modules/yargs/locales/en.json | 51 - node_modules/yargs/locales/es.json | 46 - node_modules/yargs/locales/fi.json | 49 - node_modules/yargs/locales/fr.json | 53 - node_modules/yargs/locales/hi.json | 49 - node_modules/yargs/locales/hu.json | 46 - node_modules/yargs/locales/id.json | 50 - node_modules/yargs/locales/it.json | 46 - node_modules/yargs/locales/ja.json | 51 - node_modules/yargs/locales/ko.json | 49 - node_modules/yargs/locales/nb.json | 44 - node_modules/yargs/locales/nl.json | 49 - node_modules/yargs/locales/nn.json | 44 - node_modules/yargs/locales/pirate.json | 13 - node_modules/yargs/locales/pl.json | 49 - node_modules/yargs/locales/pt.json | 45 - node_modules/yargs/locales/pt_BR.json | 48 - node_modules/yargs/locales/ru.json | 46 - node_modules/yargs/locales/th.json | 46 - node_modules/yargs/locales/tr.json | 48 - node_modules/yargs/locales/zh_CN.json | 48 - node_modules/yargs/locales/zh_TW.json | 47 - node_modules/yargs/package.json | 92 - node_modules/yargs/yargs.js | 14 - 2634 files changed, 6 insertions(+), 445524 deletions(-) create mode 100644 .gitignore delete mode 100644 node_modules/.bin/cssesc delete mode 100644 node_modules/.bin/cssesc.cmd delete mode 100644 node_modules/.bin/cssesc.ps1 delete mode 100644 node_modules/.bin/esbuild delete mode 100644 node_modules/.bin/esbuild.cmd delete mode 100644 node_modules/.bin/esbuild.ps1 delete mode 100644 node_modules/.bin/glob delete mode 100644 node_modules/.bin/glob.cmd delete mode 100644 node_modules/.bin/glob.ps1 delete mode 100644 node_modules/.bin/nanoid delete mode 100644 node_modules/.bin/nanoid.cmd delete mode 100644 node_modules/.bin/nanoid.ps1 delete mode 100644 node_modules/.bin/node-which delete mode 100644 node_modules/.bin/node-which.cmd delete mode 100644 node_modules/.bin/node-which.ps1 delete mode 100644 node_modules/.bin/qrcode delete mode 100644 node_modules/.bin/qrcode.cmd delete mode 100644 node_modules/.bin/qrcode.ps1 delete mode 100644 node_modules/.bin/resolve delete mode 100644 node_modules/.bin/resolve.cmd delete mode 100644 node_modules/.bin/resolve.ps1 delete mode 100644 node_modules/.bin/sucrase delete mode 100644 node_modules/.bin/sucrase-node delete mode 100644 node_modules/.bin/sucrase-node.cmd delete mode 100644 node_modules/.bin/sucrase-node.ps1 delete mode 100644 node_modules/.bin/sucrase.cmd delete mode 100644 node_modules/.bin/sucrase.ps1 delete mode 100644 node_modules/.bin/tailwind delete mode 100644 node_modules/.bin/tailwind.cmd delete mode 100644 node_modules/.bin/tailwind.ps1 delete mode 100644 node_modules/.bin/tailwindcss delete mode 100644 node_modules/.bin/tailwindcss.cmd delete mode 100644 node_modules/.bin/tailwindcss.ps1 delete mode 100644 node_modules/.bin/yaml delete mode 100644 node_modules/.bin/yaml.cmd delete mode 100644 node_modules/.bin/yaml.ps1 delete mode 100644 node_modules/.package-lock.json delete mode 100644 node_modules/@alloc/quick-lru/index.d.ts delete mode 100644 node_modules/@alloc/quick-lru/index.js delete mode 100644 node_modules/@alloc/quick-lru/license delete mode 100644 node_modules/@alloc/quick-lru/package.json delete mode 100644 node_modules/@alloc/quick-lru/readme.md delete mode 100644 node_modules/@esbuild/win32-x64/README.md delete mode 100644 node_modules/@esbuild/win32-x64/esbuild.exe delete mode 100644 node_modules/@esbuild/win32-x64/package.json delete mode 100644 node_modules/@isaacs/cliui/LICENSE.txt delete mode 100644 node_modules/@isaacs/cliui/README.md delete mode 100644 node_modules/@isaacs/cliui/build/index.cjs delete mode 100644 node_modules/@isaacs/cliui/build/index.d.cts delete mode 100644 node_modules/@isaacs/cliui/build/lib/index.js delete mode 100644 node_modules/@isaacs/cliui/index.mjs delete mode 100644 node_modules/@isaacs/cliui/node_modules/ansi-regex/index.d.ts delete mode 100644 node_modules/@isaacs/cliui/node_modules/ansi-regex/index.js delete mode 100644 node_modules/@isaacs/cliui/node_modules/ansi-regex/license delete mode 100644 node_modules/@isaacs/cliui/node_modules/ansi-regex/package.json delete mode 100644 node_modules/@isaacs/cliui/node_modules/ansi-regex/readme.md delete mode 100644 node_modules/@isaacs/cliui/node_modules/ansi-styles/index.d.ts delete mode 100644 node_modules/@isaacs/cliui/node_modules/ansi-styles/index.js delete mode 100644 node_modules/@isaacs/cliui/node_modules/ansi-styles/license delete mode 100644 node_modules/@isaacs/cliui/node_modules/ansi-styles/package.json delete mode 100644 node_modules/@isaacs/cliui/node_modules/ansi-styles/readme.md delete mode 100644 node_modules/@isaacs/cliui/node_modules/emoji-regex/LICENSE-MIT.txt delete mode 100644 node_modules/@isaacs/cliui/node_modules/emoji-regex/README.md delete mode 100644 node_modules/@isaacs/cliui/node_modules/emoji-regex/RGI_Emoji.d.ts delete mode 100644 node_modules/@isaacs/cliui/node_modules/emoji-regex/RGI_Emoji.js delete mode 100644 node_modules/@isaacs/cliui/node_modules/emoji-regex/es2015/RGI_Emoji.d.ts delete mode 100644 node_modules/@isaacs/cliui/node_modules/emoji-regex/es2015/RGI_Emoji.js delete mode 100644 node_modules/@isaacs/cliui/node_modules/emoji-regex/es2015/index.d.ts delete mode 100644 node_modules/@isaacs/cliui/node_modules/emoji-regex/es2015/index.js delete mode 100644 node_modules/@isaacs/cliui/node_modules/emoji-regex/es2015/text.d.ts delete mode 100644 node_modules/@isaacs/cliui/node_modules/emoji-regex/es2015/text.js delete mode 100644 node_modules/@isaacs/cliui/node_modules/emoji-regex/index.d.ts delete mode 100644 node_modules/@isaacs/cliui/node_modules/emoji-regex/index.js delete mode 100644 node_modules/@isaacs/cliui/node_modules/emoji-regex/package.json delete mode 100644 node_modules/@isaacs/cliui/node_modules/emoji-regex/text.d.ts delete mode 100644 node_modules/@isaacs/cliui/node_modules/emoji-regex/text.js delete mode 100644 node_modules/@isaacs/cliui/node_modules/string-width/index.d.ts delete mode 100644 node_modules/@isaacs/cliui/node_modules/string-width/index.js delete mode 100644 node_modules/@isaacs/cliui/node_modules/string-width/license delete mode 100644 node_modules/@isaacs/cliui/node_modules/string-width/package.json delete mode 100644 node_modules/@isaacs/cliui/node_modules/string-width/readme.md delete mode 100644 node_modules/@isaacs/cliui/node_modules/strip-ansi/index.d.ts delete mode 100644 node_modules/@isaacs/cliui/node_modules/strip-ansi/index.js delete mode 100644 node_modules/@isaacs/cliui/node_modules/strip-ansi/license delete mode 100644 node_modules/@isaacs/cliui/node_modules/strip-ansi/package.json delete mode 100644 node_modules/@isaacs/cliui/node_modules/strip-ansi/readme.md delete mode 100644 node_modules/@isaacs/cliui/node_modules/wrap-ansi/index.d.ts delete mode 100644 node_modules/@isaacs/cliui/node_modules/wrap-ansi/index.js delete mode 100644 node_modules/@isaacs/cliui/node_modules/wrap-ansi/license delete mode 100644 node_modules/@isaacs/cliui/node_modules/wrap-ansi/package.json delete mode 100644 node_modules/@isaacs/cliui/node_modules/wrap-ansi/readme.md delete mode 100644 node_modules/@isaacs/cliui/package.json delete mode 100644 node_modules/@jridgewell/gen-mapping/LICENSE delete mode 100644 node_modules/@jridgewell/gen-mapping/README.md delete mode 100644 node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs delete mode 100644 node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs.map delete mode 100644 node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js delete mode 100644 node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js.map delete mode 100644 node_modules/@jridgewell/gen-mapping/dist/types/gen-mapping.d.ts delete mode 100644 node_modules/@jridgewell/gen-mapping/dist/types/set-array.d.ts delete mode 100644 node_modules/@jridgewell/gen-mapping/dist/types/sourcemap-segment.d.ts delete mode 100644 node_modules/@jridgewell/gen-mapping/dist/types/types.d.ts delete mode 100644 node_modules/@jridgewell/gen-mapping/package.json delete mode 100644 node_modules/@jridgewell/gen-mapping/src/gen-mapping.ts delete mode 100644 node_modules/@jridgewell/gen-mapping/src/set-array.ts delete mode 100644 node_modules/@jridgewell/gen-mapping/src/sourcemap-segment.ts delete mode 100644 node_modules/@jridgewell/gen-mapping/src/types.ts delete mode 100644 node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.cts delete mode 100644 node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.cts.map delete mode 100644 node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.mts delete mode 100644 node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.mts.map delete mode 100644 node_modules/@jridgewell/gen-mapping/types/set-array.d.cts delete mode 100644 node_modules/@jridgewell/gen-mapping/types/set-array.d.cts.map delete mode 100644 node_modules/@jridgewell/gen-mapping/types/set-array.d.mts delete mode 100644 node_modules/@jridgewell/gen-mapping/types/set-array.d.mts.map delete mode 100644 node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.cts delete mode 100644 node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.cts.map delete mode 100644 node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.mts delete mode 100644 node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.mts.map delete mode 100644 node_modules/@jridgewell/gen-mapping/types/types.d.cts delete mode 100644 node_modules/@jridgewell/gen-mapping/types/types.d.cts.map delete mode 100644 node_modules/@jridgewell/gen-mapping/types/types.d.mts delete mode 100644 node_modules/@jridgewell/gen-mapping/types/types.d.mts.map delete mode 100644 node_modules/@jridgewell/resolve-uri/LICENSE delete mode 100644 node_modules/@jridgewell/resolve-uri/README.md delete mode 100644 node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs delete mode 100644 node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs.map delete mode 100644 node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js delete mode 100644 node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js.map delete mode 100644 node_modules/@jridgewell/resolve-uri/dist/types/resolve-uri.d.ts delete mode 100644 node_modules/@jridgewell/resolve-uri/package.json delete mode 100644 node_modules/@jridgewell/sourcemap-codec/LICENSE delete mode 100644 node_modules/@jridgewell/sourcemap-codec/README.md delete mode 100644 node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs delete mode 100644 node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs.map delete mode 100644 node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js delete mode 100644 node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js.map delete mode 100644 node_modules/@jridgewell/sourcemap-codec/package.json delete mode 100644 node_modules/@jridgewell/sourcemap-codec/src/scopes.ts delete mode 100644 node_modules/@jridgewell/sourcemap-codec/src/sourcemap-codec.ts delete mode 100644 node_modules/@jridgewell/sourcemap-codec/src/strings.ts delete mode 100644 node_modules/@jridgewell/sourcemap-codec/src/vlq.ts delete mode 100644 node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts delete mode 100644 node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts.map delete mode 100644 node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts delete mode 100644 node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts.map delete mode 100644 node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts delete mode 100644 node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts.map delete mode 100644 node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts delete mode 100644 node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts.map delete mode 100644 node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts delete mode 100644 node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts.map delete mode 100644 node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts delete mode 100644 node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts.map delete mode 100644 node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts delete mode 100644 node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts.map delete mode 100644 node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts delete mode 100644 node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts.map delete mode 100644 node_modules/@jridgewell/trace-mapping/LICENSE delete mode 100644 node_modules/@jridgewell/trace-mapping/README.md delete mode 100644 node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs delete mode 100644 node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs.map delete mode 100644 node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js delete mode 100644 node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js.map delete mode 100644 node_modules/@jridgewell/trace-mapping/package.json delete mode 100644 node_modules/@jridgewell/trace-mapping/src/binary-search.ts delete mode 100644 node_modules/@jridgewell/trace-mapping/src/by-source.ts delete mode 100644 node_modules/@jridgewell/trace-mapping/src/flatten-map.ts delete mode 100644 node_modules/@jridgewell/trace-mapping/src/resolve.ts delete mode 100644 node_modules/@jridgewell/trace-mapping/src/sort.ts delete mode 100644 node_modules/@jridgewell/trace-mapping/src/sourcemap-segment.ts delete mode 100644 node_modules/@jridgewell/trace-mapping/src/strip-filename.ts delete mode 100644 node_modules/@jridgewell/trace-mapping/src/trace-mapping.ts delete mode 100644 node_modules/@jridgewell/trace-mapping/src/types.ts delete mode 100644 node_modules/@jridgewell/trace-mapping/types/binary-search.d.cts delete mode 100644 node_modules/@jridgewell/trace-mapping/types/binary-search.d.cts.map delete mode 100644 node_modules/@jridgewell/trace-mapping/types/binary-search.d.mts delete mode 100644 node_modules/@jridgewell/trace-mapping/types/binary-search.d.mts.map delete mode 100644 node_modules/@jridgewell/trace-mapping/types/by-source.d.cts delete mode 100644 node_modules/@jridgewell/trace-mapping/types/by-source.d.cts.map delete mode 100644 node_modules/@jridgewell/trace-mapping/types/by-source.d.mts delete mode 100644 node_modules/@jridgewell/trace-mapping/types/by-source.d.mts.map delete mode 100644 node_modules/@jridgewell/trace-mapping/types/flatten-map.d.cts delete mode 100644 node_modules/@jridgewell/trace-mapping/types/flatten-map.d.cts.map delete mode 100644 node_modules/@jridgewell/trace-mapping/types/flatten-map.d.mts delete mode 100644 node_modules/@jridgewell/trace-mapping/types/flatten-map.d.mts.map delete mode 100644 node_modules/@jridgewell/trace-mapping/types/resolve.d.cts delete mode 100644 node_modules/@jridgewell/trace-mapping/types/resolve.d.cts.map delete mode 100644 node_modules/@jridgewell/trace-mapping/types/resolve.d.mts delete mode 100644 node_modules/@jridgewell/trace-mapping/types/resolve.d.mts.map delete mode 100644 node_modules/@jridgewell/trace-mapping/types/sort.d.cts delete mode 100644 node_modules/@jridgewell/trace-mapping/types/sort.d.cts.map delete mode 100644 node_modules/@jridgewell/trace-mapping/types/sort.d.mts delete mode 100644 node_modules/@jridgewell/trace-mapping/types/sort.d.mts.map delete mode 100644 node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.cts delete mode 100644 node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.cts.map delete mode 100644 node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.mts delete mode 100644 node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.mts.map delete mode 100644 node_modules/@jridgewell/trace-mapping/types/strip-filename.d.cts delete mode 100644 node_modules/@jridgewell/trace-mapping/types/strip-filename.d.cts.map delete mode 100644 node_modules/@jridgewell/trace-mapping/types/strip-filename.d.mts delete mode 100644 node_modules/@jridgewell/trace-mapping/types/strip-filename.d.mts.map delete mode 100644 node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.cts delete mode 100644 node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.cts.map delete mode 100644 node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.mts delete mode 100644 node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.mts.map delete mode 100644 node_modules/@jridgewell/trace-mapping/types/types.d.cts delete mode 100644 node_modules/@jridgewell/trace-mapping/types/types.d.cts.map delete mode 100644 node_modules/@jridgewell/trace-mapping/types/types.d.mts delete mode 100644 node_modules/@jridgewell/trace-mapping/types/types.d.mts.map delete mode 100644 node_modules/@nodelib/fs.scandir/LICENSE delete mode 100644 node_modules/@nodelib/fs.scandir/README.md delete mode 100644 node_modules/@nodelib/fs.scandir/out/adapters/fs.d.ts delete mode 100644 node_modules/@nodelib/fs.scandir/out/adapters/fs.js delete mode 100644 node_modules/@nodelib/fs.scandir/out/constants.d.ts delete mode 100644 node_modules/@nodelib/fs.scandir/out/constants.js delete mode 100644 node_modules/@nodelib/fs.scandir/out/index.d.ts delete mode 100644 node_modules/@nodelib/fs.scandir/out/index.js delete mode 100644 node_modules/@nodelib/fs.scandir/out/providers/async.d.ts delete mode 100644 node_modules/@nodelib/fs.scandir/out/providers/async.js delete mode 100644 node_modules/@nodelib/fs.scandir/out/providers/common.d.ts delete mode 100644 node_modules/@nodelib/fs.scandir/out/providers/common.js delete mode 100644 node_modules/@nodelib/fs.scandir/out/providers/sync.d.ts delete mode 100644 node_modules/@nodelib/fs.scandir/out/providers/sync.js delete mode 100644 node_modules/@nodelib/fs.scandir/out/settings.d.ts delete mode 100644 node_modules/@nodelib/fs.scandir/out/settings.js delete mode 100644 node_modules/@nodelib/fs.scandir/out/types/index.d.ts delete mode 100644 node_modules/@nodelib/fs.scandir/out/types/index.js delete mode 100644 node_modules/@nodelib/fs.scandir/out/utils/fs.d.ts delete mode 100644 node_modules/@nodelib/fs.scandir/out/utils/fs.js delete mode 100644 node_modules/@nodelib/fs.scandir/out/utils/index.d.ts delete mode 100644 node_modules/@nodelib/fs.scandir/out/utils/index.js delete mode 100644 node_modules/@nodelib/fs.scandir/package.json delete mode 100644 node_modules/@nodelib/fs.stat/LICENSE delete mode 100644 node_modules/@nodelib/fs.stat/README.md delete mode 100644 node_modules/@nodelib/fs.stat/out/adapters/fs.d.ts delete mode 100644 node_modules/@nodelib/fs.stat/out/adapters/fs.js delete mode 100644 node_modules/@nodelib/fs.stat/out/index.d.ts delete mode 100644 node_modules/@nodelib/fs.stat/out/index.js delete mode 100644 node_modules/@nodelib/fs.stat/out/providers/async.d.ts delete mode 100644 node_modules/@nodelib/fs.stat/out/providers/async.js delete mode 100644 node_modules/@nodelib/fs.stat/out/providers/sync.d.ts delete mode 100644 node_modules/@nodelib/fs.stat/out/providers/sync.js delete mode 100644 node_modules/@nodelib/fs.stat/out/settings.d.ts delete mode 100644 node_modules/@nodelib/fs.stat/out/settings.js delete mode 100644 node_modules/@nodelib/fs.stat/out/types/index.d.ts delete mode 100644 node_modules/@nodelib/fs.stat/out/types/index.js delete mode 100644 node_modules/@nodelib/fs.stat/package.json delete mode 100644 node_modules/@nodelib/fs.walk/LICENSE delete mode 100644 node_modules/@nodelib/fs.walk/README.md delete mode 100644 node_modules/@nodelib/fs.walk/out/index.d.ts delete mode 100644 node_modules/@nodelib/fs.walk/out/index.js delete mode 100644 node_modules/@nodelib/fs.walk/out/providers/async.d.ts delete mode 100644 node_modules/@nodelib/fs.walk/out/providers/async.js delete mode 100644 node_modules/@nodelib/fs.walk/out/providers/index.d.ts delete mode 100644 node_modules/@nodelib/fs.walk/out/providers/index.js delete mode 100644 node_modules/@nodelib/fs.walk/out/providers/stream.d.ts delete mode 100644 node_modules/@nodelib/fs.walk/out/providers/stream.js delete mode 100644 node_modules/@nodelib/fs.walk/out/providers/sync.d.ts delete mode 100644 node_modules/@nodelib/fs.walk/out/providers/sync.js delete mode 100644 node_modules/@nodelib/fs.walk/out/readers/async.d.ts delete mode 100644 node_modules/@nodelib/fs.walk/out/readers/async.js delete mode 100644 node_modules/@nodelib/fs.walk/out/readers/common.d.ts delete mode 100644 node_modules/@nodelib/fs.walk/out/readers/common.js delete mode 100644 node_modules/@nodelib/fs.walk/out/readers/reader.d.ts delete mode 100644 node_modules/@nodelib/fs.walk/out/readers/reader.js delete mode 100644 node_modules/@nodelib/fs.walk/out/readers/sync.d.ts delete mode 100644 node_modules/@nodelib/fs.walk/out/readers/sync.js delete mode 100644 node_modules/@nodelib/fs.walk/out/settings.d.ts delete mode 100644 node_modules/@nodelib/fs.walk/out/settings.js delete mode 100644 node_modules/@nodelib/fs.walk/out/types/index.d.ts delete mode 100644 node_modules/@nodelib/fs.walk/out/types/index.js delete mode 100644 node_modules/@nodelib/fs.walk/package.json delete mode 100644 node_modules/@pkgjs/parseargs/.editorconfig delete mode 100644 node_modules/@pkgjs/parseargs/CHANGELOG.md delete mode 100644 node_modules/@pkgjs/parseargs/LICENSE delete mode 100644 node_modules/@pkgjs/parseargs/README.md delete mode 100644 node_modules/@pkgjs/parseargs/examples/is-default-value.js delete mode 100644 node_modules/@pkgjs/parseargs/examples/limit-long-syntax.js delete mode 100644 node_modules/@pkgjs/parseargs/examples/negate.js delete mode 100644 node_modules/@pkgjs/parseargs/examples/no-repeated-options.js delete mode 100644 node_modules/@pkgjs/parseargs/examples/ordered-options.mjs delete mode 100644 node_modules/@pkgjs/parseargs/examples/simple-hard-coded.js delete mode 100644 node_modules/@pkgjs/parseargs/index.js delete mode 100644 node_modules/@pkgjs/parseargs/internal/errors.js delete mode 100644 node_modules/@pkgjs/parseargs/internal/primordials.js delete mode 100644 node_modules/@pkgjs/parseargs/internal/util.js delete mode 100644 node_modules/@pkgjs/parseargs/internal/validators.js delete mode 100644 node_modules/@pkgjs/parseargs/package.json delete mode 100644 node_modules/@pkgjs/parseargs/utils.js delete mode 100644 node_modules/@types/offscreencanvas/LICENSE delete mode 100644 node_modules/@types/offscreencanvas/README.md delete mode 100644 node_modules/@types/offscreencanvas/index.d.ts delete mode 100644 node_modules/@types/offscreencanvas/package.json delete mode 100644 node_modules/ansi-regex/index.d.ts delete mode 100644 node_modules/ansi-regex/index.js delete mode 100644 node_modules/ansi-regex/license delete mode 100644 node_modules/ansi-regex/package.json delete mode 100644 node_modules/ansi-regex/readme.md delete mode 100644 node_modules/ansi-styles/index.d.ts delete mode 100644 node_modules/ansi-styles/index.js delete mode 100644 node_modules/ansi-styles/license delete mode 100644 node_modules/ansi-styles/package.json delete mode 100644 node_modules/ansi-styles/readme.md delete mode 100644 node_modules/any-promise/.jshintrc delete mode 100644 node_modules/any-promise/.npmignore delete mode 100644 node_modules/any-promise/LICENSE delete mode 100644 node_modules/any-promise/README.md delete mode 100644 node_modules/any-promise/implementation.d.ts delete mode 100644 node_modules/any-promise/implementation.js delete mode 100644 node_modules/any-promise/index.d.ts delete mode 100644 node_modules/any-promise/index.js delete mode 100644 node_modules/any-promise/loader.js delete mode 100644 node_modules/any-promise/optional.js delete mode 100644 node_modules/any-promise/package.json delete mode 100644 node_modules/any-promise/register-shim.js delete mode 100644 node_modules/any-promise/register.d.ts delete mode 100644 node_modules/any-promise/register.js delete mode 100644 node_modules/any-promise/register/bluebird.d.ts delete mode 100644 node_modules/any-promise/register/bluebird.js delete mode 100644 node_modules/any-promise/register/es6-promise.d.ts delete mode 100644 node_modules/any-promise/register/es6-promise.js delete mode 100644 node_modules/any-promise/register/lie.d.ts delete mode 100644 node_modules/any-promise/register/lie.js delete mode 100644 node_modules/any-promise/register/native-promise-only.d.ts delete mode 100644 node_modules/any-promise/register/native-promise-only.js delete mode 100644 node_modules/any-promise/register/pinkie.d.ts delete mode 100644 node_modules/any-promise/register/pinkie.js delete mode 100644 node_modules/any-promise/register/promise.d.ts delete mode 100644 node_modules/any-promise/register/promise.js delete mode 100644 node_modules/any-promise/register/q.d.ts delete mode 100644 node_modules/any-promise/register/q.js delete mode 100644 node_modules/any-promise/register/rsvp.d.ts delete mode 100644 node_modules/any-promise/register/rsvp.js delete mode 100644 node_modules/any-promise/register/vow.d.ts delete mode 100644 node_modules/any-promise/register/vow.js delete mode 100644 node_modules/any-promise/register/when.d.ts delete mode 100644 node_modules/any-promise/register/when.js delete mode 100644 node_modules/anymatch/LICENSE delete mode 100644 node_modules/anymatch/README.md delete mode 100644 node_modules/anymatch/index.d.ts delete mode 100644 node_modules/anymatch/index.js delete mode 100644 node_modules/anymatch/package.json delete mode 100644 node_modules/arg/LICENSE.md delete mode 100644 node_modules/arg/README.md delete mode 100644 node_modules/arg/index.d.ts delete mode 100644 node_modules/arg/index.js delete mode 100644 node_modules/arg/package.json delete mode 100644 node_modules/balanced-match/.github/FUNDING.yml delete mode 100644 node_modules/balanced-match/LICENSE.md delete mode 100644 node_modules/balanced-match/README.md delete mode 100644 node_modules/balanced-match/index.js delete mode 100644 node_modules/balanced-match/package.json delete mode 100644 node_modules/base64-js/LICENSE delete mode 100644 node_modules/base64-js/README.md delete mode 100644 node_modules/base64-js/base64js.min.js delete mode 100644 node_modules/base64-js/index.d.ts delete mode 100644 node_modules/base64-js/index.js delete mode 100644 node_modules/base64-js/package.json delete mode 100644 node_modules/binary-extensions/binary-extensions.json delete mode 100644 node_modules/binary-extensions/binary-extensions.json.d.ts delete mode 100644 node_modules/binary-extensions/index.d.ts delete mode 100644 node_modules/binary-extensions/index.js delete mode 100644 node_modules/binary-extensions/license delete mode 100644 node_modules/binary-extensions/package.json delete mode 100644 node_modules/binary-extensions/readme.md delete mode 100644 node_modules/brace-expansion/.github/FUNDING.yml delete mode 100644 node_modules/brace-expansion/LICENSE delete mode 100644 node_modules/brace-expansion/README.md delete mode 100644 node_modules/brace-expansion/index.js delete mode 100644 node_modules/brace-expansion/package.json delete mode 100644 node_modules/braces/LICENSE delete mode 100644 node_modules/braces/README.md delete mode 100644 node_modules/braces/index.js delete mode 100644 node_modules/braces/lib/compile.js delete mode 100644 node_modules/braces/lib/constants.js delete mode 100644 node_modules/braces/lib/expand.js delete mode 100644 node_modules/braces/lib/parse.js delete mode 100644 node_modules/braces/lib/stringify.js delete mode 100644 node_modules/braces/lib/utils.js delete mode 100644 node_modules/braces/package.json delete mode 100644 node_modules/camelcase-css/README.md delete mode 100644 node_modules/camelcase-css/index-es5.js delete mode 100644 node_modules/camelcase-css/index.js delete mode 100644 node_modules/camelcase-css/license delete mode 100644 node_modules/camelcase-css/package.json delete mode 100644 node_modules/camelcase/index.d.ts delete mode 100644 node_modules/camelcase/index.js delete mode 100644 node_modules/camelcase/license delete mode 100644 node_modules/camelcase/package.json delete mode 100644 node_modules/camelcase/readme.md delete mode 100644 node_modules/cbor-js/LICENSE delete mode 100644 node_modules/cbor-js/README.md delete mode 100644 node_modules/cbor-js/cbor.js delete mode 100644 node_modules/cbor-js/package.json delete mode 100644 node_modules/chokidar/LICENSE delete mode 100644 node_modules/chokidar/README.md delete mode 100644 node_modules/chokidar/index.js delete mode 100644 node_modules/chokidar/lib/constants.js delete mode 100644 node_modules/chokidar/lib/fsevents-handler.js delete mode 100644 node_modules/chokidar/lib/nodefs-handler.js delete mode 100644 node_modules/chokidar/node_modules/glob-parent/CHANGELOG.md delete mode 100644 node_modules/chokidar/node_modules/glob-parent/LICENSE delete mode 100644 node_modules/chokidar/node_modules/glob-parent/README.md delete mode 100644 node_modules/chokidar/node_modules/glob-parent/index.js delete mode 100644 node_modules/chokidar/node_modules/glob-parent/package.json delete mode 100644 node_modules/chokidar/package.json delete mode 100644 node_modules/chokidar/types/index.d.ts delete mode 100644 node_modules/cliui/CHANGELOG.md delete mode 100644 node_modules/cliui/LICENSE.txt delete mode 100644 node_modules/cliui/README.md delete mode 100644 node_modules/cliui/index.js delete mode 100644 node_modules/cliui/package.json delete mode 100644 node_modules/color-convert/CHANGELOG.md delete mode 100644 node_modules/color-convert/LICENSE delete mode 100644 node_modules/color-convert/README.md delete mode 100644 node_modules/color-convert/conversions.js delete mode 100644 node_modules/color-convert/index.js delete mode 100644 node_modules/color-convert/package.json delete mode 100644 node_modules/color-convert/route.js delete mode 100644 node_modules/color-name/LICENSE delete mode 100644 node_modules/color-name/README.md delete mode 100644 node_modules/color-name/index.js delete mode 100644 node_modules/color-name/package.json delete mode 100644 node_modules/commander/CHANGELOG.md delete mode 100644 node_modules/commander/LICENSE delete mode 100644 node_modules/commander/Readme.md delete mode 100644 node_modules/commander/index.js delete mode 100644 node_modules/commander/package.json delete mode 100644 node_modules/commander/typings/index.d.ts delete mode 100644 node_modules/cross-spawn/LICENSE delete mode 100644 node_modules/cross-spawn/README.md delete mode 100644 node_modules/cross-spawn/index.js delete mode 100644 node_modules/cross-spawn/lib/enoent.js delete mode 100644 node_modules/cross-spawn/lib/parse.js delete mode 100644 node_modules/cross-spawn/lib/util/escape.js delete mode 100644 node_modules/cross-spawn/lib/util/readShebang.js delete mode 100644 node_modules/cross-spawn/lib/util/resolveCommand.js delete mode 100644 node_modules/cross-spawn/package.json delete mode 100644 node_modules/cssesc/LICENSE-MIT.txt delete mode 100644 node_modules/cssesc/README.md delete mode 100644 node_modules/cssesc/bin/cssesc delete mode 100644 node_modules/cssesc/cssesc.js delete mode 100644 node_modules/cssesc/man/cssesc.1 delete mode 100644 node_modules/cssesc/package.json delete mode 100644 node_modules/decamelize/index.js delete mode 100644 node_modules/decamelize/license delete mode 100644 node_modules/decamelize/package.json delete mode 100644 node_modules/decamelize/readme.md delete mode 100644 node_modules/didyoumean/LICENSE delete mode 100644 node_modules/didyoumean/README.md delete mode 100644 node_modules/didyoumean/didYouMean-1.2.1.js delete mode 100644 node_modules/didyoumean/didYouMean-1.2.1.min.js delete mode 100644 node_modules/didyoumean/package.json delete mode 100644 node_modules/dijkstrajs/.travis.yml delete mode 100644 node_modules/dijkstrajs/CONTRIBUTING.md delete mode 100644 node_modules/dijkstrajs/LICENSE.md delete mode 100644 node_modules/dijkstrajs/README.md delete mode 100644 node_modules/dijkstrajs/dijkstra.js delete mode 100644 node_modules/dijkstrajs/package.json delete mode 100644 node_modules/dijkstrajs/test/dijkstra.test.js delete mode 100644 node_modules/dlv/README.md delete mode 100644 node_modules/dlv/dist/dlv.es.js delete mode 100644 node_modules/dlv/dist/dlv.es.js.map delete mode 100644 node_modules/dlv/dist/dlv.js delete mode 100644 node_modules/dlv/dist/dlv.js.map delete mode 100644 node_modules/dlv/dist/dlv.umd.js delete mode 100644 node_modules/dlv/dist/dlv.umd.js.map delete mode 100644 node_modules/dlv/index.js delete mode 100644 node_modules/dlv/package.json delete mode 100644 node_modules/eastasianwidth/README.md delete mode 100644 node_modules/eastasianwidth/eastasianwidth.js delete mode 100644 node_modules/eastasianwidth/package.json delete mode 100644 node_modules/emoji-regex/LICENSE-MIT.txt delete mode 100644 node_modules/emoji-regex/README.md delete mode 100644 node_modules/emoji-regex/es2015/index.js delete mode 100644 node_modules/emoji-regex/es2015/text.js delete mode 100644 node_modules/emoji-regex/index.d.ts delete mode 100644 node_modules/emoji-regex/index.js delete mode 100644 node_modules/emoji-regex/package.json delete mode 100644 node_modules/emoji-regex/text.js delete mode 100644 node_modules/esbuild/LICENSE.md delete mode 100644 node_modules/esbuild/README.md delete mode 100644 node_modules/esbuild/bin/esbuild delete mode 100644 node_modules/esbuild/install.js delete mode 100644 node_modules/esbuild/lib/main.d.ts delete mode 100644 node_modules/esbuild/lib/main.js delete mode 100644 node_modules/esbuild/package.json delete mode 100644 node_modules/fast-glob/LICENSE delete mode 100644 node_modules/fast-glob/README.md delete mode 100644 node_modules/fast-glob/node_modules/glob-parent/CHANGELOG.md delete mode 100644 node_modules/fast-glob/node_modules/glob-parent/LICENSE delete mode 100644 node_modules/fast-glob/node_modules/glob-parent/README.md delete mode 100644 node_modules/fast-glob/node_modules/glob-parent/index.js delete mode 100644 node_modules/fast-glob/node_modules/glob-parent/package.json delete mode 100644 node_modules/fast-glob/out/index.d.ts delete mode 100644 node_modules/fast-glob/out/index.js delete mode 100644 node_modules/fast-glob/out/managers/tasks.d.ts delete mode 100644 node_modules/fast-glob/out/managers/tasks.js delete mode 100644 node_modules/fast-glob/out/providers/async.d.ts delete mode 100644 node_modules/fast-glob/out/providers/async.js delete mode 100644 node_modules/fast-glob/out/providers/filters/deep.d.ts delete mode 100644 node_modules/fast-glob/out/providers/filters/deep.js delete mode 100644 node_modules/fast-glob/out/providers/filters/entry.d.ts delete mode 100644 node_modules/fast-glob/out/providers/filters/entry.js delete mode 100644 node_modules/fast-glob/out/providers/filters/error.d.ts delete mode 100644 node_modules/fast-glob/out/providers/filters/error.js delete mode 100644 node_modules/fast-glob/out/providers/matchers/matcher.d.ts delete mode 100644 node_modules/fast-glob/out/providers/matchers/matcher.js delete mode 100644 node_modules/fast-glob/out/providers/matchers/partial.d.ts delete mode 100644 node_modules/fast-glob/out/providers/matchers/partial.js delete mode 100644 node_modules/fast-glob/out/providers/provider.d.ts delete mode 100644 node_modules/fast-glob/out/providers/provider.js delete mode 100644 node_modules/fast-glob/out/providers/stream.d.ts delete mode 100644 node_modules/fast-glob/out/providers/stream.js delete mode 100644 node_modules/fast-glob/out/providers/sync.d.ts delete mode 100644 node_modules/fast-glob/out/providers/sync.js delete mode 100644 node_modules/fast-glob/out/providers/transformers/entry.d.ts delete mode 100644 node_modules/fast-glob/out/providers/transformers/entry.js delete mode 100644 node_modules/fast-glob/out/readers/async.d.ts delete mode 100644 node_modules/fast-glob/out/readers/async.js delete mode 100644 node_modules/fast-glob/out/readers/reader.d.ts delete mode 100644 node_modules/fast-glob/out/readers/reader.js delete mode 100644 node_modules/fast-glob/out/readers/stream.d.ts delete mode 100644 node_modules/fast-glob/out/readers/stream.js delete mode 100644 node_modules/fast-glob/out/readers/sync.d.ts delete mode 100644 node_modules/fast-glob/out/readers/sync.js delete mode 100644 node_modules/fast-glob/out/settings.d.ts delete mode 100644 node_modules/fast-glob/out/settings.js delete mode 100644 node_modules/fast-glob/out/types/index.d.ts delete mode 100644 node_modules/fast-glob/out/types/index.js delete mode 100644 node_modules/fast-glob/out/utils/array.d.ts delete mode 100644 node_modules/fast-glob/out/utils/array.js delete mode 100644 node_modules/fast-glob/out/utils/errno.d.ts delete mode 100644 node_modules/fast-glob/out/utils/errno.js delete mode 100644 node_modules/fast-glob/out/utils/fs.d.ts delete mode 100644 node_modules/fast-glob/out/utils/fs.js delete mode 100644 node_modules/fast-glob/out/utils/index.d.ts delete mode 100644 node_modules/fast-glob/out/utils/index.js delete mode 100644 node_modules/fast-glob/out/utils/path.d.ts delete mode 100644 node_modules/fast-glob/out/utils/path.js delete mode 100644 node_modules/fast-glob/out/utils/pattern.d.ts delete mode 100644 node_modules/fast-glob/out/utils/pattern.js delete mode 100644 node_modules/fast-glob/out/utils/stream.d.ts delete mode 100644 node_modules/fast-glob/out/utils/stream.js delete mode 100644 node_modules/fast-glob/out/utils/string.d.ts delete mode 100644 node_modules/fast-glob/out/utils/string.js delete mode 100644 node_modules/fast-glob/package.json delete mode 100644 node_modules/fastq/.github/dependabot.yml delete mode 100644 node_modules/fastq/.github/workflows/ci.yml delete mode 100644 node_modules/fastq/LICENSE delete mode 100644 node_modules/fastq/README.md delete mode 100644 node_modules/fastq/SECURITY.md delete mode 100644 node_modules/fastq/bench.js delete mode 100644 node_modules/fastq/example.js delete mode 100644 node_modules/fastq/example.mjs delete mode 100644 node_modules/fastq/index.d.ts delete mode 100644 node_modules/fastq/package.json delete mode 100644 node_modules/fastq/queue.js delete mode 100644 node_modules/fastq/test/example.ts delete mode 100644 node_modules/fastq/test/promise.js delete mode 100644 node_modules/fastq/test/test.js delete mode 100644 node_modules/fastq/test/tsconfig.json delete mode 100644 node_modules/fill-range/LICENSE delete mode 100644 node_modules/fill-range/README.md delete mode 100644 node_modules/fill-range/index.js delete mode 100644 node_modules/fill-range/package.json delete mode 100644 node_modules/find-up/index.d.ts delete mode 100644 node_modules/find-up/index.js delete mode 100644 node_modules/find-up/license delete mode 100644 node_modules/find-up/package.json delete mode 100644 node_modules/find-up/readme.md delete mode 100644 node_modules/foreground-child/LICENSE delete mode 100644 node_modules/foreground-child/README.md delete mode 100644 node_modules/foreground-child/dist/commonjs/all-signals.d.ts delete mode 100644 node_modules/foreground-child/dist/commonjs/all-signals.d.ts.map delete mode 100644 node_modules/foreground-child/dist/commonjs/all-signals.js delete mode 100644 node_modules/foreground-child/dist/commonjs/all-signals.js.map delete mode 100644 node_modules/foreground-child/dist/commonjs/index.d.ts delete mode 100644 node_modules/foreground-child/dist/commonjs/index.d.ts.map delete mode 100644 node_modules/foreground-child/dist/commonjs/index.js delete mode 100644 node_modules/foreground-child/dist/commonjs/index.js.map delete mode 100644 node_modules/foreground-child/dist/commonjs/package.json delete mode 100644 node_modules/foreground-child/dist/commonjs/proxy-signals.d.ts delete mode 100644 node_modules/foreground-child/dist/commonjs/proxy-signals.d.ts.map delete mode 100644 node_modules/foreground-child/dist/commonjs/proxy-signals.js delete mode 100644 node_modules/foreground-child/dist/commonjs/proxy-signals.js.map delete mode 100644 node_modules/foreground-child/dist/commonjs/watchdog.d.ts delete mode 100644 node_modules/foreground-child/dist/commonjs/watchdog.d.ts.map delete mode 100644 node_modules/foreground-child/dist/commonjs/watchdog.js delete mode 100644 node_modules/foreground-child/dist/commonjs/watchdog.js.map delete mode 100644 node_modules/foreground-child/dist/esm/all-signals.d.ts delete mode 100644 node_modules/foreground-child/dist/esm/all-signals.d.ts.map delete mode 100644 node_modules/foreground-child/dist/esm/all-signals.js delete mode 100644 node_modules/foreground-child/dist/esm/all-signals.js.map delete mode 100644 node_modules/foreground-child/dist/esm/index.d.ts delete mode 100644 node_modules/foreground-child/dist/esm/index.d.ts.map delete mode 100644 node_modules/foreground-child/dist/esm/index.js delete mode 100644 node_modules/foreground-child/dist/esm/index.js.map delete mode 100644 node_modules/foreground-child/dist/esm/package.json delete mode 100644 node_modules/foreground-child/dist/esm/proxy-signals.d.ts delete mode 100644 node_modules/foreground-child/dist/esm/proxy-signals.d.ts.map delete mode 100644 node_modules/foreground-child/dist/esm/proxy-signals.js delete mode 100644 node_modules/foreground-child/dist/esm/proxy-signals.js.map delete mode 100644 node_modules/foreground-child/dist/esm/watchdog.d.ts delete mode 100644 node_modules/foreground-child/dist/esm/watchdog.d.ts.map delete mode 100644 node_modules/foreground-child/dist/esm/watchdog.js delete mode 100644 node_modules/foreground-child/dist/esm/watchdog.js.map delete mode 100644 node_modules/foreground-child/package.json delete mode 100644 node_modules/function-bind/.eslintrc delete mode 100644 node_modules/function-bind/.github/FUNDING.yml delete mode 100644 node_modules/function-bind/.github/SECURITY.md delete mode 100644 node_modules/function-bind/.nycrc delete mode 100644 node_modules/function-bind/CHANGELOG.md delete mode 100644 node_modules/function-bind/LICENSE delete mode 100644 node_modules/function-bind/README.md delete mode 100644 node_modules/function-bind/implementation.js delete mode 100644 node_modules/function-bind/index.js delete mode 100644 node_modules/function-bind/package.json delete mode 100644 node_modules/function-bind/test/.eslintrc delete mode 100644 node_modules/function-bind/test/index.js delete mode 100644 node_modules/get-caller-file/LICENSE.md delete mode 100644 node_modules/get-caller-file/README.md delete mode 100644 node_modules/get-caller-file/index.d.ts delete mode 100644 node_modules/get-caller-file/index.js delete mode 100644 node_modules/get-caller-file/index.js.map delete mode 100644 node_modules/get-caller-file/package.json delete mode 100644 node_modules/glob-parent/LICENSE delete mode 100644 node_modules/glob-parent/README.md delete mode 100644 node_modules/glob-parent/index.js delete mode 100644 node_modules/glob-parent/package.json delete mode 100644 node_modules/glob/LICENSE delete mode 100644 node_modules/glob/README.md delete mode 100644 node_modules/glob/dist/commonjs/glob.d.ts delete mode 100644 node_modules/glob/dist/commonjs/glob.d.ts.map delete mode 100644 node_modules/glob/dist/commonjs/glob.js delete mode 100644 node_modules/glob/dist/commonjs/glob.js.map delete mode 100644 node_modules/glob/dist/commonjs/has-magic.d.ts delete mode 100644 node_modules/glob/dist/commonjs/has-magic.d.ts.map delete mode 100644 node_modules/glob/dist/commonjs/has-magic.js delete mode 100644 node_modules/glob/dist/commonjs/has-magic.js.map delete mode 100644 node_modules/glob/dist/commonjs/ignore.d.ts delete mode 100644 node_modules/glob/dist/commonjs/ignore.d.ts.map delete mode 100644 node_modules/glob/dist/commonjs/ignore.js delete mode 100644 node_modules/glob/dist/commonjs/ignore.js.map delete mode 100644 node_modules/glob/dist/commonjs/index.d.ts delete mode 100644 node_modules/glob/dist/commonjs/index.d.ts.map delete mode 100644 node_modules/glob/dist/commonjs/index.js delete mode 100644 node_modules/glob/dist/commonjs/index.js.map delete mode 100644 node_modules/glob/dist/commonjs/package.json delete mode 100644 node_modules/glob/dist/commonjs/pattern.d.ts delete mode 100644 node_modules/glob/dist/commonjs/pattern.d.ts.map delete mode 100644 node_modules/glob/dist/commonjs/pattern.js delete mode 100644 node_modules/glob/dist/commonjs/pattern.js.map delete mode 100644 node_modules/glob/dist/commonjs/processor.d.ts delete mode 100644 node_modules/glob/dist/commonjs/processor.d.ts.map delete mode 100644 node_modules/glob/dist/commonjs/processor.js delete mode 100644 node_modules/glob/dist/commonjs/processor.js.map delete mode 100644 node_modules/glob/dist/commonjs/walker.d.ts delete mode 100644 node_modules/glob/dist/commonjs/walker.d.ts.map delete mode 100644 node_modules/glob/dist/commonjs/walker.js delete mode 100644 node_modules/glob/dist/commonjs/walker.js.map delete mode 100644 node_modules/glob/dist/esm/bin.d.mts delete mode 100644 node_modules/glob/dist/esm/bin.d.mts.map delete mode 100644 node_modules/glob/dist/esm/bin.mjs delete mode 100644 node_modules/glob/dist/esm/bin.mjs.map delete mode 100644 node_modules/glob/dist/esm/glob.d.ts delete mode 100644 node_modules/glob/dist/esm/glob.d.ts.map delete mode 100644 node_modules/glob/dist/esm/glob.js delete mode 100644 node_modules/glob/dist/esm/glob.js.map delete mode 100644 node_modules/glob/dist/esm/has-magic.d.ts delete mode 100644 node_modules/glob/dist/esm/has-magic.d.ts.map delete mode 100644 node_modules/glob/dist/esm/has-magic.js delete mode 100644 node_modules/glob/dist/esm/has-magic.js.map delete mode 100644 node_modules/glob/dist/esm/ignore.d.ts delete mode 100644 node_modules/glob/dist/esm/ignore.d.ts.map delete mode 100644 node_modules/glob/dist/esm/ignore.js delete mode 100644 node_modules/glob/dist/esm/ignore.js.map delete mode 100644 node_modules/glob/dist/esm/index.d.ts delete mode 100644 node_modules/glob/dist/esm/index.d.ts.map delete mode 100644 node_modules/glob/dist/esm/index.js delete mode 100644 node_modules/glob/dist/esm/index.js.map delete mode 100644 node_modules/glob/dist/esm/package.json delete mode 100644 node_modules/glob/dist/esm/pattern.d.ts delete mode 100644 node_modules/glob/dist/esm/pattern.d.ts.map delete mode 100644 node_modules/glob/dist/esm/pattern.js delete mode 100644 node_modules/glob/dist/esm/pattern.js.map delete mode 100644 node_modules/glob/dist/esm/processor.d.ts delete mode 100644 node_modules/glob/dist/esm/processor.d.ts.map delete mode 100644 node_modules/glob/dist/esm/processor.js delete mode 100644 node_modules/glob/dist/esm/processor.js.map delete mode 100644 node_modules/glob/dist/esm/walker.d.ts delete mode 100644 node_modules/glob/dist/esm/walker.d.ts.map delete mode 100644 node_modules/glob/dist/esm/walker.js delete mode 100644 node_modules/glob/dist/esm/walker.js.map delete mode 100644 node_modules/glob/package.json delete mode 100644 node_modules/hasown/.eslintrc delete mode 100644 node_modules/hasown/.github/FUNDING.yml delete mode 100644 node_modules/hasown/.nycrc delete mode 100644 node_modules/hasown/CHANGELOG.md delete mode 100644 node_modules/hasown/LICENSE delete mode 100644 node_modules/hasown/README.md delete mode 100644 node_modules/hasown/index.d.ts delete mode 100644 node_modules/hasown/index.js delete mode 100644 node_modules/hasown/package.json delete mode 100644 node_modules/hasown/tsconfig.json delete mode 100644 node_modules/html5-qrcode/LICENSE delete mode 100644 node_modules/html5-qrcode/README.md delete mode 100644 node_modules/html5-qrcode/camera/core-impl.d.ts delete mode 100644 node_modules/html5-qrcode/camera/core.d.ts delete mode 100644 node_modules/html5-qrcode/camera/factories.d.ts delete mode 100644 node_modules/html5-qrcode/camera/permissions.d.ts delete mode 100644 node_modules/html5-qrcode/camera/retriever.d.ts delete mode 100644 node_modules/html5-qrcode/cjs/camera/core-impl.d.ts delete mode 100644 node_modules/html5-qrcode/cjs/camera/core-impl.js delete mode 100644 node_modules/html5-qrcode/cjs/camera/core-impl.js.map delete mode 100644 node_modules/html5-qrcode/cjs/camera/core.d.ts delete mode 100644 node_modules/html5-qrcode/cjs/camera/core.js delete mode 100644 node_modules/html5-qrcode/cjs/camera/core.js.map delete mode 100644 node_modules/html5-qrcode/cjs/camera/factories.d.ts delete mode 100644 node_modules/html5-qrcode/cjs/camera/factories.js delete mode 100644 node_modules/html5-qrcode/cjs/camera/factories.js.map delete mode 100644 node_modules/html5-qrcode/cjs/camera/permissions.d.ts delete mode 100644 node_modules/html5-qrcode/cjs/camera/permissions.js delete mode 100644 node_modules/html5-qrcode/cjs/camera/permissions.js.map delete mode 100644 node_modules/html5-qrcode/cjs/camera/retriever.d.ts delete mode 100644 node_modules/html5-qrcode/cjs/camera/retriever.js delete mode 100644 node_modules/html5-qrcode/cjs/camera/retriever.js.map delete mode 100644 node_modules/html5-qrcode/cjs/code-decoder.d.ts delete mode 100644 node_modules/html5-qrcode/cjs/code-decoder.js delete mode 100644 node_modules/html5-qrcode/cjs/code-decoder.js.map delete mode 100644 node_modules/html5-qrcode/cjs/core.d.ts delete mode 100644 node_modules/html5-qrcode/cjs/core.js delete mode 100644 node_modules/html5-qrcode/cjs/core.js.map delete mode 100644 node_modules/html5-qrcode/cjs/experimental-features.d.ts delete mode 100644 node_modules/html5-qrcode/cjs/experimental-features.js delete mode 100644 node_modules/html5-qrcode/cjs/experimental-features.js.map delete mode 100644 node_modules/html5-qrcode/cjs/html5-qrcode-scanner.d.ts delete mode 100644 node_modules/html5-qrcode/cjs/html5-qrcode-scanner.js delete mode 100644 node_modules/html5-qrcode/cjs/html5-qrcode-scanner.js.map delete mode 100644 node_modules/html5-qrcode/cjs/html5-qrcode.d.ts delete mode 100644 node_modules/html5-qrcode/cjs/html5-qrcode.js delete mode 100644 node_modules/html5-qrcode/cjs/html5-qrcode.js.map delete mode 100644 node_modules/html5-qrcode/cjs/image-assets.d.ts delete mode 100644 node_modules/html5-qrcode/cjs/image-assets.js delete mode 100644 node_modules/html5-qrcode/cjs/image-assets.js.map delete mode 100644 node_modules/html5-qrcode/cjs/index.d.ts delete mode 100644 node_modules/html5-qrcode/cjs/index.js delete mode 100644 node_modules/html5-qrcode/cjs/index.js.map delete mode 100644 node_modules/html5-qrcode/cjs/native-bar-code-detector.d.ts delete mode 100644 node_modules/html5-qrcode/cjs/native-bar-code-detector.js delete mode 100644 node_modules/html5-qrcode/cjs/native-bar-code-detector.js.map delete mode 100644 node_modules/html5-qrcode/cjs/state-manager.d.ts delete mode 100644 node_modules/html5-qrcode/cjs/state-manager.js delete mode 100644 node_modules/html5-qrcode/cjs/state-manager.js.map delete mode 100644 node_modules/html5-qrcode/cjs/storage.d.ts delete mode 100644 node_modules/html5-qrcode/cjs/storage.js delete mode 100644 node_modules/html5-qrcode/cjs/storage.js.map delete mode 100644 node_modules/html5-qrcode/cjs/strings.d.ts delete mode 100644 node_modules/html5-qrcode/cjs/strings.js delete mode 100644 node_modules/html5-qrcode/cjs/strings.js.map delete mode 100644 node_modules/html5-qrcode/cjs/ui.d.ts delete mode 100644 node_modules/html5-qrcode/cjs/ui.js delete mode 100644 node_modules/html5-qrcode/cjs/ui.js.map delete mode 100644 node_modules/html5-qrcode/cjs/ui/scanner/base.d.ts delete mode 100644 node_modules/html5-qrcode/cjs/ui/scanner/base.js delete mode 100644 node_modules/html5-qrcode/cjs/ui/scanner/base.js.map delete mode 100644 node_modules/html5-qrcode/cjs/ui/scanner/camera-selection-ui.d.ts delete mode 100644 node_modules/html5-qrcode/cjs/ui/scanner/camera-selection-ui.js delete mode 100644 node_modules/html5-qrcode/cjs/ui/scanner/camera-selection-ui.js.map delete mode 100644 node_modules/html5-qrcode/cjs/ui/scanner/camera-zoom-ui.d.ts delete mode 100644 node_modules/html5-qrcode/cjs/ui/scanner/camera-zoom-ui.js delete mode 100644 node_modules/html5-qrcode/cjs/ui/scanner/camera-zoom-ui.js.map delete mode 100644 node_modules/html5-qrcode/cjs/ui/scanner/file-selection-ui.d.ts delete mode 100644 node_modules/html5-qrcode/cjs/ui/scanner/file-selection-ui.js delete mode 100644 node_modules/html5-qrcode/cjs/ui/scanner/file-selection-ui.js.map delete mode 100644 node_modules/html5-qrcode/cjs/ui/scanner/scan-type-selector.d.ts delete mode 100644 node_modules/html5-qrcode/cjs/ui/scanner/scan-type-selector.js delete mode 100644 node_modules/html5-qrcode/cjs/ui/scanner/scan-type-selector.js.map delete mode 100644 node_modules/html5-qrcode/cjs/ui/scanner/torch-button.d.ts delete mode 100644 node_modules/html5-qrcode/cjs/ui/scanner/torch-button.js delete mode 100644 node_modules/html5-qrcode/cjs/ui/scanner/torch-button.js.map delete mode 100644 node_modules/html5-qrcode/cjs/utils.d.ts delete mode 100644 node_modules/html5-qrcode/cjs/utils.js delete mode 100644 node_modules/html5-qrcode/cjs/utils.js.map delete mode 100644 node_modules/html5-qrcode/cjs/zxing-html5-qrcode-decoder.d.ts delete mode 100644 node_modules/html5-qrcode/cjs/zxing-html5-qrcode-decoder.js delete mode 100644 node_modules/html5-qrcode/cjs/zxing-html5-qrcode-decoder.js.map delete mode 100644 node_modules/html5-qrcode/code-decoder.d.ts delete mode 100644 node_modules/html5-qrcode/core.d.ts delete mode 100644 node_modules/html5-qrcode/es2015/camera/core-impl.d.ts delete mode 100644 node_modules/html5-qrcode/es2015/camera/core-impl.js delete mode 100644 node_modules/html5-qrcode/es2015/camera/core-impl.js.map delete mode 100644 node_modules/html5-qrcode/es2015/camera/core.d.ts delete mode 100644 node_modules/html5-qrcode/es2015/camera/core.js delete mode 100644 node_modules/html5-qrcode/es2015/camera/core.js.map delete mode 100644 node_modules/html5-qrcode/es2015/camera/factories.d.ts delete mode 100644 node_modules/html5-qrcode/es2015/camera/factories.js delete mode 100644 node_modules/html5-qrcode/es2015/camera/factories.js.map delete mode 100644 node_modules/html5-qrcode/es2015/camera/permissions.d.ts delete mode 100644 node_modules/html5-qrcode/es2015/camera/permissions.js delete mode 100644 node_modules/html5-qrcode/es2015/camera/permissions.js.map delete mode 100644 node_modules/html5-qrcode/es2015/camera/retriever.d.ts delete mode 100644 node_modules/html5-qrcode/es2015/camera/retriever.js delete mode 100644 node_modules/html5-qrcode/es2015/camera/retriever.js.map delete mode 100644 node_modules/html5-qrcode/es2015/code-decoder.d.ts delete mode 100644 node_modules/html5-qrcode/es2015/code-decoder.js delete mode 100644 node_modules/html5-qrcode/es2015/code-decoder.js.map delete mode 100644 node_modules/html5-qrcode/es2015/core.d.ts delete mode 100644 node_modules/html5-qrcode/es2015/core.js delete mode 100644 node_modules/html5-qrcode/es2015/core.js.map delete mode 100644 node_modules/html5-qrcode/es2015/experimental-features.d.ts delete mode 100644 node_modules/html5-qrcode/es2015/experimental-features.js delete mode 100644 node_modules/html5-qrcode/es2015/experimental-features.js.map delete mode 100644 node_modules/html5-qrcode/es2015/html5-qrcode-scanner.d.ts delete mode 100644 node_modules/html5-qrcode/es2015/html5-qrcode-scanner.js delete mode 100644 node_modules/html5-qrcode/es2015/html5-qrcode-scanner.js.map delete mode 100644 node_modules/html5-qrcode/es2015/html5-qrcode.d.ts delete mode 100644 node_modules/html5-qrcode/es2015/html5-qrcode.js delete mode 100644 node_modules/html5-qrcode/es2015/html5-qrcode.js.map delete mode 100644 node_modules/html5-qrcode/es2015/image-assets.d.ts delete mode 100644 node_modules/html5-qrcode/es2015/image-assets.js delete mode 100644 node_modules/html5-qrcode/es2015/image-assets.js.map delete mode 100644 node_modules/html5-qrcode/es2015/index.d.ts delete mode 100644 node_modules/html5-qrcode/es2015/index.js delete mode 100644 node_modules/html5-qrcode/es2015/index.js.map delete mode 100644 node_modules/html5-qrcode/es2015/native-bar-code-detector.d.ts delete mode 100644 node_modules/html5-qrcode/es2015/native-bar-code-detector.js delete mode 100644 node_modules/html5-qrcode/es2015/native-bar-code-detector.js.map delete mode 100644 node_modules/html5-qrcode/es2015/state-manager.d.ts delete mode 100644 node_modules/html5-qrcode/es2015/state-manager.js delete mode 100644 node_modules/html5-qrcode/es2015/state-manager.js.map delete mode 100644 node_modules/html5-qrcode/es2015/storage.d.ts delete mode 100644 node_modules/html5-qrcode/es2015/storage.js delete mode 100644 node_modules/html5-qrcode/es2015/storage.js.map delete mode 100644 node_modules/html5-qrcode/es2015/strings.d.ts delete mode 100644 node_modules/html5-qrcode/es2015/strings.js delete mode 100644 node_modules/html5-qrcode/es2015/strings.js.map delete mode 100644 node_modules/html5-qrcode/es2015/ui.d.ts delete mode 100644 node_modules/html5-qrcode/es2015/ui.js delete mode 100644 node_modules/html5-qrcode/es2015/ui.js.map delete mode 100644 node_modules/html5-qrcode/es2015/ui/scanner/base.d.ts delete mode 100644 node_modules/html5-qrcode/es2015/ui/scanner/base.js delete mode 100644 node_modules/html5-qrcode/es2015/ui/scanner/base.js.map delete mode 100644 node_modules/html5-qrcode/es2015/ui/scanner/camera-selection-ui.d.ts delete mode 100644 node_modules/html5-qrcode/es2015/ui/scanner/camera-selection-ui.js delete mode 100644 node_modules/html5-qrcode/es2015/ui/scanner/camera-selection-ui.js.map delete mode 100644 node_modules/html5-qrcode/es2015/ui/scanner/camera-zoom-ui.d.ts delete mode 100644 node_modules/html5-qrcode/es2015/ui/scanner/camera-zoom-ui.js delete mode 100644 node_modules/html5-qrcode/es2015/ui/scanner/camera-zoom-ui.js.map delete mode 100644 node_modules/html5-qrcode/es2015/ui/scanner/file-selection-ui.d.ts delete mode 100644 node_modules/html5-qrcode/es2015/ui/scanner/file-selection-ui.js delete mode 100644 node_modules/html5-qrcode/es2015/ui/scanner/file-selection-ui.js.map delete mode 100644 node_modules/html5-qrcode/es2015/ui/scanner/scan-type-selector.d.ts delete mode 100644 node_modules/html5-qrcode/es2015/ui/scanner/scan-type-selector.js delete mode 100644 node_modules/html5-qrcode/es2015/ui/scanner/scan-type-selector.js.map delete mode 100644 node_modules/html5-qrcode/es2015/ui/scanner/torch-button.d.ts delete mode 100644 node_modules/html5-qrcode/es2015/ui/scanner/torch-button.js delete mode 100644 node_modules/html5-qrcode/es2015/ui/scanner/torch-button.js.map delete mode 100644 node_modules/html5-qrcode/es2015/utils.d.ts delete mode 100644 node_modules/html5-qrcode/es2015/utils.js delete mode 100644 node_modules/html5-qrcode/es2015/utils.js.map delete mode 100644 node_modules/html5-qrcode/es2015/zxing-html5-qrcode-decoder.d.ts delete mode 100644 node_modules/html5-qrcode/es2015/zxing-html5-qrcode-decoder.js delete mode 100644 node_modules/html5-qrcode/es2015/zxing-html5-qrcode-decoder.js.map delete mode 100644 node_modules/html5-qrcode/esm/camera/core-impl.d.ts delete mode 100644 node_modules/html5-qrcode/esm/camera/core-impl.js delete mode 100644 node_modules/html5-qrcode/esm/camera/core-impl.js.map delete mode 100644 node_modules/html5-qrcode/esm/camera/core.d.ts delete mode 100644 node_modules/html5-qrcode/esm/camera/core.js delete mode 100644 node_modules/html5-qrcode/esm/camera/core.js.map delete mode 100644 node_modules/html5-qrcode/esm/camera/factories.d.ts delete mode 100644 node_modules/html5-qrcode/esm/camera/factories.js delete mode 100644 node_modules/html5-qrcode/esm/camera/factories.js.map delete mode 100644 node_modules/html5-qrcode/esm/camera/permissions.d.ts delete mode 100644 node_modules/html5-qrcode/esm/camera/permissions.js delete mode 100644 node_modules/html5-qrcode/esm/camera/permissions.js.map delete mode 100644 node_modules/html5-qrcode/esm/camera/retriever.d.ts delete mode 100644 node_modules/html5-qrcode/esm/camera/retriever.js delete mode 100644 node_modules/html5-qrcode/esm/camera/retriever.js.map delete mode 100644 node_modules/html5-qrcode/esm/code-decoder.d.ts delete mode 100644 node_modules/html5-qrcode/esm/code-decoder.js delete mode 100644 node_modules/html5-qrcode/esm/code-decoder.js.map delete mode 100644 node_modules/html5-qrcode/esm/core.d.ts delete mode 100644 node_modules/html5-qrcode/esm/core.js delete mode 100644 node_modules/html5-qrcode/esm/core.js.map delete mode 100644 node_modules/html5-qrcode/esm/experimental-features.d.ts delete mode 100644 node_modules/html5-qrcode/esm/experimental-features.js delete mode 100644 node_modules/html5-qrcode/esm/experimental-features.js.map delete mode 100644 node_modules/html5-qrcode/esm/html5-qrcode-scanner.d.ts delete mode 100644 node_modules/html5-qrcode/esm/html5-qrcode-scanner.js delete mode 100644 node_modules/html5-qrcode/esm/html5-qrcode-scanner.js.map delete mode 100644 node_modules/html5-qrcode/esm/html5-qrcode.d.ts delete mode 100644 node_modules/html5-qrcode/esm/html5-qrcode.js delete mode 100644 node_modules/html5-qrcode/esm/html5-qrcode.js.map delete mode 100644 node_modules/html5-qrcode/esm/image-assets.d.ts delete mode 100644 node_modules/html5-qrcode/esm/image-assets.js delete mode 100644 node_modules/html5-qrcode/esm/image-assets.js.map delete mode 100644 node_modules/html5-qrcode/esm/index.d.ts delete mode 100644 node_modules/html5-qrcode/esm/index.js delete mode 100644 node_modules/html5-qrcode/esm/index.js.map delete mode 100644 node_modules/html5-qrcode/esm/native-bar-code-detector.d.ts delete mode 100644 node_modules/html5-qrcode/esm/native-bar-code-detector.js delete mode 100644 node_modules/html5-qrcode/esm/native-bar-code-detector.js.map delete mode 100644 node_modules/html5-qrcode/esm/state-manager.d.ts delete mode 100644 node_modules/html5-qrcode/esm/state-manager.js delete mode 100644 node_modules/html5-qrcode/esm/state-manager.js.map delete mode 100644 node_modules/html5-qrcode/esm/storage.d.ts delete mode 100644 node_modules/html5-qrcode/esm/storage.js delete mode 100644 node_modules/html5-qrcode/esm/storage.js.map delete mode 100644 node_modules/html5-qrcode/esm/strings.d.ts delete mode 100644 node_modules/html5-qrcode/esm/strings.js delete mode 100644 node_modules/html5-qrcode/esm/strings.js.map delete mode 100644 node_modules/html5-qrcode/esm/ui.d.ts delete mode 100644 node_modules/html5-qrcode/esm/ui.js delete mode 100644 node_modules/html5-qrcode/esm/ui.js.map delete mode 100644 node_modules/html5-qrcode/esm/ui/scanner/base.d.ts delete mode 100644 node_modules/html5-qrcode/esm/ui/scanner/base.js delete mode 100644 node_modules/html5-qrcode/esm/ui/scanner/base.js.map delete mode 100644 node_modules/html5-qrcode/esm/ui/scanner/camera-selection-ui.d.ts delete mode 100644 node_modules/html5-qrcode/esm/ui/scanner/camera-selection-ui.js delete mode 100644 node_modules/html5-qrcode/esm/ui/scanner/camera-selection-ui.js.map delete mode 100644 node_modules/html5-qrcode/esm/ui/scanner/camera-zoom-ui.d.ts delete mode 100644 node_modules/html5-qrcode/esm/ui/scanner/camera-zoom-ui.js delete mode 100644 node_modules/html5-qrcode/esm/ui/scanner/camera-zoom-ui.js.map delete mode 100644 node_modules/html5-qrcode/esm/ui/scanner/file-selection-ui.d.ts delete mode 100644 node_modules/html5-qrcode/esm/ui/scanner/file-selection-ui.js delete mode 100644 node_modules/html5-qrcode/esm/ui/scanner/file-selection-ui.js.map delete mode 100644 node_modules/html5-qrcode/esm/ui/scanner/scan-type-selector.d.ts delete mode 100644 node_modules/html5-qrcode/esm/ui/scanner/scan-type-selector.js delete mode 100644 node_modules/html5-qrcode/esm/ui/scanner/scan-type-selector.js.map delete mode 100644 node_modules/html5-qrcode/esm/ui/scanner/torch-button.d.ts delete mode 100644 node_modules/html5-qrcode/esm/ui/scanner/torch-button.js delete mode 100644 node_modules/html5-qrcode/esm/ui/scanner/torch-button.js.map delete mode 100644 node_modules/html5-qrcode/esm/utils.d.ts delete mode 100644 node_modules/html5-qrcode/esm/utils.js delete mode 100644 node_modules/html5-qrcode/esm/utils.js.map delete mode 100644 node_modules/html5-qrcode/esm/zxing-html5-qrcode-decoder.d.ts delete mode 100644 node_modules/html5-qrcode/esm/zxing-html5-qrcode-decoder.js delete mode 100644 node_modules/html5-qrcode/esm/zxing-html5-qrcode-decoder.js.map delete mode 100644 node_modules/html5-qrcode/experimental-features.d.ts delete mode 100644 node_modules/html5-qrcode/html5-qrcode-scanner.d.ts delete mode 100644 node_modules/html5-qrcode/html5-qrcode.d.ts delete mode 100644 node_modules/html5-qrcode/html5-qrcode.min.js delete mode 100644 node_modules/html5-qrcode/image-assets.d.ts delete mode 100644 node_modules/html5-qrcode/index.d.ts delete mode 100644 node_modules/html5-qrcode/native-bar-code-detector.d.ts delete mode 100644 node_modules/html5-qrcode/package.json delete mode 100644 node_modules/html5-qrcode/src/camera/core-impl.d.ts delete mode 100644 node_modules/html5-qrcode/src/camera/core-impl.ts delete mode 100644 node_modules/html5-qrcode/src/camera/core.d.ts delete mode 100644 node_modules/html5-qrcode/src/camera/core.ts delete mode 100644 node_modules/html5-qrcode/src/camera/factories.d.ts delete mode 100644 node_modules/html5-qrcode/src/camera/factories.ts delete mode 100644 node_modules/html5-qrcode/src/camera/permissions.d.ts delete mode 100644 node_modules/html5-qrcode/src/camera/permissions.ts delete mode 100644 node_modules/html5-qrcode/src/camera/retriever.d.ts delete mode 100644 node_modules/html5-qrcode/src/camera/retriever.ts delete mode 100644 node_modules/html5-qrcode/src/code-decoder.d.ts delete mode 100644 node_modules/html5-qrcode/src/code-decoder.ts delete mode 100644 node_modules/html5-qrcode/src/core.d.ts delete mode 100644 node_modules/html5-qrcode/src/core.ts delete mode 100644 node_modules/html5-qrcode/src/experimental-features.d.ts delete mode 100644 node_modules/html5-qrcode/src/experimental-features.ts delete mode 100644 node_modules/html5-qrcode/src/html5-qrcode-scanner.d.ts delete mode 100644 node_modules/html5-qrcode/src/html5-qrcode-scanner.ts delete mode 100644 node_modules/html5-qrcode/src/html5-qrcode.d.ts delete mode 100644 node_modules/html5-qrcode/src/html5-qrcode.ts delete mode 100644 node_modules/html5-qrcode/src/image-assets.d.ts delete mode 100644 node_modules/html5-qrcode/src/image-assets.ts delete mode 100644 node_modules/html5-qrcode/src/index.d.ts delete mode 100644 node_modules/html5-qrcode/src/index.ts delete mode 100644 node_modules/html5-qrcode/src/native-bar-code-detector.d.ts delete mode 100644 node_modules/html5-qrcode/src/native-bar-code-detector.ts delete mode 100644 node_modules/html5-qrcode/src/state-manager.d.ts delete mode 100644 node_modules/html5-qrcode/src/state-manager.ts delete mode 100644 node_modules/html5-qrcode/src/storage.d.ts delete mode 100644 node_modules/html5-qrcode/src/storage.ts delete mode 100644 node_modules/html5-qrcode/src/strings.d.ts delete mode 100644 node_modules/html5-qrcode/src/strings.ts delete mode 100644 node_modules/html5-qrcode/src/ui.d.ts delete mode 100644 node_modules/html5-qrcode/src/ui.ts delete mode 100644 node_modules/html5-qrcode/src/ui/scanner/base.d.ts delete mode 100644 node_modules/html5-qrcode/src/ui/scanner/base.ts delete mode 100644 node_modules/html5-qrcode/src/ui/scanner/camera-selection-ui.d.ts delete mode 100644 node_modules/html5-qrcode/src/ui/scanner/camera-selection-ui.ts delete mode 100644 node_modules/html5-qrcode/src/ui/scanner/camera-zoom-ui.d.ts delete mode 100644 node_modules/html5-qrcode/src/ui/scanner/camera-zoom-ui.ts delete mode 100644 node_modules/html5-qrcode/src/ui/scanner/file-selection-ui.d.ts delete mode 100644 node_modules/html5-qrcode/src/ui/scanner/file-selection-ui.ts delete mode 100644 node_modules/html5-qrcode/src/ui/scanner/scan-type-selector.d.ts delete mode 100644 node_modules/html5-qrcode/src/ui/scanner/scan-type-selector.ts delete mode 100644 node_modules/html5-qrcode/src/ui/scanner/torch-button.d.ts delete mode 100644 node_modules/html5-qrcode/src/ui/scanner/torch-button.ts delete mode 100644 node_modules/html5-qrcode/src/utils.d.ts delete mode 100644 node_modules/html5-qrcode/src/utils.ts delete mode 100644 node_modules/html5-qrcode/src/zxing-html5-qrcode-decoder.d.ts delete mode 100644 node_modules/html5-qrcode/src/zxing-html5-qrcode-decoder.ts delete mode 100644 node_modules/html5-qrcode/state-manager.d.ts delete mode 100644 node_modules/html5-qrcode/storage.d.ts delete mode 100644 node_modules/html5-qrcode/strings.d.ts delete mode 100644 node_modules/html5-qrcode/third_party/zxing-js.umd.d.ts delete mode 100644 node_modules/html5-qrcode/third_party/zxing-js.umd.js delete mode 100644 node_modules/html5-qrcode/ui.d.ts delete mode 100644 node_modules/html5-qrcode/ui/scanner/base.d.ts delete mode 100644 node_modules/html5-qrcode/ui/scanner/camera-selection-ui.d.ts delete mode 100644 node_modules/html5-qrcode/ui/scanner/camera-zoom-ui.d.ts delete mode 100644 node_modules/html5-qrcode/ui/scanner/file-selection-ui.d.ts delete mode 100644 node_modules/html5-qrcode/ui/scanner/scan-type-selector.d.ts delete mode 100644 node_modules/html5-qrcode/ui/scanner/torch-button.d.ts delete mode 100644 node_modules/html5-qrcode/utils.d.ts delete mode 100644 node_modules/html5-qrcode/zxing-html5-qrcode-decoder.d.ts delete mode 100644 node_modules/is-binary-path/index.d.ts delete mode 100644 node_modules/is-binary-path/index.js delete mode 100644 node_modules/is-binary-path/license delete mode 100644 node_modules/is-binary-path/package.json delete mode 100644 node_modules/is-binary-path/readme.md delete mode 100644 node_modules/is-core-module/.eslintrc delete mode 100644 node_modules/is-core-module/.nycrc delete mode 100644 node_modules/is-core-module/CHANGELOG.md delete mode 100644 node_modules/is-core-module/LICENSE delete mode 100644 node_modules/is-core-module/README.md delete mode 100644 node_modules/is-core-module/core.json delete mode 100644 node_modules/is-core-module/index.js delete mode 100644 node_modules/is-core-module/package.json delete mode 100644 node_modules/is-core-module/test/index.js delete mode 100644 node_modules/is-extglob/LICENSE delete mode 100644 node_modules/is-extglob/README.md delete mode 100644 node_modules/is-extglob/index.js delete mode 100644 node_modules/is-extglob/package.json delete mode 100644 node_modules/is-fullwidth-code-point/index.d.ts delete mode 100644 node_modules/is-fullwidth-code-point/index.js delete mode 100644 node_modules/is-fullwidth-code-point/license delete mode 100644 node_modules/is-fullwidth-code-point/package.json delete mode 100644 node_modules/is-fullwidth-code-point/readme.md delete mode 100644 node_modules/is-glob/LICENSE delete mode 100644 node_modules/is-glob/README.md delete mode 100644 node_modules/is-glob/index.js delete mode 100644 node_modules/is-glob/package.json delete mode 100644 node_modules/is-number/LICENSE delete mode 100644 node_modules/is-number/README.md delete mode 100644 node_modules/is-number/index.js delete mode 100644 node_modules/is-number/package.json delete mode 100644 node_modules/isexe/.npmignore delete mode 100644 node_modules/isexe/LICENSE delete mode 100644 node_modules/isexe/README.md delete mode 100644 node_modules/isexe/index.js delete mode 100644 node_modules/isexe/mode.js delete mode 100644 node_modules/isexe/package.json delete mode 100644 node_modules/isexe/test/basic.js delete mode 100644 node_modules/isexe/windows.js delete mode 100644 node_modules/jackspeak/LICENSE.md delete mode 100644 node_modules/jackspeak/README.md delete mode 100644 node_modules/jackspeak/dist/commonjs/index.d.ts delete mode 100644 node_modules/jackspeak/dist/commonjs/index.d.ts.map delete mode 100644 node_modules/jackspeak/dist/commonjs/index.js delete mode 100644 node_modules/jackspeak/dist/commonjs/index.js.map delete mode 100644 node_modules/jackspeak/dist/commonjs/package.json delete mode 100644 node_modules/jackspeak/dist/commonjs/parse-args-cjs.cjs.map delete mode 100644 node_modules/jackspeak/dist/commonjs/parse-args-cjs.d.cts.map delete mode 100644 node_modules/jackspeak/dist/commonjs/parse-args.d.ts delete mode 100644 node_modules/jackspeak/dist/commonjs/parse-args.js delete mode 100644 node_modules/jackspeak/dist/esm/index.d.ts delete mode 100644 node_modules/jackspeak/dist/esm/index.d.ts.map delete mode 100644 node_modules/jackspeak/dist/esm/index.js delete mode 100644 node_modules/jackspeak/dist/esm/index.js.map delete mode 100644 node_modules/jackspeak/dist/esm/package.json delete mode 100644 node_modules/jackspeak/dist/esm/parse-args.d.ts delete mode 100644 node_modules/jackspeak/dist/esm/parse-args.d.ts.map delete mode 100644 node_modules/jackspeak/dist/esm/parse-args.js delete mode 100644 node_modules/jackspeak/dist/esm/parse-args.js.map delete mode 100644 node_modules/jackspeak/package.json delete mode 100644 node_modules/lilconfig/LICENSE delete mode 100644 node_modules/lilconfig/package.json delete mode 100644 node_modules/lilconfig/readme.md delete mode 100644 node_modules/lilconfig/src/index.d.ts delete mode 100644 node_modules/lilconfig/src/index.js delete mode 100644 node_modules/lines-and-columns/LICENSE delete mode 100644 node_modules/lines-and-columns/README.md delete mode 100644 node_modules/lines-and-columns/build/index.d.ts delete mode 100644 node_modules/lines-and-columns/build/index.js delete mode 100644 node_modules/lines-and-columns/package.json delete mode 100644 node_modules/locate-path/index.d.ts delete mode 100644 node_modules/locate-path/index.js delete mode 100644 node_modules/locate-path/license delete mode 100644 node_modules/locate-path/package.json delete mode 100644 node_modules/locate-path/readme.md delete mode 100644 node_modules/lru-cache/LICENSE delete mode 100644 node_modules/lru-cache/README.md delete mode 100644 node_modules/lru-cache/dist/commonjs/index.d.ts delete mode 100644 node_modules/lru-cache/dist/commonjs/index.d.ts.map delete mode 100644 node_modules/lru-cache/dist/commonjs/index.js delete mode 100644 node_modules/lru-cache/dist/commonjs/index.js.map delete mode 100644 node_modules/lru-cache/dist/commonjs/index.min.js delete mode 100644 node_modules/lru-cache/dist/commonjs/index.min.js.map delete mode 100644 node_modules/lru-cache/dist/commonjs/package.json delete mode 100644 node_modules/lru-cache/dist/esm/index.d.ts delete mode 100644 node_modules/lru-cache/dist/esm/index.d.ts.map delete mode 100644 node_modules/lru-cache/dist/esm/index.js delete mode 100644 node_modules/lru-cache/dist/esm/index.js.map delete mode 100644 node_modules/lru-cache/dist/esm/index.min.js delete mode 100644 node_modules/lru-cache/dist/esm/index.min.js.map delete mode 100644 node_modules/lru-cache/dist/esm/package.json delete mode 100644 node_modules/lru-cache/package.json delete mode 100644 node_modules/merge2/LICENSE delete mode 100644 node_modules/merge2/README.md delete mode 100644 node_modules/merge2/index.js delete mode 100644 node_modules/merge2/package.json delete mode 100644 node_modules/micromatch/LICENSE delete mode 100644 node_modules/micromatch/README.md delete mode 100644 node_modules/micromatch/index.js delete mode 100644 node_modules/micromatch/package.json delete mode 100644 node_modules/minimatch/LICENSE delete mode 100644 node_modules/minimatch/README.md delete mode 100644 node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts delete mode 100644 node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map delete mode 100644 node_modules/minimatch/dist/commonjs/assert-valid-pattern.js delete mode 100644 node_modules/minimatch/dist/commonjs/assert-valid-pattern.js.map delete mode 100644 node_modules/minimatch/dist/commonjs/ast.d.ts delete mode 100644 node_modules/minimatch/dist/commonjs/ast.d.ts.map delete mode 100644 node_modules/minimatch/dist/commonjs/ast.js delete mode 100644 node_modules/minimatch/dist/commonjs/ast.js.map delete mode 100644 node_modules/minimatch/dist/commonjs/brace-expressions.d.ts delete mode 100644 node_modules/minimatch/dist/commonjs/brace-expressions.d.ts.map delete mode 100644 node_modules/minimatch/dist/commonjs/brace-expressions.js delete mode 100644 node_modules/minimatch/dist/commonjs/brace-expressions.js.map delete mode 100644 node_modules/minimatch/dist/commonjs/escape.d.ts delete mode 100644 node_modules/minimatch/dist/commonjs/escape.d.ts.map delete mode 100644 node_modules/minimatch/dist/commonjs/escape.js delete mode 100644 node_modules/minimatch/dist/commonjs/escape.js.map delete mode 100644 node_modules/minimatch/dist/commonjs/index.d.ts delete mode 100644 node_modules/minimatch/dist/commonjs/index.d.ts.map delete mode 100644 node_modules/minimatch/dist/commonjs/index.js delete mode 100644 node_modules/minimatch/dist/commonjs/index.js.map delete mode 100644 node_modules/minimatch/dist/commonjs/package.json delete mode 100644 node_modules/minimatch/dist/commonjs/unescape.d.ts delete mode 100644 node_modules/minimatch/dist/commonjs/unescape.d.ts.map delete mode 100644 node_modules/minimatch/dist/commonjs/unescape.js delete mode 100644 node_modules/minimatch/dist/commonjs/unescape.js.map delete mode 100644 node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts delete mode 100644 node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts.map delete mode 100644 node_modules/minimatch/dist/esm/assert-valid-pattern.js delete mode 100644 node_modules/minimatch/dist/esm/assert-valid-pattern.js.map delete mode 100644 node_modules/minimatch/dist/esm/ast.d.ts delete mode 100644 node_modules/minimatch/dist/esm/ast.d.ts.map delete mode 100644 node_modules/minimatch/dist/esm/ast.js delete mode 100644 node_modules/minimatch/dist/esm/ast.js.map delete mode 100644 node_modules/minimatch/dist/esm/brace-expressions.d.ts delete mode 100644 node_modules/minimatch/dist/esm/brace-expressions.d.ts.map delete mode 100644 node_modules/minimatch/dist/esm/brace-expressions.js delete mode 100644 node_modules/minimatch/dist/esm/brace-expressions.js.map delete mode 100644 node_modules/minimatch/dist/esm/escape.d.ts delete mode 100644 node_modules/minimatch/dist/esm/escape.d.ts.map delete mode 100644 node_modules/minimatch/dist/esm/escape.js delete mode 100644 node_modules/minimatch/dist/esm/escape.js.map delete mode 100644 node_modules/minimatch/dist/esm/index.d.ts delete mode 100644 node_modules/minimatch/dist/esm/index.d.ts.map delete mode 100644 node_modules/minimatch/dist/esm/index.js delete mode 100644 node_modules/minimatch/dist/esm/index.js.map delete mode 100644 node_modules/minimatch/dist/esm/package.json delete mode 100644 node_modules/minimatch/dist/esm/unescape.d.ts delete mode 100644 node_modules/minimatch/dist/esm/unescape.d.ts.map delete mode 100644 node_modules/minimatch/dist/esm/unescape.js delete mode 100644 node_modules/minimatch/dist/esm/unescape.js.map delete mode 100644 node_modules/minimatch/package.json delete mode 100644 node_modules/minipass/LICENSE delete mode 100644 node_modules/minipass/README.md delete mode 100644 node_modules/minipass/dist/commonjs/index.d.ts delete mode 100644 node_modules/minipass/dist/commonjs/index.d.ts.map delete mode 100644 node_modules/minipass/dist/commonjs/index.js delete mode 100644 node_modules/minipass/dist/commonjs/index.js.map delete mode 100644 node_modules/minipass/dist/commonjs/package.json delete mode 100644 node_modules/minipass/dist/esm/index.d.ts delete mode 100644 node_modules/minipass/dist/esm/index.d.ts.map delete mode 100644 node_modules/minipass/dist/esm/index.js delete mode 100644 node_modules/minipass/dist/esm/index.js.map delete mode 100644 node_modules/minipass/dist/esm/package.json delete mode 100644 node_modules/minipass/package.json delete mode 100644 node_modules/mz/HISTORY.md delete mode 100644 node_modules/mz/LICENSE delete mode 100644 node_modules/mz/README.md delete mode 100644 node_modules/mz/child_process.js delete mode 100644 node_modules/mz/crypto.js delete mode 100644 node_modules/mz/dns.js delete mode 100644 node_modules/mz/fs.js delete mode 100644 node_modules/mz/index.js delete mode 100644 node_modules/mz/package.json delete mode 100644 node_modules/mz/readline.js delete mode 100644 node_modules/mz/zlib.js delete mode 100644 node_modules/nanoid/LICENSE delete mode 100644 node_modules/nanoid/README.md delete mode 100644 node_modules/nanoid/async/index.browser.cjs delete mode 100644 node_modules/nanoid/async/index.browser.js delete mode 100644 node_modules/nanoid/async/index.cjs delete mode 100644 node_modules/nanoid/async/index.d.ts delete mode 100644 node_modules/nanoid/async/index.js delete mode 100644 node_modules/nanoid/async/index.native.js delete mode 100644 node_modules/nanoid/async/package.json delete mode 100644 node_modules/nanoid/bin/nanoid.cjs delete mode 100644 node_modules/nanoid/index.browser.cjs delete mode 100644 node_modules/nanoid/index.browser.js delete mode 100644 node_modules/nanoid/index.cjs delete mode 100644 node_modules/nanoid/index.d.cts delete mode 100644 node_modules/nanoid/index.d.ts delete mode 100644 node_modules/nanoid/index.js delete mode 100644 node_modules/nanoid/nanoid.js delete mode 100644 node_modules/nanoid/non-secure/index.cjs delete mode 100644 node_modules/nanoid/non-secure/index.d.ts delete mode 100644 node_modules/nanoid/non-secure/index.js delete mode 100644 node_modules/nanoid/non-secure/package.json delete mode 100644 node_modules/nanoid/package.json delete mode 100644 node_modules/nanoid/url-alphabet/index.cjs delete mode 100644 node_modules/nanoid/url-alphabet/index.js delete mode 100644 node_modules/nanoid/url-alphabet/package.json delete mode 100644 node_modules/normalize-path/LICENSE delete mode 100644 node_modules/normalize-path/README.md delete mode 100644 node_modules/normalize-path/index.js delete mode 100644 node_modules/normalize-path/package.json delete mode 100644 node_modules/object-assign/index.js delete mode 100644 node_modules/object-assign/license delete mode 100644 node_modules/object-assign/package.json delete mode 100644 node_modules/object-assign/readme.md delete mode 100644 node_modules/object-hash/LICENSE delete mode 100644 node_modules/object-hash/dist/object_hash.js delete mode 100644 node_modules/object-hash/index.js delete mode 100644 node_modules/object-hash/package.json delete mode 100644 node_modules/object-hash/readme.markdown delete mode 100644 node_modules/p-limit/index.d.ts delete mode 100644 node_modules/p-limit/index.js delete mode 100644 node_modules/p-limit/license delete mode 100644 node_modules/p-limit/package.json delete mode 100644 node_modules/p-limit/readme.md delete mode 100644 node_modules/p-locate/index.d.ts delete mode 100644 node_modules/p-locate/index.js delete mode 100644 node_modules/p-locate/license delete mode 100644 node_modules/p-locate/package.json delete mode 100644 node_modules/p-locate/readme.md delete mode 100644 node_modules/p-try/index.d.ts delete mode 100644 node_modules/p-try/index.js delete mode 100644 node_modules/p-try/license delete mode 100644 node_modules/p-try/package.json delete mode 100644 node_modules/p-try/readme.md delete mode 100644 node_modules/package-json-from-dist/LICENSE.md delete mode 100644 node_modules/package-json-from-dist/README.md delete mode 100644 node_modules/package-json-from-dist/dist/commonjs/index.d.ts delete mode 100644 node_modules/package-json-from-dist/dist/commonjs/index.d.ts.map delete mode 100644 node_modules/package-json-from-dist/dist/commonjs/index.js delete mode 100644 node_modules/package-json-from-dist/dist/commonjs/index.js.map delete mode 100644 node_modules/package-json-from-dist/dist/commonjs/package.json delete mode 100644 node_modules/package-json-from-dist/dist/esm/index.d.ts delete mode 100644 node_modules/package-json-from-dist/dist/esm/index.d.ts.map delete mode 100644 node_modules/package-json-from-dist/dist/esm/index.js delete mode 100644 node_modules/package-json-from-dist/dist/esm/index.js.map delete mode 100644 node_modules/package-json-from-dist/dist/esm/package.json delete mode 100644 node_modules/package-json-from-dist/package.json delete mode 100644 node_modules/pako/LICENSE delete mode 100644 node_modules/pako/README.md delete mode 100644 node_modules/pako/dist/pako.es5.js delete mode 100644 node_modules/pako/dist/pako.es5.min.js delete mode 100644 node_modules/pako/dist/pako.esm.mjs delete mode 100644 node_modules/pako/dist/pako.js delete mode 100644 node_modules/pako/dist/pako.min.js delete mode 100644 node_modules/pako/dist/pako_deflate.es5.js delete mode 100644 node_modules/pako/dist/pako_deflate.es5.min.js delete mode 100644 node_modules/pako/dist/pako_deflate.js delete mode 100644 node_modules/pako/dist/pako_deflate.min.js delete mode 100644 node_modules/pako/dist/pako_inflate.es5.js delete mode 100644 node_modules/pako/dist/pako_inflate.es5.min.js delete mode 100644 node_modules/pako/dist/pako_inflate.js delete mode 100644 node_modules/pako/dist/pako_inflate.min.js delete mode 100644 node_modules/pako/index.js delete mode 100644 node_modules/pako/lib/deflate.js delete mode 100644 node_modules/pako/lib/inflate.js delete mode 100644 node_modules/pako/lib/utils/common.js delete mode 100644 node_modules/pako/lib/utils/strings.js delete mode 100644 node_modules/pako/lib/zlib/README delete mode 100644 node_modules/pako/lib/zlib/adler32.js delete mode 100644 node_modules/pako/lib/zlib/constants.js delete mode 100644 node_modules/pako/lib/zlib/crc32.js delete mode 100644 node_modules/pako/lib/zlib/deflate.js delete mode 100644 node_modules/pako/lib/zlib/gzheader.js delete mode 100644 node_modules/pako/lib/zlib/inffast.js delete mode 100644 node_modules/pako/lib/zlib/inflate.js delete mode 100644 node_modules/pako/lib/zlib/inftrees.js delete mode 100644 node_modules/pako/lib/zlib/messages.js delete mode 100644 node_modules/pako/lib/zlib/trees.js delete mode 100644 node_modules/pako/lib/zlib/zstream.js delete mode 100644 node_modules/pako/package.json delete mode 100644 node_modules/path-exists/index.d.ts delete mode 100644 node_modules/path-exists/index.js delete mode 100644 node_modules/path-exists/license delete mode 100644 node_modules/path-exists/package.json delete mode 100644 node_modules/path-exists/readme.md delete mode 100644 node_modules/path-key/index.d.ts delete mode 100644 node_modules/path-key/index.js delete mode 100644 node_modules/path-key/license delete mode 100644 node_modules/path-key/package.json delete mode 100644 node_modules/path-key/readme.md delete mode 100644 node_modules/path-parse/LICENSE delete mode 100644 node_modules/path-parse/README.md delete mode 100644 node_modules/path-parse/index.js delete mode 100644 node_modules/path-parse/package.json delete mode 100644 node_modules/path-scurry/LICENSE.md delete mode 100644 node_modules/path-scurry/README.md delete mode 100644 node_modules/path-scurry/dist/commonjs/index.d.ts delete mode 100644 node_modules/path-scurry/dist/commonjs/index.d.ts.map delete mode 100644 node_modules/path-scurry/dist/commonjs/index.js delete mode 100644 node_modules/path-scurry/dist/commonjs/index.js.map delete mode 100644 node_modules/path-scurry/dist/commonjs/package.json delete mode 100644 node_modules/path-scurry/dist/esm/index.d.ts delete mode 100644 node_modules/path-scurry/dist/esm/index.d.ts.map delete mode 100644 node_modules/path-scurry/dist/esm/index.js delete mode 100644 node_modules/path-scurry/dist/esm/index.js.map delete mode 100644 node_modules/path-scurry/dist/esm/package.json delete mode 100644 node_modules/path-scurry/package.json delete mode 100644 node_modules/picocolors/LICENSE delete mode 100644 node_modules/picocolors/README.md delete mode 100644 node_modules/picocolors/package.json delete mode 100644 node_modules/picocolors/picocolors.browser.js delete mode 100644 node_modules/picocolors/picocolors.d.ts delete mode 100644 node_modules/picocolors/picocolors.js delete mode 100644 node_modules/picocolors/types.d.ts delete mode 100644 node_modules/picomatch/CHANGELOG.md delete mode 100644 node_modules/picomatch/LICENSE delete mode 100644 node_modules/picomatch/README.md delete mode 100644 node_modules/picomatch/index.js delete mode 100644 node_modules/picomatch/lib/constants.js delete mode 100644 node_modules/picomatch/lib/parse.js delete mode 100644 node_modules/picomatch/lib/picomatch.js delete mode 100644 node_modules/picomatch/lib/scan.js delete mode 100644 node_modules/picomatch/lib/utils.js delete mode 100644 node_modules/picomatch/package.json delete mode 100644 node_modules/pify/index.js delete mode 100644 node_modules/pify/license delete mode 100644 node_modules/pify/package.json delete mode 100644 node_modules/pify/readme.md delete mode 100644 node_modules/pirates/LICENSE delete mode 100644 node_modules/pirates/README.md delete mode 100644 node_modules/pirates/index.d.ts delete mode 100644 node_modules/pirates/lib/index.js delete mode 100644 node_modules/pirates/package.json delete mode 100644 node_modules/pngjs/.eslintignore delete mode 100644 node_modules/pngjs/.eslintrc.json delete mode 100644 node_modules/pngjs/.prettierignore delete mode 100644 node_modules/pngjs/LICENSE delete mode 100644 node_modules/pngjs/README.md delete mode 100644 node_modules/pngjs/browser.js delete mode 100644 node_modules/pngjs/coverage/lcov-report/base.css delete mode 100644 node_modules/pngjs/coverage/lcov-report/bitmapper.js.html delete mode 100644 node_modules/pngjs/coverage/lcov-report/bitpacker.js.html delete mode 100644 node_modules/pngjs/coverage/lcov-report/block-navigation.js delete mode 100644 node_modules/pngjs/coverage/lcov-report/chunkstream.js.html delete mode 100644 node_modules/pngjs/coverage/lcov-report/constants.js.html delete mode 100644 node_modules/pngjs/coverage/lcov-report/crc.js.html delete mode 100644 node_modules/pngjs/coverage/lcov-report/favicon.png delete mode 100644 node_modules/pngjs/coverage/lcov-report/filter-pack.js.html delete mode 100644 node_modules/pngjs/coverage/lcov-report/filter-parse-async.js.html delete mode 100644 node_modules/pngjs/coverage/lcov-report/filter-parse-sync.js.html delete mode 100644 node_modules/pngjs/coverage/lcov-report/filter-parse.js.html delete mode 100644 node_modules/pngjs/coverage/lcov-report/format-normaliser.js.html delete mode 100644 node_modules/pngjs/coverage/lcov-report/index.html delete mode 100644 node_modules/pngjs/coverage/lcov-report/interlace.js.html delete mode 100644 node_modules/pngjs/coverage/lcov-report/packer-async.js.html delete mode 100644 node_modules/pngjs/coverage/lcov-report/packer-sync.js.html delete mode 100644 node_modules/pngjs/coverage/lcov-report/packer.js.html delete mode 100644 node_modules/pngjs/coverage/lcov-report/paeth-predictor.js.html delete mode 100644 node_modules/pngjs/coverage/lcov-report/parser-async.js.html delete mode 100644 node_modules/pngjs/coverage/lcov-report/parser-sync.js.html delete mode 100644 node_modules/pngjs/coverage/lcov-report/parser.js.html delete mode 100644 node_modules/pngjs/coverage/lcov-report/png-sync.js.html delete mode 100644 node_modules/pngjs/coverage/lcov-report/png.js.html delete mode 100644 node_modules/pngjs/coverage/lcov-report/prettify.css delete mode 100644 node_modules/pngjs/coverage/lcov-report/prettify.js delete mode 100644 node_modules/pngjs/coverage/lcov-report/sort-arrow-sprite.png delete mode 100644 node_modules/pngjs/coverage/lcov-report/sorter.js delete mode 100644 node_modules/pngjs/coverage/lcov-report/sync-inflate.js.html delete mode 100644 node_modules/pngjs/coverage/lcov-report/sync-reader.js.html delete mode 100644 node_modules/pngjs/coverage/lcov.info delete mode 100644 node_modules/pngjs/lib/bitmapper.js delete mode 100644 node_modules/pngjs/lib/bitpacker.js delete mode 100644 node_modules/pngjs/lib/chunkstream.js delete mode 100644 node_modules/pngjs/lib/constants.js delete mode 100644 node_modules/pngjs/lib/crc.js delete mode 100644 node_modules/pngjs/lib/filter-pack.js delete mode 100644 node_modules/pngjs/lib/filter-parse-async.js delete mode 100644 node_modules/pngjs/lib/filter-parse-sync.js delete mode 100644 node_modules/pngjs/lib/filter-parse.js delete mode 100644 node_modules/pngjs/lib/format-normaliser.js delete mode 100644 node_modules/pngjs/lib/interlace.js delete mode 100644 node_modules/pngjs/lib/packer-async.js delete mode 100644 node_modules/pngjs/lib/packer-sync.js delete mode 100644 node_modules/pngjs/lib/packer.js delete mode 100644 node_modules/pngjs/lib/paeth-predictor.js delete mode 100644 node_modules/pngjs/lib/parser-async.js delete mode 100644 node_modules/pngjs/lib/parser-sync.js delete mode 100644 node_modules/pngjs/lib/parser.js delete mode 100644 node_modules/pngjs/lib/png-sync.js delete mode 100644 node_modules/pngjs/lib/png.js delete mode 100644 node_modules/pngjs/lib/sync-inflate.js delete mode 100644 node_modules/pngjs/lib/sync-reader.js delete mode 100644 node_modules/pngjs/package.json delete mode 100644 node_modules/postcss-import/LICENSE delete mode 100644 node_modules/postcss-import/README.md delete mode 100644 node_modules/postcss-import/index.js delete mode 100644 node_modules/postcss-import/lib/assign-layer-names.js delete mode 100644 node_modules/postcss-import/lib/data-url.js delete mode 100644 node_modules/postcss-import/lib/join-layer.js delete mode 100644 node_modules/postcss-import/lib/join-media.js delete mode 100644 node_modules/postcss-import/lib/load-content.js delete mode 100644 node_modules/postcss-import/lib/parse-statements.js delete mode 100644 node_modules/postcss-import/lib/process-content.js delete mode 100644 node_modules/postcss-import/lib/resolve-id.js delete mode 100644 node_modules/postcss-import/package.json delete mode 100644 node_modules/postcss-js/LICENSE delete mode 100644 node_modules/postcss-js/README.md delete mode 100644 node_modules/postcss-js/async.js delete mode 100644 node_modules/postcss-js/index.js delete mode 100644 node_modules/postcss-js/index.mjs delete mode 100644 node_modules/postcss-js/objectifier.js delete mode 100644 node_modules/postcss-js/package.json delete mode 100644 node_modules/postcss-js/parser.js delete mode 100644 node_modules/postcss-js/process-result.js delete mode 100644 node_modules/postcss-js/sync.js delete mode 100644 node_modules/postcss-load-config/LICENSE delete mode 100644 node_modules/postcss-load-config/README.md delete mode 100644 node_modules/postcss-load-config/package.json delete mode 100644 node_modules/postcss-load-config/src/index.d.ts delete mode 100644 node_modules/postcss-load-config/src/index.js delete mode 100644 node_modules/postcss-load-config/src/options.js delete mode 100644 node_modules/postcss-load-config/src/plugins.js delete mode 100644 node_modules/postcss-load-config/src/req.js delete mode 100644 node_modules/postcss-nested/LICENSE delete mode 100644 node_modules/postcss-nested/README.md delete mode 100644 node_modules/postcss-nested/index.d.ts delete mode 100644 node_modules/postcss-nested/index.js delete mode 100644 node_modules/postcss-nested/package.json delete mode 100644 node_modules/postcss-selector-parser/API.md delete mode 100644 node_modules/postcss-selector-parser/CHANGELOG.md delete mode 100644 node_modules/postcss-selector-parser/LICENSE-MIT delete mode 100644 node_modules/postcss-selector-parser/README.md delete mode 100644 node_modules/postcss-selector-parser/dist/index.js delete mode 100644 node_modules/postcss-selector-parser/dist/parser.js delete mode 100644 node_modules/postcss-selector-parser/dist/processor.js delete mode 100644 node_modules/postcss-selector-parser/dist/selectors/attribute.js delete mode 100644 node_modules/postcss-selector-parser/dist/selectors/className.js delete mode 100644 node_modules/postcss-selector-parser/dist/selectors/combinator.js delete mode 100644 node_modules/postcss-selector-parser/dist/selectors/comment.js delete mode 100644 node_modules/postcss-selector-parser/dist/selectors/constructors.js delete mode 100644 node_modules/postcss-selector-parser/dist/selectors/container.js delete mode 100644 node_modules/postcss-selector-parser/dist/selectors/guards.js delete mode 100644 node_modules/postcss-selector-parser/dist/selectors/id.js delete mode 100644 node_modules/postcss-selector-parser/dist/selectors/index.js delete mode 100644 node_modules/postcss-selector-parser/dist/selectors/namespace.js delete mode 100644 node_modules/postcss-selector-parser/dist/selectors/nesting.js delete mode 100644 node_modules/postcss-selector-parser/dist/selectors/node.js delete mode 100644 node_modules/postcss-selector-parser/dist/selectors/pseudo.js delete mode 100644 node_modules/postcss-selector-parser/dist/selectors/root.js delete mode 100644 node_modules/postcss-selector-parser/dist/selectors/selector.js delete mode 100644 node_modules/postcss-selector-parser/dist/selectors/string.js delete mode 100644 node_modules/postcss-selector-parser/dist/selectors/tag.js delete mode 100644 node_modules/postcss-selector-parser/dist/selectors/types.js delete mode 100644 node_modules/postcss-selector-parser/dist/selectors/universal.js delete mode 100644 node_modules/postcss-selector-parser/dist/sortAscending.js delete mode 100644 node_modules/postcss-selector-parser/dist/tokenTypes.js delete mode 100644 node_modules/postcss-selector-parser/dist/tokenize.js delete mode 100644 node_modules/postcss-selector-parser/dist/util/ensureObject.js delete mode 100644 node_modules/postcss-selector-parser/dist/util/getProp.js delete mode 100644 node_modules/postcss-selector-parser/dist/util/index.js delete mode 100644 node_modules/postcss-selector-parser/dist/util/stripComments.js delete mode 100644 node_modules/postcss-selector-parser/dist/util/unesc.js delete mode 100644 node_modules/postcss-selector-parser/package.json delete mode 100644 node_modules/postcss-selector-parser/postcss-selector-parser.d.ts delete mode 100644 node_modules/postcss-value-parser/LICENSE delete mode 100644 node_modules/postcss-value-parser/README.md delete mode 100644 node_modules/postcss-value-parser/lib/index.d.ts delete mode 100644 node_modules/postcss-value-parser/lib/index.js delete mode 100644 node_modules/postcss-value-parser/lib/parse.js delete mode 100644 node_modules/postcss-value-parser/lib/stringify.js delete mode 100644 node_modules/postcss-value-parser/lib/unit.js delete mode 100644 node_modules/postcss-value-parser/lib/walk.js delete mode 100644 node_modules/postcss-value-parser/package.json delete mode 100644 node_modules/postcss/LICENSE delete mode 100644 node_modules/postcss/README.md delete mode 100644 node_modules/postcss/lib/at-rule.d.ts delete mode 100644 node_modules/postcss/lib/at-rule.js delete mode 100644 node_modules/postcss/lib/comment.d.ts delete mode 100644 node_modules/postcss/lib/comment.js delete mode 100644 node_modules/postcss/lib/container.d.ts delete mode 100644 node_modules/postcss/lib/container.js delete mode 100644 node_modules/postcss/lib/css-syntax-error.d.ts delete mode 100644 node_modules/postcss/lib/css-syntax-error.js delete mode 100644 node_modules/postcss/lib/declaration.d.ts delete mode 100644 node_modules/postcss/lib/declaration.js delete mode 100644 node_modules/postcss/lib/document.d.ts delete mode 100644 node_modules/postcss/lib/document.js delete mode 100644 node_modules/postcss/lib/fromJSON.d.ts delete mode 100644 node_modules/postcss/lib/fromJSON.js delete mode 100644 node_modules/postcss/lib/input.d.ts delete mode 100644 node_modules/postcss/lib/input.js delete mode 100644 node_modules/postcss/lib/lazy-result.d.ts delete mode 100644 node_modules/postcss/lib/lazy-result.js delete mode 100644 node_modules/postcss/lib/list.d.ts delete mode 100644 node_modules/postcss/lib/list.js delete mode 100644 node_modules/postcss/lib/map-generator.js delete mode 100644 node_modules/postcss/lib/no-work-result.d.ts delete mode 100644 node_modules/postcss/lib/no-work-result.js delete mode 100644 node_modules/postcss/lib/node.d.ts delete mode 100644 node_modules/postcss/lib/node.js delete mode 100644 node_modules/postcss/lib/parse.d.ts delete mode 100644 node_modules/postcss/lib/parse.js delete mode 100644 node_modules/postcss/lib/parser.js delete mode 100644 node_modules/postcss/lib/postcss.d.mts delete mode 100644 node_modules/postcss/lib/postcss.d.ts delete mode 100644 node_modules/postcss/lib/postcss.js delete mode 100644 node_modules/postcss/lib/postcss.mjs delete mode 100644 node_modules/postcss/lib/previous-map.d.ts delete mode 100644 node_modules/postcss/lib/previous-map.js delete mode 100644 node_modules/postcss/lib/processor.d.ts delete mode 100644 node_modules/postcss/lib/processor.js delete mode 100644 node_modules/postcss/lib/result.d.ts delete mode 100644 node_modules/postcss/lib/result.js delete mode 100644 node_modules/postcss/lib/root.d.ts delete mode 100644 node_modules/postcss/lib/root.js delete mode 100644 node_modules/postcss/lib/rule.d.ts delete mode 100644 node_modules/postcss/lib/rule.js delete mode 100644 node_modules/postcss/lib/stringifier.d.ts delete mode 100644 node_modules/postcss/lib/stringifier.js delete mode 100644 node_modules/postcss/lib/stringify.d.ts delete mode 100644 node_modules/postcss/lib/stringify.js delete mode 100644 node_modules/postcss/lib/symbols.js delete mode 100644 node_modules/postcss/lib/terminal-highlight.js delete mode 100644 node_modules/postcss/lib/tokenize.js delete mode 100644 node_modules/postcss/lib/warn-once.js delete mode 100644 node_modules/postcss/lib/warning.d.ts delete mode 100644 node_modules/postcss/lib/warning.js delete mode 100644 node_modules/postcss/package.json delete mode 100644 node_modules/qr-scanner/LICENSE delete mode 100644 node_modules/qr-scanner/README.md delete mode 100644 node_modules/qr-scanner/package.json delete mode 100644 node_modules/qr-scanner/qr-scanner-worker.min.js delete mode 100644 node_modules/qr-scanner/qr-scanner-worker.min.js.map delete mode 100644 node_modules/qr-scanner/qr-scanner.legacy.min.js delete mode 100644 node_modules/qr-scanner/qr-scanner.legacy.min.js.map delete mode 100644 node_modules/qr-scanner/qr-scanner.min.js delete mode 100644 node_modules/qr-scanner/qr-scanner.min.js.map delete mode 100644 node_modules/qr-scanner/qr-scanner.umd.min.js delete mode 100644 node_modules/qr-scanner/qr-scanner.umd.min.js.map delete mode 100644 node_modules/qr-scanner/types/qr-scanner.d.ts delete mode 100644 node_modules/qrcode/README.md delete mode 100644 node_modules/qrcode/bin/qrcode delete mode 100644 node_modules/qrcode/helper/to-sjis-browser.js delete mode 100644 node_modules/qrcode/helper/to-sjis.js delete mode 100644 node_modules/qrcode/lib/browser.js delete mode 100644 node_modules/qrcode/lib/can-promise.js delete mode 100644 node_modules/qrcode/lib/core/alignment-pattern.js delete mode 100644 node_modules/qrcode/lib/core/alphanumeric-data.js delete mode 100644 node_modules/qrcode/lib/core/bit-buffer.js delete mode 100644 node_modules/qrcode/lib/core/bit-matrix.js delete mode 100644 node_modules/qrcode/lib/core/byte-data.js delete mode 100644 node_modules/qrcode/lib/core/error-correction-code.js delete mode 100644 node_modules/qrcode/lib/core/error-correction-level.js delete mode 100644 node_modules/qrcode/lib/core/finder-pattern.js delete mode 100644 node_modules/qrcode/lib/core/format-info.js delete mode 100644 node_modules/qrcode/lib/core/galois-field.js delete mode 100644 node_modules/qrcode/lib/core/kanji-data.js delete mode 100644 node_modules/qrcode/lib/core/mask-pattern.js delete mode 100644 node_modules/qrcode/lib/core/mode.js delete mode 100644 node_modules/qrcode/lib/core/numeric-data.js delete mode 100644 node_modules/qrcode/lib/core/polynomial.js delete mode 100644 node_modules/qrcode/lib/core/qrcode.js delete mode 100644 node_modules/qrcode/lib/core/reed-solomon-encoder.js delete mode 100644 node_modules/qrcode/lib/core/regex.js delete mode 100644 node_modules/qrcode/lib/core/segments.js delete mode 100644 node_modules/qrcode/lib/core/utils.js delete mode 100644 node_modules/qrcode/lib/core/version-check.js delete mode 100644 node_modules/qrcode/lib/core/version.js delete mode 100644 node_modules/qrcode/lib/index.js delete mode 100644 node_modules/qrcode/lib/renderer/canvas.js delete mode 100644 node_modules/qrcode/lib/renderer/png.js delete mode 100644 node_modules/qrcode/lib/renderer/svg-tag.js delete mode 100644 node_modules/qrcode/lib/renderer/svg.js delete mode 100644 node_modules/qrcode/lib/renderer/terminal.js delete mode 100644 node_modules/qrcode/lib/renderer/terminal/terminal-small.js delete mode 100644 node_modules/qrcode/lib/renderer/terminal/terminal.js delete mode 100644 node_modules/qrcode/lib/renderer/utf8.js delete mode 100644 node_modules/qrcode/lib/renderer/utils.js delete mode 100644 node_modules/qrcode/lib/server.js delete mode 100644 node_modules/qrcode/license delete mode 100644 node_modules/qrcode/package.json delete mode 100644 node_modules/queue-microtask/LICENSE delete mode 100644 node_modules/queue-microtask/README.md delete mode 100644 node_modules/queue-microtask/index.d.ts delete mode 100644 node_modules/queue-microtask/index.js delete mode 100644 node_modules/queue-microtask/package.json delete mode 100644 node_modules/read-cache/LICENSE delete mode 100644 node_modules/read-cache/README.md delete mode 100644 node_modules/read-cache/index.js delete mode 100644 node_modules/read-cache/package.json delete mode 100644 node_modules/readdirp/LICENSE delete mode 100644 node_modules/readdirp/README.md delete mode 100644 node_modules/readdirp/index.d.ts delete mode 100644 node_modules/readdirp/index.js delete mode 100644 node_modules/readdirp/package.json delete mode 100644 node_modules/require-directory/.jshintrc delete mode 100644 node_modules/require-directory/.npmignore delete mode 100644 node_modules/require-directory/.travis.yml delete mode 100644 node_modules/require-directory/LICENSE delete mode 100644 node_modules/require-directory/README.markdown delete mode 100644 node_modules/require-directory/index.js delete mode 100644 node_modules/require-directory/package.json delete mode 100644 node_modules/require-main-filename/CHANGELOG.md delete mode 100644 node_modules/require-main-filename/LICENSE.txt delete mode 100644 node_modules/require-main-filename/README.md delete mode 100644 node_modules/require-main-filename/index.js delete mode 100644 node_modules/require-main-filename/package.json delete mode 100644 node_modules/resolve/.editorconfig delete mode 100644 node_modules/resolve/.eslintrc delete mode 100644 node_modules/resolve/.github/FUNDING.yml delete mode 100644 node_modules/resolve/LICENSE delete mode 100644 node_modules/resolve/SECURITY.md delete mode 100644 node_modules/resolve/async.js delete mode 100644 node_modules/resolve/bin/resolve delete mode 100644 node_modules/resolve/example/async.js delete mode 100644 node_modules/resolve/example/sync.js delete mode 100644 node_modules/resolve/index.js delete mode 100644 node_modules/resolve/lib/async.js delete mode 100644 node_modules/resolve/lib/caller.js delete mode 100644 node_modules/resolve/lib/core.js delete mode 100644 node_modules/resolve/lib/core.json delete mode 100644 node_modules/resolve/lib/homedir.js delete mode 100644 node_modules/resolve/lib/is-core.js delete mode 100644 node_modules/resolve/lib/node-modules-paths.js delete mode 100644 node_modules/resolve/lib/normalize-options.js delete mode 100644 node_modules/resolve/lib/sync.js delete mode 100644 node_modules/resolve/package.json delete mode 100644 node_modules/resolve/readme.markdown delete mode 100644 node_modules/resolve/sync.js delete mode 100644 node_modules/resolve/test/core.js delete mode 100644 node_modules/resolve/test/dotdot.js delete mode 100644 node_modules/resolve/test/dotdot/abc/index.js delete mode 100644 node_modules/resolve/test/dotdot/index.js delete mode 100644 node_modules/resolve/test/faulty_basedir.js delete mode 100644 node_modules/resolve/test/filter.js delete mode 100644 node_modules/resolve/test/filter_sync.js delete mode 100644 node_modules/resolve/test/home_paths.js delete mode 100644 node_modules/resolve/test/home_paths_sync.js delete mode 100644 node_modules/resolve/test/mock.js delete mode 100644 node_modules/resolve/test/mock_sync.js delete mode 100644 node_modules/resolve/test/module_dir.js delete mode 100644 node_modules/resolve/test/module_dir/xmodules/aaa/index.js delete mode 100644 node_modules/resolve/test/module_dir/ymodules/aaa/index.js delete mode 100644 node_modules/resolve/test/module_dir/zmodules/bbb/main.js delete mode 100644 node_modules/resolve/test/module_dir/zmodules/bbb/package.json delete mode 100644 node_modules/resolve/test/node-modules-paths.js delete mode 100644 node_modules/resolve/test/node_path.js delete mode 100644 node_modules/resolve/test/node_path/x/aaa/index.js delete mode 100644 node_modules/resolve/test/node_path/x/ccc/index.js delete mode 100644 node_modules/resolve/test/node_path/y/bbb/index.js delete mode 100644 node_modules/resolve/test/node_path/y/ccc/index.js delete mode 100644 node_modules/resolve/test/nonstring.js delete mode 100644 node_modules/resolve/test/pathfilter.js delete mode 100644 node_modules/resolve/test/pathfilter/deep_ref/main.js delete mode 100644 node_modules/resolve/test/precedence.js delete mode 100644 node_modules/resolve/test/precedence/aaa.js delete mode 100644 node_modules/resolve/test/precedence/aaa/index.js delete mode 100644 node_modules/resolve/test/precedence/aaa/main.js delete mode 100644 node_modules/resolve/test/precedence/bbb.js delete mode 100644 node_modules/resolve/test/precedence/bbb/main.js delete mode 100644 node_modules/resolve/test/resolver.js delete mode 100644 node_modules/resolve/test/resolver/baz/doom.js delete mode 100644 node_modules/resolve/test/resolver/baz/package.json delete mode 100644 node_modules/resolve/test/resolver/baz/quux.js delete mode 100644 node_modules/resolve/test/resolver/browser_field/a.js delete mode 100644 node_modules/resolve/test/resolver/browser_field/b.js delete mode 100644 node_modules/resolve/test/resolver/browser_field/package.json delete mode 100644 node_modules/resolve/test/resolver/cup.coffee delete mode 100644 node_modules/resolve/test/resolver/dot_main/index.js delete mode 100644 node_modules/resolve/test/resolver/dot_main/package.json delete mode 100644 node_modules/resolve/test/resolver/dot_slash_main/index.js delete mode 100644 node_modules/resolve/test/resolver/dot_slash_main/package.json delete mode 100644 node_modules/resolve/test/resolver/false_main/index.js delete mode 100644 node_modules/resolve/test/resolver/false_main/package.json delete mode 100644 node_modules/resolve/test/resolver/foo.js delete mode 100644 node_modules/resolve/test/resolver/incorrect_main/index.js delete mode 100644 node_modules/resolve/test/resolver/incorrect_main/package.json delete mode 100644 node_modules/resolve/test/resolver/invalid_main/package.json delete mode 100644 node_modules/resolve/test/resolver/mug.coffee delete mode 100644 node_modules/resolve/test/resolver/mug.js delete mode 100644 node_modules/resolve/test/resolver/multirepo/lerna.json delete mode 100644 node_modules/resolve/test/resolver/multirepo/package.json delete mode 100644 node_modules/resolve/test/resolver/multirepo/packages/package-a/index.js delete mode 100644 node_modules/resolve/test/resolver/multirepo/packages/package-a/package.json delete mode 100644 node_modules/resolve/test/resolver/multirepo/packages/package-b/index.js delete mode 100644 node_modules/resolve/test/resolver/multirepo/packages/package-b/package.json delete mode 100644 node_modules/resolve/test/resolver/nested_symlinks/mylib/async.js delete mode 100644 node_modules/resolve/test/resolver/nested_symlinks/mylib/package.json delete mode 100644 node_modules/resolve/test/resolver/nested_symlinks/mylib/sync.js delete mode 100644 node_modules/resolve/test/resolver/other_path/lib/other-lib.js delete mode 100644 node_modules/resolve/test/resolver/other_path/root.js delete mode 100644 node_modules/resolve/test/resolver/quux/foo/index.js delete mode 100644 node_modules/resolve/test/resolver/same_names/foo.js delete mode 100644 node_modules/resolve/test/resolver/same_names/foo/index.js delete mode 100644 node_modules/resolve/test/resolver/symlinked/_/node_modules/foo.js delete mode 100644 node_modules/resolve/test/resolver/symlinked/_/symlink_target/.gitkeep delete mode 100644 node_modules/resolve/test/resolver/symlinked/package/bar.js delete mode 100644 node_modules/resolve/test/resolver/symlinked/package/package.json delete mode 100644 node_modules/resolve/test/resolver/without_basedir/main.js delete mode 100644 node_modules/resolve/test/resolver_sync.js delete mode 100644 node_modules/resolve/test/shadowed_core.js delete mode 100644 node_modules/resolve/test/shadowed_core/node_modules/util/index.js delete mode 100644 node_modules/resolve/test/subdirs.js delete mode 100644 node_modules/resolve/test/symlinks.js delete mode 100644 node_modules/reusify/.github/dependabot.yml delete mode 100644 node_modules/reusify/.github/workflows/ci.yml delete mode 100644 node_modules/reusify/LICENSE delete mode 100644 node_modules/reusify/README.md delete mode 100644 node_modules/reusify/SECURITY.md delete mode 100644 node_modules/reusify/benchmarks/createNoCodeFunction.js delete mode 100644 node_modules/reusify/benchmarks/fib.js delete mode 100644 node_modules/reusify/benchmarks/reuseNoCodeFunction.js delete mode 100644 node_modules/reusify/eslint.config.js delete mode 100644 node_modules/reusify/package.json delete mode 100644 node_modules/reusify/reusify.d.ts delete mode 100644 node_modules/reusify/reusify.js delete mode 100644 node_modules/reusify/test.js delete mode 100644 node_modules/reusify/tsconfig.json delete mode 100644 node_modules/run-parallel/LICENSE delete mode 100644 node_modules/run-parallel/README.md delete mode 100644 node_modules/run-parallel/index.js delete mode 100644 node_modules/run-parallel/package.json delete mode 100644 node_modules/set-blocking/CHANGELOG.md delete mode 100644 node_modules/set-blocking/LICENSE.txt delete mode 100644 node_modules/set-blocking/README.md delete mode 100644 node_modules/set-blocking/index.js delete mode 100644 node_modules/set-blocking/package.json delete mode 100644 node_modules/shebang-command/index.js delete mode 100644 node_modules/shebang-command/license delete mode 100644 node_modules/shebang-command/package.json delete mode 100644 node_modules/shebang-command/readme.md delete mode 100644 node_modules/shebang-regex/index.d.ts delete mode 100644 node_modules/shebang-regex/index.js delete mode 100644 node_modules/shebang-regex/license delete mode 100644 node_modules/shebang-regex/package.json delete mode 100644 node_modules/shebang-regex/readme.md delete mode 100644 node_modules/signal-exit/LICENSE.txt delete mode 100644 node_modules/signal-exit/README.md delete mode 100644 node_modules/signal-exit/dist/cjs/browser.d.ts delete mode 100644 node_modules/signal-exit/dist/cjs/browser.d.ts.map delete mode 100644 node_modules/signal-exit/dist/cjs/browser.js delete mode 100644 node_modules/signal-exit/dist/cjs/browser.js.map delete mode 100644 node_modules/signal-exit/dist/cjs/index.d.ts delete mode 100644 node_modules/signal-exit/dist/cjs/index.d.ts.map delete mode 100644 node_modules/signal-exit/dist/cjs/index.js delete mode 100644 node_modules/signal-exit/dist/cjs/index.js.map delete mode 100644 node_modules/signal-exit/dist/cjs/package.json delete mode 100644 node_modules/signal-exit/dist/cjs/signals.d.ts delete mode 100644 node_modules/signal-exit/dist/cjs/signals.d.ts.map delete mode 100644 node_modules/signal-exit/dist/cjs/signals.js delete mode 100644 node_modules/signal-exit/dist/cjs/signals.js.map delete mode 100644 node_modules/signal-exit/dist/mjs/browser.d.ts delete mode 100644 node_modules/signal-exit/dist/mjs/browser.d.ts.map delete mode 100644 node_modules/signal-exit/dist/mjs/browser.js delete mode 100644 node_modules/signal-exit/dist/mjs/browser.js.map delete mode 100644 node_modules/signal-exit/dist/mjs/index.d.ts delete mode 100644 node_modules/signal-exit/dist/mjs/index.d.ts.map delete mode 100644 node_modules/signal-exit/dist/mjs/index.js delete mode 100644 node_modules/signal-exit/dist/mjs/index.js.map delete mode 100644 node_modules/signal-exit/dist/mjs/package.json delete mode 100644 node_modules/signal-exit/dist/mjs/signals.d.ts delete mode 100644 node_modules/signal-exit/dist/mjs/signals.d.ts.map delete mode 100644 node_modules/signal-exit/dist/mjs/signals.js delete mode 100644 node_modules/signal-exit/dist/mjs/signals.js.map delete mode 100644 node_modules/signal-exit/package.json delete mode 100644 node_modules/source-map-js/LICENSE delete mode 100644 node_modules/source-map-js/README.md delete mode 100644 node_modules/source-map-js/lib/array-set.js delete mode 100644 node_modules/source-map-js/lib/base64-vlq.js delete mode 100644 node_modules/source-map-js/lib/base64.js delete mode 100644 node_modules/source-map-js/lib/binary-search.js delete mode 100644 node_modules/source-map-js/lib/mapping-list.js delete mode 100644 node_modules/source-map-js/lib/quick-sort.js delete mode 100644 node_modules/source-map-js/lib/source-map-consumer.d.ts delete mode 100644 node_modules/source-map-js/lib/source-map-consumer.js delete mode 100644 node_modules/source-map-js/lib/source-map-generator.d.ts delete mode 100644 node_modules/source-map-js/lib/source-map-generator.js delete mode 100644 node_modules/source-map-js/lib/source-node.d.ts delete mode 100644 node_modules/source-map-js/lib/source-node.js delete mode 100644 node_modules/source-map-js/lib/util.js delete mode 100644 node_modules/source-map-js/package.json delete mode 100644 node_modules/source-map-js/source-map.d.ts delete mode 100644 node_modules/source-map-js/source-map.js delete mode 100644 node_modules/string-width-cjs/index.d.ts delete mode 100644 node_modules/string-width-cjs/index.js delete mode 100644 node_modules/string-width-cjs/license delete mode 100644 node_modules/string-width-cjs/package.json delete mode 100644 node_modules/string-width-cjs/readme.md delete mode 100644 node_modules/string-width/index.d.ts delete mode 100644 node_modules/string-width/index.js delete mode 100644 node_modules/string-width/license delete mode 100644 node_modules/string-width/package.json delete mode 100644 node_modules/string-width/readme.md delete mode 100644 node_modules/strip-ansi-cjs/index.d.ts delete mode 100644 node_modules/strip-ansi-cjs/index.js delete mode 100644 node_modules/strip-ansi-cjs/license delete mode 100644 node_modules/strip-ansi-cjs/package.json delete mode 100644 node_modules/strip-ansi-cjs/readme.md delete mode 100644 node_modules/strip-ansi/index.d.ts delete mode 100644 node_modules/strip-ansi/index.js delete mode 100644 node_modules/strip-ansi/license delete mode 100644 node_modules/strip-ansi/package.json delete mode 100644 node_modules/strip-ansi/readme.md delete mode 100644 node_modules/sucrase/LICENSE delete mode 100644 node_modules/sucrase/README.md delete mode 100644 node_modules/sucrase/bin/sucrase delete mode 100644 node_modules/sucrase/bin/sucrase-node delete mode 100644 node_modules/sucrase/dist/CJSImportProcessor.js delete mode 100644 node_modules/sucrase/dist/HelperManager.js delete mode 100644 node_modules/sucrase/dist/NameManager.js delete mode 100644 node_modules/sucrase/dist/Options-gen-types.js delete mode 100644 node_modules/sucrase/dist/Options.js delete mode 100644 node_modules/sucrase/dist/TokenProcessor.js delete mode 100644 node_modules/sucrase/dist/cli.js delete mode 100644 node_modules/sucrase/dist/computeSourceMap.js delete mode 100644 node_modules/sucrase/dist/esm/CJSImportProcessor.js delete mode 100644 node_modules/sucrase/dist/esm/HelperManager.js delete mode 100644 node_modules/sucrase/dist/esm/NameManager.js delete mode 100644 node_modules/sucrase/dist/esm/Options-gen-types.js delete mode 100644 node_modules/sucrase/dist/esm/Options.js delete mode 100644 node_modules/sucrase/dist/esm/TokenProcessor.js delete mode 100644 node_modules/sucrase/dist/esm/cli.js delete mode 100644 node_modules/sucrase/dist/esm/computeSourceMap.js delete mode 100644 node_modules/sucrase/dist/esm/identifyShadowedGlobals.js delete mode 100644 node_modules/sucrase/dist/esm/index.js delete mode 100644 node_modules/sucrase/dist/esm/parser/index.js delete mode 100644 node_modules/sucrase/dist/esm/parser/plugins/flow.js delete mode 100644 node_modules/sucrase/dist/esm/parser/plugins/jsx/index.js delete mode 100644 node_modules/sucrase/dist/esm/parser/plugins/jsx/xhtml.js delete mode 100644 node_modules/sucrase/dist/esm/parser/plugins/types.js delete mode 100644 node_modules/sucrase/dist/esm/parser/plugins/typescript.js delete mode 100644 node_modules/sucrase/dist/esm/parser/tokenizer/index.js delete mode 100644 node_modules/sucrase/dist/esm/parser/tokenizer/keywords.js delete mode 100644 node_modules/sucrase/dist/esm/parser/tokenizer/readWord.js delete mode 100644 node_modules/sucrase/dist/esm/parser/tokenizer/readWordTree.js delete mode 100644 node_modules/sucrase/dist/esm/parser/tokenizer/state.js delete mode 100644 node_modules/sucrase/dist/esm/parser/tokenizer/types.js delete mode 100644 node_modules/sucrase/dist/esm/parser/traverser/base.js delete mode 100644 node_modules/sucrase/dist/esm/parser/traverser/expression.js delete mode 100644 node_modules/sucrase/dist/esm/parser/traverser/index.js delete mode 100644 node_modules/sucrase/dist/esm/parser/traverser/lval.js delete mode 100644 node_modules/sucrase/dist/esm/parser/traverser/statement.js delete mode 100644 node_modules/sucrase/dist/esm/parser/traverser/util.js delete mode 100644 node_modules/sucrase/dist/esm/parser/util/charcodes.js delete mode 100644 node_modules/sucrase/dist/esm/parser/util/identifier.js delete mode 100644 node_modules/sucrase/dist/esm/parser/util/whitespace.js delete mode 100644 node_modules/sucrase/dist/esm/register.js delete mode 100644 node_modules/sucrase/dist/esm/transformers/CJSImportTransformer.js delete mode 100644 node_modules/sucrase/dist/esm/transformers/ESMImportTransformer.js delete mode 100644 node_modules/sucrase/dist/esm/transformers/FlowTransformer.js delete mode 100644 node_modules/sucrase/dist/esm/transformers/JSXTransformer.js delete mode 100644 node_modules/sucrase/dist/esm/transformers/JestHoistTransformer.js delete mode 100644 node_modules/sucrase/dist/esm/transformers/NumericSeparatorTransformer.js delete mode 100644 node_modules/sucrase/dist/esm/transformers/OptionalCatchBindingTransformer.js delete mode 100644 node_modules/sucrase/dist/esm/transformers/OptionalChainingNullishTransformer.js delete mode 100644 node_modules/sucrase/dist/esm/transformers/ReactDisplayNameTransformer.js delete mode 100644 node_modules/sucrase/dist/esm/transformers/ReactHotLoaderTransformer.js delete mode 100644 node_modules/sucrase/dist/esm/transformers/RootTransformer.js delete mode 100644 node_modules/sucrase/dist/esm/transformers/Transformer.js delete mode 100644 node_modules/sucrase/dist/esm/transformers/TypeScriptTransformer.js delete mode 100644 node_modules/sucrase/dist/esm/util/elideImportEquals.js delete mode 100644 node_modules/sucrase/dist/esm/util/formatTokens.js delete mode 100644 node_modules/sucrase/dist/esm/util/getClassInfo.js delete mode 100644 node_modules/sucrase/dist/esm/util/getDeclarationInfo.js delete mode 100644 node_modules/sucrase/dist/esm/util/getIdentifierNames.js delete mode 100644 node_modules/sucrase/dist/esm/util/getImportExportSpecifierInfo.js delete mode 100644 node_modules/sucrase/dist/esm/util/getJSXPragmaInfo.js delete mode 100644 node_modules/sucrase/dist/esm/util/getNonTypeIdentifiers.js delete mode 100644 node_modules/sucrase/dist/esm/util/getTSImportedNames.js delete mode 100644 node_modules/sucrase/dist/esm/util/isAsyncOperation.js delete mode 100644 node_modules/sucrase/dist/esm/util/isExportFrom.js delete mode 100644 node_modules/sucrase/dist/esm/util/isIdentifier.js delete mode 100644 node_modules/sucrase/dist/esm/util/removeMaybeImportAttributes.js delete mode 100644 node_modules/sucrase/dist/esm/util/shouldElideDefaultExport.js delete mode 100644 node_modules/sucrase/dist/identifyShadowedGlobals.js delete mode 100644 node_modules/sucrase/dist/index.js delete mode 100644 node_modules/sucrase/dist/parser/index.js delete mode 100644 node_modules/sucrase/dist/parser/plugins/flow.js delete mode 100644 node_modules/sucrase/dist/parser/plugins/jsx/index.js delete mode 100644 node_modules/sucrase/dist/parser/plugins/jsx/xhtml.js delete mode 100644 node_modules/sucrase/dist/parser/plugins/types.js delete mode 100644 node_modules/sucrase/dist/parser/plugins/typescript.js delete mode 100644 node_modules/sucrase/dist/parser/tokenizer/index.js delete mode 100644 node_modules/sucrase/dist/parser/tokenizer/keywords.js delete mode 100644 node_modules/sucrase/dist/parser/tokenizer/readWord.js delete mode 100644 node_modules/sucrase/dist/parser/tokenizer/readWordTree.js delete mode 100644 node_modules/sucrase/dist/parser/tokenizer/state.js delete mode 100644 node_modules/sucrase/dist/parser/tokenizer/types.js delete mode 100644 node_modules/sucrase/dist/parser/traverser/base.js delete mode 100644 node_modules/sucrase/dist/parser/traverser/expression.js delete mode 100644 node_modules/sucrase/dist/parser/traverser/index.js delete mode 100644 node_modules/sucrase/dist/parser/traverser/lval.js delete mode 100644 node_modules/sucrase/dist/parser/traverser/statement.js delete mode 100644 node_modules/sucrase/dist/parser/traverser/util.js delete mode 100644 node_modules/sucrase/dist/parser/util/charcodes.js delete mode 100644 node_modules/sucrase/dist/parser/util/identifier.js delete mode 100644 node_modules/sucrase/dist/parser/util/whitespace.js delete mode 100644 node_modules/sucrase/dist/register.js delete mode 100644 node_modules/sucrase/dist/transformers/CJSImportTransformer.js delete mode 100644 node_modules/sucrase/dist/transformers/ESMImportTransformer.js delete mode 100644 node_modules/sucrase/dist/transformers/FlowTransformer.js delete mode 100644 node_modules/sucrase/dist/transformers/JSXTransformer.js delete mode 100644 node_modules/sucrase/dist/transformers/JestHoistTransformer.js delete mode 100644 node_modules/sucrase/dist/transformers/NumericSeparatorTransformer.js delete mode 100644 node_modules/sucrase/dist/transformers/OptionalCatchBindingTransformer.js delete mode 100644 node_modules/sucrase/dist/transformers/OptionalChainingNullishTransformer.js delete mode 100644 node_modules/sucrase/dist/transformers/ReactDisplayNameTransformer.js delete mode 100644 node_modules/sucrase/dist/transformers/ReactHotLoaderTransformer.js delete mode 100644 node_modules/sucrase/dist/transformers/RootTransformer.js delete mode 100644 node_modules/sucrase/dist/transformers/Transformer.js delete mode 100644 node_modules/sucrase/dist/transformers/TypeScriptTransformer.js delete mode 100644 node_modules/sucrase/dist/types/CJSImportProcessor.d.ts delete mode 100644 node_modules/sucrase/dist/types/HelperManager.d.ts delete mode 100644 node_modules/sucrase/dist/types/NameManager.d.ts delete mode 100644 node_modules/sucrase/dist/types/Options-gen-types.d.ts delete mode 100644 node_modules/sucrase/dist/types/Options.d.ts delete mode 100644 node_modules/sucrase/dist/types/TokenProcessor.d.ts delete mode 100644 node_modules/sucrase/dist/types/cli.d.ts delete mode 100644 node_modules/sucrase/dist/types/computeSourceMap.d.ts delete mode 100644 node_modules/sucrase/dist/types/identifyShadowedGlobals.d.ts delete mode 100644 node_modules/sucrase/dist/types/index.d.ts delete mode 100644 node_modules/sucrase/dist/types/parser/index.d.ts delete mode 100644 node_modules/sucrase/dist/types/parser/plugins/flow.d.ts delete mode 100644 node_modules/sucrase/dist/types/parser/plugins/jsx/index.d.ts delete mode 100644 node_modules/sucrase/dist/types/parser/plugins/jsx/xhtml.d.ts delete mode 100644 node_modules/sucrase/dist/types/parser/plugins/types.d.ts delete mode 100644 node_modules/sucrase/dist/types/parser/plugins/typescript.d.ts delete mode 100644 node_modules/sucrase/dist/types/parser/tokenizer/index.d.ts delete mode 100644 node_modules/sucrase/dist/types/parser/tokenizer/keywords.d.ts delete mode 100644 node_modules/sucrase/dist/types/parser/tokenizer/readWord.d.ts delete mode 100644 node_modules/sucrase/dist/types/parser/tokenizer/readWordTree.d.ts delete mode 100644 node_modules/sucrase/dist/types/parser/tokenizer/state.d.ts delete mode 100644 node_modules/sucrase/dist/types/parser/tokenizer/types.d.ts delete mode 100644 node_modules/sucrase/dist/types/parser/traverser/base.d.ts delete mode 100644 node_modules/sucrase/dist/types/parser/traverser/expression.d.ts delete mode 100644 node_modules/sucrase/dist/types/parser/traverser/index.d.ts delete mode 100644 node_modules/sucrase/dist/types/parser/traverser/lval.d.ts delete mode 100644 node_modules/sucrase/dist/types/parser/traverser/statement.d.ts delete mode 100644 node_modules/sucrase/dist/types/parser/traverser/util.d.ts delete mode 100644 node_modules/sucrase/dist/types/parser/util/charcodes.d.ts delete mode 100644 node_modules/sucrase/dist/types/parser/util/identifier.d.ts delete mode 100644 node_modules/sucrase/dist/types/parser/util/whitespace.d.ts delete mode 100644 node_modules/sucrase/dist/types/register.d.ts delete mode 100644 node_modules/sucrase/dist/types/transformers/CJSImportTransformer.d.ts delete mode 100644 node_modules/sucrase/dist/types/transformers/ESMImportTransformer.d.ts delete mode 100644 node_modules/sucrase/dist/types/transformers/FlowTransformer.d.ts delete mode 100644 node_modules/sucrase/dist/types/transformers/JSXTransformer.d.ts delete mode 100644 node_modules/sucrase/dist/types/transformers/JestHoistTransformer.d.ts delete mode 100644 node_modules/sucrase/dist/types/transformers/NumericSeparatorTransformer.d.ts delete mode 100644 node_modules/sucrase/dist/types/transformers/OptionalCatchBindingTransformer.d.ts delete mode 100644 node_modules/sucrase/dist/types/transformers/OptionalChainingNullishTransformer.d.ts delete mode 100644 node_modules/sucrase/dist/types/transformers/ReactDisplayNameTransformer.d.ts delete mode 100644 node_modules/sucrase/dist/types/transformers/ReactHotLoaderTransformer.d.ts delete mode 100644 node_modules/sucrase/dist/types/transformers/RootTransformer.d.ts delete mode 100644 node_modules/sucrase/dist/types/transformers/Transformer.d.ts delete mode 100644 node_modules/sucrase/dist/types/transformers/TypeScriptTransformer.d.ts delete mode 100644 node_modules/sucrase/dist/types/util/elideImportEquals.d.ts delete mode 100644 node_modules/sucrase/dist/types/util/formatTokens.d.ts delete mode 100644 node_modules/sucrase/dist/types/util/getClassInfo.d.ts delete mode 100644 node_modules/sucrase/dist/types/util/getDeclarationInfo.d.ts delete mode 100644 node_modules/sucrase/dist/types/util/getIdentifierNames.d.ts delete mode 100644 node_modules/sucrase/dist/types/util/getImportExportSpecifierInfo.d.ts delete mode 100644 node_modules/sucrase/dist/types/util/getJSXPragmaInfo.d.ts delete mode 100644 node_modules/sucrase/dist/types/util/getNonTypeIdentifiers.d.ts delete mode 100644 node_modules/sucrase/dist/types/util/getTSImportedNames.d.ts delete mode 100644 node_modules/sucrase/dist/types/util/isAsyncOperation.d.ts delete mode 100644 node_modules/sucrase/dist/types/util/isExportFrom.d.ts delete mode 100644 node_modules/sucrase/dist/types/util/isIdentifier.d.ts delete mode 100644 node_modules/sucrase/dist/types/util/removeMaybeImportAttributes.d.ts delete mode 100644 node_modules/sucrase/dist/types/util/shouldElideDefaultExport.d.ts delete mode 100644 node_modules/sucrase/dist/util/elideImportEquals.js delete mode 100644 node_modules/sucrase/dist/util/formatTokens.js delete mode 100644 node_modules/sucrase/dist/util/getClassInfo.js delete mode 100644 node_modules/sucrase/dist/util/getDeclarationInfo.js delete mode 100644 node_modules/sucrase/dist/util/getIdentifierNames.js delete mode 100644 node_modules/sucrase/dist/util/getImportExportSpecifierInfo.js delete mode 100644 node_modules/sucrase/dist/util/getJSXPragmaInfo.js delete mode 100644 node_modules/sucrase/dist/util/getNonTypeIdentifiers.js delete mode 100644 node_modules/sucrase/dist/util/getTSImportedNames.js delete mode 100644 node_modules/sucrase/dist/util/isAsyncOperation.js delete mode 100644 node_modules/sucrase/dist/util/isExportFrom.js delete mode 100644 node_modules/sucrase/dist/util/isIdentifier.js delete mode 100644 node_modules/sucrase/dist/util/removeMaybeImportAttributes.js delete mode 100644 node_modules/sucrase/dist/util/shouldElideDefaultExport.js delete mode 100644 node_modules/sucrase/package.json delete mode 100644 node_modules/sucrase/register/index.js delete mode 100644 node_modules/sucrase/register/js.js delete mode 100644 node_modules/sucrase/register/jsx.js delete mode 100644 node_modules/sucrase/register/ts-legacy-module-interop.js delete mode 100644 node_modules/sucrase/register/ts.js delete mode 100644 node_modules/sucrase/register/tsx-legacy-module-interop.js delete mode 100644 node_modules/sucrase/register/tsx.js delete mode 100644 node_modules/sucrase/ts-node-plugin/index.js delete mode 100644 node_modules/supports-preserve-symlinks-flag/.eslintrc delete mode 100644 node_modules/supports-preserve-symlinks-flag/.github/FUNDING.yml delete mode 100644 node_modules/supports-preserve-symlinks-flag/.nycrc delete mode 100644 node_modules/supports-preserve-symlinks-flag/CHANGELOG.md delete mode 100644 node_modules/supports-preserve-symlinks-flag/LICENSE delete mode 100644 node_modules/supports-preserve-symlinks-flag/README.md delete mode 100644 node_modules/supports-preserve-symlinks-flag/browser.js delete mode 100644 node_modules/supports-preserve-symlinks-flag/index.js delete mode 100644 node_modules/supports-preserve-symlinks-flag/package.json delete mode 100644 node_modules/supports-preserve-symlinks-flag/test/index.js delete mode 100644 node_modules/tailwindcss/CHANGELOG.md delete mode 100644 node_modules/tailwindcss/LICENSE delete mode 100644 node_modules/tailwindcss/README.md delete mode 100644 node_modules/tailwindcss/base.css delete mode 100644 node_modules/tailwindcss/colors.d.ts delete mode 100644 node_modules/tailwindcss/colors.js delete mode 100644 node_modules/tailwindcss/components.css delete mode 100644 node_modules/tailwindcss/defaultConfig.d.ts delete mode 100644 node_modules/tailwindcss/defaultConfig.js delete mode 100644 node_modules/tailwindcss/defaultTheme.d.ts delete mode 100644 node_modules/tailwindcss/defaultTheme.js delete mode 100644 node_modules/tailwindcss/lib/cli-peer-dependencies.js delete mode 100644 node_modules/tailwindcss/lib/cli.js delete mode 100644 node_modules/tailwindcss/lib/cli/build/deps.js delete mode 100644 node_modules/tailwindcss/lib/cli/build/index.js delete mode 100644 node_modules/tailwindcss/lib/cli/build/plugin.js delete mode 100644 node_modules/tailwindcss/lib/cli/build/utils.js delete mode 100644 node_modules/tailwindcss/lib/cli/build/watching.js delete mode 100644 node_modules/tailwindcss/lib/cli/help/index.js delete mode 100644 node_modules/tailwindcss/lib/cli/index.js delete mode 100644 node_modules/tailwindcss/lib/cli/init/index.js delete mode 100644 node_modules/tailwindcss/lib/corePluginList.js delete mode 100644 node_modules/tailwindcss/lib/corePlugins.js delete mode 100644 node_modules/tailwindcss/lib/css/LICENSE delete mode 100644 node_modules/tailwindcss/lib/css/preflight.css delete mode 100644 node_modules/tailwindcss/lib/featureFlags.js delete mode 100644 node_modules/tailwindcss/lib/index.js delete mode 100644 node_modules/tailwindcss/lib/lib/cacheInvalidation.js delete mode 100644 node_modules/tailwindcss/lib/lib/collapseAdjacentRules.js delete mode 100644 node_modules/tailwindcss/lib/lib/collapseDuplicateDeclarations.js delete mode 100644 node_modules/tailwindcss/lib/lib/content.js delete mode 100644 node_modules/tailwindcss/lib/lib/defaultExtractor.js delete mode 100644 node_modules/tailwindcss/lib/lib/evaluateTailwindFunctions.js delete mode 100644 node_modules/tailwindcss/lib/lib/expandApplyAtRules.js delete mode 100644 node_modules/tailwindcss/lib/lib/expandTailwindAtRules.js delete mode 100644 node_modules/tailwindcss/lib/lib/findAtConfigPath.js delete mode 100644 node_modules/tailwindcss/lib/lib/generateRules.js delete mode 100644 node_modules/tailwindcss/lib/lib/getModuleDependencies.js delete mode 100644 node_modules/tailwindcss/lib/lib/load-config.js delete mode 100644 node_modules/tailwindcss/lib/lib/normalizeTailwindDirectives.js delete mode 100644 node_modules/tailwindcss/lib/lib/offsets.js delete mode 100644 node_modules/tailwindcss/lib/lib/partitionApplyAtRules.js delete mode 100644 node_modules/tailwindcss/lib/lib/regex.js delete mode 100644 node_modules/tailwindcss/lib/lib/remap-bitfield.js delete mode 100644 node_modules/tailwindcss/lib/lib/resolveDefaultsAtRules.js delete mode 100644 node_modules/tailwindcss/lib/lib/setupContextUtils.js delete mode 100644 node_modules/tailwindcss/lib/lib/setupTrackingContext.js delete mode 100644 node_modules/tailwindcss/lib/lib/sharedState.js delete mode 100644 node_modules/tailwindcss/lib/lib/substituteScreenAtRules.js delete mode 100644 node_modules/tailwindcss/lib/plugin.js delete mode 100644 node_modules/tailwindcss/lib/postcss-plugins/nesting/README.md delete mode 100644 node_modules/tailwindcss/lib/postcss-plugins/nesting/index.js delete mode 100644 node_modules/tailwindcss/lib/postcss-plugins/nesting/plugin.js delete mode 100644 node_modules/tailwindcss/lib/processTailwindFeatures.js delete mode 100644 node_modules/tailwindcss/lib/public/colors.js delete mode 100644 node_modules/tailwindcss/lib/public/create-plugin.js delete mode 100644 node_modules/tailwindcss/lib/public/default-config.js delete mode 100644 node_modules/tailwindcss/lib/public/default-theme.js delete mode 100644 node_modules/tailwindcss/lib/public/load-config.js delete mode 100644 node_modules/tailwindcss/lib/public/resolve-config.js delete mode 100644 node_modules/tailwindcss/lib/util/applyImportantSelector.js delete mode 100644 node_modules/tailwindcss/lib/util/bigSign.js delete mode 100644 node_modules/tailwindcss/lib/util/buildMediaQuery.js delete mode 100644 node_modules/tailwindcss/lib/util/cloneDeep.js delete mode 100644 node_modules/tailwindcss/lib/util/cloneNodes.js delete mode 100644 node_modules/tailwindcss/lib/util/color.js delete mode 100644 node_modules/tailwindcss/lib/util/colorNames.js delete mode 100644 node_modules/tailwindcss/lib/util/configurePlugins.js delete mode 100644 node_modules/tailwindcss/lib/util/createPlugin.js delete mode 100644 node_modules/tailwindcss/lib/util/createUtilityPlugin.js delete mode 100644 node_modules/tailwindcss/lib/util/dataTypes.js delete mode 100644 node_modules/tailwindcss/lib/util/defaults.js delete mode 100644 node_modules/tailwindcss/lib/util/escapeClassName.js delete mode 100644 node_modules/tailwindcss/lib/util/escapeCommas.js delete mode 100644 node_modules/tailwindcss/lib/util/flattenColorPalette.js delete mode 100644 node_modules/tailwindcss/lib/util/formatVariantSelector.js delete mode 100644 node_modules/tailwindcss/lib/util/getAllConfigs.js delete mode 100644 node_modules/tailwindcss/lib/util/hashConfig.js delete mode 100644 node_modules/tailwindcss/lib/util/isKeyframeRule.js delete mode 100644 node_modules/tailwindcss/lib/util/isPlainObject.js delete mode 100644 node_modules/tailwindcss/lib/util/isSyntacticallyValidPropertyValue.js delete mode 100644 node_modules/tailwindcss/lib/util/log.js delete mode 100644 node_modules/tailwindcss/lib/util/nameClass.js delete mode 100644 node_modules/tailwindcss/lib/util/negateValue.js delete mode 100644 node_modules/tailwindcss/lib/util/normalizeConfig.js delete mode 100644 node_modules/tailwindcss/lib/util/normalizeScreens.js delete mode 100644 node_modules/tailwindcss/lib/util/parseAnimationValue.js delete mode 100644 node_modules/tailwindcss/lib/util/parseBoxShadowValue.js delete mode 100644 node_modules/tailwindcss/lib/util/parseDependency.js delete mode 100644 node_modules/tailwindcss/lib/util/parseGlob.js delete mode 100644 node_modules/tailwindcss/lib/util/parseObjectStyles.js delete mode 100644 node_modules/tailwindcss/lib/util/pluginUtils.js delete mode 100644 node_modules/tailwindcss/lib/util/prefixSelector.js delete mode 100644 node_modules/tailwindcss/lib/util/pseudoElements.js delete mode 100644 node_modules/tailwindcss/lib/util/removeAlphaVariables.js delete mode 100644 node_modules/tailwindcss/lib/util/resolveConfig.js delete mode 100644 node_modules/tailwindcss/lib/util/resolveConfigPath.js delete mode 100644 node_modules/tailwindcss/lib/util/responsive.js delete mode 100644 node_modules/tailwindcss/lib/util/splitAtTopLevelOnly.js delete mode 100644 node_modules/tailwindcss/lib/util/tap.js delete mode 100644 node_modules/tailwindcss/lib/util/toColorValue.js delete mode 100644 node_modules/tailwindcss/lib/util/toPath.js delete mode 100644 node_modules/tailwindcss/lib/util/transformThemeValue.js delete mode 100644 node_modules/tailwindcss/lib/util/validateConfig.js delete mode 100644 node_modules/tailwindcss/lib/util/validateFormalSyntax.js delete mode 100644 node_modules/tailwindcss/lib/util/withAlphaVariable.js delete mode 100644 node_modules/tailwindcss/lib/value-parser/LICENSE delete mode 100644 node_modules/tailwindcss/lib/value-parser/README.md delete mode 100644 node_modules/tailwindcss/lib/value-parser/index.d.js delete mode 100644 node_modules/tailwindcss/lib/value-parser/index.js delete mode 100644 node_modules/tailwindcss/lib/value-parser/parse.js delete mode 100644 node_modules/tailwindcss/lib/value-parser/stringify.js delete mode 100644 node_modules/tailwindcss/lib/value-parser/unit.js delete mode 100644 node_modules/tailwindcss/lib/value-parser/walk.js delete mode 100644 node_modules/tailwindcss/loadConfig.d.ts delete mode 100644 node_modules/tailwindcss/loadConfig.js delete mode 100644 node_modules/tailwindcss/nesting/index.d.ts delete mode 100644 node_modules/tailwindcss/nesting/index.js delete mode 100644 node_modules/tailwindcss/node_modules/.bin/jiti delete mode 100644 node_modules/tailwindcss/node_modules/.bin/jiti.cmd delete mode 100644 node_modules/tailwindcss/node_modules/.bin/jiti.ps1 delete mode 100644 node_modules/tailwindcss/node_modules/jiti/LICENSE delete mode 100644 node_modules/tailwindcss/node_modules/jiti/README.md delete mode 100644 node_modules/tailwindcss/node_modules/jiti/bin/jiti.js delete mode 100644 node_modules/tailwindcss/node_modules/jiti/dist/babel.d.ts delete mode 100644 node_modules/tailwindcss/node_modules/jiti/dist/babel.js delete mode 100644 node_modules/tailwindcss/node_modules/jiti/dist/jiti.d.ts delete mode 100644 node_modules/tailwindcss/node_modules/jiti/dist/jiti.js delete mode 100644 node_modules/tailwindcss/node_modules/jiti/dist/plugins/babel-plugin-transform-import-meta.d.ts delete mode 100644 node_modules/tailwindcss/node_modules/jiti/dist/plugins/import-meta-env.d.ts delete mode 100644 node_modules/tailwindcss/node_modules/jiti/dist/types.d.ts delete mode 100644 node_modules/tailwindcss/node_modules/jiti/dist/utils.d.ts delete mode 100644 node_modules/tailwindcss/node_modules/jiti/lib/index.js delete mode 100644 node_modules/tailwindcss/node_modules/jiti/package.json delete mode 100644 node_modules/tailwindcss/node_modules/jiti/register.js delete mode 100644 node_modules/tailwindcss/package.json delete mode 100644 node_modules/tailwindcss/peers/index.js delete mode 100644 node_modules/tailwindcss/plugin.d.ts delete mode 100644 node_modules/tailwindcss/plugin.js delete mode 100644 node_modules/tailwindcss/prettier.config.js delete mode 100644 node_modules/tailwindcss/resolveConfig.d.ts delete mode 100644 node_modules/tailwindcss/resolveConfig.js delete mode 100644 node_modules/tailwindcss/screens.css delete mode 100644 node_modules/tailwindcss/scripts/create-plugin-list.js delete mode 100644 node_modules/tailwindcss/scripts/generate-types.js delete mode 100644 node_modules/tailwindcss/scripts/release-channel.js delete mode 100644 node_modules/tailwindcss/scripts/release-notes.js delete mode 100644 node_modules/tailwindcss/scripts/type-utils.js delete mode 100644 node_modules/tailwindcss/src/cli-peer-dependencies.js delete mode 100644 node_modules/tailwindcss/src/cli.js delete mode 100644 node_modules/tailwindcss/src/cli/build/deps.js delete mode 100644 node_modules/tailwindcss/src/cli/build/index.js delete mode 100644 node_modules/tailwindcss/src/cli/build/plugin.js delete mode 100644 node_modules/tailwindcss/src/cli/build/utils.js delete mode 100644 node_modules/tailwindcss/src/cli/build/watching.js delete mode 100644 node_modules/tailwindcss/src/cli/help/index.js delete mode 100644 node_modules/tailwindcss/src/cli/index.js delete mode 100644 node_modules/tailwindcss/src/cli/init/index.js delete mode 100644 node_modules/tailwindcss/src/corePluginList.js delete mode 100644 node_modules/tailwindcss/src/corePlugins.js delete mode 100644 node_modules/tailwindcss/src/css/LICENSE delete mode 100644 node_modules/tailwindcss/src/css/preflight.css delete mode 100644 node_modules/tailwindcss/src/featureFlags.js delete mode 100644 node_modules/tailwindcss/src/index.js delete mode 100644 node_modules/tailwindcss/src/lib/cacheInvalidation.js delete mode 100644 node_modules/tailwindcss/src/lib/collapseAdjacentRules.js delete mode 100644 node_modules/tailwindcss/src/lib/collapseDuplicateDeclarations.js delete mode 100644 node_modules/tailwindcss/src/lib/content.js delete mode 100644 node_modules/tailwindcss/src/lib/defaultExtractor.js delete mode 100644 node_modules/tailwindcss/src/lib/evaluateTailwindFunctions.js delete mode 100644 node_modules/tailwindcss/src/lib/expandApplyAtRules.js delete mode 100644 node_modules/tailwindcss/src/lib/expandTailwindAtRules.js delete mode 100644 node_modules/tailwindcss/src/lib/findAtConfigPath.js delete mode 100644 node_modules/tailwindcss/src/lib/generateRules.js delete mode 100644 node_modules/tailwindcss/src/lib/getModuleDependencies.js delete mode 100644 node_modules/tailwindcss/src/lib/load-config.ts delete mode 100644 node_modules/tailwindcss/src/lib/normalizeTailwindDirectives.js delete mode 100644 node_modules/tailwindcss/src/lib/offsets.js delete mode 100644 node_modules/tailwindcss/src/lib/partitionApplyAtRules.js delete mode 100644 node_modules/tailwindcss/src/lib/regex.js delete mode 100644 node_modules/tailwindcss/src/lib/remap-bitfield.js delete mode 100644 node_modules/tailwindcss/src/lib/resolveDefaultsAtRules.js delete mode 100644 node_modules/tailwindcss/src/lib/setupContextUtils.js delete mode 100644 node_modules/tailwindcss/src/lib/setupTrackingContext.js delete mode 100644 node_modules/tailwindcss/src/lib/sharedState.js delete mode 100644 node_modules/tailwindcss/src/lib/substituteScreenAtRules.js delete mode 100644 node_modules/tailwindcss/src/plugin.js delete mode 100644 node_modules/tailwindcss/src/postcss-plugins/nesting/README.md delete mode 100644 node_modules/tailwindcss/src/postcss-plugins/nesting/index.js delete mode 100644 node_modules/tailwindcss/src/postcss-plugins/nesting/plugin.js delete mode 100644 node_modules/tailwindcss/src/processTailwindFeatures.js delete mode 100644 node_modules/tailwindcss/src/public/colors.js delete mode 100644 node_modules/tailwindcss/src/public/create-plugin.js delete mode 100644 node_modules/tailwindcss/src/public/default-config.js delete mode 100644 node_modules/tailwindcss/src/public/default-theme.js delete mode 100644 node_modules/tailwindcss/src/public/load-config.js delete mode 100644 node_modules/tailwindcss/src/public/resolve-config.js delete mode 100644 node_modules/tailwindcss/src/util/applyImportantSelector.js delete mode 100644 node_modules/tailwindcss/src/util/bigSign.js delete mode 100644 node_modules/tailwindcss/src/util/buildMediaQuery.js delete mode 100644 node_modules/tailwindcss/src/util/cloneDeep.js delete mode 100644 node_modules/tailwindcss/src/util/cloneNodes.js delete mode 100644 node_modules/tailwindcss/src/util/color.js delete mode 100644 node_modules/tailwindcss/src/util/colorNames.js delete mode 100644 node_modules/tailwindcss/src/util/configurePlugins.js delete mode 100644 node_modules/tailwindcss/src/util/createPlugin.js delete mode 100644 node_modules/tailwindcss/src/util/createUtilityPlugin.js delete mode 100644 node_modules/tailwindcss/src/util/dataTypes.js delete mode 100644 node_modules/tailwindcss/src/util/defaults.js delete mode 100644 node_modules/tailwindcss/src/util/escapeClassName.js delete mode 100644 node_modules/tailwindcss/src/util/escapeCommas.js delete mode 100644 node_modules/tailwindcss/src/util/flattenColorPalette.js delete mode 100644 node_modules/tailwindcss/src/util/formatVariantSelector.js delete mode 100644 node_modules/tailwindcss/src/util/getAllConfigs.js delete mode 100644 node_modules/tailwindcss/src/util/hashConfig.js delete mode 100644 node_modules/tailwindcss/src/util/isKeyframeRule.js delete mode 100644 node_modules/tailwindcss/src/util/isPlainObject.js delete mode 100644 node_modules/tailwindcss/src/util/isSyntacticallyValidPropertyValue.js delete mode 100644 node_modules/tailwindcss/src/util/log.js delete mode 100644 node_modules/tailwindcss/src/util/nameClass.js delete mode 100644 node_modules/tailwindcss/src/util/negateValue.js delete mode 100644 node_modules/tailwindcss/src/util/normalizeConfig.js delete mode 100644 node_modules/tailwindcss/src/util/normalizeScreens.js delete mode 100644 node_modules/tailwindcss/src/util/parseAnimationValue.js delete mode 100644 node_modules/tailwindcss/src/util/parseBoxShadowValue.js delete mode 100644 node_modules/tailwindcss/src/util/parseDependency.js delete mode 100644 node_modules/tailwindcss/src/util/parseGlob.js delete mode 100644 node_modules/tailwindcss/src/util/parseObjectStyles.js delete mode 100644 node_modules/tailwindcss/src/util/pluginUtils.js delete mode 100644 node_modules/tailwindcss/src/util/prefixSelector.js delete mode 100644 node_modules/tailwindcss/src/util/pseudoElements.js delete mode 100644 node_modules/tailwindcss/src/util/removeAlphaVariables.js delete mode 100644 node_modules/tailwindcss/src/util/resolveConfig.js delete mode 100644 node_modules/tailwindcss/src/util/resolveConfigPath.js delete mode 100644 node_modules/tailwindcss/src/util/responsive.js delete mode 100644 node_modules/tailwindcss/src/util/splitAtTopLevelOnly.js delete mode 100644 node_modules/tailwindcss/src/util/tap.js delete mode 100644 node_modules/tailwindcss/src/util/toColorValue.js delete mode 100644 node_modules/tailwindcss/src/util/toPath.js delete mode 100644 node_modules/tailwindcss/src/util/transformThemeValue.js delete mode 100644 node_modules/tailwindcss/src/util/validateConfig.js delete mode 100644 node_modules/tailwindcss/src/util/validateFormalSyntax.js delete mode 100644 node_modules/tailwindcss/src/util/withAlphaVariable.js delete mode 100644 node_modules/tailwindcss/src/value-parser/LICENSE delete mode 100644 node_modules/tailwindcss/src/value-parser/README.md delete mode 100644 node_modules/tailwindcss/src/value-parser/index.d.ts delete mode 100644 node_modules/tailwindcss/src/value-parser/index.js delete mode 100644 node_modules/tailwindcss/src/value-parser/parse.js delete mode 100644 node_modules/tailwindcss/src/value-parser/stringify.js delete mode 100644 node_modules/tailwindcss/src/value-parser/unit.js delete mode 100644 node_modules/tailwindcss/src/value-parser/walk.js delete mode 100644 node_modules/tailwindcss/stubs/.npmignore delete mode 100644 node_modules/tailwindcss/stubs/.prettierrc.json delete mode 100644 node_modules/tailwindcss/stubs/config.full.js delete mode 100644 node_modules/tailwindcss/stubs/config.simple.js delete mode 100644 node_modules/tailwindcss/stubs/postcss.config.cjs delete mode 100644 node_modules/tailwindcss/stubs/postcss.config.js delete mode 100644 node_modules/tailwindcss/stubs/tailwind.config.cjs delete mode 100644 node_modules/tailwindcss/stubs/tailwind.config.js delete mode 100644 node_modules/tailwindcss/stubs/tailwind.config.ts delete mode 100644 node_modules/tailwindcss/tailwind.css delete mode 100644 node_modules/tailwindcss/types/config.d.ts delete mode 100644 node_modules/tailwindcss/types/generated/.gitkeep delete mode 100644 node_modules/tailwindcss/types/generated/colors.d.ts delete mode 100644 node_modules/tailwindcss/types/generated/corePluginList.d.ts delete mode 100644 node_modules/tailwindcss/types/generated/default-theme.d.ts delete mode 100644 node_modules/tailwindcss/types/index.d.ts delete mode 100644 node_modules/tailwindcss/utilities.css delete mode 100644 node_modules/tailwindcss/variants.css delete mode 100644 node_modules/thenify-all/History.md delete mode 100644 node_modules/thenify-all/LICENSE delete mode 100644 node_modules/thenify-all/README.md delete mode 100644 node_modules/thenify-all/index.js delete mode 100644 node_modules/thenify-all/package.json delete mode 100644 node_modules/thenify/History.md delete mode 100644 node_modules/thenify/LICENSE delete mode 100644 node_modules/thenify/README.md delete mode 100644 node_modules/thenify/index.js delete mode 100644 node_modules/thenify/package.json delete mode 100644 node_modules/to-regex-range/LICENSE delete mode 100644 node_modules/to-regex-range/README.md delete mode 100644 node_modules/to-regex-range/index.js delete mode 100644 node_modules/to-regex-range/package.json delete mode 100644 node_modules/ts-interface-checker/LICENSE delete mode 100644 node_modules/ts-interface-checker/README.md delete mode 100644 node_modules/ts-interface-checker/dist/index.d.ts delete mode 100644 node_modules/ts-interface-checker/dist/index.js delete mode 100644 node_modules/ts-interface-checker/dist/types.d.ts delete mode 100644 node_modules/ts-interface-checker/dist/types.js delete mode 100644 node_modules/ts-interface-checker/dist/util.d.ts delete mode 100644 node_modules/ts-interface-checker/dist/util.js delete mode 100644 node_modules/ts-interface-checker/package.json delete mode 100644 node_modules/util-deprecate/History.md delete mode 100644 node_modules/util-deprecate/LICENSE delete mode 100644 node_modules/util-deprecate/README.md delete mode 100644 node_modules/util-deprecate/browser.js delete mode 100644 node_modules/util-deprecate/node.js delete mode 100644 node_modules/util-deprecate/package.json delete mode 100644 node_modules/which-module/LICENSE delete mode 100644 node_modules/which-module/README.md delete mode 100644 node_modules/which-module/index.js delete mode 100644 node_modules/which-module/package.json delete mode 100644 node_modules/which/CHANGELOG.md delete mode 100644 node_modules/which/LICENSE delete mode 100644 node_modules/which/README.md delete mode 100644 node_modules/which/bin/node-which delete mode 100644 node_modules/which/package.json delete mode 100644 node_modules/which/which.js delete mode 100644 node_modules/wrap-ansi-cjs/index.js delete mode 100644 node_modules/wrap-ansi-cjs/license delete mode 100644 node_modules/wrap-ansi-cjs/package.json delete mode 100644 node_modules/wrap-ansi-cjs/readme.md delete mode 100644 node_modules/wrap-ansi/index.js delete mode 100644 node_modules/wrap-ansi/license delete mode 100644 node_modules/wrap-ansi/package.json delete mode 100644 node_modules/wrap-ansi/readme.md delete mode 100644 node_modules/y18n/CHANGELOG.md delete mode 100644 node_modules/y18n/LICENSE delete mode 100644 node_modules/y18n/README.md delete mode 100644 node_modules/y18n/index.js delete mode 100644 node_modules/y18n/package.json delete mode 100644 node_modules/yaml/LICENSE delete mode 100644 node_modules/yaml/README.md delete mode 100644 node_modules/yaml/bin.mjs delete mode 100644 node_modules/yaml/browser/dist/compose/compose-collection.js delete mode 100644 node_modules/yaml/browser/dist/compose/compose-doc.js delete mode 100644 node_modules/yaml/browser/dist/compose/compose-node.js delete mode 100644 node_modules/yaml/browser/dist/compose/compose-scalar.js delete mode 100644 node_modules/yaml/browser/dist/compose/composer.js delete mode 100644 node_modules/yaml/browser/dist/compose/resolve-block-map.js delete mode 100644 node_modules/yaml/browser/dist/compose/resolve-block-scalar.js delete mode 100644 node_modules/yaml/browser/dist/compose/resolve-block-seq.js delete mode 100644 node_modules/yaml/browser/dist/compose/resolve-end.js delete mode 100644 node_modules/yaml/browser/dist/compose/resolve-flow-collection.js delete mode 100644 node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js delete mode 100644 node_modules/yaml/browser/dist/compose/resolve-props.js delete mode 100644 node_modules/yaml/browser/dist/compose/util-contains-newline.js delete mode 100644 node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js delete mode 100644 node_modules/yaml/browser/dist/compose/util-flow-indent-check.js delete mode 100644 node_modules/yaml/browser/dist/compose/util-map-includes.js delete mode 100644 node_modules/yaml/browser/dist/doc/Document.js delete mode 100644 node_modules/yaml/browser/dist/doc/anchors.js delete mode 100644 node_modules/yaml/browser/dist/doc/applyReviver.js delete mode 100644 node_modules/yaml/browser/dist/doc/createNode.js delete mode 100644 node_modules/yaml/browser/dist/doc/directives.js delete mode 100644 node_modules/yaml/browser/dist/errors.js delete mode 100644 node_modules/yaml/browser/dist/index.js delete mode 100644 node_modules/yaml/browser/dist/log.js delete mode 100644 node_modules/yaml/browser/dist/nodes/Alias.js delete mode 100644 node_modules/yaml/browser/dist/nodes/Collection.js delete mode 100644 node_modules/yaml/browser/dist/nodes/Node.js delete mode 100644 node_modules/yaml/browser/dist/nodes/Pair.js delete mode 100644 node_modules/yaml/browser/dist/nodes/Scalar.js delete mode 100644 node_modules/yaml/browser/dist/nodes/YAMLMap.js delete mode 100644 node_modules/yaml/browser/dist/nodes/YAMLSeq.js delete mode 100644 node_modules/yaml/browser/dist/nodes/addPairToJSMap.js delete mode 100644 node_modules/yaml/browser/dist/nodes/identity.js delete mode 100644 node_modules/yaml/browser/dist/nodes/toJS.js delete mode 100644 node_modules/yaml/browser/dist/parse/cst-scalar.js delete mode 100644 node_modules/yaml/browser/dist/parse/cst-stringify.js delete mode 100644 node_modules/yaml/browser/dist/parse/cst-visit.js delete mode 100644 node_modules/yaml/browser/dist/parse/cst.js delete mode 100644 node_modules/yaml/browser/dist/parse/lexer.js delete mode 100644 node_modules/yaml/browser/dist/parse/line-counter.js delete mode 100644 node_modules/yaml/browser/dist/parse/parser.js delete mode 100644 node_modules/yaml/browser/dist/public-api.js delete mode 100644 node_modules/yaml/browser/dist/schema/Schema.js delete mode 100644 node_modules/yaml/browser/dist/schema/common/map.js delete mode 100644 node_modules/yaml/browser/dist/schema/common/null.js delete mode 100644 node_modules/yaml/browser/dist/schema/common/seq.js delete mode 100644 node_modules/yaml/browser/dist/schema/common/string.js delete mode 100644 node_modules/yaml/browser/dist/schema/core/bool.js delete mode 100644 node_modules/yaml/browser/dist/schema/core/float.js delete mode 100644 node_modules/yaml/browser/dist/schema/core/int.js delete mode 100644 node_modules/yaml/browser/dist/schema/core/schema.js delete mode 100644 node_modules/yaml/browser/dist/schema/json/schema.js delete mode 100644 node_modules/yaml/browser/dist/schema/tags.js delete mode 100644 node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js delete mode 100644 node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js delete mode 100644 node_modules/yaml/browser/dist/schema/yaml-1.1/float.js delete mode 100644 node_modules/yaml/browser/dist/schema/yaml-1.1/int.js delete mode 100644 node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js delete mode 100644 node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js delete mode 100644 node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js delete mode 100644 node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js delete mode 100644 node_modules/yaml/browser/dist/schema/yaml-1.1/set.js delete mode 100644 node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js delete mode 100644 node_modules/yaml/browser/dist/stringify/foldFlowLines.js delete mode 100644 node_modules/yaml/browser/dist/stringify/stringify.js delete mode 100644 node_modules/yaml/browser/dist/stringify/stringifyCollection.js delete mode 100644 node_modules/yaml/browser/dist/stringify/stringifyComment.js delete mode 100644 node_modules/yaml/browser/dist/stringify/stringifyDocument.js delete mode 100644 node_modules/yaml/browser/dist/stringify/stringifyNumber.js delete mode 100644 node_modules/yaml/browser/dist/stringify/stringifyPair.js delete mode 100644 node_modules/yaml/browser/dist/stringify/stringifyString.js delete mode 100644 node_modules/yaml/browser/dist/util.js delete mode 100644 node_modules/yaml/browser/dist/visit.js delete mode 100644 node_modules/yaml/browser/index.js delete mode 100644 node_modules/yaml/browser/package.json delete mode 100644 node_modules/yaml/dist/cli.d.ts delete mode 100644 node_modules/yaml/dist/cli.mjs delete mode 100644 node_modules/yaml/dist/compose/compose-collection.d.ts delete mode 100644 node_modules/yaml/dist/compose/compose-collection.js delete mode 100644 node_modules/yaml/dist/compose/compose-doc.d.ts delete mode 100644 node_modules/yaml/dist/compose/compose-doc.js delete mode 100644 node_modules/yaml/dist/compose/compose-node.d.ts delete mode 100644 node_modules/yaml/dist/compose/compose-node.js delete mode 100644 node_modules/yaml/dist/compose/compose-scalar.d.ts delete mode 100644 node_modules/yaml/dist/compose/compose-scalar.js delete mode 100644 node_modules/yaml/dist/compose/composer.d.ts delete mode 100644 node_modules/yaml/dist/compose/composer.js delete mode 100644 node_modules/yaml/dist/compose/resolve-block-map.d.ts delete mode 100644 node_modules/yaml/dist/compose/resolve-block-map.js delete mode 100644 node_modules/yaml/dist/compose/resolve-block-scalar.d.ts delete mode 100644 node_modules/yaml/dist/compose/resolve-block-scalar.js delete mode 100644 node_modules/yaml/dist/compose/resolve-block-seq.d.ts delete mode 100644 node_modules/yaml/dist/compose/resolve-block-seq.js delete mode 100644 node_modules/yaml/dist/compose/resolve-end.d.ts delete mode 100644 node_modules/yaml/dist/compose/resolve-end.js delete mode 100644 node_modules/yaml/dist/compose/resolve-flow-collection.d.ts delete mode 100644 node_modules/yaml/dist/compose/resolve-flow-collection.js delete mode 100644 node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts delete mode 100644 node_modules/yaml/dist/compose/resolve-flow-scalar.js delete mode 100644 node_modules/yaml/dist/compose/resolve-props.d.ts delete mode 100644 node_modules/yaml/dist/compose/resolve-props.js delete mode 100644 node_modules/yaml/dist/compose/util-contains-newline.d.ts delete mode 100644 node_modules/yaml/dist/compose/util-contains-newline.js delete mode 100644 node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts delete mode 100644 node_modules/yaml/dist/compose/util-empty-scalar-position.js delete mode 100644 node_modules/yaml/dist/compose/util-flow-indent-check.d.ts delete mode 100644 node_modules/yaml/dist/compose/util-flow-indent-check.js delete mode 100644 node_modules/yaml/dist/compose/util-map-includes.d.ts delete mode 100644 node_modules/yaml/dist/compose/util-map-includes.js delete mode 100644 node_modules/yaml/dist/doc/Document.d.ts delete mode 100644 node_modules/yaml/dist/doc/Document.js delete mode 100644 node_modules/yaml/dist/doc/anchors.d.ts delete mode 100644 node_modules/yaml/dist/doc/anchors.js delete mode 100644 node_modules/yaml/dist/doc/applyReviver.d.ts delete mode 100644 node_modules/yaml/dist/doc/applyReviver.js delete mode 100644 node_modules/yaml/dist/doc/createNode.d.ts delete mode 100644 node_modules/yaml/dist/doc/createNode.js delete mode 100644 node_modules/yaml/dist/doc/directives.d.ts delete mode 100644 node_modules/yaml/dist/doc/directives.js delete mode 100644 node_modules/yaml/dist/errors.d.ts delete mode 100644 node_modules/yaml/dist/errors.js delete mode 100644 node_modules/yaml/dist/index.d.ts delete mode 100644 node_modules/yaml/dist/index.js delete mode 100644 node_modules/yaml/dist/log.d.ts delete mode 100644 node_modules/yaml/dist/log.js delete mode 100644 node_modules/yaml/dist/nodes/Alias.d.ts delete mode 100644 node_modules/yaml/dist/nodes/Alias.js delete mode 100644 node_modules/yaml/dist/nodes/Collection.d.ts delete mode 100644 node_modules/yaml/dist/nodes/Collection.js delete mode 100644 node_modules/yaml/dist/nodes/Node.d.ts delete mode 100644 node_modules/yaml/dist/nodes/Node.js delete mode 100644 node_modules/yaml/dist/nodes/Pair.d.ts delete mode 100644 node_modules/yaml/dist/nodes/Pair.js delete mode 100644 node_modules/yaml/dist/nodes/Scalar.d.ts delete mode 100644 node_modules/yaml/dist/nodes/Scalar.js delete mode 100644 node_modules/yaml/dist/nodes/YAMLMap.d.ts delete mode 100644 node_modules/yaml/dist/nodes/YAMLMap.js delete mode 100644 node_modules/yaml/dist/nodes/YAMLSeq.d.ts delete mode 100644 node_modules/yaml/dist/nodes/YAMLSeq.js delete mode 100644 node_modules/yaml/dist/nodes/addPairToJSMap.d.ts delete mode 100644 node_modules/yaml/dist/nodes/addPairToJSMap.js delete mode 100644 node_modules/yaml/dist/nodes/identity.d.ts delete mode 100644 node_modules/yaml/dist/nodes/identity.js delete mode 100644 node_modules/yaml/dist/nodes/toJS.d.ts delete mode 100644 node_modules/yaml/dist/nodes/toJS.js delete mode 100644 node_modules/yaml/dist/options.d.ts delete mode 100644 node_modules/yaml/dist/parse/cst-scalar.d.ts delete mode 100644 node_modules/yaml/dist/parse/cst-scalar.js delete mode 100644 node_modules/yaml/dist/parse/cst-stringify.d.ts delete mode 100644 node_modules/yaml/dist/parse/cst-stringify.js delete mode 100644 node_modules/yaml/dist/parse/cst-visit.d.ts delete mode 100644 node_modules/yaml/dist/parse/cst-visit.js delete mode 100644 node_modules/yaml/dist/parse/cst.d.ts delete mode 100644 node_modules/yaml/dist/parse/cst.js delete mode 100644 node_modules/yaml/dist/parse/lexer.d.ts delete mode 100644 node_modules/yaml/dist/parse/lexer.js delete mode 100644 node_modules/yaml/dist/parse/line-counter.d.ts delete mode 100644 node_modules/yaml/dist/parse/line-counter.js delete mode 100644 node_modules/yaml/dist/parse/parser.d.ts delete mode 100644 node_modules/yaml/dist/parse/parser.js delete mode 100644 node_modules/yaml/dist/public-api.d.ts delete mode 100644 node_modules/yaml/dist/public-api.js delete mode 100644 node_modules/yaml/dist/schema/Schema.d.ts delete mode 100644 node_modules/yaml/dist/schema/Schema.js delete mode 100644 node_modules/yaml/dist/schema/common/map.d.ts delete mode 100644 node_modules/yaml/dist/schema/common/map.js delete mode 100644 node_modules/yaml/dist/schema/common/null.d.ts delete mode 100644 node_modules/yaml/dist/schema/common/null.js delete mode 100644 node_modules/yaml/dist/schema/common/seq.d.ts delete mode 100644 node_modules/yaml/dist/schema/common/seq.js delete mode 100644 node_modules/yaml/dist/schema/common/string.d.ts delete mode 100644 node_modules/yaml/dist/schema/common/string.js delete mode 100644 node_modules/yaml/dist/schema/core/bool.d.ts delete mode 100644 node_modules/yaml/dist/schema/core/bool.js delete mode 100644 node_modules/yaml/dist/schema/core/float.d.ts delete mode 100644 node_modules/yaml/dist/schema/core/float.js delete mode 100644 node_modules/yaml/dist/schema/core/int.d.ts delete mode 100644 node_modules/yaml/dist/schema/core/int.js delete mode 100644 node_modules/yaml/dist/schema/core/schema.d.ts delete mode 100644 node_modules/yaml/dist/schema/core/schema.js delete mode 100644 node_modules/yaml/dist/schema/json-schema.d.ts delete mode 100644 node_modules/yaml/dist/schema/json/schema.d.ts delete mode 100644 node_modules/yaml/dist/schema/json/schema.js delete mode 100644 node_modules/yaml/dist/schema/tags.d.ts delete mode 100644 node_modules/yaml/dist/schema/tags.js delete mode 100644 node_modules/yaml/dist/schema/types.d.ts delete mode 100644 node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts delete mode 100644 node_modules/yaml/dist/schema/yaml-1.1/binary.js delete mode 100644 node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts delete mode 100644 node_modules/yaml/dist/schema/yaml-1.1/bool.js delete mode 100644 node_modules/yaml/dist/schema/yaml-1.1/float.d.ts delete mode 100644 node_modules/yaml/dist/schema/yaml-1.1/float.js delete mode 100644 node_modules/yaml/dist/schema/yaml-1.1/int.d.ts delete mode 100644 node_modules/yaml/dist/schema/yaml-1.1/int.js delete mode 100644 node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts delete mode 100644 node_modules/yaml/dist/schema/yaml-1.1/merge.js delete mode 100644 node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts delete mode 100644 node_modules/yaml/dist/schema/yaml-1.1/omap.js delete mode 100644 node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts delete mode 100644 node_modules/yaml/dist/schema/yaml-1.1/pairs.js delete mode 100644 node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts delete mode 100644 node_modules/yaml/dist/schema/yaml-1.1/schema.js delete mode 100644 node_modules/yaml/dist/schema/yaml-1.1/set.d.ts delete mode 100644 node_modules/yaml/dist/schema/yaml-1.1/set.js delete mode 100644 node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts delete mode 100644 node_modules/yaml/dist/schema/yaml-1.1/timestamp.js delete mode 100644 node_modules/yaml/dist/stringify/foldFlowLines.d.ts delete mode 100644 node_modules/yaml/dist/stringify/foldFlowLines.js delete mode 100644 node_modules/yaml/dist/stringify/stringify.d.ts delete mode 100644 node_modules/yaml/dist/stringify/stringify.js delete mode 100644 node_modules/yaml/dist/stringify/stringifyCollection.d.ts delete mode 100644 node_modules/yaml/dist/stringify/stringifyCollection.js delete mode 100644 node_modules/yaml/dist/stringify/stringifyComment.d.ts delete mode 100644 node_modules/yaml/dist/stringify/stringifyComment.js delete mode 100644 node_modules/yaml/dist/stringify/stringifyDocument.d.ts delete mode 100644 node_modules/yaml/dist/stringify/stringifyDocument.js delete mode 100644 node_modules/yaml/dist/stringify/stringifyNumber.d.ts delete mode 100644 node_modules/yaml/dist/stringify/stringifyNumber.js delete mode 100644 node_modules/yaml/dist/stringify/stringifyPair.d.ts delete mode 100644 node_modules/yaml/dist/stringify/stringifyPair.js delete mode 100644 node_modules/yaml/dist/stringify/stringifyString.d.ts delete mode 100644 node_modules/yaml/dist/stringify/stringifyString.js delete mode 100644 node_modules/yaml/dist/test-events.d.ts delete mode 100644 node_modules/yaml/dist/test-events.js delete mode 100644 node_modules/yaml/dist/util.d.ts delete mode 100644 node_modules/yaml/dist/util.js delete mode 100644 node_modules/yaml/dist/visit.d.ts delete mode 100644 node_modules/yaml/dist/visit.js delete mode 100644 node_modules/yaml/package.json delete mode 100644 node_modules/yaml/util.js delete mode 100644 node_modules/yargs-parser/CHANGELOG.md delete mode 100644 node_modules/yargs-parser/LICENSE.txt delete mode 100644 node_modules/yargs-parser/README.md delete mode 100644 node_modules/yargs-parser/index.js delete mode 100644 node_modules/yargs-parser/lib/tokenize-arg-string.js delete mode 100644 node_modules/yargs-parser/package.json delete mode 100644 node_modules/yargs/CHANGELOG.md delete mode 100644 node_modules/yargs/LICENSE delete mode 100644 node_modules/yargs/README.md delete mode 100644 node_modules/yargs/build/lib/apply-extends.d.ts delete mode 100644 node_modules/yargs/build/lib/apply-extends.js delete mode 100644 node_modules/yargs/build/lib/argsert.d.ts delete mode 100644 node_modules/yargs/build/lib/argsert.js delete mode 100644 node_modules/yargs/build/lib/command.d.ts delete mode 100644 node_modules/yargs/build/lib/command.js delete mode 100644 node_modules/yargs/build/lib/common-types.d.ts delete mode 100644 node_modules/yargs/build/lib/common-types.js delete mode 100644 node_modules/yargs/build/lib/completion-templates.d.ts delete mode 100644 node_modules/yargs/build/lib/completion-templates.js delete mode 100644 node_modules/yargs/build/lib/completion.d.ts delete mode 100644 node_modules/yargs/build/lib/completion.js delete mode 100644 node_modules/yargs/build/lib/is-promise.d.ts delete mode 100644 node_modules/yargs/build/lib/is-promise.js delete mode 100644 node_modules/yargs/build/lib/levenshtein.d.ts delete mode 100644 node_modules/yargs/build/lib/levenshtein.js delete mode 100644 node_modules/yargs/build/lib/middleware.d.ts delete mode 100644 node_modules/yargs/build/lib/middleware.js delete mode 100644 node_modules/yargs/build/lib/obj-filter.d.ts delete mode 100644 node_modules/yargs/build/lib/obj-filter.js delete mode 100644 node_modules/yargs/build/lib/parse-command.d.ts delete mode 100644 node_modules/yargs/build/lib/parse-command.js delete mode 100644 node_modules/yargs/build/lib/process-argv.d.ts delete mode 100644 node_modules/yargs/build/lib/process-argv.js delete mode 100644 node_modules/yargs/build/lib/usage.d.ts delete mode 100644 node_modules/yargs/build/lib/usage.js delete mode 100644 node_modules/yargs/build/lib/validation.d.ts delete mode 100644 node_modules/yargs/build/lib/validation.js delete mode 100644 node_modules/yargs/build/lib/yargs.d.ts delete mode 100644 node_modules/yargs/build/lib/yargs.js delete mode 100644 node_modules/yargs/build/lib/yerror.d.ts delete mode 100644 node_modules/yargs/build/lib/yerror.js delete mode 100644 node_modules/yargs/index.js delete mode 100644 node_modules/yargs/locales/be.json delete mode 100644 node_modules/yargs/locales/de.json delete mode 100644 node_modules/yargs/locales/en.json delete mode 100644 node_modules/yargs/locales/es.json delete mode 100644 node_modules/yargs/locales/fi.json delete mode 100644 node_modules/yargs/locales/fr.json delete mode 100644 node_modules/yargs/locales/hi.json delete mode 100644 node_modules/yargs/locales/hu.json delete mode 100644 node_modules/yargs/locales/id.json delete mode 100644 node_modules/yargs/locales/it.json delete mode 100644 node_modules/yargs/locales/ja.json delete mode 100644 node_modules/yargs/locales/ko.json delete mode 100644 node_modules/yargs/locales/nb.json delete mode 100644 node_modules/yargs/locales/nl.json delete mode 100644 node_modules/yargs/locales/nn.json delete mode 100644 node_modules/yargs/locales/pirate.json delete mode 100644 node_modules/yargs/locales/pl.json delete mode 100644 node_modules/yargs/locales/pt.json delete mode 100644 node_modules/yargs/locales/pt_BR.json delete mode 100644 node_modules/yargs/locales/ru.json delete mode 100644 node_modules/yargs/locales/th.json delete mode 100644 node_modules/yargs/locales/tr.json delete mode 100644 node_modules/yargs/locales/zh_CN.json delete mode 100644 node_modules/yargs/locales/zh_TW.json delete mode 100644 node_modules/yargs/package.json delete mode 100644 node_modules/yargs/yargs.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3af7bf2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +# Dependencies +node_modules/ + +# Local environment noise +.npm/ +npm-debug.log* diff --git a/node_modules/.bin/cssesc b/node_modules/.bin/cssesc deleted file mode 100644 index 5dd9699..0000000 --- a/node_modules/.bin/cssesc +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*|*MINGW*|*MSYS*) - if command -v cygpath > /dev/null 2>&1; then - basedir=`cygpath -w "$basedir"` - fi - ;; -esac - -if [ -x "$basedir/node" ]; then - exec "$basedir/node" "$basedir/../cssesc/bin/cssesc" "$@" -else - exec node "$basedir/../cssesc/bin/cssesc" "$@" -fi diff --git a/node_modules/.bin/cssesc.cmd b/node_modules/.bin/cssesc.cmd deleted file mode 100644 index b560b42..0000000 --- a/node_modules/.bin/cssesc.cmd +++ /dev/null @@ -1,17 +0,0 @@ -@ECHO off -GOTO start -:find_dp0 -SET dp0=%~dp0 -EXIT /b -:start -SETLOCAL -CALL :find_dp0 - -IF EXIST "%dp0%\node.exe" ( - SET "_prog=%dp0%\node.exe" -) ELSE ( - SET "_prog=node" - SET PATHEXT=%PATHEXT:;.JS;=;% -) - -endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\cssesc\bin\cssesc" %* diff --git a/node_modules/.bin/cssesc.ps1 b/node_modules/.bin/cssesc.ps1 deleted file mode 100644 index 480aa17..0000000 --- a/node_modules/.bin/cssesc.ps1 +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -} -$ret=0 -if (Test-Path "$basedir/node$exe") { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "$basedir/node$exe" "$basedir/../cssesc/bin/cssesc" $args - } else { - & "$basedir/node$exe" "$basedir/../cssesc/bin/cssesc" $args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "node$exe" "$basedir/../cssesc/bin/cssesc" $args - } else { - & "node$exe" "$basedir/../cssesc/bin/cssesc" $args - } - $ret=$LASTEXITCODE -} -exit $ret diff --git a/node_modules/.bin/esbuild b/node_modules/.bin/esbuild deleted file mode 100644 index 63bb6d4..0000000 --- a/node_modules/.bin/esbuild +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*|*MINGW*|*MSYS*) - if command -v cygpath > /dev/null 2>&1; then - basedir=`cygpath -w "$basedir"` - fi - ;; -esac - -if [ -x "$basedir/node" ]; then - exec "$basedir/node" "$basedir/../esbuild/bin/esbuild" "$@" -else - exec node "$basedir/../esbuild/bin/esbuild" "$@" -fi diff --git a/node_modules/.bin/esbuild.cmd b/node_modules/.bin/esbuild.cmd deleted file mode 100644 index cc920c5..0000000 --- a/node_modules/.bin/esbuild.cmd +++ /dev/null @@ -1,17 +0,0 @@ -@ECHO off -GOTO start -:find_dp0 -SET dp0=%~dp0 -EXIT /b -:start -SETLOCAL -CALL :find_dp0 - -IF EXIST "%dp0%\node.exe" ( - SET "_prog=%dp0%\node.exe" -) ELSE ( - SET "_prog=node" - SET PATHEXT=%PATHEXT:;.JS;=;% -) - -endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\esbuild\bin\esbuild" %* diff --git a/node_modules/.bin/esbuild.ps1 b/node_modules/.bin/esbuild.ps1 deleted file mode 100644 index 81ffbf9..0000000 --- a/node_modules/.bin/esbuild.ps1 +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -} -$ret=0 -if (Test-Path "$basedir/node$exe") { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "$basedir/node$exe" "$basedir/../esbuild/bin/esbuild" $args - } else { - & "$basedir/node$exe" "$basedir/../esbuild/bin/esbuild" $args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "node$exe" "$basedir/../esbuild/bin/esbuild" $args - } else { - & "node$exe" "$basedir/../esbuild/bin/esbuild" $args - } - $ret=$LASTEXITCODE -} -exit $ret diff --git a/node_modules/.bin/glob b/node_modules/.bin/glob deleted file mode 100644 index 6fbc4bb..0000000 --- a/node_modules/.bin/glob +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*|*MINGW*|*MSYS*) - if command -v cygpath > /dev/null 2>&1; then - basedir=`cygpath -w "$basedir"` - fi - ;; -esac - -if [ -x "$basedir/node" ]; then - exec "$basedir/node" "$basedir/../glob/dist/esm/bin.mjs" "$@" -else - exec node "$basedir/../glob/dist/esm/bin.mjs" "$@" -fi diff --git a/node_modules/.bin/glob.cmd b/node_modules/.bin/glob.cmd deleted file mode 100644 index 3c1d48a..0000000 --- a/node_modules/.bin/glob.cmd +++ /dev/null @@ -1,17 +0,0 @@ -@ECHO off -GOTO start -:find_dp0 -SET dp0=%~dp0 -EXIT /b -:start -SETLOCAL -CALL :find_dp0 - -IF EXIST "%dp0%\node.exe" ( - SET "_prog=%dp0%\node.exe" -) ELSE ( - SET "_prog=node" - SET PATHEXT=%PATHEXT:;.JS;=;% -) - -endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\glob\dist\esm\bin.mjs" %* diff --git a/node_modules/.bin/glob.ps1 b/node_modules/.bin/glob.ps1 deleted file mode 100644 index 71ac2b2..0000000 --- a/node_modules/.bin/glob.ps1 +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -} -$ret=0 -if (Test-Path "$basedir/node$exe") { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "$basedir/node$exe" "$basedir/../glob/dist/esm/bin.mjs" $args - } else { - & "$basedir/node$exe" "$basedir/../glob/dist/esm/bin.mjs" $args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "node$exe" "$basedir/../glob/dist/esm/bin.mjs" $args - } else { - & "node$exe" "$basedir/../glob/dist/esm/bin.mjs" $args - } - $ret=$LASTEXITCODE -} -exit $ret diff --git a/node_modules/.bin/nanoid b/node_modules/.bin/nanoid deleted file mode 100644 index 46220bd..0000000 --- a/node_modules/.bin/nanoid +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*|*MINGW*|*MSYS*) - if command -v cygpath > /dev/null 2>&1; then - basedir=`cygpath -w "$basedir"` - fi - ;; -esac - -if [ -x "$basedir/node" ]; then - exec "$basedir/node" "$basedir/../nanoid/bin/nanoid.cjs" "$@" -else - exec node "$basedir/../nanoid/bin/nanoid.cjs" "$@" -fi diff --git a/node_modules/.bin/nanoid.cmd b/node_modules/.bin/nanoid.cmd deleted file mode 100644 index 9c40107..0000000 --- a/node_modules/.bin/nanoid.cmd +++ /dev/null @@ -1,17 +0,0 @@ -@ECHO off -GOTO start -:find_dp0 -SET dp0=%~dp0 -EXIT /b -:start -SETLOCAL -CALL :find_dp0 - -IF EXIST "%dp0%\node.exe" ( - SET "_prog=%dp0%\node.exe" -) ELSE ( - SET "_prog=node" - SET PATHEXT=%PATHEXT:;.JS;=;% -) - -endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\nanoid\bin\nanoid.cjs" %* diff --git a/node_modules/.bin/nanoid.ps1 b/node_modules/.bin/nanoid.ps1 deleted file mode 100644 index d8a4d7a..0000000 --- a/node_modules/.bin/nanoid.ps1 +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -} -$ret=0 -if (Test-Path "$basedir/node$exe") { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "$basedir/node$exe" "$basedir/../nanoid/bin/nanoid.cjs" $args - } else { - & "$basedir/node$exe" "$basedir/../nanoid/bin/nanoid.cjs" $args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "node$exe" "$basedir/../nanoid/bin/nanoid.cjs" $args - } else { - & "node$exe" "$basedir/../nanoid/bin/nanoid.cjs" $args - } - $ret=$LASTEXITCODE -} -exit $ret diff --git a/node_modules/.bin/node-which b/node_modules/.bin/node-which deleted file mode 100644 index b49b03f..0000000 --- a/node_modules/.bin/node-which +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*|*MINGW*|*MSYS*) - if command -v cygpath > /dev/null 2>&1; then - basedir=`cygpath -w "$basedir"` - fi - ;; -esac - -if [ -x "$basedir/node" ]; then - exec "$basedir/node" "$basedir/../which/bin/node-which" "$@" -else - exec node "$basedir/../which/bin/node-which" "$@" -fi diff --git a/node_modules/.bin/node-which.cmd b/node_modules/.bin/node-which.cmd deleted file mode 100644 index 8738aed..0000000 --- a/node_modules/.bin/node-which.cmd +++ /dev/null @@ -1,17 +0,0 @@ -@ECHO off -GOTO start -:find_dp0 -SET dp0=%~dp0 -EXIT /b -:start -SETLOCAL -CALL :find_dp0 - -IF EXIST "%dp0%\node.exe" ( - SET "_prog=%dp0%\node.exe" -) ELSE ( - SET "_prog=node" - SET PATHEXT=%PATHEXT:;.JS;=;% -) - -endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\which\bin\node-which" %* diff --git a/node_modules/.bin/node-which.ps1 b/node_modules/.bin/node-which.ps1 deleted file mode 100644 index cfb09e8..0000000 --- a/node_modules/.bin/node-which.ps1 +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -} -$ret=0 -if (Test-Path "$basedir/node$exe") { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "$basedir/node$exe" "$basedir/../which/bin/node-which" $args - } else { - & "$basedir/node$exe" "$basedir/../which/bin/node-which" $args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "node$exe" "$basedir/../which/bin/node-which" $args - } else { - & "node$exe" "$basedir/../which/bin/node-which" $args - } - $ret=$LASTEXITCODE -} -exit $ret diff --git a/node_modules/.bin/qrcode b/node_modules/.bin/qrcode deleted file mode 100644 index 453e8b6..0000000 --- a/node_modules/.bin/qrcode +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*|*MINGW*|*MSYS*) - if command -v cygpath > /dev/null 2>&1; then - basedir=`cygpath -w "$basedir"` - fi - ;; -esac - -if [ -x "$basedir/node" ]; then - exec "$basedir/node" "$basedir/../qrcode/bin/qrcode" "$@" -else - exec node "$basedir/../qrcode/bin/qrcode" "$@" -fi diff --git a/node_modules/.bin/qrcode.cmd b/node_modules/.bin/qrcode.cmd deleted file mode 100644 index ed5bb2c..0000000 --- a/node_modules/.bin/qrcode.cmd +++ /dev/null @@ -1,17 +0,0 @@ -@ECHO off -GOTO start -:find_dp0 -SET dp0=%~dp0 -EXIT /b -:start -SETLOCAL -CALL :find_dp0 - -IF EXIST "%dp0%\node.exe" ( - SET "_prog=%dp0%\node.exe" -) ELSE ( - SET "_prog=node" - SET PATHEXT=%PATHEXT:;.JS;=;% -) - -endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\qrcode\bin\qrcode" %* diff --git a/node_modules/.bin/qrcode.ps1 b/node_modules/.bin/qrcode.ps1 deleted file mode 100644 index 98abf38..0000000 --- a/node_modules/.bin/qrcode.ps1 +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -} -$ret=0 -if (Test-Path "$basedir/node$exe") { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "$basedir/node$exe" "$basedir/../qrcode/bin/qrcode" $args - } else { - & "$basedir/node$exe" "$basedir/../qrcode/bin/qrcode" $args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "node$exe" "$basedir/../qrcode/bin/qrcode" $args - } else { - & "node$exe" "$basedir/../qrcode/bin/qrcode" $args - } - $ret=$LASTEXITCODE -} -exit $ret diff --git a/node_modules/.bin/resolve b/node_modules/.bin/resolve deleted file mode 100644 index c043cba..0000000 --- a/node_modules/.bin/resolve +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*|*MINGW*|*MSYS*) - if command -v cygpath > /dev/null 2>&1; then - basedir=`cygpath -w "$basedir"` - fi - ;; -esac - -if [ -x "$basedir/node" ]; then - exec "$basedir/node" "$basedir/../resolve/bin/resolve" "$@" -else - exec node "$basedir/../resolve/bin/resolve" "$@" -fi diff --git a/node_modules/.bin/resolve.cmd b/node_modules/.bin/resolve.cmd deleted file mode 100644 index 1a017c4..0000000 --- a/node_modules/.bin/resolve.cmd +++ /dev/null @@ -1,17 +0,0 @@ -@ECHO off -GOTO start -:find_dp0 -SET dp0=%~dp0 -EXIT /b -:start -SETLOCAL -CALL :find_dp0 - -IF EXIST "%dp0%\node.exe" ( - SET "_prog=%dp0%\node.exe" -) ELSE ( - SET "_prog=node" - SET PATHEXT=%PATHEXT:;.JS;=;% -) - -endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\resolve\bin\resolve" %* diff --git a/node_modules/.bin/resolve.ps1 b/node_modules/.bin/resolve.ps1 deleted file mode 100644 index f22b2d3..0000000 --- a/node_modules/.bin/resolve.ps1 +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -} -$ret=0 -if (Test-Path "$basedir/node$exe") { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "$basedir/node$exe" "$basedir/../resolve/bin/resolve" $args - } else { - & "$basedir/node$exe" "$basedir/../resolve/bin/resolve" $args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "node$exe" "$basedir/../resolve/bin/resolve" $args - } else { - & "node$exe" "$basedir/../resolve/bin/resolve" $args - } - $ret=$LASTEXITCODE -} -exit $ret diff --git a/node_modules/.bin/sucrase b/node_modules/.bin/sucrase deleted file mode 100644 index 6c58a2e..0000000 --- a/node_modules/.bin/sucrase +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*|*MINGW*|*MSYS*) - if command -v cygpath > /dev/null 2>&1; then - basedir=`cygpath -w "$basedir"` - fi - ;; -esac - -if [ -x "$basedir/node" ]; then - exec "$basedir/node" "$basedir/../sucrase/bin/sucrase" "$@" -else - exec node "$basedir/../sucrase/bin/sucrase" "$@" -fi diff --git a/node_modules/.bin/sucrase-node b/node_modules/.bin/sucrase-node deleted file mode 100644 index fb3bb6c..0000000 --- a/node_modules/.bin/sucrase-node +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*|*MINGW*|*MSYS*) - if command -v cygpath > /dev/null 2>&1; then - basedir=`cygpath -w "$basedir"` - fi - ;; -esac - -if [ -x "$basedir/node" ]; then - exec "$basedir/node" "$basedir/../sucrase/bin/sucrase-node" "$@" -else - exec node "$basedir/../sucrase/bin/sucrase-node" "$@" -fi diff --git a/node_modules/.bin/sucrase-node.cmd b/node_modules/.bin/sucrase-node.cmd deleted file mode 100644 index 7319f3a..0000000 --- a/node_modules/.bin/sucrase-node.cmd +++ /dev/null @@ -1,17 +0,0 @@ -@ECHO off -GOTO start -:find_dp0 -SET dp0=%~dp0 -EXIT /b -:start -SETLOCAL -CALL :find_dp0 - -IF EXIST "%dp0%\node.exe" ( - SET "_prog=%dp0%\node.exe" -) ELSE ( - SET "_prog=node" - SET PATHEXT=%PATHEXT:;.JS;=;% -) - -endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\sucrase\bin\sucrase-node" %* diff --git a/node_modules/.bin/sucrase-node.ps1 b/node_modules/.bin/sucrase-node.ps1 deleted file mode 100644 index 9ec0672..0000000 --- a/node_modules/.bin/sucrase-node.ps1 +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -} -$ret=0 -if (Test-Path "$basedir/node$exe") { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "$basedir/node$exe" "$basedir/../sucrase/bin/sucrase-node" $args - } else { - & "$basedir/node$exe" "$basedir/../sucrase/bin/sucrase-node" $args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "node$exe" "$basedir/../sucrase/bin/sucrase-node" $args - } else { - & "node$exe" "$basedir/../sucrase/bin/sucrase-node" $args - } - $ret=$LASTEXITCODE -} -exit $ret diff --git a/node_modules/.bin/sucrase.cmd b/node_modules/.bin/sucrase.cmd deleted file mode 100644 index 3cd8928..0000000 --- a/node_modules/.bin/sucrase.cmd +++ /dev/null @@ -1,17 +0,0 @@ -@ECHO off -GOTO start -:find_dp0 -SET dp0=%~dp0 -EXIT /b -:start -SETLOCAL -CALL :find_dp0 - -IF EXIST "%dp0%\node.exe" ( - SET "_prog=%dp0%\node.exe" -) ELSE ( - SET "_prog=node" - SET PATHEXT=%PATHEXT:;.JS;=;% -) - -endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\sucrase\bin\sucrase" %* diff --git a/node_modules/.bin/sucrase.ps1 b/node_modules/.bin/sucrase.ps1 deleted file mode 100644 index 667bb84..0000000 --- a/node_modules/.bin/sucrase.ps1 +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -} -$ret=0 -if (Test-Path "$basedir/node$exe") { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "$basedir/node$exe" "$basedir/../sucrase/bin/sucrase" $args - } else { - & "$basedir/node$exe" "$basedir/../sucrase/bin/sucrase" $args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "node$exe" "$basedir/../sucrase/bin/sucrase" $args - } else { - & "node$exe" "$basedir/../sucrase/bin/sucrase" $args - } - $ret=$LASTEXITCODE -} -exit $ret diff --git a/node_modules/.bin/tailwind b/node_modules/.bin/tailwind deleted file mode 100644 index e475d32..0000000 --- a/node_modules/.bin/tailwind +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*|*MINGW*|*MSYS*) - if command -v cygpath > /dev/null 2>&1; then - basedir=`cygpath -w "$basedir"` - fi - ;; -esac - -if [ -x "$basedir/node" ]; then - exec "$basedir/node" "$basedir/../tailwindcss/lib/cli.js" "$@" -else - exec node "$basedir/../tailwindcss/lib/cli.js" "$@" -fi diff --git a/node_modules/.bin/tailwind.cmd b/node_modules/.bin/tailwind.cmd deleted file mode 100644 index 338176a..0000000 --- a/node_modules/.bin/tailwind.cmd +++ /dev/null @@ -1,17 +0,0 @@ -@ECHO off -GOTO start -:find_dp0 -SET dp0=%~dp0 -EXIT /b -:start -SETLOCAL -CALL :find_dp0 - -IF EXIST "%dp0%\node.exe" ( - SET "_prog=%dp0%\node.exe" -) ELSE ( - SET "_prog=node" - SET PATHEXT=%PATHEXT:;.JS;=;% -) - -endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\tailwindcss\lib\cli.js" %* diff --git a/node_modules/.bin/tailwind.ps1 b/node_modules/.bin/tailwind.ps1 deleted file mode 100644 index 5d60bef..0000000 --- a/node_modules/.bin/tailwind.ps1 +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -} -$ret=0 -if (Test-Path "$basedir/node$exe") { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "$basedir/node$exe" "$basedir/../tailwindcss/lib/cli.js" $args - } else { - & "$basedir/node$exe" "$basedir/../tailwindcss/lib/cli.js" $args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "node$exe" "$basedir/../tailwindcss/lib/cli.js" $args - } else { - & "node$exe" "$basedir/../tailwindcss/lib/cli.js" $args - } - $ret=$LASTEXITCODE -} -exit $ret diff --git a/node_modules/.bin/tailwindcss b/node_modules/.bin/tailwindcss deleted file mode 100644 index e475d32..0000000 --- a/node_modules/.bin/tailwindcss +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*|*MINGW*|*MSYS*) - if command -v cygpath > /dev/null 2>&1; then - basedir=`cygpath -w "$basedir"` - fi - ;; -esac - -if [ -x "$basedir/node" ]; then - exec "$basedir/node" "$basedir/../tailwindcss/lib/cli.js" "$@" -else - exec node "$basedir/../tailwindcss/lib/cli.js" "$@" -fi diff --git a/node_modules/.bin/tailwindcss.cmd b/node_modules/.bin/tailwindcss.cmd deleted file mode 100644 index 338176a..0000000 --- a/node_modules/.bin/tailwindcss.cmd +++ /dev/null @@ -1,17 +0,0 @@ -@ECHO off -GOTO start -:find_dp0 -SET dp0=%~dp0 -EXIT /b -:start -SETLOCAL -CALL :find_dp0 - -IF EXIST "%dp0%\node.exe" ( - SET "_prog=%dp0%\node.exe" -) ELSE ( - SET "_prog=node" - SET PATHEXT=%PATHEXT:;.JS;=;% -) - -endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\tailwindcss\lib\cli.js" %* diff --git a/node_modules/.bin/tailwindcss.ps1 b/node_modules/.bin/tailwindcss.ps1 deleted file mode 100644 index 5d60bef..0000000 --- a/node_modules/.bin/tailwindcss.ps1 +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -} -$ret=0 -if (Test-Path "$basedir/node$exe") { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "$basedir/node$exe" "$basedir/../tailwindcss/lib/cli.js" $args - } else { - & "$basedir/node$exe" "$basedir/../tailwindcss/lib/cli.js" $args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "node$exe" "$basedir/../tailwindcss/lib/cli.js" $args - } else { - & "node$exe" "$basedir/../tailwindcss/lib/cli.js" $args - } - $ret=$LASTEXITCODE -} -exit $ret diff --git a/node_modules/.bin/yaml b/node_modules/.bin/yaml deleted file mode 100644 index c68b081..0000000 --- a/node_modules/.bin/yaml +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*|*MINGW*|*MSYS*) - if command -v cygpath > /dev/null 2>&1; then - basedir=`cygpath -w "$basedir"` - fi - ;; -esac - -if [ -x "$basedir/node" ]; then - exec "$basedir/node" "$basedir/../yaml/bin.mjs" "$@" -else - exec node "$basedir/../yaml/bin.mjs" "$@" -fi diff --git a/node_modules/.bin/yaml.cmd b/node_modules/.bin/yaml.cmd deleted file mode 100644 index f76090f..0000000 --- a/node_modules/.bin/yaml.cmd +++ /dev/null @@ -1,17 +0,0 @@ -@ECHO off -GOTO start -:find_dp0 -SET dp0=%~dp0 -EXIT /b -:start -SETLOCAL -CALL :find_dp0 - -IF EXIST "%dp0%\node.exe" ( - SET "_prog=%dp0%\node.exe" -) ELSE ( - SET "_prog=node" - SET PATHEXT=%PATHEXT:;.JS;=;% -) - -endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\yaml\bin.mjs" %* diff --git a/node_modules/.bin/yaml.ps1 b/node_modules/.bin/yaml.ps1 deleted file mode 100644 index 6820582..0000000 --- a/node_modules/.bin/yaml.ps1 +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -} -$ret=0 -if (Test-Path "$basedir/node$exe") { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "$basedir/node$exe" "$basedir/../yaml/bin.mjs" $args - } else { - & "$basedir/node$exe" "$basedir/../yaml/bin.mjs" $args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "node$exe" "$basedir/../yaml/bin.mjs" $args - } else { - & "node$exe" "$basedir/../yaml/bin.mjs" $args - } - $ret=$LASTEXITCODE -} -exit $ret diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json deleted file mode 100644 index 1006c7a..0000000 --- a/node_modules/.package-lock.json +++ /dev/null @@ -1,1746 +0,0 @@ -{ - "name": "securebit-chat", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", - "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@types/offscreencanvas": { - "version": "2019.7.3", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", - "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", - "license": "MIT" - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true, - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "license": "MIT" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/cbor-js": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cbor-js/-/cbor-js-0.1.0.tgz", - "integrity": "sha512-7sQ/TvDZPl7csT1Sif9G0+MA0I0JOVah8+wWlJVQdVEgIbCzlN/ab3x+uvMNsc34TUvO6osQTAmB2ls80JX6tw==", - "license": "MIT" - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/dijkstrajs": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", - "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==", - "license": "MIT" - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true, - "license": "MIT" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", - "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.9", - "@esbuild/android-arm": "0.25.9", - "@esbuild/android-arm64": "0.25.9", - "@esbuild/android-x64": "0.25.9", - "@esbuild/darwin-arm64": "0.25.9", - "@esbuild/darwin-x64": "0.25.9", - "@esbuild/freebsd-arm64": "0.25.9", - "@esbuild/freebsd-x64": "0.25.9", - "@esbuild/linux-arm": "0.25.9", - "@esbuild/linux-arm64": "0.25.9", - "@esbuild/linux-ia32": "0.25.9", - "@esbuild/linux-loong64": "0.25.9", - "@esbuild/linux-mips64el": "0.25.9", - "@esbuild/linux-ppc64": "0.25.9", - "@esbuild/linux-riscv64": "0.25.9", - "@esbuild/linux-s390x": "0.25.9", - "@esbuild/linux-x64": "0.25.9", - "@esbuild/netbsd-arm64": "0.25.9", - "@esbuild/netbsd-x64": "0.25.9", - "@esbuild/openbsd-arm64": "0.25.9", - "@esbuild/openbsd-x64": "0.25.9", - "@esbuild/openharmony-arm64": "0.25.9", - "@esbuild/sunos-x64": "0.25.9", - "@esbuild/win32-arm64": "0.25.9", - "@esbuild/win32-ia32": "0.25.9", - "@esbuild/win32-x64": "0.25.9" - } - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html5-qrcode": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/html5-qrcode/-/html5-qrcode-2.3.8.tgz", - "integrity": "sha512-jsr4vafJhwoLVEDW3n1KvPnCCXWaQfRng0/EEYk1vNcQGcG/htAdhJX0be8YyqMoSz7+hZvOZSTAepsabiuhiQ==", - "license": "Apache-2.0" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/pako": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", - "license": "(MIT AND Zlib)" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pngjs": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", - "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/qr-scanner": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/qr-scanner/-/qr-scanner-1.4.2.tgz", - "integrity": "sha512-kV1yQUe2FENvn59tMZW6mOVfpq9mGxGf8l6+EGaXUOd4RBOLg7tRC83OrirM5AtDvZRpdjdlXURsHreAOSPOUw==", - "license": "MIT", - "dependencies": { - "@types/offscreencanvas": "^2019.6.4" - } - }, - "node_modules/qrcode": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", - "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==", - "license": "MIT", - "dependencies": { - "dijkstrajs": "^1.0.1", - "pngjs": "^5.0.0", - "yargs": "^15.3.1" - }, - "bin": { - "qrcode": "bin/qrcode" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "license": "ISC" - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwindcss": { - "version": "3.4.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", - "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.6.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.6", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2", - "postcss-nested": "^6.2.0", - "postcss-selector-parser": "^6.1.2", - "resolve": "^1.22.8", - "sucrase": "^3.35.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss/node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "license": "ISC" - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "license": "ISC" - }, - "node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", - "dev": true, - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - } - }, - "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "license": "MIT", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "license": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - } - } -} diff --git a/node_modules/@alloc/quick-lru/index.d.ts b/node_modules/@alloc/quick-lru/index.d.ts deleted file mode 100644 index eb819ba..0000000 --- a/node_modules/@alloc/quick-lru/index.d.ts +++ /dev/null @@ -1,128 +0,0 @@ -declare namespace QuickLRU { - interface Options { - /** - The maximum number of milliseconds an item should remain in the cache. - - @default Infinity - - By default, `maxAge` will be `Infinity`, which means that items will never expire. - Lazy expiration upon the next write or read call. - - Individual expiration of an item can be specified by the `set(key, value, maxAge)` method. - */ - readonly maxAge?: number; - - /** - The maximum number of items before evicting the least recently used items. - */ - readonly maxSize: number; - - /** - Called right before an item is evicted from the cache. - - Useful for side effects or for items like object URLs that need explicit cleanup (`revokeObjectURL`). - */ - onEviction?: (key: KeyType, value: ValueType) => void; - } -} - -declare class QuickLRU - implements Iterable<[KeyType, ValueType]> { - /** - The stored item count. - */ - readonly size: number; - - /** - Simple ["Least Recently Used" (LRU) cache](https://en.m.wikipedia.org/wiki/Cache_replacement_policies#Least_Recently_Used_.28LRU.29). - - The instance is [`iterable`](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Iteration_protocols) so you can use it directly in a [`for…of`](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/for...of) loop. - - @example - ``` - import QuickLRU = require('quick-lru'); - - const lru = new QuickLRU({maxSize: 1000}); - - lru.set('🦄', '🌈'); - - lru.has('🦄'); - //=> true - - lru.get('🦄'); - //=> '🌈' - ``` - */ - constructor(options: QuickLRU.Options); - - [Symbol.iterator](): IterableIterator<[KeyType, ValueType]>; - - /** - Set an item. Returns the instance. - - Individual expiration of an item can be specified with the `maxAge` option. If not specified, the global `maxAge` value will be used in case it is specified in the constructor, otherwise the item will never expire. - - @returns The list instance. - */ - set(key: KeyType, value: ValueType, options?: {maxAge?: number}): this; - - /** - Get an item. - - @returns The stored item or `undefined`. - */ - get(key: KeyType): ValueType | undefined; - - /** - Check if an item exists. - */ - has(key: KeyType): boolean; - - /** - Get an item without marking it as recently used. - - @returns The stored item or `undefined`. - */ - peek(key: KeyType): ValueType | undefined; - - /** - Delete an item. - - @returns `true` if the item is removed or `false` if the item doesn't exist. - */ - delete(key: KeyType): boolean; - - /** - Delete all items. - */ - clear(): void; - - /** - Update the `maxSize` in-place, discarding items as necessary. Insertion order is mostly preserved, though this is not a strong guarantee. - - Useful for on-the-fly tuning of cache sizes in live systems. - */ - resize(maxSize: number): void; - - /** - Iterable for all the keys. - */ - keys(): IterableIterator; - - /** - Iterable for all the values. - */ - values(): IterableIterator; - - /** - Iterable for all entries, starting with the oldest (ascending in recency). - */ - entriesAscending(): IterableIterator<[KeyType, ValueType]>; - - /** - Iterable for all entries, starting with the newest (descending in recency). - */ - entriesDescending(): IterableIterator<[KeyType, ValueType]>; -} - -export = QuickLRU; diff --git a/node_modules/@alloc/quick-lru/index.js b/node_modules/@alloc/quick-lru/index.js deleted file mode 100644 index 7eeced2..0000000 --- a/node_modules/@alloc/quick-lru/index.js +++ /dev/null @@ -1,263 +0,0 @@ -'use strict'; - -class QuickLRU { - constructor(options = {}) { - if (!(options.maxSize && options.maxSize > 0)) { - throw new TypeError('`maxSize` must be a number greater than 0'); - } - - if (typeof options.maxAge === 'number' && options.maxAge === 0) { - throw new TypeError('`maxAge` must be a number greater than 0'); - } - - this.maxSize = options.maxSize; - this.maxAge = options.maxAge || Infinity; - this.onEviction = options.onEviction; - this.cache = new Map(); - this.oldCache = new Map(); - this._size = 0; - } - - _emitEvictions(cache) { - if (typeof this.onEviction !== 'function') { - return; - } - - for (const [key, item] of cache) { - this.onEviction(key, item.value); - } - } - - _deleteIfExpired(key, item) { - if (typeof item.expiry === 'number' && item.expiry <= Date.now()) { - if (typeof this.onEviction === 'function') { - this.onEviction(key, item.value); - } - - return this.delete(key); - } - - return false; - } - - _getOrDeleteIfExpired(key, item) { - const deleted = this._deleteIfExpired(key, item); - if (deleted === false) { - return item.value; - } - } - - _getItemValue(key, item) { - return item.expiry ? this._getOrDeleteIfExpired(key, item) : item.value; - } - - _peek(key, cache) { - const item = cache.get(key); - - return this._getItemValue(key, item); - } - - _set(key, value) { - this.cache.set(key, value); - this._size++; - - if (this._size >= this.maxSize) { - this._size = 0; - this._emitEvictions(this.oldCache); - this.oldCache = this.cache; - this.cache = new Map(); - } - } - - _moveToRecent(key, item) { - this.oldCache.delete(key); - this._set(key, item); - } - - * _entriesAscending() { - for (const item of this.oldCache) { - const [key, value] = item; - if (!this.cache.has(key)) { - const deleted = this._deleteIfExpired(key, value); - if (deleted === false) { - yield item; - } - } - } - - for (const item of this.cache) { - const [key, value] = item; - const deleted = this._deleteIfExpired(key, value); - if (deleted === false) { - yield item; - } - } - } - - get(key) { - if (this.cache.has(key)) { - const item = this.cache.get(key); - - return this._getItemValue(key, item); - } - - if (this.oldCache.has(key)) { - const item = this.oldCache.get(key); - if (this._deleteIfExpired(key, item) === false) { - this._moveToRecent(key, item); - return item.value; - } - } - } - - set(key, value, {maxAge = this.maxAge === Infinity ? undefined : Date.now() + this.maxAge} = {}) { - if (this.cache.has(key)) { - this.cache.set(key, { - value, - maxAge - }); - } else { - this._set(key, {value, expiry: maxAge}); - } - } - - has(key) { - if (this.cache.has(key)) { - return !this._deleteIfExpired(key, this.cache.get(key)); - } - - if (this.oldCache.has(key)) { - return !this._deleteIfExpired(key, this.oldCache.get(key)); - } - - return false; - } - - peek(key) { - if (this.cache.has(key)) { - return this._peek(key, this.cache); - } - - if (this.oldCache.has(key)) { - return this._peek(key, this.oldCache); - } - } - - delete(key) { - const deleted = this.cache.delete(key); - if (deleted) { - this._size--; - } - - return this.oldCache.delete(key) || deleted; - } - - clear() { - this.cache.clear(); - this.oldCache.clear(); - this._size = 0; - } - - resize(newSize) { - if (!(newSize && newSize > 0)) { - throw new TypeError('`maxSize` must be a number greater than 0'); - } - - const items = [...this._entriesAscending()]; - const removeCount = items.length - newSize; - if (removeCount < 0) { - this.cache = new Map(items); - this.oldCache = new Map(); - this._size = items.length; - } else { - if (removeCount > 0) { - this._emitEvictions(items.slice(0, removeCount)); - } - - this.oldCache = new Map(items.slice(removeCount)); - this.cache = new Map(); - this._size = 0; - } - - this.maxSize = newSize; - } - - * keys() { - for (const [key] of this) { - yield key; - } - } - - * values() { - for (const [, value] of this) { - yield value; - } - } - - * [Symbol.iterator]() { - for (const item of this.cache) { - const [key, value] = item; - const deleted = this._deleteIfExpired(key, value); - if (deleted === false) { - yield [key, value.value]; - } - } - - for (const item of this.oldCache) { - const [key, value] = item; - if (!this.cache.has(key)) { - const deleted = this._deleteIfExpired(key, value); - if (deleted === false) { - yield [key, value.value]; - } - } - } - } - - * entriesDescending() { - let items = [...this.cache]; - for (let i = items.length - 1; i >= 0; --i) { - const item = items[i]; - const [key, value] = item; - const deleted = this._deleteIfExpired(key, value); - if (deleted === false) { - yield [key, value.value]; - } - } - - items = [...this.oldCache]; - for (let i = items.length - 1; i >= 0; --i) { - const item = items[i]; - const [key, value] = item; - if (!this.cache.has(key)) { - const deleted = this._deleteIfExpired(key, value); - if (deleted === false) { - yield [key, value.value]; - } - } - } - } - - * entriesAscending() { - for (const [key, value] of this._entriesAscending()) { - yield [key, value.value]; - } - } - - get size() { - if (!this._size) { - return this.oldCache.size; - } - - let oldCacheSize = 0; - for (const key of this.oldCache.keys()) { - if (!this.cache.has(key)) { - oldCacheSize++; - } - } - - return Math.min(this._size + oldCacheSize, this.maxSize); - } -} - -module.exports = QuickLRU; diff --git a/node_modules/@alloc/quick-lru/license b/node_modules/@alloc/quick-lru/license deleted file mode 100644 index e7af2f7..0000000 --- a/node_modules/@alloc/quick-lru/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/@alloc/quick-lru/package.json b/node_modules/@alloc/quick-lru/package.json deleted file mode 100644 index 21f1072..0000000 --- a/node_modules/@alloc/quick-lru/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "@alloc/quick-lru", - "version": "5.2.0", - "description": "Simple “Least Recently Used” (LRU) cache", - "license": "MIT", - "repository": "sindresorhus/quick-lru", - "funding": "https://github.com/sponsors/sindresorhus", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "https://sindresorhus.com" - }, - "engines": { - "node": ">=10" - }, - "scripts": { - "test": "xo && nyc ava && tsd" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "lru", - "quick", - "cache", - "caching", - "least", - "recently", - "used", - "fast", - "map", - "hash", - "buffer" - ], - "devDependencies": { - "ava": "^2.0.0", - "coveralls": "^3.0.3", - "nyc": "^15.0.0", - "tsd": "^0.11.0", - "xo": "^0.26.0" - } -} diff --git a/node_modules/@alloc/quick-lru/readme.md b/node_modules/@alloc/quick-lru/readme.md deleted file mode 100644 index 7187ba5..0000000 --- a/node_modules/@alloc/quick-lru/readme.md +++ /dev/null @@ -1,139 +0,0 @@ -# quick-lru [![Build Status](https://travis-ci.org/sindresorhus/quick-lru.svg?branch=master)](https://travis-ci.org/sindresorhus/quick-lru) [![Coverage Status](https://coveralls.io/repos/github/sindresorhus/quick-lru/badge.svg?branch=master)](https://coveralls.io/github/sindresorhus/quick-lru?branch=master) - -> Simple [“Least Recently Used” (LRU) cache](https://en.m.wikipedia.org/wiki/Cache_replacement_policies#Least_Recently_Used_.28LRU.29) - -Useful when you need to cache something and limit memory usage. - -Inspired by the [`hashlru` algorithm](https://github.com/dominictarr/hashlru#algorithm), but instead uses [`Map`](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Map) to support keys of any type, not just strings, and values can be `undefined`. - -## Install - -``` -$ npm install quick-lru -``` - -## Usage - -```js -const QuickLRU = require('quick-lru'); - -const lru = new QuickLRU({maxSize: 1000}); - -lru.set('🦄', '🌈'); - -lru.has('🦄'); -//=> true - -lru.get('🦄'); -//=> '🌈' -``` - -## API - -### new QuickLRU(options?) - -Returns a new instance. - -### options - -Type: `object` - -#### maxSize - -*Required*\ -Type: `number` - -The maximum number of items before evicting the least recently used items. - -#### maxAge - -Type: `number`\ -Default: `Infinity` - -The maximum number of milliseconds an item should remain in cache. -By default maxAge will be Infinity, which means that items will never expire. - -Lazy expiration happens upon the next `write` or `read` call. - -Individual expiration of an item can be specified by the `set(key, value, options)` method. - -#### onEviction - -*Optional*\ -Type: `(key, value) => void` - -Called right before an item is evicted from the cache. - -Useful for side effects or for items like object URLs that need explicit cleanup (`revokeObjectURL`). - -### Instance - -The instance is [`iterable`](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Iteration_protocols) so you can use it directly in a [`for…of`](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/for...of) loop. - -Both `key` and `value` can be of any type. - -#### .set(key, value, options?) - -Set an item. Returns the instance. - -Individual expiration of an item can be specified with the `maxAge` option. If not specified, the global `maxAge` value will be used in case it is specified on the constructor, otherwise the item will never expire. - -#### .get(key) - -Get an item. - -#### .has(key) - -Check if an item exists. - -#### .peek(key) - -Get an item without marking it as recently used. - -#### .delete(key) - -Delete an item. - -Returns `true` if the item is removed or `false` if the item doesn't exist. - -#### .clear() - -Delete all items. - -#### .resize(maxSize) - -Update the `maxSize`, discarding items as necessary. Insertion order is mostly preserved, though this is not a strong guarantee. - -Useful for on-the-fly tuning of cache sizes in live systems. - -#### .keys() - -Iterable for all the keys. - -#### .values() - -Iterable for all the values. - -#### .entriesAscending() - -Iterable for all entries, starting with the oldest (ascending in recency). - -#### .entriesDescending() - -Iterable for all entries, starting with the newest (descending in recency). - -#### .size - -The stored item count. - ---- - -
- - Get professional support for this package with a Tidelift subscription - -
- - Tidelift helps make open source sustainable for maintainers while giving companies
assurances about security, maintenance, and licensing for their dependencies. -
-
diff --git a/node_modules/@esbuild/win32-x64/README.md b/node_modules/@esbuild/win32-x64/README.md deleted file mode 100644 index a99ee7c..0000000 --- a/node_modules/@esbuild/win32-x64/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# esbuild - -This is the Windows 64-bit binary for esbuild, a JavaScript bundler and minifier. See https://github.com/evanw/esbuild for details. diff --git a/node_modules/@esbuild/win32-x64/esbuild.exe b/node_modules/@esbuild/win32-x64/esbuild.exe deleted file mode 100644 index ba9791ff0a697c084809f7b0bd7c6bb95230e950..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10557952 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

S$xU7>~+fj+pN||vDYT-CM(#oWokl4Z(gNnau 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º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%0DJO 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

+JoYv`#Wh6e5On13Pz__P?oIV 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 sHyy@=8amhqW3G1bT0 zC>cwv1+rM;FKUWPuGYs-26HfHjIp7u{-cebWdec)4unk)ENw-@VGD;xm|~7rBU0(O z&_MiZB>5K`PF{(b&~Yb>#bz|?V^VCK9D=_1V*UkAQ$*bl=j-2Ir>h+wOThM;uNeUK zBr;S;bV&!a1`!sd)~2kfI-+ZIWnyK=uAJx0WBL|RS~fEqSJ5C4^aP8PQL;(_7# zU9E2XgKq4`US_@OHGU5V-LOq#&9tH6tE*ZvyLgHluCNzH>cyUq_N5nc;#Q^6>W%yY zP{DAhl0lWiLx)_uQ&Tg6W6Rtc^l()JOX&4+FPaDBn!CWqr5#`UBmj-!wv) zj(Pr+T4}iGpZub^4SmJ*+x*wjT$levB+15&E!bZc&IJne-|bHSeNFnW-g~*PxJNJP zQ6rC@C;%6Jo1$90+|};o|LA3{EB}~#^bUE<{n+7NALWZ{fbgE^LlH9hgAuaeRXX5pWM^ESE09VsC%=2 zg!yfY-i;hIqqva2ImP^m7v~Xwc;x%|?k`dxh`u$)5~gqe)KFMs6SbWbIs3Rw?DmY&M&*KD6_ijnzc zus=T}p3t%@`{pmniG&8RA$3aBs|@|GoNpev{YlD5)yPJ@`*2+20V))6_DdejY8)dg z$?(YSt(1e~4#kc8;kbtV#UJf`kAod8o5O`_6}DZ+rcg2J+F1EZ^RQPnkdQiqVLUYvAW1t~zK zFfj5HiiAyV0Cv0p^M=lJ?%za1=Z>g%N+&MoU26srMZOfGvRzIM#dA}Ki~p?ng61Z- z7Pz>m(~l(0lp`?}#U%o)XJk!nPq2*9>grmf28 z)id-;DfKdX1sUtz_VZt|FqS6rS^&Ek|dm5LQMcG2397$8L|^ zd;Tf^1K^8SE?RDUm#K|aUH&T?D@w6|bd42tH`b^2F~t7DcgPZ^d^syJ zYG!A@YoQ-)Kpieo*GrB6?U~pIqh^0I7oWOTntYrg?~T{+-r;w3H-1Zm-?G#o+b-BC zA}hj<`fOupM{P?45i-}S(?tq-xMPtKY<)Jledb}ueg?ZyR}gVSWDiMu@*9se6vf+e zPKrJ8wQFa8`3u)vJ6rHqlMw2jwuY1PZvD9N>Mzf4Tp|_(GP_G9=bhhUF)IIx{Pr(|_ce z*y|u4lK;1#en@%>w?ArILvC}~xQ5|QNi~N%AbKOe&nM`IGmmt;N}yZC9+KZ|7ki?n zb`UMIwjz%uG*dnQy&I}wL=c2Uc19~&CLR5j1PyXZu{!zwgiF*LuC+xe!SPEitD_KL zcX!_}@6p}SVRv2sGW=Vve*y+h&S{)&*8y3BC_YxES;gHJeE&on<T zKcO8kbn9@Kf{QC3?ne6{t~1bnt%b>{=SC0X*Mr{&X7w0%$7cRkmWd4^t}v-x+9B0< z|4Kdv`TdV$r%>Skk_24h66Y#e)_-Y~5G~8>*X>6c|H4zqQyvqd%pxUn*SC=o$i zWtT;Z3V1N9VSoM}RT;UrBXx@M-HdBp-&oR4V_hHP0{k2oSzBl|uhIxHB`~`FN(GUJ zI#L4_I3d@~&D1^>Z`}T|wJRZ!F5-)*^_E-mT)wZ=CHe~c-7SM%Qt|fGSyR0wS)}c$ zymhx;Tz_EjW$Hu+ALX&&sRE1+S*b!*&{bd$MBL;na4p5N*Cd~32xu<()H2;~&RTABb;LlCUC)j@*HP&q*K?Mi?En6*XoslfpmkMA;W_zGZaFuA)T| zqXkC_E3w}yEGE%mkS-U(PfcIC`M0uh)FdO3BPR7AkOL?6A&

VShVA5xILa#BAe( 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

fceMs=~9YJr-Oh+$MFeMZU@Li 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μ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

o{_ ze7sxa13M}ZBA7iY>pxJ^SM{6Uc15f{ifDu)4%VP@f9jFL#*|78>#zxpg8$tfnKa;P z*@l8l8an?*GJ(jc6&KmxFWKLl?e84|+x6+Hii-liM*OdL1IAb#@~JxEK9?Emi+_u( zi_&tA6PIMrRtnR!s~!*#ZL6@Mt`X2PPJ>I#7r+v6RY>C{{06$g2LBp1VnY3YrOidm zFsc%&a_fek`&X}C5R5-nSq>T$<@jZb0F7d6RZYGS2hzy&`pd99PI8w&pnh7X-nNN+xX6=685va~IAds>I_s@MJo z4=VkO7|SN7wErRv4~kpABOcWGAUx3LyD{WJXHtRx^uzx$4|=8IU*$pH?csUj zjEQDHJuR>gvof{&e~#fQNF4(V%J$Z=IYb4$D%RU@0=lHhGz$(=L;-bb~CUxECdgyAE0e&I~ZPnFHCGI+` ziI^94brba2*%X-?`>?Kt_y7DAZ~`3FM0X^L9J$|tV8pf{Rm>M;1URgArr>mQiCc7K ziZ(uyV}V_@iNQx`*#2q0{Wad({)$O?U-nm4Xxx7tcq>;&_SbCfp_bu03xuCyYk3X7j9%o+ycl#HTty}yZ zotmbKf#bh=L)Zzm0-ix6~glv!WB_XB|bOltID}nQaB#_M*=G^p9r|KX}VM)V89o_)xv1SNctj7`-9tO?B50fAZNHfMi8A zyfFa%! zhFZZeqz4Sc`+}hm7~;7wd|WV~OJhIi6NZP^MQ9KRZ`qbL?6)Tf3w{F#-}z-e8bSMPJzGfJAI+y^n4I**cS+&69|X&0O8`EAS_}e4giEY#>I`qq5;Bs zrsy!>@GtBWgg>nfuz=e>Sm?AJX`MuD<;*K2$;pjYcAJaVJ_x%sA}dyZ3aJb&p&4`h zB-Ow@Q0ZbnO=+PoGq`+>wkbu$PoD+sm;Az^ugqrAin@N)#RnefEvkI-zyk_~8wDTe zD#w*d0Dqa*urJJQb66w1lg%IfV*fXg2bq}AX@Q!qO8*-MH;gW4^z_MiLi*@!HDV8( z*9D~3q0jOJcc_C`E;QduiDZZ{eq_Hd@~%X0Y_>zTyw#t1|&Lmot^0L zM0%PA7IYh!mG3TQ$JV!5bbA<7@yXS>!igm5=SohpporLDim z>I(Z=A$%i}Rm+l@3%ZlFt73P4jBkn5Zes9s8x>sqft{QUEXMsjS&TQw?tDfcjYZQG z_p6NhCqj`6M77Lp&@z+dDAA+P&-^2ye^H37L*Z|0In*orvktU!KYUe(6K%Md%xs@D zdemd1i@V9M(XGWso_si8XjZ|7GFKrPn@C(@Ozk34h7(or^#BQL|DzuN? z@sl2L&qH!`J!K9*sA{(L=yJPsn5#(;&OT~8GVyuy2~*`ISwDb9`Z&%J%kVExep#c%$rG*EXKxOuk~%P;$MM8 zgX+0-6NTurUhUfxn!G9w(!cGs?orstj_$J+9x>DZbI=m!n{AggWmmbRM;xyz)2E!k zPZsNO-6>~75Me$0igST(Ab5qv#QbwU1kL`fWgm*;hq5j`d8l^yEzRy7{ptS^o{#+uKV8Gy5;I_2j(;2-cVEi&1^%&R%msy+ObZym+;qP#=yPJ8w4cb_mtnG;1`Ah0m zz=f(^$*NW2W5km@KXWGGww{=Do0mDin| q$ZY7SKxE=?t`M7qyMg-)N<|&4|c#T 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%0Dkb-u*yPQ-ZJ@BwW-s6u3e0rEeGN6?zWO`2 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

e)gZ!`}-5?3LKkflv17tm3lcb+wBXj|; zs)ZKVB3`k*{%a_@CZ@*s!y7|M&KvA}<5|`( z{QYjY;`^b87pq61hg)*_DdT;y^vNIuV9^bhle^mZ*#Mkds&Zc<`1?q!~%Uj9U-gDsO<%~6|1nF|`#NX^SFDAx{)geBk5t1NX-totMPL$EdnE`zS z`^z)66Z|UsOGhv#6zokfYYslu_Q%VA63~pdv@^3m{`If@PNo0L^c1%L{GDwb@9r_z z)_y?Wg^%n9oV;1hulkCjZXEQ^4r(;6mR{r6V&#XZ|6bVvl)acs{N6FlZ?L~UjB@{i zKS+PM))_|(r>Fs9{<}+sAlyLSQ<<|I=Tte~t>?YlrK7Oz5O!$cy)3t)4AvWW$+FFszc{;vv%B(-&m0I-J0a_{O@@2qIL7w!}>Q@wJ4Q+!qS25 zlo@<4}1N>HGfnJ#cD(i0bXwX<4?s z3^q|~j`ubR-U?L=cx-~8)fpW;eb?ok>Ds$4MSY```B9bj!Kfxnyn9@I$xMB>slM60 z>ofk|5v5X2S{}!Mj-{0mBkfL`O5s3pqXf2?;rxQrC&a z2X~AR>VHlL-u=KTkDlghsJv-=wI6fsPk1qy@p83)@LugdtS!y_RpJ#~QAkzhnrHLB zSpNoI{KPzi4? zYBj7Ds}i&nU!Q7sl+!$9|Do6?WNPu+{|gi6CwpGgck;x z^(FaRx%2C6ra}u3vK0g26(Kt8UB{WfZSZSR!pXd#mi_+Oi0ZX<{F29vAPE)`6n+sb zA=vJMr35=&5DB~`40d^AgDP8OB}RT~ZK-uZDsHKBL95#Zt!@{zx?Rxfc0sF~etVlZ zHn;A!loAcUKe^+Xby|I4|(+uAF#KxeHq5E@+jzpjGaIR=EpW zyr^TKz6)^}C?e?}App3tIgw$yWbK9H#rgAxZT+ea(=I z+8}eyrp&(v_FYmdiQ>31U`GBlX-9+%h{dUK9lxy2c|@zg_UNzKbfwSH>0d2(afZC= zf@nX6yx@Yh1fO!jI)W=KXxKvRPc9~eA$E_831^7i>0&|~VmG*$Fo)QD7Zc(Tt9LQs z4zcgKn9zsV`7YMtVl^(d)Ws@Ytlh=NxLBu)9qnRaCZAe{x|ooOSb>Yxx>y&|QZ&(0 z=VBkZSc{9j`Da?Jo9h7wdGfb6iYUP-!9NVx=xN-o_g(VlJhP>=zrHZY|d;hQVa?Gx3Oh};iSiy#?2=kre zeXqMnagQQl7Vg2JM_(Hjx+(7%dL4RnYYxE?E|^PjpbHKlnD2rG1pjfi>C{CHPAhJe+0@Bf2z*-jsKb3m(=oyPqAvf1Umpd(VJ9{!lNDbq^KC zy^n6qy?g+F_Y2+BCX)`Xm>xnjujTR(KmF`m|IkgXI%!I*05~c#oP?2U7v~M5F_MPM zmHUFf1EIxJiia(Z7at~o+4e&EJHO%W(e8$E6b!(^YzzR});;AR&*fZ#JOm{0Ht7t~OfyI?xTgT4{G_jhWB-Uipa%P1zr3tcLtmTy~yuM54-bHPIhPFCGcbCmU0_20=& z|Bj#Stys?9zm68|HBYz{oWqY4()y$a=b<0sR9x<)@Za`7)$}*7oK)yHMva;MuR02j z6oh^S28Y>z4o1!{WU_`kor=8!8Om+vYd)z3y)`Yif1cvgK8v7#{)%$8mIKI2*>{B- zMu#4*Ei6B~u;C~IL(9(|+Axg3FnupSdl;rHvgbL>TYCBD9JStdYqpA_har*UKPBD# zrwEl8?gl3I_3gWwcb4#gBQqwG^0wEI3hQOuG^Il0d8lZGm3Xn^1Pa-9E#QO(UAW|@bnN{&mMAUd}nhf7t5qcUC- zTGXY^B>HM`F~#&?81 z^=z%cuOPd%9T1Mjl0CjR{j{FrTX-BhrH-{Cy5!CItWp{6fzGE}loDDb6L$%-*`J}G zXvNJ+!o=UIZYd;EezX2IT!or$s73X+;fF+rSyX=;c!;y5ga8%jrvaP37F!`JZq`r3 zc(RuhD8E^M8;&DdVNv~UIGpH-1X{{()(>yiLqMo|*jIs{hn2OuwbUten%nU7W|mi` zxZio~yeZo47CLkt%O-3*`>c3A+SE?$y1d18rY(O|8Xt~SGDxQ5iM}Ume^)*+Ia~)O zC**t6EOW!H>7=v#ytZ2>=HyTL1`ro8y;#S+y*N#leV$y`8=*VEEoLA-)&6pR#+h0yu_N+mm`_|~z_C#*@u4YH>;mg%ZwxnG zqxgM|lOcy+U6Z1H_OiM?q#ENDuh(;>Gq`qq1x?k<5`!1!k-+PV-SRE8a@Iu-Dj zt|As?;y4f}2rYPmQ1am9oW4~&!BCYvv!E(@cDO1zZE#ic+l5uh9}aKv|AUz}qQ{zB z#Tc6?RK?w*h4$;-6s`ii*IWE<+rU>P?k&EBxbK3RUv~=uZ`9%BA<3)zCa=h+>O^gE zqOl}VH`+Av89-t${}!;Hbf|-UAr%4pKdug7f9u5Fu(z?s6YIUJuyc8&NCnU;|AHq zEIFLp7`$F5r&G_y*-3M6sQ$v5)cLKkPq)OHcUOk4(}N~8iRWUUz7%WQbxO@hDjiH6 zXJK!)bzUBN_jEu0@O*PkYAV`+Ci+5WHixdAN5Qg<9pm{y;iJw=yKLXB*MEVsni?D7 zQXdh*>D(!?ws-nf;Rm`V_obL53==uH-X2=ePL77Yt1BBhy>+@#+Ke=BJtfASlTj<= zkLE}5iWfr*?jR%fv$%R*u#ljXrku5zE6?eA>`pd5Oxg^yq=_ds#PG{_iFycriySm( zQ^gc!Y0hTA(Va;Rmq#$E>F!lrEoiyJSyyb-E`cUCawGSLVxyjm<-WwZNNB-Fa0PqM zS~mons63W#k!t|riLF_(dO4$qp7dAO0C_zi&^?HZE2jSMAk(=-5hP(c}jHThG+^tn!2J? zL$0f-z>;WPEHwEk){j?sECg@c+s&*u7&@7B>H+oR@(-UT&j>oT0waU3b)czO9}UHE zP$F|KV5VV3D^_wtUqJT$$Lcc>ssw`#;F_qd%V2@oH!pnXa|Rqu)meudxv*9FNF}*q zq4-mDxuKs@(j26AdM8>#G8bU@nMRnh##rLHh?S}dO=iH~;i=l}@i_g}9D$25G-i+C zKpUa04_ove8S4Ypw*ur%y0~ZPk%)8;BQu_8qTO2b7T!-W?03951mc`lU2eY{#8FCI z5PmWf`#NPz`5f<~pHM!tkbW-5>p0fmIXfn&`?YoGo81x8 z*!&EO%QrN>%YRnqA@d(1&bH_?b|4u6s3rPo+bQ5hXwh3F>wanp<&t4mmv~jOwr>@I zD2yb(iq2P6C1(^=fd`dPT)2t@)$vuy#=%uwb#0;!5(||$BUw9~V$+i>C7>0BN>pe{ zGCEph)ztW7niJZ{-Br|n7dp2lNCLXhC|6CT_UpPIN!@YDcZ$Z8J=?Z297zp6f?DTR zm2GTWQBa*4e^7Pmaeb{S+ugR36_alf4oCI5e8{NwjEbPTVfmU6r`Ut;6 z5R8e8CUJW1ll+|;v7afq>*=>9g0v#>=G+Y}I@i>KnK-d}%*4JeRf&mxtH=BxpTH0D zfuDL48FN)ZOX8}6$e2^ZEs0aZ)niT_%=c3VSC6@C1Ic{QDyLEn^yPXfEiStXV$DBWw>dqg_>^UGL_%xviDajt9r%!WT_u zFmuAOe~mkS9l&BM<$zo*VtQrhdhJYgr(G?p2c7)7FK-!cx%?8m1YVK9+SLX?NKoaR zEF_H}lF_+UNu!Wti_t;SQB88$63gmHDcPdQsA38i^P601R90X7o#ZlM01`{N&?+8D zJs@lwQ&$8ZV94WhKjm9pRoOFbYv3V+D^5=pgsM{sWr~!27-?(E2l#bWxlfmU+P0=Y z>_`=#mKq<%$YQ_h)J@7*HKyerQX_3E!d1D?M#?t90SZn{jqjg&+|{#-Px*X;b6(8n zs@&HiW$UP$?CT?C&xr+*1`xy!+$XZHhr7+heS|4#0+Wt-?xZktl_6>Fh~{b`neYx)yprj}8T%_N~Es;H{? zV(l~O(^5rU*C76}Kv;vNfm!r#G!3gHbYiJ4dx!b-o4+cbxxHXz?wUy1PB+@8%R1E& zKY_kmLVsFfM>C~(Y<2F6>au6uP`CJi%%qWh3lJRa()(BEzExHBjvHdBz;3KONR^7I zI7sbZmAjMbiyTC%ibv|7$z?NJ>xTt$aZi{5jsVe7EH-RxeWn`(ZhNx*>QG?H4C$-@BSN znso<(a!Ja0NBf12bcN;~)uYg?o`tk7G54>wtqDhRKdUNx9l^%M^MiPQ<`Y?qRk+%h zF39?~>M~C}CrBdq-z0yPyY&8A@P}9DK3`SlA-hC!*Ho8@C6V7H0eJC37`esYWvHOLguBW3l1f zJ(04HT+=Qk-%_e`U#=?afFZJ!SC_q^wt}R5=D*k_GwSiI_@K9S3uu)Coy~|}MsR~& z-$;@0Tq&P!_Mf8@WWctS{Sn3t2TYC;h=wbw{Db)|OtcHMMTzy1#LEQu0NyFDS*}&0 znAtyc{W-F>Xx@Fq6=%|w(NdDliX?P2QW8nj_T_gtzxn(Y@>|dnNi>EdiRj=+qOy=g z-q@-g&fO7-^^JBD((q;35ke6Bf;|7Hj4z7Qqf+esT$ce&n*sPKAB?Y;$3E&d!Vv9g4sU6ZCxlDEQ$k8Y@6v}zBG>Eurd=URKPoy zY48t>&Nwb}VC44&wx)B6QFiO0+;uB=r7#_6aC1vd(c!u@S_V3rSnC_!awXSX<~-fJ zEySibHmWmAzjTA73$tHsBZFzr21utlhxT@0cjIm6k8c`#4?%J| z{l^xI_&J{@(y~v49z5rB5c;Hlt-o~my#xSd)=ynOtmiy1%)^3M%#{$Zhw91+*h6(u zGmBre?&=ul8_?&K=V@-R*FY$UCI%Oyi2=Ke>Nwr)#;kT)@n`J4W3y(=R^d%z0!7gj z8!+z-&6hDS)0cba{-VdQy<@J*9&AT>FPhD!-)ItBR30tDWkWPs!L=on&?3p^cXp$I zk2b#o)7{c1I+SalFGWAyQZuq$Z;_3BDK?h||&LH$IEyZmJpdAE@>r`)S z%^LBHjxwrj9MU?Y4-|euW5Kv<5AOUpJY{VwF zJ`kJwH${bj#EWJ(Pz|C)rXH6~<;RmA9$0aW3{bsy&$33#qSX zasTe$+^=x(d4}HpEBJ&K{aoW=Tuu5##GgAo_Go(+q-Op904XzLa*#?+IBJltZH_DE zM;>oZ% zVB*du6CZi&Z{xf!U(=NMXeRz;6z%Jx-hD(`dW=HnYySHzzXDNhIP>3awfuJ#OBEnG zDdM+j!oy#I(}Wi4Fh~2pLi-IexmPbu;+$oF8~N+(zbzo@&_y1|AE(r7;&(0+ax_RKJa@A-j7(vylI-|z1aMas?4X6@fklI@RN<*o2KZ~0<$?S1dE zFGSO#|Bl`J*i>avi0I=UcQ|u&pahx!t^>qfJ_$TzryWfbe)eUfkITgHp^p+~S?V1T zk1$yX{GZduog5cwG7PGzuXhUF1XN$Xk5#mX7BpFlPMN34wiZ*vk%Fdm2FqQGEE}v# z6|abfA}RyPs8{J~E)50|$Z1Uh*LzPL?#Rd*X7U_XxV1Crgt@IAM=GJF;^k2DH)xo1ef(95rnZS~wHoq`b&I#Q-v5TK>_!%JB?>co z3aG~DNjh&4m(i0rjUrRM^KriJOWju=BPdH#sE$LL=ynO3!KRV+L>e&-7(xd(Ktyx^JJE-&NwJgz& z1s;na;fn}MjR1IS$$lRy4#Q8Rv0h6YV;dH`Y3#scX;Sg(-2Rte)$uy)(~c*}AhmIk z3a|th@+)Fh1!9*u`o-(GdY*VyZe5lg>Nt^ofs47OTuB{%SxtV^(v;1LCtj7HAx^2r zwBVm-t?$AP1FMMGr@VFl84LVt@l^2v@&J6@aeR-ZCWcwBL)R5rW|S3rb@_H1;A6#2 zfZYTV;%2^rPXsmxvBZo1jY>RH#B*PlecBRbX+~}sh|gegu~rh&F+DxgBjtpw&ovcq z)E{$Zs$dvKEjV@K`@^y6MiT{^U;vWU;p zqt)?ae9eH&R0?}U1a(@i1T~3Cq_-3FIyZN9$?VTbl^S-7it}oF*5&YNKlMlXC{z@J zd4!@z!O|fZe^d6T(t`9#CEsJ6;ILhhrGBJVk!4oDGqe-?-DKV4eLnl;T|RZ|$6BEQ z*`wV9+)-VZKF8WY|eu@ z`J-SO2R1IWTs+G?ft!=ZGQQ<-ZmNY@s6vB)ESL4Hcc$)i2k!8B&6cr?Nqvo7ygdwd z@p_K2vy)uXLrQvvB-!%(HmP5H;8b$HLKtaH&aqo8d9&;Us|f<~f4dB@Klz^KOBtcu z%Fo@&c3j@WY$n5?#Gl$T{OOc#{$%4s>gv>ZVK4b&D-e{BiU%YE{V2Qq(1OpPcZmm6 zC9oKm$rQZa7+g<+6GdybVxyjoHLo--SC=t9!glbn;$?iT$=xkK_=XLj>Lx>_EDH7Y zpWXD?biI$cJ?T>gy@ux;eJ<8$K!|*kz!Q#8XeS}$j|g7RuLwm_^~DhAHVAaK2=vq<+JQh%^$8TwT@Cv*8Bg^+q$X9_ zY5E99kWDtafH1FV&+wrv%4`#+z<*+o1e6&+ierbC;0!VLNI;oNuT=69s+A%ms))!` zky=HJOd+}^5=EI}5E7F&*)I%{U&GHW9A}D@f{dCPVcAs4yP8GskzP4eg|~1=b}>=l zY*G-SF)cAn!ZO9=*NT@UP2XX)y7eZ_UM_E8E|f%n9NZo=H1s|QYax@T8kC^`(>_+b z61uKd#bLi9Wq(y^kB<6C!C5i%{=t=foYoI66=Q0#_8f~u7Z8@%47(yVJs~Sx7NoMq z)fdMS&rV7eGj-o7mJI#e?1P9NZqb^G=R(bY7A&(sbvxCW2HiNacjH@Kx>tN!Kt&|-?3x1z#$Ciuw@53pbRw;xGBfAO*@Vp1Aq-mw^7wq;CTPdA z!fYQp20rG`ox<_(t*bDVcT*QHYNbXTa0ra*=+AJ6qSKzu-tKGZ48ITRH%auni z>%X^q_gms=Iv8pv%NJoZUS6y%T^L)V8y`Ti8i1gecs-VQB8CeG#Xo%mRW&;3)v-Y@lEAgmR%OUtEfsf+ zhjW$o=^HVW>!zW;e^pKHi?KoIxZkNsY_Cat7HfX9PYv&7G{5y(O=2}F>@}#cJyh85 z)C}4lYkm$6wyS2)N`?5d6D*e!Fy3cS{NVFYvOmZ6GKPw~1JU*WarZhdfTPewlvDT9 zMYQWRWuMfPb;Wbn)r9VTKR?#?7CQDHch!{r6SoDiu5}GwW|XX^|BrkBFSOU#zbD6y z9F*BrYPFlnSe-QfmoqccxcD`9z@p7hu%mfvt9V-}N!q7J^$Dt)VZV13&$8d^?dg!F z3CAC(3waA;Un0}|-AzC*bnT1#bC)=DXHV=>|lZ){CyvV^Q~~<=N0a+!bAPSCx*6g?d!zQC;4PQF|>}F|DSe-_PaaN z7rYBCdKp=TUgfPibh1DtAa2P!w@{I5s`cjr4z>`?m?Uqj#75`;DYW1#`GW1Gc}XjH zsR~|d(7)864>

ynpv3dH>g{muR8@I5zH(bmRRrcCL}hhnV~+laDjGJ^O-g zAh|wHY3auM=}nbxBc;z#r5y#++`iTwe5PO^+AB)jE%dlA3H4v)K%nRWzm1ASD^w6B zSmxWCQH8Fypy#YvHIyL1YGLWS<#(ULPXu3q z)e8GJssMCB9B)jb10}s02Rdzp^KD>y2*_VY(SwV-G*}jnIv%+cJp*$}KCgoas??4u z?0h;yh=%U1)C&rthP(K4Uk2af*U&`86-m_~QlvqoNP|d`29Y8p%xUg} z;APi>snoAN=qPN%r-z9X_1p1yN18lm@c9s)CuhiWCO}!g9?`-ZGx=hOn;F(3!;Mni zkUT!`!1LXClAh1!BX};%m*=sppoSF;AIlfNqEKU=8svGL5AwF$d>h2um-!%X=kYDd zSF-#pKFMpYO!;~XUq8bqd0kss^m0lr?uCwaY}ufeZ< zZoYqnkD9(Pff}8@T!P{{2El5sY2ib%CyqS29W%F!J>OLCzSmZCy$Td|%v^=@6~TKt zQm@D6K8kufDiu)_{BMErelv9Rzw7gV==1OO@H|n;HYoZ3Z0&Old>4No;%~3F^(|@M zj-%4yaZOvj0^LvW_BqSj=k^pIPAWQbR+O10&El#IB#v51wbpY+T(vf?-Zbhn(Wv6- zO#_((oT=l_7nt#aqo;rhY}0~v0+CJSTWLY>;6+#q+AYb{zmyiV8zdW6p;Td;78I{= zSPNp|uok5Bdg16w3;HL(W7C56gql`b&?j+9+q9s#rNdefO2?=hO>kta2qG1Xlej*J z0k**FJ1|osFGC`9NluRmAVdu#Vf!iPOhsf2ik3U@hG_2y! z`=HT={^g&7V)3+{Ypz`=19qOvAKRMiUfDf624lw?WUeK3Y2Manc{|=N1`qP!i%@g@ zn<(Vq8AEJ7oP6^K7IkmpZ!daQaFpC=Bc9&nlY!wDtPEZXlYuxMJsU#Zzwf zd*|cYPZ^Sy_~Gcmj%|0Q?nmjuyWFFFj)(Vn0~0ko*6-j`ZB7{#{_+1zgj-si;GFpJ zDP%wiy5Um~LryM8Azs8^8~^4LVb@s6`fxE4Pm|H2^=nM>kk*~f7}9a%8Oo-0vPGT- zgPNzL64#TRRMUmER3p1Q#q20Db0vddNbwXOnTH8<%y`4Js@#8?Fb2^{EtL}*P}(@? zL3N@-3i(!neA`&$3xrvTzYj?-2kI#4*96xKqbW!|U+OEMdRrjsY{6qiXpr2b^T3Z4 zLfw*w#7g|ZdR4$BcELKPr(S5L`|>S>+p+)DLba2PW+zVqTKYoR?f^7bwhGfQ0UN|g zB*2pj8IjKxWP}eWVQoPs$~=NO7xF1iEm-_jTNyX!e!KngbNKB_1x#G z=h9Hji)TZw6i^Bk4i@QhMcmW?BwU~Uu}qiI-#HBl?BD*{wu zom0Vb2EnnPtA)xcwH?PX#cbkzyq)8Zw~4nwrNlEv{ewy9Vcbo;Csblnn|RSO3-z?@ zlbp`ZMz)Xr-gin{N zaN#_LX#7`HcTju-{&l2A2p+O1>L_?w?mwF1AH)gLr;AN;Q&JZ;5V95d(R z)D#}v&=?&vKfuRC)zb$*C2r&R44<=BmC z?Co3?Q@F`?E|19?-A;R3JL*8x#lX$#;|JSthW z;@B6Ptn-q$q*Sf=%NHwriSJbn{KFS3eI2%YN;Y5_|1x}*uKt>*B=Ic~H_zRU853ks z^``;8lQOCs3fojaj6G}1Tp^|loa^EV?CDc+u8Y|6_X9G%YK(Ce{#I8{E0~y3l|8NS z0DnH?&q2Jq%gxvx{?zhkZ}ss4ffVs-J?r?OA$2vw&l@@~XSlDS>mpV6UHR3=)mc4+ zkIe&OA$*Dm77aSVfU3${8iG}ozJ|}LDsvl-X@MreNt~?yy#B4~ef95E@2TG|_}L1L zR_&aaka}c4BljhA-Y=2661wh11l7fz0-|(v=Z0W)|ArOS$qmO8dS~~of2%6Hcm0N{ z?C$m3!_x#Zd94-$sH#j3;Xg|p;)?@7)V||tI#r?cdcOD!FM5yLh!?%<-{*^ic+nk) z52aQ>SL*sY=O*F-EG|^q3k(32))rKb))PE{$^k^Yt%sd~4egO@K|C-; z0LP@nFmUh!z&R%j9J~N<@WKKPUH~|F0gzk3X=>W4OfJ&bu@=0fw__uIyW3x~@M=9aYyQ#Ri2$SzBl2~oGaB&mpv$Ss;8gXHrL*qIjDR;rLS`I>H(q=VWIWN7#{pF|&NVq* zlpsa>Ou$W+2q^S^i2!hSArcLQ@HE5&N5tU2C1m?LQzwWBF#|-zFAx#GKtxOM#7D%W zDk36&fr$78A|}DGTT78VV;9sr3aB%&fmr=+L+^GB-)iXFieYs_|D$yXMR4_P@MTo@ zZn!0*x;qZ`0(_8Tog40RgO%mF!ONymtbqxC-XKSI!I>2k-qRpV*n%MJGHe-k83Tc` z%QVS)o0{P8WPL3l{xo&a;Z{}n-QTfl<)}ebttfAIcdSmXzqa~#{h$mAHg|Q``qBB2 zYy%+S24_&jx$$#%e$}qNgQ`(t;-Jq_N8dqvP{&04qNM0%C@eY|%KxbX%o|Air&@*$ zg|mtnK3uqHo(i9A1-`O(lIoqSMBOPXfI%pA^ za?Jb(JxQC#&S$=*4vVpF$IN-DD0Fv6G;_SLx+>e$P4-ab7#0K-Ky~3;QC4d4v=iLC zaD80ub+>{1&C_1D#AG$u3xEMd7fK3s50L=BVpb>*6l!l#C$?08>b~`FL}o3C$%92BsR5IBXZ0BrFAoTt-{Lb6@htRri7p3dJ-ZliR6YdKQg zyMB|bvqD)viph#vshmsJ2S&NpD8-SrICf4pHO*kc`Zz=P2H4psMU zSP!l5eKN^iWRi7N+5M3P*#{tdRpqFLy|R!c+fQ;rwD89t3f zHz*HB9as1-E1EQ39vg8$7fg;U3qEgnvnf@XqH!D?eb!~1SUS|bX9<9D z=aczYpO66`epk>qc`*9{MhqM=ZA^%nmL^AqLYtmUnkdR!lfn^U7Wt zp>cL$*5;vWhnTDpXr!#L3TbU@$;QY%jg^r@dgg;>4{1(J)+UGKVbDrjA(L)OH z+o&N~N+*w!y~CqqbkaTJdQuG#tLH(YS3n^et*UV0^T-U~TEw?f|7Dcow^70SO>=e9 zKLI3=^q1QZhFAaLHU9?bW!P>5gMeE9_+@`@chVg1?FLc;3|AD4EjyJo1G$k)0P~f@v3Yr&BBDv z$67nJKgv>|c0WU?V8yDISgUaa2T0)R5*z@=@6-MVxWK(zF}UV&fgi_YZIWcpV%Fx7 z%;_;%?IaVSFjj0qt<6&y{}GcFwSF^&@nm!F7;g8<=4MabpJK8$Id!)&YxAZqFD7e~ zQHGWI{gRbP4!umD&66GPZopJo{5u3}pa zvsf{!#8GjhpoZ7yG3;LdbOpoY`qyh2HWWTnq{8L%7(QJ1Ooa-U z*CM389?y12+nku_BEH}}ilbuO7ku(vfWYGAUvpn@5$gbFf0-dT`*RGjFZhhAJC?(v zL2F+Sz8y}s&=sX8YEOuUx0o%*N8T|vG-gT!8yeFjf(?xch>-7-)Jd34Z7ss)@S054 zx4EGh_Kfgfx5zXbcH=jhu=|-r0J|Sc1h5-{$iEFcli`NAEI_K2eK5R<FG$F-W0 z?-Jl(IG%#%;zMKO^-do(2G3a#_htd*A&&mPs*4lu@&&HM|B?Q`4h;Ji{C}+|rvIX*DC=hx$%Qg<*3=j7s^QvYneBsO(Q-CSFu zc+27Rmc!}lvqbs*hR&s05bC>rvi#dV8%{TWw?HM}iR%wmlNmOozN^B{Z!zSF>nimk z?uqMI$4Rlrtl`0;+Zxs#<2CSwzce=D^z&)>yB#0Q7N`$vhh*Z=bIkean6GM)Kkmuv z*dx=!`N>lOKaMIK%#WiA?-&bjfJM-GB0qiN;b?v_rM|Z1_q+w~W6#3vn7Q#B5i_wJ z#mVei07;$Ere__vY(fLiv2sQ%7fkAu5Z^54$!=I6-Ey>+Uj?tO!~qu`oW}85q_DkT zAsUi#olcjB3Zyz_UghAq@Pg#aR}rG|{YTvVf~3Xqt=Lbc#1nYuGpQ+om#7k(5_m0) z>ATLDysgjncDzIO&rZEBvgrAy1w~IXine%E#Ak^ikBU61As!WNgmcn8DvF0FbnKB{ zuoqAzSht*lq#<>M3Om2bkSf6|>P1|Yz~(>W>o`<|2>Q1_!lK-QSH>n3f*4iezx63r z@hZw}$ae|CpJK(=G4Aj1Z|WGVRdkFEW@J&V8Ckv`5&49No<~+!!lfeh3;I8XR#Ab# z@yH?`sD&kH#x_Uk!8GY6vr+$;bY@8Rc!FndS0MqqM(WbnM6ZbJVrcvC1T_k8$vf3B z8VDTr75FjKyK$e}+}F|fSlH3vCz6cME=@;+d*T$fIU0;tIP7Q;h2weZIhmc24@yJM zaZa_FqMO-AUgHT1a>pDTupslvT`EjS{I;s)#w~fl-T3&BYH$xpjIRcJpHV0YSFUlb zKfTQKTk=meKw#J>%`v@=SpLgiIh*6@s%5551%E}DDd8lR&!Bjow}hDK1yhLm64UF} zltn_!sbf_bRv>IzgXMY|vaO&AuUq_>xt; z#w`AgoK%5hNBKbne=idLuH05BCsx58Smaz@`?@>Hm@iU`_L`c{+L8^hus6CG6z4>03wEp2%~$@2`q&<*KlAe}-7Be}(7t zA3lm~mgn?8qYQMzXwT{2e-yS4xYoAa6c;jIpL{DEuc<3pohCQM@skL?`Q>RI*J`NsjSzPegI@nM+`pNtVb2g(jnMntWkuJYsprS$0lSb%&Iy}`bHeBL z>>pkoc^o;)ML-PFD7r~@xNPaU-12odBZ37WBmQt^F9`nH}W{D{X1O`^M=pv z$G8o$=j|Vp*M6!MAKS<|Ou*%@wE&m+QBn?)a2j&Qb7)6A9KpX%Rb}T0Z$uwN=6yFN zFWRx3^L&7IRQ<88ykftCG@bK^D<1V_u<58rx#gh~p7`_VVjr40kKJSPHa(A9{?z<= zd@Ckz)ALx&yv>})i7|PbKac0IY%}LEH70M9^N6#m^35DS0K|8!%AZa6D^tt2O=upK z!zGjo&7*R#b~jcm_+~kI=pWHdoc_F?Ax?h|WQfzBS26rHPJi+nx83-zEp<>WzD?$r zZq*-b>;4d{2QR^0q^7U7wtjX9J`dnNCIcT$&^g-O8BKl<2X`}W9L=1RPoF16WIFJ9 zGLIp=&hU$k$@%z^!y$O{98*qo(zAjk;YFpEA!m<+@GB91YTzA)?Lzdf?m3P5;OK7`iDE6Rayy6TFgLb1mIL<+1ERW7F%2(lY zMGQFzgptQ+&@@l7fYI_?OQ`PPS@Mv8{EnGbVEIguhr?Y}3bH$9PX8XeP>?+24>B3w z$jRK#SO8lne#Y2CU5iS@fbG5nmdp6F?pMu$8SM8H2aH=EOblUD_t%Te9>`{M4-cT zWsfoIC*!j!t)xB;Y!MEs5`w%YonOn{_cZ$R4ZoK2vkox0VuoOFzhDRk_kgOqX$FVR zU^^tiW@?TH;uCxV7WadsSD!MW|B6Ha{pTeD=s$x9s{1bb(X5(lLS?B$0F}Q<1W@@i zBHq@+;n3-h7B8A%|E*zU&o7Ja~K0A3QjcdFnwqi z{?GZ)yas!d0=7O90oX2)2*B12k!TQvC*eEcLlZ|%X6!TlXKs7~;K2H09Yd@?Rxrf+ z<5h;=#`?q3FKzty1iZE>z8RjOuY>aR-*#$#{RTqY4?;WK;x?120v3F=qB1nkZKm>< ziM5sZ?0)3eIOcaUvCJ;rP6~>fnhsW@(09VC(c9D)7HTzmrTW4`tww)_FD!yz!ahmm ztSZ~?IrLoY2I8&V|KABchrTce`NIp16ZyS=CMK)7&QMM{?FPbO%o<)Up2%~kCnl@8 z%J_PoL%05>+2dIsleNk5lrn4c#`BAqtkL5MeKy^M6DP9yui-f~pAG-po6E&e~1GW;B1hs$8(#&fl=8bn@+2`!{{< z5oBu~v-?|2)+U+5-OSoN<}flQtDQMi+V?^_Fl*SNaw7kxr^RGNt>4UDl`OTnvJrR8 zGk(=L&aBOYn=>YBlW^OjHydtm$7GF$TZmOR+gB8sx8>jTGS=UG|E6~! z`&armeNgKBrv6QjncJVS8>mHcg6pz1x84_1%B^!}@BQm9U4(-A+lSOVGCB+L809T>}Gfr{CfTfvDhx+D%-qDR-MUhl7a00Ofit3vQySh zNV9#w>MR9TGJ_%1)M=`gy~0xX^Zuzs8?k&vFGatb$5*DuWNi}nf55EG!~I?{S#7u< z>EwS$32JSgzWiQHR@7?g%cs(eL~^UIcQ?V>>CK+Q*JH9aIfvt!wRv+mCMIi>bJ&$x zn>UAN#$=6{!&90oHg_>0d~&Pxt;CPblSiA203`6q4GdxVU&AoWFXMZ4-K)H3SBCCN z_`2+qobo^6&J}E#hEB_SD@??AYU<=s(8qg0q1U}xh_PF2`D?m!HCP9jbS*CFtW zLA^oM-Sh_asl+Klyt_G$T^BxV?y~(=BG_enRwCGCdlC_He9|^4QJuBmm8g+-Mq0Z= z-{wt`5%Bykd!rYfuQ{;$?KBg1k4glvE0YLdSBS{J4Lg&={?9pf9XHj4!#xrK9P%Xs zI1ERmIdC}X`!4?pByKh$-Sm(NKusb5-~fpLfL9{Y8~{f2|Jy{QD6`ksbLNAyV8YMg>P(D$=>Jr3Y%17{-`pe~e8iRXY zFny+at{$D{nE4XcN4IGHJzB{pS(<->bByMn>de>tUgrqSKhl|}&G=%XTl42QH7$^$ z`Bya7XaRQ*&0necHzSS&JglVW7Cm|0ZC553)f4tKdINavW1dwSqMGJE==E26{p*d3 z&!n4|9A^eA&(s2WSz3Ti1*Fl}5Lpi`phQdw7wM>BYM&#|1eF3C5GJ?`dQODXcY(?WD6ERLsn**^75s!Go|h zDVMPkzY0FPaSGUk4~8)kpb6xSa4Z~~dFVs8W8oLxfIAK69`DAj`U3Ukd-@aqN1mn4!?Ty-McglIP>`l$@oSmTg zQ#8Hnr;~Bu&0mR6mrAO%Q7gTGaF(a%I-h@&=g?M9<P<^ zbi}ypbw7>}bX>Khr z1u)#N<`)^huLTAo!z3i$nyv+|$ILv~qwzhA#r*;>Y1?%e3;GFgkIQtI0U5sUwF>xG zE4W&F&Pwy&>el?%YbE_l3yKpGCY(9C+*rD84=#6T ztp&zqdHmynQUkNtQsXLj**MfN&W+YIsmVWXgx5b1QxBZc`t2uF95=pQ(mzY;N;4ji zn$AO+JXO=Jc?6-XV=ZiH434BL3aP_vA>`9^hFa;*JUUxE42{56U`&ciD}&*+G-JRVgUKUx}}f~0(K8x|=M6chQN=x1vLe*txqK&KG@ zK?%S!qw^V2909P}3=~0*9>9e6e%n96sL58C0Q5>L>A&JW4109>#5ROuW?ibWaSOYN zxW|7wKn0W%h-+z#pcxH_g+>wSf%#`?Rdx)@{-0TPj4GSH%AJ{*tPr zkFZmJy*>*os?_`Qh9nr>IwPN+`d|fVJ_VgmOGf8MuXd+rB$V`@ey@UGdqM@E8RqO! z*VEXySphMFfC%JabLVCN5^0D4kX>iII~998x1|e!{hcS_(ddWH8FSK9r;vhvq`r0u z8r73u_hcm)|F6@Y#!|GH#ugRK)9b#c1yURrxD$-q(4sU3#_aLmfYv%^N+W1b@0?nl zgU+XE{?zmE65!4pwbEF#7!quk0u2+K z_89u|H2fHsd>^UuG78&`v8XpnRFu~}9f{A;Pttxjvwie9`SgdtfG-+A2An{6qp39X zxfANH+ZbK?%{SHjUK^g@9)`!EK#567^`)!nRbWlN4DbYW@92r?9oP}sRwr;wM0)J}5MnQ@m0Px=z0x4dKq8Zku^Qn;mi*vD*zAZU z`_LOj|I5PoiGi0o=b?{Y|6FISgmavm5o*9!g{N~(Je}>_AnB!QdV#+ccvkqiOu zXj=s^J^8Xc3q_sxP~4-h8ZfjKFcdvN6U5NA$YktBx?|BCLCS3ZhS8NPQbvOhmmFz3 z{(`0aWMsLZwBC2yjmW(axpN$gN+tVhcPoY2$rffyxAmLb60^@&jXaBD!0dA4Arv)H zTaAug0_gMEXQDPbZ=tp#&q`w!)fj*n^Sex7WTCc3)E2bMSBRaD@$_R4JF%IFBA8jL zp^$A!z2WV{FYxAvF}XAPt7-r%2#^#8~0LAK1W!NaG4)2!4;OP7CFqB=2OI(kViQVUZKa zPxl7KWOxHpForHp4k3j@Nb~x4dHrza(CF1WcXPNCvQ0j|!SzKhd_VXrv3__G2W!ZR zir7TpC#dOX8C=0Q77fM9a+%rmHBQD=^HZHEd?2=a*~(~i0<*CS{M+MSi>8MDkWHl` zT>!6oVQhp&#hd{E6&*a$+ShpYWd&pCQzu&XmIs%{h|CagVuUxQWWgbZPwWJVtxY%= zf8tIgXiJ@W63%swU>N8;@(oDj85<{nK3X+y0DS-$X=(}BHSKMr1yVamFcd@HKe`+` zKAgSI@PqxZwsfgQ)h767ocGMzH!9Wyjry$k#zT?_muZM5TpQj|xg;>H;WCbxsUd6luct5|s!%lnr(xhJ9d zk1b&eX#CUbLE~%hByFxEA49E@1N3K=5c)$8(xl`Zp+n<6tj)@?hM4NSTGK%rq2|jq z|Gm!rnvNf1(~*(Iy1pzNz{{T#%8c9VW? zm(_cz${y#jI)|w`!%4xuzT|b!M<}{R+_Ee)2BWmm|i@vJ5kE3h&j_&Q?>6>SXF6(plV# zPLNeoq_cYCGtvh#3E+{5U1uhCJJ+=~*R>IDLEI=gYNf0T{99n!@c55-{GVxlno(@Y zc;WiOL%D-Ym}$9A*D4)eHc-F5`b7@evM&YSjN(+JpA8@}ML#b>atfa+{^WV|WHj(( zF~{Pct@!DCy5jLTmzx`p2Fov2lo{I2J9Cu8js4 zAB%LZC|P?{9A$y*lBB+*R&YzNN`1y#&l9VY%obdf(E)kcYB9G&|mdWihfTR<~QD zrq>r;lVB`yDf*U{{3#{=D*v_+A6!O?~|(H@Xh{ zTk8Fgn6SUNDnbl^HnkbILzg0jagHJ9*WBL^V>kIzzZ%DkB&K8X6g^;hf_%nL=nuWz z$MSE&7dCOFmhFKxOkq8MeVIJZbrwljDm;o}(BN~R>zZoLY4SN&aZx#2Fw1zc6&CB5 z&H=2FoEu!6P3N=9Kv!LgDC|Sgr%}}S1&VOlrUf!#6;5I4)qo~DP%a&@nBf8;bg;o| zoK$Pl&d1$|RQ^v(s7CJ$uTZCScGnX;cJKubK06!m!sf#ISP#Tk?uq-GTu9#jgw=Q3rP~`z z`oA;07%W}X5XlUHWg@enn1pjo)O%KDo;6JHX&UIr%DYSPnx8CI?k!urGJ*j;gUu+#1nMKgI`fwk2Gnf4|qi!6h?T>@itq} zSenL{vfDZmT{eafNB2=ItDG844;aiPk^z(hD$+K_UA6}ip9GRW%+0mD{o0|e&|kHZ zqiK#=ornq8&pNbOt2{hF>$ZZc#w;xn7Dw*>2F8zZRn&FT0uSXo7G9H;?K+%OmefjX ztbl#9-~MSC8a5|qz9Id6XiSb{VN#mb@9?+{)Zc^oz7Gu`}0T~w|rv-i^gTu%` zB-f#Leb__ z_yK=hLRcH0f8+Xjcu$4jLHQrN`o!yJHNVxU!<^qStYr$hT@hZAp)2OF%rr7D zP%;F{$2_FdNc}uQ;~kh0IYJOLrgA8!5@T7W#HJq#72+&F6h)%4H7I-~=Q2~Uo-_@E z$OfQWjZSs;aKYkENlJ>wnuumz4>#=J%WmA{YIJ=8fQ@O^w!6{u852M!Ha!G)5ONAW zkD`Aje1Nn>Js^mi-PcHh7-{Fzmx{9b=H*aU{hPQH$&~fMu|vC|uug!eNu%}&*z{1y z3wm>t1~r%%)OL@a{OLh(4}W*XJxqSIb(R}7a(8^g2x{kQcRXX%N+JFzGmGJU+9dR- z!3FyOK`o-Tg&g0c?&jE1e1Xv!z8SkG!X!RW;g7Mj@iUrrQm}R+c-n-LT_l~W$*r?P$(ySlT3(D&_aUgLFY(T7Q+&;k$Jo(;1Lx1eU#?lIGN0S?A zftvs`X6koy+Qd}HB2W70emA5$=2X_Ta;?Q4aY;9lH>RYe={dz#v=JRk1-&d%O-|MfqH>i%WBc-xaQZ3@XJ?*#FGv`fm@{->13tuRDzTlf(6E z;riXt^*1~l>i?!E-(e88BDIK=mt(5P0`$UK zn+fWp3QjOgP^;Arlphl+KLX_+3YGtzDnA0{KYh(szWtbbLFpuSEzu7(U zZY@x@2066iBhMpn%p#h5^)ds&Qc0kF@#~p~brq|*f|7reC zPGd|8ES`?xIDpr;yB50pyzXXC$(M-}eVRYXY2=2pv!Q+a)Q-TMqIk8WHg3noig$WBZxMdQ84EFeao5Ay1FIu9%3@`K=V3W!xj z)Gw7HyjbwlF+)Qt^};?m`voTSd*3mAGb&gjQ0Gbu)^(WAk7?LB^shEH9wxfNG=R)nV7lZ2 z+Z)5h!}Q-u%d+bW1bzIL?YUK zAK$EVm8;rQ8>T@ASgbejJRA4*+~e&R^g6sjPw|(}b_RPFVW7 z?H!^!vwRSA?W4B0Bt93cg zY3mKtku zk_Mv?4269PPsSJW3I~0U8h=3)THc+P%d%Uuq$0l(tOye%^0P)a4|lafU$Q z&^&?zRSZvGHrD7k< z>tAj057?JVm3W+A%XuqqP;;GvCcOb+b>4of9Mkt9(c5#CPcP%_dn%7$>MMunNhv

tADB^ba}oNklylQG|*){R+oh$_e|FsF^f|J=(-He#QEi z`dc2lpjgx_Yo3cg=^^}RuG7uXoMXp~p~!#^z(9_zP9Q7dA(@*@&I#p|mdV4&C;E%0 z{Lc-Zj#U9P>K$RV%>2f6K zz;ZWA7`Mpsdzs1(l9KGE6<(^ctneI;+8339>3x^>f`R7$2C?gAF|4{(t8>j>lsYra zUQn4ek65YZVgFyoqGpzWSp;TO$y!|110|?eA9z*z`PSd|H2P*#OiMAYyLuOdT!Qfs zLeT4iONCy2*MVNO9!<^i{f{&;%Y8A0cCj6bL&vBb5Mt4kM)TEFkM^1*UHl1=m$n8X zymn}K3jWgY=f)onGe2G?uOFW$xqhGp3Sf{e%+UHw?xFQ5$n^Fp)DX`@d<5cS5uc*< zdASI=y?vI8jO(*V%JzBrd8y*@`AiGUTCB2E@FfIX4UW6tou>5}p5=8N^Y*zrU+W`H zdtC3p1gO(pIHa~+kWJAZO~jm z@++J^*V~@TRcHA8@B6xK_qh&{muH|&Pi1vy@MUke{a#lsDKgD-=pA3%_k3+X@wqn$|c8(iPp&G5Q5^L?goWM>?d!JH=lYCxPt9}a zJ)i4+U)#@pu00e$;5x%Gdv_qbdkk9S^q|FgY|*s|T|3R^szTS!QQh*m)_H1HnEl8@ zKYY>;jL6oH5z>zj(T_7dhu)2V2_&wqV`IV{8;f3{8$CR(ZRp7eH0<=a-bCjz(0DsG z9(b8(=j{g2tV0ipD}c#)W?!ZVOx^`d9PCS51(Q-|5wf8>K0vH;RhHSEwrYyhsZw9t zO+FXQW=j3?bpw1p^o+!Qo>to8U2$5P8= zkiy-HRz^A%vE1p5q!t{*vXRS+PBabdT_8{j5zOHD^fEX;xeN|b%kU^-DFBUNlbSF= z>`op-dr_Hw(c(O`{1pT@ zkqXp_{>P=4XXYU>mRueY2@;=LlvweLSg~m3B+HYI#l^Au zR*Tuoq7d$AwV1tH%wCap;>B&bLTQmI@lC}oYm^qLvby4zppTX{O3NChWsTCDH43&K zWxp%D_1LmXv2?H&dGei?CserXOZb)ribWhP3zU|9d2F#p9%SKhYdg8L$P$ZOT4YI! zEWz%Hoj6)#iA5YOvZO_p#K;nDaX@Tc5j4{xP%N5h5h&kzfub$;7YT{9NR^h8!!0L= zn|E?}aqC!`X^|=|Ql({M9!H|(W0b|MVkx9$tzuC~%UY#ntrBOgqDZD?tpX+z`wdsi zTBT*Jvbv%jXryIhJ`Q=bh?EwQ5=W$PFD0R6Kc(fYSIbw9@xPjHIYA7r(emMZ%ZKxD zGtt}+=NA{Lm5SYD++zN+7WXX+mGAsQCHkYS7R#4K94*U~mSswuWl9Q8wS3#l6!`Y| zMxIz=-4+ebjCENQ?SsYiR`kssu*7;R8a%>77d+9PiUv33dWGIizLDP*k1N_qkvLt6 z>!9c>Jg(3k&9~uhCB`?A_*#kbOC*j~;`te_&2P3B;*-QMWp>7hTCVYB}d#7GU1ag|8aODKeh(d;;x{sY*bH8o$pRi z-pB`j=|fC;Bc~f~{e}!<2r`*BI!Acsrc*!+4z9zDzhv9{WAnE-4$cFkI)_J(f42u7 z+Hk9bV|qFq7Axm%XCNkh#yxMi#E5>R@)^#knAnBRrbh5VPhQ@5Rf2I92LQ)(@(!N$ zvXEBVdPxSy!@JGjFtYyC*yu=0aymMcI#X~7j3W*1%=nOQK4kErhxw4nhb%nMVV+dh z3Ukw{vErK6(*~&#<$dZCFxQ)h%Tw#8tJiptq`! zxwOiiZRtdimE*R|R+|3n{BC#+hgg|1uw_myjn5xN_=k4M-HvdM?cb~E3nWWKdIvMz zc;1D=x>*TwCWv>xkRQV!?{<`X-jj2KWGpl03RQQ7bvzdRh)al8?dS$`V{Rf$?6Grs>P`>9QLaXqn9>DG-Ea?sBtP zfb~bMnRA0{?NXL;eGzWZhf-QX$;9=Dmd~i1?NacW6Yz~z^hUYkYfPB4}SydEQY_JMF>HCTs>9}bS+`-Ur z7p%C0$6XkbA;Jg#PF^@?`oPZvU*vaF^oO60x-$@m8~71;eHt%plXi-a6eW>;HZUV_ zRyF!~5q;F^uQ1@HGl#Znl}85@?_^$HKE$qGuXkxjUM0OCa;!FbfmeoJfvYlGs3o&< zA%K>B#omhKX%-+F)=kEVW8froqFd5^TdrvD2Hmj z{tAU3{pk^X>il3kiXi{yB|w%0C8m#djlUAFu)hX+@auMi_!_ayo^ zc>ODQze^EVS4qO*#>TSQ&SZ4c6zT8~47wpTFLATMe_RF%TsTLRgB(3+C@vvV`EwK3 zWIGmCSolGi-jw{h$!s6k*VZw;KiH8POuyS=-Q^lNS?sK(_KBJmoR6E8qctq$-`WQl znL41Go|Q+0Isu>m^MDbK8G8j;x%g%}6}o&Xbnru*oPIuB2yc2FY8KSjEP(+1|0fh@0U;-!Y90DrM*8&_uU;-Rf|C-%WdGzGFr1>1o+_Be`{(A|N_0+1K*`V3by<%1~ zeWRNJBvPV%RL{RMW=`0CMsRXd-is~$cRp?sb4|l z6E48Lt3YdY)j*|(muem+T;UcQ{U9 zc@cpiOK@-+{~`Z-#;sNK7)DO-w3~eH1I7U1s}AK4ypH<2l1{0goVvztVUU z4>Fs$D?-T^yogI1MxrY|Sp-vT6rt=Bo4XNlPCwn^&xwec{5kJJ4ifsKgmax^B%JLW zDoIC5PpRB&~HO4XmFTd7r|J78)e;P%hV!T zE>!bk$Uo|e9sq5bYOS4FHE~?yJ2sWU=dkV(!ZRCw)sUrd;i0rn7KzXgUoq1S4bTWx z3OtFjFZiu`K+mduTyr4phv;B*D2p1D)>!FSsK(W}nwNuO1;CyIwZ=$j!VgGahG(u{ z2wz^DDsYzt=2lPu7MROO1K}L=z!=-Y0d$ zz~@mb{o5GKRX}f9e8QJ|r7`I|vwNcE+osXpzYbRWobNMC6jDe9I1!FCL1_AQ$^?;3 ztWC#TvSL}1EK6cBa!@y4>kE>Ii8c&*`4)vCus?i;D{{gB3r%eD%_a_E<~T!W@iJ(I zxRWG%qv6%_(Dad%+;i6Ec3YEOQk$52Pen194K4#N%^^I!Kx$Fwr@3Hy#9g4RLF^fh zlD=rIv^8(^DXBdSlJWJdsY|NJBGAm1%L~W^QRw@b#O|tWm73?$T$EdO}iiAlT79kg!$7*XHtv;|S zz$4WAIP&RHdztvKyWgG#El2Q|wRsl&gMGxhC1xJBY8zuOYXG~>Hz8yVpp~t6p>Epg zY3$km~f=yQaV!OH0de!|N6SOUj0+nGtiqYlT=q%6_V-V05=*?xHN2h8bd zO1{;E(v=DGfV$t6HVp7jX{mSx>55ttJKzE3i@6glTG=>%EL?jpdqUtx(%u81`ms*H z;;TmLe-bthsK9xsZ`4Z1qS-ktCEy2?V4u_5x6}Q~BocJovz8_iz5VIxl?H|iiwMdP zS1sN-bxE*4jDE)NuG!J3)(3~K=gfxKx`?h={i?>Cf38$g2v;&TT=>JNDL|BAY{?N? zN|W54#LeZn{|J_`T_($8vC>u^u)OQ_E5Py=DpgW(J{um6wwe;=7|HHJ6Bx}OT~?tm z^NYaW4pw^8?C;Yd3dN1;voI(NZ!lF+>~EEs&xR_t-al`q%KY7CacWKhYiecZLw5f2 zfK{o*Q?UpTK^sQVA@(eof59S|+Yo2I)Se|WsqBUj0gHW2Vba_j@)Ky=9raEfqpfRU zj-=@$lyyzv(q;=k6#dQ*E`w4Grld?#f6|&zs%60`w}TnK@6O(EO$uv_?cy~pfK{j5 z4o3I|pZr&>(aKtUB9#5h+f3V4nld33A0aoG&=)Jrryj%#GwVgQ!W6@ko?2Gp1~DiT zj;8m2a68tR{#DQ_OXQ;8>l469)P>S%qsno0RqV3a_{bT*@4@>(;I`hq`6k!LWiSt_ z_3=(jzPT>g-v-kM4J$#!$6P1H2sv6=Mq4J#c5Y?{yWDD!WSa z8DJLw+A_fWi*zmq7`2F=>nswzq10K+Zi8FMaP{A~IY|A1T3W8gGRvV4waSJ8B_CyI ziMV%afpZP=TYDf(j~w2Iz%R?jln33e3|*5w5R8f4Q-hYH;raCj1up_2Q zt)@spqniB#ISVwz*keMXcqMl)Xk^OdszW9hjF_XR6d`Dg|91ej7atRxPQs%7a&lYt z9@eF8bq>eED>~rT`$Sg*R!MCS!q&o^Qw_($O^xfyD?h$K)5qbK#;s)AG62-i*>J6` zJC{mwVs^Lv2;29|?pBlAwlb%zeF`d~L2YX7(hPPSHz^la5npjfC|?+Z2Vq5RCK(Ur zVlMoqrKvX_z|$;}fqiyqH#?~WKf$Jnoj}z3d7kX=e}H}~I@yGnNhjRaBJ5?O36?x- z2Rs2{P!_@1T@#37(eZ@z7Sai2XjXi*f_q%p*3!DwXnNA=#t=$eiZ7`Y3y2-C;LL8% zy2$MlxW{8#-NC+RW9u~*(h;A)$dNfhzPw_kQ!YXUVH=n!)$und8mINr^!7z)6=t1R z+@KYdFK*y;;o?84wEYe^W?l^z5?q2Oj-aFh5o0)DFZ~m3Exf#o?4QeOpCbW!M9W7% zCkpF#S#z0rtby2u`SDX)}g)!_R=Frx~KiR87J5m*JFS%ls~ zrHz5s0P6Zu!%YC>WP!mk{$hY8)z7DI8hKX)_c)6{XW4~A0{f}Z0u%FDqrrnVX1FW6mXd;+ex2aj|! z8C)CJa_h-k7h@CLf6y4ZW~azKNraAtoCkpa{SG>2eIR^uD{m;SJO*Zo!yBE_aXaZ% z_DXapg7dPDr6tpnhi0PU9vMVH?bzWxT5eA zzTBK$Y2YP{K#6N8MaTDs#a}Dgd)Vh+=jnL_BJW)AKOgST)o%yOtOGwf2o&{F?zNl->}MS?)=P99qos%fxgiP!R&&*TrBJ(gTdHx|d7K?H5xRn0W(p?5 z#Na)!BSy{7__*`)_aea6oS`2CmDwlW3}r1+Gcy9z!wm}b+A;m|$Vuc{f(gd0*M#QJ(VtP7zbd?Kdj1BTbAtKv*yoS>`53%VddFcj zXzCp@<>2rcf*&Csl|vMw5gh7XTBQ8#X(mCj8deI%1^Xk=*8v-*fZ1OOgiZo1@s_Y$ zqv_YTf@L#jSej#Dm)0=7Iu>rbXB+co`!`qCA*;a(5_1w)j`oinb|y4CA+B@8E*%`8 z@pMkjF-$(;G;TH&L#w~~1ZNs}cn;Y>sOufbkJ$C%Dh>`CY9J97H4a^61E$e7Jq*0^ z;5Iw7LTDd~DE_n%^~Lh1zf;8t;r~nlWL*4TVB-JECh%YJvvpce7)IVVw`{d;iVCt9 zvz5B;U@aLrW!EQZC999wwgyXfBx@xrle~%RJS7!`6+!6GpT#dpW2BJANHDrZBS&6? z-#bTM3o>cvyCp>BFF^k9Jkx39cl8sQ@Kq;u{#8=ZJ(HbB!SdOgk0)_gV^<}U_X`QTKg(dI`|RB z5r7z8=uU#gEW^`wvsSX=7>`yS+D18DvMbpKrczu>1W^EOXCj`@kIRfd?i8Asy7RM( zcQIS8V^KwjAyt9Hv;)U)t2llw64&M`6JoCaO>in(;tnKk%vDFOa{cc>VA~RRB5_-; z;$69Z2$4El;x4cL<0LI{Gg+NC4ZmLRnfM*%?S$Wv-m`eQwaM9>+Ki2p3b7>*l)-PS zNyE#zKR@X@`~oHFi4vDYFgZK?Tvsdjh4@=@*lXsXsbef=vy7OIcoyn(BM!626uiEG77wa_D{1#&J;ubTIK_jF zb@l?A{m-$WnWllJ`MgBY&3eOwyhP56X@9fHk4;wVp@Jiw7mEO)-DK0lEVaz}JgSO6 zzP4t0EYx2@Cda~&Nf$%XRn)b~1sYcvr-`!XUzc4GOcoL8-;`bPagykTK&py5NJFqN z|DNoMPg)7e`s=ed>?5-?d2y~|;XY_C2)03!M6edJlMg*V$nLo%$6q%Z+z|q~noMq> z-lcV}e+^y*@k$KmgY_h=9|yLA&3x`K4x}6?S~~0n#LR8S^LduH(ios6ZqRBDQ~via z;#j6%M(yP?Yl68n56`(Pg%rcrwrPGf4K#2jiM#)Pym21c_Z zZjCcjupq>iLh?D1KRq3XKM^m(O2VDM`zG`okC}w|`#Z)wh)X3li^$xZ42;ODclX^s znLMUfPOg7@uH)scU>Z4&mp{HvAJ!G}_T^1@xBfb;t-SZF3kxxUeNNAHUb|#7U%ru} z|5A20Y||9p63fv8v58&I(Vyg79Hz%i4)hPpNnccu^X!^)58Lo}NXORo)T9=!NZ9{=pTYz!C zdm7b@)kBkMRGQ4OTz#pDBlVau^)~SsSVFG;8nb`_gc1hp_x8tD=3n{Vt3Q}nP6p6R zwQ-$3p=-imePmZ;c(P#+&LBh1p+?cz2kBkTH(!^J&h>X0>gDmG9D-tnWA@E}LGUHa zDU=Y1J7aL>9_*Fuc$FhJUcDSJ=V6^K#^rdAP`&@XykDbm;}$%Whltu1`8V*xFXx$n zAHe*CC58B@YpvDPDx58B1EBKT3s?tlfMT4JanIVlFpFZfrN}_5{5W0Vd(RsEQGsaa z47T3BL&Sz7N@GN7{K_Qr*9eRYO@D;^d%(nBwGX2;t_AYJJ}TJf(1!wsAq>1pVPGp@ z;I><%G4Ns}hFTC*YV0grUC^2^IwEP8 zn}KnHZ2V3o$kTo%vTf~cLpC2COk`UjQ4`tv%7ck)Mz1ikQGS$%^qUbt9aFzGplDFP zIgEW4N~tt3Iv(olAPjGr^DxpQ*T-#%(BMy|exsqTDE+35nS(k_8p>0IGQJt{48)<| zq$7Gkgnq+%jK{_+{f50L8|J*0x(<7SIM&HHaV(9EbY8mz5%hb#@l%wbmgBauzq>C} zJ%rh7s`DcGy=-wh3Sdc(g=Ga#8>LU}#oal#R2Z)Kq9x47iq}m<#jq7I2R9WDr#ohK z7JSV!)Q2{n%EJRZ-6|A)K-qQ7G+0(nKOIHxxA5fEwIFqRo^U1i+vq7df{cGa669@8 z(nZw!@nH!JJDn~Xon3r5F?D=LQ;!}$9te@+b%TF{ew5LmCoHE)ql=FsTL&xKfYH#x znah0Pn4L}{gKXgBX^;(WyZ%yR%}#L@C!h9%HA{qrExLqQWj?%s2U&x`SP1?4NlDuv z;4y|=8dA1vjAEpy*FV5(v=rYMXQ@C$u5N&-aZel0Qhei_r3yI~s?6oVt7CN{8~c>~ z*|7a*80xpL-=K~4fPTPZ+g~kzdxC6~SU*yP`No&1T;bW!E5*zJ3H);yW)nwdB>+CU z+MMntD3E%^({3~;yBHbhj2-@K0VS!QdVTWB3T#`4EIB0=$Dzb{4s9lGL5~Keu4v`u zhe?&kLoD<{Vj=9MGk=1Jr9TK-NGr$8-iU#t!E(FshE}kIq~*3qA9`I2d^naK+q){HM4r9%YEk`r%} z@y}M{@2~B3W zYo;cE{Q+|W0N?iEHSBMPutV^J;1L4YFZv$7Wtue(4q##h zFmb(Lq9_B?t^k60bHwtN1EciL_AmnjFDK>ZlsSNfiIXnR#VW8e2z$|uJP_Jy^6%;# zV!t_vQ&Gys9|HT;7umpm86FhaorszHFk2*w^Z7@OUm^O{labQ88Iw_>RCERZKY>Y@ z@OK+Qa*ROgZ>t{U{$k0IWXH^huHXe zIV$Tgl@%Msp{$RptOHrEb-a)Dw{gr&R)sE5h1%E(O;CkWRsHD72D0`*=YOp~MOoWY)jG z+}3_Cqnk=E>Hj!4iYB(^<7C?Fsg_dl-LI=_UQoi)`B$+4ir(ZI>Wg)V~*(BNN&>7A9Yg82EZc zS@OES79nLEmz_*W{TX6NSzDI+iljUvWiBo1|F}dhEb9M=M9wMdUnY?@YO#7c%1*`$ zRdy1}mL)%cUt{wRZG*k&a%->`VOUQ+g28USH8fafCMRMR-i9XHX)F$>UwA3g@3yC3 zXgm>4&*;VU!S?hFV@f#v{6u`wn|!f7{d{9YIK4|Nrnj-DcQLY5dP)D6Ug1QyR}ZP*R_0?x%KEr|SUlGEf}urefH+6P}`pEd(RS;TCYPLL4lVBCS@yBq7) z+m$E8760Sf$*cp!mArTM4-%GMhsPeH5t$^c?Jjt9NP;imO-b?6e~2&836Wv^5)`T@PS7S7q8(!^*#JHO z#n+{I_(1gf`9**+w$+ib?h$++DjV&1;P;^cd?h+QB?t{2Tqc7#Cv-G^gdB?03e!Wt zpMWUForT@xBVPhyolqod=<=w>&)s)({Fz42VQR!Z$aykA`2?hlFZok;xFfP*BqX zUH^U-+SHRr{t~bSST$oDrloY-gbXc^r3J>OxGM1N@fq5Hge5{eoob=}$b7RgZ7Gg| zK*YJ>zv9OqH7>#DT$o0FvJ9;JfA{$kvV~^sr_1N?*VT;dZ*;73;TB%JgA znfn&_sEX_Vgk&KgaTg&FL2RN?6Cao$(L{`HFyLL-g@CA0u*O#!tq+7NbYzh@Zc9kUEjtaXWon)ar>U8HW)Ft)~_EbId%S(Tug()Lb`rduDIRcXBa{gGC+ z{wBir1B*!I@dzKE*Dk{6w?TNHy>^MTFYV9gW6YgM#k+)xJgnu$<_ugx6$xuh63$j6 zoOAIJ1bedA?i5(IJszk;lO9(KB>0hoeyP`#I6*LU4;O)}mdGNgeM;~7Zy=r}rD7?4 ze_9Ns>#x~wul-12{>UX5D!}|qE!fQ+yfeieyw6b|?pFLJJ|`6ajel40k8dh0BiCe! zc?8Q_oUYyH4urJ8VRvA?2WPp!7pie{&BiS-`C~I1=RMOrVJb+&zgo8)aif_}PgBi2 z2Q{FXPnE?qbNg#2Hgk4XwdAyQZbUOLl;5$<^!JEqCMtQFmGm^<6|qq zD9%vM9k{km<`1O&@Uoyv({ypj7p zC9qO|r650zhcSHCm#`1nK3|LeK&#PUw2-YXGydAiz%(o&6N2y8^fs2$2ch87$Tvc#Z~P1?u@l|S3`XGeaii_6%|7HqvIdxE1K zDXzj@-g7;AaiXVot8X8uF!E26V87{e3n|tZx*sCQg?tzhTSB*sJi<)C-a`ts7m0o* z#~+ME|3i(1U(o~y>5xtu0z)s(+aGAN%2)gm@hk9uQBYBoXq$LNMNv|RiQOye@z%jx z!Z+`*&`sz`BqV$JIoW$P=1=DKW`zc-FC8al;ETdn3K0_adZs^ky=}SF(b$a=0JL z+fsa;R#4du1NV+8zSI@efy3R^{6%zpJ;Bj0yilD$zsvU|=7MyfNT_UM{%G`&p4$KU zDAE@9^D#-pk=db7RIaunLe(d(f&BJ`y z-Ak)YVfYlx?^v#+#)oxhSD7|lNY z*o*sjuJ#Q;KGy}DCz^dwS8Z3hiW62AS~)R~cWtM+Bsi!}d7;~$8V{=f3?A`$x9Yrhoi(=t23ehEU@ zYyUxAB?zG7v4WZg3sY_Dlsh4YFu+G2Jfa~~#FhhE=Y#ywc%Vb%S90W6O5~R#@+*VC z8b9x-+5fgx+pr#8(yG}@w!yY@HEc(TSS3TMj;5}gYJU;Z9IRaq`VRa3l?cIT?0<;_ zOZ)N#%6Ttx>C-xi*{<>HBCN2k()356xEKAC-y45OqF^e8Sx%9R6IXfOM)FtaINGL| z#9sRsnJLnmdS3(PssRf-&mXpNUjNc9j*Z_G-d#VKqd)OkFVo6VQX7e<%vl9##zz z8p#Z}nNhes72Mwt?y+Z1g!?-aZePH?pK#LzuCFQ{=06rja9x9+!1a25 zRHhoY=b>;dAS?OQM}hB@5(7RX9=-T?t^qivT>h%;1aA-aa+T;Ud0R1w9?EMCrz!OV zTD950)-`VUZWeBt<^`K|E%gLTvpvDG+`)PK!;{_mEs5^J_a+P@Lsw!u!JUNwh%K1x zl~mUAeG9IHga3QRmoJd5k;%e(b>weP;RjPcya8LdcU257{D&_T8pmZ4Tt#G4T#fzctZSxRZ!ap}saZi&`xjFgj}pw!bXwmpzAm>@TRR92}CRobxLI zOpQ7GKq15~VCk|SLRG{guu0*AC)YUcz&oMo5PjGf^kg=|g%g^|*uoSyG!v&s9}3N6 zH#8HRo~s5H=;e3+K)LXqF>yF}1fxocLGv@>mzhB6IT%C{FKh(rnCo9oMejv<0ceCC@}9pcAgWW)|YKx25qOlV)_qB zNxmLf#Pvw*kknxXqzy24XY~lfOoozSn>-MirVslz*Vx1i;@pPSw|^bO%(kxA3J*@} zY+rWGBixaq1?nZIIsX|0$D{2VoGCX5;MCAW6<$d1JL4rNvC;UoIINAxj?+IPKRpn`)ubP|w=7+vrfmVn!5cBFFYWzb zU3@TWr(K>>2yytH?_9KS$O6o~w0`>%>++&;SgyHzH1bGq5?mI;6I(y9`^5=;M0Nq7!&;QJ;dJksA^&G`V=jA23Bdg zty_dQG%cv*f@KS^A~PP&g>=?a4L^4kVRPfWPzt)OS^=H!B9k#ROVd{K&+cT4JItx7 z3at29Z#7jtzyp-RF8)cFXvp`wA4De)j&`!~Yy^Np$Q>L6{6}TTQk|Vh3?66(2015U z0Q+8~II#uFTyE>Of4+UV9Hv9CSk2Z<4H*!aduQ2?zL3 zl1BvZ=>Yk?&ztAbZ-o5bPx*~thQOfz0`4CgD>ce)Cc)x^X_wRpZHG-^Sa56yM}6q; z_({xDjFF$2I&$d0BIbS5KEDcuO!<<{%;>GLSx%YpTQqy)8K`c;JlIFhe2|s7$JPggKoLEa@&?L>zvvy7;U0&K3NIvhPvfxc zZX-c#@JOQ-p5}TjFwQ~7$^e8VeT zZ%mBwtET8X=ch-1VYVGp?s)L;D2KLT14^~B?bmXmuWj`ek?sYE#}j-MS3x%?)AkNh8IMiISn{tcg>`%Qer%D2Nfso(V37t2l2={qz?)|g7a`4qG<`ww!33oQ@|Ba%X&D<`Ud8aB9+ zxUp5ZY1%|+bIGv(rRl%sBD3!tJm~cUZI@%blhWc{#DpgzO0v#$2kyyAcLh7U1AC$6 zwQljZBoY@H9hjC_2h>FkaG4oj%H2VffHyj*m|L^eR}1*i+rfw#parz;!d+AAJ;AK4 z&{UJNd|!rVB2g>cW}j0A&IgbqcJx@4xsxwwbW7sM+d;A<{ByvQ6d2Egl$M5zjMO z3p!JPFXd5OmeJaYSy08vX(>&De1C55si>(M73$xvoIBn2y*~Tk$=f&4eIoL4?epGn zVwTft-^xAz`|YbV`wt_I9V22Gl{?`{YK(d0VC!J}Ev@cg{*EWB6Yli{uf%`gt-CO0 z+24>Xw%>)Wm)|g1F#%G<$qs}tXWtj}2S56`JsHP^vi|w#1pGsEu{Bvt$%oBR`H-vZ zJ{?+{2@D)B`?|Kdyi4OR_i|3-@`2{~*+fv8<16Mumkai%@f#NE%x`4>J6O^!rQTJz zgHnD3bc5BtPptM_iTuVNoRo61k)9#Tq;4pU8CZL&8WJ0m7_6H0;WXnh?AyzWD*(-{ zG{qI5a;xEg4#9!@p|PsQ>$b1{2)Q3Bg19vNA5wrPg!)9=8XZ;9U&4RcmTV+`xltp# zZoABYvbiHy=u5eT?=eGy^nDKXP=*0t%NQR1Qxtwf3aGR;`X2vF>OaS0lA;2yQWM>8u>iBsaFt8u%4+s#>p`xv~0jV;u(e%H_2@ zRqnt!Sqyhujm&OvSqfk3%ok);Ml^oG+HHZ_lEVv@Z40s%n%S}u_^7x6ZvHqwh>gi+ z+4_*V)Y1`6Js!hEgr$g0P6L(3C%aY0VRmXWoG3EOI1ONiLcY)nnMd0YJ?2G?pZ~-3 zJ#2ampC)}lqW=%*J7d>>g1)E2-;bWg`1zlm<}i&LKY6QvWN@ONRsYhf_+;Y;dP{dX zEIjP`F}{Z*B+2@fF$GZGpMI+^met^u18{hXq|lG z-W$qg!2ho@qAx9)8PS*OIR$4>lIKd3-*TXstlyp+Apl_^1UG^up}<3Hu)R=dt^da= zod#2h=I|G7s;h?bf%_S#hx2}h-Llz@H)VW3{>Oo55s}&{EKOU#{EKLKp)tjGnhqB zt-S+%hIZ?z9iH@HO$a3nj0xid?F+i?%U?rHtYZ;Qswl5P|C9Zd?B#@DT$-rdMYHoZ zV#WOOX295u{`OT!_tJ&|Q?G6PLg;bD0!ED0?3uh-)oLLRcMvS(ua`TD@H?ho%GfV3 z-E4=g3Fr6cnF=!kkGovI^V!8JT_>RxP6j{YG~o9+HGKQb5mEjxaATK?6P_EU ztJU&ESV=s&?<5K(JM#Up>pUZs^~Ou1A7ms%Myov zB+vjHpBM(A@fSe63BUVA0&3V_zRaog4+BgH$jrre5thKTF55zrHU^*2os$_ zB*f^9T~8d%NqcQ4j1fUG5FjF_RJ z;(3t|8a|Zzi&`F6t>_&2fJWY0<}ccAerUl~xoRE;=&j}cqE+UH?U4`V_%II5t3vZC z(Y$eJUX{P-88hRnl9A2Bz@AUm(ts+(XDi49GQKBvD|VJc9E% z0Q^PQnwf90>YvAS`_lOf@u-`}zbLs_9u$YPdqC?ZFrT^>}dJW74 zIIHofo5#O+X_OcKwL1_99gl9+@^DPws^0iOg@!y{YvCg>k8l2>r=^PS#^14I}Zsz1q`?C2d zcvJ-D@qssPq2NvJq|8sp8|a@QkL3u$YPdq7NZcd4!~=)Bxv(dCaA-Zs1Rl zg>f+I=J78OlReO;g<}*=~BEk9Pk~iI~airuVL78rni9bJ&{BEQ7=X*utaluAYUkj~_b7+a1 z#AN=;wdOBRup)ySIN07Fl(G`ixD`UQ%+b23cK1}9G465M2*mVg3~s_k;99r-KvssQ z@X{1el1R4GEHnyhR*(ePg|RUC)#SGEP~ zImqaHl)#+&*sRLs8Ipns99TcSEc^GPv87)(1y*JR?tJ_roR68n7ie89Wb~9wUON+5 zkL(PG;n1jFHGe}LQWNaYG-A^c@dMToJJ8blZp{m7`_CfGyei}p+BoPPFmf7w4$S>d zJ#7YEErIny!BweSnr^)#!ZixBy@@RQ49n`NUv*#^OKr5aPStq>O*hl=-C>r+G4?2} ztkyP3}#v1E=TPVKWuwL6r|!~9PX zidQB3YO+?#tC`#lw@o|DG^i5}V*vcDsUl{ud8%YdRyNg$1}O(~P^^NXMHCF(cIzEg8!g>Os8y+pMmMDHatlpV&j)P z*hS`F#BcTDD!@@GVeD$A&e=a1#7=t>54SjT6Dk3`l|gucA6$VJXh9c*+M&1)faHdE-Ni_qC6 zLZ{thbCC)Jet`)eM=X_mgAO$)#ZnSW9ikzo;vj!ls)t711fVRtwwPbWu+rtMG+Qct zTPl6as(|usAr>M^zHRRuk#9RlbMUFbCt|#0;K_eN`E0x>|9)`?^GRMP$#_O|*QZ6g zPk=~uWTe}d+j&)s|9u#GwF_qOa!O}>&UQLu$~->8HYTJ z%4=8ziZgcVeuW>aOliMZs@+_BXlgMxcG6kKlsJ@TO?v;lp63o*>;m9xu{tlas-6f$` zZAC)Dh^OWbN2bE&DP1fK!jM1~qbcPiSWkdjuzC?6Xm5r*P0J#ne1gi74k}Z2b7{K}PveOliponkms$Yx z6~KpZ&V~S-aR4;|Xr|+PodAUUJ?@7!!4(NOvun(*upC`*7NQvOVN_2ndFRJ^Vj)(t zC+Ufi*T?mQ{kQObQ8m`!?8Ztm0pcIL1bI7n2q!X&QM%E5)6os9W*CPX)3QIp^b$b zng8eEh0~Xy;6K)?^fy%Q z;7XEEBupp^zl=wApT@8-hMi6>Ehy@S77Wz0Dzq;{p4LEAl2qjL@m;4;Yr7&;@yE*3 zDQ`S;I=Lv98i=QVJr*`^s($4$1l-+X(vGJQelJboLB~kHnR#K2fl)yLaR)nchm;*; zcMM6Pz9>E97?RH4ijjthhRN=52d{U~#iSDsxH~pnpWq5&Oss+Z7^^F|DzZvor*cA& z;N57v4&!loLIPs(U)TYXvB|E>$tV~o%eB_EG)h*|e`UPLtpZjOXbhi2rZiua%B1J_ zdI&6b7ANjsehc5qYY_G3@g{%K;}4NNZ()lZL;%fck|!?jk*CrP!K2$Ayc(a6Qx#)_ zjrETyc9ra4*92w<4W$^`A>dR!dl4wVqepi(%cY^n2k(ZCP1J0w@KS8=2J)HY>eh)r zNdtSg8yq1I)EcVnFx7~crfOE`N+t)MCW*8_a1kEpk50{>#s z&x7@g*iq{EqB770>tt#VGy~*TIC)#)>V`5 z>QP&rxpxyx{pAB#VnM*rJ-E|N`IzIB{G0qBt4b@8&)g{q<~!v#r$dSkK!IO`6*B?= zaA0M3xDz~OML$D)F}34D+O3V{nPOmf#r@RCE5Mc@p~{1 z)}<87#1{S~9g?t(!p$I9cgAT!TYfJ_s49Ud7?_B2>Hg!1UeoEeV|78E{TXqaMMmzt zVDxI-Mrj{i9D(7%tYU8Lpm~F9;41CJT7U?gr}^K~h@ZC`al^UC85iIaP!D(E9~=BX z&|&1AwLD)|6myvDi5oEt zKYf5y7jn0UxWXBS$)ttmiLxgE4{$X97u6=8)M2~a=)KhB6$IqQO*G*)$Ingw9XpUW z*NCOKivpyAH*AF#Y)HokHsChsyh=vP8H(fD7F=?PU5I*aQ|I@(mj|Zz7?%@k^pKN% zm94fB6!o!2AW8_4L{FqSgkF<`8N2Dw>`&}YMwubyf6=^eHe2%tt8MS+z)J!L5vCPP6Efi z33iXEkY+MU0&uG`+Y4vyyN$kfXi z1jt_dH-SR07#=sP#aq2F9BhowU*J)*VBR6uhSgm48xxaI2Qtolk9feD0}ssVd+x2q z(1(%QVSKlR6FW}&rtQum%Q$e*;Z^`z#hk`(Y$y*!eJ@_PuB6v4b#dFdK+7FiYdm@> z(em|Nq;1r3Cr$QS3&>Q3y1_-5|%|`JsM&gI}nRdW#I}#MjJW%^AWGI@oR;7uvTH zFyPe?xd{t$bBI)NJ&#|jKJ13z>6%f<%YFGlWHl-1pOk?S!>HaQ3^6gjNW}~07?89N0RI{zb0fDe*g%gWPAYzs}sf` zoa7l*8i2p%4&#A=NeP(wA=MN?<+N^4gU~_`B%+-B-8&t zAG{9nF^JXZsb!a{v&fKH)l8w5Jy-qIZTl)c2@skVm1QolUbqxfC3f)4yIBa1CRT<> z=hm}#;cEmcs@`2-_3qMd(Ysf&T0O3JU7Mo4EAg4il7RcS0~GETNs-jT=}sUFz+4$z z1zaO_3ngv=T_xZ~pa~u{;DMUHNQoTawb%SWmVkZEI+Qz|q|?(L+`%)*IL!8ykTQwG zvC^`@j{^wAc__Ri5|g1He!{ioFUxSs;H=R!dP;WKC0M_n_RuOIhEOG!KnzYwg%WX@ z?DlxiZ0Ln%u>R0ewkNh2YS{ksNDY6-Pt@RH4U2C)v4+uR4LtCh!5TKn7Lm8J#0`i3 za%(*BNm1YrE8s0l0sO{xfL~_m{7x7$CyQWxelSdgu(Qn0_=VX*|Se zM7Weg{`&IR|A}Cbt^E~)oTnJ%vtcM~F-Xsf7zSwoMu<&;O7=8jRz?NfYr`C4il`7K z-5){H*!bh$5xT3GG_O+n|4Q5hf{mWi1V&>V1zPB721&wcjR(Gp>u{KnD*hluL(du& zXeWR7DcZ~&`-hBrjD5<2G~<0jma z&0ZP;Z~6yth~NJEM#?&{hs6@&H3pu5dTX+b(8pQR>itdF1$@W1A~t2JiEXyRwq#aJ zCyoSm(NW&IM#`hEX}_{B8&FzNxY>6gTqB(us=|!OP|=x(5y2)I=RkVlkn<+*u?|py75jP zRvtPCUK$ZBIl~b$@GFK9K7P3kBaFh=llT94c6CboU43GyXbRUqW_-=Fz?P3JgWb@1K;C;6=9ArI;4H)*T#@ zLS5SlF?hZ?(X$3F>tuqr;$q@%L&T*)oRZac{X?l5dj#Y%Xg#Zao!!CV<2bsm(t?mQ=E(e`^YswA@yKf~NWy(^EB}V)J}`#O#Qokw_u$ zt`W_{Y`bpTa||MB(xq(_kI$=OMAE7|L?o#KE=28dwQfQX9Q&ND6hJ{2?axC~c)l5D z7Z^LZ%oXhI3Ko|eS^f{@d^$o~pw~#olahzW*gzH(rlwdB{!LsLMHURrJhl&5AUqcg zjkKi1_@`2(G5N>h8(9^=UwSpjLYLniB#*zL06ES5Z+p$3@Iw7oMg+GZJ=#+xMF zTwEewv%D)jHD(jZHTeNKyqp*uespr;aiz3jOG8TXcJ`>k?LVMs~Lj#jTjPp7SO{K_a$~hxdbHSIyVhx+y8&|+)=^|u3YBtlm=jF(N8~fQ4xx_5PfGO3(M0Q{ z)=Uys3(j=n;R=pRw@#|Q*Sf79!<14q|878mQ&-Q{cVNqaLCCZ$QgmtfglI|uO;u6G zZZ3@sQTFNWm^QE|i}l}4k;Nq8pgPMe!_lrz(~~KkWKYd_>iJmqVIv?USOPK;+tDn6 zG^|Nj0#$3GzdqO2UKf>I>X+D`T;|*bc%|cDUV-(@UzL*ZD3n$Q{9ZJScdU9G#)#pN z73OjLW?4hai&`FUg`*1k1ng~m{s$9N=(oR%ud(gB)bBCt$CVEdBN%Ep#tQ0UX)-Fs ziYo-^gBF6y)ptTRTmWKfP`aXF8L#*XvcYe8&Zii6TR4Olw5_r2o07n1s^c`GDJWr>Nw|7xQ-6E7WNPS z5q$51?>IkL0Pnqi_E|}Mv;0#EH``~)@vj`*aIr}{yi;pDipx1RLpC4&ixWgl&QoN= z&7Tt0+6Z(+L~92LY(=!*a8{d$)@MC@9pW3+S^=@qC&O1=m$0%Yi>MyZZDY!jg8PS} zDLqcelYK&-U4M&*^W7csa2_9w6j&*ukjvvz-~(oZ*U^f8$Ye}jv%gh^@Xo_8Xy@uB z3op3Fk=$DNd-H@s$bO=Vp!&Z%C~Eb;J}y+@|DnUghtWx-KhD?rKSfP?)dAHxX|q-5 zDE*h0)%sWByV*Z|?6Y3rTWtS4fduWu{<-eE>tgz+!hfW%cVtD;{JUWx#oYHQ$dJZ@ zLh?xOZAwP(r7+#6*269gCS6`{67JecM}7+b#howoSy1BJ zXD(Au;A<;E$+tg7$7im&DqT!f&>g6*$HQOL!&41QaCgIlt$SBspay41q^n3F=6)TN ztp+A)0S($8CYv4bxWJVFM&aj4prEWaxw`FAEPFks;Sm~(QwtPl_={e1qqNsy9KhZ* zPss#}aZv=q$pvoB);1J70h#hC*Bmh?)tZd^=eN(0Q8g*lDN1S8{tp1$}Te+t#2h@0@Up8}>qFL*}Ny&MhBj zZd!f3Q|3ob`_lDT$%4$-yo9SaJcEo!R-h#o-&)VM=OaGCT0vT*&PQ1OvUJj&xeVVh z%h>EQ7V;NXNL2H=_7JTftMpvH>$kvir&hu)SV0c&(r~|`{}UTp*}bH0ZkFtpB<^CK z7I21JzZFcb_8iz_$w|KRimQ+H!0mp#`CvCU=6fJt-XR1Sfa0HyI>^E`;*o>?nGF4$ ztEg;NE@#_ds6{_qjx7@SC*V{bCUfTJGK;lxbCJ<75jL!KDNRG?hnit|pm|i5jaa90 z%yNZB1oIBPh0aDmFSu9`cQncsSmOd_!8>uk4o<7sYdW$#KrduDH0Fpr)snKLt|m*z zJFi)sBkATb-e7S7V!~!+s{^wO`3WvwPhJW1T!Brl95{HrCQIs0Jx!DYBVNaBWZBmFQD+7K^Y1U*k>FBqq7Z#~`kYeAhqN3^v7{>c+*v)g*q8UL{dCjsIlMQ5m$IGE`zPaqh zr3iZdOE8GT({9zDC(@*pS(02RIgI zOE>Xyb64h;dR_}k3x;Aa;R5z%H2Q_w4`xkf#_aIyMc=J8_O^~gva=Sv(>-6A(|JhLrRcrjH z;o%Cb<8a`J33ovV&G#G#hWTE)@Om!y+rS_6MnQR(|9kikBwzsGR|k9TBVdVWWLfaj z4giV5ht~j3k78Y#jrmP+zGUDjfIJj+^O9Bu-BXqf8mu7!=WBGfjp^HHoh05~OwUbIs-PMX85qB_Zbwma1BD_6F?m+ZA%U%~ zoHa0^9rpy@cOBlPZk=r=A5qG<67g;A@h~Fxz9?cy1dJ&n120C5Qwx!oXV%GU1T8*6 z2*zq5h#21Pz)p7n-a#Kh$#TivAV5>)w{~&WVK9-8#=xUWel9X0vIaJtCGuJ!bO+~c z4C(0K*x@zgZW&&8EQ%RkYznF1#`fZq2ZV5nqD+{DZQTSKQ4y85uQ;%aw z=wMuYWD;qz7csr6qO6 zkT{dUxy`NH$yy4)J6v!18!_u`f@uIM@9QEf>xSQ0_w&)3{&RsPbpXKz)WxO>4yMd- z2Vao}x&qsa-=w^2;2+NT$jI4>QxQAb<==qTzL~WUpXr|C4j@7qq%Mrx4`exL-+`h7 zHH5J)i6y2_Y!bP6vDDW><#+Nna<{nE*N>nT7}e8om*M@kbZAq|k+)jTN7RRSHYc|0 zhutY%f6vP?T_5}X67{_#_PbkDFpL*-^jPBs1ewRSSiD-SB!Z*?K^apZCkKd$kHwLs zA!j5wmQ7+;{{p?VK<4M->f^n91yTQq>8***goMXCy7fC+!xLgLon9_2`O`}$X~~`H z`^B-}Bh_Gn!r+3FQQ%v|c%u+Pqll3wux@Z*2WH#QZkU^ty?n~$jDD0pxMshvA7jXe zV$nDT8#|_|wJ*k?QT%2vwAn@df6w5+zVK66`nUsIjec;MG4A7^Ec}uEkLR9;qq1&$ zKSySU%Ze~FR9?7WU0F!^J`fr6R?`#bk;RrK8>jpm6ZQ60ev}XG{xR=jb-uOI8QX;DH2Pb3$i#>aMbOUck_4;l*nf0rzerUrjS1|b*zplVu7IExkJ)% zQc&`#DvSx=LXKfGZ_WpNl?0a6~omfbO%D2u{xq2 zMP{yG2wO5Pg$Pl<9IE$7)C#vxD3k>x-19JV!sMBMMRq>oPY+^8o5Tk!gRpS?L2X(K zr8wiNDT@SKBpH-o)%4`Ev5w$n#vR4~849l8q9itPD!_YQYu+K~T#NA&OOKf5LvzfQ z#dO^HiZmSI*#Dv%n6*^?aqZcKvpNFN;hB{cVgG@kvwUFg!0CM|uXTJWMd z0PbP*$XBEzD8(~mVj}{O>)B$?&!wjAMC}Q%kcc)--dcz}d94v;8Cs*L%EX(Wj2D+- zIDn?sXedJ>X}TA1n29~_(tBXS00&8$+WGS6S>4$r%3vbKW_t=hU($B%BkE)Wx zLOKDJvVG9XcoJqWD&cHr`TwhvM9iFmOrf4IC)+8XT=2-Y*9OQ}m^jXagNM?d^CvTEP3--!49Di#uzWgf%jM9Due_(B&c_Uf_XB(1) z&WEVF8yMM_stRlVhoy%LSLuoVhAzR^x?xG2Up4=+Wc$nq z@x7$(My$6LPk9g|mP}B9j8H6~(|=&e)S98PkHvctL;# zq-CE@v54}O2Y;yUQXvf38|+T#M4=R{DR7~W(-SC#XEDXgyG+qbwUS_Os3i9%4-S-- z4z8;ljr(f2jcG}jEJUz<(G)KCFoNxiGHD7z+!<8}QQahF+57=@5pe*-!ltkjUU<(F zXvQ!JO-mA%#6s_CU;zC<7-gR*`J6qRtaIVys=F1YEOFv&KB5d*YCn z!L34yir_(yQN~5~kLdq17OkStJ0h^4Y3+r9MA?r{Tv%#3TgY;Ykk_LpcjY0#)htH| zB56Hjpwvs6xq>U)N&#wc6r-EVfkU`V4MR(ELYzL80k-d&s{|;)b0D#KG8xI!Twx)d z49)H&%Fql=0ZIg9x#eS35D1mX#^IWPCoNYwXq-C4hHFw?hj+TLnd#1K(h^%Ztm=@< zQ@GX>cpE{M!<>rtvRvT?pAE_3``lDWLq-Y|Nog*DgH2bXR@km&^zkPK3G1`aXOjgF zQ)s_E~?#U*eJTp$AKooa0>gc{2A5*Uu?%7lz$HkKjv@%U!tJd#hMY zLdHXXQJ4|NiRk<|8Ws-WuCPhA4yijQ16NqVeztCEr}1BgRLG*)N=L!=2HdI?ufaPl zB5R0JwN(A4tOXdFPBqAyF|4*nOJnU$&u6GrSg;>ueojV^YsNX6Zkk^yqj^ zzwtP&=Z(iw>PnMvY$y5AktKD`WKnKc1HdXwSqVJzvRSJ=H03-9iIV=#!PsI!T>Spd z;_4%<-hFK}H85a(UrYvi-<`QwLuB>F8Umvl+|y`W1;-n?BOS*mjf?Rj_9i)BX7rI) z*sK~2`scuKWi+X$o%5G588616XZEU1WXvtbeMmuV=c(Ezv$myYo14u1?!tGgYWR1) z5UG2M@hV=_Vutr$s9(?GmvNI+2_hady2wu;^s%gu2FmNl?!W<~1v$-gNo$OKc!B)l za?A%I=9v1hM=x{Yml+JM}Box@Z z3Y3>F#+@Ii=0x8g!6(D`l?uRuLtp1-t1AM#_-I6OG^I!B1{lZCE3jXBSQuHdmDc-G4n zU))kv4qdhD-SgLJ>=M|d%DaP!KyS8xT^dvMU{2t9Ba3POHtg*)LT$*36Z%oSkHlwwo{4}`D3 za{@1PPT%oY!KW~o`ZUTj5^nzecn{r0>c9_%5JE|9Aq-Ox0^Lo|?!LJSLY@U78}AIJ zC6Q&I&4QmveQpyS)-rJ?=x0#eO1RCu10HAkMDX%zv4MZxAG?YxJ^~|iQJ`>^n;!BU zunYUH1Kw|5No?l|9ksv{>`s5tkjqK#ULs#6V`p5BoIgRit&W_};7`P2!c?10GUztn z0C?~_*f0!fN#jitKlB3}c%vXq$Ys_OzQ`CX`|TSD# za8$Ty0jXOH&QMd}v&?!jdJz9MG~xI@o(Gz|{Nc%H0>_ioMfvT}q(9q&9qwOZC%t`o zJRU=jd#|wW4?Lb2N0iWICnHL(Y|@`5QTDk{lPK6_eTyo&(G7!_7Nna0##=-`EVM1( z{TL2$Vdu6VmsXV|DEM2JTEWy8@zJ`$!rVqH^;9Qg}#W&gZ{L+TEeUJU@lAuZt4t$6psU;tg zzhLt;-TQDV+jk~kYZ*%_G!lR0Bzk}R#iC{95ca`kc_NCiaurm%y(!14c+{f5k+%y} z)>99pamhMca{a>)3 zpP@}}O(;%Cn05xNpZKZ4WS%3AQjjn_FMKUm-r~oazZ2CW`U#F&&_3J))r#w)@yO*S z^$G+_we@EVd`ldgy=JG#H?+j5I^~z6(JA0y=@fp8oPm5{t=TE#fVp%^mGwhJ8({DY zJB1(G?-cIuqFWvVv46Zk%`=yo zUE{`k=nD)AHHLGgCG)J7EVOus^msFpewE7ogJtOrkpW-aF!JuqCE&5HGo+T`kYIHPRQ^w*WSr0^r0vgUojTZ~Jo zf$6q;&sNPOB1XeM+cfbJ>^_70es!tY#QX3b`W6}05WXMEfV9#;lKg0~ek4ezr@nKs z6D?6zDYlZ|!9@TX5ta?YLeYUW8(Dt52iqN3M_A12!IAW6M*OOD)ik09|B>DAw`ttm zLDD$iC1&Gh^Zi6M;zFts?0>2fdjPcr1&oJ<7etldNR3e?IBn($=r~p4_=VLnZ4P+) zWYgx8NgBOD=Wx_x0kp)+!r}i!;#pB4b{{oVQ@pbzE|MvBXSp6#P5)fvw z<;q|Y=68gm^s6?6xybnRsh>cVc^uQHN0nw{(=(^0%ETN{WsopldsHE_Bs<%o%H}Lm zrMuAy*tbuU$uZ25h#N8x|MEy2w*&~JU7|GC{{*7=DFsfCC|iuBa{<}E!A9Ap40i7s z&tu3#K109B<e98etE8Gl$w|S^O0DEHx?K5Trh_dgw3R~>6#^cqUgT?)J zb4L!+5->%U21J*_{J0XJ0m6Q~2TjZcNWVN4B2! znzxhLx)~|R<-TM_Iv(&pTm5)P0t@3zWV3SZHmJ>klulGi`dZZ7dr^d%7xiYAMx387 zJzF7TpLHjo6CHcaMIfKK{v>F7?Pr`oCE7u4GlBY#!vf4{*uGRttl8*;H7s>TGxgbg zKOdN`GWZqtVc5!`zamh5u!!}$gPls?3mlr7P6V3jLrbvJUFXiaTpDVx*~->0%|+vD zgc8o`AK+i~0)FFH2j86#wV}-e6O47=DY2anRC(l|_dH?P9O?v@e=IZg)E78_0vcSq z034?`yVp)chOXFt)ikKxuUy9Qm8uI#unK(<@1dSJf)SzO^VH=)#dMR32p%FlIVnO# z%KuOu&Jd6<-+-4Q%3AAeW8b-Wk1RxW+ZDw6%=WQ%MzH?!y0%!~UegBaLzfEH%Pur$ zr?2oH>epRrR(=1)1$KNVvw!6AQ8^D;J^Op2BXr1;)sJ%9<6_?-KzgMTn4n@3i7me$qMo`y|kW` zSkJ)UWQ+0Srlqfo3By@)$X=5}*uf<`qzb(M1r=9JUqO9^fhHD`9fB+N@^fGbN1wl_ z{%6%9JvRm^J>i4BWD(L;q~;a;i4;Q~E2xp6++sZZMP*Vh$Ji1n*MM{>7hJ*`@Y8{^ zEQFufQeD9eP<>VqJw65Oh8e5z%71YG*oa7(y6p$JYk*e|vzNK@%py1I`JW@%9Dlg% z++N$5%GRF^0vlZ+HQB$k`^Wchd9;_VK?&8r_tI^^k_?;ASEUnxNGxY`jF$Wao(JUT zRCz}Ex%)XtkMOezkp8zO$dovcPiI9~=HV_1!D_3)3Bkka~={f){KC>1SdR#@_g?FyjawG|h?s zP)ujQ;5UI1Jtj%S0rlHV0x%t~VkUzd&yV!alU&=O%egR!^ur5gxdO9aaiBoN-^xs@ zoY)6K*;1%6bR%YuNZ|^zux1vv&P6la48Cleqfc}n_*QQ z8Y^U>{9@<;i1*j8#z?~L%eCcrFSaj*g+-|d#;yz^wm=2#jUmAJD74M&HW+T8%gZtH zDn;}E52{0$IRQ>xot@FXrSHswd?Um-xc6smXE+i%`5MGn=V6(kxJ<7LBzTUkR`EHzf zGV)D{A)n`GAfNGN9Qn4LP4eNkfZ364UUpG9hwB5twLYAZewz#aQ}kO%Lg_Zoxr%)MZeGD=(mmU?NX{G9j%0RpHq7>N?|D&VYKtlHSfRsB92&pBp9XN%kZ;! z?INS4Mv;oirzF)2G_wDjtd`$~)#fQu4eF~%HFSeQSdu|1ViP(LMt-NC!-eDhY@OhcMkZfJ{(7?X#}H4C1Ng0s<#1^T*c&5lB$Y(1pfx9 zIDd0wM#!~?7}qIs-FS{7S09cnU?RyN7cmN*K2tr{la%Uiyg%b)WQt{~&3!7bjOhPHt|uTMW6`n=j3^l^pa=yMfeDEb(vy)Atv12E~sFQ=qWzXAU#`XJ1+ zt-g<9p&e@#eXz5sJnw!2ea7@q^qE_II`o-yHt3UM#L=f0VJP~ffP350XAA(7KKyb@ z`kZ;ie~LczUu-#B(WhaJqE8v=Lp**0eFk<{^zlA^I`nxc9rWq^c^rKXpB15xDCTX( z*FXR!efZ^+^!Y09KSdwL<7i1&^qJSF=u=Ai5RacgpFV6G#@A@SYPaoO$R~P%8l0KW^Z1SIxKN{(SAjnjns#Yudz^d6QfJHMs%1mPC%k0adg2u96s4s=_DaIk+) zQC!93Q&Mf-<^LYltog0Kr4C?z!-b2W+|50Oa-6>hzNLs)PT~=rP$*7#?=*$?l@|UH zHDHyUWa@4lo_rD-!9RRjj27^94^ZieeQ{K(A`~AM8OkxvswI30@i$fiw)N?hlzOP& zzelMP^>d&^{qn&cipA1aDWoMCgvte>?A)IXeG*44MrLYXzpOtKr9rKYlTJddaO_ZA z+g<6GV?K!^my2K&Q)Rbhs(Jt>shE69Qe962+n^mqy3?H zid~Ca0L^%wpww=DIu{!@i9A5R5ZdSOIUDGkf;z&F{ZbW$fAJV8oYZEisC+_V?elk@ zMf?2my>avnb&b%M^;(s{DI^zQNna+PlD_*cIZgVKS@Nw~B2BrQSa^G2|Dft*+!8B) zp6P~>l^frbb7Pv)mR0TrRB6iTuuA&rHYIM=+rIp%1iLKl7Lh+IS169DB*&zaW5RJG zYB%3c;qmO0)YO`S7$H}!mL8hu1h|WuG z=>BC2VM)fAA~x-=@7?f=fxpYM6a{#W;uD1H)PMpByvK$CIT6_2-;&5yEoL=jyUuA6ZS>FfQyX4SGt0EZ`d8zC;0@V?0Zsyi6-rPlL6a88w#-UvthLMcum=n9h$hV@k_mpS=W@Upk6r9&t79rHgLI6vSWL>dp1&#p0h!K{WXc zcEfwdzBh=YB9|$X2*>2t(H#}PZV`TMr;Br`vq3+j!Ei6YCJWe2#%uxGwl_k9<0NK2 z-d%yM?#wk><0tUF9NSaISCI>6@XhfRA!x7*hS-%RR1s3mWdIIhmEg(w zFJ?q##g8b(s_-ZxwZSTt;5Rk0wsOxF_Ynk(+$rXs?NCSPUFnr(j;t6TTlj@vt_92y zb!jph4-(!x?j$2BG(&*k2rOx%+s1arcsjg2j)tEm0gR%dHJ*qZXm}|ATezNbIPE#F zz2PLy4Xg=WDZ?pl7Wg)H7Jz-X6Gzjx#xqM4hOyZ2H~>Z`!G#WiB`+BNND)e zt7~g|Y-uOB8=T-({3mu!)Q7%~ZVU*pq6O41|53*@Hz60OJ!*}<5xVWp7q6oJ`%j>T zZyDUh?@Q*;Q^&7VyZFJrgFADarhW!46ld`wyob9QGn;{`A0ea=KR;F&oGCuuKci-5 z`FQ^sMU8EXS&2;986pYJq&J5TMzYl1DXf84U0Y(HG7-!N9{vMvUTR;9uT922jh()uSumJ-6CV%#k6nA#SsCS#BiaR1Ads?wXi}|hS*D;pA(NrfH00gUVpcK2r^upY3pR(oAS99&d}=j;7dB6P z7~)kb(ru}|u(RB>Rgn}}fZ>+^@HiL_0jWXWaH_HCel`-nd0kF`J<4OAfl>#~v;3tm z8B7fWqr)E5q~c!-U&)@b$zhGgx`zNpw@v*V;f3|SFMsETfBgP^?H|f9t{T=pVJTl$ z#xZ0JZTVBt_bdpED1U+%!QbT3j0Er9z~bHapjKMFJR2zqz6te=HuRu2y+MP3fWSzYifo)q^*TlJCS%ttAcQoD9E@&!vTiyEcku+>M;tDIK-9R6 z-f;}0=N*Q>@Ed&!gi;~mS`fb$AtHAuD49?gIoxEF2A|bP8Z=HGW3m~egI{wRwbqSc z+|4o!glb`VNtW0S0U`3?o#BgMdTmqQ#dxnLW|X=@Z(xc-qn_F;bKQY&G1p!2p*7cu zGJJDM8z%fb8WUdeN4F?{ILY~C?8wsUhHP?$y{4HhM%&7vF*uO~59IhiW-Y zPwrscB`c-TB&ZjYY2eqak`0Ek_G@C{FPe6UqFYplf^fRA_%5~*<*7OZR}n8)U~&qw z^Ct%>Zal(;lm2y1OhXZE5wJ~du~bW(!GU1r;3$sQ!Ma{=QZil#`)m7pf}(F72xyMK z3@unEEdg6qlFX33^Avs!Y?T~Z8kd4FEx-%>ffy@nvO^Fr?>ENeV- zC+C1G;9|#D{#!poIuA|BP`3_9!||JSrWhrI%yxusi<3xgg-F}@szcxbDeX}4RVk|9 zG{Z&J$aV!CgSy8fpXa(dCj(Y8oF;bd=t8aKt*NaP} z&hq?nbpc{Qb2Yke&sS1yMrA(61o^sbQB$Uc%5_+0b`L0w<`Sdy#l!AchmGSP5z?4 z2$Ug=a6wZSCpAo3w)yLL;73K_F}k)=XqgZqz?spkfpJ$@dbpm9n32xCh&jaAk%;Z1 zq8JSijP26Id#d*$6RxlBz~3$Ew_IgSIw9Q&f|xy`YpsaaYoB=z*1hZ&kZ2gAbfITR zrG+RA0)mJ`)6tkhT!!Z$3HviDYNd#RM#zEj9}Gw^Jcmd+MGKy1uasD{O%|CLp=S}n zfk!bo#%7I!DCow>gn^^R$OqK$9>+7_tW*o!jOmzd58RyLFB*4{(%?+?3}J-Nk@@+# zpR<%o61gzVp@hQCXrQ8_Dd&7$jNzRAv0lUcJJ;l6=*K48LVlE*7e{iR1tZDgYhqeO z(^@sLVm=sdC6C;XS1=d*HQ8%N!^hPfOmYW@L0%(r zu<4~mMyp32Qhgqu(2toDpI5UeoKBl0xkkLVnBHu@^E=-isGMUQ7H$<|iI@sTARq+* zu5!j*h*NNP7h_Ew(GKs?8e4Jy#0E@+WL5SQ;&>t28;6-hBjkKQXYyqn?urrQ?l0Ac zR;Tfx0!d)>Mwmj@$`+8d>WCWppc2<0;fi{kn`!1qDrfBHsTYA#A>2{36759TUFc_H zLLZ|zzDpUz4KgEaC_oe#BoVW-gINg<4!m(*dNRxE@Q#g!VaZ~oGkQvA0>h?g*L ze8$Pt;Hxv|JA`h zbBbhsMKTxHc|@!*6V4y`k0SolsF?4VYZ+Fhxb7x&xPk>B2m+N6lL*|GA51}H(_m5GF_ZD-vUB;+7p9AxULa_25K3#%22w?$wQlhQ zj(GxMY=`hO`xZewjCrr3hfJO$Q%NzCm=e-9fQ(V+cax;Xo#Iz*wD`$_F@=K>r#67! zPl7?$d@?7`NBz*lUOPIBGQ7E&ib8khlcuYu_CDPT8Lm*JKF5V3kIPk^L;e+E{9dfIoRcmiaj_g)D45Rzj0 z=No%%4NBOT_BP)AibGXyOp=RyOGw@YS=IO)M_zNabrR{v&NZcST)9(qZQs$v7mEcw zbw<)v=pSRuyboKAZDSFG=PCS=xIK&!mCP3miv;7?82nmEcbQr9G5szWvk zLgQJ4Ga?i$YsS*Jijkqn0ko^2NlKt@Stjr^_yLB+FRGRHA><fbZ(1~9MB<&dxWw(XXUSmpxxDG~EVE0Sj04-rI_xw(?RUsW zE>Yd0>0$_ueleaNVD>?%bL@icC(!qsoe}!3zv8FR_tA2bwhk3i zDU}#yuu<9d;WXpu>$u-V>{4tp1eI*1)TKarYM0cd^HI2I+F5zKjVIp#EwH{r7<`(s zOp85!MOn}IGf*QO$S-hWeQ0uQYft2_82PgdHAUr*C1~2phLy?aB;z8$jErx@r#cgC zV2wvC&js^fJuyf84aBCPdWFf>!3WM*=Nx223M6nHspTN%*ssla>)I>hPbZ*;Yb)Z(>Ogx37OzqQYqOaNcKy?;KMbLQ;#+H0@9UVH8Lr@|Wc zE=z=S+8;NP+S=|}(TjU2bJ*l_Z-wqRQ4p}ZNox+EyrxdvC_rr%P@@j!=#m8U@?$oT zkEMpIP9zjvKQh^8AM{J1S+ginUi8cjlcL8EFfusn9z6`*K(nSI8aHf12HlsL&{=mi z0yaHidyxX$Euac-oqEei;DEVC%Mnw_9fpfn#ccS_}!_hb@%(HnESQhJ}-FKj)27mGEEZ?;0x4d+5Y;B4A8V`@UU9gETVW^lN8u0@SBb z;Ic2Ez_@F=C8ip$p~bm}9TjcJuOopAeI!3^&kfx?3p^1U;il4+PnGlQA-v6r*Kz-L zKGxCxL-!ZkTm1BEGc(%1!)j$Z$2?n{;eFsc0$D}L{ulPsY^-fR$z{21E?J)Go@Jb$ zC8RZPqCw4p)YkC$=|&&CdzC%e_rCrXBQBZM@fOO2+3w?YRu<*=+Ca8!H{4G4e~Rq% z?-2Fxx59;F*6k;tx+?G9cyGV)+sWcL-k+@RzKNCgaM#9<_VXM5A2r<9eLQ5>hDW(p z{_t0Fy({0PK-x|AFY#L$)YZx%v{KIy!GAxmW(2^##8s21zmr)%qr1j`rloT)M!09s z&>hOSpDGR70L13plkA_b&&lE=H_xOrx|VjcXmg|R8w_cb>Ou!YQ&v`OcGVeFmh9ij zjfnsi-+SW8X+ZmTAJDtNMCr1cZhnLGPaf|!;CKDN~EP7=pv2#i?4f|jyEnaN`fdUvsTq*t6bCXz2%x7-@R!_shk0Z4(MuH`)B(q zHHVr9YK$9~xgN%fulkFqu$@1-cZ5%fclM3!xZc4pnKfTibh3Fdp;|yI7c0(J1&$8W z52pcu4qr=UrYuUM!*z6ES2~>kFDdi7(_xe%&NVWzEJcS=*4Ws)NHOlbaszs?`jl>@ z7}Iywp>I1ljRs889Cm-K| z`rJ0D`uEpq;@GFQ@PuV^_v$#=0G;w+zB(azd~-)n+>8^=%iqih&3co4A~~rC zVsX4}Yia1wMV2&gB~Bb%NESHTy7QVr6SB%|rB3k&@?G=wy^*BV8|d)ENv8%5EFUK1 zG|S65Iq>I)imdj1?oTr_yf~3Gy7W6@?e?Kh;;t6aM!A!-klB|*5KLw_IUbpPmQejyd0Uko)| z4RoW4z8P;$#ag{jSz;VPebM-eBpTSDfm^6;$maGtsC74=Z?ex>zk3=iO!RHhBbY~_ z)_Bq9i3U&griHppKzB3Fm!-iM#K29D8&qG_gC$DO1R04qUEpz>;46fY2VYkZ zl8N|awvQm~D1WV-6mr9f$!sCTW4CDcB97B}$d?Cb>bOD%Ju|0>f~zO)5OT$e2X1tv zQucFPfx?N$1t?RT#uIvN?wG1Ywovnz%o_D)$mM(HR^TifwwG*t#iy9+hTj5v$>C;` z=Ud9h$ZtH=2y~o~CCR=UKhcCI)TMAdW>Y08&TZkD>%s|_l(^TDn76?iGH~)ij#BI2 zLb`5yl8%^stSk6ZM@%FSCbPcvx~Ao0@8sE{yf#G1E{c>*ADi2M=18wRi(e&Q`yI9) zZLUF#^obH%AW+!?2#2(E)CTjX-Cy6F<&}*_E77|~?(ZhJC(5ufoS1l4yGuVZ{c8#s#hGy}b3zP=Je7XN*B7*g{86EjZl zh8dD?H@xOBL8dJTFxOdIos`me4#<=hCKpc$W51aYroqAT9T5bGJq!mosdGGg*JZ$$ne*2(p z-S_!#pnto5O-lcEPTtqmzXcv)n6-yxF9SB6c!XuIlIxcr-+oYj&0FUF_2(4Rk@h0~ zV~gWIj$xPc`46e)o%2RBZ$_3)b5s}@r|vac<9K)3yuEqvYvHliPE<;=|LT*zjet=i z|K1wHB5ooCbbOOsu`@!AtNcw;SY9VT?S^^wr2^68_Q85pMBXcTG5I^QhO1_3$7aqr zdc_1vcErlNE5YtzFK5*AEIj0T1%EwQb%JE2YNu z$uNv5_JpCMY*f`EjZ*q2Wfg`O3Sf}gJmiI&M;DlRXyD@};rD&*4{$tpT~4E5np?KR z3S-5+UeMa#7yZTQXZl?9h!W>A(^#(GKAyKpM&d2u6Z{6zB3;V!UVpyQ7d2m)$ zfY1X?&oljIo?6$n4?N)T)XDVSH1!= zAv=FC;B-eCcA5h9h6R@44H)QCg7!yur-1q<>t7h@{5Q`z`0K8Jr{6jq#P#)CWBn!C zsOw+V%Zau=|L!p#TA$haY`kM)?pRiQxD#(X_ZHi3=UCRc8Jwl#GTeu8J?M4n&j2EI zl?caFANYx(W;DimS4$hd)WAd;xaso%clFEg*=^6O;( z!;g}ERrCQIS?3w&99up1vQ_ol+vomqR?R`=nL!@q*jqUs4M{n!9Q?9A3jUj4bcjYf zrm^r*POQgKmw-$|ePjx!B5yxj2r>or2y5)!`=9Mp?1}y!q5YxF z?GGaZC2IZqTIX(mSRn8sR!TyFc%ACxQcRGXZKydgw4`DJI+>dhobdK-;=yIR*MNck z^p&uFUNAH}{I4$F#lmJN-0X+M4#s>ON;iY`LLrWS03x!>q%}Oxm$U*LR9MA1zPZ!uxB48ND)C}#ISZD09G)IphapPj?h1cEzf1;;I6-R54PHawz6Tf+(OPsjZ z$nD1VWoc6!PTVu!AalzCdn{jQ5B%r7hARO}fN%9HHMlM)amLcY2>xN(P1sGSJELQW zukXdz$yS<*FR<3qy;{0ven^Y)Y!wSLtNX>aeBQ*szp99&ToYt8Y-C9%<$im;TLx8F z-A#}&8Pn`cPRi|=B0;83Ws+Gxe2zts^^=_z!N=>g2yomr+5A46&CY`U}yz^Yx1*n%V0OM>WSSX66sH0x7f}fdpF;p-m9m+nA$Ea zsek@;qomXq`EC4xc)4${qpJ9<#!(#s#>JZ2inj-0<^Y!cLLheYXvl{ zee!P%$VR@GZKi&{r9k#Y^y2AvzA?Sn%~|3M}crVj^zR)r=!%IqiDwXH$WJ&D;IKF*fzA#nc zuZ9-XZZC_h_c~#)uW=a#o&Q^99@;xIqaxG z@+S8tl5l8dN5xM4(;~?84>jOFl1dfi2MhABwHL@&!w)MA1Eg%J?F(O0qR=S*iWt4|Tt}JH(jNl{!?i+1)h)m*{+rp4`)06`s?Xfm}l9i|F9xMd+ zomr@RrtTt|99}zn8!aNxvJ{_IglumhgU_9S?4aI zS#@6W;M{Q0XW`H&v^v^#xF+KO(eDDU0Fg{h7TBB&AM!#t^H!@_>fzrTz;`=nf4HH> z`(2);u2buHXw@9ER{O}U4J6`P9J=|JF4rRKQ}#NmVNnkmudD^AMYr_E-76!K?BGYmgjkkL+R8(5Xm(I3+G!; z-<{OerQrAm^y8x^QuJfZ-rtOVWPpx7{ixtl%J{}ale5UYfkj4^=lCx|fXLCm{bLY@uD&HH?aET>H5SRo;({X^fjl*ZOz{O2Ewy2qB zX=q*gzt1Ks%I!!lhs^v>Sy$dC265m7J={0ClR8@2pF6)f`M0qP{$rhgA6&4rPaN$ibwT*c z{rikGAa1Sm_F5#$D}rPqTr%roO@M>9m|nO>AYW$Qlt*XQEjL3_sBtkv@=kc)>kR)c zy~i(N0rX@_UPl!9P4u&`~S|9miGG_ ztk2Pprq<_C-}<`iQ|HsF=zFS;g?WqVR*ydi_uO2+BFfh3|H_a$oA8+csO8?nIS$-Vs|m#UQN87RcwgN@G*= zkbksuXwFNx-#bt0G);?KA^co?ZRimzUig$lgg3A{n^bzwHu6Q{dPJ`z*t@C5$8Sd-U3F$WDVcwnW6bA<(e$wX>h3>XTW$pE?C= zr|6e=@80l#07tlEezPQhAHP9wmY-0lB05*cQ~!|Dj^2xhthGv_F^6|^-0gGJ)u!)B z|2PH;SQXW8%g^t1R*ka^d)p6l039RNE1C7Hb8%yu-At#FeSaqyqwF)7q7aD{U;U&& za=4gjhx5e5V{~#(RnK1|{Q7GbLc~<3x zO(y>a;#?Wsjik^Q`S0ufdw-gw(JScT{s&i4IQ1 zrWSI*hU$a+dj!p58y`!S9}U~YC@Gus?+rDUf?sLpN1Ne&b^7rBr#b~LzK8IoDo(g5q? z-Hh@K@6FW`-29{fd{Fx^JYA1zsAdgbVdXgJxAYR9xe9#0z{+NY5JYjZ+NMo)+) z>P0l7iMXg~G%+`ahY`_$LSC>!Fwf8>r8JA-rLQU}ia^L_exk~7%bskz;QbEp;Jtc*5?rvSz&ZL&A31gve3bvj+E(TDcwtyc{;v`^wx-*><9?yF9PB9f`8Cz&S%q^& z>h0$27eSMZ9M;Z?r~leX&@^@tZoMb914hujt?5zGY%wTgTva=`8@0~Yiv^^>zpueM z4o}@Ig1|eCP&^ejA?v)bfkZ%vb@5vZ+z&lo{zad1(IWy_;m&=`LL?T*&e6Jlv-; zX;wP<9cUk(rKY@(_tkO<;AY>|BX4uJ@1<~!krM5PIqD4k%vGkBA%y~meT3@iBdRH_ z8W^diUzTdXQ8{m}W%COMl?9cA6Qwj8Y?;glC2ap0_hpq!|MnH>1HK}C$Dv;`w64y- zWZAx`^U18g|HOh*T=pozDVpvHf>W4o$mBrp@l2nmGzF2i^jwXveZVLGDgN@Khd@(j ze_NCBb@|J0z`xGzs=xAU*Dw2v=a|>mL1_~*>)&_Q;St8CS6E;Ir^*?|hA7ogVlsGp zW1iC{CC0Fsqjc$fnd#^{1470sfe}eb&Ok|X7(?ijzwOf?W`@&Id8bX`05m%;Av3gR zCkO8NAam5v`_G*n=c@czY<^%LT-FH5hkVf*Kq#Oi7XO6BP)Bv*n49!;)!b(v!9OZu zDQHA2h4Rj~I@`0+`2-?@!MEC%tq0QvBaCta4Q~f`st(U(@1oG3-T4++i!u_Em*(es zhxgNh1x+yVR1Z=DFd=t1zE`Yx!ed(Zvd`aph`$Sr$aeO5DvqrlOkY|*2Mxdae9?pX zEh+h8Fssg=qNTh#6WJo()->cx4FE}c(zx6%|H$~&`CG$yYi#xIV?PQft|3nt_l2}$ zXqOCfXVB=n&ul?g+Eg3d&$#;?J-6S`wuQ9DB(1h&7t%pwXp1%Of<)+dTBp!Uw0VEG z^e3GsWc;1o_3xOYgZ{ZOgp*JB*;7O4?Pp01mky~VcbKhywSWR-*A9SY1iwTq#n5{j z{-vGT{b+yC7aPC9`Wo`H)cWmBRbNm4tM#?et*<0V?@yiqlc_SObJtmW0EV4qcn73=GY+dN{=vdRMNOyrLfNo5CXITw;~f+{C=VAFi1B$^l4WBx)vUy0AJ$W0^Bq{_+T z@MQi*KhId@8813Jkvw%SPm?|7H~V?2l&3aj;z@+bS^@1C%QxS11H^Q>-6`6-+AA`u zd)L*Dn_`6ETBBT%Sv4nw(W!OMZ(IlGTPZlJd1T zyJs5ytUtoXuKLxQB&ostm9d1-NU4=EqRTiBk<|JK&DLu7X=I^{1I(B?+*HeiWnMba zecKvvW4_`NsoTad1Of-iL_4pH_K?joIV6jV zpOArS&5#yoE~QL;)V1lG^4E^NJ3spqKNB3#Fm>?&rUq6&IKP5+y#4*1)J+aPI-u>t zhow;b-Cqj=SrvLTcGm34oDF$_NF)&0o7lZ<3ytrv^E8+K7*)oS->6+ndPc(x8|c(e zN@!Eu@GeRqY0m$Mh{nh(pOsvBsYF~U?Tb%@g3JgQwawV)BC%~frtg8lAK%$x=S2@q zt^*#C*vik#<1a=&eKo>q)za9TJ<2nmiNsny7pyVeyA4|LwyKtj9S~!Ffs{bAhtP`@ z{>HWutYlxlM3ZNKK0LH!Pa>7HW>*d`YOTqZCYv}AX8`iQ-X@R_eVa$1kgi{?F-YHB zyvC)j-Cb&oAR8#h_JX4~c5*3w(VA-EiT_X+{he%{Sl1w8fRGw0r{mpFB~GeXa6&-h zgvgSv6%MM(;zs`R&T!?PL zrsQyjF+8+5vkcn&lJ#1x{f80Y8Bn2%e-b9#FCCsu#4V=HGc5utGHrq5Sp%h^CHqvi zuFRJD<7K)fX1vNUDxCD=dd=(qDPnl2!CX{*?Fl)%lq}uLOr%yvU>DjUUsi_K!t0 zn44PS=DZ*Xw?G!o@E448V~TXH$5$fq>842QXHbPVfG`mW@p(6Yo?t!Ud>~%V?&l6Q z%rKmTGE8QXaye;E(>%LpOj~=CddWXqyT&8f;8a+HQ?j?DpBr4R>S4|5qg1k%9c{^c z{RTEU>ORM9wY%!fQl6f)v4C{_vo;p;(j6EJ_~M=K+GzX-xX?aV2myT#o1?#EprTEa z*xedzIyw#v-h!}h7v6D3hWF^hZ=rAB7;b%Q500F#;utw0&hD*+bjOPOJtTQzn2>s+ zw(UB4CZrtiHsWMfKWfl;MTWfZ+le`sOFP6^&A@me`ou``3~HTOC(@<7~U z)V*Blw|1ZUe%#vqfX8myea@vmzx&ihF7?sfrN&fgY<-P!h55PRKqfH&K>g@3lKXj3Tm3kY+t6cWn_75vacFhq#|^)99m zn2?FjKqYjegzhr{-op0gQ;-Ucig^(w*%d(+@HGgc_@xM<;zE!`_H@Ed7lQ0ZBkWH$ zHD*;a{20L3uBq{jR7pqSQX7Ig>%~H!>V7@#3C_`Ej&H%b&smZ>;j0>4%*~=rlMf4~ z@9L#Y-@6aG=_}MgnZ5#hx`MW&3osg^AR$ULR?pv>CMn2`E>N&4sV)aSF)KcAZVJSg>cIB(cyqVZ?EyVCRS z736UH>keE~QmuZ-4`dlS_}BE$ucSWzkvDi&i7-eHIi?BlHom`$SkvB%s85mroc!`v z#+{O1+_oZtJ(=~?95$x;lM%7_8rEJiUimI1Z`#rM0EBdL@g8<(ZsnW+AE1-&~d0qg1!?nldZ2WJZtBl2a>*ZFO)ZqT3-jq&&NanvU|0KPPQ_%gfYo z^?!$!T%cSRSgv1NuB^|e(K%)I=DA!=YA?@kYNfRsN`&|^Bqs9+u@%H@HTbr|jJnd$ovmei;(OgPbBn)!H*h3l zw91=ExD#fuzP%O1JJ?C)ZGX2*1>o?bv|Oa8hU;?1$I$&No~%Ke#0C6C75WyMXVV)1D6W_Pdy%?qYfB zm-L4VoN)dTyuB}+ZxpEgL-pbfvH`d$-x}4j zow{odHO{75#1)S!D`9Tlv*(=r_XSIzCk~pB(4MQgg-5o1ob)!!hsBWZb?9uM&@p{V zOdwiN=jv$Dg#5A7t640M6{D>wzs_lEP9+Q4nmtZX4_Whl=RF`rjZFb?4J~#Z3N3LR z(Qc`RLQ7l+#k{Kn;$zgX_K+NVx(>EKg#0meUd2wy++J=Mk&TXj$s>3_<50UumJNG>3F+p3S`6r&!)aS$~grp)G z2P{I!aAoVN?B+`F?s!cLch)sNBnaCSu|7kMFCy=Yb+3RK=%EPk(|-gsC!FEVKYBZ^ zaS$EgAo@_TJ2jQ;JM8|i1JPYa*&UKLrPVW19f%eoPCz1)S#O?h@hhkK?fWx2bWkv( zD;NAH+Haq4GihcZ)Pm9El|2M-X7Y{6SJ`rn#=U6#EqvUZ88$gIK8u;0aNn2BWcM*f z;=f0~7>U2O^W;f{8w|s8Q~vRl!{av%WI=${62is`iI}@q&0RGAxM1#X?wY&CJxtk= zK5^d#Y`;24&D{BiR&frd{~!+-oyxAk}P zvB7Nh`(HKOew(llBxMh?SvrqdnjrgJv}pb0asE7QAtrw?Nq?ipxFok0g{UMfUGm>k+}=0M7^!Muz}n->KPavb7Xh7qML_2_ zKkPOwmz)+%%O^icpO&xNT{j(&AmM=KMR7Xh<~ldxDqrS z-q5!)co?7^@uB@}K-s3wWIbGP_csBvdGmt#iznnCTh^4H+XY%}VtDX4!vT{nmkEVk z(-t8?L|a3PKEw8}v)}&NktC;UO~R1c`$@}d^FM9dC+P2;iH7{_3jLcjS!^xM`sq`4 z{a)bzc3Y5>pOmiMPw65R(#)i{qdL3;)P^y7Fa{y*;U&X$XaTi#2gi|wHhd!%^|~8O zhYc@?Jv(yD$}U}Cgu57zX)Vv(FysZaT39tu$RmXi1~AHXT=lCr(hio#zFDT9pFQ2Y z4LX~#WFKU)4znh^Pw(r~9`4h4_i2+p{e3F)!+m+~(;9txgHJ+Y)OMHV?|H2 z3>M4?JgTOpK)OxLESC~i@o!t+>I^NWL}&>mLQ7PFZ7)ami(CymPq>IBLnTlszZVwl| zGDA!4;h|uE+4s9GwZEMjEVaZvEHyev9oW$izC&_Dj`tnx_V}XWn`N?IIF1$FonoUI zny9NS$f&+F)lfy=^ii~QmRfqXvKz^pcVr33B9`N@ZY@1_yKAWftGs!=cG>IO?=!>; z=c)c^veyAoVoq}CaWZCf$rlQ{j9fD`=Oz|f$DLYezEDxXeG5|Q0qYXuZZvI77ABsE zT`cgKw*yyW<%g@R)}Y;$0`PIVQedDuRkMe!Z6ckHqHp$Y9UPhC9170K@tON%*51<$ z?{2;o^m*Whz{|zE=r68ZcKh)=bDIAL^Sl0Jpg!TMZu1)&8qDvn=BLl^8FL-fYcQyP z^ZEU*TG~FL+x$LpL@>Xl-CBB~*|qd7*Aku{DSwQwJHLZ(WPZOj@0-o#SAGHkOHLql6zDL3i)1k90!ONq&mFE%Xj+cL0Zl?aA|4 z{Nm@6S=(yqHBRhX=c=0lT|X(bc*?<{C6| z6vCKtby|jT3!0p|du_+9n%4ciQ+D{v_7?ewx`i=IuO^yuvLCT0-o_!aXSv_lzWt5b z%zlNyx`zgkocd3CjnKNiOK3HZ*Ho9~6T~954Mda_{>B@}1*2Bq9qOH*HJUgaSWU=3 z80PVZ3~-DapbaM&WhDM8Dyy>ima=#U`iuR(WRUy&gB*pO-j@Du23gJKu#Kam&;mjk zn%c|W(!YM4cZ)zTnROV%2AFkIC6zSYl%MA{z3QWz=o;vQ4^(I|3GKIa=?#LN#L*Wi z0Db&J>fr=RO2ZSb-|;U1H**jM{l06XQ5SD%$S0AtEhut`V}I|l9p*eRqesU9ro7>3 zNbn5DT5`gj&tiI;fddxd8QI@%@nAf)!cy*n<+~lR0`zA9}U=)4(#?vb|T;` zuh;fID`Q129bXjyJ?$y`el8{&r$RWHY`zL%Jf<|?vqc)2jGEzf%NE$n8Pu6|g2YQq z8Q#6$b>y{zG^VJswuCi^e}&k%;=kN3zF6)R^{Z8(jP0W*LQtykcGx!@Tg&u3#~RuX zuW{VKw(APikqVtG_Yfv)ujX+5_D*V^fj@9o^YM`Lz7!X0DkfHk-#-{ZiF7I8LkcIaYj;HQ8U^ZSYuuG`^0Z z>>u8We+a)_ihQ3E_ta6y9fNWCc&8(eiMz*E(-=qA1 zP;= zAGJgkyX4$36>{snEE>drRb2uyejvQI?487wfc#?GrYUU+h>9LQRR@S z%;DzU6aAkKW$)H}(w_1YJ2qx3~Ji!E5p! zImg9{SKdq)D|LV8XCG_89Mya@j}&)S;cmU6?M^nCCFNEgb;Yq+8WlXlz#qHMcj>_* z+Gtq%M1BQN@4W#+;rsF@+DD8(>Qa0Y9$Db;^}^4%n{hW8rDFjtP0jNQj2<5=K1zM7 z?q~FGob?XQKT=U1KM$_Iw8AV$)Gke&nwBGoT0y^mJ&i<;fsFk15=XYqQ02+KW4~QO zCjzo{H2m>SWGk7quZsQJFP7(uExA0M`fN?^QmnHjf=|k=;xEv~=MN)9=k5E#YjAbZ zNoFq`c(Uw;pS0h{S3n>VB*zf=f=6t{>z1aTJtu!FnwVBl8e0Btk4e9ZCZ>)LCoUdq zR?_P$B1NxWodt#U#eMzkjvWS z+0~m{+3ZTEz9T;3PW43p^XyTIaHz8m*CP}mMZFkRB$o}|QE$J~35!rh8$hh_Z+&^8 zQHR|`{s}eSV-uA1lWWuHaP!SVtQ6rZ$y1)S!@_#TiZ?VkKf#?-?5#g@pr7Wppz-G z++10|y=Tu!Fwa@j*2vnkE9fiQnCjALZvUAV=&MG0sayR6c03bpR#c3gY z3}*q0Z%|vwURB`@+{n5^2v=j07b+y7HMJRSieHF26LG~*{X*8#twsRRslY!_XU9Rz z&x#KnHPZ*%zb>qBd&Wq*&-sy8-0%kNc6cRUIKHy0{qfz~*lm2$tJ!#fhFgRFHkjzY z{;ptrOL*%(zB>_*G?p(P-+$LLEeZsdHonateBt&qvn%UAyZg#e<9C$Pry4rK+4u<&12|vKJzt5T{XWnV zEbgy|Sn?gq#2^CydynYJ;{JP`dTtx8D(5oRBj~qrHS_ZIrJLqRH01>`g2}8)e+U67 z(Hw!Qqhbz9q6PFo^XK6Oee7FeDx&_yIpO-wMml`MUicI**IUPFGAGum7>HG& z@dIL|u+|EHz|OLtV58WyuM0gaC!=sVIT&aqpUls;Cnu+QI{Gr;GY3sQqoj-ZvbAS%li@Y8z>zvXaJ-+XWgXsSM%j46Y9p;pnu$+PYW zYqH}+;iMWzMe#e!mK-{DBHh1Wmb$-2$~af4t4!)@HwMSEYI)guPxd>+oZQ-6Z@#16 zq&fnm8=iEK-l}0Gv-(#6>8de;^t^ogmbei}Gu+)nx=O`>bYXW$KlgpQ`f$Cv8bI1| zGIW=dvxQdj$@~m^qBrO1E!K^&$*ku!-|vn7GtNgDcVDTlG+Qo?jq^U=z2ix&o==NT+?8lB5rD%Y0e4Ft>_#&iV->)kb9!O_NgRnpAGReV(^WQ!HqBzEvx zzczjL`fZ-C1@9a&ZNLV(){`# zn=50V<=)VrzXwzws`u&x+c*35^Yg&!z4$vY)VP*!8qHu$ik5#FPe+A<_3yd$uZJlH zh~Iyx=uh=cDTr=i(9oZsc{{J$F3q**&v5HNhIjgMhe)1)oXq+|Ia7Fagd&2GXB@3I zL~@xOQn?B$K&tDf2?T}?swJ3k&|&Gj)CXMk`Ag9u+eZgL6QF~=I&{#|u3~D+6*P?# zXVgY~#ERYG0o@-q(CpKjM*>UEhYU7a*7sE}oufZw*3KL~Y7I6m)omdro2zg1mW|*< zg&bU-Gj(Fia%##5hlalx3^5XK76u33H}G30Z?R+@QZrLI+hWD%-w1RNw&uJewAhbj zu#KUK0VTIygV6;;vr#Hy@hp=p6&&MSDh(}pESubwpye>FkIMSbd-a_BZN@w1VC0t% z%H3!$bfdkds)T6`#Gb+RJCByy_VQ~xlbU+=yg@Z(tEQiIuW4$xn%=3~xhCZH3LC{O z(gAos|6?kC9e|UG$h&=$m;;7!n(~2bxmsq)ta}c{8*C`8#fnduDikvQLx~+0-}r4I z&m7BbXQLYO^HfkKoUF?qhhBabwfpas$=J5F^*Vn|BQXDV?p&|%|FxQdL%d_D&^AM*`9ALbo-jRd~%t2lUP(uI*}asqXB1eKKx-0>au4Q zsJ9Gesh-KKR}Z8&HRm~s<vroOy9MR;XBQAT?5_M5IJ`q`}~eRl1M zPF}Uj%_|D?5CBlvHeZc)wrb^epIA4Gio;+tTl7&VsrXx>ELJAj@3zpANj)l=?!QBL zLreCRYVm(~)u&HHixUIC_d1(QGHcoeav_{!U%inBo39~`i9z;xLH5&K_BrQwWfy($ z23Qe-pQ244vR(yUllNJBs7#JU^Pbf|7r-rwIF#~9<;=H?RDxWe-W1Ky0XEdzT&4@& zsJkCpck##KDN3kyP+1xuTf(1;VUcCkS5MBn>dJ|5V$f6alqa$yiK*GqC@$t1CnM~H5J*op2%R#5xQGUVC%MS%}I-HNG8#+&}=u%{x*~FgiWkQr+UXqI} z?HGK=^=EwtOFDiD`nwT%od2#iVuO6L8Jj%h2E7Y>yQuxN9Nyst&LitE2o3?X8b2Xo zHI;9%%AG_{Z;k(%j!ng1yzx(+ufcfwf)Ruxj?bGGtJ}JkbMRW$nTSWL8z6*%x{u_xbjP5@@hHpI)fFP*Y=1Bp;rfJU-VQr)kl` zh}BkP)Bv{QCkt$B02LM9u-9#;WEUO#KVrAo3z^Rf6)w3V!#jdLh;~|eR*k5$?b72k zfg(@(0J#zYSMzQ5gmrM0cs=N=92{HtF2_byfc7WU_$^g{B4v~v_mK{jK3pK}4!KP) znslY~+me}n^-I5{XN{7se5zf8*I+X{upI{3;IphzJE2yF;|cxW!WY?D(Iv~tnhtH` z3m&~I%bG68=jh0NHiB|#5N}muj6*~84mvlJ-R0t z82b|ek}gNNF>?Hn7VqvEjutwAnY|)b{4>>8-4FczvtNzbGh7X`>SzM0ap<@-?c2W9 zY1QmxD}ev8`f|KEt~!=Lo|XekAkS7XBPvgf<_7qK7@;(9PFpze;6IxtYakCaaCwkm zh(VeL&fC$3{talgs7p+8 znYNLr610chUgZNA8cr_uko(Q*?tU6)BBzo++@PH-II8V@pyc{_&L^!3ll;c#P0@V9 zS~$cAyD+8h*rViI>wNuctsR-te56fW%#69&Hf67O^cG{Ks?SxQThwPCfB)^497bxm z<5Or#e>SRasNfcR`X>4+nZ9dr4ogEz9oi87lqVjs({<%g=Q@5zF9|#8SlfJMU;Zs zCya&qiT3;3|7P1D)Q)S}h>F(Lpagvt8WMkX1$EklFXV~;_CKUt3W(Y@`>DZ}{~%_t zyMm1bV5x9s(I52??sXYOg&yh&#H4`RgL6Z(j)s211rNr7--~>@G19v2tY~6nUTJJg zE*bJ_28>Gd%Z#ij8+FmhbH|irmKVLMyV;b~(c8uSt=a#)M4!yaQa_7yJlwd>p0ply zdas@}*s2`R6?g%mlqLJpCOj~Z%P~kbb-c`?0fR~5&*4L{mJAnSk=wnd|A6-5uwJBpt9{SRlLY0vX*Dc zFCumRy~}_9HS^-ShAtrotBlwY%?${rvij}z*g5%i`pvG=!hXK|0Zm*vZLrs?)>IaC)i{3l7I z>!KR4#R1&Mn?D=k%AC?OiE~Bt3Oa_rm?Q^v+&i+9PVhrxL;N#3;PGxRTZ5Mjroz7D zXijjFRu%?k@5;qzlf^6@P;FBhz)^zcHd{|0GhnLoV4=|9;lJCtDw;S*^bh;mW}#aqD8m zW31E};Sif$+f_%RO!oX|e!)<0e z?e$iFb;RLW`(p@U{$=BB?LX&-H(|r;*3TB2+?8`nxp0Y@&-E^PTrfm(>T;NCUxmLP zGL-z|rkwBl#=+)|z_+?6qxy8rIXS}hJa2miEx;3#ctJihI0l{IV;VM>nQ6c%j`HMR z!P4MRejC9~W2*~rMgQJoZ{fex@n31qV7qzM`7-~0*gjpsU)EW@6%}>MTY1CW-UU*B{61T=P@J|Lmfa!cVoJq|@f4QoOeK zud(7S6CBHV;07O0=Pn}68E5PD8Z?e?DiY{ehN;U{y!fcJeHh4x8tPRwG6Lij^N@ak znQpC5Vm6+3v$5FC#!TdTciX|%&R3c_8G59sOvIrrWM103O;_%=tenr1|%GtQNcw1G+O|>FdR-`99X`Nx}%9( z+UzlFqaN|+yrD;X3O~~LUjRh1gn(O~xH`Y0wCEX;Ewj( zsFseimL}0s??~b&b!3Vpl1)6k-){P+DW4m6@GEFQ^WVa6II@F!^{hq(gW=WEzgH1W z{BSG|EwzU*JsEqbqNp4_y9S(CzMBCjo^GRjWNF5yb8pyNHD#{F8>6n*RCyn7*AjiX zoPb#89;MMLOth0wXz0pAqKV^wcY`*t;uaprFphW!h?chOXE{W>FfX7_w$%^m?0n(> z0}^$i{@3Uc@frUEeS$ZL!W;Bu4t|eLspznp4?6Zhm+9#O(Iglgg<(AWy-bpF^O zpL87gmB2vl#r<$EPd_5Gm!+F0QJ62SsJB?|)P@HMi#Fj#Iy~vPdV9jJ8dG zYLs=dw5W(qKCV5uj*g`$O@heXm~KYaJuPWc{&z=u%TB<)`SkSyFGOrs>gDA)G*E+1y~tgy7`pFugv<(fV1Vv`{{ce%-%QL+Id#^ znC(61YT@E`P27?CEmq!Vj*?lEPQtQTezH@lz{2SoFs-S0IEQChJd6$T`0qlpoefdT zHc&laL#%$*u_5~G+Yp0P2=F?QQ#7mLcn z5P01hyvAoKPl_TYE-8R>7>u(_p%AH#T8DfBLUWytH{cUEP5LUDso6wCGokHyxYPTN z5qHWyn*rkMo*K7t`Bm8Z@}~XWm0#$WpXl_HJ|OYx%SA!r4ebMKp6q|^JWv^Ca=tPL zu;%vy`z=Wl4@?2h^TX{#P1ePnsHqypC$6h3+CDv> z1=i<6Tl_g*s!ro$(hg6RkzLtbeA1C?w2DegeSO~iYN&|(Rb5fOUybZ^b6x7ob0V~b;F$>exH{)N_Sz`(b!^@FGQ{CjBjT6*jA@Fgl% z5n6J7E+`aRKtkp4#+J%byZ{s&WRU)xKoAe7P75ca`6oD;D^6g<7Vql+`CQRNjx^d> z87~d5DIJkn8Lywugz}K?L|YL&eu*^1G_~R!+VD>Kt{iX)zdSg!q%41sSC$PqO7{KN z*`ioc1t{QLEcm{73x`Ecp@do<9JK8HV-+&Jt1~rfxBl-{D5kEV_W^F{Vub8JwJG~g zbMKV>M{=s@jtK?Yi%|S92CpNJ?{a|o4tbjz^8cv5u<0lI&2h!wvu7Idp7=4)1D2%*wo z`Jq2ruwIc45YmG}ex%CM3nhl*=MN4irvW)^y8Qk!{oGT}x%NYg=h>(lINzd$s*!aZ z6udzNh~$6|bIq|lN-}DWXlCA~)y9ekTMt=;XIFW{SDROEcla;SM-jB1U-W)| zB(v@KH@ZGFt38k zb8sktpUIC7lQs(J>Q`%Fuyj)|tPxR3scrK7c2v!ZWBJJZjvL3QsoL_;CCig4{3S2J zgl*r`Iv8qPZ>!3m#t8>%0!rLeK4d9hHC%5nU9zda#;?hSdk>Vy7IfIY1_-5Dv>nK> z=1)iYMGxxU)ED8$&yPsQkJr-R?;RVU+Eey*j!!Lgis0g0BGVUWSJn0rPE2F{KWVb0 zR7L77)^9>)mq8VtBS(~rR%E2jCMBAWpaO{)P7QK~ph>6Y=@{6gkPY%sl*QIjSYQz#+pCQa zKJo%_j;6Y{;wXd^|!J15y91;wv9#6 ze>FSjg(o10zVm{(7tOUH1`E^{9Z#EM=G4vaq!OXp0`lrqjht5M?0w8wAyt#TUjj4Z z_}XaVd*F=IqQDybun;u7Iv-x?#<0+5DcOmh)wgC$WZ93dnwoc2Z52cq(^q!Qe)YB4 z*G~Sybv1j{)%Lm8-QyKmcFh%&tFM}rH<=uvMxhb8uDWv4Rb2hW4{}ylUygjZ*wq^f zH9o>yWZ9Kh|KO@?tMe*V@c|V1!L>h_T(dVSkUkTysv)HM-V>^ijx3ve)ubs@uJ|q4 zHB*9Y*ZA44Qns4!nreC-wR-!%%kkJ`-`h?Tx8d910hb{+k!N0j=QvsYV9QnhfbG!! zK5a!ieo5|bVzFT&kpe#?5~vvV`x6mPOv(|!=c}f~7!cJd)1%2=`q7busj)?AJy zPr#{Hr6edQaEsdK%t)yTaRe4NS0sH*9!x|t6$zrfF5+v)VItppqm>VeXl0%CCB2}@ zmvEY0?PL;TwM|>lLTl|a@5S}%8oohV|58fssTW3MAgb?_$Qw$oQEsHrD&oTR@cXjC zMV__3IRAL7^2Hz&&&BG~DL#B0z+Vko;z$Gb+w8KYvL2sv_`63Zz&;=q`l8Cky~tGs zACFQ0{6RS?v@xhf9B8fPWashWjdFuus~ENH z3vp$a8pQB2cP8t)I@KFn$iz=C6ryqh3jgTQv=6RsG05F#%ULXRrC0i?lYBS&DYp21 zVu;(!$_5-q=&nn~p~eNZ3CGXKcOocw10gjr?fVjbB^J73yO1`9gZwN3&#MZ?V%zUHL`wZG&Z2VnYgsef8uy~ec>&dMA& zQeyMaK|Bx=kEfy`>tn@b<>JQW-#cxYwDX+%$sH7qNEgba4l5U-#)A5{;{`k3`%6ZrT6{c)cdZL z;h!3&x^q<>*J?Bn8aeB|W2iLCRZ6;FEsHp7fvQTlYUlB8{NIW-cUnM3F@6Qcri%|6Z{uihE{CiPb4P5%jqKyIBji>^Dd+yI=-{jpItz0bbS^j03?ruQT_y~BQ=HodRo> zjHojiwo5P)1B;GvH-{RURYz?30v?z+8vAOjPdF=mYzDBLJ<&cbciZAw1QBJ}r-qA0 zvcHEDpzk5xE7hh>x<){tzN<_8*<5g4fz!@jACjZU->Xn78(3)amquQ*^iuywt&%* zFsWPg+g<=)GZ~Mb)g~jSNvM2mW zJBJZn&f;;cqxlPmsll5wNSV#fubIR@bTA*J&uKT8y9Qs4l3Ln3u1W*ObBM-9Mt-f# zbT_P#CWn6V;Hk`8U{IFVhUU0Xi95k7n(QB8Y|)|(HNCmixVa;nzrSMy8KK7C!@!FR zSGhp`judSTH8yL6$*e^Ye7v4L2pmsUKAKT-95OKk$p#3GMQi`?IU)_&-b(D}k@(5s z_~3xHa4{yN;en|Ph`CG_=h@Jna3S5%-Bn3c7buQ5)k-kY{wVzk?;4m}3*p$)3#|LI z>qO-gVGIqCayjIU^1e3O3;xqxQ$`B)i`M3L0lj{E9kO@fKy6YyoKPN_zg$mf7H}#gyr##V;LI>=SMqq zV5z0%+SDo$JLZX!$EIrU{bGionc{>i*e^O23x9SQ0m#}IroT4!}Qx8%2<<{@-D1b|oZ};M1OtUs0r^&##`}hAX zuFC!NeY=e}`yj&FNzvOt(I8$*@~YE2$!Em^zI*G-!h!IGI zFkY|;YJ__tezn!;@1f-MEJwg}&9NIy;VlnZz}`yoHa~frfrM4yrtyWmG(SI8k@E9< z<5$=Oy2iS$8|y=bZkKY$5>h?0+4{vfUpCe+s0!M96dq7F%@RFcAffl?0xLbx zdj*cf7Y{SXx0OQf3Wo#O_;ctyTgL#RKnZOF!|!%`TDdT{((+u zk*&$hRH*qGNEtow?_!yzFO)&U0ez}N^drw8;%hB}tnz;LGL@AtE!LrwX4yw(DO2NZ z&7CiL2i{{n2sH|T#3P-qr79w#O~maAUr76#)9Ck4eycV0CB#21@AZCO=*wO*DR=3} zo76DlYPJrzBOBiSFTF|N(`f$my3gLM-V>xBepxhwkRi#ee_qCY6tCzG-L)B*u53|T z-=*bD_AMq~u$4p;msFG|jwo;ZtInT{vj{Lp-uFw30P_H`J-eNfam$R#Xhh2Rl(#>>!U&ilipeN_&gcE0HYXcU)q42@*7c2OfNH#bm%+{)6ysFq}#;BZ>2g_Jknn*9@w< zh2dH#MJlCqhF`jH*U}8#O1nklhATSgM&THZQZsi16hO?7;NaKo@fz?tT|FB^&&JR* zJR}4ED-3n&2Bnu;Y3H2-VR^z|Le3H@I-&lG2ewi3+uERD0pHtyN@@ATl@OFP1+_^0 zGlSQ21}_IEn7-;>xRJrzHW*r{N(Zut@$PHIlvz1i|2&bzx^vuP$rkPA%xB zrbS`2sYUoFIE3|yaIj%wx!*INACdU1jXYw-xkaLthkJ8>E=oC|%Rvg!@4Os-ZY3K$ zIR>qJwphX2J$u}u1SHoHVU8rSlZ=qk8n3x~iwZg`jl9DF@G&Qx#^&ji!Re|e> z{Pw-v0JSl(qhEEOQ(7elmY&&tfC5$G={jXYJRVO(DClLA@J<2hh#L!?;(i+8CaRBG zdHz&1w_k}YuM_egZ=|hT{kCM3psgSL%C)8b@w2U14Wb*NpB>);+c(3XmAh^m$9~)C z*6oF=>TJI%U)NT>BQc8Uhr*^UJcxdr<)l;G%xEH?{)~ z_Hj>9gCq~mHY}oQZeHSeN*OzFQEfQX_#;yIgpc&F0!#~qp~ivwvUo-bUvf(eYpc*q z+u#VikvON2E)<00%NI~nG(Kw~58{8E;vlnEFdWmEy5U%G(V*$YQ%Xvjs>b_2(QUF< zodXh12?HWmWu2>XhF|591p$NvPai@KwAh87UaD>+X1DMF)*2oa*~fUDKE{fN`W0Q9 zsz|x~imZSG3zg{?m8m$DsUK9j_GfXj`{M-HB%~ut8HnU0%>>N&M)~EO)t319` zzhcEvzi*9J>wXZ9I=)Ns9*#Hbbt$vx9RG|ex#fOQp{<*$Ke2AUwMRF4_Gu8LV&It5 zx-EArN&g49vZtu*^Sxc!(`keCTK;;l=JwxBS?`T+TdUh&qU4=^$x~g)Mqi{-(B+pcucp7ypKIzP?%Dh=SJtZr2D z+Pk_@uKjHkj&ilnr<`qRPX4s$0Agx~baR~WH#qUPB`N-PIjhp=Zws{?VI)LfC9i3# z6yH;!r{i}Q2$+~6_=5eo)6`C(#u=8u9Z0uB)pw7eKcaizQA)D^`defyXshXs#R>gy zy4^`w7;1b#^};4u(}@cQN0U$lBn?B=r0;4G-x`gt>E=K9FY|PC@~N^$6Lp5wiTMkx z!ls3K#M3mEOYK9-0qse@0{L-1xZP>+tcIdXaMAdURdSMS+3nk{V4%Bo24S&G3;6D= zNfU-LXxJmSdQe9gRDu$|SfA|sRNU!53jAbi4rmWHP-XpN?=<~~sz@n!dfj8flx9f` z%sQvs@qgB@_FsZ770@ql!zs2N-rE2=HTHDqgf&1bsc?ovC)1IwKb0lnSJAwRI03yf z`O|0b;X~G8&@9_?EmyM5^tj{e)6VBwKRgr{{LeFM<_S0IR2w*Blmj-=CNQ=Z#d21^ zE40pt65jWh<+y79{%yP+eE-3kGbP_ySpYUxBQJU;9Ev_8X4O^Y_}OsLs_HE7mW2}N z%nfPh;fjwlhu(8Yq1*dQvI>wcaGN%aDc7f0hs@de%~f+wE*AoC3^KO)Z;b%B1v=yp;Nc#7_aiy zNxnmIiLrf98*YvfTuSstc2Tfo-!lvWb&dn~)IKR}BU=j9?!L=>i>)EUv)F2T-)e{O zy&GwW!go9mTAh&T&ku zpPClNgo!;gl@N=jF+H+f6NlhCrhUyplpl6TyTY1Ea53=(6dFNYs z{3M#U@ZGseXvX4A`V9bII1cO92c55R^!=UVXj7gG7vvXo^!2vgCHU|z#brE4uW(3d z$G5u9kp`O+BP9@X8|SxP_Mu&px>O?ljrbRUB-^X8h)migh-8`)e%K@AU)SW6ABkWR z>fhJU(gp2o1F-X6w9TQ-`x$y8^jjtx868MwZ5_l2zr_euv`$q(pWAh#e3Zk1`uRhA<3FTz<_HD-@P zFX!DU?MXm|boMzu0#oAU$7=3F-d#V|+!F(;hYQ_`XI9Yh-kcKA;y*=dJyY;K6NbJW zc~&ZZ-sYO(RL#;oaB~7=E=R*I+7J$ng3L8I$-ihLsJTg znXa9w-LI$kOKE3ncS`qZ4a8gj{@55T`ScIWu{F~7#+Pdu(K_#v793=d3-pg6wQ8xJEbTlxYbizRLO;Pn+D~sSe75>f)tcLMX+ACuS$Wj#o&B`) zyW#2)eRZV`7u#$6F^K-PW0OtC$5hAD_?K-^a)+XqVgd8{7YX~e7uoa4{Dt-;mU4JRQ?3D|$9`>wWsb_Pzypi=(kJLJE$J>$a^#)`aF8i67ehIcukm zOspU5(K@dkCHz`!nXo-G)F`LWh)=hY1GgDN^=hcG+}tP{%rqNG#BDJo_QdXy6HZQI z>OQ&Y3beK~72U8+5o$NIhxgo|m)7{h24u_svA6~nX$>|J- z%AN@)`wR&)aEXFK8lAB>`l~B_gEzJYboa}bpUH~S<`*_&yxgwAFc@=N)fV;SN2e&n5hVXD*XM|oi9Il`Y@pD zpDzcJZr2V>#+civ!W*?7sFOHWKZf}~D)<4+&%fcc4DY#Z+8)>D8wP37DW^23%G7bN z_hGY0hx^QC8KgL>4Z@VoPB+iRT=AxNN~z^GI*UfS?xva3q< zUBBo1zYF}|3;f?2i_#a`?^#=b3TAsx55B5#^EKzG!8ZA&7Eme@+m;!cbz?Sf$uOXB zasn2q@TZ%?t)HD0dm~%xrAiHCvU2C-hk50!`QaRKM>*`3PZl#4xNf}DO+Jd>E#PQq zZj#;kn%gyNT}N!xyA<=P{k!XYPQ)*7=W9X@C;3KyE6+Hxt)4UtxB2(R6$s6PWZw=R z;9F_k@&$keq>-sq@d)0(@vHI0@yBb^aAt4+hmSLd)_^njd?K8=<8a{&3XASI z(+tuqyY=5f8lZ%JD-Aw}-5J0a2XxKQ{~C3KdQEk}$G>)4Xyeca{z>58E&3$Ucz#3l z8Q7D`*lA|3uzsVIH}?|eUlA1>iugJ_@x7eV`hQ;5`rLUn{i4YuV-36|HyO;8t zM+=Ww@tb)}82-C`%i^0-d&Kel@FHB-6nx=kjq=3(i&POi1SewX`u*A@Wlt!N`*DHo zWDqrLLyW}hEnO5&Jha9~OBqBTn}+=+l32D*#S?dn(3U6awH+YUY0-#9ML>;$7{!Gp!LVsUCrHz_M#T}q z84*#Lal;*f852Ynaf!Hr=w|?z+Y=Yu5X3S6`<|-0eLLwSh~M`-e;%dpR@*smojP^u z)TyF&u9xl*DQJXdZ9mR|J(@36(ujK^L5(ycPg6ZXz0qHqo`CfkvtRDtNXcX0Imok5 z&tfnrN1ryXRrT@r4;z2Z{_Wg97uC5N;P*P6Uivp8*q|}lx-pbp(TyofRgF<^^p~bF zdU~$Ml)#pCoDW(fkwnCA21r7BQjB@1pXdpgQdpoC$p^rCHa~#J^&t$m9#)~=a0~od zhZZ_UT(!``7eB`MiYuhA%;Pl3o!@E2dhv^akFAWk!v~;R~>8MMr@=sh)8_QjWsb z2VIGwgr0rjO%eEBX$x#8HhN(W;lW&II_tvF4TdiWc8Z)JA0LoqarIblP2(Fig_X(7 z0cn&c8BUlfTtLD3a~C+YiZ%Eey9TV)=(vqF#dM-bdu|XjW^67#cF+F}7wwVHzHrF* zC!kw${IonX8)s>clNC!REo_9P3@1>wU)0eTv{7}vUa;1@>drId;GfqAXY|5;|6MF@ zZS2&5TVoZsYUL26C~onMgIjU91-kNeIJeY0 zENqztqzfmb(Hm3*|Kaf}PFDSSo4Hr^okR>-dj46!LuVEWpo|f~7#6wi8cJ9+8H4)k z-zut9@WbFp54?c0aSBxiY&O6%gLkYr2^2E%%S-TCZ3pX}1!M|rZpz%KXo3y*FGzut z15?xK3sH$9dgo4n0Z9&zzEj@kNO_LbTe?aF<=Q zQ)UCTSntOQSqXxH&Ec_|gRlpSVO8Ma3ct}jG$j7`zE~-t_2GWR_@-57EKa*hK~>SD zLVOaKo`&{xx=Ofjc@?C4EZ<+ zQJKoI5B!@Q+IYPv8-nlg3}f zf7A5{VwqgR5|2bZMx!1%$>FC}j{A_K)dTtA_>z{bHfOhJnb7hmXWkx!$_TDH6OdJDHLDhG3~d%^gF1e`t?hc4H@lguqZR z|I-r`U5+;`h%jIB=7CvUhXw3YcwG2kI7;}&{vJM^({jG32%n70P+n)LQ$W`V;Z_T$ z9ZsFDV4ZfJ6jdj$uG4(KrfPJZ1~pQr+5{<3svW+a@{jdXw+ui*QKOgLj9rVAPL}O( z)&~=vGKNhB`sb#mRD{=Im@vX5#xL!c)yg=O3odHo&?@3YBA|`Th6adX56VuZJXDTt zI6W55GJze8zf`)BpVPLb1LOEN6ca7U+*K0P>9D?a=X=aR)meXuJVMjaM|?0n!yK7r z4=eVCV|+QA0+;i%P{NlN!sfI)jGhTKW;wD&{ELo+LT4FXCA)+wd<6fOE-<-6Kj2ra z6(j*1Ba88WAnxa28Ob83-R@ArC9Ka#)F=7{&2?gd zwEAA{sK4 zaLOql{`0vSj*+#HYi5YVX!+le@rmkC`A&WbQcQ&(3PxT;7?A*sXjL)7Vd~LZg5Fcs ziGT*u3n&4m(!$R{I|p$Kk#RZ;OJg0dESK=_XE9nl@FjJHF?@wRLiiT1r$R$0X@?#K zV*|3vz$(itlKS14)zi9U?4wUJ}Jvq^aT$B_ruvTRQN+}6{Rc}Zg7cg!~z`C8T&QCU8Fi^=kA zWLdioK{BOMEO2uvr_}fl5@K~*N{IGWc%Bx_ceBQ7kS>+VZ-rhki{0F2wH8;9q+|_T zLIE^7FJxE~uW({O$vaA1A)s;)CE>z{WEr&~F!U43-x?)<-^BhXEq^%!XW#eFLe$Q? z-jcgK>>I{h{GYt>!vv=ED_7YA>TL?Vm6oufI(j?=qeyYBEn4?-_Z7CiOrln#Hf*qWv}i7|IO07ND+UQ-%VoSe1vs#Ni9SqznfA?QA-P`%EDW)@C(TF9eiRWGV!yC zD5!KJn?QzcQEt+O9YI#-)4{AN=BMNNB9u`092o2RJc_ZcXDY_ZjA`@0Y^1Av5pt&xmxlV+RN@wdQO)+C+1Ozd*dq3^@&9(TUN2Y% z`lsXkHy0>S0nPFitdI)@rUUwPK}Er06(4nWShDoT==) z;aq5Nk%pUe2xy16dO581_tuWrb*&%ZjMLN_%j{5Q(>$3;>F!x^;$((}kj|ZO1Gc4D zdon+%Q-0oT7J|NCtPqnDR|uaobi{5Y#na67Nt?2#!I=`3-(q#|MucP5ugOE#6FO&F zZfyP(>iq^B*{_2Y(o|>x*m@3gth5_P;^7xcKjZKrHX7|?LJZO-4+I_x0z*ece5)+A za;Ruer#|eZ_1FEyHNTrSkd`nWKDv=+J9 z@y76T3d7gb$vF^;s9XuYQ4%py9JcTJ4|a3S|7Qa0h;*n zm;dop{eF@E%WjD2jF&1i`1e**z^d%}qhZfgq73oB3to{ThXUX*EIS%u=uxy5T~DSR z5VsKKB8a8BqtX%PL1)Z~%|W$uLRYoev$<8OG!kN@AZN`9C?^s`fl}Ofd-#xTsPCq- z3pqdO1kglkNcs*>^M!H_X#Jc=3(S8UQxqOifNH0Ey1$Jj*+ku3Uzbh3csw|i2!QRc z9Zc_?+FlX7LKxef)?8qAr#xPI#qxNmfXfR#UR>qkMH`_P&i_1?GR18bU@;xjOzujb{tnUfwl7*N5Fw4|CT|du%B{ud(16D z>(!?qw8nj=gjQeVgaNLb_B<1z_4jrTp(R~~^Wp%)UA(T4QxkzK?R0Ct|afe&)K>`|MP=C)77N$!Pxb3+$nlTsZcfNJ|x zDB;?+v*N7jFSFT3l&W_KdK$h93et$+nD*{)Ij-nixC%XdO*b@&{8@$@JtF*S4VS+E zJ){=a*jxF6V|t^|j|JVrOvCu8=U)(odC54payi=X31;9ROzgP?X5}DEgI*>2VoKf9fSW8Gv{CyaY$WH*i!OBXdkc2Dj!x z5+j1nC|ca+pdy@!B`d$UtB;W`F=rLT-|-(S8LBr647uH*_>D^fAR}* z{h0p4ohrRJ285ClCpyxf6iJVyH=%LXS8b%|I3``DlV-8ip`@?YIFf#LtX;Gz^+}b~ zjt^sv*XgyV==ozD=^tvC{sxu4+{Bl$I_dN|s{FKVj`UYXrN5C?KU1Y2WT)S?Lp8mh zO27D7NBUDD>9LfPxlaWz8iE}L)hc*V&y%Q3_B|UvU{E!(paVDN1sEKBO8#Y57xs5> z?a8Bsbgv_ziM+SQ>+&IANxysbmJu1b9y-RRANEM~LHz4h9K+q#eSAXCkKX_;6f>wKSc1-Ta`QvC0k#96vglL`Hn`P5h=8;68POG@r5=>e4%gPe}jH` zAbf(E%i5Fvjd`xuk@}T{3!(8To>uqM+}jKpsM&#r)`O%+$a8@RPbt zalcRAoGsrfBih0|(D4OH4sAdszf(r|V7BPTQ2tQUcd%5dm03qg9=jy;Xyb)r;#RMh zx@ikTq;}W=!R$Hd!Oo~Fpg<%%c8ml&z@#VKxg7~1`a=ypS~0&l06U6|$p3&CH<*LwLp|r-hQK?A#ivT7 zHL4~YU{b(ek~fs_##!LhAXK9nPB8;CIvt6zEz29ts!HxFq+thjjnZoeXLy5HeK`zX zIh5HGxOzx>k@#$Mul?bj)aCsDrrHSS{VyWrK)OSYW3N+idNGE8WNX&h&N+<^=497R zW*pE|??^2{R%ri!!pdWCPYZS|(*%BoSV}X|$@Q0+Z_|?H^8N0CUuPP7Mg}W^ka=6g z-&xMxgmF^Fnc||3Y1}DM07>2bJMq9$w+|{T+g8;4*y>ln4m+S^h(&2NaFVcox7bsBA>`}ZVAr`eU@ z=rnfk;T$lL%Y04F0gEO=l2xKKgFkfy=2D6ez#e<8Wk!-4cz_l3XC3$Zt?2x48U8)K z_5>^EdPXjz|4I$NXHXivfYS7SXFk;3-V8n6nDn?{7?@-dVhaHR< z)ylyL_}?(I$<$8^2Z2Nsj=8}AX_6aQK`dY|@Iw4x{`(uKT6iKnbF6Q%6pfj8E;a+p z7u*c|V{Txn-0AABLfLUeKDysBQ+CWHtd1V4;G+!6s^()qbAYWw1o*9m1-Zec{16+K zm*c0`e$fxYrzR>gv1ST+*TqYN=l}g&v0qfHChIK`g9kX8d}T{VlWpw5ld>9_;jD9t zPt?JSeUqIhVvd2B{gdzm>Gm=P2{_NK;&-mHuK3B>G+*x6BUu-o(CQ6(;SY6LqPOlf zZ!q461;=Y?m`~&Dz%H}!IO|O;sQ>gk+~|;$@09cVRfj;<3V6RiaIGja5$|_1#KHZ< z0EGt~>4FtD0+%J`PT7W-t|!OmhIoEhJ7!lnn&c))S&ucSJOt{&ZRfK(z{BG(b6VGP zs~!XizlzG!6w405q;}bx2gYwX3J-K)H3%k)LcP_4Tx~P)e?R;`$6X7_tSCc|Ra%)b z(4+tLK5{tx57NJWz+HsShuKRF$vr2;@3x^x+B8c2Y>;S3g{g<)#Peoohke7Ld^QD?71uCaCg_6>LRr{B)81FdBv}io`zp{FC zH&)^Urx#DUhMM{PiK>(~Ec0TZKEF?(>fyw>~YaPQ%LC~4+FwaqS1zpg<-em+)SC*1iF z9L&6Y7E)Q5y-%25FS}a&%S?5)sEu~!c84-SsN3AYo4H+fdaHILrpXO$5`}->%ufr^ z3w)`VzkgHosU67$`+abB5AyH#IOGF{uyj<#AROaicmx*Ra28P;cX$x4yxK~Q5E$q& z7o9=&;Q%Gb?>SG4{4RoPi9M{Rc!G;6*&Lia+^f!7bFI*uA&87@P<#Ua!~cR&BEkp5 zkletw+%E63DZ_)4XfODr@ci7+Fdd!+mJe1JHTfnEmXG4c*aY>=(FBEGYy+wr9`wOx zfQ`I3iDZ*6^UHbda)W37DDQDxNp4(`MYr;AByh-!$QWT!5DsN*G3u9_IV`y_4?S39 zqCacfes+YDy}^67;6vI!u<{I7Z#<~M1J1T^&<@}6kLfHv-aMag`4@g2!E#A(;!Vxq zZ*$Yj4(qB}Gl%!bv)0%>M6>t{T0Olr-ErBx>Hh(21 zzR1~1zl7DnN(XVUlI-!({UBW(vP8%qKz*>pSk0=r7HpFWJ;1sLMuS&eW*C)>5%799-1i1~2y${Rll& zW=piS2S;X@ml4HVO^#Sg4tliY^HWF{?1-nN>bU)P><7u}q%InFr3uEFd*_9qRa555|r%QJWOJabi(1$7g;9 zbtVr>F=MetmCxdZo><_WN)$48o>7#K53P%LgXvfuJV{0;15z`BgrB9c%&x7u!0}7o zF8jPyHRuFmT8JgCb8aX{TjD|q)&Iplra6xQ{OGUAK=)95=Egc*7^WK)bO`vQ=ZZpo z62|f~X8`eU@c=Z>=1uqtwc78xqcAnk=%pROx}*Var#(*o>=U&%09eMj&|&e4W{;(buhIet9F z%3yT2P+L@L;*S}E&rX{^sZ-SmU|-6yKXRaem#K-=`k?f&+Ei=wm1;W0th)9%&jZ4SPyozqCYL>r=f(q?}dhc=Ih`A+#%ALVJNA`l@4`xDskE%3z;PJ zRap#Y7U7L53vKcH^ly$V&T2f1AAXiv9K$Rg(^=5Sj#}K)+L6V7esR6!3ih1!w=%h8~DN3 z}yLBeb;- z`dZuC#rX8%Oj;>y=-t6tm1tnMwcLR~%P#I#%Ex zzy(*}Wqh{ApG5n&5e{_iK?Twzy??En*mIS?ji1T>wJGYZT-~wbF#dHv+(N4L5ve9# zIP}eFT$~lc%pOWO=f`0XAJA_)ognh8>}9eNV-Tti8@%3#e+ni)i&=%2?|DPs(I_jYS zbTJ>|eDVsQ%dHntqz|w{%S{!@3qq^s!=!R{9?RHU&!<>onG5vt{Lq} zKRS}0wtO5H>cdguJipehj(w}l#p-JrC#@I@A={@xJ_*LYA*x zqq3;P56-`17IOZbox|!#4!l&Ah#B!m&c{P-sHFI__SdpD?X9!zoVG-A;-${11edn= z0K@&vp6UzqN4TFCB?Gth?WMXgvkO#9rWe2$2$WDk4T2JH9f1lem}fwo1JEqq`Lm|! zO8isufWzB!EKYd@E#hS?K*N7@pI~co2>dbkJ&XrIb|Dil1vK3+g$U%`3pFxzTS@d3mIv`_%M8QUw z0IV@V(>dvMXgc(gY$xBSDKKK4!uD3Wj^ub?qO1G{Y3+1mJrk1|EU9MWL2l5`_ImvX zQe5*dXKK`LIqO582~yVM4X&%?C&7EAy8g{I*g06kQ)7PFfrDc%%JJ8vcta;c_1b5B zzmS?9D)KP1Ku`1dLaihgKpwnscu0*pObLt{omv{0}Oig_oY8hcNfG{Niz}sG-LNw1@dDNA+s2;8iuQ z6f-~gMwt06cFJ3U^-k7NZ++)vrpY1?`B?Wbi_(pT&xV4ArsN3p`(@+^x23ae zghHIa6QagtBaF8PLBul{e4Xcl^)I%U&Gc#ER__vJ=OzSTPD3zpFSdZ=OCKA&(--&- zwze zm=QaP(8WWXD;GUFV1;)-~s8t>l%HHsozS`x;YUbk!dou_zOBM zl>5ap)nW8{5}i@T56Juc6fWZ+2qvP&Vz&v5EePPabH)rFU&blAFJKwt@7$MQ{QbpJ z#$PdsNaT}AUvNZfi}7(8&R3GyCtYQQBGAIFj;V$&-Wzz|8+g4wDZF4uqHoIHjA5Y( zr$Kho6x>=epTOEIk$OL=Eb*a)Z(lqg->9Q3tgH5+pEjVZrbWHN$y~`RsPY;SntK}T z!MD{63;9^Ax0>C6WF8inaOM`5ThZCoHlCN{M~z5;w-gl`@rN zqZJcxpzqp~nuC~9GJG!CCp#eIP>X3`9?UkG*mLIc-@#Wvfa1{sxX3FOa%(}~mtFuD zdwo@(i+|rsF1oCbM%3dWY!nf!Hcru1DAR{NJ63}Is*Y=OB!KEoc^h8#C%Y6|)1|bV zSV^*i(`+~K9ZEO>)w9{UNVe|jUIu8(w|3W8X&S>A*<7zus`wgD=p0mIX0>hk2@J%} zEt}0p88*AxwlrLJwH@HDs7+~}5cyCeqfcRg34Ot89Jp`_2^6TYW-fvdpmSg!HW-be z@Piyf!ieNUr;MEAfE*^;Ie-ePRoDXPlVV_X+&|sAo zM~@8j42cX2vPMh&cUI&p>`zvlTeKV{BL2~CrI+5HEBJv`nQ}(i@#phW+v?4jSe9CX zhqNbD@;7Su9Q~z|lkx@XFJDB4Q~dzriTXef-g$8t9Fm(%YD$r5+BaXIlu*J^evI=E zzYwLgUAojU&VTV$tZ`nl_@~O^wfPd?z#1Q&OIv3y4>@xY{gFo%ZiUB9g-qC~-*!67 z=(8hXbBRpM^_4F)DYZl?ug4_X%B#o$&>~Ubq@8clxkUrKU$_uN;cOP(DTq`R%vu#L zMmKFu@77!BjSpXHxB_%NsP`wj%5Rfy*s=P2uHQ5~?+aRht9%DD#U!}6OaRQ1=_2ey zsJh%>g$K8cvU>%*5V_O}RRRl6*-|}33V=g*cqo?OxP@g=DQJJ%^NRL*rWmKa#?UiV zlc;!vlCJy`T%ctd#fE=i1vu(ry%&YRH7}HKA@kb#oXShDpgxWBK{(y6msfjdUXLL! z_yfQ{AS_<25J~%(y)u2EG(CXBzOZgDaVgrIUXes^R3Ga|-l3%XGu86Z7NHUC;K;C= zH=%@4|8lGyt-&+1c4S@Uk(DFzk`se1YUN1XM)v=4cfxMWKyYj{On%3}9lRJ+Mf{6T z(f1~EetF_hE;}CM3zkeJ7iby`EaauqQOZ{15~Euw3bpm@0;YUE;x zxmbk@Y8)l_MGYXylw&^?4Sqy3`*Qxm{Raz&SW5O_DY+^)==No9opBXEx8$>GUtpV2 zD0)1Nq3E$1H5Bo+T1{@x=3prDdG%0aLaAZ#1YWY#>xqIWuI9pjICn}_#)#0dZmj1* zb9n0$<}!d4tC5nqA1svc@>5(vmJ`8C@Yp)tqUKOPI~uMaUR6?^XUzyqZm>X&absmF z(~byCa?7|uazPJ}(SpRlwde{Y8m@EPwL{m5$KveWB69A%6;SQDT0!+fd<1+CU+kCw zPv0vdNAVxW=()wdUK*kWd~Y@1Z_x}_yi>l<@P;nv?FromuAC>i^rv`& zN~7otu5>|}#C#~}ovv8dzlR&;8Zd?1$!w+!-8}GkS;^OVV={UU%9vRV++K+PFT($~ zxrGL0Z;`~mxsbi62wVOCS}Bj0NQc36I+!5-yd4@=rFNb? zTbG6e*2>R>tN)q{u8w_LakVFN3MH*M&%xCPcRRSMl3u5h&PP&=ubp(_b5-J;8y$(S zbS5@ywve(Oy4V->2T0Q6%$AJyD%Uevq0LXJ3h6vgb>?}DGfzD}E6gcp!fpQ}4f}i! zhd0Q-IXW-xn*7-~NBv%{aW;d%~jhitW>)BeoA3GtNQzz}dN&O02AlR>sJo-#BensIiplpyxl9Ju~F7(d5QqrmalvRAY4dRn9`Zm=Bnz~W6kV6Yg&5veC$QN<$GjRt$M9A@H7bCvSE%Ewk$P-{e^OxE zE64>R|5K8VhqYmULs?MKF&{QyKsg7r)V@)H3Mn+Ox&n#(SE3IPmVqiRn$g0 zL_nt~!6#sb2bo|_l9P?~NGLH=VLF~I$q*mVB+EnVm?j&o!^ZrPK*TIJH=o}9B-qYL zjxa*kLOg|D{#Iz~D&NdvLP^*5Bz?COMLP;{Uf@P!im(bZpoJ%xRKW~MSBMU2u9q*E zHo0PQ=H{ZX^pqT9qT;oMWfDY<;7}6V^s==j0sy^8u>%w4^C~gr?uw^Yx9%hgzGN%yvvs?p)-YQx z!56tfxERUVh&q%V^*e%(CP++Z=F&P=n40VhoQcDg<}!>$VXE6WrP%Xi*GsB)>Zl^? zyHt{)vZ!xF7RVwA7LV-y-;GsLTcxLd!v4>#(h`k_O^oAPtvB1$)H=%^2LJ)t|qiS%emUIjUdf&SgYp~F3hXc2@ zGK<1i-8whmy}2X89PCcf{LNzx@BR=qY|ssa^)vY@lyKJ!lzs+FkFb8d)7ko_sN6#d zAGV+;kP-{rN%8dU;tW*S#*|a>TGTM$4MgpY!}!7Nac7zBaW%9#Nq@q5FCX)O?>KAM zZ6t<%9N1JFkWF#5^CeUq`tSH`62geoAFbLjdAt=7ALM-b@Wpf&i;bD;eaC*QawPsOmZMGco zi7|hzaG=W{FlHYMf1Hdc6wKwrIz5KO!1*Vy~lp#qxxvpCd|j$_83Y! zj}^!3A0w37JMQMgePSVOTzgM^R9`cx{CYU|sMOY40Zd-b1 z6V8WWJ1~HoQ;S=;43R8NT$;IopO}au zf%*dC%%fH|0ksn3jn$_TNKlIYO5Da=eZq21oORx9#E43ythUM=nH!u4!^d3iiYZLR zZVqe^%?$>n+G@cxH~0t}hq3AGff$<@(jYgm*SfaQ(LbOteaCO2@{iOAc}H1=|2sfu z#Ayo@J}$GuB%EipL#7;jW;%P4Cn!9rPc|8qOb>dXpasZ(&o+AqC_!~##}Skw#!1zOm+1lXg1(P%-3o)1Uhq`P`(-4ZN1yrJ6pM zI2ST8v4Wn**mFGq)2Pq6QF*=U=%Iu@A1L{LXcpzW_`0fhh(8uSS@v8HOmtU-+tR;T zq~hHtP|`yxhFeEshEe{lR`PFVWb(8HEt6;?#RXUaJdND~gZ2(Sg=An0u_9QBANWUZ zFC0=b8$052FaUnLEd%@C|IQkj^Vsh$k*}X+zsAR|vYTNirQsIa3h#QKeLInc+xz$w z{zV;Or?LL#%wQz+@NrPwr)Og(l>wz4x(d%Zui6TRR^XuXoqfqibut7$=2kSulBWkj zaS9To`Lh=DV|@FR`Ia6u>O>va%hNq7^dS~>MAe^~;m?{V366$-D=A>(EzZ^s3IBL5 z>U#Nc+ASd7m&+9KmLS_rjNG9>=X#klIHM@f0IzQa zj0S_(Gm{Zz3~waAz(EveZAeo>jd@HC^lu^M?!k?fm_qSXhD(%4`}4E7Ky=C>6rspe zkq=V8gdYSQ8u&*q7!7=7XXFm{$|p#cN69;u-K)UzOyFt0V^W7eKPmZD9q3#5#jv>A zQ_;R2Um`@rQEZ<%(3b&Z7%3u@bTd9;@zM%zRSS+vVYSQNLJ!0qsE6Jq`A;1foZ_y% zfp}q0R8D(8Z9{zw=|$y;jQ9GxG<Rn`0Ck!!arkC&5AmfZsKaf|XN@vp(#_Q;g602tPR4I0YUdRB20) zfc8_&=%M$(+XIGl*k^o!FwZK52kW&YCix#ZxH$Ma1%cbz*h`PXkzW4PzO+~aHhCh_-%@HeeNmvJ8pkKd1g3C4o1f{||5*?EoE}c3iHAVMci2dLD zYXB-4#%a;R`p>n{YIZJB1jOLZxy;s$XhG4@%(EEuOR{#Rv)|*+Ige@erl>oLeK>>- zUGcj8?27MV-;=d~lWOcNbk*Z?6b9;T=iyGC3+bnUhFYe*12)f?!CIQQk4CFA zTP~`?#c)zn`+07n*MBIX>&0Rp-Zk|TtnN4ly?9J0J}J!Rn1}wuVXwwf*4(#IR%=}r zrJT_qCG4h>py5)CZzF;O<7vMu!nH3LkM{4TV<@7~1U`ayr{%|N9r-s)1#e)xuM18H z*+X|`x41J8@`gqkcV^>BWD{fETd3gV=_H030`)t96YO7uI)|r#1US>yjqy33)R6J{ zdzTrX8L`B%KC0&@k3&~$Y<>dct}n>IXG@oGunsO-E<5jv=20UD z`v*r4?8g&TJ_V#Ps=OZ+QzOK$@N|xh5MOg9%@Ja>)LhoLDwGeET8>0FEXGV}6-x64 zpH(uWltg`nsw~a3*HKZVM1b32Udh@jJcdn?;vS|Fi+6>yiPTCyXB9*rWZZ7zpiLsteaDllkWUaCUHFmWX9~ZV=uT(CV%N%z-HC_*Fq~YbSMM<7S zkvuqtU1{4eWpJke3}fsa6W>6;zVjv}U8og5AHXk$*|CTkPLrGIJt%4-3~whJE}!+y>iIvtG{^*KLn`V`)Dx zuDc&}VMmiU^ZmI~lwZNnfx(FxgUUZI%*pZpR)>W(v0bfw4R{MByqAyOf73l^A8c3J z)nH?S!)*E7>*%MY8(Fo>aVp}=`I9grzx5tXd|7Yf2Vny5#XFVhH7e6vndyl-({ot8 zP*U0;N2ZrMGu4bzB}Cn*p5a!Rc4wv=?^ZR{Ym%c7=F6VyCpt65k&V90gY%Lwg?$US z&+G)N~gx8Vsa_TAn@b2G!P z1=sQ(eW-?Qf?bnhg&59ASi;w$K}q?&T~8TM*~}8XES$x!X3}r5c~>j zg08hS7tQGCdAG(>Wu4+#TXNg8A0@Hc^od>@cl1pQv6s2d6aO()F!Y8BGLOQQ1Q{3{ z+G;SOBV;#GrRuYXobT;Z|)*%@^?uEmTWj0ws1K@0OhqETt^-$lztrR1tJ1akxW z48afADY@!G+c4n3ABTBiM_3|Clx!ILc}2jn=KdR zVzqfvi3_@d@Dn(SW0X{my@(!@g4I8Fv>eQ)!drpQj3_+!4ou>n{kL*2;0xvS@fWGL z%ewURW`*I8YuUt}5e=FWHI(paP#3Z?dcm7q$ZI{Cj&w-xMcKmaQr@~>O| zP4R^ip1`N{xkt7>Mk9muOA6pPfd1pdi_jQ^jCvQgsKV3u0BDH!XZ3!C40KylP9v|e zTABlJVh<+*L3sQd(>bLwb#>;9OsxY6&Z;v@OcYoyt#0A-(ZM42>iSozeSHCV-M*<} z{6MwQoBAUQ7+NwnBbXt3fya+MspSiBi2)&9``>)QTbrj7=#K#7Nc^v!%#Usz2coYX z2UJ{qhZ47pRs$IxH$hoeLrD+5ictamy@W3UZTwkhtWk8Bh;@6>fg%$uYCm8O3P9~j ziqql>ue8g`OPMzch2^p^E2s)PR~5EmsFLlWq_gW6_OF*!Vf#$i}{cDvHlOa`;a6CJts^aNKejx#@ zpWaZbwv1qO6lRYU!RefRl(3+{CEyv)B@JAX;?Fvb^-|r(1DSj&szezS1r+n--+aza5`3soDCt519;HL(i$04zde(o2$*WWKt9-tqsA%`ig>mb; zvo6q|@@y;pt`u15r3`%Y^h45tPJbR9sQ-he16jXFC?{G5pMvrd1u^1l=D8YMZkCn8 z?vTb1$Kp$GliY98Vp;k-$YCkUz+BgXLN->^@|^UG(Rs=AB(U$w&7lfPj^H(c!XobRjz0Bif?c6y|=V74t=WvvXm;*y>tvf%J%j@va3NED%n(g=@jFxZ?cK zf3T%%0ev%r$GhGDayp2Y!{fSQ=u*07m9@hTzh((ivv$ZI=NHtg+!|B4(`A2OdF9L- zJ^lmnGsofI7BdIq-b^0VMmhDn z1}Y1{RApUQkU$9nBjzh3PF2;ElgFn}(X zQR+stdkyC_O1_o-1C6Vg3^c)i%i~uWKnjk)W8P-7?XL1y({T$qMu!L>sRj7jV%{Kh znRPHzSeMXU33{;>fANUfPKD-a%-R0 zA7zbTS^rrOCH+=vbvcyOtBJD0C1?e;yL8rHx5F3eFS}Jz@Qji#i)ss%TqXRJhzRvP z@j*zypI%hT3tt=g7u^ik%Y~^o;e3^I+EO_ZI-%h#kCRB2fhEwhuE7sV!Qs-vy$t;F zOg+pFJR$5D=i`uyk!a;~q}+%u#2jwzDkCP*KM<@)A}a_7Z-6y;VCs!9XKOYx{;7v0 zM;N&mGXg_^C`SG;8pI8iM=>(vV#CPy*ZcuSj*TiH)4{@kSCyg zHrC_+3=i*J0v_J<+~M%>`sR2z4obMwzz&TELoEbW;MpYg1UH{ zbq)L91+X1Nbq^y*r{{sJN%Nz4w`Qc_-Ix~}Cu;*i+IasZuQ~tuAn*I^|(y&E>81~8!jCZR31C~-yv5l{$)h?w-@4<{cjh3rTtdGL%Q0d0EKk z^!UMutNY*IwG%QTsvJfk;ZmUY2uH(X?gKBse7ZSa!T>fVbuuu+F!UdB7=`>9`k#Fl=-=iaheiJ@nxwy=eS!n+ zu5yZ>h-@#f>e2|EuO9*uB+zRsGND}UF?9Al`3LAM{tYq{SX*e_B=? zC0Z`lo3}zqd!A^%B&?s89{EsO83MVNJ$_i^p3o$@F)chmyd!WeeuVhr1nuK9BWN!l zhIbAQoSD)H2dqKhfd7^#4)h#iIPk_lo2QFGI`*et7E_NI03MX07}!U2IU4LA^fh3= zx`}fBj50d(4p9BH$C{%$r}N{QQ%3*p0|_x1+y@y$W6S~kI+Rg)Y$g)Z6B;U_;9D}1 zfN!=HX6)}t5tbpoNd5Wy#J@DcwcZ24wYTU@6zMm`gACU?{NwPsR@nIb;jIBEq(B#< zS=RL&!?I^qHD1V{VcGqQz_RHp4~J!An`2q6N3o2<0$FB7vrHa4=MU>zHe_4LnhG#Y z&;M{Zl*}KviC%i%CDQXQO^C3uocgSz=iPB~BRssRKgfG@VH6KvfWt4BZbM0Vk2g-< z2J?r!nEmd2^t+>3$V$2hMdlAz^fo-KeXL<2e};Fv7J_##tvDRsUD6EilwHj3Us(nF zbKpPFVt*a>Xjb;xUVB=vN;x!>hgf`urHdLC-48|MEa(K#aKjp~!8SX}=1gT>!(pjg zdu{KvAKh`eFt%(0P*Jw4aIh~l7;(|7W}Jn!8LWqx^~?p#dH2J6U^a)lg!nDxVIFFj zFuDKcf&G7P1AxSZI||OsmIAXHvRLBN3S7nrTrO_ofJ4O!vV|9h z?s=DklNV)!lOIouf=hXhflHT18*Y`l0`d}7989z|W)wA|20m}4IlQ)zBy^^Ebfo5taV1cKsD z1Y?oCeF4aS^>T$NR^L>c%jir27fJ+>@&-Px-(J&BOiw4Jj+s0pkcx;3%IHk1t+Ljt zD!^KMQGaBO*VV#9`0C-;hTnSi*ogOg>wa!vCt?drgv!y>u0;UXeE{1&yo2nAw;93K z-&hdxFT$+hw<1GrvIR3ZF#QUmo+fKwdL4UGffR%*cQB;btwzXk^mAc~v; z-0@}L!S{btfMXL()fp~A0dAxC*Y0uxj%_w=r8+Tc@_@iO9Tc%LTJ$r$HS?=%=;K@Fe zW=KzJu!c6w;0hYScND07^#WDpjR^C*)Nr17n zrj-O(UULAuDMK-8wFVfMIUNE`9vgsd__ZOxOsxnsC#eB24=N3Sr|jMgHtiP#u6xtACa;sCEvB9RHMBDJ@&=!X+h-BDujW#-4JJ2SN4cf*W zh>bR3dOd0bZ3Tih+HcCPRETS2^!(&jH1)hCO@pmRT=+z(qYiZkuvL<~sC$h88)kY~ zTg~lZgU#6Q>W!ay?ig^RvUbn8kS%8wM4@fRc?NBT%bG^p7S;!7V|@%0$Til}psm^Q z)5R+M^V%r!HmREd-1kcxufm@M+=p|)g=hb&0LLbnsz(71`%|LEPqx{#m4Nd#2RIkk zw!yRtVJ5s4@#_GbJT`#a`*TCUv0JlHQ#(U&0Ioy;*Ub2NGn@IweNBVy%*gn;24%6n zJ4g|LZZ+;jvJDlm4Lj2Y8=@EC8^`$hVNxS7>v0Zvyy==Km`&?zV3zbi<2+{TrAB}m zYh*}IYOrQD%o-m*pYDUgy}EEM(ORY&fK@DMyzoB>u%g+ZeBNROFd?U|bdvyMYfUQ& zu%XQXY&aMGz_1bxu!Ye8lg9>N^M8yDFcxY^N`SGp0N4`z9NzeOG}}7q-lkF3Co+Dn zVu3){a{RLL)hJ0&<`I;6`#4Y*WBk1Am>5Xo_*vCU=6@5TpmtOr1GN=@ZJgVL8mq5jzE{b7OHQI`!(I$@#+B$q68*RdTO;tl}pluB*t?gG$kDm|Tf~Njb(KOi3QsXB< zwgmZd_E{mni&M9tAOYK80o#zXY_K&letwh~18y8YN1YAX@=bme+Lojnw4JlKX|zdw zfHv00Fo9fSeGS^09Y5dci7H&LtDwbO>L~_r&)(a375*gP{#pbsOuI_~j!iICZxV29 zvuP^#eMh?_Bt*UjTtPJ883I`)$e74lD8I^V<%xXBDD+^|I^^Coda5;$=)uxZ?2TgX`Olz%X~_DCk1 zUP#TxBeE?IzhoOfA+|jH)gW@{X8hb5@pTML`PWdwVraA- z6>h=AG=aG@n(R)6WAk%g~=Dr%)J3vDL?k$?6O$(aJ^KRnloVGIjv|0 zmGdq!!CN8$hI=4WMih)p){|tm1FxmRrQsA~e$U^LF3h1kVOf_bLM(xOii4 z2F}fp?e3efn<^WX&>=b+JheLV%(qa&oj1zPBUw@KUGt{fEOYo{S zUxgC#)uWw!^wV|nC|5nDc;qx03H=lSSu_2_iD{M^3iQRAuv>T5Qf2u$lK1Mxzi=SEQQI2}FmXAJAk9w*{kMq$6^{A72 zw3v^cQI8VUqf$JA{Z2jmX^OP`Mt-(XJ=(1vjpL&t_2_N&Xb2x&jYn!b#=;4yZtLE6 zP|qOt`0y+|cew0rwb6(1e{_6-^8paO`C>IYDf)CJezA=Vdunh94fde(!0W0i#9SGb z!jQD-2=g`0JrMbyh0`JsOmGr*Dq$a|?68va9DAxQXZH}nvgNG2lKlfmQG5MWEwFwl zTFn%IX>=-t&9@gvja(0$W=5{Q0SFtQo)wa9X0MfUZ%@(vY zFErP~2vV%4)DiWQeP=hB8dUf)Jt_09MEUQXit=yL}MzAmPKk+(wm+&5ev54w^t%^u6nPNVn_D$f(Auk0VATR=Bp{ zaXTH>`sSwgg#XOk&X7PJ>{;|+3)+ej5D4?j;|B(IS|8%Hq1-?ZZh_;m$vKn^1&9DS z7SXpnIGDLO{og65g7r3zu*DO+Ct$gpXzi}sO@wlgxV@1N*eY@by7(e;|*a|Y?oK! zOb2{PIz$Dq!h0xP!F9EN3h}8J17Rw@AdRQ+2YWfkGPeRDG_R)eDvwwB4JtD?b*#0R znVKM7fXk!;>5rezK~Fm{$@DbqscpKKg&$G7{nh@q7g0aGzYQH^Tq1^Oo(_r`fZBD*mWqfqbs#BR(HDCyM{lr&D4r29mNwx&-!T<$EXw=QXlDhZpWBU>>aB+Z-O zidk_j;6J5Q!@vGk%*ZZGb^Lb%c9Xy`!N4D56v&aHf9I{?8AH~thj@H zm^dGJIQC(3ujpVbux!ke9ng19R^#7naJB11o2wsfHC#Qb{wB6q{6*lg;J5;^nER9H zH=|`=1O86s{^B&7?25nMQ$Y34^P>2BSBl|pk1{9K*Uwe_{nx8U8*!N%(tuG5Fj6 zDx1H*Y;K0XKRf%cbWk2)$MbDCFk;9PX_5`iza`>LcrxF0g{ZV)#5~p`BW6WpG{hn3 zs<+=Ey`5W&^>8R-ArKVhV9*sxYJ?@v z7b_Ti{dsH{L<#zdTH>Jno=nL4(d7S0YxBiVDy{Fz9Y${g~p3`J_2p#`|ho{;4 zhml{1&ru^Ny~n~&ZN5af@CA?Z@ze=KDWKNmK|;il?Oenk)k_iZg1WzlqA$Z!hjYSF zZ(HG;o0@JF?4$x#h$i_rCF_pLwv}(cZJF+BNSi4A-tZ$?0_wt z9~|8gs9QNW3g07+H~6ldrSOeBFh7_(U7_y9|7i^0BA3%eacF?=hdQ97^L0rY-#_VN zyhBN)Q6;t0B@I(09X`I(>`*OJ#{=KPiWFWUFVXbKcmWCPqY{A-DdaC=$*WK;<7@5j z;Xr2Q2k9zK%e-kezB4dCc;-{ZH^d34KR?Kp`N2)&1m9oX2ze^jw!Wv zX#`L8uN1y0=cDAmZPXDR1?8nXb=UjxdDFV<9Cl20Bcn^&x@)ih`ff=Tp-a+EkSrYO81udTvZ@_4}Jh4AE9km-^M$ zR>PM&Rn@(h3KSFb@bS=+q+>jI8$(uHXprNtQ>y$J0vf}_DwnAU$)fl=~o zIqBQHy<_<$)PJWc#2mK%i}{vxidggEr*5D;i`IX4C_pqiW-q;1>A%-e{~cumY3~{X zq~`VCX7FW0=)UyrTjGoaW2{_$!VN|D>cAV)HNz;i_6Z9Gb{Ics+ zzj*({*!_Zv5nBh5G$ysDoV4HzvhW}Z=cw;0DCXX z6HUX}^4gBB_z4>VT}aO4%JC@?EBb`%v{2q@-SYu$=>0swsjwT)K-FPGFLsCTX1LeV zjYOoV2*XB6ciMQ(F!4XKb`7_?RK<&?OEE^QlBO~BKZNya(mo6|M(KaaG4;P=fRL3J zL?L9vv4$1->qW`_87}U7_m#6fSsRE23QtvX-|>l;XZ`@UaW)-m%t)Q4$jvC>C>Wao^P>h|Ddvy-j*Fm|F~U&Mj^qCXkG~5|HfV zu_0M4QIP}Llq({#8~-Hr^)rbr%Zpm&S}wUD1XHhp}Z1t zifhK-8s~Kl+R?oI-(6n@i~YZ)*#FOog8YJ327X-&obY=-pB#2uU%wd}?#<7CS^(=e z>B2PD(|$CCy?Cv&u)$K8p8u!(u*^z|AFlijV!p-iW6IyBu52KGcj*=R zM&<8PkAS`X1kQg3*j%$=^7D-^kxY5upEP^7r{T z;A432C@>z3H~6>@>MpsGFIr`{D#m#8wIyIggE zTCCMKEARiP{M|noNPRb7A@2y}Z%3(|$lqa7zozAHYZM3hQF0j|xvakp$-I9UNFKTT zee>0N_&c;pXL=;~vqa9S@qZtcF38;ftMUK$z8L?{j>6xpx-1mQ&>c+nmih6S(ekg>;IB(mna_>Y@^9l|l=nyRw?BvSZ~PJC zucK5>$v>%I)A(zR;wb;dQ2u4v_{&=v8-LOM7uxC`(J0aS_KYZAuL>Jp_l+uS(h=9b^{2tB>f7OxlA0=AfrbYArE1UmOg>4$+ z;6K*ZkCguxlK)u7{6qZ5{E^?s=07V|kN!HEPSPjQr-|>*Zgeob*Nhuz8>3e@YR2u6JPI*QusO+t_4RV zUw-@v__|XUrga(57Y1J+K-G+Zd9oCy=6B0*s?ibRtFj;Pwd~?QhOZ}NzSao7-Wu5e zUx)N6c%%4Qd%obS&v4*t_<1(ITK@g8@fB0PR8!q(R=(^Ir6dObf3*3Z8qNQoZ2pgR zvgExy&3`oa$oT&Q`L7Ez{NHQyAF7^%|5BLd|N0~6ebC*9+c_ z^FKrJ-$(xUjqo4G-_YE1IR1Uj*teYW<%Z|#$(LozbUA-ezN|hhe648&UkTqEd@bu5 zg|ERs7<}!y*vax4!xg@s#B%=;;p^Ugz*kRQn8ue?WAIfJRoGEdn8H^-Rp626FZt&I zU;Re@F?Jr?kRJLU z1Ee#f%K6tYh1&fuYa!KONjamoFtT(!0J}`pAz;1q((x8Y(95=c0jIBrYd9ItGE#$f zb?zQLJ7?iJC*pi5EW6Ub{32a?F-p(n$zEz@7^}xPfU57+(lra|$c#mHhfhJaHRNew zqS|wE(m6{18AAOh-Nw(v`wf0F#gQkL^NsC)^FclS>T`I(I!vQ38{{-Yi=PDD&`o>_ zweaHb$x+S~(PP$SV9c{$gE79pL;>KJZwvtL9q9x>>QFMK-DLRhzZ9GQQ4^x8Y!^m& zqZ0&!P?lPM+|@Y>3HN_3$G zO(XK8Gi#;Rm%0CFgmwUERF)jqTd;8ZAYfrdPa6xD-e<6oR38gmf0)@(_icBtUDgwe z#TV5azh*5nX=~q)1tGP5!Q;$y9?3W-x(0Ca1s7WQd40NLJrKuJ8$=` z!r$D?H>RiH#5=ff_yX_ts$-B^b!u6!T|8q>ZV;)`7uas4LzGk~-^bS%8;bOEuEsQM zAt=XQ? zZ8eT9{24OX-~_V(MGU@~ij^UAy6hbiOq8)F4iM1(gRSPZ>b0vj-4nV52j6|@`Q>8| zVhH&6w8C+$p3p2jTOXYQJ1=Rlh#qyi-XKPrm5)$eRm|q!oyY98 z@WlUuW3^Csm6jneWlOB*5k_c^6`_aHY85QJ{_K= zw|GNs!df6Lu55c@8@UMI9bLJUd5Jjs4^fb72iLEjFEpekH&EsMWrw%wz(qO!niOyR zKGY9HHT8=`ik14MFmKck5sy7-ohCd4ePJAV0Z2&%+Bt9q+#ARsdsU-lo!IlB+fq zC-s$XB#z~fKXZu_N5|5cYv|;_n6bYz7DNiGmVUjo8r;td{6MQv2x^iPM+*f`q<^~PLH`r5D4om z2H(yi+X_D;Ljbqu=^f$lb$U1aIYg&}VxG{*f(n~ABq%60~`wQm0T2? zi-qa}=Pl#;+*I3HQHEp0)WB=&vTr}DLoX}DbrjE~GBFW=inDTH0P21%&NC+48Ok3` z;9d&;Nj-M32_T|0#Yln5+M(=b%$}$9ZsD)LaVfyGlmhY{qyWG*|XQgJwx;-gI`R>`^>TBUzqeC@G1bqOm8 zFqi)W5vF1$5&aygi1;#mR5CYpF#4eCRIbJIE096>QlnPQ32?^Zra_kc!a7Fh zcM+2Ti2M?)*@Y;z;U0Jfg0?9fkHMi#aufQOPh?;KEd@QHyE*rjzDZgrQH#F$>{F_y z`@jrSNsoW+8s>x0T6h}%fUi(ji-qD(>beg%4eH7-WPjjzo$I4a${x?8uCl*63JHJd zmU_Egw^!mNs+?3fQJ>$58@H?c5pMHCxhYJHKPfj2Hx0_=7uHu#QuvqfOOn2?E}99@ zl9OF%Nf+G`X&oL*j+MA*kR!ja?n92u>Sq#?-5(F7eXg=SLR-bt@O=oYi7K}%>R>3i zX+Aj=AD)WO@a6>Pn+$n#iF$LYt9(7WNhIAC6alonpdvhG?w@ybuQ~)j>b0NpL*bYM z3USRLy8AvTk$Rx^cG>5RKj01g=9rp}aK0_t(swU$mV*lDZ{PF+V+jaY6NQkSm3a^m+av390@#T2V zKSdE-*cF$eQ1Rt>X#MaHRq+5z16^0)VI0n{n#Frl^LGWTN*$sgh^jg3#X))%ax(IR z_3!V@fka0A`nbx*F)=PP3on6|5norBWEb=C0Vos^0;R+(CI`g`eZIkKlXTPkWZcDv zbL1JKWb+r39Xf1Pr(*VoX}}gNSuz3^JjslHvM7#q3@l2-k3Z|Ee$-S>5c$*ZanV+Q z-UG-=p?5wn?Vc4>x0!E4N3VmzpHshgdAo0k=)m4CThO&U-QVU!fwg1MuNwJP{R%b2 ze9ToQM_p%b^90`ZxO_i)GB;zK#-1SPN{2jw@2yi`sNV?jpU(Wg&>ObM2ymW_;-7Gy zO>4k;eqkMWTycIqJ~bo>@8u0(z$ya2o?q(f!VlqVhl=+9!DR)H&o-KMvzKew7W?zz zfl0|YxqQ7u3PTf*gBCj(R4d?DLcghUrRi6U8_G-4QBFXCR*rLDsFmZ;4?JYZIIe1Y zG5v~!{mSw0fmZ$oX6C|h+@zaT)Komb+38!4jqJZ z9BhKQrR1Im|357Gn#|Ban985^#d+)?$5TJ)ghhX`AIc6NrO>O*J^{%a{;rCoB$J{c z;uj+qUub-tw`y+!1Iw}IlLrS{B@YkylHJ1tW0I5oStTsQRdzAv1&EVoJ@*K$c&B1F zOrk`R!UhkNA3isF+Tg%|5R(V0C!-7FIj)Ywl_#(?k;UayRVHFf&p?W~JH0OYjF7 zNdS--w8Q?wM-B1b#TAIh?jeb|AxcwE4{~oFVh@758A((oF?cH)5O5)yNCGawZ<7RM zrX(OgBmtQ)Lcqni1OJ77%W3Wsg%Z zd0mhZMM|dkXYD&jk+S>4hLp@klaiO=|B1$;4Z!=+M-%`Fk6WIAw-TnJ<#&$MLYuoTDTVcU0t1mgFk`gf*u4#Y@oPEz*x(5daCPF;z?u{~_A8|{O)e)uS2HFn|o&&SvjKpwqG!n?)bhL|q!ru%wvi>ZQ zUszL?|3BWY1U{-F=_f!m2sjZ$B6tKht3go$f+RvTM8FxCKsb%yuJHh)q9P<11lPbM zm~j}5ii(0R-nc5_$+<2;76BDOJkWT6y82>J(M7pbzW=|v`^|fknGo3BFTWqmJNk8X zS5;S6S5;S&o+Yh_8J0>YO>vA%#LMrr>{sA_Plbn#NBv%B{ROxYreU4h7&cpqSVsu} zPsLlPn>Dd0s`)!_(bt8z1^RaiN*=WMBk148E1=(N(BJIk9+;o3vAtaQ=XZgee|ER= zzyBeFf7YP!FO>yV?cttdiF-DKLZeWARa+5tzjG(z2Y2oX6=e3)bpGC%A=Squ)gQBlXj zl|4V4*I<4)rz_@%7tVH3igg5XI%Sel?W~b-x2ySqRcWEdOFch)>&CFbTeYHO;6i-$k41gA35>C^qB}170sh0S*}6y4cW9 zNzZ{xHr&G|H>QyCbFv`|k`4Kxu%VhCg&Af4Cw0pxLgdNyFlq|vpO$f zI)zi}Rp8niZqeKu&c*MEW%Yv+mZ9Yd)(4|&F=>@X+A`Zs6~_$bxHOHeoAaZX{vngE z!&p;Py8>4VcX&M7e(ZNVR{D?qs=MQrm2N-oh%4olq!@s|&YuqF9daFL{wpK@AGcK}@IoPfLuIG| z-n0XyE#WlfQJ?iWbR070Gu?n(#(8;^=YA$v?RDC*5K7J9U*^Q9-oX?NNds{xUm(NG z9L;4fr>_D9SlI$o32X*?t>zMp4Q3YjH)nW5d1<-hQx%2i)$2+gig_ z1q@tOY`z+XfV)`3t&YHL=Y|X0PM-Lu6wV!8rhp^p3PzBs>`Z?0j-M7S6Si# zS|lDmuOjHp-w-jt_Pr7fZDV^PpciZZfY96lf18G%=7irC@Q=~(RRIHE6$7itXD_EO z&|NQ&bUoDte7Tee&7_QE{(CokD7OMv8FmcAO-YA-aMu~C|62u;fv<|IX_qD|R!j7i zx%&@YDnfO!`NN_hWO6p3CwXp@MnH-K0lkg^0#bAXRDq3TI8|o8KF*~geWLXGWl7Di zQQy%GdMn!(nn`J=*4OU-YkwI!kn8~eY6|Ipy6XQrSN~P9`RcR)^q&Hg{V$H-f3Ac= z8{#kDsajy+ry>58=Z_U6IN;xR3h;l7hQG=MUllW|%Y4z8NQZJlvH7pPy9vpxA~Z9B zKTiD1n5R@_1NKM{)R=G222^)Z2v7wK1E^y2Wl=-}WEsCLbW#6)YJQwJ*`?6(3Rz{A_gm};Cwmzl|(6G!*cnx z%@WNdfZ8TXxq@F76aHKcf2$LI8-YJf!&gNNd{q$hhI|0+k=%%OKmitcSV^5L!V&VZ zwlFs6e6ZpaXRjLP{i@*`~%O1$P~P8o(7& zp_)|=xINJ?>xVxoT&My9SCx4=eVY(~L3{WxjUR^FCp3-=rT^^z(S;C8HEbJx;*6g% zmH?2Yj@JG1SP$%f)U8tmq;;wc{2aPJ6Lp&w zJKFTcQNq6~(iP5B5yQW#pi+v-x0!5MihM2n`%f&>9Q-Ry4$YJTQNVRH83u8&G(ySK zaR9FH+egD!Zv`t01}&(C#X@50X=xU1RhS>-m)+3Thn&cN=sHrImD%5R22!N zf|NkcC23IHOON7Ixd64+V}I*xwp`u%5cG=ex45HZ_AD8eDnVVSVX3MOS|M0c)rLT; zqouY}_;4=U7{bIWznJ#qccq*>Sl`ncCs0%|MnCD2zTjAZQ>C$bfaSg~$Rk^H_a^KpHKwdi)$D!$gOVhKZ*Lb(Q6g4LTe zfO7r@t9R<#GzD*uJe_OFQy%INtWM?|Ku%R9QsifG0)Eg3KCG&iSBTBU6kRP1M{!lI znmrHXEIN_sY|Uy4(3E<{AFl|iCi4NC9IR#=P$vmdRn7ky?~9qYS~vpVN>hT>1ybi2 zsS_h$j!euL0axo9y>^Ycs>VX8k^k$hG}Xm&tqi;XFcG(boMfp{(431Z$lF=+3$+u! zK=Xwf0$*!1vxGr2O9}S}tBW+SLeyTafhpuxSMfGDw@jD7WL7;_mk?@zC8fmTYW#R! z4KBn_RTcl|A{9fXYN=f7ldywTt8g308FT`1d^!hx2HHWqq{%NdIQe~9$vKS7WZc&e zwmzy-5`)DlG4vM_U5UQ)EA$LwS$&C~VTG)|#<)&HJaP((z%m1QR<&5SFBjLFbo;gm zH&t!rZLoTsE|G;2mM$Ue9<16aCFX9^B_Ncm5>Pe!BK#VxVw1hW#d~xKLR7s{2j}8e zIvZTdCc)F|h1@gwSi2XqpIGVFUAWVvcYBNL_i7j`RQ&PVC)(?GX&NR4f`WBuI=DKF z(@PK#yvg={(7uQyfIGcm{AbmKS^sqjnAjb?25p&bfByRw9AiU&MwjJiE z1;7gJGXnsVIG2$h&}YRV1UYH@%3hTJ-$VYtk(=C!NDQ|*^)(aFzq&I5`eDq#XzR~o zS5#AZY8Wdn8S1K&$A;nQE!n6yhgETeFQvxc| z%lQmhSG&==QiMoxZ*Yq_FXz(cP?pX;k>VGRaVCIjBP}gOFyHxcg!h18>r@&ul-yGw zXhLJPfEUsNwKOuJZ5|s$H80Ab&QYAL5*Tln9&w^Dd0m|gk*UiJB40kCQAEaP zz-g@ZI9;tq;-;qz68{vl+WJY2jp=yOaMPv<&?K?C|nE2xPlNV6! zO}bi5lJ1WhlDu|YtZENWJioXHJRWWvmm23Cj2bVTuBfq;cmp-K9&=Db9t$*T=nyqQ7N@xBU~3vLEC#ClU$`i+`vpURd)miBl@TdR!6zZz1!&@NW}hbf;P|5?kYX`ZJA&-R~ zA6y@yNBPoqQ3E1N$dQfn*3}9+YCv?yo*AcLvIoS1=YXz0pS#HM^&&%#nQddCs|f?b z$7;X&%rzh$e#lVajF{CP-heoH7Y4+>HgO4%bua?_ev%?Ul_o&7n*j1y2r%lp2mvrb zq@bL#Uqf}owagD-IH-=jaY}+BL)83me=9c`qSlY?o(0wxed;2{#m^aH{G4)_#8~+Z zs=Y{8tB1rf^9?Z`j#=&D5##QkK#c2J$0f!&2P4KYv{zuZF4M#)cN0S%3o+JR8zBbf zhcqEZWPa!=bm(PEr>NnuANxsT4u`w`22^$Z#6^J*pD`4e>^V#doXcw8uXPQFJ0CO@ zI3Z@Whev^wA3=foqvBGa=fNoO1J{jSjr9czrhvyff{z1BaJs4U%U`TOS z%=!;=eyI3C&kti;#-&G(gVEyvwS3T{P}8HxO%Hi2^mw({MUS1NhmtRziW~5e$fwNT z+ZcjG4T;sV-!96;O5@C5o&v&-|HwshjR@ac2e!rnZ%b3+3 z-jMk1I}C}fN5&;V=D|oXo!TTw;MF83aFakD3klA?Dnf$tr3ok|>laVO6k}RA3pMEh z5oJ^8#?7*^2E^}A08tNo=)!;hrwsnL9d(%ae~Q)S>1y>j`1M|c|6t5&4{u?7%MReb z@Q9fB7n=glygi78yK4k*Zj&tIV?C9hOHfS|^U^<1^SG@4KX761h$jv99&LG;*t;6_ zS}k<78hfwJG1wa%v)aSM-ud;wUdN>P*z4LT_UOf%h(O&E506MH>%M+K_gd`9!~Qu~ z+(nZH&r!GcW^eG^b|?6hknIgoh zOW?o8zG~KYU^SI}3zu@>?-!5uV*Jmv_grG6*FA<1tB)jojo%B4f7TH)9u`7_o3NNC zMiti0l6R_dI&ik(-XCVVEm#wIoxOT;f9-|Xgjgo*;xz&C^XfpODb2q?thuSq7hLUS zvY@RlaN^Zr7Opdpg{vcdID|sk!Y(nioR9>K)M(@)!(3$H0v68e1yk@?@)kAlJ^RSl z3{uaP-`UEMj<{*kV+F>Cqz^?R6}+}?znp?fZNOms-Mb}i>8B!kz#n9i_4T>rkZpLv z9wZP*_PU!cCU*!n@HN})>$2L(9jm=vY7BSa%u57oU|S+`1o?w&;c2u`3-i3Fv`Fr! z*616+8d$%5(*wOc(Yt?8f_24Lh`R}Hvihi3FRNE)@|Bmb!by*)M;-a7mwI%EdUPZo zouVF1Q;&A-!y}J+RIDCt$0Nj#eJPcVRL|aKF-tw_ryecmqxaRLv(%%f_-M6y)JZ*> z!$;4nN6G5Z3_Pl~=Ba19zLu_C$6{6L(RTG{3?G%MM;q0n3;F1B^=O59)RT{fsz(de zqt19#ZS_&l=BQ_FSS&+5nxP);+lxo-)uZdxqi^`A86IJH!ryE49%MYfSWD@Hy>ukE z3Hgd*rl@sEaLVG6QLcVm;khP$H z{|+NxE{}%1bH9SzB_?D6T6ZU#={gFoNREON;gahQZgU(3*Y96FK;KRW7=I?|3|+1E z1=mC!0GEpibwWBP)UGE)PJkODtwQSZkF4se^bTQfN`7!KHsWD`7Nz(?g=xN!H^Uby z%X}>j?X#--aT`PXN2rw`_a7XzNB~GdRgSlm2t>B*N}^*0PJip1KU1cl6q=A%VDHCC z?`le`OtZryq;3hRB$*QftD4CcSf*(7JOonzZKI3SqaHS-{xLC%)VJGIfS#NWK>aizP1*gk4P~pM0Uf6S4UG?|erklQ7r^na(ljDW5+R4`0ASe1w)UY%py36{%+=_5b@=eA zk?F99W+jv)dxNX%`Wrmce>IyoJYgC0Cr&UgK=+@ThwkUS?ZWeS^9`PZ2~l|NpkWsP zcEcehC@wM(vXKCB1VHo$2=TwxzU7*q?+qC&pArpb@gCL1x+?{Y^L)knQiEM@cm!tU z+!Wi12<)z6NCkR{xuaL>FM!=|_HTEDRETIGV$I|WmjTcrDKPtLn5BT3&n)x>I2>^V z&|fp?O9LV}Gq*=D@y>4jE@ zu^1kXGZw$uCX+$YE{Nf2pUV96o_dteN5$$@>NPl@`@md4dT@h_fkp-m18x7!32Bms^vva&dj>(k4aRWDORkgsc?VCRx#@H8 z&NF+pyp?vD;R)`chMGmXXYx=kuTP)Py@L7)`kP7eqtl~Pc?XUdofgRX^k;NGl0Vaf zwlTsAqaLg_1gype4uq3$O@SP~x$!e$j0=AP$uF<9N!}sP%+E2;XY|Z+)0aojkI9lb z7UQ2TMLoaLRLL11&18o{H=|STJgF3p!TW*r^z|H8oRa5bwoc0M&1QPDJ}a`VK!CO>VTH(Z4N`aVPGnNTGo z1Gyc03bo3AX%h&2h0F$t`(%Hyo)FFkL~G+(7p7wT;lb4IAb@AEFQ1*C@^ReJnJe{5@!X$A>n}FF4Q8{GjK9 z9Lo6+&yK`Y6L6k?o}=M3mR~ytf5~zg8il8_G5*>bhrb5gWB99fjf=l#%`yCS${r_w zy|h#D*N#gLlfSmy4gR`b1Jf#9M!@jbE4!V*1`066U(*!8!^z*i;3M$YG}$miiH}{e z83&&)LRUA!U(fx}fWK-zxhB&R`e}MHf@VdvdnW0$;Kn%TIq3;ANwHZH^3-lpAYkFLG<{S{p?uf zAL95=7GfW4{L>K{YknDUr#=2xxmaOVwPA%*pw~v`mzQ?v@n0B=6`~ZySo6!4J2?I| zFf;ydHC*w^zn#Da3NStX6+kCv)HQK_S@1r`{||>Yzl5-eimNX^SKn~_Uv#kX|DGEE z7RUc)o0-1sZJ6nx^GnR}zX42jSmQs;@&B5O=y%;=h<+wCTlQX$|8Mp9A03P6amW8` zj(-iojQ?8hA;a&y7N##Qr|64fzziZ<7uhZin5aW*jch&g+n&bZ+n`D{i z7?QciKN3)5m_^oa!;@hmn7NPyGD+H$NzGF^T1KrLhA~-&rYQSjJ;GraPFu@kA&yYQ zfBfA=s;_4oQq6>t8X2GMbhrGYVv&mF)NvS>yKF5y3gKJ;vff{*plEX4In9vk1Q(R& zEQP$UM+y|D2>`ZWfl@!kh;10?Z9_{BEw<%649Y{80uq5`KYp{r2wTesLEaaW>mDqpZw&`2Y)6n-+mwbo!^!!7K_h?1u5i)!h>)T0qfkgA^ga6-SrwQ_R1Rz@9FL#l7 z;Z#HBUM^s3za}sxfAm4eV-K{!15o3#;iZf7-3{$8UYK2{K4{$BOA zkZjvFkZk{Yn`Db|dJRdPT<4a*2U~wR^{=iMM(JN;O{I6b%~!P zbaypg*B4RrWcWiz_(MbBVHur5o1_XBiHz zuXBp6>0c=RdIiTGHRRwZvDLu7_}2Wx@9}%)sZ5fa6ZrT`3I3z*KZKU|K?LLezP}h#$R%#p>a(6;vw;W z|7iXNpR^Ut%Y`r9Halkk zQb^fkQVb^z|O-APPD+JOp@IMbe?D=)oI`HefFAj}gpTT;H&4_6afBQ4?E4ENW za@8L%{-OQa_Z-(IzWfd0*|TfGvqRR{Jlp&X!?OpSUk`=9CiIKquX(3yIPv*6rv1IJ zDfV~BbhqwChH6<(`S*g0p@z;d3{?-UGD7C*pKAH%YXUdP6wWNrgzf~?GL}m460y>7%TCLE= z=<~O33iW|#dDHT6n;-n^tcwviW%8?GAf*5+L|hPp+v1$Rbu1<)Zn2L#e@oU92oqAP z1)UMEN#}35zCZ+k)Z{#WOA2t0ljHm?DTL;(qQq?Ej9{YIQJ%4V@O}IzNF1^keciBx(dRJ^u-|hLZ+K= z_T;b-&G@fhN;-Ra$k`LzpCCxS16L6w7bqn2_%KP$VA`V33R+)(L4&5mO#m8`;_NA# z(LtJVB!T0Ypn~C|e-gNTniW4soVhv8Y7cMmC!ul@r509166ZTl9AOD78|p4HM$2hd zQiDFtDnpGXq>(lkUUdPNJ*qTkS|P86`1+B|3$LwEKu)vjiEDkD6(zx+USEp;nNdUC zNfu9a$!JG54h_F58EZOd?E_H~8GmU!<)5@a6*r`_^n(NHNFKygT`wovu^*CCgoPRz zQT&*kn#^(-QT%QxRe$1F9b@$nw?9aV+F7`=$;?xki0WlW;x*97FKslkq1I2(?08zq z{Zb<7f|q-u;CvN=81|~bpP}O{iSG3$ z;6;F0w@}x&jxX>h^|2dvFHC(bVGTrmD!z`j&d{~8Jh*U@u4@}_@h5dzxL{rU+)g;X z4L8=lJk_>Leg+&$NoLtS*;Q?2io92`v&f_S`gYFq3MI(XT#l*&Id8wm$uY$`qMueu zCzYurx_M=F^MFHO^9;{z7lSIe`a|h4rh>J3BNOXxRt36vD(9jy`_)V~Sd6x7ZU$YiRLB2?HdEHh7wMiE$10V-msG6jw$5m=Dvt~ApkQy7zszs{l z9L$auVW6%CEc(~kC^>#i#i55+mb-cP(T?aOfs1HR_o@%E@s6oCp{hnmG4q@%d^bohZzq zs6(3r>yLLxVLh$_%LxEP`ZIp&Hse2>6xHVUlA(?RqsRkwH|=Ha zYa;-M6-Mgk_dJxUov#0WJg~=B-l)X7=JH^+Vr53@V~O(Qa_G@=zKk^w{!1p@Dli}6 z5S*P-=k1(B0y!UT;+St|wM8I;1aiDc38IGmOc5qvR2e5Bb!#6K1;rw20LMKjN{tow z=tTpm-(d7^WP4mkMP<;K1|z5(6}1OT8h0099P=vqiTwDU$~*YIJs(w^j?=g57zOB< z<^M;Q`uwIs&_ExO+QiGHLf07Th?M{sx6M|75yZfD7Tla$MMY28&p?_f@0hE!+_43-F6-{?1!7 zpM-8#Q^14Od@AQ}5TNV)jhO{<{zffaqV{(|`3~owY$Q)g{`_fhx+}J14Vo>bvY@J6 zpTDsHZ#j`Hl;7Dp;5>5v#!qjfN`3yuX{a;y`5T2oNYftb_m3kvx|76-^<(!}dEJiQJDzcKHT&UGw1J z`Q5Kf->MhK=$l>~6Ir11bQqw+)8Q{eQaHy(prv3eu2Lafabzra0d-6ER2JZKE~FRZ zTO{u~a$w;UMRWQzPr8`;?ox>+laPU=FZ(y!qrMhBwcS22`^ifT{s$FHQ&&2{b8LE5qowIJ?zS(1bH95_S=Vxnx7*0v`9y$e5E8P**{%ENlb;BLG+m}NAu*X~+iZ_#`gnJ%7S z$n^6&QDh3NW5Z$JUIC|iV{~e``Qzzp0I9!*q-DtOV+@@_(U6W8NGaBE1t>;LLT=NE zblnRek{4cL%7A!8l70FPBHjOnBGM)tP}Gn}9l6?8+6<(UgGgSnug^O@icsY@XMj$% z&?{v$>Am`=D>{vd45r(#lrVI%2h(*|19!>uTvU4L8bhU_8>6W7=~~tDUqHL$1Qd5;6E{+3vy3DX6JhkG=wd0y||p9lYN zJYvaCogPs;b?W}9`g{tS0cxRV_D&tO4WHtQadp%M%*HpYb_@yx*BlXv#oWI#)(03`Y)0TTisMF5b-MrF9fuEt^#Gx(!lhnur4ylE{z7(T!3Nx z^@$Iykv&mS*dDzI!=n4TgJ3!{3e&f)QJ7u|7kd<@F=qh9=%1&8;md;fvzY&Yi05KS zA)f2oGTa%A2<|D%E61DonND+E_+NXK!T;rNM&W#8|j(40fZe>*_57Txb+_Tte7 z|37bt0u~Tplz;Hg1KNKkmOgkE_G$w#N)k9v{d0}&pMm6P=)dz_2}*u-uZwN& z9B0_(jP<0X*&nsCM)Azg@RG;k8QG=-5HfHZ`0qZy0+4Rjko1`CInwY<%{nKf;Tlp% zK{_1&-QvH2OG0qLDh0M_@$T~^s5y>5`0uOG{Yd=6589U>*MGO@X?Vs&{x#QgV8rN7JaY299VBL$3@@guQ2o-3`ILa-%tLb=-VDWJ9PRU zxD1dUyvHRIMh-Xh-M-cdX_AKY4E*9E4;=AyP2K;t5cGWpZqY-b?}{wqJ`R09ea%H* zkM`NerSHb4guWN90DUii+@^1bR*lm4VE%oY(3IYqX3g##wLV#ad`ZGP@z*B@s~;1H zU4Pf;`o|u;{)X|N{!lX&p7N)q&hV5fd*Z4L@Dhv9BI+(!>fVesLqk#Y+NEHii|=x= zYKzMZt1ejMWT5VUSFCzXmnN|4WjZzm`8)Ogt`P+FeYJ~M7Y;SN+RFuM?Mi~u@t^R$ zNAv3f&K(Ee-<9?x_;vq34vk-1Nsx6Mem#>7bH}HQ)v*C_dA8#d!n5}*1wH*c48$4rTe|WRF zEa#ud2W=naQOYfFT;4g1C`8Z?%{_rPe)ZuL(cPbWYYvwvZC*xVT@A#X9TF-ugSAU_-Nvcc>Z)shfu(`P0wC)N{bdoV zQf9kiw#%#ifd2F%>u0EJbS2)vqA*M0@V*L`hW`Vez>6c5Rpv_x9ALl{LAeRmihpu^ zniF-#;JDXykZB1e9xL&WdgS*|W{+ldzeA{@ciEnbcDPdhDe-5>!I|u7U3*xo$j@^L z8y2_>FnsEx7=Z|%Nm)Tqd}hNN1ZEzT8^{?cFjK5BP8$+wGbvNsTEMa|tJ*?&nO@uX zfcT1)!Zx(|E&woJT;BtmB4>fiufjNe51PN>e;7((-O&G#ru`3PSVFnm4Mt3h_#Z01 zM$L6cv685spY(|8`Ekn|_8hv)ptL~Fm?gw^ignK)OwX|&Z8BzyJlKHko+F>aMsb_g z*7y65dk&vVNvXTPr_e%S`dcL-(M~$Czwoq_p3fmne1a>_`1Qa6*uOeE#`s}gD(m@- zHA+y}w)D=Y8e@A0T&bl(l+hgijZR4IB>F+L**s4YFSzWZ*h!ca`fHDb6_7sQ$d6#( zx27#+%tMlS1kdy@h_OzEfwra@pw_?UT8=chQ4K<@mS@hYhNr8(h4Wbs-Ts~>Q<}^E zp4vqF`*jy#mQN14X8F|@npuA6N+=Znnf=}WFy{2rfV2OR{e5-^n#2A-?C&!nYQPWs z=Zkt!vKZ>Yoe$XR!I}i49vs~M?wR!igsR>j0D(rA1B~P4=W=~oF$!{_nm!a98bRyE zT_TLR1x&?{{8a=pV&zo+7w*x0Y80rLcbiKs{BE>S3xms*TIlt1k8a18l>8WRvd9l+ zds2r?OFku8mllaKNH>kv1uta%U(9lG$@~F^OS-t~U;d)1|KBHR`4m~VaQ>)UEn?5! zsB0&Gac$H^89Hw~z_s=5D-q@qOu0QbW}j{z;o|&&6l*FVNA1+B^J}D@g-Mb~jo$jK z^66lFGo{XOpmgL&boqx$7fK%-Wl(y~GABykc!6DRuk@S!C&tC=SSMbG0LTv`0OWQJ zM6dVz_cwUm3=Nd5t>|_+fk^)zP!OCe{`wn?9aK5QV(fj^C|&s=P?$ zkn=+^2fGY}(D7DwD|QKkB6M*JR#|MF#wX!6tDvT^5M~n@G7`jt_ge3tp6>0w-Wr=C zWnbnjB2&95n=5tcr3IE_DBDey^@{c*`kk&9N;d079okTmVKryjz?wp?+|W(yY{|RC z4tH_xGgJ1vHzAF5{|Y$u(YmknW6!L6DXO{FLw;ROgW8jI2_9?j%2ZwgNRe8AYVU{o z-uAZKGX$J_R=G=ne>Btx@Y0u*Y(*8A6OVY7f=<~l`oNJM%d!`LLv$BHT63#wjQr(1 zGe%muAkBY9iPZPuMOW*VXdiJ_BsZGVL)@JL5wQ(U5An`97&~t+B4eR-#zWlLe&`c5 z_|X90(8OOPbS}YyAL7pIpl+`9$D@V1YCrUzdxXVrd)ev*la6z>o}1VQxc zPMY>uu?$KMU7Tf&PnPOa{#32G=jUJaaH-$umVj~XznBvaZr{&{WmLP`5BjzEi;Gj9 z&o`Vh_ys4YeDbuSU;E=?b4la&{R4vm>A_oEoHDYn;gs!ADM?Ailan;0XXF$j_=6&P zR8#jSZn_)%@yxTDKbn}&W`#@^aqMZIE=2bu_I(f9MoAFYmbURO;gk!X0H<7jhs`M+ zB!?3@rRny4*oY2J-;`MN4Gsd<)2F-W`_5oP-)o(D$mxK;N0O zZTj|>97>JQcO_;jEdz>a7cCdb1JfCeqGfDE2{Neaq}KL(Wx(+wU2{08XBmv5&vUCA z_zy-tlK@-SrHwr>n~6m<1s7#${7)3iG|qe?3o^y9mSx-7h#737);7={R4mgta55XS zfo4b+L9$*N_uqIb0_=`mliEoo_S8eFYnfObu+gK37$M7GKScbi*dH&YsWGs(nP(Oc ze8p9B&#dma3LWR!5KLhk=B%zyl08Qi@0J`T8fo3)|8A=g@rGSS%I-*;=v-(6(mu3` zXK<=k72`@;RnS7)&werX;Xh#SRC2XePWq>(srA#?wzhqk{II@6@3b0-(rMLNJwa)! z2MSiK;_1pLCq1k`g=Wq)T?S!;*3quYxc-D1F4pFZgpyXGb{A7&*-2GB7b_UpsTfUQ zo0|K>po%}?l0uR+*I{55l4g-Tyz#Be_(TO2f<3ZqyE69f0D1jHry=r~2;Z@HM;VkQ zVirBhvU^m3_zWntwA?zDjPw|nWVqFi8&LZjxfwxyN>BGKNJ6jP%9XW=6VUA?7|=1b_u{y|9c^MjTRn?S$Jg2VDr) z?*GWX_iS@$h8TDM`}o>NQ-EchUmKJuZO(j5Y0p>MQ`%QMG;x~{U+bCmG?>S^z7cyK z#tuzS!|+ZoWUl9>dm(dR6&%I4GI{p9{Xn|wCcD&@)C-K-^74~TwPnCxIc2sJ`!sy( zjjdlUlh~*Ot0Yj2`JApHoFolL8=?Nu-LQz?1?SU;2`9xmP63G#q?A=(VoXt3zQDSt z5@)-XFEX;iy}DO{by`2F)t3g#7ag4K2vE9IL!S#5e8bht=mz1O=CpL?D`{3nk@q2n6e zmdB209PbU|_wOR0t{RZ$@2|TWyibk>lt@72@9g-H4u!vm2Y~uBA36x?qt6AH_JBhD z%SjDTFZ_Kvg$Jh*2Y;6y5re<)>4V;%b)5^%AN4h8E?p3X=H>#I@xK6kX#CxUkk(9a z@%LZOFnDei4e5cos)z5khzqFc{QcbwAbH)qgCP0zDE>Z9H(@B65XIjJGh8rTG)V~ii)y9;`tdw&Y|Jw)$M>7ho4V}Az<-Ke;MS|%KD%}*J z3M12WDJ~76>(JUpZ8zoBGfCV z8bako!`gI@LQ_ixD<+|)#~MvpTscN*L+Q8Z{VDtDKc%6;D8z>6@d-zi95U%piU;Xd z1aPiULt?$Hm0~Z6<=RYS4gUp%3an94`+uA+O7X*YLMdKWh8BdA+Nwt(K6+9;IxtO2 zmGRL%>d_AMXdE7?_3m5Yxifw0quw3 zU6G};I09VpIdDTE_B-6`Lfy+W_A*1PB_=+2!q3vnOzoD!{u@(w{P*ZmiRr=Jt*7 zE|!1fKRh4CcQ%ILS68}*;GI3q5IkcphoJFVtgKdJ;^$v!5ooBqHtrw!yayoNtRd+c zt>+)i0Ia#+32C^76jG25$3L=oDuiPQK3cY4?06Yw(6OB~jEH5|bw12ItbSM?yjMcA znd^L*zu$@ONBko{;M^jTEv|oLQJD;=(`J+ZOC$V`qhb{Q$MlaJEPkD4ESvv-ispY) zcVqnjGemI%{>MrrO_?%7!(lv!h(hQ@bMJu~?7jAc7vd9~7}we>C&pDr&V?)eRIhgB z;3`3C$cx<7H8>}1Z?jvN-T0eK(0%6RE)F}hhvBgG_d4l5<_^VS_rReZi^D)Pk|$So zg-bZoP39;#&QEe2+&HfP2=izSQ}f!oG{bA7Trj^56Q=SHcWMgUy02kF0N6AhN8p#^ z2ntg~KIUVedY<;>ZuJMZ_=D@sL1LY6Vt(uWaHvK);0wO)3$FJCKi0xQdIv`^*2Y)L z(QxUV{5bpy$A%#^^n7V1j)tqXO5uG+Ryvwr)X{LY{vcbBQ0GU>Aoi6f_pB+xe@_L$ zf2$|i{C5+MvQhl^9kLm?gv_DJ-yJ_h@n0uX_u=qgvf)2C`u>ajchyOvQim;AKB3-yatLJyJsc zn+7-SVe;QUZYOGl|LDJO0{<fMJ#))?R#(pp`h@6_SBbkaM zT!oT_39evqx}00bEBb(^v5U_AP9}FaP9WH7@vY0iWQHtAKL; z8u#P5;!1IBV2HB|Lw)AjzyKGZakC*sAsl4d&8CtcTE9T|3z!szf+^e2b`C?f*P$5+ z#`C5t;H=^e>rD->G^_yIY|MTQy^(_?u{Ux^6gcBs`=TQH*I+DS?-|6+KS2rI4@86P z1~93q*4GbWWV@gXWLUs5jpWQz;rj}$+*rf!#P25Z7l>ivJUHL>VeziKsbAvC;e6{a zKHS?${jh7l#cXM;wG1jHJ#fV+!J{4fV~azZnmElL ze2+KXN=D%S9woBLg2b(xN|_JfUX)S5Wh)6$Zv*#Q+o6nBBeCKw1Y3}RkbeVmDRBW> z?d13P6I$)TMN}7NO9^W(DndQE+Oqjmed)M0r_ENp!9`obrbwp+F7_a`fxY1qXQpIZG4Xpf7lg>ayVBC#DN}HpY;fCG06O-J|J%OBwtj1H(5z@|j0#(WCZu(Bk7o3({ z*8)!+NO4>OM23BiNa62_n4XFX(MaIWRw+7;#Iexu5%+fFqzSA>HoYyr-5>jE_MP7^ z@I|xy#0@^A*yEgAppWuKT$p%C^DEbvOcf__6>&u;G1z4gl;SZN3R7uN1`~lTPvBZK z73v_;WE#BPUw(Fi)warox6DA!trZGyOLv+nE=`A~r$OJr_talbba$Mr30YfX{bAR3 zooeZLTmcCwQAof*Iyo2koCdC=a#-9D5k)*ic%rW{L=+Pd6Pb{|$RNT~QI0m4{b9`C z=fVlrbz@Q#PLge$T+#q1fm_e!__g-Wa-k(PkW(B`Xn6!D6GhGZ3N3X<$H9pQaX8=% zU?&MzHmdggWFCKytJu!$T}YWEDqyrTdm56Zximuejaq*`2N|!|4~3F(YGSfC_+$54 z*cXq%3F6++tq8(cjV%lty@~rFZg2foMY#gE*Z_8{kJ=qlO||am4f~GdLM#oFbm9ak z3)mL6w}MS$oDNoCDAo5ke1d<&G16F)!o4#Zur>iR5`!y_#ElQz32XMHR25)X1>7qR#OI4rPvMd z1`eRdOqiS>#6aGkJfNx&T|R&=&%wh1RRzub;Y)wZ4}Rj?U5oc<)0fTj6JO8I{vzMw z|DxKTUCaHbK)Ag`QJgTS+-mE>tN;rg>dvpR?n#%R#dQ?cZ$LJ=*@eNRYW@~iY78j*$*p;eaPvG zzpp}_n!m-ER{*jfIo;=3GNJ{~c=0TGx8{pv&#RMfDIweePznU+x1^Cs=n+<6B$$;=B>CFdZ zZ=KXCKYQ!s=d0@$00X9a^UJ{p3n60SNc1$lJROP665*s)i9Ik-w#e?c{z!N>ZH5|s z5Nk-P2>S;{_UM#A&g#EFN@4!>SbO0~hn(_;PVxoE;_VR>A($Bu9!Cbrz_fF`x63=| zvv2oDzM8$~`#P`p9$1A9nf}B#z1f>Q;U_^Pgh6;_eS-^h5FEV;SELUO!^qE%J9N2~ z*c$qImaMPY&K?hL*1zTYKuvRR_B)=L5)_5eJZY*NuoAuqOz)W8n)^V2>~)hz_(Mng z!(iL+)xQl5PS~D2G zjG@^z$ZvuuAS~+Td@*G6RY;lv+p#R!RtKWf#)_@g!_W0kwGz_rS~++$X`KLoJKrA3Gg zn0r|9M?1zr1$zT|sQ*XtM_oUsg_Z*Df1Tg&6h;_@ljdD1OX6e8uq5twnPC9y%5|FJ z2Z=x8`gk2wJ(YrhyFB#zcrjpe!P?C`>tM~}s9SC%Li{Zs+R{s-q z{;t{~E;GrjlZ=_oqWKpUY@tIOmlaQNS(`VDQgPiw`a0HgoQhliYjQS%L9qpE`fv72v8HZz0Oj$_Q%- zb|}ptZ2aln22{09jhsEdYO3n*UYrOd+vOr>&sRVO9!HD7QV1?@7&0@gjRL_Ry}=Lc z*&Fe*!3pU*yUSMq!4H{ zlzGF9Q4Q;pA|fFC8U&j|^M(ul7CC7Thfjpt(;vd-iwOjyA(uBP6+v1T!@VI4qzi_3)LPbnP)_*S1k+dRKhQWMb)bgC`XD8Cjc z=BARRnVai9axa%sY#L_^dIZ4mDYEOYdu?3`n+XLI4@~+D3orjeml2A`L)k>cMtS+@gSN_YwRiMt%R|Ynn3A-+N{i8qpKj;iXJ3A`=zT+}~#sCt(~Pi<~z4 z&2*$+mOVq;Cilkrh1>7I4uxcrVoFCao)n>F---V%UupaU0C-InMzA`Fe9xpgH5UX< zpmLaIc3r@}fgR}-tf&(Eh~no>N+Smg^I}K3ZL9B0TYajw)%(*kt$e7T+E9-s!#)(* z5OXRmdq|q3_s4XQKH_U@Dq0o!#%y>=ODIW}^_~~}8z?JG@Z6g_6&Emx-J4scmLh>Q zd`X_r6Q!RW$82W(>+hNtQ45Z`2~k4GF+Xo?Vb2eoTj-qG$zRO1oLKoM+R9>Fc*DxL zF1mts(Pv^nZdT7NI(lY8qiw@+TTU^KDO;*p$7(>8GP~k(Tvgj9YOx6b%ql#!e*RP$ ze*caey96c~+#pkx^?`oP(`%?mNxMZ3KprqXeKXpDvy46Sn;*Nwe>IsX(q)5#u!Ma6 z2J)iEvfy%;1+htt1nVR;z@Eqlpsv2s+0+3g=76P+#tQ8^G-&8PSi#EEc%0#l9$uwU8dt>lu4%h)!~jlRYX zTj8fnnZ$x*>@u~^Mc$wcF%t7u>o2mJpND(_3sefWL81x8jFX z1ErMqBq=1riPTOywhoQr=~g4t2hg+B3yJOrB$ga0rRuwS!^3ig0SQl7nP;y1)?Z5hj;E3v5y;VAd`(ipD??tD$_%f1t+a!F-6J-Ug+|mJoi0DPVz+8$SDrwluqEtNwF4f)gxz8q4uB@V(b*Du>(l7 zCrzZm5febfanhS#dn$T^JFE$)!8vT|I^${VPU9(zF0~kEipaRxh#U2I4X!Xb7}03G zx6~;R>ypeCFQwo7g6?Y_B9kBGA`B2Rl~YI)-Wo<@^!bM5|fPEggpgL2-|#(lFg?KhsBy@jENBmP*xK+xiB5)hkVKT*)=fn zB3frlNk=vcv(F})nbylZ$9uLRVx>jQoNY+`=f@7))l%Mo@zMAi>lxfA6g`3~g(BN?%DC3@<*F_xyo`RkC+zxaf`b>&w%u8H=s?^?miQI+Ge zkLCSpOe*h8{EzKpZw-ef-A~-DtLAsZVz$l^Zh}lJ` zj;SEUTweCK)P8& z(xmRW$3Uu?;Dj_>LkcNKT)6v!gF)uJO>zMJco>}Kb=$l2_74W|_POuqb4}k86sT6FB zHJHxjAnUR;b~3ZEbs0Qhur$b`hYH=5suF0A$=FlB9_u^g3M&C9sV9!+2(Xb_Br^f4 zLiir-cSsmkrZmQr@zj;4L9gU`K#4pVN~FqZkWL2mRwPtw{jrAXSDMvxvtwcC#Uc-O ztTNc&O5j+>($g&Vkfcq`)W)rd8GA2=r<$jUwG?7at@31k-T%DCee`rWQ)Y6RzkBMj zMgQQnes_M%vE!H@^XM4)F&{zA|8aiIL(#7`4OaTqx+~eG2Kp5+_Wz<^T@BTdQ&VI5 z)i{h|+c#Lq8*n&eQ;jtkH%h))iOtTKrrbR=Oyb=B12G zhogUGVYZ9Xzm9F9{&ih5NZjO}F8youPe$Sny$TW+!viwraQ%~hA7t!lSNzZPui2~r zzx1z}?*Plle|n*a?2@q%*?0E0IdaW2h9jGj|Mb5)KR=xS8ustunxB72G&Bs2bIzJ4 z{8`P@<)%yCA*zCk3f~y+Asg`8frsw(5(BSSr{w zDIR=&-Y>D!apva}*{I0;JQQuCWQsdKA3acrecQz#_M>?=u`hbs5IfHN9DwlBa|Gtn zhM7Du3zjl{=V@5^AvWRzd%=f%n;(0_Q}K*GG-cnX*}Jk9<=5Ar8Z{55T3t7Y^#hS! z_#lD#H=A`|A6y4JwAu0%HOW~WP2-~{xPFvMYJT|++No|oOcw>f{X}kdfeY6ayB2Pp zjR3V~n8$DZ7ez!Fg+(SlfWF)F7;pGk{2Si997bAXDJo-R+h6b?i3%`o2Eh;@7J;PG z25_Q!Q|8}J@PBf$QgLh-qakY(+C=PIYR>9~$D)};Yy!srCDCokcpqgRK*$?xMs`r! zo466xmnM|5eC!kHU*&D#4-bO1WP^^&=@;0ZIIwC$3YKWA5h?es%`eUTi5t-PG_)_H zdoANb8MiIquj=c8cLS=1CHlf6es@)eda|U-+}!$;^1FPY zVnH|Cjo$7Hyq@YifJmhc3{bj*fk?hkr+h@|&Dw(N{Lo-T<-LWdCWI9pVEc9ixzhOT9r?jJ;B^P=GNnoR*>BZf!caQ|-Cc>pB02Bq&|8^?j6UdO%`5c|2RPd#zPh+e{dT@ zmP9|bcs`n~d~8J2iMD^?%6`1We*7G+`d3|(sPOcjZ}%r49AXN;Y6fecKk*BM6W($n zV$#wt28yPfF(CLaglz2qZcZU?Zdy~{ia}Yy&2>I#mv;RZ+4bi;z^eB3vET80F@JEA zRmU>$HGrQHf7OY1V1M3ONAm`JB{zw@0paCl*Bhp1-{MNCRZ9PT+{m^cjZM$t{?hWH z+_*LZJ22+wi%Hhlw-FsWyB%OUlrF7vwfrf3k>aC>I~x{AU(DGFn|+?4oA{2=Gw z3tb)gt&q*EWH^50Y=up9Wzc@^>#{jNT(Cb9dgt%_u0MQiyZrEF`^(RRm6qmwU*Okf zp4qSA%CqFycGOgT;j+EXBS$b)J{0_=d&8}z3|uVYa4F=} zF>(CnZ#_$pwpkr-ecJG|(QzeTR}?CYz%F281dGPeh(A9tN?{}mMuL;Y3#tw0|TyV#cf%@1Gjdn8D>nJ?^5|J}3Xqtri(46W?IBCy$&)+ra(>l)Abo!240 zI*`+n)q5&_hXC@!7~cm_5brr87GByVU)1_bz|W%Wm6?#PE(Ke)ec zD?B#V5R6S*Wc9-hS^=@v8&^tXMJYGq5kIv+%dcqlCQroK;jFK=%8@TF`?jZv>#H_D z_eA{XsVh#6st4Yf*t3x!rCkTpj=U6X0C0;h6Z(FAe9sa*-3xK!Kz7$4*nQVw%3E#LC9uN=+xa zLb%s`+2E=hM-b()Oy5Yuan|^L!JZD=_v=I1Rm7j}UlGgrJ&qC);y0H_b*I+e@S?-` z{ZN)r|2RLW-@TVj{jcX~>Q~ow5;L4rC2?IV`Zru(Bj5mOqe$Pz?B7rg7`MXE-^6|1 z><|BP5h(8a5tR7q6c@$s{K-)KjL}X?tQ?{!{`2zK6mNWe{rOHnx>-Xq_V4Y6<~5_7 zkcMkWAqDAh*4K-BgUX>{n#xUFU(bWONUp##kF#l1{)c>YKeE35VVNRZ-1YUMbA;Td z4Fb9I&bG5l~ z>&JOb8D9)}j@UP%{QF0dA~cN`^a6FEQh4E}q!MlW_kRI?*Cuc$8J34?b1yL#&O0JM zSc8pXSc~WCeQGbDXnt^=T2OkMffn4K#=R{l!wqW5Q%dc9XvtVV1opO^G8*q%a{X^_ zJL7gUXDom(8_Na%W`FkU(CW>QImHcA=1iymGz}};#Pl>yn zD!m9xsbp=}Zs|>=UHccLB(d$I<`FcT%ULJAIR)`_(TqC6%kI8p2d0I7f5CEu087ytY)g}*Z*{E0Eh6G3F@ zfH7Y{YGX6YD#U<<3b4xSb?(TUuy8w~KTJU6e~H`)u4V}w@&;Fv%$dQh2Q~|R@w^mg z>4`m3g!!OUFJJPExYk|>gW$iR5@#S517)xP7>?KPU=T1m5zD871MhZU)xFjfp_wb> z!#@lm)N$}nV4TYDj3KhUMSkd#?#VvHvh;vmB@q^%(l3F{>qguJUfW`o?*3SY99j@* zDtcdC_Xn6ie4&!=DPD9kxU;Su?%B^|g;^jAErx8gewq`9!VfeiA>8>XCK@`J{1g@G zsd&U42pRG_U-DI0a}A$ z=z@r}NkJwXc=N|X@~e+<4Z2NCMSKBR42(2er{2&ZJi)?Li#f^>zscp}pI(;$Hi$*e zJKKTI8ns3PQRxC9qUHNB_Y>G zd({4h2O!tfKwVQ#0}SKtydm%jBSd$3aD!EH<#i}UQCYTjMg}es)~8BZJ^rXm43HA~ z`#>3zcUG)NRaW;ibO9O>?ayk@*H0gCKK&;GH|_CyXwPtyawJla} zpVU#B&w*8Dd58XXfEIKdXD|}&oS6lB*Z_F|7Cy7CxPTC(PZiu+E6j2)JseRet}5hHrj z1eIz-9qqTm@S#a)^vmfBP!?9R0>(3!%k^-WtCT^?kNqHilo#@bE(Zl4PhW*HSXN(? z1umG7J|6V+`eB?EN(c70DIM-xcI~*SY2(T!UWW1I&rU9FH=`{1`pH+{PI_4QXzEa$mr6AFI@D_2_rW%Doab~ZuzD{U&?a`haMFu4ISDJyW;?>_owDHte@FkU{eS!B z042&B-r#4{_9&Q%e#(-S>1q?6B81wUXO65L4mO)3GS(k%aa?}5bymK(*4F2H2Gnpd zQHH~ zj@^lr=Ny-u%~tUjaoII84awlqhf0S}=s;dBL&)+ZoNJ+vN9b&>0OdMD@d^~@hnylf zgd=bgp=@j-G_npeAB+%a^Mxg4(bbYXi5>}xW*mT6OYnr(N*h^qV0AOymd%c~bhF!n z&8v{4AW5%}GSH@%HGUMrVHZ=7uv}9qFZwt8J-2FlvjaeO2Y+_WWE{TRCXe3h4KTIAxvS6GJ;0$l;`~Pm`4v`L8w?@Il>eg1PxJoIOY$Gv2ECnwVF~f!Gs@ zC2AWS{M}bsc_qrAzEvJ$u2kDiyurTdl#T#99ZDju(2D5@o5FjJaeIFRR&L0+0e%Oc zY?C^aatGzt7u-c}Lph%IJMdnN0+JUaGEN$5qcZalRg z(VbbhTaGeztsBe@_0uw_yh=pwK0>QFGj@mw1a`~_70g1^Q3vJJXq=dwB;2kSarY1&C1dCX`Gg4Hn3&mx@tQ zwKue)2*3VNU?S^9P+aAZ=KQkFH#yYiG2dYEm&$|I5hUh`ZIv`bb$SJKaOA)1(+|oLkSg!D z$$PUYXSUj39B$L0D>{zPck0(7>v1m}6;67m<9P`ypn{2fWEE;;D*0IZ#5dqiu7@BU zXRIOG#eoFI3GTHYKyF$utoc=hm!imnqOk{W&%_5f|GW>^ukEbxQ`*iplk`$<5xFE= zvRRnMiRAoHHF2CDnoAtR_fR?t_`R*K!mk%@r~*MSPFYGi{*Qv-yK@A=W2KCZ;E{40 zLGVB#80Sg?!Sok#ax4c}x^~JqYpQ{oS3s$~*&lqzANA(zLpFZ}6eacM z^~`s8t$HoGo#8Nlgxg@R(2OEZ^AQM zZiJIgeO^m3Z+Ny;5}Ez_Xgo#7L3Zd*4VPAX!^gE2{LhNJvCX3A0#>4nkYd`$s zzTny3V5T?p00DbLFO&<03ey5PE2U_%^}Z=J5wv<>fhs0bUufA}RXP(oV^$#NcKyX; z@&#fM5hoLRKsDxtRr297VWMCma5b?YkW;9?xY7P17hkBc_`)9bg{5E=;R|dhI#s@C zE&lyJ_E+fX172_zI#3`#%X0Y>EQEkxT#gC?Ip6h0&ym;=vjtmS-yZP=`g{FIrMM}Z zs1)wt;%Wj`mf^*!qjMFK=4&yCM0nGH*ToA2z-$62Nw%JNj95kQmntMpMn5MC@S{1= zaB$bde3*;ygI`hWI%*Fm-%w_) zD8Os0zRzz5An7EU0AEY@?2*ab!9U(|wHg+}Uotqpi8(lO9fPAZ4TED-cI?5?Uj_%l zV4?;`{hdlJt@{Csg=jND^8hR3%xh1pb?-FHb>^NwgIIKni6CnJq?JIW7{n;M`d=7j zkGHHn5XgC`7x@XQq?#1#Q?0ii5dm(VKqpSadJLcErBP+r3KV*l`~_mM3kwXcYmsfeS_jtl{u+ACad9^hJTyDYugo1w!pzoc8u1XeE)g~craQLk_^_j05uRfFk^4?=97-`qv!0?_yO62ypvMvlg)$joGIPV1mp+Z z&DZ^A-0W@Myc7;Qu4n^$Q#~`=;>;zOb}g=NixEs_MFOdS7NzJ74!2;=x8#1yl2Ho+ zV%B@ZCq7=+hsHIovQR_z>*{<)>s^UXmVg1(CR0iMRSu|kLn}BesOJDGfR%K#u8s!? zeiiiVR6tmoil)`KRbA74Au|@`VYQKsRmqXu!&hB@v_JI6i~d>$b*W7ue}Zo! zYC-t=11R^1fN-U45%6bL&Wej zJWIv1c@!f9s>Y1svwmyyhNJNC)cnwc6lE~AmYkO#y1N|L{?Ow>&U{S!7VZN%D|(QT zj&R%$7;q6}}WigT#8azzIAkutWBg*e`dA}ccRAM%s2U^uB{3tX+9B<0lY%eupD z{-Is1k}P3F7QC%?9q9Th7Q&jgjPhM76#3pt1IA;$l#YC~Q(#(FF9DedkT`##g@V~j z!JNNRxpxKT=e?aU)#Px6njGTmO#L0x!k;^0T37~0D!F41AwY&!f@3UuS&CHrLYt~w`W=-Im^q{Tw;%wER>X!rH-*5GFQj%zbH4)iiUn!~0_!n#W zHa6=+3F%JFn2dx}U7RStSJ}w*SeQ!^(w!|X+fsW35>j;_Ax#TP%(oJOgmkBkvDaNf zs*XAd>CB+S`I!d&J4N z>%U;3{>Lc+BMBDj0sip@7e*5D)B9DrD*1hu$OU@M+P@Lj#7Zmc*VOQuQ+uA6ZQPqO zCGJhbB0Hz1D*1pgQI&i|NJx}7sJ>eKNw)f{7mITak9#dbj4I#~fU4vg{n8S(m1oQw zRgKOzIU4saFNz^n2}%s!)?&}cP0Xrdo~qwfq^rYKG`*FlzX+{A>_^kcQi2Cu$r4`_ zO{`M3oLV`3OuUMj^ihr@dP#E-eQ|Wd0@bcA@wy{;O_Z-cS*<_Hl4OhT&Q{)W420?taWDm_iDm#>UvS`5DL$@{HU_GTWu|cVF7}!q~dwVV!w*oZ<9K{P-e`jz%4!tRH!LZpRPi?@qmR z<85`PkoATKWHlj|>#q~D*H;e7C2j5PXJkgEt=wrt&_j zL>K;=z29bOp)TzI;~v!D%t}DjXJz8Qcw>vTU))+dWd58&!ytzt3Z700gVw*JyZU!p zu5A}&0EMGiO`U%8sok1dtfs1`2W;xErqI+A57g9HR#ThNnRi78eHLwdw-^2rXXop* zLuo8EhaKikw!=Jj= z|9EEYZ=S^L+HZdo2_qzyK{~a1thP(s{CnI@)gT9w{REVa+EbV?M0rW&O?wywYgZt& z?tXliEFpxqeZ6bTM{jO-AlT7qB|H}r>|f(a=id#qdBb-CCJ(`XBOZnQ>&u1|YkpdDYu!s1tb*qcRjb@&L`n ziR}<>%+nS-b69!?6rDww!K?FM`77NHd}N9> zY^7772vD5u;}3zb%}CVbuL+}s%YI7D2D5yPtRTCpWr5TI1-?y@JL5nRLQ!PJ85c}t z^p0%y3;ys05rpD{j|9%>A+4P6mRcPvYnyjirBrIP>5nML*RnrHe%3}pU=6ozkDfjyCU9GN%hpS7wX=0t?S+vtaS7$U%e_+H&8c(BHC19Mt=2_ z?hF7Ytoc&c2E(xC|4wK8pVlj5yl4`IGSL?qrP3tZ_Zj;7 z30f-3ckrk$|I=|S^3AoN5VWePP;CWDVH5?mq6W+Q@jXT6L!WVlp4CISTz<^|PQDtj z3flnvu6FY~xsBc6RNgNR)Ae_(Z~lOH!6G*OE4IXu;HTlUG#l?P$j7sKbMkOqrBRmvEs74N`o`YYo!daqpc(f;WsIK0QFPd65rfB9lt_c?cz|r4u*N%y5$4CEk?a-bj z?YQ)Rvf6Qab~^$g#WgC%$v2|j-~LA!9P~N(yBND(u1lvc)neY+#%}9P6}XM`i^aWx zmwr{wcPD(82ghNDpEKlxs>ToM&LO2IVlXMac#txk6l)*JwW~X34%yUz9b^f1%yd%5 zOjY@}n_8>9lebgbcXH}J=vdAKAT%0-*qVe=QhAr{|d;I4Dv4$puq`M2QG*U7%R2o~m8l+T`B zU|-!~I!GZ?t-7*)bsHnXI(M)s2wY5~L?&ZCPpn+KEVaR0B{(3s5iu&7a`y6Q@|`Tt zv)<;#Nr+fvIhB>QJL=t~@(LM)W@(VUc~I@G?R>>tNW?i|OcO;=!)X`RvZw zhbc?X>BX{osW!^h9faxh(^)|DP-Tb-lqqjSw z=uao^j(n|$#QB@Q9bz}KLfa6JTSKOnU3g3#SS4PfHOoxfH0fsX1sFZ6LWqp)AG#mt zOOm>$gvRmPS(KP;eJTR~uBoHT#(kykji^^y?KeOA1wj!T220wY&$LA-Vi)o&Q^AA2 z;tX*$R|yL(PFD&Dg5NTcVs^!v6i)?;K+1tK!OJZp@#HK1!?%hBF)E*mSTlqsCb+hl zI)pyeYb$BvCf(J+IpD@k9S8H;tL|_q9!GZTwd4;++zOl60u1}|pc>3Li+W|N^!3~O zZeci>C)QQiU~2TjVTdN?5u5pzI&0d6j1G$O>W%z@!rJYzV5=U<7yLJOyzTUBmXZKC zt)=m*FYH&?nT}(+wYb}lS^zN3606nwo^y|iB~~uuEvK%aTQ=mc>WYRfwODf<);k7< zZ&-7S>Yp42(%=Di@gUo`2n}6SzuG?54T0U=wH6M3%1+0@E6EB6zwym14u0M7wvz0i z{H0IFylR$j3^QI7;l|nHlB=}Zvi~_i<_)&rOg?D}&iCB8h(wvU;>o1Fdd>Cv;;qy& z036I@7oc=pKPOTC3xhxaJN#2_4a#3I%@vMe{cd&uR<>A4XCzBH+hKB*(3B{@Tp+k# z;|PCo2;t6pQi2xPt7mpDTCkD?cK+3TI@4~CRa%+&;X0SdiWf-IEyLr{cxFwfFR-8FCIfFS?&FkS)lNTUB zSqeO7UIoF`q4ilb{f3G-9ter@p4L~+Zw=@EC0TF18|bX|R?*A^nh7NYMw2s!3DWwJ z6Y*CNKdUK${l2|Twf7-dQ|Kh}g!2wb)gtDH#v|!(sEIpWeE+|g^P(0XEcU7*HMTNTKt5u_IO zCC<|XI@%~OFibUe%}M<6UpSWD@x`SCIp?nni*D7hXMSd0Bun`dt_bHzI&ggr^t%TK z>*%nPpKAMN=0^)t1;iE+IJ4eZ3O98|y{1;RNnvLR97Y_C^_3HHB}gr@;fNO1uTs+p z>c<#XN0uks_>uTHS3y=ZGnN_9>f)v`6IHrvwlVRz1u5pH$3}nsE2`X0k5++38rx{k z?$e_pdwl+ITR6VhK~zyNKQu^*^6^K8^JCM8nfW2u{;EN4ez?I5$}&H!;&6Uo#adBbqMZ;Nh<{56* zjC&5zSUZM~A*M(GaR?1(Ohg4z<@w6Zj8TXD$tMLf<~kKg<$a@QXpVnw+Sw0X@zBK1 zh!XanB|TXKADfOR&p>NwzJI1Q@rY=WWMb3|{EDmSXQy{nWap{dWk*Y&h~r<#!fdj> zYr}q9(AtZO>u;POzrIx7SJaqQ{(%|;DTp19ujp#c9sPv2e1B=Zn@M47R-R|w?t8%2 zOr|x~hzZ>rQ37j%08MBY^+r~l8)argr1=_WreU?7Mx~Dj^gR#7-w`p3Wh-M>#mQGf zz!clA!k$?2Iiz+hlh`Nm+jRUx%<3nCgaP|%z;Uj2ch9-RTrR9XyXVyAy01n%k>PZ( z&o59b##`hy)uUE%YPfo8IM8vzh^Ger{akvBnKV^id|DU!IgjU0FA2K(6>ItaR2aGa zUo;xLpL^M`9KZ5i@J@f5lslDoICty%r|@m+hMe3AaW_lYP+17#*uSYP(v$cHM`#oZ z{gHNw607_Ltnd>cm`do!)j8F?F=mvn&&`c{dDr!mW?C@A9{nflk*vgS6)VO6>u?9` zpYtT;9D##Kv78d)$qR}#eX6|rMMAU0;q~})$hf?e=Em4f(b8v^a>DI#AglB-n=EQYx8$4Zw81@n??9lH_4K+tOuIo~k zxSaFXg+&9d`+xe`RVu)HFo)gHUUiNLxnNqKn|PF0mUbWBJGs@yDEWkZS{e|Df8T)M zYfjcz$fT#0c1x81iZKB!0M8wyq6eZ3<9@8q*RrF;o)JE}f9+sU|C;g9Z3ZuqM%_*u z_1LbRiD7$`F0UEEeZTT_PTjmSGwU-i+3W8L^O%x;E5;5Zm)VVBZ1?}?NPvp1nMy+Q zRF}ISrnWTfX*992g^@%1cofHusFQ(B0eMv4QNx$==pb^I8$04}Zqd>-Ot4VEd}T@v z?D(dz>hL1@dX4diO?4;>4lPQwyl_yJ4LpE1>X<-g_%bgLWKK{)i#^-TFW4X4Uo_*K z#YJ890rzp4m|OatD)`scpqu38AlW+3??slJ_xlgodWc!W9f;5~*k5I(YmsW& zPks`N3;dP)0qY#YmRiJip>rd7;a*h**RD6Fcg4L`4AYpv{T588)H-1t=1YO0<0%K96p zt0S~O(r}y=3ifsx?h5-IIBy5Ew!UHt2l>WSXebSlp}a!-ms$Rd6n#{H1rdj3)ogGR zXdlsHU;OU| z2n;9JXba^AS}~&tr3ofJjsdx_H0I4Lj(InhRC$w2qscRv|F8^s&oKXA=US#XlPlRa zI_djku?2lub8d$*syQ3xd`WY{hQzcX#gRFTVmDE59rd15iitu^j(c~hk8$r_^%0IR zymNTYD%Rc{|3{BI(~FB~5{zwz?=)NsrPnw95%zg*G}t>0tX|5f=~S~LqT3`Hxw)xJk4qkP8x=N zHl6R)!(5+>4I4quu0HRBy?-Z+G&Kxve#g3Tfzkpn*h$|sy43TMhef(kMzY(;@*q&zEvYxwtMFF@l-Fi(r&Xvxs$h(Am0fUB>r1# zK7s98QGSbi3)PF`$?g7yY^ukS1IBrM*hwCXzO%h!zQ(3WFq79aeYhH{{G&V-DD+D# zw=^TOf1();OXu6B7L#?i|I4}{$cgM<{(bynmdQl3Y`kcPxAfExLsO>gm&KHI_L(gR zDuMknBzt2V9?R%GCjK$Hmm}-cumT6>+}i?0){N#+Z<$s-+zQcK&nd3*s#qGo!_qj7 z_nY{4DZj5p=AOWm9F-r%mo1(g!9=}86ZIM`*Thqh3qtYer8WhAZ=)LrWQ1OJ@ z_dwjXYBU_83$Uzq;(ZACYjm2Ouu(eoTqFdtU02L(bq7uS|4#gsj= zAz;|*Zk{yGaa-`F3EmEBW6Lwr@PJ;tE72G?BKY9)9#6h!+i#z-H=#q7%<&3Uj#}O; z>QyjJoqQYNp6lyg<_D4oi1ySEX}Tb6^7$2?eST zt)$cWC8W<42-eG8DoS&9+S9R|n4Es%-d8ituMBpHK945p!7J8-E>nddiuw>2SnT7n^>3$Z)l6Se3)xLdsR0+7vj)`K1 zSy+ln7E3Oe&V%zW26Hg{_eO&{05EebgW~y)5>#n;oQMJHy-KM{E|d;fm0X~NfJfI* zfvgXj{f~|dXMcW{fmZXsA~XM2Q#6?Wh81X5{T3Aol&Gj$Psa~hKn;4{8ouQCN3;jB z?L5oi4r7@#yXqL&xsFMEM=7cP=}8h}+v|GcmeMRaw(FekA|OQ??-yJK#;W!%Byc9X zBk-SP`krDD(=)jOZ(iZ9oSSgtAHbk;dN|tkdLymi}DtAjRN=q$W#qeRleJL!J{0EQOp!hLx~H5K<;p z@Ry67fL9VETXkeFHB{yGe?3dU6Nrp{KKO?w;AxaJz%YJU4}zbW7wETzra3dy$GvP> zJ>-5wjbFUvR#ig2XjT2%d0DG!y0@*W2CJDcIm>(H@~6*X=M34%QaJixmicFI_A4UG zKkIynSlhCd;9mn{crHc zI<`uk-;!o$je1`8Of(XIM)THz3RG*3FXj0Uqnrigy>E9#=kn!Z6$yRV{54|(vfs!5 zFWm!qMEnz(p-1W{{ zIlh<@#X{Crt7j6sQftIyY2femg$8c4C;k^z8thQ$&Gs?5-y9;f%@=M{#i|ka1cx)3 z!A{i<0o}*G@`Fr4R}HHWO|dTP{z$uGGX5`hB;q&zKpjD$@8QmX6O$g-08>z1OfDoo zDkQ$1zj`wj%SzIwrU#vqTTSRq;&pQ|VVBQNtK(#1^39DsgyntPvF;1Cqc8k(&$Rtp zQa48I#f?jEL_7#|VB%B}=w>9v69+(`4Sl78SJ1NU>_27%L$x_{?63|n_jW19SkRw+ ze}=NMm2-Ufq*y?ZhTrs!Muz)4o(5m!AKB!DGY=pEbKYsA92(-51X~KB5(4?R`=gFf z2b|f{=3y$Y`CrWZM_zQKT5s5P&MyS~1qHZUK-R{vAe?5aLbt(ZvDnqub+K5-^DMFu zCvqHh+m>WB35!jB9!+6_i6z-wc1NDFz|0K6B)2NU2d>HA`J)?qYgLAt_I~cD=`8l( zyHgXx=Lj|&zL!r9hwq0+GkkwUzjpMC=TN!m!yrrO7|%=!FjclW8aW>}69_s47tiy@ zqF@E1CM=7&Zgtz9!O!{Y!tV#*HdW_+3AZ@|9&?~U7XR6q;Xk9WJO@ME#As_mYj;Eq z7PV=7nrW2!v&eo2=4a5c)P6ti7A)<~=M8$OOy}#q!0Q}1bCgaw@k|C4|3ktv-Qx@z ziKmKUsaP&ks!JYnte5jG+ajr9#{G20k5zcO0m7ujoaYpxfA8OS<4`(bH$zp&d0KKw zTvBx%$1(qIyfPTOtc3Hu!OzIZH#XVp8QXCv5zNF&t$w+Y#w(=Dc+D;9X=>ovmq=WA zHPU!wzIx!a4)0+2Vjge`ho@`k82|51u=*V0(F^|IrKo>LfVC;oW+f{yoE|sXa}E zq~UUV=?nh#g$wLZVF)ALKR;!G9Gd>7?IdR>)zAdf^S{=!*pISKyR^(vfU_>Q#a<-g z_L52kk_Fez!R%W5P^-wrr8skha$}A-QJ}*(NU4Dnzgdp|j(^{YuhaTVnan z7sDtPJPV^>I7yHxV#a40V00BHTVslt|9#QA`fkN)BdZiUcKGg1xZCnP;i4NE`cWS0^{ zRl%Y`S+dJ1S#>|1T`OLgs zIB0=UFqiYvPSH)2ANr}#j0$s4V4i&3B%+RE{nIWNy4`0PWSH}U>>NE{`O}NB;ymF5 z0Qh&i+LgMwJ&WzOuoQ+HERL<<_U7HCS*MA;Lr*GjJq!GI_}vnu?+ntXsXyf3W#65! zL;tpHWPi76lg1{8p(abPKH<@rPZ9oSm)B`zdLPoN^))?~ys_ls7QXOM-HGzv{{#ua z`Mu$n8ULvA%)hP5{JrL@$>K6Q03_3jZ%-sSo>h3cRV6RR%k9a32n_c>PSNJ?@etoM zm9I)(Hcf?h1%=gG8TNNtVe@jUN-l1;mdq6h_JkU@cO2<23*p>ZPohBay(;;0{fac` zx|O(B2zj^g#`Pk#HRpJf3M=RDu`^{y#!~}-bkP|(Rj{&#hse=Urv8&`C-IIVdFR!` zTym3=kFoWObUSp{hxF>&)0JL(ji!YpckM3@*xilI+!io;_@i?g^pfFt8XtntqV$vT zTCxFla}H4C$fdLlyV-bY7Q4}uMX#=w4Ejx!>zHRQI91+aQCO8Xf2%;S%tO^SEb>j* zBC$SnpKJoQQ$pux!W66eZk)1amw1*ALot+=9B>cT-f-fDR;FW7$^-dV0wDXV({@uh z$cFnp%~+`xm2I3$)({=JDz(vCnx+5Q9O+UZ-wWo4e{1}6)|Jk>i$e|qWh!qhnN)8R zr%nqz$pwU}VP7kfKA=5e=&fK92Ma*W5}@0^w67p!Og z(CK;=+)z#suE>N6K*Z#49S{4;a> zC=C^WW-@E>;2-ABAs=fhnQ_LUG54s@suP-(GWa)hQ{1HXf$XEI3zgMv@LvrjWCtd(zMEE5=HGEzQ`Ec6IspMTIxUp+-+(^EPLI#DDas z#4i~9^s7jX13wZ?AXMDrR=FZSKG~*I_(dC*!7-%bsT(SadSdmS!RQ1Y{wwAXiDqq! zA(I#xiM7+H&2BfFSA#z-fz~>{<@OZ*@rluA!JP;YOP|srRgwQKl}i=$ekekX! zyr}gcO_u-NH{Gl)4V`h+NuCaj0-WT*(oakXh#RL~H)AE+cK=7+%Rir8{;}-xnU;As zfSz+Ja8roNzdN2huOgm2pS_&p-xogd@19&Egq}_yrQjB!*?9TRC|-Z=c=|W=*SU7$ z@i#o`%m4NcWg-n)W#!*cqeVoEJKLV@wq(vd{s3QtumR5U_t{RvL81Ea$de8SBLpQ? zFnLK94nF#O77jFH+pVfgbP&%`wc93tNbul4d|u-6%wHGG7;oq?uE_&<4B2GoSD8dF z&Leiu$RZ|EpK&-fx+9u)Ki-XmtZK%K?|~fi;(L$>$0r;4I%IpI{EPP-*$ur&SQ-F~ zQfE+_R0_e=K7aG_qpA)a1q0maI+L#C#kJ6mxWsq3?5 zAiaIEm_Hrmj7q88p0(i!%p>5} zH=u4Mh9zL28aa*IK6_(jo)RzHH1iyhk&TQyAdW9SB`}BK$;W;uBiX;5k=&WqDrv`3 zgB+kk#RzIiXiLT5(y;2Rn*-)V;IXM*J+wWO{Mi5Sdv16wIZ)uavS*r5*{nt;F9eMT ziO)N!NboqEeWvZ)JMifKOi>Wa_IdKcDV%&NjygBQxVK=X_4Eld|HM+qvXm^a(JtFI zlTG%Zlc}NSzDRclS$AAs(TZ!cQ`SY)*?owm`q8*{k%%D^H-oPReQ^SwgtCzS*M_Zd zU0T~pqmcjKR<9z`yscNo#=rc@+;zLowU4KW_6cT7$+W!g`eQ8Y{txvhPYR_J7|J)gR&CSshUQg6RTc<72OQ8Y7a9PoEfH1R*6qb8kzNuYSlSWSAa19LV+*@F_Z>(@V zAF0Nq3JxO1jw92G32A|J`h>Up}{3CL)TiKjrPZsFO~OP zBQ;+Y)U36Dn$P}87S11eFT3V$BRAcFND9Q@?jSx}k_BQ~HxSq+X*}*Usw{+8%@0RE z1HQEVPFC6TuC=?LD*f$php|%E?%z~rVeFH1cDqBHzsLbSAgs28g8nZZ#HSk05dJ0y zFwb%@-@7pj=FhspH0QA2H7TE$tk)y?s3udQ{Kz*Q1)a|py(z$t?%=!Adlu?7*pLWX z)7cs?+j`Uacq0rRiB|GOubwlB@8W_A`-i&L4W@OnFZpYJ@A_=cXsLozF3oCRr=Qhl zNKzE1tAiV^){D1Tma!@?na{&)i-ml)m!j~cBzzghOK9C=t$+#M<6LcEB+4YFSgI!i z8p3~J%)2;WQB}QMb{J;XC^?7ZFg8Zsqg+d({YU@Cx14ICRJX_I?+~^k{-7$GZ>(Sr zQ$4~7#{IqFB#kAh=IT#|MN`N2j;1DWOq4%tr4f9>t&-rta4PT4-w_B4TbO$3_j(_+ zG3>kOO9)Ks(<1ea?=@;pY6L)U-VtXh;c|d>aTpcG^xVIsLX-gWA_z3t)fT+eWNcEr3{iJnjZA&{BW8C~M%(eK%|1Ru-%1Ot_C? z&LB^oL_k!D+Px4c?@)uI-jgjn5GXs2iMj0!hIwv#$5)255|4S^KanjvpNf@ze$yN0 zMOGYp0U;ZnCSt>O9J@PSuS!kGiTw{+2g3)vst2QZ0Vkx41?uca0$OMXZz1H6PzpAUHU`0OEs=gJK)nB;~S# z&pnJCs^sTpA07bY%>1(j;Ka8KNh9am{M-JhL(?#-g%^F}<}5TF_f8g?Ox@h%dvb&6 zd^(gbxN$6!x{JtE%%)=}(eY>N-bi1=Z_87`k$`7!>Qm+Q+e*?gb?B}rj z8}YNUqGufU`Yed!gkl~+^o(YO&midgz;&Nk(jR${RObR~)c&D4T~E7R^o$q&PV|g5 z{0YKcv}T99Sdj^LvEW>bo^d>}t)eMK&nQFP2%=}$x&##(bwaI6g%l4}vE!!!&|9*A z8h-0Qc?R~^9PACN1K3(05b6ID^mI8u-0pV#BuO|j6}|aE=wDHq+27oIXl8#iY6~9P zMpyidx+4+eSsL$M#ssPI?qA6R3r=Ck{U~8JnRwY7k<{IEjnJ?sA6i-euiUycrP@`h z>|UQo-Py82l$iZV^}vjT5=Dd8Jj6!7k;jlt=vT;$8TRTbfRh@XwY_0<_Ub$)W8E@G zWr1R|@a3%KYSrHym09U-Z52bP;4`<87i)31;UVG*E3KL#zT!p-enPgm_F6wyLV`=X zQ}5~xzNk`Sr-FosBf`ruRo)NtW8MwiM*oCys2qi8>EFP)xP)z3o`@|QC+>xgy(DEpGV8au>qWS-koBuorC~{oJsX)^p<5A*% z5Go{Iw&SM5n5j=UyXZOZi|;5D54)D=P`K2>Rp}RntGw@*R+TA=SYt{{Nw79Kh4}tv zYwp$66xAi)3gq!Y$6>tos*6O#zr~*pOHZJrL2n^H!JQ)w+&W?YFG`nv!H(fT6@~PP zuu^QAI)q&@#33vRhO|Da&p{B6-uW81e;dRD{xaYv-S8KnE$m&Kc+IMkyYYgKanyTD z!vC5ACZR#5wP-_#H>!6t#?QIQb#cFkA766l;MEtkddOYZm3yp6DO{kaB2R zXivfoR#0nh(9|Ufr`RHg*)4ADQJWmB;!MM^#~9>YD)S8JRn6FA82Z7LZ zQ7ON9hJ)*B#HQ`t?(<#gJINO#a#mtpp7N~S!T0l1eJaLz6JN|9_ns%($FRdH)Bm8nPG6Hu-J9 zFCDs%66jRH(5kGJ^?R>np?m##m(iec$h6~XIPw>bChusWOgwqVQXYx&%`ZD8>X1r1 z>K%2WukH+pC;w-WpnJF1tAKaAMgb656VIQHIUZMmd#rGw|2(%fVTFi#=TCDbFG4TA zU8O13Vvqk8Po;7LlDtE|xc?@oJQbF|qn__U<$49mG9Ex#X}^}M(Lia}$K)Mbc_hjY z3!t0_6mtW;VrH;*|6n1jW!L)8vFJb9_ys)7X7r>e@T&j|!zps(=3Kzi5I6c{1bT@`inhqCw(l z)=iUC;fy9J>{JGtq>vH33Qv)~m4)H-jVE6Z=Y0A(t$QK6JHS1)C+VJA^pov`1Wn}) z{)@z&m;C4I)mk^hO+WY@f&iyQhOjT*o_>%Y@&zyB&#}4Z4B2K5;m^j)HqZ4V%b)Jt z*xcqHm);3K#E0JTrvXeycQmUnZ_Q3i_}W(jEulHR{XkKHyF4Y`{`_3}8SKw9??-Fv z%RJU(*W!Q;UY*8#ZhnnUc;6cBRTQSVur65NYcFQYmTBN_1+J@vp1DE%ft*!M-U`n?Y`K# zgGl@yMa3XW(`z40F<7K z2tUS~co@UPbZ<{z!*5;QJ&61DcJyKy?ak%HTWU|PN>u`C3!$S8gQ>i+0lb&yIe73p zP@7(d3_Hdf-McWo+5~DeI+XxCp7s9JV}tSQa;i^{CtugNg>Uj-Zgu|4Kkb!K{=@_8 z=bVWBEYj%sS~b!@DKXe~lEON9AAdEmERj{d#eN4zK)ls9HyCA^w8enq#68hrPyD*> z(o{h*nxd&8`L0v9wiKL9d{MPM%2|ExzNjS-Wh(Ek9Aw(x!{-QMup^U9a+|FbN}H61(#j$alB zDjMEzrK1MA-|FF@#M4${xVzu#-`?IZCn#}erbGpGXrS=>-er$fz8=ZyDbz77QGTwK z=wtHn2Qu6YwD%768o!`B~&1^8OF)N<+mhGwPJ+5HWI8rE;2=|+8~D%s7bSkEW(%aBU!rm4IBA^hXz|63w>T= zo=r7wwXqSjAP)X-PZn6`D91&36|VhtBNFAc&k8q)iEe9)EvX0W4k!21Y}PY4j5-rc zj~N!&K!g|UHQoBoI@rQz+cS6T!(^QsJ8)Mz+c@8anQ#)F2(GE?&^pgGb>G%po{p># z=Ssz{JL*1soPDj>3vQ)fN=4ePa}yXCn;dU~9eOBR59KY3KZ z+-&_DexRtZA$N1}>wU-HoxE9 zAm^1?3{hW#3Z=hkYETWU7AI2je)L5w$A7e*1}ccnZ{Td<@N!1R0bO9gyji6#p8boc zXmkc*Bxt&DHEf>}n2UlE#Vpn2PUZFe6y)9ZlUF;}=j_GT%4*@1Xj64hi5D$27E7*b zLx@#bf}sq9*jK^UA!2S)+(^`ueX3#qF{p+HT%yp~wqng4Jj|;6>l|Fcj;6}4Vl&wD zo&|>%BO7|=Gg^D|&ay{AF%K9_NjzCmnkau`BP7`j@7vAQMODc|P?c%guz{_fB0XR2y%jY(G+qweYHKGm{*)r+gp>WqqzQtlJLFX`jI7Q0X_VSUw5;% zMU4@G+++ZdlI-~9*)n6=@k@P96}-3NEP2Ob?n=H&e0gSU7)Rt1R>#H_8u!GSMLcqu z|B=S;>4WE)sJX(ej#JC}MjG?@UcY83f6265bwg%I5AN1AI3dKlRU+j!>V>Tlk&pFo z{m9F66Xhpt5IZ5R<3xp2cf{2(&_Dll%{;yZ{_WNyVyn8qmlr}2h-yaQAtLpq#+hpm zN8p8uzwrZf`1SWfQh4|Uu60+Aa5{WyV8IK9@~olAg3$h~K}ZvH!*2*6oT-kb3gVMO z2+uzMZy?<6AUq@pBLfJ-9fV)a3?U@{9fY`pa3v5Nf84X!btM3EQU=V({lOq`OwqJ2 zah*DZn*BY`h&oK-h41N&EOPKj73}yulmL6KR|`pqW_Wcf@4g2!Cr>GsId=N%Q*jON zx-HgGGuV`$gl>y<9}biwOsh&hS2bu`tnH0n=X=*2f>8RG+Ow-t@xe%?AE1fQ`U)4O zKb2RwnV9XvYqPln&KGtrn_Ou^sdt|5#SbY=|C%>q1jGkziMGAjtIE5gZ+=zTy4urX z+PZ3dOTzA4x}D1VDIy*x&ir>~3aGw0!(s~UZ)IFH7iAcUs(Q%BNtw%+sUpt8uS6YQOK+qmDC3izMR4y$AGQo8+*SJej)dN&?5# z%{L8zy`4OkKO^E8mOiTWv$J3`jeC>jBHPpaTtB`Ey?w>tF;<4`Z|{@cVgg6K$0S`) zs5gZqAK)K*Eai?Jqr&4T_gd}SUDe=U>^1vpm-m<+L2cSKJBDVd(6M;dmhGuccNJ2Z z96Cc8Ju+oBWy;7Kw`^DUGK?3?5lWTh?qUiZC7R|Q4)$C4;Pfrn#W1whn|?$U!Xxs< z=1AfUvr#oysLtdIQD`&jtubtSqYufCdi@TGmhFusdRR8|6yXF|goF{1sq|{&akgV%f?n@%CpAK1P8R^6aVS=|3mrdVfpEq^3y1fL~G>} z|E_#x)N5*DI3=HXdI=jQ>aXWFLuU^M>nva;cCuJ8Ize~3`Z7MUyjg5x*xmXY0vbUL z5+H%Ehc%Hn-GSi!*fJ$K;IDQZsG|oPo>|`}0DdF6huy8eA$X32Hf`m%+OKB@emg&C zygeNJ8~!u=A_!;L-TIpizr@j(r)LI!F+YHB4+sC4{|vu|Lc{LX-)#8x{8sz*%)p<+ z58&Iw!C(E}0r9hvjEr9g&H_z(7or`Y)(*6t`eg>_K0W-|fYA6k-ojZQ+`mSh3R6_v zfzAFfUYm_ynu)-V_6hi<2D~u6Et_9v7-#U3b-wwzuEVc8H44bjIo60SxjFFJaH6xL zU&+rpi;9?-^Q^?Ke96xz1B)m%OiIbmr{Z+$&tRt;@u&`eM;BNh5xCVxJCNU6Yq2NR zND%)sf+m9aIkF=y%m-5D%rA1AJd9HVdjT?@+<^a&^nZzMtIS6+1bs{_abq#~4FtCn zvIMuI1HsL$@Av&l>$59n(%UrPU`UN>tCtXSH8T8g+GAuW*|RN*7NZbWn*aWQ3)NFs zo+x~T;6tZTcH#=flW)Y6A7Q~g>j$#n0yx-b@*5|1m6Fw#%BD~m4B&?8nHX7_og{zx zce=9U_f{{oB^PSqC(1AWgCy%h|E?3wj0&VV!A92{2ic@#3^SU4Zrf|FZF}M3&2LG@ zROEj$LBE375oVim;^aN1&NlRjr|uP@>!6;fLScSN-Dy@`d7z^N9jg#D*}wTw7DCOK zy|7+2d8^f4NQGu~Yf@_HuKR@^wa354nxV63v;l!gRtB)Uh%{PIL=FGB1^L#3Ko8g1 zgh)e+TVaayC~MB=QG2)x6f(I@&Fxa!)j4n|JNn?kW;So3ZhKi8zKA2*7egtAbY)TJ zWmH!#y`!c)X!f(Xcg5g2vWbgn>fWxXw)X`?VT~|O5uB4BEGfn2<1BkgCvM?(J~3MM z$;>**g}$;V)adfjNRx_4j< zXAKVie=|;uZ})KmxdNxXm1aHp?M4b|UVa~Lr0{~28L?HR_ZuljDUwJi>B~my@r8`k zsejmaq?W7_N+bTCPWX4D6f_JmYDyfIK5btd+M)6c*7qB?v#gTu?K^IRXi_xg)J6ZE zb^meP{!=Ud|BYk^n+PHE-oK_PV#VE}eX<5TaLb6CRUEBg$aeU5PtiJn_C1pU4q1jy zjb!tSeIe9mARwwT6HtAH;A;OIpatt2AUia&sl3uW#<0T^qQZj&ciKYlEtb(6`)hup z{FxOR(R}}J$7@6fh^00eVc=4HeKD7spz?^wHUB!svV!}oZlx?{^6S-VmzUd6lVdP1 z-(F9Krbwy9wsk_T5Y)OPTcKTRzO+zR>8;s8 zK4KpD9vGGTE*HBcU-avwmSf883I*eu8kjoWk9|~I>!0-7ij02y7kMmfRgbw3=BZi8 z2ma(MHJ$W`he0m|rYtf(!3)A(ynMCLh?-2-t>Aw3NzC{Mq`O!J**zl=^ zkz0=I5&;EJTSSq@^}-iqTxdPW7mM4WPuSXtJ!N4Xa=6`0sj0l%Ze@;aXmU~J(Krew zEXQc*^`B^uf#rH|9GSUNlqmn{<8H33D9+54cB_p02^bR90?Bh&tt(3Wp;Qy6F}p}} zQQ~Dc;r{Y771QHc|NZ5T#VQ@&8Q>^H{9NrFbrc2EqOM)~^giJwZ)A^AfEQ6P3@_Q@ z-YvZ3G65{x9Z7s7`7j7EsSI*5Txw5uWFtGoE@sOKgCa6 z$HP#Q4OUS8OKYqgCg84MlM?$g=yBuHeeyHuYmW+Sq0c^8y@Erd5>EmTo7V}M+4pPUpK6wccT35N7b*>MDCh;w&n6M z1z*_C=*M*Y4hGP@V35;0GMX&p2odq*=V*U5%m47j5>cxB7cb!ArWyuG@;m!M1mH^C zFeNAQI9nRE}mcn&cKmG z9B=s4z>D7!ZU{2+6lP)gkH3p6z)i(C-qE=KDCqfHqeG8sSTA=Fhav6&s^BDF4?UCZ zjNkA>R9J_i$k;S`@Oct!u>(3+b)@1}HPP9y)f~c5{FG(wt9&*2ZTmr#XBe84jiNPL z#;1q}V?dC6ckT}SgC`C?um1BlYY)b%`0$IdoQ@M2jLX`G5`Sp8+PNVIDg(JDxJC0V zKUsf9R=GfEXmRHlCQlChf3M(RdzXI-ky?geUWji$PWl=Yw!Wm9?QQ=z~5 zdm<+itkq$2wW|9Ri6#H2mZ)?`9!kkj7Dgv%#=P&LI-IUci}5F&%yDQoG)_4d=WTD` zH+jUo?-a{dOo-L)GKS4f93(@QFs0}dZC%wg%Xy%)c4Rob1UkaVb8!(~S;f|V(M3aE zPqqDVCmh-_Nw46sC&c&qj`l_srax5Q7;(``G&u?GHwNz4@>@-!LVw$UK=vD{(30?1 zZAN|BwC)#7>sr7ETO1u{y5;i3H!{oRx$BH#vzALo;N2MDKFg(6%5P;>N-V+7dk{j( zr!N2W?`jx=KCq4n`C&7)PHGWx>*Rm&X08vmPU8BI%X;=|E&eVU*N4FSF_o8E1L&=n zYAUs990j!_Z;Thug=@!(rZyAgE>*CiuR>65tj&{;G%M0u`YW2B+6>i48eisj)Wd3m zUusT62z;@^>MUWsmgFM2Q=a(|DueMm^E;Ej+}!CQXjtuXUethcsz6_V~nek>&l^g6elTuzC<~aUR|-!F(#AnEywvB6J}>cJR~9vET7c69M+-;!3rW zL|iFJz*%vnp1pBIj(^VUe+8x5@MCJ#D+A|i&SzKT(d`rz7IJVgS>%MPdRE_He|m>H%gF51lLZ+qvx!&SXiB5ry^DJ2>%ta$tX^u5Wv!N8 zzfljAhIQu(f*sAX9VMqVgTQb68l0bN&PnDTAs;H+ma4`uaLOYZZgb{n0Z@nTx3k@L zx7(?0KUQaExf-^=eGZwz>~lwf#Lzx>4$G)wD5nN)mba+3Q#YuAPd^#@Uql)Y*HRlm zm1#^yAUar2C81d;HS~xJ_py;(R@qfbmMm@<4Wq|nZ&C=5-K?+ojqJ*WX-wi9rm+?t ziSlnfEDn2wKl{jl!sqjnEv#3jYFl6Y$rY+cu^t%hE`yknOP4`xClC*4l4E7c z@jp{ceTZ9yELcaR;RT5@Uh@GAVq<=jl{rHS*#dxXiMk^aPsZdjV8G z!sfY|V6+bl=r$qDl_qeE@e`vogXjJ)n0D)vhJwfnj~s5psO3Rl5cPNQaBgV?2-263 zuY!^o=TcTR^EGE)Z)vl&hxjL{cSxOKc(ffPV)Nj3VfPaH3WjzJ)#4W5(nmBix*I?K zW1&3{e|e$6=HXyeC9_Nm`G`!f)t(m`7T7>HleqKLfYg5csH_Xxf4Fa==qxxAAGmVp zu0Gm12mGg}us&jE$S+J^$eUZezW(=M^lU9;+3pEb8sMVjW(gueK)LyA_UZX1tc|O^${`Oz?OS#J3AtwVB+w=*{-qUG2i&g4BKzH)ncF5y=$Mom`imcF9Wg(U zyU$ij`+_lO&?+|?3Y_v|9NiR2WbBC<*Anu+d1VyO#4uVwQO(Pjbm&}GO{1IBAm^g#le{6hX<$L}Vd#sTGu zob+!)_htWgAB8g0L%6YL_8-|7A&V1{ZbH!vM5K-M$E@i**}cDlbG&YlVb7rz|-CYMBGa{jDmF$NDexV9O-4QQh z-UD*SoA{ESXZWMf2;vv&6*&1_Kg};R3}ueL!*VQl>a1>kg=1I;B_Fz2oY>@;Jcoo3 z@3E+!9Y^_P2GRXA$1wcCCNtGcP!#f*MX=d068dwZBs#Lgp6&i53w{+GNlSKJKo|Jm zbcKIRB0PoRQ5{%2zbaIBonO_|$rvZP+mB+I@~(0&!B8))8IwxTxl0q}C%0&_75Z1Q zMQ#zT@mF*@cQIOHq+y}uMzD}ITqJnu)Ba-Sh7udO`Q3&>jr%_aNaudmVEnqb(@&&Qm{DbdzB96n6E>ZoKY!nzdW|@(rJbI{% z97AJzFc1!b7Zt(QLSIq*=R3EA_6x;2bUQB|Co$c5=i~*wBFkNTSME|jXhY>NQ-E1o zt=81Q_qW7yhI9`3)ZhM?q=szEyhB@HYH&X?cDC?mHwm^~XR@=sLpRKb`(Wu0PM{0q}u!>ZfamG@6L%=Fi9-D>*l zRrkW@wD;BUpYNKy|+qKvK>$i&)a+MhFTxI~q@p&C3pF6Guzn9xRbukq7J!@GL%zRTP# zf97Fv#e+Cno$dp8+*Nf4Aw3CT?J*Y1DJh*#>Twv>W{AOy7pJ(Nz0Xy``pJ@;u?y46loku{szo0helI!k9Wb>gpny^YR&PCtA#pUz-2_4O|YrH<=73)A`9Aoe4WigXOlG*6)V+nsc6SrDsY&dM$ zNp#ttWGxF*f}9!R%e?&C-W~aW>)nrp+pOM+OtX6T(3~&p-SVFQrg!*?l)Vy34F>nP zbY3^LY(rg#zwYBbs9zOu3x@VX>KXBdLe%c*SvM-APUp5g`KO}GyxQS#(a5!qi!v|t+^iptQLS!O(d^xf(b{7Fsu11xqdky7!0r+zH*-Gw zmMYqfchVxVRC$LJM`WqJ-POWFR(_FyG*9H;xjJl$t7klUGSSrL>PTFzm~ps#>~puE zyBN&h_8#@3@ReERqR{Zr#_9||{f0&Yeu@{{y}xi`#O(~1=TzP&WemXWS4)@<1w#c;5LK{0w7u?i2?)koQh8rIfX?yIIYLwLExA5@Ey4+eQCgV(K5ue|Z}X4u zExGFB_@MOyj4E@MsWL-jsp~>jCg47)yjulyya5fqg=7lwxhTl2@@EyMXXp*>H{XBf z%|IGxP7lC7+@&t>_vZBH`xv@Ff1WNbR1fOS?mKaCg`KBh6ZY`mG7y@rPbe|ff8(<~>70nWr>pLpqGLfo&(!RTmyOM@BPQWp?e=W|NZyq0PmM!b@h_bxyWud2 zGf}m@)O0lC$$@@+uc%k2g2=*pZ~1hdFICX`q1ct}HtGNqZ?bab)@HaA1u_iyh|YJ| z2U#~=YrSz_dv8`;hPvTaX+uslubyV1F3^hAn&!;JW!7j5oVW^wEXN;n-WToy7y*#~ zIyxn>mPlE)*hqELnULxg(;TS|5|mUy_3SKxZ|QxIrd5x&JGcjbPDU+!9~F4?!EeL~ zOwU>AHg{GU`v(-`2DR@Sp?-QE0$VVWqSzsup5AXD0)=?NuwC#1{fE)a0+t@GqcH#||+Z&7G zxg0BI0JxOBSof+=k;uXOVM zm%uEW%6tB2penh?|4yYiikX&VqM^;zwkI6K^>3omw5}-|>&-p1F#Q5=Ml-@gp~i&+ zb0`D;3x5qr$ULtFkhsDmr2o`q@dzo$Jw-pW&J1`1yO((#r_^k zwh!|wn((k3U({5MkAoS%PO~j_0tvb;^;f?z+StxRpfLgDj%D(jY z&c8`bj5IzZ8cp?o3qeoU_{@ow-PuCUNaICDywt!Y7rMRUAno8bD~Ngj*@Df!DUXyw41EVW$m%12FSaHTw z-pcFcJG9MTrX5TYhY2p+^89@MVG{Z54k_yqzm%(-Fd9U?qnx?|4H|1$2++q{o4_hX-NGHds@ zE1C3TQoRm|l|2))d-yb&aGN;9KjmO8{%W0OR5)lB6A8)>Eq=*uy7w!&7t@}7q>uLu z0R^Xi-;q^Z%^~nUoSgk#n?qzx4gJx7$G~K(%_0X2jLF;GO*4bF5>m?X8#{M&u4KT7 zZ@G6zu;TuXw`O4&w1v|G|E2BwO^NhXU9&;^qdT1OuN`nkr1RgGFsOA>YeX|UOhj>r zrsitYZr+jMtx8K}q z`P@4GqQ7u0+2^lQ7qk|3Lx=zCSNF%p?yl7)YvKm4vL8%iiE=2~1j+*x6>7SmOPHpJ zIO%kW1}BfD^4^-ooE}UYMA(16gIejHq|)YS>WRTEN)Rp?uWJVHjHdWQ99OmNT5_xw z_Jlj>be4CuuqgEDi$=w;w^LvcMx2&LP%3v(eaHD~m>a{;`5W)vG2rwDaO$?I{T{y* zT7&e&Q=l~{)4565R$JvSX|NkN-TbR)%I$tM5UGXp%lq3eeqx@E=+BJWFu&)oc6CMy zdkv2CWekV3t|_FgLpE6?o}nA+IB9)9NQo4Z80kwzL1ZtSOmH=4M~!(J;L;0&1v*^& zV<29&+Zvd{<0P@C->QDXL?r%fv}|WBd+3b&PJe!$=rPDhP{Uv}pbd@P{aZl*~BLbmi!{X2jo!iD1_(>U7;09n=p5J-GWP`gWmk5`42Q4qHiG=m+n5 zT(WdheXBTj@?$%suJlA3W3Jqt2m)f%$P9=zTW(&%QM^*}2Qvx*ApmVG-GX{B!fcct zLfv4R)yD7F%P~g4ZU8JYN3`<=fgR@9Jr&ikZgDLMDkHod$%HE(^2el(&5e7JC?O46 zv>cX7ys4IeRpMM3;EIc9YI$h)ujBSO2?ZtM^VQn!K+qM-PhV~_Bu8**O}lF>o_>xE zPL*`fWk?k0QvZJmh7?(@EcCfhkr8M!a)KHTc(SCAcU(d9e#dAleV|jo*`6Mi@d-DhohJ`4b|xhkvEd=$jFK_#!RINFHjl7$teBiI5ve>+-6^f zV1QtBUdAgg)@%+=8{oB#>9F4=C9@8#oMK)THIT(7)gx z!Sa3q*JkSS*Gk?0v*(XHb?ehy95-P*@vPOS9_aKd!#^MU-0@FV4o0&E^8xn9@Wuiz zcHI?C#Rs3)@oh~(V;*qrWoirj3a`-2tpz7u2Y2e_iDkbok^;Ss83x(GurWozXvqu+ zQSnP`0Sv4Msf&Bb%8+9f4zj06C2sx!N z{S`c{5MJi5Yb6s5HkJ3262zWilbqO7Dr}_+&iaRwrc(oNPDyKM>t5uCDv}oz3HB3? z|3g?LzF!e*%m6%`G@mq{atIe~q2wLYOnmS?@LfU&x(zfGU$<(yxGydk%xIYKWADgH z#ZkklfYBbBpZnK6vY%|KJ491PpE^d+)bOak^|9GSwQ&8#A0E@##?HFM%_WHX%`NbBi@YM!zmOu2P%hM&?C~=pFA+FbEkr1w}t2KlDCDvnqu}+ z6TVCfU*?1_O}vD?WOu9>->MQscsQzy<|fHu3VC#-O7N6-r+)8~ce>KZBf!e5nlc2z zZ>xuAvz0{}3G&tRjH4Ebi>gJ=3t8=oDmA&evh!tWHSY3e?|jyhomdvXM%FB+ zPyb$=KC6H4EQ?z$t-*O-tep%0+t7%Zq8dx?m(kQgH!1$T_ zsye?*pHux#!xNSp>Dfb2=~UkF*N9^wFl_dV8pX73b19(O;3p9$x$;`Ta#W&h8+Qpm zned3M9bFKax&`^?SE|F<2a&gbN~!lHRNx^gkG@LI)td_ zovmRK*Nvap7C&))Jaz6Da&>l0ELVM0%e1NmM z`E^e6SvYGN&f4cVE@6f7Rw}valH*{s>p$1EC!hT_+P3%GiFbO$a(4ps^A5u1yl9a6 zSc4qyFmjSDzp|;+f%zM)JEtkiNru^bvp}SJmBvzI_QuLKp;97YFR>xSzW8))f&Ypv zT_I-8EhL+ZUUWR8`*%4SVI2OJjaR{QWzIO98d%n}FM;gKrMSeNn^6~8qbI=0M-^+J z^;ZxTf=&rkcMX>{mU=acXN!Uq09-jN^Qo*}qPyf{CMC+m0DcLnk z>`dQDr2qX?45we{>`I_t6q^Bq14cv-I*KrqJ))hPh#bs(^2%TQz8N0dd2|^bi=C!Z z8ue~w0!`;^^NW~;y5xdfWN>CCK?KILUd&=vnf#pz@dgb4CnJV_pw2xM97*b5a62IWt17j$%g4Fa!`)lgmy=H+N^;&X5iKU0~ty>Eu1Jv++ zzq34-`Lp>r@NzwpJ4fTy@zGbvCL`lCwS$#HEV!XZqI~FFC*uE?A1n$p5b@;=(BQ-i zj@(2Ef5}B$sH(g!$pq9^i^8QEft9Ffg8wmVnTV3}wFLNz}%dhmoS{bJJ<=ob&p1D5pF*Hy7)qu1h1qBAEYgg2y{qRTqG3f&6rQN#eavuTcuRHxmf z-gOlVu^vs%17-8D!~RIMVTWD%PJqvExxi$2KFJI-57&lU>{Oq3rV6VQ6-{svE!^W| zbj^({7$HGj7YxiQgmKA65U#TDp~1?YPdFVdvEg$`45f5ci-zc!J6U>Rb7(LjRogm=&K`5WI<>9U=*}%K2}y!+ z?{1rq#9aT(=sEA^?~1<;tk)x>00MbB?!*NXR8s}lHfL>N z98{0QkSXuwJ>C7i9{~)mFUUV7;sNiWru!A3~OXFkxBj_~B0c$W%5SD-ODm z^nv_MqV14>VhTtoXBcC8mEE*uCpeIRrqp~yIIm;WHbRu;V|ARl9Y17keUA==cS^f9 z#qAlWKafB#Z39*}kfwbLWUC>`zdj#Uxr=Smz9 zwmc5y7*}~G9!q>BuKuRXEQzL6PSB@oC{&xVM#TwA`LyuZ`|D)=^d@baf^4v80}GJ} z$?1cGzgfyj-cAO=4mkzXL`HX_YheJZZ>oP>q;EqDY=ANb!6cj-_0!dBl|57}+(@k2~{O z*&IG22R(c+89ls6_fV7iS8;kCn|RN?(LIdrL0~yX#LE40wU79`4^tPtSvK>RNu`WR z!_vS;m|I{26&z#szvg;aTzyNG4M9Yn?C>N}l*{|Bm}@poh-a8U2#>)Qi0OtG3DTRC1aX0lK z>Zs+d#su&8==)+04fi6s@t!ow`|VOZx((I={8+oTp&7;-a6=AGCk1ivD4tzhmB=A% zIUbVBVqUSYdhYG0mBv *`dVxVn0*;n8>pce=3K+J)^aJ!*1exAfUcwnx3mqE-`7 z&{6p>d>;4;e@Km4Dr-H~y$sODE7!sl1qG6#V3G=dFPsRpf$TT31Xh*{a3w6(o&#|U zRh3UbC{i8^-yFBvhG^KPZN7mqDmS&yb%bZwLG=SWiLr&8!4#&GY? z#hU~vkeVGOr#@(J%c(m`AqCJ4)X^H}pWmsbaQ(4vul9?Cax`$M4?RUQ7)N;-@?Y-LR8T{)68bXM~LD)>NqtzRIliv~rGYT_1c5pc6UhDFN1i$@_ zkl<~%gGy$PwM_u)@)fFFLg3HMZ@*FyC29f*sb^!TRSy9N{@34{kz$As-B0=uC932+^^0DyV6mmg}VdUNc&ww=L z&dhSoxDibaMN`;cF(eATe>!Tn)jg`M*Y8km?fc}|Z3SituJeKCD=|xDN_B{|Oeun*x6nZ~ZQkx5lEawQbe;)7R_fG<$XY)o$*Ydm@{= zl+B^B392zhqlDP&$rEF*hsFWg6Ye}A_R7=j1^ND^Dj@s?x{KnkCvQiu6o2J`zdra# z@kw4|{^Ax+GyZ|G!e6Hsg1@?t#>Zy-H1+6*Tk*(&Mc@ZVLz*B~WQ#f&wuD*l<)QRq}3WYB{b*IK@-^c*@U4oZs**@CmuI z)8!ijb)c3LydS`;D{|F05yU-QuTO$;J52f=wq@Qih1)WJm^>W6ufcDI?)GzgQ&Y); zWi*)B5d9`>Sl7?BP?5qA80ePuzz-6KLSe+PkiF1f0~u9g#*ZH(kehJ}z+~mxVB(0N z#OMcyqHu;MC)8hHHiTzehnH$dN~}f$r@2g1sJfuP@NwX!rsZ2Cd^Hr+c(A?;cj6q3 zNa)*~iZGgb>{WeHo+Ms98B<4O$e!~s?}>?1&~wRVA_ z(AW>71-@Nx27IgBCk9_-U%h@p;0?Uq5VDGd75##XLiDTPE1L4AdOx@RPJ&5sew$L+ z_B*)`ejhA}-nKht2)FIFK_#JWyVjLF2-qGar?mUYoMwC*HPC)Hxx_zYEgad*V6B?h znjTrezh;r@fcI6uNnupAF*z$-@6sU~{gaMZEW&ACK=MH)=2GOpGVsWfHxe53xDq!5f*+qK7~Ood{7_^ zBL{NQhPMv21VaD_d7AW8+#J46XTTwx$!Y+7b}0#n$nu*q!c_qBMO@>D{K#V&!dM-$ z;r#&luR_6ZwIsqjw+Ru>aSOM-@;h+bS*~UXFf7fi%a$~ajfi-&Nyp-^B^Z6!KD&XF z_@#m*f?B8w!!N>0bS|Re%>HXGvA4lv{-8I_2yn7&+4R>B`-8l4FwI&L-~m9;FhbW>)+u(Jg>Ji4Q>L?hJsf3^k@OulEs$ z3hpf6`(iLr2IrEBp;k-VdgjS)g;ca6!{TrRCMLP6|ByXU$oar>Nhh0!!rEAg5t<2< z51ij0*@qojvYlgJ`Eilb?xo`)CE$z32j%DF(V8~XIeZ~BgZeyQ{0noz#c&BmY%obj zKQIP^)DLDP3-<@^^wKfkHbFYp{=YZfx4^y863wOzbyf16>Rk5`JtJiU8NdiV0MIF) zr1wSsv`fJVwrDM22aDMM>r0Lxp#}1J+AHcLhxZX#2P!wXKMK`BnuK;cFf8?ui_sDX zT;5F*Ap42i`+hD0So6>e6*Gk5inu6jve+ub4(nl^4To|8un*+3ELV^g>Mc?TJ|DjFIyI5y%bi6PZf10Xs|eA&Ae!W(2u#t}f6#YLU(irF^uz$Aln;fTpHrq>fxl;#cJ?C_?b+6oV`SNj zX%WqigI`6I+s*u_^cuc4qhJ4)uXFIavno9~`t^N$eLh}yRj+>+{d&<7ygrQ)=zV^| zc_ST_{uI3_F&>_EDIhj8{?O4&k^dweP`rq==^l+&IsnIHV=L2-lF$6d){PYY>_uUXLJn9m(yi zR=@l#>Rx~hA#wr|H4Tf<;4l!JEm1%2vo$!5Jcn0fAoB5w!dKlxM3XkbmU)x|U{LU8 z_;sizbmM0wvhk<{^OxBDyq0l4_yeEISa|XdBt#Yo0%C$j%E>fJ`=ddpo={MNIZ5c* z$|U?B>H+4;FwVL$4Z(#Y}v~+S&0uBoKAXy%l{Rf(y7v!3wax<2r~~w_gC(FWkrvz>$`@ zGruh9jC5~uKz$bc?^_id3Zy2MC0cW_BPiBY^UaWvX36=O3{H+UwjA}dQLzFt_d8~P zgU{UN`2&{>LDy1Y73g6AsT>}VDrUhZ_~j{;{dh)VS%j-q$UP)x{E%#zv35Cxfb_l| zeZdf5U33h-G6ch+wPAy8Khn6;^kENNJwP%a=X%%a5xTm;fL44w!W`5+qEgZmKmwx? z9kISaqL$FhP_N*{$7(~eV_CoUj%9-q`W(!v8iY7Cb-vc-`~Cw$lX=efR_;dju-2-? z)z7YiyKbPk#WoO{9AL2$I=;cadM63$CKd~<*Pc~?b`lNXdX@mef!A4r49~8@9$^W5 zQsAI{99Y;C)rHAW(cc3AiI#6kW>r0)3!xl41+mcamjaH#YYGRqY*~7Z;TxIeSh=_5 zr1NQY#6C>_<=H)Heqg8-XCfFOaeNwQY_1)A6DLi0wN~=_lP0*Dr%#gL0(Xb? zrcGi0WBgovMML~7%sn;uIq=>o#?Lc2wjqq4l65DIpKgmz0e(3D+^&poCQ=b5nze5c z$d~&_L_@%zQcH5ieI2gkD@(4cW#N|k>X6*)@H{Q#N14gkUpF3e6*K;kK|H7%Tw~3X zg+&!rN*Pv!h`A|9P;nUNw|I|WR(JU|3q1TDh{4QtEd=FB(RAur6ZB$AcKo2aSF(m#bi|ahLw@W zm9Fm@+iS*e8W`T~UWon4Sj=SjG(ly)rbOpa5uJ&LUV!KxA0|T3@l842;I^Iquu6Z($Lu|3 z@7<8wq4zkZ_Uf1}m#%%}GJ)QAq`&b^pfeb0arg^Db3$s8+71r=yPefQZ|=dBf<~bm zfoD6!(S-W#o#U9NEW$@3!}|;n8NMkOGW?&HX<30sUru@}!dRC!*Q{+&^ne7u$aN z-^u^XhVo^g>(t1XKfZH{W6B1zf{ZN_@{8Fjx8yyhq1UwLCHFmpj7?^Ei5-b3t?HHh2@8=55jU0u3=$0={$dU2Q1bEbdQ>7J|E`A`DJ2)9a}CWgCZ!2U$pU-qkdlO`NXa(+MM^$v*y}%iw4_wl zE@uLme>S(6_|k$%TbK$IQ_rZ4-{HkX(SL!n8{1@I>G?mGpJu;?{CVWcQ^TL*U_ep9 z7Z510+5fNY=N8{a^5=&uPnthxJ#q^8^M5Qqzvaxssow<3jSY8r)9#DWR#5pN0q|%q!(OPleUveG%?yPZ!8_wN4v4 zPX+bD{-q(7YbLk1?dVZ`Y&$w<1Uqk=YLslY9o<#g(dXe)`u~r}hdPFm2?0b3iYcvQ zFks?Rjx#d8orF|tqgbLbZDX2tG%^yYB0cVFKmFcji|0JzM7R2Z%^K^T(szU~~ z8uia2pR9!v{|uKEL9pcuj>%#9-;4=P-vH(}t2G5I)zQ)wnnFU# z1<|V*38h>y<2&YZU%m?gtUWg8dbhg{?sC-}K^W_1qKVysPb&ohe~!6ceCL>3hQBy2 zK)(Jo>14M_F-=9ySbTPJLa~K zkG@CQT<>?eJwC#LzOI9xxoUpJw!x2bWB(-!k196UmATt7_f33R=y%M07FRo5fqO{& zxOew}vz+epgS!lj#NF+PJ2uFPN?C5^cT@gABpl*rFhOF_ELkW4S7KO-<2|EQxub>Q zt$bcC-#@EUUpyhvu=W;0duyTOM%aQ-1t{!le19WOHvZY|{n~m2F+51b&TVF!<>${x z8La4cn%rZ3HDE1~pK!5$ZQW`=-C;d$Kiz4K#!o~zG2=~zJY9qMBK)u};|nwXyIx`& zRApfX<>{gAf-)O8jbb@4YN0jI+#(rW*f0}XhTvI_=T@0t84d8FE7unNsH8#?8sSAN zMrs1NEW$mbdq~wJ2B`_#GYJORDYfsqe-(+J9}wYklK6Rg-YLV+ zRnRQjf1PLh-DGo4fnj1DpQ+X&*0=vCfnj&XXiq&{^O7I~o~=;>7;$?gj-^AioyaHg zJ;PRBRk9jsYLgurf>|?D?ir{MAsK7om{>DcykFiqD0Lb8V%kXcAk-UK`yrH~- zMqFgtz`VAozl;kBsVFGx2fNy| zY%UMY{kQ-niczA$$1B2l`3&_jO3*lLg6z6T5E$T#%#ROqO48G7Kj7TC=)AW!+|w9gUpGqM53T1(q!<9!dX-ETeh5(gD;)<5{ur= zeW~JOvQba-Uu0+T7_N%>lt8`_SSZhic7d#OnO!n4y`6NnY;J-UwYp(OyLKRCxd z3umeLC8U+YR&Uw3#bGhp7@5iu6NgY7&pM|#D?fMA->@PT#jUNGY+LYFLR=xl)4R6M zJ8$!42&w4=fK(O^uG6tvsL}csXXFHKk6gf4{o5JtUoof9megsl^6B+Ooac=0tdd}K zOvJL;A7G@23x(xUfN||S)xlK3#ni76X45|;0P{}l-(c(y3hiMbUtjow3o~S*ew$pn z7U5!e<5G$01VSH>Mmu)PoHen7bWa?@)#d$x6R0};)XQVxPdzH3y={C@$(7?f>tC}K zB8x>UaX!Y!fo~h3@uc9>``iflbk8_R_&h0Lnt;zntgtnJ&*cg}a_L%x%l~8e{Bzbx z!KZIn{*=)xv9$9Shq2AM^C&~@E249CfV2ID!oDk{zhERQJtJud^NL?IfcGQsQo*EC46CzgtsAluatSOm zaYkp^lWHf^FB(AWP$knxc#n1HKBSmm7P;yW{;lYn(fhg$py^QTeaI1CU2-cBS8t z;gJv-tnV)`4vbmFqf5Cilor~<-1c2LhC;Pa(FWgeTaRu5cJzLK;Dce%$}czk)0Xm27uZZPYoBd>FTzL!R{6^8m%qjM zyE?TTuMF&F$xq-9xRR=P_2r?r%$kUEFYDL3krEM#)8KS7581606wUspx4?mfv-`1Q z)E7vz=o!2}9a<2{mwIBYU$!UOc@=dMyhYLss=Z@dhGcXzuixkyyjn{2k@>7d#Q}3K z#AXQ65T2if^9=`q6hrKYDXN6R!DWo&(Or8+nEh~_TuV)!Kf*h`#YV<%7sxrdAa~^H zb|h7#mZNP)`=J+3~^vLR>l-0{4cT78}W&a3QzI z6}a?W%I=>K-Qz`=waWV-LJ8>m^5l4b~?qXg| zy^{;~OK{KnV~JTDyi-Ry@;%I${}8*$4-yqCD(4lV>2lr(@1YjqTN4|bVRxYRq+#DEx2-^#rdP_Z!1Yn#Obw`4 ztPdPh{~)VdW*iiK;krzN`k#7=p^* zeHWGArYqNb{=3=Pxf5UR(|qN@Ni@^BtVA=B%T0zkt_3FnvILd6Wm0dF82G0ehMAqZ z=ZOxOOHR3%1dYc?Sgd+Vnk_;iI5!ez5A(K#O`rjRk*Sp{Rc(1$7nrLqH0B5Cjs}oI z;GBU0M}RXwksZ^uAQvpoK_D0`85id-QTl;`4()!;{p?5-{ER)SZ1T{a@Kve zu3N+Mqg8hPgqx00cc5Cp*a)1G*RV-&;(Nfmf9@FoXIigjz`4wwI(k@D^Uw^~fE=rLT|$7g*H;Z2pd`-TY-7_A z)rJOW#Y!8X?T^t$aAFh0d0c4LCjpu}FKQl|qmBhl@cB75pSvUANn<7go(oz>z|-dQ zD=^xj?_A3KCx@dzI%ks&((acWAEe0tadil&tlNfW7V6)-k@Zj0^=okUUtxoD&Be{v z-y}GX%j-)V0H+V@woULl69BslhkE-p%j%MD4r-jz(z^BTUpZ^JA_cI6NZ?*TB3P+X zq+Q~@{#NpCQ84o(WY*hMg@jmU;>{gZQDta^i&FcCib7@M2AqJ0DEc6a>SoIC&Eovj zQQ^ir3ZIdYJX0Pme4b7~Jz?Uuh0pIcfSwN@ibC*TH`)ju+N&u9sGi!A++T8SWW6?e znT)LkDlf$RM^~@$`rBaAcjlUqILCBri#@Y>FA*qS zd?6Gaj_G1zBn?<4&LMwBA|E^UO;;!d0jVwu1NW3_A^9^x7)0yE2J$DHXJIskWry{E z<;w@7V0rBZ8C=am#FgK6H#W$S@}l&HLH{n%7;> zJTylf3!3HkrXasy#Yjz`u1Na4FPc7gVQvyJc$+@oUWf5s_fr&1|<0PAie!J5WTn!AewM~lMr<*D@k=_RrNbQc^bzcPp0~A z0+c0d0ZNA+t2WwJuCqaTb=vVkS#o1UwV^zeA&E}?=wKr+{tyMwTVA&T`u&B?Hxj(( zzk%lNR)FTp^O}XGaV%(JUoKo9;xE4klaCTks^Sx$Nryw7p>`fDR)*Z^aC&c{&n}oW z$~%6KMc0b=1F_$Y%*_t-8Hj1OFYa@4SoJ%>Dl`<#nOnxlf}omz!Hru^zK%9pdpqCX)p3{Pb?Sq7gYHA=Z?miy`=<_DiV z#1Uit7`?@3YKj|L6Gm64-LNWy%`5k_I8LPHyqCh1Q#;OstL17>YG?a->$`t}T-1Tj z__$U+QXX6aWe@JzrDBXUL{}mED?ER>RQJzq#$Nz^#&%hRkSgO%8F`XJlk3vda@6aO z7~kmmdVIEGrgmlIg=*UBGmDD3V{0-Hx>dkx^r(4XB-JYYzbagmpIJYZQ!y(Dl}}BH zDH#Y`xP}D~1C}S(`6_tSZX3^Z+k9=k5miB#n34>vt(_Iu(m%1c;d`7Avuy(F>q3|w zTCe#Y+aCGKF->)YiVHHdO;eA4NWmkAdQ_wy?ZqR=?^vmSyn6N?KeN=Mq3Y2}KKclc zKntASx4xZZfM3$Tz(QmNvM1Y3T$TU(BLGFu@$;~zfIV5Ws{vyi4TZ7Z+i7}?%Q0-b zN~7l|P?@e$t#3FgEBOE|7m()x|CQp8!E#|5TupY~N@myF@()PQ3ExF&yEEUmMfB_4 zAwA))MK#DTZ}9Qig%T)**>Ev~bp z8r*gk8%(m=s^;k5INAJqec~Xk+nz({GbqIe2*?g{SZM?d+*%nFl<9PE+372>e_6P; znf#T5*{g8=%Dd+%)EeTzZX$o>B`t+IpYH^cSW~~-CW$G9nj`{=4Ly_!|MP(C5dH<1 z%)RP+Z7~_m_wW*2f9BT&8M#POX zBv7W~^uWc_$;PM*2L)jTf}{h8IcXIwgzG3zJ609`R^4j%eGFuLBMMgikH{YaRmTnZ zSlgHKJnOd?ggQop)u>$cYHQ-sq4 z4>6xIQ_Ak!xbhzJw3mSx}=cm9Zk zOosJ<2sr7#rU)>R8=%Sje)@7<8-|x){q+_bD#yw1q~P;L1O7IAXQ>Rd@PplFGjtRA zXW`L{=3}NPZM726c{Uiu$D>!-d>lL{l8>jKsetna7T%A`#f|dMKD7cZ4bUxV1NMg( zYzCec)zTTdrID(oC&d>;7krGLW=ApnnD`|LZJgsnYpMMkN6Lydkv;9v_M20K;zRK;&!}h zxoUs7`GmZ;Mob}h>&0SoRFarwPA)~Kg{+^@k4XFF(khOU@qHbilZq)5AVtwZly&=t zCy4lDP2i#TmHvsee_#|!d8mFFxQVq*YuaRXM~~3MBU?G-dhyfCSFi~bcmNh8ZE?(F z_8sVb!qCotWcB~Oje!RFy9j@M{xc0Iy}q-6{r5~w!2Iw*L*Q%!Z#)|JOwEHK%Qzre zP`1j7l{`!`%uy*EUif&ONceP+cs2ze*d!EQ7!Bkw1+2hVL8Sr}!%{xCoRNYBi(E9V_X&N_v_KoKr1JFs4@O@q4(b)gQ zLg~K*-td?{hB@JDXNYV=KO)P25TajDnAKACo2}Ukg>}ERyIL4hWlBEJ!dF`VW>J5^ z2pa*VIJU?i{4LQ795cI_FM>f~NT3k8^IBd|C`Hs5nI&D51mQPr60yh9Lj0^tomY(P zcCcTmbf1J~$+9~+GStc6vy<%KZj~mG$?jDOR_8P_v5E5}nlEE*abuR?`vu z@svHt==0HKeBwm3Ub!PoX@Z}WNceV;;Il^b1^k>K{oDLwQ@haD!ikaeB?B>T)Odpb zF)%QMs_>v9el>!R0r&uYQ}eA@vULP}zP~|N8wsCA<-_o;A>T!mf3>;tjyaV!Xg&M# zlr1jyTVLAp$2Q!cpHAFx`;M?WzTsw_Zuhj%AK-jF0$vS&D*BJMPyR3SX!aC zwUL>4qWSS_55j};xAvr>6Sq%R3Dq}apL~`WWuG|EH`?RP+9&V-B=*TwtznUx7|z=`6w?nmHvv*YCOyGyiIGx+_rO%#56 z>y`gz@%!x$g5TQ`fZy5QhwyuOezW-H`u#>IUS)#r!xOe{$)S^=9(yi%#$Q#9vetcOedAWrR@vzj+=_ARVgkEn#=v*^3J znGFioHf@yqdMC$(&g z0J4iX%QOgntb7eML1B zF5^p8Q8%eXTn>h*+`QI@_$;c%1Obje_&YV^5E}YLjQ51m5XQnYSiM(R7_P7Y$m`CZ z;+8IvmfBUhQ?HViYASek8a;C*odf^|W@Ka!E923l1W^XqF84)9G;5cVXkCeLGjV&3 zmYrRDJ0LstdGh36?mr%1XK^u|Jc3!l>0~qT4<|VMC;YPrKj0TpTonR4KLLI?zo@8o zR6LGbg1SK2j}pJhBdrm?+23B>yxR)_xT&=gfKbqk+Z=E@CAhkzuXR&WZ`P15=fPhcQgt$8yE%s;r8iN>5v#oe~plomGA` zwzLy|W1V-Y;D(*2=nCG49xPdm9*m6c!N5=t9!_l70~DFTA}P^D5<*3O*QiLY*S-A^ z8(&OB!u`h8g?v~2M!0$%59Hw?`8c0$efh$Nq-8jI)HgH9@WrRyH6_Lh-id6%JoJH) zPBuazr>`rLfZXf?Vl3Ly&4=L^tvg z{}-pa;ZRk>O9Bna<8`x96Jjb+gM?IEhut(U@>^^fh0YWGwX0Z8pKOT0SzLw}i8LM-9v&&dTfv%zm zS5}d)st`wmcjY3f!XZ_3unfD3*EsuBwa8kPaO)C0i}deA3roJWp2y5i3ydz$fxzDU zB#JAZ|A);LM_~v?3k+amzX*)wsEGDm#Ru#uL`E$i;GcA2JAP1Nu(^=L;1^a;Y1>h8 zs|=X(Lb*%2%fPdZTpvgj9FN;R)uIU)v%4GXQTHqXX6K!@2j}|6w*->ZxxV}`c&63w zZW7*njZ1JpvP4`73@3>i2(*nuf8ZG^aQi&$x!dPs*Ie~AIK`IEh}_JLlaTkJ7HgVF zpI{5DbKV6_cSe(n5xn=atY`3?7NjQ}P!0QL6^=I&dr+L|imYa{Mp_)0D8f_j@~+|H zC$PFvp0gWXX@8{I&*k!t-(TnQy7xnlUCfFd6_Drk)=jEnmv8)ji{}XhX5lGB!XKUm z#^OJY!q|_td$y~)RYQ!S$mJ}u^`odFYeGdjH!eb5TV9p|{FcllZmR%f{uA8#aRYS# z^{f>&;)n6b8iV;PHNj^0Ae^GwWAL<5Dcd{*pEN;scv94{Ss+5#VNDt zmj-5&oIy%M;tIx3&$$Cb5c}~E?8h;<;rt+0c0<1km{Uyu@)7GH#EssVJVGQcR(bR|yR!(L<5vs4l z4>5vBA|a7x;l|3Jpa}me;tqt*ha`L!F?@C|()f1@p(gVqr&CqsTg-PYRb7T}@Sk`AGd1P(HzgWMF%f;jd{326HXPYM5?y(Nl_+q`L$ z@lA0J$xz{V(*%ueHNI824N=0&_B-p@(67fMKQKd&J@^IhB;3$?5d}_S>j4*m&u6mA z0MMiab{=y9UirU11R%7JHHCGiVYLdn!3F;`P9{4YM*5)f$b#X+lHsQMTEF2~xo60v zj>eWfMvZl@v7-FGS3kk*50a^i?u{AmnZ*e<@^5_r_@Ear7>Jn9=2qi$Rxw=GQs6+w6m_Yv5 z!U(ztANkAW`vq0Fcm|)NKfgTmIX-)c@6do>F0YpJ;`OVZEm(v*&)|O_=4jfAem;V= zahDgJTfzd4Wn+@6^19$sP?eX3%4%6$hoShq1O_ToonF9^cm_Wvl_glONkuqXyJ|7N zQins3KCH5;M!s4g!R8;Rz5#gkN=U@aLLEOgb4 zX0q{{*TQ+m1SV$uf-m9K!H#7=RumQIdJZQ!W-kyuthNl{EcYZA6M0R;Lzm}gyuJm$ zR1SEUO>8pPcb3~sjm<@mlbF%6fbh%3&ZN_F>1J-{_H}*W)+sQZIzEUC$rw(7Z4j$( zCkfa-h7#n7KDS@{B@fT5z(b6OQ;AneYG!=xq5hcvya#$k*)r(=pNXa}JUIc0p0d)oW6!P-I0`?;Ao$ffNKh_DY&NLnzl-HV25?rer#{WVKh_0TVS+9 zIG<|E3RzgTcYT>%KbeQ~*8h1CvMvC88SF|v`j)&9dgqmQ6))i_k6C}}5c&u11S91K z6RlTeO&-6wvEG|x??y#W0SwuVDklhm7mF1{;8-!Nfy>b))KKg;vy-R|76B>pvlsj<@XX?H zim(Enp$$(SAf%2~EoL3qN{7{gbV@IL1%Zr>S59<=@95{kBYeLjd=wI;>29nzs&RT` zY-aqv#{j3fn*k?m&+UiukX@T*ifLd2BNB5#}iK#D-A(hk5%&;2%A2XC=ONc66g7 zX*d`{WkSSnFokm6;5QgUFZyDA|3~oD)_2HwD%R06crQXrgEWyx_a}wi(=J= z*X0~4*sq*dZxZ*hQt~SP)6EDEs%FTCaPTGB)JcAK4~em+{YlX$cq*DcZJ=(q$F8Up ze8IhEeG>Q=atk0K%Y&S=kmdpc zK{2V+j3+zbe5gjxZ(J+9Wgy!3PmoO~#6|CBofsFb(_EzNm;Go>+b`)HBSc98x{CiP zW^1v@5pLkhHTa5Pa`F=lh24jZqu1BtUriejW4Skg3h@R{Az=p}poEpf^uWi6C%|EP ze~<-#1V!n?^itGedU9x#ks#Iw;{Pt->AE>EzK^U&g=XRpX>1!+e!ZVnqGvaxrUlQ! z{z|D1H!y2lbP4#zu|~9?kIJruQ##&%qYJUD$Y|hMhr`tb`|^v!NU$CsVr%!hM%tb6 z2hXNv!MsxIBj12gwTQ`}&I7wu%N27AxvJF;nNS#ffR&9rxkg1YCrV75%HOc6H4i=G+P^D}9=mhUM>aJ4E?O5nqz+hjm5BL!CpCm4eW_K#*D%q_$Lzo5`}iBDpk$yMc_Q*ySw#wed^U2eZkI*$+w5* z-H@w%U0KpGF8HB0i%^~H1Gh#l|3Nm8SDd3eDu94$Rp5I^+HQlU>b;6ugY4uptTLnZFm$B|}oR<8G!t#!HH30vU`?EWp}82oQ% z(xko`3-Fkv!wJ0=zQ9QdF7Mi0?+sfmZmcNciA)6~u|=pRPz)gz*#W$B(X)ULb2GQ8 zSv)@s-bU^#$1nDPowTcfQIGg|dqThJV~n~J)`~;60Em`2BXC(P+!#;P#+Hx}G}HiH z=EQoV=HGF!rP3jvM|?xW1G%v5{I=I>Pe5vVuJ>k)42{R72VMY2&?Q6A#FX@6--NsYQW083(M}$oWUbI6n0pfrTKMAT_9{!2G1I8F5&iy~OaP z8)kA}WR>_4A(}t@b3n`rNzH=H0*{_arG;9#V5#7YHOq-m9iKe_bGWP;uVD_un+cvt z{QRhx!^dMjJwFP|w=+dkQU3DKLC*nL(X-Z(%^6~>T9rBrWQ<@ev7ZOd25QWXAA&fE zPSxg4#8 z$3l52LZL~XMtr64G$tkF>B#}`w4>r`h#sT|w-)2*BUyn}ER9Uyfq{4xVrR#k$$AfJ zwT!HV9d>Bl^~E8z_;_2q!WFe6Rwgfdq!jsI%fCb&M`BCk%QMnT&Y(P!*BEj-$RG$a zGCq+Xrp?5Mcq@pO1c28$v4EInJ*X*QJ8Olk-@_{{*VS=s#?HO<+9Eu+<4X`~Q85^= zWr_6R#dtHT{>Ga3M>;CGDFN)ha^$7hh4j9o@=R7@Cce1qGTd)0y_2iozO${zac(y~ z{uMt`;hFI--Vc@;wpy{wMXHWL7dFo_5t{c$iNmrb#P7e0;1EYr8r>{mOGH0K8y$l&J-`-b6n)KU2vAN%?;niDd_X_$j6$LRTuk$K2bd851^iMh)_ zED@-P`z#3W>2MriHtU$(1*8WT-yWBzdXMYic2~`zAwxZToXB%^I-GsZ6;AZj<#1!K zAm?tG+e=SlJHa$rqLN?$d|(xe0#fT-=!8u35GNp`tWc&lRz>pA8P>-Yl6?KU6k9v= z7v2NXnssy14z+$(l10o`OD*s;a3~>bR2l3MIJ)C{g(I1SMd+E*xxh}+iYTTzJ+*o4 zgiQE|y5GDe3jg~e@B`xNz!qL!9*zGA&9`9Ff0(|miK>5XFuMNN=b-*ky8dp2hM72B z?XPcA4L7d;pd4CfbN|he^@nRvGntUB?~fdRM0xCjw4oa=8$wIOBq5^wlu-HYVB%1D zF^uTut>6I;%FLR_@qr>1@#-l{fC)cK9wixX*;c%f*|+p=>=K0mUwT{l)YijFe-AXw zs|1)Xd{d#p#WH4M&6?)X5YfL+g=qPi1X$oU;QK3Jk>JQ}mKZ z)SdD#WdkMJzvNVYHJEeo7{aM*9p0&If{IpxH#{Q6Wr%yJ5b=S#`5HRhi`JOqZLBXZ zY1ZM4HM<9twu50j(A^J8skWp~Fmu-7n?Bkwq_hK`#(#L3vak56Q}CQwhbzZ@lU<6y zx{fb?K`mBW+FHAWoG`!5_#b8iQ4cOvh|*it)~YkWF$Y2Z$NvD_-VJb?OGH1e=p=e7 z+d8JFW?9=>{!G)R1QU$-=UG{{uFT1Pn~4*a%fhBqHaEI5$%6~`lo{WSebZY8kQ-N? z4cG>ILqFrnBp?SRiypVqEkL>gb9L*kT63Cs;UvK0KOgEjn9crtF9;p^Jnn1X)A z?^@j#7pyN@-^0u=&xk2GT^YUz9F3nd59Zdrlf!mdpAzK!?fTtSQgl(M=rR;_EK3Tu z=(CmalHm$+SwTjl3YMt~eiy2sG+Y7FBFoyFoZt)m_f+}U69RqUCW)dg-l*{nf_~KF z6RI+paHcn+NiZA-fZyrg#NL{K*dGkBbX3;SrlB`h<+>ULP}G$JZNAqO4V?Bw zfy?*qhI;{zkw1*CZjx?}1KDPJtNcv#NgGbj;0HeAppvW&SO&-HJ-VMn=d9a{`pv{G zUkMQXh1fR?QD%4sFg~nuAlcS4l`!?f0tO&bV5YQiA>3ug2n_o1`!MMKuSP+2Pq_`% z>8vya)kNKa;phPTA(22Wp9+XxXV>n|%y!OjqxM0p{gWk8eEX0xiqYkBqH2HTQ#Cxx zXjFR;Nh7iW(Ce_jbR^9B>?8(^VO3cGDj{PS8yKa3oAm(bzjt$P1zJGd7u@$~Y3Y|7 zhrspC@u?RV=6I7++};uRKO2DUuUoz=)N+z0mLvgZPX$g#o4fp4(8Vy%~d4pZM0F(6j-3-)zzph==XO6OwiT^JmQFRk* z7y5im)sGn%ygM*rz1a!D+i|DCd8L38r$}j-lI`wa3k`2}z2g%j#+p-2r60drJ<8{!N$SzN z>d`PfQu6b9Jckvq;RT9gK!LxhkLHHCv8yV)_ndTk@YqaP^w^IcfJrn9ar`Ya^B zEEcZXIx1I@cKFEp`!=-*g@=E{Lx12Q{uKv;EG1cgTO=Qp!hMHD4OZsFNJ2M+;x#bea;N6|F<&de#JRoC1;iv_*;{#^ z;+ecm7C}nlu!e)D8*%KLHR^5R!oF4hCq6Rc=dTgyzV{J8nTAISWbC6-MjRdb#id$w zIo-;+ppjal2M;u1ujU47jsnPzHxmjo+dwh<(6!8w30y2PAk9W55$b)K2Ydwl_0~|& zK8#t{@_XMnl|LXeFR66AV_9Bu#<=9tkpyR&P@&=LK!>2W4zkjEwB-&&Hqr|@o~n^Y z3Y35j>7Ow&ho_XpAs`T2H?KqQM>(zAyY8rmrmI$JN=QfGVC9`3Ip#ok|K(U)_Zm3I zAhQD^`6K$lV+}~kwOE(25>YpLA_q{TCsQ5dcRG8hrW_P4UHXAgf zNLA5iWtcuO{1OI;BZmcxXH_6}6CQr(1*cJ8O`;L~kVO#WV}D0x&CJV%3XwU&sM!;b zq?5@I%r~?|x7{t#zv(Sga@hI(Ztt$4^|k2zYf@YAbYnv`RJJ%ro+Px=^d42|wpuj| zQH|9hY831TuwWBRpnp@kp959nyBo4n!x%U%p{Eec#wPOEm?4Ag!frv|%OLY8YA{lM zi)QjU&i))HT5acebI_F-kcuzCfY!4+jY_aKe|VIhL-i%6xy`KDAlALMa|VS~6Jaq% z1URuqp<2T!<BbGLAFb@n+nWG=0Dk2m{z(zXk1s_N0A=e4wth z;7j@esX4P|@~sq^D1i5nn^$3oK_8w^G>jfKFnf$1hYat>JRA{z1Ebp-!;IsWBV;7r zvX}0fd^ZV5gCkA%4kI`a8iCbuI8K?%gM@)~VHvpk!*t&eldkTO^wOaywRDWK${$Z!2{x{M8UDHGL*A<2O|F5p6qW`Ra+RRY> z{&4-3r=ottNBG|tsy{tk|M{n)e!=gwZlU^XZwtZapIuG?e5C&ipMVBe^iv$J|JIYL zzh6W8gr==&I{o;&Z|&91387;Cf3`i6rC~~~7D`gsirQ)r%hp(G$PA zY7{lPy)v16kf z8GpL&Uy9woQS4uG$PBS24-zD%pxM9OYB$@!46`0OOGBEr01P|Z0t+r=r_!WT&kNw6 z4tIks+pWT=s4hWTc?R~OrJ-zzMKPBKbia_IpN5OdFX?|@-G3Z1pzwDcYw8s0zxSY( zoGBxKv(5_K(#!}7IsLFUb#8hXw2{(+53)n)(xHXYp%a1cc-=pnz8sbJ1DW>vRY`9@ zCP=T}g}L*nMQUc=4X-g{zWx<8GnWOahqqz+>{$mAv@UFJ1Q8Rcmdy-4!jv%t5v?te%>z`CWS3)2{LHcT1Co8;Y&I6vWZ;gK+TSW{9O zfi(CW8%^;GBwrOs{;dIO!}v{Y*gg!a1jCnw|6R_gMy_|89I~(c|l7H+3@OyHvw3#NUI7A&dy#5?NGax=Tp5S}Sq(QOXxEdKiaR zMyJT(1^-UKDt2BjfPJkg!0Klkq>;eUM7m*M}uGq4I|;1sRa_`Jm=PNrKe$Am40w)0wcCPA?Lq;%%d z=*|fJ4%6dLw|i5}(PimLo=oA!!uM2%<4husjjI*^#o4!r;6UJK7$Oa4EN6C%1W;J= z39kk21t+nWS<=f&_A)SCao4-=l91uQpw~kD7Y)4@(*IoDf55Nnw4UNSzvTl%Vp89N z8#>0Cj6a^ij*awkVgD~qK9Vh`iGNO?f?yYV2jc&TpTI2U(3X{qBRQT^aFY6M{(_e_ zKIno^ZT&*XA(1+tUIf35k~*)l*ay+z)$`{?XkYhHoH%(TtqcMzoj``CfU&-2{I?5n z4D9Vvxy+P>{usRf1}eb&yOyAF7vDpBpcHpmWNrw#sj`BJ)<`*D2-S(33KD>7#vH>; zQ9{8zuZD98#3mD7G%^={ZjT%%h~5AYjU7(b_72BF-&r=Q8jL&)KgXP}!{f)Oan1_| zoX-<}rV|42nPWYH!L)1oRKG>i#i1#EvmEo+`EK50#e!|&@@Ry{X6RrOUIM{>xGcu1{>({ZMZa+XFz(pqpvBlrcr($n-P z{bB3B((~aYOK50gegCFyV_EClgVffMX_RGEE3Cb#2@FKXzh2)_)8VXr42+Y=Qn_Mp z0hm*V&h zU+)iV$wb(qsUiTeA^yB{B2C?5!xFr6YDEE7Qyl{`WPEr}crg~0xpeh7^ZR6jSU&K$EK&Tn`iea*Oa$PNfBH&ub$}fjZy4dCY zbk>*Px*@JDU%6`bo$LCCy}>azb|1l_O6gj3mg55M6dger;)Eyp-K54L8j zt99Iw+F=2?v0XXaB=pf5x!|jMzr+E&iyGxeEq<)T3SrD!9q=dM#m~?>JI0rShuG}D z@{2f!=TrQ4nd9mMo$(RzL)xkM2cAN}C&3+*fYV+l#oAsDo4~Aqp583lof_6PFp+UeSfMVW7gTyl$2z_S9&asF3)+c9xXF5)6Rm zmoD!*B34!MgeKg1>XjLntU`{h?*?#O`Za2(LP<#j1AMa5nM0_-mcOTk96YYBgBFt% z*Bow{>#bqTmb=Fqw;A`aYs;S89yK6At}l3gPM-K|;BhvGpAHWjc6qANR8HG0tk8kz zu7ho}!`0&*^dQ+V@7?F}9(ExIGU5;2-L_zF8kZ`eY*$Btot%?|x>Ujo;Bf2)3G{ z>{1B-!9|fck9cc%ThNi)fI$Q8urUg&VJnh>bjUyJdh(RMw?^>>={GC4Iv#ix9}aUY zOFd&~`7gao1Fjz1T=koCy`Q=ce(I|EWeDO5T-`p*jr}4}g%1_+%tdu*}k=VfjBku(yQi6;}lE;Bq_`78-bXGO|Bl_E6SP)$~xkzIie`*b5It} zSB$1D>^~8jKy4NzKCu~JBjnzTsD z5pq$|qPNm7%YjSLFRSr`V(k#FlA%ILjLwRUE86ly!yHbbfz?LCdl*4nBSY*11o@#8P5bxYs-ukA~XWn$pHR=&`_MRq))0HN^v73MgE*|G8a>&k}s?ImmU&8vbC zes6wO;dh|)IugH&St;g;^RcL>)L6 zhblgyIz@%}v(;KAc*j%n=dEan*|D;E-aKYQO5TezaI9Nav%isO-LhPvwKeK#60J@V z_sVKy(d85)Ai+IEpH>6ZjahhpJj*!Jemo83kx=Z%dguvlidz3Fx2;g_LJ=u3A3s(y zh)Ar^AcCZ5Pt5Db4tgiUN{}u`(pD*JgvfXq^)yLa+JKxcm@XHPDriUO16YvCtef6g87K=9ZoQMy z1LSYf1hsDHyXFpEY_T!f_S2-Rk ze_7fPl|5x`y?Im)uoe7Gf5sU%*dH!Ejzs2S)=Bw~Rq|sY6X&a9PB4L!Y4S^i-(*DI^o+QX`Gwr8`J~k@@+MYp>Qse4kS)CW z=09?yo7x$9^Pb$;vs3sFtW^@NcKkV+~5!Av;q7Dw3%JIoxv?Tm|n(T-gR<} zHSt+-FWXC7))z-eHdqq~9xJ{nI=}gjxR8H&31|bIKj~?FQ35JBuqs+O?yrHN3FpBNStbP1iu z4g-O=A-!0woWM8-K4OPgJt-C^2wB6w{|rCcB9L-kgA^dq2}H60%+UVNo;+xi=MP~x z(g+Hxskc7q$W&(?hM+6Ui)q9gA@DwsrEN1kYgk^jCC=W?}WZWV$ZZUl` z(m9kU#~Z8o-;i*4xE&aB`?_;QL#BbgVKFY>jR`JaZqm^D5BUWji{n;Od|&f7rGNcc z+m6z0TtC2;sJ7T^0_{7r{7~zX5n88b+B$vJd{E;fFO!$;dg+8|DRm~nep8iV`>a|E zgVRna^VWXE)?iR%yrIkSC#EjP@#<+qu>v~`$&Zoau#WO~+T&b}(^c!wap(>;8cm%v z8Oc&vE^(Xcp3fKKIi&(ZorhyBW_XfIf`JUo1(H^!=`T-PuY?|mJ|nvMSrf?llmld*=^ zTpdlVZ~LuPKWQ=9AgU+u#bFBTlUUzt|3qkg@83V}KEd@psXyPA|MvQQo`7-IyQ#-&CT((qSVYJAFG zYLxbSv3<|rR~8GMVqe?Q_DI!QgY|HbD=L3JW(d$2Z{aDH*S)N9gRVfz-=_PYM-UfK zcNU9TNP&h0V)>f|hJBEIMMRjBIyRjjL%m{Iff66akn9zV-;^{3X-(8=6Xx_(r*-Ym zU^|HkYYKxB5@h}OL(^DP5enD9n6(Go;2Ivk;n|0dqXDoA)D9Y{!(Gs5ZijZL%q zWg`uhCv=Py2LMaKjhv{5aZZfr*)RbGUkJ4#_2+5$p#B@M?2Y|l847J3XM`c*R>y_if-IeuQ$~{rrhHn+ghMoA!r%>D6&{elw?y|n#g~NLBRBZ+;xfm@mBJE7hBn5j zkIa%yB8D9eiV)nd6+LZG5iO%#o?h z?=YDX)yF_lxO+POrTHCF(*Ij^|AA$Ol_0jy#U2Cb+qwUMHX#i?E;Yt)egxZH*+uK= zXJLb2b2-+%MJjqE3It29NTch!7MT=q@3+&rAuy0tCa?tzo`hQ?NsXc*duK$~g@&0w zQlG!r3F=ll+VK3vCuIJQsSx^7askOTJ!C^f*dLclXxE)Ffqy_~Ve{_RK0o376({Aj zMK++7C09FhiJbvf--j~7+TVeqwp-J__!>KCesWaG?t3VcI@VFSb$Tb68sa9`Y@34V z){Mjetv>sy*ou4$Td`GEMZKfqbKGTBO;7EeOLshaL*vMeeWO=Wl~v=024O89ayJ;) zea|t|akI_(>ABsK@OcSdN`M14lB!QRMN>s}eb9y+C6|=>HPT)ox@EnP<8HO3#Ii8m z;^`Z`LI2EuvlBC`Ao3Xxey|ErEx!JKTm<8i36Ulkkc;*d^pr(q_h0gv>cbw_M&BR~ zmAMqX2h};yx*qU_3F=x=j%pDsW(}lkG=w6BYGEv#D6- zQ@e%eOP?>f0iHQcUklJUNC@*cZf&pV41yu-7fYY?0JZgMUB^sWOc3}b-!c!wd-53r zj8LXZZWv<(+8{>7&v!S&1)q`b?rEga{zdwb*qQmOK>9IO?KYCy zu9Bg!*J6fwYleC@I){3ypMv4mc`~vh{oEQ^c|1p2lsd~Z5=+l6FNw(z=VY*3*2?7Es8SDG}1XD=gXuR3?kO?Wb4vblK z4y)&ucqF&Fpv}MQo34u6yRfAy87s5Nv7oP^<%gXmU*m79lCR)Y2)1;?@qiDyyUj7o zU*gW(>Xk24)VVQ7}cl^`><$D3wG0Rr}tf^qz7TKLY(cuz~bxH*Rk{r|XNm zqju2GQ)`>^`>HU!4bO0Ru!Lny+`!w9{Xl5jooHRA2-slFWSw5bH>iwQ>f8L3^*J5t zF({4@8NV<;+UYR46`Ek`0T^z!TrgZC=o_5De3N~)26E)H&jY{3HIzRibBAO0EWXIx z=9qmae%Q2`i-7=_DMpWNxn`HMT;30{2nY8c@cE&OJKtm1fj)9Ez9Cd9SxlK-rZEE# z9SE5c@|U@kkh`o8pQeOl8fYIr!NG+9(VB7V^ltpmmc-3=E~P@(sSqBXZQhB`il3cZJZRB1-_}5zZ*~ zV?G3c>H!{*133`a0^IK`3E*$5k}m^K;wfz-e(^MaBNoP;xqkA+Oeer8-p|gG-T2$8 zWQRJ>gl5PN>*GZ9S4iFR;U_jh8Q$+j{#i%bVrSGcJhbkSH~4;w^=~``Cj z24*ra1(6;4!NW=lmfkby5`^S#$WBnBCvYJw^Xc<|lAMkS!*mRIP@?(>^`N3AKH{W` zwP0xYfP1D{*2p|M6x7QC0{_55s7|(DI>D}yy0pm}SnMsVCs<7bHv`0I1c_Mlr7y-0}#5;`c zqb(hk)oNJX`6+%z58uXzoQQsmaou(7agFAl#R< z3{LM3L1|c5-_}Nf2b6)SXmVK#(7`u#dV0tLr4EufHk!F1-G~hXZ zbA;92l* z_Cz_x@xe#??&sf z4NzAADF^@)^Zaz9XFkNou98I6KfFcC)b_CWH5wWEP7LCc-}{YOhb{2JjB7Y((9z(t z|01?a7hFIxU2(CN|Jjmx$t9S4NOsV~lJk&lO7Krr9}nxkRF3gT4=$ooNQV&QKrSvaW^Q&o@H{@o znFB!h2j1_M=h?MwPmbxTF8?_zxAWFqSQD%8P0Zm5^(}L|?S#pK$M58Jt8p!de5B4Ul&l zeH=kKO#yQ;<()A{#{xz(?>?3ADSZK!U#U(i_M{p!&YN5F)NalJrCorml}1_cV*3jv z9~R;>IaXGEnN-1jnmcc)8}x_fnb8T$$+o(+r#i) z+a9iWoXEHar%KI3@NfBWN&#RADH#*dORj9tO9!sXuy*`8Y6R>6XfNdE+WC1TN=3E> zhKG!0u-sPhZzKp%p~S^JhiLj(WTk^Z}J;Ntv;D26*&@BPY5VaWW|aUi;^PG*Qt zXYb+l%D{Z5*ECmHJEMGr|LcQzPD=g{b8iA4RdxRVCy;2g;6wpM0Sy`}SQk*yM2#kz z$V4U@m0DbjRVmh`2nk@_CQN{g!=Z2LfYjG6339f^S zdj_@M@An31o9yx!qz1`P)S8fMg_@CO=fAqCE&b07MmiF^VRMhCJL&$1Yl@p4^1ebD|(B`g}Uv>-X^1SZ} z{+OwagqjNzpeM8ninY&eI2qfA|J{?wNVA*OEc&%IpE@Dn#9RHyVkr)7^>;#2ktvTL zW5Omg9FjA+9K;K1Dere_MGWA6vNoMI6x5mA$+`;W)W0j1%r90up}ofI_nq&Zmg8T) z2tKpdkpSZLYx^}T4rCn`4-3jBkt0#5VX2O**LPtiwApE_Mz%6k&LbHZ0A^Zae33(K zp1lOlG7O_qUS&NDdVp8#OK+WF^!va&G$5(}?J|tGBs((Qk+75g%CFJ= zPN4^hvJa-Ia@znW+8}7>a4Oa$&};j|H=a`|WzF5slkQ@Kr(I8QS{F}t9K#UWs}|NX z0S{_cRUj_Jq9MyLA>zb}C(DiKvPr+*xZrT~*a6tfxX7AqSk{)VV|I}Fku%o zjBKBB4;II1+h$4v1t2{Hys*r8{g#xTmNUPvzNLaV3FP?Ee&YA9%0BA%=}-M$zn;I^ z?Npclg|Bz+whkNr)2PRPsmLmM@t3=;#Eko!1wlvt6ZOu^t>(P(=??-h2BvN-5-(IH zS5%m6R=xK1O79XUb0J)2KmO4wf-3NTFB#V0qSvJ%Z3vufhlMj#tb*{!(TUlzcb- zB9bR!An{q4=y&5y7v`JB#8Kz0iVEY z{avQc><7so&8z`#37vCL`x2^o$&4xxUuA~n*e?qd>1ap`Eh57n%1H^PYxiTTb^hQL z_>Y472iboeX{N(UJBW z6lFq)yWpd0TrcogT2)1fEz&!w=w4N{{_HPOQ8N|!=bT0nT9e^KSA^nM@$PY3c1u^+ z^-51Tkk-N!*oN{cf7E{6wHUas4-uCsAx$pqs?3VhTe&jK26;k;>Wglcp?Zn`l~gvr zzzDid-M1nT7%P_Jn~H%Ebz3BpT41|MCpTXIT*-UxCLT4XaSAz+-a}yH0XPCw->uX1 zdQIH{in!4$xAf5Ko7nxm=UzYP8j#ze(K>DPE&oIRkePp5H~5@;7agP*);ztiW+5Qj&tdkGzcmfCxj#_o&AcBBo&ss2r`svU_!)@l8 zp3S@75Ae!|f&~2v3>(+l5R$mV=aLtNDdJUsmb|UrZgaO`KVCR7fYp(b`#beaE z*XuYgO^8K)zr1?c5=ynzL@J-J#=)Y%oEHaw$Pw6f>DMBE)ODgwS1jx}`f7kOBHa-e z8(r`xn|0*^y$j_}4QdXH1K4nxw(9f*IaVO65x~LlzFCNh9}JVfUa_=PJxJeDV+y$V zjH419`*TYGzAKo_$%QH#=HhMSFG40b(kn9RZqh>mVU z;UhzOsz!~8^iId48&cofqZ#i%OxoReX8{%5TO4!U^U>MRRf_HG0^efxJ%2Iy zh{-5j)jBi_$SQ!0$bahh*)62OD5En+i2#x7IzXl!qn`zDS;UhJk%3z9_6qSS{2EF> zw*A?Gtdl{hs|FW3w(AhR4yTgmPLfnC{2;YGOOO)8I%GPxnE2NYl6W^7168Q%5SD0(f50@M)-3i`ZCxr6l|?`cEY|2yF87-BnM&IkWiZk2-I0Gzd+DGfLWlz{gY9(Kg!)=Z-3H9u~Bl@lwosST&29UJ1R zs`6?#SD-VFpIMP0Lga_(A5bkT;5FCSdGS|#6Mb#lNcya}ELvR*Y_8S#w!`c8ZpPex zdHw4OuA1tZ7PpK$x4CFOxaBI=AH!9^g1o+iZD0>%QUQb+f=cm>4Kt}1oVlB%z!KgH@# zC$5k^tL(xrhrTRM17W03kVUt2b!6&eB0xf>bX-LcMzcDEIjX^u{bx6@U!`(;ggvwH zo*ELjm?1;7FhJ~sE}9mE3wbi9dPBy4gDzcgn}#TuTBzVesq0z_i|kr zpSA6%`r!M;d_OXLAwt}lTMYyjcSfJX^ewa8Xy1w zMkdD9hy-~d+JG^cYa|Kb(h!r`Uj5N}+w0qZg@inlbG*L$!DKMV#DcM_F$2IM6bspo z=6JSDq_SehgjJVjE(9j5x>9UqgeFxEUqjBob-zSZL$iy&Zu`?8xCK1IScp$@bV*<- z7wu|6SFv_#4e1?2F6qO(ye~ns+&^Ri$^RkIX7rFiG%+(wZ;j@ENV)G`3FR)INS8i^ zw;ZY9@2ZOAs+PC&B6HV-xJQ2*&~z&MzvuQmARL1S4buc+BA4C>&)d@&2wfTjS@^RS z@Kc(G7Y_{u(+dRKF}s0H;0$#n0}PK$WnW()Uo;ITrZKUZ2q-s^hq7K4?oM~pp^#q? zXUAxgoD%{!=L&%P?u1`t70GewRhQGpUyT>Nhw`<{7I5ip z0awmmKr>uB!=-=uPF4l10ygX++vk0EOKH0Q);2M{7cMg{x$H_9*f&N9*~Z>ZQFxG- zKihr%g}zqmEBE)gqdSc1g#&q%SLJkxM$nCG}9!uU*pKE-6Pz54fa%Uh4S&6(lveq%AIKgOci9 z(hDwWnUcQYk`}n6IZ8U;CCze4KOqVG7ipdS68@-X=zy&LSx$)q{ESl~%K_lxM--qP z_!tW1059?zQ8Jx;0C!gS4aW6IqxOC`$4ifoOt!6b-q#tS4S{r#cs)1D5sCh}l*B4o zcb2Vx@?ReZE>G&g@!Ky}Vrjv3c#P3*_q_<6(w=6C2>CsTbR-0XJGavLXv<;eYla$gtZ{<6zGxhX669N$2!Nf6n1=wfRpR$HGe98R8dw*$Slosgn05x71&%lxF+lHZ(c-7W5E& zfz-=1wDu$(9&d+r2CfA$pO-p`i2^KlC6Uml5ylfl8DJA_cut@zxXFxgz11Sidb6-b z{e|{E&5W34AHx6hqV>_GnJo7K9esGg89M)E=TQPPqZu_5Yy&J7+;elh=(@TB|_NQJ+N2BR~yO2O{!|KI>&Da>JV zi)Dge)f!4sxHdsxe~P)-puZ{7BUMQJ(ZcZ!z~vt8HL3fI8Le_q@@<479lFdn;oTp0nXn zWScVBfYEgc=_?eJ7CKbYzn$!5E}(Ob8|#K}q$&(VTh}o%?mdrcb6Pnr+*vU}8_!Tu=|xL)O|)FvsYGXopHOR38*E&*unGVh^Kvh@;lu;vaEdgNz2E;q-PlJVlfuKH&rncKy-e zb<$Ls)h7=B9Z5F*Gc(Rw9(1I-eAvn5w!UJeQvA)ClHj4Os9*uk7UlHvZwnghZ6Hny zz~@vCJ{$eqidRH^u>3|6v%VF~3TOObR=jLJcK2#~qBwW^A^<2LK6shfA5=fX8VL6X zP76Gy3xlnl@F#t5AH^WHrme-I`kJ_E(-``bsujFyM(Fn+ZNui`buYSz zHC@A?Jam1Q<#jdtU0t5jzv}W>J>=0W0xi#VMPI@Um*Y-SWuFD4pnCl4yRy-nj0IL{ zaLI2tbjNLLA3Fc4LBiZb2BSbKlrcpRDWc5M8}#bjw_lNJg~X^7k&69NV2pCmwbA_Q z#&UI2gC3E6iTzzpxsMA0bT&u1fp4?D>yV)PFGOstyFtJ#ERK_`$~NL_Le_Ns$5UsPq_ZUQacO^r2P`fQ%P^Jfo0K7^?W8!xsMYGzJ zO|R^xqrw?5{D)aH;H?j{(0Iu4ngEf;)3xFRq)nSMfWg);Ho)$$T8X4SzN@44--{8E z$55TIptNK9*Q#n4OiwdRtDG<$eXJIA4ec6U_h1IQmi;4{))9XvLuC0sY87 zf0uy!Y=l_6L>58_TQ(a(zzzjf1pfRD#8s@jfe zg`x~md}%Psl8n?LU4B7SUg`T2#wn0~j7BDINXftSpN<%N8@wGkB=XT^Hp?mE*2~nj zVvZchG|kF4!yV_Z7R2to19udEO+UIF;S*DHzJK>0ur&XXKk%Px&og!8$_vmcwx3IR zFaJW9G)zfvx}-B*Qi+n*D#@v1v;NXS6qfcx}9rA@y z-oZAFuy}{66j)^{faKTN9Xj8QWiZou9xQ(Az@YC1{;?a{Oj=6l!Z%gpFQB||*ZP<2 zVwq=$Kl$~8I(iF#1JwE;aQHifXn)(GLL1jxM&(l=er7n|N>@#&(LTy7>n~z$9Ywuv z+(Cf&z7@m}C1#2c$Qd9j*C3as(d3;rY)7}{QxM#7Ydeg**8iPPbm)IdOzj>993|JKwZYC9U=ae4j4oZFZiD_uhT_lN8ssg6v!i6R)H zv^h05*M-$FAO8C7Q*$uK?%d9LjHk^RGYxQ%6&0%$tjU+mSf=n1Q#I_YY3x2>{F`>- zPU%7eF;GgM=Ei73^O56ChI9XKP3fw-p6M3=Fvc3j9!vev7X={`?^;=eA`H^ z5*LVj)N;&yG2T)Pl}keVRL@~7!tY(fSkO;+MI~|C&_S(QB(G}3ila^OEY7YMt^;au z^w6eQ@3!=l;5fdcySq;zgTH+vjgQk&)h77!3d|a{f6QY`sEa@7nck@k1~uRTKcAEz z_=gMr#R2?l#+`3QwZO)jTpdDx@wq@hxD)hX*%{ZYK5VYLg`Nh6HdP+NPG=!4xibBZ z7H6Xmqijbbz%kNkxDKVvj*{p=1n^tQyCYD1*`}OZ-GBADUN>g9^aV$7yHv&ras~d` zEw3rQ%D@`VeT_JqD|sRmCuP`MEA>$1sw9pd@)Q*89JFkzgBbuwHNS?*qIV zUtRAv^Vr4Z-Q%?FZR^AMA2>456%5R{bV1Ct#HH>xy;B_y14E`{q_gmB} zty=epqWMH7kJ60LPULLsP3|f<%9m7P6eauyc?vaaWG5fspKyS&-$-LbWoe{Hjg$*E zX2a!TEZtxD6@>??xeWcQ*(I8YC1sJxiuc`pv-havd*bj^N{iHI{Mlb1D2NRmC4yq} z>dV}*v!<03*>7{FBo4B?D#gmOT!2t|yMGP0iD?SK@&y{Ktv3Npz*@paqC<=_91npd zjx?HJu(|e+2xh#Sfv!Y$`lp`Sw>_8I{q8QKhGa{@h=7804dvh`}H`{{K4| zNHD(T>T0cR?dqz{AmV&&pfxh3(Kz2p1?-(VvTm=acXMv*Yy9Q-(+}>b513wL%0=YT zv?|EO|FcT|pM53}e(^!;p}e!ZYJ0wWjZ`FBo*gCsZ~lZ+_#TX5=)<@-TVn`$K(Fuo4ck*N*`o~iNZG85&8YsM{_wFe@E9l^6eZ%WAF^$ zTK{YBn?ALwO1hH9%tn(it>NsgJi>Sjsg7B&w{rQ?zdp=JdZ^)4C>{T0VH5sf2;Ga9U$pk%@3Wcr6|G%4j*yyk zsYYaqj?=X&y5O+~yF2z7e*{kq$d3F8l&`h&wUiIut^AsbMO*T!_Tj{om&IDUm9QC- zD!Zmjz2YjJ!W}LK?XULtdLArk8nFJY zGe^6&H!?Pccae$XeSITj@3Uw;XPD^5?yA*MW2mAkv3^*YK7QyGK{ zgVpQ)+P}ks7Z!s*jOVf%B+3$(pa-~vS?~XY_5}7|bMkc`l+qrizn~9PQz*Ozp!<(ga1RJ@?zfBO6UwHP1b`u{Cqc;^1*Ez?}{?3dghbdQZ$T7+x)zeSui`Osj zEao!pS_aftFy-aH_&mpJ9(|@ZUxvY~RPK-1Q)Qyh(_DRXDt1%fL#l7X8C%+P)TGya z-B)kTv8^ZE{w7&5i@}I)k-s*K`T1R25~SD{gNwM5tEI;=M={Ugo{`T z_o#4mePOV>ZMt-)n$$=nVCcW5^o{!0Rk5j@8VwGZ(m>DTkz3RJ(0+|dsDiR~jWI3GR3|Q;kZnD|D6LvORxh`$1RB_y1Dw&HRa8d6P_6cp!%|RK7 z@2_Vnz^|O~y%e(cdfl^8%~83XxCB9|{{(0ZV=LE|yjb$`0*uAeFNWx~ziN(w-+IU> z;x8AAt+<5hD{to~6&%zhm@U349s) z^~(OWfk8AH9<~CS8+G~?Vzb0>I^kenZWD#aP0S!7g9F7BbU*LwnAZp9>Zs74wrn(Z zxVx+&&(vbrTf<)D-}A7#8FEhzQf~=0Md<}t8?pt$PS2))hWD?2`u%{bhcZ3P@81d&9+(aK`8V{P!R!cahtx?B(zM_!(d?znN6_`>s&s+2?mgrf6ye z^36zbk+^@&-EXjfm5YDZcfmBCcy1(%JX9|65t(v&3q{O9k=Wklwm0#`#7{l0{xvQB z5~}9o0~B z+_xf=MQQPgUB-=Sj!aJ2H-<8rXxq2`%h9LnuANwS{FocA(jXJvx_^EDQ4O~gTz6Cb z!Dh@)D@NFTYtNc!JGgG|!5^k4=^J9O*Kgu_x^ghD{v~%fQ8=1ibs!WMX$1qW)>!8n zMO=eFY;I*n35@op+y~A*P`TZIWHIc3luG1T|A1}6Oa@VAwzX09=RL#*@DH3k(20DV z{p2{KjZ}VQ{`j24ymCgqZQikTZT|7Y%c3-b`SaEqIjtp{cD0DgP{M9i*&i#X&qX)Mv$fGdkCbRYa;nYn0^H-Vp zMxKtK@s&fB&nPqN+KpE)es?x{oN` z+SmW-?Mhl4Gw8*!Qpf>wMPPI_ugp74F8+Z(W`usjD0UtmliymLbNeeH zk{jO9lrtX@u(FukxjD-X_PZr&*xX=WFUAdqv7pxfY8UN|!PkuS7(Dvd<~itK+mh9_ zqmi1p(OB=y+7q%wcX)X;L7 zUbbjDmqb%TOAz(_Lnfe2;6Kl!b*c?*&1QS-?m-6l2B-7m?|;!|=jn7=P(YyOL9Ft2 z#3Dzk=qXS^b@)zTLbEOuNz*7tEEaDlNndV4INY4|>p}ID$KB)iQ;t5!qVLD(bqD>> zDM8)^UC_6_G`_~D7qx1+f5Tt3ymkMX(M^`B^=#$tR4vxm%jQej(m5u`Sb>fZlQBiJ zA3TnL>`oa{lHP4OP5uvH!T#1?ydH>7;rLLi25;ihv&T}$ zMU3d#jOc~EqlqPB&2n$lkTswbsA{V0f&uh}Sn_4`J6V>dOQI2eP6+YCR)_O)Th9#0 zO}1=k4tBFjYhCg&;Ysfq=%Jc$+k-MQb2Z&!-q$enuO8=BGGvuff>5Z|hBoKdPqg^n z1zBjQ1l8OwOTHk&SGA;viCIIl48m9xAkpl2m^h*fm36^wQ2kX_m60^Iz~k|B}zD8Z?*+Xcm5Q#V3x*iA-JzaV{+% z!-J(Kg%-4oc32N0|LeY^h^g|UtcRM6HK^Z~k7`t>u%9VDCEqPGu= zJ`>(19nF2end53x7Y(9@eQs*{hY*?je)6L6t!%kADDpotkFB`~Cb`;*t+rmQ50_beePXG*R7p*880*##^$3eZ zzm{ug@;_ObM4YK89=H{Cm9$XqFP7mNvH`@P(iew15DWHHrB!x+rZO~m>R(YeG@9z| zkK3iXcu?K^->S#Efzatsz-O*-$x!p+01nC6Vw8%G(6oXT*8-!Y)zk>Mn|QI8pLg*| zPCxI{$1UsS8Zq)ps)9?G_zyp$!;D&#Qf}vXaEHyxMA_TtNX#s-p0^%Me33!Ncz_9z zC;%K1?a{C%a;Eaps&`^;(=@UmjsEc0NZ_d^w{Cvo&T(U#u(6}Hm54G8_iN>*+Tj42Z9emzQxzAkmQ4Tg8g*yIIcQ+I1HlNXHVVgnY3ijf%! zVSWK0G>0V%gyZt-O4q_$_{41v?=mLg!lR{L!UW@!ve{^FVd${Fre+vOqI$cR0HhT7 z=iMFPJpD)@3kkpDFACQ70jO)mz?EaV7$Ywcj3oc$354P%w&hLWw7(_uo$f`t*(b?P z69Y8Li|iJAU-P?J?HT`X4*dH+$c$|9WFA8#A8jSz8`&D<5~_}8gcqCy0oQa25>h`3?d_hvPvh#c zka~~LdOm_@N680grFPGxcIC;@_x8s>g}&YTtb_RiN=Gx0oCG`P5P9N@a0;5-Bx_LM zuK%7`#U$<0m;43m-(Z`++V@|q4EMZ#fPF}zmfR78k!d)2@vgH`!|PS~?9Dl?kFfQv znRRKu`ohE;5mJvMHJZxX&|1Jte_r%8w~m9tw{@@U!QcEk;HjgY+!xYUBaY7t7=p!t z!T$MW@n_}pm#Ek32CF+Z8NbI}+2Tq%&#W^+eA~Bzz85J!eU|}&rIbVK^h1cg6QZ=1 z_VpDD$nJvUBwUnme$(>XI4n3;+&8|x3nv9{&#T|txKwLCQRVk60vKDrO}Ofy;QI}B zGLrxV!-eUw0Yur{CxEXk zZGUm=q2HT^TIY7GH+*yB{~T!SgoDsVLa@qSb~qQI8khoZCTCrJlr%HrPPM|&~&U1oA-y`i_yXSG9u zu4K*Y^GoO&wYCSpS@f=%*<12kpQ(JOaz|w%+TQ8C1K|-OaN{ox@Os>tpopiIhC%cd35trF-UAZ}~+_hHj$5!r8|D&IU<-Qu0 zOXWZOgjG=(O?E$1RV>TDhm;MH^Ooh`9X@*bI~HM^N#>6ug=Q*i47@7)>2;iblKB(# zE!lk{KZ&w|L8Ftb(H@kkCEd9Q@^5sHG}`M_6-Ce&KTF?|-OuJHQ8uTG$|+lmNvxo1i2K5 z12WwH;WTFh|Ec%ay75njA`yAsrz&?5+pV`p8`|PP7nzz%zUtC#k*V(rSV(jLz3NS` zVyUJ={R~`I?e#6K@oMAM+>}$(e^o5iEFjMF^4R|#&!N0_bet>|6z>OqESbdyah3+L zK8T8cDk2bb)~V{bGJv;o*~4%WvF@-(P>wFGZ}QHU5A*W&HS^aJ|98lMPM2eK!K`qv zpiu(Z?-hWFvehRu#Pt!YGp$=R-2B^#W82a=J}j1+E?{LJNIyf4aCM4u0jF%C+x=q| zM3mhAw4uZ1?*q&!maO?jV8lO<7dMIhs}q8VflOc0iDW|7ouQw|lzQ+I@b6lUANLDR zbI}lVc8m}`vHhrGXUkWdhV)|Hio&`!#(xrLtBgTAl}OJ=3P*}y9bQ~h@!{gUNaKTi z(ds+WoLAzB=QNK(XXaj7Twg2{qoZZ74`ZAYw&B(r@=&VI?4o}*uEE;Ds-a7Du)lG1ix4v!^8}Vl z|7nesGgAm^tr251Jtl_Rc@$kC%|+25>TxvLv)C%o_7y4F{zt?l*#eENLlMSQ?qA)l zJ&MZSn-3t^ADDWM)Zbv9GM0igqOvAhF|{@Ww8^q z&h&>}ZYE9Z`vX7Tq)Sbzla~>d)wGpV*bgKbM!$up)rO&LnMzfG{za2b+jxv7=Mi4Q z&kWVUWM(rHRC!*q8?((7j_LU1mt)B_CJEZw0E@t-V8DpjM@I?`*vS5H6rNRaWdFwE zIPH*aCa*QA{S_xQde8He`5sHIB*wm?Z4F0Q)HYpSd;uEMT(0R zUo0SN)imc022UmN+lo)ksWqC;VH_4y6N#;^E`7D`1hHp$v`eu$k})`GUuM!bS3 zRVKI0Bje`QvPlnZYCA7=!@6zfC68HGlYFCw+ru8L@vd&GPJCQ6uK#%+sosq{s!D2d z#y6_+v8(45QJYLM=TJ75-0UhUwU>1Y_WQd%Zt;K4uNKWX`Th00*t|u23O({>qBi-d z&uwn9GKQgR-kGT<*-iw}V1X)CQfnvDi<^&(%$+S{L>oR)vyrI}>BZQ* zcQM1xcBmt7I z;m$Zn$F^|vjntHGV5~PpOJA$I(zbJ~_an1hUrJhIVfh&4C;bz6tfI|4h(VU)oP>^? z47HL?u?NITH^m~cO{xv%ur-E;yeJ50E>Vd=rltvWLR5?<8rMv?C?JW*+-CLM8=F_& zWH@L-OAF<{okimaAVaN)id6*0YDWX&Pq+R^FyFRrTQqt4Ivr968O+iV_hI=@ipCul z_4wx9xufKu@zXF37mfW>h7?XydED_ubj?4GmsoPSNZ}1jhfQqpN3^H@$sV`Fl8gOG zmSL--k>BxRG(zV;b+LZu7Kh@`TCAT7T%eAA76V*BKLdj46Z$to{ve}?Q44bkFZKoT z@W6^skZfMaA{PZ4b3)!$Yz~IMuj>?Sh3n0IQiG6K${^TNH1(wBEBAgCjbrDQ|EocRfYhKKsgiy7A^$~ui14EJHf(QREXZ8 zl%M>-d}S!R{=_RC3d$vv5U7@?oeip+y=!&FN0m37&~#QVl!p&PmNLHie^5Y9$ceW7 zFzlQ$2pC{*KQHW|u?3Our`S`&zVN zr(l>+Zua%k^%IV@omw47{2y3Au-!O~1`a-aggi9z^f>cXo^@coDGL4sI*{qj(H(o^ zpE@BJE9;4Q``g8fK);VcCjtC}U}__T2iP0hk;K+o@4lSjZEex330!$eqISi+?-y5p zFBW-XY4xIQ#T5frDFES^itAVPWz88-ef8FAEP>q6QStP1gSsuLi9E3yPD8%;EBRhr z;XRqNKVGwsjQ=jUd~+M*JA$DbFz|gbiYUgIu8~QPgCkWZ;wHv!?7ySlCI1fg8Qbk2 zs8d>Yyu87bEw1!>&OOUJ>0Tt~V+MZIu7S1g$)^NKw-yJx@t{!MLe zkMH$787IkFZ9r*}|73mkI2cC+uA=mJKFM;2W{pht{P`K}W#|iB5AsrOL}qfND?)g=1oAkmZG3h_ylh9V^U!b+iJY> z9Wv#?Uz88pEzu%9D9i59rK+(d8mVNj`UiFWF+L2gELl2%fSxuAm8nqbq~+1%N!w^7 zw{?mp!T|rEkK5XSinC#`FRIJ6ejZ7ntFL!=&U1p-D4>O0J}(H>w>j(m&rkbqn{Mm4(7*5(a)IX)Q}5{Z^i$|HKN#y^Q(9v zX#D4QunRNY+ue>fCYqXU9bvy~4-@0eBt3YI*-~5gfucuZEW@(Jt+3t`q75T0Geo8G zkTPI;NOSIQtoYdTy`BZtZYhgQeU<#I&+LDWOkK)zmd#3cG)%+aiUhg=rC){8Jk~IDW7IASohj z_y-XqNsFh87NA;LgYrm%{!foQwPMkh!pKvrxP7L?8=sTAT2B7P2UL-le`r3@dzb9L zzAaUNi^oFh!Mf^)npm#2%0PD`xHM0-Dxut8@sXqCFsBS|ne6EsM1fjjk8{|_TSqW- z`eLKYO#=3pju~m_k|wAI;~1{?`+grX^YYK`rtM7qK0boo%P$v5Y;18dfn{?50`fGb8U`M|#petN|f$goX zC*&-69Ce>N*ZM3|G=JUU((8Npk58BVxGUj9&!=QRR%}Xs3y+G##~&q|l(sbVdyF*k zr^pJ;+sH~Syqucj<)^6If0IL%NiWu3IxVqS(8@;l;|ykwvg1rFY%X6B^BjQl==yg! zKH58}i(-TOMoT}cdpMfv*+tqw-`4wV4P4?+P^bOXH(|d%rW2!g{kyNde?^*~gG67j zX4Y@b{itSNt-4UCE<`$d22fUI+aK8O7KKj{Ch)_<__|Em9X@X@YZ`E&L^py~mc!NpP-X%zEw z`rW9qocP$Q^|eSt&j9zQqlfeVh~(l?i~ItfjzrbWn^jP^cVcr_UNO!>(xSl6Jg(KTuWG(`(EPy_$+d~sTUy@kQjz?#;!1}@Uy#C~qssnrY-G}W zvQ;GBIJ3g*+10x+7gBn=y5ZlhTE*0GLhCU{S0&%8XnD6wWz!ACeJT=fb*bl6f9T-f1q=q=?qYD5W(prT(va2f(tcNm3 zzyZYi#c=Q+6=F!ZJU6*0xh%O<>x9MSfKW4v;=lLA3VmlH{WUKz6Zi5HUYgzfmvWnt zUsJV&r>?0xMd7LV$Dg0T#n=;>Px%9$ugi%J+!P&14B{ujC4bTW?D6k=f`3m`%dbVc z>C`?-4T1@NxRMg7K~@6q@h0S2^u$e+I0G<@e{4KAQ;=QVe=-2q`F{{>?Ni_H^{wn# zo<1kT#l8sqV+73};6JG*14b77XM8sNx1OIV2>jgx`13o#|5ZC8Dx9Uez<)9XAK)ME zW%!RYN`STyVUAds`XzF(#i2;39LP4qkFxR4RXwO=x19(3B!)e{?d`E=^B6lJcT{uz zKJ56P9r^y^*2DPl?$~}429WUMvAycMV=OwMOMJ&8k?$?$_?R`EOVM3>nDBBiAtQ6T@l!|$8jtPUCBB`;7t#0%thsDP`M~$il^VUXYh6L6^@KYl2;#EfkahkqQX=AY z{!jSLrjdVqvjdGhYoeM;bkJ{Js@S8}u=!wWx~o z6A8aIvmts4*@t5-PrTkW$WJo@M0Jj?h!i$RdNK>YUY6U7Gx1la?w+ZPsRJYzjn;~4 zLf*vAuDF_1gE|g>bTBI%<)yvOlB7GCW&Iwv(TP4cJO5D|FdGwScxMJ}MpN@v8KRn&^JC`O6?{!ZlY!oUY>dq1WX$E`J&7-f5z{0R8^MLspDLk4d&C(s&f zy%lY1p@h#tAm-S}xHy~>2>xYmpr}5Iu(RDjc`S9!b~SH5mIDo3t)mM0pRpx@LAe@H zjX8!4&vW2Ki6*~mcun4C2nw&J;EX6pK9;*UQTFJ8B1xieDjE5WlZ-B7sqbnS+}45n z^r*da$$y}5KrI?CG0K3ZM_C0fzW)JNKAPGSUAwaWTKJ6PX8wSy19D=1r8jn_sE%5; z=x4U0pF41n2K2MsMklz9ETE(Cs^gT=lePvrDhueu`Pc`qv9m*Lyk}C0J&3aGVV)B1V&P-8;BAZvyfg<8RpP&Mv$}R+HWU3aOn$mY7Qy=C5 zms-uhzty0!5+~G#m-H=sTqRNO0U29rN?U6p=fCRoj~M6IHOe|Et~N2ownyVMaxuH} z%N9)2WC3>Z2A-T7{ znoaKKdU>q10Xr>SG?tAj_t>-vdDfg@kMVTJv+nK4voez~cSoXZ>;7&f9e78ul0G96 zafgxIYaGj)qLI<6Iod6DA)WYNg-c;!cZ=O}0$wVUn`6l|^3Q2};mLjZwL)P+A5DKN z6GT1@=S#r8uDenrf~+h0NneJ!rz6Yi@TT+W<)3matS4vR2P|wPqoieR48MdPXo))86@#==1PB}~xr$@HO$R-`JZ$;v7XAbpl=ts=cjl{w|^=_y}PQ8$v6>UpM z+c=8z6I&xwhmca^El{u%F&2)ZH`NS$^?a}I>6|{M%byC=4fs$CWES!x;RmmJr14ca z_j%sw1BtVaOkYUO40yy>?TAw(GW9w0m$*Ox?f#ufs-{DsRs5JyJ6@Q$R0G^E(f;^q zX1DMWKO4p&o0Di@u~b~B%rp?4%=!2V42z{^t|E6$>2r}uHMAAX-x}S#bpr1-Tn#^P zi-ks{9hXNPwEk10QA!=z(yqMmswyxEHLZ|Dx*L zf5d=P93@uz79f7CyDHDmfafO_^WOS|vscZe_LPSfKpG zniFM@cUO}K0-=QPSaJjU&n-cG65ieJXMFPvQr*YYOsPPz zh3+x|LIg)xR-A~U#T5g(FJc*z3riH}``<+v)6`+z_llf&~pH@7D z2MG;venZO0=qrH?0jXL?yzYZXoxy0a%AcauM!k$dzgl=jzYg&;9Y4CJcw~HDpx!;v zoearq>}b@PN>dfXD{}u#u#R3U;vXM6e!r!0Q|=TTnbSI;aZUZ zEKXL$DF^8A+Q1xXybE@cS>F;nx~%ls+V;+eoi%;BvZVQ!R1%rA6vHT7 zIvtaz3l3M|R14|8R_{G-R(nsXL()$MkesCkCb#+zBX_EloBlsEKoU#3vKds58T^(0 za2-V>(=SomFqv&?3~JtLjW$|8{F4p($mB)zIRsFUxlHbAiR$Fqv@9sW$Rd2Iof_}b z+*s1k5G$SGnmQ0qHte{Cb~&o|uXVj+sacvAHKngcrVJwNlLhLUp1G|@kZGQ!zY>|! z-NHd7(;CT;b(;;gKfpSUL!< z$+3-C@yP(LMzpAv@cTKZFl_9>FE)jP@WF{l;C~H zkfk#%Sei-anK}2WVblaj7d_Xc*=3WrvI@4?Wbf$GhmJ1{#wR#Gq;+7Gn|u=XVd)&l zgc4eY>W#VAN|{qqHY`MGCZAoU%b8%2#<>uK+jTKRk7iRg|IVz)?xgKC0jE+YM=M+ z)JO>=Eub{5n-dacKi^B;8CupO00CPh+FgN!C?M)r1#!$PAv- zpMvpAFa^~GF(S;Y9U)}tJwa{i)Uqe7g-UDTM3A}i>q4fb@=+XuH?a=xUf}+bk4X?M zt)t~^S`uv`KV|UqCuECI@T~SG#1*N7oEYo>i8z94^-ki@-nljiAFT`6lijn&NpQ`p z)J*A`$fVn;rv{~L>UDY;*df;S6=Gbw;Za9@TO8WgN?(gKP6U>yf)*F~-R^83$x!HO zy^IFL$gF{V!Up~&j^yM8Yv<3Ih{(0Hb1Hq`Ig# zL;ZU;4nTgz8fZLV9sV4lC!A1;vPbfQ(J&(R=Zw z*f6HZWAY#=z&JxgP|(g&c)PVlPHZ*VP@VrL)Mo;f}HOyWZ}`$`V0a zliCiM-5+3`Hb_FF^%#93Gdxk(#fa87b;+}xhi1r)OpQ}iik5_ks5d5_(TA4CQj;8= z=N(Akp7r6QO*)V5O8VmPL|;oNZ+Oz30rXBM@eKSx2S``<-vHflob`**$oXhDaathj zx=7;$J>WMv{xtA(|QH93!{d~Wx||BVQvQ$>KvbNZ>3Ne=v2&KArJE2?ytRd z*Sc+f2mED(Ds)4G`qh!WKxOmzoGANKuE_deMGto+8oNCMNpJ9h(B{b07kP*cB;+upqgekn5K$|q#n@za{5eL}Ne_l)Ci8$>#LP%^7p(u$tLi z2ozzu!uAvEN`^<<+(MW5$uYxdX{-MRdY5>Zy|et-JaO}5!Xd%jcpn@& zmtAIVI6KW=@Dh|D;PY?g(f{z<_U_-Lmx1o18PIb4%j|8vzt&|DX+&L;!RPO^^c8{q zhZnitzD$m2@_p6+K# z=KYzx2kL|j`+nhyHd|2DYG9j-c6C~sbCgC)&21W)K0;HZ-4qa4fp$~C?xC7#Wy}(SBs?I94Hl+7Z1l-TiImq=B(W>Td8RMiX67+^Hio9!#$cfY=bgRrQkqN_UB2J zm|TJpJ5d(-m~+)6B08a@|LBnOefO&w&eu8w9{J|Z4jH%M7#FMehTPGfky^6E3Nx+t zP%LHcjtp-!{vWyx)`0})EI6Hka8bB*golOp$%B=eZGY588UoZ!1HwPB2>$?gBigPS z@%W5?V0&Cho~k2qYUH`o2wxcHZ!0ElN6<47g zJKY%gW&bC3gDun+&f^a|C+trJn78|B$ME1-*yRNo7AE_dSXgg<111yN&)MA0`adl& zwK@9_`ifwXRU!^Dpt^g^uE);j!pP(w!5TF|ZZOU?$hFvvN_8N{6zAYhJ;lVd0S2}PQw6+g_6?4&=n-#NvP@GCp%&-gVv>CbtP zd^?k0F-;qz(D>q#Who&(E~hkty>gF&r{7DHiedWQIDU(d~so z+Z-!h!Tv$ive-b5M`#ztSH=deKx}PJyG6TQZe60hD)b}|(N01u_M1=&TJaD05!pXrzjKP^6%*P2h+iZ7AM+q8P_f;Ry^@=QHSf>xwp3;ipzqGyGHU;=RVZUp`B1SGK*%&qFlld)*F^ zTL2YWE1Y=lD*JuJWFvEtZzjPW#AEDXo3fz!>WhjP)8W_B;b}QW#{runJP4aXEcqrk z!pR~n5p6Aq7O65E(xw;=#iVLDzHh&CigjLmsQ_|O5o z&_*Mlxq74nH4IFMRXr6^yKaP1U}L~5UDdH@>5D>L4JCe*hoqrq@umCk#)D>IXAsv8=^mnM=mY}S<{K9d@(Z)>*i*9 z@R>8ts$q3eX2B~I3!@<>Lkw!bgJs)vgMTgroM5T&A620cHh=w9l9rbHtNC>*&`_Q@ zVbz5x?-&_sZG(c0v-tIo2woo0%fGZz6tCaBe;`Et^d+f)tNaBN*Y9un4fLqx zWnxtpppcWk6?6M8QdN7xXX{t3by+x!)3YobHo4buv7VuR2SWi4`yI=xPF-VKG{B}*GN^~$zM=I+P@V!a8HgZL{AS4O4ksDJ(cLBBd1 z0ew&U)oB)Wy=VPuZ_55x^s5uD$mmy(@|e-D4&fyl>Q|nju0vKV1w7wRU$=84S5GNj-thlvAeQyQGX~k5fIC> zV?G!_!qS9)MHMJZw5)=D75?jDUjsQ)rktv$81Vokf15n`iRZ?IDqK@ZfHLH}^hPF9 zJGsPtoEsUzR~ zqz>VAa|BPTO5-uLT3GV4Y9rrV@>O&CpHxmv0lHEX>8U#TzB^SA+R-&P$+hUGr*Tdc z*RM~O?MB(z>qa1NP_vhR`k#-_@lSczo%j#hSSHmJn%>kgRw5iW!b0rBy1IP-sB1uw zmp}5~r(j=wW}U9;3L>Swz>4PX@TgRincFpP6{YH88u_#%g}GAidQ)elu%b}U1603_ z8yzpP4`}B4QXagF)=RBr3sEzzc%;2MwODZ&&Gv5R2Rv9jLoZY}Q@>vKL(dkiA;j>S zD0?U^?s&WiUNkAhc)@Dr7%C z1%m${Q{jyAY$`nXEm7eyyQji`Z>L)m-~YlSn7qvO68y+7uaHs>LGq`60ERO@r^Zuiop?VbMK?#R#VU&}N6ai6Xk`g1ex!Q$nNv++dC z#2GGWqz9)mCf;k+_JH&jX{s=NZ3+>~qq5lkX6bvX8;%JD%Xs+%L`+NOgEVHgrn+Xz zZkGg@rnEZM=jc?On&|H>oJrTQ_HsqH_lg9){2RA19;2=5${;phYh@I^Ct0||-9@H9 zWl`R(U)z=P3TYwae?_QOg!0VOsGB-V%EpFaFv|j(^=ckK$f;ZQ6<^xg+vhYN(!| z?t22%&aq+O#ZGoGs4XzPRIn!}_KqgUVBxGY3_c?qB+3r34jdXw z*`c2PHB`oll{%r6B%!7zd3IrRnSBM*RAZ^FH^~Gk20EKO;;_S6Nxg@g1#jwyru(Jt zQl4n)X=iPEQW68s@>Tp0W73fTIMvJ76|iAPqRB1>Xa@S!A<@!JcQ9SIn%wO#DCn4( za0QMBY15wl5T;HL;_}<;qTNiY{Rizbsfd5k`P92`_4b57Y9m_dT>f7QRxd2zs-%Kw z+fqk=rFO=|9YfqfB{txx)3<6P6}y*jE8f3?i%z?q8ZF&^8~4q(q^Vtx;xR--?yC zM5cah?FNP_d`Oezv5O{`#Rk5}akOW0q+f6}TTTC!=X-gFbG^1Zf)Wj}^zQ2?T&)US%1$!@aTHKMuW6yacJ*ShJJ5 z6rsIN%L+v_17XZoIHf*DlL>V^Q8sw9I8+b+TQMj3r&7X%+X(r6J*wi-?bR?dlgnAZ z#8vdX*stYrXj5!J8z*kmB$ox_zwVB2FquWEvC<{uuBq{c=5h~?1{{xEw}ZL;dmNTy zByF7%cs@9wFVFH7WB7m0EPp~tKPK56>Bn_G(=n;DLI z*(7%|_;0}z#OUCopj$;s*WUIrD9tGHdgb)hGxT|oOZ!k!M#1SN(%(mu#W+#>#A)UlA%U3FE)S-nQuKpWasIDU~H`+lx&4mvx9`otrrm+j4_Ts33-kq0P7= zehasc*~aOS^25t)KOD0?9>coB(u;)%XvjW=E_xlKJoyE_Sk|lfdwDUl>xSZqxC(2M zt1FYli#;d7(FVVL(ggfVM+Da&%&`&NA-tkGQbqJscryGuanYciFRw?I6PrIa^2bn2 zdkbdLa!qMEl2~BCJ!Yh&-AV&1;{T41eLmflj3W3kI*DG@Xz?~?0|qBnm#zfjkPwN` zWPYY^gt|X1S30H%on2>SuH&@q+2^2ix1zX6Eo;*9X1{y+6P`2UOVKMBU%s?Rc3HSZ z+VO`z1hvpv>t`jrpt^MXxL)d0fBSA7+mt?!9o)aBprdgn3!qr5k=q=3K@k~*1dZin)FcpZGj3f7JVzXH} zMrNC6ulZai+A*qmgr?dR8S|C#@Gyp+O|;>8zL>>=sCXGm&2rnQUV$|&U@~WX9u(W% zi2>uK!kJb>zzkI}iDkHjAG`mn-|X(r z{%1dBPukCr-|{2-A3q)Kf4|UlYQOJQ4YhvBq+zQOCg5CJ{!boiYis7FL))$|eiAmi zr2Y8bpa}IT1GF0}zU4ffOc}I*e>kqiGBQ1C>qE$x{znul31+6?0Z+5+w|xt^a2PBb z&N2pBHjoBcPU1&onXuo_*nX8wmS3j>BDy#QMLfuk4u2W4e7sW*oLpfr)^LuZ$o3p` z-rv#gI~c9HJK0q`5N4$Dc|oA~f;<2BDNqB7{bnOn0R2T84-#(=$PTHd->F|Rsyoeo z%1*bRA!YnPb!YI?f$IM9^LDBesjKo1KI{tCRia}AgZzVVDL3SWAOMd8Dz5iz~|^Ig)m zzmW6>Nm+Ikgpb~S_1c-gH%j|Bq4;VVev4s=S+>LiAk>o+hqPvu>Zl`7>L!2Q{0xvRMJ{7BaG44z@YMDR}MDU0aZWefkF z!?H=QU4%$K@Y(uHWXgY;{-*Z&RQmHFl`lqrCsW~nf&RX&hT8|Y(>U4fNX!qrCGpef zZ&uF$n*R&>lPLY)q`%ge_eg((%G>F$IP1AL&yN1~FKz#rf-p)&CXx`!Dg=(IGVd7xeev=C8wU*dzU|I<=ktp38ck$Frlq zU-Q(N{`~m|?LvBc=C5Dhg};{f4*2VDt~bas{PidB*WZ`JUrRF5&3t9{2V|hg@Yf+B z44wIFMruvf7O^vw-E>oaqv}$%y}54rQm#zru+6oRDTv@oOVQy=eI{KR@R6oq{>|>MoTf zTgD#3)Ad~|OVZ;4x9wYlUp% z?0m_8=L`^f6fS<9vh3ymsP8yb!u*#=<>NPBmZP)#X#44Pfqs(t8}u#NeIq}KvOg|& zM)rKGLHGRqmh|ABzgavYzW<^Z=OkZ)zM}=s*4N>|D3r+ljQbI5q&Z^;pr7@*QmRY$ zdwzp9!-oORMD6AO`@~ao796Ni@kn(B_2eghw{QGSu{0&w2Inj>^H|!J0nKSRSz=~g z08f@`lUaYqM??4=RQ|H@=93(`XmCfER-Ow?P+%vRCSDc7ME45(U-aD6CJ$ozaf z1hDYElequwhxB(@IaDJ@ioaAISYoT(;T5fg{zoSWtL{~vSB}+QRxay55!CtR=a*u! zD91BsO|K0>#F%1D^t%7ep}@5?1lDjok-yHRZ4Wc3${uF%5ZKzCGr6^YSYL&9B(d!} zQ;`L^Sbl=GlMYgAz{D%8OVx_L0$n>uuSO>k95B{e;l?i0ve4j%B`8%RIxA!pD zk)XSQYroMdPd8W#4(S!bXmdT6CaB-L%ij7`5PaF+LGZoz%SUebiQ?m)@`uhC{=wi+ z!SHJ}0fxPPHGdn5T3Ag1wZ$r-}a@3l8HARdu-;Uy!vYEO)&mCmUfkp)dKXb zjGlru!qM>iK+m!S5T<0?@kLMRqp3Xbf9n4ANi7OkNG$nSW!*mO#Fo5h?sDeuWqpmJ z>V|{}j7F+f3LR>V=N%zx3~bwNyUkFM-k=O{aN`PNWY9dGGjxO7gM0bkn9^p3n;&rU zq(v8y6It5e^cX?ioTH0^{^4)q)U&X4XMRy9GCk&4e>Y;WRCyu$)kWF?GWu7;@>w#* z2%-{vfSP9+Gz9po=N!Q>%l}8+yT?~mTz%XL5IHFE1O*Ks8Z>I6s6jy!AvS>o&VfXO zphiKTSbUJS+D1qq3S!^{^j;0^$YnwvWdPUMe>= z@Ao&e_dX{f`t*6<=bzUPX796SX3fl+HEY(awPua;AuK61i!c}E{*kTj@NV|HEA7u? zG$Y*6Dx;KMJ(V%Bs_H6aGic#sWznhyc|@`4s4RLuxH!nZgfGD*V>$5?Zrjo8yymh% zfJO%wfAN(J4NbX?f&|26Jh9)u?ta$Hsf>lv<;kxk!EfYgL9d6%$tWwqlGoX;NMGN8 zm7pv=y|i)9sra7=4C>%z6p2Uq!F>sJCx#*oIcaq{Vn>6`{8VzN-FAo9w3hh6=pIU% zI_kbHy$(`RvzL-v$S07E+Xpp)l8I@WyBh>pifxUJ@Z#CW6(BTL{L#YkY0m;F%{lq| z?{Qwh1~+Qjq+zFsEpN=KP>UUHOTWRU7bsSQd^L_y9%$VR!?995i#-}CnQX9qvgffb|%}n%7{e^8_b9&(m zJ7|Ya|Fn8s(iGra`%6OeGEyswEV_d?&yfNY6juq~Ye)*k#0Y;G)On2f=U^8Vj{G`f z8Go8wWHN3AutDc>$W8y*{MTBMq|>EwE`3+lFIjQ$J$U3U;n@OuktX!pks zqmh4`WwvA#vmMy#Gh0(rmXl{p==NmE0b_Da$c~BE1g!X5-_!zT*n)^9)X}OY=rwgl zPZq_tD7~m{!SIUMBtj&YU`k#UTs%#f=S<6zKPs77eQt9_fbfp!Cl$AD@o3Tos*z-G z{>D#KA@HDyU6C@eRgK9=4T_(*F1YwBxCUp^=5W~}a|-FRB0b&p@4zO^>{bw5*+rHC zEB=yxbhLT?E$f3fH&PYa(*O$GS?|Wb6g1A0w4I8q>8#+dnxWyaJdVK)X_js^U+l8$ zk)KC(zJ54Kep~iaZA=uGmnl%*$;wGNM!wOdlYci5EoxJ+EUFOu(A=#|#q!A&u~H14 zFvm-zUKfV{D!!Z)k{d?w-o$_aYd*__S=+!s4_*@U~W)q8lwz8tx3B z&A}%+wK;ydwgf5i`ITMebC>8DSUH?|^18(G;T`s-i1Oi^OiWbH7Jigq_SsXyay3v1 zZ1hO&!6)YDo?98kqv%CM;;V8ehNG=`b$N4&Xj^6>dPP@syYoyJYfSX!=f>d8Pa=K= z7d?xMv-o$7!pz+z@}QGAT^T=--dKlQ*>iOS?)y13a;FC zf;htl6?D0wvk!J+iiqJ?;nu`3RFpHpZcOdOMh!<_bk{=zk{;@*aH%ck`P{nOE@;7pP{3!)FwCD zMlv|LxzMl(RdTTE=sYsoMrt?B0L8yzNDR^qu8Y--{C0Dq2j|DaaCEQBCM$-n@#?RP z4Z{f#k4DyqH)ok+NJ4Vrdy|;j~c5be?#ZmF@KZ-inaIfPKfX zvS3cc9^R!jwjsD;n})?NFb!C^r!`HHC)}+ijkek1A5o(rhoJgrXkutDUjAd6_+OF4 zQNLkCc0c*;B#}xAma;5`cP5E{Bc=UM$Pro_P3J6Hy={}hR+m8Uy!FLF-6-_=0#C*URd8ZpDo2k4*E41`1cdSfN@Rn zW`>)Q<*ioB&P*Y~aI$oTw6h_y(Ld~$G-IgF%mh=lI}OZ~G-u9Dx#To>@K;p1NL6YY z0K3y1ux^0_CaH)G`FivCw8~)l>qIs`^G*nhsVW-f)4Q5Kdw4hNyIt9ZQSmjRK!l?N zFr%SdaN#Z1c8S(Lrr2liEi-nvr{x5jZl)CHXB0n1jOs4n%70CDxuA{KCO(6Fx~_52 z0=?va3KjH89f+3*euv09n`H;Fz{9#k7jXg{i(m%$l)wt^zvna~pUzvJN_(cztF&B! zENF-=+O7`-$_p=M`fn{aIQJ$-usqzA(98bsk7`O9;kSaVgLPP#36 zP}vyAf>3jIh`@Y^goOP=DH~6hB9p%A`z}3j=KVFyi-<8d0 z@=uKgMkr5{Hao0#0uzo-rGsO#D4~%8syY3I*1oxx!T4+rT}K_>_FgY4EkFZtrwe1lV8OuMt8all zmT(j((|ya3l8if5$9TO|yMZsCt*KufNE$j5?ryX!eVl>_sw((Zr$f*Fg-0ekg1eC%at5KR67Z zRRk@CXeZ}dGyd`tyHZ1Nn$6kaSTFG5)u*lb%?%K7aM64*E}BT{$S0<1XYw*jE7Glh zyAoBk!D2p^_&~xZx3nW>v9W%%NL}F z7I&DqRL_+tW3YTnqCxrUYup^?C_{iWBNr)y$(cBxT-kL8@i(s?uTh|x?z`M~+dly-5NwJ=s%inT@T_*A{1s^j;BU^ng`Lpdhqo|x)cb3>(3GvQG_k8W(>pKzaArJffr8*)0GT2zmJCQ4hfqP_bIxUrAHm~ufMREis zAKcBf!v64-IH7a1<`|p&CFY41a;-B8{-x(%_|(!x?os)9|2~lO+=!~!UEidi+iLCS z^Qpoxp@knVQwv=kyjdKMrOlFZB~AJXvCM<$f?4LBFGjPpOYNdPR7mPx_M;|u(Z;$N zDzelRl{pFi`Lol~hHtm>?eEn-S5Fby+fjFt^cpH@__v84@EZCV?SLLLAT~=s82{X; zGi)8)3a2Psq1eTMve`5(kSUk(84ib@cLQ_#C-XE`Zo7=}V%mcmF80Q^8Q^G(e{{Gw zsr{MM7PI~Xen6`kvZ^dtXDoAQJ0litM+)}p(a3Sn0>&fni(0L|NU@>Tn@#-i?azjI zf3A@~iDR_q5pKpsb06}ul|{F6EnswCS@eBf0DtqbQlT)NX9|(RaA|aV=}OU2=`*?f zji03q3-_h5js#;rU?*7`eW5IWE9cY9^-|NfmOgXr`{%5v4E`w*Zu>f4;nd3WUr%I~ zMxSqUju{slmR-8>>kxN+ND{c7iC7kO4E`hgJL(VGy_M_Vdj4Yf{?gc#4E9m+)zniK zJ8IL6mdL(WgH7WpAV#nw`by{gWwG4erEPEbD2x601Y!n9Unz}z?ZNByi_+a+$NHz2 zF2ov|MTAw|52zhWBOQWiR+L4rkRiluJ>1Q%x}F$={5(bDtY6k~B{uSlTi9|2A2!#L zSHQNW9Ef=fxeWbXsJ-kioynySm!(%uPgHP8)}pyo&jm%{{C`wLJHl=6_W)7fs~q}C z#q^J5eaqh;PH(R$`Z&1g9MeuaXlU{(@;_D?mxRM@Z@C5I;q*455r%>l_!sOAHuaZe z!tmWiz49rfo?{+UkhKZ@DKZ1YV!I*Vbh`ba)b$^ z1bkVZWE-8_*I(mcWy%~Vi(SiB9b`&V{$Y9aYY&4Wu%=niPjE>T!of;Ax?gE*{D#qe z<_1e6?H`~Lw)fd5&fxQNqX*8-gc)L{ewPO;6VQFQV^w+4*TGvd>2Yb~@2{2ae!X(~M^N^M+<=DQenar)EbTX986__= z=jYAsI_GEJ-*wK<4GQDmGUs1BS!~*!^QS!DbZYDr)$@par#kVlyYB1Sp9c^9j{bagQc8a=?XI4H>KS`LJq4y7b~!Gu>~Hw@sPC$) zCAF?k+q&t~J?p4zOMTZqy>M^WK5fqYjy~n3))PIjp6Q!PS0t7l`T_K}nG2TB)t>POv}eQt?HT)B?YS#I1;=|^yY^cL`J_ExjXC4j&ae7yS_p%gQ`Tzshiu(Y*^m6fb*3$Ri(!Wu=9u%oI$hAzV zG8k5wj;%JBYi~Asytm<}@ZO)_FMW?)e9Pc7Wm@VQbX$nzNOygAp~g?v1eNQ>zWA$q zI*9+z#7GfdoYfzu3N7)AcKh;5SNo^rmt|Idxf3bDm0z|R9=p=DD_Wa|#Ft&>dsD8X zXRQCc5T2*9OB>lFmhs6_IZ1AG-oIDXyCI6X;9`g{xZyp14pAdW_%lRM2-- zZpI?o>ii*1EwkyYa#t~eAz|ICSNTh&UEHqLsg(L5ovByJbOiz_S~vT=GOe-Fo<2k_ zqwe(w^!*zd&{ZIzYZYZ$ilo(385vnMwibT*(kba39joIFw)6%CKsTF&0>BN_p&p^u--@Xg50} zOPKaXR)WM#b$1H5pQaV}3hc?H&(Xvi5*M))mgjFNWBOE1@2H%<|SjBv-_6BjZqF<;aF?ccm^MpTpnx~FwFqC)$WGPZnIXtAGJMxObauCE_3 z$VD$N=u^s;<>onbt}ME@#hjm){QGzK+D~dNpEb5YEC1f(^I4IQB(Dw##T_?;V;;?I#Skbf8UPgI6D0m(P8FapkS~PTb@f4k} zF~330HfPn>uXhNMB6np2IdycL@CZqAS1}={MtG?$!+1NtG>WpzP`_aL)LHb&_5Dkc z9B@~OT>x(4lNm(zN5Nah^Gnm9h3w_gEu~NA3Mg%^E|2bOiLWMKX=LA^*$0)!#$28_ zjKA+;T{}34-JAlkF-N%M9hUR!xXv{G>n0}BwZAqK$uu6xNtu{4s!ju0V~O4N)SF5W ze9=qwgDR)Dmp<*v?Hj^v`;goBAh)kd99kaTQ`+{)F;Hah(vABf-*g0ZHUy&V%^5};K^YO1GgT^w}u7cEh{kSWsefkTL8b0#&y1~Q% z(>`Z^#&^(L)v+n`_V`m>>21u?DTj2F#;Q0GZ<}J;p`ojw19B?FPJ}0jMXM64%k$qY zlOCqLXooLn9$OllmOH4lXlqi=^vZZ6RbKQ#@TPxD;*4GT+V1V;`5(CQgZ4|=kcf!4 z)esJ--=tkoZ|#~|%(iJv?5L9>`v=YLGbYymq}chFCkEGUe2%=uchn+C?1+2bz&uF?Z<3fkdX0A{hoLpN z#ya|6C3+Kojz6hw3G&g?u6(rVTjV2owK<3Gd$q&q!ykru%t98+*pP|0a~S%S>sgj! z8K>D#h5Gb7pQL}-zW3GCrCpmIRR8jGddtKx>SUC$N2>A=3A}aQ>fis5&!@gW`~Ud- z)Exli#7TcnUk9`QkIqj8yw-q!(;)wRv~9|h)W~US zdp_E0w10lj=FxKGo{y$u-*JBL|NQ*aL*1R9Qlp#}SOsUL&3jYIdjs$G{M3(mOOYcD zu{qc7Ocf@z2hNUnKA(D_t9#E{xPLMIo_(BuM71SU+&Yvm`RIEde=zm@)WYX+tP|1i zJD3wcBmF^qO8K34dwC5(+OS7dKYPn2ag1j14w7{L%YB5& z#r<@Ny~-%F<6gq+qFY42dsL~_&q{l-M~9DX2V*cOcWugr(ZK7NOG zI3#LkQzC7;_Dgbzkn@#nl(03vWB&`qdL06f#--d@(O2u6Kr-%y%3s24ue$Vk6PxN( zV=NBG`g2Nd%WR|vPfzNh$8QE!yOHOq87I*UIYKlV9C`UUxbyP2H-;Pa+CtIKol|Ly z+7&HoU!L z>F7a(g_EVWX#MpAXAcX-YSAGV_a_fRQ!k=6?w-3ok%8Gg@sM(P_qWdzEbbGS&C~fY zf6QfSZO(B$^veF(d@@_-e})hOqQMlf9;E)%^vu-WKOwy)SCT4hsHrKW7yVJSg~fzIQ0k$v5f% z&6($?Uz3u4)%m33PmOGjuo_3y9t z+V^QrvVG_Lh;(8xAm91v8&lHHE+Ac2I%kES{&-6IpN}COJv#mO({D{lpMMeQrhoJN z^lMVmXViK1PxaF$rKHPHW9uK~rw>m_FIq)9hEMwMr}s-q|L+Z?Vb93fb zU(}-xm>A%|@~6DQjq)yiUh@6mZEtkMzr=*&&4|uVGr#A#^Bca0tB@1g{S6lH{XMVe z20`3tVT()-G051Ev$BiQp27;j{$cqR)(DcUTWKDFoG_3Ns8i)y%-&?i{MXT92%DX= znzwc|7N*q&44cH^#~3GQqw)RG4ud+foZ7AK{1@CTdp^O=-+QRiZDXx=a*eb=&V5!b z;T}6eM~i(%FccKLNb4oT`+Em=qc$xCK`9lsmdNAA$3 zD@E<~`D%Jd4XD;~H`8Jsp(RI~XlW$~svVbm&+t~p7yHfPI|U*(HeK)|XS2@4Tlm6B z*N$}|%#^#|&_&&m_tHb@pUQFW$l&tfL?_9qd(-SczUfo<3b(A2m$W005f1J!sUMm4 z@!F?ur{o#iz*p*zP}`~`M&)>J-1r%u-em5dSaCN zgQS8>HQu3Xq|LoHAq|^xBr`DGs$3Uwd>M?6fKnc$QRT6!=WsO`IJZ}6q%|j0w0cf4 zRrN1K;mG&>1LyWBjjYNs?JqCHdNvcBpj4S^A5(Z30yO*Uar~0@eY56M2Mua>oiHNr zgRs3?=mrOu7qL$RVf^h=w=Hon8D0H?v8j({kB$#U0K}1Nr^)qN`~<#wgbrfV)l>Jr zLDcPSVVoLb4}lb^m-~2{--9ZpUOrcDAti=FjQ_yY4=i?YDKXd)Nx0aNc$k9{B9d}VO9Du+uj=Zrw-*B1rt<^K1!obtkT!KOU7o!GvVfQPAV^j8`=4N7WC@Q z?-KY%?}4n(Bft;q^Zt`n6Qd6=I$zLXLj&F$r`UBPAn!V;u2! z``Fw>Cj%;DF0a7a_1`qB*f#45w^;==YrNO2xf44#D+7Q0{X2=MhoxE4MaCb2;Pg4I z`_|wLxwm-!Un0d*Jq=3c_^yDa`=UYTws#E*2&-VB5P8?@G$vAe$v zf6sMsi|1#?#45CZ2VH`|W?D4AccCCDyFjtyvz1P}Fc@5O(ATU78PELb z%rxi8i-GnOMAMPRl7;hG$?6gz!U(CMsz~u2i`}IQu8K3Y=4revf8PIXn6-$KeansSdRNlE)e63}PHiwx_oygp^d08+ zN^9TZ(Ah42E3)byeQz(B$%C`nA-v(Fwh9NxY^S`uDF^#=^Zy3$BQXg5X~`=q+v{O#x9+5a7X-S zh=bn(W3FJF|J^WFmmS=3OenJIt@z)NtE8V5(P)L;VV-WMSx8K$b>*FU?W~ZW5c9j1 zTOgXu33V1@gSX~O=;<^a;hI1<$I#6^H_RGe5t~Ri*Usk14Q7b-UN`@F6;1rp5{;iN z&Z5CVLycyw_+i6XS*dP7JFzhSG)u6+i2rv3Dk@M{d>5#tfQlcfg`CPvH!+pmMQ?&x zO{TlSeoeW{+~4Z1em};uaiy{OrPcM-=?3)@#~sG>e+NbRmr*v<(;6DVI>Ld4S6VbB zcSP{#tB52q9*s1Ivj4+@(8Ub5Adwo3Nmo7D1IZFs4-Qwl1Nv9fL#;gyZSah#tiRT7 z5C-ElVK6>3%oIj~5`xs8%X1JFwDF^QvoQb32i0sHqjipORWLHE1 zWqRG*XzPCg3p)32P^am1MRZI}+$b!~m6lHVE+uc~QqCK~3)eRSb^Ow4>9{?8&|6Bd z%yJ_PWl~;+Y>n%XdYR)518od2@qlk@$sM@Qls{n<%LH;Y|IG!cZ6! z;ZPWVdr67-e{wJ&NjO@&)4pUPedBz$oeHTCLCR_V#p>3 zDx#qp;*T6AzZ4DHMyKUt5ptJ7JGdjnph;Y=aql{xH5wNwacWK?A>#R*x}Tc+;X)yR z%-#1s@f)}7>7C2|>q^Q#_T6PIn?Iak`i@3&L4Vt=4^qMS=@=MPj@nOhe@ zJ-S;`68D(m;;$QLcWGnWGM&SbI%eBI~xA05$u%fEbCc@gJPCP8d>Xj6dtbFt&MCi&#>}`yGT5f|#tJRW) zYs^kgRl!FGJf1JUp>*nj+bA8aCDgXTiJhuzyf~-aDX^PNIE8B*cx-DfLAZN?YG1cOF_-{HUBee&=+(seY)|_PIhq< zXbzR(Su=iHQFY0jp3!Q_iRmrT>JiTEsN85|z}29#>}NTbdo_crtiH>K&NZ2V`YWWivL)7(tI*Tt@>zlUoUZVFN!#7FI%>^%mSU$&l z;zj)x&}`KL*NVGzN>9jzBXt_L1}D3xSlr6oMgVB1tZJN|`WW%=t(PQ&oa=3l41)cb zI)!D_RbuZN_)+_J;M*v+&0PZ!K=QJI{{jEOC7H-7E`C6b$Pnd;n(3W`7nUTz2usU& z3QG_1R4p@wDV;}8OJqDNouIri9^+}Hv*^pX{+JD7c=HY-FcD;F{jAHylC6BTW%gKg zw94#jVRvjFJ**xx9jxw~Z?QU4ovSi?SsBJv0ldYSO<1SOmsa%XsLX%95cQHYgf%U#15r#JOe1iEA%aX3d#i*m(7;+s)NZOXsK+=cLFE zgw{2Uw3sE2hPd)i$P+CJ+>ZE?&yi};XAO2xLS2!Nc*M`b41RsQ|C78T!B zzEm`Y{3-V%4OpPN6-NB2&5l<cZ;2YyQre z=nG+kU{m(k9xOzfD9EB&B;mG- zYt<-_?uuEm)W(7_2q-XrVSKt-GpTEE#@PlwH`O+5RLkt=Qz)%j!2SZboMYWzOIw7XZia-XqAh?AIJmk|a!7iMvuc3Ufm4&kq~D8CtXpm1Z6^0A zCO2C&DGvwQ{cGnEzD5xCpBJ4}*b<$@mUWHO-^g&jQjksr3~rq5&!9Tpv_75P>I#pR+pqA+*tz9w}LBL@=-&n|0F0N+8M#z^^EbP z08(m{GPA2FD&F~+DSMf0_Os8$mKd{h(OG?DO65!|n~$UT@|Zw;C&mF1{5V!6Z^@`D zgA#9?PPZzk9;xvTqX3PKxSJ!npM_#mw?>Lrn^LC; zJMf1(SYj;Wa4HbDt8((MLmlonN?GV5S^82syuU#KV)SRlm;&N&-r-Iq8NWtwx}U^?aPTV*^O&P;AG zy>rGr?am+8udXw))AVuMe^0XgbTrfuI(ez(z=T#-}T?>#uhyo z*`na-Y0f`O7}WNXfNb_GJ>|E{@fotn99%b^HyJ0uI~~vX>Ay}V2Wze6@B0T*(3n~t zkCM|wh;VtFdyqKCWera4Q*N)~GD_NhSp2_+=;-0!EWbF{HK}=Of3V2}KcV`Nk=H`a zE$RdgTD4}IiHlQ1{YmJuYPcGBW~4Z9m1R<;TU{nq#Zi6PxvHz^&XZx|H9 z7}#T#r@26M^%w8hz_1{G!Ot*T3_#{(r1HA?d(w0c4f8e=#pH1DK`Ee@;Aq2nYavyt2E5%vaWFr3Fyb(gi+ zx%>&29J)wuaVI%FUHaBxS(iSTVZz7~Lleza1PnOr%T%Xotc7CAL<&lMWzphK+nGl}^YQjFpA2e|7mx|`| z1C{AqA8+;_Yv%N(-Wy3bknBnv%o>vw#OTywK99-K`!e3WW6%U*IEf}!0ts_TW&UP! z$MH53AG^dMl3*M%@(Njefpt9j#&TK6}Q zN)-iGtAQ5$kq~Hb$qVE(fR=d>AM##=9GtF?I$YE+DNs?gVeSM1kwUNM@2_m`!{Fm4 zeNV0mGX5Kr<8LDeLjrvBNWkK{)ZBU)f51SVAW~%(%n8VE=~lkEWV*||S~AsvH%Qiy zX%_D^sQEC>AZt^sYz|v8UC$l4mHC|bBNp)xBzDjGcwVgk&;H-HRMjj~V; z9A)%P6jG>XEaUutSn@Pk|K86d&v`_ChaN>vk`p#KAHW$a71de(^Bz%fYKTw~;pl7D zkvtszx+3~=rGmGims7vc>0QAIyrt7}&lHdc0Al!uf%E{7wB;Pxv?P*)Wa> zZ7t(Y>1SwW+XCF>2c7bH@ zv&^2rIp|L=7t?UTOV|X&PsfniS$5Vhv%kIGmo2O!(L}+Q#)G|2wYW?TZYWi{*5TNS zA`)-ttw;3&1}0!mDm-IC4|7s zkWRhEi`;UIU~4xtXaBK#F)4LJbEYp(ckQ8-uYUwByL}8bK6w`?Cq{Xsp&+d#c;kKz z08M}ltdJmq!Nfwc`UOn`vF~=}Lu#yUo<$VAU31O6$P>P4EvsisbPSq?4bJZkSr`>M znaxT_*U2~mD!i%&Dpb51X-V(^!+!muy5}lNnrFEZ^n_{`KOrNe-O&RfZTJW)q#dV* z#4`U>eKzgZ7Ny}zF&skJsT(D*n)laOAr1dGXKJR$Y5HAHwurS@nN`rf$1(~9ee)R> z`gjX{P0=V9`k=1RqaJjFpZ$G3_>a#|!e>OCg^zkm>0Do2>pDEHeEV2(e2_Fjroxuo z$j6q^0Rq#QAz&Y5R+r_6j}FW}foZr#w?Ggn(}cncZ{CS}T}kD@wUtAWStfK;3|)uU zD_*$E*Vy$cy!kDgV^ihOjo}VVKSpE&`d^3{UgOE6cQ&Wz6JZwhMga6b$|ymC+9>bwYI+NF_SU&~V4P%ILp1 z)6QXH!qV?dFOR-o8hPgiq}}l5cUVX(W0Mt(jDBpd9Qs;C`p(iX+Z*dDD`M5X!(0L} z>mh?3O_35!5jN%-`&MhPhkQPkEzpk-VKD5@$GFoeTWnC}$_zX1mQSjIyV_^0wNwtb9cY#xWMGd5)9C7dn2ax5$dwh-ttYn_`3CMBL9P$Mkg zG0KPdfN!G!J3qAyb>cyt_rKdklhAe{m+)e>I?;;pZ3t-SrZ$o#8tcws@gMY zhs5sTub;*Cdrfe0rpb@+&Mtp!08r>v#%AledTfpvhz2tdRs@E()uhM@C%csuh<2)s zec>SDH*89bGt8AOHpDY4yT$XrRxn@_T&($QoCLGNL>$gvt!R4qyoZMpAo!>t8-{;h z2^M5RMWtz&ExY>`tq|3r_Hk|#$Jr*1qlvMME7r1J#fDt^8hyg*bwL$fWUXSEnkID? z{8(+SVt{69_)G|wz0S>4V}ebX&#cGXAG2OHuLnQKgYIA@ z*JU$5%vu(&>SmJI@w?yK+D1M!Og?0gr><5DdQD67fJpUqX~-{m^sRwc`d0eqV&dDc zsPucL+;p!>RWc+49$Tfe98%gvUrD|1A<+}lRYg(zf)iye&cTU2H$B|;cA&D)+uA2) zmqywGIN%4w|Kp<=PxCba(Xj6gF2AIY^Sg7T8UcyH<>3IVdP?q*rTK&^G0I4k(=Mvf zNTMqVN7t7t7R_gf-oYjFMNZ9!HT5Wsh4<{|-%6RM?BdR>EN5nYHG-teM zzx~7iMui+b=sowGvglf~vV=D8r25dnFGE9L!BpE38oGtEqVmAWxWyK3@e8|)wow;l zTw_yb`Ke}(28>0{&3k{ZP2HZizt(`W)SUP_3x{*<}m|>@*Mg zB(CrrbhWP7;I3W|4|gs0+pWoOkV~M;nqVY3r~bFyb16&sN2Vyex=09S|BVUL?!RyI z=E1@bOV~|A>-U_(q&xCt$sp{s?6)-!jKn{OZ|MIobmgs^Ok&~~XX5i}iT#Oxy1Cl1 zdB6kD>3G#-#An){aVNiky-cuIoMd6=8Q36)1@*@2YuKA;6qr9(?o*=^8*#lN0v7A2se)=a0np+*P#mx%()}78d_U}V^4JB<_~NZ18;lT&{u)SIg3r~ z9P3vxs}7gPXO4Q0g|tA=SjGv%z|6h*ov?oXZ^3$uZ`}WPfs6IqEY`D}+l`gl{&b_- zu<0_;ng=!Yj1*7yim=n84i3OAqKGjC+ApEz(VvH-^BA69OoXOfjfYP09}Xh#{HT`J zaYI9sL9xPL^@pECU&8+V6;mr59kD^~CWLj@$@JJ|eDlVS^Vf{eY_|NpOJ(9)H%0rz ze{hP&?4Oa7K@t+y;$cMG^pUFMEGJS_-7YMe5 z@BjP){A!x}-&WaYT{yBQC%EWF3gN1O&;Ikh7tQ_>oW--GjUG(jIhAcNu#2Z z(?+W4(W>x(B8y}{8%@s8tSs7f(mKhBGnR43&H})H>fBtV{gHAMWz`=mrHyG$^Ce_A zN-CTEO0ql0PO*8Ju=13$+G+gZ1QSUaQ@Qv}BVAQP^TZ{W@k3g*hs<-OFz z;m2cOzxfyulf@d+ctD-fU{~g^No1o49mRGC7qmIZeErVh|9RO+k`n2|MQg7ANigyk z@=lD6Xbd%e+U0CXN8Iz z`}1(R;JkQ-rwuf681w&^8ZvMG$A@)s2ea$bdsN`=ze}_}F&47T*d;=?8O8_YGFwEh zLaYCNs2y>UBI>H#MEO~$pQ2i}7OD%wjb@859%QW&iq{W{uSoZXb2;$kyFk-UguNQyJxOeYt zW6;5eE`O`8eYAQvcE|1ux<`vh^Op_YR_DLpGE{S!sFG1&j+^rW2EAjlopCn#du}pC ztm1F)J2-_6(nx^aJfBpac=w$S=VvNo2qiEQLb-or;u(0)^V*PD z>IMk;&*Fnz;%mfz_jCvl4!R%4=;+-;(&-0qV?w=V{NHC^#nqxRut<4z!F&YNbq|HQzg z40kN!tsi#l@c91QF8c6)9h_`smfy<%Wqg&Z-S$E2Zv33do#N-P>#oWvoSaiXT7(8M zqM=OK&cv?kbn=JY*XD{eOw?vw!w?$M@Mz zdUtJeR^8sIVc!+sXPApW$PLEmEHyS{vA0MYpWr!boH~7r=p454SPo?QQ>SVYfATu+ zJ|%zcvhr6m0+Xp|;fG5##Stv*a%ru%XrMm1Y`ipd^+ajfmY|MpE69iUj8)hfHe$=P zv@kc*|8OSyq3wg=sWd5jMOv1CZX@N&;V_8rPk2KYU(MG%Hp;*oHuzdu|D`2m|GUsQ zZCwov&3&^b2qG^f1~hB4ZLiEra8~F@CLz)r7<9a^tTd(fNb%V55)6)@F_%1w;~i=% zL_8Eq&Lih*4RG~y*`X-+sh$@I#k8s@g8R#U)2x0arF|2PQ>NO-7)&#Z&l}euT5KDn zJ?o}%R9J8PS93VS{?4B@`i!A_%ZXu}pUeQi3ttfSQ^(P{^XHvNC6uy2*!AHFZ|EW) z76?5sAckj+=zn_#IAYqA;4gv0;zTur^Q%qN&$bhPiEQgHfw;1`qyBI{aGQGHf!O2; zSwA7KCD8}6Dxf(XTyVR+ZUFm4wm7Jja_T+=J}-Uh-bTX^nIZ+w$R-}B_!slA^3C1n zNk63e+s80mX>5Vp%hd)nN~mF-?T=e~Y5SOLr8+0~_S-v#K3qbZ?=<Wo?0 z)(?#MSyIU@ew>0xUwNU8J9NWdq-_^wT|=9pUU*@lA6$>oaq8Sa5NWB5DrwsM&4hJ;d0? zhGXFvKLdcF50>=>11g#W_>L4*o;*pn!}JK=v`O1FMeG8e}(&wIuyGMrq9^c5Bx1ZuGOFkD~!MV_`#1=E1?m&oEV1mmCXtGskI>CV#b- zXx8c400y7>i)qyj8N;#2hlaoi|yN~C#5cVjlF17?x|;nCPCHab0S+`|5V&~_kjzy&1X zbaSC{*paDXWZr=A#B7eF?e^re85tZVvW@?xY5}h$YI==5_w^^#1r`h7?10o;m5TlO zZD#PI0d@ut5-nn+ezl0k!KpLXhU^Rmk($95yN&qSAA~?=u*W@^!Pw8Jx+?MCbbrw& zv(xG?qAv@1Np^Ga60^P+kx;9I=8@N!huNfG1pK`vwv(qD_&9!Cbt@vV)xO#K2zZjta9F(ttmqWW~p;;ES2kv0Fj?ah|f&fW7+w+F3JC^R+zAA zP4nZZAWLv9Aarz#nXcf|&c&kQJ3gkbxY=ah&Wl;sK6g%EY&wd2>VO;h3KL&y61Q+u zvOKm`+)R?9;yaJRLv}dD@8HEP{&|xr&b4pFp%ctf5a!WBtRp+KC~me-2mnU>waXOb zmFIGat}HCmt{*FY;`6cW;v^pfsX3;9M8*m>#neF%g!5|KHbb!^xk0IAK29{Vnb51BFEsRjvRNpCPfW_u zvXa*_qlj${X9g!9TR7=h?pJM|oEIvZlo!0MO~-@@hGqR9{Q2)Z5>0J7`cuT!E@Phh z)3!h5e$zZ>?GA0kMFbKmGY?;1XhShFC?Bsw%h9JdH83KqSO{Zhj~4r4)y#6L9ukMd z;4$E`7l`T<&7#CgN~k9}K>Bh6kPs)+oYefkeBEjEuz9JYeQ;T_aj-z=i*?(4(1?`3MpbW}Mok z7)cVHhgtiZHFkf~M2Fq|&0|!`-otA4%*!&qXosL3gcvB@J-fF^&kYVplC-XFQoftC z%;dCL@aW# ziP;v_nszm+25n&uF;!)LeYhGW_eff#je`4qm-%jwH)$hNi)03?^P3|*F6XffgEPa4 zoOS&vMtvc0uy)(74@a@}hk3jJM=aUY!ThaJ1FHk3fg|tu zL?eT|qmMJ)k5TtyjW$wMT$X|)tMw$Z8ca#K)6woWP2geO%q;2@|BiI@xSkl2$|R{I z)O=8=`LcjhMmz2Lw!Q8z<~I5_X(9KpD3_5rMZHg)je5w0LG7=8nbjti5&9{X#If>Q z6LE2{B@ih-qeujJxW1IA0ki@o1ovMZ<6QfIW+dN@a48{6r(KlHO}4OG-p!h=g&j7* z4?c!yZZ$kWYZ6CnZZ9cdV<)nMPS-4kPN!SDh@HRdNpSfOWd!{Uj-Y4M_g{F<%(}YT z`o4_|dd;q<=T(IXd`9;5st?(emiq7Uu|&$T!bbcJu~Nk{*1QTIoi4vQX8HMMSTd{f zU4OeFzyDs6kLIA$)FDxP9iThVCd{KA{2f%Kbqxjr#S}QpkuQ++@DgWl;j&$owfEsg zbWL*VyMP6R?JU;6rc{0w@7sl)+5V4A$}cr4Ta@UFu8k{>`H2Sq*j@7S~sGX3i9sD}R?c#u(1=)%k z_ZX2EsIF$LhP(@f+O-Y}^ENxqyURqb8UV8_(}ZMWd`zohKBk>nCeV@)Pm{9Z_gg+F z{8CsrnNNUNSY0d}pyu(c#v+1J^5=)aNgjsIJfNi{x!E{BQi?^B->dituL zOuzi9nLn8=b63B{hCp4t;&?86LGaZ$qvW@K@6OLge-3BqsN?Q99Ql7k4uk)q%!_|j zpH_d6z9txajdD?DrM|J|WE`bX7I*fsbG0G3wuR{yZF^FyM&fis4rIDWk&kA%nQB8p z>@wO%1=qDOJNX|YAZ3vL=yVyJ$@Ne(ikdZ`**W68t7n4nJj|HbT#XJARRx@~WK9gSO z2mbfXYBB9vn9{B!#cO=Boq3I^{6zzo9q*mAIm^FC>OVUL9zpbQMF9C%X!Nr5Yz9Ld z(nXJYmBMkc{;_Sj$)qJtixeMmh8Bn9r);PEH|}QAW+Jd8tAox!mX?H?brSdDY-cE- zq@NP3+k9B-PIqCspR%33SkTSJ)P7-yUuacwV_1a7GgdY3r`9*-NCdIoSA~tLUl9HKYjTHMbUuVZwSjR&M_?7U1iQvkHH$g zZ8nm#B|gu0V$sjd{%F)ljh|aAI-xpJ{LpYPgx27#U%7ah5VD8h0pt;I6xgwe#MOAK z7fszgNlV%Ymhr1h*?!IgrtBz;wgFsfq;{Jh2*h83Ckj()x|uk%e}A8UGmANnBN>Bx zxxcJGSD3*5=VRh7z{h_{*~Y@D^~HD__T)b6OY6@F8E5K!>A^+ggqXWri-4rgALc`uLgLWeY`YY0{W z`*N=t43;CCcCk*7i6Okn^lrC7GSy@`vurh? z=GioKHYgq&0_w_MKt0kzt@WU0u0Byvv1NL6(_T8$LM^SeP~RRV9Q4C}>VcgE6_^#G z1_4Q{4+4_+!W<#;SIa$b*htxgtuBLswV1We`Ng&F3Ku_Z?*Y01$#;9~;-(AP?Iz-d zMva%{a%@Df7yxRGQ#)C5vxHVAVU<%#esMmC!sya9F=2YP*er@&r((M}_U4?al1Lu# zM}%ZaAkt_vC%MGh{e{jO$l+i)1?rfJ7?aS24*BbCY|nkDtc2I0qRp7`G+4b{UbW2) zAd!C_6g7zDWxgb@5g0YxK>24oo2UAEz^weF9uRv*cG~B2x zwW`6ae{1V|8zd!;6CG-mK_^^?#zpEHvxBn%+nnK3;DHgD=AaAnRMnus>@<^>EXmF! z7z2s1jet>F=X_dkM+!Ws1Pv%q>k8F6q-~YpTb0mKEh=Pr;e5k>yHD$i7w@;l&sF}^ z{xDm0&(uIPsCgx79&^R)R}f$nfvHB*DbKY}>!hz3pU~N8(5jMT2pRb>T(oiir5sZa zIcJ50hplnW{>U&e&-29jp$U=%gG@XxU#1-6%fvxPZirgzQFZbu$R5}J z;Jom)FFItuMO7j0k(@s#iBY=y4{y?A7Bng?JFT6J^L&b`W~{#Cj-3A-iEC<8m$dIj zVthONQTUr_@hA1Z!QW2HH!c1aCi!EDk3Ze)t1)Hqm@kegAxG#tSKlqV2ry;QmE)nS zK+2omTwBuDls0aqlosF0!IOOc4x5XZ zo}2)O^Q9f*NaCsuH))TTM0QoeHMVTiIdfs|MZ|6`tgjH?>i&SS@$^v-(I5gRZK&p3a=`N6#w}cHcVE>CWzQw z(r*&Z?3N$Xi+hspB>5k%O3ocmqv>{x#XT)!*r!at@O51(wTv>iX(aaru zzfg zYoz#_qb@erv03$b#~ zCd;gE^Du>5qwbH!$#j?{AR~IHC5;r;zF43IaD?+m7m|#Mk>X=(tGwdLNxv~qGVb1L?l>P?F zL4smwwUG}APWl9#^9?-uX-y=Cu$l+_HR9W>@4U)X13~_Vk5selNT$(>U0d)D{p(Sd zl0L$OZHe=KQxLm%G~+It{TgMz$z)$_vL7M-yuvSWZL-9VZHe!x#3iQ0WVeEw{Oso^ zvyZpgvy}a0lRejDA0Ybm3*;vY9Bm7{c?1RaeWDJ0KG=3(n3sJ(50hOQkBr@m>MaXv zgqIjz*5bV^^Ijg~#n`lY@(=tBxa(ER%T!89cO{c5J8Y8RDCr?L2{zZ`HSsd6BW{ue zeEvcDoN3~v3oo16i#{wrx_e%xnmt~2IvK^wKG20~v5cO-K7$#`{gEGc%g){&7&-wqk(M4zC$+SNVeTi-u%=_^;};qlf{57ylP3^VdldPJAA3re?jQ>&xe;AhcW!mnGX&n4AI91 zT=$ioDh3EiG9Ac?hY6PR2k~nd@Rs(HFCyz4PrSCyMIlPCXFYRnc}s>V%f z;OUmS(k)fXC#JjT*b`l@N@KdW59)rp?;zu|*2O1dEEzT3_rGVRd;eb|x&#w;uA3}L z(Pj4$8c|~&bm#gwV~g)9x@0ZrG}qJliGFy6rMp^IbsEWuy!WBD*hTCCRe2e%bFm>6Lx$J+CbCW}5Q{ zx2y&&Qhao>>0INM4Vbb!2he8tlUew`TCu_aZ-}g(aGUtp= zt^Tb_*PGK4wTWZ2ynb##01e%fySA>G@8UByV9nzeY&7#Pd~{YnCGPNF0s?oq%M``) zH}iLR@iMc?O(h&i^ybTW zePO?fgNhrZ&TL*mz0_=VeW1Cf7ssbb1E+bFaVLB#QoQSM+uwX@ww2z%|WDP!9KQts5AM%}r--UjH_g zZ#k5xL915D|J?XjADSgKPXR6eXqZahl)Fs8X}oIlt%9+Pac7atXC)_2CI2&Seq;1V z$#2xev5a%v{3e+yIDlwxDhOGPD;NoR7@4&`1tYgJxAA{J%wpuo8$66Gwk$xya2>Do zWyPsyA%DCFV_}glVc+uTabIcX%6!F5nB=&29O2V$Q;t|>=1s`lQ4HM?fwrSvk~qrw z*8;7U)<@0VC=Ghu+&`KH6d+|B!cPeGs!t7}Uadzo^j1}HW9p7#{V?hiO2#e^MmJ|KJKr)Ls-+C&Z1?GO$TY=E+{i<_1m2ac` z48Q!!HGcU?|55pg=TiQJWcj&%`F{UV`5&qN_c(KF+n-YZ#%cdi`$Ou#Uw(eQU;nM& zTKXyEOOMVZA+&<>fg!Wo^Ru2P1I5s`eDTs`l zcZ1_-mhEv4AAU889&dfCyB@b?(&Lu;zG7QBW=s;tI;Xh(&M|z5al*wm04GBGHktRy z*+K?fqx=N%`4A|nF2qtV4_Y{ue=1Dj4?Pd^D94Pem#PZra7b?=hdCc z{yJIquYTF%{IZRHStEZAcgv#1V?upjWxe%dj$iuF60hblerY3re(tK9n2nUqP1bz2 zUv|RrUfF~Evf6PtPq<|>O&e3_w@0~kN3-Ke4Rb6a?5TQ@;jFw<(EGK)dBiL zrdn^mJdy74UvtarZi`59ypOu?w|_rYaXaW=4fpDAf7R>1c2Z7*Ti&AY;m+k(_~kF! z=hc6sUtWqzr?6A~Kj>V3o?kxZ*FWAbuX~Z4Jug^dx0=TM&gDn><&UoL+TYtRuO>TB zy5-&e2k5`{_jsZrpPJ3fnFfdv8Q@~9D$N6a^b=oX$Z#7L&AgD0mbW|iUmyz$@eflD z`z6_u|7Pu9+n7A={6-4Sc%SyUyIyDiqjrAhaV&T!6P-W10BkdkO9CkJ0jzu418_nH02)&PoZwvJ0uW6_igz9a zB0T={C1zvWiIE8p#PJ6KqBs@A@y@9(2s;?R5ePdNfAaxcahC@mm#tdHS6fp$k?VZ) zM~ekJl`l&IsPh3_@Q?@KxBviFqyjk3dDI19=i-ngfHQmmuYKtOI95Bs>rw$6>-@+C zV6pI823@eybDo_FCmT3sD&)CSVdho-R5G1%$b=pGiT16Q+Wt05RK#Ac?#3{ z9;uk_B=K|M=zk3e^Xb3DTlJu$_+sb(^zTIf`)2y|zb|nA^kql?ze%T?!vwES|5pcN zHsZyg!^4EJODQOQ#pq_3cdcK6LwQ$LvVzQH1)ll7Bsmj)S-3Pe;!VQ;GmhfQ3;3uC z2ACS`y<=-8r$CuaZI1rV zc_HY_LE?cQQ7qY)gS_AR75M8vsS3sj6?$pCEa;Y0&H+K(jy4{AWGm8|nc|vubp-`h8Z^-S}RVgk}FUSmptX zxAs>KIbnl@IS7QbcMbOD*m8Vt?0EBkkwVPyth9;aQi0M+WkQRil>cTXLD?k<$}SrN zwETb)0b0fhlu14)e^9y9IDKHNx6#3Ia$(JFl+;lC5I!BqW!oAZejChm@8L z0nP3wntgy`NuuA+d&;lC(d;2sL2CXPm#k&~q~BnLUx9}C^JnSLY^o3w|0_fN!Sg{M zEP|lDtH?XEk6z(CX7?cZVB^DPULxstHu^UlKI9_q5PKzvz5A+(MC%+%baT4E>viqq zUo18M3okbTUvmDx-yu)>J>b6dHeT~Y_QibR&#y=nfqtYwchnTVB0$`0rBo=LF^QlI5OAmiuC@!?ntFsN9Kuxuq%>%#SZ$9<;bHS#oJw$vuVS z-Tabm)?%Pv-<>RaezNFIX+>wL(U)N>b+S4I?1jm4qmt!LPAhi+<)pt$KB(yKsiH;6 zqVG-(@H05AXr7w9&@cDOS4sSQcv;ZPA1BNGeN75K#p>muez~8jT!5b^k|n1mOa3&i z(@Iey&RvJu_MKlC+`^{ehxS_(cy_QOA$@T?OHI4*MIdd=J%inkm!4Qu|$vC8D*z+gl_r=D%p&(2Q#jzpAp@1Rnm%fqi(7&3_72^6oZU}%_nDy^ zN2*-e{TZR?f%^O)-L}stJEY^9qY`aXlf|^imaLxl-K4|$kHMGO5sJRYRc9A}5^d{` z!#_e(RQ-}Yc##L(7jPbvzBm4zQ8txQ$`9E2dp#^$&~eR~Gs-USxaROg+XJpZ|Im#J zuuio7)ZJ5IlzYGY1s$`Ry5=U@ZgVelXJ3|Ro3Cs4p7v+g&M2GTG3%7B(`S_ZsNwR7wzXcf?H;hEio%ReX1$Tb*x_sxO z9>-M@oG;MYpV+v?`cC^Iqju0nBKstLeyRJs-}y(VeieA0%KZZ6Jq!G0F$GFofm<)| z>rbRUmya*4{@MC`p!);xbyvXMa9xxmyrxj@g!6)O*Q?xye^ZX#dc#I0 zn=0eEmG>6wC3)b6t(zVc+VT{Ie#Ub*5#xKE%XH4R_>s3TmnL%S-qDwu;^`_nK=$s} z64I4#F!R*k;PI8K|L)t!jX7Hd&0qNbn|MfXdhOM1!ezZjC#Fj^b05h5zkB<**AO`T zf1H~C>$R`DO|V3piZa?81_i-mB!s{hG3@M@Z2@Q+KNbpKuQj@a@@=_+Dut3y@nta(jG0BZfn_G~f~H41(%Qj9My;SJ%~C*=Be_#cWDrVV$^ zLJ4|VjUTb8(!|-a6N56Gq8^$*8zQb6!Is6Z{BuaFhOZEa)tMa00;D6#i>lZbk@W|0BZ-3 zoko%uPRt<#*H@wWn*^onkL?`!PE}%3w;xeVUi17&<_75PmrWwT&j{salZJPu+|C-ZhLN~gmj#PhZIBNF>l3ssRohbisVraLLXj#c-X((*_to+LJsxDBfuKpzN z_{swoP^JvW%V&-uv0V-+{6yuny+)`ED_WV5W%Up&mUlj;eWl5~JVsedNObHSGlLl6 zM=xd|IFg3@gSm(JVoM}{c+3_L?^K>?9||EC;o!C8*LC)OjkabK+b1kIf9(B(r%p_n zN+6V>;IaqFyL`enY$ON^I@k5-NMk{_X#2BIz+XDjG9}-X!$Cq$tunx?yNbh^Wcbcx zpZ18eiq#qyuSa4epZ7z-H-txQ!xf&L7<>wteOX<7c?+F**>mqpn+mQ+#;uVMi#}ItkbBEN z6^~6-J&>>V9CpLXB;WsP)&;7c@iPXUru`5QBJwYp(|Fk9<&YcliC84$ zophcwc-97!$9#(oIQvR*(Xc>`G}3Z1ZDMAQz9ABu_Th(-Sk;GHqGjtpRt>v(gIo=f z_}mXY9XAn)RetEfR|Upbeg^_g*X)nu(ox&_=U(WP{GUB1piQI7_^{BKjTtthp1X`G z{VrT8t(zLaLyn*2Abnl~>ae%xeW(qI+!z1eYht^uj)`qA(J8LpF zcw3HjN8EQ_1s(NL5)8g@0H2#mybc-~#i3b4E$_Fh4#GeluwR!bA7(hrCb+x&hc-#le6d00Qe@ZJb(5FvApGMd zhY%ym>7eQ`uj?lUd+R$6b_m4w5W1}t3J{6ps84J@aC>MJU)QV_6WQ6X(!Krd8o}|b zJW5KmKIdkz+47uVK4+P=Ut)jRpjVFkbM1}xAt_ON9VB5#*oo|SAEgl1SsoGB=7)u&v2LFFgJ_{ex~@cq~bz4+HwXj)@``g8IcRwGisqP*S zGa5x8sIRG6!kawa_0x<;3C{e^Gq$DMfQ$|P>VSTQ;;=zo1rN28Y!H z&o;`ScY9mFGy2d0WcvBIbpGCEfA99&-`}-=_uqQ)>@gg!otC2=rZ6hoV>|7S``@(uK z2`3aV4-b3tRD2z*|2zxlAsEBn(YN<4Vs$cEn3(k004XJ~i0jEUoMV$1%!H*KMv3f4 z!oWLZ8+b3gF~FA&LiFw^^-n(RysQVY`jnZ+M+I%u3Wsx`(*Ce>q4sT~#1&$4Wn}QH z<(Ld6{36Y21!_BsPX_5Q#Vj2bm#s7z1K{`^1Uv4Rbovk7xSGO#O9ix4OiQC^=}1}{ zO*JKS!Y>LziX#9a#|bZ)Xqe7ahpDTA&0I@ovRjeNqjOjh=?IV5QZ-^}IM{5r4;zL_ zu;E3vyxQG0Xt9e0&aR(_?>DOb^?LU&VqENGNqR7l9_&mH2GN5&@2Cbe#8LyHOEK$H?CL91aLg3>p8D$QvqB>2Z+HE+?hP2W38cCcAo)X?896f4wy87goL7%{IczG8*<1zMB}P$Q^!$G|m@$7pt5BcO zaH5-t__W^p_)e404;etFJxSl;e9$aHahNokY`=gK{Ds}2;_QV)r^tA`1poN_cU-P_ zwR(m3OIOwO-c|iBsETrnZujHyde-P2N>z*}a=n|;-pKi_(Hb~H=wWZ>^RXqC!D0Qo z<*gq#yvi_)C$|U-DN|9)*fTkAZ*AiyI{=+utgN5j*)NDVd8QW}=`ifAlWkbue%cMo zrQV!XbX>`(v#;`>9qV0e&%z`ZgFcCMK$)gS@4GAC?e3cD&)$&Gcyn-t*T3QY=Xy!Y zA%_RUDJ~KAp6Tynk1pSJEnODF_Udv;3%L$q)bSux`ekQ7I!xDcdK0loFWQq({>$&%OL8d3XJ%WA zn%06AD??B2&Vg4;ImGG7txNvNfgw+v(ywyh-+&QK>WNeOSHf{)xX9x7=+Fx-?}EP@ z0Dio%I$8|RTQ=0WLn@)Ja->D?e!&{uv9BVr4IH26C*vz8fBPb-ao%4~Cv}U(0>#f@ zK8vk>N?q0bK92kL)RZrUE8i?tORYit#Zl?=pNT!QS7n_QVLx5Bec7Wya^v$AjrsD2 z`KjI1-{{g$B|lrX@-8!!Siz6Ls13*46y01EZ#D%O^v*iW_ybF5vC~OkC%MqF7mqOb z@9u?sF~Vu>3qFZ{M4{#Z#Q36hkjh%@u(dy9nb#L zGQAnLTtDs^UCZ&ld!&!d&UbvYIs7b3$!BP>vT%Ahx@Zxta6b2fQz0c7an|pczm8xZ zbF}Q>e_*RM+UA4lMADx*#W(tFllHA06m!e*QU+ozx~Kg59}^S#??r!;oNGd`=Fb0$ zl{STHZ+ItJU6|0$_i6;AnT>>YN@rAnHe0U7YAGemB$<2r>vJ;N+T_&dW`W%ZwS4s7 zQhn66Qg^YoHLmH}eF*8CMbmsRh@M)j7pT=4?dk@4M%Uinqt>piJMQ5^#Anu!=!j8N zdc+Ae?JFjXhc8$_IyeBBR3hp>1+|U}LE`7RQFwFvlfJLZ7;9;1e1OM=Oe3J?D7*o=y9rCqOKY3bn8^&UG)5~_&Tn|GzX zQLeq4gZ2tsdm1aXcO>oEwT0y3VzY5W9-~rGm3Lc{>BGDHnF*VI@mksEH@yYWB(ob# zX*>rUYQ}jR+5s{l-vJ+Q7Sz?)<{Tp@Kk|1B__cxErUMPT*E+xjbB-4q=@Yr^!_J{; z!aOOpQx~HDWPCD^a(+^LaviSd(v8w;O&63eD3QJHd1)FOz18oC;U%T$MFG8-&i{4M zvfcciOg_nHhu|#v35XQ_$7dB)8fLq(D}(mzBYfw;Oo%H5S8yf!{S9ZoS2FdP5Nmn= zPT@eY(fs55k2i%wjMADS@7FAfix}D9DK&+Uiu4ih*aNbzVMrKL|psGdVQK zHXZm+n-`gE3$?zj0<={ZY?t@mnW8HEq%7vuNMt{}Gg74MQIlGg*Z5NFmDki^+Z<>e z&GR~K`PwIApE8$S|ajP&~J5v1azN_xb7d^{7oO>cA~& ztquFbE&zt}H<5e$4C3l9;(|Giu?KJbgSy6tgLm0*icDDif6pRMpeQ*nXbpvns!KpF zsa{BZAyij!C*$oIOQLBP5|(!11s7YmkboV5K-_QLNbqxq%ek2tR)6f(plQ(a!muWF z!~9}M67p=&J`J9$LLuo5t7d9pH759mwW{VGmtr(AY=l)a7=t}HJ~lN#SGw8`@@o?? zs!e;M8K6raVSpy-Sz@69<*Z43%tIR703rT-X_LslZ?5u}j{B_}AKqwu4t*s#K5eQf zH9j*Zx$)8C9ga`r&EDhlWLq#kiT|XHkCAZ0k(%j7G;hspAP8un&dQitc*y3ZSq%eM zRFu$GMpysX)g`_xa06>2awo40!)L1YMDFg-ISlK$dU>yY6WLixuzsLjyYt}!tL)7m)m(tbW6{yLr&9Q-%U|xs{;ZN;D}SGLu%WO{`T~=6aV0vn93z*NZ(g1g zYQ0$~M4zZpieyZ+F&EruhXh^7&%{yhOdPdo;;4U3B*@@!OK=$JUY$CKs)B6D(k;T( znQv7kzRS5}PZSo8+KjmkG@BbL&2J%lm{oLzluy6NpQ$*_x_hl52k`Q2K>{U{bthWX zVOAtl#KoWn!xfhh~Nhk^6o|K^1C!sE5RjWJV$ z2l3RLDxKJ%jZdWBOl0rZkJ-fPcW~U!W+6+}V{qUQ&}0Bn<$iyWwt{FGgNMb#?P2!S zHAnGoT48~A0%swaLNZT-Yzj$QtzYa-t=elst?k`wRV_F2W(3vuo0DF>J2@wN_hj{6 z)USTOp4D^4dR6QdZxxK%E+UdcxCl}hAyPO5^d2Tsu=I^3-tkJ`#84MVWh^p@CYA9J zhWId%0Qw=TN9~<=e*^nsoKJh@a%@a@v_(rb@_*b-*R(r(0Em@ag{o`3NguF2t9$?a zI}tm84pw>Q#D>BGkp%G^EUPKiWr;FumV5uRzt0JbdY(WgQ<(|?bAha>BEbycD!?b@ zwExY{&$%82-tWWoAWymSVM&(gB&E>PZ|^s2VDqATxzA`Qsm9Vc!Rg15maW}9yCKhi z**J34y3U=bj=k13k4cpoHbp!;;UcF?st(SD`{1+x5)qr(CFNGk^u7 zS|Itp8`&Q?H3!Z*9qcrLzZ2xbaRv@%$m=L>U;cr`>qp+JJqoZb9i1AGfz{f^+uin@6NNX7M$9ofcfLZabnD=g7gTbyDTwIMd-999J|Hl zDstN2>!8>xTK3R7p%Vb9sp~s4i2q}?+wQFQH>P@Tm&7M-oJDSgF@pu=2Y+=?(w1MR z0Ft1hF&So=7@upTzgxqx?N6IK5<@Tse@@4GSB%V08pSS|jbh(Uy-)|B4w3nJ$a zyG55KtsS*@FP+gIDP0%3B_A1r%+K15)4dx!xM0%5#u+E*$9)T+Ip0tU#Pc^B+P1K~vv{mT85=1?5|w38r_o$;WuCvNoY@Y;7d6Ed`5 zvDGIxIP=l2%+5c&-zg-H{9-wl%v|MlilSsR7ff(7*NAXzkczs7c=xl)t+(jSSSD_= zlZeUV>%7I7BpIF#4QnSb(UDUT&pL8OW$Cie0)>}{RtD$L zvwrKdAy@cf6+HI|T&v%Q>=)UFcryQtxS6HF+x45su6hzJIx+0x<=XvV?;i_dRcDAl zy49StpsxNRs)SWuYgh7Va~HDL|V9zf^{hgbZ8O`S`eW;FJP8POU+85Jf77 zH?fVSOGAk}s0COH2(&zfK+EF@wCvYzpOMlnq4~FRTNR&z9{PEB#HZmU z-N#i8fBoddpn)QQ385#)?}h$CeC$k)gI_Z9M03{8Sh6B#21*hD&NTq1^#t%QsPaa@ zM?(;1a$sY)ex-Ghxh|Lv;r5molf)15q-X0g` zXz2D-eCg`Y{4B-<2PPd0mwpzS|1ZCvBmSmNMTUQNVq!d4ykWp3sCw6M>DJKvrF`PX zxAeu({0F%UCz>*isDYqs*EC>tHeBiJp@dHHfjw?G5e)etK%e9%o>|8!Mv=8|lJ$1x zY2v04YaKT|4>ETbGHG`(ySG=*96=EA%)M=`aK^;arHw!9i6Xo)Vv&`E#3b=^o!zYT z9^=>hE`Rulq4s`em!ElO+wT_dcD+A|KkcHk9PjPDd_L*?YzNbizkZjtzM5~tC#R0; zDH4_IL;*Y|vVagrj&3bjRGz5qNu|(!&0rP$Ae@|<(OWqA?~zaU@?n~MlAcCN;T_4R z#(usWVJWjXpB;0td*%KEXXMLv$o#X|rQ{AgGu+d_gst zfEK6r5iu801TYbfH z5W1qAF(ub&A3F3CE1i=2!DttJ9d8emDqnX-L}9Yqs%b^&`4eK(cKZVH3t6_$en+cr%MUs4w?i_lF zG0PvJJNG^Bv`LWRE91NRaGn61+fl|1V?e^1JQdS&VPz!tN+kB2=oV~%ovN5YX3Re0 zgjnVNUx8bZD3D83MWRcx0Mc;KUd{fSXr@>{wx%lfJhI7;kQlQ+FiL-2-5bif6%L#C zv9kVkP&)WFMqr~Pe4V#JGTzVLFcM|C(D>PiO9TPSDa<@;a5|Z3lu^bMX8ur5d)d*~ zEp#hsBfIfwhp;rt3YVC5klKLq*7#H<(`~}T*1w_Zp98OEIca-WOb{7m_8=oOW};bRxErwdK9=x^H*8PRTwWw};=6&M9EI7k32l1#439=b;~$qaRmD zKc0YoTqzR5;*d8a`dLonwJ5xe=s?+TW{!bBH{Ipb*K)HlocfvwvzW&eO8d$$kJ7q3 ztI!0a29B6>KQbLL5C4Eu67L(1lBgiLbXB`t?zKeOZms^u{ZFj7n=)AgwY6w4If;VuC_WdWsaE7A|~Fv@n?c6~#sjzW8!$&yKZx{pz#bW(`-X z!q~Gpst*4Djre~>lJbDpHa(m*(5E|nOaOwj4?kVz=&sl`Mc;bU-RZBU)162t-&>mJ z(2FC7+s^fUqtW57HibXM9!`h;&KLb%0R3Gg`l~Z5D_e39LQHKx>c_>d~iyi1L(%@7peKRR_)a>8P$XChA_uiGy|c8Y7-Js1QkrRK7BIZ9=FYW zd*DNgPLh4{`E%ynVxIPELJH%R@6Zuxi1a$p-;kPrck0P3z7Ol@C60ivI^1_(83F4M zMt}arYn40eQbD1BR(Y+m^qUy-qhG-&O@N?*g%JFS@*f?l(DHK+rOrNQApr(g^#OR` ztx{XDS6bc{Ay&jTF6qjdv1D0J#gfkaiEZJ5Gw{gmOxzWs)Ve`%m1a+lA=K>YTyB!D zugv0nAJCD6x${9_er{QBm`54Rdw7=}wgZ5-#qyeP%-RjDnh>k%|AjBufXRTtvlaj& zPn89lg$*3J*3J_oV|_@NLVAy&MVT_)$gfrtNo3_YznXV~^g!bzjWCm&wZ(%l*G?u~ z_$(vf+#xmitiE@sO5g`GMl<>6c+E!Idt!shr&@oqhdT41&fe~5FEq$;LJs4WM{T{` z&z-yWocx(h9sNrl`tpB!^CyAe83>kN-?r^^NlQg06}TvtOo^7Y{?YFqvI}p|6SmmR zwN3l=n3S_}m{Gx3Fr$u^L&YMyzn0%e?DCEHeScFIT>lRFTKO#GbMVt=S)m1MMWx)9 z#|MU1wY(|n)~S`vJeKO_-@0-Pko|zh-a@HGiS_pc=<#$Z5XhAC6 z?Ay*|_4Dv{I!!Vaw|yx0Z}YSe1u2m_B>U=R)&VWzh#$e#v|bY179&Q%J%khWGLRa6 z4y&L1tjTH|$H*fS&ovCzG>PX5GmqF)yWNF`TNgVaz53wo2x;ber1WWOx|fvx^nMy& zr$qS3h?=C7KF+VPi5d~n;rPudy~WlR1f0Q|E|Ej4Dq`V*Ui77Ol_n<;8D7^;y<|k^ zoIWSUH2ZV*(SdBh_HQ7Bjbm%#wde{c4Y=za*CHQ&W@hi|M@iT*@!r7d^{x#X?0Re) z?fuVx4m}a>w|Plc=zH7AvEcakrqudZz1Er@hJ@ShDZE!d3k&b#r@ZZ%!k_ZXe0@JZ zl`OD7z%OJm_BzDYe-mOBmspwABzt9AQPf4FWQ1BDM+XQ!@wnBJOb^iR7MGp%=OPo7 zt&>*#a!=Pav=|Jqi~)U0Y(D4m)IDC`&DF9@|t&P1YLW?ip^ z@yI2%Fg}?d*25=`>gFI_mdCpa@!)=u^7d9l-^`jAA6uQdwmNaz7ZsrwZ9!ZcfjspRTxoIwwT4&n!O5rkz@E zWYENn^*x%XQWWTWULJC&{c9(OoBMy0$)WQA=XG@atust~8B>P{Y-0U7C-n4N`^{*d zmFv#|q1HKk)cj2057noJfluY|L;lKsqgL@y44R>J>P&9#3U0FCZmn%(G!EwRy>_)T zSNG{kUl%A4N4T#_dU)Eni$u2!oK=e5RfQopiCzEZ_Q1E}7OlfSL0lg|UVK2Uig2PD z9#=miQ_FCZDpm;H>^X>Jg;rO@rlhY+qp%BB^1uEbD#E_n!@Fy^CJa`=l4>8WG=UL% z;tuO=>$--fc3|3h)&*@-wTQmb7N_NFa^pJYi5~;et&22)1j5bN^gn-G#JYz!nnwCm z^A*l?0-XqYkhT(C(Kclu^$CM)Q*jYXF!&ykBy_CrXBTXzW0lN~ zVL8s2qMQj(5n44VR<%dU25og5K@J^2r(t!1?-e89!UF*RT{D-gyZ$_%vaxECHdgl|KKR-o zk?)N%@C`HR%!ZptgYKR3yeUj|64coTwp#$eLHdb4=bmM{XZ=#ol;UKm_Zh5ZVzI=# z%GEBK$6Hk2jUR!ARVA$J}LNs5{J-&77UA%v4-E9 z{7yGhLiqr_;nT1NNc;cBAL1s5a&LFikz3GMR z6z)D2)$3Y<&7^v%(?}Eb&N-y4VCacR7IQvz6v;V76{V}CNu+F;v*ZwpYD1;#^F-}O z_HCFMEfif2bft9h(qnwBoN=mA$P57Zd0ncuR~MY=idlT zZwgHgKhk-8{FEo-*-|sVMW@i}x3uZ*{Q;8Yx<|gort7~0o9++4ak72$-aEAE%$)3H z(;YzL(homZ_GsuDvE)z5b$+GyQR%lf>wdjFY1YNFuZo+Ls@IQ;UIa-=Q_t*g@AJ>x zU?hD)ov}3X^zr{eiazD#uSM-SQ~v9-(4?oyu{<53Y`6^Cy5a+9>zB=rwrc4YLRz#X zQY#OfKu8Zcfo}MZK-z6yFw1~9?PdB7<~&+{35 z%ugMob6f_jdjKy1F?OJ1bhaO%Kb(E0&+NCYgxGzxS=+$Aj*6GEO<%I~YnXj;IySd8 za7EwS+RvCQ*a+k(OShk|zQgS2n}3G=oPBH3eje+?k@NpxKmQ`dUyPTFuIz))l*X`i zRl`nC$$Ko#T1cvw58TwEbWqfd zNTPfo3;MWoz3VIvS^TScwNGE}4<1bF8Hzt#HAHld($%*w_r0aY!7kkPH#Zpv|5iUy z3&Ev%<6u~D8~^S|%lgCz^6&N)U)-77n;O3b{e7gPd=kTUz7P6aKtjNFjed^z^nZN; z^8Y}8$6*in^1WF4Ydu1yk3}+=w`wLT!wGZ$)(rydBsZZ~)~j-q`A^!4BK|Mv8S&2v zS1#he{&e#?T+NS#`{QyT?tfL+q0)zIBHgPLhvP!oaBdLskL$iVb7NIvhI}zY1OG+? z7N147m>0n|LMi6(_{siUobo)t!p`%6gVpvAsG)Mjch>-b$=^uy3+HuNf0_aJ55-I&yy9z!w zSA{eUTow7aDv-cm{zANx=N-)=x|x{4t^yVSldks)`4h}ZEPS)xqu%D7M{kEwSu((K zCgCio9miiBd@U>?z}OX$R<5j#a>G;QKnSl1JlLj%ThHy?LY`~k&5KeknBU<}INgYG zhsxRRpL`>EeRKgrD0PSA~Ku1HKad{a*WZrX!kd zGq*S{2*&SW3%5}BL`?Xd%wr*`IuRL*^MOp^?CU{{sy<>%)Qou^jz$jk?Rj|N7NppN z2M#A0P&o5;-lquIDb2ChvNj!cK}BO(3Dhg zZn8GWj#G(QwU}k}uW>wRcaw`c+L?xZuY-_}{?rFT_d%E>?dGIUA$=L|R42$g0%yVx z62Li=#MM3FeEnw*7x~)*kzV0Jz;G9Y{xag~39+f$EF%)mZgx#iyWQvpU&4{T$u4^} zWw-YOs2RkcklI>c)%LL5Q%1YEY`WGKeapRTpQPp9AgGe@`qb^4?K`PoDYL!QUmxGD z+1|E?Gut)nnC+Kxo3ua8eqYCn?b`2S7lPa&elM6Md)x2U74;&`em^MH2}5mifs{`8 z3#1c%N+(=?2xq>}+|^C1bfYix{r1Ia=KJZ*Hm#napTK;d;GP|ydgjdcv4qjMsSX{W zuVvLrrs86yXc^`G_TNs%B$a7(msy~}-`|6qOyA1mGph4Gxd0SjyuoeWy)T#qTi(Cd zFkO$<+(c|TXIe&=7b$kK^t0uGNAKI<8u$e;IMO3HP<)J*i z;(a)j=icdtBWU6X)i_OxseFDnpf zl=5swmlj156`57B=fAl4O84U8 zhH`t+aDL-iR-&O1`Z!r-W;KQ_w!G^A$*ab3;b+I5-`G%h)yzvHrKOFB>Fb<^IgJPS z{tlbn?=U%zBC@Y6o&6%Q5AlL_u?n*izm#{;7)IKb6~DudRf3f71?+Q{mA7^`3}sKk zUigTXTyI3SR6oIc3+4)L+^DWpMCmQRL@}$16C_D|O)#>IoJN*WlgdzE#V+Y^BPkbb z3B%urt?`yGtQ;S_H*)pM-S}RQl0Yh!idi6kuci;hDD5lNR$@r|b=e<$1^NEOFp&B@w_H!b4d~9&AG(Wl>DE%2L#4sy%+|!(eB@I&ERe3{|eTv%)^V znXg~I+I_95s13*J7L4 z9-y0yaHxt5XJ^Te*6zJc${<0mOxIQ^bwcA= z+cnASvbA^DA(Mozj75w1l}C(bRWIzFCMUX{q*mGRa3t3$x!wn)k2(8uHL@gn+Mm2j{1Spjgn zgMi3Cv>I9iKpVcZ!N}5MZU6n*_27gR{V~Ehs-h(wPDOI8YE*H%+ z5EjolSGRIfwmc_V!=fiajT%9W*XipbBpkilKukAWA{@q#)F!4+LjSW6Kc~1wV;hbh zi)Y zhx}0fveGr7)+=C(_D+wc{NA{30Jm|2fD(ej@qQ%!*&XesuHdT?r+jlld&lYI*;fCPC3of>B!P>#O z8b?a#gWy>Cz1^$QgXJ1}yzmYGl}Z4zeWnY$P6VEf#|uByJI){O*O)PC(^Jfp)c=fC z>}`4POOv0Bfy03T)!|pRhF|>)$8+M59H_p78&0Hujvs3TdrE1Ic(YQUv1L|8pw{Vk zXl?f%E8smg$x?GMdovgZJuW&9sJ<7uD2I<@0b>TS09r_Sk`KH#vP-ANkM)E3z#-U0 zt7N5NoZh)pt6aOlLeak+)qmTx*PeaWYzm#VypFPpAV ziVdqJy@vQ}B|;*%OU5!J5>|bhVb(q3>eedH?9<(KpOVI!@0)Zedb`!z14N!Srd7W8 zjw-i$`XJgYkI3C_It- z^I<`Lt-H%fdE}kez0pKy*iG4Pwo4aUqGHA#3(SkW=_{Z5Hm~!C|LtSjM^X(n|K?%A z+L7ahIO*-ltFK&kRq@GaJ*O0TcN}49S^eNZ*OJ&L-#hD#^yV}X=XX8$t?M7X-TJq_ z{(n*bONVa{{vZCI)Zeh(`p15K{T3fs9iLH9z2KcjvLR2%X@#$q1Z?hYBI`Ww_biN? zwpxQaX?qA536rmzIBTZssj9>kg?ZJbhZQywO;cFdwKy06+0Todaq%Q`hi_bTh~^RA zHjy&%*mS}K`-VM##xfO^x4B6jGQfAzTDXXJkOO+Iiywq6@RGW4nX33%1y$73X5UgJ z?_a~UreXUewln&_{lncIRi$1ip}ym}7@t?s++8qp7yjPR z_;$N)8vf4TfekN9-L-C^#tY*%e&Y^;yc4-oe*@oBzkmp%2$gGyiiAB_XX`37$gz>SDWri%D(GPdff`g0SBb`(^y^?Lrx z09!d?X+>55SP!nT*aS>FrE zY$nhtjD7;YFL9O!btMMhO|p?4Z_jmbF(bKR%pMff`eg>B8US6G?xU zylo}j#INy&B*)4hMem~njFJv{s23%b+~T<8>a9Dbqcr;IJW=kJ*jo9oHeP>?PVsBm z+6<)E52#8^$?O{Cz4O7}@yGOLnzSlnOW7AHJsa&B%JPdJ2#35^l_)!q?Bgedp17h6 z*Z#j6LeZtqMz`*LO#(t2hSkTgaF z&uH)beCv*;Kl3kkIQjTDOjut&E}~&6R}AuYA7?`J`PnX_ zsa80hp86oq`)I6vaPtkML;%n_eNZ2KVCnheXBJ?=7kLNoZY=8YG26?|KH8ftxF++U-`Rkwez)#(=0GZP# zko%_tdA}6b#E@No@1tnG?iHLxQC{SpCZIuylTnrr$gQsleFi%(HBAImswq|MoPFE5Gmz-6Dse(L0jZ&d z*Ycn$eiAeA>G{e zEO^b2M%;JstUW+BlTfJjODi%nzdhXYmAnM=FlFr#X=Bk>k^`cnvF7Y2Y8`UQE*g+K z{ME=L)eODA$AG*ze!By5>+pB*XC-ITz`j4v+MS?tD+S23RNL7Zh%WDyVa6YmS^XXkT&enk+8;jE)WU*aQE7^FQgKd@CQP?r1nb?e*m zc>6X|9g4zu%p-buEHsZ2bqXEBmt7Sb5MI#TxbF=~@!t7k?9F$s)|eSf%jZEB(EBu63hzzi zHWxEgI~lz&$y6+YrAW)R#QVp-@93Xs0Amsq}An!Np*lP|PIg}ry_B)3{qkZ%{ zcqIGbVK+Z!A!GdcaV5>T#fc8C&{_Zt?eW|n&!ythmDgvnXNEngQbH(Of_*(#Z$NLIxBtU0Q_!AL+BvOjSeiOW(9VBV zTs?xtr1kzz^6>E0;Snq47_JLvehkI)hGv;1iTCrH;I=&+8_Z-L7~`NOzrg$3<1Z5- za|R02n9=j+WL#VwKbrs4c!Bb7FVy;=-v{L4Cqkl;g5Xr%b*vSw?EkTxKi+%#nBx>I zr$n*CJwmC2cfKoJi(4(vX^brYBFn!5l9V0zjN5r?7x&uthDg*i!BXp;{2ejSkfH%j zO6c39;%llcj;2$?9E2&|$W;L0Yn&d?r-|&tmSSKXV%ILwcQS);!!V9XJ$Y~Hw?)A} zT@mc>KKoKVTi^9-?;`?G3^bdstnW}M>Z3q=TtyQ@64?$k`@}a&X}5MgyXKXTESzxD zU0~gjKV%;oemOsAxQd3of7a=ioee8Nt@o4yU*MUm?N?{(-n5WJ-xnN#;|2Qqm-DZ1kSp#|DV5PBl7d24awWv+elZ)MIyA8pDkZ|-ht7{K4!#$&>XDdhNhg>yiT zi@w!Q`v#()_v7$*QvW=aM;%?qz+|_cDOMVC8$Y8qcPiT)^>+1F<+&ECquoBSrCqx` zCE|5AL}>TBKATN@UHd68WJL$k2WxEYsCD5_KME&mSTygDaZ8|?a#np*A$1@lvi>a! zmWTJ=92x#`Br&sF8}8PH9%Z%4o0ZD&$xs)@ZumZ`+BTd&}NqA`zc zVvI>BCe|#6VpTEoIZe)LZA1P#AfVy%XDo*9D4@Z?n5pkdJ|I2j0w8RWC_fy-phP|a0NKf6 zQ;H<#iork$utI;@YtX%<8mo*XUWrEm0~2JQohK$PTvO5f#lYG7a`h9g_P%BSR}XgW z%HL=0zJaS%m@0p-F5Niql=W{fyh)a+NkSO(f)u@#Q7H5jbv}@muuJRjcXIEhxORxipW@z-MxC(bq%oJ=bOK{_ zMd62G823Z(vX3=PSMoah`rP6S&L>ndLGNnp?`YZTd9t?m@cI)1U~YyXE&pi1O(LgV z_G~UGbwXOHaaQUMztmse^GoHPYNeFgCp&DVSgL?+_A;6w&$z&gE}?H45>q$su+>>UJ{Nv7azWa}Ns9`+;EmB^l6_#ncq*LkZjDNjN zcK#4-WA06>sxzOr%wQSKkZjZ;ua|cHJBz z78-{E)D$k^hIQ-4XL$dpM>eh`Qu`McuM(;PQtYgvYXR)~HUIk!KI|}S_LT=Pl}V%X zD(1ay1H}+%pc1(Q&qvwQL4V$W$pmjK=$O0H^6biM=5QVl4Z!a1vwu(bKXdR$+^0j9 zXYZ{~muK(cesZl~RLKpzJpr=w>RzB3m_B5A&{y`XVc{ijWC6%dV?b7XFwIWO6h`QG z-Z{&j!he$CJp|pir+R4p`>tP04IMembYHg^T8@1Ee1y|~XF2^B%7rxP&SBp9hdBLr zhSPt`^#<=+_FqcDkdvYWizPLT-G^YBM0Ng8Qr#8)$E{4$cssA`-A99Oo)2G%N`@ih z*WNTTKJFywAOYifV}|#A0Hk%MNE&t68|8ZP-bD^xhRwup_FsSJr}R-(sRJu77;NyC z`0#qSt?&WutV;vZ(f6%^T#CMLY+J+mWSQ=9>#4cJ$#IPZ}|n~tt5T`k%=7Oq;kp@QOt`nUz9Fy94Y*L{zt`3=?pyknsS}; z;*0yCxZs%tYe6`AU0z0`Oq3ZH9+9y)15H5(4xKqy9KZ<{cD%SAu9#4um(j8x&5^Lo z^IrakFZO040L&+ALK_sKWE*s9NPZ%fy2MKDT@^n*hx64aO8iDd$$a9+m*D@;3$Hj{ zb}#K5Uu3_rS&-FwZ#qYZ=e2v+{m~OyF-#JW ziQLQQqZ>{t49+1Dswo>xKi;4Jl+Ny{nWyupz6F>Y-{Gn8Ehg$F&rap(=MOA|Z|ccP z@8oBI1**z7iO}xGAUX%6YqUQ)KMm>cT8SE?aZ6sDy_((5ma!5a)gP?4N^7RQ* zA5^)?5jkaq?5&6i5{>DIPH&`@*n?}NH51y33d1u@Fh}i_7_t-D;Z02bT#6-hm4rZ|DVaYKDW#t0c$Zr;CayY{2%`*A zPVz9*l-NmLIsD#4%}Gh7*v-=Qvo6!A<4fLV;e7nQtTpV*!?m*}hnKv`lgeFlkZ)+v zJdT!qI$J2%$E){2jc4tv(~F1*%L~V|cIBD@ApvPj#bV=kb>h&sF7AGpfzaW0YrS?Z z+pQNVs`2h#whh5_o{$m%CZ8_wVK1<_Q(&K%ggpyWW155gKnMF^j!&IC3P9GH{6G6g zn7R1n?m0;jyd}(UcTu+#gTBV)3iR_BfqoJRn2Rr;AsW41L8j!`gfjR30)7L7)oE5RLD zh0!Ke%WGA}hvYX!JNQr|SFSOn8?(B@OWw_*qEQeD;r@#DIS(9pJFx<9oAkzy(uqNx zlX$i0!UD`pMVhr)1XxmFtwVL5>TJu#pC$3kYF zYt1GJJ7W!;qjH$kjaPvEUY}TePx2G*nAe<*9u(p89B)F0j{#FBd(&-jZ~QefkPU(T zexU4j0^+;7KMXC&?|vSTv%Om{rk7D^I^K+DG2@?;8DC%q{2DXhR|l1*{W|$`9d0SV zjavE5aQ>-Jb-`Xj;i^eks|OJW8`^E=a=H>kIjX~sy#@J4mWS?GUf#NyWr^4tpCEuz?-piwHh?XkpWH4%JeqlGv${E7JFwh+?yM-FkD7}QilAb ze3v5lCrh@4S7|_~QVX1>Vnna4&1i^+@{g7zUj@U6gM_pm8eJ_yjR# zvg=*QsjqVv3u+}3l1Un;$JWu)3pjU;vPBx!Z7Vpkn{a?WE0|E9*0y;PP>3B_z#ltk z+biDW*q}%w(gP|ngy6_iN8n6MVQ>FGq)Q0(ftjBdossm2^>4u+SBnxIe@uGj+wsTH z6o0@5F8`9ze%&|chY7xf^%ueXTEt=ZYFuM$ybsS6<@)b6Pe>BC+o1a&CB_`)Gfb^& zn=Xdos-e)}@EHabdCXt#2^i*;?>dIrW79Sa!*|!44rh}dD+b~`RT_DSK23; zTBX_Zs|?Vne*RAY_3AhDMZapTFZ#XU>Fv<(gWJ&Wfxhg`3FJGPKf7>jf8EfCQEd)V zz5OYu_614xe3R;=wI-D6r8H^2?d7-Nk16LR`Qsq9^eyI(gH!wg?bzBpI+SsUM8jTq zcL@`C%ZN>jM6mjFae2M}G4qF8{r<2r^hm#o&>bDhLBtAzZGl_ky?nMfL-j&h$Uhaw z?qW`%4i2S1o%W?L6^Sc~tI)d$19M_&FP|$8;j<_2n#5-lm`0wvTwI~}=+8OwhlxZ{ zWG*)AlsvxtIiRYB{3@mtT@qyNszdO_IN!dN4jC<*Wfkt>{o1M{N1ROxuEs~3 z#ls0Ep3+YmPcsn=y&vr8-6kBmRvXSlk?7q=p(r^sgsctntwc{-LzULo#UMhTBKFvbY`Qv+8}-l`Si$HN&MdU__xFF9lNgeJsC^L$h6>3OV+O&S}bM zyqeJ{zvKu)&Ap9_UdF?4$|W$T6hho}Bui;sFR|0#Zdo8{at2jJQ#d-u&9`%yZx3sS zXFD1W)L#A$Z^}AjTRVv(%&;_>{k(XYTPC(A>XZi5aV{#BZ-{6tOPE1^yVebjf3MGT zyr&)uM&-qAt*~z~KD(Wn9G`a|{Wjw>`|x1?!?zS>s%Y2^w+X^9QX=~+`kW@eqi%ak z5`;?!b^ieBu4huxVB0H$KR6!{y6#zjv8x}G2^WZ0d=O38^6w-?K}l8g&j&Q!)N7|# zM!sT?ysrDzn$=(C!=I1;1Nhek@SlSHxQ=@At$zG--d_$5ns{4rJ^m|3A*KC#BYHF= z3d!%fbK9P|Cu%=*W19acUlc=LbEd#{BWPQp#4y{9=vpFcS)eg}f2G$l)lqbjuZ~a2 zfo2zu($WIE8ae)z6PoZ(7vWjXXg6ciEP|xPInd~DsQAM5qgQX7{&F_?nNmpWdwn7B zZyW5Fe-qgMbZQ^4uPIK0-CKG#KF~hE&i3j~-yX=`Z!DXW#zR9)|G(M!jeknXZ`(kH zcy-BS`y7Hi$&>!p13ySmt6zAX^5u0(Zp}CRrTL$}_^U8!%X;sQq^G!{@;P5&Fsvqi zHmx_)d+0Rj8kKB(xNlE=&qr`n<2wN=99(V?>7RKH&N$5w5@@pCFMsEc8S$w@14-RC z1v>hBo9IrT2kPa_YgNKe;hsc%e%xHO9dw#R}hoUEP z8;;-hFkdJJs&kU=6WOEAJto6D3^1Z)2dYhNhjyTobZDxz&V1pXpsp7ATM3GEU9r5m zgX+k6!}EB!4mVzDsyrKezfeL=ch-+wWsy5+j-wiX-KWpNhq4_1 zu}w7izpO5caH(Pc%3$wIt4$f6a5N_u^Zn?-dQGjXJGT%bp(umWHP;if{^X$YV1F#B zAwD~_qajDXBRd*5xik_l;T~Q|XWoc&VEG^DwjChJIpzOa!J2kdnWlN$G0DuBf$WF$ zrXJs85yETzmAV*A6rKOwUKGF9AGWylhlNQc^tooqM)U082D+2>va0^BYVNYVG3&tWgl->ZkOkFe@>a{P+^ zctFT6``3m^)ro0^nbiya)%ZH2a;<`HV(YyLyFi0Ui2K3-ko%bG%w-lkIbPX6kFJwf zx${djT>%7R_4GO(_CWf$y6Mxrj@wxuRea7$Oj9?+*}MAlV9WatBcw3jaNKdB;qI_s z_C47z8`tfZB^3L;r*I{|%UcVd2N`_7!NOfWgMX<~#ow^U_qaX!qLS3-Sa$5VRyE8$ zFwSJH&)SrG?p{nO8wnId6BKE=81y@=Et>$rkJ|5M89Q9yaw*VOz3PH8J+%pu3A7|V zk^X%zGO!U|Tp6#(>s&&>hpMjAH;L@`D~Kn%gchS^)6bG*8Kw#xaI17_-Sy$^I+SMf zygQdmM8Vtct;svLKMRFD*)t(wivU_t?ytn&;~I@Yz2TgOk#q=EM-zN}W?5yY{>ps_Ym29~JaxhAiR?4=;y=G~FKW_WWSq&1P5z6pULXO4q)Sv{ssExpXy8^o z{k8wJBzXFHEl%tWBzut<)Gg;T53%Ggr-JFP$o+XR!{M>-6tU>qP0S z8v2{^iO>E4MDg5V8lpec>g(x2mBO}qCV`@kC~Dr3%riD_+5w~-5!%~V&wK6d(~wlf z@3;I4+IT2@RUtqGs`Te4c<-HVQ3nog8);Xs8NGbFhHtf69n_Bwz|LOR2B#nu1npGE zPDR^sZE?7FanN3M?D7)tQ5N3SusTp38&?(EsylU~8V6Wa>~q~}6u70OX9|UQu4(C+ zLZO>$T5^zcU8HfgG%cuuv3lmO#~mZYv`*Yav3rauIS!zN+$!Y)UJOG9coV|0wtMZ4 zV+F)zc3oan6`RiP(+3Qzv6|X&taiFy3oa^Y(zW2?nuXm~gNy6>s#sIaism<{1VPqa z$r}xKWvuxfej6!>ii6 z4)(U#TD5x&^(wYP9Aa(9Z};1PCc;JNH77nGVGu~^QhL4Yo_^o$Rh3j;SE``4idJBpdY<^auHlY)~iZxZ1HjTap9nmN11)IBymvb^) zd#q`+x8mKeY@k;fWtiA@opm)O3&rOYNO39Pvj()~bERtxt&y&gQ^_tW*>{~63=jq$ zcXJ96_`4!}PAD?Dire#}h9<`g_8^&|@w~yLZ>Mqu{#vW!b zh$r(K9Bi;QST|60Z#DsoX|~YX?%K!O$YOhNn}A| zdqvBZ?q|C*Dj?)M^qEO3^nji`t3Q>Y6IN8lD#l048cy+<=NVsF=H>r`BApucNdK&y+Pe!%LT7<`D8?@1{9m%DGR5 zRmTW`H03sl%|)uObtmi}fq@1BGvtc`6WLk7sMF#S3$0r3rD@VugJB3hd)#j`*~Wo> z8-CVMtd^4g{X_FxR4Ejvv1y)@pV5#-R>8p)p(o3;ydR$0-R(48^|zIDPLCN8_*z$V zPBCFW8eG#xo2bDqnuCjWE)dCjfg(Aj7;kh5R9G&i)jM_SPWxqVqJ9%Yc6w1xk|5s@ zGnN`m+~e{OC0t$JPZxA|OaCHT!k7y1H&C3$=Md?5e2p-MD7(7Yt7SD_q`#t~7%)>wL)G*%L^GcKdCnt$PuN8LTBLTmR_wi!2qCmc)^j5sFdnTtO zQ=}iTnwbfc$~XjbZ}5;WVGzyn;QIC&s7cA)jCCJdYc; zBu0jBk$>r=_|yRuU)QjIH7PPV9}0Nhq@i9Sl zrz~P^B^b-TY)iMwdEyWIHZa{P=WkH4dN^8bePOomTP<=)lqT2Ve)@e6kvl+ZS&PZ;2I(O|FZUt*sKr<#{`^wr>i#^4LqUx{9HIbu)-w7+Zu{->cH*#CcF~rZqV-o7E9`%{9ay8XtO}HP z-fPLK{95YNI+izEZT-z0@9cy(5dFtHdp`+&eTNZ7JLs_M8Ze5>wti|YT&ETiV;*05 zG&A-ZZ=vdD^zdG5!Mzt9dAXo4<#w`R?%cTTs$FWFoPYkU6#i;d<#f7VCq&jO3Zn_h zgD=Pama`7l_L)hX;m2w@#T+>-A*Z=#5BJcPom2)y8p^2Z3+QhRui|*ia z^xHP^x%f|`0L`c zXYb|H9)wX|;B~GsicYRX&IwxRT9?9ma24jDZIje@O0#F-r&nWce3UrGZ==A7ROH!; zIiC$ySO=z-4q*~(=X(Q}2?tz>zHG}xRPRJvMrZN%44T5r#u{EC`|iE)t?r4d7nkQ0 zN|l73elvreGN7~=`@Hn#|4?{l!6GIt`8iw+wqCmUh3Q3D1&%`0~Vd zBhP|#QiadU45=pPj8JU{B|)U}I3g+L7M3KFJu0Sf*So&#?wZnfRks0yFHpBr713{p zKb)3!jT+e>aOanjZvpxB@+X?i7cj-%DR*qcx)#r9f?q-0#ho8)%gH8Rze)bHH_dUa zfDKwhst0aO@2uOmY4?AV|7^SUZ@q0t_4}imC#WE8jZYwD%|6gwX*ia}p7d#2bsbbF zfj*pLqxOoej=s5{rlpou%^Dj5zH&A%EnqkC#;%?55^U~b`~0ZQ(YN<&XZ!CUZHgVh zNHEik>Ttg>p`$O+cn|(kYbC}%TA%xi4ZX=|3Fvt4y9Lbl@v?vNT``->e+ke@0qLZJ%7ukQ7GuW6zhg5RYv;PL)_IkZULsrgt z5(VweWuKL4GC0H?LS7YHQ5Ack8kONG)}F9+Fg9Z!rJnxm|D)|);G?RpzW)S>MkP*A z&?rVjO*ME82$-m;0Rx^uutBM!V4G^i;H5^GU<8YS3Cb`I##@V*R6AY;u6 zJ%rNgCFKsWfnl*vOSuyN&?g<-OH9JuD%t}S5QxPrQc$~R53Ww{p52#6w2qs9!S31L z4u0KmHcm7JVfDFpq3xHvY^}7pzsLiHDt}i#@~MsEpO3Q2@l$z;+sgHv%p0zpjw+!= ze=1p(^FvKKl07f>xN_#SHxKeRzWXYch{;1iP8i=+xs@>c-InAFTI%Y+9O!OpNi z@5XpitFZ$qhIV8btJY-R@{=w6?wlL6ViW0bILE~}uh;Br7Ck#OS*NrwIXMk1Ij^66 zzyS+$)m|zGe^b0ku-7Ru)bm%L3u!W8s?APmBrzFc4$j!a6|=y)7apVjq&wisNRf|{ z6<%Umy=gL1y`Kz@d{R6!rgGVoWP53~-{51CV+O;Oy^ECglE^D|^>5GR4;lsq{nh3dYldvT_6M`hSk?{ zq@27BDh6a4G|!5}4Ph@7lUqeu<)UXHN`N6on|IHICv&LO86~V9Nq{rmtzFCU4_K^F z3C(KvnN`PAnVujtX%{@vA2_Utui8mt(rBCTU0_q zCyD?lQ?y%_ef1!VI&=Fg`Ih(Qp5^SXT>8&fJ39zjW<}y94n#M5;y}~QmfDZ2)PL+` zRY}OB{~+f+>bSVFoMsfq73wHp!k$!W461k#3~EllkU>qP{y71BQoVL%;4u2UIH1oW zjdk)6jg^>On#&q+p?~?KZor%#x4IdZmiu0>(Lz$VT3W~H*-?{=l}zSMaQ&Kn9R1o_ z686jgZn{^~ch##5ww!#`;Wj}ZJr~~$;V{n$1wI%pvFguvMd|ZdK<`POute;%S<+&h zFFWFOP-aGvf}4~vS^T778gAi8GHFXA*n?`$HI1_)&+4O<3$2x*b81QtF)m~D*LM+S zF{XwAtVHAt)cRDZc5UrP5@T_qtDP^i?W@%xJZC`+Hua#tiR zqUu>tYl<}RE3!FpkjN&Z<2dGoed7mbmJfaRQ9aj{E|J}Y`s4!e zlHog2$z~G=o$~9S_N$GZGPqBaw~9)w4)(FPb<;uuGt;HLRLkNZD1~#etX7W0v|0l@ zH$YFITEEIu(*g8i zh;&D(!#NmkF12*};XDg%=2!Ncf;!Gt9bv-K!5bKCelUSp4z% zl8(y!Im^t$BSTpZ@J*UZ?*JAVzn(jM1l ziuq@W+JxzmhLXj>yxFhYUE&%nT7VMc5XU4`z~>;o2@Ymn3UCPAU!ED z_sv#+{$GT9m%)qAY5?f5s&1->^SAf)D=BX`e9Ud+i;EV$O^+PXo-EkT`Hq^c6=Ek) zXSMy_QR?XzKH}1Yqt%mbc3iN(+ie>=-TGBfv*Z6bzvB{==j-xqIK!=0l;`PUYt8{1 z3}@~F4ae~wQ=z?l|IC(6AUW^YNz^dX)$sNo0)SM8HMju+5YKAZ5gsA2leP90~c(ns)bh`BZQ#)`tcXcU}PVd@nA z$UZS0mWm=Fc8&|<((E@)a?fURCLU8jU^%iQw^)Fe%(%rO9>guQ!v!=4XUxxD-@(Ex z{USW6gc?}LuN)i0>_V2c`ebzgVb?aIKv_fHAfs>93C~sLJas(7t7Dj|X{gUN~T8Q1iRI&CPz}e3|T5|I+L?lkelRQ_@Ou8jiw;;3@T?u`cOxfF8Q60=fjL z(TQ^!bgxeosdH?AzrQ zf3D+?XU{No0SdI0(WcIIc50#V-?04bbCic`NG2UkOzt{ZDeunycI7XkL>M$lC|4Fo zd1)Srv8wJ!$Dddfgt|=e&n_Uu9(^W9Y##59=GXSWX9OF3`}sqed%8d-=s#8VxBBM; zVqQvli5`|VFLM5S@d5fiyHo84P5CQPcRPL>zEW*7)pnfAU_L(YzNv2fr(})a$};|- zr*S~g!Rb;p2D0SG%U_MmK1X>N{{`Xrv)dc8P>qWpff8dMYvBu;ADl~;8)-AuD7LLz zWcCEj1*l&XqPek^cb&Lj&U=JQAh!kYB3-@bo5XVcYF#pvufX~@{KX>UX2k|_7=ioY z!#0(HiuA?rdz&^hL@%`y{z*`!Mf%ls2Elt-@UDXTUcs*iQ7NBBRARr(F#BC>v7PDY zM7~#By6dF>Y+n@$AW0<}p(@eHJfeScf=crFRV9V|`j3_(uCT-}5LgoEYnG`S@ds-i zTw&3uW&v=gSXG4EQC!frJB-()47Rat-6L&w$P2mWs5;K^HA4nkC9loBY7)6MiCW?g z6dQkbVMmdIo51wr_E*YZK8=qvSG$_f|t$ih|)+Zz`bE5mVJ~3Pm&3kin=Ui!rLt`K0 zc61-^u9`<&I}FC2@GRS;)~Z7fhfhRnbqVV!USifVN{chL^6S=*_liGUX9;Es)&|`! za16Uelhjd@xY4Ib<)gPJdkrMW24=!?! zv<*?7L~(87Wprh&e?ZCCG^p~aJuGu(skOs0VVNMBy*jW2Sp8}~v{oH)t|gZ@DE)atkhokewBd)l4AcKiO?7Q96Z~Q&y9GFQ>^P zgC>;PL)}s$g(-5j4RI_BC_N zyzgN4_&h@3HiXfocgei-ew03z(0vQ-pZ@A+-tP2&{U-(T%CvI;b@_{_gy#ZR??lym zmrMF$A8YDRCCwwLU5aDA|IAd0d7e_0Tfg4?*6|umAs9f8?6in9qTIu}KWX*?-*;>N0Nq zu%9>p#s|l^cg&JyCav&CE)aLczHRakmLA1n9+ZQhwTllSORb4SeTyuH4Q}<2@SJ0# z8g)nZdbumTRYXZG(XI=m zPJgjrz$HNn-@2uOvoR%;{0F8wcNIRGyw}^=4}GAE#$vfl0ao05h}*Ke3s_lUnO!;# z@Q*Y9zDqMVAIZ++=&l0x*Ecf$bfH{tY0f))jiu5Yf5TIqZ1Kld@V-PVoOr%EMdudS zFKbZ!Vk>azgdy{;K@r{>+`wxJ=pvGBnAu(}x8GaQP3u)2d%EMxr^hy85H~ z{e2U7(PD>Sb!Z|e2W>3TJ6qhQw^qG-uqbbGno6oOL)>8zewD%)!T>*KJD5<~)LQjx ztKl%wpusa)oOd81>`?0)g+gKIkJ;=9mnH&|#MLvw&Z=`;a+g^*gCjRQ<*H|qEn2_@ zk;og`O^%C#Vfvwc3PZ3)8`5CDsj#CR3&9HO^WRRQ2q3?9Y{!J#dzS^&+nyT#&Hh#M zZ|q9`r1_J4UyeT&QtN+vevalxu>bXbsLL^t6|J`S2UBHvcs)rq@VIlgH>d+2V9f$dqzj5Xp z)C8^t@D_!#%r*jyRSh{{N=^}>Da$xOAyM3qH-qToD(~N2_cHP8ES+%U8B-~4+6QjY z5q-Hcl^}yP*I)(Goqp(#GG_L<_SZ)<24hUpwb{cn5?u!UA8N-S8!{%-Z>J{|rmfgY zx(K&3hw}va76VRJ@3+uo2kKRN2;rxuiP#tUxQorRdlAI^QnWn1bM`G2ub?YS4-)yk z=yzXBIY_iZ4ocBc>Pgt!s6=$H!qg)?`QN$pZ;byx`EP~a;C$6*VI~3pvxx))@ik=R z#a6*<4r{%D!ECei#liM1)`Ut==3UlCywyefy$%cuVnmmkeF2w(2d`hlu_3qhH7MJdPna`Q^W-qrq+d2aT#JYcjsC7JKSgq}M6= zdbXN-aYQc+$iZu)b1o-~FRO*%HmL{Vg2Q;Q(X0;oX1Nom&q(FAXdzu38jN9G=Q~7V0iL>{-&9o*x`aXBg!5* zwh;4GCi1oXc8q|%edkLeyAs8R>L)z#)w;VxIg{=xJ^^K%e=RXzOssQNk9}2qzjDD5 zV2dW!^Uj+Ep(cx`E231=!@pr)5k}rzmwx_U;GXn)|4OCXl%R4i-8NnN)4#1t%k&d= zDf3{*WuJ67$7S!oMlx5YXCJNCd|ul%6Z1t=g{BZ>Tts-RVj5XM^*vp8$S?`Ln=)5ePa2r2`H-r!3t8U3%Ah`-}W0NmehiPi)n( zUmd+mIY)BACFmLFe1-q#pF3Grq3P51pvpjgRtLmn#QQ_zRciV!l)5Y|Isf_|A#00mssEbsi(Y_@5%5)l zzD01Lhzd{N+fR6^$kKz${9(5^6qFeUyGgSgB5n{(lTjXbLQIhEs%&;=G!MST+0w~A z`#t1?CoY9y11~$scw2QRaROh(O z>4Z8iQy>oT_NU2f6te(s?r!L2WHm&R{>PmX=6O%Jq_=yKbQ(!t&l&v7CVms8J-jPT zO!Ggu-}7gA>G^NnWKz5N?oK4od^RYsAMXu8gNf(!EBbnEU(pwVTj}_lYX7Yp9eq_B zef6YrO>x!OxGW+!&`Vu$*2~@cXcsA%Bq~=B?uT@iWESyHZ#N~xEzk2DU z_l|1rMKHkz@a0v05FMEs$hVna?J+YxnN7UO!IuRe2B1IeZ=deJ=oQqiz0_24@Ydk- zKHxX?8DfUkdPLgV^pq?(hp*Z8eb)u&V$}G<2TfM7imAy;W5( z+Lf&uZSKle$xp3VN*G|FLUJ(pkKu;KBgd3=d+cwlWIwWiIeUMqmq2qkl1xq9W8l{Hzl1JD9@E{AnXAjOiDHywdINN@v~R|9;-+fRTBmMptVuQUQ|yf6ud!$buixsjZrip<|F0kryGyU@l*dmnkDxccVlQur3yf5NYn+)FXC}tSk=Rtm@d)MqdFO1B{@7|@arLg8X@lzmB`*<@w}dzH zMuQU{rF-t8Z?SR>?($izhI`uJ3VtJGXf?dOj|Rtnv&`U{GJ}IZ9_gPwYp0RX{audC zB0YC8Ape%LH+7~SHRxpz1zQWa1>YCiErf>d~4WmhVL zoLva5|1zg^q%&DR7pm%H-Y-uZ%#Xv6zje6?t01m4n2}`(HIHQ8<15&SdXg1$-@;{% zU-S_6+K=uF?X{D>JUYkk!8r`s4Gqd}=vvoM$*vo^`kyp(>aH64{qJaKZn~iyHFW#u z#>GGW_t6Zb_|l$m@i{K(O_#K%lA1~S2FCvLhHql*6<>Gw6MBTLua9%f-YwAdG^JMWo0=Q!_qMV59F)IaDy*3Zdm zEb;&+CCrSTUADMkCHE>EweF^YCm>kkj zBC}%}N3u^hm#g^-&Q+x8M;U?t#h`X6UVfJGOab|igqo3w>H`H%Yc&Wy8T0G*dA zz~-jp;1qyFetszKU3Jp?0!_iu{P;eb%R}@_JcxkA;g;z)$%ZTcutzdE{Ku7S$A{6c zo}b%1e>7j$GuL3ox&0G2|F>Csl5~HLOM25KU8JODm-K>5`fPWS&LipTSwd#ljDO{X zZ(t6#vClTlq#oYYO3ARf$l3*OGZ(p-rCrjLV+PJ_!yoj}Qzt=3nvU+l6k4zoWH zW>4*7`D}m?#*2k$4==naS|xlral^;77B5WPpuxrKxizl%^Ako`i`uBIW9owYiPH5w z%}UV$6LPbSRmjIrjjUGYK`;Y83JJ!acuqhP?Ww-sW_^jLJ;Z;RP`@{$31ZAEvXuHl zzu;Pjf5n&sbs$**tj-eTn7k-pghwalEMQES#|ynYJ!zU2`8VafF3D16(eUqmV%?6Y z+tWTwcl-Be2i;Cx5JsJMu@9sAu|FeGaOV_@4S!=e@^$mO^vI&w{jK9duFh=uV6HAX;NIoq=TbBfJ1_4n*-@C=<3x%!= zD_iv)U0+zwbzl5jnRo6pWU%F98+o4|A%B?uK{$Nbdi)0&gPO~yIfMlJS3*d19as3~ z=I;xc@s(&$%nU56!eq^E8Y#+mdVobfYg(g1HgLnaS2tfxzj{{_8hPyNreNjI4MHOi z-iyN8Qw9rWXHxkU>Ko75QKDwS<&=-D{^h?>wZ^SyDZU|A^_p>zef|9@Xc3~b#*uF4 zSH*ABBVZ{pf_Uj81It(4Ac#p@Lx^Y;h5oH)1t5`LU6|Ul3qaiX7iY%L(3##86hYQW z*wjn(j1w@9&l50U_i131`6sqHU`X;ej|UP*IHky`?inP_zpA4+d z?hrhwNU|~uK>PI&fDX?BP_=(x%mK))<8Rgy8rA3x)r1nXO}|oXdI_C~>3T^_0Yu2- zy6?(92mF0<4p$~83W|6T6J9;~<#hbJR<+c^lv3|3j$Gly6T_N`Tqb_2qZwizl6(i;RNFWBnaK8>UG zLI;9B?3Yp;3YKn#WVPq?4hMnd0sb{>ed-|&Dx34tNX z)F%D+{9&xm-T6pu4@=+0#NT#{2)Vv6ZT^_pKJ$x9H?G+q(}^&e?DN0#$T0nlqtvFtJrbAnpoi`=s~>A{%wu@Z-*Zn6g{^ z5eY=qs873yU|vMB0cV-MXB?@a<=Lrepr_pT9yK=h<4$a8K+Xz4WbKzUzo9J5Fpu9VjyXrkQmj2^F5JIQwkIC7zc2F z{7ytM^NZV0?sIMPQI!3m17~wdn0+Zo;e5KC+Vf&=(sF&M0bv2z9DQd)LaAC2E!1yj zr0@L=NtFqHD+YJ>&j&lbV(2;&pB~2pi z7WN11CYjyQojIj7o0X&h4RM+m)!_f`Y=M*y%j)kB-lxCcR~t!MOrvECJk@5+%;CVFWS@hM;hy#VdDxc+EbNileJHuIRXK7)b!AeZu0(e?%y*1uVQCxNuqee9~1T}rW@x6 zU+VOlv3}X_jX(BN0@-ZR6Nqx)zta8U!L5%|I2ZECi0nh_;<%(NdGZMk0fgIr8Sh(j|%>8;ij~! z!~-*YCYd*X`ykK#{{2@vK2YZPJ6h>PX&u!jwIh$6(e2ZxbDL{p)AO}JOBSEg z2`qvk9ebb+DMv&4bqqK-#WTLqwzVaTPlcxZ``-?*r;lCk4^HNt=G(Zh_>2nPdZ){{ z{e9}Phnzapso`#X%}mN*e4Y~_aNP!Rx)q;mtX+)=t6S0|gl4cG*raESNFIuDZ5WHk zA&F5v6YZ@4E;(q=$`2xUEVt8YE1qr6k1tYk#{>{nY$GlnLMsf`JNFr8Qh)YAr!^Q; zYi=gH*~n(*FU*#8(JD#5XDW~DCtgd*udH?uyTkVbW-$uVT^08_m zQ>e2X>KqhMC+ZCCf4R+(X1RZcPUcP)zw$8X$X7GTs%1r>!$r4@^Y>*&xGrXD6<#r0 z6&Jlkp}kz8i&ZE&_@pO?8-MgS(`Q$X<{o;_@bk(i;Ahy|UGXz{WEcFL@7DbeKc7%{ zfS-Edr$J=bNci_QVJEXGn3DkfBd$ner-r75pSulg<{YLN_yNk#uy0uW3pHSZyss>^ zY$1I{dEgGKfw4$Ept%ZTLe&i5e?N2Zs_+lhk>b*>&~bmUzW}vL;ArqKqOkx(^}7E^ ziNL7wyG&gd!c=vt@+SuuEd>lqTMa%s|0A3x^9ci!p>pVMo*z$Z9=&A}%h zr0z_=T9Coo;gF)_FFqBluz93qHZv6csW||bLFxfDt(?jEopZDk zp<}nsIldLJU)8i74*xHRSH&(Ahus9weO~-S?L?I(m|$<|*(H#~3`R4zLE@T~0WmwX8ugs0Es>|(a_W4> z@hpW{WEHd<*bogPZDDQSZLPu~RM6O|qN8&EQfxDv5~uYZQ%CT>eUvISIvO<&KD_~9 zsVNTdf%||@{Y^=SpoXAP(Pgr@w2#w2xa(T6tP_NyDf#H{g&pqoDPWbOz|WlKJ^}zy zc!S^HVD|H^{9w*xW^=Y_{9#GBSk;Hd==SxG#0Os+KhaCrVZYAS@%VhQu%;lJ|(@9ifzt4#5 z$s_m{nXb(FOS`fvr^R1jf78yWV188#kuV|Rur#ag`DkbPuyAsk13CU<8-RgPy&y6! zkb%+RUZQ=ihT8coVHx&BScYWci+{=R)4ux}uh{Y!sP5V8CE_a;orhZ^;Aq zyMJE%W$&|pc)1^X%fINx$!=f#ZCbex!>b* zhof?1dmq}&rd;HY#APwLqZ1Xt(RX6IoKa`Nug(Ax?S!zP%K!M$;W-_rlA%ZQ0oWJN zBd(sxLb~8`_xT7Q*ipvkyykP_?$OLO5LRf z60P&;GQ=G9`%e3+Gj$z_)PYn;x~IJ6o~}$O`8t~Twp*A|rj#GHR$aW6;kHM|23&#t z@qNSbp89JW?;A=mdIP1^tyPsO;SNaEcxN5KGTZSAl$rE+|M6g&;Km_;t&?Y}(=ofi zTb_v*gJ<-w*NhlP{BwAY|L~@e5=A{`(wxZoC_@8!jQo*A2Gu(?Co2$1>*qJz`nj5c z84=FhGGFasF3_3`d&VMuM2J_suK{GME9L(5pJo%HlW?ve%TpChw3kpZYmBn^d_8&G zji4WF3utg%P5?UaLiP1hzG;%O|KVwg$B+C!{^r$Aj8;|~wt@a1Qrl4-y@$uSZ80f- z;A6ifLtW`n+-n38ROCd@l>MN3bb_tWo;N(%yH`ym8v*ZlX87ziLnC)CA6~IBiU@Q4 z1QkttLwbc8bh7HAy^WC^`Uf|^H(x>O%oT!2z_!8{I{2$s4g9M*0RO;^A@~J-|NQCz z?jW!*b<5XzfwJru{WA9Bc69~#FR)){br1qR{ihIcY!)Z*{4XwX2=I&(tVW#)*J7c8 zz)S3fG9pSW(^9X!y_LI*+Y;pDmFu5IA!LjzPAQT3yIN9MVrQJ#s9eg;4Gt?DI7Wow(D|N%HN$l)e>E3c49KNKi99s z617|T*_0nJs9mmSS8oZ{v*O=<@6=o^?zf1c1WVdEM1*87X*V=y4X6KSacdwkl65rm z>-J%`Sk@XJzT1FSR_$MVjYNB&YEcIuZWK!=C^K*9QnUl|8-X{bwS$)NYyohEPuEdB zNu4HV2e;eN)#y+^$4NqlK~!cVV&q*`=-lE(om!#S{mO>(H!v7YP5+hN`7emP>)X+7|5Z(^A^lP%=;Dk2iX}S`n9`?R(E&t8_VD@} zt60E5sNwJ`Le3x{P zl0JLUlImU3r1waA$0b#{q=`yeM^d|{5|9>$%{?(&(@H(EOGB|+Uw+IOy69J8ruX?` zrWpTh@sXulExa%gY48VQs&@$lrlmkLO))rB^U2KboDBnQetW6{edcVd@N99Ds}b!( z3~<@1OvF62HKmPQx|i&;{1sQcLdB~o)iEQhR7N4#c#pb6DN*o)Z@9iSuAI4=`oop_ zI9q;4UN$gSybH8`y}m27Uaaf_t*+<)KFtIQ;A70HMevFLUGTwl#Ih{DOoM?o%KW(# zT@TXsvB>PpZ2sB#h+Z|pym0Kh$?yF4UPYu$1|ZXu!p#8*^2Jw+|Bjz2+!yo~qNyKP z+B(C68i!R7zv#YytfBGU)Z+$7YWzZY>B;I9%7W)^l4P^jQD=&mYM+-o_RM%GtHh6V z;K(w(AaE4_)T{Bi=->qlA*WV&O`mSJvAC3cWE0C*x9Zujk~gg%p7~q;B$_WcZDQb= zZ|eXy%`DOBC!YDAn~R+1v}b+-?*HywS~^ahp-S;EEm$|y#h>w4%@7D}i02fxb;qqb zTMZ_vuHnZDS-t_EO1@ZL!FE-3gC-@qU!!5W-(L;eBi{zwkFE`|?f>KW0MTZ@{C4pt zG3pKQU%?^Pg*nlm3J(rjWdLXJ529xFK+2xZ-n+b`^$xJy>A|35(d6TEmcslD9c7_t zQ~$?0;pSi3-KsxbnQPSfl+C5c@UJ*k=`1uQqxaB}hGQi1*yL{X zpZq0}wiW6Oe$<-EVLhX}4Ol;5bI14^DRn!I{gSsrlsVI8g?h<~u*tsY%jw#q{c;cL%LnDt(E9B4QUR2T|JD|GP(tlw{7;))-6Iw$fEqPAGo-S06~?0mV6 zr^}+o&16sLi@TgGG$C1?p2@>yrr@-GhF#^@b%yR#!A+;=A)}V=Y|u zHBXXPl{W}PEJuns7P2~hsUr5P18MKiO9X>HuNe&3BeGbG(aAHNfxWU`G6a03<=Nr@ zvfryqjL7GnZ=ebj--i7xkY%11AJ!DBy4W~up??oG5OPMpTHKA^=d=jZbShAXjXBAZ zhiC+Qh{m=4vCj27pAkqHtk#+KX^xjH-t-ky398jpTJhCzeg@xiH^Q%?k)*7A53eR) zPnYiwm+w;LE9{alQ9Qp;jAJXbaOU}3lCti4!6fh5=S{4BwAroy$FB(`tI$^HC(5(+ zDC~R0igXo8UEZXBP8}Y|R;UuBJH-NtVte1yo7YSzKGhzmQWaW5H4R?Rqr*5cxAqT`Ko)VAUL}Izr`|feqH#jsvhiSZTP2Tnveu7FZRsX2kS}Lgktj zW0Uu4OFtzF%8;+7fUX!V&zW(+E@y-Cbk5qUia0f1qc3aA#i;^yD=ZBE;=W9l`7WMm z-MMLoK~_!98E>kuOinaVW=*>}rFjlcj;|&cM$^0{7jenx8Lko&pW3)IOl65*#jjy* z78bM`BLIYPb(HzP4k~L1He*$UTb7vms5*0QEJDWIDgz% zYmAl;-w5^JxUwrDKYesI`J`UVG74r9k|4d1^f8{$}_ph+8Bw7XxEt=F%9Yq-M zDs5XS=l-Lul~mCOwh0BjY^`!4dG5B zzJNQy(~KlSBapJC%EE4{ueG92oQ&yABk_e*f})9kEXY-O3(x!kM#{AWL{ zOYE&9vgT7qq;N!jghTokxaT50FXCBSU-VsjU7B>TfMw{#%0Vy6p`3I0m5sC|C%Tv2 zt}?W>@`UKk=7p(TH+7HH!OUm`Do(#O&}M9jYRQRSNCqG@1qgLS|08%V+?WNPClUsp z^Zvn*i5U`j4%d)F@Ju@|3q1ZM9|YF#5MW;HX$OT5BFP(6oP&CGBPEZKLJpZqLt`+{INkiDf#GoohB#QuIC;hbDm3atuZzq(fCY_~P6)llwyo1k z?5AkFZ^ErsA~qs$ynvBGMgHBlsh%1*2E3};|ET^e++&e8n>vZ$AdAFp%B_Bh->SjY zDovk^Vklh?HMcAv5XmubmZ|$b6b{1ItsGPE5b{?P>C`2HyRlFYkng)!G>Uu5DAUfz|tUQpJBx$d{C z&?Mu5PCoyU<^%a$%|xp_qi0l`z}BNbpDP?Aw6T9`z0HC{*VVYiRyn=c{*qg8l=)+H zlTfnwZ}S*Wz8lX|1gZoRt={jY@kq%=uRJcYC8~oYzMImqxidcr{UMv8v@8X|df&?{P@)^~2SBRCkl!`BDvZi!_3k8P-HY zQB~8#Qsi2dZ0@NPnq$gz?B_4G(j?eQiL`K?geu`SL}R_914nIS%B(s9OsOd^c|$8u zj#Uk^D$yjOXg&S>d#TMP4X<8eMv*E*{v-Bh)bos_AHn};)+cT#5!ui1YLY$nuc>@m zu~eP9S-iU9mF6Bb@e!Uv{7ye=_WD2BIqBd3B0ggrmNAr~Y1O8GMdn>&q>^{j-e@`x zJtz_?IQ-1O%=OC+8Y$hvECz^vZ@z7w)60S=V@QN+0^qJSf$v-V0NGgLx#9gl^>9@A zJSwn_D33@EIfihX9vw8?P7a{--o3|aLr23z{FgVemjejxliiixeob~)5_AYo9XGXz z4m~CA<|VFKVn0`xCCC2Dqc&{2A4FzC7q*OeQt~JF@yvvm@P!)f`q^hmnX zB>b#A{8{D9A!)x*AZJN%u!u?b7qA~h=2hAklkTRi1kzndMADmdUoC7P7Yx5>0c8}C zfVVto0_DNG@<}tOR+WVAD?KODrX8{>u3|`g;U_Zt$skd6cpxw`E03aTSwpiGw#tQ6sg4YeZ(v-&1*<5oL7pYyiBu zcKLPy{5AmIL>>S<0sw1kR4b*V@HqglMZi@|O#>MF%J#2b5`0hE6@2HbEUME&`l7ko zDCAp35T+{Te2Ulp3vhe!&jRHntoL zJj-3uk$F?;%jm=bI(>oxB(v{H=ERm*C)CaIhsEzgrvIzGr0iiH3}uOIuY9G+{7|zX38n zYzG-smE%wT(hza#w?u>i$U#fw;;`acNIn1G-~3F=P9Hm+k}L_f93b347yHhWATW>0PI z>$R~j^CGj4HiX?%+DaBX=uNeAA|i3T=YlYn$2tD;?Jsfv;j-qsug928nJoBf#R$*> z2trQ|ZLXb^-BSuKmr=WL(3Nv_nTB6iXKnn&+BjGU<%L6}aJYH+fOmvL{o+b=qqheE z#vat3J!}XceDwr`3sPGBD68h^GJALH3lYRxOLt2L-S6;*y$5>-V_(6Jenra66HfX5 zX{SYI-^jDBY8`%x;#b;ud7A4B!Uw4%$@ps${mV$`%&r^XC?__{qdxi#MF0^Inl*A!W5Iq7L{3yB* z9f5?(Yvv@bipFTPsd@LItt~yKVB?5&_GmsLOzr1?X9|i2u-IzdWJRdnu(an$twQ`8 zlfO;ZXROKU`nu`X^*Nj9da%&{-VR-#clxfo4u8~2ll?`>JFPo-FfH?gcjePGEmA(T0Hx>1*yD<{e(wbAlQCQBRz4TG_6@UqNab%T z@{%Xru1nwhf8;IyJ1hR}Cwu+2*Y#iS9}#@drX&Y79i%s?K+=(S#B> zWj}=y<_%W|V4L295xGaSBk+ga4OTSZG2F5hQDOq zwt3iJk_Bzg9G~+i86y1MZ?ygEqjjHjPUM;@tCqzL-nnz~A4hr0`P0e#asH*FUQ@!Y@%l{|rk_y6Soke52D4OsIZMQ9b`f9! zAAB);k?eSx1*)6Q+hBollX{iRo6asaf2u{D6@1^qfV}Eh)lZ&n0ZG`^Znk_}>NI7D z(CS{@^3l_)YHRBjt2#~vaPM70He2~lE^%wRVI@MqLNyM=G(eq>6LP&^|5Ta>CW@ai z6ApS}!OU9SAGy8xW#YFXeg9!az!0M~>4d+z-NXadu)Z9hdGo)Y^?XX!^YJ`0)J2cj zGHv5>7GO2M4;Nr&`*0qa%l6Y4We?HvOKaMq)a@UBqkl;2uST%p)?c}3Qo;JGFrb-6 z`@O@!C_~9d&j?UmLqIdy9vt(C*K9{2DP5dJM%iD&=nU!p<3Gb-(4-DVTeunTs=*V;;k&^NRiIa zNyr_)#{WK@ag1uT432`q&0)WzCYD*8A99lHmeHlMF>pZldTmwya0cr9b*^#P<`VL? z(~IFW?{@l6JnqX3H+%eX$IX<@uX|1%OLzR23G4VjCxsoqWR<>;%Ma%#H^=8j<~bQi z=XH)9v{SY5`^UTe=>GHz-=QfvpIB`-X{ZJhMzkpCRy&ouZvADTx)rz`Wa6UJC+2WF z#hD73lM#i<1>YO73LHAKN)u+4amR^lIAO`=MVp(&GG@31fIyKW@JiFA#x+YgAXV=u z9Y=~k_D_Eoo8>Y*(-N)=zTRwKWzMgVfNy6!qLUW7G3&U&tS|lXbR3{FZ?; zzDUHch8k!nR@H2c!0z1{grxyquSb{~q}nBSsb!gdR#lh4v0yWO2DThe zD(6V9sxCvw>QgyCG|)S2z_BLe$)VWSK}~nbnckb3WKQ^%r1^?+ZwaRaF>AKf%A;{Q1uCV>8wENjS)1mUrGg&HrCe zMcWHPxU0gpZZ5Xg(t1gnzj0>hRu5n7R{ug%tS+U`I<_U=zD+%%|I73nw_S;vhBh2D z#Xy4iw}A6nZ6R-@tlv079m-nZ1nm*O^MFa{p;&nbp5Ea2t z>G3mX=beQ6#Y-@cns68$OA}(~C^~@#2`~4lB&BoG+RYd8k>BHJv2q-1%4L|2ZQs4Q zXlBLO$v>XdeCfoQEj=!|p!tHthvTG)ZQr~3JKhtgT=vuG1wV}*?Nt^wdox?| z>n`}|h0Q0EyJxg9THG<1e7%~FW&ER4j9=Sn{S&sxZle34ozj^)T*?_Qj=t0dkfaVO zEUb@z(FIb#t!G4w1=$!vt8#=I{%_h~qVX5uKes3Bpv@M<&R>>k79$-B{de)vi^f(_ zh+DUt9pLw6X?k(>;IrjHlFZXk!?A3gWJXTrV+F26a%-=ntFCpJ~*faV( ze+!~3Q@;s{Ya;x?vR}1#rxi$9fwwL9-z@hlsT-6#nRm{8hSQjE`Y$&6fPv8AMg4x? z0`WzqFy?Wo=RfVLPC5V5DlixLmzZqn7#r;33gXysC|3sT`xtt1vY_Wf16@o@TR;Xy z=K6+#m&B?b`jY^3qJKEh5v#_T1GJ_TY7RR0%M@HOoPe9mtNG3lr+;sLRuhrp>R%D& zhZDUdhtMRi=61sxVI)2OjvuI6HUH!{iccx@;%9LDaBLdky= z+>4*XaQ0$E3_EYs1B6mdyir2$N7g>xBSj_^_?I8ypb7}dj0=jx=!nm>bN3%zg_hJl zY3FnI{l0rS{F@ZCeio&6hjM}l5{Lf*jCd#iqIB{`ivf^gVj=C1EfIpV-4@mU6US@1 z2}Igz|Dwo34n`$40?r13qD8t_Q^G=EYZ9$uIpO`99L6-OH-+jFtzuKl-|ALN()EfO zL8mSvskU=jU1CnY@>D)OWg^UpsArBB487=AZbP42yv*Snt~6JLVpaYAhra55-?RG% zc%G{|9I9vO(Yl!FUTu82OcwFA>UCY*x>K91$G`qo-q83#y<$}_JgMOy>0fI#?ln45 z(<@(Ibcs2=6!IbhC(fs)R}n8|weh-Me7>p|Bo^&e6u5oOYgPQmqD&0#V9`Qy@ZQsz z#P?OxHFIqZ<-XVW96<}hcw{(>&C%`R{sk+Qq$sG9)FY=C0dcJW=zNonspBZOzBNyJ z;FeX6Fb=9IjDu>iDY;`D)Z3jK!+pEX$@bwr#%KC2ri<6y6|UZ3@ytUARD@C@LMihX z<_9E4UmV2={Uz#ESt`*rPD=DQ^;^V8jg{Ky;-l8={$IpLIr_dcL*Mn{Zw*=rrXCeG zkID+&EA#(3$Psf{TKr8}GtkaO;=oprF5O%D+y<}4^LJ!a$YI1Kliu& z7No~2j1|?WLOi=2bA;}O#BHJu0DDm7N0FF(N6AsS@woxXTzv{8bKpE9nLk*6AelX$ z5XlfWM{!Y$C%jY(LluP0U2>Rk$0yUE`0BVEIiM1dNiOF=$IcfY2kNo)#al}J#b4?= zC5yznK>!dBDAD?r$sFrp2{*Vo7v&g|9s}tqL`}?3@@o3j{J2nY2ml$F@2~mp-#SOf zyX!?03I{{YKuxAXgu}_+Dqd7L)h6-BVv|MzNxL{|@*Iyg#Ekl1~ zvrGHzHBT5>{uP$V54_xsv8t`c-1hbR)4mBVtHZ`0H})g_;Yd2ML{-JAmRWwxq4v>V zU+RjjYE{$v2fZqc&_%u+2hV_M`4?+GCiCvO%VyL6E@C!S{3@JH{-t@r)JdJ<=E=96 zAA?+bC0rADUyuKKe)OZq0sn7dfP{o_uNKHl;A5ZR%J@WAq-Kf7-DlkiO6vaIUN7<>9SIo5541jZBHzeWttw&h`Qc+Sq z8P%t#>rXD7Iye_L`CIFOs229)X;#%M=fTQ3&gQpX`5G;4(m=XDUJ@%hdHfAWG6Y%zrc&GKB2D$e(8^vUqQ*D= zL>ibSV#caOxxW6b;W?@cFKYJdKGF-4W9F;t*F$KNtp%5>CrGcm)XySpPR4`C

$d_&8pAh8)BSA;1qrUjNqs0At+x+3afd9L%^mju)=qky$L@48!HpG)p zNuRD0@B}zcDNint1CfTws8PC(!_X3bkk}nunnQ>K5)Z zLj(RqS?IqN#GrpW7e{|z4|YiZd-j)npMF9Y`m2um;=df1rvKo3L;727Ob19dtJ|)~ z_K0WC^cQ?%S4V&G1yBp@g@V$%XkxiHwIbf}RJk`jMiLn`t>a4%8c*fQ^M13J&Y^yh&-&s^s1!WA3h$=Bk^)ua-uI5nC0XzQtD=g>;;6=yT- z-rtoDWe6>zVlk7v!MOc_)y?(~+ld+CQ!2z`Ss!Lm$nDvLwy;^)FGoT?P5Ln4s0FR{ zM>}lE{R~p>Ei}NDAu#*++tC46S(O$(nM1pkw!d&vSQ8rxfk67tYH~jVZ|wrBiLHsL z?8_fQc_1?7nj45IPA83j=%&y6? zisbx57QOP@9O$x|mjsEF8UX;dZec9F2zlel>KA-= zlf6KcL87~m#IGu@h^o8~|vS7ZzS3k8*X+iu+l8e|9gMlgvOzxV# z+91FoldUhQOe%ZLnQ&=zmrgDX!HanrC!+NJx64mHI4IZ%qB;g`L%tn@)}=4Nih8en z6yEt@=N=gQPh)~^diH2_6Pv%8TT@>f_Q~d-IzsBV*<%$sHXtC(fR54nPEiH(>_bL` zOH&FT-y3`Cpla{t7Rs?*kQ}UU^%>g{?PsRz0_wm)eVwo@1-FxePt4efhQP(V?iFl&jS9~C*zBCB^SBB)b*AA) zP2tCNPXw!PG4JMfAjQ4`rRVXjvMoV3-AMN;0ki@(nOkvzk)__n+?1xy<^Veh( z6wr3G;%gW2P)lZ01im5#M&3<5{x!#_j_~mtCbzAmtHz?=)g>G4;R>4nE}zA<47Y*p zMzQ2)iR3E(mJTuWg8dXh^NQKu)=ukTy8=tnBM9w{XIW_s_?f5_UiUg4i5 zmfocQx4t1(v{9q4kcz3h9Jcxi3wD)?YE51tM<%9oE@DHiwjGxijEoP5NBRiY`JY0A zX`-Xn7T0P7NxBJ)gyrGR{q!VlB}l9yk5xkXx1Tyn<8d#+zwJ(wZ){Cf{_WG0%4$`+ ztO0dM+%w-mBGq?4Y|bVCNffP}7L#RKtEsH(hh@QpwB4c=Bo}uUL~o7|uI{BQIu*8k z0&6W%xUi)wg^Ttm@WbJ)ZaH)Vrc?>xQi(&CyFCZnPEPE4?`>r0HH4=tHumM#ib%FYE$5^=WO(ePDox zo!~eukz5f!w1r`PCZIF2d&ie=J-K}Ub>mWd!4UtpZ5P=e|6OpiF~s&s9M}c!^C}v8 z$Ld!Wgwjt?TQ6&Kh6yV0QtAci83ny*GGYFQ&1Z`@-AHElRd04)F@*BNNR(L7DJ7Ac zY}|NPkBUv*3L+e}0c)Rxgdh2@6Ht3a?KNvOx@03MZoi6f}SMp`stzpZ-Y`MghDr$+;|Crt`_ew^IZmM{^w^xo>rk#6|v|{XB&HurKzthS3 zJ&ZpK!5E$PDUJ8YU^6~BB#+NXZF6-KYgkHglOy;t{IlN(K9#RgyNWzo3gJqmVs`NP zoX>b@U`<_D3y)b!o|xd>WN;0^XR+{b4UVKH`s+YKoU%|=0lZNtm3`{_1^nD(^x1Zt z6s{wShK+p!&h`n<^+{`yTr}R9+U{MFb@e64xlx?|ZtdXk38TugKWZ%iAq#*KnH>GC z{-6l;>qRWNORRo1_QrEzO7cJJsZrF5#NhmW$7!zKw}%TW@TsAcrCTzp-^o^C-}(=7fY7 z`CsrYYw8@p~|`K5K&PG(Pb z!fTB2lA~KHxJ14A6S=hQS~g-crOQUF$9EV_{@H%6mq^YxH14*lFP57@)r4^)`C_1Fnw(94WB>4P zf>MoLN}Yk>j(baRdIQt$+En&W_LP?uMeg@MT&r&G)4B;Hf%v{tgYzo}e>v3NEnD<~H>d+m?!=?Os{?un`lJC2Fpz}# z03Fn5R!B?veqhsxc;4{z&+`$Lu51 z(AOI`$7u+Xlqg|9FgL)A=2igNsRktlOcoq4xhGtL?b}~~QAq)y`tN??Y+p(H5RCvU zfNyEU{OxUUhn4HFSXVa!?7f2x=ny1H;93Xt9snIa*50$=jr6|uq3NJvT4ZJz=KY9S zB%ELZRWWy<&l!y3X1;f$#c{g)BH~&eJJbdYJxpe+s`Mp+2nMBP!g z*`C@&oi&5Y8aitBj(Wwr^Cd^6MjC!kaY#S`{+8s~vtc|-cvBETm*V(xjI7Y1`>P;c6y*Aob#SmXA%orLS z{)RrCqg(D+Xe=njUjn*o_w1-+v`8l8))Z>OSpb5~l{)sd! z<|o8z2huP<^j=YWun}SPHgFH^3=$EjzQcMwMS;RjHMFq#Hcs5PdH@4 z4(=KLuY$WY*%B~HTLiUPCieSRS#mY^JL=7-m%ZP&IcLSK&qs^uZ2TPVEz=~S14`Dr@Mxcx7^I=MYLW@7TZNw7>)DOzmzPcyZc6YUth6JtsINmr5U z`4qO75=3GxpFT{=SaLb$U0on(B~hs=`!$7U&`ti*e=HBeYX&rpFsTm~`Z`&KD7}0C zN`wc_gk>)7K9KT~|0&6T_c)$Bu~Vwb$5o5mU*_6M*5;ET2I*R$M`Fx`cWS=Ye}*fk zQLLaeDG$jpY6$PuWmJpzD(+PclV2j9EE(pV%JdvM^J#i*%Y>1@%5XUZ)qIy~9DO%$v4MFR9vTN9ex*Y|Jwz!@l~iukH#!$un0(tp zi(&Vx62sO9@Qyw+>ApE9!wJ3q-l@59DZ&9baYsH)B`g}W?ZW*NN2)^?+m=kN2h@sO zsqC1(Uir67KI(1_$r6}X*bMrV-}n<8Yd=zX#*)lJ7lZYrh@(Z$Yxbk>+%#V;;2fLd zi8dQ|)E`w9$rHRO0Q zT+%4Kx{rb59$UzgdlQB&O)=2$KcoJ^&eXqM71>N}CQXeXLK%Xr-h``o)+gb>$vyWd z(K#p62D!)qqhTR?Q*uhp0L+ayIvYff0~%I!cv>VS+1_P%e z7X(T%mVARg-uBKAcFX$J`$O^6fFtb_QiC;^?BNUg=ar$>KY~TIOi}!*}S*#~^8vfxq(%9#HO%_Y3qxITCWkwHUdW&f6nY~CljGF!VR{DI@*Rg{OY?mUzm^ufhAdp{xqzX3ns)uODoDC3IBB?)pQ{TsvZ)9|m$SqFNPOmL? z{XBN)$1!}}i9=VB$dAk+|2{dk|I4CRfuKzdIT~Sd0u7lj??XTGzVqd2{Bc}at)bvt z%g&v5V-=4=jzXi8m`A}gKl!4U^PP)d*rbjMY@_;{N zJ~Ew@Bo18}KeRyk=GnW3syjV<@zyR_G;NPXV+IyqAAx>CVD6Cr1p*Jhk%>T~ z-vxn%+as`G#|X&aa@2HG4ta|nsGt@9>B0XC1pe`QCIYM9>w-Y@_6RKbuMoJIR{Y)m zCkPzd1%aKrB9OH`0$atPFs_O2(6#-QW8k^hKp;Nof6)WesJe3ul)dYEz(n2b^^pcm zvLy3tV7bs&fv)}E&Mj}S?;mnYxYj#V0M8#NfSue-u%Iz6IicC-w^RWKb2PJ{@%I5~ zQLOoG+d%)oS?(kKL=>~W(HyLAOlWS`2ETxI2mupDA#Btu@l*GxGPmJ>804b0CLAQ) z=xl*laz*Rw5-zx8+Qmo+z6$$Io%&7w%wy%giZZ`AzxB)POo|TLg4bO{J+?veVguQs7{h zesaBIn6&P8Z_+^v-ByP|zCoPum!snzV@$)6r>AV0iX93`0Va416ZbsqzhYN>B3mGTVbnqVwO^` zu4mJ=4*;f3*9K}8ysIK}3XkCiTcAXc!qi)gsqy7<1p(QCJ({txR7R%DE)&b`t=O}k z!2G<4@RF}Fv8>#&728+U+_2uP*vig1CA=qK)vbnvMl-)dYZi+BX#dUuj4|(w*};J^ z8&_)4y^l^?v8-~}v-WA$Olk;gp9{7?g9P!PtbK+S2ClS_ULvHz&vD3){N6@H)?fA# zGlh1BD;ejtIy$s2oB+~_fGQXLC5XfT@k2Mq4t<(aS}~cl@VPS9i=(2m^QhTY6W`Nv z##>CRg>PUiew5=65srzS_{ciK^2Gxbb`b8?GB-A~sP2W29M1?8h33M0F2m zIq$Wf*w48jSCiKTY-g2cH;YjI^*FO2b z(H}#9jQ*If$^%r=`r{%~1kA3l-2;&%??+mHH2y%e?^%C5K=_i=AEo*Z{h^WqTVqwS z7g2mkP=Oxzu(lH8F?AG(h*=C7+$vr4M@feM*zK6^`s2n;U#34Uy8`|3t2cM3KfGLF zi_&w-P9}lC0q8$mE2ZZimnU}*-&it7rQ+UBf5^EKjQvi7D6K!l9bNT@o`m`%`^8Xy zOwa44Kl2+T=#OXm0zUd98(>X;RIWvTT%@RvwdfDWuBF~g zr#~FKmZsMQoc^$*BE$7d(;v?tk=7FuW23BpNS>%sz!+=cTIv=Wd8=7>PnnXt>5m{& za(ca>|04+g(|7t>`eX8r^~Wh=yZ^(WD`qY!g-p5vs&0V^7M7b#Jr=uALN<+;Ekh0k8K{4 zoYBkx-ME|j{CU403-~Z58G)L$T`;F@nXHpxuF+!;qpb&D@02w()j&^~SFcewc4A}h zGKw{-SOAJ``7kf&m1;)$6EM^@A_hdvzL|ctgI~`AS7?Enl(RPb@k6PuC}=gG$33-5 zUr300)3kp3B%tu&Q%&Le?Y7r?5Kb5G6&Sa#?kb?n+_P4ZHEM?8+B<+tj|Ero#sve0 z>$ep-V56yv)@+F{9taP}?nC$hm4hXBHCuk3U{eF#gI)nr|B#ouh?r)*qn{<+fPL4g zh?uB>9m+46s48UvjKe~hoh%VSYaPtvYeY-;IPl}@O;3JYxFx-es}N4w?e`>J+h<-) zdu{JAQQV0ktn%9&BbV5|iHaq|rnshGtaj2(j|1tZH=%UHz&e`hu-)<2x^?#`+ltAC zS|A~39Ii-Tr|sfSm$NZnl^2T*CvzwI=}AVKtf9|q{@FnVbL~xG*VQd?k)5;M z0?QIDu*jLL5x{o(MA7q+InNy;P@7tKMMM(2>EG=Wo~EoWbaG5 z;5Gz9n#|h)O^$mAnp{bwhfNN?oF)X(?uaHI{efz}x5@}Iu?s=|IADha3GoXFvwuLC zvg8KnYczTIpe{5CwF24iL%AL!Uuri){{K<;F5ppC#~*(p2?P~4$i*m7qXq><1;t84 zD$%5FFhNwTC~8p<@s6?!)aybL$aY;DTWe{(l(x2|t-qF9OF^s+f)czSqEZyAc&qQa z+JagjV9o#Yo%6oCn-I|c`g{J*|IhP~eJ|%dXU@!=nK^Uj%pstt82ctlMw>0j?7V1? zFtG$h!|t9cZaHTfV_iW`I*&V1*zULM7(b(&08 zJRZGH^N)=ZQ`(h(r*GmF`C`R%O<}r;PJI?=4kDLFHnvtJePDdy^MhU);Zq~wGqnrg zx%ie)eVj-<@B23d_Lij3y_nw{^vBUfxm)b5IFcV>+i>Y-`*|b9h*@v zBk$v9`Jwv30HOFm?l@mp>m^)u2{l|%Ag~Jug2a&N-%T5wPA{_l1>U3^OX|DUje24q z;EWJT_Nb+_uuKd%>7?aaaO%qlOC-M^FKZ6Y7lX9YJ+#c0)TtQiIr4 zw9F_IqotT?l}IPnv*F=Lnxj*$S_5#Eg_eWF6(x_|8XE}qK`>|INT1|@TaC0AZ;)Qu z0BIBXLRn95)pbTtPKVvVwh%i3c*B-pfCPjMMp8gifUsfY26iysQi>)5X*aF~t|71N znOq@jn?U#uf5 zce`-8K1LXF89^hVhY0t=g zq-`>U-5t62{RQOq-S0m^E<-~Iw)S)4lOHha?KGQ+w{+3wHnTG#$8WpD%~q zuEp)K`^x9)Tu<+SYyQu$TbsCyP`4>%#Jas3s^1qZ>zMTx6KA8|IE5ggLn`A;KOeTR z!OHSu*Yb>mwh}uQpg)7LjC^LFQ}cjM~GJlI0}LD~N+} z9E|#O7rK{K$EOh42?L(^3~rjSFFFRyD*#>Eqq_jltw*GOSZe;9RB$X z9pdtf1*2P1Je=rjqnUA;TUjUH518S;uN(FBXJUtuE`EKQu>=7$Y!Fl$8?t{D&RfHY zCP_B(1D1EN_5^|x0iBiSesh|}!R|z&s|y+MGZ#7VKVYXwq95WFC5!>Ivbd#u!0$)E zEEmekevbRf^1_GopuC=atOEpSw1+UPc`w1zX(F`4CEh@wwrNP_1^$&1AufGfPU)#l zX-okY$L-_hpbd-nj$a7JR22F0EL49t@G}p1)a-3P(2Db&8(hk9C7dOMqVtUJ_hBG|cTSXuActggqx^y@HJnvuW(X7905c9Vw=@~+k~p~ zY^oX+h3t49n|hznJ);k%=6zxZEC0c+=fT^ZZjw%3$7GMIyUC^?`hRn)n1`d8Nj5=^ zVhiCzhO=5opJ@C)a;md4RKyHNS4wMDBsDA!O4lY1$8MALqR6CqMQWpcM0dEfdiCi= zpo3(Gr_1K1x_vs>o-&0h+3u?D$ab;(*KYlDkU%O|6p*8mGg|^P^pDL*|EABf9{*sL z9l%#ZE@txb*6u68KV>7w%a8%PZq(~LzyZ4&;%|5dUZEkwaH!dW398w1KK>tQl}&f**mP=Cmt=?Xv4r&-MUWVt_NNlyde7vcial zrQp!djLONdHRT(~zre;(Sw%beyf*Q}7JxsSy;#~}d3It-ucEUP<9iiXB$j!+=OmI_ zGosfn7BTScVks9S7kQeWehLbgMAOto1xS3+eYmnExa3r1z!vN@Cb>|p^I3kPW|if- zP96#lxo0_u-68=6Us{G8v6f^LW+c*wOtOR#+b2V#Ufzw9O%iu@CW2%BoDr;^vNi11 ztVHt>6W`>A+l$qG5nCHKC_xG7xKk@qtqq!e>DAO zpdAe4{wd_954z)o?WhlY(EJ7^WA+507}gr1tTiOhC=CG}P@QYJ@6}9@E6E&A|Cnvj_Tz2?=wQq{Va6PJ~i={N_N`~ z`GJ#yVIY!zVM#F3O=6AXg_Z&xjk%G^W`7~b4uD0GE-Rso6zQ@+kv6CM`A?$s*RPrK)RvVkiDjA!9dmQz;GnS4xboKj{0~XA>-C99$B}xpjzi_1t(3?t#5iuF6pRScS(y% zu1Sl^`y|0CNNeKbx5(ez&dv-qyvwU_!nZQrPVy=;e38HPuc3MCQGHqa@?4j{b$9#H z1rX=tOezwCC5d0hFziK4%$M-4juSqditXsQzFXDo|9i79$2t2_9n4^<&z64=1x(-7 z;CC=UZ$PLZk;(@w5_F%1V zOBY(Kb&zf^xfFS_=*b*;(y6)L^#CNw9KTqTn7|i1n6*&DCEB?R_c{6J{8Am{&KaE> z^~Xk#LxcFl=PJCtnDjr`14EOXAUQcS0WYc5jmM*2an=3f$zgU|OI+0Cg(I-!O@pDnu8TQ#> z;G{t6bHLqg)T1B1)co>iN-6TcpI>hLp~gRPBwu3uhxg3dcdMHH|HoKcK19ZVM0{XN zB<9X9Z~XuqxcTKH-{`0V-TX3`&)K|(QNRH!wegp#h=Gc~$)XBeB>5jW*MuL} zzFQlS+6?nm4eC@TQYDsRjPmIVc3aBQu`ZH6)om~Mm74P5$!?XRq*Q4oa}QPKmbYy8 z!v`$Vh3;~xso4ieAvq=&Qi&Xu3+xv~Zoh6(E4!w}E_7-8Jbi>yQ8UsQvIH*u#veiN zIe*^kn%1zC*vaB2^i_I5$kuNrp6~ca&pKJyGRWM*mH`(mYzcC0hsZ8$xxQrPqmviA z{T(Aegy@;PF~zh31>|}=090J-VE)ri7Ecd))d~< zvI1CNFU%&tnNLX5jIWd8JD3Tleg`sErB_>saLJb(@|Ep=+)}cMcu5oJvJr|hf^@X{VDr7qr-^{ zE92uxFgan6hJdTWIf}x*qlon{>qyAE?mU0mvabY0*g24z1WDV<%0zXk>NUWEXh=bw z9+qqG>Pdj=+kXr27y7$u)N;mc0xaA) zZZ|CGO)eJHNPq-=+0tD{fRLerq&9xpP#v^QM8$eG5*wF2D-ASM&4QOaKveGUg@9)Y zLkw1vV1j%(^OdWM?SO7EnDR$No=_HqhgCGgU=NiopeiZ1>3k`z;WOB^4}#jG{**5Kg;lgyH5zYx!Y6vC>0j zP3i|&m_|h~*whEW!eL9YSg_}Yg++X6Sjc}HEZF`NOm=+^8q{ylaMW0b20ixCpf|Z_ z5LyE?EHq$(Xf?-V9lFhm_4+MC5uXm^oN<-zj;5)Kzfv1tRU5w$zPbv&y5cSIRo|NU zYu^$pal<2k4~>wZwv^^aN9 z*mFb8LzFPo{C#tVLF{WVGtObA2hfO=dhBCHZ*nmsVG&?PQYK)KfCE6q>VFPJ$UFlU zn$-Q374eUWX?NW}hwe{R`%=pr$$wqbq5mt@f1;l}+F|_z|Jc_EU1ecmgr)d@r;QDw zL}{X2!tt*UijSqfzE)qccQ$n?`)cAFL)}{CrTlKKPJC-nb>c>tt6~JvRcx|&HAg#b zBtpSkqH!Tb)$0AmF7?#eSNGYyDVip`e9LR(mm>`z68=;)KiJ2qll>0gE98CsfSY5rZnX;XfOj&-y08OK8-s-Y27Fy!$mk@DhEA zMXZ`C;?3H%fK_buCGPjL?zzK{v@p4VDyi90(Vtb5ydb}ZBTG+a19xCaJlax{=Y`(( zCkWInpPjxETTG%2%Xsf9p8EB8<+#sNN0Ri6s`klL#aE!?q^nfbs<*yWRTXoZ$@zd- zSy{1S2Px_|yA<`!mZDzGWK-1FS&Dks^luP8jFmg?!T@>g_aI&}(NIbtet;w!D$D<- zp+Y1Xy#PJ}kDjR(?cA-Optn)D%o=sLZa1s4#356g_L6qWF>&H{B|@PW8oYO1fyG$u z10)ttTv!^PfQw^5?~gR&E2$fGbO6vj=7<2Gas$ZS`jJp9pA(Uc2lJBm-9(Y|uV42& z;&xN;UA}$iZrMd)LCf04HyRpL{axQF@yKKL9qBeGNH;ZQnr^=?%s4&BYYht_?zO)g zLnXA9AmVFcg0WhxxkilVR69b3ZrJcWPG8ByUDaHYdi zk1O*#?%CMz%XR_P`bs)eO@q~?qgYz|rB@>y%CoDmrC`k9!*mdY=G4E4O|u$Q*FQGby0;z#3$T#3Fi~!#BYlsM#Li@LJiOJ z6^CE1Q>V*YL-RI(7dYZ^9w+V{tsA!|qBhakLYbOm?>jQNVR===Gm5*^5FK5zpU=l7 zQ%+FHm)KMnQP<>|2`4fMVpTZ^{FACV;Xd>1M4V^G`W^JoK^u66f+Ni%htRDpLAT5c z@8X8r3YOumazjMXt)NjPN4#|)+#TOXm!0xk(`5rS<{W1faix+rKo5CM#Is$dB9S;w zu%YEEzAjw`({bA&k%(JgIQGXWdHtpllI})eWqh_J5Rq*oOwhmQLft!|l)9vGyQ^FxsNluiBdx1Fa~e6D)r)Z);*g|N~2;rM&u zx(|n{_0eiQ?AD(!DXz1jcrjqql=V-HD_-%zK6P&^LC&S@YHlmrK;MSHjX)r7s-Z$< zlZBOWKmXo+4{Kc2l$F-!*NsYUgcy;p_&FjKDb$~G-gfO#bEzRI7%I*W_2jJbisDeu z(Q@Bzd~0Z4N+uxfJRG#+?hE_>4BdEg&<0!A@;~NdKB}W2<1_UW_ucppeE8gb;gnx0 zJ@#nE?{9qg!inyZ(a9czDVn~Hw({IJ(HnvDOZ!aJiZm--@pYA9MO_iP_sD}SaZQ`+dv;bxA`b3SY` zn);y=$ihW-|G0%v5JPowFWepbO(lP1kMp^V%q0JZL{JqoK%K<>r+&8NKCvdTP*O({ z=gh>E-lbIy??%RG#EPZFtW(6clVqDL=1D~z!N(1Ub0w2hvolSaWs}z=j;KjoLnIxu zMQ(}TxNLvPn)5JJ3JBWTk3$+~RBHz0z9LHmwSYApOcmc6#{Nm3wDtk0^s85$X`phF zSxeO#!`_u&YiXNT$hqb!@()`AKozJS%xUMl!h^RH<)FjK*+JXJ4%#=v$^PX~h_ufX^+6Y8y%^g-Ur3enHqvcIG{K|qay zYIOXSXmiQRrbLr$ToTx`US!A@t^~A2n@r-JT}%%yVq6e^au+}Su(F@L%pKe@je8y3 zp>l{Fa53Qap6=j|**vOo2X{b7(U-6Rvc8CSC#tl54x1R7E6$Ly(S=&Dmr(?E8fPCoHI7{6XQf(C)Blnaz>iRjz#z zY7ExN9OI!T2sv@bc!&brbWtoy%w3;R?C%>1)oT_9F?N6(h#|%3h~Wuu3gc+(j0~Ip zj5WMuLpvgvyFNp}fybDhYC}1_&AqtrYl>dSPf-rNA2Y@dUobAu?Q2fk?K|qts z?YY}&9zS}FG5fDqTn9#j6&HVU`FfzY_>&)g&EUr+9(KFyT>Ob3-y7ffhkOL2b!_HH zs)Iky;LHzq@JDuI(gqM5PAqnE?j_UDHB6r7J&tph=i*x8GbaY;pE4RXgOMZWe)}?G zUgWjR7rnOH%&Q0|i9BlM1++#nR+&C?+4p6LETl&{8@2pOE>b10+-=5{pM75i z|1(w%HYee8Tr9e=ImwN0>)&&>KDb!y!J_$tKz_xRuQ>a}+w>5_19?7zHW`>Tn#Q=H z>4HQ0J%9pUqC$*kjZK?dDEed0X3Y^0em_{}3qNY14CM?TL_MZzt>((?v+BR#Fce{6JZB;#3m?1>-u~gwWS~l$_Za)8+LgEW zVlz%}v*vB~Xw8;*504aP++n7+MUykI{nJ59t!J_~3cFrN&nl>QH>B5C3n2Y)RZV_d z+vKEALHqGmIo?m#C%4w^2WckH%MaJ>%%9cG*7MT?mr({-QG6%OzE^o8Uh>9~HY2RP zWv>YnOAVYyO#(_SFSPPbq17b6-d4SRqjFslHD6Ml-yBYk0azFCP6q~3B{P0>cTIeQ zcfo^H%=t?9!%EluRK3C`pn7*~*l2=i3-7=A5~emik`N9StQ&R4T2a0`@d2mEKh#AQ zyPz^CwASHHZIO8Px5Pi{H1F4Bk6bK{E>Q=34IH>BlHZ45(_VDK$bn#`ZM&#G@ONw# zf@WLQ!e5{rTaP|3aC&+lm7A;@n_yF@be%0S1|lf7^iXO*FNWhU$jKD{&b%&D#e*k9A`H35e#Z&?ZO)@^3;$kKGsK8LaK#?n8LlqrM6Ryzo zV;EQa`GxW*G!$)R*nht3WHm{CeruBR2HDdccux*BlTi-53 zZZO0XoXwdX;BFRc+~yulx{2Ajuc}P`FH*{6ie-|p@v5=7;2KE{sM2+l$S@@Wb>_}bm3p9DKB!G z5)=<(BcBUPb61;rGi(jhrE&Imf_vIzPlE=Btw{|MZ$Ywkya*?{g%jT_N}OF>8DCo& zU+vwkQv@5fMP{-V7dchNsfr;RtK#RO5PGfwk#0@l%#$QDNh)zVOI2r}U|3Tidnq{e z_#!wtxU;RTJ){L@Qb_;hTF%4;e#MrO!ip-E2a-*gYX);&$aNiUb*<2eM8=# z=MgI*RLV$RsNdwMg&W1fe*6XuxS7W|JI3kEt_h-t`mbd(K@|v54Y8QrJ6q1oa&X@Z zAS70|%B!}B0@d15y;eaTjoeZ1_`qZetVYe>Qukr|IO@H)2{*$IoOAB>Np7b$rQXjx zIEM#D-F#6Y!C1NwQ2_Q=LjX=N=-I>Jf4uNdAb~rCH-rDXS7-3Q`ozxg4<`SCKuI6D z8zwh(g56EI^O5$bXA$krpWx?!|9{};OyMNiC&utk z{jy7dpJ88spBELSyJ!5I^Hc^u^Eq6oQ~a!@#s44h&r!ljvd<*Oe`-FH4#z)tzwGmm z&e-W>eEnXrx!`9^=i_VGstkUv9J&Ym97hxB{=R(r|JtbPDNH2$jQJ~AxshS%uyS93 zl?(JJQI2kkj*trB#Ebt(cYJDCHIc;}JR`Lx7VVYmHa(faYR}{MfYlu@{U32%uEgq~ z1f1B~lM(=JGXNqGP@U+3Jlg~y`J3H2X zeZ%K^=$wDG<*&0@0O9VZVmZC7=D^Zmc~>!Fox3@fUWbR`6QV5=#n_h7k#>}#^Nnyh z1x4<@BmR-Lq`;llaf!;4g|qejd4vO{t6034OVXRv+i5 zs)9#i*~sEO=`)9dfWCokP?KPvX8Dt$`OisiCqQ5F^n5>mMm47+%zfCN_o^Pux!e8E zt!`_vx$Qe$s_RykxRcseRu6trnTw?!&rTNflGW18wc-<)QzQ$=KQ@`2iOR2{v*X-~ z9gj!xn5nfmNHgsN<}>|FJ?ZS?7~f0vF6Gzu5)tw0pUcha3~QcKbm$!u=vQs=pH-N` zwe$GC`*+;;jY0bdg(1Uip|6EUS}mHMQiK*C{QKK{u;aVFg95J6N6ter-aHhWo`A=k z6Jay2$dt10F>XSnTV@v>k06|GM-ZyLAe2;%y7LE1&Dd~#AZ9k0be9O~PgVeRCXQ4k zF}BBtakmkRHFK?4zVdS~Uh_G#?XL@{2noVQ6F+&h?;Wi9oJ1Omd93_=OBj9uH*{2N zZ@ngemHN8B-&ZQv8H?Byk3H{Cq_+H7T|GejsezL2Z}s=1{@~I7O?L-307pS*-3^Xg zoDWFZ;}$dQ$|;IMg{>PzLgJq+$kn$~!XnRXdt6C#9&)QoMvJIZII$E;g0*wD;{h9s5b7 zS$s~YzE04H?Tj~cR$~x;YP?}tn{^d1L^lEY_FuB~umt31ZDwZRr);ix97Op3Esu}M z*?hwwM=RYzs}4Dv@m&Z6D9>2%nNV;GxMc4`*@xGrU{C^Aj?{^t(|r7qIrXHObpUjZ z0c0<5fcc05N2)Ivm`c8iXJ_!UHG`jNmw%Nts?UX`W^1i*AQdtKSU;JVP&dajo`ESl z1%?D}<>;d2;!2zU8nO=Z;zy~Mt^=K~94TaJrG{x7q4cCTn@gs^oS^M}1UK8|i{9H@ zHg#BPR=-QbC?D3DE6X?tr>1PU_i8t_*KVCTtcB(<5}HM3l>?{4Q+L0!`|=~}k5kHa zxW&hQU4ljCRWTt<3?hy1gm|A5o?#rabjoS1ucaBruPx_&UUUX4Sts+Vro3OYYfWNe z5yx)1Hy3JrR+Nv7j;ko2Q4k%&!NJ#0m4+N})N>LS{mB1-cvXDnH&`mS!8@4=?_?@J zk33qk65b#HF*um-*-Elh)qNNvCOJ8vY>k$WN7L-aNa16Ggr#i^wAjr<%R&t&b0rxw z4pa>XXG1xPx`@DFvT=F)>a0d-?N&Y#W!VyUQ3;WqrHONiW@I^C!Ha?a!Q%JU@Ic}m zna;91^$nqJA`NQFrXlspMsvYqRHMi>LY7gfm~%D*@YV<+5GN;taK0KX-OImRYSMea zGBMBof?^tx?Pb%`eZ4UQMNS?VLU`sdGLHHGwPj%!?r^ObU>XoiDy1$K4b+%)Gjt!K zQ?N@B%K0q{XILTD7?JK?5no>$-&h-e%c0OZ9%dUqm?=$+8N`P}sbIL5{&L#d8G_7if74>>Z4oYq<8zhuWaJUhC!i}MZ_|F+&<*+-mSPAE1rQ6aB zRv2|?QLr-HmeU!AK2~N2SW!nt;Giqvw@hgq!HG~YfgTOgNwK5Jh)_07NEyN&#N>bv zp0+5DbddraSF#1##@jmqZ<&i^P5gyn+h9Fp1#yr*#(*ErB$R_LWr9Aui3Pc%kESv~ z9_HUl-N)gW9T)v`?lt~AH~xfh3-Vy`U$|!oF66h-cfTeZ<$uKT3o}l|+!I(U8fVv- zsVuZF?@MX#H>Z4xEqbxInj*D>UkWV=4l8x;>WUHZ@AFmkTWqpl%tc;wN`-}Vu(ZpC zqB<(ert7LS)U&=UMhUUdBr(}ENoPd#t!1-AONh4Ooy20J$|U=I@|Pn3tan*>HJBR6 zv+6l3n)&fAs9C4ON?ADP?vj;SnXqMayE75j2wJ^ja!Z*Y3oYR`^_IdV6dy4SmUJjO z3>S`%BJE@mic0wnEooGj!pSB>5$2neT{z*^`w(Gr4#!%L49&aAE(V9@KTF$^AF*?I-{?5ixp?jx506@ ziZ_lgn`JBi3lT$hu{gMBmS9TaAQXJbJJuoKuPxgWPV&cl$@GTutKk{cdjQvm-t0+F zwb9duxmLQ2Spuhd*m@S)9{e5P97dC|*7GA*$67Cqd@a^G#YsYgFwfgGmhO-r>kbwm ze%Hu|%ga{|AWTUig*T@>fn1-nO86wOCBDx4mA*&}cx;l^@(L$D=_X!QI=9$dSMl=O zsrVaI+`iU#|D026thF#SzYUDXS_?w;zvLq0-_@&z?^)NfGq5vlPH{Utm-8ZbhWsGDU-Szk%Cd1(7d{-qn-=95HOh)`Hx5yF}K-&Yp zUoPOpE5$~D7-E)OG_3FwuQiOGPRC^*&_2c7Ym04ahu!;gtBbXE4K*yJbFrl@)S4G9 zQGFMlBz!wg7G&yWIMFykKTKKNs9!M7Zdu&nLw(i7L2;_k|JQjA2afy0EWfRKB-3ww zK)+wIbAE_7IYP3#?XFdVJZhzi-t;+C?G9|#y=4oEv8L5S{K=`b5Cp5rJ);pLK5V_P<e)fF4*`b;)_%lq--^-xM%Vsb7twzI4(+Rq_fFWgKgh?+LJFZ=G2@T~JVV>ws{TzJv98Sk z5Zl|u=-|Rc0+@DHxD(ja1yvQ8bX~4rF(sv;$t#t9}m=b>R;?vETP;sT5 z)qC;k2>W$8-o%7qRfl2W%K5PhEJ$fQRK|yt$s?3!*SD4x=tk75!63&te%w#LajU{| zE6Yk`g$R+XG81g8i<82urE3N1#7!sW&Ej zlB3pNad_Snxa{-1rT=&ti559J05_ayTBH_2kG*}&P5nbl?kW2TRn$F`-{`KG{rMeJ zwI)rqL)m%P4O8o(vn*7a?fnD-oh4wzn9k`sqjLpQrvL3x7m?a-sMP?2Tb_T^7FJ_znMa;N8M! zGFnwF>xVyWWxm6$DF=aVSZc2vOqF!d2Tg>)J8|t8$LgR;rz8d*5A~CUpI^iXF2BPG zY^zx(MFg0#Dc~W$p|j3H5ysHegAZ~Rif)~zR*ZPGkr;%4Gsg9AZ?t^%(HvblCVuhi zEg1}uD(I)P2WCQle9U z#JsI2wd~`)%s@52D%uvzuTr4UpI=R9k~6h3wBhlxXzWm%@YMt>rD|at>GBe+eKq=u^_lu6kIIjLfBqRlTuAf z)if3ATZNbCQ@xM*?;Gv+;j$+CCBv&un3sMcNS-*%b1SLn8$p8kxkG@J8zm>Z(@K)YWkOeObW*E=QB3%%($=#Q$0u|GQUm zh?w#5vdy%u(oNte@NeaO_1+=kJLw<5RfV+C!mqdVPcJ*|6_agDMUD1*2Q%Q@R@+Q& zUB}K4*SnCs2b9#kdZ+s)|6V+z`-Ogui|yBSBr`XZeVPMbub@{6M;%dVG=V&-UsO_k zVgFuK(ESAeUgXyOH2+>y*ZpknMcrb<UvK(Wi4^}MF^4_^1ScxpN3!1RBg*Nc)P1}5B7L5-{Y^8^GMQ8NAwhze zYT?8f{A@L4#cqCbFg;5482)`svho(i|5cV1KaK9#HzfIuCom5q+Xkv053nh`t?WerIPdp} z*z%UhByBzF@!rF7KdXHn)uu1v(Ifxk3Y?a%K`yQ0&iEIP`KjRq=g-V2N*yAtmh98W z$MU3O8nHZgMv-8@qwj?Z=Ezf2NE1hy!-=)_z ziGAgLEe$8hOq0a->Eg$8#?L=X9COAv)SeIWqL+zS%AGlS+tc~c^R&KcK(K5OJw=Xf z+!KC_v^H7}K>7d1dA~$w`s=UEgd3*dQO^Oh^UHSK%Iyjs=m;&ft;H#S`!Vtv=QK-# z-HYV7_lDDCeRFhmPURhHZ0DZ!R#~ni)SsX(2I`X3R@{gITV#Hv|5{*C$0C0{F2f>= z@m+{T#%Y?*2$^8NSk?B6R^(SBWIDeZA+z-yrnmA84waYbtoM=>&D2*NZ$)75Nxq%v z%TH3#er2^5NL+v&r@bA-t)$NaXvJ-bf4hiVHaiiZ{Z)2$kFF;u@-~=hn7L z#dh+`&sI6gs|De((SF?yX9V0LZlw!ZRV;b(M7=msULx+j+D_*GD^}5QBotpC`oTbNpLv!d2P>PaYf#2 zd46h`VF*H21c(%1?at)WEhqWDZ86LxZn(NjO)_Tlu)409;fk2#+v+wBqVT~>4!mO# z5mlsRzN-&pt4=U)Md$;0b&?IqXc^%lX8<2(hM`l?_KN-C)L`2>yAKfxU4sgAP-E(( zNWrR?h7ocVAKIuZ&SBnHBub^Y3-H zxd7*@7O~=})%lByiiq06%ddlU+>)b<2dNtN5iv&m6^AxLC>Ks7>zqI%=QXj5;XI)j z)1b2;gmZB?f`sdup)HEjh{AZ$Z(EDVtqQ3`-)hq$SQ-SD{In}7FENk@7is>#*-8;= z#jieAQ8{{I_WWTx+D^ouX7BH}9fcZ)TdbV(@tML<7`eDbfK)a1&pxU zF;Pqd+V`FqUBDZ;8pHy+IT?j34Uss8f#V%%+Pz&)rYa*O4K-ajV@6jW; z7Ht@iLb@<68mNfSn5sb0Xg|5iVBc1h|MiYgw3nW!ct!c@+q+gg&Xoy3bsKm`WH3_1 zm1K>o;zcn(BG6D35VMr=z%B-HK{)muzAlm7EG%pNr&2%*Jqshq7 z!v)g_Iu|gcMwD?OGh%U5dbsy?SD6#8n15KEV_goJ@Jm<6Cz^vyU$Bn?z0RwEJ;SBC zp6*&6q!nD`lX{4yz)*p~$ z{eWo%vnFjqo`sxqZ__&sIq5!OS-Mm>s%5t{eVay^V18!9wZEuNKsy{YjbhK#0pM3-R5WiyzH`@PW#RX`Q?xal~zDIhvfg3hN(m89z-e%HOTJGX|J5npJ6a44UeVansVeB9gUU> z@!~jvvVdP@`AuAnC39|ZMcc}B=@)?*^iAXXKVi32gb9T|KLX-?Lk%*+tCxzcCSP&x z4K;%J4mbk}72OaCHOvr~BzrVHm;*f-dmQvR)|)qW{mX4>L}~yJ4iEa3gNtO3v#8{Y zI;QnEY8P|LFDvHk$Xr3+Q;YDz(}@H8L^pmXW}M;o&-(HQx~HyOA7QBcf*U%v|Md}# zk5I$C+|#)~&9tgosy~TPZ7kWaa%+lpyNq#kb5G z&(rYW4W#Q0Z+|1a;`7t058HZHvLF;@EoJaaD7TQ!4@R#1v`xpe9B&>ntN^;8++eD^ zBEMPD=Q4~Mnkz#0uRyciW6e}`f3dRhPO~dz`Kt#)sXws_SW~r6ZPx(I!wHG{qI<|3eEe;!E^_iD2-4N`cv;Sr`GKp z5*=TgymmldZSp#1md@&{jIZZPK$4W$M-QI~D}hE9J~ne-8&8Qd^Q0nu-JGh#Af)Dz z(X)aIgI84ig*6g@7u4tjk@`g12DB}uZ(0L;adW5S2p_hkCVxkU8r~x-93jqTDkBSK zF`omgh@HPq!#TzkQS#rJV?NDCZFnb7?aT44cU^CfSin@1`EN>Z3YqfXlCo-UO-YWm z%A%@DQK58Wc<@dGVHXpx@b=fjFTNjMvGcU>VSiNt)5XaGd_^m~UOss8=<-U2Za(oN zBIe(iP^-Arn@?-KwD`;i)vrUe9QjM%`-Zx-J)Q+Gvq zbLcxq@Gh`?&P?{suYhEC9l%3kTU^)2BzyOYuim~c%}KTH!=QZ737>m0|9w=3%b&UJ z*ihZIL;$K5;iU@6aPHKmsTFm*hC~b5Qk(9r>yeQjsagZU71OA+(FxdLVALqoP*EQ4 z8oPhkSWGES$JzbkMki&D9nU>8aP?HElPH+LFFzOC8#87#tPo7vECpm9ceUlu+%!M~ zU=VO(AKcgq)t4ih;YC8YN9;@obr{Zc2=^WS|eW2RVOcg3iErSrUiWSPcA6o zCe+iNLNlA|Kt==tsxrPgWA^(ph%D(OhU6d`Ax5?HBT}T+qb;02j)&fBBbl$^f1c$6 zTo&?7&@R$%vaotYCjllZW2@5oXI`|qv|bGZQt8xV)XV1aR|ORy>s55_~+g|1OMyZ3TUfu z_pYWE7#x^gl*y3B{C^`)G4ecW06U;^$Ww6*03Qax0iXfk-aBRgHNXLR1XL$5zl#+3 z4;f$?f>169lK@(TbhA{S6XI{ODg3?9S#X7eryB=Ae_D~uYs$rpH?Z8W@?fM>rv3JK zuySZ;Sb6@4|1+!zpiZ!|mdF1oR{DG)R!(~-i3b^LWN~2+Gu&%J5 zY%8tLl&O&F(#fhC{gv@%Z~0dZy~A(n6uo!d2zn3i484;N`>)X(j6a#gyQ4RK<$sD+ ztS}8eS=J_o&0Y`0u%Y!QU2&cJgD>69-(`%8Gdc>5V1u^Ncjofh0_rjU=YdT%$!azQ z5MRe&P2Jl=KFDFrP%F7p;$gXkcG&OZX5Y)hRRn&iMDCZ$e7P?B>q?l93G=#W;-V(r z;?3?Sncd^}H#!pNy+mN6e(8^D63}YFd(M@uy1|uI6)J1;HCg!6P+8vclR$&Sr0V$# zsHMQ?-lK;SE(tttd5wq>vnd~Kw}=DMSUci{beC3fH1#mB*_0q9YjYPON((GR#`ba$ zDD2{lD&tS%eydn^A`SZSfdr;*q=UvKgcUbYUYrVOL(?mtumds5puy4v{>87%%dNq3=D z%{T{vL{VOIeDGXKe*{X*;CD_yZuL0*)#|#{T2l6_P(SQzgnJ{!wGh!lIYXq?>KhMn z*SL8qCkotTkEfGL6%dN{sZN~9T0RZ%K>%7G=U)Rhv& z1W4u^4uunw8Fgt+I<7i-dRv$?rmI(17W#`wSJq8t5s6f5_gkLf>csd$@_+wROHaN0 z<^^nw=JXZaV4VG!X{78_bvf6ib4zoU4=l9p4Vm@C1%XM$|L%J9DVr^h<6e4pAuxG= zzj?iUw3R$k`u*2wK;MWwwuRGq^ktu9c5;s3`}D!0y{-bZ{rMWuRx*#XT9Rk5RJOT5 zR96#hZ_Q&L!L4&A<4H5$pa5Wd@o!jIS0UY!<6>;0H$UeUjg9Z0Wn*V;c7pofCOSp^ zvxfSoI-*|ir>->Lw_`;u<{Y494TMgYpRY%P5g+}X^)`-N-_5TjF2NjCoFOr@0y`Yc z%EXJ4i~BTe*a%5zfEf%Rk39wQ@$M0;q2oZ~c$1ON+;Q@f@L8^}x@>iHBY+a(a?$;*>az}U) zT%J|#R+iMr7VfFM#P948KN+UJs0G7LY zaKT>02OA|POC%>rkEd?Io3x}4(|z1NT8SAwruYpM*V2vTWT@Vp%FL{p)vCSP^5!i73b&*A2I+E4?INmZ$bQwD*9+r{?A25G$6`X1518>^QQ2jfms?BOd1g zG>8`Y)zwCR#ilLd7P1=qG)O)0CeCXqYvLgM%7U*m9!*f;j||nO*Sf96+myTxE)V2G zb@|Rv{lz?}PIQCAdI;|FjnS@B+?;4DY6Y4(R4@0fd^zRM&bZnPr;PfIk{AQ`jQ9K< zopPE6ZLS;;D75zDhIWE5yBI14H?NGu!CA?II5KJl2>>?Mjr!mgNE536F@OalPTVuj z$jx#fzp^Z*i<@AJY5GkTzCsEMxWVgTy9M2d7CBU0n6}Rmb5`875Z{~Ug|8Fiacd{(V(FXASb}EGco?rkYWO!bY_$HA$`2M)|e)J>O z?g4QJH_81=!jsp?)iQS_C=5?-CjKxq|983udaI*tr2yVSX*1HNL0h|+9$dt@5G$!A zTa3MsC9&#a*>|(`3anWXfNJDEJa|Pl`6af$8eY+g=VnE9ev4#~>NP~G2(?WT{6X3X zbL{7imvvCw-i<1YFd5syq8WFo=}5BH>Afvi}sg^*hqP|HS`I+wTtV9e&ln ze*9{Z*h|k710J12I6|_=6+bz|`47F3Wh?033O|tN~pK(rD4BFf&_+X5!Lx!%zbU*m|F5sxJa&aLz29U;|#;-{UHLZc*Kx1Ij z5D_E2d5oqj5nwucQdz`m6So01k%ttiP2QFX=BSB(o(Y@?){nEn9miv2Dn4I^iWryn zF9i(FS`RgRs{6R>g$A&=Uf^p$=gu~IJc=@{+tnpHZt9#7*IhQXDb%1?;MnYariU8l ziKCJOQ+KqB-+0Ic*Ef7y5*Oq&Q6=3~zv!*{m3mxro4Q?Hqi4<;al_Q9Goq&{_TY+0 z^kl005!D3|g`tMus0}_>Eq+uX-BB%!I@OtahCh5Zna|ocqsE2QRIN>=+K1Yj2x6)w zq1{*(u59N9b0y`Cd`0#%1=lX!)Tn>H&FkRkT+-OcS1JBQC=CBUURCQ=Z zv$zMX%tb^tZk%yRO?*=zHorB3ywqeDLYGD4Umydj>v%|7o#?3nE0)LN zDyj5`K zKA(KUwNc0C*Ih3@FMMRLmF=K1SBqa~>M_~C$--OstV1&kc@y74ta!li7ZXo{?3_)! z4b($?9;s8v^ADBg8*n*KG5dL1tf%R(*wY%7P4@WreLUL8BQ~14_;IP#g>+vwhyrOe z8C0Z`V%cTx39ZfidUGwElK&BqEaag^nSDfG^pV1*?IT#QnfuiLtm_bC?|a%duFOQ- zx4-arehgB%5zJ0!PQ%o@Bb+#uNXA>)$(!UNc}G#GxSP_Fut9|T@=s=-98T^(Go0wp zkmyf=-Ypo16k_u+{w5Ni5N_MMB~)x*6tu8IxhPz>YLN0w5H~dMH(g1dAz-U^umKaUMtZP6z*PfWzV(2u2!jM*`7^h7 zvuw`kp3xpW98z9W);sjTiZuHR8R>PaMrWYi$bj^reV)s9(7N-1K7>1cNJ~hD@)0vK za+=Jl6x4&1;^c5{qwGs*oW%0HZLUF_nEkYT-%s08Reay!rT0@_uz#22C{>ZdSnK7{ z9^pcL?ZtVK-rwD@zyIS;7!%rmV>@%aYj~?&B7;Ip?lw4fl2qX-cq4hyXR%%RGjELT zEQyrIc2-4>h%HlrDs308B>l@U)r-$Y*HzR?E(Jn8b$1YNmI7j4`ZV{TYtV>aMa2K? z00Cp4yxTqa#IOA&9>}u>WbUIrk#5*0>?z@dZyIsCwy*odRWQi=nJJk}>As=*{u=#O z)bc=_PEqU!POtNuypb04eo$hBmz-kfp@m&E%aNy!Vdn&}viU z&#p<^Rr&(mOMOR0wAm#j|DU&MxvTh2JgMu=Az4>>NvJw2u%*YiB>H0vX75$?+l(d8M>5P#2YRS%n}E5 z&kPW|T+2<~OItI1rp|lsJQno(U<&3A*>>0J|IF*#_1*K1%!BTc-a+#=482FhUmR5l z0r!BNaexqf1ITlPGn z-%x1&gAjqMZlQV8xib23yKkuec>>O?NP|b{RYp>@5Pxw?SFwp}N~xx-k^3@cEMHv` zny(l@uFeY0{~-<_uBt)}b0vuq1CCjLDL;*i>~5*s2U<9FAZqI;*Q{s@Eh&!e>=K&a zf`*Rm%n#LXK;y@D?h|S_gNvZuEI{6eg;{XiIJ_j((1o%AY^l!}KN;|vfaP+|>~n~i z5~^SCuBL_>mT{G-7|VbzXow_eAgBxZv28^`c7VKQ&sIpgP<0dK|>^QuoQI0%o#d*2jx`ZxTh*QE1YN= z1llxqM1A>$A`DZK!Y$-J;Gb~$*3jH@?fKGD6(78{8uKFX=By3pe_ma;qpM|aAg$&W zl8Rm4{qVeH3`go1O@5v4HMc2T*l~lbllnE$1A~q@@XdS(`g`?0yZ1N4JoSJU+es3z z?i!NRAKO{z)~{kayGDiu&18ts;`QsKI@jt8fVkTSS){$4p9_a?6ZMJg8*4pI_RPd= zC$_EFCtAZmj-ILNM6~5q)_v*MiRtWEaJU~IJxKkLpo9PJJ3I?TfR&)T$cL0zdp9Us zyvlaaIk7oxeL!6DSuA$MUFwMYd1&rjjQ~g7aQXJo+$*`SNyHpcw`*%@5M1?nP5#q( zjP`-3o6;wejqUZj&+~q9cXNiLm0aWk*3_~T-c-LSa#FzCLvm>GojlXo zjuoV~CI4||u>q%rYA;z?zaFd39~6fS+Z2D5^XCYj3F__)KR21+cU9&zRYp_U&pM~x zJw}6VPwo>veA|-+(E&}Cdj%c(KHFilAG=~~*9-(v8-9Xdd@xwg3N;*vdI=gQ`HjXC zw)-?P2x=@TP+$@hs21<8woh;tU94oCZ#U1)0qDM{F4kTNg1+rENH7q_C;)GABNk` z<4`&QmjoqDi+DRtIJs}UT2he&uRC%}O2;;2+RhI2)_=E$fKBSeE(@lq zi*|1ZgN^i~Dd^37-wkqm0(azjQ|w8u+Uy%0Eyzr!&!fozOz($ck#-ukuMQ*ji%ztn zuA<-`e#&J$4izQ(^moIH&zUoYVP0 ze6(z#s>SP}@hXSgVt#Rbpl^LC;zjwX8XL?IN zeJr?xPqKsRp`F>!0vVC)C!r-KoMitU6q^5Ua1h(MZ?qz|Yrjz4aSVbCMq0cdwPrD~oJ}wpGt$j(Z&AZO zBvx{9a*4#^x-{arXi*5{gOcvz-(!DV>|mt2WQHimfLoV_rsjJ zQh%V1*v`SxD>J40<(AGe(Bz!290T==?Av6t3U75NGihs%jcspb!A*_JouI{bjt@0F zBln*VH5ciS<=j1_L8R~cCv6mN zDn8FUO6ih(B_4ZBlJB@2joRJ5a4O!t?UOUzO8=`PVPE}6$J+2NDcwZ?vCD0D)04=EbbMnCNCMCg-cgt?=U1jY#Ma}%+w5%cP=+`~^$Dn2KH*WZ%c+Jnii~T&2qgfptlk>tPUi;Y#I0A0aDI z*YPK_mK4t1-#Q~FJTqH(cuV z3#t!jVUF;|%CbWNp)^aF3w(}w`$R8vh3aS`=$CV#-kA1FroS3gXv(S737-S~j+T1i zoKKmpl?UHtFaVRyMXX9b#9I4Cj*hhsiww*t02dJo3Qd0W3xG|XZEk4c{C&A%1vB!w zTu(`kZ$A6GHu1t=2x9p|^ZVs~Sy&z>)cUAc-;nHtOVtcAXa*CB!pPHbbU~y!b%fQs z)!VgNl5ndxgJ0%|a!rRH3I-_h^A_Z1j=#3!Wsd*$RqSFLq;o!OfrTBukBDC1!I7II zhGOD$$i01wn*nX+UURS^3Sp6ciajCWd1&+qNthT9yyqyoR6{STm;ADBfu)o+l0b<` z3T{?Wzl0K7Umznm#zUpb;S5Q_%w4p6YAUrVz+sGW+Pw?-sUlvfcJdldy$Q{I9m!rj zd7ZB3KV=iSyW9*_HhkiVCW>2_lI&?atm)b6?XOl7a#VfTi(}Z9?0q+FhW~!2xt#+l zC(JbKH(9v)v`#j9sEl{>KRY%58+pfUATa+IxZA+|U!+>mKq{r~OI@kwDkk%PA-`t+ ztDx4uH6IAacQ^m(T_v_Z2O9gfzYe09;8mqxVAfn&c3wvu2k52p@nzqb+Ei7)KHA-p zu_}5rtAK7WJ+)C3-^=&zlkrW_lljKmfJ3*vwX^Dd##aaW25lRExC%zP@9*91`}!~U zecw>S%|%bB&clLk-_&B&Fh%vY>f~*oTbqDs=qD&YJj}an62ut1A9f zMZCE(?p2}&$K%#IA0#~}2FGqcD|%7GrszR(8sBs@cqS=bnzQL=|c@aH%5CMP1A%x@9iug+Ff;OIPs!|&F zEf_8}iF*Z94bHUb0BGdEYo=p#rh&@P)FvVGfQtC0s`!&cdfBf|l9^N)P^;gEpR@^I zY;vj!E#ZK^(e>LR#|H3(mY9TN-DINlUt5(9(_sQ6VLmNgDypW*q~VBdcf8NuS^sPs z>M(ZP8VP2Z7I8ApxIn~Ly0;zPx()uI%ScGnt777|uTYHJ8t(@CwS%1Awad2@Pjexc zPBYkI-qAWt9Z;P4mfD5?w4+kUxp(%PPA2y4w^Eq@AS&wXPhpcc{SA$@&rE!5UyHJ> zT0sbbp-R?6LEhqh;}s150}<_Yt4iHMeTnzv2fhLyYSWrOa5|J!-%zLZ`bJ(Abq|8Q zkI_Y6E?71qpu#q8dSy&C)1^5NPJEdMrtgVB06g!fv}roUZ&a#L2rwIV-~+ixPy;AJk9W1qpZN>BVIXb%&#Bt9@*qu=Csm!MK1SK(yv@*dkNrsngp zZ2>dSQzo${jI_g~dMG|A1HqupSeq1L|>89rWw!^l%-@6I9Z z`QxxJ%O8E(^M?`mi}>Ry#&J9T=;8Q-?IWTM9OzhrQK#T45jdO-UZV53H~w%2c^C6^ zJ9@jR%h8dqAZz-HIRuYa@q!aKJaNS|Ef6BkE&*e{|@}|BU0Tp zdE*y+8U7glW%=WOBR_s_0dqO>Bf}r<<%iE7j#+RZi%;N}EPu%P6o?3K(^}tjlVAu$ zOV>9ftaF*CU&NLi#B^TK^D=M(o^hh(%Zrqi-n2hWicAYhqaWLW0Q^T)@3G5)w_ z=^G6dZ*y)#tK%cK)JcOFlFPpVO z$>`p}FTpf-ep({Kg#1 ztc1sEoAX8EnOe`wv`dc-X^(bn_;SBtl6J9p!ggki7X>|kb?|3~K*a+KD0MWnB>oy}gp0l^z>-wg1x~cqf=#}R*@;~3mKF%0Pj6A-w@IRSK*F5WwH+>t7w|if+ zj4Y>?*}7Db{l(0=)0hE+roV=(0hb)G@9C2PfkhABzwq$C7>syBgGRjWwBR$2vLG8H zdBbm1j~qK8zCB7`vQqZJrr&EYc6gC-2sU|}zUL20^9H7dU@PUy@Amq!>;F>znT+}( z{rGbWc*~W4GF!#x|CxUD!he-?b6RkDKkD!{tdT0b(>IdbSuTy=-jk8EZyRgw zvyXmswCO+6AbqiYBtPt4?PuiM4rHL&75w=^HJCfTf4MBLpq0K?(qN3NKAGp1X2ZmA`Ueit(RM{dbD- z?B90EMmDWGuc_TQtoNDe%k$6rrN%#J4c`O*Y(=i**wc56Ry8g51jfa)*{19KSNG0K9Gsr|{@QH4B*$QT8{AK(!swr z;2X~P$i_+znKe%9Lp^65njE{0j)dl2MLC{?LUrHd%KUGaagiMRKJbR-$+esu`%bL2 zduZO*tbj@%6RI1=P3mO+aC^e6L-;$Cczy0w{|TY`o_epdt+*xhcpE))?)9qZb>VhF z4HnOEFeSr5s2%Z>`F6jT_(>PfKC2eu%bM8FOV=``B57W3ByX9U%TbfTK8D`$tBmD`Txk zM208Nd5u8unL}XY8Asv2JTBH+Icxt|>xq$rxr+2o4~Vs%t>HU0BKTsh)3QA^{;!JG zgcFT2XAQq~t%cE%&_QWXWlJ$W^y zU4`BuNJpGH#N(pa{6)yt#igqW(mW@~G z$Pt;stRBX#aJhlBZ|qwI5i8r>jnRFAu^Uj4zU5r{M#c zMB)F0S^bjd{F|WNnO7yx*+}gD%*%Kfxj21=@E2=6BXW+m2-U<|$3)IdkBhZlH0w|u zM?BJ(KNASxX}u_VvZrI!eRe{NY= zQ?4C<{-iB-YuPz@k%96+PYNe~Wce79g-<+pFp|OCkQfx+?+RAi`PFjd+v&7ZS)YDe zlLa0)p*lW_cE<tRpATBzcmpb;1hBHKC(T)2ki#1SM~;d zs9QC{#I!f_SIFh9i+s6U>OHL-M)bF|DK&BL{Ojnayg9yncJzZB=b3yA)hjn`MkeeZ zs(+WBu%$56@Gpo?{P(}M<>DXhnsC_4i4-&>{)T#Tk@!8k?+l3?x7GUq6kCB|ku?oP z365BUZe!gz&r4mN!QxcK2Yw~PY%ShLc+-v0-p{JGyQ>WB!yZk#~yRLS!6yP80oEbHe1gb>M(QeW1V8=iw1W; zKI?pNztz%iaIeqnFu0xk+ayNUh+aNYy?kz2?obwfTJ#>W_@+M*o$AXn>&w)pXi046 zfstNpOvvraJZdp26Q4)y#>u~6xbXYCpX+y>cNF*DPq{HOr_`H8{v;btspmUJb4dR0 z$jpzn5oO}b|CrdD`OzYNartS%BPZzUPM2efxRi6%t8Gg~8=P%6Chm43lI*v<3nzXr zJ*UG*N;KfYiDkC9joWaCy{@;aTv)(wsYgz^`=}?;W5kUYYIl5$Vu?P->t?)8N_8-4 z@}dgW>_SR--zA;804~+TWMSQeuOI-3Z!6M)(UIY37M)Uhr@iNt+Pa0piMv&%C%!Dw zmpbC5&lA%xGju*?X zD3sJD8vh^S&ILZo;_CkavKj^4pj@JWMvWS+N~o76YHET(H?YyDw4$h`h=>XrC84OO z!33IhS&fPKqeDWsRE!2<7aYmEI5xV7!I>e!uO3IV!EUIr?N+f7o0UEL}GdQ0!~ zZeA=N<6vW+MB?#M{eVzQfXQ#F;8w2W2sMZEn`-^r(cDH7slxd@ZYsY(aIxw!5&Hg& zLMq|x<=%5fbIj1Xa=9Vc{!(=ZO|5BCQ~HP7beYn zDBjb5wI3D0?hSm}iAGkPbZk8pib|d!1pgbjZ(OEq5VFS_dhifr+hmFWZjK5eK`r*t zvOs`5Zlm!gOG~iiqe4Kji<00%@Y)jri_8hwXuS7dC!cBTsHfEjZ;{h}Qwo4k{Ur{P z;S*XfkAQ0@&+N!*&EMkWd5-Nt4id`-7U=ZP2Z?j4L$1&w_crz%7E4ERe?MWnfaaW} zuUe!9@Nsr12TXSAM{Kviy^~+;ps>*7cC%DTv7B?{_TFgnXUM#xNQQbK zX)f*H*oI*#%I^zEsjq?6Hm&t8E@7AhdXY-KDdv|RieN!iVm+g@JC)p+AlR8ooX~C& zd0knu4?7t4{{aVM_3;THXw`yo7A=Ugghb=G#1yu@dwZv7BDbWe{M;cDgyW6+LM9xx zR)rIxKaJWO{^0yA6eQJo4{MijFcEO8ib=a|(r1ajjMS$UD#D|}Y(izx9(9T9ihR8g z6~cYG>r%)I_ZgNCuL#X3brR_AaC%$9rz%lCM&?9l>sc(Np8A<-mK#qn%|Z-*TC5J` z+_zg(`R#|R4`jvE<#~S~$c_#JA;S+okM3{^A(AD0kQ_71Wm;_^dHP3;g8u$4m5p15 zl1mrq)msVj0PX{(GV9o50_uAir;{0>eDH|Dj|0F!l2Bi#V`nV=`0%L|iex0W)P;+X4 znzQ?B|H~m+sL@wV<-ht4sA&Z^uMpODxY5@>ZgiOiD!5TIYpUjcLF+1N((be%WwLnuHKOsW=6JW+^N3JaZ9RPLG9&Cj7>%$#TdJ&0@7~NDJ z7DVhO8*u+9oBGVZYRe1q%@*H^NrYa04eRCkcTLA!e7tYHR30My zx|8jF^W{>4@T%RJFMCMmxDM8$Xk4R__=AGG@tVt=|0CS|GPi67ir}*CnQ)c3c2g>Y zC^P=F{0`O5#!-pTgqM(TxKZW3GdBX5Uw!gLtIfBIEGPWR`_dy{eI>f%c8cWSO>|~- zjwTKcw$<0YiF33Yn^rvg=d;z!FTc;;O}+^^V^t&HF&z&&()6gdn#*Z8-kbZ(YE0;% zsMH)~^}EX23&WOwKIT^AzThzus?U5b)TK@_k&!C>!Zza9%MuoOH}g#VwIY0-_J2h4 zXxH&*{ASx`T$?toj2^tUdc~W$kri8xkM6snI&oZg?G?Wpke|OlW)?@CwzA_1x=M8^ z5n;38H*^wj(a?%w|Bb<5O9*!T_&dU`Uxa)D`t82rKuG(V-N5Y^$W#j(mf^qQOP$B6 zjg8qzkW*lu^>*EoCI_;sE@Hc~rD16OM%d`7H{EMjnPUvsKrJTmdj|=Lj8?QxEBJp0 zczezfWbT0(#rf52NUe!TBJ^bq1N)M#nnJr7K`c^0YZGIULHtaLxkD($`w_Ol#Exe1 zu)h!$n_Abc)+rs0S!Zoy|GOcoy|0rWi@&=^HhW=3&K#S7wbUNUUe#0~>H*7#Y|}{O z$FYgG(voSe7qinedr9|E^{Ar}RA}8WL2&Y6#gbLbGb0HS4FK2s&8xzbKV@WNH#VWy z^PKwMH$JMNs=K0SrjsH~SLNl9ME>X-aBofn8w#=KEhXY7yy~WLW%~#z!DdOuBWxu z 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∓;}d8TBjeZ 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

kekubcq&=z`t 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Ⓢ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

y$H|*cKZ8o*uEE$**k-buh;lry^&j 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%0D`Nav>UjPiEB}|?kYu!bO4iZIdd)i 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 @GmZ)Oln|#bZkizRC5qF(MPhMA3{jz1 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

EBJe;HiZ?3 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≫pZ-@2*phIdO-A?XHX5YOwbb(f0C8|q&&bE9Yh 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 z zJ~=h6ZE|9AlGZpqH8W~>LP`MKHaQ7)T*SZ@jBfFfN%3*1;;TLh=|kJZ#14lqVu!@i@0*3~$nm%GBlO?D@$Gk3`>!xX{}K8hM?>C! zz3sl%jl#dUK+<&?zdFZH=Ah`m zhx}`|dHIc+J7zqE-`-r(ciytmU+-Gv`c+USw%>;SlMzjeQ1pi>`(4G;FZ=W>GJp8u zU`b!A%HwMeIJS?XKN0CWZSYY`YLN3!cM!&pCwcwd(thtk(cg^v_ch_|?^yb_H59&N zO-bK(hu8lP{ht)0@C90+{^s-XuU57wnSU#a_y2jmx`!MQ;j`*-Ky{ogB{-y-WLN_0c{-Q(@&!Y6-_^QYSPW&52rs_P_Dyx2q}o zqmX~^I;4;F_pxbd17p(C!+O+lgsR`$rY5JQbx25zYd>C^O;6n!1vHmBxwc}ya-%CAD_=rR=kD%!vHkeA=0=#FbC z{1<3{t{2Shx6)tMelod!f9J7mzstw>pFEAeBlj=$$NuLGe9IT?(Ipc+c;={?0%7l(e7Ei_7@Id6$=eqpFX{^^Yq!{`xNQ^z+Z` zO|E|yS|{7@tHZZH>hCr4sP@+wC-KglJpC(orjq*?S|Z+Yi^m_kRQ@%J{zM=0Z$p1T zjZx(IS?j*UYdiSZBwB`Fx#bqlOQT)$F{dp|+KU&*gboQgF6h7z-w%>Apq7@(7 zd0ZxiFEK>ooy~at&05))%s=!)``7aF_BUzIqVg2|<}D?C??Rsbk-2NmQ1}ar5TBp- zpZ~N7jiK;;7fZbB4$ptL+xy7%y9z@QU!SkvSu?(U35tI0^%C!iSj5_Y^@Z9i6nXjcuw-~F2L)5 z*Js~#r|7TTBl-7!$M?Ufm&#Y9@YNC|eb+<2{ZlTkB=z_BcZqj&;OVb!wt@6t&5^#- zXU40zRefG+)}O2&jjV_B=Lnwv$h6cxRQtV6o(AM_vt>t+@ynS) zQhuI4c>Z78kekHkU4r^6$m6S2TGp0o|CARc-o1ynzg`VClJx_>DgK}1={G#~<6Vk= zr#~fqUproYpZ2aojvpmAp#0*^{!iJB`dt6C4tf7hSS^WnmN)lbg;Sp++b$bMP`7vWv_g_C)zRa`NL0c_mU|5%hM%&%?97Fbf@zae$-90zaM$}|9f*?1qweC_2>PUkN>OI_LA{?Jo4|g z;eSKT^N%R{H;!Wa_nG~NvU~N}X<8@p{P=liCEoirZ~q1I2iKyzvE`O3-jA6>P0{-2%=9!t@m-V^(8G2Z^-dZfNb;agRb@^`*tZold`>hsB_ zlVtsC)63X@4)Fb_-KBoy{cCw6k$zR4{_3aUrcr|eU2VEhrBF~`63jg;G ziT7IMr{u0aAI{rLo}WDHE$sib&HA&-?}LQ=Wc|!dl%ICgEPq8;eR|XDZ>9JzS_bXc zru~;6FD1{P_m+_q9Cdj9%N=O&4rM>Dx3>S#XZ^}i{5Kpf_2(wcE>-DPS!x`tuFa|7dSX z`kp8rpX=CGvi^EJ^6yjfZyXwzm3o{6ODIACU92lTImL zcTcl_veMsvE1JwtF8Ea9U8i~c7I&5A6#w0xmw2CzeT3~V`WA)XjP!kZ`2P7rpYO=^ znQiDF+;8#tMVB7FNYOum{=u1-$FF;COb-gb9NX_Iz{fZD_T1i1;XiyN{gdXf@ekon zvc7IWYwTY(_?HX(`vyfnx`@O(EA#Y=P6$6v;bVHE{%!C(=FOf?;Va<%^6nh`_;BJI zy1wM@B`H7a{lr%LfAUocGC%am7ufz9vrrN8!-_9-WdCrA|97|I{AMgKzm)EOkn~^N zjPaojzEMWqpDFsmeI);G%l*h!{u_<&c#Fax9D#Vt{ah+8QJ;PCqzaI@iukMm0 z@t#Dq-~Zb<6A_`tCzJJM&2L3_o=VoowNS^>G+AVNgH`_-)e6q0+F$e^3A5hMZpHVX zyNq04y^H#D)H2IY*^T;qxku-{l>L;CN49PFFVixF^j`6Q4{vS%t-j+vrSQA{LHoDdk8Z_R_;cjcT{Aq`5#)yz z|3S^8lPLVEWTbzZx4+eUPtTz6-}IGu$8uX`j`G$pi%VCB7L6? zeQm}}(tn>r`mVD){XFAF?xN`5MEagj`S!oRZ!&2=L9a^rd4u`<=(IXl$oyQ~zf#}U z`-QFg|7G~xofQ9Sea3&kYLo2mH%m+&G9)fFEK0xTEHbHcRL__}Q0y+&U*LkXY=NOk zap__3Ux#+`YP6v-Ne*>~+8a7>L`+K9pp4kzaq0c!9ct03acRkkqkvdSQc8E&$s02y zu1j)kOnP!^n@s%|*dPoP^;7Uw`F&K>v)1A_2?dIZlsrj)XnJ}|SX3NL224|A! zu)R2`jzj-@rEiY`WHoe9!jLfd4oLWa z>lZCW~UA*C|#oQX<;d;38R2gpP2O6q3vSQV}N8+luk0R@_M>x zj`*x2L=XF-)hCb@>XD6=cLiim6Ab_qpwkTO13rqPi*G{c0--1%2&)K$ z2%#xb1eV?eB0)ePcp*7RAS59LLtl#YCLl%HfrTPMq)B&a(h&gxsRv4zDottM%+7n8 zyV=>?hJ5?`CGT!;-+%u5=FOY3GqXw25ed!^!&<}x*wafw7awfKB(b7JmyeM9tYzg1 zlx_8DEJx_;9}o+2JR?=BY-vc6bdqA4QK}v;pPcB7=%W)zj_KnJX;1#?s`N?iOWrFh zmCneh=#Wt6+pV1aNwHyPQo6^+M3NK4d!hK?i!P+vG;1)Lq;qVV7}3W`9}9=mqVI7& zHlk+|yt$F+>d6|AmLCM^*0IVS9g--pH*=7HkeJNg)`66Xsp<&KL~c(`boPjKMka@J zh=@&b){%ALeNtD}lOWk%QI3s?>rJ9235hNGB*Z5sw@r-F0~(%>?~_2*C$aP!g@sih zDH}fM{W?oM21dptL^~71Qeu*w?LQ2wT3yd$unI}}1G^!nOE?WOEkYZRvVylQePG(r zf#y$W1kEW@8j{*aJLB3WIOE6}XPjwY2S}TRYG-0{Oph2+KagANOZSf;`$5DLoAbY> zr=9U_M?^-mdX1GTS{+1^G#b(K3d$#*NTeXBx;#D3tKSbfzbd$)nt}a74+0~cOii$qk4hV5B-xOBVuDi+C_XuB1v2Y z_9hu}@3a6#5=V+i4rv+I)EPl`?_i}0PBw|_858FW?-CB*NtK#JOwcYOuBX%5bm>Jh zGB!Sm)MUixzyh?v070-WyN{Uokao@p-L;J}%7$=5!eV;HITMN1lLUn{y@?zMAF+QK zwYb@@IdkPIme7$cn8Np`_b*J|zqKhqN`_%<)MKr-bi7ef`HmIv^UJja^rLUF7l-eC zPWJx%*k5X2fdN?QcRU;L2hq>Q>z^k2QU~Aqi8a@r5~Uwrgz&eaAN*WtEYjah^wmzj z(_g2Y-6PT;)0ymlV?%%2zFRp(`tQ9U_y38%H1Zjb!&ggV`Re@Z&UMa@qU;9`6B-ge838rC4sL$vBuM7V06Qv(Ko7{gle`$!1{9ifc zhe0C!jpY54%BQ~d+xmB|CDJeS8cE-Ve!J3_W{C7(c~0)s;XD2Meh(gs^czXU|7_?V z`((x%k^aX-U$vn>s*&Rhk$zcv|2Fjd3|qcTq))fK)gpY~|J6YCg-CzGYO;4;4}a;$ z*D@~u1BX6-U!*V5_uoYO*8g+FsnsI=Uud^7#<%{XOUn+5^j}LP_9yxYl``g^`&z_U zk^VUH{yR0^Us^}~h#XjcAe`#w=)cL?3ZE_D@1I-g#Nsc;&&eanj|padzWlv=`FI~u z`d_V)B*lh)?xj*$k^Tigl2Tva>319-5GB%IO4GNYFQ1$Bvq(RI;IDBM8ChkG^iS}1355$p+ubZ2UBy3+K<<3ko+5x z9_>(%x8J+hPchNsen!77=~&J(^+@~;;Nx!s z(N}EfPYa6tLlnQC()$wPVtLk^j}oL+;;( z{s;Mj4Q5dP9|-}gVg(kIhM`uS^e z?T>@>{ssDc`E9-+ZyG6oetiF}GO@oZ&`1A6*);f*|A_r-WBy_P^Y(Re|3rTbEyv_Q zyP+OCD@ldI_o*WP8Asxm^0~kC4=IQAKz*KnojRrKiQ>oUr6m3d^!fDvp5CC8DE)rx zN&9iEIek9=>bw;>TvUE@yhr$tGwbvGx7DdLM#TRMlD;O;=lS>g^Y|0O-&B5IC+Vx> z&FS;{tqN8{C(*!?O30&{*aR=7l`yz6N&x| ze`%G=Tc5X|5S`&Ge&Zy!%Oi}u8r;zf$(6|2OGNZl{=^rHf&#N}{^Nt@36-7R7Ip89YOdn^_TvwlCk|iY;bUZ zNPqG?Vt*U@`Np<;B+@TCpXe|1m%e!~ZjYN8HWXMWkOf zH%b3Te`#sejO~Bo`@u~_`VBXe^w;>-zuB_q4We(d|CFty{#fTP^@D$vAGE9^fnt3&eNhJNSM z`|67LA13?9DjWQzkWv}j|7-QWaQrDZ+5b;D^jDDd)n9z;FAqE*EWdNf{$ZL8{jJ0E3CE8g)BVTx z_)GVF3s0M|7Kl1J4vK}h^}99`%7i&WUQZj>~V3CemSx}L%HZ%|J_9wgzc{m zL|^*Ttk2k_hrj_f>sAw$-xUYR{S*C^I2U{=9zIa>|b) z{ejzw{w3e~hlku+Bhr`uB>8{KU-}s4>7xJf=~wvXV11GPX)?cAwV@yQV)I8L{X1lR zfO^}UK5zeHlaAdM*}nss->TmCm$s~B9%sdW@X4XwMd`aokofb!Uy^-1|J~hSZwrzC zJzhcV_t0PRm%aU$x8JvQ*K`x5f2k13zsIEf?e@-pzWh9#J?R8V-!%TSXDF$^1^Spi z%9%+6>g36ls~SK4vw}?{kR*8j4y+cDP!DD4c84p9^!+O{ruhD7EB&6^F1;ht-*$=J zw<9l`-)g0QuWLA+pIRMDB#vJ_?#a%ey%cy4IPykWe2Kn3&7|LLkGDSB0rgNuje3Qy zPc!NNi}sTk1AGrQ>Y?;=FPkgUckRJDf;)isfTJGDd0T#`^Se#y-v|3ikiI%)rVfaD zC?|ZhoW6g~q@OE|yMK%H9Zv>+EYg1u^f7$}-b0V+qWt%tsW(OWAJCqqkNIYm|DSf8 zP3MQ3_^Vv{nnn7`lNr@S`s-$K_J{YVBX5)^CXk)(1?lf1^LIQgsJymN|B8Aj@5uo@ zMfyVHe3){BE>AmP6D-`Lx8Pvm*V@m%Z;_vnW5Krw_;` z(s%Fmyn8YhWud<%`uI7K{)l1T>7yU;ar{od_^YDv$8X8}CDkvRRK5Yj;q~zTzXSeTZNxoG8oM^iga68ZmcV1M)*EC2s}V)S8=eoHcciXNzs zJn+6zzVgCF_YW}nPrw!K{_#C*^{nO~1}F88iwtR9`p&rU(8{3r<>31dbuh_w)nk0^Y%7wA*Mf%aVm>!~N zvsi{=x+u@bkWdC^Rw`2OMMf_@BqG}tF{^9+QKE{6w z{Svua^%v=X&!sQLi|x1f`Xjpkl8OHttysGU`McV)fQoiQS?$8j|3v!AY1Cv=b&2C& z-j$2K5b00p;;pZ&hIMMz{@W#-PL+<2YZ4dLh)h83PL_W#N2aGkV^hfNQnUZo2t0B@ zl>T3rS^CJry-e)C?;cO2>yu6Pd;2TYWK#QHtY3fJ$k#;vH{vIz=UB|_X61kFqFde- zrJq9QpXdk3Da?MDZz$iIyR3#te@O-J{MWjO^Z(ZwcU}|erxs$2k%d%HT>g%$Mf!I*eV0Z0OIJUS7U>Tv z?w!8cTAcp9gvCPrvgG+GJD8M1#Qyi@zmAro^v{y{H=g?L|Cs&oEc__ddeDK6|C{1rkk^U#q$M%;}RGfd$)~@_k#J}7a#uWLwYl!`S*VRP&{t{FE zAM56=uRLTOdGuS9=O(XyTNFQTmtgwX|3V&;W&GqO_UoaOtnnagzR1UFvc6cz96t}7 z|M--M|M$xRzPqCb@s>E|TRzv$t*&i2Q!((g^) z-;|NQU=36M{k=nFON;D( zYb?`1Jqh;VLcc*dw)wJLBK@-;q9&8Zd&o28Kj>4D5pj`DvJ#RkBk`$^*Xj<40AwWz zU3FsizmJB7Z5Q#sy@KO^o7s`1@39VrEM>~%LKL(c%5r`)z80mQ{{!#zwM#zRFXUc( zkY%3f3xBGT)t)K(3epg=q$Z9mPszxB>5I8osjZ+JkQ7_J__A|m`z3xce2>Wg@@-}O z@%=4U{#$AEC`qIr1p4kgtlqTJzj$p(K9T*F9pmixHEX}J{KIv6?5@J~TW8BQeJ;hd z^gq*DT;g-E0+cQ!($~0}?H72i;5HHe&9MJE)*o6warO|0eMM0<^yrD6W6rx&I(Sq(7$}rp%=4 zkU0N}POU`u*D^w#_|tnn=ITHkLB#TjhVhi*XJS|9<58pJ)Cl1I6V( z?Tf1uMEb2)d+SRVE%YD0B8;DbC(&|Ds<@9OfAwX3!U?!TuGVT7spp9`z^LaG;-4)>qc++acDGqse9nGAyX28za<_hPnRScc-+l{~or(`~GpC70h>(vGrF8`;TpLe;+7;?tEhV-|6`DOHuyCap}8Z zpBqdUWu>@LbpK3K`5DXUJ4(BBe?mQ!(;M6oj^E{g{lU-*xX&W$q4cje?MG4i3Bys7 zNjXW}|9)dm;CPY#Z|`{PyAs6p*YQ8ceIn8y-O*bg_vu33DB~7vEhy5j1J8Xif@%R` z{?o2Kej?I8#o6E3C#b&V_;;U(n7EJ#QjGdJ^%eMf`hsvtG8x|d+V4l&HZ=?{8&VY`D6 zB9o!<7l{=Xch+#`^Ga=aSr9~8Zu?N}IL+>nGGT}Sc>{hV1 zoe+_j1e={?#3UGYM`40=7wHfML(-q6c}9&!o_hwx#YZ{27#rLOb`3IqBekY8(Rde0 zW6wQmUV1By#+G@^KLIp$0nsxK3{Rc|((OPRd)^Rxmx{qUGk0W!A#NKPvUdyF&m}R0 z?ex@+eX}rb6RSJYdG}0=NQe$;o06Q6l1$&S%{-1jOK!;$#&f46z3{P72EvBM65{{l z5BB=fVLakH7UxxU%S^ZTOsJI>!pRLS(eKXQ;cTx{HiEalY?e2$OT^ODC; znf<{d5&lu#v7xH|8tgk}*@ayalkC(_B<+`!YON#ja7{JW9v8p!_)V|8^`!_uERbOTN9+Upio=&eFn;U}{-u%Qh zPyT5C->R|;abA-;$)0@>A7!V@$~{l~G_cPt*k4rJ3KMwy*u$3@E#to<{K+BzfB++Z zk^kS2zc?>NgZV*N?hOF$g96`Ce){~zA`$=2>sb8J9?sG=RGa)UeUwqX_X?lybccDp ze$c;1KSBvKO+w|)%y`Rviu#XQ^Gp2~v`)zkf_j{P^lO5(? zBL2(rAK7x5EW}S>`D^$))RV@2@P>!)Xm^zVe!FnB2)`Wo5Aw(Q-H?B)K!iU7 z<`*0IHu=MHCL{Glku%!U@)cOiJARIdW|yGfBX3^c0D=!_7nHM7cJ~nRe?HUO{#scU zM~!m816zELm^gvXKQXl*>Vf@T_1W_;1?Ep$z!;~IH_F!M+Z7@BRk8hs{i8|X{|c5@ zX#Zf;FaWs^h>NEklZua|{1G4PuPZ9MLW6nFSbzD#$9e_vLyjIfqSudH`|7?0zEK_! zfRk7+;_2#Fil3(VGUq>j!^r&a7yhRD7oX#xJ}+hN#IZ}wvr&A7!_QCfH37b__|MyC zS&_=?sQ;^+ea=KPBE0|e`W#(}=fCXxX;Uda&;P0gKCjQ?qyM11zhD-9zlSM)wuJa* z#D|LP`Cn%1uenWr63)->z{NM5=bl;oqJRBP-@j(!fB6)8I`c@!k1Rf97XPb8KhpQB zoA9SY{fPE4${Cht-th1p?T)h5%5t=QXu=;t#y9AJ_-cOEAk8fQSL+AT_xG6aTRrr~ zch$Ft54T~6y+iXXpyiA2f1QN(iK`Rqe@O}U`dk6@MG!yL91K^ni66uz zu<&-d+7$l|7ayh!V;36v3hn>woId|m=1vsr*&sp`e;hGzA;f0|`j5WikFgN|sHX*$ zq4R$VO0~V~--*!vaW`Q3s)Bt~jvxP3;Z8I;H<&(OHT553E%>8fb1=qN{`bVktMdAj z_=Xo?{q-E{K1%TVgPa4uL_qVwa8{JnFEjW6vd_SX*>cToC5eBk)ORfgbyz7zKO z3(BA0KdmR&hv(1h8^G`Z&5!a%xme-+`jdS78SW#q@wxeviNi(l`Q~C|%IYul&&=ZA zZRJnLuT1fO3XIQS{o*dd=12JIe_{SV279%>v2dqn{!05<{=W7jyFi`_?eavHzi3z9 z?)V*lM;Sc3&vg<1QP6&nBxWBR$MVI$044;o|DMU;QUB36|9=YQm-ioDpM#TRID!0U z*J`zn+Go#LHhzNb|FU2o*Cf`z(7^vO*Lht0&bJ?@)Neu8{}wz9_!vL;LH+3RXY+3* zu)i;SD887S)OAETRga%s{g?~Z$MN>z^$j5Wz}-NR9Qy`Qe7^pgL7JPYzaTzy`Us0s z!4DvZ_BgFk{KH)S7O~*Z>vM3X`S%xBj}p%ReihbVLg^)Y2|zmq`(r#Xd`G{*pXvC& zsD6Ce@qZrwy|_iaMEFOceXCq&yfvHUw+axKL4J~beF5s9oyIZ$uLAMm9{8sm0R9Q< zJAL^l@<*AnvW9T}R`J)EhJGw!ViS?p9>z1}2C*ofQo^Psvue~JxfJH4Hi120LuiasGky7m0 z$0%T6?|J)*HxRXduCwkadGHAKhxRkpPnci4RJaqr9T-pdKQP%pY&g4+Z~yc5<=`a5 zM|r73>Pk<1e7-Y%7WmITc)rumrhOowTm|()H)_!R3k?3Q1FZhN2BnALtnIO}Y>H%^L>3cLEs%GVNCJR+PU6@j=7SH1C#c3UR#mz|vBFT&5W%Nrl-7x~dF z3(K?9n6D@&to?YV2!CS}Z+vWj`f6VxE=u=;3xh=XgfZhxa+l3mm&)HpBo5;ca)U?Z-p0xcC_$F;+00W^z}0Nx zE8t)?QGS{9)RTYEK^EVd^<@{hXR!7^rsK>0{OLeI{8)VNuh>!BX z?+bb@$pXv>3d_!E6 z>qi|IuFrS^``RJCwh+dLw`Yvcx8ELCTk}}de!BwuZ)n+AJXVKf&i;5qdG?N8CCc9@ z*dIdyd@YmsXrK2xzS&J=|Ha_{#6BwJg7bfT)$ai1!Uy|;>)-A--|1ti|S_*S_nD_>e(W`D&dJ`5*FkD>flZ&g-rpTO-%sZf3=G-VgK zzJl^=6Ca9=lnV-uR;mG=KVa}be4NDx4eamE$KtbQ6Cd*x`A%N9w1CKea{Ivz-ePu_ z)R(h=`TJw(`VWIY=I>RAZ^}s)|CN`-pX9&dgb2R|><^*>zWS2*?;WllCBlFE8nd7V z_?k_8?0-Cl3|RF}EZrZ>u+JFqpMl_?>UYrp9cIt|GT;^i*4}YhF?tr{Rd_L)`v$Dd{g^>4!qY3@sx+G9BXS`CQQ#0h>LRU`MAp>{P{nD ze`0}DSvfP>(Vn0lpAi>jzJ3j+i}15uVfYyTmGz8&X7P7-sg+%Xe>5*zhDrJRmwW!0 zQnF4P5&o>TtR;-8Xn?Q5K06*J@%o5%K{@I9@_$75dsJ_H$8z9bDC7FwD>3q=(CD1P z=YwBWWA<0tx|qu65QlgGAK!a~KkY7Re?A(?6xCZ0e{ABbU{LbvJpCB4>sn=EAEW$A zCs=&0Pu_2$AJ3RwRBnGE_M`bf+8uuhI#H;uC_Zm3#_-)wnY}fe_b5 ze1i6`&UmXYiNE;I5bFO1f5aaH`!^|oue~Jx&1QvriSRc-d{Y5m8e`M`oPBQh&J`@e z-wx$V1AN6MKHt9W*uVSFqW10BMCP9=_@`H2yjf3bh}2>jm#^KYfG_UzB&=aRO0Js(H><7j`VR}`E0e0-?sjv7tl z8$Z8m_lG`Y{doV}B9bpE*F!O7QU~e0$Jc>i_)wy3L5s zjsIhN$O^v!_e13Pg!R<^RXF?av9Ld{&%qgwFR&cn8XZdekEZtXM5w>8{fYbgWp;e^ zV#n2QitvMOvz$bHj1$uMjK?>SH_A2RR?zrn;$QEDH$KLn%;L{4=nfU(A2s%0Wa%J( z!%n>6;XCq1`N(hgW)c1`#{QCk|A@u^%-X-whGTg}_({#Y?W4UUe*T4i6-4+k#X0A1#+RU+W!66JuYa*$#6Qn^Z+y&Ox0JDeV*eUt{>yLr5qzV5PlNcg z2<#&-g7)ord-Xf-R?T|#=_YEQ&tA)}#PyYmO?(9sKzX$M@b+H(VSUXwu)l)OL#Ei| z&pjad>1eGMG``8)^NU>b$oz^Dg83DkKF~D;A796fER&z&^Y4G{3l#)kKl1tpFnr+W zR}LO=+ePtRTznp6fzRvn_|3T!JFcypOzW344*!SG$%SP9PYwMZ<{#$f^!cv}cjA-U zn_AN6Q~dmsjTE08{PQWk{$p2p{O1f97*^x2JY@br0yn=UmE^B}KwMDZ`4pBL4@9qz z9K6)^P^rfhpU>a*bGbbrkB_yFb0e;wercIh9qarW@BUO`!UVN2ToHPw%ulDy-ak*^B$Tw zLo~ke7Fj<|4_6sBZl!{Kd;tc*1t^bniBF;UIRE)1wEu5e#2;Vf3;P$yV^{x%8}#zU z`RCwK>Vf?V_I8+3m+ zqy7qo@umE*KeF^M8{dU;a=k=L1h9D%HTq5ywi{l}|0y%Tu%iT17TKb-&Xg80UluV>!s=5JgDlz-UXRTQ6} zpZTW+J`UHLf#D3hZR2PEitm@#`E&6h86J!9{AEK^{K5Ug`~0^4ODod$gUZ>b^iS+M zzJ0>$d!wb#|Ht#c*M9R8%AfC_1}3u`buDN4t3m$yiVqqBgM6}fd`F6(#_`X7nBmLC z!BAh?tG`sv{&RPYyGZd}9DX$PALZm(Iuix(eerj3{Ez)!g}&dQpv<+emSgZrP54GszgKV0h#(zTZFnwHC*$WM zDwkl_zqfbM{gc~&;G;3@Lf$`leGX3Ie;?F7;2yOPzrR5@z?V4taK)d8H;r#RU!C%Y z$UYM6-;U!CI1YsGAu$2N37PvLbYh#aqW0mkF6=@D>J=5*x0r7njPX^4PbfcfOrz@~ zjP_wD)W2Ur`IUc$`hBL&@&)**Aj|%6+w1xD6lj0$gZ7&S_(~@6k^iH`?dbeHgFo)C z5(4|bJ2WU?Ht{v!od)v2-FYdV_&B~ji@YD59@uWyY~mxXs%uNqk?7}l_%@5-8}{OG@GHh;{NAhK{g$+T4CMUt&9QI=S3ed&MGM&+&ZC_B+u{xs zAIF#0Lww6q1L7MuzGruQNr7}4Zk+twGd|<<>z0_mxtU$m*-WBeSkO28AFpd!iF3KWzI@9Mj(x*B<{ska;sM;ek!-W)?BcU1n*VT;Q2m!6{wp; z5S)=g?(V$VYyLnetbcI;f8_uxPa2e8U-;-@7J(fe%C|FbKY9Cz|((1 z53}*NDuD0U1LHFb?D>zv-BIc8eS3@gFaG1H)s=7sLmf_?SN^3y1$B+&^u}9mXHqSNMK6l*o^lh>P-8 zztY!_UU@d}e>hHlDWe z9eLx47S*f&B6_~>g7T|8XZ4lF+rO#Rp5wvfb}VSeR48<7vO6)@%j31 zLGHk6p8T=?s|MvuxeoQ;QhWBn@`3X5F`3e*U%ye=gV->$vOF3?Uw`2zp+g%8#=o^v@a{21iPKNa}@ z0{D(V7fT5I)E7R_|IXapXDEIyj{gb3=i46;_2BN!!U3l+ALgA1*VnfP0{$J~|6Ogy z)Yz{kiTRH&{N{kKfSeHY=qcr24DgEq{#6V9zWm1lxSc@WsC=U;#g_p;8u0(Mzz+aD zE0GF6B!HZLw=>-zxnL0BKL-3f_t*uz{e8_(;>&M*?{;TI{w6*c|Zj`C0x+V4uGMAL?IU_zvKW z{yA&@#2+YrDB1`7ry}s@{{7!(6@vW|feSG0-z<)i+|Hd5oo#HzH zAIGQKSn&5%zR>OfFKsAXzL2Q?x&`%%a+Ad!Wx2ij3;Cx(0@*rF{+aT}^sxQV0rJ;% z3-Z?{z5+lfPd`56Rexdo#|h<^U;oM9Kk`DU!3X4@(57jci2u{0;EBLndrAINr;ZKv z#7F+&{Qzalv=cFygI-~2Zge{R7B z2l5dZf5{|%5Tw&%NPe&WZzsS%w18dUexJop%_hDIxY*8W{N$*<{te6~IRKwL_0mtd zZ!`atR=k}3zwG)q9Un3LAM-bsyg!K^xL=C$lK4vXLK8*!UGg*juH7)cX%k=7S&@0^ zAYYrIUG>Dr{^N`&#$TPv`j47Td@O$`Utid08o@X9k5)kaW%Q5Ynf;Y~vw)dcATG*7 zm8y3Y;a@z*_#?jiHcXhu=dogV)AP~Yt3TODp6{CW_a9z|;maqP|7$B5e|FXaoSatR zCzO{qtQ+iUfApUj7WjDI0Amt}i$9!C-f_tjAD=Il{gho{%-5Y{&;R-K6Iy>6Dym;L zKzvjEAwSdX;Y(n^J8%OVT>*Og6Yobl0`Uj@({YcLU&SWA20$49n*|o2`!5*f7wfOT zz(1uQ!7oAb_iylm4+3h!1uYng~J~|_mqp`FX8a}THy2Lhl4ZKFVpYV`qeYO zVf^_E@RbmVZ)@zuXWswcE0PjU`6CaE4NwU8@-=^=6dD3#g@KP+()pKKOYiw@hd*N%@bgo7 zeGX0v;Z6*X+wum*Kg{8uvB2l`IXKh&%i?Mie~Qn~zr1RJUy=vpzVq|n+KoF=lj2L< z`m3LzeZt#^*XQ6R1p+K=|0f;Dad@ex{~U((MLVyv{B_lX{>55*{;z;r;QXWk*=Bm} zkLH5*i5vV=zQXE9{|iumDL3Ky zmrZ;L^7k<$FzwWcI8XcF`wx16{WW<1foc<91Kc!_p?RK_@WjXVTc62r!9->ke18VU zE%?iJnfJ683OsM zz`k6{I+hQ<`1AO=ehus_!XIsszrOGlxRD@`*@usv>xqy1`_zQ|bu?u04e!GjKDK{k zzz=-8kiLJ`N$?+>zu06ULvqZ6_W3|&9|&8ZZ5HU4CO{qiS@@TUO2s{zB8HrR{L8r&Ghw;Q#;>h6h; z@vX$`%reRy7+k19<+As_tzp;@`-@0B~O% z^)q|+QJ9*9a>vs8{XOxqeoPz0_$##-uC&D-z6$uMAdesKB%4Sw^=)eufcO)^(FBm6Bp+b;kN@KST9Pc_Uyy+PaAURkqCcs8t~7} z;+tlZKl&xg;12mViN+6?lx6t*{0+zzu(DZ9fm13-dBFg^{;l~HtKU08d}vb_@VWP| z`0Br7{S^rK?N^q6M(v{j{$cQ+#d(40V`d+9HM74j{y~6?_-&6@r|;h_*c|X3Fn?eZ z*hh1?bPdHOKKgwpNT=nl6E{8cHwc~&b_M_B=U4dRF9R-$24y-s>G~i3{hhThFeKM& z(7xJi&pvM>FvvVd{laPcHWciG?emYI{PNF#edRCuCCVJBD-II-nCh=8AF}vt)L+?I zKD(N+c+Jr?z9KHl&&sFK_NNKI6WGVVhx*qw$Yo%OJ|Hg25^pu4`y-q1`*HZVPB63l zJ8n-YDZ+12#@jxK@4kl{^N84|uRlco1$q}0zF+FcYGQole&+0d@VZ=I#6Nm4^G~cF zk-r4}4KaH&|E{OUtQX;5{fFU`yHIs3nD?ekVdcOs{?w(d7mD!n2BGIL>CVsW?wH`R zg4WNY-BC85)QLX-GWpM~!VDMfqXjYl_ci{5xG3XC{4C^O>wS)YW7bddHGf)xyFKf`+d-WsoMtLD^*Ito*q0-98fTKc0=H$4;96qg_yL4H`R3gkQLb zxBnYyKPN@2YZ)znX{HMYU-k#6{`)s@8`h`%7mT5$zE4 zFKptYT~OZJu=X>NeR^DE{Lz2VF22ea@_c&YBR z=RbV%KRmm~mXRcgD z@qTc8crL+LJCNR1fm!-bg zU(c@}7xGSE^%sL1)BdT0i$AWZ>^gq_&!^Zd^@d6R#yy}{XYFv(`PKaXvknq}=z;wT z4f_?4E$mnG|0>+65sBS)(D;_d?H{*u0K1SM|L65NIEl}n>OGIGqWt;!8;21eo?jz> z?)G_jNrN+3zdv75uRJZkcOZWQVgJp9bL>L7EsRI*X8!MM{s7j$nDFd9j(mFla`rg} z`OEMBC8MH+tj3-16t*#f+F#@R=PKF<*E2!>8v0Fxd!)og2I>FeoXIf>ArVngiH)7f z5izk9<&tv?@HGMANq+@I{u z_srAea!~#OpZ8y1>0MdXdXC6GUk_%H#4(E5N43eHPw#GQh(7+s+hBF3ThP}&5iX({GN7~Em@5??I*HM<)T5~=rpQir5vImCO)Q* zGNhZUT!CD2!a?VLj z_X{;}o$qUW1aVRB9Z~Nr@gLLt^{dc-kjgOoD8L_6waQ<_#owP@e)tvj zPmB-PepS9_S14eA%_hDBfI~qpIk%vUr~U81`+HxkVoX(dt|A>~`2eL3w9Nwfqx`Dv z2g32+Tn`vNHiwONEIiLNBf}X4hOZ~P1eK%hOMZMI73^c+V*3~qv`E0sO@JFzV8}yi z|G-f1@r4uJNnhTP&3JD+KBxY`M+QS_F;YMAZk{_7U*_<~lMGS?_=OEk@rTFU>EX}E z{YcxFcewWDi)rjazJ1T@b8ym!+=;Nn=tI>0Y25h8$${)b1={y2*xwib#vFd0QWJ+! z{6KF0;$If{Mj+vE@GH6x%EX10==w2J`=sY;Z~w&SHrP)=JhSw6uwj+T&ZPXSaQQn7 z@a5vH-J|}-%9o^=5xvhKb9Oe*KiTh6{3+c2o%0|gP5v)=^Yg~0-@Jd{{jlGsBK~*I zGffk|%FbK;58whw-;(uuQ+$Q9&jE|_>*u3X#9+x&-xc*V0?CJ9_!^r;7l6GVR`#ErT8wu-vjttEbx7euc7}00{+-ixo=baC4hez=Evmu z3;gFH>n|!c^B3`R0shukcMPKVX@HOZ8HD(ypkE5{!IyvX_WL;Z>Sr{*MZ^A=*nU&p zi~zsCoiF?{qc^W^Z_!{8j{uFf!08?&$ z5`X^yV+f3&C>^2CYALpPWWp7 zD?k+GPkFR?p8WCo!C$?ZebiyBU*UR5{^1|#&o52w6IV9I8=vp0LtHvDU;NQ7DDRKC z;UN4?_yyl)_-G{w#vvUe;CT+%ffxC>69XSbHPWA-wexO2y9cog`SvHT&%qgw7mlTK_zK{noVRm_*ZLWZKR3btO1W9OhTA4SwhQk-IsxliT^zTMIhf_r=59lCzKjAWn5AGbyKOIni`NEe07u#=pLVr*5%wKH3 zl_>~F5EmRa`6E8Yhbjvm4EMyx_FL|b4BrL#E}Qs>3%4PCurqwPX#8z%ABL~yV&%&P z{^`p;3IJm}?#L@k_4XB}cNN;V?^)P~&p*^d$v@xB-KJe`n!lmk_{k27{Poqp;O%qz z@9iIn_7_Nn_=fe08~leWo=Dq}JbvG>&}$<6GZy@P;q&ju>M`)pVv5hd|9q?ke_#C< z{{1c&?uGnA@%i`XJh0&JtADM4r3|@d!;hZ+kMV!)aPZIBto*ud#!tS1^~vhHg{c4I z`0AKHSbWY?(NB_N$oOYx7Iz$fFp2etk)iwt2n>%4upegCU*R>sRzAh>n}PqkK4Ien zF1z?p03SoTLGMj!?P(ueUz-0ruupkbf4Kpl_dg5z#yp4lpP$#~$MEkrH~{u{#j^H; ze9B&Y#`IB^*i}#1{;Y9{@yGU|768x5A45Ly#NoTbo&Rs`^%tJ@!T#x6PuYcX5Y+Fd z87}hTV2rPYj8E*t%(qXM*W3SL-tGVPL)h|<&_2L-T5jP`dNWA^dY|5CUF8}3-RMr8kuap0d^{o>31#Q-0#yBinu znkPQikK@7rk+&Q8L-FBQrhjdi{!#yQVcL?Vdi$z{cmA%ius^TQ!I|to`r3K={vXrx zwN)b+Q|!0nefZ*!?OIIt$?DaU>G+I`^Pep<*cJTv_6MkFA<^zApI-fNqsV{GJ!MSM zfAIN&x&X?tP5kWtenZ!fnfx=6iw}tJiq9CIkKZG{|GGJi|M-4gj1SNLVEomJEIzo- zGXKYRp9OuX2=~LVAv132&lkA)Rd>*TpkIy8U3}HQGKcR7f1*F1;@6M;-IHC&=P%|P z2V;Cyj8E)ClXHXh_g@|6_{YY;g|O~QvAO@3gM0q?G_7tyy?nLzE?Ezil3iXoYUvOF5ymWbmZtr?LUR%58KI``ggoO2WN_J?+1))BPzcQ zo_WUyrMinj`KaId@*7g9W*=&QzWnxzXZVg84A%kqE3;HA|GVq5pHS|)P+X4>fgdyf zOgPKhZ|i0%mM7W{dA4o;FP!5NST ziU(Yx{1xPXhVc&r{;ug@f8g&h0dgm}4L&wE8aY>w{~Z5bfUlKeS!1vYv4FY_Wb?0|lO7Y>eGzOjz?t$@JsWPj- z98iC;RPk!FRGCeE({*2)uYYg>|6qh{X8Hb;9!VjI&WPBi zVfu?tl9Cf+;(F@uJt03NB*yfMNOpFNNREtd9FZJBUVvf=q)!d5AP02`CzF3eT7)(r z^MfnO&cwv{#0oleWOPKFOn*ysCi?_R>Yo%D5gQxQJR&YC)>(n!Fos^g=s;bsnad zU2va>n7ELL$mE!Q&W0&5u~9lJb~eeG*e@p1NnJv}Lt+#{${I?)z1AtjS~>_TIl5*r zylf~eJ~26>d#tl{QqLqEO1~x{F}_C(F@ZBOJ~1k!wX;tsJJC)*QBltL_X@NSShLbo z;PS8{o3*dAtwVzXVMn*-4G@>8t$k7o=(Q;&B z|Agdt5*m`C>&S6o&PWo3Ts>N2}+xXBE`Vq@ZZlLE(tXR#(`VxZmyRR{Ahq1-5_ zg8V@xJ@6;T^l^r?C;#fmB%(NzgY*-PQxYR+9Ae8u>d0Zq@d-qSa@E1aPRXeTajsc0 zJrqR{OT;!MD_1J`wX)+EEadxi4CzBsRs7%FOlobJoiq%SKUNDezwo+wmJ89z$q6Ct zoPATANi^_y9J$~#N@;Vh*U0)eQ~&)OXKeSD|~=a*{^`Z#$@IZV`UBzJ8KJfd9i)a$obZ8ENqNynP&B zoIFqL_>-Vq=TA`7lO`A3rs(B_bJ%jNS(F4f#y z-)W7nmCGY(Lww_xxwYd9g8vGS-}-ew$+afC^iK`%{GCb~&>7jE=O5KPUl|d8y?04Y z?Fq;-elhLAKO+3vgulE#>-^h3E|ZhsoAS3*39`P%;GgcFn7_*MoRYGY_n!3qS@4%z zUzA=g;$NQd*V^UCw0(I0?|dR*jmZDYbd@B>p#W)>%fdg2>!?W5L-P46Pph6v_?!GQ zI*BO#79brU57b2dk3Qr9t$*b4YffC$No4=DPf7WG34Go@*E+RM6xrup2eJQ&0I6KC zcl@dGzF&s%fyZys?Zre9{=;PApC`@unT>DvuAV6;!rwiY*ymK%@fR;xUrB`j(;K9I zxnRcsxpv0!lef>jkelC&@Xr!_?N2klwkdP?HxdSXD#C9=-jC|IXU0Dro;iFeZD21E z{(SO&X^r6jTgBUdPPfV!AL~&p2V>@z|CiM7#S)-?#OE)?-XeZ@KR|kQmAHJl+7^@? z;fR)A%6R+VEPu6-h=0N#MCXAuzPn99$@Q0S{0aZc!utJKKN5d3z*h)=sjC^EAHR9O zT2!+F{{Fd@PT%P_iQ{|Qaufd{_#vgd?eD96@%V%1zgj|s-*hr5zYjBy&)dI!hi`9* z?4NrjDPID7tX~{$ib#&e{L>I~{jzI=YZ-~3Ir#d0;TBTA{}&*Ac;DN9637Gu+CI_B z1WH;_v;FZ5`scu*bNogA`D-3>r%wW;aPq**GyWsKt9&66Kg{hz6Mp1frwIQE*&pAL z0lpMeNK!7E@p=2NI_KvS+5b*YV*eKb(%r`1{L%hO)ryjquR?mkf=@jD@(o8vitzW7 z{TbZ?{LK32^Wm2xME+TgykN;CWw+$7)+GFgn)zeC;*G^M4o?u(zeOLCEBvhSrMeX* z*NArz#*jRIze_FO5#jfnO3H5r`0@u8CHD|Bf70CWI{N&vw`hTYfIR&C`ECbDPUST7 zNB?wms3=Lf&G@{3o~kr=t;j#0UL^jR0lwUc*gvmt{2H(QJyC>zm&7$K1AL9(E3f#* zfAoX0ON4*SpG3ku*7lJ)6MTXH^Y)qBuxd*Y{&cdxn4?wG8l8g6|UG^Zb7)*m;e} z|9>U?wZQCB@*r>iM*MlFJn27`^YV52g|EK~UC1$06dw)|{_cX-_*#YXlJ?zOKJjn& zzSLcWAF`aZa|&7G%fSSHi5Z`_&x7R^ri<+J=f|Y{7PiJ$3BI(sekDK5tADZ!b|M4r)eVE99a;_yzUdt}++U1?Uh%fae_`S$Ia0hRn8HJ`N zitO_y!B>lBm+rsn-Tpy*M_Q1ijt=6`&FzQJhDOl-ovHuZp3Dz%mB=oAJVVT1ohD1t zQ1ZteJpW2JVt0t}#}fXIl4gALe|4fPxj*xb-!-ycRS|ycN`!x@>|~5Y%-{9StCDoz zcl&Dag=VWn__GPVqjYxZfCauMWX_VX*w??2;)`7?NZT3+^? z8NXXe^dFRy9`@QNn*Z>|uXv|y#)*RKYhXT&)jT`IMY;RCYkfudwE^D`BQC73!F}xQ z;vXK^bczVS`%cE+z=!oynZ^I^MT4m#{9`cxkmW9E^G{^Y;n7ZZ`On&2`+^8R_d{>~ za$)uyUW0tFi@)m5j$9)AU=H8)lKAl3{H5WIf6Fhz|6!K5{~#XvCw}*Zf4{oEKG*boq}yq4dai-(!+p#Hsb7`;5ABY!(*4{&iSXOEV)$qu ztqa3*1h{lCyY?Tvv`S$S{#wNw-?f~TFV{|%j$Qnf!L!PW@N0eGZ69R?#AlRHkEL6N zeL}mS{HxRMY9jo*mAv_*{iX3>cbon{`)qIe{uPt|3~cF*@2)wE5zHjMRAIJo|D`XB zdgCL1x0E^lCnis&?{_!xUr5Gn>4E;KfIU!J#eZ!7qpUR`H+}z55e3F?asArw?KfZcL0pvY9qwLAgrEG#JAN9xGs%D5rpw(#_%Xm=lAwKv`J2i1$qH%nyCVDx zoPT0{C0Ar|*@zEqtfmU+GbMVlnIuh86A~-P9$&~b0h|otd0HNfc12ld^9bSlwNf`T z`=WoKKO--czWn1-=M}>CYbE3T7%Uxp4>w9o&lmo+N{`En>^q__V~*uhy9DjaXy`}S zj9-gZu2>|(f84+uU!C@H_%jz@c`m~L9PESkSFzn!h0TM-c8)Lm3<{kyQG`FPA45ib z^gnk+79Z8xEFHSjP?L`185hNb6zC)iTE$5?9E@v z#pYof65B^@f(3IL^(k#HHG>d&p?v%zK)C+mF1%j^^G|K<((e@OVY~J%F!1*WqWf>O z-a9^-_P@0m|Bm*$LHE}(<=+C>-^Pd^_+B8uwOc=wICG2c&tt;x0Q+kpzTwZ{hj#Ik zW*x0A!mkDET;q?6r3u6?S_bcc)Z)z4VYBEIV-@oTkt zK30T3tueDd;v;`oRaVaI^6$Q2(lil%SY7Y@#rGKEI#;{+50onj@lmo=jsF;zQQjYXeYFUGVs&qPj1RcalimES+5XRlBK%(}dgG(rGmEd5 z9@JcfztY&Bilu}2xIdL${!^~R3FFVN7WUU*e=589H5>jXjGygKasGq(%g4{QR{f(c z;rap&vVMZB25?3-B8!WX(C?Ch5SOvh`Q7}3YsF)=3DDFp28>>n00z)2T+kd+Z+>4G!;YlJf*iY*A}qPM?m zl2tyDF$vLRf`5Z14I1MDA2NSDl&uvq&8laO_=<8cUBuPC5v=g?{6--0E42n<5=64R zBcyvuWN&Bk|7Dej^pWR!CbFO)KDM7zw4@1s@>jab4V#Mr;A+2NL zVtVv%$G+)V%}iOn8td7ZRzrM5mI)ZES^htn)6R;eJ^%pAhsd%ax=N~o?EPJ*%w0zp zhgo67UY)YTF_K6gh zuFtZB4bJ?69+FsfN+BaySYw6O9jp^H;M-R#>R7!Ni)TB9_ThQ{3Fi|kR1N`^*?ODAuh^mX^U5g@D~8SV-jn} zeoFvE_)7OY68*yiaZ#3h(o7ZMXKTnb+ON1Yhz}jzeD`x*vq=)Hg|AQ*A56NG7XMX+93ct{lx(!75setbq&&G8a ze!BhN%qd=ng!zgx<@09?Mfe4aF#fLjEPr|Yy~JPX8Wk-rzeN9xgQ*!`-Iq3eM&{3$ z_Q#k^_{&SPoA&o0M$!+O9zF0m5&LE?U-jQy^pS}FPtTc#x`6S&KP`=SOb&m-D#xSPge$MdQbL;TvJS<$pL!}k|{&MSji}0T{W`@wFGXLT6-No(U zJC=R*NQ8d~9s{^vi1~;1qUFoH&JXQ^vct`)`$YHyudq9oOS1B{??-R@<2*IAk(GT) zM=h=|!VldK8ecR13_smpg1|mn)pip7!vlGvbX7W#Aj1EMuCFAA@&n_)=XG!X=s()C zoD%)R191&GrEYZ*K3yM55BU)rx5{XpXh!}M*6q?E5q|qu!GCVB`lW>K|LOLbO$*iw zf5S(0GUT7Z8&2#!nfj{;UtfPpu2F%%-F2uue(CEi?}_l~`crziE%2?@q4M~{j)cA^ z!v7jxFyR==;wR64)(Ct4|K<0WcZ={FCxZX9VdXc0%qQ@SKb8E*{Ne=xKJEYC*+z*X z{5OgN{s!is>&Sc>Pki)GU*+p&(SJS>;nVfG^iUo%|IBEeE?ujO2XFuP+kd=Rgnz0l z!^im)JpQph_UwPTO?P2@rt5#{;qt*>Uk6Oq0^`B+AF{vvRT2Lt*O>;+r+8WZjVIJ7 zFT!tAo!Q3?^H~^vdihmL+Kd0)@-`Nh-`kMC@_aTf&*Q&IO=2THoC<51O~ij*Gsa&| zWB$+E2mMp}nmqWTe{k^jk0`Ueg9!f=*hgK%@cDJvuG04Gv*z+|g+=&{Z!kjgS~316 zx-^2=M;l7kf{{Nwc>V=X&e$lzZ;=hk*Gg7@@%;NV74s*B-0R4dFZvrY|Jl^Os?wZX zIEwJY=X{e{Js^WNO^+VF+E=&_1+^KYHTiU)@IoIurcY z`1N=9==yhZC_l6K#^YoA(+VH+VP}VpO+@_Z`gD58|9SFH?_Xg1L|>;))~e%yxF~}v zd^6$$M8#T#k8}Z@%hrgZ^;qPA0@LjKq{ogKr(Fzv_itrDOVfflA zF@DgS_Uu2p;e_8r_}9CEebQL_fw#{T;$P^SRD$_U?W^J6tP-{lKPKzn=^;O44Rs!$ z+Q*gMcl)8ovYEp6^U}W=BX>zp`=tB-2I3%;w_HEFME~$Wzd?E6^?z=P?6U{>E8AK8 z{Gb+XKc~l=k6Mtn-M6Iwem0N(XN5m_Kz~_;-*hb4XAQHz6~1G%V`{ymQDk0JkT9)Cc6njSrT z)sJBxv@9#)uO4Ok(ig1$;`jN$@hjzCDT)5!fp$UJaPtFU`>o+krlDHkp16Y(Ej1N`Tpm_N4Plsbez`NIQoQO?Z!(=idg2L9<%nE&wh!ThB$h#rVv zjJuDmXItkb^Q(&D@3{X1#a9lK_yY4~?BXMDlv~$5zb)dg@83caRi4b!lYUwJs&zIE z5aHAPTj=4+B7W47+apByZtzc+%Hk*EpYHDuvJ?B+h!4vO|58JQe-!f9eQlnHebVuN zA@|2}mi^Z+BLC3tD1#3~?HAz}8^<(U*FEvm<0twjreTFY{P^QrBK&u9fd4~$WBc5s z^G_xFpx9~u?9BenDiMC+mVkeZm9Lk@Z(E>~BEnBN#_rfre!l+UW$`!HKd?cBU-}lq zckf{S^RoCk>-V23!mkVVSAG}UXZ_pu>|a?OwLpX)yovFb|7G!q=WiE3zDI{)BK-Vh zA0&FHS;XJj{^Kno{03luEsOTa*7Rx~5q>+sSB_`R{)dO|7sk&>&GeJ z|MF4RzT)#&v*|w-k5qjovQKHU{}MeM$He${{pVcKBfpFA(}2Gc!^UTL{&w-R{dZ`+ z2%qlXr5{gO{l)OpPj*M<7m^?TOJZ^XE%1B*Yd-C6U`qnD3974Z-H zn%Q63k~RO4-uYPgeBlf5fAxeo{@Bgmr@N*I$Il%QA6ypsYZt#;!p=1!`|O4I;4UvN zzjpDv^xVHhgr5NX<&#;nPn~?JokaMjfWKzppLY4rZuN0@5kB2tlpgXkar@0`pHXaA zq3k~S+v6g9732RqV*j+ue@@fT8zOuM_`jo4*6`0QzByZjKM3N39FjHsdCeA#5#hH> zVfL3!WzB!8_iZP9zT9RU#GfqU7fW3)j1P4GSbC@y{$sU|Ecy+~Is>l8i|q3w#DA%i zOHYUIU(6u)N5^KAMj;aY!vk?q9`EpWe-XY5{8M_8wfd!6VxTZSd>%QQ2kh^#;BU8lov&7YmI(ha_`hbs-!6Xc>sy5V-(Pk!|4~k5%|3rmj{082Uxo7J zJ}oX^cH4)yO66KE!oP&^VXHVk*u_tsFitqWnk^@@kCsLI^eR1DIKGhv{;!k<6!haR~Q#vo^Z#O=?b0$wg5&jB@pRO$8H@Q4l_o?iCQ-uFE@K?@=%dcJhN*mr1#?N0ju^Lsb zD)t|{_$g2Rl|=lvL;kw6i2qs3=YNUt-4K6V`?8k5KVNJu?4MQ`4=s+Lvu2;X*RsDO z;y(-8x9%+BPdS|?9N&|UGybk>S>ylv+^-&r_y+>MrezJ^RqgTLBK%emf86e@#h>p+ zloi%5GVpio&zk?lWPg|<;(rdxm!o>t>@(=MBa=k<-ETwreK%|PJ)&v~$F~*C-z>(T zrb~MUi1>#BzH&Be@vUsY0Ac^)wNhBWXAM89axI65e`*ex2{KiT{{^j|ZOnhmUidfR z{Iq{wVfe1DV*j^`e=cd$9ufcku)moSo;Cb$7w#3df93Vj5s4)zee9bLJzk^ z|J3R|B-n36Ilp3xTVx;l{t(9{D&pU>xA4J`1K>^glfO^6x=H57(mxCSOA9Q2Ai}5bXQ77+?4QwlTIjo4@IbqxtX;C&brJr7txQ7$ z{yaX;4{?)ssL($=5Eo@^lkUR#f%^MjsL~7OKRiCpU!w1Up?`QFF3OH~{>R&wz}Z;+ z|DPF#v1HF$dJx9M*rkYTP0GHLJY!sA7&BvL$nMJ4w*{45=|M!2gW)J zMt(g<{ubOFce5{lH*(UZov7^OBdxYT*bV}UW6}y}FAR1((wk(n2CiQ@{mpNzp9@`=<=1ZiG}sa@YXPw?SU9U&*AgXb4k=MBh`Q2pL>UL`WO3F0(qX1{kKsM1lMnr zzmx`2nCwDw_b-*Jarg(XEC2jd_OC7`1moX?`U$c1tu+Nk3WQ6t(<$%$9De1d65lv4 z_ovzMss0bA|Fvg#vGr%WDiUA6BJ$OgmX?HQXspKEZ%Wk2k!ZIAAtUzkEPA=w})p+1WgJ-&l~bQC;MOO?Hu*ndmSsx z;q=Gzn=qKFeh7Jv6P)Elf%GO>{H-a|IDG5;CisynO4bjd&T+!CoG1`3$@cE!?D!YY zZ^B@N!N+r)tf&YGmt>1u`+ny1*H6eF7`LSV%&s2n|CL(G`oYu3B`{JTT#{Xvzmv`3 z@46&^;kwP^e+DK;|IwSe1V##kOY+i~u-*`fOjtbP8G zzi^$C<;Mx%1^5^#klrL~eVOqLhp%^$_SaX-{^upDe)hLl>zV>$1ohA6cVC{z;r}*R z;(O0a{r@fg&w~%#%i$kpItE+s}tP6*a=dW2ITGl^yd}<%@95##;NNlV3S3D+nfyTqi=vf{ljg`K>tI~2UO4dbxoD`Z_>}v zUKso>m%JvuNpAP<@66dB&yU0438O!rBZrX!;gWphRN`?CKW(S{g(ox6K7M`i9Bj{9 z(EsfM_J>HJta?HC^-pfv#ogb5_*%68{vEsj1mb&*2M9h#|Djj))CW2J8()z>F&~rt zLnnLPO{R!VphjSnyQn2H{yLTWvKe=O~)ZcYipnvAX zcMW|2&S7)5PyIT-wd3@Ujg$D^DLg*e-;)aVfk?rw|F!!%viFbd=%)0)!P}qk#V7H? zii*IF|J7*^yS`(cj|smq9qLcQ$8$2Rvoam<4}AA2+ke3GF)_IE2G*Z``x8E%lZlan zUH{!tec1IuJRcK-5e6U6$;3#(j^C#0tWI41&Qty==7+I=FTlpAf*pU;&5~^YS#+27 zF_ZcFf&5<^4)%da!H)mW!bJA@Kbxq04dL;rf9M$j{t1zS9Y6m)w=~W^g^Ec1wUp5K z0)0P(|KD3_qld#kn(f?fX$qua6lAM5;6{83D3|HN}pt*8j>_)X?{ zYH|AG`KK84F!*>5Dn<%+{Li+1#O{CC(oEue9qfO=1N{@Yf7uuc=k!9PV8_pYZKD#7y)q`%qa9)Xd9 z9skzG#_az2zlTbEy^HL>J=!=J{{{fzxI(YdKwzX`$M5!X3wHjwu1Df)T_wIeN7vuK zy#UW|w8kwT!~6_J73}zTf7kpW&i;5lF9xsj|4`@j;#s{E?D%D$AO1OqkLUAZ(DKRh z>x7Tz^kSr7$FJY*T0Dn;huZfT>7RCdsy|&5;GAKI6zupJ`)_~B;V*kz{=!pM`j6fI z-#N{1(*!#a)@i>Q=eM<{bFFu1{Piv1d%us)F+VS)*+k9p62LzG5*h(ZIX*4nCBzpk zgYny={ZB^28Qs$U-otWyN9lLMr_V|5imh>jvroCAQc>3;>7Us)|L-sd>ekP~Ki}`C zb}dS9_+xuWeEmLY|0+#_%U7iH+tn{WSCYe@sGiSn6p;0g9Y6VNIsfd9st4zw*Yg>j z>_W0{rCRL$UwD2r29NUpQ0GXy@GNN+2$$pwKTR*r>3^t(vd?V8`lTKJ0<8avW6=Nq zqM8*Ie2($yjSklqbNE>*f6e-G{!QZh>z}vpg0ejr+OHLrt>}cm|Ap7s{xhC`jlm3K zAL|@!I18Hs*@fijuBZ6+YmNMcE5G!AyM3sA#B;DQQXpKCBTlqq?++@Ls`7WDVg1yO zUkyIj7ROk1v{g?l0>ULZ?5UM({coMG4ZktM=#S@YW28X1Bv&?gmhFG;dqe8)Ehy_x zyZ*heMK(Y7@q3>Y;{50K9F@N}Wcjk=Q~RsetS&H8AiYTre0DQ?f5FPR65myn*Prms zv?>B41;QnHvTFmjeC=!@@wFEyl?6r$giG@JiT)Kh`{4QJR*2>O)2Bb= ztr;SJE9~!Dki(zxjMQHrFUxP8AA|c>FXoRde+T`uxDJQENa^pYChcR#pX`RZ51!9# zt_J-fQXspK)bcLf$>Ce)v%`;cWuH*zwBuRr6bP4OLWe^|IQ&h+m47Pz?f8_xo&iw4 zAW|S)l8^Vjww1$woANiW?4PfJ<~i{BnS?KjR1j8F1cXbnm;MB6|C368Z`NY#mrm!* zYwP0#Mhb*WvdA|(Kj!qu^XoBqmHnOY@f>@MPNBk$=UZ^|&-Hr&{#lqKaF~BaJ`DE$ z59v+v;I8GZIsG#cAA)DGwEutZ$NqyK59cTKvGDA%ufRSKDG)Bnj67c~;_w@#Nqjw9 z+TRIZ2W*TK2$y8%=7ZVw{ZTC?zByf%FDHEM80Zg?0^yR}{oqYj|B3UI{={y%vro^OO8L<*(~`)jzl4 zWB=C7g#J~P3RWcj?dunBoc_kktzRI%S>C^XVb?zp--C6K3S<|OjX&7>DyM(f{1V##E7m_PWjF`ybo8L%$<4$P%YcFd8BL%`G`E6`nc6`0+ zAEo~iS$>`LH^Fx>QXpKCKYdtwHK%|3yt4feuZPCh=79bXDG)Bn&B{}HjV(jx*Z>si1dsgP}6T5@)ssG^lx|G03fpAGK{C+pv|6i!| zcNLW7cfW)Fo)Y&7j1&l$WXaPlr*rn%H$~YeM%w=*v^RnM9~_^$jPUj66GpWb9R6k1 ze!24T_#Y06tbOScRgtY9wk!J>%08zZ>|-tk|AgoZ%I)a-ySooJEE*kMJmcZu`XMeo zN_a29mkY@Kz2^67{au<(e5C59aP>pRA78TLM{SbSzYKAX1=w zCHYUALPI$Fdr!+>xPF!Gd$bnZzj7x_`|I~W{{bQe!X;Vav*G=r{i;u&)AJP%0lxRL zob$oY5FdkP{RcTi^3u6`>TTcWbUkYPot60fYS%--_FoJ2r{@Y_s^?d`W=i|h^xcyA zG9$v-zxFi`yT7YYg8aSqiY#A<7wG?VzJ|7|w7^JVw0c4E_JW1=QU79UelPCWdg~jA z@2wmo%%d`YjgwM;oc6&Gss8D6+p_zw>MH%sF#3DTmlhZ)klrN!j_KHp(;x9YRiOWU zOzN-w@bC1`Ti{|m=bycl{>Gfp_7~5A?if`dy-9YtlfMV2KjORYkAc3ivVVm76A#HU zdG_DSjgMv?g#1PSbQmAaR{gJV{<-G$b?p4Zjj?k4a%xX-`$GLU?E&aNL!?0E zmgMO*qh90e|KPV0-&HX*zOk{Kz(|2`NwzOHyeWr2Tjj57To`=N-3X!o<>(Z4{&S1M zH|I(JsZcVw{8InWK7J{y5<>dVNPKh!*FQ&mPqi30J7$6Pi%|IDuygXmxbN1=3 z*004<**+RjZ3NaojVnU?`+6Rs|53q;WPgobD0#oPZx^oq+z8`o?+xer^KF&?cK@tn z!+-41^=QQ3U~3=00eo>YCq68DS-}avoeh6jk3uIbd|UrKs%o@wG5B;+gcCmHE6F$J zE^Q3w!!{&ZYQLtvDgEDfu5c;oM`lCWpVrj<8pVngiz-Y%21&RiJR2l|8r}T8*um= zRsY;~f68T94z$J+zp>IkZ)`?L{pa3sjRyQ2{fAS&^P?dR80g&e#*&Bn4fb<%$u1<@ z72CCh!*5kc;zkRFuf})Ye`Gu6Quz`NzxJa)o#yN_`L`X@g9o7wU=s&`2Hyjc6# z-<yf1uu!4@PsF|HmE@p~~;Gk9dD(@m2ZtkX_D7 zztLS1|Elu;s3M)iX#Uq;K^ z;lG)^;24L0MA?V(SDaJ!X_Y(tCeJsm#^EoS7Hl7v!q-~c@S}~8_Gz*CP(cnqeN`~N zN8y`x{4n;{7i1OS@VD6X_nw#bG1}Pl4}<^6h5HV2_%Hk#oWE3F^|m(rF#ex7od@K3+OM=rh@VX^%?$NZYTd{eOJM;s2%lhw$}$a=d8T@m-yx1KUUHuaNxua*MNo zUuv`}kB9cj@mKTGs@_*-I&aAKUFAB}dg2@ST>k+!i>N@jB)e#9u>9u0FZ2r`$scxJ z%Hw|zAA3XKe^TegpE&$=mxJ*)IN+DX4(+SX`it&OhH?1uHvNk&G#^lfbUJ+JKJ%_IA3E+w@N5^ctrd;?iOL92G6$5s7l z$EWt5a7jAhH(LB=J`Vqu!l(Qt+#FK%Tb%HZM_*3o?BC(NVEcOuNk26@+WbF^{rhg3 zU7FLs#zVpV^Bj6Be-eMmdc#ToCihGz!s-8#>Yo#?u}IbrdMBIyuG!I{`nQ|E81_7e zU;Ik2eayR*-*mR&w>uOPe}3}2`#JootAp{$4yGMHO#L&Z`70)e|EaD1bbYPH*IjJ- zhsodlgC6;V!~gBCVEsJ`U+nZVlNk+=9P`d@4*zF0zNYi9MSa!2EBsicf4kVw<*UuweJeTq$I8h1 zf$&`l-{>Xvj}-sZ=+~xm`1{m)3*mbdzTP``_)W?k>%rk4wDqsN3Sa9Z@gr@&@^-Ay zi^H${Yq0-&R6d(_{4nFYCdU`|(U&dNF&#m{f z;fLuTPMmbZ#o?c|+kdO-mpqv}e2;#)FNs-YCRgUpp3-V9ZaMxMSkB@$<2lMoBA3p`EcSv6ObMszK|9rcpeLOd1z2oU% zSP+IT?Gx$z>ezceItTbU`p*Yo{u~3%@6kA$@|mtlT3?2Lq&G=VmwD$o{eRpl^>@*H zs_LidiMi8%$>0^sIQ&I&*-lV@pQJWW;`{tF%>4NWeOvs8!!M}jg|+Rf+>-w&e7%nv zpMw8{YF{2*I64o9KUejyyb7Q6Hdxpb*_M9res-LNQRXPSq ze4qb^S-<#oS^rfW{x9l$QlGy(C;e1&+w!;U`H=c|-Bx}khhJ8mui;XDLw;l`d|&>C zseeWuO<2w0Z?W}nMFFY5G1z9GF#W?<->S74@N<-}`uEtzU-bMdnlGCjJdSiKU-w^a z7tP`KRrtQ~k-`@Wm;5Q*_-l3X>HRtU&1(EY^#j$TBwhO=)Bp6wV!v?qpLjUfKfQ~j z{q*dq(;U8E2N#}bKzL`t>CaEnSId&E<^L(Uv;SN1 z+K_ z`(CNvR(AZ-@jIJ+l>SDh%|3ZIgtX6C*)ECtMdOWn|;FQ|9kf@hjR8w zd|T@8T_f#IEF)g zpZZVA|3}*FA7=jH&dSyuIQ#>3g6*$;pzJ>?clLj(=^S?ca0uy7<@SKAAGD`!_;IsC z+GpU+vmH78AHHg{|8UviHSPGe^)D*7BqujXX6I*~CH-k0^0c!5Xq)}R)DLIdzr@bZ z^n70GPtQ-LdQKlB@qP0%#TJC@AJ)s5(2288n!+bs;?c(1^ba$CxT$jUWDdVmMP+|w zA7B5|jvuCeSh)9rx*YytH9t@FgZZa{_rm(%Hd?nc=y=EMTKcbrQf6CvL zs(&@!W}h(a*FUSeCvy0=ZT2@WN&U46HvBODvwzyoog99nz0&?#1699GRPC?A*CSjX zEPw8Wd>nqC%F;eme|p|j{hx_a|48f45A!za!r>oF3@*Qv&-$dC`5S6{xA@c8Q2o*Nc>3s^T^WiBRTtYf%6KiK;u&(*Jn*Tewg-=}%6z5%xjs|k`}#j+zYbZxo_jFucMd=9 zZ&kjOeT=`9{b$+q57WM%J$0)OhhMg1Fuvz6xqfQe@x#8{zJve{O2i5+oS8V!+!S|MY?*xbcd8=Ui znCGN_>T_)Pb&7>t|4o`O^G6Q9(a~W2jn`y5rp>kChsocmjq^|D@T2Ml>u>Cl_+~Eg zYtAafj(=ZJ_V=jsgJ^xqm?!o3wO_El5UTyUQSD=PeDsK-M1|m->cSnv<11tUtQ|i3Y`7(tLIOW{+?)6|J(7y^gpi;yv&wg@k6lx z=zmN9G#1+YC(Qgqq57xU^>+iFcaDMfCy0%z{#hjPBd!0hba3JRw;cUX&)afMk=Dh< z=gR*VOMKt{x>!AA`;z_lN4UO_1OMu1iBId|gl{VRNd4#QjVrfv_>)xqN&5r68&v)O zs!jj0W=Q?NNGtXyhksyfaQ+gH{+ca+!|Wd@Jm>CH9R4b5e^tNAl_2%kmPq_a?K5@B zm$f#>oGe;(6YvZ)G+Q^i&?2PQpCR*=0+Tf9CNpWypQyVxkZBVK^GoejdcIKGQ>F{0+ z_(oj~UVyB}e6CF(ev;HKk}S|_-bKzn<5m4Y>yJh=)qcG$?e81Ex626HA5OR=(_Sl` zm&5-|m0#^w)$S^(8xnuRLOFhn(>v!4wZHC@@9l=f4?oVtOSSuNtDF*s{3|m ze%M$h_1~-X*UE<8pM30(Gm2@1)PGj>o9U8%q_2_qzWOc9{C1l!?z@M>KTq`=jbBF!M`qZheZ~pIonNFh1GIwBv_ae>`wB zp$Vsdn$q95e^NbP!q_PF_tl?ei{%Mb|6eb?W*mqAhN<)?{~s^we|?k0_tkGu|A!hs zzHqF{`yBpj1*HE_{U-9uc1GK5!w<9nC$-fkwtlYomDHc??tNYMe@un%tAE1y=Ql&% z-NNa=XM8ZeYlP|_z9aRI6yMwV$=^8qC#weIdsP1F@8%Bw#mTX(|HMWImtSuIH9xZ@ zclhPnPHDmF|Bo!cWPcjpnRfgz_g{biU^TXWXi;A3Z`50A5mEWoKbHFY>bEfEcU+I( zaD0?wf7FC&a@B+OFS+8ReaupF9)+%rI&$16Q=4=B>(}p(rf~MzHX``G9d9``KH4tz z4=i7y%J1SY#5Dph z|Ne>JgZ*E>D(eS*hs{63_|J`*XWMZ4H~vH7Q~hJ+Q|s3|b7%j`Cw^o1S7g_g{;3y| zdV6-L`eB#EAH7)i&&!q#egAmoLy4^a{NfGP-zco?^NCIWF!KYiuAM%gvrmnJ!S#co z&au%x&7J)hZ!FF3A2_&Q>QCoS`SL;G`}{LZ|K#LHUmoT3@1^orzb(rZ;TyYc`WM>} zvVW_8UP5sA1CLAn>3lK5*Y`;Lt8{;TnEeAy4;5hhw=gRzs}yzqm+L!KKkT*P$Mz1X zf83jNDF7e+UHisSGy-VYFr9aun*k{u}jD0q4_m1N9pR4kh&PVh0 z4?mOmzWIkR_ixTjyUecN9aH-I@M)g=a~pm!Bc%P$9y+s;)Bl-L%Ki#he4_d%3g1`% z)A+Gxd{TN^(#XtAcUpErO4^{5Om|XtzchDtZHOru35kOSWwv%_C#IyFHJNRIiP?4MNq6(!5PuY7)yJO7^7dD?mo|7C^m zwc+cBa);mR?xY(W{;EsLKKWGti^}I=i63eG`|F19*!jD?gs*VD?Ns?x_&)p7`iU+^mM4Q(EOukqG2IviZ9&>E6gY#cG@I5wsJ1+5s!{2oG zC%Ar}1OIWg|JAp*jP4I{k`DHHzQ7ip!{4F$H$MA3xKtuINeBGf@9e3@;rAaIY=5(i z%vbL{vb~AaJ|nBVT8hJezrO4r`0j79+lB5|Q_m++>gU*hnfH(7Uju%Q`oHBfs(eKU z*ZOVQ;Z;Q86*#2el;tF52yHr2u-$?vO`s_4L{8K z=$-1NKH%_^r>K%e`j3<2L(`70X(9LjP2RqkeLmN&Niou*3g1xp#tEDLVb(|IJ(+wz zr+?a?w)|bF>d)_N`5UJGd@tXHpE&$+Hom?jJ=F7| zHFZ7#)n~>@X&)bcnEii)9^U=}hhIQFpTZNX`fsX!(|^bvex|!zWx&tTzKpOve~{)M zNqXaDJsqz7YA~e~*3UWW&#SeR|4{i=QZuFgzWxcVZ}oCopN=1%n39%|<<1Ss<(T89*8m82hhX z-GePfu|J!UmXCBTfLK%ngXnkyT`N{jSFtc?haY-W$cO9ZB#>xQ|oUv zHFsuadS;ENK7m8zc8OU-x@V@iJ3yZN-v{7*oE$^xU|HG!x}H+fva6N2q?C*y?#yl@ zQ?k)@8U(BzIzq!#0#Vg}@3dAmJHU(t z0QlEB?W>^mwD_zsX-Nsa5>v7t%}gJeVPT`U%e?4Mq}nj|m~JU!-Ey}^8q9^b{g;XE z#6fbShcXmop)^ZEi#9Do)8>=biP?#5(=)rJkIYO$50XfbA>geEoiegh($liw zJc0lF(^ncE-r;wkfITBpiBwC(Fc>>RCyNX=!fURRj5% z>CQ?|9R+0^41+JEeJpHM_&aC1v$Mx^PRt&XrA>(HAD@_=K0GDKHy`DjrGm86yq2s8 zlG78ih9qXV6XJc}NgSAxfOTU{-)DifAWUOXpm7t)(+z%}!9D+f_d$66a7P>+$a?%W zwTUH80nxbAyFm3{Rr{oRB}6CAw%V2t&S!~TrRIC-{LOaod`si47}323azy*iVd(~n zdEt44cu%*Mx2T}!e0z5l6|Ow=bbTMZ*!gNwbHFbbXTzTg-F9uQ>Vv`8wTntm|4*$~ z74pkBXup+R|1S4-JHhGi+7FoPW5h(8{$<_+yTS89P=5@hzy4xv;Z3dWODEa?YSWH? zf&I&7DE;aA)g|gj!E@PT#CUlANT7YvU|1D+u4lW7ut)LrycVBpa)BK9d44P1ioMMa@#(qquC@7vK1m4cc8NRDzVz74Cq{1R{S{~b=~-aO8EOs}eq>zY?T`Ez z$o}%m|G!lQ+BEz@m@8F-FX~yMm*9Kspcga3}{jS~zyaD+;wGTf} zN+}qza#}Y|{}_D!#`;cFf{Nu;zA9M9X zkL)O+e~x1)X;I8ad{vedQ{#o-8$;g5NdLt0K>1Ag<9;0SEa#tpwgdaWPxklM4?h1~ zmtSa}@cvoj+sFUm>{I)7<3EIU>Zl*z^DpsV>-p4p4!_8QaDMGqeth#^;urWJ<{F2;8tfy!_2av)|2zBK zHU9g_9R4d{AMK%Hiu@f!~>ad~xI7=|AoC)_xqm0r;NNeti93;#V2{ z;fEal`Fo-M`Pq-}jSyefwzACO|5SZV5x~#Uzd8o~W9*3$=-+|;hppMc?bnV{!PkCd z`RbjzpR)en6z-4qtn$}CzWW$#0N2z!HkB{`FXR^+H@SBhoX=IjrS1o({^2i8K>q_V zVifG-4%GkrH^J@g1n3W8yF$TkpZV7>&EV`Kz6Jk0m=iy9K(IZi|3>)KZc#G3t*)L0 z^>d-Jw*Kd_%Ah}kpIiM?2dyv4>ECNT)DK@k`v~`$1={DmnY{i+$y&mduU3xv?@zQE zZmxYVcM0mZkFobJbL=qSVu+JM_|B_%Ue1rxJdxj{tB_(@n^=rb}!!^XYS^n_==7HV*>5E>f%Gv*wjbNW|3E$toE<{HR=+An_ z1YfJ<`NX43JEd~v7u$F3SAYBNxx?2#;}%GdB>(pTs~6FKmH*ALeLv!mEiJqxJ9r(lD|^@V8>r{|5tT6d;`*L z{1@=Y&i*@z!`}?}+S%OeFLT3h#6r_jH-P26vACY~$ zTWSjL_?l4CgTr?hO!3{K^D!dA7p$@=wJOFE#eHdPNmL4mD>9M$JLRq z3C}KDH<|P_hyPql=>G)Zd;TSUhy2Aq;_!ch^V!(?Y|F)f8fgogjSV1@VyJ=zCs#b5H87<)vn|I^Bn8jOEV+G7am!To$#MJxskQcq$W~t z(x2=>`v9n3plc`mmNokC<@AqlEAh$xgcDAZT}YlTe;fCAG4LaXY;cCN`ztVMOc}=(^&%JafiNoKsH8j4jJ+|SC0dfsIJ7u^# zq4mhjL|jm;fs3Z@Ou1)3YZX^RYg)@%(Y3zS9lqK`gY`RicAV{J1Jlz}n`qs#(=*^V zcmZpiy3;zLTJ~%09_-G1B0c$W*rYC(3atg+4kKZuSuQGY@vdQa35;~koDQ!sIt42CB;PyHstCvb z)6Wt?doeV>2e>fOIeG@X#^@BNog`WR%jO5M{T*!^Uzm`7cyz1C&Xn!1r?{-YsDD5b z?Sg^U#dLU~eJ<-R`AP79;w5?9vwIoGU-}oApAO&`B_iXe`HNsy{}u6){4jlL2af** z=;wI@_&pKw7l8G4^HuvO(V2h#?)}ek`~x?@Z@T#HFI4+Nb|-1KKg~z@8G~O@x=HS7 zKlo*i|I!e!Kk%=}Q2Fn`ze2%N{%?Vs!L?kZf77=QpXT^Q3fMn@UzFnW-_E}SmfS+| zQ@JB4iXYp@mA?^ae+b^jvj2oUf#n~!YT&t&#;}4`BwkNyL4naJkljgsJZwxBm;Q`> zQ2x65?Jw?*Ed3{1z`W9Hk^A3qC2&+)GUepffY{XG%#8&D98_!y_`&oTa4dg5C)|2>fZ-T;14 zCbIN5f&BL_c1}O}J;_&}d1n*n|1Br0B=nH`l<^X)dh**^xK$}&o#6tMI~)(2e-;)P zodW%y zhxl*#H|5*+EXRLRIhN-oY5!But_SA-Snz-SSRSEmD`dqQU{LEEtq%(cfzct5-AR6v zQMwq%kNXEP=zmN5huTMo<&N5Y+((GfDG)D7&x~6KIsUF2B?3Ly+0I`Px_BNqw;8!H zyw@^#9xPJ+SI!(|(_d+o^1mjs{k8M=0sBa1`9Bf#4ZMz&f1zgVg!-o;eV_Ixjstwn z3-ze&z773Bxxe3cf1`Rn&1cG9RId@9U6S2Nj!h^P!`c6e!ZVl4=W8H-VEy|95<&fI z%O}NJB6o{APxqQ{4IDXt;iovV=5BHG<`hRn{Mt<{ntQA*b1q|2XYe2^6 z5a<(<6aFf2i{sB2CIPfpW%-l*{&kcK@Ud%I9-;pgYsHKT^4frFj81_*A$hdL--S8; zx%*w7DKkomLdA{Gs*%<6dB=KE+M7@Y#8 zo8+a=aqn^bOI7~6-j(Uks1?lLt~fBLedMS|Cv~meQ%YcT3dBqD)tRf`=lJWCQ~v+D ztbf--4H=kzn*Y#x#R`lx|6%rq`T(L+pifBtxoTunjvx1jWALbb?YY?}j`nckr}~*> z!#jEEaQ#pHKJcfBSmVmzQS-M_E7}!IpZe!N$S(d*f?rX(Nsj1uxD}Uv+`o>&ROt`3 zj~(~2hugjEHK5dNumVfuM5e+&1 z4&{}nU6bPvyZv7V*F-<3@E!EW=ru~pU%RAq)BBr0*wT*6|7U-f-_Wd`qAtpDx&H`4(@jsJ}{(cK`_+t~l@ znb(Rm{~&rmpB@fYV}Ije7mAa|64Hqv!cbtm1_PwUe*IrD}Vcs zdSSrf4+a{C%d4FKefh3F%FaAph)uuBf9;;o?T>dHjL{%QntnTfR-FQ z=f?<)PJ!~BR7BK5yr@EW62u-jj+UGqMUzv)(qV7$xoj{$oJwl@dh8uQ+@ z8~7nQ1v~$hs0GV8e%ybKf$m%D?Fmjl%|CcPf&Ldnntw3hHAbgk=Z~)Y`%R8NTiIWG zPnN$;Mlk=|XJvZH-&aBY&})>D@?WS~oL&FD3Vaw0jpyHtQ;e$pMZUT3|4aUU12ehw zrwx$)=WVvo(!-v9yieD)&)?tp2d)Fhqt=g@e|Gz~{Qeu(|9kvL{#dIc%N^b)7wG@> zRsDl$$3XS2_p6Emqf?-AN_t$p^!|D%|7Ga=H2;VE#`YNDQS*Pf;di}vFTv%I#7lB! zt0Z>*b6z85|LU^-v-4B?XM9spVEi7Kyg$IcL3oYPDG)EoRxQU|=JJ1gjO2ISnr}f# z{^0&Ej`zGr?y+KS#~;N1>HX)Ia{OLZ{>`n@|Ly7T4O1L4=jH!H@cqDRr}R_3Pja94 zu_9dke;)9>i=)NrLuc8>qVOY-R7Gna7uHJ8CpU-k2g`jPSH zcKvJ7)AQK%CvjA&Zl)O43w!?WYA@}rHNRJ2d>HkG`B=&W`RknjDcvN$&AM+5m;T}X z;kU0vi)xGJNf338qV!6C|BLQ#CHs%Y-$A|T6o{8(&%)b}aQsscXNjNR6CwZB`*X)% z{mQ3*a{LQ{-}}0sUo_!R3w8 z9WMWgm*kkDf*t>L27C;jVgFnHH|{OR)<1(kl>A2Of0v*9j^y#!UsJgJzws;VZ(kme z{|`o%|1Y(N5)#7y$?ha)E_t{e@aI_nnz;w|UoV4lq}o4yuj~h!X|Gv^@vVQU=j)Ll zQo5w|a{eb?lHYBAp%GXAD2W+4)Dn0+_{Lsfo}a zPU|4Y-`=WC1V*PoydL{;8?^eQ!4hm4ZNuGWAo6#Kq<%cD|epvdwOuwK1 zZ`cqPnEoAV{6ji9(EI#{{K(~UvHO4441)3JyV2tEa@qe7P5APExxQqg_V4Sb;Q9g8 zDPfc#UXsyEW;f#MpZ%4f{0H!RBIKujI74l{MRq6Yd3PW?{#<)q+TXKN_Wy1}eh2pd zKY{rt5#WET&`koaBjrzaZ^rrWMzsDx{r?noKe&EC`d zOh4{>#cOZ7QUaq>pnNCUeA3H{IevUT0tR~SLT;av5Gnr~vt!xyXMBDF209)%WNxAS{({%=)Y;rX?u6K?h)#ic zN!~bKq7Rq;*T+ixi`}yRbxObYN8p1<{N_(J1xBYpyd;;67&C_B-_}X;YbV3x|0&3S zh{UghE*PBx@sfP{0}s3Zvr$vYZ-(L5Ot3#h;uoNc6&(~HUXl~O`s^_-{fAZhjUPg% zUz`L!h{Uh`0Qx|53dBot@>8uha{QB({~Jw0=f8OZ@*5)Yi|>IOqeCEGl9!uZJIe8I zQU0er5}Mz2tR_6?!_V*e2K)h{Qy^ZFi&|Vb%klrB?C<(Lbonz+ccm37;9RF<9{%KE0|HJ3w1onUE z{s&K!k^&>`ht`{x6d0WX@seD-uigC||FK!J{JE~l^gHpp>XsB3>HZ5>ZMcT$6o{AP z$IHIi#PR>7_{}i<<^!U;5#- z3!+n?em}|8Wv3tG`u~Fl!}#u#Xz~7hIsfK)RF(tPDyZF&LcCvH&b86_qsBI1UWijsFe!u_Z_BmS?82qDj zlf38ms_g#5^WOva;ehl%9$EUk0kG#S=kY(~JIS=KGBd#bY8F8V8vkyq4$qH>iGeaF z1ExO;{xo&%x-9kazH3z%VzWUd=0oM?n0`ZbGvOn9)@qe5m z`L!=Y^NZcU1(E81?UQ(c(J2rw$?J(Kn4Cx2A-uNPSV`OEK^ zYS2Ey`nQ<^{XdBNM?<~SCa=(jLjMb*Qy^ZF+dJhw$?-RclO@m7S+;+6`xCzg+!%>p zhu0XL0`ZcpHty*<9RFD5|5}&O{N`XtKSbi!l0hGcPJwty=KH=1d;iN{FDw5WBj?}j z`A_A~><}+7lK&eWq5MH~3dBot+FMV~QfA^8nXZGu~K9h?nHs2d9?i(w}dV zOus&nZ-1)41oiFuJi?O!<6Vf<{(IpyMyEji9+Lgvt;4Q=ytNbXj|B98y32f!TKU)i z(JwKOUGIi|XsG@-@sfOYVZCi!|8v$Ofb*rF-xDE!&DBt5U>(9K5HHCik4iMrzn|mzBXLmvy#f59 zXJqLgb_Mu1MsEMBPu=ql$KMF*U(eBi{Ev|Tq05l+5aU0}cakku{;{9qZw~qI4d55O zB1`|p+2DU0oYPO`p5%a~?b!7f+JC93=knrnegntfwEt4u1LqV#r2UsJc#Y915HHF1 z$DZ?Y_0K#*BDjQXf9(9L;dujr>s{U9mitKhpJaEE`(DU+jkCXT68MitizPkhT8emj z^Y&lzi`0|qADRb}@88_mv;Af9BWoOLO*LcNNOh_i%qvCsqER>*gZ6OsUy(V|{@yVBUU)DJM&cKk_FSaDTypX(j=ysc$?qx3 zCintIr$Ff@>7DfP8IJ$&Ka~GXc_Qz&-aA!$FK1G!9V2sizkV1|LFPq)c)nR|GTV7sTN%N z@q7df9%}!fdE&`sF;9HM^*LYTfQy{yOtTkdPTmNj_Df8bfB-=ly{P(_D zRbV9hd)7jJKy(VkOR|)^5G3dBn?&xLD~IQ}jw{jR%0=f7AFTo8$0-vIsq z(J2rw$@T*_ujcqagYu8T8-`yS4e5nQ{9+t%V{{0_OY(>O`Puca{i^)AiiA$TIUDQ` zk@!9HApapc1>z;Sd-d#QT>5`i{N6D9+AK&vMB;aWE*PBx@sg}O|E_5q|HB8R{mpRx z2W8!aNc>_saAR}`#7na0oY#Nn`0@N03}#UMo3s593xEqE@$2v!qf;PWk`E7yU&irA z?^6C(G<5!ZfD0q>8w;xnj81`gNxn27_7unebwM2MK>Jf!_W$ht4{Cq3m6ZiXy8qgM z*BG4w@sfO{LA|Fq{<6bm`sv&rr}oFS5&R7zrQZXuF**g}CD~(Mt9LklJbwoRo$KSo zZ?*>igGl@?=nr9Z3dBpY&*Q6maQuCWEB^Yj{&zY@M;{s|Fxt=2iIhKUb>E&GKc3%% zfzAbT;>UA*Fh_e(#e{ul25 z(8tC|<(dD)OVXV8!PgxB65tmB=ks_R`00Eh;{Txwv>96>pMNeidBtJQ{^ykaMZ7G3 zbtYo}&wu|7@p#%*5Ez@n=Xg#EjYpWITW^uyk?g zo{vgdQEHX*Kc$=GgQw3`;L^XP71;mpfb@@uEd5X4ggSeabNY#wWa7`|OK|+30l&ED z=l4X&KRB2C+Xgf`!|^{0IIaMGkr`R~jXGfSrz21Q(R0VzaQq8_-xI*^iI9H*@SEeD z>t8DOB%4>gi*0`k&6mDo+%4O`(^mcGuYYi!8U4*=KzWBq{^)_%7@Y#~l3eiA*X;b` zd{wTz_8XW9Ml%~kr%L9+bW z`HeD?&$FNs^#3Y}Gtgf^erSwUk%s~wgT({(J2rw$q%3JdN)`9WUBtZURvh=NACvP{{rMc@?n}W+*bnj z3j|z8%0H-1J9hqSda^{&Vr99@?Kxg{iAczw3_7w zMm#DN+g}0anpx370ct16{x5&O;C?9o;7u~n{#WET;QTjw{!1u+*T?>I&X8M!Yo|cG zB#V{3_%4_J2l}Y=-z)Rqk^j?jLW4-@_kL1NU~~$^OY+T@lP+-l2j@$Ey+IiMdXQd- z#IM&cFEBa<;w8CgPcpmykLTlI@F@RtN4cm*kpWbJ^!lCMbSm zbZGz66Ck}1iC@%)v}1G#cKZYF8#=_6$qbxi!$i z!njY3|0YU1NU!kEe;Dg!N-159D?&cJ4*h_^jwi}lC(mWMGe@N)xx0_afU^&K*VW`{ zc8N*ZDWlxh`E}Oma?ELV_LJ*uh96f;->w(mQgDl2^$28~gd7-fY?LC8ds8aN=i&iQ^)1WBl4^?_3KYxaHnNwj_I5ZN9jG5HaOinGB4gb ztFc#NO7^3f=_51X{6AZud?WeS`(<`P`f}u7ooT^iunm)B{z1-Ifn+tfa=|`gI#0!S zj*9x8U65T#R%>15HdlV?7nOF^cFOXLIDzAr9r<8y4V+VDbgyYeIycJf0sFZjItAh- zIsDCD?ET|c+NgZ3B*#y9{xQBoc3S|qXa<(w37vwkBjvx+=)Lc_^q+c9+TT_Af6M>b zTepsJ{@wQjnZxAYInG~waH&k9lN>D1F^$ho%}Ri?BnPJ?*VL?wq|_8}+;;BN)O0v6 z6y6-&u+BpXt=yT}DT7mz60_Ykw77o#M}k*34*JF8?lEmfe{x#$lN|qJjU+$iFY$XOFAUPdtM*T5L;fBA!G$${;rMS(kaH|f{FGkt zkD5rZpOb58ne!jnon*Iq!@lSE2Q`%GkAXR943vJdKc$=U;oqiz&&xkn;L7)i$7KCt z43q7Ixfbg;fBh15Be*^p`)TmCr8M)8(oJ&m%6?@y{*{VfPyOHWw|clx36B4S;@5`% zZ~3E#?s-Cf-yM!K`It-eaU{|is! zXRQ;n6QNHs%!$dJnVFtxA;&{AF@VkvZi8?4O35D5F+Cf*d-b%zSqW{s!K?b3uV>Ui z>(}3R(NMh~iY$I;)_{z}Oh{5fYWmZVs?@}+EdQ~`(5Li&L4MDo_P;qQB`YP{`W58k z$kc3YLe#MM#O(CpDM<-dx6GZ{&pNm}EiturQhHj_$jnS=`V!L82f6#DxwC6SOvy+{ z95g7iwL3d8CAFsS+fTa_hxstLulDcXKPoj6GOLsLUtkl%oiZ&R^dnD}nFncw!@{$% z-A8Ge&HC1$G&C^u1?*X8oo0?WP&6z{0$soU|Nm_1t4XPUNAmUNPrk*CZ}ffeldk^r zMa}1A`zUJ_S(hW|3WcmGN%y@{|5d&16U0mM=!fSMIR5Itz)!mQ`Ss^>$M3Yyk9bMG zyW&&~$KM$EJpue?g#16ZfO+0Mc|_q9_&q#t!XAj14}VJ>)MrU|qXG2z{G>jASZ)`|l^i8~EG>N)L@w zJbmGu@j|c&5hi$|KYEbkKLq~g4dB;bl+A>q7Wo98YlnS! z()Y$4ct7Admb>7Cz-yci4!pL}fu{tAQmbED$MLU&^Hp43@(Db@Bu{{U(L9p51`_^$ zUeRGjFyE@D;CBJ~1+xj?`7-o=>eOE|ipItkqUURp|MzSNI6aBq-*5fp+2H4R%;^V6 z0nfR-(k}R#cu0~RNzUDUfW5!B?~{$Ca%->-_OrU>>wgylbvZ@)3|k|bX0 zKi9qV_FVA4vKcD>X?^LXx1xl%Up|5Of%#AS%EWJQj=@6}1wBvR1J|yHD++qPyBDrC zxDFQv%sRTCEB~G^!Kc6Q*FXA8GW~Wu)Q_uwTz><lpJB?+E@|B*iO>;MPd(rnu4)Wei;_9DQ zDgkQ1^L0(dZ?FI8`M#PWdKw(dyDE=pd@rm`tn}+odf3bVp3lE7#+Co4E`tA$%qQ@< zu7UoSJRrEdU$H&s`MJvAw;`VMMCm5^-kdSrxb*ja8rvT@UulWlXk)&@mp^>&9R|(% z55IwVZ+z}2J?~Dv?GwaHa?|>L*Es(73qk!8@O&wK4$n`|7tj<#Z+NtV7oKl6bu_%e z+~-ZaBxf|7v6$okPd0WS;2IYzi-6$FyPwGZ@(UM=T16T{tCnVzLCe@ew%ao@`w5amOpyF zm8UDr+b(r}&J^iUR(tb3j(@^V_(onozdkQ_{8~47?#S}+{I#adTF>!U+YkMp7(c%m zlHcF|qvvdx>5%>f;rSOgzk3G9KM(k|SUN%DJ=D|#fq z!ukK@XxJ+k@O%$b@!RV^d-)sD70RuVN0eG6>nR_xdO^G-n@>H^m*dCvCGl0Xc;txc z|1IFl|04q>u%__uD-AE8|MLUhe~;@-wm`fjYnST(Gspk@F8KX-u)d}4FE$HcC( z@$7(UM_jj{agdE(*joheeW%Q#dGi(=V(WiyfcuMG^YaPB$5fEMqszlZK!594li=&# zxU?7WIa~z=!XdeF^HcM<^y_ecq3efeQRQt_|1ae2kN4eT(5(MLWSC$#xbK+m_f&8D z1o4urHDSsMj(@`&P^DM#xY19nKmAb}%vLf&=lAEU~3J`+SqWu%FKxz^^ZkEd6IT03Y1R(L zdT5;eH~a|g`0vpo&QRt5RX+W+zg<&Ib?U&2_wtA?F!Xi3>ertXAzqTNmTA9`m=J5UnOz&Kj#LYF7MZ0e@&*}j)Ut8f&G7~f3$V5?_x}O z``2^WzkBRDw*I~T4EP_U|A(P+ecx34_WJ*a>ykoKOf^7n&&Iss65OAL(jKVaL+{Vu zGQ$o1pJ?j;(D)OECBn5LpTPa=-1t|UsR`H9nz*R$XQ2MiEw~Of{v}?L+Fh+rarR&J zPZT_-!*73c32%SYFVOzf{+h7I-#bYo8b^6*|CA~mfBU?!cetXTUw=J!{MsDgpOKTF z{GMdfi`A}h{y!b=FYpBHZ#NacJ^yKcKQVRGq1?hg&td2`g>&XV@sey(?r>d>e+}@9 zOVQ%Cy1zkJ`|Rxew`KF>tN+8*f5c0&+R~&)IQ}DhK>w@J;?#r6{~h>o-xUVU`VVan zbh%tG{-XU(>TO3+X8F*bT>f{5{Rpn=0r|g_&wt!s6X<`mzefL~0^A=2G0kyW|Npwr z1{O15n!kZ&;bbHx4RgZ^3GgMSCu9vt%y1{bYR$-`Y;By@0`>wVwH%Y}&eGsVjT$u3 z+Ge`lL2p=J=`?VtJ1INpOSZSVWdjc^1mX69jOb+m!$>8bDnmU*m2 zs&3ZG7Q9hUi^pw4LjdTBl&oyG+=5eI!#Axjb;`(2Nl(kN(q?@XK53U|?b!*%XDx9c zh+ISK1`9K7M!`Qz2kS#pbb_UYr4=kJWdN64S;NJZ`f|;!ZR*IZA?}dri?xv8UX6)F~|qSLo`h1xhO=#0w-godDd< z*U-k7?&zPvTb(S@;fWdj8~L+?5J%z@_WJCbZThUlCBuxltxQaESB}_0gP?wylqOVyCzl%_3PEJQZBz} zrI!0Hd{AG09TGXhDUktNje<591*9-%vcZ_v?jE&TI+)vM7|v z99~=xsxPtwu9vq>&+L{yGBe5DAu+>BV88xJSy=-Tv$7Lfbn6ZY9qGi1>#4Z7jMbQB zKHD2mGVq|3-54mM&em{TFBDGMdm9 zFR_5Kq2bOW{P#!EI-RRP5!gdq#J66j7cL?&wrK(V2v|onVvAUjw4rvJL=^B z3JZ+1ZX#~O#0^BcU)F@rFj631lJ`wH#NHqA<(ty}`U}$jxK0`9f3!|%jw=H90~WE; zi|du%@kOi{2lFU6rtoINHAD);OY+Cj)Bfht|5qQ$?|NJMU3c3$BJ~fwpA?1rfr^SI z2)G3L%bymt;(C}z@_qx)?}clO6lfnc@i%$n7M@RBhCZkHW90WfoKKjyW%&!mFY*WT zdt!@6pU+XUv%jnL^wZt++!zu7*RUxUvn*he%YZeJJ)^LOR!^LH`Nz%P2!Xa&XxYx(*I z^94hk^&f^DlVpA6qJ5F-eG*jfk^SGhGjRmgfA;muE^T1^>dh?DJVBz&-&CX6e^0iRr}IIMV+d0MMKT zN<5zyrO~yx!1xvT4_;HSK;R$ol02g?SLxFc!-CANNTF^4Dx2@jW+V;S9%E z(NJBR@ET+7R!X1ivBH2zfnJd`gljU|f5G!I-zfjvPl5I~s-SQGhPHvvf7-thrwD2& z|I;h`?+YMql*CK&sj00CvFRTsf2HM@6(w8_{x6r$smk#`|C{`QK3BFscK%aKk9`c&iW7k zUXXs|2~+=3Il7wtGrNB8h4i}yM~jWqCBLEg^C%vY8%qcCQ@@PbXY7~h4gB*kWOtHZ zeo*W|&i;qU{wt;bAx~ic2iGa6Y@;;c`+?6#(NlvzC-V?5$umjbH=+DJM4wanduubK zKUt;?KQlJ-_P3}1l1JL#ShWf%cXxFyU5D2gDcIYeTB+5xbL~&Z8BqVXhRjpJcqg*-f3-=bpYF?`-;<Skf-!*wYQ3gp$H_6RqcCr4y=!8tawo>Ll@&x)n)_;NiPxYVHvXsC`^&fqQ zlptP`uFN?0eAFY#|GZmdy0_ep3gRbwYj-*ejMV?u;Wb9;e~KtrP{62y-Tr^IS$h!d zpQHbc{I0h7gjP(J|4{tmu3&z%NHD(!pHrZ8ll;Q#VxQ0PP8n%`v#IQV*!j!C{v`1` zj4#f1w&ECQVq9FYV{Zsk$Q@cy@*sAgD z`FIV^LVE`3Uq42sNBcmgpW0oL>s8l=@}J5jl}BGWR2g1JN&0?V0ljBn`pwVQTi?(R zg8e5J7UP#menas~Z^Jbc8OGO>lJIJ){-;^UP~Qj^jnyT|Jezk1<$veTC4W>N82{`o z+2tc7+8-ntu`S+KP5X)b)|%8y|D)SEqsBY#1vps`O~v`1IrcW(;Ki*|Svo)xJ0R zssBHvpWgYaXU%fZ{+70v{|k@G95$LPwZ1C%QTxYV)!X{pA6JJMQ5UYgx8(DBv?pRj zD(FRR4@%;*%ZjTTyU_oPm!#gbeq99iNgJDE{OSKFvh+tQ|I^YI*r}{*N9#W zW7Pj${@mMH`jJe(fBv;BR1KIe?|7*5A-)6tVU2$#!ZVT}eyFbTI~YhADmQff;YZt+ zVgB3q&o_hgYg+=+|8ZpLr}+nOQR%nDLz2=>*S)@N7t7WE<`>ZC{So%BEB`Yhm<_xs<`2ZQ}9FLV>6rRD$cZJ$$m?Q+ujT4(cv{l&|{ z{`Yr-D53Ao>remo$m~!4=T+zW*!jr*B&%OB+41k^S<+KnUdd}Of5o8Q#gyvHKu?HS zFvS*_{w!!0@LDVf9E>UuFJ0fxw-4t(%f;H#kNn#6xKuS5TX(ob^T+~&{OymiGcx->SV;EQJnu)={w|z3#Ng6jy}YzP)gyNQe@fNAl;)RhJNC==7;_B`Nedceq;8L6EEqr z@P#9HWBqS$e}4r3cXjudKkbvq?ElRwRsQNlR{t75Ke~iVKk{Sn?h5pOfBn1M=5Hli z1pD928Nt^Q%|HK0*9*rt-vi~pxIO*5p!|7G1Boifu9@?#pQuu4-PeUBg!<9`!vI*ff+&|ES%P$@?jv{tO#mYIg8_UB6=om&yO$q==Hu|194g>%Te= z{Xgcu1kR`G{r?!oGQ`l3Ev_ZTK3PIZSE)$0R)zYY$xJbJSz11AqHk)15a}vqFI3W| zn=OhgWhvpK5Rq(&g#UByIq%QC_c(Xv^6mTUf97@Ox!dPH@AEv*dCq#z5%Z)_|Ka@2 zJ3abe8BYJ}77P8y3R(&$af)<<&R_MRw*JGvU*jR_^M9_qFZMe&@CBXvNvk|M`6sj% z{LR0F-gC?USIF`XI^RL{FC6Ej|N3v;{G5*eS*m~W5L+P1F_nKEDsQ=dtx1VaoJID= z=gXTD6P;L`H(ltyLHBt?K)P}MckvJY(v^Ri`N;mWJ>}o3aQZ(Z>%U>kzc**M(ykBp zI`QWrR!#JOsOkTpvygA>-bBWuEzcqIj}MCbc2~Mb5drB3{Vsd1cKkUe*s|DCQI0fg z>TiDyZ7tp(U6w@c^dxqOo(FGE^EM!TXujiuzW^;cc2Nr||ISev`1rf%p(H$f<8EHw^skvH%R@TnB@F4h(CLs-c1qwO*-Zg{0%zh z5dnO0ULmCv|9s&`(QlP383; zQ_6I*w690AJ8UgO=AP{WnGVkMWl&U1-d|d||d`ppd_@R8=e51M}fzMxI6nWWtx)%sQ-kFM40AO45YH{3kJ{wzA?5%w3Q zV;&K}7xeRMtK6)!|J#2Pzc9YZnSX>PZ1V{IF*@cE{B1hs5drxg{3Cx&cE;aT`OhZ* zYu``buS@&0*8OkfzkmBnt99w;{CO}XUp4`^N^jmbyBLdP5n)%FK zm+I`l^~YrYr9Ae(K3w{9vw!df{pzU~E9v;}rTk}fC>WQ&u^}A)3(fye-_~fPj{kAu zZ#DO%KP3MPP5;@ahfUM*KQf9mcGBbjHik=oZv0{Ypv9)$QBqg`=|uXEzUr8imA>oRr|*{M|44X`cA5ReEc!?etE_t z#yu>$$0GvL4f<@cliKg+y9}VbH`$Z^Z-xAkZcsJ-$d|~E$cNyMbc5dhOunmh`F|(L zp9k|h!B?c;EkC9d_t$r$gx6dDJx=AP_guWq-Nyv{dz;ts{UI*HeU!hPzukk{-@f|C z#qnor&oBSMukg=1&hhy#DF4y^z4R8Ue}5|rcY4^^B;+8xqC5V?*RS9q)%j1Kyh?w~ zj)`(ZUXBy|9v417PBTU|{qNW2r+(G%T>e%_{^@f5Av-DBt>6O+x#N6!*3Ra<{BP3f zZRZlw-{KJEzfCTGV{^FlgTMW!o1y&*1#Ocllcv$UnA0Z+{t*zbWZ; zfgIv{#Ho-m&o~F_Ty8)!besAQ@rN#Yjpl+J;~qNjO^rN$RJ|6hai ze_Pb8_>)#h{=d}{{wHYuG13jX`QX*s{n3j|6`s=EDbhW?k$?Up>i@B7CiPL9@%q0} z-DEtX{?AfPsvJ_30r?O7Us(7MpMP~;{g?B%v*`PuG*OP`#NQfuosWNH)O9}oHr+=6 zU(gw=C!W>S|7&lQ>5t`{{>T+3;}P?{EIQ^9={HF>JR+#+-<3F_zApWozukxS$Ji$7 zF+u6)yzMy+ef%SH8~XUi=sp6{4N8kFXy-pK-yze#OQe6+m3sZN-)>+$BK;;E^N94@ zbj%}yn*I;Y<>&LC&(lBWZ}+A7r|U#Ho)iDbTvz^_cWj<3f6hBf_Ysh8&_$>8{jc?} z5$TV1ww#};{CoZ?#v5awv|v2m*GTrqKGcFmDXtwY&e?<(%!v{J_=3LNbIFT3`?K2# z{;`eT^t=JW z?|(b+bW%ta5u!r_QhF@BJAJjP@MYBipTArb)=30 z9%X>uL93k1`bj7MQZEVl+q*@&)pZoX-)=|prwIP6J;|CP@}EV=JR+$1Z}Gj|$LaDP z=Wh-q|GQPBKS%zp{rrtKe*Q7KkAQT8u9<+YG;rIFc z+w;aBXTM1GpHJNNBaOX659oIS#rlz{67C%(>34HzP9lv@TQkHul6*Zg1f(1Eo_lL- z)usOxOX%OYTJ*nhKHmJt`5E1<9}1S^uIaC-_dg(;?1Mfw{?crO{56^v{@vvcKN#_u>#S~_TL=l^*?r< z@N?*Y>X=03-w^8mlfl}j_kXJWWyh#a~^I%H8f$68TniS*d zKTYYU7*9XlGbkd&{f@k_dwiP;y!=zgzp|=O`+L1RZ^QaET>9G%87JPHOZyx8zo${J z&YVB+q5t_m?^6GVhre+k9RI}=1%LBBef#UY^tUb5MwkA*?J51=dD0(}f49$aPCxjA zcHj0xg!5PHAM<}8|GhbpZ8$65XB^b0e*={hJfsS8!S#H?Tv%lmH(*M*H?H|s^ z>;EyX6Ujs07gGF!vI<|fGkUg!6NeWd+g<0@4<)?w>VJ{@ioK)bKksw#3uCwNzg?U8 z`M-OkzkI=b19pV!IuyTeOZitb|0f@SNLuxWYG-uq-xJ*bE~WMRUl;RPt>5(WuTalF z{t!7Q^cA-Kn^LXmpStuvaa;h5)e`dOe7x)UJxTK5<*RY@M#kftMa3G%X1SXfk3}97 z?E_ZzCgwz$UgSH_Ll4HZ`@`QiP3Ye+Mfsmy-CzFW``c&}lkxbx#A97e?N5qh>719p zW@FQdlKpx5@AlM;1-kU7R~7st14Q~iQuyCDgY3(*PXEv)RA2O*524@d>L18=NdJ_@ zTT1Kle~mvV|DAEI#rj>Ze~ya>KkDD+ z@^*|z)W4&2%p>aG<_fw`5kakgU)SK1Qk4Gl+P|E?{RFN5k!OnY)13InYPa$6XLZ~7 z__I1~z@Dl6k1e0wjmsYo!2jF2zovv2kDpL45^zeV>EkZ#bcxAp6w(|@G{Qvb(tPJd)2 z$(th5Z_zQ2NWbwV$%7(-n*Jj*tB=y9pYu1LruD0H(?9WwRrlzh&W#$b{vF<_uKrz* zCJ;URTbHG}@^9R(JS@6a#C3{~sG~|429fGmO$7D^S?A|C8bLKUnJD zI3;j{FDTLt`uj`mYwFVfV5UgF^`|%e=YRiZKV6gYh)z*Q9siAA3;y<8QU6o(ANa+dugQ1>KlUHuMRE8gqW))$COi}oVE3R!KN!4TXa9{K zr~J3U&41P@A%9phsA~VHm!UlbI|P5E8?=MnUc3Gh-@n8O;{{)le%Jna`-}S<*xU^H zy$R04uKzKm?UnEA3;*}zo_Z2T57v9{;j6}0O!Bm|o?^EOLf5JXB(T7tQk2{M{ z`Oo*Oc__t+e9FH`=SDAD4~ZfI%Z#!Q@(zDn<&U|8@O$>}G30szD0e_r{*Vjg0XZPOvQ)t-`(w)9;=1`~ zuUJ&)|0R(PFDU!JB!B!KbofMZg!I=&`UBRVh%=T4U9$h$!`ELZI7RqPj6Xyv{n5<{ ztke&}pBZ_CJi!;V)I)y$SbrgQPUH`jALI@@7}l~PpZ|QG{nx#Y%73!|sdowfRsjF0 zdj$ui|Fc}|Uu}QgFf{omE`N3X(-}`t`{!k!%jyg*W< z8ZZ~x=g)&J<^E5lA94rn-mO3*9sm4m1%ET2 zNVk!u@Bg!^H)K4b{~<=lJfi<0n%a=@h@h5#YkQ95>(8Fo|Ht{;B!4?a_}`rPo0t0e z+jQ>bAE9#umH(9qBediHrT-@VkEikf1ip|0jV%PEpH-vuo^B9Nze(rOzZ=B)Gm-_P za|Fm8G;Q0Ddv)^X{CTi*kw53pBjnHd^N932{5b|0;D12pj=SUx_dn|R&pE1p7)9yZ za=Cw+kza5B*gq{*zQ4H4|Hh@FyaHcPRsMI>T+v&n|5ulh|2;$Uzf9;~?4#z^|IyB| z4wYc$rzPU)kI{LA&XNAe?f1&kV`2N*pQkC=<9Y^W^-IM-8|C{trsg|c2=dY%}!=03V4}U8p|FG$Y z{4-1bb*qm5{wUQyescE@G?K!le-qlD0rCf5(4Vg;-c{HCwCg10|K0BXeO3T}>>rpa z1^7DbZ?R~XK(3(R3%aE5xSMtSSCjokE=^rZH z#^ZT)_1|eV$^MSI{H>7uhh@t4cP`(5A^o3j8M##Fe+JY3Z#-BZTMp&vDA=N0IjA_Dk={xNu7YaRcG>3uxJ>WlJM@OS+` zzVkE-RA)Tmdrzxgb;cv+2Sn4VGaeC;|G~dwzS2c?_P;ur^51b+{>CNY^gr@9q5q)u zhgJSBKQjGS9siE+6aNz~e=8(^EBnIuuYcn8EFJ%^NdLy4E`OtFxb*KXFYM3km$Uzc z{L6Q|b*_&8nx&L}4}U8p|9)RwSo*iOocz0v|1ZSfIO$1$v2f|f`fp+NUuAN_XdVBz z#}oe)xBtxw$$zrk?=dX@RmFxK*6~kRM)E)9Nq=&<^pDHM{^37BC!N{fk@HvUpF7F^ zVtES0{jU|0Kl)!y`MosqJt+8s?tkNQrsF^NFRJtJb@>~`!==9<`X8$3>p$QNdiQOh;=IgJ!<8K&mu@_PLDDESE&iM2Dv~Ms)Ba7P4Bp;LR@rVGs zL;620_*!G0|8O7m|A&hcf7(B|^f+NpR*K&KN>>%X1c&6SWc?@P`s4kt8c|#~{xa%& z;(ti=ZE+4pNj?9x$Nl{4O8#cZ^*_h_*ynkj{Q3U5PM9j%e>v@=%lFbfM)qhga`hdw zk1pg6`uEN4vUL0h)DiscQX<_prPJI04L=h*mBM)B`zG`KVxy<2Kb&G)Q=GHE$S`@7 z0enFVoc>eW{>}bb{J=;N^}itg_8;{92SxBV{-pkPir^okdpsiSmSV+u@mV|T6`=n2 z`Es9X^#Aen+iy|-(;;Dh#$|f_b6h;63c^Nhmd{Jv@^YN0{7+54bs6VBQ{f*W{?P)o zmZ#)zh2-C`g0O$+EzVdT!0&<@z0R!B`QOef$)1iRuv?`)8>L11;deo?e=yPyyMR8R z2jGC-L0|ph-3>bXTTlLjhgdh^|2Q9={aGKRFdk9f*>ub!%02UA`u>U{0{DU&EoN!w zU+tCrt?oJVx91Z-ir^okV;;fZevj@`M2O-*(mF3bbQAYK(I!G~us@sZ-!52yt%3f_ z=f~RdkCeZ(W6nn>f4fLU#v}A?6|2a2gx+Ix zk4FRp2a;A?|7}g){xy~LN9!e1`Ja-+zL_bf1D4` zbI7+DG^C8W2B(oaWG|liNQ3D?-X6y@&dWT%$9t}w{m~L${;Kuwq7$h6KJF?1%Inj= zt)gH4bNWmFS6Scx%kl$>pdasEnpi9$p-kU9{Py2#2J!zRfqiy`)PDf~&ty3X`D6V# zbAQhIhx`k+sa9Mk|4;rF_>9X$`O}i%dF}s5F~5A@p?WrC%_;vLCe}Y6GsqF}h!E#1 zFHCB`>{}iGbKu`o=zj$1!^^)D>EEkwK2+u9&+DW7zO|;b6Tx4te^tBJT&Amk@#!Ox z%0<|S0&@Oy1-ENozDsV+j6~R@CAk4f&O9q`H9Z{8vj7$?-ic*ZvcPn-wyt7 z$??xfT?;II)bO1#Hu!->3wi!m{m<&UWPjBPvpKiO^jFlUe-7c~0sNcG_MbID-~X4U z@Lyf*@wJ@){Hy);|0D5_RCoDX7s#JY)bnqp@Sjj?^Lq~e=6?Ra6aQ$c%il0AEd7xH z{skp}&_*3c@c!5M{0G$kN1q`5A1>gI{|E378vnP7hx5O^%Vo{g<-f6wg+eAR3o5_UNtgbqw~F*f4+{Uo`FP8pmnj2#+rJZOh|TMN9#iCj6szf9731N&m6_S8Mmb-I^tQk9p{yO+VxgI`!G>YLfjo#rz-Ge}UE{|9kVY zKk7^USJ9`xdJ7?0=pXZ6%z*xXRsPGD)$gN||I88vSd{p~{*0=6{ugS0D*rJ@I%nwk z-_VxQ-`VAF1@KqXpPT)w{1e({jMVY}^Aqa3=;HD>uJ|w0|5(s2@HGczW%e7CURMy> zM80#+K6M9VbnBa5cfi2@gL(`!h8wgEd_9Vped}fpxa%sTd!IhNuJK$P)+Z~SF4N!8f6fqe(|_v{9bau>96rSVtj+J9yS)gRhZ|0C*i)kOL+e+YD- za1#vW+V@lsF<0khb8n~dpH(EkqJm-`GWdelp0%Z|jz1svi4IR-WuFrM%nIPo_r>A? z{9mVf5C8778n2&G|5GNf2T}j$Tb$B4@}2kX=lA4ie0}wN z^as3HUz1%~m_^qovF-FCdnfG!OXqB3QhXhd7(f3mDZUO!q<&#qOEW3{9=xyTjpZll z(*I2(Du2f(u)>36{;#f=f8j)7(MW$oo^DzfWou{r|RG|1weqfA#l#UC;#jLwX<|>-!4KY)~OCpBSA-=p4_1mOtA2pf3G)7NYY1 z{RDR6O{ss$A9e@I*Ja@W>3{APs<#%)#~vX?+cWdBIb@%Fo_IRR#aQ8vAArTN*z zG>&Q$eU_-1lK(vZGhBPFYxd20NEY2yPSMSIBM~JSvp^K z3AYQ{n?ou9bmfWC=Mt#?D=#x9$6w0U;aYV=w&ahipoKBsr1UqBlGkHhME^bf9^?*M z|F%tUdHG}hPi8}K5Eznci}d3vXm0%NC8GTl#Q%168v^oHz<9}H z2Ka+7Xeax-w{`sYsOi60{?GXJ55AyXe;Ci{a+ye6zTts4gzBWrQ&~*>t9^@jq64KNf7_XJH6aZ$G>=UCH)u4 zKk}34zYXI5>d7nf==dKo{QQ#}TwMC2?Q@oYmnkLk>-Z-X_w&!bSpID-$Bn4zhi^Gi zb;Z@3e{77XXQTb|ToD?7DPADH|7CJRefkf|_L;fF-``(W+Mg-ELj?bVsJKZ0J{`+dmtlM?+&uHeCe{v&z`h)5} z@%$(EuR{8f??F2i8m}#X|I^0LKl=jtqyA^r%DMbMJ+JUlUHa#c{=FgjstZd$_}lWk zz@YROynD+FI{tsF{_kS>EAz>|=bzm4!qN}^#?#Y$=?7ma1~z$lrJ7#;@V|}A z`1xmFB!7Eu&iVgL@6@VZ{z(5y)&E_6ap^aI%9(%R|4g_<$A4%GCH)u4KXNGN{P)JQ z!~5&_UwgHmfATdKmww}5&itGF@%T<1|7R8Z%f3kdv0V6n(sjhcI{taCQ_|n;!qN}_ z7b&c_f8>KDm1_K=<6q=@KmY6t~B+WV=Fee9ik$7QeVN0)@(1ZZSJuxz`ML{BKlodN#Q0%Q`D2V3Hd2@Vuj={v zXI~`$*o`^M|3Bjnozn3iqvn6}BGX?#XZg3D*yMd3|3CWq+uzw2$={Ugb_L0Q)Ncba zbo>i7@XJ5B#l@vRax&-o*Dt@mUQ5Tnk-|UwBKfmH0(VgQU#nPnnU4RA6ea!FUs(F# z|8mQJH#IHWRmZ=Zn*NLApPT*PR%YfT9sja&USZt--EeW~H{Z0JR|LtwSjPvlbo{f_ z^6w(~TT1>zxdXcRzgcW83Ui%UP&e?j^U`Bs$wU7zeQ%*!ACw;7-R z;0f6m$=_b+@BcI8JHdZm^;2zh{70nv`6u6aap{jl#P5)P@CAMTx=m$t{HH1Qmwl1^ zP5B*c5dY@Qiv6YIzemY`$v0hG`lHn*IuZwe_C(M;h#q~i2Br@gSoa1&ojD8-4$A70 zs@$k8=Q)7ZFj6~rrO6R>TX$&jzytkj8|nS~_vv4QeqUccNrw&MlOuuw)XW$-uy0-d zul`N_yY)`*FQ!pAuXEm3Q_Q=dm(|SZ+pWjLbz7$Q=<|T{TtlNKpKH;eK0VloZpYu$ zHho~XR_Wd7sR7PQX)4B(d4fbxvv;@5th(KL49pyye*K`#UJnQa&eZ|w{Re0ENWWuf z-*g8IaUHQz<)+5~*{+NTSTi?vOP8wW&Hl!a=`nc%Q2NH;8Yha81{ksjVZPe`9zgypo zy0_eZTY6u|`bl6p|Hi@M`x(JNJ_W6qab%5deqjHoaHMu!k-rC$yX0NF@N3V~ydVDE zA?5@QqWM5L<}|9DKSA&F?&l-ke*S;p0v%F%)F9pbxl=7@zQ;pF*pnCszeV^jlxm<) z5(|EuDp?J}`bo9@^JnYO{1HBn1Zg-QnYe=VgU)&7m`(Ew&YNG~tuM{*_$(i*Am_J4 z+vxFCp!qF%=nwdU)>l~@C4990y|KI~Gl!G#0|Mj*dRdcw+WD_lQ-p+KqecCd$@4Bl#DSKJHCm>z^0n6Opz;znIYjy1uO7)I>6z|25?Uny1F+H5swI zZ1SD-9RbnT`23~U^RexuxG2$}0KI~K_*de+y8PQ{zj#9|Ci(aHbuKZ|lfbwD6{PFQmqodybj$P$1KeoOk@_Xzmzx_E&KwX6Y8~fCB?fy`A z5V=!UV=+D?^-{?*n4(MTc)0**_2V za?$^-;w#@z@B@EU-#rw4kG|CZd~Wz~Kc(TJeuS@-I=_51mj@5iEQhH0S`_y4tJIVp zqj{vj+ju0MOMhY%$;(>OIqpU2JSaeJpo^Pk)Yi$5&wuB^mhg?{-wcpmrF7w3E)JdZ&ExIo{j*j>9m#V`4U{345le-ZfH`Q0Nc6F-l z0k}Z-PB~Ojhwti-*a^>0Dt$SnD#yWg=cNK4lEEWD);B)(jcz=phAGm|~ zQ#>f;6Qg4u?`b3C6}gM>Q@lr(hxXlspJGq|F3=7iSA9m;zC1?r+sq@BX%V^#KO?j* z>h%0pwVJ$r>Glu(eV=Gw8jXeD#LvgvLQh>l`GMbEvnRs8e<{Nlm^FJ*Q zJ}V@?^e067!~SyuSU5B+K5|1&fc*Bp(4-Q_CoeO!&!_VFsYhM;nfHa0AMlyjCqTY9 zEI!}@t=YMpw*2_0lF(%ANnwAyKgH{xuk@^ZK!oQew%wtdh zF3=Bl?a{99HI%+@;~_dx_?IAjk*O(+N8mGGC;k+H&#+P$kHBY4qjQQu0k}Xn{kcfH z|I{7A9I5Rf*L10r~Z;ZUHh};IGd2Fn}7Mf+1~!4I>SW%jn4Py4{9REef5RZ4>mkMu$IpMmHkX0 zF-ME?m+znJwLf+L>XF0f`!r8^QMro$JZL{_RgTar=mS5t8>hopWQh2s^^?#q-`~`W z5A~PG&f<(mlozpBaq5pO9xpFUI_5E6KcHt#ia~*z@lF8U)c@6ry8g9ZpHuqRy5C<~ z-GzTazZxjMzicAkn>Lf$Avfe>w`3Eg_3yS)I*pe3SSS92oAR*Eu{U`jEqFqx)33ua-(xQ!b|wN63!^E#|8xG z74+*#r?l(Guc#*MFLI;sFI-OfC?_CY_#T`6Oy7i3M0p(9QYu!}wiA(GjOO&+D@A;V8>M3& z!19F_UE+E=8NwSWTy-J6R2JP$8mf8U(o(+um`h4O~zwT z04~tqQb$+N;ahMCtzYBWKP&QJIDFU0@jB~KVYk5X1#e%{_*P_HEhpl-N`VXX;H$f@ z(%IkE$EAMdK6R@7B~yO|w>4ub?cYXG?H}U(f83A29*dXq+oOsL=fDN}D)e0A-@~sd`F|wu1aPnI`LDcW@T_X(e8=tlws?B2Wg!eD?%6_5UABgXd z#e*sL#k#h;zkZ5+s8~0u3sc<5%YD8d7ajB1qyqhx&Lecp=hg2oRDbc}>oP~ypXxMZ2E|90(YdESvtX?M`LOsN zs`=}uI()Cv`*|?)i+s!XkMYWHE8*koQtJ?WSB&*AZ1(ziD~ z;_c`Ehuq>cVc0b~e0+Z$9_(E3Is5C-o;twC_t)VO_!wd3@nZ3k<7FU6n${{_14>A7#} z+HXxBCEMGPz_4B`>nHLFN@UPcGNEW+wu^{-!|`!>VV%v-DL-+42%KT@eQ>5m4;{Wv z4-lU{p7n16@L~NM;OoJENBKHv{h7S9uL-{&6rfko;?wOHboR&hXW+q<`!aAGUjK*o zP-Jdp#v}RddBnOwHXZYb^@AdHt1}*h0&syokd-kZ|D9b`X%wF zSc#Iw?-@&JF9nL5I*R&CbUEFp7!-gDbWzzENjiK}?w0v?u+XdhlRy9R^^1Xx)3h|= z_#xE?s+MyiuTOi|m+p88ug{SDt|;fkAbh3e4d83Cbm!IN|1QJx7+>J{tVCLa^0?@y zy%2n?SUIP@AA~PP_k#lR1?UyGJ$5^9AL03kT%T(JmtWPwY^U6B$9zPeKX(4*?|(^@ z`vcgGgkQpY6HULoab2a58|XL1(tGLj%l8l9!Ib+3@O=ur{u$+%QL`lD5$m@{=$Oa0 zCjGbwwFqjJbmBzPe{49dU-koyKTr$`zy*4C>7UyDCB72bmRa|U{GsCOAb3>g?~e z62ksi;YrS$5)6O)^4^|)d!Ir>23~)&j68yOJfux;AD`uxk+7x$KLBL<4{1M6A=N4$KiRhC72#oYyN$0_s*e6JPT#@Amx4_|g& zDu1g%i=?A}2%kmxVmaUgF3=5Q`!Cn&H#sVj6lrBS2jwpHx6kjqN3@S(o69jCF&=0f zD93m_Omg+=yF9(mdoJF7{(s;CeTP*mrNj60H^TlR6-E1~6TRQ-|8(=4y!_SvmW!P~ z^zG=ZD|GlO7Um5Gs#h8RE)LMxN>f{>Wnz4Px9C&)@|W-L<}H7_KQ7AO=*^;C01SNoi`Rd%XY=rHNP7(GPai=J zteZvO>HgR2s@Fb$VRq-U*Q{>6>OGR)?cutEj6qogx;>a)w?iN21}()7e4vmE=uegI zsi>3BniQJX-zU*s|Nm*deEwMKmrv08|E*|9$R{5FQYdhNo^JNxPdfYm>RC}oj9l^W z+JD^-3LnwoJ9U#RA2LMyg6~t{wf}lWMg0Ua$!-6NRI1Y9SxyzP#ZMtO(0z06*7}cy zPYd}O)&5=iovicVcRKmiD#JS@sNPxq-^I6Ned($?d^;9P`^)@y^_zCnd)n`_mXsFq zi=_UKTA8@16cYX19Uq zLYyR%Q9hYuW<8MEKfTAme@85YrE}N+PgL}Lu!=N`TwKhu6T(Ux8u7IvTx~Z}mY*On zozwn*k<1Ihl5rOk;j40__oo!`bu36a?w$VW1NzcB8R>WT&!lxYL|%99-j+^#%M1`p zg*fY3$gAGRY4Hf}vo(yz@(>(Prf$`3K*k;YGt>Wx&1wG2N|fQ0O4M$abZGMyb9n#B zkddNZ*g^KsX0M`WEZVQ(f=L3FXg`5(QHvK4#J1)phNmTw}|kaxBvKj zlAr0_|K~-4Pn2qmfvWPuJiTjLP}^g2KK9Vp61%g~a zAvfTg7WvxQpMAd6FV=^8o%)-sPedJn|JIiHRQq zyY2}ehvuQ6q-!2H=-VH&!?t&w`**J+e6w79<`}*FRD9J6i4OT#%Zbi=@b9MOLax{^ zfR0E%bpF%#PBI^`WIw*o zB|hvc2>$YCabn0Lz%M!G^35EdE%Cws9nK`4cP7N~MPJs-PsLYkfZqO6lV@!&y+t%lk}x?@BYE@;XV7l7WsGhjWj>_Yia!a=6F3mtj}Z07rZC& zMVg9sr@YKQlGkndU0W({DAbVWz`uEMg^^x-@PFA~lb`SGt{-HD#J5G_uv+`ampe%N zi^_d@p+5y)ynhh*UZ_8P2gg_XKSKT}e;X_${d(}3uY{A|F6m#QvYZ9~dbs|z7#I%1 z2fad$y}$iC>Xjere^m(|^Wckx#J5k{G4u$0-K71QLqz=w`2hDpBl4hwq+iV*mB)+k z@ET!%rAFjotc$DP=!9_cJ1p@@Cli{;A~-+ve1pO$)> zez>jxD<{hjW1=2kIi>u#Px=w;`vLX^hDv-=@2+RX6N19-K)?HO{v*^sS|)n;+s*^X zA8CXyO7a6fJ0!jbWIj;$N6l2Ot8xNLLmmL%{hu6}?bR>xN6(Tpzkj_ezsRI;@@x8@ zkdw98uis0h{OqB^{(|rU7wC!2=`oIPq|CpNU#ESPf3M3QmmhmI9KJFVhjpDFUqyKx z}gppTOCEc3;b~(6u2SZb#q>R z$ZLNne-BgnVS3~j3yJS?>4%Ls{PG(p<(galkEVtB!m9^Qa6!Kx^gj16*RSz{uxscyM(YZkVv z)UWy-6YpmSbM8MdBv9b2kXC_zA6q6(;)DDKQT{c%x%eVe_3~5k?UQ{kQ%sQ6Ol1>n4|>e%L9`4yD?e}no_`SE~@FBTHtLa9ge z^MQY3nSY~lKgl3`z=iwiM~C_9r_k@ZeN=vUuga!}!#5e_hq8W4C-l3?`aR?%lNBep4t#lz-|NV4t0KQT{VD%GeP=oE2K6iG5%)nMSJ1O_%g^KZ z4omr=ee~)!vcDVi$MHqq4ky3;vL33oFOSOWwzA(6aDf6h=$@u4&TxG5M+?26{&M;* z`b94{{~9y&_^`gODH#OS|N6=HxxG#JE64}9Kn-~Sd?`)ZALjTLEBI2nQ2mAQVf|q{ zB)$ip6zN1c0lsm)%Y2g?KHMKWvxU=tiuXXjlkyP0-md&2GsDU63DlF7{-OR7H~Pn6 z|KJOnCJzir|JvXCCU5>g|IlX~UzUrH%?gJvS?a;=<zj*me_@G}aB)(N!^!hy`+jXqCs24(izy%6ixPRcvZ(rf~R>^cjzfV0w{;!WK zKXZ0C`Niugzx(A^M6QDmyA0B=A%Ozt?LWSH7st0=$sd#VQ~k<=FBTHteP8P3m$Kb| z9rA(PKvnyD=FssnUj4%U?xXdp?Ln^mqI1H@@4vM_RelKvYi#BCVv79w^YVAFi_e%F z5})+*&?Dp$TOLk+D!y%l>Lzh~`xJa5NPg@Q7oYuqgb#KH`r5i{w|Vu8{5ys6N3^et zFETHj{NnjTslSYe-!3`P5owV90T=SmU6VdI!ts@UQOF4Y$*gN6yjg)#& z^*dYQL;WQPAM!`4G>jd?KmL=~@8@4F+O3Oa{pyA?q~D>g{Hy?c;}hsP3a0a)mVU+f zR`+T0iXidvEqNVs@;yW+hP(j$#eQnv$g5xYzjh61d~iiR_NW{WH{aFE@6r0=g{FKj z_Qi&rGsk^=ZBNu$pHUyKgPXI=A1uVjv{$kkKVd~ z#y^rW-Xo)&nZRt%;5>FtlWRyULfR$87H6| zKM$t!pT_qkev9lfN;rB*Jei!*yd1us0i)|vc-GUb698P$Z{2pUEa3UWkoz9MzwCI9 z$~VG?5Lu|#?+ofk;=y$OGdAV}VSnbe{{Abwx$M`H^+NEMKZ_If`j1~ew@^2})i^Kl zeI_BkzXN+ukB_g*&V%XvXY7E)r{>@KGX!p2SM5yxJifmT&TpEW{hJQoO3J@c4?Zg- zzOJ&L#r)e}zrwgzR9+8@ugJlLrVd|9S(4wguKdjR!^schgOC&Ca5wzR1&$BC_wb8D zx&3925%PzB{(;Mn{L8Vo#r0T7eDKev(*8In_0E15?KjoVkPcHGfaWXS=R0rtarhh2 zzt-{qeOu?j7yTfd{GOC@Vsf4z`1V*N?JrCCKlowX2SxtH`NG4uZ1R>L@PB>Rk$)KB z>epBl4qswFfx|xGx4%Nl^&t5PZvb?(Zo{N{PZ!9Or_6e(U*H=_@-se2jO*79i7!F6 zgKQ?!15VB5^{7(s!hKK`cgLBZIrSHHe+P@?XFuo4FY;kH`OUvh__@d*e*ae={o{&U zfeTdC?{hZ|8miOp)RB}wM!NXe;&Aw$mgQ{Zl&~}K%_H0G(7P%pJO_NZf27my>%90- zetgxC$`21dDt$u`iu07b}r=y@PSS*zo4BLAL>`edeUz@cYh%Bqj2(@ zf_nTZ;YR@SCG@Mx>yQubgBm!H^q!q>58(dgq>?{Yo}>AR-xY}Gk61{2Mp0pZv3`F2 zUL(JIH`2v*$VY(_uP5R9N57}f^U4qTx5jMh-x%fEU-aW}@@p#f7-{0q9}{G~Kdk)$ z-;#&R{i?&4e2|`a-o8qogIlk-`etgvjl73%sFWwSzHD40-1~nhxIp`Pkk9uFfV`uANNs^WZb=aQM*A9A*Cc-;$@r`*WK=1i67O-mrPJ*Z!d2 z7OlztUUubYhs1aPaH(IpFBs%^K>BBEP|o=mxIphXT)2f!zeyYT_bG1uH1b6_`Jw(| ze(C={1@oSA8{f)8f+X!ShgWn90OVt=d1KO1ZEv1YS`zO0b=g8EM{mGu`(>H+%m zfuj@n9pKBn+8)R8EmrWwsCsF4LN5!+XIVJ;1>qYh-yc0K@=Xvv_4?>_tA}&_Vty>@ z2c7Px{4vheLM$Y{ApK(ASTq;?4pao%;j{I52>nDZ1s^x4_vdDk9?xq|_1O;x; zo^ung=k~Ws+6VmKk5oU6dh~0D#J9D-9^ZH=zufva3_o19w8V2mxcp3|ewz6a`44o=lk|~zt6)u zUy=Pqm^HOXd|gwE&SP|rbxmV*ZqvCMRNOy4-e@=mq)r6^nezzWl7yVR7A( z_>iMPJ4FQtQxJy!4f9Wb{Vx&y8;V@z&*DVI_iWj5+c~~81z*NT^iAWSLUDYioR14! zpcjfy)q5P6JW%m1PTFu4$7d?|jBlxbZLo_k_7CAh{#9||9OVb-f@jC@{jJM%lK3z_ zXcE5YD+z3Dmh=m&_4#8geW%HT>HKHxGqf+2eyV+PUYq$u&hzV3|2O%{zWH?i??;R9 zO@J1uuk9;6zJ>H052o{d1CltT4U66TU^c(pFqg^W5_u8uA4C-S+juqmF*ZiF^wEzQ^;&kV5gFM!wd| zkE%FMFy)hwpE|y}0sc9c`8g;zK%eY6V+`RtZ~SN};fqd6U~BN+H3AC|F3-I_{mS{fkB%anAyV=tl!z zb$yE{dkgs&55CCykn)rG>`DIq0~H_S1N@-CWylL(P4ANE z#fSc@D@cB}2OryTf%s%U75FZ!Davu=k05-w4*Pq*%Z%L|U%~N0FR0(2q5Khj4PK6X zX#hUHKPeBU^Pe%a)2s&m{)4dJSE%?(wkYhhKav%Ev)>^3dGMJV_3{hCXEgk0@J+sI z!DKGKR0ZF6gfIHKkPR12>;myw7m3f1dO-epZ%P&0Yk%lp%l?jZy4fusqu+*;-zb?s zqObY$N4Z+U{_y<_^eExP3GxT<Tl;WIt*GrkLlFI(a>WO~3@wLb$l6q+H= zfiwA4#%QEg$EBa$jHcPey!q-4oz~{9b;mtk1td zzdQN(mgU-CWYhnR{0s>d{$;g2YZ#Yb6D5CKdkeLHe{ki;HiyH9d2})9k06;8tk3ZG zMCVd&_6MAgt^d|pAHJ>R2d{X4=Ao;2JWBZZ%C3X2@4CN1Nr;9HZ5?@gM_|GSze9A3< z^pyr-N;+-fEa&?QdCJn(i}^2oH9(;C4eE+R~HY6_KJKD0n@B0eiyKNBp=bv5uMt%qDrt|F(Oc=I?s&v2Ee-!T&{NeL{+ZZTm~=_qcdZkbc!3!9};v-oyJ} zn4I^6{=ZMSe}2=oKPx1@J!sD#6F7iREq|du+y_cJf9)NzKXadpFS9-+f&@Xq`e~iJL(5*NWbPGSAOQM zaPrIZsCbWBeq182=T<*Z{qz0fGWv7>+)3htf8N3U%iFH}Vj=Mb`RC=b{sR98`+{A8 zs@JRk6se%gzbh#J+8%t-pTfzn*^7Grx9mw#e}-RlH3MXVs`y@bbii;OzF#SSuou_4?R~cv9yVid_2%jP00%yhd^B2(7|3QvwI-V|(=YPNj)7n356Xhjt|RpTxRnw}|ihgZztn{p+I-RpIhe=WpaIKzwH>u<38f z`F{cUrZ@8ATm6X0AGTa45%{(#*MsCYQT||vq$O_H>a0&VQ_3$}w$GQGB>8#pnS1r} zQ}HEBJ2R*G*H26uAo2(Fn+@O!HRL()uXy|B4!ZnNb`|B{Ij;O-A@Qw|^VIO2IoOZ- z)bDptj^RG2ArGMEaaX-@mgAc*<%j;=68mZXp9f#`mvHjKJWiAo;ER21;s1j0HIYAn z{2qJQ^nJgN{J~C9{a{sM-2RMx;qYyj?Kd{V-+ntN{i4x)qJtm^ALIsn^Eyv(>i3J4 z{JV58*`G&#c1V1?B|hVhNf4bwRr>>f-$Qhw;_G~K>|34v^&t7Nxvu?1_J@-n=0C?i z^W*zVDffc#ss8!(?TfE;+HX>Rs2`*rA^+^b$9@fm?`%N(vL41)nb2<#K0^u=_luu8 zkY6Xi&5Y(hd+=Ey@gaYx^;1>9LG}lH&~u3uV-q;OtxEn~*o5Ra&(*JaAe{VK?Gb)X z&A+N#gYW^D6eGLg)6187=bu8qdFE06@ZgJu#Mf|+z-ONE+uyrb|3#K7&>wJs0ypmG zkNo0%zaLZb@6lT+f4t+$FM2SX{DS7cO!-ORM*UQk6Y#k;5^<&C^+UJu`C(?Kx19@+ z-#qfq>|Gb1@mn~2TT#D~`2c+9x03A=*?&cE*9OQ9H(S5{Rd=3$4=efimC;mwc<|XF z@u~R$e2{;m5_eGjRMqdhPxW-xuNyK!$RFiL^A{<9EO4bAIi#20tSkNXm!S4<*!G)> zZ$|z0U3vbED){oYBl!`&S<_^{`|siKJtXsoTK~(C???S5$o?iufk!1>v8?Q8UjLW6 zLG+JLd7bbrbmeD-#J5V;ql}gQ{990dH;;OkYG<&6G_WQvof${T|MmCGf06jq*PUpfpWkV} zlEPxWQ{wYG*@P5kWTnLCcbat0=v)nu8|3@zCwqE0`km;{AHR@(W5?WF7CoYu-_i$! zr!Xa>+}1yc$?uPX?9Y(z0nQt5@Ad)5*F@rje%CCa@#*6(KI5n!U&)2yg{FM(n{pnV zbrzN`Zd@w+H;`{~!-xCF7T)5kU!nfoyfVpUaRMt@S+;jV;%hH)sPkVkv9Dk*>u*4> zGPx|@BDP!Cf6%lojc*Y?gox~q#}&}J6~vJ#9}Mb0IJj5X59;@>X23yE=oL5%J(>3& zuHR0I{oUT49q1nNH}>kB;wE=nqvoJ->qTZ^4<$`WwxT zQUCo91sLb=U4P@`V49ae^9-@xMwk2j=NXhP@BQ>H{`-$9_x)&S%X8(z(t^jn(e-b< z_9BhHeGDlPk3aPJLzSOej)9%p?-8V5=oP=~F*5Iq{QC;^`}4BtRDOJtzy?nizmeY!;Cc`~*dO%YFsY3*{u`6_hy2^w{v_2Ckg)q z{kHs^e({;B-^j^u@`HY(WBvM7pq^}Szq3e_)g0HwaqUPzDU%)j*V3ybd~iI4Ra z?+L;;L?$Rh(xFFpHRSq5I)`i&_2-($=}J;kTz;{T_->K%Q`ZNch<06nG4CV@Uz!AB zNV>am^_RW)F#q&Z@_**%ZvKd#*2}L#J-`1uChgDsz~8@i_!eQ8X1|>K?|}>WD^A|| zvlk!o$102J&xEhS>!SQH{tkz4$Xr=ZQSeQa_Ko&A>|cs0PGEPS>k7WO+KUhNcVab_ zAGV9n4v7!z?5g#@SDzKQnOs*J@`(eJ2OT7BBIyks@41!Zi^=r$mGg)09!~ywX#y?N zBjgu3qnBTHb-#W;87y$bs)I(*A0{~CY0_^b=WXV3m;@I89%wLj?a)hJB* z_24tlU6}l$|B(EujaXJ$hp#W`H|D_?yFh%#MdI5k6>dwqG4}E`UVNRTf6gX+<{7vC z5@n*k36BW+k&-{!4HEeyQp=JY1UXqx`ae1Tw%&KwJvlFbJk;+tj_;&WKlqjE2j)tk zAY0564j<|-b|t@m#`=U&nSX=w2mE6E{<@Ex_HXG|MY@rHZ;6rpeVIVbHsN3F0DQ-l z`u$Dk#Cz2GpW6QnIk}P(M{4`%lcEi5UHjKFB^=3~hIzINpo3yF^b-y?o} zHtIEU-I^eLsS+3Nr`@x0ix(gI*X$Wo{(A656T`_5h2o1YzdUzP_2_4tmo6mK>qgP`{1-Au}Li>P-6 z;Y*e8fqYku_-KO{AM(e7Kd64NE+LN33W*QvB&zwNFY>kgZV&R2aN-2lfq&A_((ifO zztHb}FO&VPck!8p!pU!wZ0AN!is!*NzV4`8e+~R`A5^`bVh{g9*Zd$!3=JH9{I6L!r?0@p9x8E z`Pu&zKBe4K@u~Ua_}sJWx&5i*Z^h{QePd*yIKD{ne@1?`vaW0pKHw}hZn(35GVsB_ z41I#?2fJPSVe5Rb=q~gLk{2%h~_X9ewjkz6bcW-*T((`()rd(4HRrvIyJtxsYo#MK8Zy{5cAy^PjO@ zvi_p#_p}_Jwn|KMo($5jdcDWg5qIm#x4coR-+!OL3`>rGl+@!hlr-g zUm~xoeoiJY-aiict!wjIb+3L=zgqbajlUg8jN`LI;=}$uMrVKhWyk@6+ghKqep4k- z$%~B9lqVV$T6>e;h&EaKK7$4KPx0Y z^gp8?2>4oM2tQ!T{&DCJ_d$UR=g)mLVjJ(Dj7k58{>ghy${&Q!YA@egS}#9qr+AYo zU$`0bCzbp$Nah>VUxM<7dVS1_M+@`$FKYejjXBf~E1DR`7Ym6G^-!kZ!~U?i?rH{- z5>%Dn`1&QZ>+7|tLHT35E5B%&aPrHP{x7QF!~UkZ$&V!_IY1BR6SU^bLuQfv-Gfxv zTgCYK;${3wfw=sPvf=PG!ua`O3$Ju&AE{s1R-+&&ze5f=3exI~IlpkLb zzF6@jR{NmvTXq1x+K&njrexGmj<2fn>o5Bi?6x_#FM$hmV}XHueCxdR^-hrev7HGF z-{nNg3HhN%0d$l!7~pFcp?+anPj49YBd~J`&VEe%+?guyRbDoy6kUHKFI!Yp_AAh- zH>AlE;LDu*^mp99Bu^D`LisV8$~Wt`L{?>vDBoCly?(1)soeyMe&oTmH77u0@p$VtVA>%iYVBXb$Y*GiG!t<$Oe z*yZAjg~X@!GlReS-38=>`=G#w`=cwZcfP;uAn~DmE4Gy6=fM}P5Kexh;YXBqB)jK+0DOpNPHz4!u~`(4}4!ADf~dJe$MloRD370Go0@O@E+vfmCNbM z-UK#K`sawDm*2og#V<|yf{o~ZF5t%pxuX1leaWB2i6M`0f5fJD8++vk`)iX-<*x@H zs}v63Iq64$1B`E7>DMpp4EI6R`pX`+=W|{CC3_c@1B4I33W=}WbHdLtrG8+%?!WH7 z85{&P!KQ!Mfnk=UtEX$I&Au6C&xEL${+Gu+JgLF ziicV7J^F zFX}I!{Y9Lqz7kZA397#s5-@1(7gjs%->8&dhFt&e)>`DB_ZEoz7hB?kMS`mMF5M*Z zfjMiU!Pl}kt&jAJi!X9TIQ^cK{^erv z0XOK6XP5Wl__7uIt8$w9RQ9|2W!1vr!~TP@55@CR9PD)|KXY-;;65TWD^~dN6-E1KuaJ|3&9E;f#%I7E_dyML06+8eS0%@B`R$YXMgPlj z!WaFO<{vyO%k=3Fl3xMzKcoL(<2=&u zz5*;Y&A-3y&-amCdcN=3*^$b@MR{3dHhq6LBZa+9aHDk2zyGmjrNrAu7QavDSeM+K zlS1pGq{MOI0CEHV^>c3O&E?n167~WA{8Dj}Us>1wj2e3V+KT<%FjTz9NcHEBc5)vZ z$WN6M@BtU-U%RfDM)=P2&pRl8u-_8c&WD8k*%BZ8GU!h3hbfrOe^F#disxso>QVc7 zP$H|4PCjixKGuQG%@1hYn(7@kg?_C7e0R#`yD1r|ei;0xNV!IKi*hdr zpCNyMd}6Lib=C*TmiYtzWqKCX|Bkr$%-VYSsrW3pPAu{P@b#7N$92dD_d(U`t1I;N z?f(Y*oBlS*?`Q(M^(rC1SOC6TSBf{Al0jw6FHy$XZpOG$F7tEZ8%W9bZJX2NQ(nK1 z+#zrPU!@r&zdsV#XIBUXM(gP1_t^*Z90k+)&saU!*?yr%d70t6E(_P;0PujMsggp! zFD2E=@Y)~r`#x2FW7CpYLbkwX)YaolFcO?Mn)1DOVthtvpAUxKL(We$xmPnCM#1&g8;z1;31%> zC_zQB0E<{6Dg+foQ8}?;4;I7%zR%n|zq_4bmpksC*Z19gCeQ6``|fX_nVp%PofYX9 z?e``8ew6(ct?-vTwpi8i;X81P+>s@XQK?MkFOicLaf~$Av93th&_`K`W}qMJcHNjf4{Nl$KWZ+!3-#xzLRyW_y?XrEh z>1$MecJUd3Xx_Kq*umrTJB}MXtUtw`W8O4!KknEcV>2lvbGJ}H!MP7Saw zxPDb{UKkPnReYXIpKG~((Pex^!>U)2*QR^LIo|r5*+H&i@tUvkb4cT+C9!SA4_rUQ z$MjLwijQB0d~R>qkmtnpE9U3dD4$e)k@%Wbj6ENBlH~hepO1qZw#UsKItso)+9X7meKh$DlOtf4Uz@J9|KR!kyf(yF9Pb}# zv`mf<{eTSahlbd{6M=^^WEta`knX^mBp@&>lgOn)BVp+zhwKr zLO1B!Ay7kk{|WW8mM>CE){Pa7EcQ#QmA8Ibr^z$7Sb)E||ChB{ZC`n41DE@1JrrFt zgV)y$xM0T=rr+k)4}5F;RW!_+)nn!3h!3A$KAyZ$au}xbLg6X`8+H z%81XZ73Z^Cd+X=NXO|P-+_ck_@B2c(?EX~esvYMu&pkRmr=0lCzw{*K{ZH`a4XJ3@ zC&u}lqvW&BO!E5P?R)>qA3b`cxRae@Ht9EPaGyc>!$SF^$29LGqI(V=JE-f(vH8(E z*?=+4FYQLZTAK2PML%1ay?V!HTDxb?HJillbytPP4jwsT46WaWH#Mgk_xJ+!>OF9D z-_W4uR}LOAG=KD^gNKR3pF=yB(U*@1jT_6cEzG`S#y0OZY4}Yehjr;2io)@ox0Tss z%%l!pnb`#KBZr5GSKiz&?$)hwlw97&Tg2B=wvIyk?SQa6C*&Kj zHPSL~5$SUxk3WL@>!@P7=P!%b56yPc|7B?{K90$9I!YS-Az#OP;$f|Q7X8A*L#r9q zz-qC6;r6gV^t@khVmRWmZqMf(Zrug`F~(OD$RTY|$qPD(X;evC0vgxyH> z0nraVauXeoLYQtq;U?5Sq96UHa8?y{{gyOuP&-VxKP{(#30$zH;a<;r@m1sIx9|wb zcdN$tFzw&k8Xw2y4B{2-KE_qYM#ErQ?odDaAkB+_cAYT&7Gb$qF4oVb^+n(bT(Cw# z+udG#Cr_6fgm=pPynADHoSBUsRXrZ4RYB47Urpc0W_A6ywe7(NzXM$llJFc?#I`> zecN_keBrm{7QuU^ZjvwF{xV2h28v|NNmbP3Ie>AezKF2bjD z0d1N$X_*L^a9v@ikAEcHi?5Kcul4ki`K;IIcoe{Ay-xEKz!#)tB7o1K-y(o7yos(i z1x(kIvYZ_)87fX|`dB7o1P-y(o7Out0{pHo8XQ@{i+*gYK% z{NTlR;taV3-Xo|_`Bi0lQwZt*BAOTeXML9u4fCV#1;x|H3Q<82%YUTh6iz396!T$P zUxdt|(jRSFCITk>f}L=vsJj>6z3hMC`=ox7FP=V*rB83V{k>T$b-uMWe>U+2cgOhy z_0{$L`2IcZ%KN?e2G-^~?E;yMOsMxw#u3BzSBk( zL;LZB@8uei*QNjcdamG$r{CvB#?zlk?^5i#G(PXpz2yn9J>UO~W)+Np=~{j|wGGnt zvE`z#2T$OG?K+^-8ZZ6MyHRcvImMgr`RD2Sy2^hC+Qg49G^;_yMw`+P^!t=}-Sa=u zynA~;zQI$sU*^U4#=nx!eoy^l*%(QpOpEt&eyyxE$8beG`g2= zETX&sy>^lR;kU4#Yx7r%8xd`9RHcM00#CTEuzeP-sqDq~-deeV$^8H}(Y)LLB8^m@ zz1qChyJCXH_oH)Uw1IlsC%b!jIBp0zovlv#h6R$Q^*(P!Plvc@Lc`*IdTIN5P$9lM~ur*J)Gt)~yF+Q!Btl#AQ z@dorsr$FCQ%nQ%IKYo$Kd)=Ee8O9?553eq=tULo-7J@I^W{Geq#? z3tmj)dQeD~Z|hmF?DXR6U5jq;G?`br`6|b*Z(s#o--|05_Od3?(7BN2mr#4{BTb@V zCtW}D5^4_$H;INkk<>1w_MjC_qG3K2sqCj|ecE0GOt`MF_pPf?-;3{O8lNIMechFjc}2w%PxT z&+)o{w92NolF#DfQ$%vT^B3WlLg{SY-{0%K?;n%SAilRKJq@ODUFJ10-XVR%ohlhY znm6u^>!o=49k;1%t)%Vy6aXj4j5Ao`RJAZ9hqRu}~$G2VWGu`QZKe2w~ zjVjdMTg4E3?(O~fHtoE|v;H>WMY%=rki1S_e2!5mb__2*!&ToDeD=ff^c&UBwY?wT z^d<*ZdR<>JK82XVCwTJ-9%EUYubybnbj=I>-1XzW%y; zeMSBkru!+idtKk1)8rP;7czf2 zL>!*!cRuZ(LM;8#?+69x6{O!HApIKm6AJ~TUxSuK0|OFvbb>Wjef3KkJwNAY1LM2d zFOb8yrqb)Beu#yw&i#J%ag}Bxe*FW{y+DsSh%c7q4qQhZ3S5Z4>+TcZbMv8p$y=9E z0&q>CUa9d#+R6H#&WHC9z=1<$^AB*om{$6Qn-BW!yGZ5BydgC{d`Cg&!}zN@AGly2 ztA4>EFTUNP|DkItPLVHoob0Hg^98Sz_oYO9@4foKC@;Q7ma1QF@6_}&E|S~neD*KW zFB9>Ve!X*<7oQzQ3Xmd}l{267#F5hnuJ3_g8=GEybDvkQZ{dxp>1SP06g@#*KPOYh z>-uH0Pa%H(zkAEvd`Q0sDysSg`lQB(bfEKD-^>27CiB2RH`s~4Ot0bQL;9U&tNN9u z$Y&knt)F#*w|>wKygx2D@1UCx&o9px54>GdD43dl#&=RDKmDq@jv;cUa4m`G8(O((6N_{(-WJu&LHROy1Y1qegE)# z4=c!g*=(z~9(lZ*ubAJT7&uzJzPUH0#s>~uFWi44$I5aCbYh&?>sN@sc65)Q+g|8_Y#Fbo2XMh|9=dd$7oW9M)vvH$YWmqTeE1^X_m5l_vMt+>L!0Ni z`Lg)?Hr>~$e1ZNc^3^Vi9!bBx!H)9!Cep9|b0@ZO^Wpj~ruQe@Q)!BP!9BA6qVrk1 zy!FF%h5dd1h$&utqsFRyq5RbJbAI+NpMpD)e!X(Gul3?P*^akO3LP^Cq{e5~@Gf7O zxyhBUie4?Q>cv;ESmi5Dk!3#KUdH~8P{muTg`fvM@|cmGAcnCSXO zmVH^|rQZRKuPjwQ?R#0spN)~p<$s%2eSWeR-wC7C^ien{Mg3NWqgPB%zfLuo??5aN z=$g54`~z-2l%KEH^a~A1O+ROfH=q6Yk^K*R?MBS&>&5qlcK^s6ni`)~&zsMvkX-%f z^Ica@ck>~CDSTADzQrl>1q;0SZ03ee(L_Z5viJvVqZ99F>E=7Y{g}p97gReq|~08Si=5Kfvwhf8c9y>0e86d02lpHaOix*MI(ul*jn!QQy!nmTSi_+R7o>hk&W>p3%~8=D5`O zg4LIJUSIfSBECQVI;7;!xV{yhQ`1LrihSV~-h5UE@AP4^kg)6KomAkyzPP{5*6zQ# z<5Sbm+2WJ`C8&Sk`hM`quRYv+(9fp6k?yH1MLu8s8Wu%&uV3E)9~AcDs^>o8=F8*n zYhI&W-@*y0>F386xkR@6>U`PE2YaJ6bElgxhuibuItmIuj^~?X@ci?MuQ|3T7AL>V)XKMLhihRy~ z*^Z&>=RD)BpUKw@ep%Y=+Es$DNE=_(c~1IY=+pb7TjWmm)~^$f*BqQAIp7lbZUFkH z;CRDU$^NMr-x)e#JIupg^vcDHy!2bj`3v~UeE7!k@lYPYaav&0R{dkRcVjW76@ zclyBi;<)ZOmdQWB=d9jyl^5T5{w@)=D@~ElDf2GhAJ+an-**rg4ACNodbxNcjn+0% zjL$~n=3w-fLE}aYy?n%gkrdm4#;ZZJHYki7@CD=SbRIc)M7|h*M~tPzThM?p`J;#D z_aEGMZ2nc_#?p8<`ZzF1=g?)@_W8BFzW;R1YU&$C<8NRxZ;{s*rB+xm{ze7*vv|c* zdHh4PTVea1JT9EY<8veTYDjM6?&oXr2Dt963U0qs^bf;+F#gff71V$5RqTcOcKPs4 z)A+X8GXFsN9s3>ktc2KCEx_45T6>~D)NG`-%x4BbFX3*zrz25qSy^oPa! zm$?k0zkiAM2At8vLGNSwy@!eZV%fYOq>sCAeB*Psei&aZ@;>oxt7N=`@jh?$zP^G_ z^aQYYzkc7}UjCBQ&wfz7Z~R_aeNRg4%RSw?`^m}l{lyIZ`-|pw>i^gy!#JZ!nvqU_ z(7SURwVy%WN$UQGU!h*F8)<#_^$XB`-Sb0fdw0JDH=FpKQSG1`Z>px>S2%sx{GE54PlIpxzRTn4z`xMXQ)p-e znjhA`WY}Y;*u)p>AU%=W#|wX>>+outQ7!6ShS8A5OBB-}9FW^p><&^_j8hbROxA~- z&tJtNFQw%%kANRzx+V&_msuIA7jk&zP{r7 zPwxEB@B2GD3*`Qt^rGk~MtJZUMq8S=`@iAFupnd`D8HZe?TkeX@LH-R`a5?9){JhV%PT)^1t;#CcSmD)oc^;W~Ds z6ARuO#pZcbsBb90d29sZ5&2`!rZ70veDIiS&*d?SOy9Fb4aa%4wy zYO}+45Ifj}{Juk*k2A-O7}Iw^K3L4Dy?Yx={7cf&5tCix8AnUevEd@)MQa)|(PMDs zmNaNGjkp{dHg4eH5j51|$YJC2FYY^R*iC)=4ULwgN;4MWdwh4u>yKI$>>|!W^Y|bb2N>gEbF?v){X%c|?Y@cA z6@Qnw7B=v);D)XHSjk4gua6JeGDP`E+j#zN-6{D+UMVKn<@CEE{UKjTG(My;yqXbo zjSm^2d5eM=XT(}W?<)((|F3?~9&OJC5?UVa4FA*0uo*!F0t~Sb3naDV>p=NVgxV9W$_~g8OZvFype|(?D z&$rG?kMTQ6^1n4fa)uYnaug1K{%bNG<(3>?5MX_5KCfJC;A2gW$7z1HYyZiD-{SAa z;{LnpYkGffbF~=1JtsN+W8+V2<2#;;_foX)KXrRXJ+CYuZbU=(Y>w!$?uor_{UfaZ zX|>4zcg6L$?oN*X3fA9TsJ3_EyEyh7nXe=L1z0!qlQ#kCW3e3iZ@GP4Pr<)J(|^Ta zs{eIQGd^b?;~sDR&$$Sa$H(*gK2GfWt6V+<{{y#3{qbGQMEZjpHZ*&S=lB$bn|f&UDIka9q?&>`$v3B79t|*8BEQ0W?}?p=AbzY-(W;^Jb*FA;KQ=&*=O6d#W2@ z3h$6!V!3^Y_D8{Q3h)B(Hwn~w+3i2@|EIs9GTl|xjm@XX_EEdgTmQ|}4kIS$uYU(n zE~TLj#z>u=3yPvq(0K`e_X+7b8yomoEC+v!lmF@L#Xq1E`TzAO#gn#kz4^tso?-(3 z2JlRf^)|WGFb=SvfD`Un9BR3_r*5ujlKcpO+85k;4nxvYkBh(O2F2NBH@e7~j=?C(iFA z$&c@lVBA%3*wC5BJB9w4Ty6>T^@V?6JKe%>U`HMQ%W+=sm;6HhFQ)JUnSO=NqBH^B z-s1Eb9z)}iQkY5$MEb)d#;?V1VfTrRsoex|qTV2W+XHBPQwm}{)9Cy#ny275;rLj7 z)^qvYh5p&>Kd9f9OsD*zS6a+}EFMP`egmuf&*xe>4ab>-?`Cj04J|ji|3Fu4r`rHW zz|KIPOe#N++VnX_@&*dD0$0e0Z4dWEt*G$=-Z}NgO zwfJmo;A3_Dhj;35jnLoG^uKd2>2IaS_?;yAE#8mwi+nx<419ksyjJRf_$plQL%BLx z{gHmIyC!X&JN@GM&KA<&x-p)A+7Ec^FWRrg1pT`_EAuh4m74#c-45jh=(u%_yuaYP z_lfk!ax;2V!)W!?3}n#l1;7x3d= z)8zUXM>`R}#rn5p`||bc&vmEY5c|&`R93cK{KiAc@t3ui{*3;$d>EtTR5c#@ZCNJy z?MIXIACq?od*;dQ5*ON&benN*+8%0RQjI51qmP5$9Ld7XA>OH_2>Th?j_Q1BK~M&IPG*T7r@S#-tC~9Ke9vSpGFqtKO@qN=SN8Wjm63F2j*~k zd{S*c+4_czx1N>vV?k!Uo4l+(^W(dP*{*H8equY=F}-?q z6Z{8w|29AW4sD^WC&%@-A4yLCx_ExZ^+Yh7q{T!3{_I!5=Hck7iS&ox!!GanS~UO6 zxJUK>6>BK}zXGLP`n}YfUwk(}Oz@w_Ii14KXMDa|`T3D!r9QYW;5>W3T;Kjl-Y3n&k(C&n zH|(g@4?XGC{BWw}PTQpuA;?BQRUEb_ETJGwn)u)ZR z{9&=ZYqccivC*Y_z-r1jlA z6{@P&V}f>m>!}&Yz5WT$tMiAG%b09l0RH=i{-KmV(SAO143(d6i>F`bvEve&8IBbc59{_@R&veg%m3K2@@n$`!@j>F_{C&0x9&gD_Sk>p-xtfM zAHV()Dz~;D8J`z^GK12qJAIa&9A6%!a{66bdUhczKXKgmul*7f(h{|@2%a+vuwJl?C@NWVtRgAb04K7TPa{SQ$2A>2Nmeyx?s z`H!Fext7!?n5C9WJG1`5F;agMU_MrJAHyE~O>?jGEBM6}Vcqrg+wgk2KCbaeThor+ z`FU=Lmb>mph4s|sZ(kOlx4xtASiC^@O4t3{2j4Jx0c@{letTBu;?}PXDdApT4B#GnaGy z#r{kBInrtDyW)S!_(b|+Ic$Y0{SLbG{~-HM&-zq;cJUj<$??}*&E??-)bc~q-_>|r z|L(`jbZxyRuQSdI`sx-Hb$-?0zz-y7$5lH@%rL!sjq?c>jKhF8abKd&5Zzp$@$NRg5{lsEU9BvZF2ip`yqo99HE1@DcNN8yCyjyU7r0Mxw6UM_dA*;;K`lO! z|Kq%|-#@PU{T$){ZRg2!3V!kZ5OaK0Bd<)xTikC1+^~7J+!Odw{EfI~zr;=@{e zWn3@r*Q#vfF{AUhuX)!4fTd_6M`DS~Q@&4dr9>55@elu-g70-n$du3y93E77ZOb z%l(CEe#5%3;lzve*u?21%L4J3}fC1_J2MP_zkQ$FEPP?^yj>CsbT2- zijfZIaK37#%ln;)4SZ}{jtBp$H8V~X{8%0RpJ$Q(hnvJxll8K<|2z|xTY~>A)TgTR z0^ach$p6{T103JuC7Heqj&H&7ekPX}SZptPt5&X?Kg7?E_EY)O+2!iT`^x{uzm}i# zI{jri0sJfYyqqGbKlJtE7j59~DZf_J0mrAM)y+lym+N2oQekNB_6`FQ@#6-tWd_txt~sRg`BIsO8T$Io{&< zEZ%X>pL~De@*eyO$JH&CBmL$Ms~vs+0_!3FskMaezZG5i*amNYyq^yLxu5++e}7Le zmx8}K>YGWH-*oLlzT3?I@;GVyg+|}K_9zD3nKiqe)Xw$}5&l3G7 zjSJQETm24Vr|(N+vNk5?Kb>bvf3^>*{-65=$FrXhZggsd{+}ElKO&B-TKEs_4J%q_ zyVGw5_n&Y02t7}GC_X-e@oIAXeVAYGe>H8i`{qg=w3mW&rcsQ=V@p^Ln`TU*^bjH!AbGp#^uNr@J{Lme?(#Bo| zUiqgOA4E*nt&;oy^*AAt#xQjMANzI9X!#*m^Z&KvKh`I4|FPdlPX8)Xr2pvpFJ}D_ z5C1`b8|akC|8w|6EVkQMe)zBOpAhqBmCE+pEtLNUKaKNSZzjiotPlTpT>jDdmvDIl z@rn5L^5^((FF#a;%AYp#qx@O+B0YcqEY5F~B**_1%5T4_`A^_R)z9I-kz-`P8Kht8 zHgUuW*A3~nQIl{mGcGQO{&{(|$udFwWtBe33k ztG{k9_%j}mIw1d#Q2rVGAhmL1XP}9X}I#S*W05YV$^GE?%h7)Rw=6%yud$tO;Wt>X^1$Qj3x2Ez|35_Ig4vJ7 z^*6R8$A92HnU0)4)bu-u-;=d?+$r$)L4NhGT;BwUj|DeugN8TFcDJ8{|JC=Y{p9I1 zW7%?fe{p>Hm$jDXn8(Mf^|j=;wD#mLYs++sc%-Z)TjcsSkN1!B^1(N3UV!7Bf5n;t zxBkX9S$?R|pZJT@jK`NqetWC8{*Rxd^0ycxdGMSF92gfRe7pLbuG=eoz1XiNVgny* zb9{*HH~pJ`?dBiE^_M=s&;d7bvSlF?;k}RZL>8u zta?iD7lEJsXa9NB|7~;p`J_2aJt>)%;*nb{9 zh06a^sv7&3^8P>Y<`?5PiYZST<6Zd4HEREjSig>XvRs|Z>!0(o+&|ijupeH0n1SD5 z!N^hlqx~QDvOcK4>=60S^Jzxz<(xnG@aKLc_k`nC@aaF$fOST{f(!;|gX@)K{~!1b zwtxCyAo~0f=Y#UY!|SR1+29xh<5Ae#z4af@jsSl2)5Cj$*zbI9e*-^s+>ZReLQ!;8 z6C3zgo&Sq5i)Og}2mDVHe`H&=7{9e6IsVxAMO;n*hCY4~`1SFN67fTK*ym~ovZ?&g z4)4E%KS+Mzj7c|YH{$a7hms%duCTSAQOECU%+I5(Nox6LC*4X!|IWzgnbB~*09ahf zuxMU{Rn$K1d_=9wd+36S;4|s^4|sWSsh9rUAEo{M9DiEoFhAO_VFkaK;6E6D#$KiJ zm)H0+&>eR7(iyp4?N^1IF701rJ|Z~X?f<*4l>&>=ol;i&y)8Bx@@Qd+%#RUJq6!%lD{NIJ+p)-`ZNQ+0hitg0oAN&T3F3GdMtwQ`E z_8;88{yLw^pQJzd?Oopb>->XwKaqbH;1E%J#@R9-3$hO2H)r$xw_;Iry?BnHY#y7j z_!s=B!^j7sR&*U9Hvj2Cb{*Lt9>r^p*k*oZlB>zq9&yF_!*kJfM^Fu%VxeWBhdFxi^zw`Bp z%J>7|f8{FT-xlY$KTA&kV^*?1GbfJ!e~bU``Exh9{RjN#wx{~ndvShicXIrG{$F1F z77K#wH2Usqj&<|n{rzo1e;2#zI2eqG@IgDjG zAg?>_zstX)654v?a#R*bk{|8QI{*D#PeD5a`1SVZT5vcY3;&0m{LYR{xBeKv?mkMt zmW$v1JURVi>Gx6f{@ac7f8#kB4;}HmHT;^)Kj9ZX_=k|<(f0pB z)*tuZr#8^>r=%ObIX|(#OiusT*&m=YIJRo>(7)Ngd|kNyZejx;tMiY|7*!g_)pPL}0clphlDXK=-JFQ4C&g=Rbw- z$@b^X`BeUN(u{@=^Zvh1jz2Pw>&sgGC9qfWV_a_Nzn#lJ)(TnAOT@1~zuvxe&-Y&a zCx4~<)7Tj2car2U;PG%U9w6M{34VVZ&l!=k{dKoIU&JF_VmsZ!e{i0`L67$p`mbRB z*~!np(oduO-^Fi#lbrr%Ph>yg`V@};GT#5<>jKUt$ZyY=`$xLOcDfC6L@wJGf107R zKNPY5oG1L>#c%CRj{gFI*YkNCI`?mRU69W}|LNzc`F|~J;A8dt^V6T( zT;`R3ekk&vH`9#Yxc$WV!JGd#t^Fj(=@Fd3C}o`ykNorII!Bj(>ilP1^JS42e~k-B z|B^Vr^FQ)eU$5#9{_cEV!+F6kaNfE#IRfidT)Fsw`~Hjc``Oi$|Ii@M(BJ+sIsNs1 zsyKeEosiqL;K#UMSe1*St2V#}J{H@-K411i6E{EJAHV!`@}JFde(R^?_y;bRIy)QG z_Ny1T9Ef=67h%5&zc1HEy70j_BD?_U|Fdpmce(j<-k0T{!X=auydCE^eol`6Y4-m} z5B2$}o-Rt5lpp+`T*w1}8}_t`uYKjE ze@o&QQ{-Lg$5MZf??cFbQ}8LT57rIaB>-w%?n`n zOgycbJO3%>_aC2soAS@nxc}I{Cdc2IIgR^NPW}B0q@#U&Uo%F^^0w&*&hY`w=CAC3 zuA6@%xBq{;o$?^QBH$VE1rCmtvx4*^x z$N2q!5^am?D?D^Pf0Bc%6&r_!NGst>)+84_nO)5&Zbg4$TY^Qsw`8P=gv? z{7MwZt{{Yh8DscJ#f#m%E zZ>^jRA3(nd^h?3@-@1*<4@tJaVLRAPA1{n}>A!`_pJK9?hlMeu|HsFVa`w=2mp^aq zODoa5d0dldIO{6)dh~gfmuJ#)3Z!b(QunkLck zbs-&w+I!6*bbb{4rfgmS+x5JM8oT{x1>e7Rk{;pxasRRYO3r^!{;^+G+kfz#l<)xc z`7ge!f_T#poa3Q8?92|IclFZWTq^aCTzTa5YxSc1k;1GCNN-nu8q0rfp!7+>Fa4Um zDScB&HvNJd_NzenfLH&e4=DXQcg3GyJAX_44M+Qm%g>01e)sYEwo?>c75O5z(=E1x z9liNs&-a(pFOo{z$4PF%nNCV$|0kbFdnUb{{tFC6 zG5$>Wiz>$C3~vAQ;h$Wj^5gqQ=D%wBALUY8i$}kDM=RHXPq#Y%M=j2(63sssNsd({}f{jazF<;8Dk<7MgGn1}yh-Wq(zX2EZ1{6$ZY|9+TeEWTEzYs**^-Gn?= zv5UW!^YEY5JpPH!Q)jZ&2l3Dm-O8>-S;DOQPS8zzFa?z`n*q5F_z&JE(+k>@aUA`Ov*i`$6w zTg=xH`k&B)@_*tt!~A@qQgZx$<1eBADmbCzo>l7k)&i)H1vl)f&3hMnmES&_C-Zf) zvg8&zyYIh0WUK8_`{{ly?w^qctqc*a+C+8FlPVcztya-6bF#d@nzd=3LN!aSZ`5r? z-+6Ckd_w6>Z12=>Wr*N6S-c>?_QAd@PK)OMJYT@$ZwUV2eHk(RZ9We@|J41bF2BDM z49apc@7BP3Rl(ZwJ_0`&!|4M3{j#xvk2N_S`Uj5xHv0W0tPcOVko?~v|G8|1^dBqT z+kY-=tNMS#V)h5E|Nqi+ct6_ni>)=)_yz#+v8Ex9m%;X)D?btA=Uj)?E&l$|bh^I5 zf77XMEqRP8-u&U+a!aJ&VYkTqB)p{vyNp`YUr_%w`1oh@b9pOvUhzCb*#Xbsx-J>-LQPD;Llhrb%X!Z zTSo0~KUOwQeNtXuJHuQ5Q_olZXUHu--fEyizEO^$!}`;s61-1sommM!C*U^p5D&Wan=cncf&*bv9( zvAySy+H2hWVdkG!G0g~O#`QOybB-+o`#>v8=T@cqktUDmTrA8tgq z&JL2j4Jx0oJ?tlNMpO|DgSR^{b-&ymCx`>zL&D5ANgqR;xcgy;{ac z(&c#}XZz#>d0xm@abAA>HZPdS_N|OS^!r({^|#CPdlKm%{yolb9Ge_}o65}DQntHe zzb`dV&kM(2j{J(xcM>-6u{b~2Ds4ON@hbncYbwh>!7n6-@RM}9=is_+AOYR&Rbo6e z(H`h*JR=$o_9p;Wf6u$`r~SFwOWTk>qP&ACBVS$L2j9r%1@QmBs-JwO+keo1;7j5+ z$5%IAZ!LARkMq|5_1EPN^LW3t@cb(f<``*u@_jZqOZpG=)8ChbKFY?f8Egmp+Ix2$ z^wK}LM{X2pCH4QUwkUtbpI_(nBt2cvrw2Sh_lqU;zS=F>(a_=}IS+kTPUZ6F_-xW8 z+jxUy5zEYJG*97up2zwwWaTHgVSmi|Iq1cI=A-OC*UNla^2giHU$~lf`%L`#QAAuO z(SH0m@lbe*{6Vl-Pt*BOh<2rR`A?V%vhL^g=4o<$?)EGA z&&h9)fB%SFf{vBx?LUEOa^LWu16+SJ+AN75lzz?Rd=l}{FXnH&ej@*&vx`pPueIvi zy>9^cKdJdS_!n|~@XMlT6!bH3UOQyGi4A-#wu5c| z;0sl~{O9c-$^XmZ{$tckj{i>0Pk^EO74+BrDv|y+?=Zx6@wbDO=kH~F|0*V3Z5O|j zB>yq|zCYSSz<(O-bAsKJi^48zc((etN|Jz#snL3=Vt*@n@p#5Yh>R%lHTa3*62Nmm;spPad8Nz?U z+V`7kjHLAYIE_Ea{8nvm{&zI~QS8rFUA6vxvleeN#SAUp(D)QsnyG{n=LHX2GaCv0 zOEvwgQ!zc9mTr8B^mw8-|Cbs+p5I0Ic?yn?_xEGhg*k54u2%((58J~A&%`fjKP!7+ zNOb(??lPZ&|BT*3<+n=d#=6sG2IKhfuUjJp%j4a4;^z^Oz0yx`w1#cu{>`(b{|C9F z_E{WnHIUaUcnY@gwgHZYeXnq7wEQ1i`)95{{zLia%5>urE>GHAZr9s?E|FNV{Ie71 zKfy_=|NO8+rX!?N{MA1bl&>kF}#^6khHx*N@P;BKS?35&R$HiRtYpFLFL(FOYr$|JldwUGS?c=JGRG4tw!?+a`P6e;YQZ_Xqn| zHx^gn_Mdv*{EO$y>jeG_k)IT)^{-2`cwGNMT0G7xS^m{?ItIM>FCl(&K%C#Ie{}rT z1K#|I*ZC2DwEUY6yfMU!e+cmh2gdo021myqobSz#c%2{diTH!sg(>ZN{5-***+i>Jpa0+Rf6=h{WTAfskD~(q#wLw_;^MbXIXZsF z`fvD$ywK-X!Jnz~pHA)n$HnzG8XXTmgjsByTwX}r(#@(v_T<{>3KVAIB=|{(J_5N@8r=0n~@q$0h{jZ?^=G&-lQZuf< zbCmqSP5%x52m8!F1%I)||I7^Pdr>>iZ=Z2=`aAy-{{<_)AK+Dg+%!hk)Pq0D`tP*v z6{!9juRkuXtk!qG{g>*4E93P?YC4M5B}JXL=L~h;sISg%r1l8ZjfHjHa+ROB@4^;# z9a2^3U!v*Xv@W&1x%4-(k4}I4wg1L{rY)$`P4Ms3_}6EVfOX>j;~XV_=Jv#q4-~4a<|Bd|%<_Q1K(E9%r-CEhO zZ;10dN68=gkN79lF#Z<&SsK5Sm0?)D? zx{ThnS(g!OzqQWt=GWVA{rXQ%Mn9j^<$0l=do{NYqyCr$5FZP_haI%xz#CraSMZA| z!n*sle;U_P`z8gy_D{11wck=e`=?Foih%adaCd6&q!4TWq; z^tWkU5&R}y|G%ENVT_ml_Y41b;`&>G^3mTeXZ^SCi#+9}zu*^Bh}GpL7QGlcjO+B7^BY zws}pAcP7$vn@&{s7((Mj(7Zk&e}%ogPP^#)k0Gu9-ca#8XkmK1|65CMe$g+>t^Xv9 z7xA9jez=$WC5F!lN0E^KPoi?awT#}&JNrz-q)?Hbs|o$>06i!bL7PmT2mie{w5}=A z?*Zn=_G*;wKGxzyESSPyPAPc=U_-ZGLo3@Q0}1nM1t6 zA=FQ(MYge^nw&>nhIbn?CjWvTRmeW=1110A{xe(XxsX|f>Hs`BKK!En+^xU;J#<_n-^`S_}IMwa24hpfmb#{!H22ZNRqazqn7DtNc^I`tSXnSLFO8aIWM> zz5!dp&pq_#6-&8ahRx40pjQ{}hZ5oV0v4_&Klea8bOs+Dy22Ln57=S#8`g01uVDVW zE0Hi_V*aue`NQ0fuJaqMilV#EiT*bXoge4Li(>}5!*+4{b#e2rW&VqvSM@J$Q@;A+ zx`0#X_tQVbX99c2tmZ@A{0{RsX{_oWYMUB=kagDecQ`)VNB==F#nm4s&m#SI%=&AV zoBsgw|1$wSHRJ|?cHaEealhR!^F8#cf{U|$|m@isSq8S7s(C0_Os zn-rgyn*QL_`OP~PMoDyjr%0BYvYAsi;KuTPzqG67=C^qKoPrls{X^%MFTb;2=07?= z&I|sLh(B%rm$!TI@6+@Tv@d6V*7<+sZ`bU*>2CfU*1z~!RsXUS`Rx%hUF-e>zcN{1 zq+j?y{6p6t@i_06o!|M)&5!plI(6p!lXp;jL2CLt_jvOoU()#ze~J#y^Lbi)mEHHh z>gGrJKfv$hBo|K~6d?q3e)!?_wKW()bY3Oo1xXU=f* zA7KBfv`fAJ1};jCANN_E-?>!s7ijz_{}k}y!3|r=KVaXk^X~>Xe+KtIc~UDsl$A3- zu8SXk34k?gYV-S=hyVPcmEVf3)buwyOPzK7ZH`Ae)cq$*gyo-$YzXJPv;3)Z%$VK^FR6VDmOp$ze&q~%6#|}zKk0) zh=e`3rgcgrJuH1aiuk-|8yQ%a1=tE&j$%1AYU0 z-qdwd-TWE+{oni(RsG9S{IOX-i%9r0xz@NjMG2!_~DaXUEsj&SEH^0gJck2FM&is)C z{3Sm8@~Xwl&wIP}$#L`J{`=iQ-T~*I#aEWE{#N%R`%j@RJkMuq@f+)W+{Dd~`pYEE ze?nbS<9B*U&I~>-@_+MM8K1@R$p2CQH8oDmBHhC7JNeORZhoZSDSG|4Yij&{<>v_V zA8q;tH|(S)E$;Q=AALympR#i1w|XAge@Y;@W(zr6f$efei?iJP#eDx=Mg4E16a4?G z^3^|_fWLqbui+b|91k13$vWQ6?=b%o-T!mTm*2=spuZ2l+$x^`%x-zV^85n%Pm4cP z{|Q`OzWl)i{Dr#kJP*HzJ!fizzuo#H{hnG!^`EkG=64eC`}se(VXu04O12mO`uZw= z@ipbEzj<8(|4CB+f&Vmr&5J+dXVrf~-O88WPLaQmv0%rw`E-?=-{$heeOmq*=w813 zkp%pH?Vp4Ax&+uR+uyy|&0om;CDYXQt1=({MCE7mANiasgO3+$ztZ|ap#3UxtnBY= z^7^_dX19j@U_ee^H-8!DpOdxvV{wnv^bhlU4B$uk0nb&D&!hZ+`r`_p{4b;J&d2@Gg)ArKbJXm{R{cLVBfC)!98yN%nv1h&vt75 z6X=;5zvIJi_L1j>dallo>yn87mXms3;lL0qHeEFRe`9qpZ&3)u!)6I|i`_C_^`UiTa#*gQu zhuyz?`j4UhK1k!ltjRxMxBm8hz|Fst`_JUh(#k(R{0YlH9lf95MQVBX|8drYql8(^ zsT-3cU>i2=+S<*J_RojbY3-jkdh4Hv-}%|Q{WDk)j*?_D56W*QpRXT(7P|%P6Q@7h z)y=tJYp~2`bpOHg#|-At%MY0x&!-nNh5QRPZRpwi-TZ5re}~@w z6HJZY@BS6$^D1B-ogeWraQ+d}?9P(YCb{|1|FDIY|CFW3Zw&X=KgjXfKKz4paE%-1 zv14Nm<@pQv_v-n7-_-OsCwTK4LuCBX^22X%diSqv@TpsWA^9qZ5{ZsY-Qa&HpVFN0sx%pB4 z>2QjA|1C?AKjO#F{i2~W^hf=%MAIF!$d_PW+kVeVH$VEHAJahPFYceB{yxv|tclY9 z{rHiuf*ZDsf52Y-%ePAXD{rf;Kd#X8|NPYWQBTj{-=xiBd6aIKD?Iw7y*tj*>1YxE#>)Li2HxqE7bZ|V3;?5qWYJW zEypp1|LE=KSo2zjko*JFI^V?fsqN;pMBpU03ph6Z+%5Pg4iydBnrs|HKz>x%p9l-?lUU z?xWZ=G$J*AXS(Ff5Idm>`Wy9Ryskg43(iY!75|TX6Sh``-b(v(PN^)vP0-rU10%ip z6V>1S@*jJKyPsP6K|^dPgyzhM-uRt#3fgLmGK%)_2fn`y7_JPpS>rj z{ADTf`=#G-0{>Y7V9i2**uPHxajj)(t)f3K!HW-}QJHsku&hq(C**nft7qVfmE zrN-}{nb*?;`>&t+L* zCw820ja&Z^_kXC`NYy_uv3&W%3HZ@30=mN@-+_JMmIX@xRg@q0YxMnP)j z2f0N=;jppecEqvUP!0O@)z@oz&6jL}3yG4E6{K!A&UaF?wvK0A!?_YOFPsm|DU4NXHhHvDutgz3Xnzg~rkM^q$7pnZl zQ_5F=oB6@1^XK^7zsmT8U~gDAN@;&U{`0Hu|5MACKazlduP!{#muhxLzum96^>_IG zb!HV+|G>1=_^ms=^Pe!s`{`fe!w=nI?-_HgGX4q5pYz+R{ADTf`;|Y9yX1LgGpFu9 ze)<<`=k?b=JFaujY03$^+4KR)=R zn;-sv^~0+E#kZxVzn}l$xvI_&|1Z!uF)P)G*I#Z(<@&nQ@ zIFWwg|GLiL&txpvUoU>4t(zb1Kkt02@&|5DjUPH^FaXkTnEguEAN(17cyPml8+KN& z1o<_S1g_fHm8e=S{Y6yqu=IKaS_8SBvjoxTfMe zz4cG@{5^7!_xo$+j3v>%XYw)d{5RZMzQ2~`I=1_#$un5KE3=XE{uIWa{OWo2`FrTD z)cC=f!N-j~|Lr2jY1H|hl}8>w3jEk^@^77*y8Q>^@0HY5`2%yxng3VWF9ICUKM{X` zb%3ok`c22pznA+DT=}Bff1@l#{>V1({u|(go-zJxIo@D4bLwU%N5I~7#!~~_{2ANi z^Y`9$)%>&gZg2e)K7W6pD0)Qr5AMHsegysX{IgUC=lNXDR$$wV8=<^Eh4!l#Pg40q z_oT@0)BYLZ^D1C2oj=*~|Mh2QpXAmb{ja*drRJZ3!t&*}=F98i$6u19{&fPS8{PcS zfBQMA{$=INA5OrZto}QGT^@GxL;o4N|IaO7{f(m3^hdgY?b_zr54`wCH&^u!-CMr= z!BqL#txMU?n)AjyH^0UC&jPLeDlo5n`JF`k%%>*FJJyh0)D^z6Wp*5evqcLAA*0bUjBceeEF>h6ZnrVJkJ+u_Rn7Xl<~*bvj0D> z`+ti3Vdl)>dZ}GvI%ug6984<;!pLc^xf(9-l94gRXUz@^c~UKlD76Kd_*D`6CJV zb9Kkz`9gLJ*vA^rzSiwO2iX5x*Hrn-Qsnn*f3OxEIsF#+=n=7tvr7*S^pBP z{8^SFzu)+K!36rlzjgh?909xVvDu#EC%50N<^PLP)88-s;=Br&NB1A;UA)j`bpM(E z$-#5o`49Z3M?*FL2`x^IAMLcd|JaX6!lU({AfF5D-^X36^dCn0yd0}rRj&zw5H zwN&zFF^{f)9>?n@1X<|V!#{}mbpBj!R)f8I z(WoEX{23p~{BxI{|A$l5pE(cH|53@0db+NEj@tYeI}O|yV6Q*$rQzmZ!THZN?fG?R zNoxFI=G6I($0UD&kNzbwV)cjaKg-&l`L>(CjQwZ#xo|Z3-L$|Xsqy=be-&hYJSNxm z_wygrdtt90G3!=0e=+Mn@JyAzELDEy)b&UI?F`PQb^a2c@=q?u!#+FiT&4XD?N^;Q zYx)1u)b#hu|IHOg_8+7R)qChWOdJ9G&efTSmh5aPmLd(y8qz$bvEA#w?%jH@zpvH8OSnV)^_F*Tsb% z{RwW^`xnk0>czilk;)%fks|+8Z+@qN%zuuS-{upV$o8k>)0Fl%hx7j*#0TnKQ(21q z=97|B_aBqT`OM^Fz<txA;3* zI)CI#Io_9_|K~D4?3b6E`mUS5l=Xj4d;S=DA~pWtW8UdEyi-2c1}F4)*#C3fqPu=W zca!59_aqN;eg72Wr?q=QEdU0dOpQNswEBN{Wc`t@!GFgO+q!x2TPwBazbW#E`8yrD z|NHq5-XF(xaY-NjS;)6l*d+&EY3JrQ-k0V7-}UETE4}qk^!(Sa{%Ea~=^B25`!D)m z6)>mHU&`^Y^Y;Z#aPwy}|1DbmG4xbw{C?%PF!L8Mpw91C{w(G7VRuY^=Vv!R`Va5W z%AbL!Q{(s3ALr$#e~B(U&zEVo(Sk?Ux%tume-SDc-2PUUB0tJG8GKx{{~J$9|HcYvwD2-t9L8o4}jnL zUgZxJr^fH+KY0G)$B%e$!-nvKZG#SfD&yyXzscJwe_(a_^24vd3IBoqgEUUeW^%R; z+p)og2i*P>*eUbRKAQezDf0W(-yQaUBs1_M|IAQtKfph1{NATd+}qI2kLQnXY58aI zGpXs1d?telkbcdlW%@1Pc%8o_My&qGWVe8AG-QqP{v*EM-LRS3{t$Y$eEIDJ{29!t z(i?`JfByUQ`^xx-$Unc=o?i!^ON}3XuInFR{%jxp_v+w0uk$agzjm_Qf5880L`}bC z<;-ubN-h7_`8VEs`)Duzam6Zs@tX40AL;jh)&JSiWoLWw@6p=dLeG~ke>g?`_5A;= zmA`r3e;3bH^$)yI&iwrRUDrQR{vY6U0DE5E)yns~ji0&wTx)+Q^Wjg_eiE#{BznXQ zK5nf2esCV@<`dT|?LVl$e=$?_pR)4i_h~;t`$Mw)yFOb~-JO3z|LJ)C&Zl4e za%%b;KHp#V{r+R-(dj>F&CF-K`13we-(Lv5k{W;b8Od{)|5WzwKOepW`?u!$10RxtkyF&$g|l>K|}YX)1qNiu~bn<`41pf^Bn6AmZl7`2PdzsrF<|*9oGM7({CYHOJL8fo1;9xE93U(voBHorz}N&^Cj=}Yjb=F>#65Ie(mSr zhOPR^=kK}oKfwIYXz923werv`|%^)!tS{5;FoTGq~Fnc`_JpC@%yD;>*dta zFZ>?%&4-ItyZO=ne`Ph*e*$l$#_zo1<3IdfTaJ(az_0Z5Tg(x#JwE?O8NV*;16lul zR!hHSDe{}^j?AC!!@oiY=Xtre`1lE3-a1Kne;nf{^rZYVI-&pno2lt*fQ6{2Sdc44jJb?1cTU+~U9 zi{C9Le KaC%_G_-#L?C0i&Vf;J)Vf<*dHCjfO=!+1@Y&L{ZBRIU-Irhiy!hg@#Fag zc4ELkX#c%Ib$<-)Ux)dJpPUf3pMv+whaWgi`Nu>rr2-K02mT`I=a~2{i2%L#^yQ)T zgBU-_c|835zB2{>|1^H+?Tr3@oU=Uo`PaLNB_Cuz62DS#nf8_6cDZ`CO1} z{vY_kP>UCL)C}TB|L2sCApS3dct+P@UzpZNj=^%wmg!~-WN>>hOBSwnjT@nip} zY3B3q`tspVWk1#$Mv%&W$^h7)3*;QM>(;j?2Jz$hG4`h6|2LEmf2!wq@C7+T{^Yvc#0J7V3Ap#0%~Vy6G! zSU&kf&e>8f`v15C6aQ%dq@QJ}Mu6do!1G5Plgy$q{^} z{gfHFak>vbgibtT&KE)au%F)z`~{oJhu=+sANI3dZ~#B-XQzP^r^O;x&?-YNyE2F$ z&oAp1h2_7qocL4O59ZI58u(FvQ$4@rgAt*xXKoDnPso4x+%WzHAD2)5=x3Vt1Nr9} z_#uDGz=_kC`~Yp*vO}oQfjX!vTzZy1Zg8hG5KK%Gjx`{tt&hh^o z;TLrC*3zSc_JjRzr~MiBpF7Km-~J+6{#ZX-Bz9uTKh^jHaD%>l!FlbY@Sknk|7Ycs zzxU-oi@(^Y7e`lo^_3ugv|qbk2+O}DUOxP(`p@`&O1>d~v|rGR0axWo1nhB6^{y={ z2iAWLe~115iQg*aeo{%5Jj&yL_BO^ZTq)3!<1$nh{Q<}7IsBel$^1f;zoed02Lgv@ zoUb&_`w~#^k<7$B$OpJVYc&}4ah2@slkzT^=O+RF&V*kdvFf~jPUEahe>ohjj_yeB z$piWCyqM0XCCh6{*EL+PYOc~@7!_!{$?LDRA_*MGNZ@NN>A~X8I#kfCWO^x90XOLG z&z8Lxh2Oq{CG39Bbf`_|-t0`82hhzA z&f%m_m*xe$S?q_q=sfm)rgARs=7)DGX87q<_ijpuKiV+=@pI{Z3OIlp^oEaL{XGi* z<(Z5>UV-uNIY|+ImB9ZFH4l)LrXSEndwNn{cU28vf3rsTyu+p8^KqTS=SR`-cQF4{ z`0F<+{#O+KbuaQAv6a#IUEP2L^#6Gw;eRxVf0w?Wu6r9u4-_7`i}BbSDIJCRbROha zEeW4@recHnrNVzv$Byfw@Gp9V99)=w-a9VJH=C|SdGu) ze^gL9yjYXZA=8sYzAoLX!{c;aUyD<_qr>5He~fbL$pJFaQk{jl))vy?t~Jr#bd^s@d@ z_=f@ii_`pDqwss=H&KShA3Tr3uLAa^@dwju{LYM|{b~Hc>#6WJ>UwT=6n<+R-{GwM z_woEJ!nJPxQ)FEB@KfJf)VNv)C1i!l^wfuv4)3F~rAm1qb!Ti$2 zzxL?IYeeCHUhGG`%kqDZ?4z>ENchk9+LC^${jwI-_XFBXo6dFc8q#(0r?J=T`(fHZ z_9rpAro&3QZqG^D%lTdCd|sAvD7_9FD1Y~`EM<9=KLs49x1hgVUggFp{G;#YJM8!V zJ%07}QA!8kx9GPH!0#=m-xPp9PS-t5-o;A7-id26Mdq9ru6at)2qadePpkhvcUuAGMFi!4bVl=JjEHIOLa&^n1hO z=F59kNcaYASIDPCet>2^`{L)p{@a=lxc`u<9Ec2`&3H>G)-59j(p_bxU<)eRHUO$4BJ)0rf-OnyYl^Q(Y-*S*G%a zQvZ}fA(?ob>Tis$>9A-w^Y4zN{3+lt@#im_b8{5_c?}r9yN>;5D*W;BgpUI7yECag z3c#;sQP~s{`2R)c6o5ZQ*K`2>_&t;#1>lDcfWNQ&0Nr`=shX}L5%I4OUJe(M1Ft49eN1<2nXl&f?| zC4UpYTRdfP6#l|_%&@hK?SJWO+WxZ=^*593SKGJ!LK8pKs>SEf_ei>q-9( zTML``LHAd6y!{m2PvO;}B&!XX%6+Ir2~!}`2o7LU5i`EesYJ)^CP~0 zQSlg(|BD&w&GirZci1~w54u~c570NSVLibf-=yjiYo4X{-N^0jx++AUBt8dld@n7) z$1+tvdfw6gamk5HThqCI9zZ>DsmXQbWvX7C=sHmxmi&Mo8dhI;fwuomQ`kQ7{Cmu) z)PDU&jT4St(e}TG_6ZHz|GC3CAGA}r{ZNPFy|L^MAirLc-pXMApC>nXhW?NbaD#rf zVAS|1`^nzRcf=;R{*Sd2!v6E_bHn!G(!6(v`o~_Intr%i%a_j8i8cK&dRRDplT*Xz zk2R#{pg{k+fUXD6Q{mrm{-!gd@PA5p^3zcOQ8TJP`dWNn z4W$F@-Q8V7>5%srWgd9`bPfK#r}B}vral<@2f5?CdyOGiSI)|+lP&8PFn)FTLb9I& zN&B()MBC4&Qd8#Xg zd;Ia9gogs~$GSCDIsm^%zjXk9yH^XPLn{0pUDF|5{Qs)mXL=NVJil89runKHHARnq z9z6a78;BZj2tKc`AbSg*W4uSLAV*AL^b=uwO85Ewv1tnmqwrV%Q7rE8zk#3n1K`ic zA2|2NdjjVgzY{o5g}*>xH9}dJ?NtBR1>Ad5t!`yH}_7D^|?? zG_+sMs}uf*tEx49IbQu9jepI)Fn)U~UcLJoD;+dEZ7bGYjg=04`?LRx zPj0MqXmo~Le}Jx2D3kl`hZ-v#Mm3}IR#E#msj(l{Q+YZ+`$4)+0S9n{UNK_)pHcWv zzL@dbdtLul6Mv;6IDfUKk6C0Ejb}aA$Pe}yz8>$~Na-+0%Y&}R=(-LW%cwqU zfBOMlr!esvvi~^Q%kz!=a5!Dp_;CO~>>l*^S5FzE?Z58~)?=yI|Nco8lvfkI5i0A? zX#3H81^dr;%6O4!|10aU9a=ZA{lNZT9K+?(LzxdTPk_SyV=bDf*gMAn{z2{UsKd){ zC;Zep@`3*U^jk?@+sR_2U*%2Y@g=t(^I^&JPEKBNg+u7pWhAePf$<4FzV5!0^gj(q z6v6jn1E^~qBYSZ#qUS9NKht?IeVo(^*=q`XkURLCzv}aiTK;)1%ONiBAICmK&+m0A zs=FsWsBx?9n1m;Tz>vft)2C@_%cCq?hqJOK#Bpi`dADD)v#n zvOfgsgZn?dH>@}#%Kp`#oRND4*WZG%y8b5HukWZny3;CBU!kra%;%*dO0WB4RxXa8r~07Bk1nG8Dd4c=2jst?;9_=ijVjelH0IY(7g7gZAfuUHQxLH__v7k|eEj1%LWz~A=G zFu#y1@LTs=D%O$6t8Uz`fch zeFomxZ@^Xky9~JYCc4nZYS#OvoBGqQ6Rl=cApJNAKTgJvLi}ipAFT+|c_&D_$A;) z{XpjN<>zeC_!r#G>Cyl3zNQoxWvFc^H!~XlHr=V91Ngs@^q%x*_$mz%-op7i;y)q( zITDZOdK&KXk0*`zsuBB@C3XV7Hii%7rv(p`Oh}ubst3^ru^Tl+WHqQ|0N=SyuT}W zm*jtGhFaA?2`9(c~{B6k)=Qk|+ zNoo8jr%3kCw+X*}SrWhZH}Ri3NbE=Yfxy3APUUF%*ERf)E%|u6!}foI_+d4H$C)9o9+KXj%lX5; z$H+W1Pw)dT_=BFjm%8*0%0FA=-|S+g;&rMe@Y~tx;lD$0dXxD*5pZ@AIam$Z&qMw% z$hf*Si}?lqzQPy$5AfQOA@uO(Qv2p0{`h;`el_e&^Kza^_TN;MX#8Uh|5>_4>{jdq z_^Zxjd%$x9@J#C=cCv&01mt|H*qi-BwEe*TOMl7vUgOWdhs(wILt$<5&{qZgf13C= zz)u?e|4G6Z+F!`|onyp5NP0^cj*I*qu{ZFwK(3bxt=wi%9gV*b_+|a_ygRA=>Yc>z zR83F*{S1F1#i(q_-<}z^bMw87D>w8p+QIn}?+JBG35|5;4P}ZJ(fFr8?}C3G*}r#PhFW;1^nVVEwx5NySw|(3|1R-|>Lb1n_$O2g z`x)5Ja49!_BtI{sUR){l*WMAv4?YSd+wRR(67$c! z6!`VLZhb)h^<}l4NazJMR?ul*DA1--!T zgiY1;iDn;F&(1ys^Z)Vu(%=OeqsXYLM$^0ieGkfONhdbVr@+``kNV+p%9k=oAA$Fv zm3k)6?Z>L9;?n5e(d|1_RoYTnBE$4=yW4LN#Jt|#e%YtcMT@14%+ zQC}=62j`u>+i|+apFfe)qyKy>%?Y>s$Efv=^4Up>eDaPVbGhQPo4RQ7!{$d0F9I}5WfZwV8KP!JHP5iKX)T;+;-?xkWXC138_fOzIFQWyN&RrR5kJKak zh-mzJU5P$We+Rr1wiCXp)c9Y*@ug-%|XNBmD=Ae_FUv=xHN&teP z?1U)$Ir9m!pL>${ojU2se*%r z{hS`}Pmftc^1rZB(*BQR{P0Mi+Ws@?&lZ80^Bf?j55#`Vc6NlG9~zjqf%it<)0LHX zi&A&$;i5o)!$O8aC%tw4Us3k6VhQ12m6gD+>ZT|EkC(6aLtHDxKZ7seFBHFlc;LT5>M!DfKVLEg zA8T(MpX0Y*Vm~Y8{nw9VKkmyF6Y_WJr6>PM+gP5?xh|mlw8Bf_c;K&Q!~=iz{P6Q8 z@Nbt~mk3?8arQ$RKMLzB>qj2{fyU3@P1=urRC@SZKQ8uQj34$DIYTeNi!SqD@cVBMu)Z+=r+r28KM!T72L`ZSY%3c7 z1N%8c*iUa64{;mtI6v?gpUL@P{Rr%#|L0sT)+y%64eiB#yw2h0dhDBk{S}^6mXCkF z;9s+v$N%@aG=B10VEn&9H2&u(oj!p7B`MdDc}jeh_S=>GoiS`DMRMVFNgtPZPvVdN zjrqd!Bk)>s9dPg7;kx=$2}nbb?=4cjPfV)f#^yGj3?Od)mmE|VIs7GGrc=a&H1Lqe~ zFKme~kQ;Kv4w1e{;w^)|*kFl2|5>6H?0?P6^!~U1Aqn~0jnl*b5pc?TE984|4Ym{1 zYaaDd>L*Od9tMx z`1QJAeUwPPqr`rkX<_?0>`InD=9$2LCdmAD=mmDZ#L(AKl7F$#LZOG8bkTW1{FZ#b z>9O&Ic{;o#^?&lC>_3+ap18yV|2bbuy?8Y2XFmHfY;UIh=Lr7SEB3ie z<1c!U^TGIY&IYpoElK&?P1D1V_s+m6#i+++T*V&8_6+=6FOl&SsV{gC`FcS({z%CP zd=$ueg~lD<3d(<{Jbw+1Q4O1!l)q~B_we6u*g5c*iu`Ta?GgMgMgHhNT+o&9f0C5HmnQzN28%uH3ENM*ufq0#`ghNoa6IPk4Lmt4e~e#2 z?%;pR54Ss7{$+w6^S1|{Ozm$#{!a7s=v8c95^ga199FAlvwh5vE1{clUk-)@l}{<-3Rl@OYoWPmudgt zvuD-4lY;os|NKpl-_B0jkKHmo{C`S2Yn{yPzQ9r2d$B*UUgUl?BuIhh? zACq(JlvwZHm3h#&U<0r?;I`=tDxR_VzcxM;U)S(Uz>oWK1b;@My+q?*Bl1W8evuziRf4ksE{ayMY zjo&_##IH_D4}W*r|HtYc9{*WCL2ybth4Qbh6^;jA&wUu?3v!3u{_rr3XBdiXDSP2|5KEdTp^i#>>(f&Uf3iG6i|zrlTB`vHDi zfP$W%_2(Ty|FcrY-@3m>&o67Ls>ALOxwVbPe^@Qf5cPNLKu(W!j#8YuUgEK@FZ6#T zp6lg(6YS%08HcpwJGKRq5w3&JP2=D7*N>na*nj7F)PML`7KhM9F9rTu&+(nWk8uWd zU<$JI>F@HKf_^eu7W5ww551g;c1@n^!7uRR{M|b?zwGo>`m-kqSfNsV$X)3iFFlzMLw3?@V3YS z^Jj`A9u)XH9q9XB(Eg{$`=fERpOdvN@c!%6^zheuDjNSG5^q1x{xe7L^ppDKNIdMr zY=3P@UntZPy71_p(}MUh|9Rd-^8ZU=C1n3;;x85XW1Wr^qfDHre`Y@)ay9X{k&JAi z;B(!>=lSpNP!8UoE*?qGzXAC>r~N(o!~W6#hx|RMcb>@K5+EjiQ|{pZh&uN#(DKh0 z`%jEt(f(=iNmbR_{cI2R>CyQ0zFzt$VRFzqL5WsaCm8R*@9%*B4)|x|IrknTzK&!B z`?ux%w4d+4B4|JMhg^SatRnmIGF1H;(hi;xjlX`&aQ#(hbA6025Br}HbHnu_Tgq>- zo8!Iv!{b7o4}{Z0{BjC>mas4fm3tfgV&RBETkC`v=M+?8Pqj|h~xZt(qI`ntp@YtrH{Lz27awhrz zv6T||9Xne7CjLnxH}C1N{4vj8J;Cvizq$SbxYl38dPKVhd(RjAxPR%_pGCfZX+az9 zcyA~DkKH~R|4WAae}Vs*8Ge3WY&>THk2(H;_b744(Z`vF;?ttNf^J06ZlQOU>~XQ+Xf#Knil)}S4gzN`ip;Q{L7R0y)^MppA>Fq zk?)`H!jypguXg?(1$_!7s>bQ+bmp7s#i+CU2%bB*KCYAtF-dQC<@ik!KYY9JEBLoc{1l>z%$Un8r~{P_TWTlNt|zY)~Lzf=6D{qeuY?+6ayhn<&6{44OEf?v2vd}jmpS9dA&vfUVjn!( zH!*%LZhvfC5I_9qvc_aTdnzUHdx9Tw2i5rX0efsL{@m{7 z`tkVJL*^g4tHbkWvVIQR32;q*EgXNiWMmn1;Lwkj1@UA5hlU%e{;thP;CDJl+rNqb z4=ES+0Q?`z^Hh9T82^WO|MG(CCk6gi(tf#@vBg8~xyVrHJ;#64LBD@2e1!SM`^Vyb z)PKG+JAvOm>+jjmrD8vrkB9f5upjRX+V_wG_8D|-+Gmi0X+Pi(Yz+Cs8m93V8TcRc zNdBKzPT*HXe-D4}r&&I+{oMYV_*KUi$~iNM-|9r?6ldax-+?|BA9d&1LHj}dT|xV= z#y3_?;P?I}e(dXRKEFf$vCgz_BVmU8y|bu3Q=Ez4l>g-GdpxM+Uu?*K*5~AZ0`hmd z{5|=7HNk+wl{B7CC z6n+QPtiKCKGET@DcG_S365^r%_`{N3{Ct7j@Riheyaz9ocv~p!XjZkxJA(M*^8Bm! zU$yQC`2Vxh^FN9GE9P)|DNY@QbupXS{(=8n!D+wA{Uu9oxM5tFFW|>@+`lF3m983p znb;4WzdF1}__rqI@1=?Ved*_${(sVUVn5?~Tsm8DPQf}C`OXY*Z5O@R5})Xo%6+!b zK3%G=49b6}%)jlKOKs|BN&n-Vlb-y?h@Xl7#{C&7MqMiL))tmO^j~KL^W|R4&tI^g zCLfCYTTSt^fc$YE`220{jsE&Olmq``&8GT0KH&dlA6fJpK-29%{3rioU*1BwmnG}3 zdjr2mNL@#C-~uaKu_z<8I?$Wcfij~3BP}tD)HU{ zj?a_4j4kZ`a!ZE1~hvZqfEX;0Z1e z_%Y4{zbA0iYQf{|=I06EFM^$m{{${`9(5hb2>3xqu6!v}f3be&S@Qq(rX+s5I2!-G z`P9##1NdKho$H-_$P_;w|MH)a`gj!A-)yOX%~Sy?X2OPwE$-;#~xfd9(Yf@clm1pfYa3SY+e;1_Hboa;G# zU%8=72$m z)f3!KL7rE8%$N5##}^2$-ZK7%e2OGKUlf-k^olP}_t&4wWwq~PmVYaU?BdXh%I(JG zIu}IC-~Ej51pXE>p8@msk#C{2Q|djo6DeMe6TNt|7=N~07$Bc zQ2xWk|8%yg|2eg40>6D>dibv%BX%x+68KADKk}Xk@}FqLTXMsNqa+`x*ZC4(BoutC zTiM-z{vIu}zr{0D!zac5yGP@1*pBNso^{Aw&kv`q#oh@bw`OW6lw|m>Epis_<2n5WBmV~8_0e>PvZB|#Q%oazg0ine^@PY zMm*&Io#3~{|3j{;Bp<}L5xgsfLSEOMapD(2`@#6n3(u4MzexH|N5*r|ZhLc(^T*mba@xWgu`+;K|26kiOpSymDzkeyp0shHzX#6vP-@Z87 ze$F@Sr_R9tS^VGw^yycAJv1o)9Ql6nmQCb8cU4q_#cq}CBM!NP>iw(r0ev=T!}7Fm zW`Dw0mAc~=j*o2!`_DsW3%`c_^bt8=9gu1F(BJl-7Kg@v(0|kWpU1{mN#OU=#Glx| zQSbo&KB-^utJ!kl9r0J5#qC#)#NUnaihQm|zzey9pC{j3-903K**~oo?LTb&l9a#G zBiepU`PYzr!p;8A=egp?jQ;0>^&)@6PmaHy^@VzbdQmL=*+K`+{pyn-e#{>`Wi{E) zz9fG8()95EwM)tsJW`C>;)L-){%&{X3wCA64MQt(JnRtihJJAWIlpx&3gSom^%50l ze@ElbcZl3Bi^jjVR@nbw|A+Wp;r>t4msrl$$KiUh^jVH~jCmbbh#x~d=G8+Fpi}So zJlubf_N&P}lK+hC1b#0~{NIQ@J6;&)+dqn(813(x34(tb^9%X^SW)!#9mnU3UTmSj zKe6xitAg_1C-{3_LjHetr38NG^7Q22{}#p*6Mm&Qh5fA1&Z7L~kiXRTHgZGB1&kl* zVLzbYr_R|sVj92Ya=Cc_a&Zgt|Fr)+4*QB|{CfX+eUwPTk2i2WX8qj@`5W^ewh4Zu zw8uMI_UY`-u)>k|CQqZ_5SnL1Xvy2)H51?!C1}^_S$%9UiX+eo)B&fj`Sa&tGMj|NjMzziqCX*uULNfnV?6 zt`FdcJ$v7T>u=AEte5y!#tHw?bOFc5B)#S5M&D=NA$m0YY7eJ?9Eq@a~+EcVsQjBuYj*I^X{->pXYmMROdP{EDIgJHloyhCZVfSm~`U0Uh zZp>^Rw4Z%qKS%bU`nxNM-|m$j{)@4cY^rg|5wrNRyOUS0zJl}@q32-pD6tn&v<_6P+$CseE%g+@U)To0{nSA z9H1^1yF$Dr@t`?!e`(Lsn>2n;>JjGO>g^-r)2pg;PU3RC6!_0s&Kbe}vuCi~dPnec zw-lpHoG9PK3BJH@?3*cm7M5gGB(y;2F%ySA5R|`?`D0&d`Kw9^{LWR;@;C9f6F+0( zFM&Ta`ag%txEA_3`GTvLA%9!qfgknZsJqV$t)Gg?{P{Hl$o}Ui@!P%s9{#c7e_#)g ze_P{u0rKxG@AbeJv~AM3;U7yn8d^GEjiz@?Ye7&^4}!mKW7jwH?xu|`GoP?eWLM~ z+{lg%_}dGf*od(I86x%9JCfsJ|My5eg`LCx`=eiEJXhjAfv={xL$37q&oRDV@B;Zo z`^hAJbuHsZiw3Ik>ul3^9RcN4jxoQg(#wp{2-(;R~HYh%Ze-3Ipa8cKkJ-VMi#S5kLYrix65b6vFk+&MXHKNG}GV)wiLefam2 z*a`e6BCx|9&!l2%ISHWT}sc2Y&27jCkPxLG+ICL*UPs3_-WQc(K3!ddf7$Z_E4N-#XL& zrMZ>W*tZ$K>KBcFZ1=GIf5rRL2I2Z!b0Oy+JC^&Cz<+}9g?)8^ANwHTJ0`$iAoxKC z#y0!U@1Eet`u$Ir(6`KMC-Hm#E&gMo@w-i;@!K`HziQ&QZ{vI*ZE2;QVV*mZ4 z@yDO$3`->6QE!MIo3K13T6MyAshToQ*#8mYZ|$R)U&wh6+Ary^T9T28-+pP}peX$F z2)|t`iQoG#@q5Sq@8GZe%T=NIOOXE-E&l+1=f?j|{_1}T|MBY<&x?|OPFIqD?WFwe z0skF-=YI%4><;vb;~&!d2e!rj=Xn0Ds)s*TRZe`rOv!pW_V)UleSC}~qQCoy`n6E( z+1kS6Hj+%uAa`JYklZ)DadkSU?;FSeIK&V5p1nusI$$0|?9W4#4s+>#kJ4N8TZdE! z_yWByqtV`|?2M2u z2TJ$joVs+K!a(}|m_GOF(ESwFm+-kozjc^^^hZ*93R_9uIz5hb`TOb2%XdWacdx8# z^JE^D{!UW1N`61`3_92Q!m0x#DGHBi#_2r%SGFH6Z9}Jlqc@%F>-PR^KTM{5u}m_oS#GY>yYZe70_*;6y6cVUsuXcAKtUvJ~4mEeevm&mOg$v zPIxICOGB9fb`G3F-{4J@^@{XTXMd>j0BtCb$R#7^vp=MO$!g0+2KDREcqI76bmGUS1 z!}U{o@b&mPlph86j`02CN#01S>A{?F4EO@wR&Q$L_tSG{a(eeQZtwLzhuQR`2>;Tr zYq-4k+LA5P_f}(%)%OGZpF`(5cn$fvP%R+AP?$E5?M*#F=M+}bb$d?Izn-(xv`a4GWi@pBe@n?;zuXF%^HvQHi!QVu}MgjbJ zx6w5UDfy$cF$xL(=y#k#ssnt1zSgP3p;7$ZJDzihH+KCWtiP;;{(h5)e&{$O9A8@^iY>i)@a z8Q;M8@B?~%{YRD6FY^99K6JXDWd+F?^q1D*_WfM+SB?ESu@5KkVINMMV;@eOL;pDM zL;V43S<-$}@n^fv0P7e)7^d5kXJc32dD*Hs}6(fW4i&mI2H z@CSW>Kb(U#!t5BP6{8+h-m)w`te}@ z6YH0q=V$;da0J)6yE|H_17!cGpYfeESD5S%*kij}sQh8!`dGbTGQCb0$U5{Be1U$| zdDVa@|I%zP-{$Dg(5v*|_v2$t$={NEfEnMD$N88{8b4o|yl#G99(YX(zCdRe{WUR4 ze+66lPIm}D=M=RFKR=uoBYZTD8>`#V58p1J^cypk-Jqi%Mv{KDKH^7q^aH-XZc}<4 zUe^Q6tLS;Ben&qntwsFLpywqz*J01sB%ckG|1p$5g~f-F|D2XZ&mJB9KzBzT;0yG) z+Lv{V;;+p}zTN(r`P1|CvsFeyKd{gE%H|~J=IRZyH(h@0_2zykr1{&re#PIT>lE&J zlh56En=2j8q5S>yZ%}#)ohZGw_t@KXPT?);aN4to|JBX?a6hdlQ%bmv zt`5J1?De}$<Ms+h5?kDP;s()3i19r-SD^jPx~Y@O5WIRi#6!1AKwb-TzhdDE_kc zaSrh!u7BIQY5tPq6R2;hAGN3yzG_eMUP1Dv-#WC@=Z|D5`}#aTTz?_uNB&0LKyYXwk_&}GU)mfS7Hr?~ec{XA zr}=5$C+A1S#zotwo}VAAf7}1X{WHAp0}jl?M?4VjG}0Hy4L24i_30enMwN{U+XwPB zDf9+<%GuXMKL4$Fi|>pb$_Q5;5hSCA;gF1%{i9(`%plfjoXdhhqtpnNz zuN&P@;mO)m9{Ed`e(Qkt!KJ)(K>J|PH62nN;0yHLb))Wyvd=MxlRu`z9n1Eq$H9a4 zsoU?^;gyv0?2&#bYDw+!kfgosIW#GMU9WWiD?X6gkL!>0L;XI~J}k^q?t&xzP)zsR zFA#qV>70VMjqH)Gd(Y8t3ho%X|B;HyT6Clz(&cZ=X|Gp`;&06toP+x%+vSMmn!n`u z8T99lsY_+oP3X@aURUV={l!MtRXRX_4yDxr`m-HMPXYRhkEpA3fWACRtHYTWh<~}2 z?x&FIfZjk`w=9n2uVs$zV317ZefnyuXW1(Ge0%jZ+<&pxSV{-o|FmmVQtn#I56#c# z>oK~f!&{_Jhve_jZylOy|3c}#jg}vdoy_O4IHjl1Qu`B1@2;c#D4amo^|`l&(o;xv zfG^NipDdajrN6l7&-se=SDHe9c8xlOvra;PR<$}x2k6hLLgy5qKSgPEfd0JPI`p2X zPC|dNL+dCVpuZTU)dBi*^Xe!aQXSw6wC?ur`$qAn-|y=qChzt2d;BQ-w2nAh=>Y%Y z);wD20RCe1TZaUHlvYsye@>mFl@72^Rg11u0Dm^6)gi&(k(57$R0sG1tulA28_6H> z;~%%q@JWWH?KAm&pr22J?fGNIc+5R?f3UrNNvC&{?fos4*nW}bIOF+hJINQ#~y(EgE6el>&oXB?|kp1fbrK8yeaj^a|bQ?!Vn)nvTIGv<@rE%EWT zEFZ}8UZj7G=S@&I#y{>u`t!p5vC{9;m&zcs?&L$_yz?%i2V{@kM&*FpT<#C)gApW4Ir zY=uxAd;-3Zu4%1rw*~pb{Iru^4)eF>U**%E)q(Y7@@IZe3H8r=!Sz9#`osJk;Pw+m z{6oD1{d3kYt%Ll*zj!Bv{mX)T%EzC|o#LY~`SYrBys1C?7uI*4V26FW7jiuG6TzAv zWy=Ndw=t{1y+Qs~ihr>;hWRVIw|x9zeVNH$OunZBKA=C0XIX+1{2{(T;!_dug>?OQ z@7NmT5A&b9jtTphk_qMG&&!YYFV<}{eTb(1un#@>27lNO-b%%o#M=fvGjr2BLH=?? zfAeW>MDQq{SU&#Tm3*J6Kj_2c&wiTaVM*cO5A6o@6T}w$ZOaMh*8GRMNAb7aXx|IU z{&)Cu7XLl|P(MLyKX&x$Ab$&_eOPR??>YCClRqoEeSkkS_2*5Q>TAHXPxn!dw?sdw z2>3#}u1Al(Hpm~^hm9wO?Q>^2`HST-F4I1-uIwQG3Rr(8e^^Hi+^P60k_)ioPrhy! z>Yv4Af9F?E3iG$-{_^QBR*n6L$sg*I$)CD2nm^|ijxR{Xn8ZVWpjq!XT^iIM?6c-d z>d*&{1rL;uKQD#;QrhRqDfl~u30PKVqQZr_U^Dkp#P9{wQyWSky+p#Ngm zXFe=pAkqFwe=fn_yA_%Z8a!~w)q|~3R%dHSzX5|w1`lj!^(e5K_3t;}hCTz2XL9CE z0|xgQKA5hwvIh1UaMg`;k@TMUp6xZ643`(vVIQW9A z23*&NBHLJ34H`^0UQ54E4E#PR@cZOM(O2JeV@bdMeJ#{($vUrNsP!cnbdX{Esa9 zvnAhD-)9{p`-s_xvVB3$m^TrdPV*ifP0pLJXXMiR(d4`d%gv?r>dAQ$)=ZjbL2>3` z#;myUrcPm%Tn}SRtieBe`)P!9`sYhcR%V=%s|Ed zhu*m@ltrP0MtXwdQkW-Ub))^g&O3NNFDW)bkS`(@oYnJQ{e5h82A2>1>QpEDte*5C z?!(Lvqtdqu%@=@knn;My+HW3;JV?P=L@LLXpqrMPF`-s((MX zqI!SDAqoCs)6(N_ri|CAdsrVR9^cpSj%R&e^UL0;tmb0;bb2&@b0uTg=V3@+ zJFGvn8=llZls{ScLp=CHdxCiIhwrH%-sG=H@IbHUopQ@p#7Wz?qRjDq|as7rqz@K$D$0I%XYk+q2IDUQtAK2eR$^Jsn7s@G? zAK>${U!L>7ui{EM+l9Xu_f!3Q4PKJo9j4%Kn{>0mUy*?q<>I?x-~;?k`#8*>B{vLw zI~)%_+CttkZ^}jiLU9gx969Zr30i;o<2gUx2Efjr~Vji=L3)k{fo(J}l5T_}jNj_?CS!V23EDOnwX(I`QRO_iO%&g}*YH zzoXZ0I0vY6B!?^CYe0(#YVy~1H=#gOd+=fKHxYI#@i}tC`&dstB>cSYK~5r%RQy?z&*IH9o(}Sd^~=AKUficD zCit^u9S-ag)YRXp;6us>f3DcSJv5AW%_U+V@*W9zw~O7N{y`u6e-5X&QGn1q<9y=I zGneW9b(zegLH|>)FN&$Es;<<3Yi_juFiZjaJY3p8Z*sVO-@lCOrDOCzt1J)4qkr6R z568!4e`V;k-j;BDuECEb=b(Lm7)u?6YS^f8iSHw?d5`+n9V)4Xce0;| z3xAmc7<6H6{=QfbiN|*wthwR(x2uQvPrdOB9pK|-qdfs1dcH26X}tk8X^v?4eSEBc z^18aYrj(vs--UeMx^`P@;xE@+-w>-u`Sr<2@aH|o`lD$^{sF4_(+BMH6FQC0$WncX z0sS0vAK}#Vj9;L5eeRIi>g#t=ygvVffarO~U8pH?zRpx7RIcr2sby!6*Ox02g>STC>w(BXwov$M)C{r=RBSse|Y{=BRM_tHSvPKZc?9|`E1XqH%E*UIZ3=F8KHj1 z9_07F-~;8D{Jqh3O{jfv#lLuD-?0m;CG0cyM0)%Iulsno{sFHumE*x*RwJpGhW=_A z@!${7`_2w-XJCim&z2wHd&l9O{qG06_p-du|E%^f^;W0r@kd!3`^=y$vRDVDo|5@ZyEYP@p0pM2l`9Q&lUT$rXSQs?oEgo~PhXuS?ZODHHXp_yuQtSbrs-az4%kj)(q6 zOFY_l@UdU=fqlXbE8Z&l7W=fNT#$VEf&8zoMyvR!eXu9;eHh<;<8i82W0Lywo{6^4 z$8P2hf4ob^082WQ1FN7 zQI+%e>i*fzwtOG@pItJk{;kMLjL*BzM)Rk~=k)>pS_)oA`cHgSsbU#lg`TqILd=K< zA0@wp^#pxj-y`H>p#Y)C7xa~!4qc+=KOXpAZdk~CX+HGRF3PW}4Tk0;x*a*xlymP) z+Bbv3{gf~`4z1UN>GZKPIP{`^h(qrcJUZ85)LGo$ircg%i9$WfFZfqYSMZ-PO?HLhurM>z+nG==$fi57)od zrS$$`RkHqB&!@-V-uaBndpoSZyWbVOy~E?XUo7GHSY_8ov_>4yj}q@K<9zZ3_g|8~ zdnDs=41ORt(CahDMApAcve+-is&ctz{j=7Re&3<>Ta#$b0)-AIQu^rx?m-U6=?4s| zZ+Z=m4mqWiKCpgmc3tYf(|SJCpH4K+sDC?p4Ic%)tOD0GJ&Nwv`RO%tI^03?=XHFX z%F_XdsZZyWpC8cgk9M9O*57$Ak^g)k**?Sww$vrULV7y9xJgcj#cUwX_pa? zoG*VVY==NPLehJuh3&bIkskF7pAO0J~ z{aIc7h4GwTjQy`g9`G-Fw}tu6m5j$(2^=CMhfpZCGDeu_#nX*^&%N~34N zCDHupeJAt*{vJm=ApK>&N}q}x%=zPa0CLX8b5j}nNlR`({ZkTOAn{KQEHeKSg?OR1<$wZsQ>Ur()rpirNbb84{NxHdlz zTapp_vGyPAcM4H}P~;2x$&XIt`u+Jo$_+nq{nL61)<3L|hW(e2zYeZfA4T;yxL*s_ zb0WQ`>mRKL#(B4KWG}0e=Qn&EK5x4}e2(=wxF2jnZ{Tn9_bH+iV|&!^Z9;n&UYtfT!}BKpHPk|p^MzLN7nd;^IG zK|1hvbeG!OqxgG>_=^Yli>JvS-t*bU{@z~4X#UnnJn(|QL%$01p_hZ}qtm_N`1%~3 z_;2d(%Wlz`irlp`uA~Cf8ML<>2K8S;zy>Zr@zBQADA}|{>rOA)JIDgI_Jxb z(DyYlKR16i)sN4T{JBfh<8O_O!(%=>lJ?Tjo(F1@|@5{GCJw^ zu>MX&0YZy~g3ta#O1=)-C-$%Ysw?$hzE1Mzyp|q+!(L%rCVytV1b@4vUV?A%w^Z_h zUW){`-7C!BIVt$F5x=|k@tVJ!hZq;WZ_xB#e@#!mCINX1_<3J{9>LFd&!ub1X;!DN;r_OEpsQ2#Tq zKbCrv`J-;Fe}L-wk(u-dxuu#PiG7YSo|z;0^c%$GBHogC%$rnmXg{gh$$693+*}o- zIPAw{&!c&g6o;cwe&h@NWe=xq5``7j6 zk$+i?r%?L+Ru_Y4op~-NAUVzXbSjW&GH#O&xkV@;N(Y_DgMve;VUE zl7F$pgCLzH5x-w@WvG9R@$2I!()huWB!BMP(fl1>KiofiTl)8A{{{6A@z94oMf4>7 zwgSP`a%niejl>ri{WI93Tvp&0@ozl3_Pd~cVtZ)|PO2hVx1w|k6uv;6~K$p80dYi|tkC-awPj3ocE7PX9? z|CXo6U*=O{hlYJ7^!GgTog)Ij1bPxb3HyW{c$riDl;HdE4v!$}+j3@eyIagWSfV9t(f-QGn1wc6TZp^yw%4`E^KE3jS#SHQUQj^=CZfU$SH! zA~XtGzh&4y)!B>->kyIe!%uO1Y&Acx!hW8V_i64|+|F5Y!>^*(*w-ANFL=j^f5Gzx zEhh*a*>VP2boAL}QR7QTRO1`tN4WkSnvdZ72WtzD_jvi8lnym#^120;-H9fDbW$UV z`P{D5N$IfYGd}mOrSudEhOBHktJoe<#{L%bJAsmm}ji*f$#G zjzE8F5Z6E0;n6Z46`#Z71hBU*V$behuAjvw(UYmaVstd5pq)ZD37z)Jvao*<`y4Qe z+J^vt-m3KYTPE+v&<~Shl*u3L)09Vn+yK5~Cvmx+#GCwWM*%`(LW_mIc~8^O_u01# zf6wiu1aFIy>8JZ{di+fj|LOk4&k0hDs_>flsr?+EBNx6Ge;Ai|OXBBBKF$G755C)t z;(Bb^jK`MrAV_CP#2NR#5&C{+U+JHXpG5}Iv#Q#)h;cdZaegodP`!R7QziGOOSOJw zri^Qw>sQS0(nGIU*W#W+>sBaW9gEYB*11q98_xC59AAQ80lj_mjgLk77oR_pfhBxt zKB}nX{w{w~{SJ;t2k~f3H(x;Y*QNad?WTUnrHZA~J9MtYO5^?@e$7KsKPsI34e;Mi z{OEIaY70N4;;)D34feV9{&SBD`j;i^*uS)XgKTnKc0zyl>S+7aeCwl>iMmLh2QZE+ z(Q2iY-pKVNtIQ~jlI*{^&aA4JzFbdhs=M02G>`>x^q`pf(70J<&wRg{pV}_XnbO8a{p3iU3&V%{BrC=gL1L%${El03IEv;`j+twOKwQDj>?=z z3O|B!V8_tk`h9&u?E}W=e;P~m@3YDY{}NlD9)E>pEGK-|8s&mNydQ&oCgs6)2>$Rr zWTelRjQWY)V!X!W59yHq?WNC83)a7V@_f69{Ac`*DhdAV4a^_jLn8Kl22E2|cpxj(C9pItoHg0{GxGX#HFzZrXT3X1UQ%`)yAZ!htJ z1N9GjwIm+(5Als89{Ug@9?!if3~~TH@r5dO&_0V~{=D8l*sfkxO~07=i>KgE?<=ei z@b@kBB=Y5}N*#A+SndK>6^dN(JPwPwO`fyt6=Z0GtDfqio#t$&RU5ZiWI5q6k^oN$*P-_g!19pr0 z)J6ESKVZI1`*h@f=x@&Er`rehS1Qj(uOCMJv#pS(e%BezpWZ)MAK=fEaen)VaR24C zOqLV;s^#CM)G&|vuttXaDcM^jz06Z6k@VNs<#_0OxWt3ZmmjDdGh+w74f5Al^jGAN z{`S*;tKB$1XLB@v?q{4K_?rVeT+8xBxtFhFKD;#?pC=dA3V-qU84>h!>`+NxiJx!5 zM>C1HCB6&=2!$Ma$oZnZ4gB?g1=Bgd;lf}3&&1zn8LFXte>}D&n!kqa!ul)xT5!eO zP|25Nv79`Khy4`)!0FvPSl`8R*Lsl${77Gk|EhIZfBi$HB-iH@N_9V1hgFaH zv&L~g&^OAl;v&xa$z6% zkogwi`+yN|N&2URKjZ^Fp&aPnmWXBpt_gj=81JVq`;*4!e@^nJK249mm!*8vf0R2{ z{2}7eKDga^{4utH>m~U6a!@$ll8lB{+q`GV?S?eqNQ|LJC5?B@5`9-x60@`g~a~dLylI8Lgj^2Kj`~0NZ*R^ z;J2pF)BgU!bMObd1b-JlU+1i#{_uS3^Ea@nx~LM%%l?A-gx>?zd{6`R#hWT5`QfF=z}j%{aplolrmBH9*nhpio`H6zaMYORrCAtF^R`I zDkc5vz7jvxXlF_!9%K`K2<@Hy)FFC(K-^gWpuZ0gt5sE%3V-nw{ORuo=)>gCNx`2Q z%6!}YT}qk!c@l5(w^HISd6V^L<#T^^jl_c#$&W&zV{ZE*^nOgq`ps4~==uGzY}K(M z>(Bd|>mT$6is`A~FY%q~5o~WLH~Xis-R8)Jonkju8TTjiCH@DoL$6-gZcjZ~{O2@| z2OlWMk{_VYw7j8qu>PTa_r4_iY*0~UlyL=fzlr8ge>XrM;O`RYhdDR7emwq_d=#!X z*>Yi#;6?kV-+}9+y^Lq5%HjUYLeZbPpXHIq$rJzG#4r9a^{#d8g8ZTW)xMPaXUA4k zW!gc~;cSoQuk0)Kq~H(h6V!uTK9`~t>Yw)==Y#l;82^-b=&!F44?ohf zUi%zcJTl0i68~B96(#%)y+o>u-$wJdZ3Slt{wB-3Ka49#aq4U7=OI2@F06;$ia&(i zVt*p|Vd&{G*n#vv3s8ViODNJexxCO{-!Ww-+YkC@FVpz9{YR2NTjYy+2RdPMSbwSd zXRBr03H$$pkD?F5b_-l<9tg+R5!|)j3dbKQ@gUGY&OiI4-^8f(w`HV1XLmI<%whYq zzK_=5F!|05^mi%7EsgaZO)+mp;-SCejCkxTLny&s3&0mxDd?)z(zn&jCMHm4+_2r+g)b+1S#vyGPpO}6Qtxa55NsWD* z{c$`6e`C9c?eo{sY(I8`aQkqB_(MF`;Q2lAK27%ffnM>R)RTOmSG+H@-ewN+pctXh znnGdzI9myCXgR68bylAJU)XW9rXd#vFie z@Mr4p;mz$H54I1`-^F7qDvLha1N(G-N{_#U{tW*9uk_dW z!C!1=di+6uUc-M#fA8}1t*Jj}MSA+X_|e~oM(OWs+W5=9EXkj}D?R=a`V(BRoBu2Q zjrhQEG=J8k;`hXVp6JlJ?w(2htljDHm(X9Me@K7t|2_SUy5;3_qV%`_wk%~|ndDFH zNsqsT{shr zG5(2uwAufRPYn0BP|v2y_@F2K(!(WxtP^#fq59(}b*COy49rt2;^tUVD|Ov#`#;d@ zr~Ar#U+}lIDn0+LtE$eqMxOunvi`sq=sA1C{MnLEtP9tF6twCC=ELd8@wQy(F7qI5 zk%uk#ij4Qr9VNcFX?UDz--PgavE+;VPjA#|U1USS)#w?hW?6w{omma`(l~= zfp1IrNX1`Fu7iH;G%O18S0vwe$T7ZOQLwLk{NXz)rv9+co2fthMs5#G{$jHKp(Xgi zpSy|QYeRpoTnAlw>VT3Uf5pOI@d;u3%=xW+{9#H&uY#3vjivnC*C`O59rUX!E_P!~II|XTKV4pYAq(|A~49{*-*z z3Gy)co4Iq&)F}QQ&eJaxlSj#4|2zD7GVYfrMMHn7__GcEVsan&bjDA*CCFc?yx&|% z&$q#&cz^l$!}ukv0sR-mTT%%0hxhi-2l(?YWxd*xKA}I62kbK@*Kxk%&g@OW=ZAcm zU-11nO87c@nKTwE`=ojm8gDCih{JNEm8=?6x8qc^(q<^EA@p(c1 z6}L~|8`R|gT+HV&)_11bKeI&k`G#C9L405U_xtU3{2mGQ68qnH--Y#Ed_CzX@IL<_ z#w7xFZOeI|q3=}D{BM%=DSf5=?DQQaSQgN~d=CkHgX;Y?gZl3$<8RLhPvbOg{$voBInvpXUBnlFdOR+lXnZ7W@0-Xa6IHVyEn%>6TRk!vMdoY3CLFeB3#h+30TLzxW79Ky1{jy%?U6p3Ipx(~V_8a)_Sz~g!+W*9x z&|dHqT=EMJovVD>`<=qol-{FrS6`!m{paG1DLn;${t;bw=$a0gf8^4=I!x2A;sW1M zn=AQwlvamJt0no@c5*Q190R$7RvCBqK&}5CvVH~YALiXp^RxCQ`=GY0bHW=XP`&;k zOC{HDwtkK6AM+Q1W48FS*nVnQ=zwSaS?mS-wLvc*Q<~UkB#+Z*y~7jD6vmaT(_5%m zm8NP0t;f^*S33Iq&SvVp;q*Se6V(?w_wH!sml5?3`GaOIS$=zz{`LAYeK@jSO7lrB zDxv?gyM^W5V`TXJ0(yU{^?>8>-r@5L$&mClZzZh!8l*GJO+clwCsaQi!I%Kzi;O~9&)?AgzvCqC%@E4Y;%lS_nwv0?nqVpyh(%h}eotqb!9RxUk3~ zsHla4f}*xN?iW`W$B_|tRQ@NG-|yb4a9jCi-uHW+@1K57=jJ4JlAN6E$w@WIf1Pyx zzp~o%#ZsW*{LFc*HXD-ZIZw{%$J6(a7OmKMyBCFDarceF{y4o;8zkM6A5OZL2)#Ic zo%U>o`KH~X;l*RJm4E7Ee7(f9d*=;FmVc>;WjwxRG9ZY%=l+y*?>95)F0;Nb7I%F7 zvdW_OyYM4Uf0Fh68Y_IZylWiuO?$$5uMf$V|2{6-zk#Ox)93W#^8cyGXBcabW?zwX z-yt1M++XW&j;H?{`Ci|DChq!2lKvA1CEY)xKDakERvPviCYh0UE%^OHi9b$nPxC+P zo&C?wmj46feL`)5U(CF)^5CNyi17Yv^1Z>pCF>E2`KCQ}&^Nua<^NuNepgKD zP?P_Z#AmmEUL(2Rva(eKMKa_{O{|%Ye@FdfdD!Pa+X#Q0$3*w>+}Y9yTqNIXsKPMcwD0YI zu*#PIM%SABhgX^WfAXu&e@4H7ZvS=uLq9J9JOAnYP0o}1xOs~C3$Dmh8knCT5Vr>8 z$C;a_G<1_;r!Gr%jf_+TUXb(R+U;B={sNVs8vo!<`BotBO5+YSZGox`^G*AP`*&QM zE&q51NO_)V|N6b4^Pjn&JZ!jW-@Nsr&rINE8IQS*g&!NGz6u;L!1(*(r{Q@iA77W3 z{MOJy`m-oMZ%cg_xM;C)`>#uQfeR!)?eD%N`qKp7mZH_};8povz;zJ5Qo;*dj_QFa zP5zw&<$HmX;Z_B0OvDh%^Y`}Lnrc_Lf+W7$XrD~$X*(gD|znci;sU(!yw0;e`J z>Ct7R&06X2w4U?SigppC^Dkk20p{P6-x`?z@bPw{_pMzzzs|CDN<*y{N%|+fC>a!f zrj`nQfu*i-heAt3RfhSdz4`TZmD%#YLdsj4@IW*E)8|m*?f)7pJz7nG$+`LeD%{RT zos@=JON@U?eru>dG8sOvyKx5}cTyTU$@syI_3wES-kqIk-`iW?|0L~IJbsh<-T&)m zRU0Szuhi|o*7z_!|K<4|w~6dOZ>*!{;5@&J_hhA5BSU)*egwdufb)qdyzc_E>XKvT zt&a7+(Ho~3yo>kCDPQO73qWGRm3K!rTQvKfD<|?*>Vvi>Jm+2cz}ptX6aU8OlIZ@J zkN07@{IUavim0Z&{uZ$!9$J zeYLopO_O#l?(U(dx3O_Z@0i=)SXcEvBpH6y)yeR;#OQ?*{v<0r*9B6C)Kl)dx~hKf zB)#I68FwiDwjp0=dj;(i^3VDI(`7RLI*p|vb+38$^5^@c0V2A;Hssk_|LehZUYr+U zIef_Va;)d_eEQU7D1YE}+oR1(>kQrpo;iFQ_|$C8@XS0ta>V{E#qR+2$8EPH^fPaT z{+ubhr0yM6OI2cB+-;FP|CJbOk>0B~ze_npG^!ZqyZOEn^Zz^YNxXv(wqYGToMal} zLf~`mH~Hs2PciV@kxuV6(_WVXZ(I35(4O`=MX@?P5Hrp+t z58ZkAf`-+qwJf&YXX>tG{d=(tx?tRv+4FxT-X9JS?vfwT4*%1X8^50cd#;uQa2;(wi%urxOo6e>;hYBh`%@MT(*0lYbi>zT+`pMV zR_gz7rbg<2t3AtqRqv;*L%DJNm*r`{lja~@H!e5nNnziu0C?_;shOr$r?unmO{jPnp-47_bNJ5;Sd7skVCwu<+K4k!cUqa56)&5amO^9=5l=BM8Kk($s zsUJelfv230!G00@c?a=MXZwQi`vY%VE)e8H^Rr5#{jX^#f7bu|PM0y#(wgb_9o>ER zEdOiJKCzq`e^u|O^4)lbckqEd&SClU{WJBiWV`qj@^_|Z-nVpH?^*s|MgF}7rXOPTud$qgXZinv{W5i85CvuVudZv_1>WOkdCjI= z;64KR()$Jzp7}3i#Fp*BO?%o^Z5zk)zYz6btBdqw??bw6vge=gCkCL){b`mb(7Ww_ zGoSW;v4aoBqF)R@Fzp@lnciQ&Hd+2TH=FuGJ>EVWd9RI#t zUE06Ps;A#qblYanKi^jjK#=ko?nt)(C3u%GwEDSpy8t}-vJm^x3{QEjjdQmgUpR=j zp@pZsz&mYGF35+YKRfdqUH&CF=S%%iAOAx>xiZ%NJK6Kk_ZI`i!2NHxpduZo{_)y_ zrhHth{o4$@U&HW=`Oo>$gl9X){Qn#J%Dwd>pkkcpzfwFG!0^l;yweux6H)uIqE)*5 zeQW>wgO<|&_sq%cf44LFCr4=O{ck;{a6$0FYfQSG_NISgJbwq?U1RX9|F<^IjMw!% zqC(tmY+e0`K1u(sXNrGpesONEr2jnqeaxTn({}j-_BVZJdb<3#-)hoL`9J&|8KJzj zcP9V)WiNl7e{F*3zdQw9*VI@42~$2mtIeMn`XS2SfydZY2G4eja$61W;1REv$Fsl`G1CaG3&X54=T%({32hDOC|Bl|0;`*Rpp=InXc37G@p~L{cBf4_J41R zz5lrXp5^~{^k>Wu;~pj3Ve-8K z^3U>N`47Q(mg5DMKlR2F&vL$ydgsuNusmC=H|ckQ@4<*I+l8C)A2|2L8{_q#=YQr& z{@s#T{qMAA`QL>0NmV5K|HrNO7b(x{EWCsC9r;93{#jmcAiQg}f5&e~hG#j0T-qWX z#{cFyHTKf^pLU1&p5xz*|C0Tk6la&xr{rhPKi^La5W@$*8ajTLWd8XsSBUqi$p5Vf zuQr%|gXMo*6O3nfn0|!my&vz3QNA3+Yrof3)%?ev|3ClqoPTDU|3A=H#(#^etNR}? z>2f<~&;R{B%}9XxZ?VSYpZyk+r~3Ss9G^?=icHuyiRZXt!4wlO>2Uu4U||x^5}MG= z&h~2U*UG&AaX|L`^Zkzibe~3ksHd0l-^g>Z`HGBT~K1hIw z=HtE|+ik}G803QYc$oi=6HR`?EoNNo;DZ)d8@yU&<`wtwZobKa?Hnj9h(@Xc7H?*Mh!{cX;Q=b!I4 z%#ibc-qe`>|86G#Y;S1mb8%Y#aT(}U^?t*{ElvBxbhDnHN4*3%7nln=i(f|$tosbq zi|qC2s+0itL)@OCCt2K8=|u)vRfr$t!(IK?RK)XNg8Kiu)}KGUR!0BxLD|b+=U`7GXP@<}}Na|-nE63=oghdy26Szivtc*#A{^e;`BVavAV;5l%4<5Na|1@u-C&wO5O;hCQsEIi9?&h_Az)nA@T z{sPZ>!T4#D4&(p6+rX&(pETFd<@jglaiU-5(~N#!_mJ%Qr+(i65iFiz%GvJ!M%OU) z$p6iZi*#W>Dcb!igc1oYREKEkt{2SbmoySHfmz+mP1Db_9EMx^V_9y~5uW$JTo8Ju z2<_2W(_fYV{}|*C%!!P2|ov1YzCd#qaQ#Q2 zezN}A<5t!S<|n+MA|l`zGV0~EhL0TQ?+3g>`a|%Sazt<1#MAz9Tk}YNRw2Hx#Qi^g z{xdZ@(~G#hO!>1%psmk^){;LL5&ZhLNndcK3D0;hWWU(Uj87eS@EoN+M;fkZrK&tf zDd$8T0iL7O=S00#^34|6r@^^UPjEa(sn3Lla!%AXr9iOW+*te9C*$KE2m0-ttEA5p z{e-(Ng8Ua|m;YU&XIh&e`mfYg&msTN>j|{tJ_p->mUCJUp*7CihJ7?2_XsJsow#0v z@P&wg@X=ye;kr8XX`|NQ{L?+Kki}K%Rg^_UH)<|7j$=4 zH}%EoY|f1Xt?qdibefv=j2w8(l_oZRerVe+;pL+>(l~ujBJO|2wMqB)mnYp1^iR4O zKW)ZK`=!^vF3WcQPoIC&Ce_&FTc2~&XKl#0qc)g$+?NL_4TB`SPG@S+Af@4`gXDXC zKKyh!$S-gT!aL%pVT0%m)Zv3Br;47|Q`JBTuif6FK}v&q&A7wdQ*;`MP6g)1xNU@H?&^PmwFPP01fj^d(;gpug{kMC108^oSV&fs?8xf z|8>*(m!~PB^Q-Q#21>(P;g3G=>C0~oa->-WU24i13ULd3ag2n2QQrR=(IA2&wELbK zDmY)l3h48p@$-!b%DFSm4;tPN^MtmBdZVP?OMV^sRzt4jU%UO05}&}-gN5E4k;_s^ zp8yT>P5X+%3(v`xe|`QeHQM|&cW&LO>TrI_`!DL z#^)b8O4t7o`^T%X|GlDx$Xnl9>haNN|Bf{EfFmN>djDJNSDFU8m#siOf5VJ(7_WVv zf%RzL7fpD+S0Z8)8M|N12cGYzvHxQ}E|Y_E?)@TPdks*j>I2kXB2QW#RLud(sUe5a zVOZ|8kFDcnJ^x?%hWQ|T$>iht)yewL_wh7uwQ-tCcsY-3T)TGhzK?T%J*DBm6D57I zeaY(%GxD7hKMlVM1Np7CFAtLLRj3c@L752&OcQ?i|5yJKjrUjBKX*fkL8h?-bQI)c?37LQ5ues z1jN(Z|7xjguS$8{+$Ms-;*R_0i(qKCU(rTs(EQis%P@~v?ZwrS{5Zd(%*a3HoA!)L zgMG5)|ALQA{#CX4(WiQyJKp|Z^KX+L)$J&y;W@{&$4t)ylZ@N1JWB2-9Hp+EXWXfS zk5U?@=HR~aQ{onIE;00+Uyf87THFl!9fZEXZHJ@1Z*i3J1nSo|Zs%_KR^V;K?+g;R zz$b4azPUnQfQI>|{npger)SImsn3`%g2K7cj|R<>?f+-znD(FfUH_f%JIIvBtbR%V zX7ar*ukfhG5qxlr^bgWLr;cwNfo}gvOWV935J-3p>H80EW911nJk^BvdW&0N0NkYU ziZAg=f8-q7ID)G3KmEB=W@XF&V&p&dw(0*akp?SU{}q7-v15{m;2cQy#MVS(L~;#Z4%uV3J#G*U z3mo>hEWCEtl^K7C-Nph z!57qe^otG{=p+A-#VXlRkif^m-RjPxr@?ps}3*yfAFKY1u8$3^oiT~p-Tksl^ZwP zr~DsH`6&5T!%GX3={-QkGx~e?JGtL35R@AF{C=~9_vdBW+oc1Izq>=i3wVzCUditW z#HkJIJ?(k5C$`O&{}&$O!R`qhD*dbkLV{5_?NW*@%s4Ct;zDd@JK_C`D1y8eWg4FMxcKP4(KfR<2qOQ{b%#&oZCOt;5fhdxGJEkqWKz$CxeswM^xt^}pPK{fzMD zNQ=w2ZAWd(PEp0Y}Q)rI0OxJzXU=gNGN`D6d*iN8Cm zMY{iUE|UANg1b_}`x`_biMV|M8kRfl75>Dm^Z#d`H#rRZ1ktB@oi{%I`{Ni{AC~g; z-tQ2>N3|9Ckvp`)s<{3I=Dz?xXutncjkDtV-L~WWV?ihrikKbwaZ|sW>Qxb8D9P0C#`Q!8;pbqTm3m|Ifu~iBA4RZde>gLtA2c89e@C`r z4o$#bI*(e{EIzUG01_|J3`+d@}#kYg@>S!)E?zf7jvWsqykJK>p8b z$rL01r~J?6pXs*CpL}tU-gNonJ{j}L{4<{g2+#bJk43=KD#Z^E_AvvdFO27Z688T; zZy^hMF;me0Kg&PQG|KwMow7n>33u{n)3q8pS>>3{OxV&QFB56h7)BD z(@^#q?iQUP0!6^H{Oipg(lMU@0R8`gO{%Hzli!=XEU2OKzxGwI1&?~@GuQ>DH9QqR2Pcnb|Lhk~{8!i)6h0X6s_l2B? zBK@#GL%+aQ@Td3HGCx>QQ(cYmhId+a{z$OMkUzE@Fd6CnOX%TeeOY-4z|&TKYCwD8}i4#4`6(i`UZ4DockajR&rl`T(W=gaNmykazQA3&+wDy1d4$l zxh#n<0e;Fl;MbXU#sj`8i+m|UfR%j)Pu2X%!~OiN;Lq0MWPWvq%(_Na_ZH-fe4t!A@0)xP?;?C(-mieXkw06(Pu4H;XS;>>K&L9pg$L6y zU`3D7nm^VJ1icYqNp}9cB;m9nf5u;h@sT)e|SHa{Gt3X{Y;E4Ke_O*<-q~omIv~|mIs!zEr;ZfEr+Z(OqXqY zK+yiU|MSb^?ayZL=Z8L0zb0ntmpXgT_+#toX8hDgK)#VbHs2h4VCy>|AE>{;#r;G!F$G^s`NYjzrr8N9qkU^ zE>679S_%1it(uH~$};?MhwK@Df+NkiCB*!O1$52>rhV`lneki>Jm&M9Q`3qFL%EuP z`wt=Tc?j>mVCXo5O?U_RJm_!mfoFYu1m_Ff#wI-F5TEU46$8WXn^bEuSIf_Kv_I4j z@$@!ne=e<_J|E$ovuFI7&3he~&oTi%=-c({J}bO~4?f~K3$)wJ*W=7D@P!Efl@;Cv ze(*?E=Acw7!4Bz*!C9d%@oi0E%Gqu!z2s6aa0ElGR; z{C3ho_=Ujtv%)V0{<)u$bXEgjVucTZPb4npAir6D!#`;Mt(G76HbbBH7q09n{d;+) zeyQPm#-9@)&(2|{pJLQEvt2@d8UMu-OuU>=QLghIO6HgKYcuB2_WX213gK@t>md6h z;x4%F%yuuclf#rHZKjKMmtT7ZB0q;wzaRN?++b;+`(*a_oDqgUY*%S73*>l;{N*E> z^t;>Nn)x7OKT{%%@7FZFG3lPvUgC?L&zL6@0qqWCh@s)SaY=vsJrBMY;K;s?hH?oX zkMB#p-y{2DDX}$FWjqXNX#ac4-|8^b1mmB$Ufj`#5 z7Xxpo?f$Xlt8=+4fKG-q+M1 zZ-29Ys^z4f?2|KJJU^LQDd!^v3dbkqndc|n)oqjpo}YA9wNVL0-58pKXKHFO#>(RD6lzg5ncgjPVg{M4BI0yYE>f^D9cyT?ngTNoh z1XW>EP96B)^}|JrHGfL(FzMNh_0?AQNjtZ`W|~TP!JhGldJ|KxC&xc_JtBV|2Y;xS zARjTFaRBoBhv9Qq;HOt6`EVfc<9a3e&<*&fE=h(z2>7ZjwmVEm*E61v)(<`KrwHv& z@!QgG#Q2lC@W0~^-<2ZY$e#u%ck+kjXY;2AGGz0oC-63Z4h7!kPp_&N13dZTzASrD6$i%olS2Jkb&|Bt3p1UeGkVYXvl;80>~|2IYP`^-lX_{{&foEr$rt%U zxwiGYuzuP4T_{%<;GQ(wG0MSP*8Kgi)>qj+GabtgI&DatKjoO8R{u!G&vIxjt^Z|A zcK%TR%W5!UDev=I`fsQg$i2q2Cpidj?{_%B@524x@JciPV!itV<1q!jIOIcG{{!@* zx}ft8$3J^jL>RX7@ZQZT0fu~f^3fLW$N5u<{n26ie0W$_HNd{3SC*YW`rN!Wx^@x@F~6*l8x z`L(|5`YCb#aDLG;koxsxrhfTjv-7808xw~7c@py`_Yor}Oh)ck$$CWoEWHi&?ol)D z-4`D`^GFi!0ROxdet+QKu)>qiTOTp;`pV1)Sx@oVZdMsE9_$~sv^+J=pEA7v`tb~D zpRcK%)~^$c%g!I_*CBr>4^DHFUnYS28vY8yw_JE^fqqH0SIn1x5X$`(lP}82?c}p{ zPrDBEu{g8MxPtOC^J&8$wbH~}!UR=e=ZRQov(;E?&;uK`$N5tZ{*2gP)}ODerJlIU zj4Q(N+4=KCr=~U_&>w=(DMx6SpWYCy#J(;AIigZ=%-S^7lTen{-E8XoSd{4 zd;^~K2cPX`ksdvMytC0ydVS38XXtQ!tl&f4Jl9c0vrRdwOS1E)sB2Pw)}kF&n5Q$I z^%gz{9vdxuF7U5dc=B@{`U}!`5dI{ryE;czM3{WwsW*V_Gx-ef-K=^RX7sX(xAzwP zE_wHudO`mDajWPz`e^U8ejn#j!yk?qY3p9ZheAuk zE56Xz_ua-yd;*Q8n)Ep1#Vs&Z&co~YeDTvzl_`KnKJ4IuEs=gqhUfV3U$@En^Cvaa z^5b2Wy?$xFX|vi`syg-~ys<`3fL8YXAmSgw{!4K1{0PNzJNOMF&+Ly_@3!8J{s{AN zjtAbv`ar6$NvDGd?m5`B8^QXpjU|ep?p|uNIO|R zw6{MpXi>KM)$ug65Dy2@w_1-l;U)?@NY@V1Lkeo|pIpHVb|2pOUm{sLGVU!-ZWs{h>$V{rhUHZ`^Q=%)gq| zR0RXkKTggrKLwu}LX@9bYa##E{&ETGMev&$7m?40@LU#2|5#m9= z5co>y{Ru&*2>46hPS!_VOn+tqcus;n>L02+&L0K+M84$Pd$ev^KT&E*cK%R55&2V< zexfN?Af5YFL@~RFziF*x`@npyM!wiDGhg=nt^{;8gKrM*6PE%1;WtVCnAqW&#d3h7 zz2TCU+cbaNz|i6S%_%a_3>#k}>$e*x(vgWd=$zd)-N7M|^2p@k>k+Ht=F z{3PExSa=5!{08}{tK~>n4U)uLpTa+8GUzMm|cit)Yx4x;a3jSr}!M!>= ze+sTN5s^Qgt@JY)2U>XY=a(sve@m`%-!b^q`(~a({-nplt&{VS&fv2Pd?6wpWZ_*V zs0urU0cs`eh7ac?^kXlDepvr1>5p2}QPs=M{KC5?JAd@Mf!dHiCx8#B)ejoKid3T!dT(WG3c3a(M#!*X=-h%nyC-AF*PxA-;dkFjj=&NEozX5or%eGl= zv~O9k|Bh_^`|4q)h4Fisc0|{sda?K8***lTmi=>8dcd63c}hdNy^!C5 z0NV@yak=j)!1h83Z4I4ANdGK)!j$-F`2KW}Z*eoe?Yf@J`<--G+nG$ye zFSIWj^v~hh__H1SaeDqaf5H`#H-SCnkGoRt!wQf;q5O_ui^+emTzI2lip($MJyu6( zYao9d@zd~si$8N$bS=%spZwuQe!{=tkN>2Ux4@qAM?EFwFF^kI@>>Jt$9qEVCkv22 zDfz8|{7H$dY52dzA3rs@PB#9OTwwU)9s1|;<2^0;5!h4yq$I2c^2d8dz84^W+%+O! z0_0C9zcr9Qq2{H){}z8rQPGNEuX(y+N4)MNY zT6>l3C4ydmtoL%g6lhh#bzrPZvmYM{d%?Tg#LE!Ym@-b{R_8R zMTGHyZ!3C!;^$^cpcjbk6oRF#GW??5yi4~Nz!5-|0g?xr6ki?{{Jyu@Lz5{YK2!i-AwyZ#&w^H~Eyl-*=fA7kCK27X3W$MU?_? zTTCbI{6S*|WUF6YPB&ks_MRL4(C<9fkFEbK)&d~&O_qb!TgczqZnGij_V!7-sn^ii zoTD_%US|CLk8_j;>N!lkm!mY)m-sYY^@XHd;8d*VXq+}nM4+|pZpl#^hF@#a=WG@F z0=M0rjDPrr#^3!)!VA!p;s?uN?>67oiPtX==X>8DEONO{`coM1rtIS%{XUq!AGjLf z?C~nUUybwOtaqBd+HhUb>lQ?AC;G3{msl_LcbM@{0r17vyJ0Ty+~4OrqeZ}f^CHGe zkUtN2`}`TuyXjB)xYlR?%qBmx2b(X#O~QCF`utCQ(V)P5aec!(P|oWJ*ynk!kngoV zyP%t##}P=ce{^Z1lt4Jn_@~5A1NEml2g!LJfp4EkmN(ZI{Q}XSCQ$Zf(m%c4*j?xe zaJ?~gfVc&&mgSmwJ9L&z1GT)-nB1!L{mOhGe%$Bhk#YIq`eCc5g`ifF2NT?E5NG~n;%e&v^jul&B}OtiPlOuLW+j|I;fynnC3JHYqgKG%Mmg_(1d* zkOvpxklAIa~R z??}e?{>Ef_e%ViS8^z9pg3Y_tuR(Lye3p$rXDu{e@O=Qi&RjoszE00Cf{mH{>hja; z@63NY5wN(v(a|!T@?zuvAH*I1KDB>R-gW&TEp1;}o^*@q^aQ^`TbZ9dEYsBq6R6}`ph&~~K2BFN4 zV(-mwdOPWU5&Eu}-Ug#2zI!wI>nz{L-N#w(KDWvG)Z9$?_cXoO_g|eN^3z9{CTY#VakFf+t@El4`9k}xzi+rZ8-EtAGvQOM zg6N0Ve^g&(*5{Ab!$*lfIG|GmcS%1Vug?qfjKAvINoi;%8{#_sOw)l!oAh~0_fr}U zg*$k1Kc!(W39scNSS)S#9v=l$k@MY`O)#yRK*{sYcr)`A=2abZKgEn{#nn8CDtVVqN=HFI&)BHQInT&6x^MxT_Xs>Pj?U~v5^C9@- zw*Bw;lR8QAFF^jd*Edrd$e*xZGo|5wia+itLSJBy`E#=HM}UTWq5bZmU!IhWKi^V* z{!9M&H;KFmkU#1VNs9pa<4+fVf&VG~I5R|k1oo6a?#;qa0h;ajk%HavmdAF+=NFry zzv{cMr0r>+qbmQ7`Q6>~qA$o-+Lfrfm7wp5kCXwwi+U9>@0bSs@5@a3Id3foemnBz-DcKD76R|XCf#}mynRTV zKLxno{bPZ&Kj%uNg>ml5&Yvqgn=q9Kcm4e)Jh1_r0(>W|d-zQ%A`Ina68veO)qYO2zYMfWfj=i6EaSPDehF{Rp7AFa_uRva zjQo@C0HmMzJb2jp7ARLUE%|W~-Y)lJfVcHjkU!gRg8V?PN)X=GM^Os=YS>F*zj4p| ziTedU*2liBF5}nrHPqyL4Sj!ZcK+z~F>NS6|3-QFi_Eym_)6bA9&~_b`fs_>)Qb@N zdgb`Qeh;?-_Css*fahNP9eY6{r6P4!IN*~&nK&rc=D$dbQnGl34XLeQr;ZkkL;Ahv-~~W6DJ+= zvkZ8i|0F+YgRJ`Sq~X!|jS`DL*G`cAou^{=-{15%_pGiL_!;?Q#foDHR{gIw>;B*fo*M_A`K^cdsCjRW>2Htriuaz1K;OPk*AMu7 z>)vHC@WY-md?SAb0AFC;$CT+@WJ+N(zWn|xZ;SWuh2YPXt>ygchq9;y`00ZF2H@vSGx0gk z1rdhncfcQ6E{e?St4D8%^QQp!zgEh7F7EP7{qi2n&L6$MtPSapU4wkRo*X~h;|=oR zcWJb z*S+4z3G+MmaI_B?_cHw)KZnYcyNd{Nrkiqc=Nq{y20n%Hvp>V6Ck1@ z!S-Nxyzb@a;`}K9f4l)AKY!Fnzds&6lwE%K{y6zF&$>^9Xw(YeecXE@AKt)yuGAZb zZ{)+rxc}w8Y4C+0^b+oo`OrV$0>8z=mjK_q!0?}PTL%36U520R*CqhZcv$}B<4>EZ z`IC?H+q_@-#WT|WY|6aPo_cuC__Kufk5KN2R`L9aU$Y`Y<-+4t-23Bw+or(V@38L+ z{6^FZ_FoS0W3Nc^VSnI11bv3j2j0Ht%NA{dT~YBYbGJOQrDlV0Yhk)9iTt+JO4?#>>+FOv}9Q?kw6f{#5n8`{UKn z&RFd*_4IO|mi*bt`9At<^5M1Dll)|PHv-?--WDQ%&m&&qi-7-Pf0G{KOMstd*+!opCx}j+jP*bV=ZSLQaRl)0FGe0*;44wSF8EmtynVl$ z`D*#B;T!epP!9IOd*NZ7iipA_(Ai9RgC0B|c$N>Gs`sW-Cq??}@IDOZr>T#HKNWS< zd9Rpwy(NY}?9phSH$>}?lD!=etd04ULcSPJO$$%{luE_t9)q@*$-aHuJ@==idq25{ z6ZbEc@8kQDtE}&Tmu@B=ev%d68Y?{IF%Jnp=f3x%_k%agHGH6ciALYZ{9=1eHQ*7` z5Bf{9%g=x#45unVubA@C&-6Rw58ss!p*Ms4IsIxAua9@nd86TnHw~WQ>ygk~$?$TF zAu<(M$8a{9exGtMi|6yvkLM$N=|7Y7I|E+?+lAff!f(gM>sLPR7rge1tpCU+*96cB z9?Q-jzOPRHYz3d)Gm`W7y=t2J?o2TCi2O;7LOX!@7xOjz8!~PxJj0)iI!(KQrzki%Rd3b;N&c(8SQKObB`^cm} zT$Y_bWfzM8iy?nDqP)T`rk_GI>heoW`h)R?Kjg#xZIb+^S%Jf z`(fPIAl_rdrzYvM{n;8IJtIs%TaNH0mOb{!mW$&22_QcQl}NtNs;54<#ni9V^6dQi zplz~#+3hEjS#WbQzvRzk)FYN7L}-8^SxS`oj;Cl0L4^-;xTA{)ITbK zF;-9L&u98K!1rgAqmS_<>9l7%hIW24!l&==0G|SW0p!g?yjy|)33A1F%aQ+cxE@v8 zq_YC}9DGN6bfn=#rG2~F#Upa^+2V;hns!H9NAywZ*6yz zg%xdkGX~0gYy;KRa-Kn-kMXV(x4_TRoV)T~pMST|5;#gnB>usv10&dYh@lq@7PmlY zE8`A_4^$csJk7Y>Q3K`v_&~Ky8k#7+vxUBfYmD1DP0}lHvACo7SBsy(*+f z(BF3~dh&g|U+*XUWLRyFmqAC|Uq3S%Kkqk9=*8Whxa0BtDDlVNSKKrvNl!v&HRK!Z z2d`h;E*t+=b~XG<9XCIsqu*C+pfc|Zb~-S5p2`0#nZJR@8voQ)j?z$ie$s!p^D_m; zKXs~v7YMc(cR1Ej8t#+$HQ!uegoa6@4Sn};aSI&xo8&)sKIeRiKhEFNw14b8=MgUA z>n-sKbd>%~)AyP=N<&qq1Rk_Ue{jmS`27VJ>r2yG?42M{`GjfT^jK3H+JAL_A;kMR zEHB<)aL1eRg@{#Tcz=Q6^ML35g;X;WzXLq)FZeGAW5pB#&-)9c;{u<)zku`<0lyyY zD8m;6UzIft9zN_NKJGXx&c8D7Z~F^L{^dUPpYf0L4V!=A|ML4@eD{lTlI9=u&X*zo zJ?I^v?T5#z>pJ9X5>BQ&bJ z(`DG0(dUmE*{y%sgi&Kgj~Cp*nP7uPj2kudqEVMeVGnUG9$I#`P#!gU*;hkd&t>CMvfa=R@$xq#0g~+C-fP0(FpN5)H!eB=;0TQ z7}u@esL>Zj#CtgxjTt#oW5$e>5QR<`2I(CI72IJCiJdSyL#um%bN`J0@3=7&%bY3X7i`umqJP|b^@@ho zsohR1E#jjFy_W=IKb%u@$JlnOId?yU}zajjx+D0zO4;T33-bXr7&c^^>ZG95o8+cmeC+!st z9?Yu0XYp6&3#Z(SPxSas56PJCJA{DlkHWWPd?oM(#$Otz&2)_S!gs}A;CT7a_?Z7Y zBw=xP8OCeDi!y!_m?ZA-z07&mS~Bg5hxf%l_&DQVcv{lkhU39Xp(ij6^hx7b3D4i! z{(#}1k?;cLR(SGn1AZ)pJyD&OxZhQR^F1?W$@<`M)+XuO*JhVLo)6m!dR4t2(~IX? ztbTRb4pZLjNAf{u^L|Ed*v?bVHsc%^@x=&l@1Kuw zz|*S04N@XvqlzvJKAsMo&rZs11niTzt1(q;35e6`Dg ze6`Dge6`EL1AV(3$X9zms2t&G<=_YHwO5^#_5Nje5duDJ%I&e{)usM6NY~$wgte)8 zaz6gLCJ~Gfg8F_%IJHRxw@QPr?>hz4nnbWt!fSs={5ANpJfgo>Gi0J7aD#-`{{Hpi zC$KYD{N=t*c&*SAI6*o-UzE%{H^}z_W&7&!u;|;mTHFHbkCpg()ReJ!lL($zF5!FD zRNj;(5wziUqefY&pouJ3T~A22`oNc@_V1$?~t@;I7l<7m)y^n-x_EF{2*WR zK6`9KT>gHB{8i+M{K@+?X|q1N{PFzaRs^i7{@UmEggue5&+X*{Z_BF-y!|dz5%827 z_ggdWE&<+_V-NV^k4(G4cAyOS;Kd|<8t}Br+2I56=!$lyY5uLg)qKbC%cb)Ei1+5+ z>Gwz67qat@=hMhP>Ng8ja{cYPPmnHa-TQ@&Nqi2{wd(RDp8PJi=&-)ew(t(jnNO2`})Ut`|60 zNc;j^FYt#8Jpq~m{Gi=tN9XhP{>swBO@Fr?`j_8aCGCYQV(fta)^Nj~$=^(jOSxXg zc+>j?7#FhqsGo@IcO2j6zHH=x>)PB`xc*v$_c6}nzQS6ZS9UR;qrB#BG2w})yzT?~ zA?kyJgl@-vM)2O;c8KxX=im&{Wen{M(C;#F9KgP>@|337B=fUHT#)jYI zlLLGY@F@hJ$iI3`FfN2%aPsfQD$dRAa{$6y=jNV1!^jusB_84(Tsw&$3Op^IpW`{P z7oKi)c3l1(oDUm4L-zk-`bYdt+4;xwVQKk$1oh6EzfA_-9{*i^p2?p*{`(&7zQ3Q5 z<9uY`s^1O$pwi5X3V7;{mW=#Ll7^kN4On&pF8paLd%LTHy z`>gjg|B5S2x;&f@A2mbvzcyvs&G41%{GNxhER_?GOCP!%TSM$#2%ja92eXvMa)~{<`0raY8rXzd*cUbrb#| z;At`4v@2?E()w9@(x2yp^!<3hZC%Cua-0;5GW(ql_VaV|imT~1T%UvafARjjzeM!e z3RHD}-d!&Gb_HlyE|kA>yB=^;y#7-D^!@O#UETEgA-B@VpA6e0LtFE$wyLE{fWP)G z$lohw-U77pXBzqTLnD_gzx%B7E)G8Uv-{^>QS$z|FZa>o_s>JQkN#)($vwHF{%7~c zgFm@HUX1iH{g>>wb7Gu-l)o#FmiDiIJ+*D7X;1yvv)A8k?M)xO6?88fhxQNq&OoaY zjL%aC89J<|hc8C>TBg3RKHdd790#%7=UipN6VLXjxIfAbc1^I1jM-`*t$ki%`6^AX`2+4;xw5nB<#6zmr; ze#ZOr++@CU;88L!iD$hy3j5pS6Zzd5eDyXPemkJU@g>9O1D^x>!I$Pd3;BI4)>T8$ zA-~h-7aSAb1sz(I_z}W>sbAN=arr9+|L%WY&i~z0Cw;y|y|rij<2kLc!+b^=*&`@V z`KG-l|0dy_M_AY3$)|qcAJ3OKpf(8j@XTbtT)wZ7C+{@g3Z(S z_k$(Pm4<-wRZAKRxxJgcT@VBK_Y=S+9AZc?7(Vu9h|zeY4Hg!IHlCeAAQkX?Gy$(~$by zxE)E01{(5>_V$Y9o3runIPfp^7yNT`B|ieZ-|y6w_ynrrpVL761=9R$CcM)C{<)on zom66h`#{&r=|-% z0rJneQTQ)VmHhc*CI14Ne@e?=nS>W0|2#>XhN}1%O4>A#e@fC40T{@3f%ew@zTF&e z{~W9zw7o{Azb|oDN#`U?9{VQ#vmiG1o|U&gI(@GQTvJeS+Z z;B!IeQVX94d@Zg={lm0>4)AYdUnw=)v}gIiukD?wr|Q;*>dvN_a}mxR4b`rO8UNt6 zhAQ<^#+|yep?W#?y+5m=Dg#{)_L9@fkB{$Ky+(G(yz99J8%s0pvo-g3Mr3b?Ed;#%)1D^Zi#LKWXGU@&C zBTRV|1HX~u2;3Vf0iOAwefj84?X%V2H;gzacX$wedA0n{jp_gGDCMTli=>XL9|83V zxu?_@{TcODAorqu?SF#!3k(xc4z;_lxCQtgY$)GrI7ExO_=n=BVYVJt#`H^7rJpF! zaS2R(Jb9j_V3fok(^q8c8ybW3_(k=VhPg{k`W#8ChE9JNIrL8ye}Ss>4Mog}{Ucv# zSG(`7tombeU%^Kw2GI|_KcZ!c^0ZU(AMf7|lk~>*PgQS}bnBo=>uE%|+}6Q}>M72ll_U)=w-W0UT3SqO`#=Uv%viH8SwcC*M= z+Ck%U8)TE;_a%SYc=wokXZXAO{*(8a?AHiz|H=Ja_M-&2|Kxok{sP>83MH%t?mszS z%KnZ3_n!j!Rs;8+l!Vp5{U;@~G;seZwMF)u1i1g?%5M$ae{$axw?I2-2lf6_@V?L& zNbf%htw4bLPwFe7ui-kw&(!lmUx52jzNA${Rfg?6`TJ#2+hXaTS};84haVp%>6uYi zaot(#$IO)xCgu0M8jzBJb@sNz2-smV~BJFxv~AzA>T`T zrS-|}-8h2Aw-~omqp_SjZ>$!`_u8Ln((*|DXxwAsPd{yMTPo2AKfL{gp1?~IKJI^2 z?IgW#EdQsh`0^$pJ?$ht0$b{seqXhbgPa1?kLTq`d;&YZl=05n(*8@_8rn*Jbo@>& z`Cj0B$-j079U3bQRT=V?cAu`3pU=kM#+|E0B%IYjWb5~9Bui=e<$KEE6_Or-B}a*; zoM-h%G>+iKV&e|a6Mum(W+Hthl0Jchh8cHwvG{AaLijJ`;S84i2pkUo;2a4r!2L6S zoX{8ePUywYvvR-7yFQw|NOB+Pe8A)>GyZs zGWlL$lcY!UQ=Kh@1U_pZ>pjAMZ>W4PP?af#2kp;K%pD#dzq**eA9jG8f0~n%p1+5f z7wc|b8`^sPqlU`p7cSs>1MY8_&~pCrb~7*Ly$)Sg+I)rkFvL3%R;lkSd;#!uzT)TFiajlUby5stC zHLfcC)(r2qGv5b8_fr~r?37H1{LHbN+kNdZ|Q|QI|n=2)J+&$g;{=R-m zdT&Ym@$l}aN&ma;?*~Zu7=IR8{)b9>bozo4(f=v%nb6m6_w-Im!(EcUNPp)!;xEv# zx2$K%c-$M&DFUIM)sU~W2hY54XEy#G+t~2eyEBOB=yz6frBz_PKI=uPU+B-Hbbg+6 zUndh_ji(uzSY3nR-ugRw8@8k_Qzjd9Ov(LydU&P zHDTE3>gw^)cShlZe`Mz`&u5Xp`Mjsr!_3#CkL90tq**5puQhnqp9c3DynCI&JNRJx zhbI5Lw@?UtkM9lM$2rYn;Q2nR4?3m5x8=EyGE;s&@O{2BbixXhH~3M*x|i($Kb3NT z{g(pZK`w3a{1)viTQ@0<^LI1&>&p8C-niOn{;GfO8Gp}4I(W~Y5#NgQt1ilk{4E8) z)F-AKU8H*=@a_i&Uj)31^79rLxh@9Y=8Fe>KKSeRH~n-O@ZEuTde4rMI0^V1oQq@q z@PR+Ho{uOFQ8Ct^(V}G8wnV z=P`U&f&OcyAJF4ky7{gG-TkkYd8)k2N;lt8pquX|(9L%f=ti>A7V||!%l2J{G?e#w z{WBhnP&|LweVd%$TvR=+e<}P|cKN0LCAJTnpdZP_IF#|!`pxi{dNx=-d-J>r_(-|V zweT{1i%b*HVR>*J^nJujyi9i^boDciMJD)M(L(pe^y!SAK2fhFizY0B2R+#7Kb z{xY;1JQp$z`003;i1-TNZ7TqR_H#$Slo&s31%C@goE@3;KMnm={=c*H_vvRqu$r;A z--Y(%dDA|^S2e*7{B;x8#N~H8_*?#-@V7K4{dwxU z?EG!U0T1~55cuffJQ4};oRW)kM>0K)%)c>i3zsCv6(``_RCtf!mxJ)f0`Fu0IUo4K zsir)FD@=G7_`N0?Jj<^L_#6vg4E&qihsSvg$^p+8Qhq&zw=MFQ@mzWMiybw8J)A$w zeZ%x`bM}+@$`j;*jJ?0l&R?ECWBX8sc0l2rBjYds1Nj7=C1>AH$;Aitu}@~d6E+6t z%-D{52%mlj8t2l61Mges(n^76c{|FqSF)TQndRt*)n2BYMg!0DYHFsbe`A2REf)yd zo7as@+%MXU{k0yK%X(eCjDDTqhwS{-=c^(E`JD>62+$6|SN$D$5AzH1u>s^=6$DXG z2OrdWDA_*b1E1f@w7+amI|Fa)_2~+{{oZ&F;O%y%C-Ck+lJOo2{4vi04}Cm^z}waa zAZY(K>aAh%_8|xBXTM%pO*#LrnO;9rKV|1H&ks?4|AuoYu66#Z;8Uc}>aRLLUrOq2 z(>{=ohXQY}lTE$K@Yh3l*5AGe&vS~br?u}k;hCOk$p5M-NDs!50r1oh6LdG2rNG;SUXeQ}3AaD+J!@Y4D_9417Q6&0+dW zfG+{wdDqZk`N2DFdH6+obJska7nk3y;O{-x%6iK7O#2)DlAXU=Z$f0yK9G;>PvBeS z`^=-!J}`VPKDdzWMz8r1hUGEB!aE2**21$M%vf&t$ak{~5dK~ZPrlFiI2qnW_(u1e zj5;3~{uTjmTcpqQ9N%i(7#E$Dw?yf&0hd!{Qd;{;?ypG;seod_epK zxPPqfYa;g$GyBKtR&fh(|2Q>U(j&nAVPK5GW6BRno2{lW8C2c zxj!Z_O9JZn!%M|2@Zp*Av8;FdW97bAVz{@yimr&GYbpLVEBs6$!x zNL?o31@`JI;bs3!`4YcCiNvqn{*^*sV53Z&b^O72*^?Kr@0)o#d~E&w*;Z1cV(t~= zW&SGqgftCpO0Dqqb^NjQZ*fJ2e5Jkp#`Ak;+nG!pKTzkjwruhaA2 z?9c1(Uv0co%sltV^OF2sE&iG=&GI9Y?lqSCYZ0~h{zS*-B6hL&`!*b4 zzW2{=sx-6}|G0cqiocd$#`kr-WPFQmOS%t%{4zY((Y(P;m4;8`do7EBcYKhEEU5}s+(_E3x7Qj1=>MQ`gqLQmQQ(kQjQUu}Iq%liJ70m6*f_ovBz zo2KRVko`9SPuy|+R-u*N&7Dkmr(Y*|Ur-z$RH+Z={PErT4AR!FaGAzxojQj`YIqJg zSbp|$x3)bataRw;v;v;8q2tDnkUUPjNav<| z595o^P8fZGq-Df#sO{U~zKM8pIzW+4f?fd=#@KsqZJUC7~J)C>D9v|o3V#a?QAA7rmp_4QGcWVXF zm*hL`1rHgEU|D${UmT0)&6T3f}|xx%VMF)&&ZIugYTi)Bn`s zhM(*E?**3rsIy*>`#T$JWbVK39Ymjy@3g6Zf&B0LGWd!0LB_LSbrMfL56AseN{^x=}q(lBsxhWZ*{9h0LGrSA>2P`w?PCWTvit;7?ulPR=^vYo8JlbJS zeEp-~wIz|y88zfQ-LZ8t@?R&2@Z>vfoBv$zbbmGNFrrECpAb*}H^F%aXP4QJCI6?R z9Em6YOS#{hYr;E-pdr>%L)0Vk|DH*PZ|)3}9`e5~_kqg|p8ULr`Xz3;JEH7?ewUw< zbV`9=bt%dvG~s>VtFjnB)A!uQ1Kx@AKZW&?Zi8j~`VqM-W2t&UM3NZV%M4nv{pp1D zbMk@dIO$2G6a2}6$FbIa5&7SZ>+ruB{xn7SQr;s*d)o~7y?-(Exn8G-_uBLXoz$-t zk-J6oU&a$xnefUwk5dNv>RZzvIS9WTs0ZQuQO$9*5 zbN{Otc;7lFaw_mEe!boN!usQBz?XcU#GelQa0`D1@Qdr2`oML=65!XjO5*jh(VrPp z3x&4`bjyTK?u)lSlc0ZP#eEXs!OZwG%nhP1{)+!MqQ3Ke8bqVE-fr?6&NJ-^+w)0J zp&!J)0Ncm$=K>#?@Z^6b_>)>SDL zPp>rblF#M954kjnzZLlH$QQ%QGR2=7<}V+i9`BMQm$BDU+zrup(Vn^8J_u`Yn`*??Y|tuj?B;ae$D0@&&1_F59b^H zF-i6(mSxW8giV6z3!DEupF{o+!FYi4Rz#zY!#NIby^%xmxe{{Ach1P?A#2b+pr57O z6oXC(IxZsEUS#+j%rW$ffPeL2gLkhm@=y$X8T9sqc)zU__`y7H0=+$Dz?WKh)|Xt! zKi}o@5xy#m{@iTMl5r2y&iH=6Qgx$wMC3V4%3@ZT^z>YWEX-xnu+^8c`1po8!}!dGP#$T(7)l&lA9v-Q^r z+vD<|i}S-R>dO49q>gGc&$MrDUJ!*R-)Xlw$n??V|0~#E3^vb;!t>u_*dOM(-vW4a z#JQDli{ZZuynW7_{M>;wPu zL57aMZ$*Te2E2XFyBzqGRlj)d9p1ZHIl$1~bpCVuW?R3ncE9N;{9}XY3w^(?vHZ%# z_Z=nqdfe;XA@|J$CJ#%FhxxvSd$ZhE6PW(9@mIGA6@f$Wy?Q|00=yrmX=?M^6-j#f z{+k&_V78YC7J%l0Jcyq+h$8M;j{*Yc4VLRJp`2a2x2k zcS(8$M!V+wutM(s3H%`U>-6_Dg`l6hM`#PU$d9v7=nGV3OsOixa;>$X_l&swJ2-!_ zaGlhV{pzOA54rmU5lPBDZJr;Z{5Qh9(mp?LpMPZe+xO=3kZ|e^;(0Cyc?%G;3u8K>t>= z@|A{li;O!pH(zO}_JZ_jvHMj0-;?pS)UT9;)zDhrN73%^R>_}0fw(n2=XOb-K%LRX zKPb;v8kS0Z(*FJ&NsmBPCLdEO+Gjj@Z1cGM2WbD#ERpf&^L17AaVs zrVZu)G|Xq6uZ_G#p7O6J*1^;zz+)Wz63%P+?7x6N8RuM8T_bN-1OGb0bKEiw_!H5; zxL=v|l5*gAUNSt;^cPEk?~8jbq_Y|Lr*LkD;ZwlZM?b}LUpe4oAqj8mV&o_6E58M(|0gJt-vZSCqh(B+A7uPsewqIV9&g;;DN?X6oDa&y9cT zB%viheL%jXRYR5ffF!MUq|H&inj_bcE z+GN(BOUi2}NEEaSB6mGtY5$e}8+EjiJC--~--HjF@eccQ>c8QAv^>N^{Wp9^hwVM} z-|&63LWHOO8=ez$fv5f(;){T%{u|jT`UGy${E_?e zYO=TmDmTb{75C@$_g7YkzwSRS6n+TMPtS-{qI)j_jIuTr5_{=9GCRtQ#O2)pJ!6 z&+<>-`@#A!>(@h%oA3(j03yzj;kkYvcqzuna9-xTXvS*}@JBP=lYyxsc8R z;2T=_Lg1SNpIU9!$z9-ETliw&54a5JUuD93z?Z|G2D|N!H?{s?ksf1G;Q!6CpAyu} z-0yTd1yKOQdl z9`t#WKKb(|=n(HB;=6{J@wu~~85b1+fBaKO=Z8UrDFy!Ln+)E~69E=e2K>K~uW=id9?yPe-j{p+h!r>agZ zU3*XE`C`>AJ^#Ghmy9QI(Z78jFpKeD$$3keZ*hpfCG!UN8+}T?+`5_R<-BDf`E!?; za9!d>#1CP7g8oKt9`XArN5YkS*^B20Wxh!CuLd(+EGHLI&H+3}Df|}^ub^piSK<8U z$oWbAFQxu<`yV~gLKRZJ+bf8Dir&T4?*;vc{+Hfj^dRRHjjK|B<9xF8w?)qjEj))F zp5Z*C@H@m`C%=qybBW8mtF(KPFVenAzdfJ)CrE#V?T_TwejLAeOH9A5i2N@xJ~B=z zA>NJW`drTImJ*Ms2e~hyjCeK8kft+l|J3>YBF=xlbU*sL&vK9f-mrHN`w+d0xp7y+ zBl`c0>wxav>GHpb_1)RelsD0H&ps?a_ZogD4n?UkOqc(J!9{Q5WF2anX;(#WJ-E)| zTJy&5@H}96zmX$)EBV5dljvE~o=j!9FL8cbaM9bDoEMGWF#P4@|545ZPB8KV;wN8Z z(iIY)N4$V4&7)bKy*xiz{(X*rg9tibRd@fiyNi)5dKXjXe?yD029n`}M@vl3&{M8shnECxbj{ zlKN;eCf%OMIQK`159fKZ$lq4@iOamgy)UQbxa7}b`oz5S{0lCD{@a%F{C_p?S7`Di z`db$^Ru{{AXV)P1xfA`1dGQ_w$Y;7fYHh}eFQEEH7^F5qzf#Y$ly!kT?1w1W%b3Gp zhW9m5HD?+7i3m^gzpICR_cu}VAjkcoiRyc{@qaPo1+X7{1^Di6s!sn3?)Tt6Ft}@f z^K~?SY@&w3uETjrrx$Wg%77i_QrLAoYS3YdYMQ8Pv^@Bidpx@xY}{8e{@WHAdpY8* z{r!xtzLsB#a6OoV5Z@5yQHYNNdF7Dj!<^R-IQpsjz8)9;WS@TkIlhjM4hLpK5271C zVt(G?3%|bc!O72&vBdOqwr!_W+r<5aw+=P&)_q|81nmEZyJ9{UbPfX0xU&o9YeBMq zKH3fQxuDhi!~Y_TFZRUTE@DS{I6Z)1d_I&#z(3h4M?g#mxh91cmF<*FL@Nf0y&lJ>GY0&*!cHu=&Cer zXl2}^8@nn^W8q)RQcW>X0!^gdS34_BSu0R49)&({20!S@ZBSvf{x0bnQ_V5y@UEeM z2fUh|ZE567e2aS-{t$7|bSwGAeaQaC-7iIYK~>O?c5^O=JkSc12S2fYN>2;M?)ShQ z)X*dOBIeW0o)}YK{^2Q)(LZ^I5+;-=F(W0A4D z@8bLeXzm~ggZ}*YpkL71UyZx>4$ek^K8AnYPI)iD4vN={67vTKot~C&&rcLHKBCVf z!JjNo*KTL@>tW!m=_9-jHE-||?n49J$M}l>p`6c)Uf)@1I)Qfo6~rGT<9FfD-QCEG z2i_QbkGJB3*wp(3M8({p>F1r3^MCW$|5|gH%y1hIdHswJ6tnmd^Y`ZeWSvsVgUtV_ zcV@(LB)?_;FL2WRGnxOBd!!r_yps7p*>90cT;~7OQ>OosM_lIroXhZ{z>`m0=Ko~9 z)+Js$|M#tlPYH3E|MRaf@=J-=&i}P5kC8Isy=8ru_j(&wI@V+O#0qG(F1e^xxSo2k>|Uo!sji2u6W$hZ611&oi3_r{Wc)?CA{ zc;Eb4#E&MwPaNHr__>z%lX=rkIgxy)^WU96+hs+;TlKYXjhYyRhffwa20{AE#) z^wXq1?}miSZ*A)SS<+s~{)=D_p&ul_wJH5H!N#DUBfqsd*^+k^?7ICEo+9?!#6I@P zwEu~)C;4^%PWPvTU-$FW1L&{x+9oFH@AV0J z8saBmX>$_$ae_(yNWBsJrw?p!;_oXCH04R|*IL^F>zkJ~uAN_W_6cGyQg6hR`9-Ne zdtGYElg$4~IEV3joiaXdN{3+9{1rSWB)HVujXd`wcpmw?{*acRPki|&Y1}0)hSYD#r}-7p zv}F61%lXHwYV@~`Yf+m&;ea3(A^9Svoj-CRS;jopd*P_3X+^-<{CaYeh zIUqUGj(H{7m9sOklc+OFmRwlg4w%FYC1-_uo6j?RzpMA7p=n-aIdjOa3@q7YHrA&b0VNuemGIavTP*hjso)^jhhf`k+`(q&oAtfsKcz7Q}inHk>1N@{!H{L-+haAFy&bEcLn7*eaw5*XSjEbH}P@zGxK3(#HY(S z1C|$)8%kAAHT?cBrr#Ejzjoe~{1wC}P`mC1m z6&ObEHKT{eVgLW3e}F9tT>RG5Q2)S(o2G{P2NB#f{n7qGkx_f?_Zr)sysjWw zf2Q(&vK2dF|EH7q{^J42AUslU#FYEVr2d?uOnq}%PhwB_H*%@Lr94Ubcy_lLF^k~x zK3QtvSroMQ#c4ThiLV`I+kKIqtJj(Ff_4cG4(|8}sxo(CDH|%0+l+@={ z+{f!?8a$u;@?LenH}%#f{toBWqtT|^7Z4Xi=6S^&{br|klKJB;!N3@g-XH4CZh>!1 zns`MA1~D%ABBtIqsvpT8kM9$EeI}drTH0yRcj1+6H>`ft1-zfndDEoZi9=B;vnlh3 zcn-&1RWsRMQBE=O4#Lm*;}YWQzh=0^rxKrM%|i#o&nRa8oNe?vk9alp6A}-JPqg@} zh}-)#tBEsts+2z@y`Oy7DNh!KbQK^C4%yx78}950f5rW`59a-LS?yOeXN zB}dBf01Gc9e>?8y6FEi17xMikxJUeD3oj<#ME09HOCZj*}7Yl;e2VQk4bNe=puq&x??f%nk z9y8&~{0rIDO}tl4aLI>b=d#_n!PG0!Yoiy_atb6|3-^d`;XQI9zm$0H`m~%f;=fA% zaGWdp>q~xF|DQ+x(R^=sy#KC>xJ!P)BjU2|<9xlnioV!htxwFiIxDwVo&37_gy@s) z=?nXK`749w%9=e7(D@TwXVM|xugZE8{gSaQ)MHng_RSj-#6DzYNlf`JTM^~m&UJT5 zA7S;XTZPXoj zO~~9yuzwr%&wSr4+z;}2=iP{Mi50`8vr1>5q%Oq5inI zH`E^&_dnVnw{ubQP0W4wJY|pi@=xE-pr5Ek5S#z0{BuxDG)evi_^s)G%6x02bpVq5 zQ;3_UhVsuvcS}=4`RBv0ravqHcH4E$RrTdxv>fro2Q;(zCtIXQ^w-GN2w-WnJ zNA!;Ao=kJzL&}%lf2-Hq9JhB&eJ+G7tS@`8Ybxpm`y4bf+x3pA9Cq=m&5!m+K4QID zeG3PWeAmJGycfR5*h|TG9en)OB>Q=teGnd~T))T=p2~rI(3?KO!*?WnxM@;1BL0c_ z^<8g5e>h=ZkM!&P)c#kH4|=K?O4sX^-@p#~>p~O%2w`iw19t814(uIM{~wG!__~+U z^vERRKl%&w1$qf~9iB4?@dfGgYdYN#;-;yg$AcLCg4iE|Ntv%bX6z#OJkGbuK2Wl&x7a@xT;9Xw%hK<~JbJL_Rr85=X8%;( zW9F}1;;o6xxNj=)#e%Oh=S<3pzbAN^c|QciyWC^qBmJCe;zzt}aQ`kdAGL<~13dTR z1_obGJdfi?;jbZn82bm|1*Siym=BLoPQ-M{xRTy#jbi@tXx_Eyz$%@8l^pjf&JP~* zHTKc0*t&Lp-8njlec1UY^S6?JcX2(#<@kfaD0|*o+V6wO?+r8KQpwkIIFBB3JnT@= zMZ`sZF7X{X9ui#2!S2LGj+BF+n190WQqHSfM-l!4;&1T&G`aVtkodLS2QG4oh#$^* zbVWUQ#Mf{=M(|O@Pv&}w;G>D#hR7H5?Wa1fOWx0w!~9$SHhf-Pw|*534`NZjmwz&D zb^4p~DBCa03?QG#$^zaP#my2FnEqqmlrVq=3@OM7~j0M{sqSdvCrSjKYL%l1Z?N4abb$?qi@w;Tb zsH8kbN{Fv!z4Y6ea$HKhc7FiBQ|}X>$N2c1r<_XMHbhP#9oAnyY-95M=kk7@$DUEj zSyi`K<`o684?F+lek5r>JN?4)-iGZv!>OKTaA&wlkL2I%XACa)_DKFM=00bi_wa~* zpCG^Dy*;AedwHJ1=lwqg4EJKWhv#8au07&i`F@HvnRfdW;w^bEkdy<-k1HQYmydJE z-^JoTm-tWCeM;vMe|Q!3^PADnc;fQ?5r4BO2j>&F4bg+>>H2pz577BnKEufMI6wL1 z8uVXg*WK^qoDjsK?EI7aeI)F`a*k_xsrSm$#bvH`(+fBwinL-?`jlmBWNo zT~7WjM!wX)w=G=iUzYWKEo>8sp9?C|`LP4>5g!}*l79~IZ)6`l>-~XIQ?xvho5V!C7s3dOh z(<-QI`p997GTOw7ngGKD5vN)g9mS!_f|e}xxdc8CcVzpeRt*` z`y++qAI$YT$-g4vO*k%+`cXo>I47Nd(yp$0I31r-@_$P_d@_g;pZMwAhZtOH%EwgV zwoyhvh;g_x5bS@-=W@1!91`Fr^%-{JPA8h!?+K3K%`@H|Ea9nN9A z<$IA?#PgX?lCKW&Svc3}?Z1S~${Bw8?O63JHQb_zs;*o3k zCI1ex;^UD&V7ZC9nek-_@rNXy^UQle^ey|B%d}c$WQ( z9D1nWxhPrpmiL_d1=DGbALRY-G&c22-a|vl@AG?Q@*e8)Y2AK#=jA@C-}5N1iSq|% zKAWD8DTF?f?qRFC`6B1(K59--C(jN0sGkSa&F}cH^ih9lS7+DrEF~S%_A9?i_XJLS6EGhod>)(>+^7AbhGSp8pB6 zvz4X|NMG`M*OK0#Tei|vu{-_ez&~iHkNDzzh)$b+D(UX@$X1%(KB`V%+P#?W`nP_{ zvBA;&GXHxre$LMD5BkIRYwVb-iM5ji@0l=!|*-mLepg^`pNjn zeH?CA@Ph*AH|ahH-%HZ=a1ZEDljx^C!UxGy%pcNTw48SDI9>nNbN^8#`=9TWqt2b# zLQUa3MQ}+%qg^&HZngNy5F#p_oqvJl5!Ab@ICaB>BqOFypa4MajAbdIB9M6t~dll*zRi>GOeJ zBK}oYe5as2ORk4xACQ*6zJJ<&!mPA?(vYe$Q1B>T5j zoS#!mkRLB@Rr`H&_lzL+Vb@=||3d0-56;U-|6XF?aDGQ{sV}E-TyKvzcB35Gx0g>r zbDm~>=lH}Wo=f@Cjuj9e|C!+ze6a9eZE%TCA#r>ES26LEB%Zv#qm+2Q%tNvMie9Jn zO1G6g6#W1C10N6{uh6I zdfbuE`Sb7@qnU_uO7f`L=L}v$eEM{QyF90sMSa=#hvpDp_5tO{`F7$>+ZjB1=hj%V zOMLo7@^3WnFUf~XBtFCo$$!0t7ZGQ4|IUzdC+4rg#PP}eEn)svZEU2Rt25Mwxh#2S z2eB+We`S6_^0)Xl!|&DHkqY}A8OJluQv+wwHco*`Vu!OfO$2DUA_}4VQV~un4IsW9i;{lj} z5x?3z2zpA|^}aZ{C(YR|S2ec6v%eEJ6X{R-zsl0rKr6ldEqRiUVoLssdEUrD^`4*H zXOU?L!aIW4tA5WW^I7^=&PMb-Kv$xFq4$4CT;Dj?*dw@UYN-F^Z$f_yq`wy;ezht6 zG4J~>N|Wpt@qU0EB>gStM}!ZO{+6mi{|hwKl6S&h>2h$kWxvttA1y`vlksV&|E7LI zc%X**Z|Y~bgGNkA%ai__`UUQw`ubyfe~iSz?tkh2mcFk++#AZ@A0|BTMt%L~QHxFf zMtA<>{Efau{(&0G-{7k*N>fAm>wb;?E2yFTb-qFVfh0d8{MID-8GZ{l(0^5ahHDWX zsGLFgZ@+bo3;C(ee26#-9GEb9~Z>tztc|ZGWPGZ)7t<4 z&F!>~|9@3GZE_3mh&b1jI_mRdpGo$ws=5EmdmTK}GFA08rvKngFh1oyEM|2_BdE+& zclEM0Pt0J{>%_y8O#earuaf;%ubF6*U=?DrNlQsPC1OfPuyqxrJpvH z_+rr;zpKIN2lXi9De}w6|1I?|M4nBk0C&-_?0WWx^0{H@^l_jwEyquH6Y=SSTO zgII#(i#kSdTb%-V!q3LVJmVC zzvw@c{9lNC_P1L~epvk560f<5@h5*P;=4(G;dxd}|Hn^>F;pSVDVY-=PUde7?|13Y z9s6nHOS%lBGckyNNWO?Ue`h0D@^|A7Tz`JvjQbdj`jX#`2p1b%`gcE^V)Wo}oG5bN zf0+8|XU3~m*-_yu(7(m9!443Crq+V}ZNSxo7a>?K9R3pdU?{YZDr|u9_K0Weh zE;RgtpF(`mK}NphV=?hdxDMzxH8pDt@%!Irx|m;Q5dZv~w45`E_hI}+{#fEWGCqQz zMZA#ZF_&hud0(ZzpX74<+YRSe-B%me&TptmK`cS^FQ&|INd9J5v%FdB>%+fcx|qM> zzbpBp$gFQlKJLYN2LEZ3zj=)RF64I#O#Lk&zLU%YOf>vO#AjqPT*jw__?Z$P)?c6a zM#;x4lP~7KQge1S`u83&NI?F5SWeWGJ7c7Rc#lU+xKR^RPSz9e%Xs=S|Hgdqwivxh z`!Dkz_e%U(9)^#`yu20(kQsM_lx>$b7h*wCum|s#J z267$BX<^E3CHZ%=^d|ZCGxgv$Gws;ZpsMKfs6ap)r~Dg>e*Xs>8;eK||Qux>X z%wP@fcL#k&d-x^%gNhKJ*!>Q;YbrK&cP{Q{2aTe8_#5~^Pwa2p)whTrXsyUo+o}+B zhRC}cvOwq2?&7zmXX!txKzcwAGdy)a`n@9K;9o6T^=l zfIQHf(4U?+32%Tq=xAi91APVa5g*V?^zVHQeSsD+Jbxkd1*#VJMQ{f#gFdx>qFW&! z)Xe$v@SSzY_VC4DXNT|NP9x3+l`N;#o$5`=)7c^!!)H#Q8*- z|MHh%{tDF4{D^lI=Bq#r&5uOztEs{Hk&iGx0+RVJ=W^IVGG7wFO_R)*MEI?#q4^T` zcFf0s{;c^gZ#mKjYG}SBf}5s>=1V-R&1$NhFS!C~12r^X;@pVzgBqF-3*e@yp-1Yy zm?zKN+^@d;AIukqTb<1Rwzc(N@;_LG@IVdazdsk{1JqFdtJR1rNaj0T{MKZzKfi|Z zm@MCwSEub#9zyulB;`SU4*8&l<}ZD?X=*6{)EDp%YAFAFxM^By#m`=Ue%6X_efgVA z-+yZTS@K=XDT900`~9z>6{ZAvi-P!vUZ?7a+XtmzC;6`~!Hx!y^D*A%iTUr=JE!NH z*Y1b$z}+}+I0feuHL-nGm%~5k<0DLds_S3}y-}R@|I1)RV{qMkZyv%+w&yFsufq>7 z?HyB}*~UGb20Li~8`I^b2K*{<9`YG%M2QZ<{kP!NfAJ5MBLpk zEvK0Hg~zAyQsUz*Ia7(BImO7A`Mz@Es~8`_r5|6&aOK|5D)Nu)Zo+jhGx}Ld{4C=B zt)_p!p18eFzJ|CM8T=vUzUx*kuCM*S>p8>dyl2LrdVk{f*x@Pp^V!IB{doC1)VH8+ z{mb6p`7Zi1$@=tOGssW07jk|)e7}{_G#?R6mUnqSgc009tM`YzMHp|aXcg01#3#uw z{RQu%R!Y+V&5!%Zy_K+o>bs9z*XIafYm)mrT>RG5@_=-F<$m(;GsFiZ_mjK$tx3i^ z?uW30S`BA?Mcfr=80`}0H+?f6@|GcfpxXYxCy)=i35rj)cOOB2+OPTm@<6RlN~eFO zbsxIP&ARVymJs;7q~|Tk`tNamE@Kns*QYcWZz{Y#h=1GlfARH(Me6?;?sJ#%vAYQ|JQv}Z?e#x_@e#&|8 zJmL}eg$sWH@wFC??O*XTLH5Nkow@~5$YAav-sIj-OOBP!mU(^4Qc2w@)kG9+ya~6?b?%xk@GUYZPF8A+CeF=%n{rmnn zBd3aZ?fv`8^naw@$^H8w&(lWam;3isFB8u-#O3~d`Ofot;(2nejNc(p%#VJ=<@@Iu z#P=Z{b}El0WDy@Ea->})evsg7PaNWs4~&M|*yV%)tr|D(VDE1`5c|UX33cBe4rc_h z7u{{skC=L2MHX!H46Nk4UOvMmtQxVOFF2#4uI9Y9;HZ}Iv;Sn%?g@_S5I;{|mBvxb z-R4F=Xl~+XrkrbJgQlll^>YI1YqCETtV-K2XL}>{XN=}g^lx8q)AdWfUnBfi zTlM)E=rbAK8^5N*JKb`B9rBa>8L0nBdzNMY>e00O*=&C#J_D_NfKWlbk6k{Fd*a}~ z>i$7~(fu*M?0?kr!`^n8s$`~F_lU}a*j@5fOqn;%WoVVfW^6a4zW&3N^G(i1Pn-7h@j$80_{(C3|KE1MolcI_C2c;|KW+cL?^Vcm$wWp& z->*>HARv&8hh6;EWZ$PI-zgJ$@;wV5yqe0hgi zJ1>nrx<0Um)+r>f{;YKhy+_wam<`Tz{|tBVG&Ikx_vrfIsc+u;pV_A?k#8_xSq1v(MN4oqfLQclP-PaF_C+_xJ|Z zK4160c%QHPJNtay-`VHuTKjz64gY@m$YIB!hP8NgyS+b1&QG}9ANcC_n4iE$;Wu(# z$(v=$M;rPRQ_i<8rCd3u`FH1AFEZuEImV0|C`JvF{eB#OOS!GQjO|cs^L~@}+Em{2 zWZ!Fb4CN^DI}G4>3(qBP-?NoReCyc^m;L>G;+?tgQRYkVdWxTJ7QPShp2TH5v@h}9 zh=)wCOZ-H}(;E=PNCELtq969JjjK}qEIAeAKh=^`NqmeYN5(w^C`a-|#y#}*cZTGT zn3oK$_Uh}OY{LFD{e&+Cv8mU$x~SH*{gdWp>GiAyo_Sw79eOHFS7JRToK-j9?Jb8G z%pXg;?e;L^{piS^O4B0x7xx>!H}azHa0j(Vc-l?%@2NC(g~GJmKd7hD^bY;2z2FXd zCN%DvM?Y<_zNAfc4BSB_h>y1WL*XCvn#KPi?ZNInm8PAzKBfA?Kj>)2-yaD7pn&lW zI^#F!W5!2^p`Sysey88FUfZ5A4TD|l!*2)wpwl2vVg1i=Z`pDu)&rCMlQoQwJEEu3 z6qcsbS5R!y7wm-aLFaQnjmTSY0s2Xa^@MKJr?}_Ap3E=AuHL7TsF#5 zN%B%K}1 zJekC=km-{6bf=vAC`Y|w%3&^X+5hRXycH0iOMby+9p&K~qkq8*$v@x1hZFBE`|2rQ z%HcTfdlxw)$bZCjrkn`w5r1)f8b5`&C;RXzznJ(djE_%zEb;d!M{p^hJ+df&YlJd}l;ry~`QACxl|v7;-x(q95O2ixNA@R6zHdd`Im(ouJn}cU@S+UkAm77rtId3> z&j{TWPKz0Q;!}x_WBen^FC$+2y|2BEohcV)eW_zYQxVZUoB zar?f4hOq0tu0)C&p92 zUfTRsef^(R=NkFZsph?+$5D>jy0-r#<7V%S&PtQ4zx!u)R+?lS>z@TXNbd89@LN;u z{T*j_#y8qK*RF^AW5Ex~MM2W-Zk#t1nkEHT`-IC&(&kLF3P?i z<*I_qOcz{Um`E{-c)N zl#ajuZA!lbw0>4u;oIf+_sZYxmOQ(>o&Rk*zNU2i{eQcB zojmk_XX-0o)7Q~&FH_Kd%4@84#0^MnX4RF~n)G>}?Wr_fv)tI#xqB*2#XU@X!pVCo zO()L8`xM_p@Wz85G`fr7cl|w;raLJwxNc9SY0?G8-M?Z_rK$3LBhSACcF+Zor^i1I zersBNm~js-hJR29{y4k|2oKa^D87fqdmVH>O@sX8dQUfN{#Ngg((=`Gqz81=C=;Ig zE9@W#^0a$|xM^w$#U%589ooZWdwFq<;dehpdO_-ZBR_Zn@db@vVEjAhKsM;1Yw3PI z+(DV-cP7CdbQ$^m2>Jkhhxt4mzP|!?(D~4Bte+|12YvRCv3rk0AE2A)U*def&TpOG zuMjuTh^Lu9a}Zz9$J9rNxNBO8`Q0cj8Q=%?WB5*S zmeO z|1ZKnsOhQ9&llhh3Ps+du!D}Iyx?J^AJlxKd4H>CpdZk%uExK!2=NEaX>Q7s`y~8> z)*<6{{DM>9AJp?m!|zQ;dO!nd_p#AVlS6%aXTcrxavS4c%g|3pgsGD52rR~GprR_(c{}5tRjENocrB~Yh zhkeubn<~=w%Z^Cf+af%EuW6Lm~BVlW^m*s!l!nC{#5Wc#zZa;U& z{nG7G0QUgr%S7g*mc1Y3C)=;*%hK`F`!B_>Hrrm9wr_-flkxu^>C^e?zS1kEHy|(B z{w_fHN&D76q~(Rnk)FhU^1oX8oQ(7*{a<&Mv3rYp;rv!Fbq(gXw0nr~HOcpKBn^-r zKWmy|F%D0pjJc@y`%5uCJU#~TZz#Xtw_VRhc+b_15B+&T%+j8WV#@f?;Z#I3?thDR zH{$}btJa*K@;Vqfd34D5hU2BT%s48a_^C2)+vV06af!>gE9AJVfcQ*~yS#B`zMznJ zg*6^4BEF8}AN95g*CYNDajzE7h+W!BJUNc?s6W{sBIBrH;?>spt%Ud!R(z%scP#m3 z#Aow+qB74_PJDaWC(H5Vt;ClyTz9b<_XfmEdC!H!a~|;`-X9@&NL+EBq2N`-?eS_g z@#mPXkb0ByMYYx%xhPip$)b7d)e}?uNAr0;_=00GzkB=EwdaG?GePW6%AJ_9e^kof z(X#K8=VD_|`1c;i_sW`wD6#U%p@-XKKPcr$xwQ9>N;zA^bF{MG=qSp0TJ~i!pN=N} z+?eU+7jX<%wfL$3pN!>=p@E3aeveWkx&>E2oQ zz9}7t_e;XQ+f#TSy=~m1tD2~Lnxy?db|nO(f2!MS)uXW*2!3h1wfXEJb#@1Pz1}#n z&VK}Zj$_^j;^%Pq_Zhx-WfP_6E5uEm-B>M~S!WMhH&PD#OZ+t7u~XCIhg`Uee{J6S zb=v-dLI1|8 zJQ1Fj_xAV`TYf7Ps*C!j-MidgXAj_hrIr8JC-{RlaJS?mcJU+S zPt10M-g~IN{@vt3h%X*zv3ZYv*$v;KRy)*|zZV`f@l|JbQkpIqZS3KgPD)ee#Jcq8 zbRE5IUHr9OeVTU9vG}tr_iBcx{pu%om$d&+Eca^|AH$7t%a3XPrY{=1SKLWy>TZRf zXW5UvIqm;s%l_t(#$AnqK0qaw`y|WmAbrXH+fC4S(w=9z-*35}3VkN|_eFe@_BKdg z(*6zfqwW5wonoqK#rU3p_=2vn;E1OFI6? z5FcU1^H}0%Som?oOG-?BNxG!pLg&9TA|hhGw6=4HxmxI`+ zluI%7xL7|@K4twXXmgu!;QuRluaBB$a4DZ<#AUtLA^#on{hiG67?JY1j`uUkdYzQd z_pJMM_NAQLMgDz8j!V3P^8L96mwf-|Vde|_OGV`0n%~)xa7&2GxJ$kpT1xyzuEWdv z(p2K3d2f*9S3tbkjC47fMSL>vAM!dG&I;lk$uIG#B);Es>2fuf`2C`PmggslucY4G zdx995N4#*TiH~=k!9(JWE;e{Xy;Tw4h4B%*n)qDF#}ZTDmlAKtSVISqyW3;Msr!ur zmQQ{D-OH&fpW&h)_9^93OuKwuDCe22_H&@@FBqIIp9M#y>zBj$9k$r$IoREVn@hZ7 zBkHH^T``hJ{AR+c{@==D z#3TML%Sq5Eh>>FAJ4^h@UqZYuai^n^UrKxg_g}b+ZjTY4_-{fF;`5=2=RD%$1;6~37zv5L%J|5+?xn;VGBW5O z=BUqSA5vfca*yZ9P1Eai4~xJH%6K3hzxOF$$6Y@w zEc+AWTQgs^t(N`RhqKs9&U&G!9c^&KxlWr_qIw?5Ar*C+bT_Y zkgwf?!H7SogC)NL(a`SlT<0VHSYH%-Zn2ra_IhlqH0k@mw3})LkD#uWyxy?;@b4gP zn)=dR?FD|&Ea)pl`H1$0K0u=pf6Xu9@f*&*oMl7#2I)h8Q{rKNZJk>V_m-s9q?hXZ1?M?-S1@{wwj2cpmYas!X^(!_6nYgz*vF zC4NRr$|rvT@i$K}xU)xjj1&@Y^BMU$4_QQ9?q?AFj3C~0JmW)tk9d~#-KSHCKm19W zAH^zuR!ICQNA};XB_5q=;#oreUqt`RmrCMQSDW}Nt`p27zSDVWJS6_Zj|O)sr;7M; z=9f>rns|m~UiNC$s`}c`v#&7a&RrA4KBnM*kHq~eeOsY^C*B7GVAu6Qo&zkq?C0|T zg8KtOk3e2>er^orKXrX~N8tWLkhIV0#Fk1^kc0U}w7+U3?4ZY4ez#UXDChdQ)rQcnw{3wJyDKDh{ME=2uuMS`A z_WrV$Ed5<&>1zzqr@yZy{xAMKZ9nX{wEay>o?c%}hHvlJi3?pl|LpQRa68q%zVe%0 z&hqfz{jE6*r-P6PPANjBLA5;$76Hr6# zZ@3liGX~YRzxW-2r2P%H#&3|_{!0HL$bdVjq4wDQHdATZh3`Wr6YV`n`VZcAct3!o zJr40(leEW98}NfB!oTi6`2Ely0{yG~hp0Ky2WqH2c3L7lkhI6qHsA;SceTgS+DxTM z`V*0Z_<+Wsfav~&hrHD!{R!0p`3;i(M1bF#q(9+gA$_1f+Mlq?@6^^WA5dTWTm7^t zztK*2#y|A=gq`sn@GJwX>&{Ep$3fSm?d6vHiXmzDQ|?aNzqZ`Jx9meL`S()3+Zg-T zL0d4ONwyE$oS3%j^9bQ>TPeRO&Y6R@P`=}I#@an-Nt%Bx(w~&~Q>XO&RHc=^43G0U zhv57LXo2NkW!aCn(sP<+KhLsv*xJYsmUUK|ayz8sx5Sd~TmB={Hju5VRv{Xp;U3=ghbKTuH+i;$T$F=hS0$NN)1wf7ZT>j$0A zH{;$QGV{Gs57x;!bn@f16+geqx(LUyxx_PMo|NzBSy5!5HMt(K%nrltE+#C~= zrNl2}JiSdbVS+pGW<$lO$AoeNcT1>lq%lAsdw@m&qIMvYiO|QMr z=uygF7Cp#$<{;1L*CB3ye^ko-Ip=czhU=3($$#C)>GIc$cq7hl$@iT45WkFaWZkJR zaapI8@2%#G9PVrI4mRm^iQC^{Eh6q^rsL@mpGG}My(%WYn)d(;UP9ddK5HrQ?U*j9 zZ$9yIOAk|s50?2z>g`hE_IF{Y5|{6}ihcs(Ga3I#PfX*vm-zj}-IEQDW;1?P@*e4c z`0Ke@{bm24+)t#(f8Obtwcf+kLHt{) zjhHen%q8b8yhp@8-0%}te{{SUebfx!FKDLz=y=gzj`0de#*1nhI<}zys_~+OxN7>d z#)}TdhMHu&=pikd8X7P9OObw%j2A=jYHDb_=zv$#pEX|eenI>|GG2_{NB)8S=y=il z0RBNTUi9%>)4w`ilyWWR4(;-8tnYp$J--}{%2ZQIO#2tCG3Axr5GAH=2lTwN%YrQT zZ~51m{s3WhEB9$R%L0L7^Isij>N#rlJM+}any2<*mvN?^qxLax-OxBw&r$o}X=t1& zeNP!@ie1K;dXCzM3>jzYIcgu6j5GBdwGV6}$C={)Uma)aIcgs=8yaWoIcgs~|6Sus zNuP`>#V+GYvCFtp>@uztyNoNv{zu1^Qs|`Ii@Dw0@(J~oe?31PoRTR2Uz>6(aYLV@~`K(qr!&gS@axt1fJS?7T7(Ilz%Hdtu{A$z@ zcF;WBZ{hxc@U};IAbbA%V#F_iyU0KI3dp;=Zhh_aui*clI=i0lPNqlqU(}Cv{)fUn zIUf*zsx&d*tLL{}9Y3UBlk`{oPTMF=HJu>8rcT~9I(~`pYv;R>HU}jA7u6Yx1vS)v zQ61n8s;~c&jDIQ8>m|}N2>J~Z_M@O5ClSAL#LrLIWxm`)Seo?x#xC;PL0UCQe<#S^ zM#Y5u*XtSHq~;kZtiJrraM`$rnOH_XqAM{hw!z9EwppTe#HA z%eXHjs(|A0NWHt^RTIyU^D{Xjs4R^;#KS>myy*R8#!tD#Z=)Q=d6+!n8I&V9s(t)i zBKsT2-rWPZ{~XHD8p)cnUs({9`3P zUL%xwd)j`OIKb5aUwr#gy}zQvUzr=QBH*^t#+1FXiOi#|$p} z-9^t?-%_8bx|rIDufF7tJAVpBHtA+vi2|iLYXOWZusuF6TvMzNd(IG0(e-o;~9B`OH$0 z!}GM>`$lhN#4F{TE$d4K@e{3cyp_Z^GM)kDR1xpXe3b8{M8sFNHF}eLuOV)qJI!Kw z&!E1=4CnVcroR49#?6M&`#FezjK+FFpTzmR8;1aXt?vE38B;;hx6tN2Tczzy2jcx0 z)bST#!Z5iWed3;J{tEa{_Afl}C+&||?he)~lJ0lS$NuTWeFK-Dl(rwTSK3~2ZrcC2 ztJC&V(ZD92HVfoa9IB>wR*F zin-(MufDFw$4-CKp4IUDpspY8Rheq^n|zP4p0JuJF?GG^rLaauxo@+-qvn`(6^TSK z=b4;K&3iA44*xIJGe5hNO4c(sr;|$7vk>+_vz{rG^FOnmxgCDLo+ay1*uIncNA)P^ z*hwYpk=wPCO4cK%dnfhJ)FY=?C-vW5kK}zQ@8d=nyJ zoBnVC@d-Q^>I^q{A@M~#PwVVw`pHGadsHw!i%q@th%Y9;tXGy2U%ra%#SJE&Q;Bb2 zJ0ko6@xK(C_j|~A>eq;VzG1rjr%gQP8CYG;_(#M;;@>d6&fg4w74eQd-y6&{cs22! z#MQkfo=b`UOgZi|hJQWr44#h-h}RH5s3qgi{;EPdt)FodjNa5VqqiL5`3zUSA0_(; zvKAYD!Sl&KaeK<2d`B$TCBBAwRvV4{0^+}lo{1L{-(>L@5%0lpT^UaiKT^(hpKkPk z?T_(usOXLTz464$cs^YEndcKf*5bc__>Gc}o6BRl6NuN)Tu*cP*o#Ia>sQ43b;c)H zzj%8ab?<#fKVG9*u^cD1506-1aw(_#X2TzCGWq2a?=9ze4>fu&B;Mz9#*_J2MEvGarkwaQO?*7! z_gZ)<@mDsd`OAo}DKogsd4>w&3)UE1;$KNTEHJpb(}XMaD`(d<9+Cgochh(c@in7N zeuMSIX1; zRcBy6H4*>4EdI%ipZi8@rRh`4{|Q$5c5RoI?^)^X2>m3_!`c13%aIX&R5#vSd1*R5 z>tIiwe|!w-O^!#GAU(;zfGk?8f;2+e`Q_1=%?L*T!mvm3Q-)i{%-6?4PgM}?>=jYsvS+U3+ zDOgOIpUY+c@vuqoh{wJkG;Apl|PX=vbZohq>$Lo9leR8q!7@ir#J~s7ktoq`Y z)SIVnH0`&yWr)(WX_m1^dks~ZdYw-DK-fX|bTN0sc~g$Sch!$j-$TA`Pr}QOP?|C) z8M{CA2&HLMh`?}OJGut`L6g5md|>yQ9u|{J`R>A@xNmo;Iu>?)-+{Ln?x3->yI&rr zG!1yq`1j`zQJQ8#o(|tRdZ^M=1ot>T#|~8?=#bZqJ$PuS(sWr1@^3j@IiRz?H|=3~ z+2KmlY&2}zzqbJT07a3pyI&!GpzWVG@$=^%rZl}M{5u}5JkV%{r)B8pW4P=2vS{7m zFmaOfWtHfR0~9;!UhZH#X?3~r!q%s*#q=o3_o_-X(CI;0o$ zBhwp=Li|BJ7$3Jc^aJ{SU&`MZ@yIHZh z0`|VDQEmN{{zi0q4!-~J_uu<|+?u~H+QpOyN&hRBy9f7V|LFoW1j4J$*De0;52f9! zE%zMyKTu#eBZFY4cMnyj7O{OUpjUijQxF-x=qjlJa-A^mVmWULHf2 zG|7LkC4Yexeq5>Q`IkdX>gQ>fyfzB`*KA>x{nK&%ybEXbwl@8Oe^@_n%T~$zY}6gu zDp^0>PqJ0Aeg-SE)xT3e)xFs&SwEwla#XT@M*VVBvVM98=BQ--R0DHVvVM9)a&SLQ zU3m+J=BQ--^!w+iWc`f3$X3bv88yjK$@=MS%2vtx8U2*4lJzs}lcWAo{dAlh_3zYA zXLhzq)=y_awo2B|0Q&o9>Zh|hTm3ur)9IU|lJ(Qe&QbqN{q$PrsAT>0ZqHW#sD8R1 zWUFNTR3BxlWc>`@%2xkO{fzEHekSUt*Ct2(qx$JY+3Me|pHff1-0$J*>RaENI|lF0 zM>5q4uGaB`tmskr2Wf!yMsG4-Nh}`OHhSRy~e*IOw2zLg)~o=ndc=u0Kicc<28!am!w zPel5Y?&B=|ZiNDujDIQIlXksMDY_4o=E*ITe=dO-#p=KXc z*S@&Jbe1tM=AsTX3tyx_dc>+9b>KiKd`r9u4T#d)~q zOZBep-{y2S@}2iHl_t60$C(E^=$pS7_u$=3rAc*z{uBErGGI5cGyk(J`*v;9{6A8j z`1$;mI(=yD-KnTAnRWYXw;;a4tIY?X0&S|t5f@Mg$k+Gd1TP?dpd5ssyf0@s_N%Ds zy7|p>`$K-hz5)74+85&fGJT(oGau;(>H7q9c=BvJKW*=9*(XB2@M^O!)Sk2-VAu+VhwA~+^w)bIt)hg%@w43Gs z7wALB*Leu?L0b(m_GmTY2a@}ayeh;G)Qaws#sQW-hFEree}V97v(VDVNXzb6<*70D z7ioX)60{efsH-Vo;oZ;=XmGxHH3!Mfm}B1Anr7d%FDS z`I38(UeH*?PxD7_B5Y7g#3#xBE#ztb5WJcidZgZpdH0X+UteGS)$dpRxO}hb_viq% zOKts4zW;Q3lJ7rlPrm=OJ^B9A_T>9d+mr7G?nCFc{?*G?n(a+hkKb-v1@4kln&qWSi z!|{_5O^eN_y_si6_cwkzbKjn#{5;~7+@J3qX!`YNzT;;e@nE*WUE-NP8u_wMzKD3n zYX*03PVZ;fcU!Ix>5EA5l#;&<`QMEE%_@rhsYHzQxtJC*ni7JeP^FQ`wC z;g%8KyMl6lHt{KIZo+kW|3&|IX7!PS$p@H&sOage(sZ@xr%^o(0b(ej54R z(5ye@5#M|s^W`U#u6*Jvc|JnqxWo@0Z{n#QGv%s)_@UIB^N=YgCB$9V$d~-`Sw3gDTkws9;OmseN8%DRm5A3XZ%@Cs)>KsBaJU5?lRwH{ZIE>^wWp=CF#}u z6a7g26LZ7Wb6%;hf6#&lPF#0Z>`$-b4pgmb`v=mW5A(YzO>dlQ`YTcYZc5XcKf?YP z#-jyr2fYG$$^OjEStz)J>-yspN1!iqFZdtq8q*1b((U1phv6R7z0ajT?f315^%I1F z@U?&S5E2TK{;rGPnxwxQ;I}5}@2ZEv4+>VK!;}7~+5sI!P~)GW2E^C9s#{F6reHlo zkGEGNY|w{gCVlQc-IS(zaM$Vghai5SfoR}#+pV^OJWx0m^TBhPDt8t5L2V#ky9c{; zQ<~aOH~s5qKzF6-b8NWQ`g41O9~9txjJEqbLq6y}>eJg7@dNcjanbUe>D`p3?v$^_ zA$-uTlIx7?TYGU0iz_E4I>rCq}B0{Je|C-y7%Psi_XNUykQQ}s6b@ZNwt(38+l()}Bx zPwPvte$+?!>`qG4;V&C~`M-3<{d!&12->~2NI&Q{h99;;-hnQjlrGPQNdCQwvIII# z>@~217Nh*@upJC^H5Jo6`n9Xl)CTd_?ru>JrRhSr>+>l=vj#;;KbyIqRNZIVZ-Xk; zZvops;yHAf$9rS+ zS>)^Q1L)@|e&6(QJ>OZC?|fHlpo5umH15Ve;5ASh|jY2P2Wzu(!%c` zZnTFsljW?0=E+Yy^iFbo;=f_qkKkOiSEY5HgI#CEB6?Afm{0viK^$-_XSoa4rQ44y z9yjIACr)4L$+_wBDE*=rHyJ#<)AVcc`i`IH$*>k3C`d{qGEa5pi!S(?$Gv z;+a-FJ>t)AOvk^3_@-@4{3TsJ@nc&M-(bQmBfhifv)t&@ly0SN;XQgT`2+H=`H1o4 zIgJY9@0L(L%V|jbhbzovp+{>uDfdNWwi%UIr| z9ycfcu_Yhfs`x1pIh5}ZFSYPI;)TTJ{yvxZOy;lbe=Hz=DfKV$@rXNe&l|&)_hcmZ z6|(-yxSGkXHKhKEc~Qj|FV;7{8K(Ca;qeF0icNhF;Qp#f|;U(!oCppuUf{@r!`*($_G%l6kIJW%T^;I8M32jP3&pl2{; z936!D=*J-+bXpIDpYT6pXZ8p8>7^pjvQd=h^in?Pz@yo}?2hn3m7%c*yZ2I>=FK+z z?qR)@ruVr2${7NF&}zuj@rj=A8Pmr|Z*sga3HnOfuea=9iGG?PJkTo)FZu!UK+oM| z;^S>V-hlR}zEw*o2INCuT0c=1(g*sH^3*TriGuDzc-lSK0rEk;1{!((X6O@CM*l$* zxP#97h5FbU=>t{LziN!|KtZ*g$$Jm+1y#Xahp#FTA5d$! zYrD4|?w}=fj}AcmK?4y#t*_u~?74g&MSLCf_`4aoZW0?QT5I@ixs4qHx?x&Ck z`b_k*0QmuOCL8|XV;xpcwVvq>4@G?eeZ%y+Yv3OwkF+adKDS|5VSVk(*QmexaoU>s zAiclnAgr)t8CZRcu8qW9o3h^GpOCFIJ&OKJ(tWD6zpBi#4=7CYueJ6|+2{S6Y?J2K z-~ZC{E8c0@F>R!O=ag)vsoV`)wNd(_DhGa*K?fL zQJ($^S)k4I@1G8RfPQa1=hXI)pO|kyW+2j&upbQlB<+o{9-GwfOH<%Kv0q}bWp76Q zU=-p9@+KPp-sSiW8j0|d^5#%K?nvBC2s+ZrpSg4wKbcm1uGZB7k8=(54{~2b{9mop zUu%oMg8KJQg1$h9wM@sSy~V#h?cvmHrKvgA|02C!c`MQf`re9PRj0JP)2;OGa&X%H zc&0Zz9`ZpQii~@NvZQGt%7dg`o46`2wIAa2=4p4?&*7kKXp;3SZv^xYIvf=;Dev~g zem9NhcY*$}-V-8hO~1GPLywH7U9>Oy8Gqq+eUjs=JkHN-I27}1L$|J5|Jip|%#UJ} zGG+azfa9xItJp7BW?qHtsyXim3OCLWC^q-ydXC(WBJJi;TptK|&cdOu0S~bMN<5$V z@#GgdC|>cigz*u)nD~jZ?o?*RAwKcJj8DkVf=~#Lu?) z=Mn!@^hW-W_@+Kyvi}-rtUs>_2 zA$}0^MdG8-KIx~kB`1Tp%<~Apj4LYm-88{-$bYewE{FJK7LIBZKb4jo8HdcXaG942 zE!?G?W2JoFXv#?e@$abzpXJaauDEXLl3&IlW2k4Jc$x6aePA5VR1j}LIU)Jy5pPdi z-DKiZO?(Z@N$oh0cqPAoCvs|tAI|*p8EzKagKb$(WZc!7cqZfN&o%Wrhxm?+kKnn) zkEMKf&aH8N&q1P0cqgK@Rb^c}_7LZt}qqIj@*;x7_2M zOFVCw!R`Cl@04?9U5!5S$^RbZE6x`d5btNja|rP@cbfVg>>k8OA@Qc)8r)?)E+YP2 zv5Al5vq${wC5B({QN*+EO5>x6j~D$gp2(K?DVW1>c~0>(;!T-eyFHeBzU2NapZueE zp3hri^lWlLsn2dT@ehbsl0Pgoctl*of~+8iNDjr%FvdUy2?mCx`W{isuyNJfE~%BQ~V zEc`^`CB&tjC?S3y@A;29260M#;w|}|2EnD?4`MlV-ZS;6lJ$GTl}2w7@ukE+VtE#R z#rl1rRo>(r@GzDiDJOa4znuKCZe2k92kKw&LgJn5@=rXMc*O5=d&Cdn{9Cx6(dQ|| znf?J0o#dBn%AWql|Fr*V(`hgx_k@nw%Q+&fJ@C?md>xZm8g??zin zJ;VI*+8R6{f95?VTxo}-zW&;o^7l6SnMZyvF#KMDkq{Eku1w?dUObBNm;H)T9-FIZ$ztqT)^4s_c zgA2cu-`tJV1KSTNk6YwDKztPCmok4vpT)%Uj!w%dA-+u);w%sHp8Y@Uy?cOUS6%O0 zase}QMWaW(K{&coNhdvz>Ua0_^i0k4b7q?9mt8fFWMCe*sbo9rRKBx6N`jblk zMeU#A-?062jp`3iQ~#FtNlW*X{vPdT$NvVE{=WCy=W_KAEBzzpWc%kKrEh8dTmRki<1M8(wIAGidPM2p)qZgF4=DXd?$-M% zANmWWfBnl>(?6*6=M*g6@ux?X{?zweO@B=3*K7S7iX*p`{w;l8NB^wSdt1ssq4bFs z`adcC1#aB6{wJ0GoLAZQxca}T^m8rsd`IcG=seu~gze9SuCq&8&+wM=Go=rouzX@z z@9Qc3tj;S(zftLXzH)VYoId+f*ZyC#_wCa1&ur;Wha>ZD-s*S_Yx$bC(~U1-OXlx_ zj+dj4D*b8ivh&c<$CTco_jUAfrH9&Yjy|FEhje}}>O6FM^wWCm^DaKmu6KuP@BfIs zucI$&J#*8xyu*|=Avr~lIn>~n3s)wahq;8u;3-BLa6TK%Hf zLcdPw*St*o=Vxs_p3<*X`moyB+Li9&ptm!&e3#O1*ErVUMa$1!yWgX6%C0>%E&t&b z`kK-|(L&!)`t-y4y!u@CD1FV{SLf$_O8?;>(fOcpviB?fvs%Afr%rpnSM4eZt$$O? zFS_y?@BE+vC_KjPw@Uux&!!%A>Gx?| zu%o|2>Ce{Zb@V?~`d_*BX#c!Z>Dw*zcPYKs#RY5mEv3Io+cT{8*gsSH{+9c`Tj}R? zyj*+Uqx65$`wpwz`E#YevE_N+t8~Amp7$yJ`Py&J?(}}8zg6qm(s6l2>4Vx%M}Ji5 zzxAMq@D*ZcdTy!2@ zr}SUZ`RU4gO8-}#hly8OdExl{@9A^7@?Bc~tu1uN=ij;04=QK0{QDhU<6|7ZUHm26 zZ^JrI7Pb60lrMSjw|tyg$5C5shAr*zke-{jlbNrU*hq1pS$0$*}i#iLeeLx&y|(q=UUF? z_iT25zk9#A(B=1Sc7J~t?caTV_KR1a%kSIl{$76HX7~BKTI&02{EvxU@!8Mf`F5B8 zlIWGY`tScZ&pE&M;>vWr_3HBPqyF9f+xmX^*8S}6_i~2Y_a-EXT}%3VgS@04VLaWv zc>NmldG~lemESAcUH(u@f2~no_T#xS*S3^@ zV@v;SwA8=w^H(4)2=JGcEIZfcoV3hor3hm3iLX=OZosd80h<=9Tha zYZ=dVu9x{{Yx~~!UewZm{AA`;)`IBT9F1+l#u7Vq57yuW|FP{1Zz5m}`$dZ$kO#{}89H^!XpM{o~r{DgC;Z{R}Q{ zp``uq?(5uk%FPzozuT7WzF(A8(=GukQ0d!mv(LNrLOWhtO8*BpUY~uX8SlrG{xywdsqX{EpA^?Kim zt>5{_Or?BWrjxocucsX)7#E#eLu2l z%e&u=Q*z?vZr_-;7dT@6enQJ{{^)DXxog*M{cnTK?f+la|2Dt6=lkk^-dFaR-!pYs zaB*u-;``};-n;iC{&(ts!|&OX_}{7jCEmN|D*eyne7F9$#bo;T)c-ayY;`VkM2qA*8jFJCVW5rZ}@NaBzEh6i;wZV=nqc+Tcol7 zk^0}}-|b24*8evCc2DAeMgQCW|{}%s#PvZOOe;)ns{<=hO=I=WyPrvk! z&;NR0y;tAA3YCU`HQU`jcAT`CD8&@>;*U@0^xz?D!3Adz>7vX!*@=UQM5ESoywP zz2DT}%75dJEIkof+;NZA{|&XTyZhd!^nESDn!%b#&}eSJ^RgG&Dw zXTMkaLrQn=IdXo9hn3!^_Z?Py`IgeZtL-1w_s%%~$%gYAC?0%7%U^W%L~jAH)YuJ7w{<-er#AJz6dKZEn<-``TtlUn}zi&x`Tr!Ssy^FiDH zbuIsh-gn~_c3yo)>CbZgrv993RsZ;&&IdQXPLG^Ye}!x3v$g!|T|3q9;q=R=-Kq0X z-%r%8<)5ehw&SN&y7Ol`f0xrE@6qxb>gOER^1W^xV>|OtDSg@XgU+i{%7<23=u=96 zzS7-&o!;|t?YHfu^%tGj@-KGfRgZM~%CNS_`w6?=U3^}f_VcjLhljPE3)-K<+W$_E zdHIJ`pVM{ph?Z}CFW85a-l_Gw{(MyF&hNDNW-%lt44#wY%Uu88V4utJ=~wA(Z95(P*R_8(KW_CY7uWD+H|{!K z8!C^!uJ?80=TG?e{5vNA=p_k6QisI<03z_23PqdrEiq#l@%E`?f3H*%uwXOX;6f zyU6CxSU=~W(*H}pz2C-<*?t&S`U_vAd`$V(DW$jC7tbsGK5eJ7H`J8gYLB@`>8L)=X1|hQ~FQ0-1i=(e@Nfw;OutyEB$x$zMH>g z*UN)SZ?z{qr1Vc{J?_3+O5fJ^Gi=;t<<4VD|8e)ccU$_CN`H;o=UjWP(W(F2E%fV@ ze%if1LHn&;>1SK$gG&EX*PnOV`#QPsXbauhu|Cs6U(Rrt}?u zl+s_WbZ6He)_L+PO3!OO-Z$)geudKSZs~_#Rr5k9MowVcW__yO{ zPw0EQ-0x63e)g1)YWd%^^V;FuXa25T-|ly=A5lJ+{hXz5KgB-pw$i+1) zf8rl){To_;LdWMxrF(yB$NxH|->|0TmF_8hZ%XOEZ_BqU{agB6?svDll>XG8u;tzF zQx7WrnOcwged=MQFS_T_-?Mi7_<8O-h1a_Ve(=mhSlRe{=6;+qC_#sP#YP zP1^o9TKbyOYg*5?KCfG6*ST@|yu~l~Yx(M+<UsD>bUe- zTghxrSwg0kL#Z~r6+YhyWcl=`)g7k zFKYQ)^}e3Av!wK2)A``m(VEiVqV%nH+n*asZ`b+ee)s$yr5D`$_;kH&D*fCK+y38D z`ol`EDc#$$XD&|L%9;pLF-te%R3a zen;tt+3Vc@w~w)3`GcdM*LsF@ z938!+^rMas=s2z^{Tc7D{AyF__bC0n_t^e-_1v%Yldk@(?f(ar{*$_{-S1*Q z55LKdSC`WNyL&&T(oZSkXKIP`2*7Km!U+ws_(jQX#UpjuM^oL#j`n>La zrdvwy(DmZzf3EcXy1pF!5v3nf`r=nC4*8JM%PsZe$})fVIJu_ybX)1)soDN<`0>+9 ze~ZdfM}J)D?|J3b1Fjz4MR5jQ?`C?RR?3-*0MiP!b<-oC!XR?~j({q>QAB>%*Mm%;R>^JG%kJ#&748h0wUh-Rib~qu)`+NI+;Qx*nvgWB?Ol8# zosjg%l9qop^^-pM3|rsk{rw3^x4l@eZyup9jwBxa8||;HzQhLUj#c~p#>mlxq!+O9 z##}kqYdi~~U#)DLM-}d$)e%ts^;w~Mp?SJ5U(zCVwUYYqq`jp;( z>pcBOx?AVN)(bf&z2FVDzqWs`FCpnpoevxDp?^vL;>P#S=}%IqFq@UCJ5^q18kn|_|e2F)4PI?*R zx%~+7@@M-^x{vnmj`x2J*Y7^xW`4-|;={*H8tk{R&%^)sao*>7Jn`Vy?06);NByL~ z()$hn+u?+yFYEc@+XoYp?$Gf_{Lx@S(kt9}e2M2Jy@B&>egt*%Z#gGD)zkU&Mb;L3m|EAXeUs=zj z$K3q;3iFdR{-5o98vZN3C+*k!Z-4bDzh8Yc@dtXp?N@M4dPMtU@gI&RB(3Or+x!gk zkMv>MBkdgi1oe@=?AFUo>BJ@}Qhv4dOxj0!iC*vhP&y&$nDT?gYiS?pjrx7!hBUtg zmrkU$eOsS{KagIc{k`}Hw1@PDf3eTI_#w_o?{xg&cex+wZEn83nfgiZcjte|Iq93q zUl#w2b5ggikHtUcob=Q+TmRPIP#@_5$N%0>`$^Bz?-xHwdD5qp|80C4{z=-Kv)6B* zO(!H>)aR8xlfOIkeEYS0PkN{J|Ki74AEYOhpV`vi``%x=??1-(r0b`2eg4j1Vw?1< zj$ii-CN@d0({m5rE$L@;ez^L2wEY`D2Y)2Zx&Cg_-=xR1zqY>2Iq7w-|EoMN=}Xty z@!$9i&r5or_RrQE=`Yf<&NuJ*@Eg+KepJUR!}=!utM=FSM-C?>{k+cq;aga5q;G5a z#7`bdNP4aEqs`Z{o=6L~+2!``3xfSXUxJe2TA zE80Hq^;}Q-KXJrMeOuq`Pe^*Uo+o_TPx^|E&*C}ygYcflW|Pr3R3652}|)b+IS-s1^L@B0_!7mp#&NcZdd_C9?)A*rVK zTl@y&Mfy7R?cN{t^dWn``6}ig>A(~~ko_`?uVlTGE-=1wp6EPk(n}m3gx4iV59s__ z>^_!|G^y*`dpXZTT6F9EbIdQ&lJ<{`nf$$7=lj;{kpHCby7758*OH!oFY*-mV@rSU zdo`VJiQiy+No!i);_vc&q(6GI?T?M$J(7_0;~&%hc@y=MQf|Jy4E#VkrSitr|2D@T zBlsg}mG+zG|E1#u;~!7Fg!{?4_hR~&)UEYzY%w0Bk8pqU{U+a&X87Km-^)4aOZvUL z-%rv1lHcMxNy}Q__M5;@q`%VkZ2cDBlYaVMTYmW6;0Mw@T0Zd-+DF=OL3u|2WO%Z~GSHF{yvd;_dCi6Csa89cA+p+TA#yM$p)t)EbO#4Vb`b@3wkExH;!Sf3~+I;(QlkTJayYbUY=zsJ5 zJNTaT>}%}x!|&wzNe>*e=Ns?h*-1b70qvj9v9?KX*XP^*^gu$=sP^~fw+|;IJ)-k( z_(}Lb=?$*`KLXw%oz?Q*JLx~tFFStthQkSu^l>+T?;A{Pk)Blkyj?@SkdEnmTa1uD zq*rpi;P>sX@;zzO@q;}>iEYve<&TTMaU>z>ExNw8?xlXxzdC;N^R$OFtMzY_m-KIX zfA3npCw<+`pQms=>Do`({z?1-`W$IM=M#*G_aq-qbm;dRtE?Z=(|+HUUwkj^C+)r0 z&X28|k=Ho}29G7`k}0bN~K})r<9u$&St-zSwzbsHfk%(4I{0+vn}u z>kY?V>XR4{9Fcyu)Q;TUOabkV(3z5c*Hxhcd)C})3%xo+Op5! zL6XO2Pbc?wEp@GRo$rbc9$BjA^Z9bV5mZXurQT9sslPN(s+Ys4+{iadje4`()z*lf zo4zrf>JC@3(MaFf?z01Dd(QTr?H}p=%a_ic8Jo#u(>Ls;tK+@P!FrgFD}JpSmbf_%2rJW&rbe&acQ^+d2V?bk-+MzxM@JaNH>XmUwW*mNe<{vI zaj;e^N5zW2Rtc-MXf+P24Zm6p8YMrDgT}O9%LI)x^Hce-K9`rd0R4hcQSd2<(Nzk zC6fn}$&O_5`egE0GI=zaOeK?dCX*MEN!DvyGI=1GJf2J*NhUj!$>%1M>7-w&tq0X+ zrCf~~acR9C6!SrGB72H{ooM*;r6}t+=StyNDV&SLpyAg`QNwT6N@1=P)?!xM${nkh z%k@gVT#1_%1|;X#a!tPBl<~U5udXi?s>hF}j~~5$p)DUZ8`Yo@ug8sY+-R&f>*f9X zJKK5+Z9OO2`g3jlW1Srxv$ggiZ?Uwx2F|LUK-tFz;xx4*N!ecz>n zdmrC;@bQf|b+pC%JNLHrbnU%+Z(m>U$k^$V6Is6)tb~3~S65$GUw2nm*E9C|`87YF zk9~h-tx)l^*{S4>$$F44`%x|`=Yw*-P|b%cVWk*W2(BaXG4Fokm~8`>**Tk?dt3A>UwEZ` z85z%voSC1@Ok`n8#ZnYEY7Aq|XVTV-v?eZ9{YtPJHcHE3HQxa*$VK^}5SD{-NIwN@ z4VX$0Ow{J;fuE0qU^%J<)p)&{tA#Zwvn;bS(|}7fs{wpreS$TfktNL<9XZYFX2FlJ z;zyv5$Z9_a10X+htEBO)=f_?tYSy21p{w$&3*Dr?%H+(6*_qkw1pV(l{_78T`JfsF z`68eBAYYGawPrn7iW;SZ@G-CLhP7%`4RTR!{c;>tr+GFQ8%xqJPtA09`K(-@wd%82 zb4&F`E(ptzN^t8k%ef~Gi&efZ#kbcR6e&F?GdnZxH-gD(gU2gGjgbEF>(vo@VzeAB zouF@KXh)X5@f*?7Qn^`QYD7MZlm00eVpe__7J{+a>26XFsh8A8>L(454v_{)ho|PU z-J~8;FR72zPZ}T{A`Oxbcia)yI^aYdrADQr0^eAxlsk%Hq2qF`*iow%JK~jMM-VkS zqDG;kL8|2o-hr+)n9CY$W~~D@)RAkzZ%B=`#?j01v7^Q4SX+L{OR*YmDmRYYRBRk6 zavzvbU#Zck^}>oq8c~>roz zOX?%_lLkD$;qBd1Nqcck(vVlK4|xUhMN*}f-Uo|cqW?!qQDv;;S5Et@;Zztmr$d-s zln-YZ!EDJ7vk?!KtJK0`#jw0uRO^i^jaokR%ic5g>}^)VwUsE$3m2?1J-Bxelu7WX zMk$PwHwoW^@!bX6OQ%Wjxa&C{lO+6(<56LHaJ>V<>fnUO;deJd-%q-WbQ>u}Y9k#W zb&~Q?G8q;~)#U9>_**TCt4nb$7gP}uxkgma!!vSqI9d;>m%jHoc0;d>z&a;LlcZVF z8In&5NFgaAHA(BFTS$d!RLF((+$g;CR?;N5TjF>JDJ0M8t_792cE@V<@)CUzH0u#- zzg+g~^(LuK%9CIq_3{WbQk|41l}I6riAewhLjp!s7FTnL{{ig{YC*jg=c7g$HeDxG zxF=IIZmidW1tjSLai5Cfjz!h+9wFNZaFTDedT)(TOzQLKmgiXSiE5k-}w zZSk?Tc*vWAm%-ZiUTBLiwZ-ypXzwKRcNTtk3clIhHP|&ik{y|woH;o+3#^$K8J}qQ z#jdrswLJWSM=2s4*Lmh@+uAeso}_KGHii-P!t;BUDq%ONXDMvNGw|Fj&)k-4i>v<1 zdV~I@L!i`=SxqKrb-9RCh^x_R8U6#03H;leer{blE?BR?^SEyEioj4zZB)y zb94}5x>91z!7j=bCT_jCv>qd5IOR8)QpF`7!Q!`d^{%yb4UqasgKMnm zT)Z5twsmwBPSF2r)l|xltKGS^?g5^qC#W+Y3S}SZL9fI}E`NQs&W)q$1QM)TYc@JW zh9F8#WDspY;iwVB1)p_v6rg!*LMn(?ZeKfJSq3ZR${?$$7+wm(%$2~HVHs@K3zF=U zkN&=X;GpDsj(4oc2yYF(o{s_pLL=45JIF^BuQ_NeDul3fPD1J zM{i|fetvd-d}8#>$+kQ=*pnegtkI1n5Z0;>kBfu)3WE|d34?ehnTwjN#G0QAmKdy< z>DO3iuKO|)6t0!S#?;viX(DI#-vn!g$m{?))&())~^^o~8lPd>)Js&JJi$zM;ShK*eIt?0W z=EG>R!pP1uIcRfGZv=8}A)sl6DA$bX(rV)ZeSPTyi{_F@lui*RW#mIt?eJHOGzp3w ztHDyOBQ8`M9jj5H(7{rwFtz=mqb#6fpww3jRDFefyuiDOIdw#YMcgg0_0S+PgWGfu z@X_1D$3UNmi$PzyDK3Y(K=3G{yb#pm)gY+RkBxcxI2Wu1xpO5EERvg#bEO~;DvgRF zdx0rAzbaF@#taT~ahYqqT(yxd=72Qb^yop)D@Kj92aMnA0ngK10ICK;dm>!gn=ze( zQr7UiN_-H8&@4ARIxy`as?!&^>=M-4P_+@2;*)hS&IquqGU`{Fd^G&!(Pk;kk4LP~ z(5EIv*&-5WwjQqgvvQ+(gh(#yFW1AYUkS?srNE+otw%n3woXnwI87%_d!IFYe)*GdIw7Od2;`I=0n52;+aS#E)s_i_&_oV{7)u9?a3spDH#T9xpGbBS{ZH<`8irp33K%*7v#foU1%dB8b+8e z#gU0}Se%g4N%@$S4;hd6jO4PXX6I*O_-xUaQ(vy|!Gpy>PDA;KKEDDN>XoFd6uR6j_!cK(>k>NfE*M zrD`4+%S4S!<(NmP%SXJ#M>#L2^06czEQ3lgCm(`lf&wxW=E{(dJ|di##>arg+RAzBqdZyN)vZM*$cHapijB43=4nTSZ~ z>z0omBPqRhpx&6Q1u)dHWK$YRCxHCR;R?$oTCFaZ{N>QU0~LUl`i-T4Nhjl3%|&%M z_DWP=XZ&)@tRA>ag*E_PiZJausJs$g4wq#SN3viWvO4SZSh_7d`DM*0d;c7n?N~UZ#D|4L6pKa%rt9_ zPNqP)vIGXMW=@Tyy5~|oJ$-!i56q={2g&vKbWex=zvFN!CE6P3s1)Tz zGB#I3!KHQydyA6 zGtR76mLl+t02pvUch>~Sl_z8B=cCGKSe&fVLWFxDrlPt$6k6O^eZAI*W^0Wws?M=i zd&cL=O*$*X4T9>~Y<3Jg97{Y}Jr~uN8D&9AdDs?xDC0D`E}z*bs)`Ouhu8h0d`7jX zD)S<$)>xUMubb&k%}j9E18@WU5}Uj58I{Yc<}Me+6maQ+7zHkMtQmYDFrepRvMs)t zyqVAB&21gsh2H^Fz&FGZm_f{dgMBe@*1 zUxa-z5U$l08%UMzJ=_J15XjIyAfLTG@;T7Q{A}h-`J<_$DY?!&EBp|n+T_fQCxgbw z*c|2@0f2%QV(>*Z#|$hpY6m^oxQES*yeHEn?Ol$RV)RCoJkOvI&l?pjq0JNBL6q1i z=gH7|=$SsIHS91eX|Ie}NFVe<(N$%!q3-7Mb#%|vF*MLx>KG=*u~QS{eA}!S(_Rim zd&py2Q(h2>Ck&tww%_03 z(Joi~v51M1JBigJ%$=h1n&ne0SigEoK*Z{4L*suEMFp`v_TY@{#EwKM!9b^KdT@|Ami?(ve;EIJ~L-PN#m0J?8RR&=?jfW$^iLv3aS0ei7Ig%$aXF*W5%wdN9lP&iwd z6D$K<5mh^x6lI%Ft^>QEd;(rX?FPa$p^IvsOp388NjEcmh4C>?NvlNuke1VgQxpFM{u5Lb8gAh#| z9xK8Tg$GNh2>m|V0B=D}Mnyr#LkF;xzBIh9B2u%C?mj+o7Um4cMo`Nq zmb_fhc02gGSj1Z9mj&PCmKPR;xxj5OG66Br2o@IPd*lT0cfp9aB_tYL&TvJe!C-!e z)gqDWVXo1B{Q8R>`;6x036$v;>6MDGO$mm<8rX;`%!(N0ik^mhAvHj7zHm-qLP3mt z4DWyyGVPcV^#~<5gt^8YMki^P=IqNfP%gU7XOH>pHJ^Rvv)_CUTx=pu2F>T;wpf(M zP6Hao41Wf%fmCEg$Ngg?Gh-7|Cuc{_jodOfGCn>rJ{CpGA<|JkSr_mnqiKS{N!qf}ewRW=^y!m=2SX z$X|L@_zWBXULl~KI_^!6S;Y;fjz^LdN; zy!B%9&bIS+pYQ4K?>^in7Khc0=-tdEgi|AvoyVty?WDiEr*33vT`bV~REnpsrBf-R zspsIDh*?0ks9MY?L0tlZ!vMWpS+w-*cvKfjOWi^p7v{U$greg2$*%`FclT?Yt19k6Dfh)6TvNwu5@65~?tScAbsS>zRIfu8A z<}k2whW%g}BNTotW8RsZ^+Y#>Wq0<3gKq91AFt&~!A2r4qV0gp?V;TF^ zi87Wr&=DLAyD0FeS&gF8=o4r)(-;k6AI~-VOqer9#-KXQdcm4BjX@PQIg6TDUH3Dr zI4q5-XJznKzJPHSN z@jOCwxmoj!g|rbF)|8LMmQWTuUv8Nd!1Jsil9I+4BuEH^#K9=RSROG6Va<_MpG+Ft zkboi-VUUp6hmsT6K*~{d)>v|?XY5&E53FbaepSpQ6hX}|AiftCPEXvjuplNm)N8oS z3D%)iOmxmKu!iu@1k8rI*hA{U!h*4Ua4?n(D&RX2 z{qTR$+8L}IFb#xo#Hv_HGYgVp#u)1C#F16Q7%5+!sh0&Evz#Y+@{w{w4l_~B$7lyo zuSPXFFkI%03Brx6&MW3K;rzn#P<*hl;x>r660`VvRL7XaSyQ}v!jljOSW;J0IC$?! zF>=9LTRegRJl|n4jJOv0vt6*TVAY(qcub0PS|B6J3mT~BiO*v1nHqQvzo1N00YU-* zO2$htpYe>roOKjb)2PMmGQszGZ7b=vm4n=Y4g{S5e&B4PSjL2Mm|BLc4PeN^gCXh9 zCV5yykgwt+3JZlXqmAY#r@b?1hgMn^qPSB`sc;S9+}I|1L2*1jXu+6q@OLq-v4}JZ zP3+fTQp{rTQXD(WIHmKrp|RSUL$Hp+T^tf(DI?+mtD2D{%UD^OSSVoFNX(Qmw5+A9 zsYQ$~3^-^EC{$ogGC7v)D#p-;&8@s_*Jj18KM*Qypsi*(iE0IFMqL)oIJGRAXiA_U z>q6LH(2LL%5O>}lZea*y1Y|fmkgs7ZXTT$Fo}a{M#nXbUq?0pEqYH{91~ZH~^bg1Z zQ;Zxy8WVW~NARAfaGx`8xq2w@gN0gsxu>JQqpxGY9(wJe-yROx!=ODJ_A6`PdBE!$ zGGUOzQlWbw!qo-dpP5}4o1L1Sr*0Yuus}SBY!?Br1WS-1o2*V}6gaqP&2ntuWiAI+ zE-_iaIdv8_eZ<75H^A3oL&B(8HQs5MHp?%no{Tca#?#f^gS%wl&{8l_I8i*gBDjXK z%O_B@#Qs3QPhFr5AwNxAeCq`Lh{tc82p@y?$Ag?Xwq1{Hs8MRiQ{R2W_*pm}7N<*J z&k^Ht;b_nMju`JtU!R^295IfVK91t;@9RHed@^!0=eTDRS5+^Ys$b##{)CrRSe@#{!C>t^vQRQ&F0EU1+Bh{jTL30tq3*@m!@Q8q( z6O0kw=f(+o=>($o1h!k`kRMD5VQK;rhQ z`)h_Z*O&B|(_`KpL;HQK$0a<${GrU+iAPEb39B9>o6S)nt|gb-`T>Q+jk{+?yYnIgRO6*tw^Gubo9Is(acqep=v` zfP@JAR273%K7B!qj|3`U$yxlL15R^n6*3^__d3UDIwPT zroF%-v1)`kW$uk(`w7aE(LCcIbJ$wyCe{FDlTi*K0>}a2R6#bOoLhTOur`8Gw+j0n z6`=ww8^r)wi3-uEC|{h9A!tyxL2kHqK^@}~mj&aWKzI-=FwjdK{hhOFnk4aJIZawAgYu zhxaI6n8V5ii$Ez7%NJIziX2(*jcmv~^@~_@FtdSE&Po(i^LA=&AYJ3G3&g`+8tU&A zSbx*Asp!5epJUg7~aRl#K8p>$MH)Noy3tzGVzzM0*$o zBZ<;31~t%~F^&Q6j0sJm9z<}0*XGX5Pv8?`;flx*xF+k57#mR$#74r}2Tr1lAxb0y zff27Zh>S3LA>t9x-v(~L!i3dKWQar{>_9gz6wOacN%WIMoY3sJ)~r$&a#YqOy@CT3 z{WypXSR<Jap+tUfOZ17B1g2B;KC5ZHg#xKMSV4=p{@f{22KK@x2*OR}ZFeah~yiOy`kZS3#ch0?VOc zG27CrJ+73CQKwm$%)?H(2j@#ohK>~o=nCp<{auF%Fz7aJvXPlvepa+;`U(FRk!-q()8&O&i&o*j0K-Sm=u^ZXg2IhoB zv`EBH3Ku>9Q<7gnMw@{X4;|N~2v=AR8!4Qg#;`utWN}Q6w~wO*pPV260X-%}8u1`V zT)8@^qi6;K4H-vc@nZbv=4a2}QjJ(*#9ILU4gdzbNxcdaIU1bUt3a_=kfM|kjEM6t zCHe803@p16SP0nNrN?eP9Bp+LW@;$85wFJtXBuPcx$=nz+6!%`ib0oeYo75VUHbr34z8jCdJEyfLcy3Ft?VQlm8MrutFe zE1?#rlRbTX-F@OEG~Ip%P^I?Tfj$GUu;Sq$Hl{ca3!pJ>Vlb7kDx!$mt)9T7XKo;2 zC|qA%v;Q#~l*=8YTI|NoPwxDN{b4yVloESN`DHf_rykoV3#2buzN{V5Thf(%;q-M`J(<7Ol36$N+KGs3)dDjC`YF$>`W8?npc$dEjc( zI!8oz@|YX@_8#;^%3}PJj;evSu?b5202B;bB9+A;2%zPH3*zCFu-~qO9u@(Cqc~d? zmtvmc$zwu#?KGiA={F#(F(eYnon`@Gnu_X!;>(e~HojCW2E}x{;^BR!w?rYndk5JT zYaQacb@f!z=m~k_cbO9AaDtAUrlEpf&zYbXle0!eQE-gOBgl_p?eZ7S`lV5VD3{~r zayZ7*hQj4emzsHOSov@oqu;vt*HCte#RQ+u_)9EgdLqJHD0#4=!EOQ;v1#S; zfeKi~Xqa4BP~aBBpfDw3*r^wd;t2sJhC@cf3=Ad!YhgEU9Myh4wy=Od93euG5qPqJ z<$nQ>zu}MzAdCg#btG<=kt5;}Fd!Z&CLA!ft$w)}mvSe^!)ytB>MHMzA12(CZBm?GSj*-D4S~Xt*L31X9A2JunS70|= z<~9p58MBnJIbxi$YCRf&W!)0>Ys8Gnus2HN1rwTb0zHj)2X0`|E@M?rNg0U|mhXs? zA|ob3laX!_W@V75L8<~#B#78hOh!Z!-u{${r9ug_8K!YHmZ@bj*e(KTc}gn8ib6yK z&<^I=cDp!+tbY@6FTmAU7Y)1ME4GFpN;;P+HRB=fL?B!Mlcw1-cS(S%fuIET5^Dzr zb=a}PfKWiHr?$p|<$89~RI32a92F%8A$!&MAr1HnfmBJz8^j_zWj z(Qrv}JF(1g3+&UjFfl$7;7~vl#OTTNp(XGUc?!JxgnYV;+|*FG2h1Kvm3)OJh_@PT zYz^3Ltf}~CBQyQ+#DL;b%`k`4pQjVoh4LuMSRQ4js1a@Qqz*lsphC0*z$uGboYg!? zm@{!~fCLbwcbCC+@@sn&%GCWZG3H?}!(Go&#{)F=-? z+Tm@n?FT8ClKE<`uu%*GJAn<|0|rx)>+LbQc^Q7gJOz$e#A&a{qIHVpD>wnJ#>2MS*xC$OMLn%A7Y(O1y82l*#{^Y!ao`F2ncaT^&7(Y3JtQ%Pa5k~=^^6Fdk% zFuC3yauaJ3dB{+jy#X0h9ROE?OT|noIJ7J~(G-7@Rm{Y0Ti7@TTz04D$E&ef2@B_l zJ)A5|$fR+W(}^|9rRLZh$+u_4trbhWNwX&IZSmAJ>6?a_5ixGS2s8&|ROMp~ zA&&bM4nIzWDK<*_=p=OboHacEM}YcS?-k-J+UW z4P3bBq%n}9R&>~5TG&Cl3kyt_5$kJ4D2hu6AGC2()A5?ikaLZO7lT{Gq{wrTL&Ws< z03{0xB|P*RY1Rn~LH{aS`|~m(`DYVIZ%F2^pD`2~iO6 zfX5LU+7Bjvsn2MY^%S^FbA)3WOl(-QfMSixqqxo4sN7TmKb6{h+3oCd>n2*sJdx~Q zOPL20c3>l<#FA@iOkY5xEb0|D9xjC}5Cb!9OC@4q)WmXUu$p*`Tg)thLxY!|lMw}I z!q@~+s`rC<_V3$!T2R4=aCtfnYm?adec55v>Emm+Irf0C^F(MoWN333Z`tvUWRodW zfkoF-Bk;e*d0 z7^9hph#3>*ApZS;ZI=WDVSj1Hl9!r7th2)2tc>! z*ybeWP;xfnP;&N)e8k4?x67q(K%P+E&|3{5N=`-rCiOgp_x+5NN5B% z?rNWg=&P-Ce!D}l&{9e!$7g$WEb(~5^feXJsjjoD8TF{s7NFkvsZ?Bs3* zrFgR6nEofnJm*?+Y}}NYh@nMkI#j92{4~Qy=aCaV%-Wk}+^ofUesXSNdOX!V(1jft zSRqzru|5y>X%1`iE=w~d%$5;jbrvCw(To)@yHZD{#_-l!i*m@GVVhgQ9jrM7rOg!! zF1Nyq2`o*56z1{EvZ6qiSa1d4ONc_6_$WNd#tufGfHMWoV7o&2rHp&iY7Rz&7NIaf zC@*GNu_Upkm%N+XuAut`fL|R@gPs~Vd{3n=OIOZfbksTDM1Mn}5@-Wsm%EBV*G5r_ z!o1gN@G04eL3?ELW06RTA&G)&s8%3RHcmmP z$0^imc%6i6qL#5)NFUy45UL|cUhLxNU($aPHxGXkCx;Dqw>EF9Ysofw13j_7qr{=B zXcR~qq=JTtG|jVA;6e*VEZpE_)?N((Gi+>H|q0!AR#D$vmg=teY0I1lT3 zg&4>T-&TwGK-o)$Sy4JN9+9ZZjPWKLEe7X1!ABPK8$6`bbxw+{v+UOTHYdQwB2H-N6$-_^x`GI{4Jln}B+cJ|Cg(|3@pPm}mh>i1eK#X~_ z9m_S#M6>3^k|7$SRg?_Rv03mT8v%^^#28A*t9WBHYZNH8=Ziik+kTu{#p)6rijHT4 zAA37FoHFt6f^GDH$fAZ}gCOh`l&6E+VME&F-4f^>B40Xq8x0H+(N_~gLAwMc8;{mL z>Sdi7vwUw?fA=A~-B(sO(?yUptBt*CoW$*Fc<(^W=^CD^SBuUpiwZP@>Wi2NkUcJo z2Swx__ZNkTRmkvyvYXiScwtGoJc$)u>zyqWV!Pf(WOW#&2plZxzjT~chS(~#gu6?0 zg<{SGj|eO=>X6+N$6}CBXjW%l!b?OOlJKFpL*Cm|A@;(P*dt>PcNS`1P$3(LJ?hRa zqxV!tiH2qs$LSq4Va~)0Vr8f2B?=>}5gk|brnK}~1*Hd>bAt zp##LCZj~#V!yY4^k8lye;ot@nIpT@0K?VydXj8RSCz>HzQc)nuc%KwCug(sBV!Yzyy9k`=zC0&`uYK{-C}c5p$>Z1 z>N9ku&x!>4n!N!Xyt_k;XxQ)wSn;roVe-SJUIVGpC00I)8ZP=FyP(bF0>JPEo9~QW zgcWR#Vv~Y_n94*VoMZYBvthCmD3?0z#2YXb%G(iefLhVPL!V_sA(Lf_K|~#cm#h#a zR$)+yNPxz6Q>GkmZV+a!TAE}Hw6gkog%Dp#%1nh%H|v&aT;(3kArD2}Cx{povMi4Q@lDW-W-s zTv#ys%`-BltRb;1VP6&JoQYAMtS%VT0uLv?MBD`yOxxgJqe&IwPG+RUlgK`jIyOs@ zKkaIs$nP8KI7gg~)tF88tgMB0kzHd%e8O@hi?SGuRM%03oCb8%0a;|2Y_hgif1^!W zA*%>Pp2F%wz>A6)gyGF5e!wU%DZc=V#35(^H*cpwLr3U)?gUT%38DrMIxih zvC)g-5)ZV@x`^^t8&R7pd#p_89AOC-v=Y@~s|m3(qdW;WF`3;PluXNvrepzz$+BC6 zg`z>qqF&X25)B{-k0Q)md@@Wdt0bAnv>K7@-6O&QBt(qt7RrD#YGzb}} z1cYA|uZI;$;){q1De++(wGLe3Dvq@~4ZfXyi~855QQ{ra)h@_}IB4Q-_JhdeB`PvW zEO@LN?Zn_no5fH_%O++7K8%=L5Pw`dqW>eK`V=y9j3i97C!P9fp78?&8US?WKrw*~t7PQ-rI3k=8yw5810+HNoX_s(NIe5)leuTH7;O!6| zMR3+xUMlFZbz!oaLP;sFr?P}9O5|Kh;FjoBnJbD_Y&9#iC<)c+)M#&$?H?GO8aX}D z6H8E!%`WZEqINkd<#*Ulm}mT$Z^rj=MVoSATk>unxEcy18+I^_Yu-*D%SH*4g^3vD z2amn%b@Zz@H@uP==K^XN*WT2 zrBdC(X4)*eh5K#>P>`1!QI8xZVLuYqgS{SDsgsuQI2?7kbAWr(cvZ6Ivt#oOUKc4A z1gnWyZ6d?A)S1IXRZdhNp;nBQBsHcDM(4ct>z@dSj!@Y<5 z%oaPRPRK?vu?u9Z&+*(mib}najd)Pq17o^Ptn%Cf*J8l#HlERWUKIBk+r3Y~N-fm2 zRx9!14;%D@wy{GuE{t<{ACR}Oq+DQU4ayR>bNUxsnY<>A6Hz4Cog`)Cp|bu`F*iyi z+X(s$R(#p4s%46@nrXEZMFYYbCGaVv-|{PjUGZj0#>2e+t0)`sWE+1~Vs9i|QQj=b zZ0M-rvvE2Cm#V%X3PE6i{f<+Iy?*8jBEzl!$V1`dy#`g8=~i*!og_Sf=1n+J+Sr(F zM3Lr;IYO6AnAt8=&sz@)Vp|qHV1GM$(-l=_)N6nIo)?Kb34K5SXQ$|1<~;~bAF@89 zPKjIJD=sJX7U|ByG4YT}K!WI`qB|x;7bte=e zW>Vui7v8%HmgVh%=6wzOcBxc#TF?CCD|yGDd6|UuJL!FhPm^~O4)mF~$sy5X&!dgT zPp9N5tZ!@Yjv|Pz!&@9s0ofLXELde#6;&5=@`Tt&ROXmys@O9@a)jQosSvCaEHj5S zFfq(a9s{E>z>sH`u~mP_XMv_7`p!+Ul2y}TUHExj0Oy#e6V?1|K{TVRFia+le^abWQ}8sMul{lD(DD!Za^I^Q+T%g@bT`7ybszb41p!mKIJ)m_Y^>g+hW6T;3?b zLxc;cGuWHhQOTAKtkLo&+e2ozY&X&K>@JAeW5zo^V|LP*t*zXT4Y8Bs^UmAk`b6kO z)*x+@D1%iNifOYj5->k@D2o<&Pa;#>xT1D;qu|L?4~F$0Ngo(h2l>@00#66Wm!MD< z5ZYrN^abW6C=GsPGzkV@?jpW>uK)yxukPqRblOgyj@`-AlU6CR$X4^l$6)go0~PSz1Sod}`0+wBsQolc@Du|slN z<`@c-!(02{MrPjWPDzHiT9&+1M8tPv`T;FK`axAEV885*HwqJ)3&B7(Z+tkKH=!h& zH$EWEo0uo7VJ*o!2<2@7{xW)qScBbGK9jdfmI;GUEz4ZX7?)G%cCuO1XjB4-7(4Yq zf&Ardc4$H3FeXC9?G_N9(@q}W)n#mjxYI?~!TxRhQ>M+rghT}rT<fTE=uuiR8}f6d6c%1^1zu9IhNcLb3QbU#C{?ssOxqlYuK^<&<(d%n zw%hkv#Af|a)4OD)_^HO!E0qOzd5XJ`bx0OlUi7F+bFCP4_jKEMhc&_q0mi6M0(++? zGZSnwXXnD1kt`80d?lMH^zhwg~amgc#G2AyYf9ER|GSQ<}R3EA*veXN;ZTe z0?iD~H){*bS5{+P-tvQbYhAvwn>tKoj8O{w<4ps4#I$y%s%p_4Y{a~|;`!_g=T$&# z=WTcfIm+vNku8+M{6bu)iRxzR^WH`D1dMck0d`oK7fmqJ+tHyt~$I-s+@^gtjSA8#b0If z_6-`SH&rPn3LO33>D5^BptmUnU?U{p&g#ZFD)t;sw2oX5*f85q%?;tMS!u&Ai4J4Xgk{Rpi?Cwo zQF6`^3BxeM2yIZ9ZE$RSNnk;cfySPPEp=+@+tYcN&OUCG9 zqF>V7-Y_R4W>noWPDpt`akc?%EO<6fDLS1M&ctq5)h3K@@J7UpYdt|Xcw*yJx6lpV z$*~wrYWABEaj^?k0(;S> zSA4wM@{S>SAr=UloFG}|?25z@8l`VXxs&Tua~m};s1em|bY82LlT*7-rY7|pOw3CW zY|`iwRu2VXibQm~bgd%G>mKBZO|iMCCalk@ZS*IWl-Ne;q34Zfr%zZ#j}y8|W9#M- zx{;`j($F1MPfjq0B260Wrb>KDRt8`?te?+JWvO16AneK7N=*ZB?pT?tN}jM~ltQL_ zbH_Ji-AAgUl`KNT41@<=(;WzJbGs zdUn5Q#lAd^*I#9)#%q}-?@Bqo3lI04LjYki=}RjzabHI zaB=JI!N(y!GPAn^258h1Bs~h43$zopWk-FpSLzr^;H}e=%v)Tn2TV5oif-2-v6J{; z^u+2eD0k9+)$UBaL0IUy$3kY}zO$Aa;`KJWJYv@CB=azhyJ<(u$gwwDBoV!eB)Foz*4RN}cAa^> z%=MT6JoY|{&S?aeahb_(8I(nKUs;O>yNJqVc?o2-S%F93#pFcH5%y#ZrQR4PFyP4E zbsU>(My{O0IwbEFusWF9AgozJ+&2MpTuc?`gpZ4qGb$M>kZ4Ow>#}Az5y4InKg`FR06!t`nNeidLWq-NJ4(R*>`{u-{BrpFfTK^bLl~&6mz+|v0vAHFn z0|5P)qpfdF+2ENg%0%1k?5h=1x@=pGW8NcTw5q0{E#mBq{s331vHey$TP=WSN9G-W zCnWqqqAKc*PC;n$CP(%=2+)+;E)$XBCq6$&5vTpL-!{Tq5c!=5-d;m84no-oa~rjChIAa zGo#AsI2i93SBcxB&Uc~;5dXu&qV?p(0ZnNgJFFzu(CVNPHs`jJB2=87W#6Z?qgxqHx^t$U zGn7&`3fsF`K5;N_K8l&Ez>b@T1+@B|^N2qVEwf2r3AS9Ph zo=hSl5Qt{)wdb6x^G_b&Y7B{x&(>sbYEr7cDSFPa@eJ9-b@$nMe9!gknWxiBbMwoK zb5@UuQk9EK^K&zcmOJmFT6-^Q5|Is~nz)rA!nBGyQ!zlhj!p>!yvdZxB$GE<1I)i= zG?m#50Ym^}V)dR#QHJbX7{eLjJ|cjHG*f8BKwW{{kJTd;N69CIkxQL80snFqkNh(> zW$DhMz4l3_wao+QwdIlyTo z(w#+RQiLi9DZhk_g&zj61S_@`R4}p5kjs1y3O7>|I!m>epjFdA{32b_pm4Nt!FUny zOIEW)FhGmBQGJ?=PhyS;T=zVf%lCLT+zUi_DR;{#xK%=L5H1Xz!~UbY;eGy|hS+dj z)u5mEFZbnvypYMT2*8dWmj?i1*@aEsG~~QDD3{E%u#&d!;~Sw4AVo<4jQK!7 z>T7Ey^O{Er12ejiBlVj2A2Vi2=Ac z6sqad+RJ#NPK$=-Q;|L=G7(-!N^s8D-&E3u>=TwG4+HR z;1)Hg+8Ux-7C5*m)MuhDFrL6ZUWOq720Tw!#iv@-nh8j(TFYD-1fO-m{6VcQRYE1_ z3D8gxqPF>lgCsuar-+6*KS@+FJUyZ(d;tO}{8WF^G_+_zpDUc({aEO}XDnJnBbRb} zSgC>f6A@j$k3Za3B^!YgNX(aU;QzMZJ)X4@1O5x#!dqudlviSm5exFURcC(jo{CS2 zjN;ekaU}xk#2^$W5-M0;louzDm~J035ubt}8wmw4@r=0!`-DMvD$2r*(8FaL4OeWT z(KRRkIV(#7sN6Xiw8+~CL|qvQ9YRN;W++GGyAMDBddBIK(xpK*;T`)6L$5-NHajvT zJN9sEpPZ}1&i3CoagH6lqT;5r*zMheO`5UBr~S>X*YMoP%nDA*7$9$31( zD%2UEW(J$(*^?DNm4}Qc!eHmNF(Ej~j;?5wlGb8hMRzgdPKkwEE?7yX!c`8M(aoE6 z5gOH)SMZz@

;?Abm}OhCB9jH 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

cjC7{x#%`kPR8GPkBQGDWyP6^fGo#nEmQ{oExU+ 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 z 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
    qMJS)wU&^uc2f<$d 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%0Af(TghqHAnXO~7q-fwdvRT=(!Yo}JAqw*$ZuCU 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%0Aak{0zTxC1Sl}y0 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 z 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" - }, - "os": [ - "win32" - ], - "cpu": [ - "x64" - ] -} diff --git a/node_modules/@isaacs/cliui/LICENSE.txt b/node_modules/@isaacs/cliui/LICENSE.txt deleted file mode 100644 index c7e2747..0000000 --- a/node_modules/@isaacs/cliui/LICENSE.txt +++ /dev/null @@ -1,14 +0,0 @@ -Copyright (c) 2015, Contributors - -Permission to use, copy, modify, and/or distribute this software -for any purpose with or without fee is hereby granted, provided -that the above copyright notice and this permission notice -appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE -LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES -OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/@isaacs/cliui/README.md b/node_modules/@isaacs/cliui/README.md deleted file mode 100644 index 4880642..0000000 --- a/node_modules/@isaacs/cliui/README.md +++ /dev/null @@ -1,143 +0,0 @@ -# @isaacs/cliui - -Temporary fork of [cliui](http://npm.im/cliui). - -![ci](https://github.com/yargs/cliui/workflows/ci/badge.svg) -[![NPM version](https://img.shields.io/npm/v/cliui.svg)](https://www.npmjs.com/package/cliui) -[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) -![nycrc config on GitHub](https://img.shields.io/nycrc/yargs/cliui) - -easily create complex multi-column command-line-interfaces. - -## Example - -```js -const ui = require('cliui')() - -ui.div('Usage: $0 [command] [options]') - -ui.div({ - text: 'Options:', - padding: [2, 0, 1, 0] -}) - -ui.div( - { - text: "-f, --file", - width: 20, - padding: [0, 4, 0, 4] - }, - { - text: "the file to load." + - chalk.green("(if this description is long it wraps).") - , - width: 20 - }, - { - text: chalk.red("[required]"), - align: 'right' - } -) - -console.log(ui.toString()) -``` - -## Deno/ESM Support - -As of `v7` `cliui` supports [Deno](https://github.com/denoland/deno) and -[ESM](https://nodejs.org/api/esm.html#esm_ecmascript_modules): - -```typescript -import cliui from "https://deno.land/x/cliui/deno.ts"; - -const ui = cliui({}) - -ui.div('Usage: $0 [command] [options]') - -ui.div({ - text: 'Options:', - padding: [2, 0, 1, 0] -}) - -ui.div({ - text: "-f, --file", - width: 20, - padding: [0, 4, 0, 4] -}) - -console.log(ui.toString()) -``` - - - -## Layout DSL - -cliui exposes a simple layout DSL: - -If you create a single `ui.div`, passing a string rather than an -object: - -* `\n`: characters will be interpreted as new rows. -* `\t`: characters will be interpreted as new columns. -* `\s`: characters will be interpreted as padding. - -**as an example...** - -```js -var ui = require('./')({ - width: 60 -}) - -ui.div( - 'Usage: node ./bin/foo.js\n' + - ' \t provide a regex\n' + - ' \t provide a glob\t [required]' -) - -console.log(ui.toString()) -``` - -**will output:** - -```shell -Usage: node ./bin/foo.js - provide a regex - provide a glob [required] -``` - -## Methods - -```js -cliui = require('cliui') -``` - -### cliui({width: integer}) - -Specify the maximum width of the UI being generated. -If no width is provided, cliui will try to get the current window's width and use it, and if that doesn't work, width will be set to `80`. - -### cliui({wrap: boolean}) - -Enable or disable the wrapping of text in a column. - -### cliui.div(column, column, column) - -Create a row with any number of columns, a column -can either be a string, or an object with the following -options: - -* **text:** some text to place in the column. -* **width:** the width of a column. -* **align:** alignment, `right` or `center`. -* **padding:** `[top, right, bottom, left]`. -* **border:** should a border be placed around the div? - -### cliui.span(column, column, column) - -Similar to `div`, except the next row will be appended without -a new line being created. - -### cliui.resetOutput() - -Resets the UI elements of the current cliui instance, maintaining the values -set for `width` and `wrap`. diff --git a/node_modules/@isaacs/cliui/build/index.cjs b/node_modules/@isaacs/cliui/build/index.cjs deleted file mode 100644 index aca2b85..0000000 --- a/node_modules/@isaacs/cliui/build/index.cjs +++ /dev/null @@ -1,317 +0,0 @@ -'use strict'; - -const align = { - right: alignRight, - center: alignCenter -}; -const top = 0; -const right = 1; -const bottom = 2; -const left = 3; -class UI { - constructor(opts) { - var _a; - this.width = opts.width; - /* c8 ignore start */ - this.wrap = (_a = opts.wrap) !== null && _a !== void 0 ? _a : true; - /* c8 ignore stop */ - this.rows = []; - } - span(...args) { - const cols = this.div(...args); - cols.span = true; - } - resetOutput() { - this.rows = []; - } - div(...args) { - if (args.length === 0) { - this.div(''); - } - if (this.wrap && this.shouldApplyLayoutDSL(...args) && typeof args[0] === 'string') { - return this.applyLayoutDSL(args[0]); - } - const cols = args.map(arg => { - if (typeof arg === 'string') { - return this.colFromString(arg); - } - return arg; - }); - this.rows.push(cols); - return cols; - } - shouldApplyLayoutDSL(...args) { - return args.length === 1 && typeof args[0] === 'string' && - /[\t\n]/.test(args[0]); - } - applyLayoutDSL(str) { - const rows = str.split('\n').map(row => row.split('\t')); - let leftColumnWidth = 0; - // simple heuristic for layout, make sure the - // second column lines up along the left-hand. - // don't allow the first column to take up more - // than 50% of the screen. - rows.forEach(columns => { - if (columns.length > 1 && mixin.stringWidth(columns[0]) > leftColumnWidth) { - leftColumnWidth = Math.min(Math.floor(this.width * 0.5), mixin.stringWidth(columns[0])); - } - }); - // generate a table: - // replacing ' ' with padding calculations. - // using the algorithmically generated width. - rows.forEach(columns => { - this.div(...columns.map((r, i) => { - return { - text: r.trim(), - padding: this.measurePadding(r), - width: (i === 0 && columns.length > 1) ? leftColumnWidth : undefined - }; - })); - }); - return this.rows[this.rows.length - 1]; - } - colFromString(text) { - return { - text, - padding: this.measurePadding(text) - }; - } - measurePadding(str) { - // measure padding without ansi escape codes - const noAnsi = mixin.stripAnsi(str); - return [0, noAnsi.match(/\s*$/)[0].length, 0, noAnsi.match(/^\s*/)[0].length]; - } - toString() { - const lines = []; - this.rows.forEach(row => { - this.rowToString(row, lines); - }); - // don't display any lines with the - // hidden flag set. - return lines - .filter(line => !line.hidden) - .map(line => line.text) - .join('\n'); - } - rowToString(row, lines) { - this.rasterize(row).forEach((rrow, r) => { - let str = ''; - rrow.forEach((col, c) => { - const { width } = row[c]; // the width with padding. - const wrapWidth = this.negatePadding(row[c]); // the width without padding. - let ts = col; // temporary string used during alignment/padding. - if (wrapWidth > mixin.stringWidth(col)) { - ts += ' '.repeat(wrapWidth - mixin.stringWidth(col)); - } - // align the string within its column. - if (row[c].align && row[c].align !== 'left' && this.wrap) { - const fn = align[row[c].align]; - ts = fn(ts, wrapWidth); - if (mixin.stringWidth(ts) < wrapWidth) { - /* c8 ignore start */ - const w = width || 0; - /* c8 ignore stop */ - ts += ' '.repeat(w - mixin.stringWidth(ts) - 1); - } - } - // apply border and padding to string. - const padding = row[c].padding || [0, 0, 0, 0]; - if (padding[left]) { - str += ' '.repeat(padding[left]); - } - str += addBorder(row[c], ts, '| '); - str += ts; - str += addBorder(row[c], ts, ' |'); - if (padding[right]) { - str += ' '.repeat(padding[right]); - } - // if prior row is span, try to render the - // current row on the prior line. - if (r === 0 && lines.length > 0) { - str = this.renderInline(str, lines[lines.length - 1]); - } - }); - // remove trailing whitespace. - lines.push({ - text: str.replace(/ +$/, ''), - span: row.span - }); - }); - return lines; - } - // if the full 'source' can render in - // the target line, do so. - renderInline(source, previousLine) { - const match = source.match(/^ */); - /* c8 ignore start */ - const leadingWhitespace = match ? match[0].length : 0; - /* c8 ignore stop */ - const target = previousLine.text; - const targetTextWidth = mixin.stringWidth(target.trimEnd()); - if (!previousLine.span) { - return source; - } - // if we're not applying wrapping logic, - // just always append to the span. - if (!this.wrap) { - previousLine.hidden = true; - return target + source; - } - if (leadingWhitespace < targetTextWidth) { - return source; - } - previousLine.hidden = true; - return target.trimEnd() + ' '.repeat(leadingWhitespace - targetTextWidth) + source.trimStart(); - } - rasterize(row) { - const rrows = []; - const widths = this.columnWidths(row); - let wrapped; - // word wrap all columns, and create - // a data-structure that is easy to rasterize. - row.forEach((col, c) => { - // leave room for left and right padding. - col.width = widths[c]; - if (this.wrap) { - wrapped = mixin.wrap(col.text, this.negatePadding(col), { hard: true }).split('\n'); - } - else { - wrapped = col.text.split('\n'); - } - if (col.border) { - wrapped.unshift('.' + '-'.repeat(this.negatePadding(col) + 2) + '.'); - wrapped.push("'" + '-'.repeat(this.negatePadding(col) + 2) + "'"); - } - // add top and bottom padding. - if (col.padding) { - wrapped.unshift(...new Array(col.padding[top] || 0).fill('')); - wrapped.push(...new Array(col.padding[bottom] || 0).fill('')); - } - wrapped.forEach((str, r) => { - if (!rrows[r]) { - rrows.push([]); - } - const rrow = rrows[r]; - for (let i = 0; i < c; i++) { - if (rrow[i] === undefined) { - rrow.push(''); - } - } - rrow.push(str); - }); - }); - return rrows; - } - negatePadding(col) { - /* c8 ignore start */ - let wrapWidth = col.width || 0; - /* c8 ignore stop */ - if (col.padding) { - wrapWidth -= (col.padding[left] || 0) + (col.padding[right] || 0); - } - if (col.border) { - wrapWidth -= 4; - } - return wrapWidth; - } - columnWidths(row) { - if (!this.wrap) { - return row.map(col => { - return col.width || mixin.stringWidth(col.text); - }); - } - let unset = row.length; - let remainingWidth = this.width; - // column widths can be set in config. - const widths = row.map(col => { - if (col.width) { - unset--; - remainingWidth -= col.width; - return col.width; - } - return undefined; - }); - // any unset widths should be calculated. - /* c8 ignore start */ - const unsetWidth = unset ? Math.floor(remainingWidth / unset) : 0; - /* c8 ignore stop */ - return widths.map((w, i) => { - if (w === undefined) { - return Math.max(unsetWidth, _minWidth(row[i])); - } - return w; - }); - } -} -function addBorder(col, ts, style) { - if (col.border) { - if (/[.']-+[.']/.test(ts)) { - return ''; - } - if (ts.trim().length !== 0) { - return style; - } - return ' '; - } - return ''; -} -// calculates the minimum width of -// a column, based on padding preferences. -function _minWidth(col) { - const padding = col.padding || []; - const minWidth = 1 + (padding[left] || 0) + (padding[right] || 0); - if (col.border) { - return minWidth + 4; - } - return minWidth; -} -function getWindowWidth() { - /* c8 ignore start */ - if (typeof process === 'object' && process.stdout && process.stdout.columns) { - return process.stdout.columns; - } - return 80; -} -/* c8 ignore stop */ -function alignRight(str, width) { - str = str.trim(); - const strWidth = mixin.stringWidth(str); - if (strWidth < width) { - return ' '.repeat(width - strWidth) + str; - } - return str; -} -function alignCenter(str, width) { - str = str.trim(); - const strWidth = mixin.stringWidth(str); - /* c8 ignore start */ - if (strWidth >= width) { - return str; - } - /* c8 ignore stop */ - return ' '.repeat((width - strWidth) >> 1) + str; -} -let mixin; -function cliui(opts, _mixin) { - mixin = _mixin; - return new UI({ - /* c8 ignore start */ - width: (opts === null || opts === void 0 ? void 0 : opts.width) || getWindowWidth(), - wrap: opts === null || opts === void 0 ? void 0 : opts.wrap - /* c8 ignore stop */ - }); -} - -// Bootstrap cliui with CommonJS dependencies: -const stringWidth = require('string-width-cjs'); -const stripAnsi = require('strip-ansi-cjs'); -const wrap = require('wrap-ansi-cjs'); -function ui(opts) { - return cliui(opts, { - stringWidth, - stripAnsi, - wrap - }); -} - -module.exports = ui; diff --git a/node_modules/@isaacs/cliui/build/index.d.cts b/node_modules/@isaacs/cliui/build/index.d.cts deleted file mode 100644 index 4567f94..0000000 --- a/node_modules/@isaacs/cliui/build/index.d.cts +++ /dev/null @@ -1,43 +0,0 @@ -interface UIOptions { - width: number; - wrap?: boolean; - rows?: string[]; -} -interface Column { - text: string; - width?: number; - align?: "right" | "left" | "center"; - padding: number[]; - border?: boolean; -} -interface ColumnArray extends Array { - span: boolean; -} -interface Line { - hidden?: boolean; - text: string; - span?: boolean; -} -declare class UI { - width: number; - wrap: boolean; - rows: ColumnArray[]; - constructor(opts: UIOptions); - span(...args: ColumnArray): void; - resetOutput(): void; - div(...args: (Column | string)[]): ColumnArray; - private shouldApplyLayoutDSL; - private applyLayoutDSL; - private colFromString; - private measurePadding; - toString(): string; - rowToString(row: ColumnArray, lines: Line[]): Line[]; - // if the full 'source' can render in - // the target line, do so. - private renderInline; - private rasterize; - private negatePadding; - private columnWidths; -} -declare function ui(opts: UIOptions): UI; -export { ui as default }; diff --git a/node_modules/@isaacs/cliui/build/lib/index.js b/node_modules/@isaacs/cliui/build/lib/index.js deleted file mode 100644 index 587b5ec..0000000 --- a/node_modules/@isaacs/cliui/build/lib/index.js +++ /dev/null @@ -1,302 +0,0 @@ -'use strict'; -const align = { - right: alignRight, - center: alignCenter -}; -const top = 0; -const right = 1; -const bottom = 2; -const left = 3; -export class UI { - constructor(opts) { - var _a; - this.width = opts.width; - /* c8 ignore start */ - this.wrap = (_a = opts.wrap) !== null && _a !== void 0 ? _a : true; - /* c8 ignore stop */ - this.rows = []; - } - span(...args) { - const cols = this.div(...args); - cols.span = true; - } - resetOutput() { - this.rows = []; - } - div(...args) { - if (args.length === 0) { - this.div(''); - } - if (this.wrap && this.shouldApplyLayoutDSL(...args) && typeof args[0] === 'string') { - return this.applyLayoutDSL(args[0]); - } - const cols = args.map(arg => { - if (typeof arg === 'string') { - return this.colFromString(arg); - } - return arg; - }); - this.rows.push(cols); - return cols; - } - shouldApplyLayoutDSL(...args) { - return args.length === 1 && typeof args[0] === 'string' && - /[\t\n]/.test(args[0]); - } - applyLayoutDSL(str) { - const rows = str.split('\n').map(row => row.split('\t')); - let leftColumnWidth = 0; - // simple heuristic for layout, make sure the - // second column lines up along the left-hand. - // don't allow the first column to take up more - // than 50% of the screen. - rows.forEach(columns => { - if (columns.length > 1 && mixin.stringWidth(columns[0]) > leftColumnWidth) { - leftColumnWidth = Math.min(Math.floor(this.width * 0.5), mixin.stringWidth(columns[0])); - } - }); - // generate a table: - // replacing ' ' with padding calculations. - // using the algorithmically generated width. - rows.forEach(columns => { - this.div(...columns.map((r, i) => { - return { - text: r.trim(), - padding: this.measurePadding(r), - width: (i === 0 && columns.length > 1) ? leftColumnWidth : undefined - }; - })); - }); - return this.rows[this.rows.length - 1]; - } - colFromString(text) { - return { - text, - padding: this.measurePadding(text) - }; - } - measurePadding(str) { - // measure padding without ansi escape codes - const noAnsi = mixin.stripAnsi(str); - return [0, noAnsi.match(/\s*$/)[0].length, 0, noAnsi.match(/^\s*/)[0].length]; - } - toString() { - const lines = []; - this.rows.forEach(row => { - this.rowToString(row, lines); - }); - // don't display any lines with the - // hidden flag set. - return lines - .filter(line => !line.hidden) - .map(line => line.text) - .join('\n'); - } - rowToString(row, lines) { - this.rasterize(row).forEach((rrow, r) => { - let str = ''; - rrow.forEach((col, c) => { - const { width } = row[c]; // the width with padding. - const wrapWidth = this.negatePadding(row[c]); // the width without padding. - let ts = col; // temporary string used during alignment/padding. - if (wrapWidth > mixin.stringWidth(col)) { - ts += ' '.repeat(wrapWidth - mixin.stringWidth(col)); - } - // align the string within its column. - if (row[c].align && row[c].align !== 'left' && this.wrap) { - const fn = align[row[c].align]; - ts = fn(ts, wrapWidth); - if (mixin.stringWidth(ts) < wrapWidth) { - /* c8 ignore start */ - const w = width || 0; - /* c8 ignore stop */ - ts += ' '.repeat(w - mixin.stringWidth(ts) - 1); - } - } - // apply border and padding to string. - const padding = row[c].padding || [0, 0, 0, 0]; - if (padding[left]) { - str += ' '.repeat(padding[left]); - } - str += addBorder(row[c], ts, '| '); - str += ts; - str += addBorder(row[c], ts, ' |'); - if (padding[right]) { - str += ' '.repeat(padding[right]); - } - // if prior row is span, try to render the - // current row on the prior line. - if (r === 0 && lines.length > 0) { - str = this.renderInline(str, lines[lines.length - 1]); - } - }); - // remove trailing whitespace. - lines.push({ - text: str.replace(/ +$/, ''), - span: row.span - }); - }); - return lines; - } - // if the full 'source' can render in - // the target line, do so. - renderInline(source, previousLine) { - const match = source.match(/^ */); - /* c8 ignore start */ - const leadingWhitespace = match ? match[0].length : 0; - /* c8 ignore stop */ - const target = previousLine.text; - const targetTextWidth = mixin.stringWidth(target.trimEnd()); - if (!previousLine.span) { - return source; - } - // if we're not applying wrapping logic, - // just always append to the span. - if (!this.wrap) { - previousLine.hidden = true; - return target + source; - } - if (leadingWhitespace < targetTextWidth) { - return source; - } - previousLine.hidden = true; - return target.trimEnd() + ' '.repeat(leadingWhitespace - targetTextWidth) + source.trimStart(); - } - rasterize(row) { - const rrows = []; - const widths = this.columnWidths(row); - let wrapped; - // word wrap all columns, and create - // a data-structure that is easy to rasterize. - row.forEach((col, c) => { - // leave room for left and right padding. - col.width = widths[c]; - if (this.wrap) { - wrapped = mixin.wrap(col.text, this.negatePadding(col), { hard: true }).split('\n'); - } - else { - wrapped = col.text.split('\n'); - } - if (col.border) { - wrapped.unshift('.' + '-'.repeat(this.negatePadding(col) + 2) + '.'); - wrapped.push("'" + '-'.repeat(this.negatePadding(col) + 2) + "'"); - } - // add top and bottom padding. - if (col.padding) { - wrapped.unshift(...new Array(col.padding[top] || 0).fill('')); - wrapped.push(...new Array(col.padding[bottom] || 0).fill('')); - } - wrapped.forEach((str, r) => { - if (!rrows[r]) { - rrows.push([]); - } - const rrow = rrows[r]; - for (let i = 0; i < c; i++) { - if (rrow[i] === undefined) { - rrow.push(''); - } - } - rrow.push(str); - }); - }); - return rrows; - } - negatePadding(col) { - /* c8 ignore start */ - let wrapWidth = col.width || 0; - /* c8 ignore stop */ - if (col.padding) { - wrapWidth -= (col.padding[left] || 0) + (col.padding[right] || 0); - } - if (col.border) { - wrapWidth -= 4; - } - return wrapWidth; - } - columnWidths(row) { - if (!this.wrap) { - return row.map(col => { - return col.width || mixin.stringWidth(col.text); - }); - } - let unset = row.length; - let remainingWidth = this.width; - // column widths can be set in config. - const widths = row.map(col => { - if (col.width) { - unset--; - remainingWidth -= col.width; - return col.width; - } - return undefined; - }); - // any unset widths should be calculated. - /* c8 ignore start */ - const unsetWidth = unset ? Math.floor(remainingWidth / unset) : 0; - /* c8 ignore stop */ - return widths.map((w, i) => { - if (w === undefined) { - return Math.max(unsetWidth, _minWidth(row[i])); - } - return w; - }); - } -} -function addBorder(col, ts, style) { - if (col.border) { - if (/[.']-+[.']/.test(ts)) { - return ''; - } - if (ts.trim().length !== 0) { - return style; - } - return ' '; - } - return ''; -} -// calculates the minimum width of -// a column, based on padding preferences. -function _minWidth(col) { - const padding = col.padding || []; - const minWidth = 1 + (padding[left] || 0) + (padding[right] || 0); - if (col.border) { - return minWidth + 4; - } - return minWidth; -} -function getWindowWidth() { - /* c8 ignore start */ - if (typeof process === 'object' && process.stdout && process.stdout.columns) { - return process.stdout.columns; - } - return 80; -} -/* c8 ignore stop */ -function alignRight(str, width) { - str = str.trim(); - const strWidth = mixin.stringWidth(str); - if (strWidth < width) { - return ' '.repeat(width - strWidth) + str; - } - return str; -} -function alignCenter(str, width) { - str = str.trim(); - const strWidth = mixin.stringWidth(str); - /* c8 ignore start */ - if (strWidth >= width) { - return str; - } - /* c8 ignore stop */ - return ' '.repeat((width - strWidth) >> 1) + str; -} -let mixin; -export function cliui(opts, _mixin) { - mixin = _mixin; - return new UI({ - /* c8 ignore start */ - width: (opts === null || opts === void 0 ? void 0 : opts.width) || getWindowWidth(), - wrap: opts === null || opts === void 0 ? void 0 : opts.wrap - /* c8 ignore stop */ - }); -} diff --git a/node_modules/@isaacs/cliui/index.mjs b/node_modules/@isaacs/cliui/index.mjs deleted file mode 100644 index 5177519..0000000 --- a/node_modules/@isaacs/cliui/index.mjs +++ /dev/null @@ -1,14 +0,0 @@ -// Bootstrap cliui with ESM dependencies: -import { cliui } from './build/lib/index.js' - -import stringWidth from 'string-width' -import stripAnsi from 'strip-ansi' -import wrap from 'wrap-ansi' - -export default function ui (opts) { - return cliui(opts, { - stringWidth, - stripAnsi, - wrap - }) -} diff --git a/node_modules/@isaacs/cliui/node_modules/ansi-regex/index.d.ts b/node_modules/@isaacs/cliui/node_modules/ansi-regex/index.d.ts deleted file mode 100644 index 7d562e9..0000000 --- a/node_modules/@isaacs/cliui/node_modules/ansi-regex/index.d.ts +++ /dev/null @@ -1,33 +0,0 @@ -export type Options = { - /** - Match only the first ANSI escape. - - @default false - */ - readonly onlyFirst: boolean; -}; - -/** -Regular expression for matching ANSI escape codes. - -@example -``` -import ansiRegex from 'ansi-regex'; - -ansiRegex().test('\u001B[4mcake\u001B[0m'); -//=> true - -ansiRegex().test('cake'); -//=> false - -'\u001B[4mcake\u001B[0m'.match(ansiRegex()); -//=> ['\u001B[4m', '\u001B[0m'] - -'\u001B[4mcake\u001B[0m'.match(ansiRegex({onlyFirst: true})); -//=> ['\u001B[4m'] - -'\u001B]8;;https://github.com\u0007click\u001B]8;;\u0007'.match(ansiRegex()); -//=> ['\u001B]8;;https://github.com\u0007', '\u001B]8;;\u0007'] -``` -*/ -export default function ansiRegex(options?: Options): RegExp; diff --git a/node_modules/@isaacs/cliui/node_modules/ansi-regex/index.js b/node_modules/@isaacs/cliui/node_modules/ansi-regex/index.js deleted file mode 100644 index 2cc5ca2..0000000 --- a/node_modules/@isaacs/cliui/node_modules/ansi-regex/index.js +++ /dev/null @@ -1,14 +0,0 @@ -export default function ansiRegex({onlyFirst = false} = {}) { - // Valid string terminator sequences are BEL, ESC\, and 0x9c - const ST = '(?:\\u0007|\\u001B\\u005C|\\u009C)'; - - // OSC sequences only: ESC ] ... ST (non-greedy until the first ST) - const osc = `(?:\\u001B\\][\\s\\S]*?${ST})`; - - // CSI and related: ESC/C1, optional intermediates, optional params (supports ; and :) then final byte - const csi = '[\\u001B\\u009B][[\\]()#;?]*(?:\\d{1,4}(?:[;:]\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]'; - - const pattern = `${osc}|${csi}`; - - return new RegExp(pattern, onlyFirst ? undefined : 'g'); -} diff --git a/node_modules/@isaacs/cliui/node_modules/ansi-regex/license b/node_modules/@isaacs/cliui/node_modules/ansi-regex/license deleted file mode 100644 index fa7ceba..0000000 --- a/node_modules/@isaacs/cliui/node_modules/ansi-regex/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (https://sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/@isaacs/cliui/node_modules/ansi-regex/package.json b/node_modules/@isaacs/cliui/node_modules/ansi-regex/package.json deleted file mode 100644 index 2efe9eb..0000000 --- a/node_modules/@isaacs/cliui/node_modules/ansi-regex/package.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "name": "ansi-regex", - "version": "6.2.2", - "description": "Regular expression for matching ANSI escape codes", - "license": "MIT", - "repository": "chalk/ansi-regex", - "funding": "https://github.com/chalk/ansi-regex?sponsor=1", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "https://sindresorhus.com" - }, - "type": "module", - "exports": "./index.js", - "types": "./index.d.ts", - "sideEffects": false, - "engines": { - "node": ">=12" - }, - "scripts": { - "test": "xo && ava && tsd", - "view-supported": "node fixtures/view-codes.js" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "ansi", - "styles", - "color", - "colour", - "colors", - "terminal", - "console", - "cli", - "string", - "tty", - "escape", - "formatting", - "rgb", - "256", - "shell", - "xterm", - "command-line", - "text", - "regex", - "regexp", - "re", - "match", - "test", - "find", - "pattern" - ], - "devDependencies": { - "ansi-escapes": "^5.0.0", - "ava": "^3.15.0", - "tsd": "^0.21.0", - "xo": "^0.54.2" - } -} diff --git a/node_modules/@isaacs/cliui/node_modules/ansi-regex/readme.md b/node_modules/@isaacs/cliui/node_modules/ansi-regex/readme.md deleted file mode 100644 index 4d3c415..0000000 --- a/node_modules/@isaacs/cliui/node_modules/ansi-regex/readme.md +++ /dev/null @@ -1,66 +0,0 @@ -# ansi-regex - -> Regular expression for matching [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) - -## Install - -```sh -npm install ansi-regex -``` - -## Usage - -```js -import ansiRegex from 'ansi-regex'; - -ansiRegex().test('\u001B[4mcake\u001B[0m'); -//=> true - -ansiRegex().test('cake'); -//=> false - -'\u001B[4mcake\u001B[0m'.match(ansiRegex()); -//=> ['\u001B[4m', '\u001B[0m'] - -'\u001B[4mcake\u001B[0m'.match(ansiRegex({onlyFirst: true})); -//=> ['\u001B[4m'] - -'\u001B]8;;https://github.com\u0007click\u001B]8;;\u0007'.match(ansiRegex()); -//=> ['\u001B]8;;https://github.com\u0007', '\u001B]8;;\u0007'] -``` - -## API - -### ansiRegex(options?) - -Returns a regex for matching ANSI escape codes. - -#### options - -Type: `object` - -##### onlyFirst - -Type: `boolean`\ -Default: `false` *(Matches any ANSI escape codes in a string)* - -Match only the first ANSI escape. - -## Important - -If you run the regex against untrusted user input in a server context, you should [give it a timeout](https://github.com/sindresorhus/super-regex). - -**I do not consider [ReDoS](https://blog.yossarian.net/2022/12/28/ReDoS-vulnerabilities-and-misaligned-incentives) a valid vulnerability for this package.** - -## FAQ - -### Why do you test for codes not in the ECMA 48 standard? - -Some of the codes we run as a test are codes that we acquired finding various lists of non-standard or manufacturer specific codes. We test for both standard and non-standard codes, as most of them follow the same or similar format and can be safely matched in strings without the risk of removing actual string content. There are a few non-standard control codes that do not follow the traditional format (i.e. they end in numbers) thus forcing us to exclude them from the test because we cannot reliably match them. - -On the historical side, those ECMA standards were established in the early 90's whereas the VT100, for example, was designed in the mid/late 70's. At that point in time, control codes were still pretty ungoverned and engineers used them for a multitude of things, namely to activate hardware ports that may have been proprietary. Somewhere else you see a similar 'anarchy' of codes is in the x86 architecture for processors; there are a ton of "interrupts" that can mean different things on certain brands of processors, most of which have been phased out. - -## Maintainers - -- [Sindre Sorhus](https://github.com/sindresorhus) -- [Josh Junon](https://github.com/qix-) diff --git a/node_modules/@isaacs/cliui/node_modules/ansi-styles/index.d.ts b/node_modules/@isaacs/cliui/node_modules/ansi-styles/index.d.ts deleted file mode 100644 index ee8bc27..0000000 --- a/node_modules/@isaacs/cliui/node_modules/ansi-styles/index.d.ts +++ /dev/null @@ -1,236 +0,0 @@ -export type CSPair = { // eslint-disable-line @typescript-eslint/naming-convention - /** - The ANSI terminal control sequence for starting this style. - */ - readonly open: string; - - /** - The ANSI terminal control sequence for ending this style. - */ - readonly close: string; -}; - -export type ColorBase = { - /** - The ANSI terminal control sequence for ending this color. - */ - readonly close: string; - - ansi(code: number): string; - - ansi256(code: number): string; - - ansi16m(red: number, green: number, blue: number): string; -}; - -export type Modifier = { - /** - Resets the current color chain. - */ - readonly reset: CSPair; - - /** - Make text bold. - */ - readonly bold: CSPair; - - /** - Emitting only a small amount of light. - */ - readonly dim: CSPair; - - /** - Make text italic. (Not widely supported) - */ - readonly italic: CSPair; - - /** - Make text underline. (Not widely supported) - */ - readonly underline: CSPair; - - /** - Make text overline. - - Supported on VTE-based terminals, the GNOME terminal, mintty, and Git Bash. - */ - readonly overline: CSPair; - - /** - Inverse background and foreground colors. - */ - readonly inverse: CSPair; - - /** - Prints the text, but makes it invisible. - */ - readonly hidden: CSPair; - - /** - Puts a horizontal line through the center of the text. (Not widely supported) - */ - readonly strikethrough: CSPair; -}; - -export type ForegroundColor = { - readonly black: CSPair; - readonly red: CSPair; - readonly green: CSPair; - readonly yellow: CSPair; - readonly blue: CSPair; - readonly cyan: CSPair; - readonly magenta: CSPair; - readonly white: CSPair; - - /** - Alias for `blackBright`. - */ - readonly gray: CSPair; - - /** - Alias for `blackBright`. - */ - readonly grey: CSPair; - - readonly blackBright: CSPair; - readonly redBright: CSPair; - readonly greenBright: CSPair; - readonly yellowBright: CSPair; - readonly blueBright: CSPair; - readonly cyanBright: CSPair; - readonly magentaBright: CSPair; - readonly whiteBright: CSPair; -}; - -export type BackgroundColor = { - readonly bgBlack: CSPair; - readonly bgRed: CSPair; - readonly bgGreen: CSPair; - readonly bgYellow: CSPair; - readonly bgBlue: CSPair; - readonly bgCyan: CSPair; - readonly bgMagenta: CSPair; - readonly bgWhite: CSPair; - - /** - Alias for `bgBlackBright`. - */ - readonly bgGray: CSPair; - - /** - Alias for `bgBlackBright`. - */ - readonly bgGrey: CSPair; - - readonly bgBlackBright: CSPair; - readonly bgRedBright: CSPair; - readonly bgGreenBright: CSPair; - readonly bgYellowBright: CSPair; - readonly bgBlueBright: CSPair; - readonly bgCyanBright: CSPair; - readonly bgMagentaBright: CSPair; - readonly bgWhiteBright: CSPair; -}; - -export type ConvertColor = { - /** - Convert from the RGB color space to the ANSI 256 color space. - - @param red - (`0...255`) - @param green - (`0...255`) - @param blue - (`0...255`) - */ - rgbToAnsi256(red: number, green: number, blue: number): number; - - /** - Convert from the RGB HEX color space to the RGB color space. - - @param hex - A hexadecimal string containing RGB data. - */ - hexToRgb(hex: string): [red: number, green: number, blue: number]; - - /** - Convert from the RGB HEX color space to the ANSI 256 color space. - - @param hex - A hexadecimal string containing RGB data. - */ - hexToAnsi256(hex: string): number; - - /** - Convert from the ANSI 256 color space to the ANSI 16 color space. - - @param code - A number representing the ANSI 256 color. - */ - ansi256ToAnsi(code: number): number; - - /** - Convert from the RGB color space to the ANSI 16 color space. - - @param red - (`0...255`) - @param green - (`0...255`) - @param blue - (`0...255`) - */ - rgbToAnsi(red: number, green: number, blue: number): number; - - /** - Convert from the RGB HEX color space to the ANSI 16 color space. - - @param hex - A hexadecimal string containing RGB data. - */ - hexToAnsi(hex: string): number; -}; - -/** -Basic modifier names. -*/ -export type ModifierName = keyof Modifier; - -/** -Basic foreground color names. - -[More colors here.](https://github.com/chalk/chalk/blob/main/readme.md#256-and-truecolor-color-support) -*/ -export type ForegroundColorName = keyof ForegroundColor; - -/** -Basic background color names. - -[More colors here.](https://github.com/chalk/chalk/blob/main/readme.md#256-and-truecolor-color-support) -*/ -export type BackgroundColorName = keyof BackgroundColor; - -/** -Basic color names. The combination of foreground and background color names. - -[More colors here.](https://github.com/chalk/chalk/blob/main/readme.md#256-and-truecolor-color-support) -*/ -export type ColorName = ForegroundColorName | BackgroundColorName; - -/** -Basic modifier names. -*/ -export const modifierNames: readonly ModifierName[]; - -/** -Basic foreground color names. -*/ -export const foregroundColorNames: readonly ForegroundColorName[]; - -/** -Basic background color names. -*/ -export const backgroundColorNames: readonly BackgroundColorName[]; - -/* -Basic color names. The combination of foreground and background color names. -*/ -export const colorNames: readonly ColorName[]; - -declare const ansiStyles: { - readonly modifier: Modifier; - readonly color: ColorBase & ForegroundColor; - readonly bgColor: ColorBase & BackgroundColor; - readonly codes: ReadonlyMap; -} & ForegroundColor & BackgroundColor & Modifier & ConvertColor; - -export default ansiStyles; diff --git a/node_modules/@isaacs/cliui/node_modules/ansi-styles/index.js b/node_modules/@isaacs/cliui/node_modules/ansi-styles/index.js deleted file mode 100644 index eaa7bed..0000000 --- a/node_modules/@isaacs/cliui/node_modules/ansi-styles/index.js +++ /dev/null @@ -1,223 +0,0 @@ -const ANSI_BACKGROUND_OFFSET = 10; - -const wrapAnsi16 = (offset = 0) => code => `\u001B[${code + offset}m`; - -const wrapAnsi256 = (offset = 0) => code => `\u001B[${38 + offset};5;${code}m`; - -const wrapAnsi16m = (offset = 0) => (red, green, blue) => `\u001B[${38 + offset};2;${red};${green};${blue}m`; - -const styles = { - modifier: { - reset: [0, 0], - // 21 isn't widely supported and 22 does the same thing - bold: [1, 22], - dim: [2, 22], - italic: [3, 23], - underline: [4, 24], - overline: [53, 55], - inverse: [7, 27], - hidden: [8, 28], - strikethrough: [9, 29], - }, - color: { - black: [30, 39], - red: [31, 39], - green: [32, 39], - yellow: [33, 39], - blue: [34, 39], - magenta: [35, 39], - cyan: [36, 39], - white: [37, 39], - - // Bright color - blackBright: [90, 39], - gray: [90, 39], // Alias of `blackBright` - grey: [90, 39], // Alias of `blackBright` - redBright: [91, 39], - greenBright: [92, 39], - yellowBright: [93, 39], - blueBright: [94, 39], - magentaBright: [95, 39], - cyanBright: [96, 39], - whiteBright: [97, 39], - }, - bgColor: { - bgBlack: [40, 49], - bgRed: [41, 49], - bgGreen: [42, 49], - bgYellow: [43, 49], - bgBlue: [44, 49], - bgMagenta: [45, 49], - bgCyan: [46, 49], - bgWhite: [47, 49], - - // Bright color - bgBlackBright: [100, 49], - bgGray: [100, 49], // Alias of `bgBlackBright` - bgGrey: [100, 49], // Alias of `bgBlackBright` - bgRedBright: [101, 49], - bgGreenBright: [102, 49], - bgYellowBright: [103, 49], - bgBlueBright: [104, 49], - bgMagentaBright: [105, 49], - bgCyanBright: [106, 49], - bgWhiteBright: [107, 49], - }, -}; - -export const modifierNames = Object.keys(styles.modifier); -export const foregroundColorNames = Object.keys(styles.color); -export const backgroundColorNames = Object.keys(styles.bgColor); -export const colorNames = [...foregroundColorNames, ...backgroundColorNames]; - -function assembleStyles() { - const codes = new Map(); - - for (const [groupName, group] of Object.entries(styles)) { - for (const [styleName, style] of Object.entries(group)) { - styles[styleName] = { - open: `\u001B[${style[0]}m`, - close: `\u001B[${style[1]}m`, - }; - - group[styleName] = styles[styleName]; - - codes.set(style[0], style[1]); - } - - Object.defineProperty(styles, groupName, { - value: group, - enumerable: false, - }); - } - - Object.defineProperty(styles, 'codes', { - value: codes, - enumerable: false, - }); - - styles.color.close = '\u001B[39m'; - styles.bgColor.close = '\u001B[49m'; - - styles.color.ansi = wrapAnsi16(); - styles.color.ansi256 = wrapAnsi256(); - styles.color.ansi16m = wrapAnsi16m(); - styles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET); - styles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET); - styles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET); - - // From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js - Object.defineProperties(styles, { - rgbToAnsi256: { - value(red, green, blue) { - // We use the extended greyscale palette here, with the exception of - // black and white. normal palette only has 4 greyscale shades. - if (red === green && green === blue) { - if (red < 8) { - return 16; - } - - if (red > 248) { - return 231; - } - - return Math.round(((red - 8) / 247) * 24) + 232; - } - - return 16 - + (36 * Math.round(red / 255 * 5)) - + (6 * Math.round(green / 255 * 5)) - + Math.round(blue / 255 * 5); - }, - enumerable: false, - }, - hexToRgb: { - value(hex) { - const matches = /[a-f\d]{6}|[a-f\d]{3}/i.exec(hex.toString(16)); - if (!matches) { - return [0, 0, 0]; - } - - let [colorString] = matches; - - if (colorString.length === 3) { - colorString = [...colorString].map(character => character + character).join(''); - } - - const integer = Number.parseInt(colorString, 16); - - return [ - /* eslint-disable no-bitwise */ - (integer >> 16) & 0xFF, - (integer >> 8) & 0xFF, - integer & 0xFF, - /* eslint-enable no-bitwise */ - ]; - }, - enumerable: false, - }, - hexToAnsi256: { - value: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)), - enumerable: false, - }, - ansi256ToAnsi: { - value(code) { - if (code < 8) { - return 30 + code; - } - - if (code < 16) { - return 90 + (code - 8); - } - - let red; - let green; - let blue; - - if (code >= 232) { - red = (((code - 232) * 10) + 8) / 255; - green = red; - blue = red; - } else { - code -= 16; - - const remainder = code % 36; - - red = Math.floor(code / 36) / 5; - green = Math.floor(remainder / 6) / 5; - blue = (remainder % 6) / 5; - } - - const value = Math.max(red, green, blue) * 2; - - if (value === 0) { - return 30; - } - - // eslint-disable-next-line no-bitwise - let result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red)); - - if (value === 2) { - result += 60; - } - - return result; - }, - enumerable: false, - }, - rgbToAnsi: { - value: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)), - enumerable: false, - }, - hexToAnsi: { - value: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)), - enumerable: false, - }, - }); - - return styles; -} - -const ansiStyles = assembleStyles(); - -export default ansiStyles; diff --git a/node_modules/@isaacs/cliui/node_modules/ansi-styles/license b/node_modules/@isaacs/cliui/node_modules/ansi-styles/license deleted file mode 100644 index fa7ceba..0000000 --- a/node_modules/@isaacs/cliui/node_modules/ansi-styles/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (https://sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/@isaacs/cliui/node_modules/ansi-styles/package.json b/node_modules/@isaacs/cliui/node_modules/ansi-styles/package.json deleted file mode 100644 index 16b508f..0000000 --- a/node_modules/@isaacs/cliui/node_modules/ansi-styles/package.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "name": "ansi-styles", - "version": "6.2.3", - "description": "ANSI escape codes for styling strings in the terminal", - "license": "MIT", - "repository": "chalk/ansi-styles", - "funding": "https://github.com/chalk/ansi-styles?sponsor=1", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "https://sindresorhus.com" - }, - "type": "module", - "exports": "./index.js", - "engines": { - "node": ">=12" - }, - "scripts": { - "test": "xo && ava && tsd", - "screenshot": "svg-term --command='node screenshot' --out=screenshot.svg --padding=3 --width=55 --height=3 --at=1000 --no-cursor" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "ansi", - "styles", - "color", - "colour", - "colors", - "terminal", - "console", - "cli", - "string", - "tty", - "escape", - "formatting", - "rgb", - "256", - "shell", - "xterm", - "log", - "logging", - "command-line", - "text" - ], - "devDependencies": { - "ava": "^6.1.3", - "svg-term-cli": "^2.1.1", - "tsd": "^0.31.1", - "xo": "^0.58.0" - } -} diff --git a/node_modules/@isaacs/cliui/node_modules/ansi-styles/readme.md b/node_modules/@isaacs/cliui/node_modules/ansi-styles/readme.md deleted file mode 100644 index 6d04183..0000000 --- a/node_modules/@isaacs/cliui/node_modules/ansi-styles/readme.md +++ /dev/null @@ -1,173 +0,0 @@ -# ansi-styles - -> [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for styling strings in the terminal - -You probably want the higher-level [chalk](https://github.com/chalk/chalk) module for styling your strings. - -![](screenshot.png) - -## Install - -```sh -npm install ansi-styles -``` - -## Usage - -```js -import styles from 'ansi-styles'; - -console.log(`${styles.green.open}Hello world!${styles.green.close}`); - - -// Color conversion between 256/truecolor -// NOTE: When converting from truecolor to 256 colors, the original color -// may be degraded to fit the new color palette. This means terminals -// that do not support 16 million colors will best-match the -// original color. -console.log(`${styles.color.ansi(styles.rgbToAnsi(199, 20, 250))}Hello World${styles.color.close}`) -console.log(`${styles.color.ansi256(styles.rgbToAnsi256(199, 20, 250))}Hello World${styles.color.close}`) -console.log(`${styles.color.ansi16m(...styles.hexToRgb('#abcdef'))}Hello World${styles.color.close}`) -``` - -## API - -### `open` and `close` - -Each style has an `open` and `close` property. - -### `modifierNames`, `foregroundColorNames`, `backgroundColorNames`, and `colorNames` - -All supported style strings are exposed as an array of strings for convenience. `colorNames` is the combination of `foregroundColorNames` and `backgroundColorNames`. - -This can be useful if you need to validate input: - -```js -import {modifierNames, foregroundColorNames} from 'ansi-styles'; - -console.log(modifierNames.includes('bold')); -//=> true - -console.log(foregroundColorNames.includes('pink')); -//=> false -``` - -## Styles - -### Modifiers - -- `reset` -- `bold` -- `dim` -- `italic` *(Not widely supported)* -- `underline` -- `overline` *Supported on VTE-based terminals, the GNOME terminal, mintty, and Git Bash.* -- `inverse` -- `hidden` -- `strikethrough` *(Not widely supported)* - -### Colors - -- `black` -- `red` -- `green` -- `yellow` -- `blue` -- `magenta` -- `cyan` -- `white` -- `blackBright` (alias: `gray`, `grey`) -- `redBright` -- `greenBright` -- `yellowBright` -- `blueBright` -- `magentaBright` -- `cyanBright` -- `whiteBright` - -### Background colors - -- `bgBlack` -- `bgRed` -- `bgGreen` -- `bgYellow` -- `bgBlue` -- `bgMagenta` -- `bgCyan` -- `bgWhite` -- `bgBlackBright` (alias: `bgGray`, `bgGrey`) -- `bgRedBright` -- `bgGreenBright` -- `bgYellowBright` -- `bgBlueBright` -- `bgMagentaBright` -- `bgCyanBright` -- `bgWhiteBright` - -## Advanced usage - -By default, you get a map of styles, but the styles are also available as groups. They are non-enumerable so they don't show up unless you access them explicitly. This makes it easier to expose only a subset in a higher-level module. - -- `styles.modifier` -- `styles.color` -- `styles.bgColor` - -###### Example - -```js -import styles from 'ansi-styles'; - -console.log(styles.color.green.open); -``` - -Raw escape codes (i.e. without the CSI escape prefix `\u001B[` and render mode postfix `m`) are available under `styles.codes`, which returns a `Map` with the open codes as keys and close codes as values. - -###### Example - -```js -import styles from 'ansi-styles'; - -console.log(styles.codes.get(36)); -//=> 39 -``` - -## 16 / 256 / 16 million (TrueColor) support - -`ansi-styles` allows converting between various color formats and ANSI escapes, with support for 16, 256 and [16 million colors](https://gist.github.com/XVilka/8346728). - -The following color spaces are supported: - -- `rgb` -- `hex` -- `ansi256` -- `ansi` - -To use these, call the associated conversion function with the intended output, for example: - -```js -import styles from 'ansi-styles'; - -styles.color.ansi(styles.rgbToAnsi(100, 200, 15)); // RGB to 16 color ansi foreground code -styles.bgColor.ansi(styles.hexToAnsi('#C0FFEE')); // HEX to 16 color ansi foreground code - -styles.color.ansi256(styles.rgbToAnsi256(100, 200, 15)); // RGB to 256 color ansi foreground code -styles.bgColor.ansi256(styles.hexToAnsi256('#C0FFEE')); // HEX to 256 color ansi foreground code - -styles.color.ansi16m(100, 200, 15); // RGB to 16 million color foreground code -styles.bgColor.ansi16m(...styles.hexToRgb('#C0FFEE')); // Hex (RGB) to 16 million color foreground code -``` - -## Related - -- [ansi-escapes](https://github.com/sindresorhus/ansi-escapes) - ANSI escape codes for manipulating the terminal - -## Maintainers - -- [Sindre Sorhus](https://github.com/sindresorhus) -- [Josh Junon](https://github.com/qix-) - -## For enterprise - -Available as part of the Tidelift Subscription. - -The maintainers of `ansi-styles` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-ansi-styles?utm_source=npm-ansi-styles&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) diff --git a/node_modules/@isaacs/cliui/node_modules/emoji-regex/LICENSE-MIT.txt b/node_modules/@isaacs/cliui/node_modules/emoji-regex/LICENSE-MIT.txt deleted file mode 100644 index a41e0a7..0000000 --- a/node_modules/@isaacs/cliui/node_modules/emoji-regex/LICENSE-MIT.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright Mathias Bynens - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/@isaacs/cliui/node_modules/emoji-regex/README.md b/node_modules/@isaacs/cliui/node_modules/emoji-regex/README.md deleted file mode 100644 index 6d63082..0000000 --- a/node_modules/@isaacs/cliui/node_modules/emoji-regex/README.md +++ /dev/null @@ -1,137 +0,0 @@ -# emoji-regex [![Build status](https://travis-ci.org/mathiasbynens/emoji-regex.svg?branch=main)](https://travis-ci.org/mathiasbynens/emoji-regex) - -_emoji-regex_ offers a regular expression to match all emoji symbols and sequences (including textual representations of emoji) as per the Unicode Standard. - -This repository contains a script that generates this regular expression based on [Unicode data](https://github.com/node-unicode/node-unicode-data). Because of this, the regular expression can easily be updated whenever new emoji are added to the Unicode standard. - -## Installation - -Via [npm](https://www.npmjs.com/): - -```bash -npm install emoji-regex -``` - -In [Node.js](https://nodejs.org/): - -```js -const emojiRegex = require('emoji-regex/RGI_Emoji.js'); -// Note: because the regular expression has the global flag set, this module -// exports a function that returns the regex rather than exporting the regular -// expression itself, to make it impossible to (accidentally) mutate the -// original regular expression. - -const text = ` -\u{231A}: ⌚ default emoji presentation character (Emoji_Presentation) -\u{2194}\u{FE0F}: ↔️ default text presentation character rendered as emoji -\u{1F469}: 👩 emoji modifier base (Emoji_Modifier_Base) -\u{1F469}\u{1F3FF}: 👩🏿 emoji modifier base followed by a modifier -`; - -const regex = emojiRegex(); -let match; -while (match = regex.exec(text)) { - const emoji = match[0]; - console.log(`Matched sequence ${ emoji } — code points: ${ [...emoji].length }`); -} -``` - -Console output: - -``` -Matched sequence ⌚ — code points: 1 -Matched sequence ⌚ — code points: 1 -Matched sequence ↔️ — code points: 2 -Matched sequence ↔️ — code points: 2 -Matched sequence 👩 — code points: 1 -Matched sequence 👩 — code points: 1 -Matched sequence 👩🏿 — code points: 2 -Matched sequence 👩🏿 — code points: 2 -``` - -## Regular expression flavors - -The package comes with three distinct regular expressions: - -```js -// This is the recommended regular expression to use. It matches all -// emoji recommended for general interchange, as defined via the -// `RGI_Emoji` property in the Unicode Standard. -// https://unicode.org/reports/tr51/#def_rgi_set -// When in doubt, use this! -const emojiRegexRGI = require('emoji-regex/RGI_Emoji.js'); - -// This is the old regular expression, prior to `RGI_Emoji` being -// standardized. In addition to all `RGI_Emoji` sequences, it matches -// some emoji you probably don’t want to match (such as emoji component -// symbols that are not meant to be used separately). -const emojiRegex = require('emoji-regex/index.js'); - -// This regular expression matches even more emoji than the previous -// one, including emoji that render as text instead of icons (i.e. -// emoji that are not `Emoji_Presentation` symbols and that aren’t -// forced to render as emoji by a variation selector). -const emojiRegexText = require('emoji-regex/text.js'); -``` - -Additionally, in environments which support ES2015 Unicode escapes, you may `require` ES2015-style versions of the regexes: - -```js -const emojiRegexRGI = require('emoji-regex/es2015/RGI_Emoji.js'); -const emojiRegex = require('emoji-regex/es2015/index.js'); -const emojiRegexText = require('emoji-regex/es2015/text.js'); -``` - -## For maintainers - -### How to update emoji-regex after new Unicode Standard releases - -1. Update the Unicode data dependency in `package.json` by running the following commands: - - ```sh - # Example: updating from Unicode v12 to Unicode v13. - npm uninstall @unicode/unicode-12.0.0 - npm install @unicode/unicode-13.0.0 --save-dev - ```` - -1. Generate the new output: - - ```sh - npm run build - ``` - -1. Verify that tests still pass: - - ```sh - npm test - ``` - -1. Send a pull request with the changes, and get it reviewed & merged. - -1. On the `main` branch, bump the emoji-regex version number in `package.json`: - - ```sh - npm version patch -m 'Release v%s' - ``` - - Instead of `patch`, use `minor` or `major` [as needed](https://semver.org/). - - Note that this produces a Git commit + tag. - -1. Push the release commit and tag: - - ```sh - git push - ``` - - Our CI then automatically publishes the new release to npm. - -## Author - -| [![twitter/mathias](https://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias "Follow @mathias on Twitter") | -|---| -| [Mathias Bynens](https://mathiasbynens.be/) | - -## License - -_emoji-regex_ is available under the [MIT](https://mths.be/mit) license. diff --git a/node_modules/@isaacs/cliui/node_modules/emoji-regex/RGI_Emoji.d.ts b/node_modules/@isaacs/cliui/node_modules/emoji-regex/RGI_Emoji.d.ts deleted file mode 100644 index 89a651f..0000000 --- a/node_modules/@isaacs/cliui/node_modules/emoji-regex/RGI_Emoji.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -declare module 'emoji-regex/RGI_Emoji' { - function emojiRegex(): RegExp; - - export = emojiRegex; -} diff --git a/node_modules/@isaacs/cliui/node_modules/emoji-regex/RGI_Emoji.js b/node_modules/@isaacs/cliui/node_modules/emoji-regex/RGI_Emoji.js deleted file mode 100644 index 3fbe924..0000000 --- a/node_modules/@isaacs/cliui/node_modules/emoji-regex/RGI_Emoji.js +++ /dev/null @@ -1,6 +0,0 @@ -"use strict"; - -module.exports = function () { - // https://mths.be/emoji - return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67)\uDB40\uDC7F|(?:\uD83E\uDDD1\uD83C\uDFFF\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFC-\uDFFF])|\uD83D\uDC68(?:\uD83C\uDFFB(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|[\u2695\u2696\u2708]\uFE0F|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))?|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC)?|(?:\uD83D\uDC69(?:\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC69(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83E\uDDD1(?:\u200D(?:\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDE36\u200D\uD83C\uDF2B|\uD83C\uDFF3\uFE0F\u200D\u26A7|\uD83D\uDC3B\u200D\u2744|(?:(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\uD83C\uDFF4\u200D\u2620|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299]|\uD83C[\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]|\uD83D[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])\uFE0F|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDE35\u200D\uD83D\uDCAB|\uD83D\uDE2E\u200D\uD83D\uDCA8|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83E\uDDD1(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83D\uDC69(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC08\u200D\u2B1B|\u2764\uFE0F\u200D(?:\uD83D\uDD25|\uD83E\uDE79)|\uD83D\uDC41\uFE0F|\uD83C\uDFF3\uFE0F|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF4|(?:[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270C\u270D]|\uD83D[\uDD74\uDD90])(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC08\uDC15\uDC3B\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE2E\uDE35\uDE36\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5]|\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD]|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0D\uDD0E\uDD10-\uDD17\uDD1D\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78\uDD7A-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCB\uDDD0\uDDE0-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6]/g; -}; diff --git a/node_modules/@isaacs/cliui/node_modules/emoji-regex/es2015/RGI_Emoji.d.ts b/node_modules/@isaacs/cliui/node_modules/emoji-regex/es2015/RGI_Emoji.d.ts deleted file mode 100644 index bf0f154..0000000 --- a/node_modules/@isaacs/cliui/node_modules/emoji-regex/es2015/RGI_Emoji.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -declare module 'emoji-regex/es2015/RGI_Emoji' { - function emojiRegex(): RegExp; - - export = emojiRegex; -} diff --git a/node_modules/@isaacs/cliui/node_modules/emoji-regex/es2015/RGI_Emoji.js b/node_modules/@isaacs/cliui/node_modules/emoji-regex/es2015/RGI_Emoji.js deleted file mode 100644 index ecf32f1..0000000 --- a/node_modules/@isaacs/cliui/node_modules/emoji-regex/es2015/RGI_Emoji.js +++ /dev/null @@ -1,6 +0,0 @@ -"use strict"; - -module.exports = () => { - // https://mths.be/emoji - return /\u{1F3F4}\u{E0067}\u{E0062}(?:\u{E0077}\u{E006C}\u{E0073}|\u{E0073}\u{E0063}\u{E0074}|\u{E0065}\u{E006E}\u{E0067})\u{E007F}|(?:\u{1F9D1}\u{1F3FF}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FF}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}-\u{1F3FE}]|(?:\u{1F9D1}\u{1F3FE}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FE}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}-\u{1F3FD}\u{1F3FF}]|(?:\u{1F9D1}\u{1F3FD}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FD}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}\u{1F3FC}\u{1F3FE}\u{1F3FF}]|(?:\u{1F9D1}\u{1F3FC}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FC}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}\u{1F3FD}-\u{1F3FF}]|(?:\u{1F9D1}\u{1F3FB}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FB}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FC}-\u{1F3FF}]|\u{1F468}(?:\u{1F3FB}(?:\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FF}]|\u{1F468}[\u{1F3FB}-\u{1F3FF}])|\u{1F91D}\u200D\u{1F468}[\u{1F3FC}-\u{1F3FF}]|[\u2695\u2696\u2708]\uFE0F|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]))?|[\u{1F3FC}-\u{1F3FF}]\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FF}]|\u{1F468}[\u{1F3FB}-\u{1F3FF}])|\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F468}|[\u{1F468}\u{1F469}]\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FE}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FE}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FD}\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FD}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FC}\u{1F3FE}\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FC}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FD}-\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|(?:\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:[\u{1F468}\u{1F469}]\u200D[\u{1F466}\u{1F467}]|[\u{1F466}\u{1F467}])|\u{1F3FF}|\u{1F3FE}|\u{1F3FD}|\u{1F3FC})?|(?:\u{1F469}(?:\u{1F3FB}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}])|[\u{1F3FC}-\u{1F3FF}]\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}]))|\u{1F9D1}[\u{1F3FB}-\u{1F3FF}]\u200D\u{1F91D}\u200D\u{1F9D1})[\u{1F3FB}-\u{1F3FF}]|\u{1F469}\u200D\u{1F469}\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F469}(?:\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}])|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FE}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FD}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FC}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FB}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F9D1}(?:\u200D(?:\u{1F91D}\u200D\u{1F9D1}|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FE}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FD}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FC}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FB}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F469}\u200D\u{1F466}\u200D\u{1F466}|\u{1F469}\u200D\u{1F469}\u200D[\u{1F466}\u{1F467}]|\u{1F469}\u200D\u{1F467}\u200D[\u{1F466}\u{1F467}]|(?:\u{1F441}\uFE0F\u200D\u{1F5E8}|\u{1F9D1}(?:\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708]|\u{1F3FB}\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\u{1F469}(?:\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708]|\u{1F3FB}\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\u{1F636}\u200D\u{1F32B}|\u{1F3F3}\uFE0F\u200D\u26A7|\u{1F43B}\u200D\u2744|(?:[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F470}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F935}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D4}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]|[\u{1F46F}\u{1F93C}\u{1F9DE}\u{1F9DF}])\u200D[\u2640\u2642]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\uFE0F\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|\u{1F3F4}\u200D\u2620|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F470}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F935}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D4}\u{1F9D6}-\u{1F9DD}]\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299\u{1F170}\u{1F171}\u{1F17E}\u{1F17F}\u{1F202}\u{1F237}\u{1F321}\u{1F324}-\u{1F32C}\u{1F336}\u{1F37D}\u{1F396}\u{1F397}\u{1F399}-\u{1F39B}\u{1F39E}\u{1F39F}\u{1F3CD}\u{1F3CE}\u{1F3D4}-\u{1F3DF}\u{1F3F5}\u{1F3F7}\u{1F43F}\u{1F4FD}\u{1F549}\u{1F54A}\u{1F56F}\u{1F570}\u{1F573}\u{1F576}-\u{1F579}\u{1F587}\u{1F58A}-\u{1F58D}\u{1F5A5}\u{1F5A8}\u{1F5B1}\u{1F5B2}\u{1F5BC}\u{1F5C2}-\u{1F5C4}\u{1F5D1}-\u{1F5D3}\u{1F5DC}-\u{1F5DE}\u{1F5E1}\u{1F5E3}\u{1F5E8}\u{1F5EF}\u{1F5F3}\u{1F5FA}\u{1F6CB}\u{1F6CD}-\u{1F6CF}\u{1F6E0}-\u{1F6E5}\u{1F6E9}\u{1F6F0}\u{1F6F3}])\uFE0F|\u{1F3F3}\uFE0F\u200D\u{1F308}|\u{1F469}\u200D\u{1F467}|\u{1F469}\u200D\u{1F466}|\u{1F635}\u200D\u{1F4AB}|\u{1F62E}\u200D\u{1F4A8}|\u{1F415}\u200D\u{1F9BA}|\u{1F9D1}(?:\u{1F3FF}|\u{1F3FE}|\u{1F3FD}|\u{1F3FC}|\u{1F3FB})?|\u{1F469}(?:\u{1F3FF}|\u{1F3FE}|\u{1F3FD}|\u{1F3FC}|\u{1F3FB})?|\u{1F1FD}\u{1F1F0}|\u{1F1F6}\u{1F1E6}|\u{1F1F4}\u{1F1F2}|\u{1F408}\u200D\u2B1B|\u2764\uFE0F\u200D[\u{1F525}\u{1FA79}]|\u{1F441}\uFE0F|\u{1F3F3}\uFE0F|\u{1F1FF}[\u{1F1E6}\u{1F1F2}\u{1F1FC}]|\u{1F1FE}[\u{1F1EA}\u{1F1F9}]|\u{1F1FC}[\u{1F1EB}\u{1F1F8}]|\u{1F1FB}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1EE}\u{1F1F3}\u{1F1FA}]|\u{1F1FA}[\u{1F1E6}\u{1F1EC}\u{1F1F2}\u{1F1F3}\u{1F1F8}\u{1F1FE}\u{1F1FF}]|\u{1F1F9}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1ED}\u{1F1EF}-\u{1F1F4}\u{1F1F7}\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FF}]|\u{1F1F8}[\u{1F1E6}-\u{1F1EA}\u{1F1EC}-\u{1F1F4}\u{1F1F7}-\u{1F1F9}\u{1F1FB}\u{1F1FD}-\u{1F1FF}]|\u{1F1F7}[\u{1F1EA}\u{1F1F4}\u{1F1F8}\u{1F1FA}\u{1F1FC}]|\u{1F1F5}[\u{1F1E6}\u{1F1EA}-\u{1F1ED}\u{1F1F0}-\u{1F1F3}\u{1F1F7}-\u{1F1F9}\u{1F1FC}\u{1F1FE}]|\u{1F1F3}[\u{1F1E6}\u{1F1E8}\u{1F1EA}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F4}\u{1F1F5}\u{1F1F7}\u{1F1FA}\u{1F1FF}]|\u{1F1F2}[\u{1F1E6}\u{1F1E8}-\u{1F1ED}\u{1F1F0}-\u{1F1FF}]|\u{1F1F1}[\u{1F1E6}-\u{1F1E8}\u{1F1EE}\u{1F1F0}\u{1F1F7}-\u{1F1FB}\u{1F1FE}]|\u{1F1F0}[\u{1F1EA}\u{1F1EC}-\u{1F1EE}\u{1F1F2}\u{1F1F3}\u{1F1F5}\u{1F1F7}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1EF}[\u{1F1EA}\u{1F1F2}\u{1F1F4}\u{1F1F5}]|\u{1F1EE}[\u{1F1E8}-\u{1F1EA}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}]|\u{1F1ED}[\u{1F1F0}\u{1F1F2}\u{1F1F3}\u{1F1F7}\u{1F1F9}\u{1F1FA}]|\u{1F1EC}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EE}\u{1F1F1}-\u{1F1F3}\u{1F1F5}-\u{1F1FA}\u{1F1FC}\u{1F1FE}]|\u{1F1EB}[\u{1F1EE}-\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1F7}]|\u{1F1EA}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1ED}\u{1F1F7}-\u{1F1FA}]|\u{1F1E9}[\u{1F1EA}\u{1F1EC}\u{1F1EF}\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1FF}]|\u{1F1E8}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1EE}\u{1F1F0}-\u{1F1F5}\u{1F1F7}\u{1F1FA}-\u{1F1FF}]|\u{1F1E7}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EF}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1E6}[\u{1F1E8}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F2}\u{1F1F4}\u{1F1F6}-\u{1F1FA}\u{1F1FC}\u{1F1FD}\u{1F1FF}]|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F470}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F935}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D4}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\uFE0F\u{1F3FB}-\u{1F3FF}]|\u{1F3F4}|[\u270A\u270B\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F46B}-\u{1F46D}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F48F}\u{1F491}\u{1F4AA}\u{1F57A}\u{1F595}\u{1F596}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F90C}\u{1F90F}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F930}-\u{1F934}\u{1F936}\u{1F977}\u{1F9B5}\u{1F9B6}\u{1F9BB}\u{1F9D2}\u{1F9D3}\u{1F9D5}][\u{1F3FB}-\u{1F3FF}]|[\u261D\u270C\u270D\u{1F574}\u{1F590}][\uFE0F\u{1F3FB}-\u{1F3FF}]|[\u270A\u270B\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F408}\u{1F415}\u{1F43B}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F46B}-\u{1F46D}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F48F}\u{1F491}\u{1F4AA}\u{1F57A}\u{1F595}\u{1F596}\u{1F62E}\u{1F635}\u{1F636}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F90C}\u{1F90F}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F930}-\u{1F934}\u{1F936}\u{1F977}\u{1F9B5}\u{1F9B6}\u{1F9BB}\u{1F9D2}\u{1F9D3}\u{1F9D5}]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F470}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F935}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D4}\u{1F9D6}-\u{1F9DD}]|[\u{1F46F}\u{1F93C}\u{1F9DE}\u{1F9DF}]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55\u{1F004}\u{1F0CF}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F201}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F236}\u{1F238}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F320}\u{1F32D}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F37E}-\u{1F384}\u{1F386}-\u{1F393}\u{1F3A0}-\u{1F3C1}\u{1F3C5}\u{1F3C6}\u{1F3C8}\u{1F3C9}\u{1F3CF}-\u{1F3D3}\u{1F3E0}-\u{1F3F0}\u{1F3F8}-\u{1F407}\u{1F409}-\u{1F414}\u{1F416}-\u{1F43A}\u{1F43C}-\u{1F43E}\u{1F440}\u{1F444}\u{1F445}\u{1F451}-\u{1F465}\u{1F46A}\u{1F479}-\u{1F47B}\u{1F47D}-\u{1F480}\u{1F484}\u{1F488}-\u{1F48E}\u{1F490}\u{1F492}-\u{1F4A9}\u{1F4AB}-\u{1F4FC}\u{1F4FF}-\u{1F53D}\u{1F54B}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F5A4}\u{1F5FB}-\u{1F62D}\u{1F62F}-\u{1F634}\u{1F637}-\u{1F644}\u{1F648}-\u{1F64A}\u{1F680}-\u{1F6A2}\u{1F6A4}-\u{1F6B3}\u{1F6B7}-\u{1F6BF}\u{1F6C1}-\u{1F6C5}\u{1F6D0}-\u{1F6D2}\u{1F6D5}-\u{1F6D7}\u{1F6EB}\u{1F6EC}\u{1F6F4}-\u{1F6FC}\u{1F7E0}-\u{1F7EB}\u{1F90D}\u{1F90E}\u{1F910}-\u{1F917}\u{1F91D}\u{1F920}-\u{1F925}\u{1F927}-\u{1F92F}\u{1F93A}\u{1F93F}-\u{1F945}\u{1F947}-\u{1F976}\u{1F978}\u{1F97A}-\u{1F9B4}\u{1F9B7}\u{1F9BA}\u{1F9BC}-\u{1F9CB}\u{1F9D0}\u{1F9E0}-\u{1F9FF}\u{1FA70}-\u{1FA74}\u{1FA78}-\u{1FA7A}\u{1FA80}-\u{1FA86}\u{1FA90}-\u{1FAA8}\u{1FAB0}-\u{1FAB6}\u{1FAC0}-\u{1FAC2}\u{1FAD0}-\u{1FAD6}]/gu; -}; diff --git a/node_modules/@isaacs/cliui/node_modules/emoji-regex/es2015/index.d.ts b/node_modules/@isaacs/cliui/node_modules/emoji-regex/es2015/index.d.ts deleted file mode 100644 index 823dfa6..0000000 --- a/node_modules/@isaacs/cliui/node_modules/emoji-regex/es2015/index.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -declare module 'emoji-regex/es2015' { - function emojiRegex(): RegExp; - - export = emojiRegex; -} diff --git a/node_modules/@isaacs/cliui/node_modules/emoji-regex/es2015/index.js b/node_modules/@isaacs/cliui/node_modules/emoji-regex/es2015/index.js deleted file mode 100644 index 1a4fc8d..0000000 --- a/node_modules/@isaacs/cliui/node_modules/emoji-regex/es2015/index.js +++ /dev/null @@ -1,6 +0,0 @@ -"use strict"; - -module.exports = () => { - // https://mths.be/emoji - return /\u{1F3F4}\u{E0067}\u{E0062}(?:\u{E0077}\u{E006C}\u{E0073}|\u{E0073}\u{E0063}\u{E0074}|\u{E0065}\u{E006E}\u{E0067})\u{E007F}|(?:\u{1F9D1}\u{1F3FF}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FF}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}-\u{1F3FE}]|(?:\u{1F9D1}\u{1F3FE}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FE}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}-\u{1F3FD}\u{1F3FF}]|(?:\u{1F9D1}\u{1F3FD}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FD}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}\u{1F3FC}\u{1F3FE}\u{1F3FF}]|(?:\u{1F9D1}\u{1F3FC}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FC}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}\u{1F3FD}-\u{1F3FF}]|(?:\u{1F9D1}\u{1F3FB}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FB}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FC}-\u{1F3FF}]|\u{1F468}(?:\u{1F3FB}(?:\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FF}]|\u{1F468}[\u{1F3FB}-\u{1F3FF}])|\u{1F91D}\u200D\u{1F468}[\u{1F3FC}-\u{1F3FF}]|[\u2695\u2696\u2708]\uFE0F|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]))?|[\u{1F3FC}-\u{1F3FF}]\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FF}]|\u{1F468}[\u{1F3FB}-\u{1F3FF}])|\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F468}|[\u{1F468}\u{1F469}]\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FE}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FE}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FD}\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FD}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FC}\u{1F3FE}\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FC}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FD}-\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|(?:\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:[\u{1F468}\u{1F469}]\u200D[\u{1F466}\u{1F467}]|[\u{1F466}\u{1F467}])|\u{1F3FF}|\u{1F3FE}|\u{1F3FD}|\u{1F3FC})?|(?:\u{1F469}(?:\u{1F3FB}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}])|[\u{1F3FC}-\u{1F3FF}]\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}]))|\u{1F9D1}[\u{1F3FB}-\u{1F3FF}]\u200D\u{1F91D}\u200D\u{1F9D1})[\u{1F3FB}-\u{1F3FF}]|\u{1F469}\u200D\u{1F469}\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F469}(?:\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}])|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FE}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FD}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FC}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FB}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F9D1}(?:\u200D(?:\u{1F91D}\u200D\u{1F9D1}|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FE}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FD}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FC}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FB}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F469}\u200D\u{1F466}\u200D\u{1F466}|\u{1F469}\u200D\u{1F469}\u200D[\u{1F466}\u{1F467}]|\u{1F469}\u200D\u{1F467}\u200D[\u{1F466}\u{1F467}]|(?:\u{1F441}\uFE0F\u200D\u{1F5E8}|\u{1F9D1}(?:\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708]|\u{1F3FB}\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\u{1F469}(?:\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708]|\u{1F3FB}\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\u{1F636}\u200D\u{1F32B}|\u{1F3F3}\uFE0F\u200D\u26A7|\u{1F43B}\u200D\u2744|(?:[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F470}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F935}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D4}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]|[\u{1F46F}\u{1F93C}\u{1F9DE}\u{1F9DF}])\u200D[\u2640\u2642]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\uFE0F\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|\u{1F3F4}\u200D\u2620|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F470}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F935}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D4}\u{1F9D6}-\u{1F9DD}]\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299\u{1F170}\u{1F171}\u{1F17E}\u{1F17F}\u{1F202}\u{1F237}\u{1F321}\u{1F324}-\u{1F32C}\u{1F336}\u{1F37D}\u{1F396}\u{1F397}\u{1F399}-\u{1F39B}\u{1F39E}\u{1F39F}\u{1F3CD}\u{1F3CE}\u{1F3D4}-\u{1F3DF}\u{1F3F5}\u{1F3F7}\u{1F43F}\u{1F4FD}\u{1F549}\u{1F54A}\u{1F56F}\u{1F570}\u{1F573}\u{1F576}-\u{1F579}\u{1F587}\u{1F58A}-\u{1F58D}\u{1F5A5}\u{1F5A8}\u{1F5B1}\u{1F5B2}\u{1F5BC}\u{1F5C2}-\u{1F5C4}\u{1F5D1}-\u{1F5D3}\u{1F5DC}-\u{1F5DE}\u{1F5E1}\u{1F5E3}\u{1F5E8}\u{1F5EF}\u{1F5F3}\u{1F5FA}\u{1F6CB}\u{1F6CD}-\u{1F6CF}\u{1F6E0}-\u{1F6E5}\u{1F6E9}\u{1F6F0}\u{1F6F3}])\uFE0F|\u{1F3F3}\uFE0F\u200D\u{1F308}|\u{1F469}\u200D\u{1F467}|\u{1F469}\u200D\u{1F466}|\u{1F635}\u200D\u{1F4AB}|\u{1F62E}\u200D\u{1F4A8}|\u{1F415}\u200D\u{1F9BA}|\u{1F9D1}(?:\u{1F3FF}|\u{1F3FE}|\u{1F3FD}|\u{1F3FC}|\u{1F3FB})?|\u{1F469}(?:\u{1F3FF}|\u{1F3FE}|\u{1F3FD}|\u{1F3FC}|\u{1F3FB})?|\u{1F1FD}\u{1F1F0}|\u{1F1F6}\u{1F1E6}|\u{1F1F4}\u{1F1F2}|\u{1F408}\u200D\u2B1B|\u2764\uFE0F\u200D[\u{1F525}\u{1FA79}]|\u{1F441}\uFE0F|\u{1F3F3}\uFE0F|\u{1F1FF}[\u{1F1E6}\u{1F1F2}\u{1F1FC}]|\u{1F1FE}[\u{1F1EA}\u{1F1F9}]|\u{1F1FC}[\u{1F1EB}\u{1F1F8}]|\u{1F1FB}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1EE}\u{1F1F3}\u{1F1FA}]|\u{1F1FA}[\u{1F1E6}\u{1F1EC}\u{1F1F2}\u{1F1F3}\u{1F1F8}\u{1F1FE}\u{1F1FF}]|\u{1F1F9}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1ED}\u{1F1EF}-\u{1F1F4}\u{1F1F7}\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FF}]|\u{1F1F8}[\u{1F1E6}-\u{1F1EA}\u{1F1EC}-\u{1F1F4}\u{1F1F7}-\u{1F1F9}\u{1F1FB}\u{1F1FD}-\u{1F1FF}]|\u{1F1F7}[\u{1F1EA}\u{1F1F4}\u{1F1F8}\u{1F1FA}\u{1F1FC}]|\u{1F1F5}[\u{1F1E6}\u{1F1EA}-\u{1F1ED}\u{1F1F0}-\u{1F1F3}\u{1F1F7}-\u{1F1F9}\u{1F1FC}\u{1F1FE}]|\u{1F1F3}[\u{1F1E6}\u{1F1E8}\u{1F1EA}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F4}\u{1F1F5}\u{1F1F7}\u{1F1FA}\u{1F1FF}]|\u{1F1F2}[\u{1F1E6}\u{1F1E8}-\u{1F1ED}\u{1F1F0}-\u{1F1FF}]|\u{1F1F1}[\u{1F1E6}-\u{1F1E8}\u{1F1EE}\u{1F1F0}\u{1F1F7}-\u{1F1FB}\u{1F1FE}]|\u{1F1F0}[\u{1F1EA}\u{1F1EC}-\u{1F1EE}\u{1F1F2}\u{1F1F3}\u{1F1F5}\u{1F1F7}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1EF}[\u{1F1EA}\u{1F1F2}\u{1F1F4}\u{1F1F5}]|\u{1F1EE}[\u{1F1E8}-\u{1F1EA}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}]|\u{1F1ED}[\u{1F1F0}\u{1F1F2}\u{1F1F3}\u{1F1F7}\u{1F1F9}\u{1F1FA}]|\u{1F1EC}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EE}\u{1F1F1}-\u{1F1F3}\u{1F1F5}-\u{1F1FA}\u{1F1FC}\u{1F1FE}]|\u{1F1EB}[\u{1F1EE}-\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1F7}]|\u{1F1EA}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1ED}\u{1F1F7}-\u{1F1FA}]|\u{1F1E9}[\u{1F1EA}\u{1F1EC}\u{1F1EF}\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1FF}]|\u{1F1E8}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1EE}\u{1F1F0}-\u{1F1F5}\u{1F1F7}\u{1F1FA}-\u{1F1FF}]|\u{1F1E7}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EF}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1E6}[\u{1F1E8}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F2}\u{1F1F4}\u{1F1F6}-\u{1F1FA}\u{1F1FC}\u{1F1FD}\u{1F1FF}]|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F470}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F935}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D4}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\uFE0F\u{1F3FB}-\u{1F3FF}]|\u{1F3F4}|[\u270A\u270B\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F46B}-\u{1F46D}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F48F}\u{1F491}\u{1F4AA}\u{1F57A}\u{1F595}\u{1F596}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F90C}\u{1F90F}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F930}-\u{1F934}\u{1F936}\u{1F977}\u{1F9B5}\u{1F9B6}\u{1F9BB}\u{1F9D2}\u{1F9D3}\u{1F9D5}][\u{1F3FB}-\u{1F3FF}]|[\u261D\u270C\u270D\u{1F574}\u{1F590}][\uFE0F\u{1F3FB}-\u{1F3FF}]|[\u270A\u270B\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F408}\u{1F415}\u{1F43B}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F46B}-\u{1F46D}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F48F}\u{1F491}\u{1F4AA}\u{1F57A}\u{1F595}\u{1F596}\u{1F62E}\u{1F635}\u{1F636}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F90C}\u{1F90F}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F930}-\u{1F934}\u{1F936}\u{1F977}\u{1F9B5}\u{1F9B6}\u{1F9BB}\u{1F9D2}\u{1F9D3}\u{1F9D5}]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F470}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F935}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D4}\u{1F9D6}-\u{1F9DD}]|[\u{1F46F}\u{1F93C}\u{1F9DE}\u{1F9DF}]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55\u{1F004}\u{1F0CF}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F201}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F236}\u{1F238}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F320}\u{1F32D}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F37E}-\u{1F384}\u{1F386}-\u{1F393}\u{1F3A0}-\u{1F3C1}\u{1F3C5}\u{1F3C6}\u{1F3C8}\u{1F3C9}\u{1F3CF}-\u{1F3D3}\u{1F3E0}-\u{1F3F0}\u{1F3F8}-\u{1F407}\u{1F409}-\u{1F414}\u{1F416}-\u{1F43A}\u{1F43C}-\u{1F43E}\u{1F440}\u{1F444}\u{1F445}\u{1F451}-\u{1F465}\u{1F46A}\u{1F479}-\u{1F47B}\u{1F47D}-\u{1F480}\u{1F484}\u{1F488}-\u{1F48E}\u{1F490}\u{1F492}-\u{1F4A9}\u{1F4AB}-\u{1F4FC}\u{1F4FF}-\u{1F53D}\u{1F54B}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F5A4}\u{1F5FB}-\u{1F62D}\u{1F62F}-\u{1F634}\u{1F637}-\u{1F644}\u{1F648}-\u{1F64A}\u{1F680}-\u{1F6A2}\u{1F6A4}-\u{1F6B3}\u{1F6B7}-\u{1F6BF}\u{1F6C1}-\u{1F6C5}\u{1F6D0}-\u{1F6D2}\u{1F6D5}-\u{1F6D7}\u{1F6EB}\u{1F6EC}\u{1F6F4}-\u{1F6FC}\u{1F7E0}-\u{1F7EB}\u{1F90D}\u{1F90E}\u{1F910}-\u{1F917}\u{1F91D}\u{1F920}-\u{1F925}\u{1F927}-\u{1F92F}\u{1F93A}\u{1F93F}-\u{1F945}\u{1F947}-\u{1F976}\u{1F978}\u{1F97A}-\u{1F9B4}\u{1F9B7}\u{1F9BA}\u{1F9BC}-\u{1F9CB}\u{1F9D0}\u{1F9E0}-\u{1F9FF}\u{1FA70}-\u{1FA74}\u{1FA78}-\u{1FA7A}\u{1FA80}-\u{1FA86}\u{1FA90}-\u{1FAA8}\u{1FAB0}-\u{1FAB6}\u{1FAC0}-\u{1FAC2}\u{1FAD0}-\u{1FAD6}]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55\u{1F004}\u{1F0CF}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F236}\u{1F238}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F320}\u{1F32D}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F37E}-\u{1F393}\u{1F3A0}-\u{1F3CA}\u{1F3CF}-\u{1F3D3}\u{1F3E0}-\u{1F3F0}\u{1F3F4}\u{1F3F8}-\u{1F43E}\u{1F440}\u{1F442}-\u{1F4FC}\u{1F4FF}-\u{1F53D}\u{1F54B}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F57A}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5FB}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CC}\u{1F6D0}-\u{1F6D2}\u{1F6D5}-\u{1F6D7}\u{1F6EB}\u{1F6EC}\u{1F6F4}-\u{1F6FC}\u{1F7E0}-\u{1F7EB}\u{1F90C}-\u{1F93A}\u{1F93C}-\u{1F945}\u{1F947}-\u{1F978}\u{1F97A}-\u{1F9CB}\u{1F9CD}-\u{1F9FF}\u{1FA70}-\u{1FA74}\u{1FA78}-\u{1FA7A}\u{1FA80}-\u{1FA86}\u{1FA90}-\u{1FAA8}\u{1FAB0}-\u{1FAB6}\u{1FAC0}-\u{1FAC2}\u{1FAD0}-\u{1FAD6}]|[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26A7\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299\u{1F004}\u{1F0CF}\u{1F170}\u{1F171}\u{1F17E}\u{1F17F}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F202}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F321}\u{1F324}-\u{1F393}\u{1F396}\u{1F397}\u{1F399}-\u{1F39B}\u{1F39E}-\u{1F3F0}\u{1F3F3}-\u{1F3F5}\u{1F3F7}-\u{1F4FD}\u{1F4FF}-\u{1F53D}\u{1F549}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F56F}\u{1F570}\u{1F573}-\u{1F57A}\u{1F587}\u{1F58A}-\u{1F58D}\u{1F590}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5A5}\u{1F5A8}\u{1F5B1}\u{1F5B2}\u{1F5BC}\u{1F5C2}-\u{1F5C4}\u{1F5D1}-\u{1F5D3}\u{1F5DC}-\u{1F5DE}\u{1F5E1}\u{1F5E3}\u{1F5E8}\u{1F5EF}\u{1F5F3}\u{1F5FA}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CB}-\u{1F6D2}\u{1F6D5}-\u{1F6D7}\u{1F6E0}-\u{1F6E5}\u{1F6E9}\u{1F6EB}\u{1F6EC}\u{1F6F0}\u{1F6F3}-\u{1F6FC}\u{1F7E0}-\u{1F7EB}\u{1F90C}-\u{1F93A}\u{1F93C}-\u{1F945}\u{1F947}-\u{1F978}\u{1F97A}-\u{1F9CB}\u{1F9CD}-\u{1F9FF}\u{1FA70}-\u{1FA74}\u{1FA78}-\u{1FA7A}\u{1FA80}-\u{1FA86}\u{1FA90}-\u{1FAA8}\u{1FAB0}-\u{1FAB6}\u{1FAC0}-\u{1FAC2}\u{1FAD0}-\u{1FAD6}]\uFE0F|[\u261D\u26F9\u270A-\u270D\u{1F385}\u{1F3C2}-\u{1F3C4}\u{1F3C7}\u{1F3CA}-\u{1F3CC}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}-\u{1F478}\u{1F47C}\u{1F481}-\u{1F483}\u{1F485}-\u{1F487}\u{1F48F}\u{1F491}\u{1F4AA}\u{1F574}\u{1F575}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F645}-\u{1F647}\u{1F64B}-\u{1F64F}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F6C0}\u{1F6CC}\u{1F90C}\u{1F90F}\u{1F918}-\u{1F91F}\u{1F926}\u{1F930}-\u{1F939}\u{1F93C}-\u{1F93E}\u{1F977}\u{1F9B5}\u{1F9B6}\u{1F9B8}\u{1F9B9}\u{1F9BB}\u{1F9CD}-\u{1F9CF}\u{1F9D1}-\u{1F9DD}]/gu; -}; diff --git a/node_modules/@isaacs/cliui/node_modules/emoji-regex/es2015/text.d.ts b/node_modules/@isaacs/cliui/node_modules/emoji-regex/es2015/text.d.ts deleted file mode 100644 index ccc2f9a..0000000 --- a/node_modules/@isaacs/cliui/node_modules/emoji-regex/es2015/text.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -declare module 'emoji-regex/es2015/text' { - function emojiRegex(): RegExp; - - export = emojiRegex; -} diff --git a/node_modules/@isaacs/cliui/node_modules/emoji-regex/es2015/text.js b/node_modules/@isaacs/cliui/node_modules/emoji-regex/es2015/text.js deleted file mode 100644 index 8e9f985..0000000 --- a/node_modules/@isaacs/cliui/node_modules/emoji-regex/es2015/text.js +++ /dev/null @@ -1,6 +0,0 @@ -"use strict"; - -module.exports = () => { - // https://mths.be/emoji - return /\u{1F3F4}\u{E0067}\u{E0062}(?:\u{E0077}\u{E006C}\u{E0073}|\u{E0073}\u{E0063}\u{E0074}|\u{E0065}\u{E006E}\u{E0067})\u{E007F}|(?:\u{1F9D1}\u{1F3FF}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FF}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}-\u{1F3FE}]|(?:\u{1F9D1}\u{1F3FE}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FE}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}-\u{1F3FD}\u{1F3FF}]|(?:\u{1F9D1}\u{1F3FD}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FD}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}\u{1F3FC}\u{1F3FE}\u{1F3FF}]|(?:\u{1F9D1}\u{1F3FC}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FC}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}\u{1F3FD}-\u{1F3FF}]|(?:\u{1F9D1}\u{1F3FB}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F9D1}|\u{1F469}\u{1F3FB}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FC}-\u{1F3FF}]|\u{1F468}(?:\u{1F3FB}(?:\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FF}]|\u{1F468}[\u{1F3FB}-\u{1F3FF}])|\u{1F91D}\u200D\u{1F468}[\u{1F3FC}-\u{1F3FF}]|[\u2695\u2696\u2708]\uFE0F|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]))?|[\u{1F3FC}-\u{1F3FF}]\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FF}]|\u{1F468}[\u{1F3FB}-\u{1F3FF}])|\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F468}|[\u{1F468}\u{1F469}]\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FE}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FE}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FD}\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FD}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FC}\u{1F3FE}\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FC}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FD}-\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|(?:\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:[\u{1F468}\u{1F469}]\u200D[\u{1F466}\u{1F467}]|[\u{1F466}\u{1F467}])|\u{1F3FF}|\u{1F3FE}|\u{1F3FD}|\u{1F3FC})?|(?:\u{1F469}(?:\u{1F3FB}\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}])|[\u{1F3FC}-\u{1F3FF}]\u200D\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}]))|\u{1F9D1}[\u{1F3FB}-\u{1F3FF}]\u200D\u{1F91D}\u200D\u{1F9D1})[\u{1F3FB}-\u{1F3FF}]|\u{1F469}\u200D\u{1F469}\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F469}(?:\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}])|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FE}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FD}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FC}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FB}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F9D1}(?:\u200D(?:\u{1F91D}\u200D\u{1F9D1}|[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FE}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FD}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FC}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|\u{1F3FB}\u200D[\u{1F33E}\u{1F373}\u{1F37C}\u{1F384}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F469}\u200D\u{1F466}\u200D\u{1F466}|\u{1F469}\u200D\u{1F469}\u200D[\u{1F466}\u{1F467}]|\u{1F469}\u200D\u{1F467}\u200D[\u{1F466}\u{1F467}]|(?:\u{1F441}\uFE0F\u200D\u{1F5E8}|\u{1F9D1}(?:\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708]|\u{1F3FB}\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\u{1F469}(?:\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708]|\u{1F3FB}\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\u{1F636}\u200D\u{1F32B}|\u{1F3F3}\uFE0F\u200D\u26A7|\u{1F43B}\u200D\u2744|(?:[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F470}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F935}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D4}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]|[\u{1F46F}\u{1F93C}\u{1F9DE}\u{1F9DF}])\u200D[\u2640\u2642]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\uFE0F\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|\u{1F3F4}\u200D\u2620|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F470}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F935}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D4}\u{1F9D6}-\u{1F9DD}]\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299\u{1F170}\u{1F171}\u{1F17E}\u{1F17F}\u{1F202}\u{1F237}\u{1F321}\u{1F324}-\u{1F32C}\u{1F336}\u{1F37D}\u{1F396}\u{1F397}\u{1F399}-\u{1F39B}\u{1F39E}\u{1F39F}\u{1F3CD}\u{1F3CE}\u{1F3D4}-\u{1F3DF}\u{1F3F5}\u{1F3F7}\u{1F43F}\u{1F4FD}\u{1F549}\u{1F54A}\u{1F56F}\u{1F570}\u{1F573}\u{1F576}-\u{1F579}\u{1F587}\u{1F58A}-\u{1F58D}\u{1F5A5}\u{1F5A8}\u{1F5B1}\u{1F5B2}\u{1F5BC}\u{1F5C2}-\u{1F5C4}\u{1F5D1}-\u{1F5D3}\u{1F5DC}-\u{1F5DE}\u{1F5E1}\u{1F5E3}\u{1F5E8}\u{1F5EF}\u{1F5F3}\u{1F5FA}\u{1F6CB}\u{1F6CD}-\u{1F6CF}\u{1F6E0}-\u{1F6E5}\u{1F6E9}\u{1F6F0}\u{1F6F3}])\uFE0F|\u{1F3F3}\uFE0F\u200D\u{1F308}|\u{1F469}\u200D\u{1F467}|\u{1F469}\u200D\u{1F466}|\u{1F635}\u200D\u{1F4AB}|\u{1F62E}\u200D\u{1F4A8}|\u{1F415}\u200D\u{1F9BA}|\u{1F9D1}(?:\u{1F3FF}|\u{1F3FE}|\u{1F3FD}|\u{1F3FC}|\u{1F3FB})?|\u{1F469}(?:\u{1F3FF}|\u{1F3FE}|\u{1F3FD}|\u{1F3FC}|\u{1F3FB})?|\u{1F1FD}\u{1F1F0}|\u{1F1F6}\u{1F1E6}|\u{1F1F4}\u{1F1F2}|\u{1F408}\u200D\u2B1B|\u2764\uFE0F\u200D[\u{1F525}\u{1FA79}]|\u{1F441}\uFE0F|\u{1F3F3}\uFE0F|\u{1F1FF}[\u{1F1E6}\u{1F1F2}\u{1F1FC}]|\u{1F1FE}[\u{1F1EA}\u{1F1F9}]|\u{1F1FC}[\u{1F1EB}\u{1F1F8}]|\u{1F1FB}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1EE}\u{1F1F3}\u{1F1FA}]|\u{1F1FA}[\u{1F1E6}\u{1F1EC}\u{1F1F2}\u{1F1F3}\u{1F1F8}\u{1F1FE}\u{1F1FF}]|\u{1F1F9}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1ED}\u{1F1EF}-\u{1F1F4}\u{1F1F7}\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FF}]|\u{1F1F8}[\u{1F1E6}-\u{1F1EA}\u{1F1EC}-\u{1F1F4}\u{1F1F7}-\u{1F1F9}\u{1F1FB}\u{1F1FD}-\u{1F1FF}]|\u{1F1F7}[\u{1F1EA}\u{1F1F4}\u{1F1F8}\u{1F1FA}\u{1F1FC}]|\u{1F1F5}[\u{1F1E6}\u{1F1EA}-\u{1F1ED}\u{1F1F0}-\u{1F1F3}\u{1F1F7}-\u{1F1F9}\u{1F1FC}\u{1F1FE}]|\u{1F1F3}[\u{1F1E6}\u{1F1E8}\u{1F1EA}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F4}\u{1F1F5}\u{1F1F7}\u{1F1FA}\u{1F1FF}]|\u{1F1F2}[\u{1F1E6}\u{1F1E8}-\u{1F1ED}\u{1F1F0}-\u{1F1FF}]|\u{1F1F1}[\u{1F1E6}-\u{1F1E8}\u{1F1EE}\u{1F1F0}\u{1F1F7}-\u{1F1FB}\u{1F1FE}]|\u{1F1F0}[\u{1F1EA}\u{1F1EC}-\u{1F1EE}\u{1F1F2}\u{1F1F3}\u{1F1F5}\u{1F1F7}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1EF}[\u{1F1EA}\u{1F1F2}\u{1F1F4}\u{1F1F5}]|\u{1F1EE}[\u{1F1E8}-\u{1F1EA}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}]|\u{1F1ED}[\u{1F1F0}\u{1F1F2}\u{1F1F3}\u{1F1F7}\u{1F1F9}\u{1F1FA}]|\u{1F1EC}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EE}\u{1F1F1}-\u{1F1F3}\u{1F1F5}-\u{1F1FA}\u{1F1FC}\u{1F1FE}]|\u{1F1EB}[\u{1F1EE}-\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1F7}]|\u{1F1EA}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1ED}\u{1F1F7}-\u{1F1FA}]|\u{1F1E9}[\u{1F1EA}\u{1F1EC}\u{1F1EF}\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1FF}]|\u{1F1E8}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1EE}\u{1F1F0}-\u{1F1F5}\u{1F1F7}\u{1F1FA}-\u{1F1FF}]|\u{1F1E7}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EF}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1E6}[\u{1F1E8}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F2}\u{1F1F4}\u{1F1F6}-\u{1F1FA}\u{1F1FC}\u{1F1FD}\u{1F1FF}]|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F470}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F935}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D4}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\uFE0F\u{1F3FB}-\u{1F3FF}]|\u{1F3F4}|[\u270A\u270B\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F46B}-\u{1F46D}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F48F}\u{1F491}\u{1F4AA}\u{1F57A}\u{1F595}\u{1F596}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F90C}\u{1F90F}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F930}-\u{1F934}\u{1F936}\u{1F977}\u{1F9B5}\u{1F9B6}\u{1F9BB}\u{1F9D2}\u{1F9D3}\u{1F9D5}][\u{1F3FB}-\u{1F3FF}]|[\u261D\u270C\u270D\u{1F574}\u{1F590}][\uFE0F\u{1F3FB}-\u{1F3FF}]|[\u270A\u270B\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F408}\u{1F415}\u{1F43B}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F46B}-\u{1F46D}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F48F}\u{1F491}\u{1F4AA}\u{1F57A}\u{1F595}\u{1F596}\u{1F62E}\u{1F635}\u{1F636}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F90C}\u{1F90F}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F930}-\u{1F934}\u{1F936}\u{1F977}\u{1F9B5}\u{1F9B6}\u{1F9BB}\u{1F9D2}\u{1F9D3}\u{1F9D5}]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F470}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F935}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D4}\u{1F9D6}-\u{1F9DD}]|[\u{1F46F}\u{1F93C}\u{1F9DE}\u{1F9DF}]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55\u{1F004}\u{1F0CF}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F201}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F236}\u{1F238}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F320}\u{1F32D}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F37E}-\u{1F384}\u{1F386}-\u{1F393}\u{1F3A0}-\u{1F3C1}\u{1F3C5}\u{1F3C6}\u{1F3C8}\u{1F3C9}\u{1F3CF}-\u{1F3D3}\u{1F3E0}-\u{1F3F0}\u{1F3F8}-\u{1F407}\u{1F409}-\u{1F414}\u{1F416}-\u{1F43A}\u{1F43C}-\u{1F43E}\u{1F440}\u{1F444}\u{1F445}\u{1F451}-\u{1F465}\u{1F46A}\u{1F479}-\u{1F47B}\u{1F47D}-\u{1F480}\u{1F484}\u{1F488}-\u{1F48E}\u{1F490}\u{1F492}-\u{1F4A9}\u{1F4AB}-\u{1F4FC}\u{1F4FF}-\u{1F53D}\u{1F54B}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F5A4}\u{1F5FB}-\u{1F62D}\u{1F62F}-\u{1F634}\u{1F637}-\u{1F644}\u{1F648}-\u{1F64A}\u{1F680}-\u{1F6A2}\u{1F6A4}-\u{1F6B3}\u{1F6B7}-\u{1F6BF}\u{1F6C1}-\u{1F6C5}\u{1F6D0}-\u{1F6D2}\u{1F6D5}-\u{1F6D7}\u{1F6EB}\u{1F6EC}\u{1F6F4}-\u{1F6FC}\u{1F7E0}-\u{1F7EB}\u{1F90D}\u{1F90E}\u{1F910}-\u{1F917}\u{1F91D}\u{1F920}-\u{1F925}\u{1F927}-\u{1F92F}\u{1F93A}\u{1F93F}-\u{1F945}\u{1F947}-\u{1F976}\u{1F978}\u{1F97A}-\u{1F9B4}\u{1F9B7}\u{1F9BA}\u{1F9BC}-\u{1F9CB}\u{1F9D0}\u{1F9E0}-\u{1F9FF}\u{1FA70}-\u{1FA74}\u{1FA78}-\u{1FA7A}\u{1FA80}-\u{1FA86}\u{1FA90}-\u{1FAA8}\u{1FAB0}-\u{1FAB6}\u{1FAC0}-\u{1FAC2}\u{1FAD0}-\u{1FAD6}]|[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26A7\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299\u{1F004}\u{1F0CF}\u{1F170}\u{1F171}\u{1F17E}\u{1F17F}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F202}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F321}\u{1F324}-\u{1F393}\u{1F396}\u{1F397}\u{1F399}-\u{1F39B}\u{1F39E}-\u{1F3F0}\u{1F3F3}-\u{1F3F5}\u{1F3F7}-\u{1F4FD}\u{1F4FF}-\u{1F53D}\u{1F549}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F56F}\u{1F570}\u{1F573}-\u{1F57A}\u{1F587}\u{1F58A}-\u{1F58D}\u{1F590}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5A5}\u{1F5A8}\u{1F5B1}\u{1F5B2}\u{1F5BC}\u{1F5C2}-\u{1F5C4}\u{1F5D1}-\u{1F5D3}\u{1F5DC}-\u{1F5DE}\u{1F5E1}\u{1F5E3}\u{1F5E8}\u{1F5EF}\u{1F5F3}\u{1F5FA}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CB}-\u{1F6D2}\u{1F6D5}-\u{1F6D7}\u{1F6E0}-\u{1F6E5}\u{1F6E9}\u{1F6EB}\u{1F6EC}\u{1F6F0}\u{1F6F3}-\u{1F6FC}\u{1F7E0}-\u{1F7EB}\u{1F90C}-\u{1F93A}\u{1F93C}-\u{1F945}\u{1F947}-\u{1F978}\u{1F97A}-\u{1F9CB}\u{1F9CD}-\u{1F9FF}\u{1FA70}-\u{1FA74}\u{1FA78}-\u{1FA7A}\u{1FA80}-\u{1FA86}\u{1FA90}-\u{1FAA8}\u{1FAB0}-\u{1FAB6}\u{1FAC0}-\u{1FAC2}\u{1FAD0}-\u{1FAD6}]\uFE0F?/gu; -}; diff --git a/node_modules/@isaacs/cliui/node_modules/emoji-regex/index.d.ts b/node_modules/@isaacs/cliui/node_modules/emoji-regex/index.d.ts deleted file mode 100644 index 8f235c9..0000000 --- a/node_modules/@isaacs/cliui/node_modules/emoji-regex/index.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -declare module 'emoji-regex' { - function emojiRegex(): RegExp; - - export = emojiRegex; -} diff --git a/node_modules/@isaacs/cliui/node_modules/emoji-regex/index.js b/node_modules/@isaacs/cliui/node_modules/emoji-regex/index.js deleted file mode 100644 index c0490d4..0000000 --- a/node_modules/@isaacs/cliui/node_modules/emoji-regex/index.js +++ /dev/null @@ -1,6 +0,0 @@ -"use strict"; - -module.exports = function () { - // https://mths.be/emoji - return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67)\uDB40\uDC7F|(?:\uD83E\uDDD1\uD83C\uDFFF\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFC-\uDFFF])|\uD83D\uDC68(?:\uD83C\uDFFB(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|[\u2695\u2696\u2708]\uFE0F|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))?|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC)?|(?:\uD83D\uDC69(?:\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC69(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83E\uDDD1(?:\u200D(?:\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDE36\u200D\uD83C\uDF2B|\uD83C\uDFF3\uFE0F\u200D\u26A7|\uD83D\uDC3B\u200D\u2744|(?:(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\uD83C\uDFF4\u200D\u2620|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299]|\uD83C[\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]|\uD83D[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])\uFE0F|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDE35\u200D\uD83D\uDCAB|\uD83D\uDE2E\u200D\uD83D\uDCA8|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83E\uDDD1(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83D\uDC69(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC08\u200D\u2B1B|\u2764\uFE0F\u200D(?:\uD83D\uDD25|\uD83E\uDE79)|\uD83D\uDC41\uFE0F|\uD83C\uDFF3\uFE0F|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF4|(?:[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270C\u270D]|\uD83D[\uDD74\uDD90])(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC08\uDC15\uDC3B\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE2E\uDE35\uDE36\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5]|\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD]|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0D\uDD0E\uDD10-\uDD17\uDD1D\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78\uDD7A-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCB\uDDD0\uDDE0-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6]|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26A7\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5-\uDED7\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDD77\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g; -}; diff --git a/node_modules/@isaacs/cliui/node_modules/emoji-regex/package.json b/node_modules/@isaacs/cliui/node_modules/emoji-regex/package.json deleted file mode 100644 index eac892a..0000000 --- a/node_modules/@isaacs/cliui/node_modules/emoji-regex/package.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "emoji-regex", - "version": "9.2.2", - "description": "A regular expression to match all Emoji-only symbols as per the Unicode Standard.", - "homepage": "https://mths.be/emoji-regex", - "main": "index.js", - "types": "index.d.ts", - "keywords": [ - "unicode", - "regex", - "regexp", - "regular expressions", - "code points", - "symbols", - "characters", - "emoji" - ], - "license": "MIT", - "author": { - "name": "Mathias Bynens", - "url": "https://mathiasbynens.be/" - }, - "repository": { - "type": "git", - "url": "https://github.com/mathiasbynens/emoji-regex.git" - }, - "bugs": "https://github.com/mathiasbynens/emoji-regex/issues", - "files": [ - "LICENSE-MIT.txt", - "index.js", - "index.d.ts", - "RGI_Emoji.js", - "RGI_Emoji.d.ts", - "text.js", - "text.d.ts", - "es2015" - ], - "scripts": { - "build": "rm -rf -- es2015; babel src -d .; NODE_ENV=es2015 babel src es2015_types -D -d ./es2015; node script/inject-sequences.js", - "test": "mocha", - "test:watch": "npm run test -- --watch" - }, - "devDependencies": { - "@babel/cli": "^7.4.4", - "@babel/core": "^7.4.4", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/preset-env": "^7.4.4", - "@unicode/unicode-13.0.0": "^1.0.3", - "mocha": "^6.1.4", - "regexgen": "^1.3.0" - } -} diff --git a/node_modules/@isaacs/cliui/node_modules/emoji-regex/text.d.ts b/node_modules/@isaacs/cliui/node_modules/emoji-regex/text.d.ts deleted file mode 100644 index c3a0125..0000000 --- a/node_modules/@isaacs/cliui/node_modules/emoji-regex/text.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -declare module 'emoji-regex/text' { - function emojiRegex(): RegExp; - - export = emojiRegex; -} diff --git a/node_modules/@isaacs/cliui/node_modules/emoji-regex/text.js b/node_modules/@isaacs/cliui/node_modules/emoji-regex/text.js deleted file mode 100644 index 9bc63ce..0000000 --- a/node_modules/@isaacs/cliui/node_modules/emoji-regex/text.js +++ /dev/null @@ -1,6 +0,0 @@ -"use strict"; - -module.exports = function () { - // https://mths.be/emoji - return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67)\uDB40\uDC7F|(?:\uD83E\uDDD1\uD83C\uDFFF\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFC-\uDFFF])|\uD83D\uDC68(?:\uD83C\uDFFB(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|[\u2695\u2696\u2708]\uFE0F|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))?|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC)?|(?:\uD83D\uDC69(?:\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC69(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83E\uDDD1(?:\u200D(?:\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDE36\u200D\uD83C\uDF2B|\uD83C\uDFF3\uFE0F\u200D\u26A7|\uD83D\uDC3B\u200D\u2744|(?:(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\uD83C\uDFF4\u200D\u2620|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299]|\uD83C[\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]|\uD83D[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])\uFE0F|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDE35\u200D\uD83D\uDCAB|\uD83D\uDE2E\u200D\uD83D\uDCA8|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83E\uDDD1(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83D\uDC69(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC08\u200D\u2B1B|\u2764\uFE0F\u200D(?:\uD83D\uDD25|\uD83E\uDE79)|\uD83D\uDC41\uFE0F|\uD83C\uDFF3\uFE0F|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF4|(?:[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270C\u270D]|\uD83D[\uDD74\uDD90])(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC08\uDC15\uDC3B\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE2E\uDE35\uDE36\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5]|\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD]|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0D\uDD0E\uDD10-\uDD17\uDD1D\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78\uDD7A-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCB\uDDD0\uDDE0-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6]|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26A7\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5-\uDED7\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])\uFE0F?/g; -}; diff --git a/node_modules/@isaacs/cliui/node_modules/string-width/index.d.ts b/node_modules/@isaacs/cliui/node_modules/string-width/index.d.ts deleted file mode 100644 index aed9fdf..0000000 --- a/node_modules/@isaacs/cliui/node_modules/string-width/index.d.ts +++ /dev/null @@ -1,29 +0,0 @@ -export interface Options { - /** - Count [ambiguous width characters](https://www.unicode.org/reports/tr11/#Ambiguous) as having narrow width (count of 1) instead of wide width (count of 2). - - @default true - */ - readonly ambiguousIsNarrow: boolean; -} - -/** -Get the visual width of a string - the number of columns required to display it. - -Some Unicode characters are [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms) and use double the normal width. [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) are stripped and doesn't affect the width. - -@example -``` -import stringWidth from 'string-width'; - -stringWidth('a'); -//=> 1 - -stringWidth('古'); -//=> 2 - -stringWidth('\u001B[1m古\u001B[22m'); -//=> 2 -``` -*/ -export default function stringWidth(string: string, options?: Options): number; diff --git a/node_modules/@isaacs/cliui/node_modules/string-width/index.js b/node_modules/@isaacs/cliui/node_modules/string-width/index.js deleted file mode 100644 index 9294488..0000000 --- a/node_modules/@isaacs/cliui/node_modules/string-width/index.js +++ /dev/null @@ -1,54 +0,0 @@ -import stripAnsi from 'strip-ansi'; -import eastAsianWidth from 'eastasianwidth'; -import emojiRegex from 'emoji-regex'; - -export default function stringWidth(string, options = {}) { - if (typeof string !== 'string' || string.length === 0) { - return 0; - } - - options = { - ambiguousIsNarrow: true, - ...options - }; - - string = stripAnsi(string); - - if (string.length === 0) { - return 0; - } - - string = string.replace(emojiRegex(), ' '); - - const ambiguousCharacterWidth = options.ambiguousIsNarrow ? 1 : 2; - let width = 0; - - for (const character of string) { - const codePoint = character.codePointAt(0); - - // Ignore control characters - if (codePoint <= 0x1F || (codePoint >= 0x7F && codePoint <= 0x9F)) { - continue; - } - - // Ignore combining characters - if (codePoint >= 0x300 && codePoint <= 0x36F) { - continue; - } - - const code = eastAsianWidth.eastAsianWidth(character); - switch (code) { - case 'F': - case 'W': - width += 2; - break; - case 'A': - width += ambiguousCharacterWidth; - break; - default: - width += 1; - } - } - - return width; -} diff --git a/node_modules/@isaacs/cliui/node_modules/string-width/license b/node_modules/@isaacs/cliui/node_modules/string-width/license deleted file mode 100644 index fa7ceba..0000000 --- a/node_modules/@isaacs/cliui/node_modules/string-width/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (https://sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/@isaacs/cliui/node_modules/string-width/package.json b/node_modules/@isaacs/cliui/node_modules/string-width/package.json deleted file mode 100644 index f46d677..0000000 --- a/node_modules/@isaacs/cliui/node_modules/string-width/package.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "name": "string-width", - "version": "5.1.2", - "description": "Get the visual width of a string - the number of columns required to display it", - "license": "MIT", - "repository": "sindresorhus/string-width", - "funding": "https://github.com/sponsors/sindresorhus", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "https://sindresorhus.com" - }, - "type": "module", - "exports": "./index.js", - "engines": { - "node": ">=12" - }, - "scripts": { - "test": "xo && ava && tsd" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "string", - "character", - "unicode", - "width", - "visual", - "column", - "columns", - "fullwidth", - "full-width", - "full", - "ansi", - "escape", - "codes", - "cli", - "command-line", - "terminal", - "console", - "cjk", - "chinese", - "japanese", - "korean", - "fixed-width" - ], - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "devDependencies": { - "ava": "^3.15.0", - "tsd": "^0.14.0", - "xo": "^0.38.2" - } -} diff --git a/node_modules/@isaacs/cliui/node_modules/string-width/readme.md b/node_modules/@isaacs/cliui/node_modules/string-width/readme.md deleted file mode 100644 index 52910df..0000000 --- a/node_modules/@isaacs/cliui/node_modules/string-width/readme.md +++ /dev/null @@ -1,67 +0,0 @@ -# string-width - -> Get the visual width of a string - the number of columns required to display it - -Some Unicode characters are [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms) and use double the normal width. [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) are stripped and doesn't affect the width. - -Useful to be able to measure the actual width of command-line output. - -## Install - -``` -$ npm install string-width -``` - -## Usage - -```js -import stringWidth from 'string-width'; - -stringWidth('a'); -//=> 1 - -stringWidth('古'); -//=> 2 - -stringWidth('\u001B[1m古\u001B[22m'); -//=> 2 -``` - -## API - -### stringWidth(string, options?) - -#### string - -Type: `string` - -The string to be counted. - -#### options - -Type: `object` - -##### ambiguousIsNarrow - -Type: `boolean`\ -Default: `false` - -Count [ambiguous width characters](https://www.unicode.org/reports/tr11/#Ambiguous) as having narrow width (count of 1) instead of wide width (count of 2). - -## Related - -- [string-width-cli](https://github.com/sindresorhus/string-width-cli) - CLI for this module -- [string-length](https://github.com/sindresorhus/string-length) - Get the real length of a string -- [widest-line](https://github.com/sindresorhus/widest-line) - Get the visual width of the widest line in a string - ---- - -

    - - Get professional support for this package with a Tidelift subscription - -
    - - Tidelift helps make open source sustainable for maintainers while giving companies
    assurances about security, maintenance, and licensing for their dependencies. -
    -
    diff --git a/node_modules/@isaacs/cliui/node_modules/strip-ansi/index.d.ts b/node_modules/@isaacs/cliui/node_modules/strip-ansi/index.d.ts deleted file mode 100644 index 44e954d..0000000 --- a/node_modules/@isaacs/cliui/node_modules/strip-ansi/index.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** -Strip [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) from a string. - -@example -``` -import stripAnsi from 'strip-ansi'; - -stripAnsi('\u001B[4mUnicorn\u001B[0m'); -//=> 'Unicorn' - -stripAnsi('\u001B]8;;https://github.com\u0007Click\u001B]8;;\u0007'); -//=> 'Click' -``` -*/ -export default function stripAnsi(string: string): string; diff --git a/node_modules/@isaacs/cliui/node_modules/strip-ansi/index.js b/node_modules/@isaacs/cliui/node_modules/strip-ansi/index.js deleted file mode 100644 index ba19750..0000000 --- a/node_modules/@isaacs/cliui/node_modules/strip-ansi/index.js +++ /dev/null @@ -1,14 +0,0 @@ -import ansiRegex from 'ansi-regex'; - -const regex = ansiRegex(); - -export default function stripAnsi(string) { - if (typeof string !== 'string') { - throw new TypeError(`Expected a \`string\`, got \`${typeof string}\``); - } - - // Even though the regex is global, we don't need to reset the `.lastIndex` - // because unlike `.exec()` and `.test()`, `.replace()` does it automatically - // and doing it manually has a performance penalty. - return string.replace(regex, ''); -} diff --git a/node_modules/@isaacs/cliui/node_modules/strip-ansi/license b/node_modules/@isaacs/cliui/node_modules/strip-ansi/license deleted file mode 100644 index fa7ceba..0000000 --- a/node_modules/@isaacs/cliui/node_modules/strip-ansi/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (https://sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/@isaacs/cliui/node_modules/strip-ansi/package.json b/node_modules/@isaacs/cliui/node_modules/strip-ansi/package.json deleted file mode 100644 index 2a59216..0000000 --- a/node_modules/@isaacs/cliui/node_modules/strip-ansi/package.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "name": "strip-ansi", - "version": "7.1.2", - "description": "Strip ANSI escape codes from a string", - "license": "MIT", - "repository": "chalk/strip-ansi", - "funding": "https://github.com/chalk/strip-ansi?sponsor=1", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "https://sindresorhus.com" - }, - "type": "module", - "exports": "./index.js", - "types": "./index.d.ts", - "sideEffects": false, - "engines": { - "node": ">=12" - }, - "scripts": { - "test": "xo && ava && tsd" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "strip", - "trim", - "remove", - "ansi", - "styles", - "color", - "colour", - "colors", - "terminal", - "console", - "string", - "tty", - "escape", - "formatting", - "rgb", - "256", - "shell", - "xterm", - "log", - "logging", - "command-line", - "text" - ], - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "devDependencies": { - "ava": "^3.15.0", - "tsd": "^0.17.0", - "xo": "^0.44.0" - } -} diff --git a/node_modules/@isaacs/cliui/node_modules/strip-ansi/readme.md b/node_modules/@isaacs/cliui/node_modules/strip-ansi/readme.md deleted file mode 100644 index 109b692..0000000 --- a/node_modules/@isaacs/cliui/node_modules/strip-ansi/readme.md +++ /dev/null @@ -1,37 +0,0 @@ -# strip-ansi - -> Strip [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) from a string - -> [!NOTE] -> Node.js has this built-in now with [`stripVTControlCharacters`](https://nodejs.org/api/util.html#utilstripvtcontrolcharactersstr). The benefit of this package is consistent behavior across Node.js versions and faster improvements. The Node.js version is actually based on this package. - -## Install - -```sh -npm install strip-ansi -``` - -## Usage - -```js -import stripAnsi from 'strip-ansi'; - -stripAnsi('\u001B[4mUnicorn\u001B[0m'); -//=> 'Unicorn' - -stripAnsi('\u001B]8;;https://github.com\u0007Click\u001B]8;;\u0007'); -//=> 'Click' -``` - -## Related - -- [strip-ansi-cli](https://github.com/chalk/strip-ansi-cli) - CLI for this module -- [strip-ansi-stream](https://github.com/chalk/strip-ansi-stream) - Streaming version of this module -- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes -- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes -- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right - -## Maintainers - -- [Sindre Sorhus](https://github.com/sindresorhus) -- [Josh Junon](https://github.com/qix-) diff --git a/node_modules/@isaacs/cliui/node_modules/wrap-ansi/index.d.ts b/node_modules/@isaacs/cliui/node_modules/wrap-ansi/index.d.ts deleted file mode 100644 index 95471ca..0000000 --- a/node_modules/@isaacs/cliui/node_modules/wrap-ansi/index.d.ts +++ /dev/null @@ -1,41 +0,0 @@ -export type Options = { - /** - By default the wrap is soft, meaning long words may extend past the column width. Setting this to `true` will make it hard wrap at the column width. - - @default false - */ - readonly hard?: boolean; - - /** - By default, an attempt is made to split words at spaces, ensuring that they don't extend past the configured columns. If wordWrap is `false`, each column will instead be completely filled splitting words as necessary. - - @default true - */ - readonly wordWrap?: boolean; - - /** - Whitespace on all lines is removed by default. Set this option to `false` if you don't want to trim. - - @default true - */ - readonly trim?: boolean; -}; - -/** -Wrap words to the specified column width. - -@param string - String with ANSI escape codes. Like one styled by [`chalk`](https://github.com/chalk/chalk). Newline characters will be normalized to `\n`. -@param columns - Number of columns to wrap the text to. - -@example -``` -import chalk from 'chalk'; -import wrapAnsi from 'wrap-ansi'; - -const input = 'The quick brown ' + chalk.red('fox jumped over ') + - 'the lazy ' + chalk.green('dog and then ran away with the unicorn.'); - -console.log(wrapAnsi(input, 20)); -``` -*/ -export default function wrapAnsi(string: string, columns: number, options?: Options): string; diff --git a/node_modules/@isaacs/cliui/node_modules/wrap-ansi/index.js b/node_modules/@isaacs/cliui/node_modules/wrap-ansi/index.js deleted file mode 100644 index d80c74c..0000000 --- a/node_modules/@isaacs/cliui/node_modules/wrap-ansi/index.js +++ /dev/null @@ -1,214 +0,0 @@ -import stringWidth from 'string-width'; -import stripAnsi from 'strip-ansi'; -import ansiStyles from 'ansi-styles'; - -const ESCAPES = new Set([ - '\u001B', - '\u009B', -]); - -const END_CODE = 39; -const ANSI_ESCAPE_BELL = '\u0007'; -const ANSI_CSI = '['; -const ANSI_OSC = ']'; -const ANSI_SGR_TERMINATOR = 'm'; -const ANSI_ESCAPE_LINK = `${ANSI_OSC}8;;`; - -const wrapAnsiCode = code => `${ESCAPES.values().next().value}${ANSI_CSI}${code}${ANSI_SGR_TERMINATOR}`; -const wrapAnsiHyperlink = uri => `${ESCAPES.values().next().value}${ANSI_ESCAPE_LINK}${uri}${ANSI_ESCAPE_BELL}`; - -// Calculate the length of words split on ' ', ignoring -// the extra characters added by ansi escape codes -const wordLengths = string => string.split(' ').map(character => stringWidth(character)); - -// Wrap a long word across multiple rows -// Ansi escape codes do not count towards length -const wrapWord = (rows, word, columns) => { - const characters = [...word]; - - let isInsideEscape = false; - let isInsideLinkEscape = false; - let visible = stringWidth(stripAnsi(rows[rows.length - 1])); - - for (const [index, character] of characters.entries()) { - const characterLength = stringWidth(character); - - if (visible + characterLength <= columns) { - rows[rows.length - 1] += character; - } else { - rows.push(character); - visible = 0; - } - - if (ESCAPES.has(character)) { - isInsideEscape = true; - isInsideLinkEscape = characters.slice(index + 1).join('').startsWith(ANSI_ESCAPE_LINK); - } - - if (isInsideEscape) { - if (isInsideLinkEscape) { - if (character === ANSI_ESCAPE_BELL) { - isInsideEscape = false; - isInsideLinkEscape = false; - } - } else if (character === ANSI_SGR_TERMINATOR) { - isInsideEscape = false; - } - - continue; - } - - visible += characterLength; - - if (visible === columns && index < characters.length - 1) { - rows.push(''); - visible = 0; - } - } - - // It's possible that the last row we copy over is only - // ansi escape characters, handle this edge-case - if (!visible && rows[rows.length - 1].length > 0 && rows.length > 1) { - rows[rows.length - 2] += rows.pop(); - } -}; - -// Trims spaces from a string ignoring invisible sequences -const stringVisibleTrimSpacesRight = string => { - const words = string.split(' '); - let last = words.length; - - while (last > 0) { - if (stringWidth(words[last - 1]) > 0) { - break; - } - - last--; - } - - if (last === words.length) { - return string; - } - - return words.slice(0, last).join(' ') + words.slice(last).join(''); -}; - -// The wrap-ansi module can be invoked in either 'hard' or 'soft' wrap mode -// -// 'hard' will never allow a string to take up more than columns characters -// -// 'soft' allows long words to expand past the column length -const exec = (string, columns, options = {}) => { - if (options.trim !== false && string.trim() === '') { - return ''; - } - - let returnValue = ''; - let escapeCode; - let escapeUrl; - - const lengths = wordLengths(string); - let rows = ['']; - - for (const [index, word] of string.split(' ').entries()) { - if (options.trim !== false) { - rows[rows.length - 1] = rows[rows.length - 1].trimStart(); - } - - let rowLength = stringWidth(rows[rows.length - 1]); - - if (index !== 0) { - if (rowLength >= columns && (options.wordWrap === false || options.trim === false)) { - // If we start with a new word but the current row length equals the length of the columns, add a new row - rows.push(''); - rowLength = 0; - } - - if (rowLength > 0 || options.trim === false) { - rows[rows.length - 1] += ' '; - rowLength++; - } - } - - // In 'hard' wrap mode, the length of a line is never allowed to extend past 'columns' - if (options.hard && lengths[index] > columns) { - const remainingColumns = (columns - rowLength); - const breaksStartingThisLine = 1 + Math.floor((lengths[index] - remainingColumns - 1) / columns); - const breaksStartingNextLine = Math.floor((lengths[index] - 1) / columns); - if (breaksStartingNextLine < breaksStartingThisLine) { - rows.push(''); - } - - wrapWord(rows, word, columns); - continue; - } - - if (rowLength + lengths[index] > columns && rowLength > 0 && lengths[index] > 0) { - if (options.wordWrap === false && rowLength < columns) { - wrapWord(rows, word, columns); - continue; - } - - rows.push(''); - } - - if (rowLength + lengths[index] > columns && options.wordWrap === false) { - wrapWord(rows, word, columns); - continue; - } - - rows[rows.length - 1] += word; - } - - if (options.trim !== false) { - rows = rows.map(row => stringVisibleTrimSpacesRight(row)); - } - - const pre = [...rows.join('\n')]; - - for (const [index, character] of pre.entries()) { - returnValue += character; - - if (ESCAPES.has(character)) { - const {groups} = new RegExp(`(?:\\${ANSI_CSI}(?\\d+)m|\\${ANSI_ESCAPE_LINK}(?.*)${ANSI_ESCAPE_BELL})`).exec(pre.slice(index).join('')) || {groups: {}}; - if (groups.code !== undefined) { - const code = Number.parseFloat(groups.code); - escapeCode = code === END_CODE ? undefined : code; - } else if (groups.uri !== undefined) { - escapeUrl = groups.uri.length === 0 ? undefined : groups.uri; - } - } - - const code = ansiStyles.codes.get(Number(escapeCode)); - - if (pre[index + 1] === '\n') { - if (escapeUrl) { - returnValue += wrapAnsiHyperlink(''); - } - - if (escapeCode && code) { - returnValue += wrapAnsiCode(code); - } - } else if (character === '\n') { - if (escapeCode && code) { - returnValue += wrapAnsiCode(escapeCode); - } - - if (escapeUrl) { - returnValue += wrapAnsiHyperlink(escapeUrl); - } - } - } - - return returnValue; -}; - -// For each newline, invoke the method separately -export default function wrapAnsi(string, columns, options) { - return String(string) - .normalize() - .replace(/\r\n/g, '\n') - .split('\n') - .map(line => exec(line, columns, options)) - .join('\n'); -} diff --git a/node_modules/@isaacs/cliui/node_modules/wrap-ansi/license b/node_modules/@isaacs/cliui/node_modules/wrap-ansi/license deleted file mode 100644 index fa7ceba..0000000 --- a/node_modules/@isaacs/cliui/node_modules/wrap-ansi/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (https://sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/@isaacs/cliui/node_modules/wrap-ansi/package.json b/node_modules/@isaacs/cliui/node_modules/wrap-ansi/package.json deleted file mode 100644 index 198a5db..0000000 --- a/node_modules/@isaacs/cliui/node_modules/wrap-ansi/package.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "name": "wrap-ansi", - "version": "8.1.0", - "description": "Wordwrap a string with ANSI escape codes", - "license": "MIT", - "repository": "chalk/wrap-ansi", - "funding": "https://github.com/chalk/wrap-ansi?sponsor=1", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "https://sindresorhus.com" - }, - "type": "module", - "exports": { - "types": "./index.d.ts", - "default": "./index.js" - }, - "engines": { - "node": ">=12" - }, - "scripts": { - "test": "xo && nyc ava && tsd" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "wrap", - "break", - "wordwrap", - "wordbreak", - "linewrap", - "ansi", - "styles", - "color", - "colour", - "colors", - "terminal", - "console", - "cli", - "string", - "tty", - "escape", - "formatting", - "rgb", - "256", - "shell", - "xterm", - "log", - "logging", - "command-line", - "text" - ], - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "devDependencies": { - "ava": "^3.15.0", - "chalk": "^4.1.2", - "coveralls": "^3.1.1", - "has-ansi": "^5.0.1", - "nyc": "^15.1.0", - "tsd": "^0.25.0", - "xo": "^0.44.0" - } -} diff --git a/node_modules/@isaacs/cliui/node_modules/wrap-ansi/readme.md b/node_modules/@isaacs/cliui/node_modules/wrap-ansi/readme.md deleted file mode 100644 index 21f6fed..0000000 --- a/node_modules/@isaacs/cliui/node_modules/wrap-ansi/readme.md +++ /dev/null @@ -1,91 +0,0 @@ -# wrap-ansi - -> Wordwrap a string with [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) - -## Install - -``` -$ npm install wrap-ansi -``` - -## Usage - -```js -import chalk from 'chalk'; -import wrapAnsi from 'wrap-ansi'; - -const input = 'The quick brown ' + chalk.red('fox jumped over ') + - 'the lazy ' + chalk.green('dog and then ran away with the unicorn.'); - -console.log(wrapAnsi(input, 20)); -``` - - - -## API - -### wrapAnsi(string, columns, options?) - -Wrap words to the specified column width. - -#### string - -Type: `string` - -String with ANSI escape codes. Like one styled by [`chalk`](https://github.com/chalk/chalk). Newline characters will be normalized to `\n`. - -#### columns - -Type: `number` - -Number of columns to wrap the text to. - -#### options - -Type: `object` - -##### hard - -Type: `boolean`\ -Default: `false` - -By default the wrap is soft, meaning long words may extend past the column width. Setting this to `true` will make it hard wrap at the column width. - -##### wordWrap - -Type: `boolean`\ -Default: `true` - -By default, an attempt is made to split words at spaces, ensuring that they don't extend past the configured columns. If wordWrap is `false`, each column will instead be completely filled splitting words as necessary. - -##### trim - -Type: `boolean`\ -Default: `true` - -Whitespace on all lines is removed by default. Set this option to `false` if you don't want to trim. - -## Related - -- [slice-ansi](https://github.com/chalk/slice-ansi) - Slice a string with ANSI escape codes -- [cli-truncate](https://github.com/sindresorhus/cli-truncate) - Truncate a string to a specific width in the terminal -- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right -- [jsesc](https://github.com/mathiasbynens/jsesc) - Generate ASCII-only output from Unicode strings. Useful for creating test fixtures. - -## Maintainers - -- [Sindre Sorhus](https://github.com/sindresorhus) -- [Josh Junon](https://github.com/qix-) -- [Benjamin Coe](https://github.com/bcoe) - ---- - -
    - - Get professional support for this package with a Tidelift subscription - -
    - - Tidelift helps make open source sustainable for maintainers while giving companies
    assurances about security, maintenance, and licensing for their dependencies. -
    -
    diff --git a/node_modules/@isaacs/cliui/package.json b/node_modules/@isaacs/cliui/package.json deleted file mode 100644 index 7a95253..0000000 --- a/node_modules/@isaacs/cliui/package.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "name": "@isaacs/cliui", - "version": "8.0.2", - "description": "easily create complex multi-column command-line-interfaces", - "main": "build/index.cjs", - "exports": { - ".": [ - { - "import": "./index.mjs", - "require": "./build/index.cjs" - }, - "./build/index.cjs" - ] - }, - "type": "module", - "module": "./index.mjs", - "scripts": { - "check": "standardx '**/*.ts' && standardx '**/*.js' && standardx '**/*.cjs'", - "fix": "standardx --fix '**/*.ts' && standardx --fix '**/*.js' && standardx --fix '**/*.cjs'", - "pretest": "rimraf build && tsc -p tsconfig.test.json && cross-env NODE_ENV=test npm run build:cjs", - "test": "c8 mocha ./test/*.cjs", - "test:esm": "c8 mocha ./test/**/*.mjs", - "postest": "check", - "coverage": "c8 report --check-coverage", - "precompile": "rimraf build", - "compile": "tsc", - "postcompile": "npm run build:cjs", - "build:cjs": "rollup -c", - "prepare": "npm run compile" - }, - "repository": "yargs/cliui", - "standard": { - "ignore": [ - "**/example/**" - ], - "globals": [ - "it" - ] - }, - "keywords": [ - "cli", - "command-line", - "layout", - "design", - "console", - "wrap", - "table" - ], - "author": "Ben Coe ", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "devDependencies": { - "@types/node": "^14.0.27", - "@typescript-eslint/eslint-plugin": "^4.0.0", - "@typescript-eslint/parser": "^4.0.0", - "c8": "^7.3.0", - "chai": "^4.2.0", - "chalk": "^4.1.0", - "cross-env": "^7.0.2", - "eslint": "^7.6.0", - "eslint-plugin-import": "^2.22.0", - "eslint-plugin-node": "^11.1.0", - "gts": "^3.0.0", - "mocha": "^10.0.0", - "rimraf": "^3.0.2", - "rollup": "^2.23.1", - "rollup-plugin-ts": "^3.0.2", - "standardx": "^7.0.0", - "typescript": "^4.0.0" - }, - "files": [ - "build", - "index.mjs", - "!*.d.ts" - ], - "engines": { - "node": ">=12" - } -} diff --git a/node_modules/@jridgewell/gen-mapping/LICENSE b/node_modules/@jridgewell/gen-mapping/LICENSE deleted file mode 100644 index 1f6ce94..0000000 --- a/node_modules/@jridgewell/gen-mapping/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright 2024 Justin Ridgewell - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/node_modules/@jridgewell/gen-mapping/README.md b/node_modules/@jridgewell/gen-mapping/README.md deleted file mode 100644 index 93692b1..0000000 --- a/node_modules/@jridgewell/gen-mapping/README.md +++ /dev/null @@ -1,227 +0,0 @@ -# @jridgewell/gen-mapping - -> Generate source maps - -`gen-mapping` allows you to generate a source map during transpilation or minification. -With a source map, you're able to trace the original location in the source file, either in Chrome's -DevTools or using a library like [`@jridgewell/trace-mapping`][trace-mapping]. - -You may already be familiar with the [`source-map`][source-map] package's `SourceMapGenerator`. This -provides the same `addMapping` and `setSourceContent` API. - -## Installation - -```sh -npm install @jridgewell/gen-mapping -``` - -## Usage - -```typescript -import { GenMapping, addMapping, setSourceContent, toEncodedMap, toDecodedMap } from '@jridgewell/gen-mapping'; - -const map = new GenMapping({ - file: 'output.js', - sourceRoot: 'https://example.com/', -}); - -setSourceContent(map, 'input.js', `function foo() {}`); - -addMapping(map, { - // Lines start at line 1, columns at column 0. - generated: { line: 1, column: 0 }, - source: 'input.js', - original: { line: 1, column: 0 }, -}); - -addMapping(map, { - generated: { line: 1, column: 9 }, - source: 'input.js', - original: { line: 1, column: 9 }, - name: 'foo', -}); - -assert.deepEqual(toDecodedMap(map), { - version: 3, - file: 'output.js', - names: ['foo'], - sourceRoot: 'https://example.com/', - sources: ['input.js'], - sourcesContent: ['function foo() {}'], - mappings: [ - [ [0, 0, 0, 0], [9, 0, 0, 9, 0] ] - ], -}); - -assert.deepEqual(toEncodedMap(map), { - version: 3, - file: 'output.js', - names: ['foo'], - sourceRoot: 'https://example.com/', - sources: ['input.js'], - sourcesContent: ['function foo() {}'], - mappings: 'AAAA,SAASA', -}); -``` - -### Smaller Sourcemaps - -Not everything needs to be added to a sourcemap, and needless markings can cause signficantly -larger file sizes. `gen-mapping` exposes `maybeAddSegment`/`maybeAddMapping` APIs that will -intelligently determine if this marking adds useful information. If not, the marking will be -skipped. - -```typescript -import { maybeAddMapping } from '@jridgewell/gen-mapping'; - -const map = new GenMapping(); - -// Adding a sourceless marking at the beginning of a line isn't useful. -maybeAddMapping(map, { - generated: { line: 1, column: 0 }, -}); - -// Adding a new source marking is useful. -maybeAddMapping(map, { - generated: { line: 1, column: 0 }, - source: 'input.js', - original: { line: 1, column: 0 }, -}); - -// But adding another marking pointing to the exact same original location isn't, even if the -// generated column changed. -maybeAddMapping(map, { - generated: { line: 1, column: 9 }, - source: 'input.js', - original: { line: 1, column: 0 }, -}); - -assert.deepEqual(toEncodedMap(map), { - version: 3, - names: [], - sources: ['input.js'], - sourcesContent: [null], - mappings: 'AAAA', -}); -``` - -## Benchmarks - -``` -node v18.0.0 - -amp.js.map -Memory Usage: -gen-mapping: addSegment 5852872 bytes -gen-mapping: addMapping 7716042 bytes -source-map-js 6143250 bytes -source-map-0.6.1 6124102 bytes -source-map-0.8.0 6121173 bytes -Smallest memory usage is gen-mapping: addSegment - -Adding speed: -gen-mapping: addSegment x 441 ops/sec ±2.07% (90 runs sampled) -gen-mapping: addMapping x 350 ops/sec ±2.40% (86 runs sampled) -source-map-js: addMapping x 169 ops/sec ±2.42% (80 runs sampled) -source-map-0.6.1: addMapping x 167 ops/sec ±2.56% (80 runs sampled) -source-map-0.8.0: addMapping x 168 ops/sec ±2.52% (80 runs sampled) -Fastest is gen-mapping: addSegment - -Generate speed: -gen-mapping: decoded output x 150,824,370 ops/sec ±0.07% (102 runs sampled) -gen-mapping: encoded output x 663 ops/sec ±0.22% (98 runs sampled) -source-map-js: encoded output x 197 ops/sec ±0.45% (84 runs sampled) -source-map-0.6.1: encoded output x 198 ops/sec ±0.33% (85 runs sampled) -source-map-0.8.0: encoded output x 197 ops/sec ±0.06% (93 runs sampled) -Fastest is gen-mapping: decoded output - - -*** - - -babel.min.js.map -Memory Usage: -gen-mapping: addSegment 37578063 bytes -gen-mapping: addMapping 37212897 bytes -source-map-js 47638527 bytes -source-map-0.6.1 47690503 bytes -source-map-0.8.0 47470188 bytes -Smallest memory usage is gen-mapping: addMapping - -Adding speed: -gen-mapping: addSegment x 31.05 ops/sec ±8.31% (43 runs sampled) -gen-mapping: addMapping x 29.83 ops/sec ±7.36% (51 runs sampled) -source-map-js: addMapping x 20.73 ops/sec ±6.22% (38 runs sampled) -source-map-0.6.1: addMapping x 20.03 ops/sec ±10.51% (38 runs sampled) -source-map-0.8.0: addMapping x 19.30 ops/sec ±8.27% (37 runs sampled) -Fastest is gen-mapping: addSegment - -Generate speed: -gen-mapping: decoded output x 381,379,234 ops/sec ±0.29% (96 runs sampled) -gen-mapping: encoded output x 95.15 ops/sec ±2.98% (72 runs sampled) -source-map-js: encoded output x 15.20 ops/sec ±7.41% (33 runs sampled) -source-map-0.6.1: encoded output x 16.36 ops/sec ±10.46% (31 runs sampled) -source-map-0.8.0: encoded output x 16.06 ops/sec ±6.45% (31 runs sampled) -Fastest is gen-mapping: decoded output - - -*** - - -preact.js.map -Memory Usage: -gen-mapping: addSegment 416247 bytes -gen-mapping: addMapping 419824 bytes -source-map-js 1024619 bytes -source-map-0.6.1 1146004 bytes -source-map-0.8.0 1113250 bytes -Smallest memory usage is gen-mapping: addSegment - -Adding speed: -gen-mapping: addSegment x 13,755 ops/sec ±0.15% (98 runs sampled) -gen-mapping: addMapping x 13,013 ops/sec ±0.11% (101 runs sampled) -source-map-js: addMapping x 4,564 ops/sec ±0.21% (98 runs sampled) -source-map-0.6.1: addMapping x 4,562 ops/sec ±0.11% (99 runs sampled) -source-map-0.8.0: addMapping x 4,593 ops/sec ±0.11% (100 runs sampled) -Fastest is gen-mapping: addSegment - -Generate speed: -gen-mapping: decoded output x 379,864,020 ops/sec ±0.23% (93 runs sampled) -gen-mapping: encoded output x 14,368 ops/sec ±4.07% (82 runs sampled) -source-map-js: encoded output x 5,261 ops/sec ±0.21% (99 runs sampled) -source-map-0.6.1: encoded output x 5,124 ops/sec ±0.58% (99 runs sampled) -source-map-0.8.0: encoded output x 5,434 ops/sec ±0.33% (96 runs sampled) -Fastest is gen-mapping: decoded output - - -*** - - -react.js.map -Memory Usage: -gen-mapping: addSegment 975096 bytes -gen-mapping: addMapping 1102981 bytes -source-map-js 2918836 bytes -source-map-0.6.1 2885435 bytes -source-map-0.8.0 2874336 bytes -Smallest memory usage is gen-mapping: addSegment - -Adding speed: -gen-mapping: addSegment x 4,772 ops/sec ±0.15% (100 runs sampled) -gen-mapping: addMapping x 4,456 ops/sec ±0.13% (97 runs sampled) -source-map-js: addMapping x 1,618 ops/sec ±0.24% (97 runs sampled) -source-map-0.6.1: addMapping x 1,622 ops/sec ±0.12% (99 runs sampled) -source-map-0.8.0: addMapping x 1,631 ops/sec ±0.12% (100 runs sampled) -Fastest is gen-mapping: addSegment - -Generate speed: -gen-mapping: decoded output x 379,107,695 ops/sec ±0.07% (99 runs sampled) -gen-mapping: encoded output x 5,421 ops/sec ±1.60% (89 runs sampled) -source-map-js: encoded output x 2,113 ops/sec ±1.81% (98 runs sampled) -source-map-0.6.1: encoded output x 2,126 ops/sec ±0.10% (100 runs sampled) -source-map-0.8.0: encoded output x 2,176 ops/sec ±0.39% (98 runs sampled) -Fastest is gen-mapping: decoded output -``` - -[source-map]: https://www.npmjs.com/package/source-map -[trace-mapping]: https://github.com/jridgewell/sourcemaps/tree/main/packages/trace-mapping diff --git a/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs b/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs deleted file mode 100644 index bbb0cac..0000000 --- a/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs +++ /dev/null @@ -1,292 +0,0 @@ -// src/set-array.ts -var SetArray = class { - constructor() { - this._indexes = { __proto__: null }; - this.array = []; - } -}; -function cast(set) { - return set; -} -function get(setarr, key) { - return cast(setarr)._indexes[key]; -} -function put(setarr, key) { - const index = get(setarr, key); - if (index !== void 0) return index; - const { array, _indexes: indexes } = cast(setarr); - const length = array.push(key); - return indexes[key] = length - 1; -} -function remove(setarr, key) { - const index = get(setarr, key); - if (index === void 0) return; - const { array, _indexes: indexes } = cast(setarr); - for (let i = index + 1; i < array.length; i++) { - const k = array[i]; - array[i - 1] = k; - indexes[k]--; - } - indexes[key] = void 0; - array.pop(); -} - -// src/gen-mapping.ts -import { - encode -} from "@jridgewell/sourcemap-codec"; -import { TraceMap, decodedMappings } from "@jridgewell/trace-mapping"; - -// src/sourcemap-segment.ts -var COLUMN = 0; -var SOURCES_INDEX = 1; -var SOURCE_LINE = 2; -var SOURCE_COLUMN = 3; -var NAMES_INDEX = 4; - -// src/gen-mapping.ts -var NO_NAME = -1; -var GenMapping = class { - constructor({ file, sourceRoot } = {}) { - this._names = new SetArray(); - this._sources = new SetArray(); - this._sourcesContent = []; - this._mappings = []; - this.file = file; - this.sourceRoot = sourceRoot; - this._ignoreList = new SetArray(); - } -}; -function cast2(map) { - return map; -} -function addSegment(map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) { - return addSegmentInternal( - false, - map, - genLine, - genColumn, - source, - sourceLine, - sourceColumn, - name, - content - ); -} -function addMapping(map, mapping) { - return addMappingInternal(false, map, mapping); -} -var maybeAddSegment = (map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) => { - return addSegmentInternal( - true, - map, - genLine, - genColumn, - source, - sourceLine, - sourceColumn, - name, - content - ); -}; -var maybeAddMapping = (map, mapping) => { - return addMappingInternal(true, map, mapping); -}; -function setSourceContent(map, source, content) { - const { - _sources: sources, - _sourcesContent: sourcesContent - // _originalScopes: originalScopes, - } = cast2(map); - const index = put(sources, source); - sourcesContent[index] = content; -} -function setIgnore(map, source, ignore = true) { - const { - _sources: sources, - _sourcesContent: sourcesContent, - _ignoreList: ignoreList - // _originalScopes: originalScopes, - } = cast2(map); - const index = put(sources, source); - if (index === sourcesContent.length) sourcesContent[index] = null; - if (ignore) put(ignoreList, index); - else remove(ignoreList, index); -} -function toDecodedMap(map) { - const { - _mappings: mappings, - _sources: sources, - _sourcesContent: sourcesContent, - _names: names, - _ignoreList: ignoreList - // _originalScopes: originalScopes, - // _generatedRanges: generatedRanges, - } = cast2(map); - removeEmptyFinalLines(mappings); - return { - version: 3, - file: map.file || void 0, - names: names.array, - sourceRoot: map.sourceRoot || void 0, - sources: sources.array, - sourcesContent, - mappings, - // originalScopes, - // generatedRanges, - ignoreList: ignoreList.array - }; -} -function toEncodedMap(map) { - const decoded = toDecodedMap(map); - return Object.assign({}, decoded, { - // originalScopes: decoded.originalScopes.map((os) => encodeOriginalScopes(os)), - // generatedRanges: encodeGeneratedRanges(decoded.generatedRanges as GeneratedRange[]), - mappings: encode(decoded.mappings) - }); -} -function fromMap(input) { - const map = new TraceMap(input); - const gen = new GenMapping({ file: map.file, sourceRoot: map.sourceRoot }); - putAll(cast2(gen)._names, map.names); - putAll(cast2(gen)._sources, map.sources); - cast2(gen)._sourcesContent = map.sourcesContent || map.sources.map(() => null); - cast2(gen)._mappings = decodedMappings(map); - if (map.ignoreList) putAll(cast2(gen)._ignoreList, map.ignoreList); - return gen; -} -function allMappings(map) { - const out = []; - const { _mappings: mappings, _sources: sources, _names: names } = cast2(map); - for (let i = 0; i < mappings.length; i++) { - const line = mappings[i]; - for (let j = 0; j < line.length; j++) { - const seg = line[j]; - const generated = { line: i + 1, column: seg[COLUMN] }; - let source = void 0; - let original = void 0; - let name = void 0; - if (seg.length !== 1) { - source = sources.array[seg[SOURCES_INDEX]]; - original = { line: seg[SOURCE_LINE] + 1, column: seg[SOURCE_COLUMN] }; - if (seg.length === 5) name = names.array[seg[NAMES_INDEX]]; - } - out.push({ generated, source, original, name }); - } - } - return out; -} -function addSegmentInternal(skipable, map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) { - const { - _mappings: mappings, - _sources: sources, - _sourcesContent: sourcesContent, - _names: names - // _originalScopes: originalScopes, - } = cast2(map); - const line = getIndex(mappings, genLine); - const index = getColumnIndex(line, genColumn); - if (!source) { - if (skipable && skipSourceless(line, index)) return; - return insert(line, index, [genColumn]); - } - assert(sourceLine); - assert(sourceColumn); - const sourcesIndex = put(sources, source); - const namesIndex = name ? put(names, name) : NO_NAME; - if (sourcesIndex === sourcesContent.length) sourcesContent[sourcesIndex] = content != null ? content : null; - if (skipable && skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex)) { - return; - } - return insert( - line, - index, - name ? [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex] : [genColumn, sourcesIndex, sourceLine, sourceColumn] - ); -} -function assert(_val) { -} -function getIndex(arr, index) { - for (let i = arr.length; i <= index; i++) { - arr[i] = []; - } - return arr[index]; -} -function getColumnIndex(line, genColumn) { - let index = line.length; - for (let i = index - 1; i >= 0; index = i--) { - const current = line[i]; - if (genColumn >= current[COLUMN]) break; - } - return index; -} -function insert(array, index, value) { - for (let i = array.length; i > index; i--) { - array[i] = array[i - 1]; - } - array[index] = value; -} -function removeEmptyFinalLines(mappings) { - const { length } = mappings; - let len = length; - for (let i = len - 1; i >= 0; len = i, i--) { - if (mappings[i].length > 0) break; - } - if (len < length) mappings.length = len; -} -function putAll(setarr, array) { - for (let i = 0; i < array.length; i++) put(setarr, array[i]); -} -function skipSourceless(line, index) { - if (index === 0) return true; - const prev = line[index - 1]; - return prev.length === 1; -} -function skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex) { - if (index === 0) return false; - const prev = line[index - 1]; - if (prev.length === 1) return false; - return sourcesIndex === prev[SOURCES_INDEX] && sourceLine === prev[SOURCE_LINE] && sourceColumn === prev[SOURCE_COLUMN] && namesIndex === (prev.length === 5 ? prev[NAMES_INDEX] : NO_NAME); -} -function addMappingInternal(skipable, map, mapping) { - const { generated, source, original, name, content } = mapping; - if (!source) { - return addSegmentInternal( - skipable, - map, - generated.line - 1, - generated.column, - null, - null, - null, - null, - null - ); - } - assert(original); - return addSegmentInternal( - skipable, - map, - generated.line - 1, - generated.column, - source, - original.line - 1, - original.column, - name, - content - ); -} -export { - GenMapping, - addMapping, - addSegment, - allMappings, - fromMap, - maybeAddMapping, - maybeAddSegment, - setIgnore, - setSourceContent, - toDecodedMap, - toEncodedMap -}; -//# sourceMappingURL=gen-mapping.mjs.map diff --git a/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs.map b/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs.map deleted file mode 100644 index 4e37e45..0000000 --- a/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs.map +++ /dev/null @@ -1,6 +0,0 @@ -{ - "version": 3, - "sources": ["../src/set-array.ts", "../src/gen-mapping.ts", "../src/sourcemap-segment.ts"], - "mappings": "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", - "names": ["cast"] -} diff --git a/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js b/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js deleted file mode 100644 index cb84af5..0000000 --- a/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js +++ /dev/null @@ -1,358 +0,0 @@ -(function (global, factory) { - if (typeof exports === 'object' && typeof module !== 'undefined') { - factory(module, require('@jridgewell/sourcemap-codec'), require('@jridgewell/trace-mapping')); - module.exports = def(module); - } else if (typeof define === 'function' && define.amd) { - define(['module', '@jridgewell/sourcemap-codec', '@jridgewell/trace-mapping'], function(mod) { - factory.apply(this, arguments); - mod.exports = def(mod); - }); - } else { - const mod = { exports: {} }; - factory(mod, global.sourcemapCodec, global.traceMapping); - global = typeof globalThis !== 'undefined' ? globalThis : global || self; - global.genMapping = def(mod); - } - function def(m) { return 'default' in m.exports ? m.exports.default : m.exports; } -})(this, (function (module, require_sourcemapCodec, require_traceMapping) { -"use strict"; -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __commonJS = (cb, mod) => function __require() { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; -}; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); - -// umd:@jridgewell/sourcemap-codec -var require_sourcemap_codec = __commonJS({ - "umd:@jridgewell/sourcemap-codec"(exports, module2) { - module2.exports = require_sourcemapCodec; - } -}); - -// umd:@jridgewell/trace-mapping -var require_trace_mapping = __commonJS({ - "umd:@jridgewell/trace-mapping"(exports, module2) { - module2.exports = require_traceMapping; - } -}); - -// src/gen-mapping.ts -var gen_mapping_exports = {}; -__export(gen_mapping_exports, { - GenMapping: () => GenMapping, - addMapping: () => addMapping, - addSegment: () => addSegment, - allMappings: () => allMappings, - fromMap: () => fromMap, - maybeAddMapping: () => maybeAddMapping, - maybeAddSegment: () => maybeAddSegment, - setIgnore: () => setIgnore, - setSourceContent: () => setSourceContent, - toDecodedMap: () => toDecodedMap, - toEncodedMap: () => toEncodedMap -}); -module.exports = __toCommonJS(gen_mapping_exports); - -// src/set-array.ts -var SetArray = class { - constructor() { - this._indexes = { __proto__: null }; - this.array = []; - } -}; -function cast(set) { - return set; -} -function get(setarr, key) { - return cast(setarr)._indexes[key]; -} -function put(setarr, key) { - const index = get(setarr, key); - if (index !== void 0) return index; - const { array, _indexes: indexes } = cast(setarr); - const length = array.push(key); - return indexes[key] = length - 1; -} -function remove(setarr, key) { - const index = get(setarr, key); - if (index === void 0) return; - const { array, _indexes: indexes } = cast(setarr); - for (let i = index + 1; i < array.length; i++) { - const k = array[i]; - array[i - 1] = k; - indexes[k]--; - } - indexes[key] = void 0; - array.pop(); -} - -// src/gen-mapping.ts -var import_sourcemap_codec = __toESM(require_sourcemap_codec()); -var import_trace_mapping = __toESM(require_trace_mapping()); - -// src/sourcemap-segment.ts -var COLUMN = 0; -var SOURCES_INDEX = 1; -var SOURCE_LINE = 2; -var SOURCE_COLUMN = 3; -var NAMES_INDEX = 4; - -// src/gen-mapping.ts -var NO_NAME = -1; -var GenMapping = class { - constructor({ file, sourceRoot } = {}) { - this._names = new SetArray(); - this._sources = new SetArray(); - this._sourcesContent = []; - this._mappings = []; - this.file = file; - this.sourceRoot = sourceRoot; - this._ignoreList = new SetArray(); - } -}; -function cast2(map) { - return map; -} -function addSegment(map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) { - return addSegmentInternal( - false, - map, - genLine, - genColumn, - source, - sourceLine, - sourceColumn, - name, - content - ); -} -function addMapping(map, mapping) { - return addMappingInternal(false, map, mapping); -} -var maybeAddSegment = (map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) => { - return addSegmentInternal( - true, - map, - genLine, - genColumn, - source, - sourceLine, - sourceColumn, - name, - content - ); -}; -var maybeAddMapping = (map, mapping) => { - return addMappingInternal(true, map, mapping); -}; -function setSourceContent(map, source, content) { - const { - _sources: sources, - _sourcesContent: sourcesContent - // _originalScopes: originalScopes, - } = cast2(map); - const index = put(sources, source); - sourcesContent[index] = content; -} -function setIgnore(map, source, ignore = true) { - const { - _sources: sources, - _sourcesContent: sourcesContent, - _ignoreList: ignoreList - // _originalScopes: originalScopes, - } = cast2(map); - const index = put(sources, source); - if (index === sourcesContent.length) sourcesContent[index] = null; - if (ignore) put(ignoreList, index); - else remove(ignoreList, index); -} -function toDecodedMap(map) { - const { - _mappings: mappings, - _sources: sources, - _sourcesContent: sourcesContent, - _names: names, - _ignoreList: ignoreList - // _originalScopes: originalScopes, - // _generatedRanges: generatedRanges, - } = cast2(map); - removeEmptyFinalLines(mappings); - return { - version: 3, - file: map.file || void 0, - names: names.array, - sourceRoot: map.sourceRoot || void 0, - sources: sources.array, - sourcesContent, - mappings, - // originalScopes, - // generatedRanges, - ignoreList: ignoreList.array - }; -} -function toEncodedMap(map) { - const decoded = toDecodedMap(map); - return Object.assign({}, decoded, { - // originalScopes: decoded.originalScopes.map((os) => encodeOriginalScopes(os)), - // generatedRanges: encodeGeneratedRanges(decoded.generatedRanges as GeneratedRange[]), - mappings: (0, import_sourcemap_codec.encode)(decoded.mappings) - }); -} -function fromMap(input) { - const map = new import_trace_mapping.TraceMap(input); - const gen = new GenMapping({ file: map.file, sourceRoot: map.sourceRoot }); - putAll(cast2(gen)._names, map.names); - putAll(cast2(gen)._sources, map.sources); - cast2(gen)._sourcesContent = map.sourcesContent || map.sources.map(() => null); - cast2(gen)._mappings = (0, import_trace_mapping.decodedMappings)(map); - if (map.ignoreList) putAll(cast2(gen)._ignoreList, map.ignoreList); - return gen; -} -function allMappings(map) { - const out = []; - const { _mappings: mappings, _sources: sources, _names: names } = cast2(map); - for (let i = 0; i < mappings.length; i++) { - const line = mappings[i]; - for (let j = 0; j < line.length; j++) { - const seg = line[j]; - const generated = { line: i + 1, column: seg[COLUMN] }; - let source = void 0; - let original = void 0; - let name = void 0; - if (seg.length !== 1) { - source = sources.array[seg[SOURCES_INDEX]]; - original = { line: seg[SOURCE_LINE] + 1, column: seg[SOURCE_COLUMN] }; - if (seg.length === 5) name = names.array[seg[NAMES_INDEX]]; - } - out.push({ generated, source, original, name }); - } - } - return out; -} -function addSegmentInternal(skipable, map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) { - const { - _mappings: mappings, - _sources: sources, - _sourcesContent: sourcesContent, - _names: names - // _originalScopes: originalScopes, - } = cast2(map); - const line = getIndex(mappings, genLine); - const index = getColumnIndex(line, genColumn); - if (!source) { - if (skipable && skipSourceless(line, index)) return; - return insert(line, index, [genColumn]); - } - assert(sourceLine); - assert(sourceColumn); - const sourcesIndex = put(sources, source); - const namesIndex = name ? put(names, name) : NO_NAME; - if (sourcesIndex === sourcesContent.length) sourcesContent[sourcesIndex] = content != null ? content : null; - if (skipable && skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex)) { - return; - } - return insert( - line, - index, - name ? [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex] : [genColumn, sourcesIndex, sourceLine, sourceColumn] - ); -} -function assert(_val) { -} -function getIndex(arr, index) { - for (let i = arr.length; i <= index; i++) { - arr[i] = []; - } - return arr[index]; -} -function getColumnIndex(line, genColumn) { - let index = line.length; - for (let i = index - 1; i >= 0; index = i--) { - const current = line[i]; - if (genColumn >= current[COLUMN]) break; - } - return index; -} -function insert(array, index, value) { - for (let i = array.length; i > index; i--) { - array[i] = array[i - 1]; - } - array[index] = value; -} -function removeEmptyFinalLines(mappings) { - const { length } = mappings; - let len = length; - for (let i = len - 1; i >= 0; len = i, i--) { - if (mappings[i].length > 0) break; - } - if (len < length) mappings.length = len; -} -function putAll(setarr, array) { - for (let i = 0; i < array.length; i++) put(setarr, array[i]); -} -function skipSourceless(line, index) { - if (index === 0) return true; - const prev = line[index - 1]; - return prev.length === 1; -} -function skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex) { - if (index === 0) return false; - const prev = line[index - 1]; - if (prev.length === 1) return false; - return sourcesIndex === prev[SOURCES_INDEX] && sourceLine === prev[SOURCE_LINE] && sourceColumn === prev[SOURCE_COLUMN] && namesIndex === (prev.length === 5 ? prev[NAMES_INDEX] : NO_NAME); -} -function addMappingInternal(skipable, map, mapping) { - const { generated, source, original, name, content } = mapping; - if (!source) { - return addSegmentInternal( - skipable, - map, - generated.line - 1, - generated.column, - null, - null, - null, - null, - null - ); - } - assert(original); - return addSegmentInternal( - skipable, - map, - generated.line - 1, - generated.column, - source, - original.line - 1, - original.column, - name, - content - ); -} -})); -//# sourceMappingURL=gen-mapping.umd.js.map diff --git a/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js.map b/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js.map deleted file mode 100644 index b13750b..0000000 --- a/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js.map +++ /dev/null @@ -1,6 +0,0 @@ -{ - "version": 3, - "sources": ["umd:@jridgewell/sourcemap-codec", "umd:@jridgewell/trace-mapping", "../src/gen-mapping.ts", "../src/set-array.ts", "../src/sourcemap-segment.ts"], - "mappings": "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", - "names": ["module", "module", "cast"] -} diff --git a/node_modules/@jridgewell/gen-mapping/dist/types/gen-mapping.d.ts b/node_modules/@jridgewell/gen-mapping/dist/types/gen-mapping.d.ts deleted file mode 100644 index 9ba936e..0000000 --- a/node_modules/@jridgewell/gen-mapping/dist/types/gen-mapping.d.ts +++ /dev/null @@ -1,88 +0,0 @@ -import type { SourceMapInput } from '@jridgewell/trace-mapping'; -import type { DecodedSourceMap, EncodedSourceMap, Pos, Mapping } from './types'; -export type { DecodedSourceMap, EncodedSourceMap, Mapping }; -export type Options = { - file?: string | null; - sourceRoot?: string | null; -}; -/** - * Provides the state to generate a sourcemap. - */ -export declare class GenMapping { - private _names; - private _sources; - private _sourcesContent; - private _mappings; - private _ignoreList; - file: string | null | undefined; - sourceRoot: string | null | undefined; - constructor({ file, sourceRoot }?: Options); -} -/** - * A low-level API to associate a generated position with an original source position. Line and - * column here are 0-based, unlike `addMapping`. - */ -export declare function addSegment(map: GenMapping, genLine: number, genColumn: number, source?: null, sourceLine?: null, sourceColumn?: null, name?: null, content?: null): void; -export declare function addSegment(map: GenMapping, genLine: number, genColumn: number, source: string, sourceLine: number, sourceColumn: number, name?: null, content?: string | null): void; -export declare function addSegment(map: GenMapping, genLine: number, genColumn: number, source: string, sourceLine: number, sourceColumn: number, name: string, content?: string | null): void; -/** - * A high-level API to associate a generated position with an original source position. Line is - * 1-based, but column is 0-based, due to legacy behavior in `source-map` library. - */ -export declare function addMapping(map: GenMapping, mapping: { - generated: Pos; - source?: null; - original?: null; - name?: null; - content?: null; -}): void; -export declare function addMapping(map: GenMapping, mapping: { - generated: Pos; - source: string; - original: Pos; - name?: null; - content?: string | null; -}): void; -export declare function addMapping(map: GenMapping, mapping: { - generated: Pos; - source: string; - original: Pos; - name: string; - content?: string | null; -}): void; -/** - * Same as `addSegment`, but will only add the segment if it generates useful information in the - * resulting map. This only works correctly if segments are added **in order**, meaning you should - * not add a segment with a lower generated line/column than one that came before. - */ -export declare const maybeAddSegment: typeof addSegment; -/** - * Same as `addMapping`, but will only add the mapping if it generates useful information in the - * resulting map. This only works correctly if mappings are added **in order**, meaning you should - * not add a mapping with a lower generated line/column than one that came before. - */ -export declare const maybeAddMapping: typeof addMapping; -/** - * Adds/removes the content of the source file to the source map. - */ -export declare function setSourceContent(map: GenMapping, source: string, content: string | null): void; -export declare function setIgnore(map: GenMapping, source: string, ignore?: boolean): void; -/** - * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects - * a sourcemap, or to JSON.stringify. - */ -export declare function toDecodedMap(map: GenMapping): DecodedSourceMap; -/** - * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects - * a sourcemap, or to JSON.stringify. - */ -export declare function toEncodedMap(map: GenMapping): EncodedSourceMap; -/** - * Constructs a new GenMapping, using the already present mappings of the input. - */ -export declare function fromMap(input: SourceMapInput): GenMapping; -/** - * Returns an array of high-level mapping objects for every recorded segment, which could then be - * passed to the `source-map` library. - */ -export declare function allMappings(map: GenMapping): Mapping[]; diff --git a/node_modules/@jridgewell/gen-mapping/dist/types/set-array.d.ts b/node_modules/@jridgewell/gen-mapping/dist/types/set-array.d.ts deleted file mode 100644 index 6ed4354..0000000 --- a/node_modules/@jridgewell/gen-mapping/dist/types/set-array.d.ts +++ /dev/null @@ -1,32 +0,0 @@ -type Key = string | number | symbol; -/** - * SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the - * index of the `key` in the backing array. - * - * This is designed to allow synchronizing a second array with the contents of the backing array, - * like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`, - * and there are never duplicates. - */ -export declare class SetArray { - private _indexes; - array: readonly T[]; - constructor(); -} -/** - * Gets the index associated with `key` in the backing array, if it is already present. - */ -export declare function get(setarr: SetArray, key: T): number | undefined; -/** - * Puts `key` into the backing array, if it is not already present. Returns - * the index of the `key` in the backing array. - */ -export declare function put(setarr: SetArray, key: T): number; -/** - * Pops the last added item out of the SetArray. - */ -export declare function pop(setarr: SetArray): void; -/** - * Removes the key, if it exists in the set. - */ -export declare function remove(setarr: SetArray, key: T): void; -export {}; diff --git a/node_modules/@jridgewell/gen-mapping/dist/types/sourcemap-segment.d.ts b/node_modules/@jridgewell/gen-mapping/dist/types/sourcemap-segment.d.ts deleted file mode 100644 index aa19fb5..0000000 --- a/node_modules/@jridgewell/gen-mapping/dist/types/sourcemap-segment.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -type GeneratedColumn = number; -type SourcesIndex = number; -type SourceLine = number; -type SourceColumn = number; -type NamesIndex = number; -export type SourceMapSegment = [GeneratedColumn] | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn] | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn, NamesIndex]; -export declare const COLUMN = 0; -export declare const SOURCES_INDEX = 1; -export declare const SOURCE_LINE = 2; -export declare const SOURCE_COLUMN = 3; -export declare const NAMES_INDEX = 4; -export {}; diff --git a/node_modules/@jridgewell/gen-mapping/dist/types/types.d.ts b/node_modules/@jridgewell/gen-mapping/dist/types/types.d.ts deleted file mode 100644 index 8eb90fb..0000000 --- a/node_modules/@jridgewell/gen-mapping/dist/types/types.d.ts +++ /dev/null @@ -1,43 +0,0 @@ -import type { SourceMapSegment } from './sourcemap-segment'; -export interface SourceMapV3 { - file?: string | null; - names: readonly string[]; - sourceRoot?: string; - sources: readonly (string | null)[]; - sourcesContent?: readonly (string | null)[]; - version: 3; - ignoreList?: readonly number[]; -} -export interface EncodedSourceMap extends SourceMapV3 { - mappings: string; -} -export interface DecodedSourceMap extends SourceMapV3 { - mappings: readonly SourceMapSegment[][]; -} -export interface Pos { - line: number; - column: number; -} -export interface OriginalPos extends Pos { - source: string; -} -export interface BindingExpressionRange { - start: Pos; - expression: string; -} -export type Mapping = { - generated: Pos; - source: undefined; - original: undefined; - name: undefined; -} | { - generated: Pos; - source: string; - original: Pos; - name: string; -} | { - generated: Pos; - source: string; - original: Pos; - name: undefined; -}; diff --git a/node_modules/@jridgewell/gen-mapping/package.json b/node_modules/@jridgewell/gen-mapping/package.json deleted file mode 100644 index 036f9b7..0000000 --- a/node_modules/@jridgewell/gen-mapping/package.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "name": "@jridgewell/gen-mapping", - "version": "0.3.13", - "description": "Generate source maps", - "keywords": [ - "source", - "map" - ], - "main": "dist/gen-mapping.umd.js", - "module": "dist/gen-mapping.mjs", - "types": "types/gen-mapping.d.cts", - "files": [ - "dist", - "src", - "types" - ], - "exports": { - ".": [ - { - "import": { - "types": "./types/gen-mapping.d.mts", - "default": "./dist/gen-mapping.mjs" - }, - "default": { - "types": "./types/gen-mapping.d.cts", - "default": "./dist/gen-mapping.umd.js" - } - }, - "./dist/gen-mapping.umd.js" - ], - "./package.json": "./package.json" - }, - "scripts": { - "benchmark": "run-s build:code benchmark:*", - "benchmark:install": "cd benchmark && npm install", - "benchmark:only": "node --expose-gc benchmark/index.js", - "build": "run-s -n build:code build:types", - "build:code": "node ../../esbuild.mjs gen-mapping.ts", - "build:types": "run-s build:types:force build:types:emit build:types:mts", - "build:types:force": "rimraf tsconfig.build.tsbuildinfo", - "build:types:emit": "tsc --project tsconfig.build.json", - "build:types:mts": "node ../../mts-types.mjs", - "clean": "run-s -n clean:code clean:types", - "clean:code": "tsc --build --clean tsconfig.build.json", - "clean:types": "rimraf dist types", - "test": "run-s -n test:types test:only test:format", - "test:format": "prettier --check '{src,test}/**/*.ts'", - "test:only": "mocha", - "test:types": "eslint '{src,test}/**/*.ts'", - "lint": "run-s -n lint:types lint:format", - "lint:format": "npm run test:format -- --write", - "lint:types": "npm run test:types -- --fix", - "prepublishOnly": "npm run-s -n build test" - }, - "homepage": "https://github.com/jridgewell/sourcemaps/tree/main/packages/gen-mapping", - "repository": { - "type": "git", - "url": "git+https://github.com/jridgewell/sourcemaps.git", - "directory": "packages/gen-mapping" - }, - "author": "Justin Ridgewell ", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } -} diff --git a/node_modules/@jridgewell/gen-mapping/src/gen-mapping.ts b/node_modules/@jridgewell/gen-mapping/src/gen-mapping.ts deleted file mode 100644 index ecc878c..0000000 --- a/node_modules/@jridgewell/gen-mapping/src/gen-mapping.ts +++ /dev/null @@ -1,614 +0,0 @@ -import { SetArray, put, remove } from './set-array'; -import { - encode, - // encodeGeneratedRanges, - // encodeOriginalScopes -} from '@jridgewell/sourcemap-codec'; -import { TraceMap, decodedMappings } from '@jridgewell/trace-mapping'; - -import { - COLUMN, - SOURCES_INDEX, - SOURCE_LINE, - SOURCE_COLUMN, - NAMES_INDEX, -} from './sourcemap-segment'; - -import type { SourceMapInput } from '@jridgewell/trace-mapping'; -// import type { OriginalScope, GeneratedRange } from '@jridgewell/sourcemap-codec'; -import type { SourceMapSegment } from './sourcemap-segment'; -import type { - DecodedSourceMap, - EncodedSourceMap, - Pos, - Mapping, - // BindingExpressionRange, - // OriginalPos, - // OriginalScopeInfo, - // GeneratedRangeInfo, -} from './types'; - -export type { DecodedSourceMap, EncodedSourceMap, Mapping }; - -export type Options = { - file?: string | null; - sourceRoot?: string | null; -}; - -const NO_NAME = -1; - -/** - * Provides the state to generate a sourcemap. - */ -export class GenMapping { - declare private _names: SetArray; - declare private _sources: SetArray; - declare private _sourcesContent: (string | null)[]; - declare private _mappings: SourceMapSegment[][]; - // private declare _originalScopes: OriginalScope[][]; - // private declare _generatedRanges: GeneratedRange[]; - declare private _ignoreList: SetArray; - declare file: string | null | undefined; - declare sourceRoot: string | null | undefined; - - constructor({ file, sourceRoot }: Options = {}) { - this._names = new SetArray(); - this._sources = new SetArray(); - this._sourcesContent = []; - this._mappings = []; - // this._originalScopes = []; - // this._generatedRanges = []; - this.file = file; - this.sourceRoot = sourceRoot; - this._ignoreList = new SetArray(); - } -} - -interface PublicMap { - _names: GenMapping['_names']; - _sources: GenMapping['_sources']; - _sourcesContent: GenMapping['_sourcesContent']; - _mappings: GenMapping['_mappings']; - // _originalScopes: GenMapping['_originalScopes']; - // _generatedRanges: GenMapping['_generatedRanges']; - _ignoreList: GenMapping['_ignoreList']; -} - -/** - * Typescript doesn't allow friend access to private fields, so this just casts the map into a type - * with public access modifiers. - */ -function cast(map: unknown): PublicMap { - return map as any; -} - -/** - * A low-level API to associate a generated position with an original source position. Line and - * column here are 0-based, unlike `addMapping`. - */ -export function addSegment( - map: GenMapping, - genLine: number, - genColumn: number, - source?: null, - sourceLine?: null, - sourceColumn?: null, - name?: null, - content?: null, -): void; -export function addSegment( - map: GenMapping, - genLine: number, - genColumn: number, - source: string, - sourceLine: number, - sourceColumn: number, - name?: null, - content?: string | null, -): void; -export function addSegment( - map: GenMapping, - genLine: number, - genColumn: number, - source: string, - sourceLine: number, - sourceColumn: number, - name: string, - content?: string | null, -): void; -export function addSegment( - map: GenMapping, - genLine: number, - genColumn: number, - source?: string | null, - sourceLine?: number | null, - sourceColumn?: number | null, - name?: string | null, - content?: string | null, -): void { - return addSegmentInternal( - false, - map, - genLine, - genColumn, - source, - sourceLine, - sourceColumn, - name, - content, - ); -} - -/** - * A high-level API to associate a generated position with an original source position. Line is - * 1-based, but column is 0-based, due to legacy behavior in `source-map` library. - */ -export function addMapping( - map: GenMapping, - mapping: { - generated: Pos; - source?: null; - original?: null; - name?: null; - content?: null; - }, -): void; -export function addMapping( - map: GenMapping, - mapping: { - generated: Pos; - source: string; - original: Pos; - name?: null; - content?: string | null; - }, -): void; -export function addMapping( - map: GenMapping, - mapping: { - generated: Pos; - source: string; - original: Pos; - name: string; - content?: string | null; - }, -): void; -export function addMapping( - map: GenMapping, - mapping: { - generated: Pos; - source?: string | null; - original?: Pos | null; - name?: string | null; - content?: string | null; - }, -): void { - return addMappingInternal(false, map, mapping as Parameters[2]); -} - -/** - * Same as `addSegment`, but will only add the segment if it generates useful information in the - * resulting map. This only works correctly if segments are added **in order**, meaning you should - * not add a segment with a lower generated line/column than one that came before. - */ -export const maybeAddSegment: typeof addSegment = ( - map, - genLine, - genColumn, - source, - sourceLine, - sourceColumn, - name, - content, -) => { - return addSegmentInternal( - true, - map, - genLine, - genColumn, - source, - sourceLine, - sourceColumn, - name, - content, - ); -}; - -/** - * Same as `addMapping`, but will only add the mapping if it generates useful information in the - * resulting map. This only works correctly if mappings are added **in order**, meaning you should - * not add a mapping with a lower generated line/column than one that came before. - */ -export const maybeAddMapping: typeof addMapping = (map, mapping) => { - return addMappingInternal(true, map, mapping as Parameters[2]); -}; - -/** - * Adds/removes the content of the source file to the source map. - */ -export function setSourceContent(map: GenMapping, source: string, content: string | null): void { - const { - _sources: sources, - _sourcesContent: sourcesContent, - // _originalScopes: originalScopes, - } = cast(map); - const index = put(sources, source); - sourcesContent[index] = content; - // if (index === originalScopes.length) originalScopes[index] = []; -} - -export function setIgnore(map: GenMapping, source: string, ignore = true) { - const { - _sources: sources, - _sourcesContent: sourcesContent, - _ignoreList: ignoreList, - // _originalScopes: originalScopes, - } = cast(map); - const index = put(sources, source); - if (index === sourcesContent.length) sourcesContent[index] = null; - // if (index === originalScopes.length) originalScopes[index] = []; - if (ignore) put(ignoreList, index); - else remove(ignoreList, index); -} - -/** - * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects - * a sourcemap, or to JSON.stringify. - */ -export function toDecodedMap(map: GenMapping): DecodedSourceMap { - const { - _mappings: mappings, - _sources: sources, - _sourcesContent: sourcesContent, - _names: names, - _ignoreList: ignoreList, - // _originalScopes: originalScopes, - // _generatedRanges: generatedRanges, - } = cast(map); - removeEmptyFinalLines(mappings); - - return { - version: 3, - file: map.file || undefined, - names: names.array, - sourceRoot: map.sourceRoot || undefined, - sources: sources.array, - sourcesContent, - mappings, - // originalScopes, - // generatedRanges, - ignoreList: ignoreList.array, - }; -} - -/** - * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects - * a sourcemap, or to JSON.stringify. - */ -export function toEncodedMap(map: GenMapping): EncodedSourceMap { - const decoded = toDecodedMap(map); - return Object.assign({}, decoded, { - // originalScopes: decoded.originalScopes.map((os) => encodeOriginalScopes(os)), - // generatedRanges: encodeGeneratedRanges(decoded.generatedRanges as GeneratedRange[]), - mappings: encode(decoded.mappings as SourceMapSegment[][]), - }); -} - -/** - * Constructs a new GenMapping, using the already present mappings of the input. - */ -export function fromMap(input: SourceMapInput): GenMapping { - const map = new TraceMap(input); - const gen = new GenMapping({ file: map.file, sourceRoot: map.sourceRoot }); - - putAll(cast(gen)._names, map.names); - putAll(cast(gen)._sources, map.sources as string[]); - cast(gen)._sourcesContent = map.sourcesContent || map.sources.map(() => null); - cast(gen)._mappings = decodedMappings(map) as GenMapping['_mappings']; - // TODO: implement originalScopes/generatedRanges - if (map.ignoreList) putAll(cast(gen)._ignoreList, map.ignoreList); - - return gen; -} - -/** - * Returns an array of high-level mapping objects for every recorded segment, which could then be - * passed to the `source-map` library. - */ -export function allMappings(map: GenMapping): Mapping[] { - const out: Mapping[] = []; - const { _mappings: mappings, _sources: sources, _names: names } = cast(map); - - for (let i = 0; i < mappings.length; i++) { - const line = mappings[i]; - for (let j = 0; j < line.length; j++) { - const seg = line[j]; - - const generated = { line: i + 1, column: seg[COLUMN] }; - let source: string | undefined = undefined; - let original: Pos | undefined = undefined; - let name: string | undefined = undefined; - - if (seg.length !== 1) { - source = sources.array[seg[SOURCES_INDEX]]; - original = { line: seg[SOURCE_LINE] + 1, column: seg[SOURCE_COLUMN] }; - - if (seg.length === 5) name = names.array[seg[NAMES_INDEX]]; - } - - out.push({ generated, source, original, name } as Mapping); - } - } - - return out; -} - -// This split declaration is only so that terser can elminiate the static initialization block. -function addSegmentInternal( - skipable: boolean, - map: GenMapping, - genLine: number, - genColumn: number, - source: S, - sourceLine: S extends string ? number : null | undefined, - sourceColumn: S extends string ? number : null | undefined, - name: S extends string ? string | null | undefined : null | undefined, - content: S extends string ? string | null | undefined : null | undefined, -): void { - const { - _mappings: mappings, - _sources: sources, - _sourcesContent: sourcesContent, - _names: names, - // _originalScopes: originalScopes, - } = cast(map); - const line = getIndex(mappings, genLine); - const index = getColumnIndex(line, genColumn); - - if (!source) { - if (skipable && skipSourceless(line, index)) return; - return insert(line, index, [genColumn]); - } - - // Sigh, TypeScript can't figure out sourceLine and sourceColumn aren't nullish if source - // isn't nullish. - assert(sourceLine); - assert(sourceColumn); - - const sourcesIndex = put(sources, source); - const namesIndex = name ? put(names, name) : NO_NAME; - if (sourcesIndex === sourcesContent.length) sourcesContent[sourcesIndex] = content ?? null; - // if (sourcesIndex === originalScopes.length) originalScopes[sourcesIndex] = []; - - if (skipable && skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex)) { - return; - } - - return insert( - line, - index, - name - ? [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex] - : [genColumn, sourcesIndex, sourceLine, sourceColumn], - ); -} - -function assert(_val: unknown): asserts _val is T { - // noop. -} - -function getIndex(arr: T[][], index: number): T[] { - for (let i = arr.length; i <= index; i++) { - arr[i] = []; - } - return arr[index]; -} - -function getColumnIndex(line: SourceMapSegment[], genColumn: number): number { - let index = line.length; - for (let i = index - 1; i >= 0; index = i--) { - const current = line[i]; - if (genColumn >= current[COLUMN]) break; - } - return index; -} - -function insert(array: T[], index: number, value: T) { - for (let i = array.length; i > index; i--) { - array[i] = array[i - 1]; - } - array[index] = value; -} - -function removeEmptyFinalLines(mappings: SourceMapSegment[][]) { - const { length } = mappings; - let len = length; - for (let i = len - 1; i >= 0; len = i, i--) { - if (mappings[i].length > 0) break; - } - if (len < length) mappings.length = len; -} - -function putAll(setarr: SetArray, array: T[]) { - for (let i = 0; i < array.length; i++) put(setarr, array[i]); -} - -function skipSourceless(line: SourceMapSegment[], index: number): boolean { - // The start of a line is already sourceless, so adding a sourceless segment to the beginning - // doesn't generate any useful information. - if (index === 0) return true; - - const prev = line[index - 1]; - // If the previous segment is also sourceless, then adding another sourceless segment doesn't - // genrate any new information. Else, this segment will end the source/named segment and point to - // a sourceless position, which is useful. - return prev.length === 1; -} - -function skipSource( - line: SourceMapSegment[], - index: number, - sourcesIndex: number, - sourceLine: number, - sourceColumn: number, - namesIndex: number, -): boolean { - // A source/named segment at the start of a line gives position at that genColumn - if (index === 0) return false; - - const prev = line[index - 1]; - - // If the previous segment is sourceless, then we're transitioning to a source. - if (prev.length === 1) return false; - - // If the previous segment maps to the exact same source position, then this segment doesn't - // provide any new position information. - return ( - sourcesIndex === prev[SOURCES_INDEX] && - sourceLine === prev[SOURCE_LINE] && - sourceColumn === prev[SOURCE_COLUMN] && - namesIndex === (prev.length === 5 ? prev[NAMES_INDEX] : NO_NAME) - ); -} - -function addMappingInternal( - skipable: boolean, - map: GenMapping, - mapping: { - generated: Pos; - source: S; - original: S extends string ? Pos : null | undefined; - name: S extends string ? string | null | undefined : null | undefined; - content: S extends string ? string | null | undefined : null | undefined; - }, -) { - const { generated, source, original, name, content } = mapping; - if (!source) { - return addSegmentInternal( - skipable, - map, - generated.line - 1, - generated.column, - null, - null, - null, - null, - null, - ); - } - assert(original); - return addSegmentInternal( - skipable, - map, - generated.line - 1, - generated.column, - source as string, - original.line - 1, - original.column, - name, - content, - ); -} - -/* -export function addOriginalScope( - map: GenMapping, - data: { - start: Pos; - end: Pos; - source: string; - kind: string; - name?: string; - variables?: string[]; - }, -): OriginalScopeInfo { - const { start, end, source, kind, name, variables } = data; - const { - _sources: sources, - _sourcesContent: sourcesContent, - _originalScopes: originalScopes, - _names: names, - } = cast(map); - const index = put(sources, source); - if (index === sourcesContent.length) sourcesContent[index] = null; - if (index === originalScopes.length) originalScopes[index] = []; - - const kindIndex = put(names, kind); - const scope: OriginalScope = name - ? [start.line - 1, start.column, end.line - 1, end.column, kindIndex, put(names, name)] - : [start.line - 1, start.column, end.line - 1, end.column, kindIndex]; - if (variables) { - scope.vars = variables.map((v) => put(names, v)); - } - const len = originalScopes[index].push(scope); - return [index, len - 1, variables]; -} -*/ - -// Generated Ranges -/* -export function addGeneratedRange( - map: GenMapping, - data: { - start: Pos; - isScope: boolean; - originalScope?: OriginalScopeInfo; - callsite?: OriginalPos; - }, -): GeneratedRangeInfo { - const { start, isScope, originalScope, callsite } = data; - const { - _originalScopes: originalScopes, - _sources: sources, - _sourcesContent: sourcesContent, - _generatedRanges: generatedRanges, - } = cast(map); - - const range: GeneratedRange = [ - start.line - 1, - start.column, - 0, - 0, - originalScope ? originalScope[0] : -1, - originalScope ? originalScope[1] : -1, - ]; - if (originalScope?.[2]) { - range.bindings = originalScope[2].map(() => [[-1]]); - } - if (callsite) { - const index = put(sources, callsite.source); - if (index === sourcesContent.length) sourcesContent[index] = null; - if (index === originalScopes.length) originalScopes[index] = []; - range.callsite = [index, callsite.line - 1, callsite.column]; - } - if (isScope) range.isScope = true; - generatedRanges.push(range); - - return [range, originalScope?.[2]]; -} - -export function setEndPosition(range: GeneratedRangeInfo, pos: Pos) { - range[0][2] = pos.line - 1; - range[0][3] = pos.column; -} - -export function addBinding( - map: GenMapping, - range: GeneratedRangeInfo, - variable: string, - expression: string | BindingExpressionRange, -) { - const { _names: names } = cast(map); - const bindings = (range[0].bindings ||= []); - const vars = range[1]; - - const index = vars!.indexOf(variable); - const binding = getIndex(bindings, index); - - if (typeof expression === 'string') binding[0] = [put(names, expression)]; - else { - const { start } = expression; - binding.push([put(names, expression.expression), start.line - 1, start.column]); - } -} -*/ diff --git a/node_modules/@jridgewell/gen-mapping/src/set-array.ts b/node_modules/@jridgewell/gen-mapping/src/set-array.ts deleted file mode 100644 index a2a73a5..0000000 --- a/node_modules/@jridgewell/gen-mapping/src/set-array.ts +++ /dev/null @@ -1,82 +0,0 @@ -type Key = string | number | symbol; - -/** - * SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the - * index of the `key` in the backing array. - * - * This is designed to allow synchronizing a second array with the contents of the backing array, - * like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`, - * and there are never duplicates. - */ -export class SetArray { - declare private _indexes: Record; - declare array: readonly T[]; - - constructor() { - this._indexes = { __proto__: null } as any; - this.array = []; - } -} - -interface PublicSet { - array: T[]; - _indexes: SetArray['_indexes']; -} - -/** - * Typescript doesn't allow friend access to private fields, so this just casts the set into a type - * with public access modifiers. - */ -function cast(set: SetArray): PublicSet { - return set as any; -} - -/** - * Gets the index associated with `key` in the backing array, if it is already present. - */ -export function get(setarr: SetArray, key: T): number | undefined { - return cast(setarr)._indexes[key]; -} - -/** - * Puts `key` into the backing array, if it is not already present. Returns - * the index of the `key` in the backing array. - */ -export function put(setarr: SetArray, key: T): number { - // The key may or may not be present. If it is present, it's a number. - const index = get(setarr, key); - if (index !== undefined) return index; - - const { array, _indexes: indexes } = cast(setarr); - - const length = array.push(key); - return (indexes[key] = length - 1); -} - -/** - * Pops the last added item out of the SetArray. - */ -export function pop(setarr: SetArray): void { - const { array, _indexes: indexes } = cast(setarr); - if (array.length === 0) return; - - const last = array.pop()!; - indexes[last] = undefined; -} - -/** - * Removes the key, if it exists in the set. - */ -export function remove(setarr: SetArray, key: T): void { - const index = get(setarr, key); - if (index === undefined) return; - - const { array, _indexes: indexes } = cast(setarr); - for (let i = index + 1; i < array.length; i++) { - const k = array[i]; - array[i - 1] = k; - indexes[k]!--; - } - indexes[key] = undefined; - array.pop(); -} diff --git a/node_modules/@jridgewell/gen-mapping/src/sourcemap-segment.ts b/node_modules/@jridgewell/gen-mapping/src/sourcemap-segment.ts deleted file mode 100644 index fb296dd..0000000 --- a/node_modules/@jridgewell/gen-mapping/src/sourcemap-segment.ts +++ /dev/null @@ -1,16 +0,0 @@ -type GeneratedColumn = number; -type SourcesIndex = number; -type SourceLine = number; -type SourceColumn = number; -type NamesIndex = number; - -export type SourceMapSegment = - | [GeneratedColumn] - | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn] - | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn, NamesIndex]; - -export const COLUMN = 0; -export const SOURCES_INDEX = 1; -export const SOURCE_LINE = 2; -export const SOURCE_COLUMN = 3; -export const NAMES_INDEX = 4; diff --git a/node_modules/@jridgewell/gen-mapping/src/types.ts b/node_modules/@jridgewell/gen-mapping/src/types.ts deleted file mode 100644 index b087f70..0000000 --- a/node_modules/@jridgewell/gen-mapping/src/types.ts +++ /dev/null @@ -1,61 +0,0 @@ -// import type { GeneratedRange, OriginalScope } from '@jridgewell/sourcemap-codec'; -import type { SourceMapSegment } from './sourcemap-segment'; - -export interface SourceMapV3 { - file?: string | null; - names: readonly string[]; - sourceRoot?: string; - sources: readonly (string | null)[]; - sourcesContent?: readonly (string | null)[]; - version: 3; - ignoreList?: readonly number[]; -} - -export interface EncodedSourceMap extends SourceMapV3 { - mappings: string; - // originalScopes: string[]; - // generatedRanges: string; -} - -export interface DecodedSourceMap extends SourceMapV3 { - mappings: readonly SourceMapSegment[][]; - // originalScopes: readonly OriginalScope[][]; - // generatedRanges: readonly GeneratedRange[]; -} - -export interface Pos { - line: number; // 1-based - column: number; // 0-based -} - -export interface OriginalPos extends Pos { - source: string; -} - -export interface BindingExpressionRange { - start: Pos; - expression: string; -} - -// export type OriginalScopeInfo = [number, number, string[] | undefined]; -// export type GeneratedRangeInfo = [GeneratedRange, string[] | undefined]; - -export type Mapping = - | { - generated: Pos; - source: undefined; - original: undefined; - name: undefined; - } - | { - generated: Pos; - source: string; - original: Pos; - name: string; - } - | { - generated: Pos; - source: string; - original: Pos; - name: undefined; - }; diff --git a/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.cts b/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.cts deleted file mode 100644 index 7618d85..0000000 --- a/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.cts +++ /dev/null @@ -1,89 +0,0 @@ -import type { SourceMapInput } from '@jridgewell/trace-mapping'; -import type { DecodedSourceMap, EncodedSourceMap, Pos, Mapping } from './types.cts'; -export type { DecodedSourceMap, EncodedSourceMap, Mapping }; -export type Options = { - file?: string | null; - sourceRoot?: string | null; -}; -/** - * Provides the state to generate a sourcemap. - */ -export declare class GenMapping { - private _names; - private _sources; - private _sourcesContent; - private _mappings; - private _ignoreList; - file: string | null | undefined; - sourceRoot: string | null | undefined; - constructor({ file, sourceRoot }?: Options); -} -/** - * A low-level API to associate a generated position with an original source position. Line and - * column here are 0-based, unlike `addMapping`. - */ -export declare function addSegment(map: GenMapping, genLine: number, genColumn: number, source?: null, sourceLine?: null, sourceColumn?: null, name?: null, content?: null): void; -export declare function addSegment(map: GenMapping, genLine: number, genColumn: number, source: string, sourceLine: number, sourceColumn: number, name?: null, content?: string | null): void; -export declare function addSegment(map: GenMapping, genLine: number, genColumn: number, source: string, sourceLine: number, sourceColumn: number, name: string, content?: string | null): void; -/** - * A high-level API to associate a generated position with an original source position. Line is - * 1-based, but column is 0-based, due to legacy behavior in `source-map` library. - */ -export declare function addMapping(map: GenMapping, mapping: { - generated: Pos; - source?: null; - original?: null; - name?: null; - content?: null; -}): void; -export declare function addMapping(map: GenMapping, mapping: { - generated: Pos; - source: string; - original: Pos; - name?: null; - content?: string | null; -}): void; -export declare function addMapping(map: GenMapping, mapping: { - generated: Pos; - source: string; - original: Pos; - name: string; - content?: string | null; -}): void; -/** - * Same as `addSegment`, but will only add the segment if it generates useful information in the - * resulting map. This only works correctly if segments are added **in order**, meaning you should - * not add a segment with a lower generated line/column than one that came before. - */ -export declare const maybeAddSegment: typeof addSegment; -/** - * Same as `addMapping`, but will only add the mapping if it generates useful information in the - * resulting map. This only works correctly if mappings are added **in order**, meaning you should - * not add a mapping with a lower generated line/column than one that came before. - */ -export declare const maybeAddMapping: typeof addMapping; -/** - * Adds/removes the content of the source file to the source map. - */ -export declare function setSourceContent(map: GenMapping, source: string, content: string | null): void; -export declare function setIgnore(map: GenMapping, source: string, ignore?: boolean): void; -/** - * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects - * a sourcemap, or to JSON.stringify. - */ -export declare function toDecodedMap(map: GenMapping): DecodedSourceMap; -/** - * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects - * a sourcemap, or to JSON.stringify. - */ -export declare function toEncodedMap(map: GenMapping): EncodedSourceMap; -/** - * Constructs a new GenMapping, using the already present mappings of the input. - */ -export declare function fromMap(input: SourceMapInput): GenMapping; -/** - * Returns an array of high-level mapping objects for every recorded segment, which could then be - * passed to the `source-map` library. - */ -export declare function allMappings(map: GenMapping): Mapping[]; -//# sourceMappingURL=gen-mapping.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.cts.map b/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.cts.map deleted file mode 100644 index 8a2b183..0000000 --- a/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.cts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"gen-mapping.d.ts","sourceRoot":"","sources":["../src/gen-mapping.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.mts b/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.mts deleted file mode 100644 index bbc0d89..0000000 --- a/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.mts +++ /dev/null @@ -1,89 +0,0 @@ -import type { SourceMapInput } from '@jridgewell/trace-mapping'; -import type { DecodedSourceMap, EncodedSourceMap, Pos, Mapping } from './types.mts'; -export type { DecodedSourceMap, EncodedSourceMap, Mapping }; -export type Options = { - file?: string | null; - sourceRoot?: string | null; -}; -/** - * Provides the state to generate a sourcemap. - */ -export declare class GenMapping { - private _names; - private _sources; - private _sourcesContent; - private _mappings; - private _ignoreList; - file: string | null | undefined; - sourceRoot: string | null | undefined; - constructor({ file, sourceRoot }?: Options); -} -/** - * A low-level API to associate a generated position with an original source position. Line and - * column here are 0-based, unlike `addMapping`. - */ -export declare function addSegment(map: GenMapping, genLine: number, genColumn: number, source?: null, sourceLine?: null, sourceColumn?: null, name?: null, content?: null): void; -export declare function addSegment(map: GenMapping, genLine: number, genColumn: number, source: string, sourceLine: number, sourceColumn: number, name?: null, content?: string | null): void; -export declare function addSegment(map: GenMapping, genLine: number, genColumn: number, source: string, sourceLine: number, sourceColumn: number, name: string, content?: string | null): void; -/** - * A high-level API to associate a generated position with an original source position. Line is - * 1-based, but column is 0-based, due to legacy behavior in `source-map` library. - */ -export declare function addMapping(map: GenMapping, mapping: { - generated: Pos; - source?: null; - original?: null; - name?: null; - content?: null; -}): void; -export declare function addMapping(map: GenMapping, mapping: { - generated: Pos; - source: string; - original: Pos; - name?: null; - content?: string | null; -}): void; -export declare function addMapping(map: GenMapping, mapping: { - generated: Pos; - source: string; - original: Pos; - name: string; - content?: string | null; -}): void; -/** - * Same as `addSegment`, but will only add the segment if it generates useful information in the - * resulting map. This only works correctly if segments are added **in order**, meaning you should - * not add a segment with a lower generated line/column than one that came before. - */ -export declare const maybeAddSegment: typeof addSegment; -/** - * Same as `addMapping`, but will only add the mapping if it generates useful information in the - * resulting map. This only works correctly if mappings are added **in order**, meaning you should - * not add a mapping with a lower generated line/column than one that came before. - */ -export declare const maybeAddMapping: typeof addMapping; -/** - * Adds/removes the content of the source file to the source map. - */ -export declare function setSourceContent(map: GenMapping, source: string, content: string | null): void; -export declare function setIgnore(map: GenMapping, source: string, ignore?: boolean): void; -/** - * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects - * a sourcemap, or to JSON.stringify. - */ -export declare function toDecodedMap(map: GenMapping): DecodedSourceMap; -/** - * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects - * a sourcemap, or to JSON.stringify. - */ -export declare function toEncodedMap(map: GenMapping): EncodedSourceMap; -/** - * Constructs a new GenMapping, using the already present mappings of the input. - */ -export declare function fromMap(input: SourceMapInput): GenMapping; -/** - * Returns an array of high-level mapping objects for every recorded segment, which could then be - * passed to the `source-map` library. - */ -export declare function allMappings(map: GenMapping): Mapping[]; -//# sourceMappingURL=gen-mapping.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.mts.map b/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.mts.map deleted file mode 100644 index 8a2b183..0000000 --- a/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.mts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"gen-mapping.d.ts","sourceRoot":"","sources":["../src/gen-mapping.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGhE,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,GAAG,EACH,OAAO,EAKR,MAAM,SAAS,CAAC;AAEjB,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC;AAE5D,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAAC;AAIF;;GAEG;AACH,qBAAa,UAAU;IACrB,QAAgB,MAAM,CAAmB;IACzC,QAAgB,QAAQ,CAAmB;IAC3C,QAAgB,eAAe,CAAoB;IACnD,QAAgB,SAAS,CAAuB;IAGhD,QAAgB,WAAW,CAAmB;IACtC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAChC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;gBAElC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAE,OAAY;CAW/C;AAoBD;;;GAGG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,IAAI,EACb,UAAU,CAAC,EAAE,IAAI,EACjB,YAAY,CAAC,EAAE,IAAI,EACnB,IAAI,CAAC,EAAE,IAAI,EACX,OAAO,CAAC,EAAE,IAAI,GACb,IAAI,CAAC;AACR,wBAAgB,UAAU,CACxB,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,IAAI,CAAC,EAAE,IAAI,EACX,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GACtB,IAAI,CAAC;AACR,wBAAgB,UAAU,CACxB,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GACtB,IAAI,CAAC;AAwBR;;;GAGG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,UAAU,EACf,OAAO,EAAE;IACP,SAAS,EAAE,GAAG,CAAC;IACf,MAAM,CAAC,EAAE,IAAI,CAAC;IACd,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,OAAO,CAAC,EAAE,IAAI,CAAC;CAChB,GACA,IAAI,CAAC;AACR,wBAAgB,UAAU,CACxB,GAAG,EAAE,UAAU,EACf,OAAO,EAAE;IACP,SAAS,EAAE,GAAG,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,GAAG,CAAC;IACd,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,GACA,IAAI,CAAC;AACR,wBAAgB,UAAU,CACxB,GAAG,EAAE,UAAU,EACf,OAAO,EAAE;IACP,SAAS,EAAE,GAAG,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,GAAG,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,GACA,IAAI,CAAC;AAcR;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,OAAO,UAqBpC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,OAAO,UAEpC,CAAC;AAEF;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAS9F;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,UAAO,QAYvE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,gBAAgB,CAwB9D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,gBAAgB,CAO9D;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,cAAc,GAAG,UAAU,CAYzD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,EAAE,CA0BtD"} \ No newline at end of file diff --git a/node_modules/@jridgewell/gen-mapping/types/set-array.d.cts b/node_modules/@jridgewell/gen-mapping/types/set-array.d.cts deleted file mode 100644 index 5d8cda3..0000000 --- a/node_modules/@jridgewell/gen-mapping/types/set-array.d.cts +++ /dev/null @@ -1,33 +0,0 @@ -type Key = string | number | symbol; -/** - * SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the - * index of the `key` in the backing array. - * - * This is designed to allow synchronizing a second array with the contents of the backing array, - * like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`, - * and there are never duplicates. - */ -export declare class SetArray { - private _indexes; - array: readonly T[]; - constructor(); -} -/** - * Gets the index associated with `key` in the backing array, if it is already present. - */ -export declare function get(setarr: SetArray, key: T): number | undefined; -/** - * Puts `key` into the backing array, if it is not already present. Returns - * the index of the `key` in the backing array. - */ -export declare function put(setarr: SetArray, key: T): number; -/** - * Pops the last added item out of the SetArray. - */ -export declare function pop(setarr: SetArray): void; -/** - * Removes the key, if it exists in the set. - */ -export declare function remove(setarr: SetArray, key: T): void; -export {}; -//# sourceMappingURL=set-array.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/gen-mapping/types/set-array.d.cts.map b/node_modules/@jridgewell/gen-mapping/types/set-array.d.cts.map deleted file mode 100644 index c52b8bc..0000000 --- a/node_modules/@jridgewell/gen-mapping/types/set-array.d.cts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"set-array.d.ts","sourceRoot":"","sources":["../src/set-array.ts"],"names":[],"mappings":"AAAA,KAAK,GAAG,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEpC;;;;;;;GAOG;AACH,qBAAa,QAAQ,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG;IACvC,QAAgB,QAAQ,CAAgC;IAChD,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;;CAM7B;AAeD;;GAEG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,SAAS,CAElF;AAED;;;GAGG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,CAStE;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAM5D;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAYvE"} \ No newline at end of file diff --git a/node_modules/@jridgewell/gen-mapping/types/set-array.d.mts b/node_modules/@jridgewell/gen-mapping/types/set-array.d.mts deleted file mode 100644 index 5d8cda3..0000000 --- a/node_modules/@jridgewell/gen-mapping/types/set-array.d.mts +++ /dev/null @@ -1,33 +0,0 @@ -type Key = string | number | symbol; -/** - * SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the - * index of the `key` in the backing array. - * - * This is designed to allow synchronizing a second array with the contents of the backing array, - * like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`, - * and there are never duplicates. - */ -export declare class SetArray { - private _indexes; - array: readonly T[]; - constructor(); -} -/** - * Gets the index associated with `key` in the backing array, if it is already present. - */ -export declare function get(setarr: SetArray, key: T): number | undefined; -/** - * Puts `key` into the backing array, if it is not already present. Returns - * the index of the `key` in the backing array. - */ -export declare function put(setarr: SetArray, key: T): number; -/** - * Pops the last added item out of the SetArray. - */ -export declare function pop(setarr: SetArray): void; -/** - * Removes the key, if it exists in the set. - */ -export declare function remove(setarr: SetArray, key: T): void; -export {}; -//# sourceMappingURL=set-array.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/gen-mapping/types/set-array.d.mts.map b/node_modules/@jridgewell/gen-mapping/types/set-array.d.mts.map deleted file mode 100644 index c52b8bc..0000000 --- a/node_modules/@jridgewell/gen-mapping/types/set-array.d.mts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"set-array.d.ts","sourceRoot":"","sources":["../src/set-array.ts"],"names":[],"mappings":"AAAA,KAAK,GAAG,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEpC;;;;;;;GAOG;AACH,qBAAa,QAAQ,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG;IACvC,QAAgB,QAAQ,CAAgC;IAChD,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;;CAM7B;AAeD;;GAEG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,SAAS,CAElF;AAED;;;GAGG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,CAStE;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAM5D;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAYvE"} \ No newline at end of file diff --git a/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.cts b/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.cts deleted file mode 100644 index 6886295..0000000 --- a/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.cts +++ /dev/null @@ -1,13 +0,0 @@ -type GeneratedColumn = number; -type SourcesIndex = number; -type SourceLine = number; -type SourceColumn = number; -type NamesIndex = number; -export type SourceMapSegment = [GeneratedColumn] | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn] | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn, NamesIndex]; -export declare const COLUMN = 0; -export declare const SOURCES_INDEX = 1; -export declare const SOURCE_LINE = 2; -export declare const SOURCE_COLUMN = 3; -export declare const NAMES_INDEX = 4; -export {}; -//# sourceMappingURL=sourcemap-segment.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.cts.map b/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.cts.map deleted file mode 100644 index 23cdc45..0000000 --- a/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.cts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"sourcemap-segment.d.ts","sourceRoot":"","sources":["../src/sourcemap-segment.ts"],"names":[],"mappings":"AAAA,KAAK,eAAe,GAAG,MAAM,CAAC;AAC9B,KAAK,YAAY,GAAG,MAAM,CAAC;AAC3B,KAAK,UAAU,GAAG,MAAM,CAAC;AACzB,KAAK,YAAY,GAAG,MAAM,CAAC;AAC3B,KAAK,UAAU,GAAG,MAAM,CAAC;AAEzB,MAAM,MAAM,gBAAgB,GACxB,CAAC,eAAe,CAAC,GACjB,CAAC,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,CAAC,GACzD,CAAC,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;AAE1E,eAAO,MAAM,MAAM,IAAI,CAAC;AACxB,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B,eAAO,MAAM,WAAW,IAAI,CAAC;AAC7B,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B,eAAO,MAAM,WAAW,IAAI,CAAC"} \ No newline at end of file diff --git a/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.mts b/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.mts deleted file mode 100644 index 6886295..0000000 --- a/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.mts +++ /dev/null @@ -1,13 +0,0 @@ -type GeneratedColumn = number; -type SourcesIndex = number; -type SourceLine = number; -type SourceColumn = number; -type NamesIndex = number; -export type SourceMapSegment = [GeneratedColumn] | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn] | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn, NamesIndex]; -export declare const COLUMN = 0; -export declare const SOURCES_INDEX = 1; -export declare const SOURCE_LINE = 2; -export declare const SOURCE_COLUMN = 3; -export declare const NAMES_INDEX = 4; -export {}; -//# sourceMappingURL=sourcemap-segment.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.mts.map b/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.mts.map deleted file mode 100644 index 23cdc45..0000000 --- a/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.mts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"sourcemap-segment.d.ts","sourceRoot":"","sources":["../src/sourcemap-segment.ts"],"names":[],"mappings":"AAAA,KAAK,eAAe,GAAG,MAAM,CAAC;AAC9B,KAAK,YAAY,GAAG,MAAM,CAAC;AAC3B,KAAK,UAAU,GAAG,MAAM,CAAC;AACzB,KAAK,YAAY,GAAG,MAAM,CAAC;AAC3B,KAAK,UAAU,GAAG,MAAM,CAAC;AAEzB,MAAM,MAAM,gBAAgB,GACxB,CAAC,eAAe,CAAC,GACjB,CAAC,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,CAAC,GACzD,CAAC,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;AAE1E,eAAO,MAAM,MAAM,IAAI,CAAC;AACxB,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B,eAAO,MAAM,WAAW,IAAI,CAAC;AAC7B,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B,eAAO,MAAM,WAAW,IAAI,CAAC"} \ No newline at end of file diff --git a/node_modules/@jridgewell/gen-mapping/types/types.d.cts b/node_modules/@jridgewell/gen-mapping/types/types.d.cts deleted file mode 100644 index 58da00a..0000000 --- a/node_modules/@jridgewell/gen-mapping/types/types.d.cts +++ /dev/null @@ -1,44 +0,0 @@ -import type { SourceMapSegment } from './sourcemap-segment.cts'; -export interface SourceMapV3 { - file?: string | null; - names: readonly string[]; - sourceRoot?: string; - sources: readonly (string | null)[]; - sourcesContent?: readonly (string | null)[]; - version: 3; - ignoreList?: readonly number[]; -} -export interface EncodedSourceMap extends SourceMapV3 { - mappings: string; -} -export interface DecodedSourceMap extends SourceMapV3 { - mappings: readonly SourceMapSegment[][]; -} -export interface Pos { - line: number; - column: number; -} -export interface OriginalPos extends Pos { - source: string; -} -export interface BindingExpressionRange { - start: Pos; - expression: string; -} -export type Mapping = { - generated: Pos; - source: undefined; - original: undefined; - name: undefined; -} | { - generated: Pos; - source: string; - original: Pos; - name: string; -} | { - generated: Pos; - source: string; - original: Pos; - name: undefined; -}; -//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/gen-mapping/types/types.d.cts.map b/node_modules/@jridgewell/gen-mapping/types/types.d.cts.map deleted file mode 100644 index 159e734..0000000 --- a/node_modules/@jridgewell/gen-mapping/types/types.d.cts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;IACpC,cAAc,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;IAC5C,OAAO,EAAE,CAAC,CAAC;IACX,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,QAAQ,EAAE,MAAM,CAAC;CAGlB;AAED,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,QAAQ,EAAE,SAAS,gBAAgB,EAAE,EAAE,CAAC;CAGzC;AAED,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAY,SAAQ,GAAG;IACtC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,GAAG,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;CACpB;AAKD,MAAM,MAAM,OAAO,GACf;IACE,SAAS,EAAE,GAAG,CAAC;IACf,MAAM,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;IACpB,IAAI,EAAE,SAAS,CAAC;CACjB,GACD;IACE,SAAS,EAAE,GAAG,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,GAAG,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE,SAAS,EAAE,GAAG,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,GAAG,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;CACjB,CAAC"} \ No newline at end of file diff --git a/node_modules/@jridgewell/gen-mapping/types/types.d.mts b/node_modules/@jridgewell/gen-mapping/types/types.d.mts deleted file mode 100644 index e9837eb..0000000 --- a/node_modules/@jridgewell/gen-mapping/types/types.d.mts +++ /dev/null @@ -1,44 +0,0 @@ -import type { SourceMapSegment } from './sourcemap-segment.mts'; -export interface SourceMapV3 { - file?: string | null; - names: readonly string[]; - sourceRoot?: string; - sources: readonly (string | null)[]; - sourcesContent?: readonly (string | null)[]; - version: 3; - ignoreList?: readonly number[]; -} -export interface EncodedSourceMap extends SourceMapV3 { - mappings: string; -} -export interface DecodedSourceMap extends SourceMapV3 { - mappings: readonly SourceMapSegment[][]; -} -export interface Pos { - line: number; - column: number; -} -export interface OriginalPos extends Pos { - source: string; -} -export interface BindingExpressionRange { - start: Pos; - expression: string; -} -export type Mapping = { - generated: Pos; - source: undefined; - original: undefined; - name: undefined; -} | { - generated: Pos; - source: string; - original: Pos; - name: string; -} | { - generated: Pos; - source: string; - original: Pos; - name: undefined; -}; -//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/gen-mapping/types/types.d.mts.map b/node_modules/@jridgewell/gen-mapping/types/types.d.mts.map deleted file mode 100644 index 159e734..0000000 --- a/node_modules/@jridgewell/gen-mapping/types/types.d.mts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;IACpC,cAAc,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;IAC5C,OAAO,EAAE,CAAC,CAAC;IACX,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,QAAQ,EAAE,MAAM,CAAC;CAGlB;AAED,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,QAAQ,EAAE,SAAS,gBAAgB,EAAE,EAAE,CAAC;CAGzC;AAED,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAY,SAAQ,GAAG;IACtC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,GAAG,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;CACpB;AAKD,MAAM,MAAM,OAAO,GACf;IACE,SAAS,EAAE,GAAG,CAAC;IACf,MAAM,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;IACpB,IAAI,EAAE,SAAS,CAAC;CACjB,GACD;IACE,SAAS,EAAE,GAAG,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,GAAG,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE,SAAS,EAAE,GAAG,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,GAAG,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;CACjB,CAAC"} \ No newline at end of file diff --git a/node_modules/@jridgewell/resolve-uri/LICENSE b/node_modules/@jridgewell/resolve-uri/LICENSE deleted file mode 100644 index 0a81b2a..0000000 --- a/node_modules/@jridgewell/resolve-uri/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright 2019 Justin Ridgewell - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/node_modules/@jridgewell/resolve-uri/README.md b/node_modules/@jridgewell/resolve-uri/README.md deleted file mode 100644 index 2fe70df..0000000 --- a/node_modules/@jridgewell/resolve-uri/README.md +++ /dev/null @@ -1,40 +0,0 @@ -# @jridgewell/resolve-uri - -> Resolve a URI relative to an optional base URI - -Resolve any combination of absolute URIs, protocol-realtive URIs, absolute paths, or relative paths. - -## Installation - -```sh -npm install @jridgewell/resolve-uri -``` - -## Usage - -```typescript -function resolve(input: string, base?: string): string; -``` - -```js -import resolve from '@jridgewell/resolve-uri'; - -resolve('foo', 'https://example.com'); // => 'https://example.com/foo' -``` - -| Input | Base | Resolution | Explanation | -|-----------------------|-------------------------|--------------------------------|--------------------------------------------------------------| -| `https://example.com` | _any_ | `https://example.com/` | Input is normalized only | -| `//example.com` | `https://base.com/` | `https://example.com/` | Input inherits the base's protocol | -| `//example.com` | _rest_ | `//example.com/` | Input is normalized only | -| `/example` | `https://base.com/` | `https://base.com/example` | Input inherits the base's origin | -| `/example` | `//base.com/` | `//base.com/example` | Input inherits the base's host and remains protocol relative | -| `/example` | _rest_ | `/example` | Input is normalized only | -| `example` | `https://base.com/dir/` | `https://base.com/dir/example` | Input is joined with the base | -| `example` | `https://base.com/file` | `https://base.com/example` | Input is joined with the base without its file | -| `example` | `//base.com/dir/` | `//base.com/dir/example` | Input is joined with the base's last directory | -| `example` | `//base.com/file` | `//base.com/example` | Input is joined with the base without its file | -| `example` | `/base/dir/` | `/base/dir/example` | Input is joined with the base's last directory | -| `example` | `/base/file` | `/base/example` | Input is joined with the base without its file | -| `example` | `base/dir/` | `base/dir/example` | Input is joined with the base's last directory | -| `example` | `base/file` | `base/example` | Input is joined with the base without its file | diff --git a/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs b/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs deleted file mode 100644 index e958e88..0000000 --- a/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs +++ /dev/null @@ -1,232 +0,0 @@ -// Matches the scheme of a URL, eg "http://" -const schemeRegex = /^[\w+.-]+:\/\//; -/** - * Matches the parts of a URL: - * 1. Scheme, including ":", guaranteed. - * 2. User/password, including "@", optional. - * 3. Host, guaranteed. - * 4. Port, including ":", optional. - * 5. Path, including "/", optional. - * 6. Query, including "?", optional. - * 7. Hash, including "#", optional. - */ -const urlRegex = /^([\w+.-]+:)\/\/([^@/#?]*@)?([^:/#?]*)(:\d+)?(\/[^#?]*)?(\?[^#]*)?(#.*)?/; -/** - * File URLs are weird. They dont' need the regular `//` in the scheme, they may or may not start - * with a leading `/`, they can have a domain (but only if they don't start with a Windows drive). - * - * 1. Host, optional. - * 2. Path, which may include "/", guaranteed. - * 3. Query, including "?", optional. - * 4. Hash, including "#", optional. - */ -const fileRegex = /^file:(?:\/\/((?![a-z]:)[^/#?]*)?)?(\/?[^#?]*)(\?[^#]*)?(#.*)?/i; -function isAbsoluteUrl(input) { - return schemeRegex.test(input); -} -function isSchemeRelativeUrl(input) { - return input.startsWith('//'); -} -function isAbsolutePath(input) { - return input.startsWith('/'); -} -function isFileUrl(input) { - return input.startsWith('file:'); -} -function isRelative(input) { - return /^[.?#]/.test(input); -} -function parseAbsoluteUrl(input) { - const match = urlRegex.exec(input); - return makeUrl(match[1], match[2] || '', match[3], match[4] || '', match[5] || '/', match[6] || '', match[7] || ''); -} -function parseFileUrl(input) { - const match = fileRegex.exec(input); - const path = match[2]; - return makeUrl('file:', '', match[1] || '', '', isAbsolutePath(path) ? path : '/' + path, match[3] || '', match[4] || ''); -} -function makeUrl(scheme, user, host, port, path, query, hash) { - return { - scheme, - user, - host, - port, - path, - query, - hash, - type: 7 /* Absolute */, - }; -} -function parseUrl(input) { - if (isSchemeRelativeUrl(input)) { - const url = parseAbsoluteUrl('http:' + input); - url.scheme = ''; - url.type = 6 /* SchemeRelative */; - return url; - } - if (isAbsolutePath(input)) { - const url = parseAbsoluteUrl('http://foo.com' + input); - url.scheme = ''; - url.host = ''; - url.type = 5 /* AbsolutePath */; - return url; - } - if (isFileUrl(input)) - return parseFileUrl(input); - if (isAbsoluteUrl(input)) - return parseAbsoluteUrl(input); - const url = parseAbsoluteUrl('http://foo.com/' + input); - url.scheme = ''; - url.host = ''; - url.type = input - ? input.startsWith('?') - ? 3 /* Query */ - : input.startsWith('#') - ? 2 /* Hash */ - : 4 /* RelativePath */ - : 1 /* Empty */; - return url; -} -function stripPathFilename(path) { - // If a path ends with a parent directory "..", then it's a relative path with excess parent - // paths. It's not a file, so we can't strip it. - if (path.endsWith('/..')) - return path; - const index = path.lastIndexOf('/'); - return path.slice(0, index + 1); -} -function mergePaths(url, base) { - normalizePath(base, base.type); - // If the path is just a "/", then it was an empty path to begin with (remember, we're a relative - // path). - if (url.path === '/') { - url.path = base.path; - } - else { - // Resolution happens relative to the base path's directory, not the file. - url.path = stripPathFilename(base.path) + url.path; - } -} -/** - * The path can have empty directories "//", unneeded parents "foo/..", or current directory - * "foo/.". We need to normalize to a standard representation. - */ -function normalizePath(url, type) { - const rel = type <= 4 /* RelativePath */; - const pieces = url.path.split('/'); - // We need to preserve the first piece always, so that we output a leading slash. The item at - // pieces[0] is an empty string. - let pointer = 1; - // Positive is the number of real directories we've output, used for popping a parent directory. - // Eg, "foo/bar/.." will have a positive 2, and we can decrement to be left with just "foo". - let positive = 0; - // We need to keep a trailing slash if we encounter an empty directory (eg, splitting "foo/" will - // generate `["foo", ""]` pieces). And, if we pop a parent directory. But once we encounter a - // real directory, we won't need to append, unless the other conditions happen again. - let addTrailingSlash = false; - for (let i = 1; i < pieces.length; i++) { - const piece = pieces[i]; - // An empty directory, could be a trailing slash, or just a double "//" in the path. - if (!piece) { - addTrailingSlash = true; - continue; - } - // If we encounter a real directory, then we don't need to append anymore. - addTrailingSlash = false; - // A current directory, which we can always drop. - if (piece === '.') - continue; - // A parent directory, we need to see if there are any real directories we can pop. Else, we - // have an excess of parents, and we'll need to keep the "..". - if (piece === '..') { - if (positive) { - addTrailingSlash = true; - positive--; - pointer--; - } - else if (rel) { - // If we're in a relativePath, then we need to keep the excess parents. Else, in an absolute - // URL, protocol relative URL, or an absolute path, we don't need to keep excess. - pieces[pointer++] = piece; - } - continue; - } - // We've encountered a real directory. Move it to the next insertion pointer, which accounts for - // any popped or dropped directories. - pieces[pointer++] = piece; - positive++; - } - let path = ''; - for (let i = 1; i < pointer; i++) { - path += '/' + pieces[i]; - } - if (!path || (addTrailingSlash && !path.endsWith('/..'))) { - path += '/'; - } - url.path = path; -} -/** - * Attempts to resolve `input` URL/path relative to `base`. - */ -function resolve(input, base) { - if (!input && !base) - return ''; - const url = parseUrl(input); - let inputType = url.type; - if (base && inputType !== 7 /* Absolute */) { - const baseUrl = parseUrl(base); - const baseType = baseUrl.type; - switch (inputType) { - case 1 /* Empty */: - url.hash = baseUrl.hash; - // fall through - case 2 /* Hash */: - url.query = baseUrl.query; - // fall through - case 3 /* Query */: - case 4 /* RelativePath */: - mergePaths(url, baseUrl); - // fall through - case 5 /* AbsolutePath */: - // The host, user, and port are joined, you can't copy one without the others. - url.user = baseUrl.user; - url.host = baseUrl.host; - url.port = baseUrl.port; - // fall through - case 6 /* SchemeRelative */: - // The input doesn't have a schema at least, so we need to copy at least that over. - url.scheme = baseUrl.scheme; - } - if (baseType > inputType) - inputType = baseType; - } - normalizePath(url, inputType); - const queryHash = url.query + url.hash; - switch (inputType) { - // This is impossible, because of the empty checks at the start of the function. - // case UrlType.Empty: - case 2 /* Hash */: - case 3 /* Query */: - return queryHash; - case 4 /* RelativePath */: { - // The first char is always a "/", and we need it to be relative. - const path = url.path.slice(1); - if (!path) - return queryHash || '.'; - if (isRelative(base || input) && !isRelative(path)) { - // If base started with a leading ".", or there is no base and input started with a ".", - // then we need to ensure that the relative path starts with a ".". We don't know if - // relative starts with a "..", though, so check before prepending. - return './' + path + queryHash; - } - return path + queryHash; - } - case 5 /* AbsolutePath */: - return url.path + queryHash; - default: - return url.scheme + '//' + url.user + url.host + url.port + url.path + queryHash; - } -} - -export { resolve as default }; -//# sourceMappingURL=resolve-uri.mjs.map diff --git a/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs.map b/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs.map deleted file mode 100644 index 1de97d0..0000000 --- a/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"resolve-uri.mjs","sources":["../src/resolve-uri.ts"],"sourcesContent":["// Matches the scheme of a URL, eg \"http://\"\nconst schemeRegex = /^[\\w+.-]+:\\/\\//;\n\n/**\n * Matches the parts of a URL:\n * 1. Scheme, including \":\", guaranteed.\n * 2. User/password, including \"@\", optional.\n * 3. Host, guaranteed.\n * 4. Port, including \":\", optional.\n * 5. Path, including \"/\", optional.\n * 6. Query, including \"?\", optional.\n * 7. Hash, including \"#\", optional.\n */\nconst urlRegex = /^([\\w+.-]+:)\\/\\/([^@/#?]*@)?([^:/#?]*)(:\\d+)?(\\/[^#?]*)?(\\?[^#]*)?(#.*)?/;\n\n/**\n * File URLs are weird. They dont' need the regular `//` in the scheme, they may or may not start\n * with a leading `/`, they can have a domain (but only if they don't start with a Windows drive).\n *\n * 1. Host, optional.\n * 2. Path, which may include \"/\", guaranteed.\n * 3. Query, including \"?\", optional.\n * 4. Hash, including \"#\", optional.\n */\nconst fileRegex = /^file:(?:\\/\\/((?![a-z]:)[^/#?]*)?)?(\\/?[^#?]*)(\\?[^#]*)?(#.*)?/i;\n\ntype Url = {\n scheme: string;\n user: string;\n host: string;\n port: string;\n path: string;\n query: string;\n hash: string;\n type: UrlType;\n};\n\nconst enum UrlType {\n Empty = 1,\n Hash = 2,\n Query = 3,\n RelativePath = 4,\n AbsolutePath = 5,\n SchemeRelative = 6,\n Absolute = 7,\n}\n\nfunction isAbsoluteUrl(input: string): boolean {\n return schemeRegex.test(input);\n}\n\nfunction isSchemeRelativeUrl(input: string): boolean {\n return input.startsWith('//');\n}\n\nfunction isAbsolutePath(input: string): boolean {\n return input.startsWith('/');\n}\n\nfunction isFileUrl(input: string): boolean {\n return input.startsWith('file:');\n}\n\nfunction isRelative(input: string): boolean {\n return /^[.?#]/.test(input);\n}\n\nfunction parseAbsoluteUrl(input: string): Url {\n const match = urlRegex.exec(input)!;\n return makeUrl(\n match[1],\n match[2] || '',\n match[3],\n match[4] || '',\n match[5] || '/',\n match[6] || '',\n match[7] || '',\n );\n}\n\nfunction parseFileUrl(input: string): Url {\n const match = fileRegex.exec(input)!;\n const path = match[2];\n return makeUrl(\n 'file:',\n '',\n match[1] || '',\n '',\n isAbsolutePath(path) ? path : '/' + path,\n match[3] || '',\n match[4] || '',\n );\n}\n\nfunction makeUrl(\n scheme: string,\n user: string,\n host: string,\n port: string,\n path: string,\n query: string,\n hash: string,\n): Url {\n return {\n scheme,\n user,\n host,\n port,\n path,\n query,\n hash,\n type: UrlType.Absolute,\n };\n}\n\nfunction parseUrl(input: string): Url {\n if (isSchemeRelativeUrl(input)) {\n const url = parseAbsoluteUrl('http:' + input);\n url.scheme = '';\n url.type = UrlType.SchemeRelative;\n return url;\n }\n\n if (isAbsolutePath(input)) {\n const url = parseAbsoluteUrl('http://foo.com' + input);\n url.scheme = '';\n url.host = '';\n url.type = UrlType.AbsolutePath;\n return url;\n }\n\n if (isFileUrl(input)) return parseFileUrl(input);\n\n if (isAbsoluteUrl(input)) return parseAbsoluteUrl(input);\n\n const url = parseAbsoluteUrl('http://foo.com/' + input);\n url.scheme = '';\n url.host = '';\n url.type = input\n ? input.startsWith('?')\n ? UrlType.Query\n : input.startsWith('#')\n ? UrlType.Hash\n : UrlType.RelativePath\n : UrlType.Empty;\n return url;\n}\n\nfunction stripPathFilename(path: string): string {\n // If a path ends with a parent directory \"..\", then it's a relative path with excess parent\n // paths. It's not a file, so we can't strip it.\n if (path.endsWith('/..')) return path;\n const index = path.lastIndexOf('/');\n return path.slice(0, index + 1);\n}\n\nfunction mergePaths(url: Url, base: Url) {\n normalizePath(base, base.type);\n\n // If the path is just a \"/\", then it was an empty path to begin with (remember, we're a relative\n // path).\n if (url.path === '/') {\n url.path = base.path;\n } else {\n // Resolution happens relative to the base path's directory, not the file.\n url.path = stripPathFilename(base.path) + url.path;\n }\n}\n\n/**\n * The path can have empty directories \"//\", unneeded parents \"foo/..\", or current directory\n * \"foo/.\". We need to normalize to a standard representation.\n */\nfunction normalizePath(url: Url, type: UrlType) {\n const rel = type <= UrlType.RelativePath;\n const pieces = url.path.split('/');\n\n // We need to preserve the first piece always, so that we output a leading slash. The item at\n // pieces[0] is an empty string.\n let pointer = 1;\n\n // Positive is the number of real directories we've output, used for popping a parent directory.\n // Eg, \"foo/bar/..\" will have a positive 2, and we can decrement to be left with just \"foo\".\n let positive = 0;\n\n // We need to keep a trailing slash if we encounter an empty directory (eg, splitting \"foo/\" will\n // generate `[\"foo\", \"\"]` pieces). And, if we pop a parent directory. But once we encounter a\n // real directory, we won't need to append, unless the other conditions happen again.\n let addTrailingSlash = false;\n\n for (let i = 1; i < pieces.length; i++) {\n const piece = pieces[i];\n\n // An empty directory, could be a trailing slash, or just a double \"//\" in the path.\n if (!piece) {\n addTrailingSlash = true;\n continue;\n }\n\n // If we encounter a real directory, then we don't need to append anymore.\n addTrailingSlash = false;\n\n // A current directory, which we can always drop.\n if (piece === '.') continue;\n\n // A parent directory, we need to see if there are any real directories we can pop. Else, we\n // have an excess of parents, and we'll need to keep the \"..\".\n if (piece === '..') {\n if (positive) {\n addTrailingSlash = true;\n positive--;\n pointer--;\n } else if (rel) {\n // If we're in a relativePath, then we need to keep the excess parents. Else, in an absolute\n // URL, protocol relative URL, or an absolute path, we don't need to keep excess.\n pieces[pointer++] = piece;\n }\n continue;\n }\n\n // We've encountered a real directory. Move it to the next insertion pointer, which accounts for\n // any popped or dropped directories.\n pieces[pointer++] = piece;\n positive++;\n }\n\n let path = '';\n for (let i = 1; i < pointer; i++) {\n path += '/' + pieces[i];\n }\n if (!path || (addTrailingSlash && !path.endsWith('/..'))) {\n path += '/';\n }\n url.path = path;\n}\n\n/**\n * Attempts to resolve `input` URL/path relative to `base`.\n */\nexport default function resolve(input: string, base: string | undefined): string {\n if (!input && !base) return '';\n\n const url = parseUrl(input);\n let inputType = url.type;\n\n if (base && inputType !== UrlType.Absolute) {\n const baseUrl = parseUrl(base);\n const baseType = baseUrl.type;\n\n switch (inputType) {\n case UrlType.Empty:\n url.hash = baseUrl.hash;\n // fall through\n\n case UrlType.Hash:\n url.query = baseUrl.query;\n // fall through\n\n case UrlType.Query:\n case UrlType.RelativePath:\n mergePaths(url, baseUrl);\n // fall through\n\n case UrlType.AbsolutePath:\n // The host, user, and port are joined, you can't copy one without the others.\n url.user = baseUrl.user;\n url.host = baseUrl.host;\n url.port = baseUrl.port;\n // fall through\n\n case UrlType.SchemeRelative:\n // The input doesn't have a schema at least, so we need to copy at least that over.\n url.scheme = baseUrl.scheme;\n }\n if (baseType > inputType) inputType = baseType;\n }\n\n normalizePath(url, inputType);\n\n const queryHash = url.query + url.hash;\n switch (inputType) {\n // This is impossible, because of the empty checks at the start of the function.\n // case UrlType.Empty:\n\n case UrlType.Hash:\n case UrlType.Query:\n return queryHash;\n\n case UrlType.RelativePath: {\n // The first char is always a \"/\", and we need it to be relative.\n const path = url.path.slice(1);\n\n if (!path) return queryHash || '.';\n\n if (isRelative(base || input) && !isRelative(path)) {\n // If base started with a leading \".\", or there is no base and input started with a \".\",\n // then we need to ensure that the relative path starts with a \".\". We don't know if\n // relative starts with a \"..\", though, so check before prepending.\n return './' + path + queryHash;\n }\n\n return path + queryHash;\n }\n\n case UrlType.AbsolutePath:\n return url.path + queryHash;\n\n default:\n return url.scheme + '//' + url.user + url.host + url.port + url.path + queryHash;\n }\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js b/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js deleted file mode 100644 index a783049..0000000 --- a/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js +++ /dev/null @@ -1,240 +0,0 @@ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.resolveURI = factory()); -})(this, (function () { 'use strict'; - - // Matches the scheme of a URL, eg "http://" - const schemeRegex = /^[\w+.-]+:\/\//; - /** - * Matches the parts of a URL: - * 1. Scheme, including ":", guaranteed. - * 2. User/password, including "@", optional. - * 3. Host, guaranteed. - * 4. Port, including ":", optional. - * 5. Path, including "/", optional. - * 6. Query, including "?", optional. - * 7. Hash, including "#", optional. - */ - const urlRegex = /^([\w+.-]+:)\/\/([^@/#?]*@)?([^:/#?]*)(:\d+)?(\/[^#?]*)?(\?[^#]*)?(#.*)?/; - /** - * File URLs are weird. They dont' need the regular `//` in the scheme, they may or may not start - * with a leading `/`, they can have a domain (but only if they don't start with a Windows drive). - * - * 1. Host, optional. - * 2. Path, which may include "/", guaranteed. - * 3. Query, including "?", optional. - * 4. Hash, including "#", optional. - */ - const fileRegex = /^file:(?:\/\/((?![a-z]:)[^/#?]*)?)?(\/?[^#?]*)(\?[^#]*)?(#.*)?/i; - function isAbsoluteUrl(input) { - return schemeRegex.test(input); - } - function isSchemeRelativeUrl(input) { - return input.startsWith('//'); - } - function isAbsolutePath(input) { - return input.startsWith('/'); - } - function isFileUrl(input) { - return input.startsWith('file:'); - } - function isRelative(input) { - return /^[.?#]/.test(input); - } - function parseAbsoluteUrl(input) { - const match = urlRegex.exec(input); - return makeUrl(match[1], match[2] || '', match[3], match[4] || '', match[5] || '/', match[6] || '', match[7] || ''); - } - function parseFileUrl(input) { - const match = fileRegex.exec(input); - const path = match[2]; - return makeUrl('file:', '', match[1] || '', '', isAbsolutePath(path) ? path : '/' + path, match[3] || '', match[4] || ''); - } - function makeUrl(scheme, user, host, port, path, query, hash) { - return { - scheme, - user, - host, - port, - path, - query, - hash, - type: 7 /* Absolute */, - }; - } - function parseUrl(input) { - if (isSchemeRelativeUrl(input)) { - const url = parseAbsoluteUrl('http:' + input); - url.scheme = ''; - url.type = 6 /* SchemeRelative */; - return url; - } - if (isAbsolutePath(input)) { - const url = parseAbsoluteUrl('http://foo.com' + input); - url.scheme = ''; - url.host = ''; - url.type = 5 /* AbsolutePath */; - return url; - } - if (isFileUrl(input)) - return parseFileUrl(input); - if (isAbsoluteUrl(input)) - return parseAbsoluteUrl(input); - const url = parseAbsoluteUrl('http://foo.com/' + input); - url.scheme = ''; - url.host = ''; - url.type = input - ? input.startsWith('?') - ? 3 /* Query */ - : input.startsWith('#') - ? 2 /* Hash */ - : 4 /* RelativePath */ - : 1 /* Empty */; - return url; - } - function stripPathFilename(path) { - // If a path ends with a parent directory "..", then it's a relative path with excess parent - // paths. It's not a file, so we can't strip it. - if (path.endsWith('/..')) - return path; - const index = path.lastIndexOf('/'); - return path.slice(0, index + 1); - } - function mergePaths(url, base) { - normalizePath(base, base.type); - // If the path is just a "/", then it was an empty path to begin with (remember, we're a relative - // path). - if (url.path === '/') { - url.path = base.path; - } - else { - // Resolution happens relative to the base path's directory, not the file. - url.path = stripPathFilename(base.path) + url.path; - } - } - /** - * The path can have empty directories "//", unneeded parents "foo/..", or current directory - * "foo/.". We need to normalize to a standard representation. - */ - function normalizePath(url, type) { - const rel = type <= 4 /* RelativePath */; - const pieces = url.path.split('/'); - // We need to preserve the first piece always, so that we output a leading slash. The item at - // pieces[0] is an empty string. - let pointer = 1; - // Positive is the number of real directories we've output, used for popping a parent directory. - // Eg, "foo/bar/.." will have a positive 2, and we can decrement to be left with just "foo". - let positive = 0; - // We need to keep a trailing slash if we encounter an empty directory (eg, splitting "foo/" will - // generate `["foo", ""]` pieces). And, if we pop a parent directory. But once we encounter a - // real directory, we won't need to append, unless the other conditions happen again. - let addTrailingSlash = false; - for (let i = 1; i < pieces.length; i++) { - const piece = pieces[i]; - // An empty directory, could be a trailing slash, or just a double "//" in the path. - if (!piece) { - addTrailingSlash = true; - continue; - } - // If we encounter a real directory, then we don't need to append anymore. - addTrailingSlash = false; - // A current directory, which we can always drop. - if (piece === '.') - continue; - // A parent directory, we need to see if there are any real directories we can pop. Else, we - // have an excess of parents, and we'll need to keep the "..". - if (piece === '..') { - if (positive) { - addTrailingSlash = true; - positive--; - pointer--; - } - else if (rel) { - // If we're in a relativePath, then we need to keep the excess parents. Else, in an absolute - // URL, protocol relative URL, or an absolute path, we don't need to keep excess. - pieces[pointer++] = piece; - } - continue; - } - // We've encountered a real directory. Move it to the next insertion pointer, which accounts for - // any popped or dropped directories. - pieces[pointer++] = piece; - positive++; - } - let path = ''; - for (let i = 1; i < pointer; i++) { - path += '/' + pieces[i]; - } - if (!path || (addTrailingSlash && !path.endsWith('/..'))) { - path += '/'; - } - url.path = path; - } - /** - * Attempts to resolve `input` URL/path relative to `base`. - */ - function resolve(input, base) { - if (!input && !base) - return ''; - const url = parseUrl(input); - let inputType = url.type; - if (base && inputType !== 7 /* Absolute */) { - const baseUrl = parseUrl(base); - const baseType = baseUrl.type; - switch (inputType) { - case 1 /* Empty */: - url.hash = baseUrl.hash; - // fall through - case 2 /* Hash */: - url.query = baseUrl.query; - // fall through - case 3 /* Query */: - case 4 /* RelativePath */: - mergePaths(url, baseUrl); - // fall through - case 5 /* AbsolutePath */: - // The host, user, and port are joined, you can't copy one without the others. - url.user = baseUrl.user; - url.host = baseUrl.host; - url.port = baseUrl.port; - // fall through - case 6 /* SchemeRelative */: - // The input doesn't have a schema at least, so we need to copy at least that over. - url.scheme = baseUrl.scheme; - } - if (baseType > inputType) - inputType = baseType; - } - normalizePath(url, inputType); - const queryHash = url.query + url.hash; - switch (inputType) { - // This is impossible, because of the empty checks at the start of the function. - // case UrlType.Empty: - case 2 /* Hash */: - case 3 /* Query */: - return queryHash; - case 4 /* RelativePath */: { - // The first char is always a "/", and we need it to be relative. - const path = url.path.slice(1); - if (!path) - return queryHash || '.'; - if (isRelative(base || input) && !isRelative(path)) { - // If base started with a leading ".", or there is no base and input started with a ".", - // then we need to ensure that the relative path starts with a ".". We don't know if - // relative starts with a "..", though, so check before prepending. - return './' + path + queryHash; - } - return path + queryHash; - } - case 5 /* AbsolutePath */: - return url.path + queryHash; - default: - return url.scheme + '//' + url.user + url.host + url.port + url.path + queryHash; - } - } - - return resolve; - -})); -//# sourceMappingURL=resolve-uri.umd.js.map diff --git a/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js.map b/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js.map deleted file mode 100644 index 70a37f2..0000000 --- a/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"resolve-uri.umd.js","sources":["../src/resolve-uri.ts"],"sourcesContent":["// Matches the scheme of a URL, eg \"http://\"\nconst schemeRegex = /^[\\w+.-]+:\\/\\//;\n\n/**\n * Matches the parts of a URL:\n * 1. Scheme, including \":\", guaranteed.\n * 2. User/password, including \"@\", optional.\n * 3. Host, guaranteed.\n * 4. Port, including \":\", optional.\n * 5. Path, including \"/\", optional.\n * 6. Query, including \"?\", optional.\n * 7. Hash, including \"#\", optional.\n */\nconst urlRegex = /^([\\w+.-]+:)\\/\\/([^@/#?]*@)?([^:/#?]*)(:\\d+)?(\\/[^#?]*)?(\\?[^#]*)?(#.*)?/;\n\n/**\n * File URLs are weird. They dont' need the regular `//` in the scheme, they may or may not start\n * with a leading `/`, they can have a domain (but only if they don't start with a Windows drive).\n *\n * 1. Host, optional.\n * 2. Path, which may include \"/\", guaranteed.\n * 3. Query, including \"?\", optional.\n * 4. Hash, including \"#\", optional.\n */\nconst fileRegex = /^file:(?:\\/\\/((?![a-z]:)[^/#?]*)?)?(\\/?[^#?]*)(\\?[^#]*)?(#.*)?/i;\n\ntype Url = {\n scheme: string;\n user: string;\n host: string;\n port: string;\n path: string;\n query: string;\n hash: string;\n type: UrlType;\n};\n\nconst enum UrlType {\n Empty = 1,\n Hash = 2,\n Query = 3,\n RelativePath = 4,\n AbsolutePath = 5,\n SchemeRelative = 6,\n Absolute = 7,\n}\n\nfunction isAbsoluteUrl(input: string): boolean {\n return schemeRegex.test(input);\n}\n\nfunction isSchemeRelativeUrl(input: string): boolean {\n return input.startsWith('//');\n}\n\nfunction isAbsolutePath(input: string): boolean {\n return input.startsWith('/');\n}\n\nfunction isFileUrl(input: string): boolean {\n return input.startsWith('file:');\n}\n\nfunction isRelative(input: string): boolean {\n return /^[.?#]/.test(input);\n}\n\nfunction parseAbsoluteUrl(input: string): Url {\n const match = urlRegex.exec(input)!;\n return makeUrl(\n match[1],\n match[2] || '',\n match[3],\n match[4] || '',\n match[5] || '/',\n match[6] || '',\n match[7] || '',\n );\n}\n\nfunction parseFileUrl(input: string): Url {\n const match = fileRegex.exec(input)!;\n const path = match[2];\n return makeUrl(\n 'file:',\n '',\n match[1] || '',\n '',\n isAbsolutePath(path) ? path : '/' + path,\n match[3] || '',\n match[4] || '',\n );\n}\n\nfunction makeUrl(\n scheme: string,\n user: string,\n host: string,\n port: string,\n path: string,\n query: string,\n hash: string,\n): Url {\n return {\n scheme,\n user,\n host,\n port,\n path,\n query,\n hash,\n type: UrlType.Absolute,\n };\n}\n\nfunction parseUrl(input: string): Url {\n if (isSchemeRelativeUrl(input)) {\n const url = parseAbsoluteUrl('http:' + input);\n url.scheme = '';\n url.type = UrlType.SchemeRelative;\n return url;\n }\n\n if (isAbsolutePath(input)) {\n const url = parseAbsoluteUrl('http://foo.com' + input);\n url.scheme = '';\n url.host = '';\n url.type = UrlType.AbsolutePath;\n return url;\n }\n\n if (isFileUrl(input)) return parseFileUrl(input);\n\n if (isAbsoluteUrl(input)) return parseAbsoluteUrl(input);\n\n const url = parseAbsoluteUrl('http://foo.com/' + input);\n url.scheme = '';\n url.host = '';\n url.type = input\n ? input.startsWith('?')\n ? UrlType.Query\n : input.startsWith('#')\n ? UrlType.Hash\n : UrlType.RelativePath\n : UrlType.Empty;\n return url;\n}\n\nfunction stripPathFilename(path: string): string {\n // If a path ends with a parent directory \"..\", then it's a relative path with excess parent\n // paths. It's not a file, so we can't strip it.\n if (path.endsWith('/..')) return path;\n const index = path.lastIndexOf('/');\n return path.slice(0, index + 1);\n}\n\nfunction mergePaths(url: Url, base: Url) {\n normalizePath(base, base.type);\n\n // If the path is just a \"/\", then it was an empty path to begin with (remember, we're a relative\n // path).\n if (url.path === '/') {\n url.path = base.path;\n } else {\n // Resolution happens relative to the base path's directory, not the file.\n url.path = stripPathFilename(base.path) + url.path;\n }\n}\n\n/**\n * The path can have empty directories \"//\", unneeded parents \"foo/..\", or current directory\n * \"foo/.\". We need to normalize to a standard representation.\n */\nfunction normalizePath(url: Url, type: UrlType) {\n const rel = type <= UrlType.RelativePath;\n const pieces = url.path.split('/');\n\n // We need to preserve the first piece always, so that we output a leading slash. The item at\n // pieces[0] is an empty string.\n let pointer = 1;\n\n // Positive is the number of real directories we've output, used for popping a parent directory.\n // Eg, \"foo/bar/..\" will have a positive 2, and we can decrement to be left with just \"foo\".\n let positive = 0;\n\n // We need to keep a trailing slash if we encounter an empty directory (eg, splitting \"foo/\" will\n // generate `[\"foo\", \"\"]` pieces). And, if we pop a parent directory. But once we encounter a\n // real directory, we won't need to append, unless the other conditions happen again.\n let addTrailingSlash = false;\n\n for (let i = 1; i < pieces.length; i++) {\n const piece = pieces[i];\n\n // An empty directory, could be a trailing slash, or just a double \"//\" in the path.\n if (!piece) {\n addTrailingSlash = true;\n continue;\n }\n\n // If we encounter a real directory, then we don't need to append anymore.\n addTrailingSlash = false;\n\n // A current directory, which we can always drop.\n if (piece === '.') continue;\n\n // A parent directory, we need to see if there are any real directories we can pop. Else, we\n // have an excess of parents, and we'll need to keep the \"..\".\n if (piece === '..') {\n if (positive) {\n addTrailingSlash = true;\n positive--;\n pointer--;\n } else if (rel) {\n // If we're in a relativePath, then we need to keep the excess parents. Else, in an absolute\n // URL, protocol relative URL, or an absolute path, we don't need to keep excess.\n pieces[pointer++] = piece;\n }\n continue;\n }\n\n // We've encountered a real directory. Move it to the next insertion pointer, which accounts for\n // any popped or dropped directories.\n pieces[pointer++] = piece;\n positive++;\n }\n\n let path = '';\n for (let i = 1; i < pointer; i++) {\n path += '/' + pieces[i];\n }\n if (!path || (addTrailingSlash && !path.endsWith('/..'))) {\n path += '/';\n }\n url.path = path;\n}\n\n/**\n * Attempts to resolve `input` URL/path relative to `base`.\n */\nexport default function resolve(input: string, base: string | undefined): string {\n if (!input && !base) return '';\n\n const url = parseUrl(input);\n let inputType = url.type;\n\n if (base && inputType !== UrlType.Absolute) {\n const baseUrl = parseUrl(base);\n const baseType = baseUrl.type;\n\n switch (inputType) {\n case UrlType.Empty:\n url.hash = baseUrl.hash;\n // fall through\n\n case UrlType.Hash:\n url.query = baseUrl.query;\n // fall through\n\n case UrlType.Query:\n case UrlType.RelativePath:\n mergePaths(url, baseUrl);\n // fall through\n\n case UrlType.AbsolutePath:\n // The host, user, and port are joined, you can't copy one without the others.\n url.user = baseUrl.user;\n url.host = baseUrl.host;\n url.port = baseUrl.port;\n // fall through\n\n case UrlType.SchemeRelative:\n // The input doesn't have a schema at least, so we need to copy at least that over.\n url.scheme = baseUrl.scheme;\n }\n if (baseType > inputType) inputType = baseType;\n }\n\n normalizePath(url, inputType);\n\n const queryHash = url.query + url.hash;\n switch (inputType) {\n // This is impossible, because of the empty checks at the start of the function.\n // case UrlType.Empty:\n\n case UrlType.Hash:\n case UrlType.Query:\n return queryHash;\n\n case UrlType.RelativePath: {\n // The first char is always a \"/\", and we need it to be relative.\n const path = url.path.slice(1);\n\n if (!path) return queryHash || '.';\n\n if (isRelative(base || input) && !isRelative(path)) {\n // If base started with a leading \".\", or there is no base and input started with a \".\",\n // then we need to ensure that the relative path starts with a \".\". We don't know if\n // relative starts with a \"..\", though, so check before prepending.\n return './' + path + queryHash;\n }\n\n return path + queryHash;\n }\n\n case UrlType.AbsolutePath:\n return url.path + queryHash;\n\n default:\n return url.scheme + '//' + url.user + url.host + url.port + url.path + queryHash;\n }\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@jridgewell/resolve-uri/dist/types/resolve-uri.d.ts b/node_modules/@jridgewell/resolve-uri/dist/types/resolve-uri.d.ts deleted file mode 100644 index b7f0b3b..0000000 --- a/node_modules/@jridgewell/resolve-uri/dist/types/resolve-uri.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Attempts to resolve `input` URL/path relative to `base`. - */ -export default function resolve(input: string, base: string | undefined): string; diff --git a/node_modules/@jridgewell/resolve-uri/package.json b/node_modules/@jridgewell/resolve-uri/package.json deleted file mode 100644 index 02a4c51..0000000 --- a/node_modules/@jridgewell/resolve-uri/package.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "name": "@jridgewell/resolve-uri", - "version": "3.1.2", - "description": "Resolve a URI relative to an optional base URI", - "keywords": [ - "resolve", - "uri", - "url", - "path" - ], - "author": "Justin Ridgewell ", - "license": "MIT", - "repository": "https://github.com/jridgewell/resolve-uri", - "main": "dist/resolve-uri.umd.js", - "module": "dist/resolve-uri.mjs", - "types": "dist/types/resolve-uri.d.ts", - "exports": { - ".": [ - { - "types": "./dist/types/resolve-uri.d.ts", - "browser": "./dist/resolve-uri.umd.js", - "require": "./dist/resolve-uri.umd.js", - "import": "./dist/resolve-uri.mjs" - }, - "./dist/resolve-uri.umd.js" - ], - "./package.json": "./package.json" - }, - "files": [ - "dist" - ], - "engines": { - "node": ">=6.0.0" - }, - "scripts": { - "prebuild": "rm -rf dist", - "build": "run-s -n build:*", - "build:rollup": "rollup -c rollup.config.js", - "build:ts": "tsc --project tsconfig.build.json", - "lint": "run-s -n lint:*", - "lint:prettier": "npm run test:lint:prettier -- --write", - "lint:ts": "npm run test:lint:ts -- --fix", - "pretest": "run-s build:rollup", - "test": "run-s -n test:lint test:only", - "test:debug": "mocha --inspect-brk", - "test:lint": "run-s -n test:lint:*", - "test:lint:prettier": "prettier --check '{src,test}/**/*.ts'", - "test:lint:ts": "eslint '{src,test}/**/*.ts'", - "test:only": "mocha", - "test:coverage": "c8 mocha", - "test:watch": "mocha --watch", - "prepublishOnly": "npm run preversion", - "preversion": "run-s test build" - }, - "devDependencies": { - "@jridgewell/resolve-uri-latest": "npm:@jridgewell/resolve-uri@*", - "@rollup/plugin-typescript": "8.3.0", - "@typescript-eslint/eslint-plugin": "5.10.0", - "@typescript-eslint/parser": "5.10.0", - "c8": "7.11.0", - "eslint": "8.7.0", - "eslint-config-prettier": "8.3.0", - "mocha": "9.2.0", - "npm-run-all": "4.1.5", - "prettier": "2.5.1", - "rollup": "2.66.0", - "typescript": "4.5.5" - } -} diff --git a/node_modules/@jridgewell/sourcemap-codec/LICENSE b/node_modules/@jridgewell/sourcemap-codec/LICENSE deleted file mode 100644 index 1f6ce94..0000000 --- a/node_modules/@jridgewell/sourcemap-codec/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright 2024 Justin Ridgewell - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/node_modules/@jridgewell/sourcemap-codec/README.md b/node_modules/@jridgewell/sourcemap-codec/README.md deleted file mode 100644 index b3e0708..0000000 --- a/node_modules/@jridgewell/sourcemap-codec/README.md +++ /dev/null @@ -1,264 +0,0 @@ -# @jridgewell/sourcemap-codec - -Encode/decode the `mappings` property of a [sourcemap](https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit). - - -## Why? - -Sourcemaps are difficult to generate and manipulate, because the `mappings` property – the part that actually links the generated code back to the original source – is encoded using an obscure method called [Variable-length quantity](https://en.wikipedia.org/wiki/Variable-length_quantity). On top of that, each segment in the mapping contains offsets rather than absolute indices, which means that you can't look at a segment in isolation – you have to understand the whole sourcemap. - -This package makes the process slightly easier. - - -## Installation - -```bash -npm install @jridgewell/sourcemap-codec -``` - - -## Usage - -```js -import { encode, decode } from '@jridgewell/sourcemap-codec'; - -var decoded = decode( ';EAEEA,EAAE,EAAC,CAAE;ECQY,UACC' ); - -assert.deepEqual( decoded, [ - // the first line (of the generated code) has no mappings, - // as shown by the starting semi-colon (which separates lines) - [], - - // the second line contains four (comma-separated) segments - [ - // segments are encoded as you'd expect: - // [ generatedCodeColumn, sourceIndex, sourceCodeLine, sourceCodeColumn, nameIndex ] - - // i.e. the first segment begins at column 2, and maps back to the second column - // of the second line (both zero-based) of the 0th source, and uses the 0th - // name in the `map.names` array - [ 2, 0, 2, 2, 0 ], - - // the remaining segments are 4-length rather than 5-length, - // because they don't map a name - [ 4, 0, 2, 4 ], - [ 6, 0, 2, 5 ], - [ 7, 0, 2, 7 ] - ], - - // the final line contains two segments - [ - [ 2, 1, 10, 19 ], - [ 12, 1, 11, 20 ] - ] -]); - -var encoded = encode( decoded ); -assert.equal( encoded, ';EAEEA,EAAE,EAAC,CAAE;ECQY,UACC' ); -``` - -## Benchmarks - -``` -node v20.10.0 - -amp.js.map - 45120 segments - -Decode Memory Usage: -local code 5815135 bytes -@jridgewell/sourcemap-codec 1.4.15 5868160 bytes -sourcemap-codec 5492584 bytes -source-map-0.6.1 13569984 bytes -source-map-0.8.0 6390584 bytes -chrome dev tools 8011136 bytes -Smallest memory usage is sourcemap-codec - -Decode speed: -decode: local code x 492 ops/sec ±1.22% (90 runs sampled) -decode: @jridgewell/sourcemap-codec 1.4.15 x 499 ops/sec ±1.16% (89 runs sampled) -decode: sourcemap-codec x 376 ops/sec ±1.66% (89 runs sampled) -decode: source-map-0.6.1 x 34.99 ops/sec ±0.94% (48 runs sampled) -decode: source-map-0.8.0 x 351 ops/sec ±0.07% (95 runs sampled) -chrome dev tools x 165 ops/sec ±0.91% (86 runs sampled) -Fastest is decode: @jridgewell/sourcemap-codec 1.4.15 - -Encode Memory Usage: -local code 444248 bytes -@jridgewell/sourcemap-codec 1.4.15 623024 bytes -sourcemap-codec 8696280 bytes -source-map-0.6.1 8745176 bytes -source-map-0.8.0 8736624 bytes -Smallest memory usage is local code - -Encode speed: -encode: local code x 796 ops/sec ±0.11% (97 runs sampled) -encode: @jridgewell/sourcemap-codec 1.4.15 x 795 ops/sec ±0.25% (98 runs sampled) -encode: sourcemap-codec x 231 ops/sec ±0.83% (86 runs sampled) -encode: source-map-0.6.1 x 166 ops/sec ±0.57% (86 runs sampled) -encode: source-map-0.8.0 x 203 ops/sec ±0.45% (88 runs sampled) -Fastest is encode: local code,encode: @jridgewell/sourcemap-codec 1.4.15 - - -*** - - -babel.min.js.map - 347793 segments - -Decode Memory Usage: -local code 35424960 bytes -@jridgewell/sourcemap-codec 1.4.15 35424696 bytes -sourcemap-codec 36033464 bytes -source-map-0.6.1 62253704 bytes -source-map-0.8.0 43843920 bytes -chrome dev tools 45111400 bytes -Smallest memory usage is @jridgewell/sourcemap-codec 1.4.15 - -Decode speed: -decode: local code x 38.18 ops/sec ±5.44% (52 runs sampled) -decode: @jridgewell/sourcemap-codec 1.4.15 x 38.36 ops/sec ±5.02% (52 runs sampled) -decode: sourcemap-codec x 34.05 ops/sec ±4.45% (47 runs sampled) -decode: source-map-0.6.1 x 4.31 ops/sec ±2.76% (15 runs sampled) -decode: source-map-0.8.0 x 55.60 ops/sec ±0.13% (73 runs sampled) -chrome dev tools x 16.94 ops/sec ±3.78% (46 runs sampled) -Fastest is decode: source-map-0.8.0 - -Encode Memory Usage: -local code 2606016 bytes -@jridgewell/sourcemap-codec 1.4.15 2626440 bytes -sourcemap-codec 21152576 bytes -source-map-0.6.1 25023928 bytes -source-map-0.8.0 25256448 bytes -Smallest memory usage is local code - -Encode speed: -encode: local code x 127 ops/sec ±0.18% (83 runs sampled) -encode: @jridgewell/sourcemap-codec 1.4.15 x 128 ops/sec ±0.26% (83 runs sampled) -encode: sourcemap-codec x 29.31 ops/sec ±2.55% (53 runs sampled) -encode: source-map-0.6.1 x 18.85 ops/sec ±3.19% (36 runs sampled) -encode: source-map-0.8.0 x 19.34 ops/sec ±1.97% (36 runs sampled) -Fastest is encode: @jridgewell/sourcemap-codec 1.4.15 - - -*** - - -preact.js.map - 1992 segments - -Decode Memory Usage: -local code 261696 bytes -@jridgewell/sourcemap-codec 1.4.15 244296 bytes -sourcemap-codec 302816 bytes -source-map-0.6.1 939176 bytes -source-map-0.8.0 336 bytes -chrome dev tools 587368 bytes -Smallest memory usage is source-map-0.8.0 - -Decode speed: -decode: local code x 17,782 ops/sec ±0.32% (97 runs sampled) -decode: @jridgewell/sourcemap-codec 1.4.15 x 17,863 ops/sec ±0.40% (100 runs sampled) -decode: sourcemap-codec x 12,453 ops/sec ±0.27% (101 runs sampled) -decode: source-map-0.6.1 x 1,288 ops/sec ±1.05% (96 runs sampled) -decode: source-map-0.8.0 x 9,289 ops/sec ±0.27% (101 runs sampled) -chrome dev tools x 4,769 ops/sec ±0.18% (100 runs sampled) -Fastest is decode: @jridgewell/sourcemap-codec 1.4.15 - -Encode Memory Usage: -local code 262944 bytes -@jridgewell/sourcemap-codec 1.4.15 25544 bytes -sourcemap-codec 323048 bytes -source-map-0.6.1 507808 bytes -source-map-0.8.0 507480 bytes -Smallest memory usage is @jridgewell/sourcemap-codec 1.4.15 - -Encode speed: -encode: local code x 24,207 ops/sec ±0.79% (95 runs sampled) -encode: @jridgewell/sourcemap-codec 1.4.15 x 24,288 ops/sec ±0.48% (96 runs sampled) -encode: sourcemap-codec x 6,761 ops/sec ±0.21% (100 runs sampled) -encode: source-map-0.6.1 x 5,374 ops/sec ±0.17% (99 runs sampled) -encode: source-map-0.8.0 x 5,633 ops/sec ±0.32% (99 runs sampled) -Fastest is encode: @jridgewell/sourcemap-codec 1.4.15,encode: local code - - -*** - - -react.js.map - 5726 segments - -Decode Memory Usage: -local code 678816 bytes -@jridgewell/sourcemap-codec 1.4.15 678816 bytes -sourcemap-codec 816400 bytes -source-map-0.6.1 2288864 bytes -source-map-0.8.0 721360 bytes -chrome dev tools 1012512 bytes -Smallest memory usage is local code - -Decode speed: -decode: local code x 6,178 ops/sec ±0.19% (98 runs sampled) -decode: @jridgewell/sourcemap-codec 1.4.15 x 6,261 ops/sec ±0.22% (100 runs sampled) -decode: sourcemap-codec x 4,472 ops/sec ±0.90% (99 runs sampled) -decode: source-map-0.6.1 x 449 ops/sec ±0.31% (95 runs sampled) -decode: source-map-0.8.0 x 3,219 ops/sec ±0.13% (100 runs sampled) -chrome dev tools x 1,743 ops/sec ±0.20% (99 runs sampled) -Fastest is decode: @jridgewell/sourcemap-codec 1.4.15 - -Encode Memory Usage: -local code 140960 bytes -@jridgewell/sourcemap-codec 1.4.15 159808 bytes -sourcemap-codec 969304 bytes -source-map-0.6.1 930520 bytes -source-map-0.8.0 930248 bytes -Smallest memory usage is local code - -Encode speed: -encode: local code x 8,013 ops/sec ±0.19% (100 runs sampled) -encode: @jridgewell/sourcemap-codec 1.4.15 x 7,989 ops/sec ±0.20% (101 runs sampled) -encode: sourcemap-codec x 2,472 ops/sec ±0.21% (99 runs sampled) -encode: source-map-0.6.1 x 2,200 ops/sec ±0.17% (99 runs sampled) -encode: source-map-0.8.0 x 2,220 ops/sec ±0.37% (99 runs sampled) -Fastest is encode: local code - - -*** - - -vscode.map - 2141001 segments - -Decode Memory Usage: -local code 198955264 bytes -@jridgewell/sourcemap-codec 1.4.15 199175352 bytes -sourcemap-codec 199102688 bytes -source-map-0.6.1 386323432 bytes -source-map-0.8.0 244116432 bytes -chrome dev tools 293734280 bytes -Smallest memory usage is local code - -Decode speed: -decode: local code x 3.90 ops/sec ±22.21% (15 runs sampled) -decode: @jridgewell/sourcemap-codec 1.4.15 x 3.95 ops/sec ±23.53% (15 runs sampled) -decode: sourcemap-codec x 3.82 ops/sec ±17.94% (14 runs sampled) -decode: source-map-0.6.1 x 0.61 ops/sec ±7.81% (6 runs sampled) -decode: source-map-0.8.0 x 9.54 ops/sec ±0.28% (28 runs sampled) -chrome dev tools x 2.18 ops/sec ±10.58% (10 runs sampled) -Fastest is decode: source-map-0.8.0 - -Encode Memory Usage: -local code 13509880 bytes -@jridgewell/sourcemap-codec 1.4.15 13537648 bytes -sourcemap-codec 32540104 bytes -source-map-0.6.1 127531040 bytes -source-map-0.8.0 127535312 bytes -Smallest memory usage is local code - -Encode speed: -encode: local code x 20.10 ops/sec ±0.19% (38 runs sampled) -encode: @jridgewell/sourcemap-codec 1.4.15 x 20.26 ops/sec ±0.32% (38 runs sampled) -encode: sourcemap-codec x 5.44 ops/sec ±1.64% (18 runs sampled) -encode: source-map-0.6.1 x 2.30 ops/sec ±4.79% (10 runs sampled) -encode: source-map-0.8.0 x 2.46 ops/sec ±6.53% (10 runs sampled) -Fastest is encode: @jridgewell/sourcemap-codec 1.4.15 -``` - -# License - -MIT diff --git a/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs b/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs deleted file mode 100644 index 532bab3..0000000 --- a/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs +++ /dev/null @@ -1,423 +0,0 @@ -// src/vlq.ts -var comma = ",".charCodeAt(0); -var semicolon = ";".charCodeAt(0); -var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; -var intToChar = new Uint8Array(64); -var charToInt = new Uint8Array(128); -for (let i = 0; i < chars.length; i++) { - const c = chars.charCodeAt(i); - intToChar[i] = c; - charToInt[c] = i; -} -function decodeInteger(reader, relative) { - let value = 0; - let shift = 0; - let integer = 0; - do { - const c = reader.next(); - integer = charToInt[c]; - value |= (integer & 31) << shift; - shift += 5; - } while (integer & 32); - const shouldNegate = value & 1; - value >>>= 1; - if (shouldNegate) { - value = -2147483648 | -value; - } - return relative + value; -} -function encodeInteger(builder, num, relative) { - let delta = num - relative; - delta = delta < 0 ? -delta << 1 | 1 : delta << 1; - do { - let clamped = delta & 31; - delta >>>= 5; - if (delta > 0) clamped |= 32; - builder.write(intToChar[clamped]); - } while (delta > 0); - return num; -} -function hasMoreVlq(reader, max) { - if (reader.pos >= max) return false; - return reader.peek() !== comma; -} - -// src/strings.ts -var bufLength = 1024 * 16; -var td = typeof TextDecoder !== "undefined" ? /* @__PURE__ */ new TextDecoder() : typeof Buffer !== "undefined" ? { - decode(buf) { - const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength); - return out.toString(); - } -} : { - decode(buf) { - let out = ""; - for (let i = 0; i < buf.length; i++) { - out += String.fromCharCode(buf[i]); - } - return out; - } -}; -var StringWriter = class { - constructor() { - this.pos = 0; - this.out = ""; - this.buffer = new Uint8Array(bufLength); - } - write(v) { - const { buffer } = this; - buffer[this.pos++] = v; - if (this.pos === bufLength) { - this.out += td.decode(buffer); - this.pos = 0; - } - } - flush() { - const { buffer, out, pos } = this; - return pos > 0 ? out + td.decode(buffer.subarray(0, pos)) : out; - } -}; -var StringReader = class { - constructor(buffer) { - this.pos = 0; - this.buffer = buffer; - } - next() { - return this.buffer.charCodeAt(this.pos++); - } - peek() { - return this.buffer.charCodeAt(this.pos); - } - indexOf(char) { - const { buffer, pos } = this; - const idx = buffer.indexOf(char, pos); - return idx === -1 ? buffer.length : idx; - } -}; - -// src/scopes.ts -var EMPTY = []; -function decodeOriginalScopes(input) { - const { length } = input; - const reader = new StringReader(input); - const scopes = []; - const stack = []; - let line = 0; - for (; reader.pos < length; reader.pos++) { - line = decodeInteger(reader, line); - const column = decodeInteger(reader, 0); - if (!hasMoreVlq(reader, length)) { - const last = stack.pop(); - last[2] = line; - last[3] = column; - continue; - } - const kind = decodeInteger(reader, 0); - const fields = decodeInteger(reader, 0); - const hasName = fields & 1; - const scope = hasName ? [line, column, 0, 0, kind, decodeInteger(reader, 0)] : [line, column, 0, 0, kind]; - let vars = EMPTY; - if (hasMoreVlq(reader, length)) { - vars = []; - do { - const varsIndex = decodeInteger(reader, 0); - vars.push(varsIndex); - } while (hasMoreVlq(reader, length)); - } - scope.vars = vars; - scopes.push(scope); - stack.push(scope); - } - return scopes; -} -function encodeOriginalScopes(scopes) { - const writer = new StringWriter(); - for (let i = 0; i < scopes.length; ) { - i = _encodeOriginalScopes(scopes, i, writer, [0]); - } - return writer.flush(); -} -function _encodeOriginalScopes(scopes, index, writer, state) { - const scope = scopes[index]; - const { 0: startLine, 1: startColumn, 2: endLine, 3: endColumn, 4: kind, vars } = scope; - if (index > 0) writer.write(comma); - state[0] = encodeInteger(writer, startLine, state[0]); - encodeInteger(writer, startColumn, 0); - encodeInteger(writer, kind, 0); - const fields = scope.length === 6 ? 1 : 0; - encodeInteger(writer, fields, 0); - if (scope.length === 6) encodeInteger(writer, scope[5], 0); - for (const v of vars) { - encodeInteger(writer, v, 0); - } - for (index++; index < scopes.length; ) { - const next = scopes[index]; - const { 0: l, 1: c } = next; - if (l > endLine || l === endLine && c >= endColumn) { - break; - } - index = _encodeOriginalScopes(scopes, index, writer, state); - } - writer.write(comma); - state[0] = encodeInteger(writer, endLine, state[0]); - encodeInteger(writer, endColumn, 0); - return index; -} -function decodeGeneratedRanges(input) { - const { length } = input; - const reader = new StringReader(input); - const ranges = []; - const stack = []; - let genLine = 0; - let definitionSourcesIndex = 0; - let definitionScopeIndex = 0; - let callsiteSourcesIndex = 0; - let callsiteLine = 0; - let callsiteColumn = 0; - let bindingLine = 0; - let bindingColumn = 0; - do { - const semi = reader.indexOf(";"); - let genColumn = 0; - for (; reader.pos < semi; reader.pos++) { - genColumn = decodeInteger(reader, genColumn); - if (!hasMoreVlq(reader, semi)) { - const last = stack.pop(); - last[2] = genLine; - last[3] = genColumn; - continue; - } - const fields = decodeInteger(reader, 0); - const hasDefinition = fields & 1; - const hasCallsite = fields & 2; - const hasScope = fields & 4; - let callsite = null; - let bindings = EMPTY; - let range; - if (hasDefinition) { - const defSourcesIndex = decodeInteger(reader, definitionSourcesIndex); - definitionScopeIndex = decodeInteger( - reader, - definitionSourcesIndex === defSourcesIndex ? definitionScopeIndex : 0 - ); - definitionSourcesIndex = defSourcesIndex; - range = [genLine, genColumn, 0, 0, defSourcesIndex, definitionScopeIndex]; - } else { - range = [genLine, genColumn, 0, 0]; - } - range.isScope = !!hasScope; - if (hasCallsite) { - const prevCsi = callsiteSourcesIndex; - const prevLine = callsiteLine; - callsiteSourcesIndex = decodeInteger(reader, callsiteSourcesIndex); - const sameSource = prevCsi === callsiteSourcesIndex; - callsiteLine = decodeInteger(reader, sameSource ? callsiteLine : 0); - callsiteColumn = decodeInteger( - reader, - sameSource && prevLine === callsiteLine ? callsiteColumn : 0 - ); - callsite = [callsiteSourcesIndex, callsiteLine, callsiteColumn]; - } - range.callsite = callsite; - if (hasMoreVlq(reader, semi)) { - bindings = []; - do { - bindingLine = genLine; - bindingColumn = genColumn; - const expressionsCount = decodeInteger(reader, 0); - let expressionRanges; - if (expressionsCount < -1) { - expressionRanges = [[decodeInteger(reader, 0)]]; - for (let i = -1; i > expressionsCount; i--) { - const prevBl = bindingLine; - bindingLine = decodeInteger(reader, bindingLine); - bindingColumn = decodeInteger(reader, bindingLine === prevBl ? bindingColumn : 0); - const expression = decodeInteger(reader, 0); - expressionRanges.push([expression, bindingLine, bindingColumn]); - } - } else { - expressionRanges = [[expressionsCount]]; - } - bindings.push(expressionRanges); - } while (hasMoreVlq(reader, semi)); - } - range.bindings = bindings; - ranges.push(range); - stack.push(range); - } - genLine++; - reader.pos = semi + 1; - } while (reader.pos < length); - return ranges; -} -function encodeGeneratedRanges(ranges) { - if (ranges.length === 0) return ""; - const writer = new StringWriter(); - for (let i = 0; i < ranges.length; ) { - i = _encodeGeneratedRanges(ranges, i, writer, [0, 0, 0, 0, 0, 0, 0]); - } - return writer.flush(); -} -function _encodeGeneratedRanges(ranges, index, writer, state) { - const range = ranges[index]; - const { - 0: startLine, - 1: startColumn, - 2: endLine, - 3: endColumn, - isScope, - callsite, - bindings - } = range; - if (state[0] < startLine) { - catchupLine(writer, state[0], startLine); - state[0] = startLine; - state[1] = 0; - } else if (index > 0) { - writer.write(comma); - } - state[1] = encodeInteger(writer, range[1], state[1]); - const fields = (range.length === 6 ? 1 : 0) | (callsite ? 2 : 0) | (isScope ? 4 : 0); - encodeInteger(writer, fields, 0); - if (range.length === 6) { - const { 4: sourcesIndex, 5: scopesIndex } = range; - if (sourcesIndex !== state[2]) { - state[3] = 0; - } - state[2] = encodeInteger(writer, sourcesIndex, state[2]); - state[3] = encodeInteger(writer, scopesIndex, state[3]); - } - if (callsite) { - const { 0: sourcesIndex, 1: callLine, 2: callColumn } = range.callsite; - if (sourcesIndex !== state[4]) { - state[5] = 0; - state[6] = 0; - } else if (callLine !== state[5]) { - state[6] = 0; - } - state[4] = encodeInteger(writer, sourcesIndex, state[4]); - state[5] = encodeInteger(writer, callLine, state[5]); - state[6] = encodeInteger(writer, callColumn, state[6]); - } - if (bindings) { - for (const binding of bindings) { - if (binding.length > 1) encodeInteger(writer, -binding.length, 0); - const expression = binding[0][0]; - encodeInteger(writer, expression, 0); - let bindingStartLine = startLine; - let bindingStartColumn = startColumn; - for (let i = 1; i < binding.length; i++) { - const expRange = binding[i]; - bindingStartLine = encodeInteger(writer, expRange[1], bindingStartLine); - bindingStartColumn = encodeInteger(writer, expRange[2], bindingStartColumn); - encodeInteger(writer, expRange[0], 0); - } - } - } - for (index++; index < ranges.length; ) { - const next = ranges[index]; - const { 0: l, 1: c } = next; - if (l > endLine || l === endLine && c >= endColumn) { - break; - } - index = _encodeGeneratedRanges(ranges, index, writer, state); - } - if (state[0] < endLine) { - catchupLine(writer, state[0], endLine); - state[0] = endLine; - state[1] = 0; - } else { - writer.write(comma); - } - state[1] = encodeInteger(writer, endColumn, state[1]); - return index; -} -function catchupLine(writer, lastLine, line) { - do { - writer.write(semicolon); - } while (++lastLine < line); -} - -// src/sourcemap-codec.ts -function decode(mappings) { - const { length } = mappings; - const reader = new StringReader(mappings); - const decoded = []; - let genColumn = 0; - let sourcesIndex = 0; - let sourceLine = 0; - let sourceColumn = 0; - let namesIndex = 0; - do { - const semi = reader.indexOf(";"); - const line = []; - let sorted = true; - let lastCol = 0; - genColumn = 0; - while (reader.pos < semi) { - let seg; - genColumn = decodeInteger(reader, genColumn); - if (genColumn < lastCol) sorted = false; - lastCol = genColumn; - if (hasMoreVlq(reader, semi)) { - sourcesIndex = decodeInteger(reader, sourcesIndex); - sourceLine = decodeInteger(reader, sourceLine); - sourceColumn = decodeInteger(reader, sourceColumn); - if (hasMoreVlq(reader, semi)) { - namesIndex = decodeInteger(reader, namesIndex); - seg = [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]; - } else { - seg = [genColumn, sourcesIndex, sourceLine, sourceColumn]; - } - } else { - seg = [genColumn]; - } - line.push(seg); - reader.pos++; - } - if (!sorted) sort(line); - decoded.push(line); - reader.pos = semi + 1; - } while (reader.pos <= length); - return decoded; -} -function sort(line) { - line.sort(sortComparator); -} -function sortComparator(a, b) { - return a[0] - b[0]; -} -function encode(decoded) { - const writer = new StringWriter(); - let sourcesIndex = 0; - let sourceLine = 0; - let sourceColumn = 0; - let namesIndex = 0; - for (let i = 0; i < decoded.length; i++) { - const line = decoded[i]; - if (i > 0) writer.write(semicolon); - if (line.length === 0) continue; - let genColumn = 0; - for (let j = 0; j < line.length; j++) { - const segment = line[j]; - if (j > 0) writer.write(comma); - genColumn = encodeInteger(writer, segment[0], genColumn); - if (segment.length === 1) continue; - sourcesIndex = encodeInteger(writer, segment[1], sourcesIndex); - sourceLine = encodeInteger(writer, segment[2], sourceLine); - sourceColumn = encodeInteger(writer, segment[3], sourceColumn); - if (segment.length === 4) continue; - namesIndex = encodeInteger(writer, segment[4], namesIndex); - } - } - return writer.flush(); -} -export { - decode, - decodeGeneratedRanges, - decodeOriginalScopes, - encode, - encodeGeneratedRanges, - encodeOriginalScopes -}; -//# sourceMappingURL=sourcemap-codec.mjs.map diff --git a/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs.map b/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs.map deleted file mode 100644 index c276844..0000000 --- a/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs.map +++ /dev/null @@ -1,6 +0,0 @@ -{ - "version": 3, - "sources": ["../src/vlq.ts", "../src/strings.ts", "../src/scopes.ts", "../src/sourcemap-codec.ts"], - "mappings": "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", - "names": [] -} diff --git a/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js b/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js deleted file mode 100644 index 2d8e459..0000000 --- a/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js +++ /dev/null @@ -1,464 +0,0 @@ -(function (global, factory) { - if (typeof exports === 'object' && typeof module !== 'undefined') { - factory(module); - module.exports = def(module); - } else if (typeof define === 'function' && define.amd) { - define(['module'], function(mod) { - factory.apply(this, arguments); - mod.exports = def(mod); - }); - } else { - const mod = { exports: {} }; - factory(mod); - global = typeof globalThis !== 'undefined' ? globalThis : global || self; - global.sourcemapCodec = def(mod); - } - function def(m) { return 'default' in m.exports ? m.exports.default : m.exports; } -})(this, (function (module) { -"use strict"; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); - -// src/sourcemap-codec.ts -var sourcemap_codec_exports = {}; -__export(sourcemap_codec_exports, { - decode: () => decode, - decodeGeneratedRanges: () => decodeGeneratedRanges, - decodeOriginalScopes: () => decodeOriginalScopes, - encode: () => encode, - encodeGeneratedRanges: () => encodeGeneratedRanges, - encodeOriginalScopes: () => encodeOriginalScopes -}); -module.exports = __toCommonJS(sourcemap_codec_exports); - -// src/vlq.ts -var comma = ",".charCodeAt(0); -var semicolon = ";".charCodeAt(0); -var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; -var intToChar = new Uint8Array(64); -var charToInt = new Uint8Array(128); -for (let i = 0; i < chars.length; i++) { - const c = chars.charCodeAt(i); - intToChar[i] = c; - charToInt[c] = i; -} -function decodeInteger(reader, relative) { - let value = 0; - let shift = 0; - let integer = 0; - do { - const c = reader.next(); - integer = charToInt[c]; - value |= (integer & 31) << shift; - shift += 5; - } while (integer & 32); - const shouldNegate = value & 1; - value >>>= 1; - if (shouldNegate) { - value = -2147483648 | -value; - } - return relative + value; -} -function encodeInteger(builder, num, relative) { - let delta = num - relative; - delta = delta < 0 ? -delta << 1 | 1 : delta << 1; - do { - let clamped = delta & 31; - delta >>>= 5; - if (delta > 0) clamped |= 32; - builder.write(intToChar[clamped]); - } while (delta > 0); - return num; -} -function hasMoreVlq(reader, max) { - if (reader.pos >= max) return false; - return reader.peek() !== comma; -} - -// src/strings.ts -var bufLength = 1024 * 16; -var td = typeof TextDecoder !== "undefined" ? /* @__PURE__ */ new TextDecoder() : typeof Buffer !== "undefined" ? { - decode(buf) { - const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength); - return out.toString(); - } -} : { - decode(buf) { - let out = ""; - for (let i = 0; i < buf.length; i++) { - out += String.fromCharCode(buf[i]); - } - return out; - } -}; -var StringWriter = class { - constructor() { - this.pos = 0; - this.out = ""; - this.buffer = new Uint8Array(bufLength); - } - write(v) { - const { buffer } = this; - buffer[this.pos++] = v; - if (this.pos === bufLength) { - this.out += td.decode(buffer); - this.pos = 0; - } - } - flush() { - const { buffer, out, pos } = this; - return pos > 0 ? out + td.decode(buffer.subarray(0, pos)) : out; - } -}; -var StringReader = class { - constructor(buffer) { - this.pos = 0; - this.buffer = buffer; - } - next() { - return this.buffer.charCodeAt(this.pos++); - } - peek() { - return this.buffer.charCodeAt(this.pos); - } - indexOf(char) { - const { buffer, pos } = this; - const idx = buffer.indexOf(char, pos); - return idx === -1 ? buffer.length : idx; - } -}; - -// src/scopes.ts -var EMPTY = []; -function decodeOriginalScopes(input) { - const { length } = input; - const reader = new StringReader(input); - const scopes = []; - const stack = []; - let line = 0; - for (; reader.pos < length; reader.pos++) { - line = decodeInteger(reader, line); - const column = decodeInteger(reader, 0); - if (!hasMoreVlq(reader, length)) { - const last = stack.pop(); - last[2] = line; - last[3] = column; - continue; - } - const kind = decodeInteger(reader, 0); - const fields = decodeInteger(reader, 0); - const hasName = fields & 1; - const scope = hasName ? [line, column, 0, 0, kind, decodeInteger(reader, 0)] : [line, column, 0, 0, kind]; - let vars = EMPTY; - if (hasMoreVlq(reader, length)) { - vars = []; - do { - const varsIndex = decodeInteger(reader, 0); - vars.push(varsIndex); - } while (hasMoreVlq(reader, length)); - } - scope.vars = vars; - scopes.push(scope); - stack.push(scope); - } - return scopes; -} -function encodeOriginalScopes(scopes) { - const writer = new StringWriter(); - for (let i = 0; i < scopes.length; ) { - i = _encodeOriginalScopes(scopes, i, writer, [0]); - } - return writer.flush(); -} -function _encodeOriginalScopes(scopes, index, writer, state) { - const scope = scopes[index]; - const { 0: startLine, 1: startColumn, 2: endLine, 3: endColumn, 4: kind, vars } = scope; - if (index > 0) writer.write(comma); - state[0] = encodeInteger(writer, startLine, state[0]); - encodeInteger(writer, startColumn, 0); - encodeInteger(writer, kind, 0); - const fields = scope.length === 6 ? 1 : 0; - encodeInteger(writer, fields, 0); - if (scope.length === 6) encodeInteger(writer, scope[5], 0); - for (const v of vars) { - encodeInteger(writer, v, 0); - } - for (index++; index < scopes.length; ) { - const next = scopes[index]; - const { 0: l, 1: c } = next; - if (l > endLine || l === endLine && c >= endColumn) { - break; - } - index = _encodeOriginalScopes(scopes, index, writer, state); - } - writer.write(comma); - state[0] = encodeInteger(writer, endLine, state[0]); - encodeInteger(writer, endColumn, 0); - return index; -} -function decodeGeneratedRanges(input) { - const { length } = input; - const reader = new StringReader(input); - const ranges = []; - const stack = []; - let genLine = 0; - let definitionSourcesIndex = 0; - let definitionScopeIndex = 0; - let callsiteSourcesIndex = 0; - let callsiteLine = 0; - let callsiteColumn = 0; - let bindingLine = 0; - let bindingColumn = 0; - do { - const semi = reader.indexOf(";"); - let genColumn = 0; - for (; reader.pos < semi; reader.pos++) { - genColumn = decodeInteger(reader, genColumn); - if (!hasMoreVlq(reader, semi)) { - const last = stack.pop(); - last[2] = genLine; - last[3] = genColumn; - continue; - } - const fields = decodeInteger(reader, 0); - const hasDefinition = fields & 1; - const hasCallsite = fields & 2; - const hasScope = fields & 4; - let callsite = null; - let bindings = EMPTY; - let range; - if (hasDefinition) { - const defSourcesIndex = decodeInteger(reader, definitionSourcesIndex); - definitionScopeIndex = decodeInteger( - reader, - definitionSourcesIndex === defSourcesIndex ? definitionScopeIndex : 0 - ); - definitionSourcesIndex = defSourcesIndex; - range = [genLine, genColumn, 0, 0, defSourcesIndex, definitionScopeIndex]; - } else { - range = [genLine, genColumn, 0, 0]; - } - range.isScope = !!hasScope; - if (hasCallsite) { - const prevCsi = callsiteSourcesIndex; - const prevLine = callsiteLine; - callsiteSourcesIndex = decodeInteger(reader, callsiteSourcesIndex); - const sameSource = prevCsi === callsiteSourcesIndex; - callsiteLine = decodeInteger(reader, sameSource ? callsiteLine : 0); - callsiteColumn = decodeInteger( - reader, - sameSource && prevLine === callsiteLine ? callsiteColumn : 0 - ); - callsite = [callsiteSourcesIndex, callsiteLine, callsiteColumn]; - } - range.callsite = callsite; - if (hasMoreVlq(reader, semi)) { - bindings = []; - do { - bindingLine = genLine; - bindingColumn = genColumn; - const expressionsCount = decodeInteger(reader, 0); - let expressionRanges; - if (expressionsCount < -1) { - expressionRanges = [[decodeInteger(reader, 0)]]; - for (let i = -1; i > expressionsCount; i--) { - const prevBl = bindingLine; - bindingLine = decodeInteger(reader, bindingLine); - bindingColumn = decodeInteger(reader, bindingLine === prevBl ? bindingColumn : 0); - const expression = decodeInteger(reader, 0); - expressionRanges.push([expression, bindingLine, bindingColumn]); - } - } else { - expressionRanges = [[expressionsCount]]; - } - bindings.push(expressionRanges); - } while (hasMoreVlq(reader, semi)); - } - range.bindings = bindings; - ranges.push(range); - stack.push(range); - } - genLine++; - reader.pos = semi + 1; - } while (reader.pos < length); - return ranges; -} -function encodeGeneratedRanges(ranges) { - if (ranges.length === 0) return ""; - const writer = new StringWriter(); - for (let i = 0; i < ranges.length; ) { - i = _encodeGeneratedRanges(ranges, i, writer, [0, 0, 0, 0, 0, 0, 0]); - } - return writer.flush(); -} -function _encodeGeneratedRanges(ranges, index, writer, state) { - const range = ranges[index]; - const { - 0: startLine, - 1: startColumn, - 2: endLine, - 3: endColumn, - isScope, - callsite, - bindings - } = range; - if (state[0] < startLine) { - catchupLine(writer, state[0], startLine); - state[0] = startLine; - state[1] = 0; - } else if (index > 0) { - writer.write(comma); - } - state[1] = encodeInteger(writer, range[1], state[1]); - const fields = (range.length === 6 ? 1 : 0) | (callsite ? 2 : 0) | (isScope ? 4 : 0); - encodeInteger(writer, fields, 0); - if (range.length === 6) { - const { 4: sourcesIndex, 5: scopesIndex } = range; - if (sourcesIndex !== state[2]) { - state[3] = 0; - } - state[2] = encodeInteger(writer, sourcesIndex, state[2]); - state[3] = encodeInteger(writer, scopesIndex, state[3]); - } - if (callsite) { - const { 0: sourcesIndex, 1: callLine, 2: callColumn } = range.callsite; - if (sourcesIndex !== state[4]) { - state[5] = 0; - state[6] = 0; - } else if (callLine !== state[5]) { - state[6] = 0; - } - state[4] = encodeInteger(writer, sourcesIndex, state[4]); - state[5] = encodeInteger(writer, callLine, state[5]); - state[6] = encodeInteger(writer, callColumn, state[6]); - } - if (bindings) { - for (const binding of bindings) { - if (binding.length > 1) encodeInteger(writer, -binding.length, 0); - const expression = binding[0][0]; - encodeInteger(writer, expression, 0); - let bindingStartLine = startLine; - let bindingStartColumn = startColumn; - for (let i = 1; i < binding.length; i++) { - const expRange = binding[i]; - bindingStartLine = encodeInteger(writer, expRange[1], bindingStartLine); - bindingStartColumn = encodeInteger(writer, expRange[2], bindingStartColumn); - encodeInteger(writer, expRange[0], 0); - } - } - } - for (index++; index < ranges.length; ) { - const next = ranges[index]; - const { 0: l, 1: c } = next; - if (l > endLine || l === endLine && c >= endColumn) { - break; - } - index = _encodeGeneratedRanges(ranges, index, writer, state); - } - if (state[0] < endLine) { - catchupLine(writer, state[0], endLine); - state[0] = endLine; - state[1] = 0; - } else { - writer.write(comma); - } - state[1] = encodeInteger(writer, endColumn, state[1]); - return index; -} -function catchupLine(writer, lastLine, line) { - do { - writer.write(semicolon); - } while (++lastLine < line); -} - -// src/sourcemap-codec.ts -function decode(mappings) { - const { length } = mappings; - const reader = new StringReader(mappings); - const decoded = []; - let genColumn = 0; - let sourcesIndex = 0; - let sourceLine = 0; - let sourceColumn = 0; - let namesIndex = 0; - do { - const semi = reader.indexOf(";"); - const line = []; - let sorted = true; - let lastCol = 0; - genColumn = 0; - while (reader.pos < semi) { - let seg; - genColumn = decodeInteger(reader, genColumn); - if (genColumn < lastCol) sorted = false; - lastCol = genColumn; - if (hasMoreVlq(reader, semi)) { - sourcesIndex = decodeInteger(reader, sourcesIndex); - sourceLine = decodeInteger(reader, sourceLine); - sourceColumn = decodeInteger(reader, sourceColumn); - if (hasMoreVlq(reader, semi)) { - namesIndex = decodeInteger(reader, namesIndex); - seg = [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]; - } else { - seg = [genColumn, sourcesIndex, sourceLine, sourceColumn]; - } - } else { - seg = [genColumn]; - } - line.push(seg); - reader.pos++; - } - if (!sorted) sort(line); - decoded.push(line); - reader.pos = semi + 1; - } while (reader.pos <= length); - return decoded; -} -function sort(line) { - line.sort(sortComparator); -} -function sortComparator(a, b) { - return a[0] - b[0]; -} -function encode(decoded) { - const writer = new StringWriter(); - let sourcesIndex = 0; - let sourceLine = 0; - let sourceColumn = 0; - let namesIndex = 0; - for (let i = 0; i < decoded.length; i++) { - const line = decoded[i]; - if (i > 0) writer.write(semicolon); - if (line.length === 0) continue; - let genColumn = 0; - for (let j = 0; j < line.length; j++) { - const segment = line[j]; - if (j > 0) writer.write(comma); - genColumn = encodeInteger(writer, segment[0], genColumn); - if (segment.length === 1) continue; - sourcesIndex = encodeInteger(writer, segment[1], sourcesIndex); - sourceLine = encodeInteger(writer, segment[2], sourceLine); - sourceColumn = encodeInteger(writer, segment[3], sourceColumn); - if (segment.length === 4) continue; - namesIndex = encodeInteger(writer, segment[4], namesIndex); - } - } - return writer.flush(); -} -})); -//# sourceMappingURL=sourcemap-codec.umd.js.map diff --git a/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js.map b/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js.map deleted file mode 100644 index abc18d2..0000000 --- a/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js.map +++ /dev/null @@ -1,6 +0,0 @@ -{ - "version": 3, - "sources": ["../src/sourcemap-codec.ts", "../src/vlq.ts", "../src/strings.ts", "../src/scopes.ts"], - "mappings": "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", - "names": [] -} diff --git a/node_modules/@jridgewell/sourcemap-codec/package.json b/node_modules/@jridgewell/sourcemap-codec/package.json deleted file mode 100644 index da55137..0000000 --- a/node_modules/@jridgewell/sourcemap-codec/package.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "name": "@jridgewell/sourcemap-codec", - "version": "1.5.5", - "description": "Encode/decode sourcemap mappings", - "keywords": [ - "sourcemap", - "vlq" - ], - "main": "dist/sourcemap-codec.umd.js", - "module": "dist/sourcemap-codec.mjs", - "types": "types/sourcemap-codec.d.cts", - "files": [ - "dist", - "src", - "types" - ], - "exports": { - ".": [ - { - "import": { - "types": "./types/sourcemap-codec.d.mts", - "default": "./dist/sourcemap-codec.mjs" - }, - "default": { - "types": "./types/sourcemap-codec.d.cts", - "default": "./dist/sourcemap-codec.umd.js" - } - }, - "./dist/sourcemap-codec.umd.js" - ], - "./package.json": "./package.json" - }, - "scripts": { - "benchmark": "run-s build:code benchmark:*", - "benchmark:install": "cd benchmark && npm install", - "benchmark:only": "node --expose-gc benchmark/index.js", - "build": "run-s -n build:code build:types", - "build:code": "node ../../esbuild.mjs sourcemap-codec.ts", - "build:types": "run-s build:types:force build:types:emit build:types:mts", - "build:types:force": "rimraf tsconfig.build.tsbuildinfo", - "build:types:emit": "tsc --project tsconfig.build.json", - "build:types:mts": "node ../../mts-types.mjs", - "clean": "run-s -n clean:code clean:types", - "clean:code": "tsc --build --clean tsconfig.build.json", - "clean:types": "rimraf dist types", - "test": "run-s -n test:types test:only test:format", - "test:format": "prettier --check '{src,test}/**/*.ts'", - "test:only": "mocha", - "test:types": "eslint '{src,test}/**/*.ts'", - "lint": "run-s -n lint:types lint:format", - "lint:format": "npm run test:format -- --write", - "lint:types": "npm run test:types -- --fix", - "prepublishOnly": "npm run-s -n build test" - }, - "homepage": "https://github.com/jridgewell/sourcemaps/tree/main/packages/sourcemap-codec", - "repository": { - "type": "git", - "url": "git+https://github.com/jridgewell/sourcemaps.git", - "directory": "packages/sourcemap-codec" - }, - "author": "Justin Ridgewell ", - "license": "MIT" -} diff --git a/node_modules/@jridgewell/sourcemap-codec/src/scopes.ts b/node_modules/@jridgewell/sourcemap-codec/src/scopes.ts deleted file mode 100644 index d194c2f..0000000 --- a/node_modules/@jridgewell/sourcemap-codec/src/scopes.ts +++ /dev/null @@ -1,345 +0,0 @@ -import { StringReader, StringWriter } from './strings'; -import { comma, decodeInteger, encodeInteger, hasMoreVlq, semicolon } from './vlq'; - -const EMPTY: any[] = []; - -type Line = number; -type Column = number; -type Kind = number; -type Name = number; -type Var = number; -type SourcesIndex = number; -type ScopesIndex = number; - -type Mix = (A & O) | (B & O); - -export type OriginalScope = Mix< - [Line, Column, Line, Column, Kind], - [Line, Column, Line, Column, Kind, Name], - { vars: Var[] } ->; - -export type GeneratedRange = Mix< - [Line, Column, Line, Column], - [Line, Column, Line, Column, SourcesIndex, ScopesIndex], - { - callsite: CallSite | null; - bindings: Binding[]; - isScope: boolean; - } ->; -export type CallSite = [SourcesIndex, Line, Column]; -type Binding = BindingExpressionRange[]; -export type BindingExpressionRange = [Name] | [Name, Line, Column]; - -export function decodeOriginalScopes(input: string): OriginalScope[] { - const { length } = input; - const reader = new StringReader(input); - const scopes: OriginalScope[] = []; - const stack: OriginalScope[] = []; - let line = 0; - - for (; reader.pos < length; reader.pos++) { - line = decodeInteger(reader, line); - const column = decodeInteger(reader, 0); - - if (!hasMoreVlq(reader, length)) { - const last = stack.pop()!; - last[2] = line; - last[3] = column; - continue; - } - - const kind = decodeInteger(reader, 0); - const fields = decodeInteger(reader, 0); - const hasName = fields & 0b0001; - - const scope: OriginalScope = ( - hasName ? [line, column, 0, 0, kind, decodeInteger(reader, 0)] : [line, column, 0, 0, kind] - ) as OriginalScope; - - let vars: Var[] = EMPTY; - if (hasMoreVlq(reader, length)) { - vars = []; - do { - const varsIndex = decodeInteger(reader, 0); - vars.push(varsIndex); - } while (hasMoreVlq(reader, length)); - } - scope.vars = vars; - - scopes.push(scope); - stack.push(scope); - } - - return scopes; -} - -export function encodeOriginalScopes(scopes: OriginalScope[]): string { - const writer = new StringWriter(); - - for (let i = 0; i < scopes.length; ) { - i = _encodeOriginalScopes(scopes, i, writer, [0]); - } - - return writer.flush(); -} - -function _encodeOriginalScopes( - scopes: OriginalScope[], - index: number, - writer: StringWriter, - state: [ - number, // GenColumn - ], -): number { - const scope = scopes[index]; - const { 0: startLine, 1: startColumn, 2: endLine, 3: endColumn, 4: kind, vars } = scope; - - if (index > 0) writer.write(comma); - - state[0] = encodeInteger(writer, startLine, state[0]); - encodeInteger(writer, startColumn, 0); - encodeInteger(writer, kind, 0); - - const fields = scope.length === 6 ? 0b0001 : 0; - encodeInteger(writer, fields, 0); - if (scope.length === 6) encodeInteger(writer, scope[5], 0); - - for (const v of vars) { - encodeInteger(writer, v, 0); - } - - for (index++; index < scopes.length; ) { - const next = scopes[index]; - const { 0: l, 1: c } = next; - if (l > endLine || (l === endLine && c >= endColumn)) { - break; - } - index = _encodeOriginalScopes(scopes, index, writer, state); - } - - writer.write(comma); - state[0] = encodeInteger(writer, endLine, state[0]); - encodeInteger(writer, endColumn, 0); - - return index; -} - -export function decodeGeneratedRanges(input: string): GeneratedRange[] { - const { length } = input; - const reader = new StringReader(input); - const ranges: GeneratedRange[] = []; - const stack: GeneratedRange[] = []; - - let genLine = 0; - let definitionSourcesIndex = 0; - let definitionScopeIndex = 0; - let callsiteSourcesIndex = 0; - let callsiteLine = 0; - let callsiteColumn = 0; - let bindingLine = 0; - let bindingColumn = 0; - - do { - const semi = reader.indexOf(';'); - let genColumn = 0; - - for (; reader.pos < semi; reader.pos++) { - genColumn = decodeInteger(reader, genColumn); - - if (!hasMoreVlq(reader, semi)) { - const last = stack.pop()!; - last[2] = genLine; - last[3] = genColumn; - continue; - } - - const fields = decodeInteger(reader, 0); - const hasDefinition = fields & 0b0001; - const hasCallsite = fields & 0b0010; - const hasScope = fields & 0b0100; - - let callsite: CallSite | null = null; - let bindings: Binding[] = EMPTY; - let range: GeneratedRange; - if (hasDefinition) { - const defSourcesIndex = decodeInteger(reader, definitionSourcesIndex); - definitionScopeIndex = decodeInteger( - reader, - definitionSourcesIndex === defSourcesIndex ? definitionScopeIndex : 0, - ); - - definitionSourcesIndex = defSourcesIndex; - range = [genLine, genColumn, 0, 0, defSourcesIndex, definitionScopeIndex] as GeneratedRange; - } else { - range = [genLine, genColumn, 0, 0] as GeneratedRange; - } - - range.isScope = !!hasScope; - - if (hasCallsite) { - const prevCsi = callsiteSourcesIndex; - const prevLine = callsiteLine; - callsiteSourcesIndex = decodeInteger(reader, callsiteSourcesIndex); - const sameSource = prevCsi === callsiteSourcesIndex; - callsiteLine = decodeInteger(reader, sameSource ? callsiteLine : 0); - callsiteColumn = decodeInteger( - reader, - sameSource && prevLine === callsiteLine ? callsiteColumn : 0, - ); - - callsite = [callsiteSourcesIndex, callsiteLine, callsiteColumn]; - } - range.callsite = callsite; - - if (hasMoreVlq(reader, semi)) { - bindings = []; - do { - bindingLine = genLine; - bindingColumn = genColumn; - const expressionsCount = decodeInteger(reader, 0); - let expressionRanges: BindingExpressionRange[]; - if (expressionsCount < -1) { - expressionRanges = [[decodeInteger(reader, 0)]]; - for (let i = -1; i > expressionsCount; i--) { - const prevBl = bindingLine; - bindingLine = decodeInteger(reader, bindingLine); - bindingColumn = decodeInteger(reader, bindingLine === prevBl ? bindingColumn : 0); - const expression = decodeInteger(reader, 0); - expressionRanges.push([expression, bindingLine, bindingColumn]); - } - } else { - expressionRanges = [[expressionsCount]]; - } - bindings.push(expressionRanges); - } while (hasMoreVlq(reader, semi)); - } - range.bindings = bindings; - - ranges.push(range); - stack.push(range); - } - - genLine++; - reader.pos = semi + 1; - } while (reader.pos < length); - - return ranges; -} - -export function encodeGeneratedRanges(ranges: GeneratedRange[]): string { - if (ranges.length === 0) return ''; - - const writer = new StringWriter(); - - for (let i = 0; i < ranges.length; ) { - i = _encodeGeneratedRanges(ranges, i, writer, [0, 0, 0, 0, 0, 0, 0]); - } - - return writer.flush(); -} - -function _encodeGeneratedRanges( - ranges: GeneratedRange[], - index: number, - writer: StringWriter, - state: [ - number, // GenLine - number, // GenColumn - number, // DefSourcesIndex - number, // DefScopesIndex - number, // CallSourcesIndex - number, // CallLine - number, // CallColumn - ], -): number { - const range = ranges[index]; - const { - 0: startLine, - 1: startColumn, - 2: endLine, - 3: endColumn, - isScope, - callsite, - bindings, - } = range; - - if (state[0] < startLine) { - catchupLine(writer, state[0], startLine); - state[0] = startLine; - state[1] = 0; - } else if (index > 0) { - writer.write(comma); - } - - state[1] = encodeInteger(writer, range[1], state[1]); - - const fields = - (range.length === 6 ? 0b0001 : 0) | (callsite ? 0b0010 : 0) | (isScope ? 0b0100 : 0); - encodeInteger(writer, fields, 0); - - if (range.length === 6) { - const { 4: sourcesIndex, 5: scopesIndex } = range; - if (sourcesIndex !== state[2]) { - state[3] = 0; - } - state[2] = encodeInteger(writer, sourcesIndex, state[2]); - state[3] = encodeInteger(writer, scopesIndex, state[3]); - } - - if (callsite) { - const { 0: sourcesIndex, 1: callLine, 2: callColumn } = range.callsite!; - if (sourcesIndex !== state[4]) { - state[5] = 0; - state[6] = 0; - } else if (callLine !== state[5]) { - state[6] = 0; - } - state[4] = encodeInteger(writer, sourcesIndex, state[4]); - state[5] = encodeInteger(writer, callLine, state[5]); - state[6] = encodeInteger(writer, callColumn, state[6]); - } - - if (bindings) { - for (const binding of bindings) { - if (binding.length > 1) encodeInteger(writer, -binding.length, 0); - const expression = binding[0][0]; - encodeInteger(writer, expression, 0); - let bindingStartLine = startLine; - let bindingStartColumn = startColumn; - for (let i = 1; i < binding.length; i++) { - const expRange = binding[i]; - bindingStartLine = encodeInteger(writer, expRange[1]!, bindingStartLine); - bindingStartColumn = encodeInteger(writer, expRange[2]!, bindingStartColumn); - encodeInteger(writer, expRange[0]!, 0); - } - } - } - - for (index++; index < ranges.length; ) { - const next = ranges[index]; - const { 0: l, 1: c } = next; - if (l > endLine || (l === endLine && c >= endColumn)) { - break; - } - index = _encodeGeneratedRanges(ranges, index, writer, state); - } - - if (state[0] < endLine) { - catchupLine(writer, state[0], endLine); - state[0] = endLine; - state[1] = 0; - } else { - writer.write(comma); - } - state[1] = encodeInteger(writer, endColumn, state[1]); - - return index; -} - -function catchupLine(writer: StringWriter, lastLine: number, line: number) { - do { - writer.write(semicolon); - } while (++lastLine < line); -} diff --git a/node_modules/@jridgewell/sourcemap-codec/src/sourcemap-codec.ts b/node_modules/@jridgewell/sourcemap-codec/src/sourcemap-codec.ts deleted file mode 100644 index a81f894..0000000 --- a/node_modules/@jridgewell/sourcemap-codec/src/sourcemap-codec.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { comma, decodeInteger, encodeInteger, hasMoreVlq, semicolon } from './vlq'; -import { StringWriter, StringReader } from './strings'; - -export { - decodeOriginalScopes, - encodeOriginalScopes, - decodeGeneratedRanges, - encodeGeneratedRanges, -} from './scopes'; -export type { OriginalScope, GeneratedRange, CallSite, BindingExpressionRange } from './scopes'; - -export type SourceMapSegment = - | [number] - | [number, number, number, number] - | [number, number, number, number, number]; -export type SourceMapLine = SourceMapSegment[]; -export type SourceMapMappings = SourceMapLine[]; - -export function decode(mappings: string): SourceMapMappings { - const { length } = mappings; - const reader = new StringReader(mappings); - const decoded: SourceMapMappings = []; - let genColumn = 0; - let sourcesIndex = 0; - let sourceLine = 0; - let sourceColumn = 0; - let namesIndex = 0; - - do { - const semi = reader.indexOf(';'); - const line: SourceMapLine = []; - let sorted = true; - let lastCol = 0; - genColumn = 0; - - while (reader.pos < semi) { - let seg: SourceMapSegment; - - genColumn = decodeInteger(reader, genColumn); - if (genColumn < lastCol) sorted = false; - lastCol = genColumn; - - if (hasMoreVlq(reader, semi)) { - sourcesIndex = decodeInteger(reader, sourcesIndex); - sourceLine = decodeInteger(reader, sourceLine); - sourceColumn = decodeInteger(reader, sourceColumn); - - if (hasMoreVlq(reader, semi)) { - namesIndex = decodeInteger(reader, namesIndex); - seg = [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]; - } else { - seg = [genColumn, sourcesIndex, sourceLine, sourceColumn]; - } - } else { - seg = [genColumn]; - } - - line.push(seg); - reader.pos++; - } - - if (!sorted) sort(line); - decoded.push(line); - reader.pos = semi + 1; - } while (reader.pos <= length); - - return decoded; -} - -function sort(line: SourceMapSegment[]) { - line.sort(sortComparator); -} - -function sortComparator(a: SourceMapSegment, b: SourceMapSegment): number { - return a[0] - b[0]; -} - -export function encode(decoded: SourceMapMappings): string; -export function encode(decoded: Readonly): string; -export function encode(decoded: Readonly): string { - const writer = new StringWriter(); - let sourcesIndex = 0; - let sourceLine = 0; - let sourceColumn = 0; - let namesIndex = 0; - - for (let i = 0; i < decoded.length; i++) { - const line = decoded[i]; - if (i > 0) writer.write(semicolon); - if (line.length === 0) continue; - - let genColumn = 0; - - for (let j = 0; j < line.length; j++) { - const segment = line[j]; - if (j > 0) writer.write(comma); - - genColumn = encodeInteger(writer, segment[0], genColumn); - - if (segment.length === 1) continue; - sourcesIndex = encodeInteger(writer, segment[1], sourcesIndex); - sourceLine = encodeInteger(writer, segment[2], sourceLine); - sourceColumn = encodeInteger(writer, segment[3], sourceColumn); - - if (segment.length === 4) continue; - namesIndex = encodeInteger(writer, segment[4], namesIndex); - } - } - - return writer.flush(); -} diff --git a/node_modules/@jridgewell/sourcemap-codec/src/strings.ts b/node_modules/@jridgewell/sourcemap-codec/src/strings.ts deleted file mode 100644 index d161965..0000000 --- a/node_modules/@jridgewell/sourcemap-codec/src/strings.ts +++ /dev/null @@ -1,65 +0,0 @@ -const bufLength = 1024 * 16; - -// Provide a fallback for older environments. -const td = - typeof TextDecoder !== 'undefined' - ? /* #__PURE__ */ new TextDecoder() - : typeof Buffer !== 'undefined' - ? { - decode(buf: Uint8Array): string { - const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength); - return out.toString(); - }, - } - : { - decode(buf: Uint8Array): string { - let out = ''; - for (let i = 0; i < buf.length; i++) { - out += String.fromCharCode(buf[i]); - } - return out; - }, - }; - -export class StringWriter { - pos = 0; - private out = ''; - private buffer = new Uint8Array(bufLength); - - write(v: number): void { - const { buffer } = this; - buffer[this.pos++] = v; - if (this.pos === bufLength) { - this.out += td.decode(buffer); - this.pos = 0; - } - } - - flush(): string { - const { buffer, out, pos } = this; - return pos > 0 ? out + td.decode(buffer.subarray(0, pos)) : out; - } -} - -export class StringReader { - pos = 0; - declare private buffer: string; - - constructor(buffer: string) { - this.buffer = buffer; - } - - next(): number { - return this.buffer.charCodeAt(this.pos++); - } - - peek(): number { - return this.buffer.charCodeAt(this.pos); - } - - indexOf(char: string): number { - const { buffer, pos } = this; - const idx = buffer.indexOf(char, pos); - return idx === -1 ? buffer.length : idx; - } -} diff --git a/node_modules/@jridgewell/sourcemap-codec/src/vlq.ts b/node_modules/@jridgewell/sourcemap-codec/src/vlq.ts deleted file mode 100644 index a42c681..0000000 --- a/node_modules/@jridgewell/sourcemap-codec/src/vlq.ts +++ /dev/null @@ -1,55 +0,0 @@ -import type { StringReader, StringWriter } from './strings'; - -export const comma = ','.charCodeAt(0); -export const semicolon = ';'.charCodeAt(0); - -const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; -const intToChar = new Uint8Array(64); // 64 possible chars. -const charToInt = new Uint8Array(128); // z is 122 in ASCII - -for (let i = 0; i < chars.length; i++) { - const c = chars.charCodeAt(i); - intToChar[i] = c; - charToInt[c] = i; -} - -export function decodeInteger(reader: StringReader, relative: number): number { - let value = 0; - let shift = 0; - let integer = 0; - - do { - const c = reader.next(); - integer = charToInt[c]; - value |= (integer & 31) << shift; - shift += 5; - } while (integer & 32); - - const shouldNegate = value & 1; - value >>>= 1; - - if (shouldNegate) { - value = -0x80000000 | -value; - } - - return relative + value; -} - -export function encodeInteger(builder: StringWriter, num: number, relative: number): number { - let delta = num - relative; - - delta = delta < 0 ? (-delta << 1) | 1 : delta << 1; - do { - let clamped = delta & 0b011111; - delta >>>= 5; - if (delta > 0) clamped |= 0b100000; - builder.write(intToChar[clamped]); - } while (delta > 0); - - return num; -} - -export function hasMoreVlq(reader: StringReader, max: number) { - if (reader.pos >= max) return false; - return reader.peek() !== comma; -} diff --git a/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts b/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts deleted file mode 100644 index c583c75..0000000 --- a/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts +++ /dev/null @@ -1,50 +0,0 @@ -type Line = number; -type Column = number; -type Kind = number; -type Name = number; -type Var = number; -type SourcesIndex = number; -type ScopesIndex = number; -type Mix = (A & O) | (B & O); -export type OriginalScope = Mix<[ - Line, - Column, - Line, - Column, - Kind -], [ - Line, - Column, - Line, - Column, - Kind, - Name -], { - vars: Var[]; -}>; -export type GeneratedRange = Mix<[ - Line, - Column, - Line, - Column -], [ - Line, - Column, - Line, - Column, - SourcesIndex, - ScopesIndex -], { - callsite: CallSite | null; - bindings: Binding[]; - isScope: boolean; -}>; -export type CallSite = [SourcesIndex, Line, Column]; -type Binding = BindingExpressionRange[]; -export type BindingExpressionRange = [Name] | [Name, Line, Column]; -export declare function decodeOriginalScopes(input: string): OriginalScope[]; -export declare function encodeOriginalScopes(scopes: OriginalScope[]): string; -export declare function decodeGeneratedRanges(input: string): GeneratedRange[]; -export declare function encodeGeneratedRanges(ranges: GeneratedRange[]): string; -export {}; -//# sourceMappingURL=scopes.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts.map b/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts.map deleted file mode 100644 index 630e647..0000000 --- a/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"scopes.d.ts","sourceRoot":"","sources":["../src/scopes.ts"],"names":[],"mappings":"AAKA,KAAK,IAAI,GAAG,MAAM,CAAC;AACnB,KAAK,MAAM,GAAG,MAAM,CAAC;AACrB,KAAK,IAAI,GAAG,MAAM,CAAC;AACnB,KAAK,IAAI,GAAG,MAAM,CAAC;AACnB,KAAK,GAAG,GAAG,MAAM,CAAC;AAClB,KAAK,YAAY,GAAG,MAAM,CAAC;AAC3B,KAAK,WAAW,GAAG,MAAM,CAAC;AAE1B,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAEtC,MAAM,MAAM,aAAa,GAAG,GAAG,CAC7B;IAAC,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,MAAM;IAAE,IAAI;CAAC,EAClC;IAAC,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,IAAI;CAAC,EACxC;IAAE,IAAI,EAAE,GAAG,EAAE,CAAA;CAAE,CAChB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,GAAG,CAC9B;IAAC,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,MAAM;CAAC,EAC5B;IAAC,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,MAAM;IAAE,YAAY;IAAE,WAAW;CAAC,EACvD;IACE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB,CACF,CAAC;AACF,MAAM,MAAM,QAAQ,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AACpD,KAAK,OAAO,GAAG,sBAAsB,EAAE,CAAC;AACxC,MAAM,MAAM,sBAAsB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAEnE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE,CAyCnE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAQpE;AA2CD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE,CAoGrE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,CAUtE"} \ No newline at end of file diff --git a/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts b/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts deleted file mode 100644 index c583c75..0000000 --- a/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts +++ /dev/null @@ -1,50 +0,0 @@ -type Line = number; -type Column = number; -type Kind = number; -type Name = number; -type Var = number; -type SourcesIndex = number; -type ScopesIndex = number; -type Mix = (A & O) | (B & O); -export type OriginalScope = Mix<[ - Line, - Column, - Line, - Column, - Kind -], [ - Line, - Column, - Line, - Column, - Kind, - Name -], { - vars: Var[]; -}>; -export type GeneratedRange = Mix<[ - Line, - Column, - Line, - Column -], [ - Line, - Column, - Line, - Column, - SourcesIndex, - ScopesIndex -], { - callsite: CallSite | null; - bindings: Binding[]; - isScope: boolean; -}>; -export type CallSite = [SourcesIndex, Line, Column]; -type Binding = BindingExpressionRange[]; -export type BindingExpressionRange = [Name] | [Name, Line, Column]; -export declare function decodeOriginalScopes(input: string): OriginalScope[]; -export declare function encodeOriginalScopes(scopes: OriginalScope[]): string; -export declare function decodeGeneratedRanges(input: string): GeneratedRange[]; -export declare function encodeGeneratedRanges(ranges: GeneratedRange[]): string; -export {}; -//# sourceMappingURL=scopes.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts.map b/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts.map deleted file mode 100644 index 630e647..0000000 --- a/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"scopes.d.ts","sourceRoot":"","sources":["../src/scopes.ts"],"names":[],"mappings":"AAKA,KAAK,IAAI,GAAG,MAAM,CAAC;AACnB,KAAK,MAAM,GAAG,MAAM,CAAC;AACrB,KAAK,IAAI,GAAG,MAAM,CAAC;AACnB,KAAK,IAAI,GAAG,MAAM,CAAC;AACnB,KAAK,GAAG,GAAG,MAAM,CAAC;AAClB,KAAK,YAAY,GAAG,MAAM,CAAC;AAC3B,KAAK,WAAW,GAAG,MAAM,CAAC;AAE1B,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAEtC,MAAM,MAAM,aAAa,GAAG,GAAG,CAC7B;IAAC,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,MAAM;IAAE,IAAI;CAAC,EAClC;IAAC,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,IAAI;CAAC,EACxC;IAAE,IAAI,EAAE,GAAG,EAAE,CAAA;CAAE,CAChB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,GAAG,CAC9B;IAAC,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,MAAM;CAAC,EAC5B;IAAC,IAAI;IAAE,MAAM;IAAE,IAAI;IAAE,MAAM;IAAE,YAAY;IAAE,WAAW;CAAC,EACvD;IACE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB,CACF,CAAC;AACF,MAAM,MAAM,QAAQ,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AACpD,KAAK,OAAO,GAAG,sBAAsB,EAAE,CAAC;AACxC,MAAM,MAAM,sBAAsB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAEnE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE,CAyCnE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAQpE;AA2CD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE,CAoGrE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,CAUtE"} \ No newline at end of file diff --git a/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts b/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts deleted file mode 100644 index 5f35e22..0000000 --- a/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts +++ /dev/null @@ -1,9 +0,0 @@ -export { decodeOriginalScopes, encodeOriginalScopes, decodeGeneratedRanges, encodeGeneratedRanges, } from './scopes.cts'; -export type { OriginalScope, GeneratedRange, CallSite, BindingExpressionRange } from './scopes.cts'; -export type SourceMapSegment = [number] | [number, number, number, number] | [number, number, number, number, number]; -export type SourceMapLine = SourceMapSegment[]; -export type SourceMapMappings = SourceMapLine[]; -export declare function decode(mappings: string): SourceMapMappings; -export declare function encode(decoded: SourceMapMappings): string; -export declare function encode(decoded: Readonly): string; -//# sourceMappingURL=sourcemap-codec.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts.map b/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts.map deleted file mode 100644 index 7123d52..0000000 --- a/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"sourcemap-codec.d.ts","sourceRoot":"","sources":["../src/sourcemap-codec.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAEhG,MAAM,MAAM,gBAAgB,GACxB,CAAC,MAAM,CAAC,GACR,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAChC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAC7C,MAAM,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;AAC/C,MAAM,MAAM,iBAAiB,GAAG,aAAa,EAAE,CAAC;AAEhD,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAiD1D;AAUD,wBAAgB,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAAC;AAC3D,wBAAgB,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,MAAM,CAAC"} \ No newline at end of file diff --git a/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts b/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts deleted file mode 100644 index 199fb9f..0000000 --- a/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts +++ /dev/null @@ -1,9 +0,0 @@ -export { decodeOriginalScopes, encodeOriginalScopes, decodeGeneratedRanges, encodeGeneratedRanges, } from './scopes.mts'; -export type { OriginalScope, GeneratedRange, CallSite, BindingExpressionRange } from './scopes.mts'; -export type SourceMapSegment = [number] | [number, number, number, number] | [number, number, number, number, number]; -export type SourceMapLine = SourceMapSegment[]; -export type SourceMapMappings = SourceMapLine[]; -export declare function decode(mappings: string): SourceMapMappings; -export declare function encode(decoded: SourceMapMappings): string; -export declare function encode(decoded: Readonly): string; -//# sourceMappingURL=sourcemap-codec.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts.map b/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts.map deleted file mode 100644 index 7123d52..0000000 --- a/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"sourcemap-codec.d.ts","sourceRoot":"","sources":["../src/sourcemap-codec.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAEhG,MAAM,MAAM,gBAAgB,GACxB,CAAC,MAAM,CAAC,GACR,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAChC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAC7C,MAAM,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;AAC/C,MAAM,MAAM,iBAAiB,GAAG,aAAa,EAAE,CAAC;AAEhD,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAiD1D;AAUD,wBAAgB,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAAC;AAC3D,wBAAgB,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,MAAM,CAAC"} \ No newline at end of file diff --git a/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts b/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts deleted file mode 100644 index 62faceb..0000000 --- a/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts +++ /dev/null @@ -1,16 +0,0 @@ -export declare class StringWriter { - pos: number; - private out; - private buffer; - write(v: number): void; - flush(): string; -} -export declare class StringReader { - pos: number; - private buffer; - constructor(buffer: string); - next(): number; - peek(): number; - indexOf(char: string): number; -} -//# sourceMappingURL=strings.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts.map b/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts.map deleted file mode 100644 index d3602da..0000000 --- a/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"strings.d.ts","sourceRoot":"","sources":["../src/strings.ts"],"names":[],"mappings":"AAuBA,qBAAa,YAAY;IACvB,GAAG,SAAK;IACR,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,MAAM,CAA6B;IAE3C,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAStB,KAAK,IAAI,MAAM;CAIhB;AAED,qBAAa,YAAY;IACvB,GAAG,SAAK;IACR,QAAgB,MAAM,CAAS;gBAEnB,MAAM,EAAE,MAAM;IAI1B,IAAI,IAAI,MAAM;IAId,IAAI,IAAI,MAAM;IAId,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAK9B"} \ No newline at end of file diff --git a/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts b/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts deleted file mode 100644 index 62faceb..0000000 --- a/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts +++ /dev/null @@ -1,16 +0,0 @@ -export declare class StringWriter { - pos: number; - private out; - private buffer; - write(v: number): void; - flush(): string; -} -export declare class StringReader { - pos: number; - private buffer; - constructor(buffer: string); - next(): number; - peek(): number; - indexOf(char: string): number; -} -//# sourceMappingURL=strings.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts.map b/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts.map deleted file mode 100644 index d3602da..0000000 --- a/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"strings.d.ts","sourceRoot":"","sources":["../src/strings.ts"],"names":[],"mappings":"AAuBA,qBAAa,YAAY;IACvB,GAAG,SAAK;IACR,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,MAAM,CAA6B;IAE3C,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAStB,KAAK,IAAI,MAAM;CAIhB;AAED,qBAAa,YAAY;IACvB,GAAG,SAAK;IACR,QAAgB,MAAM,CAAS;gBAEnB,MAAM,EAAE,MAAM;IAI1B,IAAI,IAAI,MAAM;IAId,IAAI,IAAI,MAAM;IAId,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAK9B"} \ No newline at end of file diff --git a/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts b/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts deleted file mode 100644 index dbd6602..0000000 --- a/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts +++ /dev/null @@ -1,7 +0,0 @@ -import type { StringReader, StringWriter } from './strings.cts'; -export declare const comma: number; -export declare const semicolon: number; -export declare function decodeInteger(reader: StringReader, relative: number): number; -export declare function encodeInteger(builder: StringWriter, num: number, relative: number): number; -export declare function hasMoreVlq(reader: StringReader, max: number): boolean; -//# sourceMappingURL=vlq.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts.map b/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts.map deleted file mode 100644 index 6fdc356..0000000 --- a/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"vlq.d.ts","sourceRoot":"","sources":["../src/vlq.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE5D,eAAO,MAAM,KAAK,QAAoB,CAAC;AACvC,eAAO,MAAM,SAAS,QAAoB,CAAC;AAY3C,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAoB5E;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAY1F;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,WAG3D"} \ No newline at end of file diff --git a/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts b/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts deleted file mode 100644 index 2c739bc..0000000 --- a/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts +++ /dev/null @@ -1,7 +0,0 @@ -import type { StringReader, StringWriter } from './strings.mts'; -export declare const comma: number; -export declare const semicolon: number; -export declare function decodeInteger(reader: StringReader, relative: number): number; -export declare function encodeInteger(builder: StringWriter, num: number, relative: number): number; -export declare function hasMoreVlq(reader: StringReader, max: number): boolean; -//# sourceMappingURL=vlq.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts.map b/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts.map deleted file mode 100644 index 6fdc356..0000000 --- a/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"vlq.d.ts","sourceRoot":"","sources":["../src/vlq.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE5D,eAAO,MAAM,KAAK,QAAoB,CAAC;AACvC,eAAO,MAAM,SAAS,QAAoB,CAAC;AAY3C,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAoB5E;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAY1F;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,WAG3D"} \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/LICENSE b/node_modules/@jridgewell/trace-mapping/LICENSE deleted file mode 100644 index 1f6ce94..0000000 --- a/node_modules/@jridgewell/trace-mapping/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright 2024 Justin Ridgewell - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/node_modules/@jridgewell/trace-mapping/README.md b/node_modules/@jridgewell/trace-mapping/README.md deleted file mode 100644 index 9fc0ed0..0000000 --- a/node_modules/@jridgewell/trace-mapping/README.md +++ /dev/null @@ -1,348 +0,0 @@ -# @jridgewell/trace-mapping - -> Trace the original position through a source map - -`trace-mapping` allows you to take the line and column of an output file and trace it to the -original location in the source file through a source map. - -You may already be familiar with the [`source-map`][source-map] package's `SourceMapConsumer`. This -provides the same `originalPositionFor` and `generatedPositionFor` API, without requiring WASM. - -## Installation - -```sh -npm install @jridgewell/trace-mapping -``` - -## Usage - -```typescript -import { - TraceMap, - originalPositionFor, - generatedPositionFor, - sourceContentFor, - isIgnored, -} from '@jridgewell/trace-mapping'; - -const tracer = new TraceMap({ - version: 3, - sources: ['input.js'], - sourcesContent: ['content of input.js'], - names: ['foo'], - mappings: 'KAyCIA', - ignoreList: [], -}); - -// Lines start at line 1, columns at column 0. -const traced = originalPositionFor(tracer, { line: 1, column: 5 }); -assert.deepEqual(traced, { - source: 'input.js', - line: 42, - column: 4, - name: 'foo', -}); - -const content = sourceContentFor(tracer, traced.source); -assert.strictEqual(content, 'content for input.js'); - -const generated = generatedPositionFor(tracer, { - source: 'input.js', - line: 42, - column: 4, -}); -assert.deepEqual(generated, { - line: 1, - column: 5, -}); - -const ignored = isIgnored(tracer, 'input.js'); -assert.equal(ignored, false); -``` - -We also provide a lower level API to get the actual segment that matches our line and column. Unlike -`originalPositionFor`, `traceSegment` uses a 0-base for `line`: - -```typescript -import { traceSegment } from '@jridgewell/trace-mapping'; - -// line is 0-base. -const traced = traceSegment(tracer, /* line */ 0, /* column */ 5); - -// Segments are [outputColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex] -// Again, line is 0-base and so is sourceLine -assert.deepEqual(traced, [5, 0, 41, 4, 0]); -``` - -### SectionedSourceMaps - -The sourcemap spec defines a special `sections` field that's designed to handle concatenation of -output code with associated sourcemaps. This type of sourcemap is rarely used (no major build tool -produces it), but if you are hand coding a concatenation you may need it. We provide an `AnyMap` -helper that can receive either a regular sourcemap or a `SectionedSourceMap` and returns a -`TraceMap` instance: - -```typescript -import { AnyMap } from '@jridgewell/trace-mapping'; -const fooOutput = 'foo'; -const barOutput = 'bar'; -const output = [fooOutput, barOutput].join('\n'); - -const sectioned = new AnyMap({ - version: 3, - sections: [ - { - // 0-base line and column - offset: { line: 0, column: 0 }, - // fooOutput's sourcemap - map: { - version: 3, - sources: ['foo.js'], - names: ['foo'], - mappings: 'AAAAA', - }, - }, - { - // barOutput's sourcemap will not affect the first line, only the second - offset: { line: 1, column: 0 }, - map: { - version: 3, - sources: ['bar.js'], - names: ['bar'], - mappings: 'AAAAA', - }, - }, - ], -}); - -const traced = originalPositionFor(sectioned, { - line: 2, - column: 0, -}); - -assert.deepEqual(traced, { - source: 'bar.js', - line: 1, - column: 0, - name: 'bar', -}); -``` - -## Benchmarks - -``` -node v20.10.0 - -amp.js.map - 45120 segments - -Memory Usage: -trace-mapping decoded 414164 bytes -trace-mapping encoded 6274352 bytes -source-map-js 10968904 bytes -source-map-0.6.1 17587160 bytes -source-map-0.8.0 8812155 bytes -Chrome dev tools 8672912 bytes -Smallest memory usage is trace-mapping decoded - -Init speed: -trace-mapping: decoded JSON input x 205 ops/sec ±0.19% (88 runs sampled) -trace-mapping: encoded JSON input x 405 ops/sec ±1.47% (88 runs sampled) -trace-mapping: decoded Object input x 4,645 ops/sec ±0.15% (98 runs sampled) -trace-mapping: encoded Object input x 458 ops/sec ±1.63% (91 runs sampled) -source-map-js: encoded Object input x 75.48 ops/sec ±1.64% (67 runs sampled) -source-map-0.6.1: encoded Object input x 39.37 ops/sec ±1.44% (53 runs sampled) -Chrome dev tools: encoded Object input x 150 ops/sec ±1.76% (79 runs sampled) -Fastest is trace-mapping: decoded Object input - -Trace speed (random): -trace-mapping: decoded originalPositionFor x 44,946 ops/sec ±0.16% (99 runs sampled) -trace-mapping: encoded originalPositionFor x 37,995 ops/sec ±1.81% (89 runs sampled) -source-map-js: encoded originalPositionFor x 9,230 ops/sec ±1.36% (93 runs sampled) -source-map-0.6.1: encoded originalPositionFor x 8,057 ops/sec ±0.84% (96 runs sampled) -source-map-0.8.0: encoded originalPositionFor x 28,198 ops/sec ±1.12% (91 runs sampled) -Chrome dev tools: encoded originalPositionFor x 46,276 ops/sec ±1.35% (95 runs sampled) -Fastest is Chrome dev tools: encoded originalPositionFor - -Trace speed (ascending): -trace-mapping: decoded originalPositionFor x 204,406 ops/sec ±0.19% (97 runs sampled) -trace-mapping: encoded originalPositionFor x 196,695 ops/sec ±0.24% (99 runs sampled) -source-map-js: encoded originalPositionFor x 11,948 ops/sec ±0.94% (99 runs sampled) -source-map-0.6.1: encoded originalPositionFor x 10,730 ops/sec ±0.36% (100 runs sampled) -source-map-0.8.0: encoded originalPositionFor x 51,427 ops/sec ±0.21% (98 runs sampled) -Chrome dev tools: encoded originalPositionFor x 162,615 ops/sec ±0.18% (98 runs sampled) -Fastest is trace-mapping: decoded originalPositionFor - - -*** - - -babel.min.js.map - 347793 segments - -Memory Usage: -trace-mapping decoded 18504 bytes -trace-mapping encoded 35428008 bytes -source-map-js 51676808 bytes -source-map-0.6.1 63367136 bytes -source-map-0.8.0 43158400 bytes -Chrome dev tools 50721552 bytes -Smallest memory usage is trace-mapping decoded - -Init speed: -trace-mapping: decoded JSON input x 17.82 ops/sec ±6.35% (35 runs sampled) -trace-mapping: encoded JSON input x 31.57 ops/sec ±7.50% (43 runs sampled) -trace-mapping: decoded Object input x 867 ops/sec ±0.74% (94 runs sampled) -trace-mapping: encoded Object input x 33.83 ops/sec ±7.66% (46 runs sampled) -source-map-js: encoded Object input x 6.58 ops/sec ±3.31% (20 runs sampled) -source-map-0.6.1: encoded Object input x 4.23 ops/sec ±3.43% (15 runs sampled) -Chrome dev tools: encoded Object input x 22.14 ops/sec ±3.79% (41 runs sampled) -Fastest is trace-mapping: decoded Object input - -Trace speed (random): -trace-mapping: decoded originalPositionFor x 78,234 ops/sec ±1.48% (29 runs sampled) -trace-mapping: encoded originalPositionFor x 60,761 ops/sec ±1.35% (21 runs sampled) -source-map-js: encoded originalPositionFor x 51,448 ops/sec ±2.17% (89 runs sampled) -source-map-0.6.1: encoded originalPositionFor x 47,221 ops/sec ±1.99% (15 runs sampled) -source-map-0.8.0: encoded originalPositionFor x 84,002 ops/sec ±1.45% (27 runs sampled) -Chrome dev tools: encoded originalPositionFor x 106,457 ops/sec ±1.38% (37 runs sampled) -Fastest is Chrome dev tools: encoded originalPositionFor - -Trace speed (ascending): -trace-mapping: decoded originalPositionFor x 930,943 ops/sec ±0.25% (99 runs sampled) -trace-mapping: encoded originalPositionFor x 843,545 ops/sec ±0.34% (97 runs sampled) -source-map-js: encoded originalPositionFor x 114,510 ops/sec ±1.37% (36 runs sampled) -source-map-0.6.1: encoded originalPositionFor x 87,412 ops/sec ±0.72% (92 runs sampled) -source-map-0.8.0: encoded originalPositionFor x 197,709 ops/sec ±0.89% (59 runs sampled) -Chrome dev tools: encoded originalPositionFor x 688,983 ops/sec ±0.33% (98 runs sampled) -Fastest is trace-mapping: decoded originalPositionFor - - -*** - - -preact.js.map - 1992 segments - -Memory Usage: -trace-mapping decoded 33136 bytes -trace-mapping encoded 254240 bytes -source-map-js 837488 bytes -source-map-0.6.1 961928 bytes -source-map-0.8.0 54384 bytes -Chrome dev tools 709680 bytes -Smallest memory usage is trace-mapping decoded - -Init speed: -trace-mapping: decoded JSON input x 3,709 ops/sec ±0.13% (99 runs sampled) -trace-mapping: encoded JSON input x 6,447 ops/sec ±0.22% (101 runs sampled) -trace-mapping: decoded Object input x 83,062 ops/sec ±0.23% (100 runs sampled) -trace-mapping: encoded Object input x 14,980 ops/sec ±0.28% (100 runs sampled) -source-map-js: encoded Object input x 2,544 ops/sec ±0.16% (99 runs sampled) -source-map-0.6.1: encoded Object input x 1,221 ops/sec ±0.37% (97 runs sampled) -Chrome dev tools: encoded Object input x 4,241 ops/sec ±0.39% (93 runs sampled) -Fastest is trace-mapping: decoded Object input - -Trace speed (random): -trace-mapping: decoded originalPositionFor x 91,028 ops/sec ±0.14% (94 runs sampled) -trace-mapping: encoded originalPositionFor x 84,348 ops/sec ±0.26% (98 runs sampled) -source-map-js: encoded originalPositionFor x 26,998 ops/sec ±0.23% (98 runs sampled) -source-map-0.6.1: encoded originalPositionFor x 18,049 ops/sec ±0.26% (100 runs sampled) -source-map-0.8.0: encoded originalPositionFor x 41,916 ops/sec ±0.28% (98 runs sampled) -Chrome dev tools: encoded originalPositionFor x 88,616 ops/sec ±0.14% (98 runs sampled) -Fastest is trace-mapping: decoded originalPositionFor - -Trace speed (ascending): -trace-mapping: decoded originalPositionFor x 319,960 ops/sec ±0.16% (100 runs sampled) -trace-mapping: encoded originalPositionFor x 302,153 ops/sec ±0.18% (100 runs sampled) -source-map-js: encoded originalPositionFor x 35,574 ops/sec ±0.19% (100 runs sampled) -source-map-0.6.1: encoded originalPositionFor x 19,943 ops/sec ±0.12% (101 runs sampled) -source-map-0.8.0: encoded originalPositionFor x 54,648 ops/sec ±0.20% (99 runs sampled) -Chrome dev tools: encoded originalPositionFor x 278,319 ops/sec ±0.17% (102 runs sampled) -Fastest is trace-mapping: decoded originalPositionFor - - -*** - - -react.js.map - 5726 segments - -Memory Usage: -trace-mapping decoded 10872 bytes -trace-mapping encoded 681512 bytes -source-map-js 2563944 bytes -source-map-0.6.1 2150864 bytes -source-map-0.8.0 88680 bytes -Chrome dev tools 1149576 bytes -Smallest memory usage is trace-mapping decoded - -Init speed: -trace-mapping: decoded JSON input x 1,887 ops/sec ±0.28% (99 runs sampled) -trace-mapping: encoded JSON input x 4,749 ops/sec ±0.48% (97 runs sampled) -trace-mapping: decoded Object input x 74,236 ops/sec ±0.11% (99 runs sampled) -trace-mapping: encoded Object input x 5,752 ops/sec ±0.38% (100 runs sampled) -source-map-js: encoded Object input x 806 ops/sec ±0.19% (97 runs sampled) -source-map-0.6.1: encoded Object input x 418 ops/sec ±0.33% (94 runs sampled) -Chrome dev tools: encoded Object input x 1,524 ops/sec ±0.57% (92 runs sampled) -Fastest is trace-mapping: decoded Object input - -Trace speed (random): -trace-mapping: decoded originalPositionFor x 620,201 ops/sec ±0.33% (96 runs sampled) -trace-mapping: encoded originalPositionFor x 579,548 ops/sec ±0.35% (97 runs sampled) -source-map-js: encoded originalPositionFor x 230,983 ops/sec ±0.62% (54 runs sampled) -source-map-0.6.1: encoded originalPositionFor x 158,145 ops/sec ±0.80% (46 runs sampled) -source-map-0.8.0: encoded originalPositionFor x 343,801 ops/sec ±0.55% (96 runs sampled) -Chrome dev tools: encoded originalPositionFor x 659,649 ops/sec ±0.49% (98 runs sampled) -Fastest is Chrome dev tools: encoded originalPositionFor - -Trace speed (ascending): -trace-mapping: decoded originalPositionFor x 2,368,079 ops/sec ±0.32% (98 runs sampled) -trace-mapping: encoded originalPositionFor x 2,134,039 ops/sec ±2.72% (87 runs sampled) -source-map-js: encoded originalPositionFor x 290,120 ops/sec ±2.49% (82 runs sampled) -source-map-0.6.1: encoded originalPositionFor x 187,613 ops/sec ±0.86% (49 runs sampled) -source-map-0.8.0: encoded originalPositionFor x 479,569 ops/sec ±0.65% (96 runs sampled) -Chrome dev tools: encoded originalPositionFor x 2,048,414 ops/sec ±0.24% (98 runs sampled) -Fastest is trace-mapping: decoded originalPositionFor - - -*** - - -vscode.map - 2141001 segments - -Memory Usage: -trace-mapping decoded 5206584 bytes -trace-mapping encoded 208370336 bytes -source-map-js 278493008 bytes -source-map-0.6.1 391564048 bytes -source-map-0.8.0 257508787 bytes -Chrome dev tools 291053000 bytes -Smallest memory usage is trace-mapping decoded - -Init speed: -trace-mapping: decoded JSON input x 1.63 ops/sec ±33.88% (9 runs sampled) -trace-mapping: encoded JSON input x 3.29 ops/sec ±36.13% (13 runs sampled) -trace-mapping: decoded Object input x 103 ops/sec ±0.93% (77 runs sampled) -trace-mapping: encoded Object input x 5.42 ops/sec ±28.54% (19 runs sampled) -source-map-js: encoded Object input x 1.07 ops/sec ±13.84% (7 runs sampled) -source-map-0.6.1: encoded Object input x 0.60 ops/sec ±2.43% (6 runs sampled) -Chrome dev tools: encoded Object input x 2.61 ops/sec ±22.00% (11 runs sampled) -Fastest is trace-mapping: decoded Object input - -Trace speed (random): -trace-mapping: decoded originalPositionFor x 257,019 ops/sec ±0.97% (93 runs sampled) -trace-mapping: encoded originalPositionFor x 179,163 ops/sec ±0.83% (92 runs sampled) -source-map-js: encoded originalPositionFor x 73,337 ops/sec ±1.35% (87 runs sampled) -source-map-0.6.1: encoded originalPositionFor x 38,797 ops/sec ±1.66% (88 runs sampled) -source-map-0.8.0: encoded originalPositionFor x 107,758 ops/sec ±1.94% (45 runs sampled) -Chrome dev tools: encoded originalPositionFor x 188,550 ops/sec ±1.85% (79 runs sampled) -Fastest is trace-mapping: decoded originalPositionFor - -Trace speed (ascending): -trace-mapping: decoded originalPositionFor x 447,621 ops/sec ±3.64% (94 runs sampled) -trace-mapping: encoded originalPositionFor x 323,698 ops/sec ±5.20% (88 runs sampled) -source-map-js: encoded originalPositionFor x 78,387 ops/sec ±1.69% (89 runs sampled) -source-map-0.6.1: encoded originalPositionFor x 41,016 ops/sec ±3.01% (25 runs sampled) -source-map-0.8.0: encoded originalPositionFor x 124,204 ops/sec ±0.90% (92 runs sampled) -Chrome dev tools: encoded originalPositionFor x 230,087 ops/sec ±2.61% (93 runs sampled) -Fastest is trace-mapping: decoded originalPositionFor -``` - -[source-map]: https://www.npmjs.com/package/source-map diff --git a/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs b/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs deleted file mode 100644 index 251117c..0000000 --- a/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs +++ /dev/null @@ -1,504 +0,0 @@ -// src/trace-mapping.ts -import { encode, decode } from "@jridgewell/sourcemap-codec"; - -// src/resolve.ts -import resolveUri from "@jridgewell/resolve-uri"; - -// src/strip-filename.ts -function stripFilename(path) { - if (!path) return ""; - const index = path.lastIndexOf("/"); - return path.slice(0, index + 1); -} - -// src/resolve.ts -function resolver(mapUrl, sourceRoot) { - const from = stripFilename(mapUrl); - const prefix = sourceRoot ? sourceRoot + "/" : ""; - return (source) => resolveUri(prefix + (source || ""), from); -} - -// src/sourcemap-segment.ts -var COLUMN = 0; -var SOURCES_INDEX = 1; -var SOURCE_LINE = 2; -var SOURCE_COLUMN = 3; -var NAMES_INDEX = 4; -var REV_GENERATED_LINE = 1; -var REV_GENERATED_COLUMN = 2; - -// src/sort.ts -function maybeSort(mappings, owned) { - const unsortedIndex = nextUnsortedSegmentLine(mappings, 0); - if (unsortedIndex === mappings.length) return mappings; - if (!owned) mappings = mappings.slice(); - for (let i = unsortedIndex; i < mappings.length; i = nextUnsortedSegmentLine(mappings, i + 1)) { - mappings[i] = sortSegments(mappings[i], owned); - } - return mappings; -} -function nextUnsortedSegmentLine(mappings, start) { - for (let i = start; i < mappings.length; i++) { - if (!isSorted(mappings[i])) return i; - } - return mappings.length; -} -function isSorted(line) { - for (let j = 1; j < line.length; j++) { - if (line[j][COLUMN] < line[j - 1][COLUMN]) { - return false; - } - } - return true; -} -function sortSegments(line, owned) { - if (!owned) line = line.slice(); - return line.sort(sortComparator); -} -function sortComparator(a, b) { - return a[COLUMN] - b[COLUMN]; -} - -// src/binary-search.ts -var found = false; -function binarySearch(haystack, needle, low, high) { - while (low <= high) { - const mid = low + (high - low >> 1); - const cmp = haystack[mid][COLUMN] - needle; - if (cmp === 0) { - found = true; - return mid; - } - if (cmp < 0) { - low = mid + 1; - } else { - high = mid - 1; - } - } - found = false; - return low - 1; -} -function upperBound(haystack, needle, index) { - for (let i = index + 1; i < haystack.length; index = i++) { - if (haystack[i][COLUMN] !== needle) break; - } - return index; -} -function lowerBound(haystack, needle, index) { - for (let i = index - 1; i >= 0; index = i--) { - if (haystack[i][COLUMN] !== needle) break; - } - return index; -} -function memoizedState() { - return { - lastKey: -1, - lastNeedle: -1, - lastIndex: -1 - }; -} -function memoizedBinarySearch(haystack, needle, state, key) { - const { lastKey, lastNeedle, lastIndex } = state; - let low = 0; - let high = haystack.length - 1; - if (key === lastKey) { - if (needle === lastNeedle) { - found = lastIndex !== -1 && haystack[lastIndex][COLUMN] === needle; - return lastIndex; - } - if (needle >= lastNeedle) { - low = lastIndex === -1 ? 0 : lastIndex; - } else { - high = lastIndex; - } - } - state.lastKey = key; - state.lastNeedle = needle; - return state.lastIndex = binarySearch(haystack, needle, low, high); -} - -// src/by-source.ts -function buildBySources(decoded, memos) { - const sources = memos.map(buildNullArray); - for (let i = 0; i < decoded.length; i++) { - const line = decoded[i]; - for (let j = 0; j < line.length; j++) { - const seg = line[j]; - if (seg.length === 1) continue; - const sourceIndex2 = seg[SOURCES_INDEX]; - const sourceLine = seg[SOURCE_LINE]; - const sourceColumn = seg[SOURCE_COLUMN]; - const originalSource = sources[sourceIndex2]; - const originalLine = originalSource[sourceLine] || (originalSource[sourceLine] = []); - const memo = memos[sourceIndex2]; - let index = upperBound( - originalLine, - sourceColumn, - memoizedBinarySearch(originalLine, sourceColumn, memo, sourceLine) - ); - memo.lastIndex = ++index; - insert(originalLine, index, [sourceColumn, i, seg[COLUMN]]); - } - } - return sources; -} -function insert(array, index, value) { - for (let i = array.length; i > index; i--) { - array[i] = array[i - 1]; - } - array[index] = value; -} -function buildNullArray() { - return { __proto__: null }; -} - -// src/types.ts -function parse(map) { - return typeof map === "string" ? JSON.parse(map) : map; -} - -// src/flatten-map.ts -var FlattenMap = function(map, mapUrl) { - const parsed = parse(map); - if (!("sections" in parsed)) { - return new TraceMap(parsed, mapUrl); - } - const mappings = []; - const sources = []; - const sourcesContent = []; - const names = []; - const ignoreList = []; - recurse( - parsed, - mapUrl, - mappings, - sources, - sourcesContent, - names, - ignoreList, - 0, - 0, - Infinity, - Infinity - ); - const joined = { - version: 3, - file: parsed.file, - names, - sources, - sourcesContent, - mappings, - ignoreList - }; - return presortedDecodedMap(joined); -}; -function recurse(input, mapUrl, mappings, sources, sourcesContent, names, ignoreList, lineOffset, columnOffset, stopLine, stopColumn) { - const { sections } = input; - for (let i = 0; i < sections.length; i++) { - const { map, offset } = sections[i]; - let sl = stopLine; - let sc = stopColumn; - if (i + 1 < sections.length) { - const nextOffset = sections[i + 1].offset; - sl = Math.min(stopLine, lineOffset + nextOffset.line); - if (sl === stopLine) { - sc = Math.min(stopColumn, columnOffset + nextOffset.column); - } else if (sl < stopLine) { - sc = columnOffset + nextOffset.column; - } - } - addSection( - map, - mapUrl, - mappings, - sources, - sourcesContent, - names, - ignoreList, - lineOffset + offset.line, - columnOffset + offset.column, - sl, - sc - ); - } -} -function addSection(input, mapUrl, mappings, sources, sourcesContent, names, ignoreList, lineOffset, columnOffset, stopLine, stopColumn) { - const parsed = parse(input); - if ("sections" in parsed) return recurse(...arguments); - const map = new TraceMap(parsed, mapUrl); - const sourcesOffset = sources.length; - const namesOffset = names.length; - const decoded = decodedMappings(map); - const { resolvedSources, sourcesContent: contents, ignoreList: ignores } = map; - append(sources, resolvedSources); - append(names, map.names); - if (contents) append(sourcesContent, contents); - else for (let i = 0; i < resolvedSources.length; i++) sourcesContent.push(null); - if (ignores) for (let i = 0; i < ignores.length; i++) ignoreList.push(ignores[i] + sourcesOffset); - for (let i = 0; i < decoded.length; i++) { - const lineI = lineOffset + i; - if (lineI > stopLine) return; - const out = getLine(mappings, lineI); - const cOffset = i === 0 ? columnOffset : 0; - const line = decoded[i]; - for (let j = 0; j < line.length; j++) { - const seg = line[j]; - const column = cOffset + seg[COLUMN]; - if (lineI === stopLine && column >= stopColumn) return; - if (seg.length === 1) { - out.push([column]); - continue; - } - const sourcesIndex = sourcesOffset + seg[SOURCES_INDEX]; - const sourceLine = seg[SOURCE_LINE]; - const sourceColumn = seg[SOURCE_COLUMN]; - out.push( - seg.length === 4 ? [column, sourcesIndex, sourceLine, sourceColumn] : [column, sourcesIndex, sourceLine, sourceColumn, namesOffset + seg[NAMES_INDEX]] - ); - } - } -} -function append(arr, other) { - for (let i = 0; i < other.length; i++) arr.push(other[i]); -} -function getLine(arr, index) { - for (let i = arr.length; i <= index; i++) arr[i] = []; - return arr[index]; -} - -// src/trace-mapping.ts -var LINE_GTR_ZERO = "`line` must be greater than 0 (lines start at line 1)"; -var COL_GTR_EQ_ZERO = "`column` must be greater than or equal to 0 (columns start at column 0)"; -var LEAST_UPPER_BOUND = -1; -var GREATEST_LOWER_BOUND = 1; -var TraceMap = class { - constructor(map, mapUrl) { - const isString = typeof map === "string"; - if (!isString && map._decodedMemo) return map; - const parsed = parse(map); - const { version, file, names, sourceRoot, sources, sourcesContent } = parsed; - this.version = version; - this.file = file; - this.names = names || []; - this.sourceRoot = sourceRoot; - this.sources = sources; - this.sourcesContent = sourcesContent; - this.ignoreList = parsed.ignoreList || parsed.x_google_ignoreList || void 0; - const resolve = resolver(mapUrl, sourceRoot); - this.resolvedSources = sources.map(resolve); - const { mappings } = parsed; - if (typeof mappings === "string") { - this._encoded = mappings; - this._decoded = void 0; - } else if (Array.isArray(mappings)) { - this._encoded = void 0; - this._decoded = maybeSort(mappings, isString); - } else if (parsed.sections) { - throw new Error(`TraceMap passed sectioned source map, please use FlattenMap export instead`); - } else { - throw new Error(`invalid source map: ${JSON.stringify(parsed)}`); - } - this._decodedMemo = memoizedState(); - this._bySources = void 0; - this._bySourceMemos = void 0; - } -}; -function cast(map) { - return map; -} -function encodedMappings(map) { - var _a, _b; - return (_b = (_a = cast(map))._encoded) != null ? _b : _a._encoded = encode(cast(map)._decoded); -} -function decodedMappings(map) { - var _a; - return (_a = cast(map))._decoded || (_a._decoded = decode(cast(map)._encoded)); -} -function traceSegment(map, line, column) { - const decoded = decodedMappings(map); - if (line >= decoded.length) return null; - const segments = decoded[line]; - const index = traceSegmentInternal( - segments, - cast(map)._decodedMemo, - line, - column, - GREATEST_LOWER_BOUND - ); - return index === -1 ? null : segments[index]; -} -function originalPositionFor(map, needle) { - let { line, column, bias } = needle; - line--; - if (line < 0) throw new Error(LINE_GTR_ZERO); - if (column < 0) throw new Error(COL_GTR_EQ_ZERO); - const decoded = decodedMappings(map); - if (line >= decoded.length) return OMapping(null, null, null, null); - const segments = decoded[line]; - const index = traceSegmentInternal( - segments, - cast(map)._decodedMemo, - line, - column, - bias || GREATEST_LOWER_BOUND - ); - if (index === -1) return OMapping(null, null, null, null); - const segment = segments[index]; - if (segment.length === 1) return OMapping(null, null, null, null); - const { names, resolvedSources } = map; - return OMapping( - resolvedSources[segment[SOURCES_INDEX]], - segment[SOURCE_LINE] + 1, - segment[SOURCE_COLUMN], - segment.length === 5 ? names[segment[NAMES_INDEX]] : null - ); -} -function generatedPositionFor(map, needle) { - const { source, line, column, bias } = needle; - return generatedPosition(map, source, line, column, bias || GREATEST_LOWER_BOUND, false); -} -function allGeneratedPositionsFor(map, needle) { - const { source, line, column, bias } = needle; - return generatedPosition(map, source, line, column, bias || LEAST_UPPER_BOUND, true); -} -function eachMapping(map, cb) { - const decoded = decodedMappings(map); - const { names, resolvedSources } = map; - for (let i = 0; i < decoded.length; i++) { - const line = decoded[i]; - for (let j = 0; j < line.length; j++) { - const seg = line[j]; - const generatedLine = i + 1; - const generatedColumn = seg[0]; - let source = null; - let originalLine = null; - let originalColumn = null; - let name = null; - if (seg.length !== 1) { - source = resolvedSources[seg[1]]; - originalLine = seg[2] + 1; - originalColumn = seg[3]; - } - if (seg.length === 5) name = names[seg[4]]; - cb({ - generatedLine, - generatedColumn, - source, - originalLine, - originalColumn, - name - }); - } - } -} -function sourceIndex(map, source) { - const { sources, resolvedSources } = map; - let index = sources.indexOf(source); - if (index === -1) index = resolvedSources.indexOf(source); - return index; -} -function sourceContentFor(map, source) { - const { sourcesContent } = map; - if (sourcesContent == null) return null; - const index = sourceIndex(map, source); - return index === -1 ? null : sourcesContent[index]; -} -function isIgnored(map, source) { - const { ignoreList } = map; - if (ignoreList == null) return false; - const index = sourceIndex(map, source); - return index === -1 ? false : ignoreList.includes(index); -} -function presortedDecodedMap(map, mapUrl) { - const tracer = new TraceMap(clone(map, []), mapUrl); - cast(tracer)._decoded = map.mappings; - return tracer; -} -function decodedMap(map) { - return clone(map, decodedMappings(map)); -} -function encodedMap(map) { - return clone(map, encodedMappings(map)); -} -function clone(map, mappings) { - return { - version: map.version, - file: map.file, - names: map.names, - sourceRoot: map.sourceRoot, - sources: map.sources, - sourcesContent: map.sourcesContent, - mappings, - ignoreList: map.ignoreList || map.x_google_ignoreList - }; -} -function OMapping(source, line, column, name) { - return { source, line, column, name }; -} -function GMapping(line, column) { - return { line, column }; -} -function traceSegmentInternal(segments, memo, line, column, bias) { - let index = memoizedBinarySearch(segments, column, memo, line); - if (found) { - index = (bias === LEAST_UPPER_BOUND ? upperBound : lowerBound)(segments, column, index); - } else if (bias === LEAST_UPPER_BOUND) index++; - if (index === -1 || index === segments.length) return -1; - return index; -} -function sliceGeneratedPositions(segments, memo, line, column, bias) { - let min = traceSegmentInternal(segments, memo, line, column, GREATEST_LOWER_BOUND); - if (!found && bias === LEAST_UPPER_BOUND) min++; - if (min === -1 || min === segments.length) return []; - const matchedColumn = found ? column : segments[min][COLUMN]; - if (!found) min = lowerBound(segments, matchedColumn, min); - const max = upperBound(segments, matchedColumn, min); - const result = []; - for (; min <= max; min++) { - const segment = segments[min]; - result.push(GMapping(segment[REV_GENERATED_LINE] + 1, segment[REV_GENERATED_COLUMN])); - } - return result; -} -function generatedPosition(map, source, line, column, bias, all) { - var _a; - line--; - if (line < 0) throw new Error(LINE_GTR_ZERO); - if (column < 0) throw new Error(COL_GTR_EQ_ZERO); - const { sources, resolvedSources } = map; - let sourceIndex2 = sources.indexOf(source); - if (sourceIndex2 === -1) sourceIndex2 = resolvedSources.indexOf(source); - if (sourceIndex2 === -1) return all ? [] : GMapping(null, null); - const generated = (_a = cast(map))._bySources || (_a._bySources = buildBySources( - decodedMappings(map), - cast(map)._bySourceMemos = sources.map(memoizedState) - )); - const segments = generated[sourceIndex2][line]; - if (segments == null) return all ? [] : GMapping(null, null); - const memo = cast(map)._bySourceMemos[sourceIndex2]; - if (all) return sliceGeneratedPositions(segments, memo, line, column, bias); - const index = traceSegmentInternal(segments, memo, line, column, bias); - if (index === -1) return GMapping(null, null); - const segment = segments[index]; - return GMapping(segment[REV_GENERATED_LINE] + 1, segment[REV_GENERATED_COLUMN]); -} -export { - FlattenMap as AnyMap, - FlattenMap, - GREATEST_LOWER_BOUND, - LEAST_UPPER_BOUND, - TraceMap, - allGeneratedPositionsFor, - decodedMap, - decodedMappings, - eachMapping, - encodedMap, - encodedMappings, - generatedPositionFor, - isIgnored, - originalPositionFor, - presortedDecodedMap, - sourceContentFor, - traceSegment -}; -//# sourceMappingURL=trace-mapping.mjs.map diff --git a/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs.map b/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs.map deleted file mode 100644 index a3cdb8f..0000000 --- a/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs.map +++ /dev/null @@ -1,6 +0,0 @@ -{ - "version": 3, - "sources": ["../src/trace-mapping.ts", "../src/resolve.ts", "../src/strip-filename.ts", "../src/sourcemap-segment.ts", "../src/sort.ts", "../src/binary-search.ts", "../src/by-source.ts", "../src/types.ts", "../src/flatten-map.ts"], - "mappings": "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", - "names": ["sourceIndex", "sourceIndex"] -} diff --git a/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js b/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js deleted file mode 100644 index ec7f478..0000000 --- a/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js +++ /dev/null @@ -1,570 +0,0 @@ -(function (global, factory) { - if (typeof exports === 'object' && typeof module !== 'undefined') { - factory(module, require('@jridgewell/resolve-uri'), require('@jridgewell/sourcemap-codec')); - module.exports = def(module); - } else if (typeof define === 'function' && define.amd) { - define(['module', '@jridgewell/resolve-uri', '@jridgewell/sourcemap-codec'], function(mod) { - factory.apply(this, arguments); - mod.exports = def(mod); - }); - } else { - const mod = { exports: {} }; - factory(mod, global.resolveURI, global.sourcemapCodec); - global = typeof globalThis !== 'undefined' ? globalThis : global || self; - global.traceMapping = def(mod); - } - function def(m) { return 'default' in m.exports ? m.exports.default : m.exports; } -})(this, (function (module, require_resolveURI, require_sourcemapCodec) { -"use strict"; -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __commonJS = (cb, mod) => function __require() { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; -}; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); - -// umd:@jridgewell/sourcemap-codec -var require_sourcemap_codec = __commonJS({ - "umd:@jridgewell/sourcemap-codec"(exports, module2) { - module2.exports = require_sourcemapCodec; - } -}); - -// umd:@jridgewell/resolve-uri -var require_resolve_uri = __commonJS({ - "umd:@jridgewell/resolve-uri"(exports, module2) { - module2.exports = require_resolveURI; - } -}); - -// src/trace-mapping.ts -var trace_mapping_exports = {}; -__export(trace_mapping_exports, { - AnyMap: () => FlattenMap, - FlattenMap: () => FlattenMap, - GREATEST_LOWER_BOUND: () => GREATEST_LOWER_BOUND, - LEAST_UPPER_BOUND: () => LEAST_UPPER_BOUND, - TraceMap: () => TraceMap, - allGeneratedPositionsFor: () => allGeneratedPositionsFor, - decodedMap: () => decodedMap, - decodedMappings: () => decodedMappings, - eachMapping: () => eachMapping, - encodedMap: () => encodedMap, - encodedMappings: () => encodedMappings, - generatedPositionFor: () => generatedPositionFor, - isIgnored: () => isIgnored, - originalPositionFor: () => originalPositionFor, - presortedDecodedMap: () => presortedDecodedMap, - sourceContentFor: () => sourceContentFor, - traceSegment: () => traceSegment -}); -module.exports = __toCommonJS(trace_mapping_exports); -var import_sourcemap_codec = __toESM(require_sourcemap_codec()); - -// src/resolve.ts -var import_resolve_uri = __toESM(require_resolve_uri()); - -// src/strip-filename.ts -function stripFilename(path) { - if (!path) return ""; - const index = path.lastIndexOf("/"); - return path.slice(0, index + 1); -} - -// src/resolve.ts -function resolver(mapUrl, sourceRoot) { - const from = stripFilename(mapUrl); - const prefix = sourceRoot ? sourceRoot + "/" : ""; - return (source) => (0, import_resolve_uri.default)(prefix + (source || ""), from); -} - -// src/sourcemap-segment.ts -var COLUMN = 0; -var SOURCES_INDEX = 1; -var SOURCE_LINE = 2; -var SOURCE_COLUMN = 3; -var NAMES_INDEX = 4; -var REV_GENERATED_LINE = 1; -var REV_GENERATED_COLUMN = 2; - -// src/sort.ts -function maybeSort(mappings, owned) { - const unsortedIndex = nextUnsortedSegmentLine(mappings, 0); - if (unsortedIndex === mappings.length) return mappings; - if (!owned) mappings = mappings.slice(); - for (let i = unsortedIndex; i < mappings.length; i = nextUnsortedSegmentLine(mappings, i + 1)) { - mappings[i] = sortSegments(mappings[i], owned); - } - return mappings; -} -function nextUnsortedSegmentLine(mappings, start) { - for (let i = start; i < mappings.length; i++) { - if (!isSorted(mappings[i])) return i; - } - return mappings.length; -} -function isSorted(line) { - for (let j = 1; j < line.length; j++) { - if (line[j][COLUMN] < line[j - 1][COLUMN]) { - return false; - } - } - return true; -} -function sortSegments(line, owned) { - if (!owned) line = line.slice(); - return line.sort(sortComparator); -} -function sortComparator(a, b) { - return a[COLUMN] - b[COLUMN]; -} - -// src/binary-search.ts -var found = false; -function binarySearch(haystack, needle, low, high) { - while (low <= high) { - const mid = low + (high - low >> 1); - const cmp = haystack[mid][COLUMN] - needle; - if (cmp === 0) { - found = true; - return mid; - } - if (cmp < 0) { - low = mid + 1; - } else { - high = mid - 1; - } - } - found = false; - return low - 1; -} -function upperBound(haystack, needle, index) { - for (let i = index + 1; i < haystack.length; index = i++) { - if (haystack[i][COLUMN] !== needle) break; - } - return index; -} -function lowerBound(haystack, needle, index) { - for (let i = index - 1; i >= 0; index = i--) { - if (haystack[i][COLUMN] !== needle) break; - } - return index; -} -function memoizedState() { - return { - lastKey: -1, - lastNeedle: -1, - lastIndex: -1 - }; -} -function memoizedBinarySearch(haystack, needle, state, key) { - const { lastKey, lastNeedle, lastIndex } = state; - let low = 0; - let high = haystack.length - 1; - if (key === lastKey) { - if (needle === lastNeedle) { - found = lastIndex !== -1 && haystack[lastIndex][COLUMN] === needle; - return lastIndex; - } - if (needle >= lastNeedle) { - low = lastIndex === -1 ? 0 : lastIndex; - } else { - high = lastIndex; - } - } - state.lastKey = key; - state.lastNeedle = needle; - return state.lastIndex = binarySearch(haystack, needle, low, high); -} - -// src/by-source.ts -function buildBySources(decoded, memos) { - const sources = memos.map(buildNullArray); - for (let i = 0; i < decoded.length; i++) { - const line = decoded[i]; - for (let j = 0; j < line.length; j++) { - const seg = line[j]; - if (seg.length === 1) continue; - const sourceIndex2 = seg[SOURCES_INDEX]; - const sourceLine = seg[SOURCE_LINE]; - const sourceColumn = seg[SOURCE_COLUMN]; - const originalSource = sources[sourceIndex2]; - const originalLine = originalSource[sourceLine] || (originalSource[sourceLine] = []); - const memo = memos[sourceIndex2]; - let index = upperBound( - originalLine, - sourceColumn, - memoizedBinarySearch(originalLine, sourceColumn, memo, sourceLine) - ); - memo.lastIndex = ++index; - insert(originalLine, index, [sourceColumn, i, seg[COLUMN]]); - } - } - return sources; -} -function insert(array, index, value) { - for (let i = array.length; i > index; i--) { - array[i] = array[i - 1]; - } - array[index] = value; -} -function buildNullArray() { - return { __proto__: null }; -} - -// src/types.ts -function parse(map) { - return typeof map === "string" ? JSON.parse(map) : map; -} - -// src/flatten-map.ts -var FlattenMap = function(map, mapUrl) { - const parsed = parse(map); - if (!("sections" in parsed)) { - return new TraceMap(parsed, mapUrl); - } - const mappings = []; - const sources = []; - const sourcesContent = []; - const names = []; - const ignoreList = []; - recurse( - parsed, - mapUrl, - mappings, - sources, - sourcesContent, - names, - ignoreList, - 0, - 0, - Infinity, - Infinity - ); - const joined = { - version: 3, - file: parsed.file, - names, - sources, - sourcesContent, - mappings, - ignoreList - }; - return presortedDecodedMap(joined); -}; -function recurse(input, mapUrl, mappings, sources, sourcesContent, names, ignoreList, lineOffset, columnOffset, stopLine, stopColumn) { - const { sections } = input; - for (let i = 0; i < sections.length; i++) { - const { map, offset } = sections[i]; - let sl = stopLine; - let sc = stopColumn; - if (i + 1 < sections.length) { - const nextOffset = sections[i + 1].offset; - sl = Math.min(stopLine, lineOffset + nextOffset.line); - if (sl === stopLine) { - sc = Math.min(stopColumn, columnOffset + nextOffset.column); - } else if (sl < stopLine) { - sc = columnOffset + nextOffset.column; - } - } - addSection( - map, - mapUrl, - mappings, - sources, - sourcesContent, - names, - ignoreList, - lineOffset + offset.line, - columnOffset + offset.column, - sl, - sc - ); - } -} -function addSection(input, mapUrl, mappings, sources, sourcesContent, names, ignoreList, lineOffset, columnOffset, stopLine, stopColumn) { - const parsed = parse(input); - if ("sections" in parsed) return recurse(...arguments); - const map = new TraceMap(parsed, mapUrl); - const sourcesOffset = sources.length; - const namesOffset = names.length; - const decoded = decodedMappings(map); - const { resolvedSources, sourcesContent: contents, ignoreList: ignores } = map; - append(sources, resolvedSources); - append(names, map.names); - if (contents) append(sourcesContent, contents); - else for (let i = 0; i < resolvedSources.length; i++) sourcesContent.push(null); - if (ignores) for (let i = 0; i < ignores.length; i++) ignoreList.push(ignores[i] + sourcesOffset); - for (let i = 0; i < decoded.length; i++) { - const lineI = lineOffset + i; - if (lineI > stopLine) return; - const out = getLine(mappings, lineI); - const cOffset = i === 0 ? columnOffset : 0; - const line = decoded[i]; - for (let j = 0; j < line.length; j++) { - const seg = line[j]; - const column = cOffset + seg[COLUMN]; - if (lineI === stopLine && column >= stopColumn) return; - if (seg.length === 1) { - out.push([column]); - continue; - } - const sourcesIndex = sourcesOffset + seg[SOURCES_INDEX]; - const sourceLine = seg[SOURCE_LINE]; - const sourceColumn = seg[SOURCE_COLUMN]; - out.push( - seg.length === 4 ? [column, sourcesIndex, sourceLine, sourceColumn] : [column, sourcesIndex, sourceLine, sourceColumn, namesOffset + seg[NAMES_INDEX]] - ); - } - } -} -function append(arr, other) { - for (let i = 0; i < other.length; i++) arr.push(other[i]); -} -function getLine(arr, index) { - for (let i = arr.length; i <= index; i++) arr[i] = []; - return arr[index]; -} - -// src/trace-mapping.ts -var LINE_GTR_ZERO = "`line` must be greater than 0 (lines start at line 1)"; -var COL_GTR_EQ_ZERO = "`column` must be greater than or equal to 0 (columns start at column 0)"; -var LEAST_UPPER_BOUND = -1; -var GREATEST_LOWER_BOUND = 1; -var TraceMap = class { - constructor(map, mapUrl) { - const isString = typeof map === "string"; - if (!isString && map._decodedMemo) return map; - const parsed = parse(map); - const { version, file, names, sourceRoot, sources, sourcesContent } = parsed; - this.version = version; - this.file = file; - this.names = names || []; - this.sourceRoot = sourceRoot; - this.sources = sources; - this.sourcesContent = sourcesContent; - this.ignoreList = parsed.ignoreList || parsed.x_google_ignoreList || void 0; - const resolve = resolver(mapUrl, sourceRoot); - this.resolvedSources = sources.map(resolve); - const { mappings } = parsed; - if (typeof mappings === "string") { - this._encoded = mappings; - this._decoded = void 0; - } else if (Array.isArray(mappings)) { - this._encoded = void 0; - this._decoded = maybeSort(mappings, isString); - } else if (parsed.sections) { - throw new Error(`TraceMap passed sectioned source map, please use FlattenMap export instead`); - } else { - throw new Error(`invalid source map: ${JSON.stringify(parsed)}`); - } - this._decodedMemo = memoizedState(); - this._bySources = void 0; - this._bySourceMemos = void 0; - } -}; -function cast(map) { - return map; -} -function encodedMappings(map) { - var _a, _b; - return (_b = (_a = cast(map))._encoded) != null ? _b : _a._encoded = (0, import_sourcemap_codec.encode)(cast(map)._decoded); -} -function decodedMappings(map) { - var _a; - return (_a = cast(map))._decoded || (_a._decoded = (0, import_sourcemap_codec.decode)(cast(map)._encoded)); -} -function traceSegment(map, line, column) { - const decoded = decodedMappings(map); - if (line >= decoded.length) return null; - const segments = decoded[line]; - const index = traceSegmentInternal( - segments, - cast(map)._decodedMemo, - line, - column, - GREATEST_LOWER_BOUND - ); - return index === -1 ? null : segments[index]; -} -function originalPositionFor(map, needle) { - let { line, column, bias } = needle; - line--; - if (line < 0) throw new Error(LINE_GTR_ZERO); - if (column < 0) throw new Error(COL_GTR_EQ_ZERO); - const decoded = decodedMappings(map); - if (line >= decoded.length) return OMapping(null, null, null, null); - const segments = decoded[line]; - const index = traceSegmentInternal( - segments, - cast(map)._decodedMemo, - line, - column, - bias || GREATEST_LOWER_BOUND - ); - if (index === -1) return OMapping(null, null, null, null); - const segment = segments[index]; - if (segment.length === 1) return OMapping(null, null, null, null); - const { names, resolvedSources } = map; - return OMapping( - resolvedSources[segment[SOURCES_INDEX]], - segment[SOURCE_LINE] + 1, - segment[SOURCE_COLUMN], - segment.length === 5 ? names[segment[NAMES_INDEX]] : null - ); -} -function generatedPositionFor(map, needle) { - const { source, line, column, bias } = needle; - return generatedPosition(map, source, line, column, bias || GREATEST_LOWER_BOUND, false); -} -function allGeneratedPositionsFor(map, needle) { - const { source, line, column, bias } = needle; - return generatedPosition(map, source, line, column, bias || LEAST_UPPER_BOUND, true); -} -function eachMapping(map, cb) { - const decoded = decodedMappings(map); - const { names, resolvedSources } = map; - for (let i = 0; i < decoded.length; i++) { - const line = decoded[i]; - for (let j = 0; j < line.length; j++) { - const seg = line[j]; - const generatedLine = i + 1; - const generatedColumn = seg[0]; - let source = null; - let originalLine = null; - let originalColumn = null; - let name = null; - if (seg.length !== 1) { - source = resolvedSources[seg[1]]; - originalLine = seg[2] + 1; - originalColumn = seg[3]; - } - if (seg.length === 5) name = names[seg[4]]; - cb({ - generatedLine, - generatedColumn, - source, - originalLine, - originalColumn, - name - }); - } - } -} -function sourceIndex(map, source) { - const { sources, resolvedSources } = map; - let index = sources.indexOf(source); - if (index === -1) index = resolvedSources.indexOf(source); - return index; -} -function sourceContentFor(map, source) { - const { sourcesContent } = map; - if (sourcesContent == null) return null; - const index = sourceIndex(map, source); - return index === -1 ? null : sourcesContent[index]; -} -function isIgnored(map, source) { - const { ignoreList } = map; - if (ignoreList == null) return false; - const index = sourceIndex(map, source); - return index === -1 ? false : ignoreList.includes(index); -} -function presortedDecodedMap(map, mapUrl) { - const tracer = new TraceMap(clone(map, []), mapUrl); - cast(tracer)._decoded = map.mappings; - return tracer; -} -function decodedMap(map) { - return clone(map, decodedMappings(map)); -} -function encodedMap(map) { - return clone(map, encodedMappings(map)); -} -function clone(map, mappings) { - return { - version: map.version, - file: map.file, - names: map.names, - sourceRoot: map.sourceRoot, - sources: map.sources, - sourcesContent: map.sourcesContent, - mappings, - ignoreList: map.ignoreList || map.x_google_ignoreList - }; -} -function OMapping(source, line, column, name) { - return { source, line, column, name }; -} -function GMapping(line, column) { - return { line, column }; -} -function traceSegmentInternal(segments, memo, line, column, bias) { - let index = memoizedBinarySearch(segments, column, memo, line); - if (found) { - index = (bias === LEAST_UPPER_BOUND ? upperBound : lowerBound)(segments, column, index); - } else if (bias === LEAST_UPPER_BOUND) index++; - if (index === -1 || index === segments.length) return -1; - return index; -} -function sliceGeneratedPositions(segments, memo, line, column, bias) { - let min = traceSegmentInternal(segments, memo, line, column, GREATEST_LOWER_BOUND); - if (!found && bias === LEAST_UPPER_BOUND) min++; - if (min === -1 || min === segments.length) return []; - const matchedColumn = found ? column : segments[min][COLUMN]; - if (!found) min = lowerBound(segments, matchedColumn, min); - const max = upperBound(segments, matchedColumn, min); - const result = []; - for (; min <= max; min++) { - const segment = segments[min]; - result.push(GMapping(segment[REV_GENERATED_LINE] + 1, segment[REV_GENERATED_COLUMN])); - } - return result; -} -function generatedPosition(map, source, line, column, bias, all) { - var _a; - line--; - if (line < 0) throw new Error(LINE_GTR_ZERO); - if (column < 0) throw new Error(COL_GTR_EQ_ZERO); - const { sources, resolvedSources } = map; - let sourceIndex2 = sources.indexOf(source); - if (sourceIndex2 === -1) sourceIndex2 = resolvedSources.indexOf(source); - if (sourceIndex2 === -1) return all ? [] : GMapping(null, null); - const generated = (_a = cast(map))._bySources || (_a._bySources = buildBySources( - decodedMappings(map), - cast(map)._bySourceMemos = sources.map(memoizedState) - )); - const segments = generated[sourceIndex2][line]; - if (segments == null) return all ? [] : GMapping(null, null); - const memo = cast(map)._bySourceMemos[sourceIndex2]; - if (all) return sliceGeneratedPositions(segments, memo, line, column, bias); - const index = traceSegmentInternal(segments, memo, line, column, bias); - if (index === -1) return GMapping(null, null); - const segment = segments[index]; - return GMapping(segment[REV_GENERATED_LINE] + 1, segment[REV_GENERATED_COLUMN]); -} -})); -//# sourceMappingURL=trace-mapping.umd.js.map diff --git a/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js.map b/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js.map deleted file mode 100644 index 5794325..0000000 --- a/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js.map +++ /dev/null @@ -1,6 +0,0 @@ -{ - "version": 3, - "sources": ["umd:@jridgewell/sourcemap-codec", "umd:@jridgewell/resolve-uri", "../src/trace-mapping.ts", "../src/resolve.ts", "../src/strip-filename.ts", "../src/sourcemap-segment.ts", "../src/sort.ts", "../src/binary-search.ts", "../src/by-source.ts", "../src/types.ts", "../src/flatten-map.ts"], - "mappings": "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", - "names": ["module", "module", "resolveUri", "sourceIndex", "sourceIndex"] -} diff --git a/node_modules/@jridgewell/trace-mapping/package.json b/node_modules/@jridgewell/trace-mapping/package.json deleted file mode 100644 index 74bb8c3..0000000 --- a/node_modules/@jridgewell/trace-mapping/package.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "name": "@jridgewell/trace-mapping", - "version": "0.3.30", - "description": "Trace the original position through a source map", - "keywords": [ - "source", - "map" - ], - "main": "dist/trace-mapping.umd.js", - "module": "dist/trace-mapping.mjs", - "types": "types/trace-mapping.d.cts", - "files": [ - "dist", - "src", - "types" - ], - "exports": { - ".": [ - { - "import": { - "types": "./types/trace-mapping.d.mts", - "default": "./dist/trace-mapping.mjs" - }, - "default": { - "types": "./types/trace-mapping.d.cts", - "default": "./dist/trace-mapping.umd.js" - } - }, - "./dist/trace-mapping.umd.js" - ], - "./package.json": "./package.json" - }, - "scripts": { - "benchmark": "run-s build:code benchmark:*", - "benchmark:install": "cd benchmark && npm install", - "benchmark:only": "node --expose-gc benchmark/index.js", - "build": "run-s -n build:code build:types", - "build:code": "node ../../esbuild.mjs trace-mapping.ts", - "build:types": "run-s build:types:force build:types:emit build:types:mts", - "build:types:force": "rimraf tsconfig.build.tsbuildinfo", - "build:types:emit": "tsc --project tsconfig.build.json", - "build:types:mts": "node ../../mts-types.mjs", - "clean": "run-s -n clean:code clean:types", - "clean:code": "tsc --build --clean tsconfig.build.json", - "clean:types": "rimraf dist types", - "test": "run-s -n test:types test:only test:format", - "test:format": "prettier --check '{src,test}/**/*.ts'", - "test:only": "mocha", - "test:types": "eslint '{src,test}/**/*.ts'", - "lint": "run-s -n lint:types lint:format", - "lint:format": "npm run test:format -- --write", - "lint:types": "npm run test:types -- --fix", - "prepublishOnly": "npm run-s -n build test" - }, - "homepage": "https://github.com/jridgewell/sourcemaps/tree/main/packages/trace-mapping", - "repository": { - "type": "git", - "url": "git+https://github.com/jridgewell/sourcemaps.git", - "directory": "packages/trace-mapping" - }, - "author": "Justin Ridgewell ", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } -} diff --git a/node_modules/@jridgewell/trace-mapping/src/binary-search.ts b/node_modules/@jridgewell/trace-mapping/src/binary-search.ts deleted file mode 100644 index c1144ad..0000000 --- a/node_modules/@jridgewell/trace-mapping/src/binary-search.ts +++ /dev/null @@ -1,115 +0,0 @@ -import type { SourceMapSegment, ReverseSegment } from './sourcemap-segment'; -import { COLUMN } from './sourcemap-segment'; - -export type MemoState = { - lastKey: number; - lastNeedle: number; - lastIndex: number; -}; - -export let found = false; - -/** - * A binary search implementation that returns the index if a match is found. - * If no match is found, then the left-index (the index associated with the item that comes just - * before the desired index) is returned. To maintain proper sort order, a splice would happen at - * the next index: - * - * ```js - * const array = [1, 3]; - * const needle = 2; - * const index = binarySearch(array, needle, (item, needle) => item - needle); - * - * assert.equal(index, 0); - * array.splice(index + 1, 0, needle); - * assert.deepEqual(array, [1, 2, 3]); - * ``` - */ -export function binarySearch( - haystack: SourceMapSegment[] | ReverseSegment[], - needle: number, - low: number, - high: number, -): number { - while (low <= high) { - const mid = low + ((high - low) >> 1); - const cmp = haystack[mid][COLUMN] - needle; - - if (cmp === 0) { - found = true; - return mid; - } - - if (cmp < 0) { - low = mid + 1; - } else { - high = mid - 1; - } - } - - found = false; - return low - 1; -} - -export function upperBound( - haystack: SourceMapSegment[] | ReverseSegment[], - needle: number, - index: number, -): number { - for (let i = index + 1; i < haystack.length; index = i++) { - if (haystack[i][COLUMN] !== needle) break; - } - return index; -} - -export function lowerBound( - haystack: SourceMapSegment[] | ReverseSegment[], - needle: number, - index: number, -): number { - for (let i = index - 1; i >= 0; index = i--) { - if (haystack[i][COLUMN] !== needle) break; - } - return index; -} - -export function memoizedState(): MemoState { - return { - lastKey: -1, - lastNeedle: -1, - lastIndex: -1, - }; -} - -/** - * This overly complicated beast is just to record the last tested line/column and the resulting - * index, allowing us to skip a few tests if mappings are monotonically increasing. - */ -export function memoizedBinarySearch( - haystack: SourceMapSegment[] | ReverseSegment[], - needle: number, - state: MemoState, - key: number, -): number { - const { lastKey, lastNeedle, lastIndex } = state; - - let low = 0; - let high = haystack.length - 1; - if (key === lastKey) { - if (needle === lastNeedle) { - found = lastIndex !== -1 && haystack[lastIndex][COLUMN] === needle; - return lastIndex; - } - - if (needle >= lastNeedle) { - // lastIndex may be -1 if the previous needle was not found. - low = lastIndex === -1 ? 0 : lastIndex; - } else { - high = lastIndex; - } - } - state.lastKey = key; - state.lastNeedle = needle; - - return (state.lastIndex = binarySearch(haystack, needle, low, high)); -} diff --git a/node_modules/@jridgewell/trace-mapping/src/by-source.ts b/node_modules/@jridgewell/trace-mapping/src/by-source.ts deleted file mode 100644 index 2af1cf0..0000000 --- a/node_modules/@jridgewell/trace-mapping/src/by-source.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { COLUMN, SOURCES_INDEX, SOURCE_LINE, SOURCE_COLUMN } from './sourcemap-segment'; -import { memoizedBinarySearch, upperBound } from './binary-search'; - -import type { ReverseSegment, SourceMapSegment } from './sourcemap-segment'; -import type { MemoState } from './binary-search'; - -export type Source = { - __proto__: null; - [line: number]: Exclude[]; -}; - -// Rebuilds the original source files, with mappings that are ordered by source line/column instead -// of generated line/column. -export default function buildBySources( - decoded: readonly SourceMapSegment[][], - memos: MemoState[], -): Source[] { - const sources: Source[] = memos.map(buildNullArray); - - for (let i = 0; i < decoded.length; i++) { - const line = decoded[i]; - for (let j = 0; j < line.length; j++) { - const seg = line[j]; - if (seg.length === 1) continue; - - const sourceIndex = seg[SOURCES_INDEX]; - const sourceLine = seg[SOURCE_LINE]; - const sourceColumn = seg[SOURCE_COLUMN]; - const originalSource = sources[sourceIndex]; - const originalLine = (originalSource[sourceLine] ||= []); - const memo = memos[sourceIndex]; - - // The binary search either found a match, or it found the left-index just before where the - // segment should go. Either way, we want to insert after that. And there may be multiple - // generated segments associated with an original location, so there may need to move several - // indexes before we find where we need to insert. - let index = upperBound( - originalLine, - sourceColumn, - memoizedBinarySearch(originalLine, sourceColumn, memo, sourceLine), - ); - - memo.lastIndex = ++index; - insert(originalLine, index, [sourceColumn, i, seg[COLUMN]]); - } - } - - return sources; -} - -function insert(array: T[], index: number, value: T) { - for (let i = array.length; i > index; i--) { - array[i] = array[i - 1]; - } - array[index] = value; -} - -// Null arrays allow us to use ordered index keys without actually allocating contiguous memory like -// a real array. We use a null-prototype object to avoid prototype pollution and deoptimizations. -// Numeric properties on objects are magically sorted in ascending order by the engine regardless of -// the insertion order. So, by setting any numeric keys, even out of order, we'll get ascending -// order when iterating with for-in. -function buildNullArray(): T { - return { __proto__: null } as T; -} diff --git a/node_modules/@jridgewell/trace-mapping/src/flatten-map.ts b/node_modules/@jridgewell/trace-mapping/src/flatten-map.ts deleted file mode 100644 index 61ac40c..0000000 --- a/node_modules/@jridgewell/trace-mapping/src/flatten-map.ts +++ /dev/null @@ -1,192 +0,0 @@ -import { TraceMap, presortedDecodedMap, decodedMappings } from './trace-mapping'; -import { - COLUMN, - SOURCES_INDEX, - SOURCE_LINE, - SOURCE_COLUMN, - NAMES_INDEX, -} from './sourcemap-segment'; -import { parse } from './types'; - -import type { - DecodedSourceMap, - DecodedSourceMapXInput, - EncodedSourceMapXInput, - SectionedSourceMapXInput, - SectionedSourceMapInput, - SectionXInput, - Ro, -} from './types'; -import type { SourceMapSegment } from './sourcemap-segment'; - -type FlattenMap = { - new (map: Ro, mapUrl?: string | null): TraceMap; - (map: Ro, mapUrl?: string | null): TraceMap; -}; - -export const FlattenMap: FlattenMap = function (map, mapUrl) { - const parsed = parse(map as SectionedSourceMapInput); - - if (!('sections' in parsed)) { - return new TraceMap(parsed as DecodedSourceMapXInput | EncodedSourceMapXInput, mapUrl); - } - - const mappings: SourceMapSegment[][] = []; - const sources: string[] = []; - const sourcesContent: (string | null)[] = []; - const names: string[] = []; - const ignoreList: number[] = []; - - recurse( - parsed, - mapUrl, - mappings, - sources, - sourcesContent, - names, - ignoreList, - 0, - 0, - Infinity, - Infinity, - ); - - const joined: DecodedSourceMap = { - version: 3, - file: parsed.file, - names, - sources, - sourcesContent, - mappings, - ignoreList, - }; - - return presortedDecodedMap(joined); -} as FlattenMap; - -function recurse( - input: SectionedSourceMapXInput, - mapUrl: string | null | undefined, - mappings: SourceMapSegment[][], - sources: string[], - sourcesContent: (string | null)[], - names: string[], - ignoreList: number[], - lineOffset: number, - columnOffset: number, - stopLine: number, - stopColumn: number, -) { - const { sections } = input; - for (let i = 0; i < sections.length; i++) { - const { map, offset } = sections[i]; - - let sl = stopLine; - let sc = stopColumn; - if (i + 1 < sections.length) { - const nextOffset = sections[i + 1].offset; - sl = Math.min(stopLine, lineOffset + nextOffset.line); - - if (sl === stopLine) { - sc = Math.min(stopColumn, columnOffset + nextOffset.column); - } else if (sl < stopLine) { - sc = columnOffset + nextOffset.column; - } - } - - addSection( - map, - mapUrl, - mappings, - sources, - sourcesContent, - names, - ignoreList, - lineOffset + offset.line, - columnOffset + offset.column, - sl, - sc, - ); - } -} - -function addSection( - input: SectionXInput['map'], - mapUrl: string | null | undefined, - mappings: SourceMapSegment[][], - sources: string[], - sourcesContent: (string | null)[], - names: string[], - ignoreList: number[], - lineOffset: number, - columnOffset: number, - stopLine: number, - stopColumn: number, -) { - const parsed = parse(input); - if ('sections' in parsed) return recurse(...(arguments as unknown as Parameters)); - - const map = new TraceMap(parsed, mapUrl); - const sourcesOffset = sources.length; - const namesOffset = names.length; - const decoded = decodedMappings(map); - const { resolvedSources, sourcesContent: contents, ignoreList: ignores } = map; - - append(sources, resolvedSources); - append(names, map.names); - - if (contents) append(sourcesContent, contents); - else for (let i = 0; i < resolvedSources.length; i++) sourcesContent.push(null); - - if (ignores) for (let i = 0; i < ignores.length; i++) ignoreList.push(ignores[i] + sourcesOffset); - - for (let i = 0; i < decoded.length; i++) { - const lineI = lineOffset + i; - - // We can only add so many lines before we step into the range that the next section's map - // controls. When we get to the last line, then we'll start checking the segments to see if - // they've crossed into the column range. But it may not have any columns that overstep, so we - // still need to check that we don't overstep lines, too. - if (lineI > stopLine) return; - - // The out line may already exist in mappings (if we're continuing the line started by a - // previous section). Or, we may have jumped ahead several lines to start this section. - const out = getLine(mappings, lineI); - // On the 0th loop, the section's column offset shifts us forward. On all other lines (since the - // map can be multiple lines), it doesn't. - const cOffset = i === 0 ? columnOffset : 0; - - const line = decoded[i]; - for (let j = 0; j < line.length; j++) { - const seg = line[j]; - const column = cOffset + seg[COLUMN]; - - // If this segment steps into the column range that the next section's map controls, we need - // to stop early. - if (lineI === stopLine && column >= stopColumn) return; - - if (seg.length === 1) { - out.push([column]); - continue; - } - - const sourcesIndex = sourcesOffset + seg[SOURCES_INDEX]; - const sourceLine = seg[SOURCE_LINE]; - const sourceColumn = seg[SOURCE_COLUMN]; - out.push( - seg.length === 4 - ? [column, sourcesIndex, sourceLine, sourceColumn] - : [column, sourcesIndex, sourceLine, sourceColumn, namesOffset + seg[NAMES_INDEX]], - ); - } - } -} - -function append(arr: T[], other: T[]) { - for (let i = 0; i < other.length; i++) arr.push(other[i]); -} - -function getLine(arr: T[][], index: number): T[] { - for (let i = arr.length; i <= index; i++) arr[i] = []; - return arr[index]; -} diff --git a/node_modules/@jridgewell/trace-mapping/src/resolve.ts b/node_modules/@jridgewell/trace-mapping/src/resolve.ts deleted file mode 100644 index 30bfa3b..0000000 --- a/node_modules/@jridgewell/trace-mapping/src/resolve.ts +++ /dev/null @@ -1,16 +0,0 @@ -import resolveUri from '@jridgewell/resolve-uri'; -import stripFilename from './strip-filename'; - -type Resolve = (source: string | null) => string; -export default function resolver( - mapUrl: string | null | undefined, - sourceRoot: string | undefined, -): Resolve { - const from = stripFilename(mapUrl); - // The sourceRoot is always treated as a directory, if it's not empty. - // https://github.com/mozilla/source-map/blob/8cb3ee57/lib/util.js#L327 - // https://github.com/chromium/chromium/blob/da4adbb3/third_party/blink/renderer/devtools/front_end/sdk/SourceMap.js#L400-L401 - const prefix = sourceRoot ? sourceRoot + '/' : ''; - - return (source) => resolveUri(prefix + (source || ''), from); -} diff --git a/node_modules/@jridgewell/trace-mapping/src/sort.ts b/node_modules/@jridgewell/trace-mapping/src/sort.ts deleted file mode 100644 index 61213c8..0000000 --- a/node_modules/@jridgewell/trace-mapping/src/sort.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { COLUMN } from './sourcemap-segment'; - -import type { SourceMapSegment } from './sourcemap-segment'; - -export default function maybeSort( - mappings: SourceMapSegment[][], - owned: boolean, -): SourceMapSegment[][] { - const unsortedIndex = nextUnsortedSegmentLine(mappings, 0); - if (unsortedIndex === mappings.length) return mappings; - - // If we own the array (meaning we parsed it from JSON), then we're free to directly mutate it. If - // not, we do not want to modify the consumer's input array. - if (!owned) mappings = mappings.slice(); - - for (let i = unsortedIndex; i < mappings.length; i = nextUnsortedSegmentLine(mappings, i + 1)) { - mappings[i] = sortSegments(mappings[i], owned); - } - return mappings; -} - -function nextUnsortedSegmentLine(mappings: SourceMapSegment[][], start: number): number { - for (let i = start; i < mappings.length; i++) { - if (!isSorted(mappings[i])) return i; - } - return mappings.length; -} - -function isSorted(line: SourceMapSegment[]): boolean { - for (let j = 1; j < line.length; j++) { - if (line[j][COLUMN] < line[j - 1][COLUMN]) { - return false; - } - } - return true; -} - -function sortSegments(line: SourceMapSegment[], owned: boolean): SourceMapSegment[] { - if (!owned) line = line.slice(); - return line.sort(sortComparator); -} - -function sortComparator(a: SourceMapSegment, b: SourceMapSegment): number { - return a[COLUMN] - b[COLUMN]; -} diff --git a/node_modules/@jridgewell/trace-mapping/src/sourcemap-segment.ts b/node_modules/@jridgewell/trace-mapping/src/sourcemap-segment.ts deleted file mode 100644 index 94f1b6a..0000000 --- a/node_modules/@jridgewell/trace-mapping/src/sourcemap-segment.ts +++ /dev/null @@ -1,23 +0,0 @@ -type GeneratedColumn = number; -type SourcesIndex = number; -type SourceLine = number; -type SourceColumn = number; -type NamesIndex = number; - -type GeneratedLine = number; - -export type SourceMapSegment = - | [GeneratedColumn] - | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn] - | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn, NamesIndex]; - -export type ReverseSegment = [SourceColumn, GeneratedLine, GeneratedColumn]; - -export const COLUMN = 0; -export const SOURCES_INDEX = 1; -export const SOURCE_LINE = 2; -export const SOURCE_COLUMN = 3; -export const NAMES_INDEX = 4; - -export const REV_GENERATED_LINE = 1; -export const REV_GENERATED_COLUMN = 2; diff --git a/node_modules/@jridgewell/trace-mapping/src/strip-filename.ts b/node_modules/@jridgewell/trace-mapping/src/strip-filename.ts deleted file mode 100644 index 2c88980..0000000 --- a/node_modules/@jridgewell/trace-mapping/src/strip-filename.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Removes everything after the last "/", but leaves the slash. - */ -export default function stripFilename(path: string | undefined | null): string { - if (!path) return ''; - const index = path.lastIndexOf('/'); - return path.slice(0, index + 1); -} diff --git a/node_modules/@jridgewell/trace-mapping/src/trace-mapping.ts b/node_modules/@jridgewell/trace-mapping/src/trace-mapping.ts deleted file mode 100644 index dea4c6c..0000000 --- a/node_modules/@jridgewell/trace-mapping/src/trace-mapping.ts +++ /dev/null @@ -1,504 +0,0 @@ -import { encode, decode } from '@jridgewell/sourcemap-codec'; - -import resolver from './resolve'; -import maybeSort from './sort'; -import buildBySources from './by-source'; -import { - memoizedState, - memoizedBinarySearch, - upperBound, - lowerBound, - found as bsFound, -} from './binary-search'; -import { - COLUMN, - SOURCES_INDEX, - SOURCE_LINE, - SOURCE_COLUMN, - NAMES_INDEX, - REV_GENERATED_LINE, - REV_GENERATED_COLUMN, -} from './sourcemap-segment'; -import { parse } from './types'; - -import type { SourceMapSegment, ReverseSegment } from './sourcemap-segment'; -import type { - SourceMapV3, - DecodedSourceMap, - EncodedSourceMap, - InvalidOriginalMapping, - OriginalMapping, - InvalidGeneratedMapping, - GeneratedMapping, - SourceMapInput, - Needle, - SourceNeedle, - SourceMap, - EachMapping, - Bias, - XInput, - SectionedSourceMap, - Ro, -} from './types'; -import type { Source } from './by-source'; -import type { MemoState } from './binary-search'; - -export type { SourceMapSegment } from './sourcemap-segment'; -export type { - SourceMap, - DecodedSourceMap, - EncodedSourceMap, - Section, - SectionedSourceMap, - SourceMapV3, - Bias, - EachMapping, - GeneratedMapping, - InvalidGeneratedMapping, - InvalidOriginalMapping, - Needle, - OriginalMapping, - OriginalMapping as Mapping, - SectionedSourceMapInput, - SourceMapInput, - SourceNeedle, - XInput, - EncodedSourceMapXInput, - DecodedSourceMapXInput, - SectionedSourceMapXInput, - SectionXInput, -} from './types'; - -interface PublicMap { - _encoded: TraceMap['_encoded']; - _decoded: TraceMap['_decoded']; - _decodedMemo: TraceMap['_decodedMemo']; - _bySources: TraceMap['_bySources']; - _bySourceMemos: TraceMap['_bySourceMemos']; -} - -const LINE_GTR_ZERO = '`line` must be greater than 0 (lines start at line 1)'; -const COL_GTR_EQ_ZERO = '`column` must be greater than or equal to 0 (columns start at column 0)'; - -export const LEAST_UPPER_BOUND = -1; -export const GREATEST_LOWER_BOUND = 1; - -export { FlattenMap, FlattenMap as AnyMap } from './flatten-map'; - -export class TraceMap implements SourceMap { - declare version: SourceMapV3['version']; - declare file: SourceMapV3['file']; - declare names: SourceMapV3['names']; - declare sourceRoot: SourceMapV3['sourceRoot']; - declare sources: SourceMapV3['sources']; - declare sourcesContent: SourceMapV3['sourcesContent']; - declare ignoreList: SourceMapV3['ignoreList']; - - declare resolvedSources: string[]; - declare private _encoded: string | undefined; - - declare private _decoded: SourceMapSegment[][] | undefined; - declare private _decodedMemo: MemoState; - - declare private _bySources: Source[] | undefined; - declare private _bySourceMemos: MemoState[] | undefined; - - constructor(map: Ro, mapUrl?: string | null) { - const isString = typeof map === 'string'; - if (!isString && (map as unknown as { _decodedMemo: any })._decodedMemo) return map as TraceMap; - - const parsed = parse(map as Exclude); - - const { version, file, names, sourceRoot, sources, sourcesContent } = parsed; - this.version = version; - this.file = file; - this.names = names || []; - this.sourceRoot = sourceRoot; - this.sources = sources; - this.sourcesContent = sourcesContent; - this.ignoreList = parsed.ignoreList || (parsed as XInput).x_google_ignoreList || undefined; - - const resolve = resolver(mapUrl, sourceRoot); - this.resolvedSources = sources.map(resolve); - - const { mappings } = parsed; - if (typeof mappings === 'string') { - this._encoded = mappings; - this._decoded = undefined; - } else if (Array.isArray(mappings)) { - this._encoded = undefined; - this._decoded = maybeSort(mappings, isString); - } else if ((parsed as unknown as SectionedSourceMap).sections) { - throw new Error(`TraceMap passed sectioned source map, please use FlattenMap export instead`); - } else { - throw new Error(`invalid source map: ${JSON.stringify(parsed)}`); - } - - this._decodedMemo = memoizedState(); - this._bySources = undefined; - this._bySourceMemos = undefined; - } -} - -/** - * Typescript doesn't allow friend access to private fields, so this just casts the map into a type - * with public access modifiers. - */ -function cast(map: unknown): PublicMap { - return map as any; -} - -/** - * Returns the encoded (VLQ string) form of the SourceMap's mappings field. - */ -export function encodedMappings(map: TraceMap): EncodedSourceMap['mappings'] { - return (cast(map)._encoded ??= encode(cast(map)._decoded!)); -} - -/** - * Returns the decoded (array of lines of segments) form of the SourceMap's mappings field. - */ -export function decodedMappings(map: TraceMap): Readonly { - return (cast(map)._decoded ||= decode(cast(map)._encoded!)); -} - -/** - * A low-level API to find the segment associated with a generated line/column (think, from a - * stack trace). Line and column here are 0-based, unlike `originalPositionFor`. - */ -export function traceSegment( - map: TraceMap, - line: number, - column: number, -): Readonly | null { - const decoded = decodedMappings(map); - - // It's common for parent source maps to have pointers to lines that have no - // mapping (like a "//# sourceMappingURL=") at the end of the child file. - if (line >= decoded.length) return null; - - const segments = decoded[line]; - const index = traceSegmentInternal( - segments, - cast(map)._decodedMemo, - line, - column, - GREATEST_LOWER_BOUND, - ); - - return index === -1 ? null : segments[index]; -} - -/** - * A higher-level API to find the source/line/column associated with a generated line/column - * (think, from a stack trace). Line is 1-based, but column is 0-based, due to legacy behavior in - * `source-map` library. - */ -export function originalPositionFor( - map: TraceMap, - needle: Needle, -): OriginalMapping | InvalidOriginalMapping { - let { line, column, bias } = needle; - line--; - if (line < 0) throw new Error(LINE_GTR_ZERO); - if (column < 0) throw new Error(COL_GTR_EQ_ZERO); - - const decoded = decodedMappings(map); - - // It's common for parent source maps to have pointers to lines that have no - // mapping (like a "//# sourceMappingURL=") at the end of the child file. - if (line >= decoded.length) return OMapping(null, null, null, null); - - const segments = decoded[line]; - const index = traceSegmentInternal( - segments, - cast(map)._decodedMemo, - line, - column, - bias || GREATEST_LOWER_BOUND, - ); - - if (index === -1) return OMapping(null, null, null, null); - - const segment = segments[index]; - if (segment.length === 1) return OMapping(null, null, null, null); - - const { names, resolvedSources } = map; - return OMapping( - resolvedSources[segment[SOURCES_INDEX]], - segment[SOURCE_LINE] + 1, - segment[SOURCE_COLUMN], - segment.length === 5 ? names[segment[NAMES_INDEX]] : null, - ); -} - -/** - * Finds the generated line/column position of the provided source/line/column source position. - */ -export function generatedPositionFor( - map: TraceMap, - needle: SourceNeedle, -): GeneratedMapping | InvalidGeneratedMapping { - const { source, line, column, bias } = needle; - return generatedPosition(map, source, line, column, bias || GREATEST_LOWER_BOUND, false); -} - -/** - * Finds all generated line/column positions of the provided source/line/column source position. - */ -export function allGeneratedPositionsFor(map: TraceMap, needle: SourceNeedle): GeneratedMapping[] { - const { source, line, column, bias } = needle; - // SourceMapConsumer uses LEAST_UPPER_BOUND for some reason, so we follow suit. - return generatedPosition(map, source, line, column, bias || LEAST_UPPER_BOUND, true); -} - -/** - * Iterates each mapping in generated position order. - */ -export function eachMapping(map: TraceMap, cb: (mapping: EachMapping) => void): void { - const decoded = decodedMappings(map); - const { names, resolvedSources } = map; - - for (let i = 0; i < decoded.length; i++) { - const line = decoded[i]; - for (let j = 0; j < line.length; j++) { - const seg = line[j]; - - const generatedLine = i + 1; - const generatedColumn = seg[0]; - let source = null; - let originalLine = null; - let originalColumn = null; - let name = null; - if (seg.length !== 1) { - source = resolvedSources[seg[1]]; - originalLine = seg[2] + 1; - originalColumn = seg[3]; - } - if (seg.length === 5) name = names[seg[4]]; - - cb({ - generatedLine, - generatedColumn, - source, - originalLine, - originalColumn, - name, - } as EachMapping); - } - } -} - -function sourceIndex(map: TraceMap, source: string): number { - const { sources, resolvedSources } = map; - let index = sources.indexOf(source); - if (index === -1) index = resolvedSources.indexOf(source); - return index; -} - -/** - * Retrieves the source content for a particular source, if its found. Returns null if not. - */ -export function sourceContentFor(map: TraceMap, source: string): string | null { - const { sourcesContent } = map; - if (sourcesContent == null) return null; - const index = sourceIndex(map, source); - return index === -1 ? null : sourcesContent[index]; -} - -/** - * Determines if the source is marked to ignore by the source map. - */ -export function isIgnored(map: TraceMap, source: string): boolean { - const { ignoreList } = map; - if (ignoreList == null) return false; - const index = sourceIndex(map, source); - return index === -1 ? false : ignoreList.includes(index); -} - -/** - * A helper that skips sorting of the input map's mappings array, which can be expensive for larger - * maps. - */ -export function presortedDecodedMap(map: DecodedSourceMap, mapUrl?: string): TraceMap { - const tracer = new TraceMap(clone(map, []), mapUrl); - cast(tracer)._decoded = map.mappings; - return tracer; -} - -/** - * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects - * a sourcemap, or to JSON.stringify. - */ -export function decodedMap( - map: TraceMap, -): Omit & { mappings: readonly SourceMapSegment[][] } { - return clone(map, decodedMappings(map)); -} - -/** - * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects - * a sourcemap, or to JSON.stringify. - */ -export function encodedMap(map: TraceMap): EncodedSourceMap { - return clone(map, encodedMappings(map)); -} - -function clone( - map: TraceMap | DecodedSourceMap, - mappings: T, -): T extends string ? EncodedSourceMap : DecodedSourceMap { - return { - version: map.version, - file: map.file, - names: map.names, - sourceRoot: map.sourceRoot, - sources: map.sources, - sourcesContent: map.sourcesContent, - mappings, - ignoreList: map.ignoreList || (map as XInput).x_google_ignoreList, - } as any; -} - -function OMapping(source: null, line: null, column: null, name: null): InvalidOriginalMapping; -function OMapping( - source: string, - line: number, - column: number, - name: string | null, -): OriginalMapping; -function OMapping( - source: string | null, - line: number | null, - column: number | null, - name: string | null, -): OriginalMapping | InvalidOriginalMapping { - return { source, line, column, name } as any; -} - -function GMapping(line: null, column: null): InvalidGeneratedMapping; -function GMapping(line: number, column: number): GeneratedMapping; -function GMapping( - line: number | null, - column: number | null, -): GeneratedMapping | InvalidGeneratedMapping { - return { line, column } as any; -} - -function traceSegmentInternal( - segments: SourceMapSegment[], - memo: MemoState, - line: number, - column: number, - bias: Bias, -): number; -function traceSegmentInternal( - segments: ReverseSegment[], - memo: MemoState, - line: number, - column: number, - bias: Bias, -): number; -function traceSegmentInternal( - segments: SourceMapSegment[] | ReverseSegment[], - memo: MemoState, - line: number, - column: number, - bias: Bias, -): number { - let index = memoizedBinarySearch(segments, column, memo, line); - if (bsFound) { - index = (bias === LEAST_UPPER_BOUND ? upperBound : lowerBound)(segments, column, index); - } else if (bias === LEAST_UPPER_BOUND) index++; - - if (index === -1 || index === segments.length) return -1; - return index; -} - -function sliceGeneratedPositions( - segments: ReverseSegment[], - memo: MemoState, - line: number, - column: number, - bias: Bias, -): GeneratedMapping[] { - let min = traceSegmentInternal(segments, memo, line, column, GREATEST_LOWER_BOUND); - - // We ignored the bias when tracing the segment so that we're guarnateed to find the first (in - // insertion order) segment that matched. Even if we did respect the bias when tracing, we would - // still need to call `lowerBound()` to find the first segment, which is slower than just looking - // for the GREATEST_LOWER_BOUND to begin with. The only difference that matters for us is when the - // binary search didn't match, in which case GREATEST_LOWER_BOUND just needs to increment to - // match LEAST_UPPER_BOUND. - if (!bsFound && bias === LEAST_UPPER_BOUND) min++; - - if (min === -1 || min === segments.length) return []; - - // We may have found the segment that started at an earlier column. If this is the case, then we - // need to slice all generated segments that match _that_ column, because all such segments span - // to our desired column. - const matchedColumn = bsFound ? column : segments[min][COLUMN]; - - // The binary search is not guaranteed to find the lower bound when a match wasn't found. - if (!bsFound) min = lowerBound(segments, matchedColumn, min); - const max = upperBound(segments, matchedColumn, min); - - const result = []; - for (; min <= max; min++) { - const segment = segments[min]; - result.push(GMapping(segment[REV_GENERATED_LINE] + 1, segment[REV_GENERATED_COLUMN])); - } - return result; -} - -function generatedPosition( - map: TraceMap, - source: string, - line: number, - column: number, - bias: Bias, - all: false, -): GeneratedMapping | InvalidGeneratedMapping; -function generatedPosition( - map: TraceMap, - source: string, - line: number, - column: number, - bias: Bias, - all: true, -): GeneratedMapping[]; -function generatedPosition( - map: TraceMap, - source: string, - line: number, - column: number, - bias: Bias, - all: boolean, -): GeneratedMapping | InvalidGeneratedMapping | GeneratedMapping[] { - line--; - if (line < 0) throw new Error(LINE_GTR_ZERO); - if (column < 0) throw new Error(COL_GTR_EQ_ZERO); - - const { sources, resolvedSources } = map; - let sourceIndex = sources.indexOf(source); - if (sourceIndex === -1) sourceIndex = resolvedSources.indexOf(source); - if (sourceIndex === -1) return all ? [] : GMapping(null, null); - - const generated = (cast(map)._bySources ||= buildBySources( - decodedMappings(map), - (cast(map)._bySourceMemos = sources.map(memoizedState)), - )); - - const segments = generated[sourceIndex][line]; - if (segments == null) return all ? [] : GMapping(null, null); - - const memo = cast(map)._bySourceMemos![sourceIndex]; - - if (all) return sliceGeneratedPositions(segments, memo, line, column, bias); - - const index = traceSegmentInternal(segments, memo, line, column, bias); - if (index === -1) return GMapping(null, null); - - const segment = segments[index]; - return GMapping(segment[REV_GENERATED_LINE] + 1, segment[REV_GENERATED_COLUMN]); -} diff --git a/node_modules/@jridgewell/trace-mapping/src/types.ts b/node_modules/@jridgewell/trace-mapping/src/types.ts deleted file mode 100644 index 730a61f..0000000 --- a/node_modules/@jridgewell/trace-mapping/src/types.ts +++ /dev/null @@ -1,114 +0,0 @@ -import type { SourceMapSegment } from './sourcemap-segment'; -import type { GREATEST_LOWER_BOUND, LEAST_UPPER_BOUND, TraceMap } from './trace-mapping'; - -export interface SourceMapV3 { - file?: string | null; - names: string[]; - sourceRoot?: string; - sources: (string | null)[]; - sourcesContent?: (string | null)[]; - version: 3; - ignoreList?: number[]; -} - -export interface EncodedSourceMap extends SourceMapV3 { - mappings: string; -} - -export interface DecodedSourceMap extends SourceMapV3 { - mappings: SourceMapSegment[][]; -} - -export interface Section { - offset: { line: number; column: number }; - map: EncodedSourceMap | DecodedSourceMap | SectionedSourceMap; -} - -export interface SectionedSourceMap { - file?: string | null; - sections: Section[]; - version: 3; -} - -export type OriginalMapping = { - source: string | null; - line: number; - column: number; - name: string | null; -}; - -export type InvalidOriginalMapping = { - source: null; - line: null; - column: null; - name: null; -}; - -export type GeneratedMapping = { - line: number; - column: number; -}; -export type InvalidGeneratedMapping = { - line: null; - column: null; -}; - -export type Bias = typeof GREATEST_LOWER_BOUND | typeof LEAST_UPPER_BOUND; - -export type XInput = { x_google_ignoreList?: SourceMapV3['ignoreList'] }; -export type EncodedSourceMapXInput = EncodedSourceMap & XInput; -export type DecodedSourceMapXInput = DecodedSourceMap & XInput; -export type SectionedSourceMapXInput = Omit & { - sections: SectionXInput[]; -}; -export type SectionXInput = Omit & { - map: SectionedSourceMapInput; -}; - -export type SourceMapInput = string | EncodedSourceMapXInput | DecodedSourceMapXInput | TraceMap; -export type SectionedSourceMapInput = SourceMapInput | SectionedSourceMapXInput; - -export type Needle = { line: number; column: number; bias?: Bias }; -export type SourceNeedle = { source: string; line: number; column: number; bias?: Bias }; - -export type EachMapping = - | { - generatedLine: number; - generatedColumn: number; - source: null; - originalLine: null; - originalColumn: null; - name: null; - } - | { - generatedLine: number; - generatedColumn: number; - source: string | null; - originalLine: number; - originalColumn: number; - name: string | null; - }; - -export abstract class SourceMap { - declare version: SourceMapV3['version']; - declare file: SourceMapV3['file']; - declare names: SourceMapV3['names']; - declare sourceRoot: SourceMapV3['sourceRoot']; - declare sources: SourceMapV3['sources']; - declare sourcesContent: SourceMapV3['sourcesContent']; - declare resolvedSources: SourceMapV3['sources']; - declare ignoreList: SourceMapV3['ignoreList']; -} - -export type Ro = - T extends Array - ? V[] | Readonly | RoArray | Readonly> - : T extends object - ? T | Readonly | RoObject | Readonly> - : T; -type RoArray = Ro[]; -type RoObject = { [K in keyof T]: T[K] | Ro }; - -export function parse(map: T): Exclude { - return typeof map === 'string' ? JSON.parse(map) : (map as Exclude); -} diff --git a/node_modules/@jridgewell/trace-mapping/types/binary-search.d.cts b/node_modules/@jridgewell/trace-mapping/types/binary-search.d.cts deleted file mode 100644 index b7bb85c..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/binary-search.d.cts +++ /dev/null @@ -1,33 +0,0 @@ -import type { SourceMapSegment, ReverseSegment } from './sourcemap-segment.cts'; -export type MemoState = { - lastKey: number; - lastNeedle: number; - lastIndex: number; -}; -export declare let found: boolean; -/** - * A binary search implementation that returns the index if a match is found. - * If no match is found, then the left-index (the index associated with the item that comes just - * before the desired index) is returned. To maintain proper sort order, a splice would happen at - * the next index: - * - * ```js - * const array = [1, 3]; - * const needle = 2; - * const index = binarySearch(array, needle, (item, needle) => item - needle); - * - * assert.equal(index, 0); - * array.splice(index + 1, 0, needle); - * assert.deepEqual(array, [1, 2, 3]); - * ``` - */ -export declare function binarySearch(haystack: SourceMapSegment[] | ReverseSegment[], needle: number, low: number, high: number): number; -export declare function upperBound(haystack: SourceMapSegment[] | ReverseSegment[], needle: number, index: number): number; -export declare function lowerBound(haystack: SourceMapSegment[] | ReverseSegment[], needle: number, index: number): number; -export declare function memoizedState(): MemoState; -/** - * This overly complicated beast is just to record the last tested line/column and the resulting - * index, allowing us to skip a few tests if mappings are monotonically increasing. - */ -export declare function memoizedBinarySearch(haystack: SourceMapSegment[] | ReverseSegment[], needle: number, state: MemoState, key: number): number; -//# sourceMappingURL=binary-search.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/binary-search.d.cts.map b/node_modules/@jridgewell/trace-mapping/types/binary-search.d.cts.map deleted file mode 100644 index 648e84c..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/binary-search.d.cts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"binary-search.d.ts","sourceRoot":"","sources":["../src/binary-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG5E,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,eAAO,IAAI,KAAK,SAAQ,CAAC;AAEzB;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,gBAAgB,EAAE,GAAG,cAAc,EAAE,EAC/C,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACX,MAAM,CAmBR;AAED,wBAAgB,UAAU,CACxB,QAAQ,EAAE,gBAAgB,EAAE,GAAG,cAAc,EAAE,EAC/C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,MAAM,CAKR;AAED,wBAAgB,UAAU,CACxB,QAAQ,EAAE,gBAAgB,EAAE,GAAG,cAAc,EAAE,EAC/C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,MAAM,CAKR;AAED,wBAAgB,aAAa,IAAI,SAAS,CAMzC;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,gBAAgB,EAAE,GAAG,cAAc,EAAE,EAC/C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,SAAS,EAChB,GAAG,EAAE,MAAM,GACV,MAAM,CAsBR"} \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/binary-search.d.mts b/node_modules/@jridgewell/trace-mapping/types/binary-search.d.mts deleted file mode 100644 index 19e1e6b..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/binary-search.d.mts +++ /dev/null @@ -1,33 +0,0 @@ -import type { SourceMapSegment, ReverseSegment } from './sourcemap-segment.mts'; -export type MemoState = { - lastKey: number; - lastNeedle: number; - lastIndex: number; -}; -export declare let found: boolean; -/** - * A binary search implementation that returns the index if a match is found. - * If no match is found, then the left-index (the index associated with the item that comes just - * before the desired index) is returned. To maintain proper sort order, a splice would happen at - * the next index: - * - * ```js - * const array = [1, 3]; - * const needle = 2; - * const index = binarySearch(array, needle, (item, needle) => item - needle); - * - * assert.equal(index, 0); - * array.splice(index + 1, 0, needle); - * assert.deepEqual(array, [1, 2, 3]); - * ``` - */ -export declare function binarySearch(haystack: SourceMapSegment[] | ReverseSegment[], needle: number, low: number, high: number): number; -export declare function upperBound(haystack: SourceMapSegment[] | ReverseSegment[], needle: number, index: number): number; -export declare function lowerBound(haystack: SourceMapSegment[] | ReverseSegment[], needle: number, index: number): number; -export declare function memoizedState(): MemoState; -/** - * This overly complicated beast is just to record the last tested line/column and the resulting - * index, allowing us to skip a few tests if mappings are monotonically increasing. - */ -export declare function memoizedBinarySearch(haystack: SourceMapSegment[] | ReverseSegment[], needle: number, state: MemoState, key: number): number; -//# sourceMappingURL=binary-search.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/binary-search.d.mts.map b/node_modules/@jridgewell/trace-mapping/types/binary-search.d.mts.map deleted file mode 100644 index 648e84c..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/binary-search.d.mts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"binary-search.d.ts","sourceRoot":"","sources":["../src/binary-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG5E,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,eAAO,IAAI,KAAK,SAAQ,CAAC;AAEzB;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,gBAAgB,EAAE,GAAG,cAAc,EAAE,EAC/C,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACX,MAAM,CAmBR;AAED,wBAAgB,UAAU,CACxB,QAAQ,EAAE,gBAAgB,EAAE,GAAG,cAAc,EAAE,EAC/C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,MAAM,CAKR;AAED,wBAAgB,UAAU,CACxB,QAAQ,EAAE,gBAAgB,EAAE,GAAG,cAAc,EAAE,EAC/C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,MAAM,CAKR;AAED,wBAAgB,aAAa,IAAI,SAAS,CAMzC;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,gBAAgB,EAAE,GAAG,cAAc,EAAE,EAC/C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,SAAS,EAChB,GAAG,EAAE,MAAM,GACV,MAAM,CAsBR"} \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/by-source.d.cts b/node_modules/@jridgewell/trace-mapping/types/by-source.d.cts deleted file mode 100644 index d474786..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/by-source.d.cts +++ /dev/null @@ -1,8 +0,0 @@ -import type { ReverseSegment, SourceMapSegment } from './sourcemap-segment.cts'; -import type { MemoState } from './binary-search.cts'; -export type Source = { - __proto__: null; - [line: number]: Exclude[]; -}; -export = function buildBySources(decoded: readonly SourceMapSegment[][], memos: MemoState[]): Source[]; -//# sourceMappingURL=by-source.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/by-source.d.cts.map b/node_modules/@jridgewell/trace-mapping/types/by-source.d.cts.map deleted file mode 100644 index 580fe96..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/by-source.d.cts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"by-source.d.ts","sourceRoot":"","sources":["../src/by-source.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,MAAM,MAAM,GAAG;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;CACrD,CAAC;AAIF,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,OAAO,EAAE,SAAS,gBAAgB,EAAE,EAAE,EACtC,KAAK,EAAE,SAAS,EAAE,GACjB,MAAM,EAAE,CAgCV"} \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/by-source.d.mts b/node_modules/@jridgewell/trace-mapping/types/by-source.d.mts deleted file mode 100644 index d980c33..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/by-source.d.mts +++ /dev/null @@ -1,8 +0,0 @@ -import type { ReverseSegment, SourceMapSegment } from './sourcemap-segment.mts'; -import type { MemoState } from './binary-search.mts'; -export type Source = { - __proto__: null; - [line: number]: Exclude[]; -}; -export default function buildBySources(decoded: readonly SourceMapSegment[][], memos: MemoState[]): Source[]; -//# sourceMappingURL=by-source.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/by-source.d.mts.map b/node_modules/@jridgewell/trace-mapping/types/by-source.d.mts.map deleted file mode 100644 index 580fe96..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/by-source.d.mts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"by-source.d.ts","sourceRoot":"","sources":["../src/by-source.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,MAAM,MAAM,GAAG;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;CACrD,CAAC;AAIF,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,OAAO,EAAE,SAAS,gBAAgB,EAAE,EAAE,EACtC,KAAK,EAAE,SAAS,EAAE,GACjB,MAAM,EAAE,CAgCV"} \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.cts b/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.cts deleted file mode 100644 index 433d849..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.cts +++ /dev/null @@ -1,9 +0,0 @@ -import { TraceMap } from './trace-mapping.cts'; -import type { SectionedSourceMapInput, Ro } from './types.cts'; -type FlattenMap = { - new (map: Ro, mapUrl?: string | null): TraceMap; - (map: Ro, mapUrl?: string | null): TraceMap; -}; -export declare const FlattenMap: FlattenMap; -export {}; -//# sourceMappingURL=flatten-map.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.cts.map b/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.cts.map deleted file mode 100644 index 994b208..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.cts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"flatten-map.d.ts","sourceRoot":"","sources":["../src/flatten-map.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAwC,MAAM,iBAAiB,CAAC;AAUjF,OAAO,KAAK,EAKV,uBAAuB,EAEvB,EAAE,EACH,MAAM,SAAS,CAAC;AAGjB,KAAK,UAAU,GAAG;IAChB,KAAK,GAAG,EAAE,EAAE,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,QAAQ,CAAC;IACzE,CAAC,GAAG,EAAE,EAAE,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,QAAQ,CAAC;CACtE,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,UAsCV,CAAC"} \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.mts b/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.mts deleted file mode 100644 index 444a1be..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.mts +++ /dev/null @@ -1,9 +0,0 @@ -import { TraceMap } from './trace-mapping.mts'; -import type { SectionedSourceMapInput, Ro } from './types.mts'; -type FlattenMap = { - new (map: Ro, mapUrl?: string | null): TraceMap; - (map: Ro, mapUrl?: string | null): TraceMap; -}; -export declare const FlattenMap: FlattenMap; -export {}; -//# sourceMappingURL=flatten-map.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.mts.map b/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.mts.map deleted file mode 100644 index 994b208..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.mts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"flatten-map.d.ts","sourceRoot":"","sources":["../src/flatten-map.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAwC,MAAM,iBAAiB,CAAC;AAUjF,OAAO,KAAK,EAKV,uBAAuB,EAEvB,EAAE,EACH,MAAM,SAAS,CAAC;AAGjB,KAAK,UAAU,GAAG;IAChB,KAAK,GAAG,EAAE,EAAE,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,QAAQ,CAAC;IACzE,CAAC,GAAG,EAAE,EAAE,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,QAAQ,CAAC;CACtE,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,UAsCV,CAAC"} \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/resolve.d.cts b/node_modules/@jridgewell/trace-mapping/types/resolve.d.cts deleted file mode 100644 index 62aeedb..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/resolve.d.cts +++ /dev/null @@ -1,4 +0,0 @@ -type Resolve = (source: string | null) => string; -export = function resolver(mapUrl: string | null | undefined, sourceRoot: string | undefined): Resolve; -export {}; -//# sourceMappingURL=resolve.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/resolve.d.cts.map b/node_modules/@jridgewell/trace-mapping/types/resolve.d.cts.map deleted file mode 100644 index 9f155ac..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/resolve.d.cts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAGA,KAAK,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,CAAC;AACjD,MAAM,CAAC,OAAO,UAAU,QAAQ,CAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACjC,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAQT"} \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/resolve.d.mts b/node_modules/@jridgewell/trace-mapping/types/resolve.d.mts deleted file mode 100644 index e2798a1..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/resolve.d.mts +++ /dev/null @@ -1,4 +0,0 @@ -type Resolve = (source: string | null) => string; -export default function resolver(mapUrl: string | null | undefined, sourceRoot: string | undefined): Resolve; -export {}; -//# sourceMappingURL=resolve.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/resolve.d.mts.map b/node_modules/@jridgewell/trace-mapping/types/resolve.d.mts.map deleted file mode 100644 index 9f155ac..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/resolve.d.mts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAGA,KAAK,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,CAAC;AACjD,MAAM,CAAC,OAAO,UAAU,QAAQ,CAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACjC,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAQT"} \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/sort.d.cts b/node_modules/@jridgewell/trace-mapping/types/sort.d.cts deleted file mode 100644 index b364a6d..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/sort.d.cts +++ /dev/null @@ -1,3 +0,0 @@ -import type { SourceMapSegment } from './sourcemap-segment.cts'; -export = function maybeSort(mappings: SourceMapSegment[][], owned: boolean): SourceMapSegment[][]; -//# sourceMappingURL=sort.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/sort.d.cts.map b/node_modules/@jridgewell/trace-mapping/types/sort.d.cts.map deleted file mode 100644 index 6859515..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/sort.d.cts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"sort.d.ts","sourceRoot":"","sources":["../src/sort.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,MAAM,CAAC,OAAO,UAAU,SAAS,CAC/B,QAAQ,EAAE,gBAAgB,EAAE,EAAE,EAC9B,KAAK,EAAE,OAAO,GACb,gBAAgB,EAAE,EAAE,CAYtB"} \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/sort.d.mts b/node_modules/@jridgewell/trace-mapping/types/sort.d.mts deleted file mode 100644 index ffd1301..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/sort.d.mts +++ /dev/null @@ -1,3 +0,0 @@ -import type { SourceMapSegment } from './sourcemap-segment.mts'; -export default function maybeSort(mappings: SourceMapSegment[][], owned: boolean): SourceMapSegment[][]; -//# sourceMappingURL=sort.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/sort.d.mts.map b/node_modules/@jridgewell/trace-mapping/types/sort.d.mts.map deleted file mode 100644 index 6859515..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/sort.d.mts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"sort.d.ts","sourceRoot":"","sources":["../src/sort.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,MAAM,CAAC,OAAO,UAAU,SAAS,CAC/B,QAAQ,EAAE,gBAAgB,EAAE,EAAE,EAC9B,KAAK,EAAE,OAAO,GACb,gBAAgB,EAAE,EAAE,CAYtB"} \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.cts b/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.cts deleted file mode 100644 index 8d3cabc..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.cts +++ /dev/null @@ -1,17 +0,0 @@ -type GeneratedColumn = number; -type SourcesIndex = number; -type SourceLine = number; -type SourceColumn = number; -type NamesIndex = number; -type GeneratedLine = number; -export type SourceMapSegment = [GeneratedColumn] | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn] | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn, NamesIndex]; -export type ReverseSegment = [SourceColumn, GeneratedLine, GeneratedColumn]; -export declare const COLUMN = 0; -export declare const SOURCES_INDEX = 1; -export declare const SOURCE_LINE = 2; -export declare const SOURCE_COLUMN = 3; -export declare const NAMES_INDEX = 4; -export declare const REV_GENERATED_LINE = 1; -export declare const REV_GENERATED_COLUMN = 2; -export {}; -//# sourceMappingURL=sourcemap-segment.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.cts.map b/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.cts.map deleted file mode 100644 index 0c94a46..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.cts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"sourcemap-segment.d.ts","sourceRoot":"","sources":["../src/sourcemap-segment.ts"],"names":[],"mappings":"AAAA,KAAK,eAAe,GAAG,MAAM,CAAC;AAC9B,KAAK,YAAY,GAAG,MAAM,CAAC;AAC3B,KAAK,UAAU,GAAG,MAAM,CAAC;AACzB,KAAK,YAAY,GAAG,MAAM,CAAC;AAC3B,KAAK,UAAU,GAAG,MAAM,CAAC;AAEzB,KAAK,aAAa,GAAG,MAAM,CAAC;AAE5B,MAAM,MAAM,gBAAgB,GACxB,CAAC,eAAe,CAAC,GACjB,CAAC,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,CAAC,GACzD,CAAC,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;AAE1E,MAAM,MAAM,cAAc,GAAG,CAAC,YAAY,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC;AAE5E,eAAO,MAAM,MAAM,IAAI,CAAC;AACxB,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B,eAAO,MAAM,WAAW,IAAI,CAAC;AAC7B,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B,eAAO,MAAM,WAAW,IAAI,CAAC;AAE7B,eAAO,MAAM,kBAAkB,IAAI,CAAC;AACpC,eAAO,MAAM,oBAAoB,IAAI,CAAC"} \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.mts b/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.mts deleted file mode 100644 index 8d3cabc..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.mts +++ /dev/null @@ -1,17 +0,0 @@ -type GeneratedColumn = number; -type SourcesIndex = number; -type SourceLine = number; -type SourceColumn = number; -type NamesIndex = number; -type GeneratedLine = number; -export type SourceMapSegment = [GeneratedColumn] | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn] | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn, NamesIndex]; -export type ReverseSegment = [SourceColumn, GeneratedLine, GeneratedColumn]; -export declare const COLUMN = 0; -export declare const SOURCES_INDEX = 1; -export declare const SOURCE_LINE = 2; -export declare const SOURCE_COLUMN = 3; -export declare const NAMES_INDEX = 4; -export declare const REV_GENERATED_LINE = 1; -export declare const REV_GENERATED_COLUMN = 2; -export {}; -//# sourceMappingURL=sourcemap-segment.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.mts.map b/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.mts.map deleted file mode 100644 index 0c94a46..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.mts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"sourcemap-segment.d.ts","sourceRoot":"","sources":["../src/sourcemap-segment.ts"],"names":[],"mappings":"AAAA,KAAK,eAAe,GAAG,MAAM,CAAC;AAC9B,KAAK,YAAY,GAAG,MAAM,CAAC;AAC3B,KAAK,UAAU,GAAG,MAAM,CAAC;AACzB,KAAK,YAAY,GAAG,MAAM,CAAC;AAC3B,KAAK,UAAU,GAAG,MAAM,CAAC;AAEzB,KAAK,aAAa,GAAG,MAAM,CAAC;AAE5B,MAAM,MAAM,gBAAgB,GACxB,CAAC,eAAe,CAAC,GACjB,CAAC,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,CAAC,GACzD,CAAC,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;AAE1E,MAAM,MAAM,cAAc,GAAG,CAAC,YAAY,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC;AAE5E,eAAO,MAAM,MAAM,IAAI,CAAC;AACxB,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B,eAAO,MAAM,WAAW,IAAI,CAAC;AAC7B,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B,eAAO,MAAM,WAAW,IAAI,CAAC;AAE7B,eAAO,MAAM,kBAAkB,IAAI,CAAC;AACpC,eAAO,MAAM,oBAAoB,IAAI,CAAC"} \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.cts b/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.cts deleted file mode 100644 index 8b3c0e9..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.cts +++ /dev/null @@ -1,5 +0,0 @@ -/** - * Removes everything after the last "/", but leaves the slash. - */ -export = function stripFilename(path: string | undefined | null): string; -//# sourceMappingURL=strip-filename.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.cts.map b/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.cts.map deleted file mode 100644 index 17a25da..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.cts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"strip-filename.d.ts","sourceRoot":"","sources":["../src/strip-filename.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAI7E"} \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.mts b/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.mts deleted file mode 100644 index cbbaee0..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.mts +++ /dev/null @@ -1,5 +0,0 @@ -/** - * Removes everything after the last "/", but leaves the slash. - */ -export default function stripFilename(path: string | undefined | null): string; -//# sourceMappingURL=strip-filename.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.mts.map b/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.mts.map deleted file mode 100644 index 17a25da..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.mts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"strip-filename.d.ts","sourceRoot":"","sources":["../src/strip-filename.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAI7E"} \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.cts b/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.cts deleted file mode 100644 index a40f305..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.cts +++ /dev/null @@ -1,80 +0,0 @@ -import type { SourceMapSegment } from './sourcemap-segment.cts'; -import type { SourceMapV3, DecodedSourceMap, EncodedSourceMap, InvalidOriginalMapping, OriginalMapping, InvalidGeneratedMapping, GeneratedMapping, SourceMapInput, Needle, SourceNeedle, SourceMap, EachMapping, Ro } from './types.cts'; -export type { SourceMapSegment } from './sourcemap-segment.cts'; -export type { SourceMap, DecodedSourceMap, EncodedSourceMap, Section, SectionedSourceMap, SourceMapV3, Bias, EachMapping, GeneratedMapping, InvalidGeneratedMapping, InvalidOriginalMapping, Needle, OriginalMapping, OriginalMapping as Mapping, SectionedSourceMapInput, SourceMapInput, SourceNeedle, XInput, EncodedSourceMapXInput, DecodedSourceMapXInput, SectionedSourceMapXInput, SectionXInput, } from './types.cts'; -export declare const LEAST_UPPER_BOUND = -1; -export declare const GREATEST_LOWER_BOUND = 1; -export { FlattenMap, FlattenMap as AnyMap } from './flatten-map.cts'; -export declare class TraceMap implements SourceMap { - version: SourceMapV3['version']; - file: SourceMapV3['file']; - names: SourceMapV3['names']; - sourceRoot: SourceMapV3['sourceRoot']; - sources: SourceMapV3['sources']; - sourcesContent: SourceMapV3['sourcesContent']; - ignoreList: SourceMapV3['ignoreList']; - resolvedSources: string[]; - private _encoded; - private _decoded; - private _decodedMemo; - private _bySources; - private _bySourceMemos; - constructor(map: Ro, mapUrl?: string | null); -} -/** - * Returns the encoded (VLQ string) form of the SourceMap's mappings field. - */ -export declare function encodedMappings(map: TraceMap): EncodedSourceMap['mappings']; -/** - * Returns the decoded (array of lines of segments) form of the SourceMap's mappings field. - */ -export declare function decodedMappings(map: TraceMap): Readonly; -/** - * A low-level API to find the segment associated with a generated line/column (think, from a - * stack trace). Line and column here are 0-based, unlike `originalPositionFor`. - */ -export declare function traceSegment(map: TraceMap, line: number, column: number): Readonly | null; -/** - * A higher-level API to find the source/line/column associated with a generated line/column - * (think, from a stack trace). Line is 1-based, but column is 0-based, due to legacy behavior in - * `source-map` library. - */ -export declare function originalPositionFor(map: TraceMap, needle: Needle): OriginalMapping | InvalidOriginalMapping; -/** - * Finds the generated line/column position of the provided source/line/column source position. - */ -export declare function generatedPositionFor(map: TraceMap, needle: SourceNeedle): GeneratedMapping | InvalidGeneratedMapping; -/** - * Finds all generated line/column positions of the provided source/line/column source position. - */ -export declare function allGeneratedPositionsFor(map: TraceMap, needle: SourceNeedle): GeneratedMapping[]; -/** - * Iterates each mapping in generated position order. - */ -export declare function eachMapping(map: TraceMap, cb: (mapping: EachMapping) => void): void; -/** - * Retrieves the source content for a particular source, if its found. Returns null if not. - */ -export declare function sourceContentFor(map: TraceMap, source: string): string | null; -/** - * Determines if the source is marked to ignore by the source map. - */ -export declare function isIgnored(map: TraceMap, source: string): boolean; -/** - * A helper that skips sorting of the input map's mappings array, which can be expensive for larger - * maps. - */ -export declare function presortedDecodedMap(map: DecodedSourceMap, mapUrl?: string): TraceMap; -/** - * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects - * a sourcemap, or to JSON.stringify. - */ -export declare function decodedMap(map: TraceMap): Omit & { - mappings: readonly SourceMapSegment[][]; -}; -/** - * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects - * a sourcemap, or to JSON.stringify. - */ -export declare function encodedMap(map: TraceMap): EncodedSourceMap; -//# sourceMappingURL=trace-mapping.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.cts.map b/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.cts.map deleted file mode 100644 index b5a874c..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.cts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"trace-mapping.d.ts","sourceRoot":"","sources":["../src/trace-mapping.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,gBAAgB,EAAkB,MAAM,qBAAqB,CAAC;AAC5E,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,sBAAsB,EACtB,eAAe,EACf,uBAAuB,EACvB,gBAAgB,EAChB,cAAc,EACd,MAAM,EACN,YAAY,EACZ,SAAS,EACT,WAAW,EAIX,EAAE,EACH,MAAM,SAAS,CAAC;AAIjB,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,YAAY,EACV,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,OAAO,EACP,kBAAkB,EAClB,WAAW,EACX,IAAI,EACJ,WAAW,EACX,gBAAgB,EAChB,uBAAuB,EACvB,sBAAsB,EACtB,MAAM,EACN,eAAe,EACf,eAAe,IAAI,OAAO,EAC1B,uBAAuB,EACvB,cAAc,EACd,YAAY,EACZ,MAAM,EACN,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,EACxB,aAAa,GACd,MAAM,SAAS,CAAC;AAajB,eAAO,MAAM,iBAAiB,KAAK,CAAC;AACpC,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,OAAO,EAAE,UAAU,EAAE,UAAU,IAAI,MAAM,EAAE,MAAM,eAAe,CAAC;AAEjE,qBAAa,QAAS,YAAW,SAAS;IAChC,OAAO,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IAChC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1B,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC5B,UAAU,EAAE,WAAW,CAAC,YAAY,CAAC,CAAC;IACtC,OAAO,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IAChC,cAAc,EAAE,WAAW,CAAC,gBAAgB,CAAC,CAAC;IAC9C,UAAU,EAAE,WAAW,CAAC,YAAY,CAAC,CAAC;IAEtC,eAAe,EAAE,MAAM,EAAE,CAAC;IAClC,QAAgB,QAAQ,CAAqB;IAE7C,QAAgB,QAAQ,CAAmC;IAC3D,QAAgB,YAAY,CAAY;IAExC,QAAgB,UAAU,CAAuB;IACjD,QAAgB,cAAc,CAA0B;gBAE5C,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;CAmC5D;AAUD;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAE3E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,GAAG,QAAQ,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAErF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,QAAQ,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAiBnC;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,QAAQ,EACb,MAAM,EAAE,MAAM,GACb,eAAe,GAAG,sBAAsB,CAiC1C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,QAAQ,EACb,MAAM,EAAE,YAAY,GACnB,gBAAgB,GAAG,uBAAuB,CAG5C;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,GAAG,gBAAgB,EAAE,CAIhG;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI,CAgCnF;AASD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK7E;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAKhE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAIpF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,QAAQ,GACZ,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,GAAG;IAAE,QAAQ,EAAE,SAAS,gBAAgB,EAAE,EAAE,CAAA;CAAE,CAElF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,QAAQ,GAAG,gBAAgB,CAE1D"} \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.mts b/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.mts deleted file mode 100644 index bc2ff0f..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.mts +++ /dev/null @@ -1,80 +0,0 @@ -import type { SourceMapSegment } from './sourcemap-segment.mts'; -import type { SourceMapV3, DecodedSourceMap, EncodedSourceMap, InvalidOriginalMapping, OriginalMapping, InvalidGeneratedMapping, GeneratedMapping, SourceMapInput, Needle, SourceNeedle, SourceMap, EachMapping, Ro } from './types.mts'; -export type { SourceMapSegment } from './sourcemap-segment.mts'; -export type { SourceMap, DecodedSourceMap, EncodedSourceMap, Section, SectionedSourceMap, SourceMapV3, Bias, EachMapping, GeneratedMapping, InvalidGeneratedMapping, InvalidOriginalMapping, Needle, OriginalMapping, OriginalMapping as Mapping, SectionedSourceMapInput, SourceMapInput, SourceNeedle, XInput, EncodedSourceMapXInput, DecodedSourceMapXInput, SectionedSourceMapXInput, SectionXInput, } from './types.mts'; -export declare const LEAST_UPPER_BOUND = -1; -export declare const GREATEST_LOWER_BOUND = 1; -export { FlattenMap, FlattenMap as AnyMap } from './flatten-map.mts'; -export declare class TraceMap implements SourceMap { - version: SourceMapV3['version']; - file: SourceMapV3['file']; - names: SourceMapV3['names']; - sourceRoot: SourceMapV3['sourceRoot']; - sources: SourceMapV3['sources']; - sourcesContent: SourceMapV3['sourcesContent']; - ignoreList: SourceMapV3['ignoreList']; - resolvedSources: string[]; - private _encoded; - private _decoded; - private _decodedMemo; - private _bySources; - private _bySourceMemos; - constructor(map: Ro, mapUrl?: string | null); -} -/** - * Returns the encoded (VLQ string) form of the SourceMap's mappings field. - */ -export declare function encodedMappings(map: TraceMap): EncodedSourceMap['mappings']; -/** - * Returns the decoded (array of lines of segments) form of the SourceMap's mappings field. - */ -export declare function decodedMappings(map: TraceMap): Readonly; -/** - * A low-level API to find the segment associated with a generated line/column (think, from a - * stack trace). Line and column here are 0-based, unlike `originalPositionFor`. - */ -export declare function traceSegment(map: TraceMap, line: number, column: number): Readonly | null; -/** - * A higher-level API to find the source/line/column associated with a generated line/column - * (think, from a stack trace). Line is 1-based, but column is 0-based, due to legacy behavior in - * `source-map` library. - */ -export declare function originalPositionFor(map: TraceMap, needle: Needle): OriginalMapping | InvalidOriginalMapping; -/** - * Finds the generated line/column position of the provided source/line/column source position. - */ -export declare function generatedPositionFor(map: TraceMap, needle: SourceNeedle): GeneratedMapping | InvalidGeneratedMapping; -/** - * Finds all generated line/column positions of the provided source/line/column source position. - */ -export declare function allGeneratedPositionsFor(map: TraceMap, needle: SourceNeedle): GeneratedMapping[]; -/** - * Iterates each mapping in generated position order. - */ -export declare function eachMapping(map: TraceMap, cb: (mapping: EachMapping) => void): void; -/** - * Retrieves the source content for a particular source, if its found. Returns null if not. - */ -export declare function sourceContentFor(map: TraceMap, source: string): string | null; -/** - * Determines if the source is marked to ignore by the source map. - */ -export declare function isIgnored(map: TraceMap, source: string): boolean; -/** - * A helper that skips sorting of the input map's mappings array, which can be expensive for larger - * maps. - */ -export declare function presortedDecodedMap(map: DecodedSourceMap, mapUrl?: string): TraceMap; -/** - * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects - * a sourcemap, or to JSON.stringify. - */ -export declare function decodedMap(map: TraceMap): Omit & { - mappings: readonly SourceMapSegment[][]; -}; -/** - * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects - * a sourcemap, or to JSON.stringify. - */ -export declare function encodedMap(map: TraceMap): EncodedSourceMap; -//# sourceMappingURL=trace-mapping.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.mts.map b/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.mts.map deleted file mode 100644 index b5a874c..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.mts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"trace-mapping.d.ts","sourceRoot":"","sources":["../src/trace-mapping.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/types.d.cts b/node_modules/@jridgewell/trace-mapping/types/types.d.cts deleted file mode 100644 index 729c2c3..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/types.d.cts +++ /dev/null @@ -1,107 +0,0 @@ -import type { SourceMapSegment } from './sourcemap-segment.cts'; -import type { GREATEST_LOWER_BOUND, LEAST_UPPER_BOUND, TraceMap } from './trace-mapping.cts'; -export interface SourceMapV3 { - file?: string | null; - names: string[]; - sourceRoot?: string; - sources: (string | null)[]; - sourcesContent?: (string | null)[]; - version: 3; - ignoreList?: number[]; -} -export interface EncodedSourceMap extends SourceMapV3 { - mappings: string; -} -export interface DecodedSourceMap extends SourceMapV3 { - mappings: SourceMapSegment[][]; -} -export interface Section { - offset: { - line: number; - column: number; - }; - map: EncodedSourceMap | DecodedSourceMap | SectionedSourceMap; -} -export interface SectionedSourceMap { - file?: string | null; - sections: Section[]; - version: 3; -} -export type OriginalMapping = { - source: string | null; - line: number; - column: number; - name: string | null; -}; -export type InvalidOriginalMapping = { - source: null; - line: null; - column: null; - name: null; -}; -export type GeneratedMapping = { - line: number; - column: number; -}; -export type InvalidGeneratedMapping = { - line: null; - column: null; -}; -export type Bias = typeof GREATEST_LOWER_BOUND | typeof LEAST_UPPER_BOUND; -export type XInput = { - x_google_ignoreList?: SourceMapV3['ignoreList']; -}; -export type EncodedSourceMapXInput = EncodedSourceMap & XInput; -export type DecodedSourceMapXInput = DecodedSourceMap & XInput; -export type SectionedSourceMapXInput = Omit & { - sections: SectionXInput[]; -}; -export type SectionXInput = Omit & { - map: SectionedSourceMapInput; -}; -export type SourceMapInput = string | EncodedSourceMapXInput | DecodedSourceMapXInput | TraceMap; -export type SectionedSourceMapInput = SourceMapInput | SectionedSourceMapXInput; -export type Needle = { - line: number; - column: number; - bias?: Bias; -}; -export type SourceNeedle = { - source: string; - line: number; - column: number; - bias?: Bias; -}; -export type EachMapping = { - generatedLine: number; - generatedColumn: number; - source: null; - originalLine: null; - originalColumn: null; - name: null; -} | { - generatedLine: number; - generatedColumn: number; - source: string | null; - originalLine: number; - originalColumn: number; - name: string | null; -}; -export declare abstract class SourceMap { - version: SourceMapV3['version']; - file: SourceMapV3['file']; - names: SourceMapV3['names']; - sourceRoot: SourceMapV3['sourceRoot']; - sources: SourceMapV3['sources']; - sourcesContent: SourceMapV3['sourcesContent']; - resolvedSources: SourceMapV3['sources']; - ignoreList: SourceMapV3['ignoreList']; -} -export type Ro = T extends Array ? V[] | Readonly | RoArray | Readonly> : T extends object ? T | Readonly | RoObject | Readonly> : T; -type RoArray = Ro[]; -type RoObject = { - [K in keyof T]: T[K] | Ro; -}; -export declare function parse(map: T): Exclude; -export {}; -//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/types.d.cts.map b/node_modules/@jridgewell/trace-mapping/types/types.d.cts.map deleted file mode 100644 index 9224783..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/types.d.cts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/types.d.mts b/node_modules/@jridgewell/trace-mapping/types/types.d.mts deleted file mode 100644 index a26d186..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/types.d.mts +++ /dev/null @@ -1,107 +0,0 @@ -import type { SourceMapSegment } from './sourcemap-segment.mts'; -import type { GREATEST_LOWER_BOUND, LEAST_UPPER_BOUND, TraceMap } from './trace-mapping.mts'; -export interface SourceMapV3 { - file?: string | null; - names: string[]; - sourceRoot?: string; - sources: (string | null)[]; - sourcesContent?: (string | null)[]; - version: 3; - ignoreList?: number[]; -} -export interface EncodedSourceMap extends SourceMapV3 { - mappings: string; -} -export interface DecodedSourceMap extends SourceMapV3 { - mappings: SourceMapSegment[][]; -} -export interface Section { - offset: { - line: number; - column: number; - }; - map: EncodedSourceMap | DecodedSourceMap | SectionedSourceMap; -} -export interface SectionedSourceMap { - file?: string | null; - sections: Section[]; - version: 3; -} -export type OriginalMapping = { - source: string | null; - line: number; - column: number; - name: string | null; -}; -export type InvalidOriginalMapping = { - source: null; - line: null; - column: null; - name: null; -}; -export type GeneratedMapping = { - line: number; - column: number; -}; -export type InvalidGeneratedMapping = { - line: null; - column: null; -}; -export type Bias = typeof GREATEST_LOWER_BOUND | typeof LEAST_UPPER_BOUND; -export type XInput = { - x_google_ignoreList?: SourceMapV3['ignoreList']; -}; -export type EncodedSourceMapXInput = EncodedSourceMap & XInput; -export type DecodedSourceMapXInput = DecodedSourceMap & XInput; -export type SectionedSourceMapXInput = Omit & { - sections: SectionXInput[]; -}; -export type SectionXInput = Omit & { - map: SectionedSourceMapInput; -}; -export type SourceMapInput = string | EncodedSourceMapXInput | DecodedSourceMapXInput | TraceMap; -export type SectionedSourceMapInput = SourceMapInput | SectionedSourceMapXInput; -export type Needle = { - line: number; - column: number; - bias?: Bias; -}; -export type SourceNeedle = { - source: string; - line: number; - column: number; - bias?: Bias; -}; -export type EachMapping = { - generatedLine: number; - generatedColumn: number; - source: null; - originalLine: null; - originalColumn: null; - name: null; -} | { - generatedLine: number; - generatedColumn: number; - source: string | null; - originalLine: number; - originalColumn: number; - name: string | null; -}; -export declare abstract class SourceMap { - version: SourceMapV3['version']; - file: SourceMapV3['file']; - names: SourceMapV3['names']; - sourceRoot: SourceMapV3['sourceRoot']; - sources: SourceMapV3['sources']; - sourcesContent: SourceMapV3['sourcesContent']; - resolvedSources: SourceMapV3['sources']; - ignoreList: SourceMapV3['ignoreList']; -} -export type Ro = T extends Array ? V[] | Readonly | RoArray | Readonly> : T extends object ? T | Readonly | RoObject | Readonly> : T; -type RoArray = Ro[]; -type RoObject = { - [K in keyof T]: T[K] | Ro; -}; -export declare function parse(map: T): Exclude; -export {}; -//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/node_modules/@jridgewell/trace-mapping/types/types.d.mts.map b/node_modules/@jridgewell/trace-mapping/types/types.d.mts.map deleted file mode 100644 index 9224783..0000000 --- a/node_modules/@jridgewell/trace-mapping/types/types.d.mts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/@nodelib/fs.scandir/LICENSE b/node_modules/@nodelib/fs.scandir/LICENSE deleted file mode 100644 index 65a9994..0000000 --- a/node_modules/@nodelib/fs.scandir/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Denis Malinochkin - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/node_modules/@nodelib/fs.scandir/README.md b/node_modules/@nodelib/fs.scandir/README.md deleted file mode 100644 index e0b218b..0000000 --- a/node_modules/@nodelib/fs.scandir/README.md +++ /dev/null @@ -1,171 +0,0 @@ -# @nodelib/fs.scandir - -> List files and directories inside the specified directory. - -## :bulb: Highlights - -The package is aimed at obtaining information about entries in the directory. - -* :moneybag: Returns useful information: `name`, `path`, `dirent` and `stats` (optional). -* :gear: On Node.js 10.10+ uses the mechanism without additional calls to determine the entry type. See [`old` and `modern` mode](#old-and-modern-mode). -* :link: Can safely work with broken symbolic links. - -## Install - -```console -npm install @nodelib/fs.scandir -``` - -## Usage - -```ts -import * as fsScandir from '@nodelib/fs.scandir'; - -fsScandir.scandir('path', (error, stats) => { /* … */ }); -``` - -## API - -### .scandir(path, [optionsOrSettings], callback) - -Returns an array of plain objects ([`Entry`](#entry)) with information about entry for provided path with standard callback-style. - -```ts -fsScandir.scandir('path', (error, entries) => { /* … */ }); -fsScandir.scandir('path', {}, (error, entries) => { /* … */ }); -fsScandir.scandir('path', new fsScandir.Settings(), (error, entries) => { /* … */ }); -``` - -### .scandirSync(path, [optionsOrSettings]) - -Returns an array of plain objects ([`Entry`](#entry)) with information about entry for provided path. - -```ts -const entries = fsScandir.scandirSync('path'); -const entries = fsScandir.scandirSync('path', {}); -const entries = fsScandir.scandirSync(('path', new fsScandir.Settings()); -``` - -#### path - -* Required: `true` -* Type: `string | Buffer | URL` - -A path to a file. If a URL is provided, it must use the `file:` protocol. - -#### optionsOrSettings - -* Required: `false` -* Type: `Options | Settings` -* Default: An instance of `Settings` class - -An [`Options`](#options) object or an instance of [`Settings`](#settingsoptions) class. - -> :book: When you pass a plain object, an instance of the `Settings` class will be created automatically. If you plan to call the method frequently, use a pre-created instance of the `Settings` class. - -### Settings([options]) - -A class of full settings of the package. - -```ts -const settings = new fsScandir.Settings({ followSymbolicLinks: false }); - -const entries = fsScandir.scandirSync('path', settings); -``` - -## Entry - -* `name` — The name of the entry (`unknown.txt`). -* `path` — The path of the entry relative to call directory (`root/unknown.txt`). -* `dirent` — An instance of [`fs.Dirent`](./src/types/index.ts) class. On Node.js below 10.10 will be emulated by [`DirentFromStats`](./src/utils/fs.ts) class. -* `stats` (optional) — An instance of `fs.Stats` class. - -For example, the `scandir` call for `tools` directory with one directory inside: - -```ts -{ - dirent: Dirent { name: 'typedoc', /* … */ }, - name: 'typedoc', - path: 'tools/typedoc' -} -``` - -## Options - -### stats - -* Type: `boolean` -* Default: `false` - -Adds an instance of `fs.Stats` class to the [`Entry`](#entry). - -> :book: Always use `fs.readdir` without the `withFileTypes` option. ??TODO?? - -### followSymbolicLinks - -* Type: `boolean` -* Default: `false` - -Follow symbolic links or not. Call `fs.stat` on symbolic link if `true`. - -### `throwErrorOnBrokenSymbolicLink` - -* Type: `boolean` -* Default: `true` - -Throw an error when symbolic link is broken if `true` or safely use `lstat` call if `false`. - -### `pathSegmentSeparator` - -* Type: `string` -* Default: `path.sep` - -By default, this package uses the correct path separator for your OS (`\` on Windows, `/` on Unix-like systems). But you can set this option to any separator character(s) that you want to use instead. - -### `fs` - -* Type: [`FileSystemAdapter`](./src/adapters/fs.ts) -* Default: A default FS methods - -By default, the built-in Node.js module (`fs`) is used to work with the file system. You can replace any method with your own. - -```ts -interface FileSystemAdapter { - lstat?: typeof fs.lstat; - stat?: typeof fs.stat; - lstatSync?: typeof fs.lstatSync; - statSync?: typeof fs.statSync; - readdir?: typeof fs.readdir; - readdirSync?: typeof fs.readdirSync; -} - -const settings = new fsScandir.Settings({ - fs: { lstat: fakeLstat } -}); -``` - -## `old` and `modern` mode - -This package has two modes that are used depending on the environment and parameters of use. - -### old - -* Node.js below `10.10` or when the `stats` option is enabled - -When working in the old mode, the directory is read first (`fs.readdir`), then the type of entries is determined (`fs.lstat` and/or `fs.stat` for symbolic links). - -### modern - -* Node.js 10.10+ and the `stats` option is disabled - -In the modern mode, reading the directory (`fs.readdir` with the `withFileTypes` option) is combined with obtaining information about its entries. An additional call for symbolic links (`fs.stat`) is still present. - -This mode makes fewer calls to the file system. It's faster. - -## Changelog - -See the [Releases section of our GitHub project](https://github.com/nodelib/nodelib/releases) for changelog for each release version. - -## License - -This software is released under the terms of the MIT license. diff --git a/node_modules/@nodelib/fs.scandir/out/adapters/fs.d.ts b/node_modules/@nodelib/fs.scandir/out/adapters/fs.d.ts deleted file mode 100644 index 827f1db..0000000 --- a/node_modules/@nodelib/fs.scandir/out/adapters/fs.d.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type * as fsStat from '@nodelib/fs.stat'; -import type { Dirent, ErrnoException } from '../types'; -export interface ReaddirAsynchronousMethod { - (filepath: string, options: { - withFileTypes: true; - }, callback: (error: ErrnoException | null, files: Dirent[]) => void): void; - (filepath: string, callback: (error: ErrnoException | null, files: string[]) => void): void; -} -export interface ReaddirSynchronousMethod { - (filepath: string, options: { - withFileTypes: true; - }): Dirent[]; - (filepath: string): string[]; -} -export declare type FileSystemAdapter = fsStat.FileSystemAdapter & { - readdir: ReaddirAsynchronousMethod; - readdirSync: ReaddirSynchronousMethod; -}; -export declare const FILE_SYSTEM_ADAPTER: FileSystemAdapter; -export declare function createFileSystemAdapter(fsMethods?: Partial): FileSystemAdapter; diff --git a/node_modules/@nodelib/fs.scandir/out/adapters/fs.js b/node_modules/@nodelib/fs.scandir/out/adapters/fs.js deleted file mode 100644 index f0fe022..0000000 --- a/node_modules/@nodelib/fs.scandir/out/adapters/fs.js +++ /dev/null @@ -1,19 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.createFileSystemAdapter = exports.FILE_SYSTEM_ADAPTER = void 0; -const fs = require("fs"); -exports.FILE_SYSTEM_ADAPTER = { - lstat: fs.lstat, - stat: fs.stat, - lstatSync: fs.lstatSync, - statSync: fs.statSync, - readdir: fs.readdir, - readdirSync: fs.readdirSync -}; -function createFileSystemAdapter(fsMethods) { - if (fsMethods === undefined) { - return exports.FILE_SYSTEM_ADAPTER; - } - return Object.assign(Object.assign({}, exports.FILE_SYSTEM_ADAPTER), fsMethods); -} -exports.createFileSystemAdapter = createFileSystemAdapter; diff --git a/node_modules/@nodelib/fs.scandir/out/constants.d.ts b/node_modules/@nodelib/fs.scandir/out/constants.d.ts deleted file mode 100644 index 33f1749..0000000 --- a/node_modules/@nodelib/fs.scandir/out/constants.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -/** - * IS `true` for Node.js 10.10 and greater. - */ -export declare const IS_SUPPORT_READDIR_WITH_FILE_TYPES: boolean; diff --git a/node_modules/@nodelib/fs.scandir/out/constants.js b/node_modules/@nodelib/fs.scandir/out/constants.js deleted file mode 100644 index 7e3d441..0000000 --- a/node_modules/@nodelib/fs.scandir/out/constants.js +++ /dev/null @@ -1,17 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = void 0; -const NODE_PROCESS_VERSION_PARTS = process.versions.node.split('.'); -if (NODE_PROCESS_VERSION_PARTS[0] === undefined || NODE_PROCESS_VERSION_PARTS[1] === undefined) { - throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`); -} -const MAJOR_VERSION = Number.parseInt(NODE_PROCESS_VERSION_PARTS[0], 10); -const MINOR_VERSION = Number.parseInt(NODE_PROCESS_VERSION_PARTS[1], 10); -const SUPPORTED_MAJOR_VERSION = 10; -const SUPPORTED_MINOR_VERSION = 10; -const IS_MATCHED_BY_MAJOR = MAJOR_VERSION > SUPPORTED_MAJOR_VERSION; -const IS_MATCHED_BY_MAJOR_AND_MINOR = MAJOR_VERSION === SUPPORTED_MAJOR_VERSION && MINOR_VERSION >= SUPPORTED_MINOR_VERSION; -/** - * IS `true` for Node.js 10.10 and greater. - */ -exports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = IS_MATCHED_BY_MAJOR || IS_MATCHED_BY_MAJOR_AND_MINOR; diff --git a/node_modules/@nodelib/fs.scandir/out/index.d.ts b/node_modules/@nodelib/fs.scandir/out/index.d.ts deleted file mode 100644 index b9da83e..0000000 --- a/node_modules/@nodelib/fs.scandir/out/index.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { FileSystemAdapter, ReaddirAsynchronousMethod, ReaddirSynchronousMethod } from './adapters/fs'; -import * as async from './providers/async'; -import Settings, { Options } from './settings'; -import type { Dirent, Entry } from './types'; -declare type AsyncCallback = async.AsyncCallback; -declare function scandir(path: string, callback: AsyncCallback): void; -declare function scandir(path: string, optionsOrSettings: Options | Settings, callback: AsyncCallback): void; -declare namespace scandir { - function __promisify__(path: string, optionsOrSettings?: Options | Settings): Promise; -} -declare function scandirSync(path: string, optionsOrSettings?: Options | Settings): Entry[]; -export { scandir, scandirSync, Settings, AsyncCallback, Dirent, Entry, FileSystemAdapter, ReaddirAsynchronousMethod, ReaddirSynchronousMethod, Options }; diff --git a/node_modules/@nodelib/fs.scandir/out/index.js b/node_modules/@nodelib/fs.scandir/out/index.js deleted file mode 100644 index 99c70d3..0000000 --- a/node_modules/@nodelib/fs.scandir/out/index.js +++ /dev/null @@ -1,26 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Settings = exports.scandirSync = exports.scandir = void 0; -const async = require("./providers/async"); -const sync = require("./providers/sync"); -const settings_1 = require("./settings"); -exports.Settings = settings_1.default; -function scandir(path, optionsOrSettingsOrCallback, callback) { - if (typeof optionsOrSettingsOrCallback === 'function') { - async.read(path, getSettings(), optionsOrSettingsOrCallback); - return; - } - async.read(path, getSettings(optionsOrSettingsOrCallback), callback); -} -exports.scandir = scandir; -function scandirSync(path, optionsOrSettings) { - const settings = getSettings(optionsOrSettings); - return sync.read(path, settings); -} -exports.scandirSync = scandirSync; -function getSettings(settingsOrOptions = {}) { - if (settingsOrOptions instanceof settings_1.default) { - return settingsOrOptions; - } - return new settings_1.default(settingsOrOptions); -} diff --git a/node_modules/@nodelib/fs.scandir/out/providers/async.d.ts b/node_modules/@nodelib/fs.scandir/out/providers/async.d.ts deleted file mode 100644 index 5829676..0000000 --- a/node_modules/@nodelib/fs.scandir/out/providers/async.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -/// -import type Settings from '../settings'; -import type { Entry } from '../types'; -export declare type AsyncCallback = (error: NodeJS.ErrnoException, entries: Entry[]) => void; -export declare function read(directory: string, settings: Settings, callback: AsyncCallback): void; -export declare function readdirWithFileTypes(directory: string, settings: Settings, callback: AsyncCallback): void; -export declare function readdir(directory: string, settings: Settings, callback: AsyncCallback): void; diff --git a/node_modules/@nodelib/fs.scandir/out/providers/async.js b/node_modules/@nodelib/fs.scandir/out/providers/async.js deleted file mode 100644 index e8e2f0a..0000000 --- a/node_modules/@nodelib/fs.scandir/out/providers/async.js +++ /dev/null @@ -1,104 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.readdir = exports.readdirWithFileTypes = exports.read = void 0; -const fsStat = require("@nodelib/fs.stat"); -const rpl = require("run-parallel"); -const constants_1 = require("../constants"); -const utils = require("../utils"); -const common = require("./common"); -function read(directory, settings, callback) { - if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { - readdirWithFileTypes(directory, settings, callback); - return; - } - readdir(directory, settings, callback); -} -exports.read = read; -function readdirWithFileTypes(directory, settings, callback) { - settings.fs.readdir(directory, { withFileTypes: true }, (readdirError, dirents) => { - if (readdirError !== null) { - callFailureCallback(callback, readdirError); - return; - } - const entries = dirents.map((dirent) => ({ - dirent, - name: dirent.name, - path: common.joinPathSegments(directory, dirent.name, settings.pathSegmentSeparator) - })); - if (!settings.followSymbolicLinks) { - callSuccessCallback(callback, entries); - return; - } - const tasks = entries.map((entry) => makeRplTaskEntry(entry, settings)); - rpl(tasks, (rplError, rplEntries) => { - if (rplError !== null) { - callFailureCallback(callback, rplError); - return; - } - callSuccessCallback(callback, rplEntries); - }); - }); -} -exports.readdirWithFileTypes = readdirWithFileTypes; -function makeRplTaskEntry(entry, settings) { - return (done) => { - if (!entry.dirent.isSymbolicLink()) { - done(null, entry); - return; - } - settings.fs.stat(entry.path, (statError, stats) => { - if (statError !== null) { - if (settings.throwErrorOnBrokenSymbolicLink) { - done(statError); - return; - } - done(null, entry); - return; - } - entry.dirent = utils.fs.createDirentFromStats(entry.name, stats); - done(null, entry); - }); - }; -} -function readdir(directory, settings, callback) { - settings.fs.readdir(directory, (readdirError, names) => { - if (readdirError !== null) { - callFailureCallback(callback, readdirError); - return; - } - const tasks = names.map((name) => { - const path = common.joinPathSegments(directory, name, settings.pathSegmentSeparator); - return (done) => { - fsStat.stat(path, settings.fsStatSettings, (error, stats) => { - if (error !== null) { - done(error); - return; - } - const entry = { - name, - path, - dirent: utils.fs.createDirentFromStats(name, stats) - }; - if (settings.stats) { - entry.stats = stats; - } - done(null, entry); - }); - }; - }); - rpl(tasks, (rplError, entries) => { - if (rplError !== null) { - callFailureCallback(callback, rplError); - return; - } - callSuccessCallback(callback, entries); - }); - }); -} -exports.readdir = readdir; -function callFailureCallback(callback, error) { - callback(error); -} -function callSuccessCallback(callback, result) { - callback(null, result); -} diff --git a/node_modules/@nodelib/fs.scandir/out/providers/common.d.ts b/node_modules/@nodelib/fs.scandir/out/providers/common.d.ts deleted file mode 100644 index 2b4d08b..0000000 --- a/node_modules/@nodelib/fs.scandir/out/providers/common.d.ts +++ /dev/null @@ -1 +0,0 @@ -export declare function joinPathSegments(a: string, b: string, separator: string): string; diff --git a/node_modules/@nodelib/fs.scandir/out/providers/common.js b/node_modules/@nodelib/fs.scandir/out/providers/common.js deleted file mode 100644 index 8724cb5..0000000 --- a/node_modules/@nodelib/fs.scandir/out/providers/common.js +++ /dev/null @@ -1,13 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.joinPathSegments = void 0; -function joinPathSegments(a, b, separator) { - /** - * The correct handling of cases when the first segment is a root (`/`, `C:/`) or UNC path (`//?/C:/`). - */ - if (a.endsWith(separator)) { - return a + b; - } - return a + separator + b; -} -exports.joinPathSegments = joinPathSegments; diff --git a/node_modules/@nodelib/fs.scandir/out/providers/sync.d.ts b/node_modules/@nodelib/fs.scandir/out/providers/sync.d.ts deleted file mode 100644 index e05c8f0..0000000 --- a/node_modules/@nodelib/fs.scandir/out/providers/sync.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type Settings from '../settings'; -import type { Entry } from '../types'; -export declare function read(directory: string, settings: Settings): Entry[]; -export declare function readdirWithFileTypes(directory: string, settings: Settings): Entry[]; -export declare function readdir(directory: string, settings: Settings): Entry[]; diff --git a/node_modules/@nodelib/fs.scandir/out/providers/sync.js b/node_modules/@nodelib/fs.scandir/out/providers/sync.js deleted file mode 100644 index 146db34..0000000 --- a/node_modules/@nodelib/fs.scandir/out/providers/sync.js +++ /dev/null @@ -1,54 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.readdir = exports.readdirWithFileTypes = exports.read = void 0; -const fsStat = require("@nodelib/fs.stat"); -const constants_1 = require("../constants"); -const utils = require("../utils"); -const common = require("./common"); -function read(directory, settings) { - if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { - return readdirWithFileTypes(directory, settings); - } - return readdir(directory, settings); -} -exports.read = read; -function readdirWithFileTypes(directory, settings) { - const dirents = settings.fs.readdirSync(directory, { withFileTypes: true }); - return dirents.map((dirent) => { - const entry = { - dirent, - name: dirent.name, - path: common.joinPathSegments(directory, dirent.name, settings.pathSegmentSeparator) - }; - if (entry.dirent.isSymbolicLink() && settings.followSymbolicLinks) { - try { - const stats = settings.fs.statSync(entry.path); - entry.dirent = utils.fs.createDirentFromStats(entry.name, stats); - } - catch (error) { - if (settings.throwErrorOnBrokenSymbolicLink) { - throw error; - } - } - } - return entry; - }); -} -exports.readdirWithFileTypes = readdirWithFileTypes; -function readdir(directory, settings) { - const names = settings.fs.readdirSync(directory); - return names.map((name) => { - const entryPath = common.joinPathSegments(directory, name, settings.pathSegmentSeparator); - const stats = fsStat.statSync(entryPath, settings.fsStatSettings); - const entry = { - name, - path: entryPath, - dirent: utils.fs.createDirentFromStats(name, stats) - }; - if (settings.stats) { - entry.stats = stats; - } - return entry; - }); -} -exports.readdir = readdir; diff --git a/node_modules/@nodelib/fs.scandir/out/settings.d.ts b/node_modules/@nodelib/fs.scandir/out/settings.d.ts deleted file mode 100644 index a0db115..0000000 --- a/node_modules/@nodelib/fs.scandir/out/settings.d.ts +++ /dev/null @@ -1,20 +0,0 @@ -import * as fsStat from '@nodelib/fs.stat'; -import * as fs from './adapters/fs'; -export interface Options { - followSymbolicLinks?: boolean; - fs?: Partial; - pathSegmentSeparator?: string; - stats?: boolean; - throwErrorOnBrokenSymbolicLink?: boolean; -} -export default class Settings { - private readonly _options; - readonly followSymbolicLinks: boolean; - readonly fs: fs.FileSystemAdapter; - readonly pathSegmentSeparator: string; - readonly stats: boolean; - readonly throwErrorOnBrokenSymbolicLink: boolean; - readonly fsStatSettings: fsStat.Settings; - constructor(_options?: Options); - private _getValue; -} diff --git a/node_modules/@nodelib/fs.scandir/out/settings.js b/node_modules/@nodelib/fs.scandir/out/settings.js deleted file mode 100644 index 15a3e8c..0000000 --- a/node_modules/@nodelib/fs.scandir/out/settings.js +++ /dev/null @@ -1,24 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const path = require("path"); -const fsStat = require("@nodelib/fs.stat"); -const fs = require("./adapters/fs"); -class Settings { - constructor(_options = {}) { - this._options = _options; - this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, false); - this.fs = fs.createFileSystemAdapter(this._options.fs); - this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep); - this.stats = this._getValue(this._options.stats, false); - this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true); - this.fsStatSettings = new fsStat.Settings({ - followSymbolicLink: this.followSymbolicLinks, - fs: this.fs, - throwErrorOnBrokenSymbolicLink: this.throwErrorOnBrokenSymbolicLink - }); - } - _getValue(option, value) { - return option !== null && option !== void 0 ? option : value; - } -} -exports.default = Settings; diff --git a/node_modules/@nodelib/fs.scandir/out/types/index.d.ts b/node_modules/@nodelib/fs.scandir/out/types/index.d.ts deleted file mode 100644 index f326c5e..0000000 --- a/node_modules/@nodelib/fs.scandir/out/types/index.d.ts +++ /dev/null @@ -1,20 +0,0 @@ -/// -import type * as fs from 'fs'; -export interface Entry { - dirent: Dirent; - name: string; - path: string; - stats?: Stats; -} -export declare type Stats = fs.Stats; -export declare type ErrnoException = NodeJS.ErrnoException; -export interface Dirent { - isBlockDevice: () => boolean; - isCharacterDevice: () => boolean; - isDirectory: () => boolean; - isFIFO: () => boolean; - isFile: () => boolean; - isSocket: () => boolean; - isSymbolicLink: () => boolean; - name: string; -} diff --git a/node_modules/@nodelib/fs.scandir/out/types/index.js b/node_modules/@nodelib/fs.scandir/out/types/index.js deleted file mode 100644 index c8ad2e5..0000000 --- a/node_modules/@nodelib/fs.scandir/out/types/index.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/node_modules/@nodelib/fs.scandir/out/utils/fs.d.ts b/node_modules/@nodelib/fs.scandir/out/utils/fs.d.ts deleted file mode 100644 index bb863f1..0000000 --- a/node_modules/@nodelib/fs.scandir/out/utils/fs.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -import type { Dirent, Stats } from '../types'; -export declare function createDirentFromStats(name: string, stats: Stats): Dirent; diff --git a/node_modules/@nodelib/fs.scandir/out/utils/fs.js b/node_modules/@nodelib/fs.scandir/out/utils/fs.js deleted file mode 100644 index ace7c74..0000000 --- a/node_modules/@nodelib/fs.scandir/out/utils/fs.js +++ /dev/null @@ -1,19 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.createDirentFromStats = void 0; -class DirentFromStats { - constructor(name, stats) { - this.name = name; - this.isBlockDevice = stats.isBlockDevice.bind(stats); - this.isCharacterDevice = stats.isCharacterDevice.bind(stats); - this.isDirectory = stats.isDirectory.bind(stats); - this.isFIFO = stats.isFIFO.bind(stats); - this.isFile = stats.isFile.bind(stats); - this.isSocket = stats.isSocket.bind(stats); - this.isSymbolicLink = stats.isSymbolicLink.bind(stats); - } -} -function createDirentFromStats(name, stats) { - return new DirentFromStats(name, stats); -} -exports.createDirentFromStats = createDirentFromStats; diff --git a/node_modules/@nodelib/fs.scandir/out/utils/index.d.ts b/node_modules/@nodelib/fs.scandir/out/utils/index.d.ts deleted file mode 100644 index 1b41954..0000000 --- a/node_modules/@nodelib/fs.scandir/out/utils/index.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -import * as fs from './fs'; -export { fs }; diff --git a/node_modules/@nodelib/fs.scandir/out/utils/index.js b/node_modules/@nodelib/fs.scandir/out/utils/index.js deleted file mode 100644 index f5de129..0000000 --- a/node_modules/@nodelib/fs.scandir/out/utils/index.js +++ /dev/null @@ -1,5 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.fs = void 0; -const fs = require("./fs"); -exports.fs = fs; diff --git a/node_modules/@nodelib/fs.scandir/package.json b/node_modules/@nodelib/fs.scandir/package.json deleted file mode 100644 index d3a8924..0000000 --- a/node_modules/@nodelib/fs.scandir/package.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "@nodelib/fs.scandir", - "version": "2.1.5", - "description": "List files and directories inside the specified directory", - "license": "MIT", - "repository": "https://github.com/nodelib/nodelib/tree/master/packages/fs/fs.scandir", - "keywords": [ - "NodeLib", - "fs", - "FileSystem", - "file system", - "scandir", - "readdir", - "dirent" - ], - "engines": { - "node": ">= 8" - }, - "files": [ - "out/**", - "!out/**/*.map", - "!out/**/*.spec.*" - ], - "main": "out/index.js", - "typings": "out/index.d.ts", - "scripts": { - "clean": "rimraf {tsconfig.tsbuildinfo,out}", - "lint": "eslint \"src/**/*.ts\" --cache", - "compile": "tsc -b .", - "compile:watch": "tsc -p . --watch --sourceMap", - "test": "mocha \"out/**/*.spec.js\" -s 0", - "build": "npm run clean && npm run compile && npm run lint && npm test", - "watch": "npm run clean && npm run compile:watch" - }, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "devDependencies": { - "@nodelib/fs.macchiato": "1.0.4", - "@types/run-parallel": "^1.1.0" - }, - "gitHead": "d6a7960d5281d3dd5f8e2efba49bb552d090f562" -} diff --git a/node_modules/@nodelib/fs.stat/LICENSE b/node_modules/@nodelib/fs.stat/LICENSE deleted file mode 100644 index 65a9994..0000000 --- a/node_modules/@nodelib/fs.stat/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Denis Malinochkin - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/node_modules/@nodelib/fs.stat/README.md b/node_modules/@nodelib/fs.stat/README.md deleted file mode 100644 index 686f047..0000000 --- a/node_modules/@nodelib/fs.stat/README.md +++ /dev/null @@ -1,126 +0,0 @@ -# @nodelib/fs.stat - -> Get the status of a file with some features. - -## :bulb: Highlights - -Wrapper around standard method `fs.lstat` and `fs.stat` with some features. - -* :beginner: Normally follows symbolic link. -* :gear: Can safely work with broken symbolic link. - -## Install - -```console -npm install @nodelib/fs.stat -``` - -## Usage - -```ts -import * as fsStat from '@nodelib/fs.stat'; - -fsStat.stat('path', (error, stats) => { /* … */ }); -``` - -## API - -### .stat(path, [optionsOrSettings], callback) - -Returns an instance of `fs.Stats` class for provided path with standard callback-style. - -```ts -fsStat.stat('path', (error, stats) => { /* … */ }); -fsStat.stat('path', {}, (error, stats) => { /* … */ }); -fsStat.stat('path', new fsStat.Settings(), (error, stats) => { /* … */ }); -``` - -### .statSync(path, [optionsOrSettings]) - -Returns an instance of `fs.Stats` class for provided path. - -```ts -const stats = fsStat.stat('path'); -const stats = fsStat.stat('path', {}); -const stats = fsStat.stat('path', new fsStat.Settings()); -``` - -#### path - -* Required: `true` -* Type: `string | Buffer | URL` - -A path to a file. If a URL is provided, it must use the `file:` protocol. - -#### optionsOrSettings - -* Required: `false` -* Type: `Options | Settings` -* Default: An instance of `Settings` class - -An [`Options`](#options) object or an instance of [`Settings`](#settings) class. - -> :book: When you pass a plain object, an instance of the `Settings` class will be created automatically. If you plan to call the method frequently, use a pre-created instance of the `Settings` class. - -### Settings([options]) - -A class of full settings of the package. - -```ts -const settings = new fsStat.Settings({ followSymbolicLink: false }); - -const stats = fsStat.stat('path', settings); -``` - -## Options - -### `followSymbolicLink` - -* Type: `boolean` -* Default: `true` - -Follow symbolic link or not. Call `fs.stat` on symbolic link if `true`. - -### `markSymbolicLink` - -* Type: `boolean` -* Default: `false` - -Mark symbolic link by setting the return value of `isSymbolicLink` function to always `true` (even after `fs.stat`). - -> :book: Can be used if you want to know what is hidden behind a symbolic link, but still continue to know that it is a symbolic link. - -### `throwErrorOnBrokenSymbolicLink` - -* Type: `boolean` -* Default: `true` - -Throw an error when symbolic link is broken if `true` or safely return `lstat` call if `false`. - -### `fs` - -* Type: [`FileSystemAdapter`](./src/adapters/fs.ts) -* Default: A default FS methods - -By default, the built-in Node.js module (`fs`) is used to work with the file system. You can replace any method with your own. - -```ts -interface FileSystemAdapter { - lstat?: typeof fs.lstat; - stat?: typeof fs.stat; - lstatSync?: typeof fs.lstatSync; - statSync?: typeof fs.statSync; -} - -const settings = new fsStat.Settings({ - fs: { lstat: fakeLstat } -}); -``` - -## Changelog - -See the [Releases section of our GitHub project](https://github.com/nodelib/nodelib/releases) for changelog for each release version. - -## License - -This software is released under the terms of the MIT license. diff --git a/node_modules/@nodelib/fs.stat/out/adapters/fs.d.ts b/node_modules/@nodelib/fs.stat/out/adapters/fs.d.ts deleted file mode 100644 index 3af759c..0000000 --- a/node_modules/@nodelib/fs.stat/out/adapters/fs.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -/// -import * as fs from 'fs'; -import type { ErrnoException } from '../types'; -export declare type StatAsynchronousMethod = (path: string, callback: (error: ErrnoException | null, stats: fs.Stats) => void) => void; -export declare type StatSynchronousMethod = (path: string) => fs.Stats; -export interface FileSystemAdapter { - lstat: StatAsynchronousMethod; - stat: StatAsynchronousMethod; - lstatSync: StatSynchronousMethod; - statSync: StatSynchronousMethod; -} -export declare const FILE_SYSTEM_ADAPTER: FileSystemAdapter; -export declare function createFileSystemAdapter(fsMethods?: Partial): FileSystemAdapter; diff --git a/node_modules/@nodelib/fs.stat/out/adapters/fs.js b/node_modules/@nodelib/fs.stat/out/adapters/fs.js deleted file mode 100644 index 8dc08c8..0000000 --- a/node_modules/@nodelib/fs.stat/out/adapters/fs.js +++ /dev/null @@ -1,17 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.createFileSystemAdapter = exports.FILE_SYSTEM_ADAPTER = void 0; -const fs = require("fs"); -exports.FILE_SYSTEM_ADAPTER = { - lstat: fs.lstat, - stat: fs.stat, - lstatSync: fs.lstatSync, - statSync: fs.statSync -}; -function createFileSystemAdapter(fsMethods) { - if (fsMethods === undefined) { - return exports.FILE_SYSTEM_ADAPTER; - } - return Object.assign(Object.assign({}, exports.FILE_SYSTEM_ADAPTER), fsMethods); -} -exports.createFileSystemAdapter = createFileSystemAdapter; diff --git a/node_modules/@nodelib/fs.stat/out/index.d.ts b/node_modules/@nodelib/fs.stat/out/index.d.ts deleted file mode 100644 index f95db99..0000000 --- a/node_modules/@nodelib/fs.stat/out/index.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { FileSystemAdapter, StatAsynchronousMethod, StatSynchronousMethod } from './adapters/fs'; -import * as async from './providers/async'; -import Settings, { Options } from './settings'; -import type { Stats } from './types'; -declare type AsyncCallback = async.AsyncCallback; -declare function stat(path: string, callback: AsyncCallback): void; -declare function stat(path: string, optionsOrSettings: Options | Settings, callback: AsyncCallback): void; -declare namespace stat { - function __promisify__(path: string, optionsOrSettings?: Options | Settings): Promise; -} -declare function statSync(path: string, optionsOrSettings?: Options | Settings): Stats; -export { Settings, stat, statSync, AsyncCallback, FileSystemAdapter, StatAsynchronousMethod, StatSynchronousMethod, Options, Stats }; diff --git a/node_modules/@nodelib/fs.stat/out/index.js b/node_modules/@nodelib/fs.stat/out/index.js deleted file mode 100644 index b23f751..0000000 --- a/node_modules/@nodelib/fs.stat/out/index.js +++ /dev/null @@ -1,26 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.statSync = exports.stat = exports.Settings = void 0; -const async = require("./providers/async"); -const sync = require("./providers/sync"); -const settings_1 = require("./settings"); -exports.Settings = settings_1.default; -function stat(path, optionsOrSettingsOrCallback, callback) { - if (typeof optionsOrSettingsOrCallback === 'function') { - async.read(path, getSettings(), optionsOrSettingsOrCallback); - return; - } - async.read(path, getSettings(optionsOrSettingsOrCallback), callback); -} -exports.stat = stat; -function statSync(path, optionsOrSettings) { - const settings = getSettings(optionsOrSettings); - return sync.read(path, settings); -} -exports.statSync = statSync; -function getSettings(settingsOrOptions = {}) { - if (settingsOrOptions instanceof settings_1.default) { - return settingsOrOptions; - } - return new settings_1.default(settingsOrOptions); -} diff --git a/node_modules/@nodelib/fs.stat/out/providers/async.d.ts b/node_modules/@nodelib/fs.stat/out/providers/async.d.ts deleted file mode 100644 index 85423ce..0000000 --- a/node_modules/@nodelib/fs.stat/out/providers/async.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import type Settings from '../settings'; -import type { ErrnoException, Stats } from '../types'; -export declare type AsyncCallback = (error: ErrnoException, stats: Stats) => void; -export declare function read(path: string, settings: Settings, callback: AsyncCallback): void; diff --git a/node_modules/@nodelib/fs.stat/out/providers/async.js b/node_modules/@nodelib/fs.stat/out/providers/async.js deleted file mode 100644 index 983ff0e..0000000 --- a/node_modules/@nodelib/fs.stat/out/providers/async.js +++ /dev/null @@ -1,36 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.read = void 0; -function read(path, settings, callback) { - settings.fs.lstat(path, (lstatError, lstat) => { - if (lstatError !== null) { - callFailureCallback(callback, lstatError); - return; - } - if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) { - callSuccessCallback(callback, lstat); - return; - } - settings.fs.stat(path, (statError, stat) => { - if (statError !== null) { - if (settings.throwErrorOnBrokenSymbolicLink) { - callFailureCallback(callback, statError); - return; - } - callSuccessCallback(callback, lstat); - return; - } - if (settings.markSymbolicLink) { - stat.isSymbolicLink = () => true; - } - callSuccessCallback(callback, stat); - }); - }); -} -exports.read = read; -function callFailureCallback(callback, error) { - callback(error); -} -function callSuccessCallback(callback, result) { - callback(null, result); -} diff --git a/node_modules/@nodelib/fs.stat/out/providers/sync.d.ts b/node_modules/@nodelib/fs.stat/out/providers/sync.d.ts deleted file mode 100644 index 428c3d7..0000000 --- a/node_modules/@nodelib/fs.stat/out/providers/sync.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type Settings from '../settings'; -import type { Stats } from '../types'; -export declare function read(path: string, settings: Settings): Stats; diff --git a/node_modules/@nodelib/fs.stat/out/providers/sync.js b/node_modules/@nodelib/fs.stat/out/providers/sync.js deleted file mode 100644 index 1521c36..0000000 --- a/node_modules/@nodelib/fs.stat/out/providers/sync.js +++ /dev/null @@ -1,23 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.read = void 0; -function read(path, settings) { - const lstat = settings.fs.lstatSync(path); - if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) { - return lstat; - } - try { - const stat = settings.fs.statSync(path); - if (settings.markSymbolicLink) { - stat.isSymbolicLink = () => true; - } - return stat; - } - catch (error) { - if (!settings.throwErrorOnBrokenSymbolicLink) { - return lstat; - } - throw error; - } -} -exports.read = read; diff --git a/node_modules/@nodelib/fs.stat/out/settings.d.ts b/node_modules/@nodelib/fs.stat/out/settings.d.ts deleted file mode 100644 index f4b3d44..0000000 --- a/node_modules/@nodelib/fs.stat/out/settings.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import * as fs from './adapters/fs'; -export interface Options { - followSymbolicLink?: boolean; - fs?: Partial; - markSymbolicLink?: boolean; - throwErrorOnBrokenSymbolicLink?: boolean; -} -export default class Settings { - private readonly _options; - readonly followSymbolicLink: boolean; - readonly fs: fs.FileSystemAdapter; - readonly markSymbolicLink: boolean; - readonly throwErrorOnBrokenSymbolicLink: boolean; - constructor(_options?: Options); - private _getValue; -} diff --git a/node_modules/@nodelib/fs.stat/out/settings.js b/node_modules/@nodelib/fs.stat/out/settings.js deleted file mode 100644 index 111ec09..0000000 --- a/node_modules/@nodelib/fs.stat/out/settings.js +++ /dev/null @@ -1,16 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const fs = require("./adapters/fs"); -class Settings { - constructor(_options = {}) { - this._options = _options; - this.followSymbolicLink = this._getValue(this._options.followSymbolicLink, true); - this.fs = fs.createFileSystemAdapter(this._options.fs); - this.markSymbolicLink = this._getValue(this._options.markSymbolicLink, false); - this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true); - } - _getValue(option, value) { - return option !== null && option !== void 0 ? option : value; - } -} -exports.default = Settings; diff --git a/node_modules/@nodelib/fs.stat/out/types/index.d.ts b/node_modules/@nodelib/fs.stat/out/types/index.d.ts deleted file mode 100644 index 74c08ed..0000000 --- a/node_modules/@nodelib/fs.stat/out/types/index.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -/// -import type * as fs from 'fs'; -export declare type Stats = fs.Stats; -export declare type ErrnoException = NodeJS.ErrnoException; diff --git a/node_modules/@nodelib/fs.stat/out/types/index.js b/node_modules/@nodelib/fs.stat/out/types/index.js deleted file mode 100644 index c8ad2e5..0000000 --- a/node_modules/@nodelib/fs.stat/out/types/index.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/node_modules/@nodelib/fs.stat/package.json b/node_modules/@nodelib/fs.stat/package.json deleted file mode 100644 index f2540c2..0000000 --- a/node_modules/@nodelib/fs.stat/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "@nodelib/fs.stat", - "version": "2.0.5", - "description": "Get the status of a file with some features", - "license": "MIT", - "repository": "https://github.com/nodelib/nodelib/tree/master/packages/fs/fs.stat", - "keywords": [ - "NodeLib", - "fs", - "FileSystem", - "file system", - "stat" - ], - "engines": { - "node": ">= 8" - }, - "files": [ - "out/**", - "!out/**/*.map", - "!out/**/*.spec.*" - ], - "main": "out/index.js", - "typings": "out/index.d.ts", - "scripts": { - "clean": "rimraf {tsconfig.tsbuildinfo,out}", - "lint": "eslint \"src/**/*.ts\" --cache", - "compile": "tsc -b .", - "compile:watch": "tsc -p . --watch --sourceMap", - "test": "mocha \"out/**/*.spec.js\" -s 0", - "build": "npm run clean && npm run compile && npm run lint && npm test", - "watch": "npm run clean && npm run compile:watch" - }, - "devDependencies": { - "@nodelib/fs.macchiato": "1.0.4" - }, - "gitHead": "d6a7960d5281d3dd5f8e2efba49bb552d090f562" -} diff --git a/node_modules/@nodelib/fs.walk/LICENSE b/node_modules/@nodelib/fs.walk/LICENSE deleted file mode 100644 index 65a9994..0000000 --- a/node_modules/@nodelib/fs.walk/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Denis Malinochkin - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/node_modules/@nodelib/fs.walk/README.md b/node_modules/@nodelib/fs.walk/README.md deleted file mode 100644 index 6ccc08d..0000000 --- a/node_modules/@nodelib/fs.walk/README.md +++ /dev/null @@ -1,215 +0,0 @@ -# @nodelib/fs.walk - -> A library for efficiently walking a directory recursively. - -## :bulb: Highlights - -* :moneybag: Returns useful information: `name`, `path`, `dirent` and `stats` (optional). -* :rocket: On Node.js 10.10+ uses the mechanism without additional calls to determine the entry type for performance reasons. See [`old` and `modern` mode](https://github.com/nodelib/nodelib/blob/master/packages/fs/fs.scandir/README.md#old-and-modern-mode). -* :gear: Built-in directories/files and error filtering system. -* :link: Can safely work with broken symbolic links. - -## Install - -```console -npm install @nodelib/fs.walk -``` - -## Usage - -```ts -import * as fsWalk from '@nodelib/fs.walk'; - -fsWalk.walk('path', (error, entries) => { /* … */ }); -``` - -## API - -### .walk(path, [optionsOrSettings], callback) - -Reads the directory recursively and asynchronously. Requires a callback function. - -> :book: If you want to use the Promise API, use `util.promisify`. - -```ts -fsWalk.walk('path', (error, entries) => { /* … */ }); -fsWalk.walk('path', {}, (error, entries) => { /* … */ }); -fsWalk.walk('path', new fsWalk.Settings(), (error, entries) => { /* … */ }); -``` - -### .walkStream(path, [optionsOrSettings]) - -Reads the directory recursively and asynchronously. [Readable Stream](https://nodejs.org/dist/latest-v12.x/docs/api/stream.html#stream_readable_streams) is used as a provider. - -```ts -const stream = fsWalk.walkStream('path'); -const stream = fsWalk.walkStream('path', {}); -const stream = fsWalk.walkStream('path', new fsWalk.Settings()); -``` - -### .walkSync(path, [optionsOrSettings]) - -Reads the directory recursively and synchronously. Returns an array of entries. - -```ts -const entries = fsWalk.walkSync('path'); -const entries = fsWalk.walkSync('path', {}); -const entries = fsWalk.walkSync('path', new fsWalk.Settings()); -``` - -#### path - -* Required: `true` -* Type: `string | Buffer | URL` - -A path to a file. If a URL is provided, it must use the `file:` protocol. - -#### optionsOrSettings - -* Required: `false` -* Type: `Options | Settings` -* Default: An instance of `Settings` class - -An [`Options`](#options) object or an instance of [`Settings`](#settings) class. - -> :book: When you pass a plain object, an instance of the `Settings` class will be created automatically. If you plan to call the method frequently, use a pre-created instance of the `Settings` class. - -### Settings([options]) - -A class of full settings of the package. - -```ts -const settings = new fsWalk.Settings({ followSymbolicLinks: true }); - -const entries = fsWalk.walkSync('path', settings); -``` - -## Entry - -* `name` — The name of the entry (`unknown.txt`). -* `path` — The path of the entry relative to call directory (`root/unknown.txt`). -* `dirent` — An instance of [`fs.Dirent`](./src/types/index.ts) class. -* [`stats`] — An instance of `fs.Stats` class. - -## Options - -### basePath - -* Type: `string` -* Default: `undefined` - -By default, all paths are built relative to the root path. You can use this option to set custom root path. - -In the example below we read the files from the `root` directory, but in the results the root path will be `custom`. - -```ts -fsWalk.walkSync('root'); // → ['root/file.txt'] -fsWalk.walkSync('root', { basePath: 'custom' }); // → ['custom/file.txt'] -``` - -### concurrency - -* Type: `number` -* Default: `Infinity` - -The maximum number of concurrent calls to `fs.readdir`. - -> :book: The higher the number, the higher performance and the load on the File System. If you want to read in quiet mode, set the value to `4 * os.cpus().length` (4 is default size of [thread pool work scheduling](http://docs.libuv.org/en/v1.x/threadpool.html#thread-pool-work-scheduling)). - -### deepFilter - -* Type: [`DeepFilterFunction`](./src/settings.ts) -* Default: `undefined` - -A function that indicates whether the directory will be read deep or not. - -```ts -// Skip all directories that starts with `node_modules` -const filter: DeepFilterFunction = (entry) => !entry.path.startsWith('node_modules'); -``` - -### entryFilter - -* Type: [`EntryFilterFunction`](./src/settings.ts) -* Default: `undefined` - -A function that indicates whether the entry will be included to results or not. - -```ts -// Exclude all `.js` files from results -const filter: EntryFilterFunction = (entry) => !entry.name.endsWith('.js'); -``` - -### errorFilter - -* Type: [`ErrorFilterFunction`](./src/settings.ts) -* Default: `undefined` - -A function that allows you to skip errors that occur when reading directories. - -For example, you can skip `ENOENT` errors if required: - -```ts -// Skip all ENOENT errors -const filter: ErrorFilterFunction = (error) => error.code == 'ENOENT'; -``` - -### stats - -* Type: `boolean` -* Default: `false` - -Adds an instance of `fs.Stats` class to the [`Entry`](#entry). - -> :book: Always use `fs.readdir` with additional `fs.lstat/fs.stat` calls to determine the entry type. - -### followSymbolicLinks - -* Type: `boolean` -* Default: `false` - -Follow symbolic links or not. Call `fs.stat` on symbolic link if `true`. - -### `throwErrorOnBrokenSymbolicLink` - -* Type: `boolean` -* Default: `true` - -Throw an error when symbolic link is broken if `true` or safely return `lstat` call if `false`. - -### `pathSegmentSeparator` - -* Type: `string` -* Default: `path.sep` - -By default, this package uses the correct path separator for your OS (`\` on Windows, `/` on Unix-like systems). But you can set this option to any separator character(s) that you want to use instead. - -### `fs` - -* Type: `FileSystemAdapter` -* Default: A default FS methods - -By default, the built-in Node.js module (`fs`) is used to work with the file system. You can replace any method with your own. - -```ts -interface FileSystemAdapter { - lstat: typeof fs.lstat; - stat: typeof fs.stat; - lstatSync: typeof fs.lstatSync; - statSync: typeof fs.statSync; - readdir: typeof fs.readdir; - readdirSync: typeof fs.readdirSync; -} - -const settings = new fsWalk.Settings({ - fs: { lstat: fakeLstat } -}); -``` - -## Changelog - -See the [Releases section of our GitHub project](https://github.com/nodelib/nodelib/releases) for changelog for each release version. - -## License - -This software is released under the terms of the MIT license. diff --git a/node_modules/@nodelib/fs.walk/out/index.d.ts b/node_modules/@nodelib/fs.walk/out/index.d.ts deleted file mode 100644 index 8864c7b..0000000 --- a/node_modules/@nodelib/fs.walk/out/index.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -/// -import type { Readable } from 'stream'; -import type { Dirent, FileSystemAdapter } from '@nodelib/fs.scandir'; -import { AsyncCallback } from './providers/async'; -import Settings, { DeepFilterFunction, EntryFilterFunction, ErrorFilterFunction, Options } from './settings'; -import type { Entry } from './types'; -declare function walk(directory: string, callback: AsyncCallback): void; -declare function walk(directory: string, optionsOrSettings: Options | Settings, callback: AsyncCallback): void; -declare namespace walk { - function __promisify__(directory: string, optionsOrSettings?: Options | Settings): Promise; -} -declare function walkSync(directory: string, optionsOrSettings?: Options | Settings): Entry[]; -declare function walkStream(directory: string, optionsOrSettings?: Options | Settings): Readable; -export { walk, walkSync, walkStream, Settings, AsyncCallback, Dirent, Entry, FileSystemAdapter, Options, DeepFilterFunction, EntryFilterFunction, ErrorFilterFunction }; diff --git a/node_modules/@nodelib/fs.walk/out/index.js b/node_modules/@nodelib/fs.walk/out/index.js deleted file mode 100644 index 1520787..0000000 --- a/node_modules/@nodelib/fs.walk/out/index.js +++ /dev/null @@ -1,34 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Settings = exports.walkStream = exports.walkSync = exports.walk = void 0; -const async_1 = require("./providers/async"); -const stream_1 = require("./providers/stream"); -const sync_1 = require("./providers/sync"); -const settings_1 = require("./settings"); -exports.Settings = settings_1.default; -function walk(directory, optionsOrSettingsOrCallback, callback) { - if (typeof optionsOrSettingsOrCallback === 'function') { - new async_1.default(directory, getSettings()).read(optionsOrSettingsOrCallback); - return; - } - new async_1.default(directory, getSettings(optionsOrSettingsOrCallback)).read(callback); -} -exports.walk = walk; -function walkSync(directory, optionsOrSettings) { - const settings = getSettings(optionsOrSettings); - const provider = new sync_1.default(directory, settings); - return provider.read(); -} -exports.walkSync = walkSync; -function walkStream(directory, optionsOrSettings) { - const settings = getSettings(optionsOrSettings); - const provider = new stream_1.default(directory, settings); - return provider.read(); -} -exports.walkStream = walkStream; -function getSettings(settingsOrOptions = {}) { - if (settingsOrOptions instanceof settings_1.default) { - return settingsOrOptions; - } - return new settings_1.default(settingsOrOptions); -} diff --git a/node_modules/@nodelib/fs.walk/out/providers/async.d.ts b/node_modules/@nodelib/fs.walk/out/providers/async.d.ts deleted file mode 100644 index 0f6717d..0000000 --- a/node_modules/@nodelib/fs.walk/out/providers/async.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -import AsyncReader from '../readers/async'; -import type Settings from '../settings'; -import type { Entry, Errno } from '../types'; -export declare type AsyncCallback = (error: Errno, entries: Entry[]) => void; -export default class AsyncProvider { - private readonly _root; - private readonly _settings; - protected readonly _reader: AsyncReader; - private readonly _storage; - constructor(_root: string, _settings: Settings); - read(callback: AsyncCallback): void; -} diff --git a/node_modules/@nodelib/fs.walk/out/providers/async.js b/node_modules/@nodelib/fs.walk/out/providers/async.js deleted file mode 100644 index 51d3be5..0000000 --- a/node_modules/@nodelib/fs.walk/out/providers/async.js +++ /dev/null @@ -1,30 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const async_1 = require("../readers/async"); -class AsyncProvider { - constructor(_root, _settings) { - this._root = _root; - this._settings = _settings; - this._reader = new async_1.default(this._root, this._settings); - this._storage = []; - } - read(callback) { - this._reader.onError((error) => { - callFailureCallback(callback, error); - }); - this._reader.onEntry((entry) => { - this._storage.push(entry); - }); - this._reader.onEnd(() => { - callSuccessCallback(callback, this._storage); - }); - this._reader.read(); - } -} -exports.default = AsyncProvider; -function callFailureCallback(callback, error) { - callback(error); -} -function callSuccessCallback(callback, entries) { - callback(null, entries); -} diff --git a/node_modules/@nodelib/fs.walk/out/providers/index.d.ts b/node_modules/@nodelib/fs.walk/out/providers/index.d.ts deleted file mode 100644 index 874f60c..0000000 --- a/node_modules/@nodelib/fs.walk/out/providers/index.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import AsyncProvider from './async'; -import StreamProvider from './stream'; -import SyncProvider from './sync'; -export { AsyncProvider, StreamProvider, SyncProvider }; diff --git a/node_modules/@nodelib/fs.walk/out/providers/index.js b/node_modules/@nodelib/fs.walk/out/providers/index.js deleted file mode 100644 index 4c2529c..0000000 --- a/node_modules/@nodelib/fs.walk/out/providers/index.js +++ /dev/null @@ -1,9 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.SyncProvider = exports.StreamProvider = exports.AsyncProvider = void 0; -const async_1 = require("./async"); -exports.AsyncProvider = async_1.default; -const stream_1 = require("./stream"); -exports.StreamProvider = stream_1.default; -const sync_1 = require("./sync"); -exports.SyncProvider = sync_1.default; diff --git a/node_modules/@nodelib/fs.walk/out/providers/stream.d.ts b/node_modules/@nodelib/fs.walk/out/providers/stream.d.ts deleted file mode 100644 index 294185f..0000000 --- a/node_modules/@nodelib/fs.walk/out/providers/stream.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -/// -import { Readable } from 'stream'; -import AsyncReader from '../readers/async'; -import type Settings from '../settings'; -export default class StreamProvider { - private readonly _root; - private readonly _settings; - protected readonly _reader: AsyncReader; - protected readonly _stream: Readable; - constructor(_root: string, _settings: Settings); - read(): Readable; -} diff --git a/node_modules/@nodelib/fs.walk/out/providers/stream.js b/node_modules/@nodelib/fs.walk/out/providers/stream.js deleted file mode 100644 index 51298b0..0000000 --- a/node_modules/@nodelib/fs.walk/out/providers/stream.js +++ /dev/null @@ -1,34 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = require("stream"); -const async_1 = require("../readers/async"); -class StreamProvider { - constructor(_root, _settings) { - this._root = _root; - this._settings = _settings; - this._reader = new async_1.default(this._root, this._settings); - this._stream = new stream_1.Readable({ - objectMode: true, - read: () => { }, - destroy: () => { - if (!this._reader.isDestroyed) { - this._reader.destroy(); - } - } - }); - } - read() { - this._reader.onError((error) => { - this._stream.emit('error', error); - }); - this._reader.onEntry((entry) => { - this._stream.push(entry); - }); - this._reader.onEnd(() => { - this._stream.push(null); - }); - this._reader.read(); - return this._stream; - } -} -exports.default = StreamProvider; diff --git a/node_modules/@nodelib/fs.walk/out/providers/sync.d.ts b/node_modules/@nodelib/fs.walk/out/providers/sync.d.ts deleted file mode 100644 index 551c42e..0000000 --- a/node_modules/@nodelib/fs.walk/out/providers/sync.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import SyncReader from '../readers/sync'; -import type Settings from '../settings'; -import type { Entry } from '../types'; -export default class SyncProvider { - private readonly _root; - private readonly _settings; - protected readonly _reader: SyncReader; - constructor(_root: string, _settings: Settings); - read(): Entry[]; -} diff --git a/node_modules/@nodelib/fs.walk/out/providers/sync.js b/node_modules/@nodelib/fs.walk/out/providers/sync.js deleted file mode 100644 index faab6ca..0000000 --- a/node_modules/@nodelib/fs.walk/out/providers/sync.js +++ /dev/null @@ -1,14 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const sync_1 = require("../readers/sync"); -class SyncProvider { - constructor(_root, _settings) { - this._root = _root; - this._settings = _settings; - this._reader = new sync_1.default(this._root, this._settings); - } - read() { - return this._reader.read(); - } -} -exports.default = SyncProvider; diff --git a/node_modules/@nodelib/fs.walk/out/readers/async.d.ts b/node_modules/@nodelib/fs.walk/out/readers/async.d.ts deleted file mode 100644 index 9acf4e6..0000000 --- a/node_modules/@nodelib/fs.walk/out/readers/async.d.ts +++ /dev/null @@ -1,30 +0,0 @@ -/// -import { EventEmitter } from 'events'; -import * as fsScandir from '@nodelib/fs.scandir'; -import type Settings from '../settings'; -import type { Entry, Errno } from '../types'; -import Reader from './reader'; -declare type EntryEventCallback = (entry: Entry) => void; -declare type ErrorEventCallback = (error: Errno) => void; -declare type EndEventCallback = () => void; -export default class AsyncReader extends Reader { - protected readonly _settings: Settings; - protected readonly _scandir: typeof fsScandir.scandir; - protected readonly _emitter: EventEmitter; - private readonly _queue; - private _isFatalError; - private _isDestroyed; - constructor(_root: string, _settings: Settings); - read(): EventEmitter; - get isDestroyed(): boolean; - destroy(): void; - onEntry(callback: EntryEventCallback): void; - onError(callback: ErrorEventCallback): void; - onEnd(callback: EndEventCallback): void; - private _pushToQueue; - private _worker; - private _handleError; - private _handleEntry; - private _emitEntry; -} -export {}; diff --git a/node_modules/@nodelib/fs.walk/out/readers/async.js b/node_modules/@nodelib/fs.walk/out/readers/async.js deleted file mode 100644 index ebe8dd5..0000000 --- a/node_modules/@nodelib/fs.walk/out/readers/async.js +++ /dev/null @@ -1,97 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const events_1 = require("events"); -const fsScandir = require("@nodelib/fs.scandir"); -const fastq = require("fastq"); -const common = require("./common"); -const reader_1 = require("./reader"); -class AsyncReader extends reader_1.default { - constructor(_root, _settings) { - super(_root, _settings); - this._settings = _settings; - this._scandir = fsScandir.scandir; - this._emitter = new events_1.EventEmitter(); - this._queue = fastq(this._worker.bind(this), this._settings.concurrency); - this._isFatalError = false; - this._isDestroyed = false; - this._queue.drain = () => { - if (!this._isFatalError) { - this._emitter.emit('end'); - } - }; - } - read() { - this._isFatalError = false; - this._isDestroyed = false; - setImmediate(() => { - this._pushToQueue(this._root, this._settings.basePath); - }); - return this._emitter; - } - get isDestroyed() { - return this._isDestroyed; - } - destroy() { - if (this._isDestroyed) { - throw new Error('The reader is already destroyed'); - } - this._isDestroyed = true; - this._queue.killAndDrain(); - } - onEntry(callback) { - this._emitter.on('entry', callback); - } - onError(callback) { - this._emitter.once('error', callback); - } - onEnd(callback) { - this._emitter.once('end', callback); - } - _pushToQueue(directory, base) { - const queueItem = { directory, base }; - this._queue.push(queueItem, (error) => { - if (error !== null) { - this._handleError(error); - } - }); - } - _worker(item, done) { - this._scandir(item.directory, this._settings.fsScandirSettings, (error, entries) => { - if (error !== null) { - done(error, undefined); - return; - } - for (const entry of entries) { - this._handleEntry(entry, item.base); - } - done(null, undefined); - }); - } - _handleError(error) { - if (this._isDestroyed || !common.isFatalError(this._settings, error)) { - return; - } - this._isFatalError = true; - this._isDestroyed = true; - this._emitter.emit('error', error); - } - _handleEntry(entry, base) { - if (this._isDestroyed || this._isFatalError) { - return; - } - const fullpath = entry.path; - if (base !== undefined) { - entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator); - } - if (common.isAppliedFilter(this._settings.entryFilter, entry)) { - this._emitEntry(entry); - } - if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) { - this._pushToQueue(fullpath, base === undefined ? undefined : entry.path); - } - } - _emitEntry(entry) { - this._emitter.emit('entry', entry); - } -} -exports.default = AsyncReader; diff --git a/node_modules/@nodelib/fs.walk/out/readers/common.d.ts b/node_modules/@nodelib/fs.walk/out/readers/common.d.ts deleted file mode 100644 index 5985f97..0000000 --- a/node_modules/@nodelib/fs.walk/out/readers/common.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { FilterFunction } from '../settings'; -import type Settings from '../settings'; -import type { Errno } from '../types'; -export declare function isFatalError(settings: Settings, error: Errno): boolean; -export declare function isAppliedFilter(filter: FilterFunction | null, value: T): boolean; -export declare function replacePathSegmentSeparator(filepath: string, separator: string): string; -export declare function joinPathSegments(a: string, b: string, separator: string): string; diff --git a/node_modules/@nodelib/fs.walk/out/readers/common.js b/node_modules/@nodelib/fs.walk/out/readers/common.js deleted file mode 100644 index a93572f..0000000 --- a/node_modules/@nodelib/fs.walk/out/readers/common.js +++ /dev/null @@ -1,31 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.joinPathSegments = exports.replacePathSegmentSeparator = exports.isAppliedFilter = exports.isFatalError = void 0; -function isFatalError(settings, error) { - if (settings.errorFilter === null) { - return true; - } - return !settings.errorFilter(error); -} -exports.isFatalError = isFatalError; -function isAppliedFilter(filter, value) { - return filter === null || filter(value); -} -exports.isAppliedFilter = isAppliedFilter; -function replacePathSegmentSeparator(filepath, separator) { - return filepath.split(/[/\\]/).join(separator); -} -exports.replacePathSegmentSeparator = replacePathSegmentSeparator; -function joinPathSegments(a, b, separator) { - if (a === '') { - return b; - } - /** - * The correct handling of cases when the first segment is a root (`/`, `C:/`) or UNC path (`//?/C:/`). - */ - if (a.endsWith(separator)) { - return a + b; - } - return a + separator + b; -} -exports.joinPathSegments = joinPathSegments; diff --git a/node_modules/@nodelib/fs.walk/out/readers/reader.d.ts b/node_modules/@nodelib/fs.walk/out/readers/reader.d.ts deleted file mode 100644 index e1f383b..0000000 --- a/node_modules/@nodelib/fs.walk/out/readers/reader.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type Settings from '../settings'; -export default class Reader { - protected readonly _root: string; - protected readonly _settings: Settings; - constructor(_root: string, _settings: Settings); -} diff --git a/node_modules/@nodelib/fs.walk/out/readers/reader.js b/node_modules/@nodelib/fs.walk/out/readers/reader.js deleted file mode 100644 index 782f07c..0000000 --- a/node_modules/@nodelib/fs.walk/out/readers/reader.js +++ /dev/null @@ -1,11 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const common = require("./common"); -class Reader { - constructor(_root, _settings) { - this._root = _root; - this._settings = _settings; - this._root = common.replacePathSegmentSeparator(_root, _settings.pathSegmentSeparator); - } -} -exports.default = Reader; diff --git a/node_modules/@nodelib/fs.walk/out/readers/sync.d.ts b/node_modules/@nodelib/fs.walk/out/readers/sync.d.ts deleted file mode 100644 index af41033..0000000 --- a/node_modules/@nodelib/fs.walk/out/readers/sync.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import * as fsScandir from '@nodelib/fs.scandir'; -import type { Entry } from '../types'; -import Reader from './reader'; -export default class SyncReader extends Reader { - protected readonly _scandir: typeof fsScandir.scandirSync; - private readonly _storage; - private readonly _queue; - read(): Entry[]; - private _pushToQueue; - private _handleQueue; - private _handleDirectory; - private _handleError; - private _handleEntry; - private _pushToStorage; -} diff --git a/node_modules/@nodelib/fs.walk/out/readers/sync.js b/node_modules/@nodelib/fs.walk/out/readers/sync.js deleted file mode 100644 index 9a8d5a6..0000000 --- a/node_modules/@nodelib/fs.walk/out/readers/sync.js +++ /dev/null @@ -1,59 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const fsScandir = require("@nodelib/fs.scandir"); -const common = require("./common"); -const reader_1 = require("./reader"); -class SyncReader extends reader_1.default { - constructor() { - super(...arguments); - this._scandir = fsScandir.scandirSync; - this._storage = []; - this._queue = new Set(); - } - read() { - this._pushToQueue(this._root, this._settings.basePath); - this._handleQueue(); - return this._storage; - } - _pushToQueue(directory, base) { - this._queue.add({ directory, base }); - } - _handleQueue() { - for (const item of this._queue.values()) { - this._handleDirectory(item.directory, item.base); - } - } - _handleDirectory(directory, base) { - try { - const entries = this._scandir(directory, this._settings.fsScandirSettings); - for (const entry of entries) { - this._handleEntry(entry, base); - } - } - catch (error) { - this._handleError(error); - } - } - _handleError(error) { - if (!common.isFatalError(this._settings, error)) { - return; - } - throw error; - } - _handleEntry(entry, base) { - const fullpath = entry.path; - if (base !== undefined) { - entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator); - } - if (common.isAppliedFilter(this._settings.entryFilter, entry)) { - this._pushToStorage(entry); - } - if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) { - this._pushToQueue(fullpath, base === undefined ? undefined : entry.path); - } - } - _pushToStorage(entry) { - this._storage.push(entry); - } -} -exports.default = SyncReader; diff --git a/node_modules/@nodelib/fs.walk/out/settings.d.ts b/node_modules/@nodelib/fs.walk/out/settings.d.ts deleted file mode 100644 index d1c4b45..0000000 --- a/node_modules/@nodelib/fs.walk/out/settings.d.ts +++ /dev/null @@ -1,30 +0,0 @@ -import * as fsScandir from '@nodelib/fs.scandir'; -import type { Entry, Errno } from './types'; -export declare type FilterFunction = (value: T) => boolean; -export declare type DeepFilterFunction = FilterFunction; -export declare type EntryFilterFunction = FilterFunction; -export declare type ErrorFilterFunction = FilterFunction; -export interface Options { - basePath?: string; - concurrency?: number; - deepFilter?: DeepFilterFunction; - entryFilter?: EntryFilterFunction; - errorFilter?: ErrorFilterFunction; - followSymbolicLinks?: boolean; - fs?: Partial; - pathSegmentSeparator?: string; - stats?: boolean; - throwErrorOnBrokenSymbolicLink?: boolean; -} -export default class Settings { - private readonly _options; - readonly basePath?: string; - readonly concurrency: number; - readonly deepFilter: DeepFilterFunction | null; - readonly entryFilter: EntryFilterFunction | null; - readonly errorFilter: ErrorFilterFunction | null; - readonly pathSegmentSeparator: string; - readonly fsScandirSettings: fsScandir.Settings; - constructor(_options?: Options); - private _getValue; -} diff --git a/node_modules/@nodelib/fs.walk/out/settings.js b/node_modules/@nodelib/fs.walk/out/settings.js deleted file mode 100644 index d7a85c8..0000000 --- a/node_modules/@nodelib/fs.walk/out/settings.js +++ /dev/null @@ -1,26 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const path = require("path"); -const fsScandir = require("@nodelib/fs.scandir"); -class Settings { - constructor(_options = {}) { - this._options = _options; - this.basePath = this._getValue(this._options.basePath, undefined); - this.concurrency = this._getValue(this._options.concurrency, Number.POSITIVE_INFINITY); - this.deepFilter = this._getValue(this._options.deepFilter, null); - this.entryFilter = this._getValue(this._options.entryFilter, null); - this.errorFilter = this._getValue(this._options.errorFilter, null); - this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep); - this.fsScandirSettings = new fsScandir.Settings({ - followSymbolicLinks: this._options.followSymbolicLinks, - fs: this._options.fs, - pathSegmentSeparator: this._options.pathSegmentSeparator, - stats: this._options.stats, - throwErrorOnBrokenSymbolicLink: this._options.throwErrorOnBrokenSymbolicLink - }); - } - _getValue(option, value) { - return option !== null && option !== void 0 ? option : value; - } -} -exports.default = Settings; diff --git a/node_modules/@nodelib/fs.walk/out/types/index.d.ts b/node_modules/@nodelib/fs.walk/out/types/index.d.ts deleted file mode 100644 index 6ee9bd3..0000000 --- a/node_modules/@nodelib/fs.walk/out/types/index.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -/// -import type * as scandir from '@nodelib/fs.scandir'; -export declare type Entry = scandir.Entry; -export declare type Errno = NodeJS.ErrnoException; -export interface QueueItem { - directory: string; - base?: string; -} diff --git a/node_modules/@nodelib/fs.walk/out/types/index.js b/node_modules/@nodelib/fs.walk/out/types/index.js deleted file mode 100644 index c8ad2e5..0000000 --- a/node_modules/@nodelib/fs.walk/out/types/index.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/node_modules/@nodelib/fs.walk/package.json b/node_modules/@nodelib/fs.walk/package.json deleted file mode 100644 index 86bfce4..0000000 --- a/node_modules/@nodelib/fs.walk/package.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "@nodelib/fs.walk", - "version": "1.2.8", - "description": "A library for efficiently walking a directory recursively", - "license": "MIT", - "repository": "https://github.com/nodelib/nodelib/tree/master/packages/fs/fs.walk", - "keywords": [ - "NodeLib", - "fs", - "FileSystem", - "file system", - "walk", - "scanner", - "crawler" - ], - "engines": { - "node": ">= 8" - }, - "files": [ - "out/**", - "!out/**/*.map", - "!out/**/*.spec.*", - "!out/**/tests/**" - ], - "main": "out/index.js", - "typings": "out/index.d.ts", - "scripts": { - "clean": "rimraf {tsconfig.tsbuildinfo,out}", - "lint": "eslint \"src/**/*.ts\" --cache", - "compile": "tsc -b .", - "compile:watch": "tsc -p . --watch --sourceMap", - "test": "mocha \"out/**/*.spec.js\" -s 0", - "build": "npm run clean && npm run compile && npm run lint && npm test", - "watch": "npm run clean && npm run compile:watch" - }, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "devDependencies": { - "@nodelib/fs.macchiato": "1.0.4" - }, - "gitHead": "1e5bad48565da2b06b8600e744324ea240bf49d8" -} diff --git a/node_modules/@pkgjs/parseargs/.editorconfig b/node_modules/@pkgjs/parseargs/.editorconfig deleted file mode 100644 index b140163..0000000 --- a/node_modules/@pkgjs/parseargs/.editorconfig +++ /dev/null @@ -1,14 +0,0 @@ -# EditorConfig is awesome: http://EditorConfig.org - -# top-most EditorConfig file -root = true - -# Copied from Node.js to ease compatibility in PR. -[*] -charset = utf-8 -end_of_line = lf -indent_size = 2 -indent_style = space -insert_final_newline = true -trim_trailing_whitespace = true -quote_type = single diff --git a/node_modules/@pkgjs/parseargs/CHANGELOG.md b/node_modules/@pkgjs/parseargs/CHANGELOG.md deleted file mode 100644 index 2adc7d3..0000000 --- a/node_modules/@pkgjs/parseargs/CHANGELOG.md +++ /dev/null @@ -1,147 +0,0 @@ -# Changelog - -## [0.11.0](https://github.com/pkgjs/parseargs/compare/v0.10.0...v0.11.0) (2022-10-08) - - -### Features - -* add `default` option parameter ([#142](https://github.com/pkgjs/parseargs/issues/142)) ([cd20847](https://github.com/pkgjs/parseargs/commit/cd20847a00b2f556aa9c085ac83b942c60868ec1)) - -## [0.10.0](https://github.com/pkgjs/parseargs/compare/v0.9.1...v0.10.0) (2022-07-21) - - -### Features - -* add parsed meta-data to returned properties ([#129](https://github.com/pkgjs/parseargs/issues/129)) ([91bfb4d](https://github.com/pkgjs/parseargs/commit/91bfb4d3f7b6937efab1b27c91c45d1205f1497e)) - -## [0.9.1](https://github.com/pkgjs/parseargs/compare/v0.9.0...v0.9.1) (2022-06-20) - - -### Bug Fixes - -* **runtime:** support node 14+ ([#135](https://github.com/pkgjs/parseargs/issues/135)) ([6a1c5a6](https://github.com/pkgjs/parseargs/commit/6a1c5a6f7cadf2f035e004027e2742e3c4ce554b)) - -## [0.9.0](https://github.com/pkgjs/parseargs/compare/v0.8.0...v0.9.0) (2022-05-23) - - -### ⚠ BREAKING CHANGES - -* drop handling of electron arguments (#121) - -### Code Refactoring - -* drop handling of electron arguments ([#121](https://github.com/pkgjs/parseargs/issues/121)) ([a2ffd53](https://github.com/pkgjs/parseargs/commit/a2ffd537c244a062371522b955acb45a404fc9f2)) - -## [0.8.0](https://github.com/pkgjs/parseargs/compare/v0.7.1...v0.8.0) (2022-05-16) - - -### ⚠ BREAKING CHANGES - -* switch type:string option arguments to greedy, but with error for suspect cases in strict mode (#88) -* positionals now opt-in when strict:true (#116) -* create result.values with null prototype (#111) - -### Features - -* create result.values with null prototype ([#111](https://github.com/pkgjs/parseargs/issues/111)) ([9d539c3](https://github.com/pkgjs/parseargs/commit/9d539c3d57f269c160e74e0656ad4fa84ff92ec2)) -* positionals now opt-in when strict:true ([#116](https://github.com/pkgjs/parseargs/issues/116)) ([3643338](https://github.com/pkgjs/parseargs/commit/364333826b746e8a7dc5505b4b22fd19ac51df3b)) -* switch type:string option arguments to greedy, but with error for suspect cases in strict mode ([#88](https://github.com/pkgjs/parseargs/issues/88)) ([c2b5e72](https://github.com/pkgjs/parseargs/commit/c2b5e72161991dfdc535909f1327cc9b970fe7e8)) - -### [0.7.1](https://github.com/pkgjs/parseargs/compare/v0.7.0...v0.7.1) (2022-04-15) - - -### Bug Fixes - -* resist pollution ([#106](https://github.com/pkgjs/parseargs/issues/106)) ([ecf2dec](https://github.com/pkgjs/parseargs/commit/ecf2dece0a9f2a76d789384d5d71c68ffe64022a)) - -## [0.7.0](https://github.com/pkgjs/parseargs/compare/v0.6.0...v0.7.0) (2022-04-13) - - -### Features - -* Add strict mode to parser ([#74](https://github.com/pkgjs/parseargs/issues/74)) ([8267d02](https://github.com/pkgjs/parseargs/commit/8267d02083a87b8b8a71fcce08348d1e031ea91c)) - -## [0.6.0](https://github.com/pkgjs/parseargs/compare/v0.5.0...v0.6.0) (2022-04-11) - - -### ⚠ BREAKING CHANGES - -* rework results to remove redundant `flags` property and store value true for boolean options (#83) -* switch to existing ERR_INVALID_ARG_VALUE (#97) - -### Code Refactoring - -* rework results to remove redundant `flags` property and store value true for boolean options ([#83](https://github.com/pkgjs/parseargs/issues/83)) ([be153db](https://github.com/pkgjs/parseargs/commit/be153dbed1d488cb7b6e27df92f601ba7337713d)) -* switch to existing ERR_INVALID_ARG_VALUE ([#97](https://github.com/pkgjs/parseargs/issues/97)) ([084a23f](https://github.com/pkgjs/parseargs/commit/084a23f9fde2da030b159edb1c2385f24579ce40)) - -## [0.5.0](https://github.com/pkgjs/parseargs/compare/v0.4.0...v0.5.0) (2022-04-10) - - -### ⚠ BREAKING CHANGES - -* Require type to be specified for each supplied option (#95) - -### Features - -* Require type to be specified for each supplied option ([#95](https://github.com/pkgjs/parseargs/issues/95)) ([02cd018](https://github.com/pkgjs/parseargs/commit/02cd01885b8aaa59f2db8308f2d4479e64340068)) - -## [0.4.0](https://github.com/pkgjs/parseargs/compare/v0.3.0...v0.4.0) (2022-03-12) - - -### ⚠ BREAKING CHANGES - -* parsing, revisit short option groups, add support for combined short and value (#75) -* restructure configuration to take options bag (#63) - -### Code Refactoring - -* parsing, revisit short option groups, add support for combined short and value ([#75](https://github.com/pkgjs/parseargs/issues/75)) ([a92600f](https://github.com/pkgjs/parseargs/commit/a92600fa6c214508ab1e016fa55879a314f541af)) -* restructure configuration to take options bag ([#63](https://github.com/pkgjs/parseargs/issues/63)) ([b412095](https://github.com/pkgjs/parseargs/commit/b4120957d90e809ee8b607b06e747d3e6a6b213e)) - -## [0.3.0](https://github.com/pkgjs/parseargs/compare/v0.2.0...v0.3.0) (2022-02-06) - - -### Features - -* **parser:** support short-option groups ([#59](https://github.com/pkgjs/parseargs/issues/59)) ([882067b](https://github.com/pkgjs/parseargs/commit/882067bc2d7cbc6b796f8e5a079a99bc99d4e6ba)) - -## [0.2.0](https://github.com/pkgjs/parseargs/compare/v0.1.1...v0.2.0) (2022-02-05) - - -### Features - -* basic support for shorts ([#50](https://github.com/pkgjs/parseargs/issues/50)) ([a2f36d7](https://github.com/pkgjs/parseargs/commit/a2f36d7da4145af1c92f76806b7fe2baf6beeceb)) - - -### Bug Fixes - -* always store value for a=b ([#43](https://github.com/pkgjs/parseargs/issues/43)) ([a85e8dc](https://github.com/pkgjs/parseargs/commit/a85e8dc06379fd2696ee195cc625de8fac6aee42)) -* support single dash as positional ([#49](https://github.com/pkgjs/parseargs/issues/49)) ([d795bf8](https://github.com/pkgjs/parseargs/commit/d795bf877d068fd67aec381f30b30b63f97109ad)) - -### [0.1.1](https://github.com/pkgjs/parseargs/compare/v0.1.0...v0.1.1) (2022-01-25) - - -### Bug Fixes - -* only use arrays in results for multiples ([#42](https://github.com/pkgjs/parseargs/issues/42)) ([c357584](https://github.com/pkgjs/parseargs/commit/c357584847912506319ed34a0840080116f4fd65)) - -## 0.1.0 (2022-01-22) - - -### Features - -* expand scenarios covered by default arguments for environments ([#20](https://github.com/pkgjs/parseargs/issues/20)) ([582ada7](https://github.com/pkgjs/parseargs/commit/582ada7be0eca3a73d6e0bd016e7ace43449fa4c)) -* update readme and include contributing guidelines ([8edd6fc](https://github.com/pkgjs/parseargs/commit/8edd6fc863cd705f6fac732724159ebe8065a2b0)) - - -### Bug Fixes - -* do not strip excess leading dashes on long option names ([#21](https://github.com/pkgjs/parseargs/issues/21)) ([f848590](https://github.com/pkgjs/parseargs/commit/f848590ebf3249ed5979ff47e003fa6e1a8ec5c0)) -* name & readme ([3f057c1](https://github.com/pkgjs/parseargs/commit/3f057c1b158a1bdbe878c64b57460c58e56e465f)) -* package.json values ([9bac300](https://github.com/pkgjs/parseargs/commit/9bac300e00cd76c77076bf9e75e44f8929512da9)) -* update readme name ([957d8d9](https://github.com/pkgjs/parseargs/commit/957d8d96e1dcb48297c0a14345d44c0123b2883e)) - - -### Build System - -* first release as minor ([421c6e2](https://github.com/pkgjs/parseargs/commit/421c6e2569a8668ad14fac5a5af5be60479a7571)) diff --git a/node_modules/@pkgjs/parseargs/LICENSE b/node_modules/@pkgjs/parseargs/LICENSE deleted file mode 100644 index 261eeb9..0000000 --- a/node_modules/@pkgjs/parseargs/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/node_modules/@pkgjs/parseargs/README.md b/node_modules/@pkgjs/parseargs/README.md deleted file mode 100644 index 0a04192..0000000 --- a/node_modules/@pkgjs/parseargs/README.md +++ /dev/null @@ -1,413 +0,0 @@ - -# parseArgs - -[![Coverage][coverage-image]][coverage-url] - -Polyfill of `util.parseArgs()` - -## `util.parseArgs([config])` - - - -> Stability: 1 - Experimental - -* `config` {Object} Used to provide arguments for parsing and to configure - the parser. `config` supports the following properties: - * `args` {string\[]} array of argument strings. **Default:** `process.argv` - with `execPath` and `filename` removed. - * `options` {Object} Used to describe arguments known to the parser. - Keys of `options` are the long names of options and values are an - {Object} accepting the following properties: - * `type` {string} Type of argument, which must be either `boolean` or `string`. - * `multiple` {boolean} Whether this option can be provided multiple - times. If `true`, all values will be collected in an array. If - `false`, values for the option are last-wins. **Default:** `false`. - * `short` {string} A single character alias for the option. - * `default` {string | boolean | string\[] | boolean\[]} The default option - value when it is not set by args. It must be of the same type as the - the `type` property. When `multiple` is `true`, it must be an array. - * `strict` {boolean} Should an error be thrown when unknown arguments - are encountered, or when arguments are passed that do not match the - `type` configured in `options`. - **Default:** `true`. - * `allowPositionals` {boolean} Whether this command accepts positional - arguments. - **Default:** `false` if `strict` is `true`, otherwise `true`. - * `tokens` {boolean} Return the parsed tokens. This is useful for extending - the built-in behavior, from adding additional checks through to reprocessing - the tokens in different ways. - **Default:** `false`. - -* Returns: {Object} The parsed command line arguments: - * `values` {Object} A mapping of parsed option names with their {string} - or {boolean} values. - * `positionals` {string\[]} Positional arguments. - * `tokens` {Object\[] | undefined} See [parseArgs tokens](#parseargs-tokens) - section. Only returned if `config` includes `tokens: true`. - -Provides a higher level API for command-line argument parsing than interacting -with `process.argv` directly. Takes a specification for the expected arguments -and returns a structured object with the parsed options and positionals. - -```mjs -import { parseArgs } from 'node:util'; -const args = ['-f', '--bar', 'b']; -const options = { - foo: { - type: 'boolean', - short: 'f' - }, - bar: { - type: 'string' - } -}; -const { - values, - positionals -} = parseArgs({ args, options }); -console.log(values, positionals); -// Prints: [Object: null prototype] { foo: true, bar: 'b' } [] -``` - -```cjs -const { parseArgs } = require('node:util'); -const args = ['-f', '--bar', 'b']; -const options = { - foo: { - type: 'boolean', - short: 'f' - }, - bar: { - type: 'string' - } -}; -const { - values, - positionals -} = parseArgs({ args, options }); -console.log(values, positionals); -// Prints: [Object: null prototype] { foo: true, bar: 'b' } [] -``` - -`util.parseArgs` is experimental and behavior may change. Join the -conversation in [pkgjs/parseargs][] to contribute to the design. - -### `parseArgs` `tokens` - -Detailed parse information is available for adding custom behaviours by -specifying `tokens: true` in the configuration. -The returned tokens have properties describing: - -* all tokens - * `kind` {string} One of 'option', 'positional', or 'option-terminator'. - * `index` {number} Index of element in `args` containing token. So the - source argument for a token is `args[token.index]`. -* option tokens - * `name` {string} Long name of option. - * `rawName` {string} How option used in args, like `-f` of `--foo`. - * `value` {string | undefined} Option value specified in args. - Undefined for boolean options. - * `inlineValue` {boolean | undefined} Whether option value specified inline, - like `--foo=bar`. -* positional tokens - * `value` {string} The value of the positional argument in args (i.e. `args[index]`). -* option-terminator token - -The returned tokens are in the order encountered in the input args. Options -that appear more than once in args produce a token for each use. Short option -groups like `-xy` expand to a token for each option. So `-xxx` produces -three tokens. - -For example to use the returned tokens to add support for a negated option -like `--no-color`, the tokens can be reprocessed to change the value stored -for the negated option. - -```mjs -import { parseArgs } from 'node:util'; - -const options = { - 'color': { type: 'boolean' }, - 'no-color': { type: 'boolean' }, - 'logfile': { type: 'string' }, - 'no-logfile': { type: 'boolean' }, -}; -const { values, tokens } = parseArgs({ options, tokens: true }); - -// Reprocess the option tokens and overwrite the returned values. -tokens - .filter((token) => token.kind === 'option') - .forEach((token) => { - if (token.name.startsWith('no-')) { - // Store foo:false for --no-foo - const positiveName = token.name.slice(3); - values[positiveName] = false; - delete values[token.name]; - } else { - // Resave value so last one wins if both --foo and --no-foo. - values[token.name] = token.value ?? true; - } - }); - -const color = values.color; -const logfile = values.logfile ?? 'default.log'; - -console.log({ logfile, color }); -``` - -```cjs -const { parseArgs } = require('node:util'); - -const options = { - 'color': { type: 'boolean' }, - 'no-color': { type: 'boolean' }, - 'logfile': { type: 'string' }, - 'no-logfile': { type: 'boolean' }, -}; -const { values, tokens } = parseArgs({ options, tokens: true }); - -// Reprocess the option tokens and overwrite the returned values. -tokens - .filter((token) => token.kind === 'option') - .forEach((token) => { - if (token.name.startsWith('no-')) { - // Store foo:false for --no-foo - const positiveName = token.name.slice(3); - values[positiveName] = false; - delete values[token.name]; - } else { - // Resave value so last one wins if both --foo and --no-foo. - values[token.name] = token.value ?? true; - } - }); - -const color = values.color; -const logfile = values.logfile ?? 'default.log'; - -console.log({ logfile, color }); -``` - -Example usage showing negated options, and when an option is used -multiple ways then last one wins. - -```console -$ node negate.js -{ logfile: 'default.log', color: undefined } -$ node negate.js --no-logfile --no-color -{ logfile: false, color: false } -$ node negate.js --logfile=test.log --color -{ logfile: 'test.log', color: true } -$ node negate.js --no-logfile --logfile=test.log --color --no-color -{ logfile: 'test.log', color: false } -``` - ------ - - -## Table of Contents -- [`util.parseArgs([config])`](#utilparseargsconfig) -- [Scope](#scope) -- [Version Matchups](#version-matchups) -- [🚀 Getting Started](#-getting-started) -- [🙌 Contributing](#-contributing) -- [💡 `process.mainArgs` Proposal](#-processmainargs-proposal) - - [Implementation:](#implementation) -- [📃 Examples](#-examples) -- [F.A.Qs](#faqs) -- [Links & Resources](#links--resources) - ------ - -## Scope - -It is already possible to build great arg parsing modules on top of what Node.js provides; the prickly API is abstracted away by these modules. Thus, process.parseArgs() is not necessarily intended for library authors; it is intended for developers of simple CLI tools, ad-hoc scripts, deployed Node.js applications, and learning materials. - -It is exceedingly difficult to provide an API which would both be friendly to these Node.js users while being extensible enough for libraries to build upon. We chose to prioritize these use cases because these are currently not well-served by Node.js' API. - ----- - -## Version Matchups - -| Node.js | @pkgjs/parseArgs | -| -- | -- | -| [v18.3.0](https://nodejs.org/docs/latest-v18.x/api/util.html#utilparseargsconfig) | [v0.9.1](https://github.com/pkgjs/parseargs/tree/v0.9.1#utilparseargsconfig) | -| [v16.17.0](https://nodejs.org/dist/latest-v16.x/docs/api/util.html#utilparseargsconfig), [v18.7.0](https://nodejs.org/docs/latest-v18.x/api/util.html#utilparseargsconfig) | [0.10.0](https://github.com/pkgjs/parseargs/tree/v0.10.0#utilparseargsconfig) | - ----- - -## 🚀 Getting Started - -1. **Install dependencies.** - - ```bash - npm install - ``` - -2. **Open the index.js file and start editing!** - -3. **Test your code by calling parseArgs through our test file** - - ```bash - npm test - ``` - ----- - -## 🙌 Contributing - -Any person who wants to contribute to the initiative is welcome! Please first read the [Contributing Guide](CONTRIBUTING.md) - -Additionally, reading the [`Examples w/ Output`](#-examples-w-output) section of this document will be the best way to familiarize yourself with the target expected behavior for parseArgs() once it is fully implemented. - -This package was implemented using [tape](https://www.npmjs.com/package/tape) as its test harness. - ----- - -## 💡 `process.mainArgs` Proposal - -> Note: This can be moved forward independently of the `util.parseArgs()` proposal/work. - -### Implementation: - -```javascript -process.mainArgs = process.argv.slice(process._exec ? 1 : 2) -``` - ----- - -## 📃 Examples - -```js -const { parseArgs } = require('@pkgjs/parseargs'); -``` - -```js -const { parseArgs } = require('@pkgjs/parseargs'); -// specify the options that may be used -const options = { - foo: { type: 'string'}, - bar: { type: 'boolean' }, -}; -const args = ['--foo=a', '--bar']; -const { values, positionals } = parseArgs({ args, options }); -// values = { foo: 'a', bar: true } -// positionals = [] -``` - -```js -const { parseArgs } = require('@pkgjs/parseargs'); -// type:string & multiple -const options = { - foo: { - type: 'string', - multiple: true, - }, -}; -const args = ['--foo=a', '--foo', 'b']; -const { values, positionals } = parseArgs({ args, options }); -// values = { foo: [ 'a', 'b' ] } -// positionals = [] -``` - -```js -const { parseArgs } = require('@pkgjs/parseargs'); -// shorts -const options = { - foo: { - short: 'f', - type: 'boolean' - }, -}; -const args = ['-f', 'b']; -const { values, positionals } = parseArgs({ args, options, allowPositionals: true }); -// values = { foo: true } -// positionals = ['b'] -``` - -```js -const { parseArgs } = require('@pkgjs/parseargs'); -// unconfigured -const options = {}; -const args = ['-f', '--foo=a', '--bar', 'b']; -const { values, positionals } = parseArgs({ strict: false, args, options, allowPositionals: true }); -// values = { f: true, foo: 'a', bar: true } -// positionals = ['b'] -``` - ----- - -## F.A.Qs - -- Is `cmd --foo=bar baz` the same as `cmd baz --foo=bar`? - - yes -- Does the parser execute a function? - - no -- Does the parser execute one of several functions, depending on input? - - no -- Can subcommands take options that are distinct from the main command? - - no -- Does it output generated help when no options match? - - no -- Does it generated short usage? Like: `usage: ls [-ABCFGHLOPRSTUWabcdefghiklmnopqrstuwx1] [file ...]` - - no (no usage/help at all) -- Does the user provide the long usage text? For each option? For the whole command? - - no -- Do subcommands (if implemented) have their own usage output? - - no -- Does usage print if the user runs `cmd --help`? - - no -- Does it set `process.exitCode`? - - no -- Does usage print to stderr or stdout? - - N/A -- Does it check types? (Say, specify that an option is a boolean, number, etc.) - - no -- Can an option have more than one type? (string or false, for example) - - no -- Can the user define a type? (Say, `type: path` to call `path.resolve()` on the argument.) - - no -- Does a `--foo=0o22` mean 0, 22, 18, or "0o22"? - - `"0o22"` -- Does it coerce types? - - no -- Does `--no-foo` coerce to `--foo=false`? For all options? Only boolean options? - - no, it sets `{values:{'no-foo': true}}` -- Is `--foo` the same as `--foo=true`? Only for known booleans? Only at the end? - - no, they are not the same. There is no special handling of `true` as a value so it is just another string. -- Does it read environment variables? Ie, is `FOO=1 cmd` the same as `cmd --foo=1`? - - no -- Do unknown arguments raise an error? Are they parsed? Are they treated as positional arguments? - - no, they are parsed, not treated as positionals -- Does `--` signal the end of options? - - yes -- Is `--` included as a positional? - - no -- Is `program -- foo` the same as `program foo`? - - yes, both store `{positionals:['foo']}` -- Does the API specify whether a `--` was present/relevant? - - no -- Is `-bar` the same as `--bar`? - - no, `-bar` is a short option or options, with expansion logic that follows the - [Utility Syntax Guidelines in POSIX.1-2017](https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html). `-bar` expands to `-b`, `-a`, `-r`. -- Is `---foo` the same as `--foo`? - - no - - the first is a long option named `'-foo'` - - the second is a long option named `'foo'` -- Is `-` a positional? ie, `bash some-test.sh | tap -` - - yes - -## Links & Resources - -* [Initial Tooling Issue](https://github.com/nodejs/tooling/issues/19) -* [Initial Proposal](https://github.com/nodejs/node/pull/35015) -* [parseArgs Proposal](https://github.com/nodejs/node/pull/42675) - -[coverage-image]: https://img.shields.io/nycrc/pkgjs/parseargs -[coverage-url]: https://github.com/pkgjs/parseargs/blob/main/.nycrc -[pkgjs/parseargs]: https://github.com/pkgjs/parseargs diff --git a/node_modules/@pkgjs/parseargs/examples/is-default-value.js b/node_modules/@pkgjs/parseargs/examples/is-default-value.js deleted file mode 100644 index 0a67972..0000000 --- a/node_modules/@pkgjs/parseargs/examples/is-default-value.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict'; - -// This example shows how to understand if a default value is used or not. - -// 1. const { parseArgs } = require('node:util'); // from node -// 2. const { parseArgs } = require('@pkgjs/parseargs'); // from package -const { parseArgs } = require('..'); // in repo - -const options = { - file: { short: 'f', type: 'string', default: 'FOO' }, -}; - -const { values, tokens } = parseArgs({ options, tokens: true }); - -const isFileDefault = !tokens.some((token) => token.kind === 'option' && - token.name === 'file' -); - -console.log(values); -console.log(`Is the file option [${values.file}] the default value? ${isFileDefault}`); - -// Try the following: -// node is-default-value.js -// node is-default-value.js -f FILE -// node is-default-value.js --file FILE diff --git a/node_modules/@pkgjs/parseargs/examples/limit-long-syntax.js b/node_modules/@pkgjs/parseargs/examples/limit-long-syntax.js deleted file mode 100644 index 943e643..0000000 --- a/node_modules/@pkgjs/parseargs/examples/limit-long-syntax.js +++ /dev/null @@ -1,35 +0,0 @@ -'use strict'; - -// This is an example of using tokens to add a custom behaviour. -// -// Require the use of `=` for long options and values by blocking -// the use of space separated values. -// So allow `--foo=bar`, and not allow `--foo bar`. -// -// Note: this is not a common behaviour, most CLIs allow both forms. - -// 1. const { parseArgs } = require('node:util'); // from node -// 2. const { parseArgs } = require('@pkgjs/parseargs'); // from package -const { parseArgs } = require('..'); // in repo - -const options = { - file: { short: 'f', type: 'string' }, - log: { type: 'string' }, -}; - -const { values, tokens } = parseArgs({ options, tokens: true }); - -const badToken = tokens.find((token) => token.kind === 'option' && - token.value != null && - token.rawName.startsWith('--') && - !token.inlineValue -); -if (badToken) { - throw new Error(`Option value for '${badToken.rawName}' must be inline, like '${badToken.rawName}=VALUE'`); -} - -console.log(values); - -// Try the following: -// node limit-long-syntax.js -f FILE --log=LOG -// node limit-long-syntax.js --file FILE diff --git a/node_modules/@pkgjs/parseargs/examples/negate.js b/node_modules/@pkgjs/parseargs/examples/negate.js deleted file mode 100644 index b663469..0000000 --- a/node_modules/@pkgjs/parseargs/examples/negate.js +++ /dev/null @@ -1,43 +0,0 @@ -'use strict'; - -// This example is used in the documentation. - -// How might I add my own support for --no-foo? - -// 1. const { parseArgs } = require('node:util'); // from node -// 2. const { parseArgs } = require('@pkgjs/parseargs'); // from package -const { parseArgs } = require('..'); // in repo - -const options = { - 'color': { type: 'boolean' }, - 'no-color': { type: 'boolean' }, - 'logfile': { type: 'string' }, - 'no-logfile': { type: 'boolean' }, -}; -const { values, tokens } = parseArgs({ options, tokens: true }); - -// Reprocess the option tokens and overwrite the returned values. -tokens - .filter((token) => token.kind === 'option') - .forEach((token) => { - if (token.name.startsWith('no-')) { - // Store foo:false for --no-foo - const positiveName = token.name.slice(3); - values[positiveName] = false; - delete values[token.name]; - } else { - // Resave value so last one wins if both --foo and --no-foo. - values[token.name] = token.value ?? true; - } - }); - -const color = values.color; -const logfile = values.logfile ?? 'default.log'; - -console.log({ logfile, color }); - -// Try the following: -// node negate.js -// node negate.js --no-logfile --no-color -// negate.js --logfile=test.log --color -// node negate.js --no-logfile --logfile=test.log --color --no-color diff --git a/node_modules/@pkgjs/parseargs/examples/no-repeated-options.js b/node_modules/@pkgjs/parseargs/examples/no-repeated-options.js deleted file mode 100644 index 0c32468..0000000 --- a/node_modules/@pkgjs/parseargs/examples/no-repeated-options.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict'; - -// This is an example of using tokens to add a custom behaviour. -// -// Throw an error if an option is used more than once. - -// 1. const { parseArgs } = require('node:util'); // from node -// 2. const { parseArgs } = require('@pkgjs/parseargs'); // from package -const { parseArgs } = require('..'); // in repo - -const options = { - ding: { type: 'boolean', short: 'd' }, - beep: { type: 'boolean', short: 'b' } -}; -const { values, tokens } = parseArgs({ options, tokens: true }); - -const seenBefore = new Set(); -tokens.forEach((token) => { - if (token.kind !== 'option') return; - if (seenBefore.has(token.name)) { - throw new Error(`option '${token.name}' used multiple times`); - } - seenBefore.add(token.name); -}); - -console.log(values); - -// Try the following: -// node no-repeated-options --ding --beep -// node no-repeated-options --beep -b -// node no-repeated-options -ddd diff --git a/node_modules/@pkgjs/parseargs/examples/ordered-options.mjs b/node_modules/@pkgjs/parseargs/examples/ordered-options.mjs deleted file mode 100644 index 8ab7367..0000000 --- a/node_modules/@pkgjs/parseargs/examples/ordered-options.mjs +++ /dev/null @@ -1,41 +0,0 @@ -// This is an example of using tokens to add a custom behaviour. -// -// This adds a option order check so that --some-unstable-option -// may only be used after --enable-experimental-options -// -// Note: this is not a common behaviour, the order of different options -// does not usually matter. - -import { parseArgs } from '../index.js'; - -function findTokenIndex(tokens, target) { - return tokens.findIndex((token) => token.kind === 'option' && - token.name === target - ); -} - -const experimentalName = 'enable-experimental-options'; -const unstableName = 'some-unstable-option'; - -const options = { - [experimentalName]: { type: 'boolean' }, - [unstableName]: { type: 'boolean' }, -}; - -const { values, tokens } = parseArgs({ options, tokens: true }); - -const experimentalIndex = findTokenIndex(tokens, experimentalName); -const unstableIndex = findTokenIndex(tokens, unstableName); -if (unstableIndex !== -1 && - ((experimentalIndex === -1) || (unstableIndex < experimentalIndex))) { - throw new Error(`'--${experimentalName}' must be specified before '--${unstableName}'`); -} - -console.log(values); - -/* eslint-disable max-len */ -// Try the following: -// node ordered-options.mjs -// node ordered-options.mjs --some-unstable-option -// node ordered-options.mjs --some-unstable-option --enable-experimental-options -// node ordered-options.mjs --enable-experimental-options --some-unstable-option diff --git a/node_modules/@pkgjs/parseargs/examples/simple-hard-coded.js b/node_modules/@pkgjs/parseargs/examples/simple-hard-coded.js deleted file mode 100644 index eff04c2..0000000 --- a/node_modules/@pkgjs/parseargs/examples/simple-hard-coded.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict'; - -// This example is used in the documentation. - -// 1. const { parseArgs } = require('node:util'); // from node -// 2. const { parseArgs } = require('@pkgjs/parseargs'); // from package -const { parseArgs } = require('..'); // in repo - -const args = ['-f', '--bar', 'b']; -const options = { - foo: { - type: 'boolean', - short: 'f' - }, - bar: { - type: 'string' - } -}; -const { - values, - positionals -} = parseArgs({ args, options }); -console.log(values, positionals); - -// Try the following: -// node simple-hard-coded.js diff --git a/node_modules/@pkgjs/parseargs/index.js b/node_modules/@pkgjs/parseargs/index.js deleted file mode 100644 index b1004c7..0000000 --- a/node_modules/@pkgjs/parseargs/index.js +++ /dev/null @@ -1,396 +0,0 @@ -'use strict'; - -const { - ArrayPrototypeForEach, - ArrayPrototypeIncludes, - ArrayPrototypeMap, - ArrayPrototypePush, - ArrayPrototypePushApply, - ArrayPrototypeShift, - ArrayPrototypeSlice, - ArrayPrototypeUnshiftApply, - ObjectEntries, - ObjectPrototypeHasOwnProperty: ObjectHasOwn, - StringPrototypeCharAt, - StringPrototypeIndexOf, - StringPrototypeSlice, - StringPrototypeStartsWith, -} = require('./internal/primordials'); - -const { - validateArray, - validateBoolean, - validateBooleanArray, - validateObject, - validateString, - validateStringArray, - validateUnion, -} = require('./internal/validators'); - -const { - kEmptyObject, -} = require('./internal/util'); - -const { - findLongOptionForShort, - isLoneLongOption, - isLoneShortOption, - isLongOptionAndValue, - isOptionValue, - isOptionLikeValue, - isShortOptionAndValue, - isShortOptionGroup, - useDefaultValueOption, - objectGetOwn, - optionsGetOwn, -} = require('./utils'); - -const { - codes: { - ERR_INVALID_ARG_VALUE, - ERR_PARSE_ARGS_INVALID_OPTION_VALUE, - ERR_PARSE_ARGS_UNKNOWN_OPTION, - ERR_PARSE_ARGS_UNEXPECTED_POSITIONAL, - }, -} = require('./internal/errors'); - -function getMainArgs() { - // Work out where to slice process.argv for user supplied arguments. - - // Check node options for scenarios where user CLI args follow executable. - const execArgv = process.execArgv; - if (ArrayPrototypeIncludes(execArgv, '-e') || - ArrayPrototypeIncludes(execArgv, '--eval') || - ArrayPrototypeIncludes(execArgv, '-p') || - ArrayPrototypeIncludes(execArgv, '--print')) { - return ArrayPrototypeSlice(process.argv, 1); - } - - // Normally first two arguments are executable and script, then CLI arguments - return ArrayPrototypeSlice(process.argv, 2); -} - -/** - * In strict mode, throw for possible usage errors like --foo --bar - * - * @param {object} token - from tokens as available from parseArgs - */ -function checkOptionLikeValue(token) { - if (!token.inlineValue && isOptionLikeValue(token.value)) { - // Only show short example if user used short option. - const example = StringPrototypeStartsWith(token.rawName, '--') ? - `'${token.rawName}=-XYZ'` : - `'--${token.name}=-XYZ' or '${token.rawName}-XYZ'`; - const errorMessage = `Option '${token.rawName}' argument is ambiguous. -Did you forget to specify the option argument for '${token.rawName}'? -To specify an option argument starting with a dash use ${example}.`; - throw new ERR_PARSE_ARGS_INVALID_OPTION_VALUE(errorMessage); - } -} - -/** - * In strict mode, throw for usage errors. - * - * @param {object} config - from config passed to parseArgs - * @param {object} token - from tokens as available from parseArgs - */ -function checkOptionUsage(config, token) { - if (!ObjectHasOwn(config.options, token.name)) { - throw new ERR_PARSE_ARGS_UNKNOWN_OPTION( - token.rawName, config.allowPositionals); - } - - const short = optionsGetOwn(config.options, token.name, 'short'); - const shortAndLong = `${short ? `-${short}, ` : ''}--${token.name}`; - const type = optionsGetOwn(config.options, token.name, 'type'); - if (type === 'string' && typeof token.value !== 'string') { - throw new ERR_PARSE_ARGS_INVALID_OPTION_VALUE(`Option '${shortAndLong} ' argument missing`); - } - // (Idiomatic test for undefined||null, expecting undefined.) - if (type === 'boolean' && token.value != null) { - throw new ERR_PARSE_ARGS_INVALID_OPTION_VALUE(`Option '${shortAndLong}' does not take an argument`); - } -} - - -/** - * Store the option value in `values`. - * - * @param {string} longOption - long option name e.g. 'foo' - * @param {string|undefined} optionValue - value from user args - * @param {object} options - option configs, from parseArgs({ options }) - * @param {object} values - option values returned in `values` by parseArgs - */ -function storeOption(longOption, optionValue, options, values) { - if (longOption === '__proto__') { - return; // No. Just no. - } - - // We store based on the option value rather than option type, - // preserving the users intent for author to deal with. - const newValue = optionValue ?? true; - if (optionsGetOwn(options, longOption, 'multiple')) { - // Always store value in array, including for boolean. - // values[longOption] starts out not present, - // first value is added as new array [newValue], - // subsequent values are pushed to existing array. - // (note: values has null prototype, so simpler usage) - if (values[longOption]) { - ArrayPrototypePush(values[longOption], newValue); - } else { - values[longOption] = [newValue]; - } - } else { - values[longOption] = newValue; - } -} - -/** - * Store the default option value in `values`. - * - * @param {string} longOption - long option name e.g. 'foo' - * @param {string - * | boolean - * | string[] - * | boolean[]} optionValue - default value from option config - * @param {object} values - option values returned in `values` by parseArgs - */ -function storeDefaultOption(longOption, optionValue, values) { - if (longOption === '__proto__') { - return; // No. Just no. - } - - values[longOption] = optionValue; -} - -/** - * Process args and turn into identified tokens: - * - option (along with value, if any) - * - positional - * - option-terminator - * - * @param {string[]} args - from parseArgs({ args }) or mainArgs - * @param {object} options - option configs, from parseArgs({ options }) - */ -function argsToTokens(args, options) { - const tokens = []; - let index = -1; - let groupCount = 0; - - const remainingArgs = ArrayPrototypeSlice(args); - while (remainingArgs.length > 0) { - const arg = ArrayPrototypeShift(remainingArgs); - const nextArg = remainingArgs[0]; - if (groupCount > 0) - groupCount--; - else - index++; - - // Check if `arg` is an options terminator. - // Guideline 10 in https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html - if (arg === '--') { - // Everything after a bare '--' is considered a positional argument. - ArrayPrototypePush(tokens, { kind: 'option-terminator', index }); - ArrayPrototypePushApply( - tokens, ArrayPrototypeMap(remainingArgs, (arg) => { - return { kind: 'positional', index: ++index, value: arg }; - }) - ); - break; // Finished processing args, leave while loop. - } - - if (isLoneShortOption(arg)) { - // e.g. '-f' - const shortOption = StringPrototypeCharAt(arg, 1); - const longOption = findLongOptionForShort(shortOption, options); - let value; - let inlineValue; - if (optionsGetOwn(options, longOption, 'type') === 'string' && - isOptionValue(nextArg)) { - // e.g. '-f', 'bar' - value = ArrayPrototypeShift(remainingArgs); - inlineValue = false; - } - ArrayPrototypePush( - tokens, - { kind: 'option', name: longOption, rawName: arg, - index, value, inlineValue }); - if (value != null) ++index; - continue; - } - - if (isShortOptionGroup(arg, options)) { - // Expand -fXzy to -f -X -z -y - const expanded = []; - for (let index = 1; index < arg.length; index++) { - const shortOption = StringPrototypeCharAt(arg, index); - const longOption = findLongOptionForShort(shortOption, options); - if (optionsGetOwn(options, longOption, 'type') !== 'string' || - index === arg.length - 1) { - // Boolean option, or last short in group. Well formed. - ArrayPrototypePush(expanded, `-${shortOption}`); - } else { - // String option in middle. Yuck. - // Expand -abfFILE to -a -b -fFILE - ArrayPrototypePush(expanded, `-${StringPrototypeSlice(arg, index)}`); - break; // finished short group - } - } - ArrayPrototypeUnshiftApply(remainingArgs, expanded); - groupCount = expanded.length; - continue; - } - - if (isShortOptionAndValue(arg, options)) { - // e.g. -fFILE - const shortOption = StringPrototypeCharAt(arg, 1); - const longOption = findLongOptionForShort(shortOption, options); - const value = StringPrototypeSlice(arg, 2); - ArrayPrototypePush( - tokens, - { kind: 'option', name: longOption, rawName: `-${shortOption}`, - index, value, inlineValue: true }); - continue; - } - - if (isLoneLongOption(arg)) { - // e.g. '--foo' - const longOption = StringPrototypeSlice(arg, 2); - let value; - let inlineValue; - if (optionsGetOwn(options, longOption, 'type') === 'string' && - isOptionValue(nextArg)) { - // e.g. '--foo', 'bar' - value = ArrayPrototypeShift(remainingArgs); - inlineValue = false; - } - ArrayPrototypePush( - tokens, - { kind: 'option', name: longOption, rawName: arg, - index, value, inlineValue }); - if (value != null) ++index; - continue; - } - - if (isLongOptionAndValue(arg)) { - // e.g. --foo=bar - const equalIndex = StringPrototypeIndexOf(arg, '='); - const longOption = StringPrototypeSlice(arg, 2, equalIndex); - const value = StringPrototypeSlice(arg, equalIndex + 1); - ArrayPrototypePush( - tokens, - { kind: 'option', name: longOption, rawName: `--${longOption}`, - index, value, inlineValue: true }); - continue; - } - - ArrayPrototypePush(tokens, { kind: 'positional', index, value: arg }); - } - - return tokens; -} - -const parseArgs = (config = kEmptyObject) => { - const args = objectGetOwn(config, 'args') ?? getMainArgs(); - const strict = objectGetOwn(config, 'strict') ?? true; - const allowPositionals = objectGetOwn(config, 'allowPositionals') ?? !strict; - const returnTokens = objectGetOwn(config, 'tokens') ?? false; - const options = objectGetOwn(config, 'options') ?? { __proto__: null }; - // Bundle these up for passing to strict-mode checks. - const parseConfig = { args, strict, options, allowPositionals }; - - // Validate input configuration. - validateArray(args, 'args'); - validateBoolean(strict, 'strict'); - validateBoolean(allowPositionals, 'allowPositionals'); - validateBoolean(returnTokens, 'tokens'); - validateObject(options, 'options'); - ArrayPrototypeForEach( - ObjectEntries(options), - ({ 0: longOption, 1: optionConfig }) => { - validateObject(optionConfig, `options.${longOption}`); - - // type is required - const optionType = objectGetOwn(optionConfig, 'type'); - validateUnion(optionType, `options.${longOption}.type`, ['string', 'boolean']); - - if (ObjectHasOwn(optionConfig, 'short')) { - const shortOption = optionConfig.short; - validateString(shortOption, `options.${longOption}.short`); - if (shortOption.length !== 1) { - throw new ERR_INVALID_ARG_VALUE( - `options.${longOption}.short`, - shortOption, - 'must be a single character' - ); - } - } - - const multipleOption = objectGetOwn(optionConfig, 'multiple'); - if (ObjectHasOwn(optionConfig, 'multiple')) { - validateBoolean(multipleOption, `options.${longOption}.multiple`); - } - - const defaultValue = objectGetOwn(optionConfig, 'default'); - if (defaultValue !== undefined) { - let validator; - switch (optionType) { - case 'string': - validator = multipleOption ? validateStringArray : validateString; - break; - - case 'boolean': - validator = multipleOption ? validateBooleanArray : validateBoolean; - break; - } - validator(defaultValue, `options.${longOption}.default`); - } - } - ); - - // Phase 1: identify tokens - const tokens = argsToTokens(args, options); - - // Phase 2: process tokens into parsed option values and positionals - const result = { - values: { __proto__: null }, - positionals: [], - }; - if (returnTokens) { - result.tokens = tokens; - } - ArrayPrototypeForEach(tokens, (token) => { - if (token.kind === 'option') { - if (strict) { - checkOptionUsage(parseConfig, token); - checkOptionLikeValue(token); - } - storeOption(token.name, token.value, options, result.values); - } else if (token.kind === 'positional') { - if (!allowPositionals) { - throw new ERR_PARSE_ARGS_UNEXPECTED_POSITIONAL(token.value); - } - ArrayPrototypePush(result.positionals, token.value); - } - }); - - // Phase 3: fill in default values for missing args - ArrayPrototypeForEach(ObjectEntries(options), ({ 0: longOption, - 1: optionConfig }) => { - const mustSetDefault = useDefaultValueOption(longOption, - optionConfig, - result.values); - if (mustSetDefault) { - storeDefaultOption(longOption, - objectGetOwn(optionConfig, 'default'), - result.values); - } - }); - - - return result; -}; - -module.exports = { - parseArgs, -}; diff --git a/node_modules/@pkgjs/parseargs/internal/errors.js b/node_modules/@pkgjs/parseargs/internal/errors.js deleted file mode 100644 index e1b237b..0000000 --- a/node_modules/@pkgjs/parseargs/internal/errors.js +++ /dev/null @@ -1,47 +0,0 @@ -'use strict'; - -class ERR_INVALID_ARG_TYPE extends TypeError { - constructor(name, expected, actual) { - super(`${name} must be ${expected} got ${actual}`); - this.code = 'ERR_INVALID_ARG_TYPE'; - } -} - -class ERR_INVALID_ARG_VALUE extends TypeError { - constructor(arg1, arg2, expected) { - super(`The property ${arg1} ${expected}. Received '${arg2}'`); - this.code = 'ERR_INVALID_ARG_VALUE'; - } -} - -class ERR_PARSE_ARGS_INVALID_OPTION_VALUE extends Error { - constructor(message) { - super(message); - this.code = 'ERR_PARSE_ARGS_INVALID_OPTION_VALUE'; - } -} - -class ERR_PARSE_ARGS_UNKNOWN_OPTION extends Error { - constructor(option, allowPositionals) { - const suggestDashDash = allowPositionals ? `. To specify a positional argument starting with a '-', place it at the end of the command after '--', as in '-- ${JSON.stringify(option)}` : ''; - super(`Unknown option '${option}'${suggestDashDash}`); - this.code = 'ERR_PARSE_ARGS_UNKNOWN_OPTION'; - } -} - -class ERR_PARSE_ARGS_UNEXPECTED_POSITIONAL extends Error { - constructor(positional) { - super(`Unexpected argument '${positional}'. This command does not take positional arguments`); - this.code = 'ERR_PARSE_ARGS_UNEXPECTED_POSITIONAL'; - } -} - -module.exports = { - codes: { - ERR_INVALID_ARG_TYPE, - ERR_INVALID_ARG_VALUE, - ERR_PARSE_ARGS_INVALID_OPTION_VALUE, - ERR_PARSE_ARGS_UNKNOWN_OPTION, - ERR_PARSE_ARGS_UNEXPECTED_POSITIONAL, - } -}; diff --git a/node_modules/@pkgjs/parseargs/internal/primordials.js b/node_modules/@pkgjs/parseargs/internal/primordials.js deleted file mode 100644 index 63e23ab..0000000 --- a/node_modules/@pkgjs/parseargs/internal/primordials.js +++ /dev/null @@ -1,393 +0,0 @@ -/* -This file is copied from https://github.com/nodejs/node/blob/v14.19.3/lib/internal/per_context/primordials.js -under the following license: - -Copyright Node.js contributors. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. -*/ - -'use strict'; - -/* eslint-disable node-core/prefer-primordials */ - -// This file subclasses and stores the JS builtins that come from the VM -// so that Node.js's builtin modules do not need to later look these up from -// the global proxy, which can be mutated by users. - -// Use of primordials have sometimes a dramatic impact on performance, please -// benchmark all changes made in performance-sensitive areas of the codebase. -// See: https://github.com/nodejs/node/pull/38248 - -const primordials = {}; - -const { - defineProperty: ReflectDefineProperty, - getOwnPropertyDescriptor: ReflectGetOwnPropertyDescriptor, - ownKeys: ReflectOwnKeys, -} = Reflect; - -// `uncurryThis` is equivalent to `func => Function.prototype.call.bind(func)`. -// It is using `bind.bind(call)` to avoid using `Function.prototype.bind` -// and `Function.prototype.call` after it may have been mutated by users. -const { apply, bind, call } = Function.prototype; -const uncurryThis = bind.bind(call); -primordials.uncurryThis = uncurryThis; - -// `applyBind` is equivalent to `func => Function.prototype.apply.bind(func)`. -// It is using `bind.bind(apply)` to avoid using `Function.prototype.bind` -// and `Function.prototype.apply` after it may have been mutated by users. -const applyBind = bind.bind(apply); -primordials.applyBind = applyBind; - -// Methods that accept a variable number of arguments, and thus it's useful to -// also create `${prefix}${key}Apply`, which uses `Function.prototype.apply`, -// instead of `Function.prototype.call`, and thus doesn't require iterator -// destructuring. -const varargsMethods = [ - // 'ArrayPrototypeConcat' is omitted, because it performs the spread - // on its own for arrays and array-likes with a truthy - // @@isConcatSpreadable symbol property. - 'ArrayOf', - 'ArrayPrototypePush', - 'ArrayPrototypeUnshift', - // 'FunctionPrototypeCall' is omitted, since there's 'ReflectApply' - // and 'FunctionPrototypeApply'. - 'MathHypot', - 'MathMax', - 'MathMin', - 'StringPrototypeConcat', - 'TypedArrayOf', -]; - -function getNewKey(key) { - return typeof key === 'symbol' ? - `Symbol${key.description[7].toUpperCase()}${key.description.slice(8)}` : - `${key[0].toUpperCase()}${key.slice(1)}`; -} - -function copyAccessor(dest, prefix, key, { enumerable, get, set }) { - ReflectDefineProperty(dest, `${prefix}Get${key}`, { - value: uncurryThis(get), - enumerable - }); - if (set !== undefined) { - ReflectDefineProperty(dest, `${prefix}Set${key}`, { - value: uncurryThis(set), - enumerable - }); - } -} - -function copyPropsRenamed(src, dest, prefix) { - for (const key of ReflectOwnKeys(src)) { - const newKey = getNewKey(key); - const desc = ReflectGetOwnPropertyDescriptor(src, key); - if ('get' in desc) { - copyAccessor(dest, prefix, newKey, desc); - } else { - const name = `${prefix}${newKey}`; - ReflectDefineProperty(dest, name, desc); - if (varargsMethods.includes(name)) { - ReflectDefineProperty(dest, `${name}Apply`, { - // `src` is bound as the `this` so that the static `this` points - // to the object it was defined on, - // e.g.: `ArrayOfApply` gets a `this` of `Array`: - value: applyBind(desc.value, src), - }); - } - } - } -} - -function copyPropsRenamedBound(src, dest, prefix) { - for (const key of ReflectOwnKeys(src)) { - const newKey = getNewKey(key); - const desc = ReflectGetOwnPropertyDescriptor(src, key); - if ('get' in desc) { - copyAccessor(dest, prefix, newKey, desc); - } else { - const { value } = desc; - if (typeof value === 'function') { - desc.value = value.bind(src); - } - - const name = `${prefix}${newKey}`; - ReflectDefineProperty(dest, name, desc); - if (varargsMethods.includes(name)) { - ReflectDefineProperty(dest, `${name}Apply`, { - value: applyBind(value, src), - }); - } - } - } -} - -function copyPrototype(src, dest, prefix) { - for (const key of ReflectOwnKeys(src)) { - const newKey = getNewKey(key); - const desc = ReflectGetOwnPropertyDescriptor(src, key); - if ('get' in desc) { - copyAccessor(dest, prefix, newKey, desc); - } else { - const { value } = desc; - if (typeof value === 'function') { - desc.value = uncurryThis(value); - } - - const name = `${prefix}${newKey}`; - ReflectDefineProperty(dest, name, desc); - if (varargsMethods.includes(name)) { - ReflectDefineProperty(dest, `${name}Apply`, { - value: applyBind(value), - }); - } - } - } -} - -// Create copies of configurable value properties of the global object -[ - 'Proxy', - 'globalThis', -].forEach((name) => { - // eslint-disable-next-line no-restricted-globals - primordials[name] = globalThis[name]; -}); - -// Create copies of URI handling functions -[ - decodeURI, - decodeURIComponent, - encodeURI, - encodeURIComponent, -].forEach((fn) => { - primordials[fn.name] = fn; -}); - -// Create copies of the namespace objects -[ - 'JSON', - 'Math', - 'Proxy', - 'Reflect', -].forEach((name) => { - // eslint-disable-next-line no-restricted-globals - copyPropsRenamed(global[name], primordials, name); -}); - -// Create copies of intrinsic objects -[ - 'Array', - 'ArrayBuffer', - 'BigInt', - 'BigInt64Array', - 'BigUint64Array', - 'Boolean', - 'DataView', - 'Date', - 'Error', - 'EvalError', - 'Float32Array', - 'Float64Array', - 'Function', - 'Int16Array', - 'Int32Array', - 'Int8Array', - 'Map', - 'Number', - 'Object', - 'RangeError', - 'ReferenceError', - 'RegExp', - 'Set', - 'String', - 'Symbol', - 'SyntaxError', - 'TypeError', - 'URIError', - 'Uint16Array', - 'Uint32Array', - 'Uint8Array', - 'Uint8ClampedArray', - 'WeakMap', - 'WeakSet', -].forEach((name) => { - // eslint-disable-next-line no-restricted-globals - const original = global[name]; - primordials[name] = original; - copyPropsRenamed(original, primordials, name); - copyPrototype(original.prototype, primordials, `${name}Prototype`); -}); - -// Create copies of intrinsic objects that require a valid `this` to call -// static methods. -// Refs: https://www.ecma-international.org/ecma-262/#sec-promise.all -[ - 'Promise', -].forEach((name) => { - // eslint-disable-next-line no-restricted-globals - const original = global[name]; - primordials[name] = original; - copyPropsRenamedBound(original, primordials, name); - copyPrototype(original.prototype, primordials, `${name}Prototype`); -}); - -// Create copies of abstract intrinsic objects that are not directly exposed -// on the global object. -// Refs: https://tc39.es/ecma262/#sec-%typedarray%-intrinsic-object -[ - { name: 'TypedArray', original: Reflect.getPrototypeOf(Uint8Array) }, - { name: 'ArrayIterator', original: { - prototype: Reflect.getPrototypeOf(Array.prototype[Symbol.iterator]()), - } }, - { name: 'StringIterator', original: { - prototype: Reflect.getPrototypeOf(String.prototype[Symbol.iterator]()), - } }, -].forEach(({ name, original }) => { - primordials[name] = original; - // The static %TypedArray% methods require a valid `this`, but can't be bound, - // as they need a subclass constructor as the receiver: - copyPrototype(original, primordials, name); - copyPrototype(original.prototype, primordials, `${name}Prototype`); -}); - -/* eslint-enable node-core/prefer-primordials */ - -const { - ArrayPrototypeForEach, - FunctionPrototypeCall, - Map, - ObjectFreeze, - ObjectSetPrototypeOf, - Set, - SymbolIterator, - WeakMap, - WeakSet, -} = primordials; - -// Because these functions are used by `makeSafe`, which is exposed -// on the `primordials` object, it's important to use const references -// to the primordials that they use: -const createSafeIterator = (factory, next) => { - class SafeIterator { - constructor(iterable) { - this._iterator = factory(iterable); - } - next() { - return next(this._iterator); - } - [SymbolIterator]() { - return this; - } - } - ObjectSetPrototypeOf(SafeIterator.prototype, null); - ObjectFreeze(SafeIterator.prototype); - ObjectFreeze(SafeIterator); - return SafeIterator; -}; - -primordials.SafeArrayIterator = createSafeIterator( - primordials.ArrayPrototypeSymbolIterator, - primordials.ArrayIteratorPrototypeNext -); -primordials.SafeStringIterator = createSafeIterator( - primordials.StringPrototypeSymbolIterator, - primordials.StringIteratorPrototypeNext -); - -const copyProps = (src, dest) => { - ArrayPrototypeForEach(ReflectOwnKeys(src), (key) => { - if (!ReflectGetOwnPropertyDescriptor(dest, key)) { - ReflectDefineProperty( - dest, - key, - ReflectGetOwnPropertyDescriptor(src, key)); - } - }); -}; - -const makeSafe = (unsafe, safe) => { - if (SymbolIterator in unsafe.prototype) { - const dummy = new unsafe(); - let next; // We can reuse the same `next` method. - - ArrayPrototypeForEach(ReflectOwnKeys(unsafe.prototype), (key) => { - if (!ReflectGetOwnPropertyDescriptor(safe.prototype, key)) { - const desc = ReflectGetOwnPropertyDescriptor(unsafe.prototype, key); - if ( - typeof desc.value === 'function' && - desc.value.length === 0 && - SymbolIterator in (FunctionPrototypeCall(desc.value, dummy) ?? {}) - ) { - const createIterator = uncurryThis(desc.value); - next = next ?? uncurryThis(createIterator(dummy).next); - const SafeIterator = createSafeIterator(createIterator, next); - desc.value = function() { - return new SafeIterator(this); - }; - } - ReflectDefineProperty(safe.prototype, key, desc); - } - }); - } else { - copyProps(unsafe.prototype, safe.prototype); - } - copyProps(unsafe, safe); - - ObjectSetPrototypeOf(safe.prototype, null); - ObjectFreeze(safe.prototype); - ObjectFreeze(safe); - return safe; -}; -primordials.makeSafe = makeSafe; - -// Subclass the constructors because we need to use their prototype -// methods later. -// Defining the `constructor` is necessary here to avoid the default -// constructor which uses the user-mutable `%ArrayIteratorPrototype%.next`. -primordials.SafeMap = makeSafe( - Map, - class SafeMap extends Map { - constructor(i) { super(i); } // eslint-disable-line no-useless-constructor - } -); -primordials.SafeWeakMap = makeSafe( - WeakMap, - class SafeWeakMap extends WeakMap { - constructor(i) { super(i); } // eslint-disable-line no-useless-constructor - } -); -primordials.SafeSet = makeSafe( - Set, - class SafeSet extends Set { - constructor(i) { super(i); } // eslint-disable-line no-useless-constructor - } -); -primordials.SafeWeakSet = makeSafe( - WeakSet, - class SafeWeakSet extends WeakSet { - constructor(i) { super(i); } // eslint-disable-line no-useless-constructor - } -); - -ObjectSetPrototypeOf(primordials, null); -ObjectFreeze(primordials); - -module.exports = primordials; diff --git a/node_modules/@pkgjs/parseargs/internal/util.js b/node_modules/@pkgjs/parseargs/internal/util.js deleted file mode 100644 index b9b8fe5..0000000 --- a/node_modules/@pkgjs/parseargs/internal/util.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -// This is a placeholder for util.js in node.js land. - -const { - ObjectCreate, - ObjectFreeze, -} = require('./primordials'); - -const kEmptyObject = ObjectFreeze(ObjectCreate(null)); - -module.exports = { - kEmptyObject, -}; diff --git a/node_modules/@pkgjs/parseargs/internal/validators.js b/node_modules/@pkgjs/parseargs/internal/validators.js deleted file mode 100644 index b5ac4fb..0000000 --- a/node_modules/@pkgjs/parseargs/internal/validators.js +++ /dev/null @@ -1,89 +0,0 @@ -'use strict'; - -// This file is a proxy of the original file located at: -// https://github.com/nodejs/node/blob/main/lib/internal/validators.js -// Every addition or modification to this file must be evaluated -// during the PR review. - -const { - ArrayIsArray, - ArrayPrototypeIncludes, - ArrayPrototypeJoin, -} = require('./primordials'); - -const { - codes: { - ERR_INVALID_ARG_TYPE - } -} = require('./errors'); - -function validateString(value, name) { - if (typeof value !== 'string') { - throw new ERR_INVALID_ARG_TYPE(name, 'String', value); - } -} - -function validateUnion(value, name, union) { - if (!ArrayPrototypeIncludes(union, value)) { - throw new ERR_INVALID_ARG_TYPE(name, `('${ArrayPrototypeJoin(union, '|')}')`, value); - } -} - -function validateBoolean(value, name) { - if (typeof value !== 'boolean') { - throw new ERR_INVALID_ARG_TYPE(name, 'Boolean', value); - } -} - -function validateArray(value, name) { - if (!ArrayIsArray(value)) { - throw new ERR_INVALID_ARG_TYPE(name, 'Array', value); - } -} - -function validateStringArray(value, name) { - validateArray(value, name); - for (let i = 0; i < value.length; i++) { - validateString(value[i], `${name}[${i}]`); - } -} - -function validateBooleanArray(value, name) { - validateArray(value, name); - for (let i = 0; i < value.length; i++) { - validateBoolean(value[i], `${name}[${i}]`); - } -} - -/** - * @param {unknown} value - * @param {string} name - * @param {{ - * allowArray?: boolean, - * allowFunction?: boolean, - * nullable?: boolean - * }} [options] - */ -function validateObject(value, name, options) { - const useDefaultOptions = options == null; - const allowArray = useDefaultOptions ? false : options.allowArray; - const allowFunction = useDefaultOptions ? false : options.allowFunction; - const nullable = useDefaultOptions ? false : options.nullable; - if ((!nullable && value === null) || - (!allowArray && ArrayIsArray(value)) || - (typeof value !== 'object' && ( - !allowFunction || typeof value !== 'function' - ))) { - throw new ERR_INVALID_ARG_TYPE(name, 'Object', value); - } -} - -module.exports = { - validateArray, - validateObject, - validateString, - validateStringArray, - validateUnion, - validateBoolean, - validateBooleanArray, -}; diff --git a/node_modules/@pkgjs/parseargs/package.json b/node_modules/@pkgjs/parseargs/package.json deleted file mode 100644 index 0bcc05c..0000000 --- a/node_modules/@pkgjs/parseargs/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "@pkgjs/parseargs", - "version": "0.11.0", - "description": "Polyfill of future proposal for `util.parseArgs()`", - "engines": { - "node": ">=14" - }, - "main": "index.js", - "exports": { - ".": "./index.js", - "./package.json": "./package.json" - }, - "scripts": { - "coverage": "c8 --check-coverage tape 'test/*.js'", - "test": "c8 tape 'test/*.js'", - "posttest": "eslint .", - "fix": "npm run posttest -- --fix" - }, - "repository": { - "type": "git", - "url": "git@github.com:pkgjs/parseargs.git" - }, - "keywords": [], - "author": "", - "license": "MIT", - "bugs": { - "url": "https://github.com/pkgjs/parseargs/issues" - }, - "homepage": "https://github.com/pkgjs/parseargs#readme", - "devDependencies": { - "c8": "^7.10.0", - "eslint": "^8.2.0", - "eslint-plugin-node-core": "iansu/eslint-plugin-node-core", - "tape": "^5.2.2" - } -} diff --git a/node_modules/@pkgjs/parseargs/utils.js b/node_modules/@pkgjs/parseargs/utils.js deleted file mode 100644 index d7f420a..0000000 --- a/node_modules/@pkgjs/parseargs/utils.js +++ /dev/null @@ -1,198 +0,0 @@ -'use strict'; - -const { - ArrayPrototypeFind, - ObjectEntries, - ObjectPrototypeHasOwnProperty: ObjectHasOwn, - StringPrototypeCharAt, - StringPrototypeIncludes, - StringPrototypeStartsWith, -} = require('./internal/primordials'); - -const { - validateObject, -} = require('./internal/validators'); - -// These are internal utilities to make the parsing logic easier to read, and -// add lots of detail for the curious. They are in a separate file to allow -// unit testing, although that is not essential (this could be rolled into -// main file and just tested implicitly via API). -// -// These routines are for internal use, not for export to client. - -/** - * Return the named property, but only if it is an own property. - */ -function objectGetOwn(obj, prop) { - if (ObjectHasOwn(obj, prop)) - return obj[prop]; -} - -/** - * Return the named options property, but only if it is an own property. - */ -function optionsGetOwn(options, longOption, prop) { - if (ObjectHasOwn(options, longOption)) - return objectGetOwn(options[longOption], prop); -} - -/** - * Determines if the argument may be used as an option value. - * @example - * isOptionValue('V') // returns true - * isOptionValue('-v') // returns true (greedy) - * isOptionValue('--foo') // returns true (greedy) - * isOptionValue(undefined) // returns false - */ -function isOptionValue(value) { - if (value == null) return false; - - // Open Group Utility Conventions are that an option-argument - // is the argument after the option, and may start with a dash. - return true; // greedy! -} - -/** - * Detect whether there is possible confusion and user may have omitted - * the option argument, like `--port --verbose` when `port` of type:string. - * In strict mode we throw errors if value is option-like. - */ -function isOptionLikeValue(value) { - if (value == null) return false; - - return value.length > 1 && StringPrototypeCharAt(value, 0) === '-'; -} - -/** - * Determines if `arg` is just a short option. - * @example '-f' - */ -function isLoneShortOption(arg) { - return arg.length === 2 && - StringPrototypeCharAt(arg, 0) === '-' && - StringPrototypeCharAt(arg, 1) !== '-'; -} - -/** - * Determines if `arg` is a lone long option. - * @example - * isLoneLongOption('a') // returns false - * isLoneLongOption('-a') // returns false - * isLoneLongOption('--foo') // returns true - * isLoneLongOption('--foo=bar') // returns false - */ -function isLoneLongOption(arg) { - return arg.length > 2 && - StringPrototypeStartsWith(arg, '--') && - !StringPrototypeIncludes(arg, '=', 3); -} - -/** - * Determines if `arg` is a long option and value in the same argument. - * @example - * isLongOptionAndValue('--foo') // returns false - * isLongOptionAndValue('--foo=bar') // returns true - */ -function isLongOptionAndValue(arg) { - return arg.length > 2 && - StringPrototypeStartsWith(arg, '--') && - StringPrototypeIncludes(arg, '=', 3); -} - -/** - * Determines if `arg` is a short option group. - * - * See Guideline 5 of the [Open Group Utility Conventions](https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html). - * One or more options without option-arguments, followed by at most one - * option that takes an option-argument, should be accepted when grouped - * behind one '-' delimiter. - * @example - * isShortOptionGroup('-a', {}) // returns false - * isShortOptionGroup('-ab', {}) // returns true - * // -fb is an option and a value, not a short option group - * isShortOptionGroup('-fb', { - * options: { f: { type: 'string' } } - * }) // returns false - * isShortOptionGroup('-bf', { - * options: { f: { type: 'string' } } - * }) // returns true - * // -bfb is an edge case, return true and caller sorts it out - * isShortOptionGroup('-bfb', { - * options: { f: { type: 'string' } } - * }) // returns true - */ -function isShortOptionGroup(arg, options) { - if (arg.length <= 2) return false; - if (StringPrototypeCharAt(arg, 0) !== '-') return false; - if (StringPrototypeCharAt(arg, 1) === '-') return false; - - const firstShort = StringPrototypeCharAt(arg, 1); - const longOption = findLongOptionForShort(firstShort, options); - return optionsGetOwn(options, longOption, 'type') !== 'string'; -} - -/** - * Determine if arg is a short string option followed by its value. - * @example - * isShortOptionAndValue('-a', {}); // returns false - * isShortOptionAndValue('-ab', {}); // returns false - * isShortOptionAndValue('-fFILE', { - * options: { foo: { short: 'f', type: 'string' }} - * }) // returns true - */ -function isShortOptionAndValue(arg, options) { - validateObject(options, 'options'); - - if (arg.length <= 2) return false; - if (StringPrototypeCharAt(arg, 0) !== '-') return false; - if (StringPrototypeCharAt(arg, 1) === '-') return false; - - const shortOption = StringPrototypeCharAt(arg, 1); - const longOption = findLongOptionForShort(shortOption, options); - return optionsGetOwn(options, longOption, 'type') === 'string'; -} - -/** - * Find the long option associated with a short option. Looks for a configured - * `short` and returns the short option itself if a long option is not found. - * @example - * findLongOptionForShort('a', {}) // returns 'a' - * findLongOptionForShort('b', { - * options: { bar: { short: 'b' } } - * }) // returns 'bar' - */ -function findLongOptionForShort(shortOption, options) { - validateObject(options, 'options'); - const longOptionEntry = ArrayPrototypeFind( - ObjectEntries(options), - ({ 1: optionConfig }) => objectGetOwn(optionConfig, 'short') === shortOption - ); - return longOptionEntry?.[0] ?? shortOption; -} - -/** - * Check if the given option includes a default value - * and that option has not been set by the input args. - * - * @param {string} longOption - long option name e.g. 'foo' - * @param {object} optionConfig - the option configuration properties - * @param {object} values - option values returned in `values` by parseArgs - */ -function useDefaultValueOption(longOption, optionConfig, values) { - return objectGetOwn(optionConfig, 'default') !== undefined && - values[longOption] === undefined; -} - -module.exports = { - findLongOptionForShort, - isLoneLongOption, - isLoneShortOption, - isLongOptionAndValue, - isOptionValue, - isOptionLikeValue, - isShortOptionAndValue, - isShortOptionGroup, - useDefaultValueOption, - objectGetOwn, - optionsGetOwn, -}; diff --git a/node_modules/@types/offscreencanvas/LICENSE b/node_modules/@types/offscreencanvas/LICENSE deleted file mode 100644 index 9e841e7..0000000 --- a/node_modules/@types/offscreencanvas/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ - MIT License - - Copyright (c) Microsoft Corporation. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE diff --git a/node_modules/@types/offscreencanvas/README.md b/node_modules/@types/offscreencanvas/README.md deleted file mode 100644 index ed71f4f..0000000 --- a/node_modules/@types/offscreencanvas/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Installation -> `npm install --save @types/offscreencanvas` - -# Summary -This package contains type definitions for offscreencanvas (https://html.spec.whatwg.org/multipage/canvas.html#the-offscreencanvas-interface). - -# Details -Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/offscreencanvas. - -### Additional Details - * Last updated: Tue, 07 Nov 2023 09:09:39 GMT - * Dependencies: none - -# Credits -These definitions were written by [Klaus Reimer](https://github.com/kayahr), [Oleg Varaksin](https://github.com/ova2), and [Sean T.McBeth](https://github.com/capnmidnight). diff --git a/node_modules/@types/offscreencanvas/index.d.ts b/node_modules/@types/offscreencanvas/index.d.ts deleted file mode 100644 index 8816788..0000000 --- a/node_modules/@types/offscreencanvas/index.d.ts +++ /dev/null @@ -1,208 +0,0 @@ -// https://html.spec.whatwg.org/multipage/canvas.html#dom-canvas-transfercontroltooffscreen -interface HTMLCanvasElement { - transferControlToOffscreen(): OffscreenCanvas; -} - -// https://html.spec.whatwg.org/multipage/canvas.html#offscreencanvasrenderingcontext2d -interface OffscreenCanvasRenderingContext2D - extends - CanvasState, - CanvasTransform, - CanvasCompositing, - CanvasImageSmoothing, - CanvasFillStrokeStyles, - CanvasShadowStyles, - CanvasFilters, - CanvasRect, - CanvasDrawPath, - CanvasText, - CanvasDrawImage, - CanvasImageData, - CanvasPathDrawingStyles, - CanvasTextDrawingStyles, - CanvasPath -{ - readonly canvas: OffscreenCanvas; -} - -declare var OffscreenCanvasRenderingContext2D: { - prototype: OffscreenCanvasRenderingContext2D; - new(): OffscreenCanvasRenderingContext2D; -}; - -// https://html.spec.whatwg.org/multipage/canvas.html#the-offscreencanvas-interface -// Possible contextId values are defined by the enum OffscreenRenderingContextId { "2d", "bitmaprenderer", "webgl", "webgl2" } -// See also description: https://developer.mozilla.org/en-US/docs/Web/API/OffscreenCanvas/getContext -interface OffscreenCanvas extends EventTarget { - width: number; - height: number; - - getContext( - contextId: "2d", - contextAttributes?: CanvasRenderingContext2DSettings, - ): OffscreenCanvasRenderingContext2D | null; - - getContext( - contextId: "bitmaprenderer", - contextAttributes?: WebGLContextAttributes, - ): ImageBitmapRenderingContext | null; - - getContext(contextId: "webgl", contextAttributes?: WebGLContextAttributes): WebGLRenderingContext | null; - - getContext(contextId: "webgl2", contextAttributes?: WebGLContextAttributes): WebGL2RenderingContext | null; - - convertToBlob(options?: { type?: string | undefined; quality?: number | undefined }): Promise; - - transferToImageBitmap(): ImageBitmap; -} - -// https://html.spec.whatwg.org/multipage/canvas.html#canvasdrawimage -interface CanvasDrawImage { - drawImage(image: CanvasImageSource | OffscreenCanvas, dx: number, dy: number): void; - - drawImage(image: CanvasImageSource | OffscreenCanvas, dx: number, dy: number, dw: number, dh: number): void; - - drawImage( - image: CanvasImageSource | OffscreenCanvas, - sx: number, - sy: number, - sw: number, - sh: number, - dx: number, - dy: number, - dw: number, - dh: number, - ): void; -} - -// https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#dom-createimagebitmap -declare function createImageBitmap(image: ImageBitmapSource | OffscreenCanvas): Promise; -declare function createImageBitmap( - image: ImageBitmapSource | OffscreenCanvas, - sx: number, - sy: number, - sw: number, - sh: number, -): Promise; - -// OffscreenCanvas should be a part of Transferable => extend all postMessage methods -interface Worker { - postMessage(message: any, transfer?: Array): void; -} - -interface DedicatedWorkerGlobalScope { - postMessage(message: any, transfer?: Array): void; -} - -interface ServiceWorker { - postMessage(message: any, transfer?: Array): void; -} - -interface MessagePort { - postMessage(message: any, transfer?: Array): void; -} - -interface Window { - postMessage(message: any, targetOrigin: string, transfer?: Array): void; -} - -declare function postMessage( - message: any, - targetOrigin: string, - transfer?: Array, -): void; - -declare var OffscreenCanvas: { - prototype: OffscreenCanvas; - new(width: number, height: number): OffscreenCanvas; -}; - -interface WebGL2RenderingContextBase { - texImage3D( - target: GLenum, - level: GLint, - internalformat: GLint, - width: GLsizei, - height: GLsizei, - depth: GLsizei, - border: GLint, - format: GLenum, - type: GLenum, - source: TexImageSource | OffscreenCanvas, - ): void; - texSubImage3D( - target: GLenum, - level: GLint, - xoffset: GLint, - yoffset: GLint, - zoffset: GLint, - width: GLsizei, - height: GLsizei, - depth: GLsizei, - format: GLenum, - type: GLenum, - source: TexImageSource | OffscreenCanvas, - ): void; -} - -interface WebGL2RenderingContextOverloads { - texImage2D( - target: GLenum, - level: GLint, - internalformat: GLint, - format: GLenum, - type: GLenum, - source: TexImageSource | OffscreenCanvas, - ): void; - texImage2D( - target: GLenum, - level: GLint, - internalformat: GLint, - width: GLsizei, - height: GLsizei, - border: GLint, - format: GLenum, - type: GLenum, - source: TexImageSource | OffscreenCanvas, - ): void; - texSubImage2D( - target: GLenum, - level: GLint, - xoffset: GLint, - yoffset: GLint, - format: GLenum, - type: GLenum, - source: TexImageSource | OffscreenCanvas, - ): void; - texSubImage2D( - target: GLenum, - level: GLint, - xoffset: GLint, - yoffset: GLint, - width: GLsizei, - height: GLsizei, - format: GLenum, - type: GLenum, - source: TexImageSource | OffscreenCanvas, - ): void; -} - -interface WebGLRenderingContextOverloads { - texImage2D( - target: GLenum, - level: GLint, - internalformat: GLint, - format: GLenum, - type: GLenum, - source: TexImageSource | OffscreenCanvas, - ): void; - texSubImage2D( - target: GLenum, - level: GLint, - xoffset: GLint, - yoffset: GLint, - format: GLenum, - type: GLenum, - source: TexImageSource | OffscreenCanvas, - ): void; -} diff --git a/node_modules/@types/offscreencanvas/package.json b/node_modules/@types/offscreencanvas/package.json deleted file mode 100644 index 07f6312..0000000 --- a/node_modules/@types/offscreencanvas/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "@types/offscreencanvas", - "version": "2019.7.3", - "description": "TypeScript definitions for offscreencanvas", - "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/offscreencanvas", - "license": "MIT", - "contributors": [ - { - "name": "Klaus Reimer", - "githubUsername": "kayahr", - "url": "https://github.com/kayahr" - }, - { - "name": "Oleg Varaksin", - "githubUsername": "ova2", - "url": "https://github.com/ova2" - }, - { - "name": "Sean T.McBeth", - "githubUsername": "capnmidnight", - "url": "https://github.com/capnmidnight" - } - ], - "main": "", - "types": "index.d.ts", - "repository": { - "type": "git", - "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git", - "directory": "types/offscreencanvas" - }, - "scripts": {}, - "dependencies": {}, - "typesPublisherContentHash": "3bb9d8e21546b767b05750c5b57b2612423128a6c4619c93ff2e2cbe93279baf", - "typeScriptVersion": "4.5", - "nonNpm": true -} \ No newline at end of file diff --git a/node_modules/ansi-regex/index.d.ts b/node_modules/ansi-regex/index.d.ts deleted file mode 100644 index 2dbf6af..0000000 --- a/node_modules/ansi-regex/index.d.ts +++ /dev/null @@ -1,37 +0,0 @@ -declare namespace ansiRegex { - interface Options { - /** - Match only the first ANSI escape. - - @default false - */ - onlyFirst: boolean; - } -} - -/** -Regular expression for matching ANSI escape codes. - -@example -``` -import ansiRegex = require('ansi-regex'); - -ansiRegex().test('\u001B[4mcake\u001B[0m'); -//=> true - -ansiRegex().test('cake'); -//=> false - -'\u001B[4mcake\u001B[0m'.match(ansiRegex()); -//=> ['\u001B[4m', '\u001B[0m'] - -'\u001B[4mcake\u001B[0m'.match(ansiRegex({onlyFirst: true})); -//=> ['\u001B[4m'] - -'\u001B]8;;https://github.com\u0007click\u001B]8;;\u0007'.match(ansiRegex()); -//=> ['\u001B]8;;https://github.com\u0007', '\u001B]8;;\u0007'] -``` -*/ -declare function ansiRegex(options?: ansiRegex.Options): RegExp; - -export = ansiRegex; diff --git a/node_modules/ansi-regex/index.js b/node_modules/ansi-regex/index.js deleted file mode 100644 index 616ff83..0000000 --- a/node_modules/ansi-regex/index.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict'; - -module.exports = ({onlyFirst = false} = {}) => { - const pattern = [ - '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)', - '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))' - ].join('|'); - - return new RegExp(pattern, onlyFirst ? undefined : 'g'); -}; diff --git a/node_modules/ansi-regex/license b/node_modules/ansi-regex/license deleted file mode 100644 index e7af2f7..0000000 --- a/node_modules/ansi-regex/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/ansi-regex/package.json b/node_modules/ansi-regex/package.json deleted file mode 100644 index 017f531..0000000 --- a/node_modules/ansi-regex/package.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "name": "ansi-regex", - "version": "5.0.1", - "description": "Regular expression for matching ANSI escape codes", - "license": "MIT", - "repository": "chalk/ansi-regex", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=8" - }, - "scripts": { - "test": "xo && ava && tsd", - "view-supported": "node fixtures/view-codes.js" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "ansi", - "styles", - "color", - "colour", - "colors", - "terminal", - "console", - "cli", - "string", - "tty", - "escape", - "formatting", - "rgb", - "256", - "shell", - "xterm", - "command-line", - "text", - "regex", - "regexp", - "re", - "match", - "test", - "find", - "pattern" - ], - "devDependencies": { - "ava": "^2.4.0", - "tsd": "^0.9.0", - "xo": "^0.25.3" - } -} diff --git a/node_modules/ansi-regex/readme.md b/node_modules/ansi-regex/readme.md deleted file mode 100644 index 4d848bc..0000000 --- a/node_modules/ansi-regex/readme.md +++ /dev/null @@ -1,78 +0,0 @@ -# ansi-regex - -> Regular expression for matching [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) - - -## Install - -``` -$ npm install ansi-regex -``` - - -## Usage - -```js -const ansiRegex = require('ansi-regex'); - -ansiRegex().test('\u001B[4mcake\u001B[0m'); -//=> true - -ansiRegex().test('cake'); -//=> false - -'\u001B[4mcake\u001B[0m'.match(ansiRegex()); -//=> ['\u001B[4m', '\u001B[0m'] - -'\u001B[4mcake\u001B[0m'.match(ansiRegex({onlyFirst: true})); -//=> ['\u001B[4m'] - -'\u001B]8;;https://github.com\u0007click\u001B]8;;\u0007'.match(ansiRegex()); -//=> ['\u001B]8;;https://github.com\u0007', '\u001B]8;;\u0007'] -``` - - -## API - -### ansiRegex(options?) - -Returns a regex for matching ANSI escape codes. - -#### options - -Type: `object` - -##### onlyFirst - -Type: `boolean`
    -Default: `false` *(Matches any ANSI escape codes in a string)* - -Match only the first ANSI escape. - - -## FAQ - -### Why do you test for codes not in the ECMA 48 standard? - -Some of the codes we run as a test are codes that we acquired finding various lists of non-standard or manufacturer specific codes. We test for both standard and non-standard codes, as most of them follow the same or similar format and can be safely matched in strings without the risk of removing actual string content. There are a few non-standard control codes that do not follow the traditional format (i.e. they end in numbers) thus forcing us to exclude them from the test because we cannot reliably match them. - -On the historical side, those ECMA standards were established in the early 90's whereas the VT100, for example, was designed in the mid/late 70's. At that point in time, control codes were still pretty ungoverned and engineers used them for a multitude of things, namely to activate hardware ports that may have been proprietary. Somewhere else you see a similar 'anarchy' of codes is in the x86 architecture for processors; there are a ton of "interrupts" that can mean different things on certain brands of processors, most of which have been phased out. - - -## Maintainers - -- [Sindre Sorhus](https://github.com/sindresorhus) -- [Josh Junon](https://github.com/qix-) - - ---- - -
    - - Get professional support for this package with a Tidelift subscription - -
    - - Tidelift helps make open source sustainable for maintainers while giving companies
    assurances about security, maintenance, and licensing for their dependencies. -
    -
    diff --git a/node_modules/ansi-styles/index.d.ts b/node_modules/ansi-styles/index.d.ts deleted file mode 100644 index 44a907e..0000000 --- a/node_modules/ansi-styles/index.d.ts +++ /dev/null @@ -1,345 +0,0 @@ -declare type CSSColor = - | 'aliceblue' - | 'antiquewhite' - | 'aqua' - | 'aquamarine' - | 'azure' - | 'beige' - | 'bisque' - | 'black' - | 'blanchedalmond' - | 'blue' - | 'blueviolet' - | 'brown' - | 'burlywood' - | 'cadetblue' - | 'chartreuse' - | 'chocolate' - | 'coral' - | 'cornflowerblue' - | 'cornsilk' - | 'crimson' - | 'cyan' - | 'darkblue' - | 'darkcyan' - | 'darkgoldenrod' - | 'darkgray' - | 'darkgreen' - | 'darkgrey' - | 'darkkhaki' - | 'darkmagenta' - | 'darkolivegreen' - | 'darkorange' - | 'darkorchid' - | 'darkred' - | 'darksalmon' - | 'darkseagreen' - | 'darkslateblue' - | 'darkslategray' - | 'darkslategrey' - | 'darkturquoise' - | 'darkviolet' - | 'deeppink' - | 'deepskyblue' - | 'dimgray' - | 'dimgrey' - | 'dodgerblue' - | 'firebrick' - | 'floralwhite' - | 'forestgreen' - | 'fuchsia' - | 'gainsboro' - | 'ghostwhite' - | 'gold' - | 'goldenrod' - | 'gray' - | 'green' - | 'greenyellow' - | 'grey' - | 'honeydew' - | 'hotpink' - | 'indianred' - | 'indigo' - | 'ivory' - | 'khaki' - | 'lavender' - | 'lavenderblush' - | 'lawngreen' - | 'lemonchiffon' - | 'lightblue' - | 'lightcoral' - | 'lightcyan' - | 'lightgoldenrodyellow' - | 'lightgray' - | 'lightgreen' - | 'lightgrey' - | 'lightpink' - | 'lightsalmon' - | 'lightseagreen' - | 'lightskyblue' - | 'lightslategray' - | 'lightslategrey' - | 'lightsteelblue' - | 'lightyellow' - | 'lime' - | 'limegreen' - | 'linen' - | 'magenta' - | 'maroon' - | 'mediumaquamarine' - | 'mediumblue' - | 'mediumorchid' - | 'mediumpurple' - | 'mediumseagreen' - | 'mediumslateblue' - | 'mediumspringgreen' - | 'mediumturquoise' - | 'mediumvioletred' - | 'midnightblue' - | 'mintcream' - | 'mistyrose' - | 'moccasin' - | 'navajowhite' - | 'navy' - | 'oldlace' - | 'olive' - | 'olivedrab' - | 'orange' - | 'orangered' - | 'orchid' - | 'palegoldenrod' - | 'palegreen' - | 'paleturquoise' - | 'palevioletred' - | 'papayawhip' - | 'peachpuff' - | 'peru' - | 'pink' - | 'plum' - | 'powderblue' - | 'purple' - | 'rebeccapurple' - | 'red' - | 'rosybrown' - | 'royalblue' - | 'saddlebrown' - | 'salmon' - | 'sandybrown' - | 'seagreen' - | 'seashell' - | 'sienna' - | 'silver' - | 'skyblue' - | 'slateblue' - | 'slategray' - | 'slategrey' - | 'snow' - | 'springgreen' - | 'steelblue' - | 'tan' - | 'teal' - | 'thistle' - | 'tomato' - | 'turquoise' - | 'violet' - | 'wheat' - | 'white' - | 'whitesmoke' - | 'yellow' - | 'yellowgreen'; - -declare namespace ansiStyles { - interface ColorConvert { - /** - The RGB color space. - - @param red - (`0`-`255`) - @param green - (`0`-`255`) - @param blue - (`0`-`255`) - */ - rgb(red: number, green: number, blue: number): string; - - /** - The RGB HEX color space. - - @param hex - A hexadecimal string containing RGB data. - */ - hex(hex: string): string; - - /** - @param keyword - A CSS color name. - */ - keyword(keyword: CSSColor): string; - - /** - The HSL color space. - - @param hue - (`0`-`360`) - @param saturation - (`0`-`100`) - @param lightness - (`0`-`100`) - */ - hsl(hue: number, saturation: number, lightness: number): string; - - /** - The HSV color space. - - @param hue - (`0`-`360`) - @param saturation - (`0`-`100`) - @param value - (`0`-`100`) - */ - hsv(hue: number, saturation: number, value: number): string; - - /** - The HSV color space. - - @param hue - (`0`-`360`) - @param whiteness - (`0`-`100`) - @param blackness - (`0`-`100`) - */ - hwb(hue: number, whiteness: number, blackness: number): string; - - /** - Use a [4-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4-bit) to set text color. - */ - ansi(ansi: number): string; - - /** - Use an [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set text color. - */ - ansi256(ansi: number): string; - } - - interface CSPair { - /** - The ANSI terminal control sequence for starting this style. - */ - readonly open: string; - - /** - The ANSI terminal control sequence for ending this style. - */ - readonly close: string; - } - - interface ColorBase { - readonly ansi: ColorConvert; - readonly ansi256: ColorConvert; - readonly ansi16m: ColorConvert; - - /** - The ANSI terminal control sequence for ending this color. - */ - readonly close: string; - } - - interface Modifier { - /** - Resets the current color chain. - */ - readonly reset: CSPair; - - /** - Make text bold. - */ - readonly bold: CSPair; - - /** - Emitting only a small amount of light. - */ - readonly dim: CSPair; - - /** - Make text italic. (Not widely supported) - */ - readonly italic: CSPair; - - /** - Make text underline. (Not widely supported) - */ - readonly underline: CSPair; - - /** - Inverse background and foreground colors. - */ - readonly inverse: CSPair; - - /** - Prints the text, but makes it invisible. - */ - readonly hidden: CSPair; - - /** - Puts a horizontal line through the center of the text. (Not widely supported) - */ - readonly strikethrough: CSPair; - } - - interface ForegroundColor { - readonly black: CSPair; - readonly red: CSPair; - readonly green: CSPair; - readonly yellow: CSPair; - readonly blue: CSPair; - readonly cyan: CSPair; - readonly magenta: CSPair; - readonly white: CSPair; - - /** - Alias for `blackBright`. - */ - readonly gray: CSPair; - - /** - Alias for `blackBright`. - */ - readonly grey: CSPair; - - readonly blackBright: CSPair; - readonly redBright: CSPair; - readonly greenBright: CSPair; - readonly yellowBright: CSPair; - readonly blueBright: CSPair; - readonly cyanBright: CSPair; - readonly magentaBright: CSPair; - readonly whiteBright: CSPair; - } - - interface BackgroundColor { - readonly bgBlack: CSPair; - readonly bgRed: CSPair; - readonly bgGreen: CSPair; - readonly bgYellow: CSPair; - readonly bgBlue: CSPair; - readonly bgCyan: CSPair; - readonly bgMagenta: CSPair; - readonly bgWhite: CSPair; - - /** - Alias for `bgBlackBright`. - */ - readonly bgGray: CSPair; - - /** - Alias for `bgBlackBright`. - */ - readonly bgGrey: CSPair; - - readonly bgBlackBright: CSPair; - readonly bgRedBright: CSPair; - readonly bgGreenBright: CSPair; - readonly bgYellowBright: CSPair; - readonly bgBlueBright: CSPair; - readonly bgCyanBright: CSPair; - readonly bgMagentaBright: CSPair; - readonly bgWhiteBright: CSPair; - } -} - -declare const ansiStyles: { - readonly modifier: ansiStyles.Modifier; - readonly color: ansiStyles.ForegroundColor & ansiStyles.ColorBase; - readonly bgColor: ansiStyles.BackgroundColor & ansiStyles.ColorBase; - readonly codes: ReadonlyMap; -} & ansiStyles.BackgroundColor & ansiStyles.ForegroundColor & ansiStyles.Modifier; - -export = ansiStyles; diff --git a/node_modules/ansi-styles/index.js b/node_modules/ansi-styles/index.js deleted file mode 100644 index 5d82581..0000000 --- a/node_modules/ansi-styles/index.js +++ /dev/null @@ -1,163 +0,0 @@ -'use strict'; - -const wrapAnsi16 = (fn, offset) => (...args) => { - const code = fn(...args); - return `\u001B[${code + offset}m`; -}; - -const wrapAnsi256 = (fn, offset) => (...args) => { - const code = fn(...args); - return `\u001B[${38 + offset};5;${code}m`; -}; - -const wrapAnsi16m = (fn, offset) => (...args) => { - const rgb = fn(...args); - return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; -}; - -const ansi2ansi = n => n; -const rgb2rgb = (r, g, b) => [r, g, b]; - -const setLazyProperty = (object, property, get) => { - Object.defineProperty(object, property, { - get: () => { - const value = get(); - - Object.defineProperty(object, property, { - value, - enumerable: true, - configurable: true - }); - - return value; - }, - enumerable: true, - configurable: true - }); -}; - -/** @type {typeof import('color-convert')} */ -let colorConvert; -const makeDynamicStyles = (wrap, targetSpace, identity, isBackground) => { - if (colorConvert === undefined) { - colorConvert = require('color-convert'); - } - - const offset = isBackground ? 10 : 0; - const styles = {}; - - for (const [sourceSpace, suite] of Object.entries(colorConvert)) { - const name = sourceSpace === 'ansi16' ? 'ansi' : sourceSpace; - if (sourceSpace === targetSpace) { - styles[name] = wrap(identity, offset); - } else if (typeof suite === 'object') { - styles[name] = wrap(suite[targetSpace], offset); - } - } - - return styles; -}; - -function assembleStyles() { - const codes = new Map(); - const styles = { - modifier: { - reset: [0, 0], - // 21 isn't widely supported and 22 does the same thing - bold: [1, 22], - dim: [2, 22], - italic: [3, 23], - underline: [4, 24], - inverse: [7, 27], - hidden: [8, 28], - strikethrough: [9, 29] - }, - color: { - black: [30, 39], - red: [31, 39], - green: [32, 39], - yellow: [33, 39], - blue: [34, 39], - magenta: [35, 39], - cyan: [36, 39], - white: [37, 39], - - // Bright color - blackBright: [90, 39], - redBright: [91, 39], - greenBright: [92, 39], - yellowBright: [93, 39], - blueBright: [94, 39], - magentaBright: [95, 39], - cyanBright: [96, 39], - whiteBright: [97, 39] - }, - bgColor: { - bgBlack: [40, 49], - bgRed: [41, 49], - bgGreen: [42, 49], - bgYellow: [43, 49], - bgBlue: [44, 49], - bgMagenta: [45, 49], - bgCyan: [46, 49], - bgWhite: [47, 49], - - // Bright color - bgBlackBright: [100, 49], - bgRedBright: [101, 49], - bgGreenBright: [102, 49], - bgYellowBright: [103, 49], - bgBlueBright: [104, 49], - bgMagentaBright: [105, 49], - bgCyanBright: [106, 49], - bgWhiteBright: [107, 49] - } - }; - - // Alias bright black as gray (and grey) - styles.color.gray = styles.color.blackBright; - styles.bgColor.bgGray = styles.bgColor.bgBlackBright; - styles.color.grey = styles.color.blackBright; - styles.bgColor.bgGrey = styles.bgColor.bgBlackBright; - - for (const [groupName, group] of Object.entries(styles)) { - for (const [styleName, style] of Object.entries(group)) { - styles[styleName] = { - open: `\u001B[${style[0]}m`, - close: `\u001B[${style[1]}m` - }; - - group[styleName] = styles[styleName]; - - codes.set(style[0], style[1]); - } - - Object.defineProperty(styles, groupName, { - value: group, - enumerable: false - }); - } - - Object.defineProperty(styles, 'codes', { - value: codes, - enumerable: false - }); - - styles.color.close = '\u001B[39m'; - styles.bgColor.close = '\u001B[49m'; - - setLazyProperty(styles.color, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, false)); - setLazyProperty(styles.color, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, false)); - setLazyProperty(styles.color, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, false)); - setLazyProperty(styles.bgColor, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, true)); - setLazyProperty(styles.bgColor, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, true)); - setLazyProperty(styles.bgColor, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, true)); - - return styles; -} - -// Make the export immutable -Object.defineProperty(module, 'exports', { - enumerable: true, - get: assembleStyles -}); diff --git a/node_modules/ansi-styles/license b/node_modules/ansi-styles/license deleted file mode 100644 index e7af2f7..0000000 --- a/node_modules/ansi-styles/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/ansi-styles/package.json b/node_modules/ansi-styles/package.json deleted file mode 100644 index 7539328..0000000 --- a/node_modules/ansi-styles/package.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "name": "ansi-styles", - "version": "4.3.0", - "description": "ANSI escape codes for styling strings in the terminal", - "license": "MIT", - "repository": "chalk/ansi-styles", - "funding": "https://github.com/chalk/ansi-styles?sponsor=1", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=8" - }, - "scripts": { - "test": "xo && ava && tsd", - "screenshot": "svg-term --command='node screenshot' --out=screenshot.svg --padding=3 --width=55 --height=3 --at=1000 --no-cursor" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "ansi", - "styles", - "color", - "colour", - "colors", - "terminal", - "console", - "cli", - "string", - "tty", - "escape", - "formatting", - "rgb", - "256", - "shell", - "xterm", - "log", - "logging", - "command-line", - "text" - ], - "dependencies": { - "color-convert": "^2.0.1" - }, - "devDependencies": { - "@types/color-convert": "^1.9.0", - "ava": "^2.3.0", - "svg-term-cli": "^2.1.1", - "tsd": "^0.11.0", - "xo": "^0.25.3" - } -} diff --git a/node_modules/ansi-styles/readme.md b/node_modules/ansi-styles/readme.md deleted file mode 100644 index 24883de..0000000 --- a/node_modules/ansi-styles/readme.md +++ /dev/null @@ -1,152 +0,0 @@ -# ansi-styles [![Build Status](https://travis-ci.org/chalk/ansi-styles.svg?branch=master)](https://travis-ci.org/chalk/ansi-styles) - -> [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for styling strings in the terminal - -You probably want the higher-level [chalk](https://github.com/chalk/chalk) module for styling your strings. - - - -## Install - -``` -$ npm install ansi-styles -``` - -## Usage - -```js -const style = require('ansi-styles'); - -console.log(`${style.green.open}Hello world!${style.green.close}`); - - -// Color conversion between 16/256/truecolor -// NOTE: If conversion goes to 16 colors or 256 colors, the original color -// may be degraded to fit that color palette. This means terminals -// that do not support 16 million colors will best-match the -// original color. -console.log(style.bgColor.ansi.hsl(120, 80, 72) + 'Hello world!' + style.bgColor.close); -console.log(style.color.ansi256.rgb(199, 20, 250) + 'Hello world!' + style.color.close); -console.log(style.color.ansi16m.hex('#abcdef') + 'Hello world!' + style.color.close); -``` - -## API - -Each style has an `open` and `close` property. - -## Styles - -### Modifiers - -- `reset` -- `bold` -- `dim` -- `italic` *(Not widely supported)* -- `underline` -- `inverse` -- `hidden` -- `strikethrough` *(Not widely supported)* - -### Colors - -- `black` -- `red` -- `green` -- `yellow` -- `blue` -- `magenta` -- `cyan` -- `white` -- `blackBright` (alias: `gray`, `grey`) -- `redBright` -- `greenBright` -- `yellowBright` -- `blueBright` -- `magentaBright` -- `cyanBright` -- `whiteBright` - -### Background colors - -- `bgBlack` -- `bgRed` -- `bgGreen` -- `bgYellow` -- `bgBlue` -- `bgMagenta` -- `bgCyan` -- `bgWhite` -- `bgBlackBright` (alias: `bgGray`, `bgGrey`) -- `bgRedBright` -- `bgGreenBright` -- `bgYellowBright` -- `bgBlueBright` -- `bgMagentaBright` -- `bgCyanBright` -- `bgWhiteBright` - -## Advanced usage - -By default, you get a map of styles, but the styles are also available as groups. They are non-enumerable so they don't show up unless you access them explicitly. This makes it easier to expose only a subset in a higher-level module. - -- `style.modifier` -- `style.color` -- `style.bgColor` - -###### Example - -```js -console.log(style.color.green.open); -``` - -Raw escape codes (i.e. without the CSI escape prefix `\u001B[` and render mode postfix `m`) are available under `style.codes`, which returns a `Map` with the open codes as keys and close codes as values. - -###### Example - -```js -console.log(style.codes.get(36)); -//=> 39 -``` - -## [256 / 16 million (TrueColor) support](https://gist.github.com/XVilka/8346728) - -`ansi-styles` uses the [`color-convert`](https://github.com/Qix-/color-convert) package to allow for converting between various colors and ANSI escapes, with support for 256 and 16 million colors. - -The following color spaces from `color-convert` are supported: - -- `rgb` -- `hex` -- `keyword` -- `hsl` -- `hsv` -- `hwb` -- `ansi` -- `ansi256` - -To use these, call the associated conversion function with the intended output, for example: - -```js -style.color.ansi.rgb(100, 200, 15); // RGB to 16 color ansi foreground code -style.bgColor.ansi.rgb(100, 200, 15); // RGB to 16 color ansi background code - -style.color.ansi256.hsl(120, 100, 60); // HSL to 256 color ansi foreground code -style.bgColor.ansi256.hsl(120, 100, 60); // HSL to 256 color ansi foreground code - -style.color.ansi16m.hex('#C0FFEE'); // Hex (RGB) to 16 million color foreground code -style.bgColor.ansi16m.hex('#C0FFEE'); // Hex (RGB) to 16 million color background code -``` - -## Related - -- [ansi-escapes](https://github.com/sindresorhus/ansi-escapes) - ANSI escape codes for manipulating the terminal - -## Maintainers - -- [Sindre Sorhus](https://github.com/sindresorhus) -- [Josh Junon](https://github.com/qix-) - -## For enterprise - -Available as part of the Tidelift Subscription. - -The maintainers of `ansi-styles` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-ansi-styles?utm_source=npm-ansi-styles&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) diff --git a/node_modules/any-promise/.jshintrc b/node_modules/any-promise/.jshintrc deleted file mode 100644 index 979105e..0000000 --- a/node_modules/any-promise/.jshintrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "node":true, - "strict":true -} diff --git a/node_modules/any-promise/.npmignore b/node_modules/any-promise/.npmignore deleted file mode 100644 index 1354abc..0000000 --- a/node_modules/any-promise/.npmignore +++ /dev/null @@ -1,7 +0,0 @@ -.git* -test/ -test-browser/ -build/ -.travis.yml -*.swp -Makefile diff --git a/node_modules/any-promise/LICENSE b/node_modules/any-promise/LICENSE deleted file mode 100644 index 9187fe5..0000000 --- a/node_modules/any-promise/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (C) 2014-2016 Kevin Beaty - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/node_modules/any-promise/README.md b/node_modules/any-promise/README.md deleted file mode 100644 index 174bea4..0000000 --- a/node_modules/any-promise/README.md +++ /dev/null @@ -1,161 +0,0 @@ -## Any Promise - -[![Build Status](https://secure.travis-ci.org/kevinbeaty/any-promise.svg)](http://travis-ci.org/kevinbeaty/any-promise) - -Let your library support any ES 2015 (ES6) compatible `Promise` and leave the choice to application authors. The application can *optionally* register its preferred `Promise` implementation and it will be exported when requiring `any-promise` from library code. - -If no preference is registered, defaults to the global `Promise` for newer Node.js versions. The browser version defaults to the window `Promise`, so polyfill or register as necessary. - -### Usage with global Promise: - -Assuming the global `Promise` is the desired implementation: - -```bash -# Install any libraries depending on any-promise -$ npm install mz -``` - -The installed libraries will use global Promise by default. - -```js -// in library -var Promise = require('any-promise') // the global Promise - -function promiseReturningFunction(){ - return new Promise(function(resolve, reject){...}) -} -``` - -### Usage with registration: - -Assuming `bluebird` is the desired Promise implementation: - -```bash -# Install preferred promise library -$ npm install bluebird -# Install any-promise to allow registration -$ npm install any-promise -# Install any libraries you would like to use depending on any-promise -$ npm install mz -``` - -Register your preference in the application entry point before any other `require` of packages that load `any-promise`: - -```javascript -// top of application index.js or other entry point -require('any-promise/register/bluebird') - -// -or- Equivalent to above, but allows customization of Promise library -require('any-promise/register')('bluebird', {Promise: require('bluebird')}) -``` - -Now that the implementation is registered, you can use any package depending on `any-promise`: - - -```javascript -var fsp = require('mz/fs') // mz/fs will use registered bluebird promises -var Promise = require('any-promise') // the registered bluebird promise -``` - -It is safe to call `register` multiple times, but it must always be with the same implementation. - -Again, registration is *optional*. It should only be called by the application user if overriding the global `Promise` implementation is desired. - -### Optional Application Registration - -As an application author, you can *optionally* register a preferred `Promise` implementation on application startup (before any call to `require('any-promise')`: - -You must register your preference before any call to `require('any-promise')` (by you or required packages), and only one implementation can be registered. Typically, this registration would occur at the top of the application entry point. - - -#### Registration shortcuts - -If you are using a known `Promise` implementation, you can register your preference with a shortcut: - - -```js -require('any-promise/register/bluebird') -// -or- -import 'any-promise/register/q'; -``` - -Shortcut registration is the preferred registration method as it works in the browser and Node.js. It is also convenient for using with `import` and many test runners, that offer a `--require` flag: - -``` -$ ava --require=any-promise/register/bluebird test.js -``` - -Current known implementations include `bluebird`, `q`, `when`, `rsvp`, `es6-promise`, `promise`, `native-promise-only`, `pinkie`, `vow` and `lie`. If you are not using a known implementation, you can use another registration method described below. - - -#### Basic Registration - -As an alternative to registration shortcuts, you can call the `register` function with the preferred `Promise` implementation. The benefit of this approach is that a `Promise` library can be required by name without being a known implementation. This approach does NOT work in the browser. To use `any-promise` in the browser use either registration shortcuts or specify the `Promise` constructor using advanced registration (see below). - -```javascript -require('any-promise/register')('when') -// -or- require('any-promise/register')('any other ES6 compatible library (known or otherwise)') -``` - -This registration method will try to detect the `Promise` constructor from requiring the specified implementation. If you would like to specify your own constructor, see advanced registration. - - -#### Advanced Registration - -To use the browser version, you should either install a polyfill or explicitly register the `Promise` constructor: - -```javascript -require('any-promise/register')('bluebird', {Promise: require('bluebird')}) -``` - -This could also be used for registering a custom `Promise` implementation or subclass. - -Your preference will be registered globally, allowing a single registration even if multiple versions of `any-promise` are installed in the NPM dependency tree or are using multiple bundled JavaScript files in the browser. You can bypass this global registration in options: - - -```javascript -require('../register')('es6-promise', {Promise: require('es6-promise').Promise, global: false}) -``` - -### Library Usage - -To use any `Promise` constructor, simply require it: - -```javascript -var Promise = require('any-promise'); - -return Promise - .all([xf, f, init, coll]) - .then(fn); - - -return new Promise(function(resolve, reject){ - try { - resolve(item); - } catch(e){ - reject(e); - } -}); - -``` - -Except noted below, libraries using `any-promise` should only use [documented](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) functions as there is no guarantee which implementation will be chosen by the application author. Libraries should never call `register`, only the application user should call if desired. - - -#### Advanced Library Usage - -If your library needs to branch code based on the registered implementation, you can retrieve it using `var impl = require('any-promise/implementation')`, where `impl` will be the package name (`"bluebird"`, `"when"`, etc.) if registered, `"global.Promise"` if using the global version on Node.js, or `"window.Promise"` if using the browser version. You should always include a default case, as there is no guarantee what package may be registered. - - -### Support for old Node.js versions - -Node.js versions prior to `v0.12` may have contained buggy versions of the global `Promise`. For this reason, the global `Promise` is not loaded automatically for these old versions. If using `any-promise` in Node.js versions versions `<= v0.12`, the user should register a desired implementation. - -If an implementation is not registered, `any-promise` will attempt to discover an installed `Promise` implementation. If no implementation can be found, an error will be thrown on `require('any-promise')`. While the auto-discovery usually avoids errors, it is non-deterministic. It is recommended that the user always register a preferred implementation for older Node.js versions. - -This auto-discovery is only available for Node.jS versions prior to `v0.12`. Any newer versions will always default to the global `Promise` implementation. - -### Related - -- [any-observable](https://github.com/sindresorhus/any-observable) - `any-promise` for Observables. - diff --git a/node_modules/any-promise/implementation.d.ts b/node_modules/any-promise/implementation.d.ts deleted file mode 100644 index c331a56..0000000 --- a/node_modules/any-promise/implementation.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -declare var implementation: string; - -export = implementation; diff --git a/node_modules/any-promise/implementation.js b/node_modules/any-promise/implementation.js deleted file mode 100644 index a45ae94..0000000 --- a/node_modules/any-promise/implementation.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./register')().implementation diff --git a/node_modules/any-promise/index.d.ts b/node_modules/any-promise/index.d.ts deleted file mode 100644 index 9f646c5..0000000 --- a/node_modules/any-promise/index.d.ts +++ /dev/null @@ -1,73 +0,0 @@ -declare class Promise implements Promise.Thenable { - /** - * If you call resolve in the body of the callback passed to the constructor, - * your promise is fulfilled with result object passed to resolve. - * If you call reject your promise is rejected with the object passed to resolve. - * For consistency and debugging (eg stack traces), obj should be an instanceof Error. - * Any errors thrown in the constructor callback will be implicitly passed to reject(). - */ - constructor (callback: (resolve : (value?: R | Promise.Thenable) => void, reject: (error?: any) => void) => void); - - /** - * onFulfilled is called when/if "promise" resolves. onRejected is called when/if "promise" rejects. - * Both are optional, if either/both are omitted the next onFulfilled/onRejected in the chain is called. - * Both callbacks have a single parameter , the fulfillment value or rejection reason. - * "then" returns a new promise equivalent to the value you return from onFulfilled/onRejected after being passed through Promise.resolve. - * If an error is thrown in the callback, the returned promise rejects with that error. - * - * @param onFulfilled called when/if "promise" resolves - * @param onRejected called when/if "promise" rejects - */ - then (onFulfilled?: (value: R) => U | Promise.Thenable, onRejected?: (error: any) => U | Promise.Thenable): Promise; - then (onFulfilled?: (value: R) => U | Promise.Thenable, onRejected?: (error: any) => void): Promise; - - /** - * Sugar for promise.then(undefined, onRejected) - * - * @param onRejected called when/if "promise" rejects - */ - catch (onRejected?: (error: any) => U | Promise.Thenable): Promise; - - /** - * Make a new promise from the thenable. - * A thenable is promise-like in as far as it has a "then" method. - */ - static resolve (): Promise; - static resolve (value: R | Promise.Thenable): Promise; - - /** - * Make a promise that rejects to obj. For consistency and debugging (eg stack traces), obj should be an instanceof Error - */ - static reject (error: any): Promise; - - /** - * Make a promise that fulfills when every item in the array fulfills, and rejects if (and when) any item rejects. - * the array passed to all can be a mixture of promise-like objects and other objects. - * The fulfillment value is an array (in order) of fulfillment values. The rejection value is the first rejection value. - */ - static all (values: [T1 | Promise.Thenable, T2 | Promise.Thenable, T3 | Promise.Thenable, T4 | Promise.Thenable , T5 | Promise.Thenable, T6 | Promise.Thenable, T7 | Promise.Thenable, T8 | Promise.Thenable, T9 | Promise.Thenable, T10 | Promise.Thenable]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]>; - static all (values: [T1 | Promise.Thenable, T2 | Promise.Thenable, T3 | Promise.Thenable, T4 | Promise.Thenable , T5 | Promise.Thenable, T6 | Promise.Thenable, T7 | Promise.Thenable, T8 | Promise.Thenable, T9 | Promise.Thenable]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8, T9]>; - static all (values: [T1 | Promise.Thenable, T2 | Promise.Thenable, T3 | Promise.Thenable, T4 | Promise.Thenable , T5 | Promise.Thenable, T6 | Promise.Thenable, T7 | Promise.Thenable, T8 | Promise.Thenable]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8]>; - static all (values: [T1 | Promise.Thenable, T2 | Promise.Thenable, T3 | Promise.Thenable, T4 | Promise.Thenable , T5 | Promise.Thenable, T6 | Promise.Thenable, T7 | Promise.Thenable]): Promise<[T1, T2, T3, T4, T5, T6, T7]>; - static all (values: [T1 | Promise.Thenable, T2 | Promise.Thenable, T3 | Promise.Thenable, T4 | Promise.Thenable , T5 | Promise.Thenable, T6 | Promise.Thenable]): Promise<[T1, T2, T3, T4, T5, T6]>; - static all (values: [T1 | Promise.Thenable, T2 | Promise.Thenable, T3 | Promise.Thenable, T4 | Promise.Thenable , T5 | Promise.Thenable]): Promise<[T1, T2, T3, T4, T5]>; - static all (values: [T1 | Promise.Thenable, T2 | Promise.Thenable, T3 | Promise.Thenable, T4 | Promise.Thenable ]): Promise<[T1, T2, T3, T4]>; - static all (values: [T1 | Promise.Thenable, T2 | Promise.Thenable, T3 | Promise.Thenable]): Promise<[T1, T2, T3]>; - static all (values: [T1 | Promise.Thenable, T2 | Promise.Thenable]): Promise<[T1, T2]>; - static all (values: [T1 | Promise.Thenable]): Promise<[T1]>; - static all (values: Array>): Promise; - - /** - * Make a Promise that fulfills when any item fulfills, and rejects if any item rejects. - */ - static race (promises: (R | Promise.Thenable)[]): Promise; -} - -declare namespace Promise { - export interface Thenable { - then (onFulfilled?: (value: R) => U | Thenable, onRejected?: (error: any) => U | Thenable): Thenable; - then (onFulfilled?: (value: R) => U | Thenable, onRejected?: (error: any) => void): Thenable; - } -} - -export = Promise; diff --git a/node_modules/any-promise/index.js b/node_modules/any-promise/index.js deleted file mode 100644 index 74b8548..0000000 --- a/node_modules/any-promise/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./register')().Promise diff --git a/node_modules/any-promise/loader.js b/node_modules/any-promise/loader.js deleted file mode 100644 index e164914..0000000 --- a/node_modules/any-promise/loader.js +++ /dev/null @@ -1,78 +0,0 @@ -"use strict" - // global key for user preferred registration -var REGISTRATION_KEY = '@@any-promise/REGISTRATION', - // Prior registration (preferred or detected) - registered = null - -/** - * Registers the given implementation. An implementation must - * be registered prior to any call to `require("any-promise")`, - * typically on application load. - * - * If called with no arguments, will return registration in - * following priority: - * - * For Node.js: - * - * 1. Previous registration - * 2. global.Promise if node.js version >= 0.12 - * 3. Auto detected promise based on first sucessful require of - * known promise libraries. Note this is a last resort, as the - * loaded library is non-deterministic. node.js >= 0.12 will - * always use global.Promise over this priority list. - * 4. Throws error. - * - * For Browser: - * - * 1. Previous registration - * 2. window.Promise - * 3. Throws error. - * - * Options: - * - * Promise: Desired Promise constructor - * global: Boolean - Should the registration be cached in a global variable to - * allow cross dependency/bundle registration? (default true) - */ -module.exports = function(root, loadImplementation){ - return function register(implementation, opts){ - implementation = implementation || null - opts = opts || {} - // global registration unless explicitly {global: false} in options (default true) - var registerGlobal = opts.global !== false; - - // load any previous global registration - if(registered === null && registerGlobal){ - registered = root[REGISTRATION_KEY] || null - } - - if(registered !== null - && implementation !== null - && registered.implementation !== implementation){ - // Throw error if attempting to redefine implementation - throw new Error('any-promise already defined as "'+registered.implementation+ - '". You can only register an implementation before the first '+ - ' call to require("any-promise") and an implementation cannot be changed') - } - - if(registered === null){ - // use provided implementation - if(implementation !== null && typeof opts.Promise !== 'undefined'){ - registered = { - Promise: opts.Promise, - implementation: implementation - } - } else { - // require implementation if implementation is specified but not provided - registered = loadImplementation(implementation) - } - - if(registerGlobal){ - // register preference globally in case multiple installations - root[REGISTRATION_KEY] = registered - } - } - - return registered - } -} diff --git a/node_modules/any-promise/optional.js b/node_modules/any-promise/optional.js deleted file mode 100644 index f388942..0000000 --- a/node_modules/any-promise/optional.js +++ /dev/null @@ -1,6 +0,0 @@ -"use strict"; -try { - module.exports = require('./register')().Promise || null -} catch(e) { - module.exports = null -} diff --git a/node_modules/any-promise/package.json b/node_modules/any-promise/package.json deleted file mode 100644 index 5baf14c..0000000 --- a/node_modules/any-promise/package.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "any-promise", - "version": "1.3.0", - "description": "Resolve any installed ES6 compatible promise", - "main": "index.js", - "typings": "index.d.ts", - "browser": { - "./register.js": "./register-shim.js" - }, - "scripts": { - "test": "ava" - }, - "repository": { - "type": "git", - "url": "https://github.com/kevinbeaty/any-promise" - }, - "keywords": [ - "promise", - "es6" - ], - "author": "Kevin Beaty", - "license": "MIT", - "bugs": { - "url": "https://github.com/kevinbeaty/any-promise/issues" - }, - "homepage": "http://github.com/kevinbeaty/any-promise", - "dependencies": {}, - "devDependencies": { - "ava": "^0.14.0", - "bluebird": "^3.0.0", - "es6-promise": "^3.0.0", - "is-promise": "^2.0.0", - "lie": "^3.0.0", - "mocha": "^2.0.0", - "native-promise-only": "^0.8.0", - "phantomjs-prebuilt": "^2.0.0", - "pinkie": "^2.0.0", - "promise": "^7.0.0", - "q": "^1.0.0", - "rsvp": "^3.0.0", - "vow": "^0.4.0", - "when": "^3.0.0", - "zuul": "^3.0.0" - } -} diff --git a/node_modules/any-promise/register-shim.js b/node_modules/any-promise/register-shim.js deleted file mode 100644 index 9049405..0000000 --- a/node_modules/any-promise/register-shim.js +++ /dev/null @@ -1,18 +0,0 @@ -"use strict"; -module.exports = require('./loader')(window, loadImplementation) - -/** - * Browser specific loadImplementation. Always uses `window.Promise` - * - * To register a custom implementation, must register with `Promise` option. - */ -function loadImplementation(){ - if(typeof window.Promise === 'undefined'){ - throw new Error("any-promise browser requires a polyfill or explicit registration"+ - " e.g: require('any-promise/register/bluebird')") - } - return { - Promise: window.Promise, - implementation: 'window.Promise' - } -} diff --git a/node_modules/any-promise/register.d.ts b/node_modules/any-promise/register.d.ts deleted file mode 100644 index 97f2fc0..0000000 --- a/node_modules/any-promise/register.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -import Promise = require('./index'); - -declare function register (module?: string, options?: register.Options): register.Register; - -declare namespace register { - export interface Register { - Promise: typeof Promise; - implementation: string; - } - - export interface Options { - Promise?: typeof Promise; - global?: boolean - } -} - -export = register; diff --git a/node_modules/any-promise/register.js b/node_modules/any-promise/register.js deleted file mode 100644 index 255c6e2..0000000 --- a/node_modules/any-promise/register.js +++ /dev/null @@ -1,94 +0,0 @@ -"use strict" -module.exports = require('./loader')(global, loadImplementation); - -/** - * Node.js version of loadImplementation. - * - * Requires the given implementation and returns the registration - * containing {Promise, implementation} - * - * If implementation is undefined or global.Promise, loads it - * Otherwise uses require - */ -function loadImplementation(implementation){ - var impl = null - - if(shouldPreferGlobalPromise(implementation)){ - // if no implementation or env specified use global.Promise - impl = { - Promise: global.Promise, - implementation: 'global.Promise' - } - } else if(implementation){ - // if implementation specified, require it - var lib = require(implementation) - impl = { - Promise: lib.Promise || lib, - implementation: implementation - } - } else { - // try to auto detect implementation. This is non-deterministic - // and should prefer other branches, but this is our last chance - // to load something without throwing error - impl = tryAutoDetect() - } - - if(impl === null){ - throw new Error('Cannot find any-promise implementation nor'+ - ' global.Promise. You must install polyfill or call'+ - ' require("any-promise/register") with your preferred'+ - ' implementation, e.g. require("any-promise/register/bluebird")'+ - ' on application load prior to any require("any-promise").') - } - - return impl -} - -/** - * Determines if the global.Promise should be preferred if an implementation - * has not been registered. - */ -function shouldPreferGlobalPromise(implementation){ - if(implementation){ - return implementation === 'global.Promise' - } else if(typeof global.Promise !== 'undefined'){ - // Load global promise if implementation not specified - // Versions < 0.11 did not have global Promise - // Do not use for version < 0.12 as version 0.11 contained buggy versions - var version = (/v(\d+)\.(\d+)\.(\d+)/).exec(process.version) - return !(version && +version[1] == 0 && +version[2] < 12) - } - - // do not have global.Promise or another implementation was specified - return false -} - -/** - * Look for common libs as last resort there is no guarantee that - * this will return a desired implementation or even be deterministic. - * The priority is also nearly arbitrary. We are only doing this - * for older versions of Node.js <0.12 that do not have a reasonable - * global.Promise implementation and we the user has not registered - * the preference. This preserves the behavior of any-promise <= 0.1 - * and may be deprecated or removed in the future - */ -function tryAutoDetect(){ - var libs = [ - "es6-promise", - "promise", - "native-promise-only", - "bluebird", - "rsvp", - "when", - "q", - "pinkie", - "lie", - "vow"] - var i = 0, len = libs.length - for(; i < len; i++){ - try { - return loadImplementation(libs[i]) - } catch(e){} - } - return null -} diff --git a/node_modules/any-promise/register/bluebird.d.ts b/node_modules/any-promise/register/bluebird.d.ts deleted file mode 100644 index 336ce12..0000000 --- a/node_modules/any-promise/register/bluebird.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {} diff --git a/node_modules/any-promise/register/bluebird.js b/node_modules/any-promise/register/bluebird.js deleted file mode 100644 index de0f87e..0000000 --- a/node_modules/any-promise/register/bluebird.js +++ /dev/null @@ -1,2 +0,0 @@ -'use strict'; -require('../register')('bluebird', {Promise: require('bluebird')}) diff --git a/node_modules/any-promise/register/es6-promise.d.ts b/node_modules/any-promise/register/es6-promise.d.ts deleted file mode 100644 index 336ce12..0000000 --- a/node_modules/any-promise/register/es6-promise.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {} diff --git a/node_modules/any-promise/register/es6-promise.js b/node_modules/any-promise/register/es6-promise.js deleted file mode 100644 index 59bd55b..0000000 --- a/node_modules/any-promise/register/es6-promise.js +++ /dev/null @@ -1,2 +0,0 @@ -'use strict'; -require('../register')('es6-promise', {Promise: require('es6-promise').Promise}) diff --git a/node_modules/any-promise/register/lie.d.ts b/node_modules/any-promise/register/lie.d.ts deleted file mode 100644 index 336ce12..0000000 --- a/node_modules/any-promise/register/lie.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {} diff --git a/node_modules/any-promise/register/lie.js b/node_modules/any-promise/register/lie.js deleted file mode 100644 index 7d305ca..0000000 --- a/node_modules/any-promise/register/lie.js +++ /dev/null @@ -1,2 +0,0 @@ -'use strict'; -require('../register')('lie', {Promise: require('lie')}) diff --git a/node_modules/any-promise/register/native-promise-only.d.ts b/node_modules/any-promise/register/native-promise-only.d.ts deleted file mode 100644 index 336ce12..0000000 --- a/node_modules/any-promise/register/native-promise-only.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {} diff --git a/node_modules/any-promise/register/native-promise-only.js b/node_modules/any-promise/register/native-promise-only.js deleted file mode 100644 index 70a5a5e..0000000 --- a/node_modules/any-promise/register/native-promise-only.js +++ /dev/null @@ -1,2 +0,0 @@ -'use strict'; -require('../register')('native-promise-only', {Promise: require('native-promise-only')}) diff --git a/node_modules/any-promise/register/pinkie.d.ts b/node_modules/any-promise/register/pinkie.d.ts deleted file mode 100644 index 336ce12..0000000 --- a/node_modules/any-promise/register/pinkie.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {} diff --git a/node_modules/any-promise/register/pinkie.js b/node_modules/any-promise/register/pinkie.js deleted file mode 100644 index caaf98a..0000000 --- a/node_modules/any-promise/register/pinkie.js +++ /dev/null @@ -1,2 +0,0 @@ -'use strict'; -require('../register')('pinkie', {Promise: require('pinkie')}) diff --git a/node_modules/any-promise/register/promise.d.ts b/node_modules/any-promise/register/promise.d.ts deleted file mode 100644 index 336ce12..0000000 --- a/node_modules/any-promise/register/promise.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {} diff --git a/node_modules/any-promise/register/promise.js b/node_modules/any-promise/register/promise.js deleted file mode 100644 index 746620d..0000000 --- a/node_modules/any-promise/register/promise.js +++ /dev/null @@ -1,2 +0,0 @@ -'use strict'; -require('../register')('promise', {Promise: require('promise')}) diff --git a/node_modules/any-promise/register/q.d.ts b/node_modules/any-promise/register/q.d.ts deleted file mode 100644 index 336ce12..0000000 --- a/node_modules/any-promise/register/q.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {} diff --git a/node_modules/any-promise/register/q.js b/node_modules/any-promise/register/q.js deleted file mode 100644 index 0fc633a..0000000 --- a/node_modules/any-promise/register/q.js +++ /dev/null @@ -1,2 +0,0 @@ -'use strict'; -require('../register')('q', {Promise: require('q').Promise}) diff --git a/node_modules/any-promise/register/rsvp.d.ts b/node_modules/any-promise/register/rsvp.d.ts deleted file mode 100644 index 336ce12..0000000 --- a/node_modules/any-promise/register/rsvp.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {} diff --git a/node_modules/any-promise/register/rsvp.js b/node_modules/any-promise/register/rsvp.js deleted file mode 100644 index 02b1318..0000000 --- a/node_modules/any-promise/register/rsvp.js +++ /dev/null @@ -1,2 +0,0 @@ -'use strict'; -require('../register')('rsvp', {Promise: require('rsvp').Promise}) diff --git a/node_modules/any-promise/register/vow.d.ts b/node_modules/any-promise/register/vow.d.ts deleted file mode 100644 index 336ce12..0000000 --- a/node_modules/any-promise/register/vow.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {} diff --git a/node_modules/any-promise/register/vow.js b/node_modules/any-promise/register/vow.js deleted file mode 100644 index 5b6868c..0000000 --- a/node_modules/any-promise/register/vow.js +++ /dev/null @@ -1,2 +0,0 @@ -'use strict'; -require('../register')('vow', {Promise: require('vow').Promise}) diff --git a/node_modules/any-promise/register/when.d.ts b/node_modules/any-promise/register/when.d.ts deleted file mode 100644 index 336ce12..0000000 --- a/node_modules/any-promise/register/when.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {} diff --git a/node_modules/any-promise/register/when.js b/node_modules/any-promise/register/when.js deleted file mode 100644 index d91c13d..0000000 --- a/node_modules/any-promise/register/when.js +++ /dev/null @@ -1,2 +0,0 @@ -'use strict'; -require('../register')('when', {Promise: require('when').Promise}) diff --git a/node_modules/anymatch/LICENSE b/node_modules/anymatch/LICENSE deleted file mode 100644 index 491766c..0000000 --- a/node_modules/anymatch/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) 2019 Elan Shanker, Paul Miller (https://paulmillr.com) - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/anymatch/README.md b/node_modules/anymatch/README.md deleted file mode 100644 index 1dd67f5..0000000 --- a/node_modules/anymatch/README.md +++ /dev/null @@ -1,87 +0,0 @@ -anymatch [![Build Status](https://travis-ci.org/micromatch/anymatch.svg?branch=master)](https://travis-ci.org/micromatch/anymatch) [![Coverage Status](https://img.shields.io/coveralls/micromatch/anymatch.svg?branch=master)](https://coveralls.io/r/micromatch/anymatch?branch=master) -====== -Javascript module to match a string against a regular expression, glob, string, -or function that takes the string as an argument and returns a truthy or falsy -value. The matcher can also be an array of any or all of these. Useful for -allowing a very flexible user-defined config to define things like file paths. - -__Note: This module has Bash-parity, please be aware that Windows-style backslashes are not supported as separators. See https://github.com/micromatch/micromatch#backslashes for more information.__ - - -Usage ------ -```sh -npm install anymatch -``` - -#### anymatch(matchers, testString, [returnIndex], [options]) -* __matchers__: (_Array|String|RegExp|Function_) -String to be directly matched, string with glob patterns, regular expression -test, function that takes the testString as an argument and returns a truthy -value if it should be matched, or an array of any number and mix of these types. -* __testString__: (_String|Array_) The string to test against the matchers. If -passed as an array, the first element of the array will be used as the -`testString` for non-function matchers, while the entire array will be applied -as the arguments for function matchers. -* __options__: (_Object_ [optional]_) Any of the [picomatch](https://github.com/micromatch/picomatch#options) options. - * __returnIndex__: (_Boolean [optional]_) If true, return the array index of -the first matcher that that testString matched, or -1 if no match, instead of a -boolean result. - -```js -const anymatch = require('anymatch'); - -const matchers = [ 'path/to/file.js', 'path/anyjs/**/*.js', /foo.js$/, string => string.includes('bar') && string.length > 10 ] ; - -anymatch(matchers, 'path/to/file.js'); // true -anymatch(matchers, 'path/anyjs/baz.js'); // true -anymatch(matchers, 'path/to/foo.js'); // true -anymatch(matchers, 'path/to/bar.js'); // true -anymatch(matchers, 'bar.js'); // false - -// returnIndex = true -anymatch(matchers, 'foo.js', {returnIndex: true}); // 2 -anymatch(matchers, 'path/anyjs/foo.js', {returnIndex: true}); // 1 - -// any picomatc - -// using globs to match directories and their children -anymatch('node_modules', 'node_modules'); // true -anymatch('node_modules', 'node_modules/somelib/index.js'); // false -anymatch('node_modules/**', 'node_modules/somelib/index.js'); // true -anymatch('node_modules/**', '/absolute/path/to/node_modules/somelib/index.js'); // false -anymatch('**/node_modules/**', '/absolute/path/to/node_modules/somelib/index.js'); // true - -const matcher = anymatch(matchers); -['foo.js', 'bar.js'].filter(matcher); // [ 'foo.js' ] -anymatch master* ❯ - -``` - -#### anymatch(matchers) -You can also pass in only your matcher(s) to get a curried function that has -already been bound to the provided matching criteria. This can be used as an -`Array#filter` callback. - -```js -var matcher = anymatch(matchers); - -matcher('path/to/file.js'); // true -matcher('path/anyjs/baz.js', true); // 1 - -['foo.js', 'bar.js'].filter(matcher); // ['foo.js'] -``` - -Changelog ----------- -[See release notes page on GitHub](https://github.com/micromatch/anymatch/releases) - -- **v3.0:** Removed `startIndex` and `endIndex` arguments. Node 8.x-only. -- **v2.0:** [micromatch](https://github.com/jonschlinkert/micromatch) moves away from minimatch-parity and inline with Bash. This includes handling backslashes differently (see https://github.com/micromatch/micromatch#backslashes for more information). -- **v1.2:** anymatch uses [micromatch](https://github.com/jonschlinkert/micromatch) -for glob pattern matching. Issues with glob pattern matching should be -reported directly to the [micromatch issue tracker](https://github.com/jonschlinkert/micromatch/issues). - -License -------- -[ISC](https://raw.github.com/micromatch/anymatch/master/LICENSE) diff --git a/node_modules/anymatch/index.d.ts b/node_modules/anymatch/index.d.ts deleted file mode 100644 index 3ef7eaa..0000000 --- a/node_modules/anymatch/index.d.ts +++ /dev/null @@ -1,20 +0,0 @@ -type AnymatchFn = (testString: string) => boolean; -type AnymatchPattern = string|RegExp|AnymatchFn; -type AnymatchMatcher = AnymatchPattern|AnymatchPattern[] -type AnymatchTester = { - (testString: string|any[], returnIndex: true): number; - (testString: string|any[]): boolean; -} - -type PicomatchOptions = {dot: boolean}; - -declare const anymatch: { - (matchers: AnymatchMatcher): AnymatchTester; - (matchers: AnymatchMatcher, testString: null, returnIndex: true | PicomatchOptions): AnymatchTester; - (matchers: AnymatchMatcher, testString: string|any[], returnIndex: true | PicomatchOptions): number; - (matchers: AnymatchMatcher, testString: string|any[]): boolean; -} - -export {AnymatchMatcher as Matcher} -export {AnymatchTester as Tester} -export default anymatch diff --git a/node_modules/anymatch/index.js b/node_modules/anymatch/index.js deleted file mode 100644 index 8eb73e9..0000000 --- a/node_modules/anymatch/index.js +++ /dev/null @@ -1,104 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { value: true }); - -const picomatch = require('picomatch'); -const normalizePath = require('normalize-path'); - -/** - * @typedef {(testString: string) => boolean} AnymatchFn - * @typedef {string|RegExp|AnymatchFn} AnymatchPattern - * @typedef {AnymatchPattern|AnymatchPattern[]} AnymatchMatcher - */ -const BANG = '!'; -const DEFAULT_OPTIONS = {returnIndex: false}; -const arrify = (item) => Array.isArray(item) ? item : [item]; - -/** - * @param {AnymatchPattern} matcher - * @param {object} options - * @returns {AnymatchFn} - */ -const createPattern = (matcher, options) => { - if (typeof matcher === 'function') { - return matcher; - } - if (typeof matcher === 'string') { - const glob = picomatch(matcher, options); - return (string) => matcher === string || glob(string); - } - if (matcher instanceof RegExp) { - return (string) => matcher.test(string); - } - return (string) => false; -}; - -/** - * @param {Array} patterns - * @param {Array} negPatterns - * @param {String|Array} args - * @param {Boolean} returnIndex - * @returns {boolean|number} - */ -const matchPatterns = (patterns, negPatterns, args, returnIndex) => { - const isList = Array.isArray(args); - const _path = isList ? args[0] : args; - if (!isList && typeof _path !== 'string') { - throw new TypeError('anymatch: second argument must be a string: got ' + - Object.prototype.toString.call(_path)) - } - const path = normalizePath(_path, false); - - for (let index = 0; index < negPatterns.length; index++) { - const nglob = negPatterns[index]; - if (nglob(path)) { - return returnIndex ? -1 : false; - } - } - - const applied = isList && [path].concat(args.slice(1)); - for (let index = 0; index < patterns.length; index++) { - const pattern = patterns[index]; - if (isList ? pattern(...applied) : pattern(path)) { - return returnIndex ? index : true; - } - } - - return returnIndex ? -1 : false; -}; - -/** - * @param {AnymatchMatcher} matchers - * @param {Array|string} testString - * @param {object} options - * @returns {boolean|number|Function} - */ -const anymatch = (matchers, testString, options = DEFAULT_OPTIONS) => { - if (matchers == null) { - throw new TypeError('anymatch: specify first argument'); - } - const opts = typeof options === 'boolean' ? {returnIndex: options} : options; - const returnIndex = opts.returnIndex || false; - - // Early cache for matchers. - const mtchers = arrify(matchers); - const negatedGlobs = mtchers - .filter(item => typeof item === 'string' && item.charAt(0) === BANG) - .map(item => item.slice(1)) - .map(item => picomatch(item, opts)); - const patterns = mtchers - .filter(item => typeof item !== 'string' || (typeof item === 'string' && item.charAt(0) !== BANG)) - .map(matcher => createPattern(matcher, opts)); - - if (testString == null) { - return (testString, ri = false) => { - const returnIndex = typeof ri === 'boolean' ? ri : false; - return matchPatterns(patterns, negatedGlobs, testString, returnIndex); - } - } - - return matchPatterns(patterns, negatedGlobs, testString, returnIndex); -}; - -anymatch.default = anymatch; -module.exports = anymatch; diff --git a/node_modules/anymatch/package.json b/node_modules/anymatch/package.json deleted file mode 100644 index 2cb2307..0000000 --- a/node_modules/anymatch/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "anymatch", - "version": "3.1.3", - "description": "Matches strings against configurable strings, globs, regular expressions, and/or functions", - "files": [ - "index.js", - "index.d.ts" - ], - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "author": { - "name": "Elan Shanker", - "url": "https://github.com/es128" - }, - "license": "ISC", - "homepage": "https://github.com/micromatch/anymatch", - "repository": { - "type": "git", - "url": "https://github.com/micromatch/anymatch" - }, - "keywords": [ - "match", - "any", - "string", - "file", - "fs", - "list", - "glob", - "regex", - "regexp", - "regular", - "expression", - "function" - ], - "scripts": { - "test": "nyc mocha", - "mocha": "mocha" - }, - "devDependencies": { - "mocha": "^6.1.3", - "nyc": "^14.0.0" - }, - "engines": { - "node": ">= 8" - } -} diff --git a/node_modules/arg/LICENSE.md b/node_modules/arg/LICENSE.md deleted file mode 100644 index b708f87..0000000 --- a/node_modules/arg/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2021 Vercel, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/node_modules/arg/README.md b/node_modules/arg/README.md deleted file mode 100644 index 6501df5..0000000 --- a/node_modules/arg/README.md +++ /dev/null @@ -1,317 +0,0 @@ -# Arg - -`arg` is an unopinionated, no-frills CLI argument parser. - -## Installation - -```bash -npm install arg -``` - -## Usage - -`arg()` takes either 1 or 2 arguments: - -1. Command line specification object (see below) -2. Parse options (_Optional_, defaults to `{permissive: false, argv: process.argv.slice(2), stopAtPositional: false}`) - -It returns an object with any values present on the command-line (missing options are thus -missing from the resulting object). Arg performs no validation/requirement checking - we -leave that up to the application. - -All parameters that aren't consumed by options (commonly referred to as "extra" parameters) -are added to `result._`, which is _always_ an array (even if no extra parameters are passed, -in which case an empty array is returned). - -```javascript -const arg = require('arg'); - -// `options` is an optional parameter -const args = arg( - spec, - (options = { permissive: false, argv: process.argv.slice(2) }) -); -``` - -For example: - -```console -$ node ./hello.js --verbose -vvv --port=1234 -n 'My name' foo bar --tag qux --tag=qix -- --foobar -``` - -```javascript -// hello.js -const arg = require('arg'); - -const args = arg({ - // Types - '--help': Boolean, - '--version': Boolean, - '--verbose': arg.COUNT, // Counts the number of times --verbose is passed - '--port': Number, // --port or --port= - '--name': String, // --name or --name= - '--tag': [String], // --tag or --tag= - - // Aliases - '-v': '--verbose', - '-n': '--name', // -n ; result is stored in --name - '--label': '--name' // --label or --label=; - // result is stored in --name -}); - -console.log(args); -/* -{ - _: ["foo", "bar", "--foobar"], - '--port': 1234, - '--verbose': 4, - '--name': "My name", - '--tag': ["qux", "qix"] -} -*/ -``` - -The values for each key=>value pair is either a type (function or [function]) or a string (indicating an alias). - -- In the case of a function, the string value of the argument's value is passed to it, - and the return value is used as the ultimate value. - -- In the case of an array, the only element _must_ be a type function. Array types indicate - that the argument may be passed multiple times, and as such the resulting value in the returned - object is an array with all of the values that were passed using the specified flag. - -- In the case of a string, an alias is established. If a flag is passed that matches the _key_, - then the _value_ is substituted in its place. - -Type functions are passed three arguments: - -1. The parameter value (always a string) -2. The parameter name (e.g. `--label`) -3. The previous value for the destination (useful for reduce-like operations or for supporting `-v` multiple times, etc.) - -This means the built-in `String`, `Number`, and `Boolean` type constructors "just work" as type functions. - -Note that `Boolean` and `[Boolean]` have special treatment - an option argument is _not_ consumed or passed, but instead `true` is -returned. These options are called "flags". - -For custom handlers that wish to behave as flags, you may pass the function through `arg.flag()`: - -```javascript -const arg = require('arg'); - -const argv = [ - '--foo', - 'bar', - '-ff', - 'baz', - '--foo', - '--foo', - 'qux', - '-fff', - 'qix' -]; - -function myHandler(value, argName, previousValue) { - /* `value` is always `true` */ - return 'na ' + (previousValue || 'batman!'); -} - -const args = arg( - { - '--foo': arg.flag(myHandler), - '-f': '--foo' - }, - { - argv - } -); - -console.log(args); -/* -{ - _: ['bar', 'baz', 'qux', 'qix'], - '--foo': 'na na na na na na na na batman!' -} -*/ -``` - -As well, `arg` supplies a helper argument handler called `arg.COUNT`, which equivalent to a `[Boolean]` argument's `.length` -property - effectively counting the number of times the boolean flag, denoted by the key, is passed on the command line.. -For example, this is how you could implement `ssh`'s multiple levels of verbosity (`-vvvv` being the most verbose). - -```javascript -const arg = require('arg'); - -const argv = ['-AAAA', '-BBBB']; - -const args = arg( - { - '-A': arg.COUNT, - '-B': [Boolean] - }, - { - argv - } -); - -console.log(args); -/* -{ - _: [], - '-A': 4, - '-B': [true, true, true, true] -} -*/ -``` - -### Options - -If a second parameter is specified and is an object, it specifies parsing options to modify the behavior of `arg()`. - -#### `argv` - -If you have already sliced or generated a number of raw arguments to be parsed (as opposed to letting `arg` -slice them from `process.argv`) you may specify them in the `argv` option. - -For example: - -```javascript -const args = arg( - { - '--foo': String - }, - { - argv: ['hello', '--foo', 'world'] - } -); -``` - -results in: - -```javascript -const args = { - _: ['hello'], - '--foo': 'world' -}; -``` - -#### `permissive` - -When `permissive` set to `true`, `arg` will push any unknown arguments -onto the "extra" argument array (`result._`) instead of throwing an error about -an unknown flag. - -For example: - -```javascript -const arg = require('arg'); - -const argv = [ - '--foo', - 'hello', - '--qux', - 'qix', - '--bar', - '12345', - 'hello again' -]; - -const args = arg( - { - '--foo': String, - '--bar': Number - }, - { - argv, - permissive: true - } -); -``` - -results in: - -```javascript -const args = { - _: ['--qux', 'qix', 'hello again'], - '--foo': 'hello', - '--bar': 12345 -}; -``` - -#### `stopAtPositional` - -When `stopAtPositional` is set to `true`, `arg` will halt parsing at the first -positional argument. - -For example: - -```javascript -const arg = require('arg'); - -const argv = ['--foo', 'hello', '--bar']; - -const args = arg( - { - '--foo': Boolean, - '--bar': Boolean - }, - { - argv, - stopAtPositional: true - } -); -``` - -results in: - -```javascript -const args = { - _: ['hello', '--bar'], - '--foo': true -}; -``` - -### Errors - -Some errors that `arg` throws provide a `.code` property in order to aid in recovering from user error, or to -differentiate between user error and developer error (bug). - -##### ARG_UNKNOWN_OPTION - -If an unknown option (not defined in the spec object) is passed, an error with code `ARG_UNKNOWN_OPTION` will be thrown: - -```js -// cli.js -try { - require('arg')({ '--hi': String }); -} catch (err) { - if (err.code === 'ARG_UNKNOWN_OPTION') { - console.log(err.message); - } else { - throw err; - } -} -``` - -```shell -node cli.js --extraneous true -Unknown or unexpected option: --extraneous -``` - -# FAQ - -A few questions and answers that have been asked before: - -### How do I require an argument with `arg`? - -Do the assertion yourself, such as: - -```javascript -const args = arg({ '--name': String }); - -if (!args['--name']) throw new Error('missing required argument: --name'); -``` - -# License - -Released under the [MIT License](LICENSE.md). diff --git a/node_modules/arg/index.d.ts b/node_modules/arg/index.d.ts deleted file mode 100644 index 44f9f35..0000000 --- a/node_modules/arg/index.d.ts +++ /dev/null @@ -1,44 +0,0 @@ -declare function arg( - spec: T, - options?: arg.Options -): arg.Result; - -declare namespace arg { - export const flagSymbol: unique symbol; - - export function flag(fn: T): T & { [arg.flagSymbol]: true }; - - export const COUNT: Handler & { [arg.flagSymbol]: true }; - - export type Handler = ( - value: string, - name: string, - previousValue?: T - ) => T; - - export class ArgError extends Error { - constructor(message: string, code: string); - - code: string; - } - - export interface Spec { - [key: string]: string | Handler | [Handler]; - } - - export type Result = { _: string[] } & { - [K in keyof T]?: T[K] extends Handler - ? ReturnType - : T[K] extends [Handler] - ? Array> - : never; - }; - - export interface Options { - argv?: string[]; - permissive?: boolean; - stopAtPositional?: boolean; - } -} - -export = arg; diff --git a/node_modules/arg/index.js b/node_modules/arg/index.js deleted file mode 100644 index 3f60f4c..0000000 --- a/node_modules/arg/index.js +++ /dev/null @@ -1,195 +0,0 @@ -const flagSymbol = Symbol('arg flag'); - -class ArgError extends Error { - constructor(msg, code) { - super(msg); - this.name = 'ArgError'; - this.code = code; - - Object.setPrototypeOf(this, ArgError.prototype); - } -} - -function arg( - opts, - { - argv = process.argv.slice(2), - permissive = false, - stopAtPositional = false - } = {} -) { - if (!opts) { - throw new ArgError( - 'argument specification object is required', - 'ARG_CONFIG_NO_SPEC' - ); - } - - const result = { _: [] }; - - const aliases = {}; - const handlers = {}; - - for (const key of Object.keys(opts)) { - if (!key) { - throw new ArgError( - 'argument key cannot be an empty string', - 'ARG_CONFIG_EMPTY_KEY' - ); - } - - if (key[0] !== '-') { - throw new ArgError( - `argument key must start with '-' but found: '${key}'`, - 'ARG_CONFIG_NONOPT_KEY' - ); - } - - if (key.length === 1) { - throw new ArgError( - `argument key must have a name; singular '-' keys are not allowed: ${key}`, - 'ARG_CONFIG_NONAME_KEY' - ); - } - - if (typeof opts[key] === 'string') { - aliases[key] = opts[key]; - continue; - } - - let type = opts[key]; - let isFlag = false; - - if ( - Array.isArray(type) && - type.length === 1 && - typeof type[0] === 'function' - ) { - const [fn] = type; - type = (value, name, prev = []) => { - prev.push(fn(value, name, prev[prev.length - 1])); - return prev; - }; - isFlag = fn === Boolean || fn[flagSymbol] === true; - } else if (typeof type === 'function') { - isFlag = type === Boolean || type[flagSymbol] === true; - } else { - throw new ArgError( - `type missing or not a function or valid array type: ${key}`, - 'ARG_CONFIG_VAD_TYPE' - ); - } - - if (key[1] !== '-' && key.length > 2) { - throw new ArgError( - `short argument keys (with a single hyphen) must have only one character: ${key}`, - 'ARG_CONFIG_SHORTOPT_TOOLONG' - ); - } - - handlers[key] = [type, isFlag]; - } - - for (let i = 0, len = argv.length; i < len; i++) { - const wholeArg = argv[i]; - - if (stopAtPositional && result._.length > 0) { - result._ = result._.concat(argv.slice(i)); - break; - } - - if (wholeArg === '--') { - result._ = result._.concat(argv.slice(i + 1)); - break; - } - - if (wholeArg.length > 1 && wholeArg[0] === '-') { - /* eslint-disable operator-linebreak */ - const separatedArguments = - wholeArg[1] === '-' || wholeArg.length === 2 - ? [wholeArg] - : wholeArg - .slice(1) - .split('') - .map((a) => `-${a}`); - /* eslint-enable operator-linebreak */ - - for (let j = 0; j < separatedArguments.length; j++) { - const arg = separatedArguments[j]; - const [originalArgName, argStr] = - arg[1] === '-' ? arg.split(/=(.*)/, 2) : [arg, undefined]; - - let argName = originalArgName; - while (argName in aliases) { - argName = aliases[argName]; - } - - if (!(argName in handlers)) { - if (permissive) { - result._.push(arg); - continue; - } else { - throw new ArgError( - `unknown or unexpected option: ${originalArgName}`, - 'ARG_UNKNOWN_OPTION' - ); - } - } - - const [type, isFlag] = handlers[argName]; - - if (!isFlag && j + 1 < separatedArguments.length) { - throw new ArgError( - `option requires argument (but was followed by another short argument): ${originalArgName}`, - 'ARG_MISSING_REQUIRED_SHORTARG' - ); - } - - if (isFlag) { - result[argName] = type(true, argName, result[argName]); - } else if (argStr === undefined) { - if ( - argv.length < i + 2 || - (argv[i + 1].length > 1 && - argv[i + 1][0] === '-' && - !( - argv[i + 1].match(/^-?\d*(\.(?=\d))?\d*$/) && - (type === Number || - // eslint-disable-next-line no-undef - (typeof BigInt !== 'undefined' && type === BigInt)) - )) - ) { - const extended = - originalArgName === argName ? '' : ` (alias for ${argName})`; - throw new ArgError( - `option requires argument: ${originalArgName}${extended}`, - 'ARG_MISSING_REQUIRED_LONGARG' - ); - } - - result[argName] = type(argv[i + 1], argName, result[argName]); - ++i; - } else { - result[argName] = type(argStr, argName, result[argName]); - } - } - } else { - result._.push(wholeArg); - } - } - - return result; -} - -arg.flag = (fn) => { - fn[flagSymbol] = true; - return fn; -}; - -// Utility types -arg.COUNT = arg.flag((v, name, existingCount) => (existingCount || 0) + 1); - -// Expose error class -arg.ArgError = ArgError; - -module.exports = arg; diff --git a/node_modules/arg/package.json b/node_modules/arg/package.json deleted file mode 100644 index 47368d7..0000000 --- a/node_modules/arg/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "arg", - "version": "5.0.2", - "description": "Unopinionated, no-frills CLI argument parser", - "main": "index.js", - "types": "index.d.ts", - "repository": "vercel/arg", - "author": "Josh Junon ", - "license": "MIT", - "files": [ - "index.js", - "index.d.ts" - ], - "scripts": { - "test": "WARN_EXIT=1 jest --coverage -w 2" - }, - "devDependencies": { - "chai": "^4.1.1", - "jest": "^27.0.6", - "prettier": "^2.3.2" - }, - "prettier": { - "arrowParens": "always", - "singleQuote": true, - "tabWidth": 2, - "trailingComma": "none" - } -} diff --git a/node_modules/balanced-match/.github/FUNDING.yml b/node_modules/balanced-match/.github/FUNDING.yml deleted file mode 100644 index cea8b16..0000000 --- a/node_modules/balanced-match/.github/FUNDING.yml +++ /dev/null @@ -1,2 +0,0 @@ -tidelift: "npm/balanced-match" -patreon: juliangruber diff --git a/node_modules/balanced-match/LICENSE.md b/node_modules/balanced-match/LICENSE.md deleted file mode 100644 index 2cdc8e4..0000000 --- a/node_modules/balanced-match/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -(MIT) - -Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/node_modules/balanced-match/README.md b/node_modules/balanced-match/README.md deleted file mode 100644 index d2a48b6..0000000 --- a/node_modules/balanced-match/README.md +++ /dev/null @@ -1,97 +0,0 @@ -# balanced-match - -Match balanced string pairs, like `{` and `}` or `` and ``. Supports regular expressions as well! - -[![build status](https://secure.travis-ci.org/juliangruber/balanced-match.svg)](http://travis-ci.org/juliangruber/balanced-match) -[![downloads](https://img.shields.io/npm/dm/balanced-match.svg)](https://www.npmjs.org/package/balanced-match) - -[![testling badge](https://ci.testling.com/juliangruber/balanced-match.png)](https://ci.testling.com/juliangruber/balanced-match) - -## Example - -Get the first matching pair of braces: - -```js -var balanced = require('balanced-match'); - -console.log(balanced('{', '}', 'pre{in{nested}}post')); -console.log(balanced('{', '}', 'pre{first}between{second}post')); -console.log(balanced(/\s+\{\s+/, /\s+\}\s+/, 'pre { in{nest} } post')); -``` - -The matches are: - -```bash -$ node example.js -{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' } -{ start: 3, - end: 9, - pre: 'pre', - body: 'first', - post: 'between{second}post' } -{ start: 3, end: 17, pre: 'pre', body: 'in{nest}', post: 'post' } -``` - -## API - -### var m = balanced(a, b, str) - -For the first non-nested matching pair of `a` and `b` in `str`, return an -object with those keys: - -* **start** the index of the first match of `a` -* **end** the index of the matching `b` -* **pre** the preamble, `a` and `b` not included -* **body** the match, `a` and `b` not included -* **post** the postscript, `a` and `b` not included - -If there's no match, `undefined` will be returned. - -If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']` and `{a}}` will match `['', 'a', '}']`. - -### var r = balanced.range(a, b, str) - -For the first non-nested matching pair of `a` and `b` in `str`, return an -array with indexes: `[ , ]`. - -If there's no match, `undefined` will be returned. - -If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `[ 1, 3 ]` and `{a}}` will match `[0, 2]`. - -## Installation - -With [npm](https://npmjs.org) do: - -```bash -npm install balanced-match -``` - -## Security contact information - -To report a security vulnerability, please use the -[Tidelift security contact](https://tidelift.com/security). -Tidelift will coordinate the fix and disclosure. - -## License - -(MIT) - -Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/node_modules/balanced-match/index.js b/node_modules/balanced-match/index.js deleted file mode 100644 index c67a646..0000000 --- a/node_modules/balanced-match/index.js +++ /dev/null @@ -1,62 +0,0 @@ -'use strict'; -module.exports = balanced; -function balanced(a, b, str) { - if (a instanceof RegExp) a = maybeMatch(a, str); - if (b instanceof RegExp) b = maybeMatch(b, str); - - var r = range(a, b, str); - - return r && { - start: r[0], - end: r[1], - pre: str.slice(0, r[0]), - body: str.slice(r[0] + a.length, r[1]), - post: str.slice(r[1] + b.length) - }; -} - -function maybeMatch(reg, str) { - var m = str.match(reg); - return m ? m[0] : null; -} - -balanced.range = range; -function range(a, b, str) { - var begs, beg, left, right, result; - var ai = str.indexOf(a); - var bi = str.indexOf(b, ai + 1); - var i = ai; - - if (ai >= 0 && bi > 0) { - if(a===b) { - return [ai, bi]; - } - begs = []; - left = str.length; - - while (i >= 0 && !result) { - if (i == ai) { - begs.push(i); - ai = str.indexOf(a, i + 1); - } else if (begs.length == 1) { - result = [ begs.pop(), bi ]; - } else { - beg = begs.pop(); - if (beg < left) { - left = beg; - right = bi; - } - - bi = str.indexOf(b, i + 1); - } - - i = ai < bi && ai >= 0 ? ai : bi; - } - - if (begs.length) { - result = [ left, right ]; - } - } - - return result; -} diff --git a/node_modules/balanced-match/package.json b/node_modules/balanced-match/package.json deleted file mode 100644 index ce6073e..0000000 --- a/node_modules/balanced-match/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "balanced-match", - "description": "Match balanced character pairs, like \"{\" and \"}\"", - "version": "1.0.2", - "repository": { - "type": "git", - "url": "git://github.com/juliangruber/balanced-match.git" - }, - "homepage": "https://github.com/juliangruber/balanced-match", - "main": "index.js", - "scripts": { - "test": "tape test/test.js", - "bench": "matcha test/bench.js" - }, - "devDependencies": { - "matcha": "^0.7.0", - "tape": "^4.6.0" - }, - "keywords": [ - "match", - "regexp", - "test", - "balanced", - "parse" - ], - "author": { - "name": "Julian Gruber", - "email": "mail@juliangruber.com", - "url": "http://juliangruber.com" - }, - "license": "MIT", - "testling": { - "files": "test/*.js", - "browsers": [ - "ie/8..latest", - "firefox/20..latest", - "firefox/nightly", - "chrome/25..latest", - "chrome/canary", - "opera/12..latest", - "opera/next", - "safari/5.1..latest", - "ipad/6.0..latest", - "iphone/6.0..latest", - "android-browser/4.2..latest" - ] - } -} diff --git a/node_modules/base64-js/LICENSE b/node_modules/base64-js/LICENSE deleted file mode 100644 index 6d52b8a..0000000 --- a/node_modules/base64-js/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Jameson Little - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/node_modules/base64-js/README.md b/node_modules/base64-js/README.md deleted file mode 100644 index b42a48f..0000000 --- a/node_modules/base64-js/README.md +++ /dev/null @@ -1,34 +0,0 @@ -base64-js -========= - -`base64-js` does basic base64 encoding/decoding in pure JS. - -[![build status](https://secure.travis-ci.org/beatgammit/base64-js.png)](http://travis-ci.org/beatgammit/base64-js) - -Many browsers already have base64 encoding/decoding functionality, but it is for text data, not all-purpose binary data. - -Sometimes encoding/decoding binary data in the browser is useful, and that is what this module does. - -## install - -With [npm](https://npmjs.org) do: - -`npm install base64-js` and `var base64js = require('base64-js')` - -For use in web browsers do: - -`` - -[Get supported base64-js with the Tidelift Subscription](https://tidelift.com/subscription/pkg/npm-base64-js?utm_source=npm-base64-js&utm_medium=referral&utm_campaign=readme) - -## methods - -`base64js` has three exposed functions, `byteLength`, `toByteArray` and `fromByteArray`, which both take a single argument. - -* `byteLength` - Takes a base64 string and returns length of byte array -* `toByteArray` - Takes a base64 string and returns a byte array -* `fromByteArray` - Takes a byte array and returns a base64 string - -## license - -MIT diff --git a/node_modules/base64-js/base64js.min.js b/node_modules/base64-js/base64js.min.js deleted file mode 100644 index 908ac83..0000000 --- a/node_modules/base64-js/base64js.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"==typeof window?"undefined"==typeof global?"undefined"==typeof self?this:self:global:window,b.base64js=a()}})(function(){return function(){function b(d,e,g){function a(j,i){if(!e[j]){if(!d[j]){var f="function"==typeof require&&require;if(!i&&f)return f(j,!0);if(h)return h(j,!0);var c=new Error("Cannot find module '"+j+"'");throw c.code="MODULE_NOT_FOUND",c}var k=e[j]={exports:{}};d[j][0].call(k.exports,function(b){var c=d[j][1][b];return a(c||b)},k,k.exports,b,d,e,g)}return e[j].exports}for(var h="function"==typeof require&&require,c=0;c>16,j[k++]=255&b>>8,j[k++]=255&b;return 2===h&&(b=l[a.charCodeAt(c)]<<2|l[a.charCodeAt(c+1)]>>4,j[k++]=255&b),1===h&&(b=l[a.charCodeAt(c)]<<10|l[a.charCodeAt(c+1)]<<4|l[a.charCodeAt(c+2)]>>2,j[k++]=255&b>>8,j[k++]=255&b),j}function g(a){return k[63&a>>18]+k[63&a>>12]+k[63&a>>6]+k[63&a]}function h(a,b,c){for(var d,e=[],f=b;fj?j:g+f));return 1===d?(b=a[c-1],e.push(k[b>>2]+k[63&b<<4]+"==")):2===d&&(b=(a[c-2]<<8)+a[c-1],e.push(k[b>>10]+k[63&b>>4]+k[63&b<<2]+"=")),e.join("")}c.byteLength=function(a){var b=d(a),c=b[0],e=b[1];return 3*(c+e)/4-e},c.toByteArray=f,c.fromByteArray=j;for(var k=[],l=[],m="undefined"==typeof Uint8Array?Array:Uint8Array,n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o=0,p=n.length;o 0) { - throw new Error('Invalid string. Length must be a multiple of 4') - } - - // Trim off extra bytes after placeholder bytes are found - // See: https://github.com/beatgammit/base64-js/issues/42 - var validLen = b64.indexOf('=') - if (validLen === -1) validLen = len - - var placeHoldersLen = validLen === len - ? 0 - : 4 - (validLen % 4) - - return [validLen, placeHoldersLen] -} - -// base64 is 4/3 + up to two characters of the original data -function byteLength (b64) { - var lens = getLens(b64) - var validLen = lens[0] - var placeHoldersLen = lens[1] - return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen -} - -function _byteLength (b64, validLen, placeHoldersLen) { - return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen -} - -function toByteArray (b64) { - var tmp - var lens = getLens(b64) - var validLen = lens[0] - var placeHoldersLen = lens[1] - - var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen)) - - var curByte = 0 - - // if there are placeholders, only get up to the last complete 4 chars - var len = placeHoldersLen > 0 - ? validLen - 4 - : validLen - - var i - for (i = 0; i < len; i += 4) { - tmp = - (revLookup[b64.charCodeAt(i)] << 18) | - (revLookup[b64.charCodeAt(i + 1)] << 12) | - (revLookup[b64.charCodeAt(i + 2)] << 6) | - revLookup[b64.charCodeAt(i + 3)] - arr[curByte++] = (tmp >> 16) & 0xFF - arr[curByte++] = (tmp >> 8) & 0xFF - arr[curByte++] = tmp & 0xFF - } - - if (placeHoldersLen === 2) { - tmp = - (revLookup[b64.charCodeAt(i)] << 2) | - (revLookup[b64.charCodeAt(i + 1)] >> 4) - arr[curByte++] = tmp & 0xFF - } - - if (placeHoldersLen === 1) { - tmp = - (revLookup[b64.charCodeAt(i)] << 10) | - (revLookup[b64.charCodeAt(i + 1)] << 4) | - (revLookup[b64.charCodeAt(i + 2)] >> 2) - arr[curByte++] = (tmp >> 8) & 0xFF - arr[curByte++] = tmp & 0xFF - } - - return arr -} - -function tripletToBase64 (num) { - return lookup[num >> 18 & 0x3F] + - lookup[num >> 12 & 0x3F] + - lookup[num >> 6 & 0x3F] + - lookup[num & 0x3F] -} - -function encodeChunk (uint8, start, end) { - var tmp - var output = [] - for (var i = start; i < end; i += 3) { - tmp = - ((uint8[i] << 16) & 0xFF0000) + - ((uint8[i + 1] << 8) & 0xFF00) + - (uint8[i + 2] & 0xFF) - output.push(tripletToBase64(tmp)) - } - return output.join('') -} - -function fromByteArray (uint8) { - var tmp - var len = uint8.length - var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes - var parts = [] - var maxChunkLength = 16383 // must be multiple of 3 - - // go through the array every three bytes, we'll deal with trailing stuff later - for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { - parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) - } - - // pad the end with zeros, but make sure to not forget the extra bytes - if (extraBytes === 1) { - tmp = uint8[len - 1] - parts.push( - lookup[tmp >> 2] + - lookup[(tmp << 4) & 0x3F] + - '==' - ) - } else if (extraBytes === 2) { - tmp = (uint8[len - 2] << 8) + uint8[len - 1] - parts.push( - lookup[tmp >> 10] + - lookup[(tmp >> 4) & 0x3F] + - lookup[(tmp << 2) & 0x3F] + - '=' - ) - } - - return parts.join('') -} diff --git a/node_modules/base64-js/package.json b/node_modules/base64-js/package.json deleted file mode 100644 index c3972e3..0000000 --- a/node_modules/base64-js/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "base64-js", - "description": "Base64 encoding/decoding in pure JS", - "version": "1.5.1", - "author": "T. Jameson Little ", - "typings": "index.d.ts", - "bugs": { - "url": "https://github.com/beatgammit/base64-js/issues" - }, - "devDependencies": { - "babel-minify": "^0.5.1", - "benchmark": "^2.1.4", - "browserify": "^16.3.0", - "standard": "*", - "tape": "4.x" - }, - "homepage": "https://github.com/beatgammit/base64-js", - "keywords": [ - "base64" - ], - "license": "MIT", - "main": "index.js", - "repository": { - "type": "git", - "url": "git://github.com/beatgammit/base64-js.git" - }, - "scripts": { - "build": "browserify -s base64js -r ./ | minify > base64js.min.js", - "lint": "standard", - "test": "npm run lint && npm run unit", - "unit": "tape test/*.js" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] -} diff --git a/node_modules/binary-extensions/binary-extensions.json b/node_modules/binary-extensions/binary-extensions.json deleted file mode 100644 index ac08048..0000000 --- a/node_modules/binary-extensions/binary-extensions.json +++ /dev/null @@ -1,263 +0,0 @@ -[ - "3dm", - "3ds", - "3g2", - "3gp", - "7z", - "a", - "aac", - "adp", - "afdesign", - "afphoto", - "afpub", - "ai", - "aif", - "aiff", - "alz", - "ape", - "apk", - "appimage", - "ar", - "arj", - "asf", - "au", - "avi", - "bak", - "baml", - "bh", - "bin", - "bk", - "bmp", - "btif", - "bz2", - "bzip2", - "cab", - "caf", - "cgm", - "class", - "cmx", - "cpio", - "cr2", - "cur", - "dat", - "dcm", - "deb", - "dex", - "djvu", - "dll", - "dmg", - "dng", - "doc", - "docm", - "docx", - "dot", - "dotm", - "dra", - "DS_Store", - "dsk", - "dts", - "dtshd", - "dvb", - "dwg", - "dxf", - "ecelp4800", - "ecelp7470", - "ecelp9600", - "egg", - "eol", - "eot", - "epub", - "exe", - "f4v", - "fbs", - "fh", - "fla", - "flac", - "flatpak", - "fli", - "flv", - "fpx", - "fst", - "fvt", - "g3", - "gh", - "gif", - "graffle", - "gz", - "gzip", - "h261", - "h263", - "h264", - "icns", - "ico", - "ief", - "img", - "ipa", - "iso", - "jar", - "jpeg", - "jpg", - "jpgv", - "jpm", - "jxr", - "key", - "ktx", - "lha", - "lib", - "lvp", - "lz", - "lzh", - "lzma", - "lzo", - "m3u", - "m4a", - "m4v", - "mar", - "mdi", - "mht", - "mid", - "midi", - "mj2", - "mka", - "mkv", - "mmr", - "mng", - "mobi", - "mov", - "movie", - "mp3", - "mp4", - "mp4a", - "mpeg", - "mpg", - "mpga", - "mxu", - "nef", - "npx", - "numbers", - "nupkg", - "o", - "odp", - "ods", - "odt", - "oga", - "ogg", - "ogv", - "otf", - "ott", - "pages", - "pbm", - "pcx", - "pdb", - "pdf", - "pea", - "pgm", - "pic", - "png", - "pnm", - "pot", - "potm", - "potx", - "ppa", - "ppam", - "ppm", - "pps", - "ppsm", - "ppsx", - "ppt", - "pptm", - "pptx", - "psd", - "pya", - "pyc", - "pyo", - "pyv", - "qt", - "rar", - "ras", - "raw", - "resources", - "rgb", - "rip", - "rlc", - "rmf", - "rmvb", - "rpm", - "rtf", - "rz", - "s3m", - "s7z", - "scpt", - "sgi", - "shar", - "snap", - "sil", - "sketch", - "slk", - "smv", - "snk", - "so", - "stl", - "suo", - "sub", - "swf", - "tar", - "tbz", - "tbz2", - "tga", - "tgz", - "thmx", - "tif", - "tiff", - "tlz", - "ttc", - "ttf", - "txz", - "udf", - "uvh", - "uvi", - "uvm", - "uvp", - "uvs", - "uvu", - "viv", - "vob", - "war", - "wav", - "wax", - "wbmp", - "wdp", - "weba", - "webm", - "webp", - "whl", - "wim", - "wm", - "wma", - "wmv", - "wmx", - "woff", - "woff2", - "wrm", - "wvx", - "xbm", - "xif", - "xla", - "xlam", - "xls", - "xlsb", - "xlsm", - "xlsx", - "xlt", - "xltm", - "xltx", - "xm", - "xmind", - "xpi", - "xpm", - "xwd", - "xz", - "z", - "zip", - "zipx" -] diff --git a/node_modules/binary-extensions/binary-extensions.json.d.ts b/node_modules/binary-extensions/binary-extensions.json.d.ts deleted file mode 100644 index 94a248c..0000000 --- a/node_modules/binary-extensions/binary-extensions.json.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -declare const binaryExtensionsJson: readonly string[]; - -export = binaryExtensionsJson; diff --git a/node_modules/binary-extensions/index.d.ts b/node_modules/binary-extensions/index.d.ts deleted file mode 100644 index f469ac5..0000000 --- a/node_modules/binary-extensions/index.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** -List of binary file extensions. - -@example -``` -import binaryExtensions = require('binary-extensions'); - -console.log(binaryExtensions); -//=> ['3ds', '3g2', …] -``` -*/ -declare const binaryExtensions: readonly string[]; - -export = binaryExtensions; diff --git a/node_modules/binary-extensions/index.js b/node_modules/binary-extensions/index.js deleted file mode 100644 index d46e468..0000000 --- a/node_modules/binary-extensions/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./binary-extensions.json'); diff --git a/node_modules/binary-extensions/license b/node_modules/binary-extensions/license deleted file mode 100644 index 5493a1a..0000000 --- a/node_modules/binary-extensions/license +++ /dev/null @@ -1,10 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (https://sindresorhus.com) -Copyright (c) Paul Miller (https://paulmillr.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/binary-extensions/package.json b/node_modules/binary-extensions/package.json deleted file mode 100644 index 4710c33..0000000 --- a/node_modules/binary-extensions/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "binary-extensions", - "version": "2.3.0", - "description": "List of binary file extensions", - "license": "MIT", - "repository": "sindresorhus/binary-extensions", - "funding": "https://github.com/sponsors/sindresorhus", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "https://sindresorhus.com" - }, - "sideEffects": false, - "engines": { - "node": ">=8" - }, - "scripts": { - "test": "xo && ava && tsd" - }, - "files": [ - "index.js", - "index.d.ts", - "binary-extensions.json", - "binary-extensions.json.d.ts" - ], - "keywords": [ - "binary", - "extensions", - "extension", - "file", - "json", - "list", - "array" - ], - "devDependencies": { - "ava": "^1.4.1", - "tsd": "^0.7.2", - "xo": "^0.24.0" - } -} diff --git a/node_modules/binary-extensions/readme.md b/node_modules/binary-extensions/readme.md deleted file mode 100644 index 88519b3..0000000 --- a/node_modules/binary-extensions/readme.md +++ /dev/null @@ -1,25 +0,0 @@ -# binary-extensions - -> List of binary file extensions - -The list is just a [JSON file](binary-extensions.json) and can be used anywhere. - -## Install - -```sh -npm install binary-extensions -``` - -## Usage - -```js -const binaryExtensions = require('binary-extensions'); - -console.log(binaryExtensions); -//=> ['3ds', '3g2', …] -``` - -## Related - -- [is-binary-path](https://github.com/sindresorhus/is-binary-path) - Check if a filepath is a binary file -- [text-extensions](https://github.com/sindresorhus/text-extensions) - List of text file extensions diff --git a/node_modules/brace-expansion/.github/FUNDING.yml b/node_modules/brace-expansion/.github/FUNDING.yml deleted file mode 100644 index 79d1eaf..0000000 --- a/node_modules/brace-expansion/.github/FUNDING.yml +++ /dev/null @@ -1,2 +0,0 @@ -tidelift: "npm/brace-expansion" -patreon: juliangruber diff --git a/node_modules/brace-expansion/LICENSE b/node_modules/brace-expansion/LICENSE deleted file mode 100644 index de32266..0000000 --- a/node_modules/brace-expansion/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2013 Julian Gruber - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/node_modules/brace-expansion/README.md b/node_modules/brace-expansion/README.md deleted file mode 100644 index e55c583..0000000 --- a/node_modules/brace-expansion/README.md +++ /dev/null @@ -1,135 +0,0 @@ -# brace-expansion - -[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html), -as known from sh/bash, in JavaScript. - -[![build status](https://secure.travis-ci.org/juliangruber/brace-expansion.svg)](http://travis-ci.org/juliangruber/brace-expansion) -[![downloads](https://img.shields.io/npm/dm/brace-expansion.svg)](https://www.npmjs.org/package/brace-expansion) -[![Greenkeeper badge](https://badges.greenkeeper.io/juliangruber/brace-expansion.svg)](https://greenkeeper.io/) - -[![testling badge](https://ci.testling.com/juliangruber/brace-expansion.png)](https://ci.testling.com/juliangruber/brace-expansion) - -## Example - -```js -var expand = require('brace-expansion'); - -expand('file-{a,b,c}.jpg') -// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] - -expand('-v{,,}') -// => ['-v', '-v', '-v'] - -expand('file{0..2}.jpg') -// => ['file0.jpg', 'file1.jpg', 'file2.jpg'] - -expand('file-{a..c}.jpg') -// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] - -expand('file{2..0}.jpg') -// => ['file2.jpg', 'file1.jpg', 'file0.jpg'] - -expand('file{0..4..2}.jpg') -// => ['file0.jpg', 'file2.jpg', 'file4.jpg'] - -expand('file-{a..e..2}.jpg') -// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg'] - -expand('file{00..10..5}.jpg') -// => ['file00.jpg', 'file05.jpg', 'file10.jpg'] - -expand('{{A..C},{a..c}}') -// => ['A', 'B', 'C', 'a', 'b', 'c'] - -expand('ppp{,config,oe{,conf}}') -// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf'] -``` - -## API - -```js -var expand = require('brace-expansion'); -``` - -### var expanded = expand(str) - -Return an array of all possible and valid expansions of `str`. If none are -found, `[str]` is returned. - -Valid expansions are: - -```js -/^(.*,)+(.+)?$/ -// {a,b,...} -``` - -A comma separated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`. - -```js -/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ -// {x..y[..incr]} -``` - -A numeric sequence from `x` to `y` inclusive, with optional increment. -If `x` or `y` start with a leading `0`, all the numbers will be padded -to have equal length. Negative numbers and backwards iteration work too. - -```js -/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ -// {x..y[..incr]} -``` - -An alphabetic sequence from `x` to `y` inclusive, with optional increment. -`x` and `y` must be exactly one character, and if given, `incr` must be a -number. - -For compatibility reasons, the string `${` is not eligible for brace expansion. - -## Installation - -With [npm](https://npmjs.org) do: - -```bash -npm install brace-expansion -``` - -## Contributors - -- [Julian Gruber](https://github.com/juliangruber) -- [Isaac Z. Schlueter](https://github.com/isaacs) - -## Sponsors - -This module is proudly supported by my [Sponsors](https://github.com/juliangruber/sponsors)! - -Do you want to support modules like this to improve their quality, stability and weigh in on new features? Then please consider donating to my [Patreon](https://www.patreon.com/juliangruber). Not sure how much of my modules you're using? Try [feross/thanks](https://github.com/feross/thanks)! - -## Security contact information - -To report a security vulnerability, please use the -[Tidelift security contact](https://tidelift.com/security). -Tidelift will coordinate the fix and disclosure. - -## License - -(MIT) - -Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/node_modules/brace-expansion/index.js b/node_modules/brace-expansion/index.js deleted file mode 100644 index a27f81c..0000000 --- a/node_modules/brace-expansion/index.js +++ /dev/null @@ -1,203 +0,0 @@ -var balanced = require('balanced-match'); - -module.exports = expandTop; - -var escSlash = '\0SLASH'+Math.random()+'\0'; -var escOpen = '\0OPEN'+Math.random()+'\0'; -var escClose = '\0CLOSE'+Math.random()+'\0'; -var escComma = '\0COMMA'+Math.random()+'\0'; -var escPeriod = '\0PERIOD'+Math.random()+'\0'; - -function numeric(str) { - return parseInt(str, 10) == str - ? parseInt(str, 10) - : str.charCodeAt(0); -} - -function escapeBraces(str) { - return str.split('\\\\').join(escSlash) - .split('\\{').join(escOpen) - .split('\\}').join(escClose) - .split('\\,').join(escComma) - .split('\\.').join(escPeriod); -} - -function unescapeBraces(str) { - return str.split(escSlash).join('\\') - .split(escOpen).join('{') - .split(escClose).join('}') - .split(escComma).join(',') - .split(escPeriod).join('.'); -} - - -// Basically just str.split(","), but handling cases -// where we have nested braced sections, which should be -// treated as individual members, like {a,{b,c},d} -function parseCommaParts(str) { - if (!str) - return ['']; - - var parts = []; - var m = balanced('{', '}', str); - - if (!m) - return str.split(','); - - var pre = m.pre; - var body = m.body; - var post = m.post; - var p = pre.split(','); - - p[p.length-1] += '{' + body + '}'; - var postParts = parseCommaParts(post); - if (post.length) { - p[p.length-1] += postParts.shift(); - p.push.apply(p, postParts); - } - - parts.push.apply(parts, p); - - return parts; -} - -function expandTop(str) { - if (!str) - return []; - - // I don't know why Bash 4.3 does this, but it does. - // Anything starting with {} will have the first two bytes preserved - // but *only* at the top level, so {},a}b will not expand to anything, - // but a{},b}c will be expanded to [a}c,abc]. - // One could argue that this is a bug in Bash, but since the goal of - // this module is to match Bash's rules, we escape a leading {} - if (str.substr(0, 2) === '{}') { - str = '\\{\\}' + str.substr(2); - } - - return expand(escapeBraces(str), true).map(unescapeBraces); -} - -function embrace(str) { - return '{' + str + '}'; -} -function isPadded(el) { - return /^-?0\d/.test(el); -} - -function lte(i, y) { - return i <= y; -} -function gte(i, y) { - return i >= y; -} - -function expand(str, isTop) { - var expansions = []; - - var m = balanced('{', '}', str); - if (!m) return [str]; - - // no need to expand pre, since it is guaranteed to be free of brace-sets - var pre = m.pre; - var post = m.post.length - ? expand(m.post, false) - : ['']; - - if (/\$$/.test(m.pre)) { - for (var k = 0; k < post.length; k++) { - var expansion = pre+ '{' + m.body + '}' + post[k]; - expansions.push(expansion); - } - } else { - var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); - var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); - var isSequence = isNumericSequence || isAlphaSequence; - var isOptions = m.body.indexOf(',') >= 0; - if (!isSequence && !isOptions) { - // {a},b} - if (m.post.match(/,(?!,).*\}/)) { - str = m.pre + '{' + m.body + escClose + m.post; - return expand(str); - } - return [str]; - } - - var n; - if (isSequence) { - n = m.body.split(/\.\./); - } else { - n = parseCommaParts(m.body); - if (n.length === 1) { - // x{{a,b}}y ==> x{a}y x{b}y - n = expand(n[0], false).map(embrace); - if (n.length === 1) { - return post.map(function(p) { - return m.pre + n[0] + p; - }); - } - } - } - - // at this point, n is the parts, and we know it's not a comma set - // with a single entry. - var N; - - if (isSequence) { - var x = numeric(n[0]); - var y = numeric(n[1]); - var width = Math.max(n[0].length, n[1].length) - var incr = n.length == 3 - ? Math.abs(numeric(n[2])) - : 1; - var test = lte; - var reverse = y < x; - if (reverse) { - incr *= -1; - test = gte; - } - var pad = n.some(isPadded); - - N = []; - - for (var i = x; test(i, y); i += incr) { - var c; - if (isAlphaSequence) { - c = String.fromCharCode(i); - if (c === '\\') - c = ''; - } else { - c = String(i); - if (pad) { - var need = width - c.length; - if (need > 0) { - var z = new Array(need + 1).join('0'); - if (i < 0) - c = '-' + z + c.slice(1); - else - c = z + c; - } - } - } - N.push(c); - } - } else { - N = []; - - for (var j = 0; j < n.length; j++) { - N.push.apply(N, expand(n[j], false)); - } - } - - for (var j = 0; j < N.length; j++) { - for (var k = 0; k < post.length; k++) { - var expansion = pre + N[j] + post[k]; - if (!isTop || isSequence || expansion) - expansions.push(expansion); - } - } - } - - return expansions; -} - diff --git a/node_modules/brace-expansion/package.json b/node_modules/brace-expansion/package.json deleted file mode 100644 index c7eee34..0000000 --- a/node_modules/brace-expansion/package.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "brace-expansion", - "description": "Brace expansion as known from sh/bash", - "version": "2.0.2", - "repository": { - "type": "git", - "url": "git://github.com/juliangruber/brace-expansion.git" - }, - "homepage": "https://github.com/juliangruber/brace-expansion", - "main": "index.js", - "scripts": { - "test": "tape test/*.js", - "gentest": "bash test/generate.sh", - "bench": "matcha test/perf/bench.js" - }, - "dependencies": { - "balanced-match": "^1.0.0" - }, - "devDependencies": { - "@c4312/matcha": "^1.3.1", - "tape": "^4.6.0" - }, - "keywords": [], - "author": { - "name": "Julian Gruber", - "email": "mail@juliangruber.com", - "url": "http://juliangruber.com" - }, - "license": "MIT", - "testling": { - "files": "test/*.js", - "browsers": [ - "ie/8..latest", - "firefox/20..latest", - "firefox/nightly", - "chrome/25..latest", - "chrome/canary", - "opera/12..latest", - "opera/next", - "safari/5.1..latest", - "ipad/6.0..latest", - "iphone/6.0..latest", - "android-browser/4.2..latest" - ] - }, - "publishConfig": { - "tag": "2.x" - } -} diff --git a/node_modules/braces/LICENSE b/node_modules/braces/LICENSE deleted file mode 100644 index 9af4a67..0000000 --- a/node_modules/braces/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014-present, Jon Schlinkert. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/node_modules/braces/README.md b/node_modules/braces/README.md deleted file mode 100644 index f59dd60..0000000 --- a/node_modules/braces/README.md +++ /dev/null @@ -1,586 +0,0 @@ -# braces [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=W8YFZ425KND68) [![NPM version](https://img.shields.io/npm/v/braces.svg?style=flat)](https://www.npmjs.com/package/braces) [![NPM monthly downloads](https://img.shields.io/npm/dm/braces.svg?style=flat)](https://npmjs.org/package/braces) [![NPM total downloads](https://img.shields.io/npm/dt/braces.svg?style=flat)](https://npmjs.org/package/braces) [![Linux Build Status](https://img.shields.io/travis/micromatch/braces.svg?style=flat&label=Travis)](https://travis-ci.org/micromatch/braces) - -> Bash-like brace expansion, implemented in JavaScript. Safer than other brace expansion libs, with complete support for the Bash 4.3 braces specification, without sacrificing speed. - -Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. - -## Install - -Install with [npm](https://www.npmjs.com/): - -```sh -$ npm install --save braces -``` - -## v3.0.0 Released!! - -See the [changelog](CHANGELOG.md) for details. - -## Why use braces? - -Brace patterns make globs more powerful by adding the ability to match specific ranges and sequences of characters. - -- **Accurate** - complete support for the [Bash 4.3 Brace Expansion](www.gnu.org/software/bash/) specification (passes all of the Bash braces tests) -- **[fast and performant](#benchmarks)** - Starts fast, runs fast and [scales well](#performance) as patterns increase in complexity. -- **Organized code base** - The parser and compiler are easy to maintain and update when edge cases crop up. -- **Well-tested** - Thousands of test assertions, and passes all of the Bash, minimatch, and [brace-expansion](https://github.com/juliangruber/brace-expansion) unit tests (as of the date this was written). -- **Safer** - You shouldn't have to worry about users defining aggressive or malicious brace patterns that can break your application. Braces takes measures to prevent malicious regex that can be used for DDoS attacks (see [catastrophic backtracking](https://www.regular-expressions.info/catastrophic.html)). -- [Supports lists](#lists) - (aka "sets") `a/{b,c}/d` => `['a/b/d', 'a/c/d']` -- [Supports sequences](#sequences) - (aka "ranges") `{01..03}` => `['01', '02', '03']` -- [Supports steps](#steps) - (aka "increments") `{2..10..2}` => `['2', '4', '6', '8', '10']` -- [Supports escaping](#escaping) - To prevent evaluation of special characters. - -## Usage - -The main export is a function that takes one or more brace `patterns` and `options`. - -```js -const braces = require('braces'); -// braces(patterns[, options]); - -console.log(braces(['{01..05}', '{a..e}'])); -//=> ['(0[1-5])', '([a-e])'] - -console.log(braces(['{01..05}', '{a..e}'], { expand: true })); -//=> ['01', '02', '03', '04', '05', 'a', 'b', 'c', 'd', 'e'] -``` - -### Brace Expansion vs. Compilation - -By default, brace patterns are compiled into strings that are optimized for creating regular expressions and matching. - -**Compiled** - -```js -console.log(braces('a/{x,y,z}/b')); -//=> ['a/(x|y|z)/b'] -console.log(braces(['a/{01..20}/b', 'a/{1..5}/b'])); -//=> [ 'a/(0[1-9]|1[0-9]|20)/b', 'a/([1-5])/b' ] -``` - -**Expanded** - -Enable brace expansion by setting the `expand` option to true, or by using [braces.expand()](#expand) (returns an array similar to what you'd expect from Bash, or `echo {1..5}`, or [minimatch](https://github.com/isaacs/minimatch)): - -```js -console.log(braces('a/{x,y,z}/b', { expand: true })); -//=> ['a/x/b', 'a/y/b', 'a/z/b'] - -console.log(braces.expand('{01..10}')); -//=> ['01','02','03','04','05','06','07','08','09','10'] -``` - -### Lists - -Expand lists (like Bash "sets"): - -```js -console.log(braces('a/{foo,bar,baz}/*.js')); -//=> ['a/(foo|bar|baz)/*.js'] - -console.log(braces.expand('a/{foo,bar,baz}/*.js')); -//=> ['a/foo/*.js', 'a/bar/*.js', 'a/baz/*.js'] -``` - -### Sequences - -Expand ranges of characters (like Bash "sequences"): - -```js -console.log(braces.expand('{1..3}')); // ['1', '2', '3'] -console.log(braces.expand('a/{1..3}/b')); // ['a/1/b', 'a/2/b', 'a/3/b'] -console.log(braces('{a..c}', { expand: true })); // ['a', 'b', 'c'] -console.log(braces('foo/{a..c}', { expand: true })); // ['foo/a', 'foo/b', 'foo/c'] - -// supports zero-padded ranges -console.log(braces('a/{01..03}/b')); //=> ['a/(0[1-3])/b'] -console.log(braces('a/{001..300}/b')); //=> ['a/(0{2}[1-9]|0[1-9][0-9]|[12][0-9]{2}|300)/b'] -``` - -See [fill-range](https://github.com/jonschlinkert/fill-range) for all available range-expansion options. - -### Steppped ranges - -Steps, or increments, may be used with ranges: - -```js -console.log(braces.expand('{2..10..2}')); -//=> ['2', '4', '6', '8', '10'] - -console.log(braces('{2..10..2}')); -//=> ['(2|4|6|8|10)'] -``` - -When the [.optimize](#optimize) method is used, or [options.optimize](#optionsoptimize) is set to true, sequences are passed to [to-regex-range](https://github.com/jonschlinkert/to-regex-range) for expansion. - -### Nesting - -Brace patterns may be nested. The results of each expanded string are not sorted, and left to right order is preserved. - -**"Expanded" braces** - -```js -console.log(braces.expand('a{b,c,/{x,y}}/e')); -//=> ['ab/e', 'ac/e', 'a/x/e', 'a/y/e'] - -console.log(braces.expand('a/{x,{1..5},y}/c')); -//=> ['a/x/c', 'a/1/c', 'a/2/c', 'a/3/c', 'a/4/c', 'a/5/c', 'a/y/c'] -``` - -**"Optimized" braces** - -```js -console.log(braces('a{b,c,/{x,y}}/e')); -//=> ['a(b|c|/(x|y))/e'] - -console.log(braces('a/{x,{1..5},y}/c')); -//=> ['a/(x|([1-5])|y)/c'] -``` - -### Escaping - -**Escaping braces** - -A brace pattern will not be expanded or evaluted if _either the opening or closing brace is escaped_: - -```js -console.log(braces.expand('a\\{d,c,b}e')); -//=> ['a{d,c,b}e'] - -console.log(braces.expand('a{d,c,b\\}e')); -//=> ['a{d,c,b}e'] -``` - -**Escaping commas** - -Commas inside braces may also be escaped: - -```js -console.log(braces.expand('a{b\\,c}d')); -//=> ['a{b,c}d'] - -console.log(braces.expand('a{d\\,c,b}e')); -//=> ['ad,ce', 'abe'] -``` - -**Single items** - -Following bash conventions, a brace pattern is also not expanded when it contains a single character: - -```js -console.log(braces.expand('a{b}c')); -//=> ['a{b}c'] -``` - -## Options - -### options.maxLength - -**Type**: `Number` - -**Default**: `10,000` - -**Description**: Limit the length of the input string. Useful when the input string is generated or your application allows users to pass a string, et cetera. - -```js -console.log(braces('a/{b,c}/d', { maxLength: 3 })); //=> throws an error -``` - -### options.expand - -**Type**: `Boolean` - -**Default**: `undefined` - -**Description**: Generate an "expanded" brace pattern (alternatively you can use the `braces.expand()` method, which does the same thing). - -```js -console.log(braces('a/{b,c}/d', { expand: true })); -//=> [ 'a/b/d', 'a/c/d' ] -``` - -### options.nodupes - -**Type**: `Boolean` - -**Default**: `undefined` - -**Description**: Remove duplicates from the returned array. - -### options.rangeLimit - -**Type**: `Number` - -**Default**: `1000` - -**Description**: To prevent malicious patterns from being passed by users, an error is thrown when `braces.expand()` is used or `options.expand` is true and the generated range will exceed the `rangeLimit`. - -You can customize `options.rangeLimit` or set it to `Inifinity` to disable this altogether. - -**Examples** - -```js -// pattern exceeds the "rangeLimit", so it's optimized automatically -console.log(braces.expand('{1..1000}')); -//=> ['([1-9]|[1-9][0-9]{1,2}|1000)'] - -// pattern does not exceed "rangeLimit", so it's NOT optimized -console.log(braces.expand('{1..100}')); -//=> ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '100'] -``` - -### options.transform - -**Type**: `Function` - -**Default**: `undefined` - -**Description**: Customize range expansion. - -**Example: Transforming non-numeric values** - -```js -const alpha = braces.expand('x/{a..e}/y', { - transform(value, index) { - // When non-numeric values are passed, "value" is a character code. - return 'foo/' + String.fromCharCode(value) + '-' + index; - }, -}); -console.log(alpha); -//=> [ 'x/foo/a-0/y', 'x/foo/b-1/y', 'x/foo/c-2/y', 'x/foo/d-3/y', 'x/foo/e-4/y' ] -``` - -**Example: Transforming numeric values** - -```js -const numeric = braces.expand('{1..5}', { - transform(value) { - // when numeric values are passed, "value" is a number - return 'foo/' + value * 2; - }, -}); -console.log(numeric); -//=> [ 'foo/2', 'foo/4', 'foo/6', 'foo/8', 'foo/10' ] -``` - -### options.quantifiers - -**Type**: `Boolean` - -**Default**: `undefined` - -**Description**: In regular expressions, quanitifiers can be used to specify how many times a token can be repeated. For example, `a{1,3}` will match the letter `a` one to three times. - -Unfortunately, regex quantifiers happen to share the same syntax as [Bash lists](#lists) - -The `quantifiers` option tells braces to detect when [regex quantifiers](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#quantifiers) are defined in the given pattern, and not to try to expand them as lists. - -**Examples** - -```js -const braces = require('braces'); -console.log(braces('a/b{1,3}/{x,y,z}')); -//=> [ 'a/b(1|3)/(x|y|z)' ] -console.log(braces('a/b{1,3}/{x,y,z}', { quantifiers: true })); -//=> [ 'a/b{1,3}/(x|y|z)' ] -console.log(braces('a/b{1,3}/{x,y,z}', { quantifiers: true, expand: true })); -//=> [ 'a/b{1,3}/x', 'a/b{1,3}/y', 'a/b{1,3}/z' ] -``` - -### options.keepEscaping - -**Type**: `Boolean` - -**Default**: `undefined` - -**Description**: Do not strip backslashes that were used for escaping from the result. - -## What is "brace expansion"? - -Brace expansion is a type of parameter expansion that was made popular by unix shells for generating lists of strings, as well as regex-like matching when used alongside wildcards (globs). - -In addition to "expansion", braces are also used for matching. In other words: - -- [brace expansion](#brace-expansion) is for generating new lists -- [brace matching](#brace-matching) is for filtering existing lists - -
    -More about brace expansion (click to expand) - -There are two main types of brace expansion: - -1. **lists**: which are defined using comma-separated values inside curly braces: `{a,b,c}` -2. **sequences**: which are defined using a starting value and an ending value, separated by two dots: `a{1..3}b`. Optionally, a third argument may be passed to define a "step" or increment to use: `a{1..100..10}b`. These are also sometimes referred to as "ranges". - -Here are some example brace patterns to illustrate how they work: - -**Sets** - -``` -{a,b,c} => a b c -{a,b,c}{1,2} => a1 a2 b1 b2 c1 c2 -``` - -**Sequences** - -``` -{1..9} => 1 2 3 4 5 6 7 8 9 -{4..-4} => 4 3 2 1 0 -1 -2 -3 -4 -{1..20..3} => 1 4 7 10 13 16 19 -{a..j} => a b c d e f g h i j -{j..a} => j i h g f e d c b a -{a..z..3} => a d g j m p s v y -``` - -**Combination** - -Sets and sequences can be mixed together or used along with any other strings. - -``` -{a,b,c}{1..3} => a1 a2 a3 b1 b2 b3 c1 c2 c3 -foo/{a,b,c}/bar => foo/a/bar foo/b/bar foo/c/bar -``` - -The fact that braces can be "expanded" from relatively simple patterns makes them ideal for quickly generating test fixtures, file paths, and similar use cases. - -## Brace matching - -In addition to _expansion_, brace patterns are also useful for performing regular-expression-like matching. - -For example, the pattern `foo/{1..3}/bar` would match any of following strings: - -``` -foo/1/bar -foo/2/bar -foo/3/bar -``` - -But not: - -``` -baz/1/qux -baz/2/qux -baz/3/qux -``` - -Braces can also be combined with [glob patterns](https://github.com/jonschlinkert/micromatch) to perform more advanced wildcard matching. For example, the pattern `*/{1..3}/*` would match any of following strings: - -``` -foo/1/bar -foo/2/bar -foo/3/bar -baz/1/qux -baz/2/qux -baz/3/qux -``` - -## Brace matching pitfalls - -Although brace patterns offer a user-friendly way of matching ranges or sets of strings, there are also some major disadvantages and potential risks you should be aware of. - -### tldr - -**"brace bombs"** - -- brace expansion can eat up a huge amount of processing resources -- as brace patterns increase _linearly in size_, the system resources required to expand the pattern increase exponentially -- users can accidentally (or intentially) exhaust your system's resources resulting in the equivalent of a DoS attack (bonus: no programming knowledge is required!) - -For a more detailed explanation with examples, see the [geometric complexity](#geometric-complexity) section. - -### The solution - -Jump to the [performance section](#performance) to see how Braces solves this problem in comparison to other libraries. - -### Geometric complexity - -At minimum, brace patterns with sets limited to two elements have quadradic or `O(n^2)` complexity. But the complexity of the algorithm increases exponentially as the number of sets, _and elements per set_, increases, which is `O(n^c)`. - -For example, the following sets demonstrate quadratic (`O(n^2)`) complexity: - -``` -{1,2}{3,4} => (2X2) => 13 14 23 24 -{1,2}{3,4}{5,6} => (2X2X2) => 135 136 145 146 235 236 245 246 -``` - -But add an element to a set, and we get a n-fold Cartesian product with `O(n^c)` complexity: - -``` -{1,2,3}{4,5,6}{7,8,9} => (3X3X3) => 147 148 149 157 158 159 167 168 169 247 248 - 249 257 258 259 267 268 269 347 348 349 357 - 358 359 367 368 369 -``` - -Now, imagine how this complexity grows given that each element is a n-tuple: - -``` -{1..100}{1..100} => (100X100) => 10,000 elements (38.4 kB) -{1..100}{1..100}{1..100} => (100X100X100) => 1,000,000 elements (5.76 MB) -``` - -Although these examples are clearly contrived, they demonstrate how brace patterns can quickly grow out of control. - -**More information** - -Interested in learning more about brace expansion? - -- [linuxjournal/bash-brace-expansion](http://www.linuxjournal.com/content/bash-brace-expansion) -- [rosettacode/Brace_expansion](https://rosettacode.org/wiki/Brace_expansion) -- [cartesian product](https://en.wikipedia.org/wiki/Cartesian_product) - -
    - -## Performance - -Braces is not only screaming fast, it's also more accurate the other brace expansion libraries. - -### Better algorithms - -Fortunately there is a solution to the ["brace bomb" problem](#brace-matching-pitfalls): _don't expand brace patterns into an array when they're used for matching_. - -Instead, convert the pattern into an optimized regular expression. This is easier said than done, and braces is the only library that does this currently. - -**The proof is in the numbers** - -Minimatch gets exponentially slower as patterns increase in complexity, braces does not. The following results were generated using `braces()` and `minimatch.braceExpand()`, respectively. - -| **Pattern** | **braces** | **[minimatch][]** | -| --------------------------- | ------------------- | ---------------------------- | -| `{1..9007199254740991}`[^1] | `298 B` (5ms 459μs) | N/A (freezes) | -| `{1..1000000000000000}` | `41 B` (1ms 15μs) | N/A (freezes) | -| `{1..100000000000000}` | `40 B` (890μs) | N/A (freezes) | -| `{1..10000000000000}` | `39 B` (2ms 49μs) | N/A (freezes) | -| `{1..1000000000000}` | `38 B` (608μs) | N/A (freezes) | -| `{1..100000000000}` | `37 B` (397μs) | N/A (freezes) | -| `{1..10000000000}` | `35 B` (983μs) | N/A (freezes) | -| `{1..1000000000}` | `34 B` (798μs) | N/A (freezes) | -| `{1..100000000}` | `33 B` (733μs) | N/A (freezes) | -| `{1..10000000}` | `32 B` (5ms 632μs) | `78.89 MB` (16s 388ms 569μs) | -| `{1..1000000}` | `31 B` (1ms 381μs) | `6.89 MB` (1s 496ms 887μs) | -| `{1..100000}` | `30 B` (950μs) | `588.89 kB` (146ms 921μs) | -| `{1..10000}` | `29 B` (1ms 114μs) | `48.89 kB` (14ms 187μs) | -| `{1..1000}` | `28 B` (760μs) | `3.89 kB` (1ms 453μs) | -| `{1..100}` | `22 B` (345μs) | `291 B` (196μs) | -| `{1..10}` | `10 B` (533μs) | `20 B` (37μs) | -| `{1..3}` | `7 B` (190μs) | `5 B` (27μs) | - -### Faster algorithms - -When you need expansion, braces is still much faster. - -_(the following results were generated using `braces.expand()` and `minimatch.braceExpand()`, respectively)_ - -| **Pattern** | **braces** | **[minimatch][]** | -| --------------- | --------------------------- | ---------------------------- | -| `{1..10000000}` | `78.89 MB` (2s 698ms 642μs) | `78.89 MB` (18s 601ms 974μs) | -| `{1..1000000}` | `6.89 MB` (458ms 576μs) | `6.89 MB` (1s 491ms 621μs) | -| `{1..100000}` | `588.89 kB` (20ms 728μs) | `588.89 kB` (156ms 919μs) | -| `{1..10000}` | `48.89 kB` (2ms 202μs) | `48.89 kB` (13ms 641μs) | -| `{1..1000}` | `3.89 kB` (1ms 796μs) | `3.89 kB` (1ms 958μs) | -| `{1..100}` | `291 B` (424μs) | `291 B` (211μs) | -| `{1..10}` | `20 B` (487μs) | `20 B` (72μs) | -| `{1..3}` | `5 B` (166μs) | `5 B` (27μs) | - -If you'd like to run these comparisons yourself, see [test/support/generate.js](test/support/generate.js). - -## Benchmarks - -### Running benchmarks - -Install dev dependencies: - -```bash -npm i -d && npm benchmark -``` - -### Latest results - -Braces is more accurate, without sacrificing performance. - -```bash -● expand - range (expanded) - braces x 53,167 ops/sec ±0.12% (102 runs sampled) - minimatch x 11,378 ops/sec ±0.10% (102 runs sampled) -● expand - range (optimized for regex) - braces x 373,442 ops/sec ±0.04% (100 runs sampled) - minimatch x 3,262 ops/sec ±0.18% (100 runs sampled) -● expand - nested ranges (expanded) - braces x 33,921 ops/sec ±0.09% (99 runs sampled) - minimatch x 10,855 ops/sec ±0.28% (100 runs sampled) -● expand - nested ranges (optimized for regex) - braces x 287,479 ops/sec ±0.52% (98 runs sampled) - minimatch x 3,219 ops/sec ±0.28% (101 runs sampled) -● expand - set (expanded) - braces x 238,243 ops/sec ±0.19% (97 runs sampled) - minimatch x 538,268 ops/sec ±0.31% (96 runs sampled) -● expand - set (optimized for regex) - braces x 321,844 ops/sec ±0.10% (97 runs sampled) - minimatch x 140,600 ops/sec ±0.15% (100 runs sampled) -● expand - nested sets (expanded) - braces x 165,371 ops/sec ±0.42% (96 runs sampled) - minimatch x 337,720 ops/sec ±0.28% (100 runs sampled) -● expand - nested sets (optimized for regex) - braces x 242,948 ops/sec ±0.12% (99 runs sampled) - minimatch x 87,403 ops/sec ±0.79% (96 runs sampled) -``` - -## About - -
    -Contributing - -Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). - -
    - -
    -Running Tests - -Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: - -```sh -$ npm install && npm test -``` - -
    - -
    -Building docs - -_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ - -To generate the readme, run the following command: - -```sh -$ npm install -g verbose/verb#dev verb-generate-readme && verb -``` - -
    - -### Contributors - -| **Commits** | **Contributor** | -| ----------- | ------------------------------------------------------------- | -| 197 | [jonschlinkert](https://github.com/jonschlinkert) | -| 4 | [doowb](https://github.com/doowb) | -| 1 | [es128](https://github.com/es128) | -| 1 | [eush77](https://github.com/eush77) | -| 1 | [hemanth](https://github.com/hemanth) | -| 1 | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) | - -### Author - -**Jon Schlinkert** - -- [GitHub Profile](https://github.com/jonschlinkert) -- [Twitter Profile](https://twitter.com/jonschlinkert) -- [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) - -### License - -Copyright © 2019, [Jon Schlinkert](https://github.com/jonschlinkert). -Released under the [MIT License](LICENSE). - ---- - -_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on April 08, 2019._ diff --git a/node_modules/braces/index.js b/node_modules/braces/index.js deleted file mode 100644 index d222c13..0000000 --- a/node_modules/braces/index.js +++ /dev/null @@ -1,170 +0,0 @@ -'use strict'; - -const stringify = require('./lib/stringify'); -const compile = require('./lib/compile'); -const expand = require('./lib/expand'); -const parse = require('./lib/parse'); - -/** - * Expand the given pattern or create a regex-compatible string. - * - * ```js - * const braces = require('braces'); - * console.log(braces('{a,b,c}', { compile: true })); //=> ['(a|b|c)'] - * console.log(braces('{a,b,c}')); //=> ['a', 'b', 'c'] - * ``` - * @param {String} `str` - * @param {Object} `options` - * @return {String} - * @api public - */ - -const braces = (input, options = {}) => { - let output = []; - - if (Array.isArray(input)) { - for (const pattern of input) { - const result = braces.create(pattern, options); - if (Array.isArray(result)) { - output.push(...result); - } else { - output.push(result); - } - } - } else { - output = [].concat(braces.create(input, options)); - } - - if (options && options.expand === true && options.nodupes === true) { - output = [...new Set(output)]; - } - return output; -}; - -/** - * Parse the given `str` with the given `options`. - * - * ```js - * // braces.parse(pattern, [, options]); - * const ast = braces.parse('a/{b,c}/d'); - * console.log(ast); - * ``` - * @param {String} pattern Brace pattern to parse - * @param {Object} options - * @return {Object} Returns an AST - * @api public - */ - -braces.parse = (input, options = {}) => parse(input, options); - -/** - * Creates a braces string from an AST, or an AST node. - * - * ```js - * const braces = require('braces'); - * let ast = braces.parse('foo/{a,b}/bar'); - * console.log(stringify(ast.nodes[2])); //=> '{a,b}' - * ``` - * @param {String} `input` Brace pattern or AST. - * @param {Object} `options` - * @return {Array} Returns an array of expanded values. - * @api public - */ - -braces.stringify = (input, options = {}) => { - if (typeof input === 'string') { - return stringify(braces.parse(input, options), options); - } - return stringify(input, options); -}; - -/** - * Compiles a brace pattern into a regex-compatible, optimized string. - * This method is called by the main [braces](#braces) function by default. - * - * ```js - * const braces = require('braces'); - * console.log(braces.compile('a/{b,c}/d')); - * //=> ['a/(b|c)/d'] - * ``` - * @param {String} `input` Brace pattern or AST. - * @param {Object} `options` - * @return {Array} Returns an array of expanded values. - * @api public - */ - -braces.compile = (input, options = {}) => { - if (typeof input === 'string') { - input = braces.parse(input, options); - } - return compile(input, options); -}; - -/** - * Expands a brace pattern into an array. This method is called by the - * main [braces](#braces) function when `options.expand` is true. Before - * using this method it's recommended that you read the [performance notes](#performance)) - * and advantages of using [.compile](#compile) instead. - * - * ```js - * const braces = require('braces'); - * console.log(braces.expand('a/{b,c}/d')); - * //=> ['a/b/d', 'a/c/d']; - * ``` - * @param {String} `pattern` Brace pattern - * @param {Object} `options` - * @return {Array} Returns an array of expanded values. - * @api public - */ - -braces.expand = (input, options = {}) => { - if (typeof input === 'string') { - input = braces.parse(input, options); - } - - let result = expand(input, options); - - // filter out empty strings if specified - if (options.noempty === true) { - result = result.filter(Boolean); - } - - // filter out duplicates if specified - if (options.nodupes === true) { - result = [...new Set(result)]; - } - - return result; -}; - -/** - * Processes a brace pattern and returns either an expanded array - * (if `options.expand` is true), a highly optimized regex-compatible string. - * This method is called by the main [braces](#braces) function. - * - * ```js - * const braces = require('braces'); - * console.log(braces.create('user-{200..300}/project-{a,b,c}-{1..10}')) - * //=> 'user-(20[0-9]|2[1-9][0-9]|300)/project-(a|b|c)-([1-9]|10)' - * ``` - * @param {String} `pattern` Brace pattern - * @param {Object} `options` - * @return {Array} Returns an array of expanded values. - * @api public - */ - -braces.create = (input, options = {}) => { - if (input === '' || input.length < 3) { - return [input]; - } - - return options.expand !== true - ? braces.compile(input, options) - : braces.expand(input, options); -}; - -/** - * Expose "braces" - */ - -module.exports = braces; diff --git a/node_modules/braces/lib/compile.js b/node_modules/braces/lib/compile.js deleted file mode 100644 index dce69be..0000000 --- a/node_modules/braces/lib/compile.js +++ /dev/null @@ -1,60 +0,0 @@ -'use strict'; - -const fill = require('fill-range'); -const utils = require('./utils'); - -const compile = (ast, options = {}) => { - const walk = (node, parent = {}) => { - const invalidBlock = utils.isInvalidBrace(parent); - const invalidNode = node.invalid === true && options.escapeInvalid === true; - const invalid = invalidBlock === true || invalidNode === true; - const prefix = options.escapeInvalid === true ? '\\' : ''; - let output = ''; - - if (node.isOpen === true) { - return prefix + node.value; - } - - if (node.isClose === true) { - console.log('node.isClose', prefix, node.value); - return prefix + node.value; - } - - if (node.type === 'open') { - return invalid ? prefix + node.value : '('; - } - - if (node.type === 'close') { - return invalid ? prefix + node.value : ')'; - } - - if (node.type === 'comma') { - return node.prev.type === 'comma' ? '' : invalid ? node.value : '|'; - } - - if (node.value) { - return node.value; - } - - if (node.nodes && node.ranges > 0) { - const args = utils.reduce(node.nodes); - const range = fill(...args, { ...options, wrap: false, toRegex: true, strictZeros: true }); - - if (range.length !== 0) { - return args.length > 1 && range.length > 1 ? `(${range})` : range; - } - } - - if (node.nodes) { - for (const child of node.nodes) { - output += walk(child, node); - } - } - - return output; - }; - - return walk(ast); -}; - -module.exports = compile; diff --git a/node_modules/braces/lib/constants.js b/node_modules/braces/lib/constants.js deleted file mode 100644 index 2bb3b88..0000000 --- a/node_modules/braces/lib/constants.js +++ /dev/null @@ -1,57 +0,0 @@ -'use strict'; - -module.exports = { - MAX_LENGTH: 10000, - - // Digits - CHAR_0: '0', /* 0 */ - CHAR_9: '9', /* 9 */ - - // Alphabet chars. - CHAR_UPPERCASE_A: 'A', /* A */ - CHAR_LOWERCASE_A: 'a', /* a */ - CHAR_UPPERCASE_Z: 'Z', /* Z */ - CHAR_LOWERCASE_Z: 'z', /* z */ - - CHAR_LEFT_PARENTHESES: '(', /* ( */ - CHAR_RIGHT_PARENTHESES: ')', /* ) */ - - CHAR_ASTERISK: '*', /* * */ - - // Non-alphabetic chars. - CHAR_AMPERSAND: '&', /* & */ - CHAR_AT: '@', /* @ */ - CHAR_BACKSLASH: '\\', /* \ */ - CHAR_BACKTICK: '`', /* ` */ - CHAR_CARRIAGE_RETURN: '\r', /* \r */ - CHAR_CIRCUMFLEX_ACCENT: '^', /* ^ */ - CHAR_COLON: ':', /* : */ - CHAR_COMMA: ',', /* , */ - CHAR_DOLLAR: '$', /* . */ - CHAR_DOT: '.', /* . */ - CHAR_DOUBLE_QUOTE: '"', /* " */ - CHAR_EQUAL: '=', /* = */ - CHAR_EXCLAMATION_MARK: '!', /* ! */ - CHAR_FORM_FEED: '\f', /* \f */ - CHAR_FORWARD_SLASH: '/', /* / */ - CHAR_HASH: '#', /* # */ - CHAR_HYPHEN_MINUS: '-', /* - */ - CHAR_LEFT_ANGLE_BRACKET: '<', /* < */ - CHAR_LEFT_CURLY_BRACE: '{', /* { */ - CHAR_LEFT_SQUARE_BRACKET: '[', /* [ */ - CHAR_LINE_FEED: '\n', /* \n */ - CHAR_NO_BREAK_SPACE: '\u00A0', /* \u00A0 */ - CHAR_PERCENT: '%', /* % */ - CHAR_PLUS: '+', /* + */ - CHAR_QUESTION_MARK: '?', /* ? */ - CHAR_RIGHT_ANGLE_BRACKET: '>', /* > */ - CHAR_RIGHT_CURLY_BRACE: '}', /* } */ - CHAR_RIGHT_SQUARE_BRACKET: ']', /* ] */ - CHAR_SEMICOLON: ';', /* ; */ - CHAR_SINGLE_QUOTE: '\'', /* ' */ - CHAR_SPACE: ' ', /* */ - CHAR_TAB: '\t', /* \t */ - CHAR_UNDERSCORE: '_', /* _ */ - CHAR_VERTICAL_LINE: '|', /* | */ - CHAR_ZERO_WIDTH_NOBREAK_SPACE: '\uFEFF' /* \uFEFF */ -}; diff --git a/node_modules/braces/lib/expand.js b/node_modules/braces/lib/expand.js deleted file mode 100644 index 35b2c41..0000000 --- a/node_modules/braces/lib/expand.js +++ /dev/null @@ -1,113 +0,0 @@ -'use strict'; - -const fill = require('fill-range'); -const stringify = require('./stringify'); -const utils = require('./utils'); - -const append = (queue = '', stash = '', enclose = false) => { - const result = []; - - queue = [].concat(queue); - stash = [].concat(stash); - - if (!stash.length) return queue; - if (!queue.length) { - return enclose ? utils.flatten(stash).map(ele => `{${ele}}`) : stash; - } - - for (const item of queue) { - if (Array.isArray(item)) { - for (const value of item) { - result.push(append(value, stash, enclose)); - } - } else { - for (let ele of stash) { - if (enclose === true && typeof ele === 'string') ele = `{${ele}}`; - result.push(Array.isArray(ele) ? append(item, ele, enclose) : item + ele); - } - } - } - return utils.flatten(result); -}; - -const expand = (ast, options = {}) => { - const rangeLimit = options.rangeLimit === undefined ? 1000 : options.rangeLimit; - - const walk = (node, parent = {}) => { - node.queue = []; - - let p = parent; - let q = parent.queue; - - while (p.type !== 'brace' && p.type !== 'root' && p.parent) { - p = p.parent; - q = p.queue; - } - - if (node.invalid || node.dollar) { - q.push(append(q.pop(), stringify(node, options))); - return; - } - - if (node.type === 'brace' && node.invalid !== true && node.nodes.length === 2) { - q.push(append(q.pop(), ['{}'])); - return; - } - - if (node.nodes && node.ranges > 0) { - const args = utils.reduce(node.nodes); - - if (utils.exceedsLimit(...args, options.step, rangeLimit)) { - throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.'); - } - - let range = fill(...args, options); - if (range.length === 0) { - range = stringify(node, options); - } - - q.push(append(q.pop(), range)); - node.nodes = []; - return; - } - - const enclose = utils.encloseBrace(node); - let queue = node.queue; - let block = node; - - while (block.type !== 'brace' && block.type !== 'root' && block.parent) { - block = block.parent; - queue = block.queue; - } - - for (let i = 0; i < node.nodes.length; i++) { - const child = node.nodes[i]; - - if (child.type === 'comma' && node.type === 'brace') { - if (i === 1) queue.push(''); - queue.push(''); - continue; - } - - if (child.type === 'close') { - q.push(append(q.pop(), queue, enclose)); - continue; - } - - if (child.value && child.type !== 'open') { - queue.push(append(queue.pop(), child.value)); - continue; - } - - if (child.nodes) { - walk(child, node); - } - } - - return queue; - }; - - return utils.flatten(walk(ast)); -}; - -module.exports = expand; diff --git a/node_modules/braces/lib/parse.js b/node_modules/braces/lib/parse.js deleted file mode 100644 index 3a6988e..0000000 --- a/node_modules/braces/lib/parse.js +++ /dev/null @@ -1,331 +0,0 @@ -'use strict'; - -const stringify = require('./stringify'); - -/** - * Constants - */ - -const { - MAX_LENGTH, - CHAR_BACKSLASH, /* \ */ - CHAR_BACKTICK, /* ` */ - CHAR_COMMA, /* , */ - CHAR_DOT, /* . */ - CHAR_LEFT_PARENTHESES, /* ( */ - CHAR_RIGHT_PARENTHESES, /* ) */ - CHAR_LEFT_CURLY_BRACE, /* { */ - CHAR_RIGHT_CURLY_BRACE, /* } */ - CHAR_LEFT_SQUARE_BRACKET, /* [ */ - CHAR_RIGHT_SQUARE_BRACKET, /* ] */ - CHAR_DOUBLE_QUOTE, /* " */ - CHAR_SINGLE_QUOTE, /* ' */ - CHAR_NO_BREAK_SPACE, - CHAR_ZERO_WIDTH_NOBREAK_SPACE -} = require('./constants'); - -/** - * parse - */ - -const parse = (input, options = {}) => { - if (typeof input !== 'string') { - throw new TypeError('Expected a string'); - } - - const opts = options || {}; - const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; - if (input.length > max) { - throw new SyntaxError(`Input length (${input.length}), exceeds max characters (${max})`); - } - - const ast = { type: 'root', input, nodes: [] }; - const stack = [ast]; - let block = ast; - let prev = ast; - let brackets = 0; - const length = input.length; - let index = 0; - let depth = 0; - let value; - - /** - * Helpers - */ - - const advance = () => input[index++]; - const push = node => { - if (node.type === 'text' && prev.type === 'dot') { - prev.type = 'text'; - } - - if (prev && prev.type === 'text' && node.type === 'text') { - prev.value += node.value; - return; - } - - block.nodes.push(node); - node.parent = block; - node.prev = prev; - prev = node; - return node; - }; - - push({ type: 'bos' }); - - while (index < length) { - block = stack[stack.length - 1]; - value = advance(); - - /** - * Invalid chars - */ - - if (value === CHAR_ZERO_WIDTH_NOBREAK_SPACE || value === CHAR_NO_BREAK_SPACE) { - continue; - } - - /** - * Escaped chars - */ - - if (value === CHAR_BACKSLASH) { - push({ type: 'text', value: (options.keepEscaping ? value : '') + advance() }); - continue; - } - - /** - * Right square bracket (literal): ']' - */ - - if (value === CHAR_RIGHT_SQUARE_BRACKET) { - push({ type: 'text', value: '\\' + value }); - continue; - } - - /** - * Left square bracket: '[' - */ - - if (value === CHAR_LEFT_SQUARE_BRACKET) { - brackets++; - - let next; - - while (index < length && (next = advance())) { - value += next; - - if (next === CHAR_LEFT_SQUARE_BRACKET) { - brackets++; - continue; - } - - if (next === CHAR_BACKSLASH) { - value += advance(); - continue; - } - - if (next === CHAR_RIGHT_SQUARE_BRACKET) { - brackets--; - - if (brackets === 0) { - break; - } - } - } - - push({ type: 'text', value }); - continue; - } - - /** - * Parentheses - */ - - if (value === CHAR_LEFT_PARENTHESES) { - block = push({ type: 'paren', nodes: [] }); - stack.push(block); - push({ type: 'text', value }); - continue; - } - - if (value === CHAR_RIGHT_PARENTHESES) { - if (block.type !== 'paren') { - push({ type: 'text', value }); - continue; - } - block = stack.pop(); - push({ type: 'text', value }); - block = stack[stack.length - 1]; - continue; - } - - /** - * Quotes: '|"|` - */ - - if (value === CHAR_DOUBLE_QUOTE || value === CHAR_SINGLE_QUOTE || value === CHAR_BACKTICK) { - const open = value; - let next; - - if (options.keepQuotes !== true) { - value = ''; - } - - while (index < length && (next = advance())) { - if (next === CHAR_BACKSLASH) { - value += next + advance(); - continue; - } - - if (next === open) { - if (options.keepQuotes === true) value += next; - break; - } - - value += next; - } - - push({ type: 'text', value }); - continue; - } - - /** - * Left curly brace: '{' - */ - - if (value === CHAR_LEFT_CURLY_BRACE) { - depth++; - - const dollar = prev.value && prev.value.slice(-1) === '$' || block.dollar === true; - const brace = { - type: 'brace', - open: true, - close: false, - dollar, - depth, - commas: 0, - ranges: 0, - nodes: [] - }; - - block = push(brace); - stack.push(block); - push({ type: 'open', value }); - continue; - } - - /** - * Right curly brace: '}' - */ - - if (value === CHAR_RIGHT_CURLY_BRACE) { - if (block.type !== 'brace') { - push({ type: 'text', value }); - continue; - } - - const type = 'close'; - block = stack.pop(); - block.close = true; - - push({ type, value }); - depth--; - - block = stack[stack.length - 1]; - continue; - } - - /** - * Comma: ',' - */ - - if (value === CHAR_COMMA && depth > 0) { - if (block.ranges > 0) { - block.ranges = 0; - const open = block.nodes.shift(); - block.nodes = [open, { type: 'text', value: stringify(block) }]; - } - - push({ type: 'comma', value }); - block.commas++; - continue; - } - - /** - * Dot: '.' - */ - - if (value === CHAR_DOT && depth > 0 && block.commas === 0) { - const siblings = block.nodes; - - if (depth === 0 || siblings.length === 0) { - push({ type: 'text', value }); - continue; - } - - if (prev.type === 'dot') { - block.range = []; - prev.value += value; - prev.type = 'range'; - - if (block.nodes.length !== 3 && block.nodes.length !== 5) { - block.invalid = true; - block.ranges = 0; - prev.type = 'text'; - continue; - } - - block.ranges++; - block.args = []; - continue; - } - - if (prev.type === 'range') { - siblings.pop(); - - const before = siblings[siblings.length - 1]; - before.value += prev.value + value; - prev = before; - block.ranges--; - continue; - } - - push({ type: 'dot', value }); - continue; - } - - /** - * Text - */ - - push({ type: 'text', value }); - } - - // Mark imbalanced braces and brackets as invalid - do { - block = stack.pop(); - - if (block.type !== 'root') { - block.nodes.forEach(node => { - if (!node.nodes) { - if (node.type === 'open') node.isOpen = true; - if (node.type === 'close') node.isClose = true; - if (!node.nodes) node.type = 'text'; - node.invalid = true; - } - }); - - // get the location of the block on parent.nodes (block's siblings) - const parent = stack[stack.length - 1]; - const index = parent.nodes.indexOf(block); - // replace the (invalid) block with it's nodes - parent.nodes.splice(index, 1, ...block.nodes); - } - } while (stack.length > 0); - - push({ type: 'eos' }); - return ast; -}; - -module.exports = parse; diff --git a/node_modules/braces/lib/stringify.js b/node_modules/braces/lib/stringify.js deleted file mode 100644 index 8bcf872..0000000 --- a/node_modules/braces/lib/stringify.js +++ /dev/null @@ -1,32 +0,0 @@ -'use strict'; - -const utils = require('./utils'); - -module.exports = (ast, options = {}) => { - const stringify = (node, parent = {}) => { - const invalidBlock = options.escapeInvalid && utils.isInvalidBrace(parent); - const invalidNode = node.invalid === true && options.escapeInvalid === true; - let output = ''; - - if (node.value) { - if ((invalidBlock || invalidNode) && utils.isOpenOrClose(node)) { - return '\\' + node.value; - } - return node.value; - } - - if (node.value) { - return node.value; - } - - if (node.nodes) { - for (const child of node.nodes) { - output += stringify(child); - } - } - return output; - }; - - return stringify(ast); -}; - diff --git a/node_modules/braces/lib/utils.js b/node_modules/braces/lib/utils.js deleted file mode 100644 index d19311f..0000000 --- a/node_modules/braces/lib/utils.js +++ /dev/null @@ -1,122 +0,0 @@ -'use strict'; - -exports.isInteger = num => { - if (typeof num === 'number') { - return Number.isInteger(num); - } - if (typeof num === 'string' && num.trim() !== '') { - return Number.isInteger(Number(num)); - } - return false; -}; - -/** - * Find a node of the given type - */ - -exports.find = (node, type) => node.nodes.find(node => node.type === type); - -/** - * Find a node of the given type - */ - -exports.exceedsLimit = (min, max, step = 1, limit) => { - if (limit === false) return false; - if (!exports.isInteger(min) || !exports.isInteger(max)) return false; - return ((Number(max) - Number(min)) / Number(step)) >= limit; -}; - -/** - * Escape the given node with '\\' before node.value - */ - -exports.escapeNode = (block, n = 0, type) => { - const node = block.nodes[n]; - if (!node) return; - - if ((type && node.type === type) || node.type === 'open' || node.type === 'close') { - if (node.escaped !== true) { - node.value = '\\' + node.value; - node.escaped = true; - } - } -}; - -/** - * Returns true if the given brace node should be enclosed in literal braces - */ - -exports.encloseBrace = node => { - if (node.type !== 'brace') return false; - if ((node.commas >> 0 + node.ranges >> 0) === 0) { - node.invalid = true; - return true; - } - return false; -}; - -/** - * Returns true if a brace node is invalid. - */ - -exports.isInvalidBrace = block => { - if (block.type !== 'brace') return false; - if (block.invalid === true || block.dollar) return true; - if ((block.commas >> 0 + block.ranges >> 0) === 0) { - block.invalid = true; - return true; - } - if (block.open !== true || block.close !== true) { - block.invalid = true; - return true; - } - return false; -}; - -/** - * Returns true if a node is an open or close node - */ - -exports.isOpenOrClose = node => { - if (node.type === 'open' || node.type === 'close') { - return true; - } - return node.open === true || node.close === true; -}; - -/** - * Reduce an array of text nodes. - */ - -exports.reduce = nodes => nodes.reduce((acc, node) => { - if (node.type === 'text') acc.push(node.value); - if (node.type === 'range') node.type = 'text'; - return acc; -}, []); - -/** - * Flatten an array - */ - -exports.flatten = (...args) => { - const result = []; - - const flat = arr => { - for (let i = 0; i < arr.length; i++) { - const ele = arr[i]; - - if (Array.isArray(ele)) { - flat(ele); - continue; - } - - if (ele !== undefined) { - result.push(ele); - } - } - return result; - }; - - flat(args); - return result; -}; diff --git a/node_modules/braces/package.json b/node_modules/braces/package.json deleted file mode 100644 index c3c056e..0000000 --- a/node_modules/braces/package.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "name": "braces", - "description": "Bash-like brace expansion, implemented in JavaScript. Safer than other brace expansion libs, with complete support for the Bash 4.3 braces specification, without sacrificing speed.", - "version": "3.0.3", - "homepage": "https://github.com/micromatch/braces", - "author": "Jon Schlinkert (https://github.com/jonschlinkert)", - "contributors": [ - "Brian Woodward (https://twitter.com/doowb)", - "Elan Shanker (https://github.com/es128)", - "Eugene Sharygin (https://github.com/eush77)", - "hemanth.hm (http://h3manth.com)", - "Jon Schlinkert (http://twitter.com/jonschlinkert)" - ], - "repository": "micromatch/braces", - "bugs": { - "url": "https://github.com/micromatch/braces/issues" - }, - "license": "MIT", - "files": [ - "index.js", - "lib" - ], - "main": "index.js", - "engines": { - "node": ">=8" - }, - "scripts": { - "test": "mocha", - "benchmark": "node benchmark" - }, - "dependencies": { - "fill-range": "^7.1.1" - }, - "devDependencies": { - "ansi-colors": "^3.2.4", - "bash-path": "^2.0.1", - "gulp-format-md": "^2.0.0", - "mocha": "^6.1.1" - }, - "keywords": [ - "alpha", - "alphabetical", - "bash", - "brace", - "braces", - "expand", - "expansion", - "filepath", - "fill", - "fs", - "glob", - "globbing", - "letter", - "match", - "matches", - "matching", - "number", - "numerical", - "path", - "range", - "ranges", - "sh" - ], - "verb": { - "toc": false, - "layout": "default", - "tasks": [ - "readme" - ], - "lint": { - "reflinks": true - }, - "plugins": [ - "gulp-format-md" - ] - } -} diff --git a/node_modules/camelcase-css/README.md b/node_modules/camelcase-css/README.md deleted file mode 100644 index caaa817..0000000 --- a/node_modules/camelcase-css/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# camelcase-css [![NPM Version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] - -> Convert a kebab-cased CSS property into a camelCased DOM property. - - -## Installation -[Node.js](http://nodejs.org/) `>= 6` is required. Type this at the command line: -```shell -npm install camelcase-css -``` - - -## Usage -```js -const camelCaseCSS = require('camelcase-css'); - -camelCaseCSS('-webkit-border-radius'); //-> WebkitBorderRadius -camelCaseCSS('-moz-border-radius'); //-> MozBorderRadius -camelCaseCSS('-ms-border-radius'); //-> msBorderRadius -camelCaseCSS('border-radius'); //-> borderRadius -``` - - -[npm-image]: https://img.shields.io/npm/v/camelcase-css.svg -[npm-url]: https://npmjs.org/package/camelcase-css -[travis-image]: https://img.shields.io/travis/stevenvachon/camelcase-css.svg -[travis-url]: https://travis-ci.org/stevenvachon/camelcase-css diff --git a/node_modules/camelcase-css/index-es5.js b/node_modules/camelcase-css/index-es5.js deleted file mode 100644 index 48ef078..0000000 --- a/node_modules/camelcase-css/index-es5.js +++ /dev/null @@ -1,24 +0,0 @@ -"use strict"; - -var pattern = /-(\w|$)/g; - -var callback = function callback(dashChar, char) { - return char.toUpperCase(); -}; - -var camelCaseCSS = function camelCaseCSS(property) { - property = property.toLowerCase(); - - // NOTE :: IE8's "styleFloat" is intentionally not supported - if (property === "float") { - return "cssFloat"; - } - // Microsoft vendor-prefixes are uniquely cased - else if (property.charCodeAt(0) === 45&& property.charCodeAt(1) === 109&& property.charCodeAt(2) === 115&& property.charCodeAt(3) === 45) { - return property.substr(1).replace(pattern, callback); - } else { - return property.replace(pattern, callback); - } -}; - -module.exports = camelCaseCSS; diff --git a/node_modules/camelcase-css/index.js b/node_modules/camelcase-css/index.js deleted file mode 100644 index c9d1f1b..0000000 --- a/node_modules/camelcase-css/index.js +++ /dev/null @@ -1,30 +0,0 @@ -"use strict"; -const pattern = /-(\w|$)/g; - -const callback = (dashChar, char) => char.toUpperCase(); - - - -const camelCaseCSS = property => -{ - property = property.toLowerCase(); - - // NOTE :: IE8's "styleFloat" is intentionally not supported - if (property === "float") - { - return "cssFloat"; - } - // Microsoft vendor-prefixes are uniquely cased - else if (property.startsWith("-ms-")) - { - return property.substr(1).replace(pattern, callback); - } - else - { - return property.replace(pattern, callback); - } -}; - - - -module.exports = camelCaseCSS; diff --git a/node_modules/camelcase-css/license b/node_modules/camelcase-css/license deleted file mode 100644 index b760007..0000000 --- a/node_modules/camelcase-css/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Steven Vachon (svachon.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/node_modules/camelcase-css/package.json b/node_modules/camelcase-css/package.json deleted file mode 100644 index 61dc51a..0000000 --- a/node_modules/camelcase-css/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "camelcase-css", - "description": "Convert a kebab-cased CSS property into a camelCased DOM property.", - "version": "2.0.1", - "license": "MIT", - "author": "Steven Vachon (https://www.svachon.com/)", - "repository": "stevenvachon/camelcase-css", - "browser": "index-es5.js", - "devDependencies": { - "babel-cli": "^6.26.0", - "babel-core": "^6.26.3", - "babel-plugin-optimize-starts-with": "^1.0.1", - "babel-preset-env": "^1.7.0", - "chai": "^4.1.2", - "mocha": "^5.2.0" - }, - "engines": { - "node": ">= 6" - }, - "scripts": { - "pretest": "babel index.js --out-file=index-es5.js --presets=env --plugins=optimize-starts-with", - "test": "mocha test.js --check-leaks --bail" - }, - "files": [ - "index.js", - "index-es5.js" - ], - "keywords": [ - "camelcase", - "case", - "css", - "dom" - ] -} diff --git a/node_modules/camelcase/index.d.ts b/node_modules/camelcase/index.d.ts deleted file mode 100644 index 58f2069..0000000 --- a/node_modules/camelcase/index.d.ts +++ /dev/null @@ -1,63 +0,0 @@ -declare namespace camelcase { - interface Options { - /** - Uppercase the first character: `foo-bar` → `FooBar`. - - @default false - */ - readonly pascalCase?: boolean; - } -} - -declare const camelcase: { - /** - Convert a dash/dot/underscore/space separated string to camelCase or PascalCase: `foo-bar` → `fooBar`. - - @param input - String to convert to camel case. - - @example - ``` - import camelCase = require('camelcase'); - - camelCase('foo-bar'); - //=> 'fooBar' - - camelCase('foo_bar'); - //=> 'fooBar' - - camelCase('Foo-Bar'); - //=> 'fooBar' - - camelCase('Foo-Bar', {pascalCase: true}); - //=> 'FooBar' - - camelCase('--foo.bar', {pascalCase: false}); - //=> 'fooBar' - - camelCase('foo bar'); - //=> 'fooBar' - - console.log(process.argv[3]); - //=> '--foo-bar' - camelCase(process.argv[3]); - //=> 'fooBar' - - camelCase(['foo', 'bar']); - //=> 'fooBar' - - camelCase(['__foo__', '--bar'], {pascalCase: true}); - //=> 'FooBar' - ``` - */ - (input: string | ReadonlyArray, options?: camelcase.Options): string; - - // TODO: Remove this for the next major release, refactor the whole definition to: - // declare function camelcase( - // input: string | ReadonlyArray, - // options?: camelcase.Options - // ): string; - // export = camelcase; - default: typeof camelcase; -}; - -export = camelcase; diff --git a/node_modules/camelcase/index.js b/node_modules/camelcase/index.js deleted file mode 100644 index 579f99b..0000000 --- a/node_modules/camelcase/index.js +++ /dev/null @@ -1,76 +0,0 @@ -'use strict'; - -const preserveCamelCase = string => { - let isLastCharLower = false; - let isLastCharUpper = false; - let isLastLastCharUpper = false; - - for (let i = 0; i < string.length; i++) { - const character = string[i]; - - if (isLastCharLower && /[a-zA-Z]/.test(character) && character.toUpperCase() === character) { - string = string.slice(0, i) + '-' + string.slice(i); - isLastCharLower = false; - isLastLastCharUpper = isLastCharUpper; - isLastCharUpper = true; - i++; - } else if (isLastCharUpper && isLastLastCharUpper && /[a-zA-Z]/.test(character) && character.toLowerCase() === character) { - string = string.slice(0, i - 1) + '-' + string.slice(i - 1); - isLastLastCharUpper = isLastCharUpper; - isLastCharUpper = false; - isLastCharLower = true; - } else { - isLastCharLower = character.toLowerCase() === character && character.toUpperCase() !== character; - isLastLastCharUpper = isLastCharUpper; - isLastCharUpper = character.toUpperCase() === character && character.toLowerCase() !== character; - } - } - - return string; -}; - -const camelCase = (input, options) => { - if (!(typeof input === 'string' || Array.isArray(input))) { - throw new TypeError('Expected the input to be `string | string[]`'); - } - - options = Object.assign({ - pascalCase: false - }, options); - - const postProcess = x => options.pascalCase ? x.charAt(0).toUpperCase() + x.slice(1) : x; - - if (Array.isArray(input)) { - input = input.map(x => x.trim()) - .filter(x => x.length) - .join('-'); - } else { - input = input.trim(); - } - - if (input.length === 0) { - return ''; - } - - if (input.length === 1) { - return options.pascalCase ? input.toUpperCase() : input.toLowerCase(); - } - - const hasUpperCase = input !== input.toLowerCase(); - - if (hasUpperCase) { - input = preserveCamelCase(input); - } - - input = input - .replace(/^[_.\- ]+/, '') - .toLowerCase() - .replace(/[_.\- ]+(\w|$)/g, (_, p1) => p1.toUpperCase()) - .replace(/\d+(\w|$)/g, m => m.toUpperCase()); - - return postProcess(input); -}; - -module.exports = camelCase; -// TODO: Remove this for the next major release -module.exports.default = camelCase; diff --git a/node_modules/camelcase/license b/node_modules/camelcase/license deleted file mode 100644 index e7af2f7..0000000 --- a/node_modules/camelcase/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/camelcase/package.json b/node_modules/camelcase/package.json deleted file mode 100644 index fbdbaaa..0000000 --- a/node_modules/camelcase/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "camelcase", - "version": "5.3.1", - "description": "Convert a dash/dot/underscore/space separated string to camelCase or PascalCase: `foo-bar` → `fooBar`", - "license": "MIT", - "repository": "sindresorhus/camelcase", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=6" - }, - "scripts": { - "test": "xo && ava && tsd" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "camelcase", - "camel-case", - "camel", - "case", - "dash", - "hyphen", - "dot", - "underscore", - "separator", - "string", - "text", - "convert", - "pascalcase", - "pascal-case" - ], - "devDependencies": { - "ava": "^1.4.1", - "tsd": "^0.7.1", - "xo": "^0.24.0" - } -} diff --git a/node_modules/camelcase/readme.md b/node_modules/camelcase/readme.md deleted file mode 100644 index fde2726..0000000 --- a/node_modules/camelcase/readme.md +++ /dev/null @@ -1,99 +0,0 @@ -# camelcase [![Build Status](https://travis-ci.org/sindresorhus/camelcase.svg?branch=master)](https://travis-ci.org/sindresorhus/camelcase) - -> Convert a dash/dot/underscore/space separated string to camelCase or PascalCase: `foo-bar` → `fooBar` - ---- - -
    - ---- - -## Install - -``` -$ npm install camelcase -``` - - -## Usage - -```js -const camelCase = require('camelcase'); - -camelCase('foo-bar'); -//=> 'fooBar' - -camelCase('foo_bar'); -//=> 'fooBar' - -camelCase('Foo-Bar'); -//=> 'fooBar' - -camelCase('Foo-Bar', {pascalCase: true}); -//=> 'FooBar' - -camelCase('--foo.bar', {pascalCase: false}); -//=> 'fooBar' - -camelCase('foo bar'); -//=> 'fooBar' - -console.log(process.argv[3]); -//=> '--foo-bar' -camelCase(process.argv[3]); -//=> 'fooBar' - -camelCase(['foo', 'bar']); -//=> 'fooBar' - -camelCase(['__foo__', '--bar'], {pascalCase: true}); -//=> 'FooBar' -``` - - -## API - -### camelCase(input, [options]) - -#### input - -Type: `string` `string[]` - -String to convert to camel case. - -#### options - -Type: `Object` - -##### pascalCase - -Type: `boolean`
    -Default: `false` - -Uppercase the first character: `foo-bar` → `FooBar` - - -## Security - -To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure. - - -## Related - -- [decamelize](https://github.com/sindresorhus/decamelize) - The inverse of this module -- [uppercamelcase](https://github.com/SamVerschueren/uppercamelcase) - Like this module, but to PascalCase instead of camelCase -- [titleize](https://github.com/sindresorhus/titleize) - Capitalize every word in string -- [humanize-string](https://github.com/sindresorhus/humanize-string) - Convert a camelized/dasherized/underscored string into a humanized one - - -## License - -MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/cbor-js/LICENSE b/node_modules/cbor-js/LICENSE deleted file mode 100644 index 8957e13..0000000 --- a/node_modules/cbor-js/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Patrick Gansterer - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/node_modules/cbor-js/README.md b/node_modules/cbor-js/README.md deleted file mode 100644 index b98dcba..0000000 --- a/node_modules/cbor-js/README.md +++ /dev/null @@ -1,53 +0,0 @@ -cbor-js -======= - -The Concise Binary Object Representation (CBOR) data format ([RFC 7049](http://tools.ietf.org/html/rfc7049)) implemented in pure JavaScript. - -[![Build Status](https://api.travis-ci.org/paroga/cbor-js.png)](https://travis-ci.org/paroga/cbor-js) -[![Coverage Status](https://coveralls.io/repos/paroga/cbor-js/badge.png?branch=master)](https://coveralls.io/r/paroga/cbor-js?branch=master) -[![Dependency status](https://david-dm.org/paroga/cbor-js/status.png)](https://david-dm.org/paroga/cbor-js#info=dependencies&view=table) -[![Dev Dependency Status](https://david-dm.org/paroga/cbor-js/dev-status.png)](https://david-dm.org/paroga/cbor-js#info=devDependencies&view=table) -[![Selenium Test Status](https://saucelabs.com/buildstatus/paroga-cbor-js)](https://saucelabs.com/u/paroga-cbor-js) - -[![Selenium Test Status](https://saucelabs.com/browser-matrix/paroga-cbor-js.svg)](https://saucelabs.com/u/paroga-cbor-js) - -API ---- - -The `CBOR`-object provides the following two functions: - -CBOR.**decode**(*data*) -> Take the ArrayBuffer object *data* and return it decoded as a JavaScript object. - -CBOR.**encode**(*data*) -> Take the JavaScript object *data* and return it encoded as a ArrayBuffer object. - -Usage ------ - -Include `cbor.js` in your or HTML page: -```html - -``` - -Then you can use it via the `CBOR`-object in your code: -```javascript -var initial = { Hello: "World" }; -var encoded = CBOR.encode(initial); -var decoded = CBOR.decode(encoded); -``` -After running this example `initial` and `decoded` represent the same value. - -### Combination with WebSocket - -The API was designed to play well with the `WebSocket` object in the browser: -```javascript -var websocket = new WebSocket(url); -websocket.binaryType = "arraybuffer"; -... -websocket.onmessage = function(event) { - var message = CBOR.decode(event.data); -}; -... -websocket.send(CBOR.encode(message)); -``` diff --git a/node_modules/cbor-js/cbor.js b/node_modules/cbor-js/cbor.js deleted file mode 100644 index 211ff91..0000000 --- a/node_modules/cbor-js/cbor.js +++ /dev/null @@ -1,406 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2014 Patrick Gansterer - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -(function(global, undefined) { "use strict"; -var POW_2_24 = Math.pow(2, -24), - POW_2_32 = Math.pow(2, 32), - POW_2_53 = Math.pow(2, 53); - -function encode(value) { - var data = new ArrayBuffer(256); - var dataView = new DataView(data); - var lastLength; - var offset = 0; - - function ensureSpace(length) { - var newByteLength = data.byteLength; - var requiredLength = offset + length; - while (newByteLength < requiredLength) - newByteLength *= 2; - if (newByteLength !== data.byteLength) { - var oldDataView = dataView; - data = new ArrayBuffer(newByteLength); - dataView = new DataView(data); - var uint32count = (offset + 3) >> 2; - for (var i = 0; i < uint32count; ++i) - dataView.setUint32(i * 4, oldDataView.getUint32(i * 4)); - } - - lastLength = length; - return dataView; - } - function write() { - offset += lastLength; - } - function writeFloat64(value) { - write(ensureSpace(8).setFloat64(offset, value)); - } - function writeUint8(value) { - write(ensureSpace(1).setUint8(offset, value)); - } - function writeUint8Array(value) { - var dataView = ensureSpace(value.length); - for (var i = 0; i < value.length; ++i) - dataView.setUint8(offset + i, value[i]); - write(); - } - function writeUint16(value) { - write(ensureSpace(2).setUint16(offset, value)); - } - function writeUint32(value) { - write(ensureSpace(4).setUint32(offset, value)); - } - function writeUint64(value) { - var low = value % POW_2_32; - var high = (value - low) / POW_2_32; - var dataView = ensureSpace(8); - dataView.setUint32(offset, high); - dataView.setUint32(offset + 4, low); - write(); - } - function writeTypeAndLength(type, length) { - if (length < 24) { - writeUint8(type << 5 | length); - } else if (length < 0x100) { - writeUint8(type << 5 | 24); - writeUint8(length); - } else if (length < 0x10000) { - writeUint8(type << 5 | 25); - writeUint16(length); - } else if (length < 0x100000000) { - writeUint8(type << 5 | 26); - writeUint32(length); - } else { - writeUint8(type << 5 | 27); - writeUint64(length); - } - } - - function encodeItem(value) { - var i; - - if (value === false) - return writeUint8(0xf4); - if (value === true) - return writeUint8(0xf5); - if (value === null) - return writeUint8(0xf6); - if (value === undefined) - return writeUint8(0xf7); - - switch (typeof value) { - case "number": - if (Math.floor(value) === value) { - if (0 <= value && value <= POW_2_53) - return writeTypeAndLength(0, value); - if (-POW_2_53 <= value && value < 0) - return writeTypeAndLength(1, -(value + 1)); - } - writeUint8(0xfb); - return writeFloat64(value); - - case "string": - var utf8data = []; - for (i = 0; i < value.length; ++i) { - var charCode = value.charCodeAt(i); - if (charCode < 0x80) { - utf8data.push(charCode); - } else if (charCode < 0x800) { - utf8data.push(0xc0 | charCode >> 6); - utf8data.push(0x80 | charCode & 0x3f); - } else if (charCode < 0xd800) { - utf8data.push(0xe0 | charCode >> 12); - utf8data.push(0x80 | (charCode >> 6) & 0x3f); - utf8data.push(0x80 | charCode & 0x3f); - } else { - charCode = (charCode & 0x3ff) << 10; - charCode |= value.charCodeAt(++i) & 0x3ff; - charCode += 0x10000; - - utf8data.push(0xf0 | charCode >> 18); - utf8data.push(0x80 | (charCode >> 12) & 0x3f); - utf8data.push(0x80 | (charCode >> 6) & 0x3f); - utf8data.push(0x80 | charCode & 0x3f); - } - } - - writeTypeAndLength(3, utf8data.length); - return writeUint8Array(utf8data); - - default: - var length; - if (Array.isArray(value)) { - length = value.length; - writeTypeAndLength(4, length); - for (i = 0; i < length; ++i) - encodeItem(value[i]); - } else if (value instanceof Uint8Array) { - writeTypeAndLength(2, value.length); - writeUint8Array(value); - } else { - var keys = Object.keys(value); - length = keys.length; - writeTypeAndLength(5, length); - for (i = 0; i < length; ++i) { - var key = keys[i]; - encodeItem(key); - encodeItem(value[key]); - } - } - } - } - - encodeItem(value); - - if ("slice" in data) - return data.slice(0, offset); - - var ret = new ArrayBuffer(offset); - var retView = new DataView(ret); - for (var i = 0; i < offset; ++i) - retView.setUint8(i, dataView.getUint8(i)); - return ret; -} - -function decode(data, tagger, simpleValue) { - var dataView = new DataView(data); - var offset = 0; - - if (typeof tagger !== "function") - tagger = function(value) { return value; }; - if (typeof simpleValue !== "function") - simpleValue = function() { return undefined; }; - - function read(value, length) { - offset += length; - return value; - } - function readArrayBuffer(length) { - return read(new Uint8Array(data, offset, length), length); - } - function readFloat16() { - var tempArrayBuffer = new ArrayBuffer(4); - var tempDataView = new DataView(tempArrayBuffer); - var value = readUint16(); - - var sign = value & 0x8000; - var exponent = value & 0x7c00; - var fraction = value & 0x03ff; - - if (exponent === 0x7c00) - exponent = 0xff << 10; - else if (exponent !== 0) - exponent += (127 - 15) << 10; - else if (fraction !== 0) - return fraction * POW_2_24; - - tempDataView.setUint32(0, sign << 16 | exponent << 13 | fraction << 13); - return tempDataView.getFloat32(0); - } - function readFloat32() { - return read(dataView.getFloat32(offset), 4); - } - function readFloat64() { - return read(dataView.getFloat64(offset), 8); - } - function readUint8() { - return read(dataView.getUint8(offset), 1); - } - function readUint16() { - return read(dataView.getUint16(offset), 2); - } - function readUint32() { - return read(dataView.getUint32(offset), 4); - } - function readUint64() { - return readUint32() * POW_2_32 + readUint32(); - } - function readBreak() { - if (dataView.getUint8(offset) !== 0xff) - return false; - offset += 1; - return true; - } - function readLength(additionalInformation) { - if (additionalInformation < 24) - return additionalInformation; - if (additionalInformation === 24) - return readUint8(); - if (additionalInformation === 25) - return readUint16(); - if (additionalInformation === 26) - return readUint32(); - if (additionalInformation === 27) - return readUint64(); - if (additionalInformation === 31) - return -1; - throw "Invalid length encoding"; - } - function readIndefiniteStringLength(majorType) { - var initialByte = readUint8(); - if (initialByte === 0xff) - return -1; - var length = readLength(initialByte & 0x1f); - if (length < 0 || (initialByte >> 5) !== majorType) - throw "Invalid indefinite length element"; - return length; - } - - function appendUtf16data(utf16data, length) { - for (var i = 0; i < length; ++i) { - var value = readUint8(); - if (value & 0x80) { - if (value < 0xe0) { - value = (value & 0x1f) << 6 - | (readUint8() & 0x3f); - length -= 1; - } else if (value < 0xf0) { - value = (value & 0x0f) << 12 - | (readUint8() & 0x3f) << 6 - | (readUint8() & 0x3f); - length -= 2; - } else { - value = (value & 0x0f) << 18 - | (readUint8() & 0x3f) << 12 - | (readUint8() & 0x3f) << 6 - | (readUint8() & 0x3f); - length -= 3; - } - } - - if (value < 0x10000) { - utf16data.push(value); - } else { - value -= 0x10000; - utf16data.push(0xd800 | (value >> 10)); - utf16data.push(0xdc00 | (value & 0x3ff)); - } - } - } - - function decodeItem() { - var initialByte = readUint8(); - var majorType = initialByte >> 5; - var additionalInformation = initialByte & 0x1f; - var i; - var length; - - if (majorType === 7) { - switch (additionalInformation) { - case 25: - return readFloat16(); - case 26: - return readFloat32(); - case 27: - return readFloat64(); - } - } - - length = readLength(additionalInformation); - if (length < 0 && (majorType < 2 || 6 < majorType)) - throw "Invalid length"; - - switch (majorType) { - case 0: - return length; - case 1: - return -1 - length; - case 2: - if (length < 0) { - var elements = []; - var fullArrayLength = 0; - while ((length = readIndefiniteStringLength(majorType)) >= 0) { - fullArrayLength += length; - elements.push(readArrayBuffer(length)); - } - var fullArray = new Uint8Array(fullArrayLength); - var fullArrayOffset = 0; - for (i = 0; i < elements.length; ++i) { - fullArray.set(elements[i], fullArrayOffset); - fullArrayOffset += elements[i].length; - } - return fullArray; - } - return readArrayBuffer(length); - case 3: - var utf16data = []; - if (length < 0) { - while ((length = readIndefiniteStringLength(majorType)) >= 0) - appendUtf16data(utf16data, length); - } else - appendUtf16data(utf16data, length); - return String.fromCharCode.apply(null, utf16data); - case 4: - var retArray; - if (length < 0) { - retArray = []; - while (!readBreak()) - retArray.push(decodeItem()); - } else { - retArray = new Array(length); - for (i = 0; i < length; ++i) - retArray[i] = decodeItem(); - } - return retArray; - case 5: - var retObject = {}; - for (i = 0; i < length || length < 0 && !readBreak(); ++i) { - var key = decodeItem(); - retObject[key] = decodeItem(); - } - return retObject; - case 6: - return tagger(decodeItem(), length); - case 7: - switch (length) { - case 20: - return false; - case 21: - return true; - case 22: - return null; - case 23: - return undefined; - default: - return simpleValue(length); - } - } - } - - var ret = decodeItem(); - if (offset !== data.byteLength) - throw "Remaining bytes"; - return ret; -} - -var obj = { encode: encode, decode: decode }; - -if (typeof define === "function" && define.amd) - define("cbor/cbor", obj); -else if (typeof module !== 'undefined' && module.exports) - module.exports = obj; -else if (!global.CBOR) - global.CBOR = obj; - -})(this); diff --git a/node_modules/cbor-js/package.json b/node_modules/cbor-js/package.json deleted file mode 100644 index 36b3a44..0000000 --- a/node_modules/cbor-js/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "cbor-js", - "version": "0.1.0", - "description": "The Concise Binary Object Representation (CBOR) data format (RFC7049) implemented in pure JavaScript.", - "keywords": [ - "cbor" - ], - "homepage": "https://github.com/paroga/cbor-js", - "bugs": "https://github.com/paroga/cbor-js/issues", - "license": "MIT", - "author": "Patrick Gansterer (http://paroga.com/)", - "main": "cbor.js", - "files": [ - "cbor.js" - ], - "repository": { - "type": "git", - "url": "http://github.com/paroga/cbor-js.git" - }, - "scripts": { - "test": "grunt test", - "ci": "grunt ci" - }, - "devDependencies": { - "grunt": "~0.4.5", - "grunt-bower-install-simple": "~1.1.4", - "grunt-cli": "~0.1.13", - "grunt-contrib-compress": "~0.13.0", - "grunt-contrib-connect": "~0.11.2", - "grunt-contrib-jshint": "~0.11.2", - "grunt-contrib-qunit": "~0.7.0", - "grunt-contrib-uglify": "~0.9.1", - "grunt-coveralls": "~1.0.0", - "grunt-qunit-istanbul": "~0.4.7", - "grunt-saucelabs": "~8.6.1" - } -} diff --git a/node_modules/chokidar/LICENSE b/node_modules/chokidar/LICENSE deleted file mode 100644 index fa9162b..0000000 --- a/node_modules/chokidar/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2012-2019 Paul Miller (https://paulmillr.com), Elan Shanker - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/node_modules/chokidar/README.md b/node_modules/chokidar/README.md deleted file mode 100644 index 8e25dec..0000000 --- a/node_modules/chokidar/README.md +++ /dev/null @@ -1,308 +0,0 @@ -# Chokidar [![Weekly downloads](https://img.shields.io/npm/dw/chokidar.svg)](https://github.com/paulmillr/chokidar) [![Yearly downloads](https://img.shields.io/npm/dy/chokidar.svg)](https://github.com/paulmillr/chokidar) - -> Minimal and efficient cross-platform file watching library - -[![NPM](https://nodei.co/npm/chokidar.png)](https://www.npmjs.com/package/chokidar) - -## Why? - -Node.js `fs.watch`: - -* Doesn't report filenames on MacOS. -* Doesn't report events at all when using editors like Sublime on MacOS. -* Often reports events twice. -* Emits most changes as `rename`. -* Does not provide an easy way to recursively watch file trees. -* Does not support recursive watching on Linux. - -Node.js `fs.watchFile`: - -* Almost as bad at event handling. -* Also does not provide any recursive watching. -* Results in high CPU utilization. - -Chokidar resolves these problems. - -Initially made for **[Brunch](https://brunch.io/)** (an ultra-swift web app build tool), it is now used in -[Microsoft's Visual Studio Code](https://github.com/microsoft/vscode), -[gulp](https://github.com/gulpjs/gulp/), -[karma](https://karma-runner.github.io/), -[PM2](https://github.com/Unitech/PM2), -[browserify](http://browserify.org/), -[webpack](https://webpack.github.io/), -[BrowserSync](https://www.browsersync.io/), -and [many others](https://www.npmjs.com/browse/depended/chokidar). -It has proven itself in production environments. - -Version 3 is out! Check out our blog post about it: [Chokidar 3: How to save 32TB of traffic every week](https://paulmillr.com/posts/chokidar-3-save-32tb-of-traffic/) - -## How? - -Chokidar does still rely on the Node.js core `fs` module, but when using -`fs.watch` and `fs.watchFile` for watching, it normalizes the events it -receives, often checking for truth by getting file stats and/or dir contents. - -On MacOS, chokidar by default uses a native extension exposing the Darwin -`FSEvents` API. This provides very efficient recursive watching compared with -implementations like `kqueue` available on most \*nix platforms. Chokidar still -does have to do some work to normalize the events received that way as well. - -On most other platforms, the `fs.watch`-based implementation is the default, which -avoids polling and keeps CPU usage down. Be advised that chokidar will initiate -watchers recursively for everything within scope of the paths that have been -specified, so be judicious about not wasting system resources by watching much -more than needed. - -## Getting started - -Install with npm: - -```sh -npm install chokidar -``` - -Then `require` and use it in your code: - -```javascript -const chokidar = require('chokidar'); - -// One-liner for current directory -chokidar.watch('.').on('all', (event, path) => { - console.log(event, path); -}); -``` - -## API - -```javascript -// Example of a more typical implementation structure - -// Initialize watcher. -const watcher = chokidar.watch('file, dir, glob, or array', { - ignored: /(^|[\/\\])\../, // ignore dotfiles - persistent: true -}); - -// Something to use when events are received. -const log = console.log.bind(console); -// Add event listeners. -watcher - .on('add', path => log(`File ${path} has been added`)) - .on('change', path => log(`File ${path} has been changed`)) - .on('unlink', path => log(`File ${path} has been removed`)); - -// More possible events. -watcher - .on('addDir', path => log(`Directory ${path} has been added`)) - .on('unlinkDir', path => log(`Directory ${path} has been removed`)) - .on('error', error => log(`Watcher error: ${error}`)) - .on('ready', () => log('Initial scan complete. Ready for changes')) - .on('raw', (event, path, details) => { // internal - log('Raw event info:', event, path, details); - }); - -// 'add', 'addDir' and 'change' events also receive stat() results as second -// argument when available: https://nodejs.org/api/fs.html#fs_class_fs_stats -watcher.on('change', (path, stats) => { - if (stats) console.log(`File ${path} changed size to ${stats.size}`); -}); - -// Watch new files. -watcher.add('new-file'); -watcher.add(['new-file-2', 'new-file-3', '**/other-file*']); - -// Get list of actual paths being watched on the filesystem -var watchedPaths = watcher.getWatched(); - -// Un-watch some files. -await watcher.unwatch('new-file*'); - -// Stop watching. -// The method is async! -watcher.close().then(() => console.log('closed')); - -// Full list of options. See below for descriptions. -// Do not use this example! -chokidar.watch('file', { - persistent: true, - - ignored: '*.txt', - ignoreInitial: false, - followSymlinks: true, - cwd: '.', - disableGlobbing: false, - - usePolling: false, - interval: 100, - binaryInterval: 300, - alwaysStat: false, - depth: 99, - awaitWriteFinish: { - stabilityThreshold: 2000, - pollInterval: 100 - }, - - ignorePermissionErrors: false, - atomic: true // or a custom 'atomicity delay', in milliseconds (default 100) -}); - -``` - -`chokidar.watch(paths, [options])` - -* `paths` (string or array of strings). Paths to files, dirs to be watched -recursively, or glob patterns. - - Note: globs must not contain windows separators (`\`), - because that's how they work by the standard — - you'll need to replace them with forward slashes (`/`). - - Note 2: for additional glob documentation, check out low-level - library: [picomatch](https://github.com/micromatch/picomatch). -* `options` (object) Options object as defined below: - -#### Persistence - -* `persistent` (default: `true`). Indicates whether the process -should continue to run as long as files are being watched. If set to -`false` when using `fsevents` to watch, no more events will be emitted -after `ready`, even if the process continues to run. - -#### Path filtering - -* `ignored` ([anymatch](https://github.com/es128/anymatch)-compatible definition) -Defines files/paths to be ignored. The whole relative or absolute path is -tested, not just filename. If a function with two arguments is provided, it -gets called twice per path - once with a single argument (the path), second -time with two arguments (the path and the -[`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) -object of that path). -* `ignoreInitial` (default: `false`). If set to `false` then `add`/`addDir` events are also emitted for matching paths while -instantiating the watching as chokidar discovers these file paths (before the `ready` event). -* `followSymlinks` (default: `true`). When `false`, only the -symlinks themselves will be watched for changes instead of following -the link references and bubbling events through the link's path. -* `cwd` (no default). The base directory from which watch `paths` are to be -derived. Paths emitted with events will be relative to this. -* `disableGlobbing` (default: `false`). If set to `true` then the strings passed to `.watch()` and `.add()` are treated as -literal path names, even if they look like globs. - -#### Performance - -* `usePolling` (default: `false`). -Whether to use fs.watchFile (backed by polling), or fs.watch. If polling -leads to high CPU utilization, consider setting this to `false`. It is -typically necessary to **set this to `true` to successfully watch files over -a network**, and it may be necessary to successfully watch files in other -non-standard situations. Setting to `true` explicitly on MacOS overrides the -`useFsEvents` default. You may also set the CHOKIDAR_USEPOLLING env variable -to true (1) or false (0) in order to override this option. -* _Polling-specific settings_ (effective when `usePolling: true`) - * `interval` (default: `100`). Interval of file system polling, in milliseconds. You may also - set the CHOKIDAR_INTERVAL env variable to override this option. - * `binaryInterval` (default: `300`). Interval of file system - polling for binary files. - ([see list of binary extensions](https://github.com/sindresorhus/binary-extensions/blob/master/binary-extensions.json)) -* `useFsEvents` (default: `true` on MacOS). Whether to use the -`fsevents` watching interface if available. When set to `true` explicitly -and `fsevents` is available this supercedes the `usePolling` setting. When -set to `false` on MacOS, `usePolling: true` becomes the default. -* `alwaysStat` (default: `false`). If relying upon the -[`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) -object that may get passed with `add`, `addDir`, and `change` events, set -this to `true` to ensure it is provided even in cases where it wasn't -already available from the underlying watch events. -* `depth` (default: `undefined`). If set, limits how many levels of -subdirectories will be traversed. -* `awaitWriteFinish` (default: `false`). -By default, the `add` event will fire when a file first appears on disk, before -the entire file has been written. Furthermore, in some cases some `change` -events will be emitted while the file is being written. In some cases, -especially when watching for large files there will be a need to wait for the -write operation to finish before responding to a file creation or modification. -Setting `awaitWriteFinish` to `true` (or a truthy value) will poll file size, -holding its `add` and `change` events until the size does not change for a -configurable amount of time. The appropriate duration setting is heavily -dependent on the OS and hardware. For accurate detection this parameter should -be relatively high, making file watching much less responsive. -Use with caution. - * *`options.awaitWriteFinish` can be set to an object in order to adjust - timing params:* - * `awaitWriteFinish.stabilityThreshold` (default: 2000). Amount of time in - milliseconds for a file size to remain constant before emitting its event. - * `awaitWriteFinish.pollInterval` (default: 100). File size polling interval, in milliseconds. - -#### Errors - -* `ignorePermissionErrors` (default: `false`). Indicates whether to watch files -that don't have read permissions if possible. If watching fails due to `EPERM` -or `EACCES` with this set to `true`, the errors will be suppressed silently. -* `atomic` (default: `true` if `useFsEvents` and `usePolling` are `false`). -Automatically filters out artifacts that occur when using editors that use -"atomic writes" instead of writing directly to the source file. If a file is -re-added within 100 ms of being deleted, Chokidar emits a `change` event -rather than `unlink` then `add`. If the default of 100 ms does not work well -for you, you can override it by setting `atomic` to a custom value, in -milliseconds. - -### Methods & Events - -`chokidar.watch()` produces an instance of `FSWatcher`. Methods of `FSWatcher`: - -* `.add(path / paths)`: Add files, directories, or glob patterns for tracking. -Takes an array of strings or just one string. -* `.on(event, callback)`: Listen for an FS event. -Available events: `add`, `addDir`, `change`, `unlink`, `unlinkDir`, `ready`, -`raw`, `error`. -Additionally `all` is available which gets emitted with the underlying event -name and path for every event other than `ready`, `raw`, and `error`. `raw` is internal, use it carefully. -* `.unwatch(path / paths)`: Stop watching files, directories, or glob patterns. -Takes an array of strings or just one string. -* `.close()`: **async** Removes all listeners from watched files. Asynchronous, returns Promise. Use with `await` to ensure bugs don't happen. -* `.getWatched()`: Returns an object representing all the paths on the file -system being watched by this `FSWatcher` instance. The object's keys are all the -directories (using absolute paths unless the `cwd` option was used), and the -values are arrays of the names of the items contained in each directory. - -## CLI - -If you need a CLI interface for your file watching, check out -[chokidar-cli](https://github.com/open-cli-tools/chokidar-cli), allowing you to -execute a command on each change, or get a stdio stream of change events. - -## Install Troubleshooting - -* `npm WARN optional dep failed, continuing fsevents@n.n.n` - * This message is normal part of how `npm` handles optional dependencies and is - not indicative of a problem. Even if accompanied by other related error messages, - Chokidar should function properly. - -* `TypeError: fsevents is not a constructor` - * Update chokidar by doing `rm -rf node_modules package-lock.json yarn.lock && npm install`, or update your dependency that uses chokidar. - -* Chokidar is producing `ENOSP` error on Linux, like this: - * `bash: cannot set terminal process group (-1): Inappropriate ioctl for device bash: no job control in this shell` - `Error: watch /home/ ENOSPC` - * This means Chokidar ran out of file handles and you'll need to increase their count by executing the following command in Terminal: - `echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p` - -## Changelog - -For more detailed changelog, see [`full_changelog.md`](.github/full_changelog.md). -- **v3.5 (Jan 6, 2021):** Support for ARM Macs with Apple Silicon. Fixes for deleted symlinks. -- **v3.4 (Apr 26, 2020):** Support for directory-based symlinks. Fixes for macos file replacement. -- **v3.3 (Nov 2, 2019):** `FSWatcher#close()` method became async. That fixes IO race conditions related to close method. -- **v3.2 (Oct 1, 2019):** Improve Linux RAM usage by 50%. Race condition fixes. Windows glob fixes. Improve stability by using tight range of dependency versions. -- **v3.1 (Sep 16, 2019):** dotfiles are no longer filtered out by default. Use `ignored` option if needed. Improve initial Linux scan time by 50%. -- **v3 (Apr 30, 2019):** massive CPU & RAM consumption improvements; reduces deps / package size by a factor of 17x and bumps Node.js requirement to v8.16 and higher. -- **v2 (Dec 29, 2017):** Globs are now posix-style-only; without windows support. Tons of bugfixes. -- **v1 (Apr 7, 2015):** Glob support, symlink support, tons of bugfixes. Node 0.8+ is supported -- **v0.1 (Apr 20, 2012):** Initial release, extracted from [Brunch](https://github.com/brunch/brunch/blob/9847a065aea300da99bd0753f90354cde9de1261/src/helpers.coffee#L66) - -## Also - -Why was chokidar named this way? What's the meaning behind it? - ->Chowkidar is a transliteration of a Hindi word meaning 'watchman, gatekeeper', चौकीदार. This ultimately comes from Sanskrit _ चतुष्क_ (crossway, quadrangle, consisting-of-four). This word is also used in other languages like Urdu as (چوکیدار) which is widely used in Pakistan and India. - -## License - -MIT (c) Paul Miller (), see [LICENSE](LICENSE) file. diff --git a/node_modules/chokidar/index.js b/node_modules/chokidar/index.js deleted file mode 100644 index 8752893..0000000 --- a/node_modules/chokidar/index.js +++ /dev/null @@ -1,973 +0,0 @@ -'use strict'; - -const { EventEmitter } = require('events'); -const fs = require('fs'); -const sysPath = require('path'); -const { promisify } = require('util'); -const readdirp = require('readdirp'); -const anymatch = require('anymatch').default; -const globParent = require('glob-parent'); -const isGlob = require('is-glob'); -const braces = require('braces'); -const normalizePath = require('normalize-path'); - -const NodeFsHandler = require('./lib/nodefs-handler'); -const FsEventsHandler = require('./lib/fsevents-handler'); -const { - EV_ALL, - EV_READY, - EV_ADD, - EV_CHANGE, - EV_UNLINK, - EV_ADD_DIR, - EV_UNLINK_DIR, - EV_RAW, - EV_ERROR, - - STR_CLOSE, - STR_END, - - BACK_SLASH_RE, - DOUBLE_SLASH_RE, - SLASH_OR_BACK_SLASH_RE, - DOT_RE, - REPLACER_RE, - - SLASH, - SLASH_SLASH, - BRACE_START, - BANG, - ONE_DOT, - TWO_DOTS, - GLOBSTAR, - SLASH_GLOBSTAR, - ANYMATCH_OPTS, - STRING_TYPE, - FUNCTION_TYPE, - EMPTY_STR, - EMPTY_FN, - - isWindows, - isMacos, - isIBMi -} = require('./lib/constants'); - -const stat = promisify(fs.stat); -const readdir = promisify(fs.readdir); - -/** - * @typedef {String} Path - * @typedef {'all'|'add'|'addDir'|'change'|'unlink'|'unlinkDir'|'raw'|'error'|'ready'} EventName - * @typedef {'readdir'|'watch'|'add'|'remove'|'change'} ThrottleType - */ - -/** - * - * @typedef {Object} WatchHelpers - * @property {Boolean} followSymlinks - * @property {'stat'|'lstat'} statMethod - * @property {Path} path - * @property {Path} watchPath - * @property {Function} entryPath - * @property {Boolean} hasGlob - * @property {Object} globFilter - * @property {Function} filterPath - * @property {Function} filterDir - */ - -const arrify = (value = []) => Array.isArray(value) ? value : [value]; -const flatten = (list, result = []) => { - list.forEach(item => { - if (Array.isArray(item)) { - flatten(item, result); - } else { - result.push(item); - } - }); - return result; -}; - -const unifyPaths = (paths_) => { - /** - * @type {Array} - */ - const paths = flatten(arrify(paths_)); - if (!paths.every(p => typeof p === STRING_TYPE)) { - throw new TypeError(`Non-string provided as watch path: ${paths}`); - } - return paths.map(normalizePathToUnix); -}; - -// If SLASH_SLASH occurs at the beginning of path, it is not replaced -// because "//StoragePC/DrivePool/Movies" is a valid network path -const toUnix = (string) => { - let str = string.replace(BACK_SLASH_RE, SLASH); - let prepend = false; - if (str.startsWith(SLASH_SLASH)) { - prepend = true; - } - while (str.match(DOUBLE_SLASH_RE)) { - str = str.replace(DOUBLE_SLASH_RE, SLASH); - } - if (prepend) { - str = SLASH + str; - } - return str; -}; - -// Our version of upath.normalize -// TODO: this is not equal to path-normalize module - investigate why -const normalizePathToUnix = (path) => toUnix(sysPath.normalize(toUnix(path))); - -const normalizeIgnored = (cwd = EMPTY_STR) => (path) => { - if (typeof path !== STRING_TYPE) return path; - return normalizePathToUnix(sysPath.isAbsolute(path) ? path : sysPath.join(cwd, path)); -}; - -const getAbsolutePath = (path, cwd) => { - if (sysPath.isAbsolute(path)) { - return path; - } - if (path.startsWith(BANG)) { - return BANG + sysPath.join(cwd, path.slice(1)); - } - return sysPath.join(cwd, path); -}; - -const undef = (opts, key) => opts[key] === undefined; - -/** - * Directory entry. - * @property {Path} path - * @property {Set} items - */ -class DirEntry { - /** - * @param {Path} dir - * @param {Function} removeWatcher - */ - constructor(dir, removeWatcher) { - this.path = dir; - this._removeWatcher = removeWatcher; - /** @type {Set} */ - this.items = new Set(); - } - - add(item) { - const {items} = this; - if (!items) return; - if (item !== ONE_DOT && item !== TWO_DOTS) items.add(item); - } - - async remove(item) { - const {items} = this; - if (!items) return; - items.delete(item); - if (items.size > 0) return; - - const dir = this.path; - try { - await readdir(dir); - } catch (err) { - if (this._removeWatcher) { - this._removeWatcher(sysPath.dirname(dir), sysPath.basename(dir)); - } - } - } - - has(item) { - const {items} = this; - if (!items) return; - return items.has(item); - } - - /** - * @returns {Array} - */ - getChildren() { - const {items} = this; - if (!items) return; - return [...items.values()]; - } - - dispose() { - this.items.clear(); - delete this.path; - delete this._removeWatcher; - delete this.items; - Object.freeze(this); - } -} - -const STAT_METHOD_F = 'stat'; -const STAT_METHOD_L = 'lstat'; -class WatchHelper { - constructor(path, watchPath, follow, fsw) { - this.fsw = fsw; - this.path = path = path.replace(REPLACER_RE, EMPTY_STR); - this.watchPath = watchPath; - this.fullWatchPath = sysPath.resolve(watchPath); - this.hasGlob = watchPath !== path; - /** @type {object|boolean} */ - if (path === EMPTY_STR) this.hasGlob = false; - this.globSymlink = this.hasGlob && follow ? undefined : false; - this.globFilter = this.hasGlob ? anymatch(path, undefined, ANYMATCH_OPTS) : false; - this.dirParts = this.getDirParts(path); - this.dirParts.forEach((parts) => { - if (parts.length > 1) parts.pop(); - }); - this.followSymlinks = follow; - this.statMethod = follow ? STAT_METHOD_F : STAT_METHOD_L; - } - - checkGlobSymlink(entry) { - // only need to resolve once - // first entry should always have entry.parentDir === EMPTY_STR - if (this.globSymlink === undefined) { - this.globSymlink = entry.fullParentDir === this.fullWatchPath ? - false : {realPath: entry.fullParentDir, linkPath: this.fullWatchPath}; - } - - if (this.globSymlink) { - return entry.fullPath.replace(this.globSymlink.realPath, this.globSymlink.linkPath); - } - - return entry.fullPath; - } - - entryPath(entry) { - return sysPath.join(this.watchPath, - sysPath.relative(this.watchPath, this.checkGlobSymlink(entry)) - ); - } - - filterPath(entry) { - const {stats} = entry; - if (stats && stats.isSymbolicLink()) return this.filterDir(entry); - const resolvedPath = this.entryPath(entry); - const matchesGlob = this.hasGlob && typeof this.globFilter === FUNCTION_TYPE ? - this.globFilter(resolvedPath) : true; - return matchesGlob && - this.fsw._isntIgnored(resolvedPath, stats) && - this.fsw._hasReadPermissions(stats); - } - - getDirParts(path) { - if (!this.hasGlob) return []; - const parts = []; - const expandedPath = path.includes(BRACE_START) ? braces.expand(path) : [path]; - expandedPath.forEach((path) => { - parts.push(sysPath.relative(this.watchPath, path).split(SLASH_OR_BACK_SLASH_RE)); - }); - return parts; - } - - filterDir(entry) { - if (this.hasGlob) { - const entryParts = this.getDirParts(this.checkGlobSymlink(entry)); - let globstar = false; - this.unmatchedGlob = !this.dirParts.some((parts) => { - return parts.every((part, i) => { - if (part === GLOBSTAR) globstar = true; - return globstar || !entryParts[0][i] || anymatch(part, entryParts[0][i], ANYMATCH_OPTS); - }); - }); - } - return !this.unmatchedGlob && this.fsw._isntIgnored(this.entryPath(entry), entry.stats); - } -} - -/** - * Watches files & directories for changes. Emitted events: - * `add`, `addDir`, `change`, `unlink`, `unlinkDir`, `all`, `error` - * - * new FSWatcher() - * .add(directories) - * .on('add', path => log('File', path, 'was added')) - */ -class FSWatcher extends EventEmitter { -// Not indenting methods for history sake; for now. -constructor(_opts) { - super(); - - const opts = {}; - if (_opts) Object.assign(opts, _opts); // for frozen objects - - /** @type {Map} */ - this._watched = new Map(); - /** @type {Map} */ - this._closers = new Map(); - /** @type {Set} */ - this._ignoredPaths = new Set(); - - /** @type {Map} */ - this._throttled = new Map(); - - /** @type {Map} */ - this._symlinkPaths = new Map(); - - this._streams = new Set(); - this.closed = false; - - // Set up default options. - if (undef(opts, 'persistent')) opts.persistent = true; - if (undef(opts, 'ignoreInitial')) opts.ignoreInitial = false; - if (undef(opts, 'ignorePermissionErrors')) opts.ignorePermissionErrors = false; - if (undef(opts, 'interval')) opts.interval = 100; - if (undef(opts, 'binaryInterval')) opts.binaryInterval = 300; - if (undef(opts, 'disableGlobbing')) opts.disableGlobbing = false; - opts.enableBinaryInterval = opts.binaryInterval !== opts.interval; - - // Enable fsevents on OS X when polling isn't explicitly enabled. - if (undef(opts, 'useFsEvents')) opts.useFsEvents = !opts.usePolling; - - // If we can't use fsevents, ensure the options reflect it's disabled. - const canUseFsEvents = FsEventsHandler.canUse(); - if (!canUseFsEvents) opts.useFsEvents = false; - - // Use polling on Mac if not using fsevents. - // Other platforms use non-polling fs_watch. - if (undef(opts, 'usePolling') && !opts.useFsEvents) { - opts.usePolling = isMacos; - } - - // Always default to polling on IBM i because fs.watch() is not available on IBM i. - if(isIBMi) { - opts.usePolling = true; - } - - // Global override (useful for end-developers that need to force polling for all - // instances of chokidar, regardless of usage/dependency depth) - const envPoll = process.env.CHOKIDAR_USEPOLLING; - if (envPoll !== undefined) { - const envLower = envPoll.toLowerCase(); - - if (envLower === 'false' || envLower === '0') { - opts.usePolling = false; - } else if (envLower === 'true' || envLower === '1') { - opts.usePolling = true; - } else { - opts.usePolling = !!envLower; - } - } - const envInterval = process.env.CHOKIDAR_INTERVAL; - if (envInterval) { - opts.interval = Number.parseInt(envInterval, 10); - } - - // Editor atomic write normalization enabled by default with fs.watch - if (undef(opts, 'atomic')) opts.atomic = !opts.usePolling && !opts.useFsEvents; - if (opts.atomic) this._pendingUnlinks = new Map(); - - if (undef(opts, 'followSymlinks')) opts.followSymlinks = true; - - if (undef(opts, 'awaitWriteFinish')) opts.awaitWriteFinish = false; - if (opts.awaitWriteFinish === true) opts.awaitWriteFinish = {}; - const awf = opts.awaitWriteFinish; - if (awf) { - if (!awf.stabilityThreshold) awf.stabilityThreshold = 2000; - if (!awf.pollInterval) awf.pollInterval = 100; - this._pendingWrites = new Map(); - } - if (opts.ignored) opts.ignored = arrify(opts.ignored); - - let readyCalls = 0; - this._emitReady = () => { - readyCalls++; - if (readyCalls >= this._readyCount) { - this._emitReady = EMPTY_FN; - this._readyEmitted = true; - // use process.nextTick to allow time for listener to be bound - process.nextTick(() => this.emit(EV_READY)); - } - }; - this._emitRaw = (...args) => this.emit(EV_RAW, ...args); - this._readyEmitted = false; - this.options = opts; - - // Initialize with proper watcher. - if (opts.useFsEvents) { - this._fsEventsHandler = new FsEventsHandler(this); - } else { - this._nodeFsHandler = new NodeFsHandler(this); - } - - // You’re frozen when your heart’s not open. - Object.freeze(opts); -} - -// Public methods - -/** - * Adds paths to be watched on an existing FSWatcher instance - * @param {Path|Array} paths_ - * @param {String=} _origAdd private; for handling non-existent paths to be watched - * @param {Boolean=} _internal private; indicates a non-user add - * @returns {FSWatcher} for chaining - */ -add(paths_, _origAdd, _internal) { - const {cwd, disableGlobbing} = this.options; - this.closed = false; - let paths = unifyPaths(paths_); - if (cwd) { - paths = paths.map((path) => { - const absPath = getAbsolutePath(path, cwd); - - // Check `path` instead of `absPath` because the cwd portion can't be a glob - if (disableGlobbing || !isGlob(path)) { - return absPath; - } - return normalizePath(absPath); - }); - } - - // set aside negated glob strings - paths = paths.filter((path) => { - if (path.startsWith(BANG)) { - this._ignoredPaths.add(path.slice(1)); - return false; - } - - // if a path is being added that was previously ignored, stop ignoring it - this._ignoredPaths.delete(path); - this._ignoredPaths.delete(path + SLASH_GLOBSTAR); - - // reset the cached userIgnored anymatch fn - // to make ignoredPaths changes effective - this._userIgnored = undefined; - - return true; - }); - - if (this.options.useFsEvents && this._fsEventsHandler) { - if (!this._readyCount) this._readyCount = paths.length; - if (this.options.persistent) this._readyCount += paths.length; - paths.forEach((path) => this._fsEventsHandler._addToFsEvents(path)); - } else { - if (!this._readyCount) this._readyCount = 0; - this._readyCount += paths.length; - Promise.all( - paths.map(async path => { - const res = await this._nodeFsHandler._addToNodeFs(path, !_internal, 0, 0, _origAdd); - if (res) this._emitReady(); - return res; - }) - ).then(results => { - if (this.closed) return; - results.filter(item => item).forEach(item => { - this.add(sysPath.dirname(item), sysPath.basename(_origAdd || item)); - }); - }); - } - - return this; -} - -/** - * Close watchers or start ignoring events from specified paths. - * @param {Path|Array} paths_ - string or array of strings, file/directory paths and/or globs - * @returns {FSWatcher} for chaining -*/ -unwatch(paths_) { - if (this.closed) return this; - const paths = unifyPaths(paths_); - const {cwd} = this.options; - - paths.forEach((path) => { - // convert to absolute path unless relative path already matches - if (!sysPath.isAbsolute(path) && !this._closers.has(path)) { - if (cwd) path = sysPath.join(cwd, path); - path = sysPath.resolve(path); - } - - this._closePath(path); - - this._ignoredPaths.add(path); - if (this._watched.has(path)) { - this._ignoredPaths.add(path + SLASH_GLOBSTAR); - } - - // reset the cached userIgnored anymatch fn - // to make ignoredPaths changes effective - this._userIgnored = undefined; - }); - - return this; -} - -/** - * Close watchers and remove all listeners from watched paths. - * @returns {Promise}. -*/ -close() { - if (this.closed) return this._closePromise; - this.closed = true; - - // Memory management. - this.removeAllListeners(); - const closers = []; - this._closers.forEach(closerList => closerList.forEach(closer => { - const promise = closer(); - if (promise instanceof Promise) closers.push(promise); - })); - this._streams.forEach(stream => stream.destroy()); - this._userIgnored = undefined; - this._readyCount = 0; - this._readyEmitted = false; - this._watched.forEach(dirent => dirent.dispose()); - ['closers', 'watched', 'streams', 'symlinkPaths', 'throttled'].forEach(key => { - this[`_${key}`].clear(); - }); - - this._closePromise = closers.length ? Promise.all(closers).then(() => undefined) : Promise.resolve(); - return this._closePromise; -} - -/** - * Expose list of watched paths - * @returns {Object} for chaining -*/ -getWatched() { - const watchList = {}; - this._watched.forEach((entry, dir) => { - const key = this.options.cwd ? sysPath.relative(this.options.cwd, dir) : dir; - watchList[key || ONE_DOT] = entry.getChildren().sort(); - }); - return watchList; -} - -emitWithAll(event, args) { - this.emit(...args); - if (event !== EV_ERROR) this.emit(EV_ALL, ...args); -} - -// Common helpers -// -------------- - -/** - * Normalize and emit events. - * Calling _emit DOES NOT MEAN emit() would be called! - * @param {EventName} event Type of event - * @param {Path} path File or directory path - * @param {*=} val1 arguments to be passed with event - * @param {*=} val2 - * @param {*=} val3 - * @returns the error if defined, otherwise the value of the FSWatcher instance's `closed` flag - */ -async _emit(event, path, val1, val2, val3) { - if (this.closed) return; - - const opts = this.options; - if (isWindows) path = sysPath.normalize(path); - if (opts.cwd) path = sysPath.relative(opts.cwd, path); - /** @type Array */ - const args = [event, path]; - if (val3 !== undefined) args.push(val1, val2, val3); - else if (val2 !== undefined) args.push(val1, val2); - else if (val1 !== undefined) args.push(val1); - - const awf = opts.awaitWriteFinish; - let pw; - if (awf && (pw = this._pendingWrites.get(path))) { - pw.lastChange = new Date(); - return this; - } - - if (opts.atomic) { - if (event === EV_UNLINK) { - this._pendingUnlinks.set(path, args); - setTimeout(() => { - this._pendingUnlinks.forEach((entry, path) => { - this.emit(...entry); - this.emit(EV_ALL, ...entry); - this._pendingUnlinks.delete(path); - }); - }, typeof opts.atomic === 'number' ? opts.atomic : 100); - return this; - } - if (event === EV_ADD && this._pendingUnlinks.has(path)) { - event = args[0] = EV_CHANGE; - this._pendingUnlinks.delete(path); - } - } - - if (awf && (event === EV_ADD || event === EV_CHANGE) && this._readyEmitted) { - const awfEmit = (err, stats) => { - if (err) { - event = args[0] = EV_ERROR; - args[1] = err; - this.emitWithAll(event, args); - } else if (stats) { - // if stats doesn't exist the file must have been deleted - if (args.length > 2) { - args[2] = stats; - } else { - args.push(stats); - } - this.emitWithAll(event, args); - } - }; - - this._awaitWriteFinish(path, awf.stabilityThreshold, event, awfEmit); - return this; - } - - if (event === EV_CHANGE) { - const isThrottled = !this._throttle(EV_CHANGE, path, 50); - if (isThrottled) return this; - } - - if (opts.alwaysStat && val1 === undefined && - (event === EV_ADD || event === EV_ADD_DIR || event === EV_CHANGE) - ) { - const fullPath = opts.cwd ? sysPath.join(opts.cwd, path) : path; - let stats; - try { - stats = await stat(fullPath); - } catch (err) {} - // Suppress event when fs_stat fails, to avoid sending undefined 'stat' - if (!stats || this.closed) return; - args.push(stats); - } - this.emitWithAll(event, args); - - return this; -} - -/** - * Common handler for errors - * @param {Error} error - * @returns {Error|Boolean} The error if defined, otherwise the value of the FSWatcher instance's `closed` flag - */ -_handleError(error) { - const code = error && error.code; - if (error && code !== 'ENOENT' && code !== 'ENOTDIR' && - (!this.options.ignorePermissionErrors || (code !== 'EPERM' && code !== 'EACCES')) - ) { - this.emit(EV_ERROR, error); - } - return error || this.closed; -} - -/** - * Helper utility for throttling - * @param {ThrottleType} actionType type being throttled - * @param {Path} path being acted upon - * @param {Number} timeout duration of time to suppress duplicate actions - * @returns {Object|false} tracking object or false if action should be suppressed - */ -_throttle(actionType, path, timeout) { - if (!this._throttled.has(actionType)) { - this._throttled.set(actionType, new Map()); - } - - /** @type {Map} */ - const action = this._throttled.get(actionType); - /** @type {Object} */ - const actionPath = action.get(path); - - if (actionPath) { - actionPath.count++; - return false; - } - - let timeoutObject; - const clear = () => { - const item = action.get(path); - const count = item ? item.count : 0; - action.delete(path); - clearTimeout(timeoutObject); - if (item) clearTimeout(item.timeoutObject); - return count; - }; - timeoutObject = setTimeout(clear, timeout); - const thr = {timeoutObject, clear, count: 0}; - action.set(path, thr); - return thr; -} - -_incrReadyCount() { - return this._readyCount++; -} - -/** - * Awaits write operation to finish. - * Polls a newly created file for size variations. When files size does not change for 'threshold' milliseconds calls callback. - * @param {Path} path being acted upon - * @param {Number} threshold Time in milliseconds a file size must be fixed before acknowledging write OP is finished - * @param {EventName} event - * @param {Function} awfEmit Callback to be called when ready for event to be emitted. - */ -_awaitWriteFinish(path, threshold, event, awfEmit) { - let timeoutHandler; - - let fullPath = path; - if (this.options.cwd && !sysPath.isAbsolute(path)) { - fullPath = sysPath.join(this.options.cwd, path); - } - - const now = new Date(); - - const awaitWriteFinish = (prevStat) => { - fs.stat(fullPath, (err, curStat) => { - if (err || !this._pendingWrites.has(path)) { - if (err && err.code !== 'ENOENT') awfEmit(err); - return; - } - - const now = Number(new Date()); - - if (prevStat && curStat.size !== prevStat.size) { - this._pendingWrites.get(path).lastChange = now; - } - const pw = this._pendingWrites.get(path); - const df = now - pw.lastChange; - - if (df >= threshold) { - this._pendingWrites.delete(path); - awfEmit(undefined, curStat); - } else { - timeoutHandler = setTimeout( - awaitWriteFinish, - this.options.awaitWriteFinish.pollInterval, - curStat - ); - } - }); - }; - - if (!this._pendingWrites.has(path)) { - this._pendingWrites.set(path, { - lastChange: now, - cancelWait: () => { - this._pendingWrites.delete(path); - clearTimeout(timeoutHandler); - return event; - } - }); - timeoutHandler = setTimeout( - awaitWriteFinish, - this.options.awaitWriteFinish.pollInterval - ); - } -} - -_getGlobIgnored() { - return [...this._ignoredPaths.values()]; -} - -/** - * Determines whether user has asked to ignore this path. - * @param {Path} path filepath or dir - * @param {fs.Stats=} stats result of fs.stat - * @returns {Boolean} - */ -_isIgnored(path, stats) { - if (this.options.atomic && DOT_RE.test(path)) return true; - if (!this._userIgnored) { - const {cwd} = this.options; - const ign = this.options.ignored; - - const ignored = ign && ign.map(normalizeIgnored(cwd)); - const paths = arrify(ignored) - .filter((path) => typeof path === STRING_TYPE && !isGlob(path)) - .map((path) => path + SLASH_GLOBSTAR); - const list = this._getGlobIgnored().map(normalizeIgnored(cwd)).concat(ignored, paths); - this._userIgnored = anymatch(list, undefined, ANYMATCH_OPTS); - } - - return this._userIgnored([path, stats]); -} - -_isntIgnored(path, stat) { - return !this._isIgnored(path, stat); -} - -/** - * Provides a set of common helpers and properties relating to symlink and glob handling. - * @param {Path} path file, directory, or glob pattern being watched - * @param {Number=} depth at any depth > 0, this isn't a glob - * @returns {WatchHelper} object containing helpers for this path - */ -_getWatchHelpers(path, depth) { - const watchPath = depth || this.options.disableGlobbing || !isGlob(path) ? path : globParent(path); - const follow = this.options.followSymlinks; - - return new WatchHelper(path, watchPath, follow, this); -} - -// Directory helpers -// ----------------- - -/** - * Provides directory tracking objects - * @param {String} directory path of the directory - * @returns {DirEntry} the directory's tracking object - */ -_getWatchedDir(directory) { - if (!this._boundRemove) this._boundRemove = this._remove.bind(this); - const dir = sysPath.resolve(directory); - if (!this._watched.has(dir)) this._watched.set(dir, new DirEntry(dir, this._boundRemove)); - return this._watched.get(dir); -} - -// File helpers -// ------------ - -/** - * Check for read permissions. - * Based on this answer on SO: https://stackoverflow.com/a/11781404/1358405 - * @param {fs.Stats} stats - object, result of fs_stat - * @returns {Boolean} indicates whether the file can be read -*/ -_hasReadPermissions(stats) { - if (this.options.ignorePermissionErrors) return true; - - // stats.mode may be bigint - const md = stats && Number.parseInt(stats.mode, 10); - const st = md & 0o777; - const it = Number.parseInt(st.toString(8)[0], 10); - return Boolean(4 & it); -} - -/** - * Handles emitting unlink events for - * files and directories, and via recursion, for - * files and directories within directories that are unlinked - * @param {String} directory within which the following item is located - * @param {String} item base path of item/directory - * @returns {void} -*/ -_remove(directory, item, isDirectory) { - // if what is being deleted is a directory, get that directory's paths - // for recursive deleting and cleaning of watched object - // if it is not a directory, nestedDirectoryChildren will be empty array - const path = sysPath.join(directory, item); - const fullPath = sysPath.resolve(path); - isDirectory = isDirectory != null - ? isDirectory - : this._watched.has(path) || this._watched.has(fullPath); - - // prevent duplicate handling in case of arriving here nearly simultaneously - // via multiple paths (such as _handleFile and _handleDir) - if (!this._throttle('remove', path, 100)) return; - - // if the only watched file is removed, watch for its return - if (!isDirectory && !this.options.useFsEvents && this._watched.size === 1) { - this.add(directory, item, true); - } - - // This will create a new entry in the watched object in either case - // so we got to do the directory check beforehand - const wp = this._getWatchedDir(path); - const nestedDirectoryChildren = wp.getChildren(); - - // Recursively remove children directories / files. - nestedDirectoryChildren.forEach(nested => this._remove(path, nested)); - - // Check if item was on the watched list and remove it - const parent = this._getWatchedDir(directory); - const wasTracked = parent.has(item); - parent.remove(item); - - // Fixes issue #1042 -> Relative paths were detected and added as symlinks - // (https://github.com/paulmillr/chokidar/blob/e1753ddbc9571bdc33b4a4af172d52cb6e611c10/lib/nodefs-handler.js#L612), - // but never removed from the map in case the path was deleted. - // This leads to an incorrect state if the path was recreated: - // https://github.com/paulmillr/chokidar/blob/e1753ddbc9571bdc33b4a4af172d52cb6e611c10/lib/nodefs-handler.js#L553 - if (this._symlinkPaths.has(fullPath)) { - this._symlinkPaths.delete(fullPath); - } - - // If we wait for this file to be fully written, cancel the wait. - let relPath = path; - if (this.options.cwd) relPath = sysPath.relative(this.options.cwd, path); - if (this.options.awaitWriteFinish && this._pendingWrites.has(relPath)) { - const event = this._pendingWrites.get(relPath).cancelWait(); - if (event === EV_ADD) return; - } - - // The Entry will either be a directory that just got removed - // or a bogus entry to a file, in either case we have to remove it - this._watched.delete(path); - this._watched.delete(fullPath); - const eventName = isDirectory ? EV_UNLINK_DIR : EV_UNLINK; - if (wasTracked && !this._isIgnored(path)) this._emit(eventName, path); - - // Avoid conflicts if we later create another file with the same name - if (!this.options.useFsEvents) { - this._closePath(path); - } -} - -/** - * Closes all watchers for a path - * @param {Path} path - */ -_closePath(path) { - this._closeFile(path) - const dir = sysPath.dirname(path); - this._getWatchedDir(dir).remove(sysPath.basename(path)); -} - -/** - * Closes only file-specific watchers - * @param {Path} path - */ -_closeFile(path) { - const closers = this._closers.get(path); - if (!closers) return; - closers.forEach(closer => closer()); - this._closers.delete(path); -} - -/** - * - * @param {Path} path - * @param {Function} closer - */ -_addPathCloser(path, closer) { - if (!closer) return; - let list = this._closers.get(path); - if (!list) { - list = []; - this._closers.set(path, list); - } - list.push(closer); -} - -_readdirp(root, opts) { - if (this.closed) return; - const options = {type: EV_ALL, alwaysStat: true, lstat: true, ...opts}; - let stream = readdirp(root, options); - this._streams.add(stream); - stream.once(STR_CLOSE, () => { - stream = undefined; - }); - stream.once(STR_END, () => { - if (stream) { - this._streams.delete(stream); - stream = undefined; - } - }); - return stream; -} - -} - -// Export FSWatcher class -exports.FSWatcher = FSWatcher; - -/** - * Instantiates watcher with paths to be tracked. - * @param {String|Array} paths file/directory paths and/or globs - * @param {Object=} options chokidar opts - * @returns an instance of FSWatcher for chaining. - */ -const watch = (paths, options) => { - const watcher = new FSWatcher(options); - watcher.add(paths); - return watcher; -}; - -exports.watch = watch; diff --git a/node_modules/chokidar/lib/constants.js b/node_modules/chokidar/lib/constants.js deleted file mode 100644 index 4743865..0000000 --- a/node_modules/chokidar/lib/constants.js +++ /dev/null @@ -1,66 +0,0 @@ -'use strict'; - -const {sep} = require('path'); -const {platform} = process; -const os = require('os'); - -exports.EV_ALL = 'all'; -exports.EV_READY = 'ready'; -exports.EV_ADD = 'add'; -exports.EV_CHANGE = 'change'; -exports.EV_ADD_DIR = 'addDir'; -exports.EV_UNLINK = 'unlink'; -exports.EV_UNLINK_DIR = 'unlinkDir'; -exports.EV_RAW = 'raw'; -exports.EV_ERROR = 'error'; - -exports.STR_DATA = 'data'; -exports.STR_END = 'end'; -exports.STR_CLOSE = 'close'; - -exports.FSEVENT_CREATED = 'created'; -exports.FSEVENT_MODIFIED = 'modified'; -exports.FSEVENT_DELETED = 'deleted'; -exports.FSEVENT_MOVED = 'moved'; -exports.FSEVENT_CLONED = 'cloned'; -exports.FSEVENT_UNKNOWN = 'unknown'; -exports.FSEVENT_FLAG_MUST_SCAN_SUBDIRS = 1; -exports.FSEVENT_TYPE_FILE = 'file'; -exports.FSEVENT_TYPE_DIRECTORY = 'directory'; -exports.FSEVENT_TYPE_SYMLINK = 'symlink'; - -exports.KEY_LISTENERS = 'listeners'; -exports.KEY_ERR = 'errHandlers'; -exports.KEY_RAW = 'rawEmitters'; -exports.HANDLER_KEYS = [exports.KEY_LISTENERS, exports.KEY_ERR, exports.KEY_RAW]; - -exports.DOT_SLASH = `.${sep}`; - -exports.BACK_SLASH_RE = /\\/g; -exports.DOUBLE_SLASH_RE = /\/\//; -exports.SLASH_OR_BACK_SLASH_RE = /[/\\]/; -exports.DOT_RE = /\..*\.(sw[px])$|~$|\.subl.*\.tmp/; -exports.REPLACER_RE = /^\.[/\\]/; - -exports.SLASH = '/'; -exports.SLASH_SLASH = '//'; -exports.BRACE_START = '{'; -exports.BANG = '!'; -exports.ONE_DOT = '.'; -exports.TWO_DOTS = '..'; -exports.STAR = '*'; -exports.GLOBSTAR = '**'; -exports.ROOT_GLOBSTAR = '/**/*'; -exports.SLASH_GLOBSTAR = '/**'; -exports.DIR_SUFFIX = 'Dir'; -exports.ANYMATCH_OPTS = {dot: true}; -exports.STRING_TYPE = 'string'; -exports.FUNCTION_TYPE = 'function'; -exports.EMPTY_STR = ''; -exports.EMPTY_FN = () => {}; -exports.IDENTITY_FN = val => val; - -exports.isWindows = platform === 'win32'; -exports.isMacos = platform === 'darwin'; -exports.isLinux = platform === 'linux'; -exports.isIBMi = os.type() === 'OS400'; diff --git a/node_modules/chokidar/lib/fsevents-handler.js b/node_modules/chokidar/lib/fsevents-handler.js deleted file mode 100644 index fe29393..0000000 --- a/node_modules/chokidar/lib/fsevents-handler.js +++ /dev/null @@ -1,526 +0,0 @@ -'use strict'; - -const fs = require('fs'); -const sysPath = require('path'); -const { promisify } = require('util'); - -let fsevents; -try { - fsevents = require('fsevents'); -} catch (error) { - if (process.env.CHOKIDAR_PRINT_FSEVENTS_REQUIRE_ERROR) console.error(error); -} - -if (fsevents) { - // TODO: real check - const mtch = process.version.match(/v(\d+)\.(\d+)/); - if (mtch && mtch[1] && mtch[2]) { - const maj = Number.parseInt(mtch[1], 10); - const min = Number.parseInt(mtch[2], 10); - if (maj === 8 && min < 16) { - fsevents = undefined; - } - } -} - -const { - EV_ADD, - EV_CHANGE, - EV_ADD_DIR, - EV_UNLINK, - EV_ERROR, - STR_DATA, - STR_END, - FSEVENT_CREATED, - FSEVENT_MODIFIED, - FSEVENT_DELETED, - FSEVENT_MOVED, - // FSEVENT_CLONED, - FSEVENT_UNKNOWN, - FSEVENT_FLAG_MUST_SCAN_SUBDIRS, - FSEVENT_TYPE_FILE, - FSEVENT_TYPE_DIRECTORY, - FSEVENT_TYPE_SYMLINK, - - ROOT_GLOBSTAR, - DIR_SUFFIX, - DOT_SLASH, - FUNCTION_TYPE, - EMPTY_FN, - IDENTITY_FN -} = require('./constants'); - -const Depth = (value) => isNaN(value) ? {} : {depth: value}; - -const stat = promisify(fs.stat); -const lstat = promisify(fs.lstat); -const realpath = promisify(fs.realpath); - -const statMethods = { stat, lstat }; - -/** - * @typedef {String} Path - */ - -/** - * @typedef {Object} FsEventsWatchContainer - * @property {Set} listeners - * @property {Function} rawEmitter - * @property {{stop: Function}} watcher - */ - -// fsevents instance helper functions -/** - * Object to hold per-process fsevents instances (may be shared across chokidar FSWatcher instances) - * @type {Map} - */ -const FSEventsWatchers = new Map(); - -// Threshold of duplicate path prefixes at which to start -// consolidating going forward -const consolidateThreshhold = 10; - -const wrongEventFlags = new Set([ - 69888, 70400, 71424, 72704, 73472, 131328, 131840, 262912 -]); - -/** - * Instantiates the fsevents interface - * @param {Path} path path to be watched - * @param {Function} callback called when fsevents is bound and ready - * @returns {{stop: Function}} new fsevents instance - */ -const createFSEventsInstance = (path, callback) => { - const stop = fsevents.watch(path, callback); - return {stop}; -}; - -/** - * Instantiates the fsevents interface or binds listeners to an existing one covering - * the same file tree. - * @param {Path} path - to be watched - * @param {Path} realPath - real path for symlinks - * @param {Function} listener - called when fsevents emits events - * @param {Function} rawEmitter - passes data to listeners of the 'raw' event - * @returns {Function} closer - */ -function setFSEventsListener(path, realPath, listener, rawEmitter) { - let watchPath = sysPath.extname(realPath) ? sysPath.dirname(realPath) : realPath; - - const parentPath = sysPath.dirname(watchPath); - let cont = FSEventsWatchers.get(watchPath); - - // If we've accumulated a substantial number of paths that - // could have been consolidated by watching one directory - // above the current one, create a watcher on the parent - // path instead, so that we do consolidate going forward. - if (couldConsolidate(parentPath)) { - watchPath = parentPath; - } - - const resolvedPath = sysPath.resolve(path); - const hasSymlink = resolvedPath !== realPath; - - const filteredListener = (fullPath, flags, info) => { - if (hasSymlink) fullPath = fullPath.replace(realPath, resolvedPath); - if ( - fullPath === resolvedPath || - !fullPath.indexOf(resolvedPath + sysPath.sep) - ) listener(fullPath, flags, info); - }; - - // check if there is already a watcher on a parent path - // modifies `watchPath` to the parent path when it finds a match - let watchedParent = false; - for (const watchedPath of FSEventsWatchers.keys()) { - if (realPath.indexOf(sysPath.resolve(watchedPath) + sysPath.sep) === 0) { - watchPath = watchedPath; - cont = FSEventsWatchers.get(watchPath); - watchedParent = true; - break; - } - } - - if (cont || watchedParent) { - cont.listeners.add(filteredListener); - } else { - cont = { - listeners: new Set([filteredListener]), - rawEmitter, - watcher: createFSEventsInstance(watchPath, (fullPath, flags) => { - if (!cont.listeners.size) return; - if (flags & FSEVENT_FLAG_MUST_SCAN_SUBDIRS) return; - const info = fsevents.getInfo(fullPath, flags); - cont.listeners.forEach(list => { - list(fullPath, flags, info); - }); - - cont.rawEmitter(info.event, fullPath, info); - }) - }; - FSEventsWatchers.set(watchPath, cont); - } - - // removes this instance's listeners and closes the underlying fsevents - // instance if there are no more listeners left - return () => { - const lst = cont.listeners; - - lst.delete(filteredListener); - if (!lst.size) { - FSEventsWatchers.delete(watchPath); - if (cont.watcher) return cont.watcher.stop().then(() => { - cont.rawEmitter = cont.watcher = undefined; - Object.freeze(cont); - }); - } - }; -} - -// Decide whether or not we should start a new higher-level -// parent watcher -const couldConsolidate = (path) => { - let count = 0; - for (const watchPath of FSEventsWatchers.keys()) { - if (watchPath.indexOf(path) === 0) { - count++; - if (count >= consolidateThreshhold) { - return true; - } - } - } - - return false; -}; - -// returns boolean indicating whether fsevents can be used -const canUse = () => fsevents && FSEventsWatchers.size < 128; - -// determines subdirectory traversal levels from root to path -const calcDepth = (path, root) => { - let i = 0; - while (!path.indexOf(root) && (path = sysPath.dirname(path)) !== root) i++; - return i; -}; - -// returns boolean indicating whether the fsevents' event info has the same type -// as the one returned by fs.stat -const sameTypes = (info, stats) => ( - info.type === FSEVENT_TYPE_DIRECTORY && stats.isDirectory() || - info.type === FSEVENT_TYPE_SYMLINK && stats.isSymbolicLink() || - info.type === FSEVENT_TYPE_FILE && stats.isFile() -) - -/** - * @mixin - */ -class FsEventsHandler { - -/** - * @param {import('../index').FSWatcher} fsw - */ -constructor(fsw) { - this.fsw = fsw; -} -checkIgnored(path, stats) { - const ipaths = this.fsw._ignoredPaths; - if (this.fsw._isIgnored(path, stats)) { - ipaths.add(path); - if (stats && stats.isDirectory()) { - ipaths.add(path + ROOT_GLOBSTAR); - } - return true; - } - - ipaths.delete(path); - ipaths.delete(path + ROOT_GLOBSTAR); -} - -addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts) { - const event = watchedDir.has(item) ? EV_CHANGE : EV_ADD; - this.handleEvent(event, path, fullPath, realPath, parent, watchedDir, item, info, opts); -} - -async checkExists(path, fullPath, realPath, parent, watchedDir, item, info, opts) { - try { - const stats = await stat(path) - if (this.fsw.closed) return; - if (sameTypes(info, stats)) { - this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts); - } else { - this.handleEvent(EV_UNLINK, path, fullPath, realPath, parent, watchedDir, item, info, opts); - } - } catch (error) { - if (error.code === 'EACCES') { - this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts); - } else { - this.handleEvent(EV_UNLINK, path, fullPath, realPath, parent, watchedDir, item, info, opts); - } - } -} - -handleEvent(event, path, fullPath, realPath, parent, watchedDir, item, info, opts) { - if (this.fsw.closed || this.checkIgnored(path)) return; - - if (event === EV_UNLINK) { - const isDirectory = info.type === FSEVENT_TYPE_DIRECTORY - // suppress unlink events on never before seen files - if (isDirectory || watchedDir.has(item)) { - this.fsw._remove(parent, item, isDirectory); - } - } else { - if (event === EV_ADD) { - // track new directories - if (info.type === FSEVENT_TYPE_DIRECTORY) this.fsw._getWatchedDir(path); - - if (info.type === FSEVENT_TYPE_SYMLINK && opts.followSymlinks) { - // push symlinks back to the top of the stack to get handled - const curDepth = opts.depth === undefined ? - undefined : calcDepth(fullPath, realPath) + 1; - return this._addToFsEvents(path, false, true, curDepth); - } - - // track new paths - // (other than symlinks being followed, which will be tracked soon) - this.fsw._getWatchedDir(parent).add(item); - } - /** - * @type {'add'|'addDir'|'unlink'|'unlinkDir'} - */ - const eventName = info.type === FSEVENT_TYPE_DIRECTORY ? event + DIR_SUFFIX : event; - this.fsw._emit(eventName, path); - if (eventName === EV_ADD_DIR) this._addToFsEvents(path, false, true); - } -} - -/** - * Handle symlinks encountered during directory scan - * @param {String} watchPath - file/dir path to be watched with fsevents - * @param {String} realPath - real path (in case of symlinks) - * @param {Function} transform - path transformer - * @param {Function} globFilter - path filter in case a glob pattern was provided - * @returns {Function} closer for the watcher instance -*/ -_watchWithFsEvents(watchPath, realPath, transform, globFilter) { - if (this.fsw.closed || this.fsw._isIgnored(watchPath)) return; - const opts = this.fsw.options; - const watchCallback = async (fullPath, flags, info) => { - if (this.fsw.closed) return; - if ( - opts.depth !== undefined && - calcDepth(fullPath, realPath) > opts.depth - ) return; - const path = transform(sysPath.join( - watchPath, sysPath.relative(watchPath, fullPath) - )); - if (globFilter && !globFilter(path)) return; - // ensure directories are tracked - const parent = sysPath.dirname(path); - const item = sysPath.basename(path); - const watchedDir = this.fsw._getWatchedDir( - info.type === FSEVENT_TYPE_DIRECTORY ? path : parent - ); - - // correct for wrong events emitted - if (wrongEventFlags.has(flags) || info.event === FSEVENT_UNKNOWN) { - if (typeof opts.ignored === FUNCTION_TYPE) { - let stats; - try { - stats = await stat(path); - } catch (error) {} - if (this.fsw.closed) return; - if (this.checkIgnored(path, stats)) return; - if (sameTypes(info, stats)) { - this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts); - } else { - this.handleEvent(EV_UNLINK, path, fullPath, realPath, parent, watchedDir, item, info, opts); - } - } else { - this.checkExists(path, fullPath, realPath, parent, watchedDir, item, info, opts); - } - } else { - switch (info.event) { - case FSEVENT_CREATED: - case FSEVENT_MODIFIED: - return this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts); - case FSEVENT_DELETED: - case FSEVENT_MOVED: - return this.checkExists(path, fullPath, realPath, parent, watchedDir, item, info, opts); - } - } - }; - - const closer = setFSEventsListener( - watchPath, - realPath, - watchCallback, - this.fsw._emitRaw - ); - - this.fsw._emitReady(); - return closer; -} - -/** - * Handle symlinks encountered during directory scan - * @param {String} linkPath path to symlink - * @param {String} fullPath absolute path to the symlink - * @param {Function} transform pre-existing path transformer - * @param {Number} curDepth level of subdirectories traversed to where symlink is - * @returns {Promise} - */ -async _handleFsEventsSymlink(linkPath, fullPath, transform, curDepth) { - // don't follow the same symlink more than once - if (this.fsw.closed || this.fsw._symlinkPaths.has(fullPath)) return; - - this.fsw._symlinkPaths.set(fullPath, true); - this.fsw._incrReadyCount(); - - try { - const linkTarget = await realpath(linkPath); - if (this.fsw.closed) return; - if (this.fsw._isIgnored(linkTarget)) { - return this.fsw._emitReady(); - } - - this.fsw._incrReadyCount(); - - // add the linkTarget for watching with a wrapper for transform - // that causes emitted paths to incorporate the link's path - this._addToFsEvents(linkTarget || linkPath, (path) => { - let aliasedPath = linkPath; - if (linkTarget && linkTarget !== DOT_SLASH) { - aliasedPath = path.replace(linkTarget, linkPath); - } else if (path !== DOT_SLASH) { - aliasedPath = sysPath.join(linkPath, path); - } - return transform(aliasedPath); - }, false, curDepth); - } catch(error) { - if (this.fsw._handleError(error)) { - return this.fsw._emitReady(); - } - } -} - -/** - * - * @param {Path} newPath - * @param {fs.Stats} stats - */ -emitAdd(newPath, stats, processPath, opts, forceAdd) { - const pp = processPath(newPath); - const isDir = stats.isDirectory(); - const dirObj = this.fsw._getWatchedDir(sysPath.dirname(pp)); - const base = sysPath.basename(pp); - - // ensure empty dirs get tracked - if (isDir) this.fsw._getWatchedDir(pp); - if (dirObj.has(base)) return; - dirObj.add(base); - - if (!opts.ignoreInitial || forceAdd === true) { - this.fsw._emit(isDir ? EV_ADD_DIR : EV_ADD, pp, stats); - } -} - -initWatch(realPath, path, wh, processPath) { - if (this.fsw.closed) return; - const closer = this._watchWithFsEvents( - wh.watchPath, - sysPath.resolve(realPath || wh.watchPath), - processPath, - wh.globFilter - ); - this.fsw._addPathCloser(path, closer); -} - -/** - * Handle added path with fsevents - * @param {String} path file/dir path or glob pattern - * @param {Function|Boolean=} transform converts working path to what the user expects - * @param {Boolean=} forceAdd ensure add is emitted - * @param {Number=} priorDepth Level of subdirectories already traversed. - * @returns {Promise} - */ -async _addToFsEvents(path, transform, forceAdd, priorDepth) { - if (this.fsw.closed) { - return; - } - const opts = this.fsw.options; - const processPath = typeof transform === FUNCTION_TYPE ? transform : IDENTITY_FN; - - const wh = this.fsw._getWatchHelpers(path); - - // evaluate what is at the path we're being asked to watch - try { - const stats = await statMethods[wh.statMethod](wh.watchPath); - if (this.fsw.closed) return; - if (this.fsw._isIgnored(wh.watchPath, stats)) { - throw null; - } - if (stats.isDirectory()) { - // emit addDir unless this is a glob parent - if (!wh.globFilter) this.emitAdd(processPath(path), stats, processPath, opts, forceAdd); - - // don't recurse further if it would exceed depth setting - if (priorDepth && priorDepth > opts.depth) return; - - // scan the contents of the dir - this.fsw._readdirp(wh.watchPath, { - fileFilter: entry => wh.filterPath(entry), - directoryFilter: entry => wh.filterDir(entry), - ...Depth(opts.depth - (priorDepth || 0)) - }).on(STR_DATA, (entry) => { - // need to check filterPath on dirs b/c filterDir is less restrictive - if (this.fsw.closed) { - return; - } - if (entry.stats.isDirectory() && !wh.filterPath(entry)) return; - - const joinedPath = sysPath.join(wh.watchPath, entry.path); - const {fullPath} = entry; - - if (wh.followSymlinks && entry.stats.isSymbolicLink()) { - // preserve the current depth here since it can't be derived from - // real paths past the symlink - const curDepth = opts.depth === undefined ? - undefined : calcDepth(joinedPath, sysPath.resolve(wh.watchPath)) + 1; - - this._handleFsEventsSymlink(joinedPath, fullPath, processPath, curDepth); - } else { - this.emitAdd(joinedPath, entry.stats, processPath, opts, forceAdd); - } - }).on(EV_ERROR, EMPTY_FN).on(STR_END, () => { - this.fsw._emitReady(); - }); - } else { - this.emitAdd(wh.watchPath, stats, processPath, opts, forceAdd); - this.fsw._emitReady(); - } - } catch (error) { - if (!error || this.fsw._handleError(error)) { - // TODO: Strange thing: "should not choke on an ignored watch path" will be failed without 2 ready calls -__- - this.fsw._emitReady(); - this.fsw._emitReady(); - } - } - - if (opts.persistent && forceAdd !== true) { - if (typeof transform === FUNCTION_TYPE) { - // realpath has already been resolved - this.initWatch(undefined, path, wh, processPath); - } else { - let realPath; - try { - realPath = await realpath(wh.watchPath); - } catch (e) {} - this.initWatch(realPath, path, wh, processPath); - } - } -} - -} - -module.exports = FsEventsHandler; -module.exports.canUse = canUse; diff --git a/node_modules/chokidar/lib/nodefs-handler.js b/node_modules/chokidar/lib/nodefs-handler.js deleted file mode 100644 index 199cfe9..0000000 --- a/node_modules/chokidar/lib/nodefs-handler.js +++ /dev/null @@ -1,654 +0,0 @@ -'use strict'; - -const fs = require('fs'); -const sysPath = require('path'); -const { promisify } = require('util'); -const isBinaryPath = require('is-binary-path'); -const { - isWindows, - isLinux, - EMPTY_FN, - EMPTY_STR, - KEY_LISTENERS, - KEY_ERR, - KEY_RAW, - HANDLER_KEYS, - EV_CHANGE, - EV_ADD, - EV_ADD_DIR, - EV_ERROR, - STR_DATA, - STR_END, - BRACE_START, - STAR -} = require('./constants'); - -const THROTTLE_MODE_WATCH = 'watch'; - -const open = promisify(fs.open); -const stat = promisify(fs.stat); -const lstat = promisify(fs.lstat); -const close = promisify(fs.close); -const fsrealpath = promisify(fs.realpath); - -const statMethods = { lstat, stat }; - -// TODO: emit errors properly. Example: EMFILE on Macos. -const foreach = (val, fn) => { - if (val instanceof Set) { - val.forEach(fn); - } else { - fn(val); - } -}; - -const addAndConvert = (main, prop, item) => { - let container = main[prop]; - if (!(container instanceof Set)) { - main[prop] = container = new Set([container]); - } - container.add(item); -}; - -const clearItem = cont => key => { - const set = cont[key]; - if (set instanceof Set) { - set.clear(); - } else { - delete cont[key]; - } -}; - -const delFromSet = (main, prop, item) => { - const container = main[prop]; - if (container instanceof Set) { - container.delete(item); - } else if (container === item) { - delete main[prop]; - } -}; - -const isEmptySet = (val) => val instanceof Set ? val.size === 0 : !val; - -/** - * @typedef {String} Path - */ - -// fs_watch helpers - -// object to hold per-process fs_watch instances -// (may be shared across chokidar FSWatcher instances) - -/** - * @typedef {Object} FsWatchContainer - * @property {Set} listeners - * @property {Set} errHandlers - * @property {Set} rawEmitters - * @property {fs.FSWatcher=} watcher - * @property {Boolean=} watcherUnusable - */ - -/** - * @type {Map} - */ -const FsWatchInstances = new Map(); - -/** - * Instantiates the fs_watch interface - * @param {String} path to be watched - * @param {Object} options to be passed to fs_watch - * @param {Function} listener main event handler - * @param {Function} errHandler emits info about errors - * @param {Function} emitRaw emits raw event data - * @returns {fs.FSWatcher} new fsevents instance - */ -function createFsWatchInstance(path, options, listener, errHandler, emitRaw) { - const handleEvent = (rawEvent, evPath) => { - listener(path); - emitRaw(rawEvent, evPath, {watchedPath: path}); - - // emit based on events occurring for files from a directory's watcher in - // case the file's watcher misses it (and rely on throttling to de-dupe) - if (evPath && path !== evPath) { - fsWatchBroadcast( - sysPath.resolve(path, evPath), KEY_LISTENERS, sysPath.join(path, evPath) - ); - } - }; - try { - return fs.watch(path, options, handleEvent); - } catch (error) { - errHandler(error); - } -} - -/** - * Helper for passing fs_watch event data to a collection of listeners - * @param {Path} fullPath absolute path bound to fs_watch instance - * @param {String} type listener type - * @param {*=} val1 arguments to be passed to listeners - * @param {*=} val2 - * @param {*=} val3 - */ -const fsWatchBroadcast = (fullPath, type, val1, val2, val3) => { - const cont = FsWatchInstances.get(fullPath); - if (!cont) return; - foreach(cont[type], (listener) => { - listener(val1, val2, val3); - }); -}; - -/** - * Instantiates the fs_watch interface or binds listeners - * to an existing one covering the same file system entry - * @param {String} path - * @param {String} fullPath absolute path - * @param {Object} options to be passed to fs_watch - * @param {Object} handlers container for event listener functions - */ -const setFsWatchListener = (path, fullPath, options, handlers) => { - const {listener, errHandler, rawEmitter} = handlers; - let cont = FsWatchInstances.get(fullPath); - - /** @type {fs.FSWatcher=} */ - let watcher; - if (!options.persistent) { - watcher = createFsWatchInstance( - path, options, listener, errHandler, rawEmitter - ); - return watcher.close.bind(watcher); - } - if (cont) { - addAndConvert(cont, KEY_LISTENERS, listener); - addAndConvert(cont, KEY_ERR, errHandler); - addAndConvert(cont, KEY_RAW, rawEmitter); - } else { - watcher = createFsWatchInstance( - path, - options, - fsWatchBroadcast.bind(null, fullPath, KEY_LISTENERS), - errHandler, // no need to use broadcast here - fsWatchBroadcast.bind(null, fullPath, KEY_RAW) - ); - if (!watcher) return; - watcher.on(EV_ERROR, async (error) => { - const broadcastErr = fsWatchBroadcast.bind(null, fullPath, KEY_ERR); - cont.watcherUnusable = true; // documented since Node 10.4.1 - // Workaround for https://github.com/joyent/node/issues/4337 - if (isWindows && error.code === 'EPERM') { - try { - const fd = await open(path, 'r'); - await close(fd); - broadcastErr(error); - } catch (err) {} - } else { - broadcastErr(error); - } - }); - cont = { - listeners: listener, - errHandlers: errHandler, - rawEmitters: rawEmitter, - watcher - }; - FsWatchInstances.set(fullPath, cont); - } - // const index = cont.listeners.indexOf(listener); - - // removes this instance's listeners and closes the underlying fs_watch - // instance if there are no more listeners left - return () => { - delFromSet(cont, KEY_LISTENERS, listener); - delFromSet(cont, KEY_ERR, errHandler); - delFromSet(cont, KEY_RAW, rawEmitter); - if (isEmptySet(cont.listeners)) { - // Check to protect against issue gh-730. - // if (cont.watcherUnusable) { - cont.watcher.close(); - // } - FsWatchInstances.delete(fullPath); - HANDLER_KEYS.forEach(clearItem(cont)); - cont.watcher = undefined; - Object.freeze(cont); - } - }; -}; - -// fs_watchFile helpers - -// object to hold per-process fs_watchFile instances -// (may be shared across chokidar FSWatcher instances) -const FsWatchFileInstances = new Map(); - -/** - * Instantiates the fs_watchFile interface or binds listeners - * to an existing one covering the same file system entry - * @param {String} path to be watched - * @param {String} fullPath absolute path - * @param {Object} options options to be passed to fs_watchFile - * @param {Object} handlers container for event listener functions - * @returns {Function} closer - */ -const setFsWatchFileListener = (path, fullPath, options, handlers) => { - const {listener, rawEmitter} = handlers; - let cont = FsWatchFileInstances.get(fullPath); - - /* eslint-disable no-unused-vars, prefer-destructuring */ - let listeners = new Set(); - let rawEmitters = new Set(); - - const copts = cont && cont.options; - if (copts && (copts.persistent < options.persistent || copts.interval > options.interval)) { - // "Upgrade" the watcher to persistence or a quicker interval. - // This creates some unlikely edge case issues if the user mixes - // settings in a very weird way, but solving for those cases - // doesn't seem worthwhile for the added complexity. - listeners = cont.listeners; - rawEmitters = cont.rawEmitters; - fs.unwatchFile(fullPath); - cont = undefined; - } - - /* eslint-enable no-unused-vars, prefer-destructuring */ - - if (cont) { - addAndConvert(cont, KEY_LISTENERS, listener); - addAndConvert(cont, KEY_RAW, rawEmitter); - } else { - // TODO - // listeners.add(listener); - // rawEmitters.add(rawEmitter); - cont = { - listeners: listener, - rawEmitters: rawEmitter, - options, - watcher: fs.watchFile(fullPath, options, (curr, prev) => { - foreach(cont.rawEmitters, (rawEmitter) => { - rawEmitter(EV_CHANGE, fullPath, {curr, prev}); - }); - const currmtime = curr.mtimeMs; - if (curr.size !== prev.size || currmtime > prev.mtimeMs || currmtime === 0) { - foreach(cont.listeners, (listener) => listener(path, curr)); - } - }) - }; - FsWatchFileInstances.set(fullPath, cont); - } - // const index = cont.listeners.indexOf(listener); - - // Removes this instance's listeners and closes the underlying fs_watchFile - // instance if there are no more listeners left. - return () => { - delFromSet(cont, KEY_LISTENERS, listener); - delFromSet(cont, KEY_RAW, rawEmitter); - if (isEmptySet(cont.listeners)) { - FsWatchFileInstances.delete(fullPath); - fs.unwatchFile(fullPath); - cont.options = cont.watcher = undefined; - Object.freeze(cont); - } - }; -}; - -/** - * @mixin - */ -class NodeFsHandler { - -/** - * @param {import("../index").FSWatcher} fsW - */ -constructor(fsW) { - this.fsw = fsW; - this._boundHandleError = (error) => fsW._handleError(error); -} - -/** - * Watch file for changes with fs_watchFile or fs_watch. - * @param {String} path to file or dir - * @param {Function} listener on fs change - * @returns {Function} closer for the watcher instance - */ -_watchWithNodeFs(path, listener) { - const opts = this.fsw.options; - const directory = sysPath.dirname(path); - const basename = sysPath.basename(path); - const parent = this.fsw._getWatchedDir(directory); - parent.add(basename); - const absolutePath = sysPath.resolve(path); - const options = {persistent: opts.persistent}; - if (!listener) listener = EMPTY_FN; - - let closer; - if (opts.usePolling) { - options.interval = opts.enableBinaryInterval && isBinaryPath(basename) ? - opts.binaryInterval : opts.interval; - closer = setFsWatchFileListener(path, absolutePath, options, { - listener, - rawEmitter: this.fsw._emitRaw - }); - } else { - closer = setFsWatchListener(path, absolutePath, options, { - listener, - errHandler: this._boundHandleError, - rawEmitter: this.fsw._emitRaw - }); - } - return closer; -} - -/** - * Watch a file and emit add event if warranted. - * @param {Path} file Path - * @param {fs.Stats} stats result of fs_stat - * @param {Boolean} initialAdd was the file added at watch instantiation? - * @returns {Function} closer for the watcher instance - */ -_handleFile(file, stats, initialAdd) { - if (this.fsw.closed) { - return; - } - const dirname = sysPath.dirname(file); - const basename = sysPath.basename(file); - const parent = this.fsw._getWatchedDir(dirname); - // stats is always present - let prevStats = stats; - - // if the file is already being watched, do nothing - if (parent.has(basename)) return; - - const listener = async (path, newStats) => { - if (!this.fsw._throttle(THROTTLE_MODE_WATCH, file, 5)) return; - if (!newStats || newStats.mtimeMs === 0) { - try { - const newStats = await stat(file); - if (this.fsw.closed) return; - // Check that change event was not fired because of changed only accessTime. - const at = newStats.atimeMs; - const mt = newStats.mtimeMs; - if (!at || at <= mt || mt !== prevStats.mtimeMs) { - this.fsw._emit(EV_CHANGE, file, newStats); - } - if (isLinux && prevStats.ino !== newStats.ino) { - this.fsw._closeFile(path) - prevStats = newStats; - this.fsw._addPathCloser(path, this._watchWithNodeFs(file, listener)); - } else { - prevStats = newStats; - } - } catch (error) { - // Fix issues where mtime is null but file is still present - this.fsw._remove(dirname, basename); - } - // add is about to be emitted if file not already tracked in parent - } else if (parent.has(basename)) { - // Check that change event was not fired because of changed only accessTime. - const at = newStats.atimeMs; - const mt = newStats.mtimeMs; - if (!at || at <= mt || mt !== prevStats.mtimeMs) { - this.fsw._emit(EV_CHANGE, file, newStats); - } - prevStats = newStats; - } - } - // kick off the watcher - const closer = this._watchWithNodeFs(file, listener); - - // emit an add event if we're supposed to - if (!(initialAdd && this.fsw.options.ignoreInitial) && this.fsw._isntIgnored(file)) { - if (!this.fsw._throttle(EV_ADD, file, 0)) return; - this.fsw._emit(EV_ADD, file, stats); - } - - return closer; -} - -/** - * Handle symlinks encountered while reading a dir. - * @param {Object} entry returned by readdirp - * @param {String} directory path of dir being read - * @param {String} path of this item - * @param {String} item basename of this item - * @returns {Promise} true if no more processing is needed for this entry. - */ -async _handleSymlink(entry, directory, path, item) { - if (this.fsw.closed) { - return; - } - const full = entry.fullPath; - const dir = this.fsw._getWatchedDir(directory); - - if (!this.fsw.options.followSymlinks) { - // watch symlink directly (don't follow) and detect changes - this.fsw._incrReadyCount(); - - let linkPath; - try { - linkPath = await fsrealpath(path); - } catch (e) { - this.fsw._emitReady(); - return true; - } - - if (this.fsw.closed) return; - if (dir.has(item)) { - if (this.fsw._symlinkPaths.get(full) !== linkPath) { - this.fsw._symlinkPaths.set(full, linkPath); - this.fsw._emit(EV_CHANGE, path, entry.stats); - } - } else { - dir.add(item); - this.fsw._symlinkPaths.set(full, linkPath); - this.fsw._emit(EV_ADD, path, entry.stats); - } - this.fsw._emitReady(); - return true; - } - - // don't follow the same symlink more than once - if (this.fsw._symlinkPaths.has(full)) { - return true; - } - - this.fsw._symlinkPaths.set(full, true); -} - -_handleRead(directory, initialAdd, wh, target, dir, depth, throttler) { - // Normalize the directory name on Windows - directory = sysPath.join(directory, EMPTY_STR); - - if (!wh.hasGlob) { - throttler = this.fsw._throttle('readdir', directory, 1000); - if (!throttler) return; - } - - const previous = this.fsw._getWatchedDir(wh.path); - const current = new Set(); - - let stream = this.fsw._readdirp(directory, { - fileFilter: entry => wh.filterPath(entry), - directoryFilter: entry => wh.filterDir(entry), - depth: 0 - }).on(STR_DATA, async (entry) => { - if (this.fsw.closed) { - stream = undefined; - return; - } - const item = entry.path; - let path = sysPath.join(directory, item); - current.add(item); - - if (entry.stats.isSymbolicLink() && await this._handleSymlink(entry, directory, path, item)) { - return; - } - - if (this.fsw.closed) { - stream = undefined; - return; - } - // Files that present in current directory snapshot - // but absent in previous are added to watch list and - // emit `add` event. - if (item === target || !target && !previous.has(item)) { - this.fsw._incrReadyCount(); - - // ensure relativeness of path is preserved in case of watcher reuse - path = sysPath.join(dir, sysPath.relative(dir, path)); - - this._addToNodeFs(path, initialAdd, wh, depth + 1); - } - }).on(EV_ERROR, this._boundHandleError); - - return new Promise(resolve => - stream.once(STR_END, () => { - if (this.fsw.closed) { - stream = undefined; - return; - } - const wasThrottled = throttler ? throttler.clear() : false; - - resolve(); - - // Files that absent in current directory snapshot - // but present in previous emit `remove` event - // and are removed from @watched[directory]. - previous.getChildren().filter((item) => { - return item !== directory && - !current.has(item) && - // in case of intersecting globs; - // a path may have been filtered out of this readdir, but - // shouldn't be removed because it matches a different glob - (!wh.hasGlob || wh.filterPath({ - fullPath: sysPath.resolve(directory, item) - })); - }).forEach((item) => { - this.fsw._remove(directory, item); - }); - - stream = undefined; - - // one more time for any missed in case changes came in extremely quickly - if (wasThrottled) this._handleRead(directory, false, wh, target, dir, depth, throttler); - }) - ); -} - -/** - * Read directory to add / remove files from `@watched` list and re-read it on change. - * @param {String} dir fs path - * @param {fs.Stats} stats - * @param {Boolean} initialAdd - * @param {Number} depth relative to user-supplied path - * @param {String} target child path targeted for watch - * @param {Object} wh Common watch helpers for this path - * @param {String} realpath - * @returns {Promise} closer for the watcher instance. - */ -async _handleDir(dir, stats, initialAdd, depth, target, wh, realpath) { - const parentDir = this.fsw._getWatchedDir(sysPath.dirname(dir)); - const tracked = parentDir.has(sysPath.basename(dir)); - if (!(initialAdd && this.fsw.options.ignoreInitial) && !target && !tracked) { - if (!wh.hasGlob || wh.globFilter(dir)) this.fsw._emit(EV_ADD_DIR, dir, stats); - } - - // ensure dir is tracked (harmless if redundant) - parentDir.add(sysPath.basename(dir)); - this.fsw._getWatchedDir(dir); - let throttler; - let closer; - - const oDepth = this.fsw.options.depth; - if ((oDepth == null || depth <= oDepth) && !this.fsw._symlinkPaths.has(realpath)) { - if (!target) { - await this._handleRead(dir, initialAdd, wh, target, dir, depth, throttler); - if (this.fsw.closed) return; - } - - closer = this._watchWithNodeFs(dir, (dirPath, stats) => { - // if current directory is removed, do nothing - if (stats && stats.mtimeMs === 0) return; - - this._handleRead(dirPath, false, wh, target, dir, depth, throttler); - }); - } - return closer; -} - -/** - * Handle added file, directory, or glob pattern. - * Delegates call to _handleFile / _handleDir after checks. - * @param {String} path to file or ir - * @param {Boolean} initialAdd was the file added at watch instantiation? - * @param {Object} priorWh depth relative to user-supplied path - * @param {Number} depth Child path actually targeted for watch - * @param {String=} target Child path actually targeted for watch - * @returns {Promise} - */ -async _addToNodeFs(path, initialAdd, priorWh, depth, target) { - const ready = this.fsw._emitReady; - if (this.fsw._isIgnored(path) || this.fsw.closed) { - ready(); - return false; - } - - const wh = this.fsw._getWatchHelpers(path, depth); - if (!wh.hasGlob && priorWh) { - wh.hasGlob = priorWh.hasGlob; - wh.globFilter = priorWh.globFilter; - wh.filterPath = entry => priorWh.filterPath(entry); - wh.filterDir = entry => priorWh.filterDir(entry); - } - - // evaluate what is at the path we're being asked to watch - try { - const stats = await statMethods[wh.statMethod](wh.watchPath); - if (this.fsw.closed) return; - if (this.fsw._isIgnored(wh.watchPath, stats)) { - ready(); - return false; - } - - const follow = this.fsw.options.followSymlinks && !path.includes(STAR) && !path.includes(BRACE_START); - let closer; - if (stats.isDirectory()) { - const absPath = sysPath.resolve(path); - const targetPath = follow ? await fsrealpath(path) : path; - if (this.fsw.closed) return; - closer = await this._handleDir(wh.watchPath, stats, initialAdd, depth, target, wh, targetPath); - if (this.fsw.closed) return; - // preserve this symlink's target path - if (absPath !== targetPath && targetPath !== undefined) { - this.fsw._symlinkPaths.set(absPath, targetPath); - } - } else if (stats.isSymbolicLink()) { - const targetPath = follow ? await fsrealpath(path) : path; - if (this.fsw.closed) return; - const parent = sysPath.dirname(wh.watchPath); - this.fsw._getWatchedDir(parent).add(wh.watchPath); - this.fsw._emit(EV_ADD, wh.watchPath, stats); - closer = await this._handleDir(parent, stats, initialAdd, depth, path, wh, targetPath); - if (this.fsw.closed) return; - - // preserve this symlink's target path - if (targetPath !== undefined) { - this.fsw._symlinkPaths.set(sysPath.resolve(path), targetPath); - } - } else { - closer = this._handleFile(wh.watchPath, stats, initialAdd); - } - ready(); - - this.fsw._addPathCloser(path, closer); - return false; - - } catch (error) { - if (this.fsw._handleError(error)) { - ready(); - return path; - } - } -} - -} - -module.exports = NodeFsHandler; diff --git a/node_modules/chokidar/node_modules/glob-parent/CHANGELOG.md b/node_modules/chokidar/node_modules/glob-parent/CHANGELOG.md deleted file mode 100644 index fb9de96..0000000 --- a/node_modules/chokidar/node_modules/glob-parent/CHANGELOG.md +++ /dev/null @@ -1,110 +0,0 @@ -### [5.1.2](https://github.com/gulpjs/glob-parent/compare/v5.1.1...v5.1.2) (2021-03-06) - - -### Bug Fixes - -* eliminate ReDoS ([#36](https://github.com/gulpjs/glob-parent/issues/36)) ([f923116](https://github.com/gulpjs/glob-parent/commit/f9231168b0041fea3f8f954b3cceb56269fc6366)) - -### [5.1.1](https://github.com/gulpjs/glob-parent/compare/v5.1.0...v5.1.1) (2021-01-27) - - -### Bug Fixes - -* unescape exclamation mark ([#26](https://github.com/gulpjs/glob-parent/issues/26)) ([a98874f](https://github.com/gulpjs/glob-parent/commit/a98874f1a59e407f4fb1beb0db4efa8392da60bb)) - -## [5.1.0](https://github.com/gulpjs/glob-parent/compare/v5.0.0...v5.1.0) (2021-01-27) - - -### Features - -* add `flipBackslashes` option to disable auto conversion of slashes (closes [#24](https://github.com/gulpjs/glob-parent/issues/24)) ([#25](https://github.com/gulpjs/glob-parent/issues/25)) ([eecf91d](https://github.com/gulpjs/glob-parent/commit/eecf91d5e3834ed78aee39c4eaaae654d76b87b3)) - -## [5.0.0](https://github.com/gulpjs/glob-parent/compare/v4.0.0...v5.0.0) (2021-01-27) - - -### ⚠ BREAKING CHANGES - -* Drop support for node <6 & bump dependencies - -### Miscellaneous Chores - -* Drop support for node <6 & bump dependencies ([896c0c0](https://github.com/gulpjs/glob-parent/commit/896c0c00b4e7362f60b96e7fc295ae929245255a)) - -## [4.0.0](https://github.com/gulpjs/glob-parent/compare/v3.1.0...v4.0.0) (2021-01-27) - - -### ⚠ BREAKING CHANGES - -* question marks are valid path characters on Windows so avoid flagging as a glob when alone -* Update is-glob dependency - -### Features - -* hoist regexps and strings for performance gains ([4a80667](https://github.com/gulpjs/glob-parent/commit/4a80667c69355c76a572a5892b0f133c8e1f457e)) -* question marks are valid path characters on Windows so avoid flagging as a glob when alone ([2a551dd](https://github.com/gulpjs/glob-parent/commit/2a551dd0dc3235e78bf3c94843d4107072d17841)) -* Update is-glob dependency ([e41fcd8](https://github.com/gulpjs/glob-parent/commit/e41fcd895d1f7bc617dba45c9d935a7949b9c281)) - -## [3.1.0](https://github.com/gulpjs/glob-parent/compare/v3.0.1...v3.1.0) (2021-01-27) - - -### Features - -* allow basic win32 backslash use ([272afa5](https://github.com/gulpjs/glob-parent/commit/272afa5fd070fc0f796386a5993d4ee4a846988b)) -* handle extglobs (parentheses) containing separators ([7db1bdb](https://github.com/gulpjs/glob-parent/commit/7db1bdb0756e55fd14619e8ce31aa31b17b117fd)) -* new approach to braces/brackets handling ([8269bd8](https://github.com/gulpjs/glob-parent/commit/8269bd89290d99fac9395a354fb56fdcdb80f0be)) -* pre-process braces/brackets sections ([9ef8a87](https://github.com/gulpjs/glob-parent/commit/9ef8a87f66b1a43d0591e7a8e4fc5a18415ee388)) -* preserve escaped brace/bracket at end of string ([8cfb0ba](https://github.com/gulpjs/glob-parent/commit/8cfb0ba84202d51571340dcbaf61b79d16a26c76)) - - -### Bug Fixes - -* trailing escaped square brackets ([99ec9fe](https://github.com/gulpjs/glob-parent/commit/99ec9fecc60ee488ded20a94dd4f18b4f55c4ccf)) - -### [3.0.1](https://github.com/gulpjs/glob-parent/compare/v3.0.0...v3.0.1) (2021-01-27) - - -### Features - -* use path-dirname ponyfill ([cdbea5f](https://github.com/gulpjs/glob-parent/commit/cdbea5f32a58a54e001a75ddd7c0fccd4776aacc)) - - -### Bug Fixes - -* unescape glob-escaped dirnames on output ([598c533](https://github.com/gulpjs/glob-parent/commit/598c533bdf49c1428bc063aa9b8db40c5a86b030)) - -## [3.0.0](https://github.com/gulpjs/glob-parent/compare/v2.0.0...v3.0.0) (2021-01-27) - - -### ⚠ BREAKING CHANGES - -* update is-glob dependency - -### Features - -* update is-glob dependency ([5c5f8ef](https://github.com/gulpjs/glob-parent/commit/5c5f8efcee362a8e7638cf8220666acd8784f6bd)) - -## [2.0.0](https://github.com/gulpjs/glob-parent/compare/v1.3.0...v2.0.0) (2021-01-27) - - -### Features - -* move up to dirname regardless of glob characters ([f97fb83](https://github.com/gulpjs/glob-parent/commit/f97fb83be2e0a9fc8d3b760e789d2ecadd6aa0c2)) - -## [1.3.0](https://github.com/gulpjs/glob-parent/compare/v1.2.0...v1.3.0) (2021-01-27) - -## [1.2.0](https://github.com/gulpjs/glob-parent/compare/v1.1.0...v1.2.0) (2021-01-27) - - -### Reverts - -* feat: make regex test strings smaller ([dc80fa9](https://github.com/gulpjs/glob-parent/commit/dc80fa9658dca20549cfeba44bbd37d5246fcce0)) - -## [1.1.0](https://github.com/gulpjs/glob-parent/compare/v1.0.0...v1.1.0) (2021-01-27) - - -### Features - -* make regex test strings smaller ([cd83220](https://github.com/gulpjs/glob-parent/commit/cd832208638f45169f986d80fcf66e401f35d233)) - -## 1.0.0 (2021-01-27) - diff --git a/node_modules/chokidar/node_modules/glob-parent/LICENSE b/node_modules/chokidar/node_modules/glob-parent/LICENSE deleted file mode 100644 index 63222d7..0000000 --- a/node_modules/chokidar/node_modules/glob-parent/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) 2015, 2019 Elan Shanker - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/chokidar/node_modules/glob-parent/README.md b/node_modules/chokidar/node_modules/glob-parent/README.md deleted file mode 100644 index 36a2793..0000000 --- a/node_modules/chokidar/node_modules/glob-parent/README.md +++ /dev/null @@ -1,137 +0,0 @@ -

    - - - -

    - -# glob-parent - -[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Azure Pipelines Build Status][azure-pipelines-image]][azure-pipelines-url] [![Travis Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] - -Extract the non-magic parent path from a glob string. - -## Usage - -```js -var globParent = require('glob-parent'); - -globParent('path/to/*.js'); // 'path/to' -globParent('/root/path/to/*.js'); // '/root/path/to' -globParent('/*.js'); // '/' -globParent('*.js'); // '.' -globParent('**/*.js'); // '.' -globParent('path/{to,from}'); // 'path' -globParent('path/!(to|from)'); // 'path' -globParent('path/?(to|from)'); // 'path' -globParent('path/+(to|from)'); // 'path' -globParent('path/*(to|from)'); // 'path' -globParent('path/@(to|from)'); // 'path' -globParent('path/**/*'); // 'path' - -// if provided a non-glob path, returns the nearest dir -globParent('path/foo/bar.js'); // 'path/foo' -globParent('path/foo/'); // 'path/foo' -globParent('path/foo'); // 'path' (see issue #3 for details) -``` - -## API - -### `globParent(maybeGlobString, [options])` - -Takes a string and returns the part of the path before the glob begins. Be aware of Escaping rules and Limitations below. - -#### options - -```js -{ - // Disables the automatic conversion of slashes for Windows - flipBackslashes: true -} -``` - -## Escaping - -The following characters have special significance in glob patterns and must be escaped if you want them to be treated as regular path characters: - -- `?` (question mark) unless used as a path segment alone -- `*` (asterisk) -- `|` (pipe) -- `(` (opening parenthesis) -- `)` (closing parenthesis) -- `{` (opening curly brace) -- `}` (closing curly brace) -- `[` (opening bracket) -- `]` (closing bracket) - -**Example** - -```js -globParent('foo/[bar]/') // 'foo' -globParent('foo/\\[bar]/') // 'foo/[bar]' -``` - -## Limitations - -### Braces & Brackets -This library attempts a quick and imperfect method of determining which path -parts have glob magic without fully parsing/lexing the pattern. There are some -advanced use cases that can trip it up, such as nested braces where the outer -pair is escaped and the inner one contains a path separator. If you find -yourself in the unlikely circumstance of being affected by this or need to -ensure higher-fidelity glob handling in your library, it is recommended that you -pre-process your input with [expand-braces] and/or [expand-brackets]. - -### Windows -Backslashes are not valid path separators for globs. If a path with backslashes -is provided anyway, for simple cases, glob-parent will replace the path -separator for you and return the non-glob parent path (now with -forward-slashes, which are still valid as Windows path separators). - -This cannot be used in conjunction with escape characters. - -```js -// BAD -globParent('C:\\Program Files \\(x86\\)\\*.ext') // 'C:/Program Files /(x86/)' - -// GOOD -globParent('C:/Program Files\\(x86\\)/*.ext') // 'C:/Program Files (x86)' -``` - -If you are using escape characters for a pattern without path parts (i.e. -relative to `cwd`), prefix with `./` to avoid confusing glob-parent. - -```js -// BAD -globParent('foo \\[bar]') // 'foo ' -globParent('foo \\[bar]*') // 'foo ' - -// GOOD -globParent('./foo \\[bar]') // 'foo [bar]' -globParent('./foo \\[bar]*') // '.' -``` - -## License - -ISC - -[expand-braces]: https://github.com/jonschlinkert/expand-braces -[expand-brackets]: https://github.com/jonschlinkert/expand-brackets - -[downloads-image]: https://img.shields.io/npm/dm/glob-parent.svg -[npm-url]: https://www.npmjs.com/package/glob-parent -[npm-image]: https://img.shields.io/npm/v/glob-parent.svg - -[azure-pipelines-url]: https://dev.azure.com/gulpjs/gulp/_build/latest?definitionId=2&branchName=master -[azure-pipelines-image]: https://dev.azure.com/gulpjs/gulp/_apis/build/status/glob-parent?branchName=master - -[travis-url]: https://travis-ci.org/gulpjs/glob-parent -[travis-image]: https://img.shields.io/travis/gulpjs/glob-parent.svg?label=travis-ci - -[appveyor-url]: https://ci.appveyor.com/project/gulpjs/glob-parent -[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/glob-parent.svg?label=appveyor - -[coveralls-url]: https://coveralls.io/r/gulpjs/glob-parent -[coveralls-image]: https://img.shields.io/coveralls/gulpjs/glob-parent/master.svg - -[gitter-url]: https://gitter.im/gulpjs/gulp -[gitter-image]: https://badges.gitter.im/gulpjs/gulp.svg diff --git a/node_modules/chokidar/node_modules/glob-parent/index.js b/node_modules/chokidar/node_modules/glob-parent/index.js deleted file mode 100644 index 09e257e..0000000 --- a/node_modules/chokidar/node_modules/glob-parent/index.js +++ /dev/null @@ -1,42 +0,0 @@ -'use strict'; - -var isGlob = require('is-glob'); -var pathPosixDirname = require('path').posix.dirname; -var isWin32 = require('os').platform() === 'win32'; - -var slash = '/'; -var backslash = /\\/g; -var enclosure = /[\{\[].*[\}\]]$/; -var globby = /(^|[^\\])([\{\[]|\([^\)]+$)/; -var escaped = /\\([\!\*\?\|\[\]\(\)\{\}])/g; - -/** - * @param {string} str - * @param {Object} opts - * @param {boolean} [opts.flipBackslashes=true] - * @returns {string} - */ -module.exports = function globParent(str, opts) { - var options = Object.assign({ flipBackslashes: true }, opts); - - // flip windows path separators - if (options.flipBackslashes && isWin32 && str.indexOf(slash) < 0) { - str = str.replace(backslash, slash); - } - - // special case for strings ending in enclosure containing path separator - if (enclosure.test(str)) { - str += slash; - } - - // preserves full path in case of trailing path separator - str += 'a'; - - // remove path parts that are globby - do { - str = pathPosixDirname(str); - } while (isGlob(str) || globby.test(str)); - - // remove escape chars and return result - return str.replace(escaped, '$1'); -}; diff --git a/node_modules/chokidar/node_modules/glob-parent/package.json b/node_modules/chokidar/node_modules/glob-parent/package.json deleted file mode 100644 index 125c971..0000000 --- a/node_modules/chokidar/node_modules/glob-parent/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "glob-parent", - "version": "5.1.2", - "description": "Extract the non-magic parent path from a glob string.", - "author": "Gulp Team (https://gulpjs.com/)", - "contributors": [ - "Elan Shanker (https://github.com/es128)", - "Blaine Bublitz " - ], - "repository": "gulpjs/glob-parent", - "license": "ISC", - "engines": { - "node": ">= 6" - }, - "main": "index.js", - "files": [ - "LICENSE", - "index.js" - ], - "scripts": { - "lint": "eslint .", - "pretest": "npm run lint", - "test": "nyc mocha --async-only", - "azure-pipelines": "nyc mocha --async-only --reporter xunit -O output=test.xunit", - "coveralls": "nyc report --reporter=text-lcov | coveralls" - }, - "dependencies": { - "is-glob": "^4.0.1" - }, - "devDependencies": { - "coveralls": "^3.0.11", - "eslint": "^2.13.1", - "eslint-config-gulp": "^3.0.1", - "expect": "^1.20.2", - "mocha": "^6.0.2", - "nyc": "^13.3.0" - }, - "keywords": [ - "glob", - "parent", - "strip", - "path", - "dirname", - "directory", - "base", - "wildcard" - ] -} diff --git a/node_modules/chokidar/package.json b/node_modules/chokidar/package.json deleted file mode 100644 index e8f8b3d..0000000 --- a/node_modules/chokidar/package.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "name": "chokidar", - "description": "Minimal and efficient cross-platform file watching library", - "version": "3.6.0", - "homepage": "https://github.com/paulmillr/chokidar", - "author": "Paul Miller (https://paulmillr.com)", - "contributors": [ - "Paul Miller (https://paulmillr.com)", - "Elan Shanker" - ], - "engines": { - "node": ">= 8.10.0" - }, - "main": "index.js", - "types": "./types/index.d.ts", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "devDependencies": { - "@types/node": "^14", - "chai": "^4.3", - "dtslint": "^3.3.0", - "eslint": "^7.0.0", - "mocha": "^7.0.0", - "rimraf": "^3.0.0", - "sinon": "^9.0.1", - "sinon-chai": "^3.3.0", - "typescript": "^4.4.3", - "upath": "^1.2.0" - }, - "files": [ - "index.js", - "lib/*.js", - "types/index.d.ts" - ], - "repository": { - "type": "git", - "url": "git+https://github.com/paulmillr/chokidar.git" - }, - "bugs": { - "url": "https://github.com/paulmillr/chokidar/issues" - }, - "license": "MIT", - "scripts": { - "dtslint": "dtslint types", - "lint": "eslint --report-unused-disable-directives --ignore-path .gitignore .", - "build": "npm ls", - "mocha": "mocha --exit --timeout 90000", - "test": "npm run lint && npm run mocha" - }, - "keywords": [ - "fs", - "watch", - "watchFile", - "watcher", - "watching", - "file", - "fsevents" - ], - "funding": "https://paulmillr.com/funding/" -} diff --git a/node_modules/chokidar/types/index.d.ts b/node_modules/chokidar/types/index.d.ts deleted file mode 100644 index 4558066..0000000 --- a/node_modules/chokidar/types/index.d.ts +++ /dev/null @@ -1,192 +0,0 @@ -// TypeScript Version: 3.0 - -/// - -import * as fs from "fs"; -import { EventEmitter } from "events"; -import { Matcher } from 'anymatch'; - -export class FSWatcher extends EventEmitter implements fs.FSWatcher { - options: WatchOptions; - - /** - * Constructs a new FSWatcher instance with optional WatchOptions parameter. - */ - constructor(options?: WatchOptions); - - /** - * Add files, directories, or glob patterns for tracking. Takes an array of strings or just one - * string. - */ - add(paths: string | ReadonlyArray): this; - - /** - * Stop watching files, directories, or glob patterns. Takes an array of strings or just one - * string. - */ - unwatch(paths: string | ReadonlyArray): this; - - /** - * Returns an object representing all the paths on the file system being watched by this - * `FSWatcher` instance. The object's keys are all the directories (using absolute paths unless - * the `cwd` option was used), and the values are arrays of the names of the items contained in - * each directory. - */ - getWatched(): { - [directory: string]: string[]; - }; - - /** - * Removes all listeners from watched files. - */ - close(): Promise; - - on(event: 'add'|'addDir'|'change', listener: (path: string, stats?: fs.Stats) => void): this; - - on(event: 'all', listener: (eventName: 'add'|'addDir'|'change'|'unlink'|'unlinkDir', path: string, stats?: fs.Stats) => void): this; - - /** - * Error occurred - */ - on(event: 'error', listener: (error: Error) => void): this; - - /** - * Exposes the native Node `fs.FSWatcher events` - */ - on(event: 'raw', listener: (eventName: string, path: string, details: any) => void): this; - - /** - * Fires when the initial scan is complete - */ - on(event: 'ready', listener: () => void): this; - - on(event: 'unlink'|'unlinkDir', listener: (path: string) => void): this; - - on(event: string, listener: (...args: any[]) => void): this; - - ref(): this; - - unref(): this; -} - -export interface WatchOptions { - /** - * Indicates whether the process should continue to run as long as files are being watched. If - * set to `false` when using `fsevents` to watch, no more events will be emitted after `ready`, - * even if the process continues to run. - */ - persistent?: boolean; - - /** - * ([anymatch](https://github.com/micromatch/anymatch)-compatible definition) Defines files/paths to - * be ignored. The whole relative or absolute path is tested, not just filename. If a function - * with two arguments is provided, it gets called twice per path - once with a single argument - * (the path), second time with two arguments (the path and the - * [`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) object of that path). - */ - ignored?: Matcher; - - /** - * If set to `false` then `add`/`addDir` events are also emitted for matching paths while - * instantiating the watching as chokidar discovers these file paths (before the `ready` event). - */ - ignoreInitial?: boolean; - - /** - * When `false`, only the symlinks themselves will be watched for changes instead of following - * the link references and bubbling events through the link's path. - */ - followSymlinks?: boolean; - - /** - * The base directory from which watch `paths` are to be derived. Paths emitted with events will - * be relative to this. - */ - cwd?: string; - - /** - * If set to true then the strings passed to .watch() and .add() are treated as literal path - * names, even if they look like globs. Default: false. - */ - disableGlobbing?: boolean; - - /** - * Whether to use fs.watchFile (backed by polling), or fs.watch. If polling leads to high CPU - * utilization, consider setting this to `false`. It is typically necessary to **set this to - * `true` to successfully watch files over a network**, and it may be necessary to successfully - * watch files in other non-standard situations. Setting to `true` explicitly on OS X overrides - * the `useFsEvents` default. - */ - usePolling?: boolean; - - /** - * Whether to use the `fsevents` watching interface if available. When set to `true` explicitly - * and `fsevents` is available this supercedes the `usePolling` setting. When set to `false` on - * OS X, `usePolling: true` becomes the default. - */ - useFsEvents?: boolean; - - /** - * If relying upon the [`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) object that - * may get passed with `add`, `addDir`, and `change` events, set this to `true` to ensure it is - * provided even in cases where it wasn't already available from the underlying watch events. - */ - alwaysStat?: boolean; - - /** - * If set, limits how many levels of subdirectories will be traversed. - */ - depth?: number; - - /** - * Interval of file system polling. - */ - interval?: number; - - /** - * Interval of file system polling for binary files. ([see list of binary extensions](https://gi - * thub.com/sindresorhus/binary-extensions/blob/master/binary-extensions.json)) - */ - binaryInterval?: number; - - /** - * Indicates whether to watch files that don't have read permissions if possible. If watching - * fails due to `EPERM` or `EACCES` with this set to `true`, the errors will be suppressed - * silently. - */ - ignorePermissionErrors?: boolean; - - /** - * `true` if `useFsEvents` and `usePolling` are `false`). Automatically filters out artifacts - * that occur when using editors that use "atomic writes" instead of writing directly to the - * source file. If a file is re-added within 100 ms of being deleted, Chokidar emits a `change` - * event rather than `unlink` then `add`. If the default of 100 ms does not work well for you, - * you can override it by setting `atomic` to a custom value, in milliseconds. - */ - atomic?: boolean | number; - - /** - * can be set to an object in order to adjust timing params: - */ - awaitWriteFinish?: AwaitWriteFinishOptions | boolean; -} - -export interface AwaitWriteFinishOptions { - /** - * Amount of time in milliseconds for a file size to remain constant before emitting its event. - */ - stabilityThreshold?: number; - - /** - * File size polling interval. - */ - pollInterval?: number; -} - -/** - * produces an instance of `FSWatcher`. - */ -export function watch( - paths: string | ReadonlyArray, - options?: WatchOptions -): FSWatcher; diff --git a/node_modules/cliui/CHANGELOG.md b/node_modules/cliui/CHANGELOG.md deleted file mode 100644 index 6a77f8f..0000000 --- a/node_modules/cliui/CHANGELOG.md +++ /dev/null @@ -1,76 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. - -## [6.0.0](https://www.github.com/yargs/cliui/compare/v5.0.0...v6.0.0) (2019-11-10) - - -### ⚠ BREAKING CHANGES - -* update deps, drop Node 6 - -### Code Refactoring - -* update deps, drop Node 6 ([62056df](https://www.github.com/yargs/cliui/commit/62056df)) - -## [5.0.0](https://github.com/yargs/cliui/compare/v4.1.0...v5.0.0) (2019-04-10) - - -### Bug Fixes - -* Update wrap-ansi to fix compatibility with latest versions of chalk. ([#60](https://github.com/yargs/cliui/issues/60)) ([7bf79ae](https://github.com/yargs/cliui/commit/7bf79ae)) - - -### BREAKING CHANGES - -* Drop support for node < 6. - - - - -## [4.1.0](https://github.com/yargs/cliui/compare/v4.0.0...v4.1.0) (2018-04-23) - - -### Features - -* add resetOutput method ([#57](https://github.com/yargs/cliui/issues/57)) ([7246902](https://github.com/yargs/cliui/commit/7246902)) - - - - -## [4.0.0](https://github.com/yargs/cliui/compare/v3.2.0...v4.0.0) (2017-12-18) - - -### Bug Fixes - -* downgrades strip-ansi to version 3.0.1 ([#54](https://github.com/yargs/cliui/issues/54)) ([5764c46](https://github.com/yargs/cliui/commit/5764c46)) -* set env variable FORCE_COLOR. ([#56](https://github.com/yargs/cliui/issues/56)) ([7350e36](https://github.com/yargs/cliui/commit/7350e36)) - - -### Chores - -* drop support for node < 4 ([#53](https://github.com/yargs/cliui/issues/53)) ([b105376](https://github.com/yargs/cliui/commit/b105376)) - - -### Features - -* add fallback for window width ([#45](https://github.com/yargs/cliui/issues/45)) ([d064922](https://github.com/yargs/cliui/commit/d064922)) - - -### BREAKING CHANGES - -* officially drop support for Node < 4 - - - - -## [3.2.0](https://github.com/yargs/cliui/compare/v3.1.2...v3.2.0) (2016-04-11) - - -### Bug Fixes - -* reduces tarball size ([acc6c33](https://github.com/yargs/cliui/commit/acc6c33)) - -### Features - -* adds standard-version for release management ([ff84e32](https://github.com/yargs/cliui/commit/ff84e32)) diff --git a/node_modules/cliui/LICENSE.txt b/node_modules/cliui/LICENSE.txt deleted file mode 100644 index c7e2747..0000000 --- a/node_modules/cliui/LICENSE.txt +++ /dev/null @@ -1,14 +0,0 @@ -Copyright (c) 2015, Contributors - -Permission to use, copy, modify, and/or distribute this software -for any purpose with or without fee is hereby granted, provided -that the above copyright notice and this permission notice -appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE -LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES -OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/cliui/README.md b/node_modules/cliui/README.md deleted file mode 100644 index deacfa0..0000000 --- a/node_modules/cliui/README.md +++ /dev/null @@ -1,115 +0,0 @@ -# cliui - -[![Build Status](https://travis-ci.org/yargs/cliui.svg)](https://travis-ci.org/yargs/cliui) -[![Coverage Status](https://coveralls.io/repos/yargs/cliui/badge.svg?branch=)](https://coveralls.io/r/yargs/cliui?branch=) -[![NPM version](https://img.shields.io/npm/v/cliui.svg)](https://www.npmjs.com/package/cliui) -[![Standard Version](https://img.shields.io/badge/release-standard%20version-brightgreen.svg)](https://github.com/conventional-changelog/standard-version) - -easily create complex multi-column command-line-interfaces. - -## Example - -```js -var ui = require('cliui')() - -ui.div('Usage: $0 [command] [options]') - -ui.div({ - text: 'Options:', - padding: [2, 0, 2, 0] -}) - -ui.div( - { - text: "-f, --file", - width: 20, - padding: [0, 4, 0, 4] - }, - { - text: "the file to load." + - chalk.green("(if this description is long it wraps).") - , - width: 20 - }, - { - text: chalk.red("[required]"), - align: 'right' - } -) - -console.log(ui.toString()) -``` - - - -## Layout DSL - -cliui exposes a simple layout DSL: - -If you create a single `ui.div`, passing a string rather than an -object: - -* `\n`: characters will be interpreted as new rows. -* `\t`: characters will be interpreted as new columns. -* `\s`: characters will be interpreted as padding. - -**as an example...** - -```js -var ui = require('./')({ - width: 60 -}) - -ui.div( - 'Usage: node ./bin/foo.js\n' + - ' \t provide a regex\n' + - ' \t provide a glob\t [required]' -) - -console.log(ui.toString()) -``` - -**will output:** - -```shell -Usage: node ./bin/foo.js - provide a regex - provide a glob [required] -``` - -## Methods - -```js -cliui = require('cliui') -``` - -### cliui({width: integer}) - -Specify the maximum width of the UI being generated. -If no width is provided, cliui will try to get the current window's width and use it, and if that doesn't work, width will be set to `80`. - -### cliui({wrap: boolean}) - -Enable or disable the wrapping of text in a column. - -### cliui.div(column, column, column) - -Create a row with any number of columns, a column -can either be a string, or an object with the following -options: - -* **text:** some text to place in the column. -* **width:** the width of a column. -* **align:** alignment, `right` or `center`. -* **padding:** `[top, right, bottom, left]`. -* **border:** should a border be placed around the div? - -### cliui.span(column, column, column) - -Similar to `div`, except the next row will be appended without -a new line being created. - -### cliui.resetOutput() - -Resets the UI elements of the current cliui instance, maintaining the values -set for `width` and `wrap`. diff --git a/node_modules/cliui/index.js b/node_modules/cliui/index.js deleted file mode 100644 index e917b00..0000000 --- a/node_modules/cliui/index.js +++ /dev/null @@ -1,354 +0,0 @@ -'use strict' - -const stringWidth = require('string-width') -const stripAnsi = require('strip-ansi') -const wrap = require('wrap-ansi') - -const align = { - right: alignRight, - center: alignCenter -} -const top = 0 -const right = 1 -const bottom = 2 -const left = 3 - -class UI { - constructor (opts) { - this.width = opts.width - this.wrap = opts.wrap - this.rows = [] - } - - span (...args) { - const cols = this.div(...args) - cols.span = true - } - - resetOutput () { - this.rows = [] - } - - div (...args) { - if (args.length === 0) { - this.div('') - } - - if (this.wrap && this._shouldApplyLayoutDSL(...args)) { - return this._applyLayoutDSL(args[0]) - } - - const cols = args.map(arg => { - if (typeof arg === 'string') { - return this._colFromString(arg) - } - - return arg - }) - - this.rows.push(cols) - return cols - } - - _shouldApplyLayoutDSL (...args) { - return args.length === 1 && typeof args[0] === 'string' && - /[\t\n]/.test(args[0]) - } - - _applyLayoutDSL (str) { - const rows = str.split('\n').map(row => row.split('\t')) - let leftColumnWidth = 0 - - // simple heuristic for layout, make sure the - // second column lines up along the left-hand. - // don't allow the first column to take up more - // than 50% of the screen. - rows.forEach(columns => { - if (columns.length > 1 && stringWidth(columns[0]) > leftColumnWidth) { - leftColumnWidth = Math.min( - Math.floor(this.width * 0.5), - stringWidth(columns[0]) - ) - } - }) - - // generate a table: - // replacing ' ' with padding calculations. - // using the algorithmically generated width. - rows.forEach(columns => { - this.div(...columns.map((r, i) => { - return { - text: r.trim(), - padding: this._measurePadding(r), - width: (i === 0 && columns.length > 1) ? leftColumnWidth : undefined - } - })) - }) - - return this.rows[this.rows.length - 1] - } - - _colFromString (text) { - return { - text, - padding: this._measurePadding(text) - } - } - - _measurePadding (str) { - // measure padding without ansi escape codes - const noAnsi = stripAnsi(str) - return [0, noAnsi.match(/\s*$/)[0].length, 0, noAnsi.match(/^\s*/)[0].length] - } - - toString () { - const lines = [] - - this.rows.forEach(row => { - this.rowToString(row, lines) - }) - - // don't display any lines with the - // hidden flag set. - return lines - .filter(line => !line.hidden) - .map(line => line.text) - .join('\n') - } - - rowToString (row, lines) { - this._rasterize(row).forEach((rrow, r) => { - let str = '' - rrow.forEach((col, c) => { - const { width } = row[c] // the width with padding. - const wrapWidth = this._negatePadding(row[c]) // the width without padding. - - let ts = col // temporary string used during alignment/padding. - - if (wrapWidth > stringWidth(col)) { - ts += ' '.repeat(wrapWidth - stringWidth(col)) - } - - // align the string within its column. - if (row[c].align && row[c].align !== 'left' && this.wrap) { - ts = align[row[c].align](ts, wrapWidth) - if (stringWidth(ts) < wrapWidth) { - ts += ' '.repeat(width - stringWidth(ts) - 1) - } - } - - // apply border and padding to string. - const padding = row[c].padding || [0, 0, 0, 0] - if (padding[left]) { - str += ' '.repeat(padding[left]) - } - - str += addBorder(row[c], ts, '| ') - str += ts - str += addBorder(row[c], ts, ' |') - if (padding[right]) { - str += ' '.repeat(padding[right]) - } - - // if prior row is span, try to render the - // current row on the prior line. - if (r === 0 && lines.length > 0) { - str = this._renderInline(str, lines[lines.length - 1]) - } - }) - - // remove trailing whitespace. - lines.push({ - text: str.replace(/ +$/, ''), - span: row.span - }) - }) - - return lines - } - - // if the full 'source' can render in - // the target line, do so. - _renderInline (source, previousLine) { - const leadingWhitespace = source.match(/^ */)[0].length - const target = previousLine.text - const targetTextWidth = stringWidth(target.trimRight()) - - if (!previousLine.span) { - return source - } - - // if we're not applying wrapping logic, - // just always append to the span. - if (!this.wrap) { - previousLine.hidden = true - return target + source - } - - if (leadingWhitespace < targetTextWidth) { - return source - } - - previousLine.hidden = true - - return target.trimRight() + ' '.repeat(leadingWhitespace - targetTextWidth) + source.trimLeft() - } - - _rasterize (row) { - const rrows = [] - const widths = this._columnWidths(row) - let wrapped - - // word wrap all columns, and create - // a data-structure that is easy to rasterize. - row.forEach((col, c) => { - // leave room for left and right padding. - col.width = widths[c] - if (this.wrap) { - wrapped = wrap(col.text, this._negatePadding(col), { hard: true }).split('\n') - } else { - wrapped = col.text.split('\n') - } - - if (col.border) { - wrapped.unshift('.' + '-'.repeat(this._negatePadding(col) + 2) + '.') - wrapped.push("'" + '-'.repeat(this._negatePadding(col) + 2) + "'") - } - - // add top and bottom padding. - if (col.padding) { - wrapped.unshift(...new Array(col.padding[top] || 0).fill('')) - wrapped.push(...new Array(col.padding[bottom] || 0).fill('')) - } - - wrapped.forEach((str, r) => { - if (!rrows[r]) { - rrows.push([]) - } - - const rrow = rrows[r] - - for (let i = 0; i < c; i++) { - if (rrow[i] === undefined) { - rrow.push('') - } - } - - rrow.push(str) - }) - }) - - return rrows - } - - _negatePadding (col) { - let wrapWidth = col.width - if (col.padding) { - wrapWidth -= (col.padding[left] || 0) + (col.padding[right] || 0) - } - - if (col.border) { - wrapWidth -= 4 - } - - return wrapWidth - } - - _columnWidths (row) { - if (!this.wrap) { - return row.map(col => { - return col.width || stringWidth(col.text) - }) - } - - let unset = row.length - let remainingWidth = this.width - - // column widths can be set in config. - const widths = row.map(col => { - if (col.width) { - unset-- - remainingWidth -= col.width - return col.width - } - - return undefined - }) - - // any unset widths should be calculated. - const unsetWidth = unset ? Math.floor(remainingWidth / unset) : 0 - - return widths.map((w, i) => { - if (w === undefined) { - return Math.max(unsetWidth, _minWidth(row[i])) - } - - return w - }) - } -} - -function addBorder (col, ts, style) { - if (col.border) { - if (/[.']-+[.']/.test(ts)) { - return '' - } - - if (ts.trim().length !== 0) { - return style - } - - return ' ' - } - - return '' -} - -// calculates the minimum width of -// a column, based on padding preferences. -function _minWidth (col) { - const padding = col.padding || [] - const minWidth = 1 + (padding[left] || 0) + (padding[right] || 0) - if (col.border) { - return minWidth + 4 - } - - return minWidth -} - -function getWindowWidth () { - /* istanbul ignore next: depends on terminal */ - if (typeof process === 'object' && process.stdout && process.stdout.columns) { - return process.stdout.columns - } -} - -function alignRight (str, width) { - str = str.trim() - const strWidth = stringWidth(str) - - if (strWidth < width) { - return ' '.repeat(width - strWidth) + str - } - - return str -} - -function alignCenter (str, width) { - str = str.trim() - const strWidth = stringWidth(str) - - /* istanbul ignore next */ - if (strWidth >= width) { - return str - } - - return ' '.repeat((width - strWidth) >> 1) + str -} - -module.exports = function (opts = {}) { - return new UI({ - width: opts.width || getWindowWidth() || /* istanbul ignore next */ 80, - wrap: opts.wrap !== false - }) -} diff --git a/node_modules/cliui/package.json b/node_modules/cliui/package.json deleted file mode 100644 index f92fd10..0000000 --- a/node_modules/cliui/package.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "name": "cliui", - "version": "6.0.0", - "description": "easily create complex multi-column command-line-interfaces", - "main": "index.js", - "scripts": { - "pretest": "standard", - "test": "nyc mocha", - "coverage": "nyc --reporter=text-lcov mocha | coveralls" - }, - "repository": { - "type": "git", - "url": "http://github.com/yargs/cliui.git" - }, - "config": { - "blanket": { - "pattern": [ - "index.js" - ], - "data-cover-never": [ - "node_modules", - "test" - ], - "output-reporter": "spec" - } - }, - "standard": { - "ignore": [ - "**/example/**" - ], - "globals": [ - "it" - ] - }, - "keywords": [ - "cli", - "command-line", - "layout", - "design", - "console", - "wrap", - "table" - ], - "author": "Ben Coe ", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - }, - "devDependencies": { - "chai": "^4.2.0", - "chalk": "^3.0.0", - "coveralls": "^3.0.3", - "mocha": "^6.2.2", - "nyc": "^14.1.1", - "standard": "^12.0.1" - }, - "files": [ - "index.js" - ], - "engine": { - "node": ">=8" - } -} diff --git a/node_modules/color-convert/CHANGELOG.md b/node_modules/color-convert/CHANGELOG.md deleted file mode 100644 index 0a7bce4..0000000 --- a/node_modules/color-convert/CHANGELOG.md +++ /dev/null @@ -1,54 +0,0 @@ -# 1.0.0 - 2016-01-07 - -- Removed: unused speed test -- Added: Automatic routing between previously unsupported conversions -([#27](https://github.com/Qix-/color-convert/pull/27)) -- Removed: `xxx2xxx()` and `xxx2xxxRaw()` functions -([#27](https://github.com/Qix-/color-convert/pull/27)) -- Removed: `convert()` class -([#27](https://github.com/Qix-/color-convert/pull/27)) -- Changed: all functions to lookup dictionary -([#27](https://github.com/Qix-/color-convert/pull/27)) -- Changed: `ansi` to `ansi256` -([#27](https://github.com/Qix-/color-convert/pull/27)) -- Fixed: argument grouping for functions requiring only one argument -([#27](https://github.com/Qix-/color-convert/pull/27)) - -# 0.6.0 - 2015-07-23 - -- Added: methods to handle -[ANSI](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors) 16/256 colors: - - rgb2ansi16 - - rgb2ansi - - hsl2ansi16 - - hsl2ansi - - hsv2ansi16 - - hsv2ansi - - hwb2ansi16 - - hwb2ansi - - cmyk2ansi16 - - cmyk2ansi - - keyword2ansi16 - - keyword2ansi - - ansi162rgb - - ansi162hsl - - ansi162hsv - - ansi162hwb - - ansi162cmyk - - ansi162keyword - - ansi2rgb - - ansi2hsl - - ansi2hsv - - ansi2hwb - - ansi2cmyk - - ansi2keyword -([#18](https://github.com/harthur/color-convert/pull/18)) - -# 0.5.3 - 2015-06-02 - -- Fixed: hsl2hsv does not return `NaN` anymore when using `[0,0,0]` -([#15](https://github.com/harthur/color-convert/issues/15)) - ---- - -Check out commit logs for older releases diff --git a/node_modules/color-convert/LICENSE b/node_modules/color-convert/LICENSE deleted file mode 100644 index 5b4c386..0000000 --- a/node_modules/color-convert/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -Copyright (c) 2011-2016 Heather Arthur - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/node_modules/color-convert/README.md b/node_modules/color-convert/README.md deleted file mode 100644 index d4b08fc..0000000 --- a/node_modules/color-convert/README.md +++ /dev/null @@ -1,68 +0,0 @@ -# color-convert - -[![Build Status](https://travis-ci.org/Qix-/color-convert.svg?branch=master)](https://travis-ci.org/Qix-/color-convert) - -Color-convert is a color conversion library for JavaScript and node. -It converts all ways between `rgb`, `hsl`, `hsv`, `hwb`, `cmyk`, `ansi`, `ansi16`, `hex` strings, and CSS `keyword`s (will round to closest): - -```js -var convert = require('color-convert'); - -convert.rgb.hsl(140, 200, 100); // [96, 48, 59] -convert.keyword.rgb('blue'); // [0, 0, 255] - -var rgbChannels = convert.rgb.channels; // 3 -var cmykChannels = convert.cmyk.channels; // 4 -var ansiChannels = convert.ansi16.channels; // 1 -``` - -# Install - -```console -$ npm install color-convert -``` - -# API - -Simply get the property of the _from_ and _to_ conversion that you're looking for. - -All functions have a rounded and unrounded variant. By default, return values are rounded. To get the unrounded (raw) results, simply tack on `.raw` to the function. - -All 'from' functions have a hidden property called `.channels` that indicates the number of channels the function expects (not including alpha). - -```js -var convert = require('color-convert'); - -// Hex to LAB -convert.hex.lab('DEADBF'); // [ 76, 21, -2 ] -convert.hex.lab.raw('DEADBF'); // [ 75.56213190997677, 20.653827952644754, -2.290532499330533 ] - -// RGB to CMYK -convert.rgb.cmyk(167, 255, 4); // [ 35, 0, 98, 0 ] -convert.rgb.cmyk.raw(167, 255, 4); // [ 34.509803921568626, 0, 98.43137254901961, 0 ] -``` - -### Arrays -All functions that accept multiple arguments also support passing an array. - -Note that this does **not** apply to functions that convert from a color that only requires one value (e.g. `keyword`, `ansi256`, `hex`, etc.) - -```js -var convert = require('color-convert'); - -convert.rgb.hex(123, 45, 67); // '7B2D43' -convert.rgb.hex([123, 45, 67]); // '7B2D43' -``` - -## Routing - -Conversions that don't have an _explicitly_ defined conversion (in [conversions.js](conversions.js)), but can be converted by means of sub-conversions (e.g. XYZ -> **RGB** -> CMYK), are automatically routed together. This allows just about any color model supported by `color-convert` to be converted to any other model, so long as a sub-conversion path exists. This is also true for conversions requiring more than one step in between (e.g. LCH -> **LAB** -> **XYZ** -> **RGB** -> Hex). - -Keep in mind that extensive conversions _may_ result in a loss of precision, and exist only to be complete. For a list of "direct" (single-step) conversions, see [conversions.js](conversions.js). - -# Contribute - -If there is a new model you would like to support, or want to add a direct conversion between two existing models, please send us a pull request. - -# License -Copyright © 2011-2016, Heather Arthur and Josh Junon. Licensed under the [MIT License](LICENSE). diff --git a/node_modules/color-convert/conversions.js b/node_modules/color-convert/conversions.js deleted file mode 100644 index 2657f26..0000000 --- a/node_modules/color-convert/conversions.js +++ /dev/null @@ -1,839 +0,0 @@ -/* MIT license */ -/* eslint-disable no-mixed-operators */ -const cssKeywords = require('color-name'); - -// NOTE: conversions should only return primitive values (i.e. arrays, or -// values that give correct `typeof` results). -// do not use box values types (i.e. Number(), String(), etc.) - -const reverseKeywords = {}; -for (const key of Object.keys(cssKeywords)) { - reverseKeywords[cssKeywords[key]] = key; -} - -const convert = { - rgb: {channels: 3, labels: 'rgb'}, - hsl: {channels: 3, labels: 'hsl'}, - hsv: {channels: 3, labels: 'hsv'}, - hwb: {channels: 3, labels: 'hwb'}, - cmyk: {channels: 4, labels: 'cmyk'}, - xyz: {channels: 3, labels: 'xyz'}, - lab: {channels: 3, labels: 'lab'}, - lch: {channels: 3, labels: 'lch'}, - hex: {channels: 1, labels: ['hex']}, - keyword: {channels: 1, labels: ['keyword']}, - ansi16: {channels: 1, labels: ['ansi16']}, - ansi256: {channels: 1, labels: ['ansi256']}, - hcg: {channels: 3, labels: ['h', 'c', 'g']}, - apple: {channels: 3, labels: ['r16', 'g16', 'b16']}, - gray: {channels: 1, labels: ['gray']} -}; - -module.exports = convert; - -// Hide .channels and .labels properties -for (const model of Object.keys(convert)) { - if (!('channels' in convert[model])) { - throw new Error('missing channels property: ' + model); - } - - if (!('labels' in convert[model])) { - throw new Error('missing channel labels property: ' + model); - } - - if (convert[model].labels.length !== convert[model].channels) { - throw new Error('channel and label counts mismatch: ' + model); - } - - const {channels, labels} = convert[model]; - delete convert[model].channels; - delete convert[model].labels; - Object.defineProperty(convert[model], 'channels', {value: channels}); - Object.defineProperty(convert[model], 'labels', {value: labels}); -} - -convert.rgb.hsl = function (rgb) { - const r = rgb[0] / 255; - const g = rgb[1] / 255; - const b = rgb[2] / 255; - const min = Math.min(r, g, b); - const max = Math.max(r, g, b); - const delta = max - min; - let h; - let s; - - if (max === min) { - h = 0; - } else if (r === max) { - h = (g - b) / delta; - } else if (g === max) { - h = 2 + (b - r) / delta; - } else if (b === max) { - h = 4 + (r - g) / delta; - } - - h = Math.min(h * 60, 360); - - if (h < 0) { - h += 360; - } - - const l = (min + max) / 2; - - if (max === min) { - s = 0; - } else if (l <= 0.5) { - s = delta / (max + min); - } else { - s = delta / (2 - max - min); - } - - return [h, s * 100, l * 100]; -}; - -convert.rgb.hsv = function (rgb) { - let rdif; - let gdif; - let bdif; - let h; - let s; - - const r = rgb[0] / 255; - const g = rgb[1] / 255; - const b = rgb[2] / 255; - const v = Math.max(r, g, b); - const diff = v - Math.min(r, g, b); - const diffc = function (c) { - return (v - c) / 6 / diff + 1 / 2; - }; - - if (diff === 0) { - h = 0; - s = 0; - } else { - s = diff / v; - rdif = diffc(r); - gdif = diffc(g); - bdif = diffc(b); - - if (r === v) { - h = bdif - gdif; - } else if (g === v) { - h = (1 / 3) + rdif - bdif; - } else if (b === v) { - h = (2 / 3) + gdif - rdif; - } - - if (h < 0) { - h += 1; - } else if (h > 1) { - h -= 1; - } - } - - return [ - h * 360, - s * 100, - v * 100 - ]; -}; - -convert.rgb.hwb = function (rgb) { - const r = rgb[0]; - const g = rgb[1]; - let b = rgb[2]; - const h = convert.rgb.hsl(rgb)[0]; - const w = 1 / 255 * Math.min(r, Math.min(g, b)); - - b = 1 - 1 / 255 * Math.max(r, Math.max(g, b)); - - return [h, w * 100, b * 100]; -}; - -convert.rgb.cmyk = function (rgb) { - const r = rgb[0] / 255; - const g = rgb[1] / 255; - const b = rgb[2] / 255; - - const k = Math.min(1 - r, 1 - g, 1 - b); - const c = (1 - r - k) / (1 - k) || 0; - const m = (1 - g - k) / (1 - k) || 0; - const y = (1 - b - k) / (1 - k) || 0; - - return [c * 100, m * 100, y * 100, k * 100]; -}; - -function comparativeDistance(x, y) { - /* - See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance - */ - return ( - ((x[0] - y[0]) ** 2) + - ((x[1] - y[1]) ** 2) + - ((x[2] - y[2]) ** 2) - ); -} - -convert.rgb.keyword = function (rgb) { - const reversed = reverseKeywords[rgb]; - if (reversed) { - return reversed; - } - - let currentClosestDistance = Infinity; - let currentClosestKeyword; - - for (const keyword of Object.keys(cssKeywords)) { - const value = cssKeywords[keyword]; - - // Compute comparative distance - const distance = comparativeDistance(rgb, value); - - // Check if its less, if so set as closest - if (distance < currentClosestDistance) { - currentClosestDistance = distance; - currentClosestKeyword = keyword; - } - } - - return currentClosestKeyword; -}; - -convert.keyword.rgb = function (keyword) { - return cssKeywords[keyword]; -}; - -convert.rgb.xyz = function (rgb) { - let r = rgb[0] / 255; - let g = rgb[1] / 255; - let b = rgb[2] / 255; - - // Assume sRGB - r = r > 0.04045 ? (((r + 0.055) / 1.055) ** 2.4) : (r / 12.92); - g = g > 0.04045 ? (((g + 0.055) / 1.055) ** 2.4) : (g / 12.92); - b = b > 0.04045 ? (((b + 0.055) / 1.055) ** 2.4) : (b / 12.92); - - const x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); - const y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); - const z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); - - return [x * 100, y * 100, z * 100]; -}; - -convert.rgb.lab = function (rgb) { - const xyz = convert.rgb.xyz(rgb); - let x = xyz[0]; - let y = xyz[1]; - let z = xyz[2]; - - x /= 95.047; - y /= 100; - z /= 108.883; - - x = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116); - y = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116); - z = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116); - - const l = (116 * y) - 16; - const a = 500 * (x - y); - const b = 200 * (y - z); - - return [l, a, b]; -}; - -convert.hsl.rgb = function (hsl) { - const h = hsl[0] / 360; - const s = hsl[1] / 100; - const l = hsl[2] / 100; - let t2; - let t3; - let val; - - if (s === 0) { - val = l * 255; - return [val, val, val]; - } - - if (l < 0.5) { - t2 = l * (1 + s); - } else { - t2 = l + s - l * s; - } - - const t1 = 2 * l - t2; - - const rgb = [0, 0, 0]; - for (let i = 0; i < 3; i++) { - t3 = h + 1 / 3 * -(i - 1); - if (t3 < 0) { - t3++; - } - - if (t3 > 1) { - t3--; - } - - if (6 * t3 < 1) { - val = t1 + (t2 - t1) * 6 * t3; - } else if (2 * t3 < 1) { - val = t2; - } else if (3 * t3 < 2) { - val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; - } else { - val = t1; - } - - rgb[i] = val * 255; - } - - return rgb; -}; - -convert.hsl.hsv = function (hsl) { - const h = hsl[0]; - let s = hsl[1] / 100; - let l = hsl[2] / 100; - let smin = s; - const lmin = Math.max(l, 0.01); - - l *= 2; - s *= (l <= 1) ? l : 2 - l; - smin *= lmin <= 1 ? lmin : 2 - lmin; - const v = (l + s) / 2; - const sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s); - - return [h, sv * 100, v * 100]; -}; - -convert.hsv.rgb = function (hsv) { - const h = hsv[0] / 60; - const s = hsv[1] / 100; - let v = hsv[2] / 100; - const hi = Math.floor(h) % 6; - - const f = h - Math.floor(h); - const p = 255 * v * (1 - s); - const q = 255 * v * (1 - (s * f)); - const t = 255 * v * (1 - (s * (1 - f))); - v *= 255; - - switch (hi) { - case 0: - return [v, t, p]; - case 1: - return [q, v, p]; - case 2: - return [p, v, t]; - case 3: - return [p, q, v]; - case 4: - return [t, p, v]; - case 5: - return [v, p, q]; - } -}; - -convert.hsv.hsl = function (hsv) { - const h = hsv[0]; - const s = hsv[1] / 100; - const v = hsv[2] / 100; - const vmin = Math.max(v, 0.01); - let sl; - let l; - - l = (2 - s) * v; - const lmin = (2 - s) * vmin; - sl = s * vmin; - sl /= (lmin <= 1) ? lmin : 2 - lmin; - sl = sl || 0; - l /= 2; - - return [h, sl * 100, l * 100]; -}; - -// http://dev.w3.org/csswg/css-color/#hwb-to-rgb -convert.hwb.rgb = function (hwb) { - const h = hwb[0] / 360; - let wh = hwb[1] / 100; - let bl = hwb[2] / 100; - const ratio = wh + bl; - let f; - - // Wh + bl cant be > 1 - if (ratio > 1) { - wh /= ratio; - bl /= ratio; - } - - const i = Math.floor(6 * h); - const v = 1 - bl; - f = 6 * h - i; - - if ((i & 0x01) !== 0) { - f = 1 - f; - } - - const n = wh + f * (v - wh); // Linear interpolation - - let r; - let g; - let b; - /* eslint-disable max-statements-per-line,no-multi-spaces */ - switch (i) { - default: - case 6: - case 0: r = v; g = n; b = wh; break; - case 1: r = n; g = v; b = wh; break; - case 2: r = wh; g = v; b = n; break; - case 3: r = wh; g = n; b = v; break; - case 4: r = n; g = wh; b = v; break; - case 5: r = v; g = wh; b = n; break; - } - /* eslint-enable max-statements-per-line,no-multi-spaces */ - - return [r * 255, g * 255, b * 255]; -}; - -convert.cmyk.rgb = function (cmyk) { - const c = cmyk[0] / 100; - const m = cmyk[1] / 100; - const y = cmyk[2] / 100; - const k = cmyk[3] / 100; - - const r = 1 - Math.min(1, c * (1 - k) + k); - const g = 1 - Math.min(1, m * (1 - k) + k); - const b = 1 - Math.min(1, y * (1 - k) + k); - - return [r * 255, g * 255, b * 255]; -}; - -convert.xyz.rgb = function (xyz) { - const x = xyz[0] / 100; - const y = xyz[1] / 100; - const z = xyz[2] / 100; - let r; - let g; - let b; - - r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); - g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); - b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); - - // Assume sRGB - r = r > 0.0031308 - ? ((1.055 * (r ** (1.0 / 2.4))) - 0.055) - : r * 12.92; - - g = g > 0.0031308 - ? ((1.055 * (g ** (1.0 / 2.4))) - 0.055) - : g * 12.92; - - b = b > 0.0031308 - ? ((1.055 * (b ** (1.0 / 2.4))) - 0.055) - : b * 12.92; - - r = Math.min(Math.max(0, r), 1); - g = Math.min(Math.max(0, g), 1); - b = Math.min(Math.max(0, b), 1); - - return [r * 255, g * 255, b * 255]; -}; - -convert.xyz.lab = function (xyz) { - let x = xyz[0]; - let y = xyz[1]; - let z = xyz[2]; - - x /= 95.047; - y /= 100; - z /= 108.883; - - x = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116); - y = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116); - z = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116); - - const l = (116 * y) - 16; - const a = 500 * (x - y); - const b = 200 * (y - z); - - return [l, a, b]; -}; - -convert.lab.xyz = function (lab) { - const l = lab[0]; - const a = lab[1]; - const b = lab[2]; - let x; - let y; - let z; - - y = (l + 16) / 116; - x = a / 500 + y; - z = y - b / 200; - - const y2 = y ** 3; - const x2 = x ** 3; - const z2 = z ** 3; - y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787; - x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787; - z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787; - - x *= 95.047; - y *= 100; - z *= 108.883; - - return [x, y, z]; -}; - -convert.lab.lch = function (lab) { - const l = lab[0]; - const a = lab[1]; - const b = lab[2]; - let h; - - const hr = Math.atan2(b, a); - h = hr * 360 / 2 / Math.PI; - - if (h < 0) { - h += 360; - } - - const c = Math.sqrt(a * a + b * b); - - return [l, c, h]; -}; - -convert.lch.lab = function (lch) { - const l = lch[0]; - const c = lch[1]; - const h = lch[2]; - - const hr = h / 360 * 2 * Math.PI; - const a = c * Math.cos(hr); - const b = c * Math.sin(hr); - - return [l, a, b]; -}; - -convert.rgb.ansi16 = function (args, saturation = null) { - const [r, g, b] = args; - let value = saturation === null ? convert.rgb.hsv(args)[2] : saturation; // Hsv -> ansi16 optimization - - value = Math.round(value / 50); - - if (value === 0) { - return 30; - } - - let ansi = 30 - + ((Math.round(b / 255) << 2) - | (Math.round(g / 255) << 1) - | Math.round(r / 255)); - - if (value === 2) { - ansi += 60; - } - - return ansi; -}; - -convert.hsv.ansi16 = function (args) { - // Optimization here; we already know the value and don't need to get - // it converted for us. - return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]); -}; - -convert.rgb.ansi256 = function (args) { - const r = args[0]; - const g = args[1]; - const b = args[2]; - - // We use the extended greyscale palette here, with the exception of - // black and white. normal palette only has 4 greyscale shades. - if (r === g && g === b) { - if (r < 8) { - return 16; - } - - if (r > 248) { - return 231; - } - - return Math.round(((r - 8) / 247) * 24) + 232; - } - - const ansi = 16 - + (36 * Math.round(r / 255 * 5)) - + (6 * Math.round(g / 255 * 5)) - + Math.round(b / 255 * 5); - - return ansi; -}; - -convert.ansi16.rgb = function (args) { - let color = args % 10; - - // Handle greyscale - if (color === 0 || color === 7) { - if (args > 50) { - color += 3.5; - } - - color = color / 10.5 * 255; - - return [color, color, color]; - } - - const mult = (~~(args > 50) + 1) * 0.5; - const r = ((color & 1) * mult) * 255; - const g = (((color >> 1) & 1) * mult) * 255; - const b = (((color >> 2) & 1) * mult) * 255; - - return [r, g, b]; -}; - -convert.ansi256.rgb = function (args) { - // Handle greyscale - if (args >= 232) { - const c = (args - 232) * 10 + 8; - return [c, c, c]; - } - - args -= 16; - - let rem; - const r = Math.floor(args / 36) / 5 * 255; - const g = Math.floor((rem = args % 36) / 6) / 5 * 255; - const b = (rem % 6) / 5 * 255; - - return [r, g, b]; -}; - -convert.rgb.hex = function (args) { - const integer = ((Math.round(args[0]) & 0xFF) << 16) - + ((Math.round(args[1]) & 0xFF) << 8) - + (Math.round(args[2]) & 0xFF); - - const string = integer.toString(16).toUpperCase(); - return '000000'.substring(string.length) + string; -}; - -convert.hex.rgb = function (args) { - const match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i); - if (!match) { - return [0, 0, 0]; - } - - let colorString = match[0]; - - if (match[0].length === 3) { - colorString = colorString.split('').map(char => { - return char + char; - }).join(''); - } - - const integer = parseInt(colorString, 16); - const r = (integer >> 16) & 0xFF; - const g = (integer >> 8) & 0xFF; - const b = integer & 0xFF; - - return [r, g, b]; -}; - -convert.rgb.hcg = function (rgb) { - const r = rgb[0] / 255; - const g = rgb[1] / 255; - const b = rgb[2] / 255; - const max = Math.max(Math.max(r, g), b); - const min = Math.min(Math.min(r, g), b); - const chroma = (max - min); - let grayscale; - let hue; - - if (chroma < 1) { - grayscale = min / (1 - chroma); - } else { - grayscale = 0; - } - - if (chroma <= 0) { - hue = 0; - } else - if (max === r) { - hue = ((g - b) / chroma) % 6; - } else - if (max === g) { - hue = 2 + (b - r) / chroma; - } else { - hue = 4 + (r - g) / chroma; - } - - hue /= 6; - hue %= 1; - - return [hue * 360, chroma * 100, grayscale * 100]; -}; - -convert.hsl.hcg = function (hsl) { - const s = hsl[1] / 100; - const l = hsl[2] / 100; - - const c = l < 0.5 ? (2.0 * s * l) : (2.0 * s * (1.0 - l)); - - let f = 0; - if (c < 1.0) { - f = (l - 0.5 * c) / (1.0 - c); - } - - return [hsl[0], c * 100, f * 100]; -}; - -convert.hsv.hcg = function (hsv) { - const s = hsv[1] / 100; - const v = hsv[2] / 100; - - const c = s * v; - let f = 0; - - if (c < 1.0) { - f = (v - c) / (1 - c); - } - - return [hsv[0], c * 100, f * 100]; -}; - -convert.hcg.rgb = function (hcg) { - const h = hcg[0] / 360; - const c = hcg[1] / 100; - const g = hcg[2] / 100; - - if (c === 0.0) { - return [g * 255, g * 255, g * 255]; - } - - const pure = [0, 0, 0]; - const hi = (h % 1) * 6; - const v = hi % 1; - const w = 1 - v; - let mg = 0; - - /* eslint-disable max-statements-per-line */ - switch (Math.floor(hi)) { - case 0: - pure[0] = 1; pure[1] = v; pure[2] = 0; break; - case 1: - pure[0] = w; pure[1] = 1; pure[2] = 0; break; - case 2: - pure[0] = 0; pure[1] = 1; pure[2] = v; break; - case 3: - pure[0] = 0; pure[1] = w; pure[2] = 1; break; - case 4: - pure[0] = v; pure[1] = 0; pure[2] = 1; break; - default: - pure[0] = 1; pure[1] = 0; pure[2] = w; - } - /* eslint-enable max-statements-per-line */ - - mg = (1.0 - c) * g; - - return [ - (c * pure[0] + mg) * 255, - (c * pure[1] + mg) * 255, - (c * pure[2] + mg) * 255 - ]; -}; - -convert.hcg.hsv = function (hcg) { - const c = hcg[1] / 100; - const g = hcg[2] / 100; - - const v = c + g * (1.0 - c); - let f = 0; - - if (v > 0.0) { - f = c / v; - } - - return [hcg[0], f * 100, v * 100]; -}; - -convert.hcg.hsl = function (hcg) { - const c = hcg[1] / 100; - const g = hcg[2] / 100; - - const l = g * (1.0 - c) + 0.5 * c; - let s = 0; - - if (l > 0.0 && l < 0.5) { - s = c / (2 * l); - } else - if (l >= 0.5 && l < 1.0) { - s = c / (2 * (1 - l)); - } - - return [hcg[0], s * 100, l * 100]; -}; - -convert.hcg.hwb = function (hcg) { - const c = hcg[1] / 100; - const g = hcg[2] / 100; - const v = c + g * (1.0 - c); - return [hcg[0], (v - c) * 100, (1 - v) * 100]; -}; - -convert.hwb.hcg = function (hwb) { - const w = hwb[1] / 100; - const b = hwb[2] / 100; - const v = 1 - b; - const c = v - w; - let g = 0; - - if (c < 1) { - g = (v - c) / (1 - c); - } - - return [hwb[0], c * 100, g * 100]; -}; - -convert.apple.rgb = function (apple) { - return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255]; -}; - -convert.rgb.apple = function (rgb) { - return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535]; -}; - -convert.gray.rgb = function (args) { - return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255]; -}; - -convert.gray.hsl = function (args) { - return [0, 0, args[0]]; -}; - -convert.gray.hsv = convert.gray.hsl; - -convert.gray.hwb = function (gray) { - return [0, 100, gray[0]]; -}; - -convert.gray.cmyk = function (gray) { - return [0, 0, 0, gray[0]]; -}; - -convert.gray.lab = function (gray) { - return [gray[0], 0, 0]; -}; - -convert.gray.hex = function (gray) { - const val = Math.round(gray[0] / 100 * 255) & 0xFF; - const integer = (val << 16) + (val << 8) + val; - - const string = integer.toString(16).toUpperCase(); - return '000000'.substring(string.length) + string; -}; - -convert.rgb.gray = function (rgb) { - const val = (rgb[0] + rgb[1] + rgb[2]) / 3; - return [val / 255 * 100]; -}; diff --git a/node_modules/color-convert/index.js b/node_modules/color-convert/index.js deleted file mode 100644 index b648e57..0000000 --- a/node_modules/color-convert/index.js +++ /dev/null @@ -1,81 +0,0 @@ -const conversions = require('./conversions'); -const route = require('./route'); - -const convert = {}; - -const models = Object.keys(conversions); - -function wrapRaw(fn) { - const wrappedFn = function (...args) { - const arg0 = args[0]; - if (arg0 === undefined || arg0 === null) { - return arg0; - } - - if (arg0.length > 1) { - args = arg0; - } - - return fn(args); - }; - - // Preserve .conversion property if there is one - if ('conversion' in fn) { - wrappedFn.conversion = fn.conversion; - } - - return wrappedFn; -} - -function wrapRounded(fn) { - const wrappedFn = function (...args) { - const arg0 = args[0]; - - if (arg0 === undefined || arg0 === null) { - return arg0; - } - - if (arg0.length > 1) { - args = arg0; - } - - const result = fn(args); - - // We're assuming the result is an array here. - // see notice in conversions.js; don't use box types - // in conversion functions. - if (typeof result === 'object') { - for (let len = result.length, i = 0; i < len; i++) { - result[i] = Math.round(result[i]); - } - } - - return result; - }; - - // Preserve .conversion property if there is one - if ('conversion' in fn) { - wrappedFn.conversion = fn.conversion; - } - - return wrappedFn; -} - -models.forEach(fromModel => { - convert[fromModel] = {}; - - Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels}); - Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels}); - - const routes = route(fromModel); - const routeModels = Object.keys(routes); - - routeModels.forEach(toModel => { - const fn = routes[toModel]; - - convert[fromModel][toModel] = wrapRounded(fn); - convert[fromModel][toModel].raw = wrapRaw(fn); - }); -}); - -module.exports = convert; diff --git a/node_modules/color-convert/package.json b/node_modules/color-convert/package.json deleted file mode 100644 index 6e48000..0000000 --- a/node_modules/color-convert/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "color-convert", - "description": "Plain color conversion functions", - "version": "2.0.1", - "author": "Heather Arthur ", - "license": "MIT", - "repository": "Qix-/color-convert", - "scripts": { - "pretest": "xo", - "test": "node test/basic.js" - }, - "engines": { - "node": ">=7.0.0" - }, - "keywords": [ - "color", - "colour", - "convert", - "converter", - "conversion", - "rgb", - "hsl", - "hsv", - "hwb", - "cmyk", - "ansi", - "ansi16" - ], - "files": [ - "index.js", - "conversions.js", - "route.js" - ], - "xo": { - "rules": { - "default-case": 0, - "no-inline-comments": 0, - "operator-linebreak": 0 - } - }, - "devDependencies": { - "chalk": "^2.4.2", - "xo": "^0.24.0" - }, - "dependencies": { - "color-name": "~1.1.4" - } -} diff --git a/node_modules/color-convert/route.js b/node_modules/color-convert/route.js deleted file mode 100644 index 1a08521..0000000 --- a/node_modules/color-convert/route.js +++ /dev/null @@ -1,97 +0,0 @@ -const conversions = require('./conversions'); - -/* - This function routes a model to all other models. - - all functions that are routed have a property `.conversion` attached - to the returned synthetic function. This property is an array - of strings, each with the steps in between the 'from' and 'to' - color models (inclusive). - - conversions that are not possible simply are not included. -*/ - -function buildGraph() { - const graph = {}; - // https://jsperf.com/object-keys-vs-for-in-with-closure/3 - const models = Object.keys(conversions); - - for (let len = models.length, i = 0; i < len; i++) { - graph[models[i]] = { - // http://jsperf.com/1-vs-infinity - // micro-opt, but this is simple. - distance: -1, - parent: null - }; - } - - return graph; -} - -// https://en.wikipedia.org/wiki/Breadth-first_search -function deriveBFS(fromModel) { - const graph = buildGraph(); - const queue = [fromModel]; // Unshift -> queue -> pop - - graph[fromModel].distance = 0; - - while (queue.length) { - const current = queue.pop(); - const adjacents = Object.keys(conversions[current]); - - for (let len = adjacents.length, i = 0; i < len; i++) { - const adjacent = adjacents[i]; - const node = graph[adjacent]; - - if (node.distance === -1) { - node.distance = graph[current].distance + 1; - node.parent = current; - queue.unshift(adjacent); - } - } - } - - return graph; -} - -function link(from, to) { - return function (args) { - return to(from(args)); - }; -} - -function wrapConversion(toModel, graph) { - const path = [graph[toModel].parent, toModel]; - let fn = conversions[graph[toModel].parent][toModel]; - - let cur = graph[toModel].parent; - while (graph[cur].parent) { - path.unshift(graph[cur].parent); - fn = link(conversions[graph[cur].parent][cur], fn); - cur = graph[cur].parent; - } - - fn.conversion = path; - return fn; -} - -module.exports = function (fromModel) { - const graph = deriveBFS(fromModel); - const conversion = {}; - - const models = Object.keys(graph); - for (let len = models.length, i = 0; i < len; i++) { - const toModel = models[i]; - const node = graph[toModel]; - - if (node.parent === null) { - // No possible conversion, or this node is the source model. - continue; - } - - conversion[toModel] = wrapConversion(toModel, graph); - } - - return conversion; -}; - diff --git a/node_modules/color-name/LICENSE b/node_modules/color-name/LICENSE deleted file mode 100644 index 4d9802a..0000000 --- a/node_modules/color-name/LICENSE +++ /dev/null @@ -1,8 +0,0 @@ -The MIT License (MIT) -Copyright (c) 2015 Dmitry Ivanov - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/node_modules/color-name/README.md b/node_modules/color-name/README.md deleted file mode 100644 index 3611a6b..0000000 --- a/node_modules/color-name/README.md +++ /dev/null @@ -1,11 +0,0 @@ -A JSON with color names and its values. Based on http://dev.w3.org/csswg/css-color/#named-colors. - -[![NPM](https://nodei.co/npm/color-name.png?mini=true)](https://nodei.co/npm/color-name/) - - -```js -var colors = require('color-name'); -colors.red //[255,0,0] -``` - - diff --git a/node_modules/color-name/index.js b/node_modules/color-name/index.js deleted file mode 100644 index e42aa68..0000000 --- a/node_modules/color-name/index.js +++ /dev/null @@ -1,152 +0,0 @@ -'use strict' - -module.exports = { - "aliceblue": [240, 248, 255], - "antiquewhite": [250, 235, 215], - "aqua": [0, 255, 255], - "aquamarine": [127, 255, 212], - "azure": [240, 255, 255], - "beige": [245, 245, 220], - "bisque": [255, 228, 196], - "black": [0, 0, 0], - "blanchedalmond": [255, 235, 205], - "blue": [0, 0, 255], - "blueviolet": [138, 43, 226], - "brown": [165, 42, 42], - "burlywood": [222, 184, 135], - "cadetblue": [95, 158, 160], - "chartreuse": [127, 255, 0], - "chocolate": [210, 105, 30], - "coral": [255, 127, 80], - "cornflowerblue": [100, 149, 237], - "cornsilk": [255, 248, 220], - "crimson": [220, 20, 60], - "cyan": [0, 255, 255], - "darkblue": [0, 0, 139], - "darkcyan": [0, 139, 139], - "darkgoldenrod": [184, 134, 11], - "darkgray": [169, 169, 169], - "darkgreen": [0, 100, 0], - "darkgrey": [169, 169, 169], - "darkkhaki": [189, 183, 107], - "darkmagenta": [139, 0, 139], - "darkolivegreen": [85, 107, 47], - "darkorange": [255, 140, 0], - "darkorchid": [153, 50, 204], - "darkred": [139, 0, 0], - "darksalmon": [233, 150, 122], - "darkseagreen": [143, 188, 143], - "darkslateblue": [72, 61, 139], - "darkslategray": [47, 79, 79], - "darkslategrey": [47, 79, 79], - "darkturquoise": [0, 206, 209], - "darkviolet": [148, 0, 211], - "deeppink": [255, 20, 147], - "deepskyblue": [0, 191, 255], - "dimgray": [105, 105, 105], - "dimgrey": [105, 105, 105], - "dodgerblue": [30, 144, 255], - "firebrick": [178, 34, 34], - "floralwhite": [255, 250, 240], - "forestgreen": [34, 139, 34], - "fuchsia": [255, 0, 255], - "gainsboro": [220, 220, 220], - "ghostwhite": [248, 248, 255], - "gold": [255, 215, 0], - "goldenrod": [218, 165, 32], - "gray": [128, 128, 128], - "green": [0, 128, 0], - "greenyellow": [173, 255, 47], - "grey": [128, 128, 128], - "honeydew": [240, 255, 240], - "hotpink": [255, 105, 180], - "indianred": [205, 92, 92], - "indigo": [75, 0, 130], - "ivory": [255, 255, 240], - "khaki": [240, 230, 140], - "lavender": [230, 230, 250], - "lavenderblush": [255, 240, 245], - "lawngreen": [124, 252, 0], - "lemonchiffon": [255, 250, 205], - "lightblue": [173, 216, 230], - "lightcoral": [240, 128, 128], - "lightcyan": [224, 255, 255], - "lightgoldenrodyellow": [250, 250, 210], - "lightgray": [211, 211, 211], - "lightgreen": [144, 238, 144], - "lightgrey": [211, 211, 211], - "lightpink": [255, 182, 193], - "lightsalmon": [255, 160, 122], - "lightseagreen": [32, 178, 170], - "lightskyblue": [135, 206, 250], - "lightslategray": [119, 136, 153], - "lightslategrey": [119, 136, 153], - "lightsteelblue": [176, 196, 222], - "lightyellow": [255, 255, 224], - "lime": [0, 255, 0], - "limegreen": [50, 205, 50], - "linen": [250, 240, 230], - "magenta": [255, 0, 255], - "maroon": [128, 0, 0], - "mediumaquamarine": [102, 205, 170], - "mediumblue": [0, 0, 205], - "mediumorchid": [186, 85, 211], - "mediumpurple": [147, 112, 219], - "mediumseagreen": [60, 179, 113], - "mediumslateblue": [123, 104, 238], - "mediumspringgreen": [0, 250, 154], - "mediumturquoise": [72, 209, 204], - "mediumvioletred": [199, 21, 133], - "midnightblue": [25, 25, 112], - "mintcream": [245, 255, 250], - "mistyrose": [255, 228, 225], - "moccasin": [255, 228, 181], - "navajowhite": [255, 222, 173], - "navy": [0, 0, 128], - "oldlace": [253, 245, 230], - "olive": [128, 128, 0], - "olivedrab": [107, 142, 35], - "orange": [255, 165, 0], - "orangered": [255, 69, 0], - "orchid": [218, 112, 214], - "palegoldenrod": [238, 232, 170], - "palegreen": [152, 251, 152], - "paleturquoise": [175, 238, 238], - "palevioletred": [219, 112, 147], - "papayawhip": [255, 239, 213], - "peachpuff": [255, 218, 185], - "peru": [205, 133, 63], - "pink": [255, 192, 203], - "plum": [221, 160, 221], - "powderblue": [176, 224, 230], - "purple": [128, 0, 128], - "rebeccapurple": [102, 51, 153], - "red": [255, 0, 0], - "rosybrown": [188, 143, 143], - "royalblue": [65, 105, 225], - "saddlebrown": [139, 69, 19], - "salmon": [250, 128, 114], - "sandybrown": [244, 164, 96], - "seagreen": [46, 139, 87], - "seashell": [255, 245, 238], - "sienna": [160, 82, 45], - "silver": [192, 192, 192], - "skyblue": [135, 206, 235], - "slateblue": [106, 90, 205], - "slategray": [112, 128, 144], - "slategrey": [112, 128, 144], - "snow": [255, 250, 250], - "springgreen": [0, 255, 127], - "steelblue": [70, 130, 180], - "tan": [210, 180, 140], - "teal": [0, 128, 128], - "thistle": [216, 191, 216], - "tomato": [255, 99, 71], - "turquoise": [64, 224, 208], - "violet": [238, 130, 238], - "wheat": [245, 222, 179], - "white": [255, 255, 255], - "whitesmoke": [245, 245, 245], - "yellow": [255, 255, 0], - "yellowgreen": [154, 205, 50] -}; diff --git a/node_modules/color-name/package.json b/node_modules/color-name/package.json deleted file mode 100644 index 7acc902..0000000 --- a/node_modules/color-name/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "color-name", - "version": "1.1.4", - "description": "A list of color names and its values", - "main": "index.js", - "files": [ - "index.js" - ], - "scripts": { - "test": "node test.js" - }, - "repository": { - "type": "git", - "url": "git@github.com:colorjs/color-name.git" - }, - "keywords": [ - "color-name", - "color", - "color-keyword", - "keyword" - ], - "author": "DY ", - "license": "MIT", - "bugs": { - "url": "https://github.com/colorjs/color-name/issues" - }, - "homepage": "https://github.com/colorjs/color-name" -} diff --git a/node_modules/commander/CHANGELOG.md b/node_modules/commander/CHANGELOG.md deleted file mode 100644 index f00cb2b..0000000 --- a/node_modules/commander/CHANGELOG.md +++ /dev/null @@ -1,436 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) -and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). (Format adopted after v3.0.0.) - - - -## [4.1.1] (2020-02-02) - -### Fixed - -* TypeScript definition for `.action()` should include Promise for async ([#1157]) - -## [4.1.0] (2020-01-06) - -### Added - -* two routines to change how option values are handled, and eliminate name clashes with command properties ([#933] [#1102]) - * see storeOptionsAsProperties and passCommandToAction in README -* `.parseAsync` to use instead of `.parse` if supply async action handlers ([#806] [#1118]) - -### Fixed - -* Remove trailing blanks from wrapped help text ([#1096]) - -### Changed - -* update dependencies -* extend security coverage for Commander 2.x to 2020-02-03 -* improvements to README -* improvements to TypeScript definition documentation -* move old versions out of main CHANGELOG -* removed explicit use of `ts-node` in tests - -## [4.0.1] (2019-11-12) - -### Fixed - -* display help when requested, even if there are missing required options ([#1091]) - -## [4.0.0] (2019-11-02) - -### Added - -* automatically wrap and indent help descriptions for options and commands ([#1051]) -* `.exitOverride()` allows override of calls to `process.exit` for additional error handling and to keep program running ([#1040]) -* support for declaring required options with `.requiredOptions()` ([#1071]) -* GitHub Actions support ([#1027]) -* translation links in README - -### Changed - -* dev: switch tests from Sinon+Should to Jest with major rewrite of tests ([#1035]) -* call default subcommand even when there are unknown options ([#1047]) -* *Breaking* Commander is only officially supported on Node 8 and above, and requires Node 6 ([#1053]) - -### Fixed - -* *Breaking* keep command object out of program.args when action handler called ([#1048]) - * also, action handler now passed array of unknown arguments -* complain about unknown options when program argument supplied and action handler ([#1049]) - * this changes parameters to `command:*` event to include unknown arguments -* removed deprecated `customFds` option from call to `child_process.spawn` ([#1052]) -* rework TypeScript declarations to bring all types into imported namespace ([#1081]) - -### Migration Tips - -#### Testing for no arguments - -If you were previously using code like: - -```js -if (!program.args.length) ... -``` - -a partial replacement is: - -```js -if (program.rawArgs.length < 3) ... -``` - -## [4.0.0-1] Prerelease (2019-10-08) - -(Released in 4.0.0) - -## [4.0.0-0] Prerelease (2019-10-01) - -(Released in 4.0.0) - -## [2.20.1] (2019-09-29) - -### Fixed - -* Improve tracking of executable subcommands. - -### Changed - -* update development dependencies - -## [3.0.2] (2019-09-27) - -### Fixed - -* Improve tracking of executable subcommands. - -### Changed - -* update development dependencies - -## [3.0.1] (2019-08-30) - -### Added - -* .name and .usage to README ([#1010]) -* Table of Contents to README ([#1010]) -* TypeScript definition for `executableFile` in CommandOptions ([#1028]) - -### Changed - -* consistently use `const` rather than `var` in README ([#1026]) - -### Fixed - -* help for sub commands with custom executableFile ([#1018]) - -## [3.0.0] / 2019-08-08 - -* Add option to specify executable file name ([#999]) - * e.g. `.command('clone', 'clone description', { executableFile: 'myClone' })` -* Change docs for `.command` to contrast action handler vs git-style executable. ([#938] [#990]) -* **Breaking** Change TypeScript to use overloaded function for `.command`. ([#938] [#990]) -* Change to use straight quotes around strings in error messages (like 'this' instead of `this') ([#915]) -* Add TypeScript "reference types" for node ([#974]) -* Add support for hyphen as an option argument in subcommands ([#697]) -* Add support for a short option flag and its value to be concatenated for action handler subcommands ([#599]) - * e.g. `-p 80` can also be supplied as `-p80` -* Add executable arguments to spawn in win32, for git-style executables ([#611]) - * e.g. `node --harmony myCommand.js clone` -* Add parent command as prefix of subcommand in help ([#980]) -* Add optional custom description to `.version` ([#963]) - * e.g. `program.version('0.0.1', '-v, --vers', 'output the current version')` -* Add `.helpOption(flags, description)` routine to customise help flags and description ([#963]) - * e.g. `.helpOption('-e, --HELP', 'read more information')` -* Fix behavior of --no-* options ([#795]) - * can now define both `--foo` and `--no-foo` - * **Breaking** custom event listeners: `--no-foo` on cli now emits `option:no-foo` (previously `option:foo`) - * **Breaking** default value: defining `--no-foo` after defining `--foo` leaves the default value unchanged (previously set it to false) - * allow boolean default value, such as from environment ([#987]) -* Increment inspector port for spawned subcommands ([#991]) - * e.g. `node --inspect myCommand.js clone` - -### Migration Tips - -The custom event for a negated option like `--no-foo` is `option:no-foo` (previously `option:foo`). - -```js -program - .option('--no-foo') - .on('option:no-foo', () => { - console.log('removing foo'); - }); -``` - -When using TypeScript, adding a command does not allow an explicit `undefined` for an unwanted executable description (e.g -for a command with an action handler). - -```js -program - .command('action1', undefined, { noHelp: true }) // No longer valid - .command('action2', { noHelp: true }) // Correct -``` - -## 3.0.0-0 Prerelease / 2019-07-28 - -(Released as 3.0.0) - -## 2.20.0 / 2019-04-02 - -* fix: resolve symbolic links completely when hunting for subcommands (#935) -* Update index.d.ts (#930) -* Update Readme.md (#924) -* Remove --save option as it isn't required anymore (#918) -* Add link to the license file (#900) -* Added example of receiving args from options (#858) -* Added missing semicolon (#882) -* Add extension to .eslintrc (#876) - -## 2.19.0 / 2018-10-02 - -* Removed newline after Options and Commands headers (#864) -* Bugfix - Error output (#862) -* Fix to change default value to string (#856) - -## 2.18.0 / 2018-09-07 - -* Standardize help output (#853) -* chmod 644 travis.yml (#851) -* add support for execute typescript subcommand via ts-node (#849) - -## 2.17.1 / 2018-08-07 - -* Fix bug in command emit (#844) - -## 2.17.0 / 2018-08-03 - -* fixed newline output after help information (#833) -* Fix to emit the action even without command (#778) -* npm update (#823) - -## 2.16.0 / 2018-06-29 - -* Remove Makefile and `test/run` (#821) -* Make 'npm test' run on Windows (#820) -* Add badge to display install size (#807) -* chore: cache node_modules (#814) -* chore: remove Node.js 4 (EOL), add Node.js 10 (#813) -* fixed typo in readme (#812) -* Fix types (#804) -* Update eslint to resolve vulnerabilities in lodash (#799) -* updated readme with custom event listeners. (#791) -* fix tests (#794) - -## 2.15.0 / 2018-03-07 - -* Update downloads badge to point to graph of downloads over time instead of duplicating link to npm -* Arguments description - -## 2.14.1 / 2018-02-07 - -* Fix typing of help function - -## 2.14.0 / 2018-02-05 - -* only register the option:version event once -* Fixes issue #727: Passing empty string for option on command is set to undefined -* enable eqeqeq rule -* resolves #754 add linter configuration to project -* resolves #560 respect custom name for version option -* document how to override the version flag -* document using options per command - -## 2.13.0 / 2018-01-09 - -* Do not print default for --no- -* remove trailing spaces in command help -* Update CI's Node.js to LTS and latest version -* typedefs: Command and Option types added to commander namespace - -## 2.12.2 / 2017-11-28 - -* fix: typings are not shipped - -## 2.12.1 / 2017-11-23 - -* Move @types/node to dev dependency - -## 2.12.0 / 2017-11-22 - -* add attributeName() method to Option objects -* Documentation updated for options with --no prefix -* typings: `outputHelp` takes a string as the first parameter -* typings: use overloads -* feat(typings): update to match js api -* Print default value in option help -* Fix translation error -* Fail when using same command and alias (#491) -* feat(typings): add help callback -* fix bug when description is add after command with options (#662) -* Format js code -* Rename History.md to CHANGELOG.md (#668) -* feat(typings): add typings to support TypeScript (#646) -* use current node - -## 2.11.0 / 2017-07-03 - -* Fix help section order and padding (#652) -* feature: support for signals to subcommands (#632) -* Fixed #37, --help should not display first (#447) -* Fix translation errors. (#570) -* Add package-lock.json -* Remove engines -* Upgrade package version -* Prefix events to prevent conflicts between commands and options (#494) -* Removing dependency on graceful-readlink -* Support setting name in #name function and make it chainable -* Add .vscode directory to .gitignore (Visual Studio Code metadata) -* Updated link to ruby commander in readme files - -## 2.10.0 / 2017-06-19 - -* Update .travis.yml. drop support for older node.js versions. -* Fix require arguments in README.md -* On SemVer you do not start from 0.0.1 -* Add missing semi colon in readme -* Add save param to npm install -* node v6 travis test -* Update Readme_zh-CN.md -* Allow literal '--' to be passed-through as an argument -* Test subcommand alias help -* link build badge to master branch -* Support the alias of Git style sub-command -* added keyword commander for better search result on npm -* Fix Sub-Subcommands -* test node.js stable -* Fixes TypeError when a command has an option called `--description` -* Update README.md to make it beginner friendly and elaborate on the difference between angled and square brackets. -* Add chinese Readme file - -## 2.9.0 / 2015-10-13 - -* Add option `isDefault` to set default subcommand #415 @Qix- -* Add callback to allow filtering or post-processing of help text #434 @djulien -* Fix `undefined` text in help information close #414 #416 @zhiyelee - -## 2.8.1 / 2015-04-22 - -* Back out `support multiline description` Close #396 #397 - -## 2.8.0 / 2015-04-07 - -* Add `process.execArg` support, execution args like `--harmony` will be passed to sub-commands #387 @DigitalIO @zhiyelee -* Fix bug in Git-style sub-commands #372 @zhiyelee -* Allow commands to be hidden from help #383 @tonylukasavage -* When git-style sub-commands are in use, yet none are called, display help #382 @claylo -* Add ability to specify arguments syntax for top-level command #258 @rrthomas -* Support multiline descriptions #208 @zxqfox - -## 2.7.1 / 2015-03-11 - -* Revert #347 (fix collisions when option and first arg have same name) which causes a bug in #367. - -## 2.7.0 / 2015-03-09 - -* Fix git-style bug when installed globally. Close #335 #349 @zhiyelee -* Fix collisions when option and first arg have same name. Close #346 #347 @tonylukasavage -* Add support for camelCase on `opts()`. Close #353 @nkzawa -* Add node.js 0.12 and io.js to travis.yml -* Allow RegEx options. #337 @palanik -* Fixes exit code when sub-command failing. Close #260 #332 @pirelenito -* git-style `bin` files in $PATH make sense. Close #196 #327 @zhiyelee - -## 2.6.0 / 2014-12-30 - -* added `Command#allowUnknownOption` method. Close #138 #318 @doozr @zhiyelee -* Add application description to the help msg. Close #112 @dalssoft - -## 2.5.1 / 2014-12-15 - -* fixed two bugs incurred by variadic arguments. Close #291 @Quentin01 #302 @zhiyelee - -## 2.5.0 / 2014-10-24 - -* add support for variadic arguments. Closes #277 @whitlockjc - -## 2.4.0 / 2014-10-17 - -* fixed a bug on executing the coercion function of subcommands option. Closes #270 -* added `Command.prototype.name` to retrieve command name. Closes #264 #266 @tonylukasavage -* added `Command.prototype.opts` to retrieve all the options as a simple object of key-value pairs. Closes #262 @tonylukasavage -* fixed a bug on subcommand name. Closes #248 @jonathandelgado -* fixed function normalize doesn’t honor option terminator. Closes #216 @abbr - -## 2.3.0 / 2014-07-16 - -* add command alias'. Closes PR #210 -* fix: Typos. Closes #99 -* fix: Unused fs module. Closes #217 - -## 2.2.0 / 2014-03-29 - -* add passing of previous option value -* fix: support subcommands on windows. Closes #142 -* Now the defaultValue passed as the second argument of the coercion function. - -## 2.1.0 / 2013-11-21 - -* add: allow cflag style option params, unit test, fixes #174 - -## 2.0.0 / 2013-07-18 - -* remove input methods (.prompt, .confirm, etc) - -## Older versions - -* [1.x](./changelogs/CHANGELOG-1.md) -* [0.x](./changelogs/CHANGELOG-0.md) - -[#599]: https://github.com/tj/commander.js/issues/599 -[#611]: https://github.com/tj/commander.js/issues/611 -[#697]: https://github.com/tj/commander.js/issues/697 -[#795]: https://github.com/tj/commander.js/issues/795 -[#806]: https://github.com/tj/commander.js/issues/806 -[#915]: https://github.com/tj/commander.js/issues/915 -[#938]: https://github.com/tj/commander.js/issues/938 -[#963]: https://github.com/tj/commander.js/issues/963 -[#974]: https://github.com/tj/commander.js/issues/974 -[#980]: https://github.com/tj/commander.js/issues/980 -[#987]: https://github.com/tj/commander.js/issues/987 -[#990]: https://github.com/tj/commander.js/issues/990 -[#991]: https://github.com/tj/commander.js/issues/991 -[#993]: https://github.com/tj/commander.js/issues/993 -[#999]: https://github.com/tj/commander.js/issues/999 -[#1010]: https://github.com/tj/commander.js/pull/1010 -[#1018]: https://github.com/tj/commander.js/pull/1018 -[#1026]: https://github.com/tj/commander.js/pull/1026 -[#1027]: https://github.com/tj/commander.js/pull/1027 -[#1028]: https://github.com/tj/commander.js/pull/1028 -[#1035]: https://github.com/tj/commander.js/pull/1035 -[#1040]: https://github.com/tj/commander.js/pull/1040 -[#1047]: https://github.com/tj/commander.js/pull/1047 -[#1048]: https://github.com/tj/commander.js/pull/1048 -[#1049]: https://github.com/tj/commander.js/pull/1049 -[#1051]: https://github.com/tj/commander.js/pull/1051 -[#1052]: https://github.com/tj/commander.js/pull/1052 -[#1053]: https://github.com/tj/commander.js/pull/1053 -[#1071]: https://github.com/tj/commander.js/pull/1071 -[#1081]: https://github.com/tj/commander.js/pull/1081 -[#1091]: https://github.com/tj/commander.js/pull/1091 -[#1096]: https://github.com/tj/commander.js/pull/1096 -[#1102]: https://github.com/tj/commander.js/pull/1102 -[#1118]: https://github.com/tj/commander.js/pull/1118 -[#1157]: https://github.com/tj/commander.js/pull/1157 - -[Unreleased]: https://github.com/tj/commander.js/compare/master...develop -[4.1.1]: https://github.com/tj/commander.js/compare/v4.0.0..v4.1.1 -[4.1.0]: https://github.com/tj/commander.js/compare/v4.0.1..v4.1.0 -[4.0.1]: https://github.com/tj/commander.js/compare/v4.0.0..v4.0.1 -[4.0.0]: https://github.com/tj/commander.js/compare/v3.0.2..v4.0.0 -[4.0.0-1]: https://github.com/tj/commander.js/compare/v4.0.0-0..v4.0.0-1 -[4.0.0-0]: https://github.com/tj/commander.js/compare/v3.0.2...v4.0.0-0 -[3.0.2]: https://github.com/tj/commander.js/compare/v3.0.1...v3.0.2 -[3.0.1]: https://github.com/tj/commander.js/compare/v3.0.0...v3.0.1 -[3.0.0]: https://github.com/tj/commander.js/compare/v2.20.1...v3.0.0 -[2.20.1]: https://github.com/tj/commander.js/compare/v2.20.0...v2.20.1 diff --git a/node_modules/commander/LICENSE b/node_modules/commander/LICENSE deleted file mode 100644 index 10f997a..0000000 --- a/node_modules/commander/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2011 TJ Holowaychuk - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/commander/Readme.md b/node_modules/commander/Readme.md deleted file mode 100644 index aa4f42b..0000000 --- a/node_modules/commander/Readme.md +++ /dev/null @@ -1,713 +0,0 @@ -# Commander.js - -[![Build Status](https://api.travis-ci.org/tj/commander.js.svg?branch=master)](http://travis-ci.org/tj/commander.js) -[![NPM Version](http://img.shields.io/npm/v/commander.svg?style=flat)](https://www.npmjs.org/package/commander) -[![NPM Downloads](https://img.shields.io/npm/dm/commander.svg?style=flat)](https://npmcharts.com/compare/commander?minimal=true) -[![Install Size](https://packagephobia.now.sh/badge?p=commander)](https://packagephobia.now.sh/result?p=commander) - -The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/commander-rb/commander). - -Read this in other languages: English | [简体中文](./Readme_zh-CN.md) - -- [Commander.js](#commanderjs) - - [Installation](#installation) - - [Declaring program variable](#declaring-program-variable) - - [Options](#options) - - [Common option types, boolean and value](#common-option-types-boolean-and-value) - - [Default option value](#default-option-value) - - [Other option types, negatable boolean and flag|value](#other-option-types-negatable-boolean-and-flagvalue) - - [Custom option processing](#custom-option-processing) - - [Required option](#required-option) - - [Version option](#version-option) - - [Commands](#commands) - - [Specify the argument syntax](#specify-the-argument-syntax) - - [Action handler (sub)commands](#action-handler-subcommands) - - [Git-style executable (sub)commands](#git-style-executable-subcommands) - - [Automated --help](#automated---help) - - [Custom help](#custom-help) - - [.usage and .name](#usage-and-name) - - [.outputHelp(cb)](#outputhelpcb) - - [.helpOption(flags, description)](#helpoptionflags-description) - - [.help(cb)](#helpcb) - - [Custom event listeners](#custom-event-listeners) - - [Bits and pieces](#bits-and-pieces) - - [Avoiding option name clashes](#avoiding-option-name-clashes) - - [TypeScript](#typescript) - - [Node options such as --harmony](#node-options-such-as---harmony) - - [Node debugging](#node-debugging) - - [Override exit handling](#override-exit-handling) - - [Examples](#examples) - - [License](#license) - - [Support](#support) - - [Commander for enterprise](#commander-for-enterprise) - -## Installation - -```bash -npm install commander -``` - -## Declaring _program_ variable - -Commander exports a global object which is convenient for quick programs. -This is used in the examples in this README for brevity. - -```js -const program = require('commander'); -program.version('0.0.1'); -``` - -For larger programs which may use commander in multiple ways, including unit testing, it is better to create a local Command object to use. - - ```js - const commander = require('commander'); - const program = new commander.Command(); - program.version('0.0.1'); - ``` - -## Options - -Options are defined with the `.option()` method, also serving as documentation for the options. Each option can have a short flag (single character) and a long name, separated by a comma or space. - -The options can be accessed as properties on the Command object. Multi-word options such as "--template-engine" are camel-cased, becoming `program.templateEngine` etc. Multiple short flags may be combined as a single arg, for example `-abc` is equivalent to `-a -b -c`. - -See also optional new behaviour to [avoid name clashes](#avoiding-option-name-clashes). - -### Common option types, boolean and value - -The two most used option types are a boolean flag, and an option which takes a value (declared using angle brackets). Both are `undefined` unless specified on command line. - -```js -const program = require('commander'); - -program - .option('-d, --debug', 'output extra debugging') - .option('-s, --small', 'small pizza size') - .option('-p, --pizza-type ', 'flavour of pizza'); - -program.parse(process.argv); - -if (program.debug) console.log(program.opts()); -console.log('pizza details:'); -if (program.small) console.log('- small pizza size'); -if (program.pizzaType) console.log(`- ${program.pizzaType}`); -``` - -```bash -$ pizza-options -d -{ debug: true, small: undefined, pizzaType: undefined } -pizza details: -$ pizza-options -p -error: option '-p, --pizza-type ' argument missing -$ pizza-options -ds -p vegetarian -{ debug: true, small: true, pizzaType: 'vegetarian' } -pizza details: -- small pizza size -- vegetarian -$ pizza-options --pizza-type=cheese -pizza details: -- cheese -``` - -`program.parse(arguments)` processes the arguments, leaving any args not consumed by the options as the `program.args` array. - -### Default option value - -You can specify a default value for an option which takes a value. - -```js -const program = require('commander'); - -program - .option('-c, --cheese ', 'add the specified type of cheese', 'blue'); - -program.parse(process.argv); - -console.log(`cheese: ${program.cheese}`); -``` - -```bash -$ pizza-options -cheese: blue -$ pizza-options --cheese stilton -cheese: stilton -``` - -### Other option types, negatable boolean and flag|value - -You can specify a boolean option long name with a leading `no-` to set the option value to false when used. -Defined alone this also makes the option true by default. - -If you define `--foo` first, adding `--no-foo` does not change the default value from what it would -otherwise be. You can specify a default boolean value for a boolean flag and it can be overridden on command line. - -```js -const program = require('commander'); - -program - .option('--no-sauce', 'Remove sauce') - .option('--cheese ', 'cheese flavour', 'mozzarella') - .option('--no-cheese', 'plain with no cheese') - .parse(process.argv); - -const sauceStr = program.sauce ? 'sauce' : 'no sauce'; -const cheeseStr = (program.cheese === false) ? 'no cheese' : `${program.cheese} cheese`; -console.log(`You ordered a pizza with ${sauceStr} and ${cheeseStr}`); -``` - -```bash -$ pizza-options -You ordered a pizza with sauce and mozzarella cheese -$ pizza-options --sauce -error: unknown option '--sauce' -$ pizza-options --cheese=blue -You ordered a pizza with sauce and blue cheese -$ pizza-options --no-sauce --no-cheese -You ordered a pizza with no sauce and no cheese -``` - -You can specify an option which functions as a flag but may also take a value (declared using square brackets). - -```js -const program = require('commander'); - -program - .option('-c, --cheese [type]', 'Add cheese with optional type'); - -program.parse(process.argv); - -if (program.cheese === undefined) console.log('no cheese'); -else if (program.cheese === true) console.log('add cheese'); -else console.log(`add cheese type ${program.cheese}`); -``` - -```bash -$ pizza-options -no cheese -$ pizza-options --cheese -add cheese -$ pizza-options --cheese mozzarella -add cheese type mozzarella -``` - -### Custom option processing - -You may specify a function to do custom processing of option values. The callback function receives two parameters, the user specified value and the -previous value for the option. It returns the new value for the option. - -This allows you to coerce the option value to the desired type, or accumulate values, or do entirely custom processing. - -You can optionally specify the default/starting value for the option after the function. - -```js -const program = require('commander'); - -function myParseInt(value, dummyPrevious) { - // parseInt takes a string and an optional radix - return parseInt(value); -} - -function increaseVerbosity(dummyValue, previous) { - return previous + 1; -} - -function collect(value, previous) { - return previous.concat([value]); -} - -function commaSeparatedList(value, dummyPrevious) { - return value.split(','); -} - -program - .option('-f, --float ', 'float argument', parseFloat) - .option('-i, --integer ', 'integer argument', myParseInt) - .option('-v, --verbose', 'verbosity that can be increased', increaseVerbosity, 0) - .option('-c, --collect ', 'repeatable value', collect, []) - .option('-l, --list ', 'comma separated list', commaSeparatedList) -; - -program.parse(process.argv); - -if (program.float !== undefined) console.log(`float: ${program.float}`); -if (program.integer !== undefined) console.log(`integer: ${program.integer}`); -if (program.verbose > 0) console.log(`verbosity: ${program.verbose}`); -if (program.collect.length > 0) console.log(program.collect); -if (program.list !== undefined) console.log(program.list); -``` - -```bash -$ custom -f 1e2 -float: 100 -$ custom --integer 2 -integer: 2 -$ custom -v -v -v -verbose: 3 -$ custom -c a -c b -c c -[ 'a', 'b', 'c' ] -$ custom --list x,y,z -[ 'x', 'y', 'z' ] -``` - -### Required option - -You may specify a required (mandatory) option using `.requiredOption`. The option must be specified on the command line, or by having a default value. The method is otherwise the same as `.option` in format, taking flags and description, and optional default value or custom processing. - -```js -const program = require('commander'); - -program - .requiredOption('-c, --cheese ', 'pizza must have cheese'); - -program.parse(process.argv); -``` - -``` -$ pizza -error: required option '-c, --cheese ' not specified -``` - -### Version option - -The optional `version` method adds handling for displaying the command version. The default option flags are `-V` and `--version`, and when present the command prints the version number and exits. - -```js -program.version('0.0.1'); -``` - -```bash -$ ./examples/pizza -V -0.0.1 -``` - -You may change the flags and description by passing additional parameters to the `version` method, using -the same syntax for flags as the `option` method. The version flags can be named anything, but a long name is required. - -```js -program.version('0.0.1', '-v, --vers', 'output the current version'); -``` - -## Commands - -You can specify (sub)commands for your top-level command using `.command`. There are two ways these can be implemented: using an action handler attached to the command, or as a separate executable file (described in more detail later). In the first parameter to `.command` you specify the command name and any command arguments. The arguments may be `` or `[optional]`, and the last argument may also be `variadic...`. - -For example: - -```js -// Command implemented using action handler (description is supplied separately to `.command`) -// Returns new command for configuring. -program - .command('clone [destination]') - .description('clone a repository into a newly created directory') - .action((source, destination) => { - console.log('clone command called'); - }); - -// Command implemented using separate executable file (description is second parameter to `.command`) -// Returns top-level command for adding more commands. -program - .command('start ', 'start named service') - .command('stop [service]', 'stop named service, or all if no name supplied'); -``` - -### Specify the argument syntax - -You use `.arguments` to specify the arguments for the top-level command, and for subcommands they are included in the `.command` call. Angled brackets (e.g. ``) indicate required input. Square brackets (e.g. `[optional]`) indicate optional input. - -```js -const program = require('commander'); - -program - .version('0.1.0') - .arguments(' [env]') - .action(function (cmd, env) { - cmdValue = cmd; - envValue = env; - }); - -program.parse(process.argv); - -if (typeof cmdValue === 'undefined') { - console.error('no command given!'); - process.exit(1); -} -console.log('command:', cmdValue); -console.log('environment:', envValue || "no environment given"); -``` - - The last argument of a command can be variadic, and only the last argument. To make an argument variadic you - append `...` to the argument name. For example: - -```js -const program = require('commander'); - -program - .version('0.1.0') - .command('rmdir
    - - Get professional support for 'camelcase' with a Tidelift subscription - -
    - - Tidelift helps make open source sustainable for maintainers while giving companies
    assurances about security, maintenance, and licensing for their dependencies. -
    -
    [otherDirs...]') - .action(function (dir, otherDirs) { - console.log('rmdir %s', dir); - if (otherDirs) { - otherDirs.forEach(function (oDir) { - console.log('rmdir %s', oDir); - }); - } - }); - -program.parse(process.argv); -``` - -The variadic argument is passed to the action handler as an array. (And this also applies to `program.args`.) - -### Action handler (sub)commands - -You can add options to a command that uses an action handler. -The action handler gets passed a parameter for each argument you declared, and one additional argument which is the -command object itself. This command argument has the values for the command-specific options added as properties. - -```js -const program = require('commander'); - -program - .command('rm ') - .option('-r, --recursive', 'Remove recursively') - .action(function (dir, cmdObj) { - console.log('remove ' + dir + (cmdObj.recursive ? ' recursively' : '')) - }) - -program.parse(process.argv) -``` - -You may supply an `async` action handler, in which case you call `.parseAsync` rather than `.parse`. - -```js -async function run() { /* code goes here */ } - -async function main() { - program - .command('run') - .action(run); - await program.parseAsync(process.argv); -} -``` - -A command's options on the command line are validated when the command is used. Any unknown options will be reported as an error. However, if an action-based command does not define an action, then the options are not validated. - -Configuration options can be passed with the call to `.command()`. Specifying `true` for `opts.noHelp` will remove the command from the generated help output. - -### Git-style executable (sub)commands - -When `.command()` is invoked with a description argument, this tells commander that you're going to use separate executables for sub-commands, much like `git(1)` and other popular tools. -Commander will search the executables in the directory of the entry script (like `./examples/pm`) with the name `program-subcommand`, like `pm-install`, `pm-search`. -You can specify a custom name with the `executableFile` configuration option. - -You handle the options for an executable (sub)command in the executable, and don't declare them at the top-level. - -```js -// file: ./examples/pm -const program = require('commander'); - -program - .version('0.1.0') - .command('install [name]', 'install one or more packages') - .command('search [query]', 'search with optional query') - .command('update', 'update installed packages', {executableFile: 'myUpdateSubCommand'}) - .command('list', 'list packages installed', {isDefault: true}) - .parse(process.argv); -``` - -Configuration options can be passed with the call to `.command()`. Specifying `true` for `opts.noHelp` will remove the command from the generated help output. Specifying `true` for `opts.isDefault` will run the subcommand if no other subcommand is specified. -Specifying a name with `executableFile` will override the default constructed name. - -If the program is designed to be installed globally, make sure the executables have proper modes, like `755`. - -## Automated --help - - The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free: - -```bash -$ ./examples/pizza --help -Usage: pizza [options] - -An application for pizzas ordering - -Options: - -V, --version output the version number - -p, --peppers Add peppers - -P, --pineapple Add pineapple - -b, --bbq Add bbq sauce - -c, --cheese Add the specified type of cheese (default: "marble") - -C, --no-cheese You do not want any cheese - -h, --help output usage information -``` - -### Custom help - - You can display arbitrary `-h, --help` information - by listening for "--help". Commander will automatically - exit once you are done so that the remainder of your program - does not execute causing undesired behaviors, for example - in the following executable "stuff" will not output when - `--help` is used. - -```js -#!/usr/bin/env node - -const program = require('commander'); - -program - .version('0.1.0') - .option('-f, --foo', 'enable some foo') - .option('-b, --bar', 'enable some bar') - .option('-B, --baz', 'enable some baz'); - -// must be before .parse() since -// node's emit() is immediate - -program.on('--help', function(){ - console.log('') - console.log('Examples:'); - console.log(' $ custom-help --help'); - console.log(' $ custom-help -h'); -}); - -program.parse(process.argv); - -console.log('stuff'); -``` - -Yields the following help output when `node script-name.js -h` or `node script-name.js --help` are run: - -```Text -Usage: custom-help [options] - -Options: - -h, --help output usage information - -V, --version output the version number - -f, --foo enable some foo - -b, --bar enable some bar - -B, --baz enable some baz - -Examples: - $ custom-help --help - $ custom-help -h -``` - -### .usage and .name - -These allow you to customise the usage description in the first line of the help. The name is otherwise -deduced from the (full) program arguments. Given: - -```js -program - .name("my-command") - .usage("[global options] command") -``` - -The help will start with: - -```Text -Usage: my-command [global options] command -``` - -### .outputHelp(cb) - -Output help information without exiting. -Optional callback cb allows post-processing of help text before it is displayed. - -If you want to display help by default (e.g. if no command was provided), you can use something like: - -```js -const program = require('commander'); -const colors = require('colors'); - -program - .version('0.1.0') - .command('getstream [url]', 'get stream URL') - .parse(process.argv); - -if (!process.argv.slice(2).length) { - program.outputHelp(make_red); -} - -function make_red(txt) { - return colors.red(txt); //display the help text in red on the console -} -``` - -### .helpOption(flags, description) - - Override the default help flags and description. - -```js -program - .helpOption('-e, --HELP', 'read more information'); -``` - -### .help(cb) - - Output help information and exit immediately. - Optional callback cb allows post-processing of help text before it is displayed. - -## Custom event listeners - - You can execute custom actions by listening to command and option events. - -```js -program.on('option:verbose', function () { - process.env.VERBOSE = this.verbose; -}); - -// error on unknown commands -program.on('command:*', function () { - console.error('Invalid command: %s\nSee --help for a list of available commands.', program.args.join(' ')); - process.exit(1); -}); -``` - -## Bits and pieces - -### Avoiding option name clashes - -The original and default behaviour is that the option values are stored -as properties on the program, and the action handler is passed a -command object with the options values stored as properties. -This is very convenient to code, but the downside is possible clashes with -existing properties of Command. - -There are two new routines to change the behaviour, and the default behaviour may change in the future: - -- `storeOptionsAsProperties`: whether to store option values as properties on command object, or store separately (specify false) and access using `.opts()` -- `passCommandToAction`: whether to pass command to action handler, -or just the options (specify false) - -```js -// file: ./examples/storeOptionsAsProperties.action.js -program - .storeOptionsAsProperties(false) - .passCommandToAction(false); - -program - .name('my-program-name') - .option('-n,--name '); - -program - .command('show') - .option('-a,--action ') - .action((options) => { - console.log(options.action); - }); - -program.parse(process.argv); - -const programOptions = program.opts(); -console.log(programOptions.name); -``` - -### TypeScript - -The Commander package includes its TypeScript Definition file, but also requires the node types which you need to install yourself. e.g. - -```bash -npm install commander -npm install --save-dev @types/node -``` - -If you use `ts-node` and git-style sub-commands written as `.ts` files, you need to call your program through node to get the sub-commands called correctly. e.g. - -```bash -node -r ts-node/register pm.ts -``` - -### Node options such as `--harmony` - -You can enable `--harmony` option in two ways: - -- Use `#! /usr/bin/env node --harmony` in the sub-commands scripts. (Note Windows does not support this pattern.) -- Use the `--harmony` option when call the command, like `node --harmony examples/pm publish`. The `--harmony` option will be preserved when spawning sub-command process. - -### Node debugging - -If you are using the node inspector for [debugging](https://nodejs.org/en/docs/guides/debugging-getting-started/) git-style executable (sub)commands using `node --inspect` et al, -the inspector port is incremented by 1 for the spawned subcommand. - -### Override exit handling - -By default Commander calls `process.exit` when it detects errors, or after displaying the help or version. You can override -this behaviour and optionally supply a callback. The default override throws a `CommanderError`. - -The override callback is passed a `CommanderError` with properties `exitCode` number, `code` string, and `message`. The default override behaviour is to throw the error, except for async handling of executable subcommand completion which carries on. The normal display of error messages or version or help -is not affected by the override which is called after the display. - -``` js -program.exitOverride(); - -try { - program.parse(process.argv); -} catch (err) { - // custom processing... -} -``` - -## Examples - -```js -const program = require('commander'); - -program - .version('0.1.0') - .option('-C, --chdir ', 'change the working directory') - .option('-c, --config ', 'set config path. defaults to ./deploy.conf') - .option('-T, --no-tests', 'ignore test hook'); - -program - .command('setup [env]') - .description('run setup commands for all envs') - .option("-s, --setup_mode [mode]", "Which setup mode to use") - .action(function(env, options){ - const mode = options.setup_mode || "normal"; - env = env || 'all'; - console.log('setup for %s env(s) with %s mode', env, mode); - }); - -program - .command('exec ') - .alias('ex') - .description('execute the given remote cmd') - .option("-e, --exec_mode ", "Which exec mode to use") - .action(function(cmd, options){ - console.log('exec "%s" using %s mode', cmd, options.exec_mode); - }).on('--help', function() { - console.log(''); - console.log('Examples:'); - console.log(''); - console.log(' $ deploy exec sequential'); - console.log(' $ deploy exec async'); - }); - -program - .command('*') - .action(function(env){ - console.log('deploying "%s"', env); - }); - -program.parse(process.argv); -``` - -More Demos can be found in the [examples](https://github.com/tj/commander.js/tree/master/examples) directory. - -## License - -[MIT](https://github.com/tj/commander.js/blob/master/LICENSE) - -## Support - -Commander 4.x is supported on Node 8 and above, and is likely to work with Node 6 but not tested. -(For versions of Node below Node 6, use Commander 3.x or 2.x.) - -The main forum for free and community support is the project [Issues](https://github.com/tj/commander.js/issues) on GitHub. - -### Commander for enterprise - -Available as part of the Tidelift Subscription - -The maintainers of Commander and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-commander?utm_source=npm-commander&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) diff --git a/node_modules/commander/index.js b/node_modules/commander/index.js deleted file mode 100644 index 37d20cc..0000000 --- a/node_modules/commander/index.js +++ /dev/null @@ -1,1649 +0,0 @@ -/** - * Module dependencies. - */ - -var EventEmitter = require('events').EventEmitter; -var spawn = require('child_process').spawn; -var path = require('path'); -var dirname = path.dirname; -var basename = path.basename; -var fs = require('fs'); - -/** - * Inherit `Command` from `EventEmitter.prototype`. - */ - -require('util').inherits(Command, EventEmitter); - -/** - * Expose the root command. - */ - -exports = module.exports = new Command(); - -/** - * Expose `Command`. - */ - -exports.Command = Command; - -/** - * Expose `Option`. - */ - -exports.Option = Option; - -/** - * Initialize a new `Option` with the given `flags` and `description`. - * - * @param {String} flags - * @param {String} description - * @api public - */ - -function Option(flags, description) { - this.flags = flags; - this.required = flags.indexOf('<') >= 0; // A value must be supplied when the option is specified. - this.optional = flags.indexOf('[') >= 0; // A value is optional when the option is specified. - this.mandatory = false; // The option must have a value after parsing, which usually means it must be specified on command line. - this.negate = flags.indexOf('-no-') !== -1; - flags = flags.split(/[ ,|]+/); - if (flags.length > 1 && !/^[[<]/.test(flags[1])) this.short = flags.shift(); - this.long = flags.shift(); - this.description = description || ''; -} - -/** - * Return option name. - * - * @return {String} - * @api private - */ - -Option.prototype.name = function() { - return this.long.replace(/^--/, ''); -}; - -/** - * Return option name, in a camelcase format that can be used - * as a object attribute key. - * - * @return {String} - * @api private - */ - -Option.prototype.attributeName = function() { - return camelcase(this.name().replace(/^no-/, '')); -}; - -/** - * Check if `arg` matches the short or long flag. - * - * @param {String} arg - * @return {Boolean} - * @api private - */ - -Option.prototype.is = function(arg) { - return this.short === arg || this.long === arg; -}; - -/** - * CommanderError class - * @class - */ -class CommanderError extends Error { - /** - * Constructs the CommanderError class - * @param {Number} exitCode suggested exit code which could be used with process.exit - * @param {String} code an id string representing the error - * @param {String} message human-readable description of the error - * @constructor - */ - constructor(exitCode, code, message) { - super(message); - // properly capture stack trace in Node.js - Error.captureStackTrace(this, this.constructor); - this.name = this.constructor.name; - this.code = code; - this.exitCode = exitCode; - } -} - -exports.CommanderError = CommanderError; - -/** - * Initialize a new `Command`. - * - * @param {String} [name] - * @api public - */ - -function Command(name) { - this.commands = []; - this.options = []; - this._execs = new Set(); - this._allowUnknownOption = false; - this._args = []; - this._name = name || ''; - this._optionValues = {}; - this._storeOptionsAsProperties = true; // backwards compatible by default - this._passCommandToAction = true; // backwards compatible by default - this._actionResults = []; - - this._helpFlags = '-h, --help'; - this._helpDescription = 'output usage information'; - this._helpShortFlag = '-h'; - this._helpLongFlag = '--help'; -} - -/** - * Define a command. - * - * There are two styles of command: pay attention to where to put the description. - * - * Examples: - * - * // Command implemented using action handler (description is supplied separately to `.command`) - * program - * .command('clone [destination]') - * .description('clone a repository into a newly created directory') - * .action((source, destination) => { - * console.log('clone command called'); - * }); - * - * // Command implemented using separate executable file (description is second parameter to `.command`) - * program - * .command('start ', 'start named service') - * .command('stop [service]', 'stop named service, or all if no name supplied'); - * - * @param {string} nameAndArgs - command name and arguments, args are `` or `[optional]` and last may also be `variadic...` - * @param {Object|string} [actionOptsOrExecDesc] - configuration options (for action), or description (for executable) - * @param {Object} [execOpts] - configuration options (for executable) - * @return {Command} returns new command for action handler, or top-level command for executable command - * @api public - */ - -Command.prototype.command = function(nameAndArgs, actionOptsOrExecDesc, execOpts) { - var desc = actionOptsOrExecDesc; - var opts = execOpts; - if (typeof desc === 'object' && desc !== null) { - opts = desc; - desc = null; - } - opts = opts || {}; - var args = nameAndArgs.split(/ +/); - var cmd = new Command(args.shift()); - - if (desc) { - cmd.description(desc); - this.executables = true; - this._execs.add(cmd._name); - if (opts.isDefault) this.defaultExecutable = cmd._name; - } - cmd._noHelp = !!opts.noHelp; - cmd._helpFlags = this._helpFlags; - cmd._helpDescription = this._helpDescription; - cmd._helpShortFlag = this._helpShortFlag; - cmd._helpLongFlag = this._helpLongFlag; - cmd._exitCallback = this._exitCallback; - cmd._storeOptionsAsProperties = this._storeOptionsAsProperties; - cmd._passCommandToAction = this._passCommandToAction; - - cmd._executableFile = opts.executableFile; // Custom name for executable file - this.commands.push(cmd); - cmd.parseExpectedArgs(args); - cmd.parent = this; - - if (desc) return this; - return cmd; -}; - -/** - * Define argument syntax for the top-level command. - * - * @api public - */ - -Command.prototype.arguments = function(desc) { - return this.parseExpectedArgs(desc.split(/ +/)); -}; - -/** - * Add an implicit `help [cmd]` subcommand - * which invokes `--help` for the given command. - * - * @api private - */ - -Command.prototype.addImplicitHelpCommand = function() { - this.command('help [cmd]', 'display help for [cmd]'); -}; - -/** - * Parse expected `args`. - * - * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`. - * - * @param {Array} args - * @return {Command} for chaining - * @api public - */ - -Command.prototype.parseExpectedArgs = function(args) { - if (!args.length) return; - var self = this; - args.forEach(function(arg) { - var argDetails = { - required: false, - name: '', - variadic: false - }; - - switch (arg[0]) { - case '<': - argDetails.required = true; - argDetails.name = arg.slice(1, -1); - break; - case '[': - argDetails.name = arg.slice(1, -1); - break; - } - - if (argDetails.name.length > 3 && argDetails.name.slice(-3) === '...') { - argDetails.variadic = true; - argDetails.name = argDetails.name.slice(0, -3); - } - if (argDetails.name) { - self._args.push(argDetails); - } - }); - return this; -}; - -/** - * Register callback to use as replacement for calling process.exit. - * - * @param {Function} [fn] optional callback which will be passed a CommanderError, defaults to throwing - * @return {Command} for chaining - * @api public - */ - -Command.prototype.exitOverride = function(fn) { - if (fn) { - this._exitCallback = fn; - } else { - this._exitCallback = function(err) { - if (err.code !== 'commander.executeSubCommandAsync') { - throw err; - } else { - // Async callback from spawn events, not useful to throw. - } - }; - } - return this; -}; - -/** - * Call process.exit, and _exitCallback if defined. - * - * @param {Number} exitCode exit code for using with process.exit - * @param {String} code an id string representing the error - * @param {String} message human-readable description of the error - * @return never - * @api private - */ - -Command.prototype._exit = function(exitCode, code, message) { - if (this._exitCallback) { - this._exitCallback(new CommanderError(exitCode, code, message)); - // Expecting this line is not reached. - } - process.exit(exitCode); -}; - -/** - * Register callback `fn` for the command. - * - * Examples: - * - * program - * .command('help') - * .description('display verbose help') - * .action(function() { - * // output help here - * }); - * - * @param {Function} fn - * @return {Command} for chaining - * @api public - */ - -Command.prototype.action = function(fn) { - var self = this; - var listener = function(args, unknown) { - // Parse any so-far unknown options - args = args || []; - unknown = unknown || []; - - var parsed = self.parseOptions(unknown); - - // Output help if necessary - outputHelpIfRequested(self, parsed.unknown); - self._checkForMissingMandatoryOptions(); - - // If there are still any unknown options, then we simply - // die, unless someone asked for help, in which case we give it - // to them, and then we die. - if (parsed.unknown.length > 0) { - self.unknownOption(parsed.unknown[0]); - } - - // Leftover arguments need to be pushed back. Fixes issue #56 - if (parsed.args.length) args = parsed.args.concat(args); - - self._args.forEach(function(arg, i) { - if (arg.required && args[i] == null) { - self.missingArgument(arg.name); - } else if (arg.variadic) { - if (i !== self._args.length - 1) { - self.variadicArgNotLast(arg.name); - } - - args[i] = args.splice(i); - } - }); - - // The .action callback takes an extra parameter which is the command itself. - var expectedArgsCount = self._args.length; - var actionArgs = args.slice(0, expectedArgsCount); - if (self._passCommandToAction) { - actionArgs[expectedArgsCount] = self; - } else { - actionArgs[expectedArgsCount] = self.opts(); - } - // Add the extra arguments so available too. - if (args.length > expectedArgsCount) { - actionArgs.push(args.slice(expectedArgsCount)); - } - - const actionResult = fn.apply(self, actionArgs); - // Remember result in case it is async. Assume parseAsync getting called on root. - let rootCommand = self; - while (rootCommand.parent) { - rootCommand = rootCommand.parent; - } - rootCommand._actionResults.push(actionResult); - }; - var parent = this.parent || this; - var name = parent === this ? '*' : this._name; - parent.on('command:' + name, listener); - if (this._alias) parent.on('command:' + this._alias, listener); - return this; -}; - -/** - * Internal implementation shared by .option() and .requiredOption() - * - * @param {Object} config - * @param {String} flags - * @param {String} description - * @param {Function|*} [fn] - custom option processing function or default vaue - * @param {*} [defaultValue] - * @return {Command} for chaining - * @api private - */ - -Command.prototype._optionEx = function(config, flags, description, fn, defaultValue) { - var self = this, - option = new Option(flags, description), - oname = option.name(), - name = option.attributeName(); - option.mandatory = !!config.mandatory; - - // default as 3rd arg - if (typeof fn !== 'function') { - if (fn instanceof RegExp) { - // This is a bit simplistic (especially no error messages), and probably better handled by caller using custom option processing. - // No longer documented in README, but still present for backwards compatibility. - var regex = fn; - fn = function(val, def) { - var m = regex.exec(val); - return m ? m[0] : def; - }; - } else { - defaultValue = fn; - fn = null; - } - } - - // preassign default value for --no-*, [optional], , or plain flag if boolean value - if (option.negate || option.optional || option.required || typeof defaultValue === 'boolean') { - // when --no-foo we make sure default is true, unless a --foo option is already defined - if (option.negate) { - const positiveLongFlag = option.long.replace(/^--no-/, '--'); - defaultValue = self.optionFor(positiveLongFlag) ? self._getOptionValue(name) : true; - } - // preassign only if we have a default - if (defaultValue !== undefined) { - self._setOptionValue(name, defaultValue); - option.defaultValue = defaultValue; - } - } - - // register the option - this.options.push(option); - - // when it's passed assign the value - // and conditionally invoke the callback - this.on('option:' + oname, function(val) { - // coercion - if (val !== null && fn) { - val = fn(val, self._getOptionValue(name) === undefined ? defaultValue : self._getOptionValue(name)); - } - - // unassigned or boolean value - if (typeof self._getOptionValue(name) === 'boolean' || typeof self._getOptionValue(name) === 'undefined') { - // if no value, negate false, and we have a default, then use it! - if (val == null) { - self._setOptionValue(name, option.negate - ? false - : defaultValue || true); - } else { - self._setOptionValue(name, val); - } - } else if (val !== null) { - // reassign - self._setOptionValue(name, option.negate ? false : val); - } - }); - - return this; -}; - -/** - * Define option with `flags`, `description` and optional - * coercion `fn`. - * - * The `flags` string should contain both the short and long flags, - * separated by comma, a pipe or space. The following are all valid - * all will output this way when `--help` is used. - * - * "-p, --pepper" - * "-p|--pepper" - * "-p --pepper" - * - * Examples: - * - * // simple boolean defaulting to undefined - * program.option('-p, --pepper', 'add pepper'); - * - * program.pepper - * // => undefined - * - * --pepper - * program.pepper - * // => true - * - * // simple boolean defaulting to true (unless non-negated option is also defined) - * program.option('-C, --no-cheese', 'remove cheese'); - * - * program.cheese - * // => true - * - * --no-cheese - * program.cheese - * // => false - * - * // required argument - * program.option('-C, --chdir ', 'change the working directory'); - * - * --chdir /tmp - * program.chdir - * // => "/tmp" - * - * // optional argument - * program.option('-c, --cheese [type]', 'add cheese [marble]'); - * - * @param {String} flags - * @param {String} description - * @param {Function|*} [fn] - custom option processing function or default vaue - * @param {*} [defaultValue] - * @return {Command} for chaining - * @api public - */ - -Command.prototype.option = function(flags, description, fn, defaultValue) { - return this._optionEx({}, flags, description, fn, defaultValue); -}; - -/* - * Add a required option which must have a value after parsing. This usually means - * the option must be specified on the command line. (Otherwise the same as .option().) - * - * The `flags` string should contain both the short and long flags, separated by comma, a pipe or space. - * - * @param {String} flags - * @param {String} description - * @param {Function|*} [fn] - custom option processing function or default vaue - * @param {*} [defaultValue] - * @return {Command} for chaining - * @api public - */ - -Command.prototype.requiredOption = function(flags, description, fn, defaultValue) { - return this._optionEx({ mandatory: true }, flags, description, fn, defaultValue); -}; - -/** - * Allow unknown options on the command line. - * - * @param {Boolean} arg if `true` or omitted, no error will be thrown - * for unknown options. - * @api public - */ -Command.prototype.allowUnknownOption = function(arg) { - this._allowUnknownOption = arguments.length === 0 || arg; - return this; -}; - -/** - * Whether to store option values as properties on command object, - * or store separately (specify false). In both cases the option values can be accessed using .opts(). - * - * @param {boolean} value - * @return {Command} Command for chaining - * @api public - */ - -Command.prototype.storeOptionsAsProperties = function(value) { - this._storeOptionsAsProperties = (value === undefined) || value; - if (this.options.length) { - // This is for programmer, not end user. - console.error('Commander usage error: call storeOptionsAsProperties before adding options'); - } - return this; -}; - -/** - * Whether to pass command to action handler, - * or just the options (specify false). - * - * @param {boolean} value - * @return {Command} Command for chaining - * @api public - */ - -Command.prototype.passCommandToAction = function(value) { - this._passCommandToAction = (value === undefined) || value; - return this; -}; - -/** - * Store option value - * - * @param {String} key - * @param {Object} value - * @api private - */ - -Command.prototype._setOptionValue = function(key, value) { - if (this._storeOptionsAsProperties) { - this[key] = value; - } else { - this._optionValues[key] = value; - } -}; - -/** - * Retrieve option value - * - * @param {String} key - * @return {Object} value - * @api private - */ - -Command.prototype._getOptionValue = function(key) { - if (this._storeOptionsAsProperties) { - return this[key]; - } - return this._optionValues[key]; -}; - -/** - * Parse `argv`, setting options and invoking commands when defined. - * - * @param {Array} argv - * @return {Command} for chaining - * @api public - */ - -Command.prototype.parse = function(argv) { - // implicit help - if (this.executables) this.addImplicitHelpCommand(); - - // store raw args - this.rawArgs = argv; - - // guess name - this._name = this._name || basename(argv[1], '.js'); - - // github-style sub-commands with no sub-command - if (this.executables && argv.length < 3 && !this.defaultExecutable) { - // this user needs help - argv.push(this._helpLongFlag); - } - - // process argv - var normalized = this.normalize(argv.slice(2)); - var parsed = this.parseOptions(normalized); - var args = this.args = parsed.args; - - var result = this.parseArgs(this.args, parsed.unknown); - - if (args[0] === 'help' && args.length === 1) this.help(); - - // Note for future: we could return early if we found an action handler in parseArgs, as none of following code needed? - - // --help - if (args[0] === 'help') { - args[0] = args[1]; - args[1] = this._helpLongFlag; - } else { - // If calling through to executable subcommand we could check for help flags before failing, - // but a somewhat unlikely case since program options not passed to executable subcommands. - // Wait for reports to see if check needed and what usage pattern is. - this._checkForMissingMandatoryOptions(); - } - - // executable sub-commands - // (Debugging note for future: args[0] is not right if an action has been called) - var name = result.args[0]; - var subCommand = null; - - // Look for subcommand - if (name) { - subCommand = this.commands.find(function(command) { - return command._name === name; - }); - } - - // Look for alias - if (!subCommand && name) { - subCommand = this.commands.find(function(command) { - return command.alias() === name; - }); - if (subCommand) { - name = subCommand._name; - args[0] = name; - } - } - - // Look for default subcommand - if (!subCommand && this.defaultExecutable) { - name = this.defaultExecutable; - args.unshift(name); - subCommand = this.commands.find(function(command) { - return command._name === name; - }); - } - - if (this._execs.has(name)) { - return this.executeSubCommand(argv, args, parsed.unknown, subCommand ? subCommand._executableFile : undefined); - } - - return result; -}; - -/** - * Parse `argv`, setting options and invoking commands when defined. - * - * Use parseAsync instead of parse if any of your action handlers are async. Returns a Promise. - * - * @param {Array} argv - * @return {Promise} - * @api public - */ -Command.prototype.parseAsync = function(argv) { - this.parse(argv); - return Promise.all(this._actionResults); -}; - -/** - * Execute a sub-command executable. - * - * @param {Array} argv - * @param {Array} args - * @param {Array} unknown - * @param {String} executableFile - * @api private - */ - -Command.prototype.executeSubCommand = function(argv, args, unknown, executableFile) { - args = args.concat(unknown); - - if (!args.length) this.help(); - - var isExplicitJS = false; // Whether to use node to launch "executable" - - // executable - var pm = argv[1]; - // name of the subcommand, like `pm-install` - var bin = basename(pm, path.extname(pm)) + '-' + args[0]; - if (executableFile != null) { - bin = executableFile; - // Check for same extensions as we scan for below so get consistent launch behaviour. - var executableExt = path.extname(executableFile); - isExplicitJS = executableExt === '.js' || executableExt === '.ts' || executableExt === '.mjs'; - } - - // In case of globally installed, get the base dir where executable - // subcommand file should be located at - var baseDir; - - var resolvedLink = fs.realpathSync(pm); - - baseDir = dirname(resolvedLink); - - // prefer local `./` to bin in the $PATH - var localBin = path.join(baseDir, bin); - - // whether bin file is a js script with explicit `.js` or `.ts` extension - if (exists(localBin + '.js')) { - bin = localBin + '.js'; - isExplicitJS = true; - } else if (exists(localBin + '.ts')) { - bin = localBin + '.ts'; - isExplicitJS = true; - } else if (exists(localBin + '.mjs')) { - bin = localBin + '.mjs'; - isExplicitJS = true; - } else if (exists(localBin)) { - bin = localBin; - } - - args = args.slice(1); - - var proc; - if (process.platform !== 'win32') { - if (isExplicitJS) { - args.unshift(bin); - // add executable arguments to spawn - args = incrementNodeInspectorPort(process.execArgv).concat(args); - - proc = spawn(process.argv[0], args, { stdio: 'inherit' }); - } else { - proc = spawn(bin, args, { stdio: 'inherit' }); - } - } else { - args.unshift(bin); - // add executable arguments to spawn - args = incrementNodeInspectorPort(process.execArgv).concat(args); - proc = spawn(process.execPath, args, { stdio: 'inherit' }); - } - - var signals = ['SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGINT', 'SIGHUP']; - signals.forEach(function(signal) { - process.on(signal, function() { - if (proc.killed === false && proc.exitCode === null) { - proc.kill(signal); - } - }); - }); - - // By default terminate process when spawned process terminates. - // Suppressing the exit if exitCallback defined is a bit messy and of limited use, but does allow process to stay running! - const exitCallback = this._exitCallback; - if (!exitCallback) { - proc.on('close', process.exit.bind(process)); - } else { - proc.on('close', () => { - exitCallback(new CommanderError(process.exitCode || 0, 'commander.executeSubCommandAsync', '(close)')); - }); - } - proc.on('error', function(err) { - if (err.code === 'ENOENT') { - console.error('error: %s(1) does not exist, try --help', bin); - } else if (err.code === 'EACCES') { - console.error('error: %s(1) not executable. try chmod or run with root', bin); - } - if (!exitCallback) { - process.exit(1); - } else { - const wrappedError = new CommanderError(1, 'commander.executeSubCommandAsync', '(error)'); - wrappedError.nestedError = err; - exitCallback(wrappedError); - } - }); - - // Store the reference to the child process - this.runningCommand = proc; -}; - -/** - * Normalize `args`, splitting joined short flags. For example - * the arg "-abc" is equivalent to "-a -b -c". - * This also normalizes equal sign and splits "--abc=def" into "--abc def". - * - * @param {Array} args - * @return {Array} - * @api private - */ - -Command.prototype.normalize = function(args) { - var ret = [], - arg, - lastOpt, - index, - short, - opt; - - for (var i = 0, len = args.length; i < len; ++i) { - arg = args[i]; - if (i > 0) { - lastOpt = this.optionFor(args[i - 1]); - } - - if (arg === '--') { - // Honor option terminator - ret = ret.concat(args.slice(i)); - break; - } else if (lastOpt && lastOpt.required) { - ret.push(arg); - } else if (arg.length > 2 && arg[0] === '-' && arg[1] !== '-') { - short = arg.slice(0, 2); - opt = this.optionFor(short); - if (opt && (opt.required || opt.optional)) { - ret.push(short); - ret.push(arg.slice(2)); - } else { - arg.slice(1).split('').forEach(function(c) { - ret.push('-' + c); - }); - } - } else if (/^--/.test(arg) && ~(index = arg.indexOf('='))) { - ret.push(arg.slice(0, index), arg.slice(index + 1)); - } else { - ret.push(arg); - } - } - - return ret; -}; - -/** - * Parse command `args`. - * - * When listener(s) are available those - * callbacks are invoked, otherwise the "*" - * event is emitted and those actions are invoked. - * - * @param {Array} args - * @return {Command} for chaining - * @api private - */ - -Command.prototype.parseArgs = function(args, unknown) { - var name; - - if (args.length) { - name = args[0]; - if (this.listeners('command:' + name).length) { - this.emit('command:' + args.shift(), args, unknown); - } else { - this.emit('command:*', args, unknown); - } - } else { - outputHelpIfRequested(this, unknown); - - // If there were no args and we have unknown options, - // then they are extraneous and we need to error. - if (unknown.length > 0 && !this.defaultExecutable) { - this.unknownOption(unknown[0]); - } - if (this.commands.length === 0 && - this._args.filter(function(a) { return a.required; }).length === 0) { - this.emit('command:*'); - } - } - - return this; -}; - -/** - * Return an option matching `arg` if any. - * - * @param {String} arg - * @return {Option} - * @api private - */ - -Command.prototype.optionFor = function(arg) { - for (var i = 0, len = this.options.length; i < len; ++i) { - if (this.options[i].is(arg)) { - return this.options[i]; - } - } -}; - -/** - * Display an error message if a mandatory option does not have a value. - * - * @api private - */ - -Command.prototype._checkForMissingMandatoryOptions = function() { - // Walk up hierarchy so can call from action handler after checking for displaying help. - for (var cmd = this; cmd; cmd = cmd.parent) { - cmd.options.forEach((anOption) => { - if (anOption.mandatory && (cmd._getOptionValue(anOption.attributeName()) === undefined)) { - cmd.missingMandatoryOptionValue(anOption); - } - }); - } -}; - -/** - * Parse options from `argv` returning `argv` - * void of these options. - * - * @param {Array} argv - * @return {{args: Array, unknown: Array}} - * @api public - */ - -Command.prototype.parseOptions = function(argv) { - var args = [], - len = argv.length, - literal, - option, - arg; - - var unknownOptions = []; - - // parse options - for (var i = 0; i < len; ++i) { - arg = argv[i]; - - // literal args after -- - if (literal) { - args.push(arg); - continue; - } - - if (arg === '--') { - literal = true; - continue; - } - - // find matching Option - option = this.optionFor(arg); - - // option is defined - if (option) { - // requires arg - if (option.required) { - arg = argv[++i]; - if (arg == null) return this.optionMissingArgument(option); - this.emit('option:' + option.name(), arg); - // optional arg - } else if (option.optional) { - arg = argv[i + 1]; - if (arg == null || (arg[0] === '-' && arg !== '-')) { - arg = null; - } else { - ++i; - } - this.emit('option:' + option.name(), arg); - // flag - } else { - this.emit('option:' + option.name()); - } - continue; - } - - // looks like an option - if (arg.length > 1 && arg[0] === '-') { - unknownOptions.push(arg); - - // If the next argument looks like it might be - // an argument for this option, we pass it on. - // If it isn't, then it'll simply be ignored - if ((i + 1) < argv.length && (argv[i + 1][0] !== '-' || argv[i + 1] === '-')) { - unknownOptions.push(argv[++i]); - } - continue; - } - - // arg - args.push(arg); - } - - return { args: args, unknown: unknownOptions }; -}; - -/** - * Return an object containing options as key-value pairs - * - * @return {Object} - * @api public - */ -Command.prototype.opts = function() { - if (this._storeOptionsAsProperties) { - // Preserve original behaviour so backwards compatible when still using properties - var result = {}, - len = this.options.length; - - for (var i = 0; i < len; i++) { - var key = this.options[i].attributeName(); - result[key] = key === this._versionOptionName ? this._version : this[key]; - } - return result; - } - - return this._optionValues; -}; - -/** - * Argument `name` is missing. - * - * @param {String} name - * @api private - */ - -Command.prototype.missingArgument = function(name) { - const message = `error: missing required argument '${name}'`; - console.error(message); - this._exit(1, 'commander.missingArgument', message); -}; - -/** - * `Option` is missing an argument, but received `flag` or nothing. - * - * @param {Option} option - * @param {String} [flag] - * @api private - */ - -Command.prototype.optionMissingArgument = function(option, flag) { - let message; - if (flag) { - message = `error: option '${option.flags}' argument missing, got '${flag}'`; - } else { - message = `error: option '${option.flags}' argument missing`; - } - console.error(message); - this._exit(1, 'commander.optionMissingArgument', message); -}; - -/** - * `Option` does not have a value, and is a mandatory option. - * - * @param {Option} option - * @api private - */ - -Command.prototype.missingMandatoryOptionValue = function(option) { - const message = `error: required option '${option.flags}' not specified`; - console.error(message); - this._exit(1, 'commander.missingMandatoryOptionValue', message); -}; - -/** - * Unknown option `flag`. - * - * @param {String} flag - * @api private - */ - -Command.prototype.unknownOption = function(flag) { - if (this._allowUnknownOption) return; - const message = `error: unknown option '${flag}'`; - console.error(message); - this._exit(1, 'commander.unknownOption', message); -}; - -/** - * Variadic argument with `name` is not the last argument as required. - * - * @param {String} name - * @api private - */ - -Command.prototype.variadicArgNotLast = function(name) { - const message = `error: variadic arguments must be last '${name}'`; - console.error(message); - this._exit(1, 'commander.variadicArgNotLast', message); -}; - -/** - * Set the program version to `str`. - * - * This method auto-registers the "-V, --version" flag - * which will print the version number when passed. - * - * You can optionally supply the flags and description to override the defaults. - * - * @param {String} str - * @param {String} [flags] - * @param {String} [description] - * @return {Command} for chaining - * @api public - */ - -Command.prototype.version = function(str, flags, description) { - if (arguments.length === 0) return this._version; - this._version = str; - flags = flags || '-V, --version'; - description = description || 'output the version number'; - var versionOption = new Option(flags, description); - this._versionOptionName = versionOption.long.substr(2) || 'version'; - this.options.push(versionOption); - var self = this; - this.on('option:' + this._versionOptionName, function() { - process.stdout.write(str + '\n'); - self._exit(0, 'commander.version', str); - }); - return this; -}; - -/** - * Set the description to `str`. - * - * @param {String} str - * @param {Object} [argsDescription] - * @return {String|Command} - * @api public - */ - -Command.prototype.description = function(str, argsDescription) { - if (arguments.length === 0) return this._description; - this._description = str; - this._argsDescription = argsDescription; - return this; -}; - -/** - * Set an alias for the command - * - * @param {String} alias - * @return {String|Command} - * @api public - */ - -Command.prototype.alias = function(alias) { - var command = this; - if (this.commands.length !== 0) { - command = this.commands[this.commands.length - 1]; - } - - if (arguments.length === 0) return command._alias; - - if (alias === command._name) throw new Error('Command alias can\'t be the same as its name'); - - command._alias = alias; - return this; -}; - -/** - * Set / get the command usage `str`. - * - * @param {String} [str] - * @return {String|Command} - * @api public - */ - -Command.prototype.usage = function(str) { - var args = this._args.map(function(arg) { - return humanReadableArgName(arg); - }); - - var usage = '[options]' + - (this.commands.length ? ' [command]' : '') + - (this._args.length ? ' ' + args.join(' ') : ''); - - if (arguments.length === 0) return this._usage || usage; - this._usage = str; - - return this; -}; - -/** - * Get or set the name of the command - * - * @param {String} [str] - * @return {String|Command} - * @api public - */ - -Command.prototype.name = function(str) { - if (arguments.length === 0) return this._name; - this._name = str; - return this; -}; - -/** - * Return prepared commands. - * - * @return {Array} - * @api private - */ - -Command.prototype.prepareCommands = function() { - return this.commands.filter(function(cmd) { - return !cmd._noHelp; - }).map(function(cmd) { - var args = cmd._args.map(function(arg) { - return humanReadableArgName(arg); - }).join(' '); - - return [ - cmd._name + - (cmd._alias ? '|' + cmd._alias : '') + - (cmd.options.length ? ' [options]' : '') + - (args ? ' ' + args : ''), - cmd._description - ]; - }); -}; - -/** - * Return the largest command length. - * - * @return {Number} - * @api private - */ - -Command.prototype.largestCommandLength = function() { - var commands = this.prepareCommands(); - return commands.reduce(function(max, command) { - return Math.max(max, command[0].length); - }, 0); -}; - -/** - * Return the largest option length. - * - * @return {Number} - * @api private - */ - -Command.prototype.largestOptionLength = function() { - var options = [].slice.call(this.options); - options.push({ - flags: this._helpFlags - }); - - return options.reduce(function(max, option) { - return Math.max(max, option.flags.length); - }, 0); -}; - -/** - * Return the largest arg length. - * - * @return {Number} - * @api private - */ - -Command.prototype.largestArgLength = function() { - return this._args.reduce(function(max, arg) { - return Math.max(max, arg.name.length); - }, 0); -}; - -/** - * Return the pad width. - * - * @return {Number} - * @api private - */ - -Command.prototype.padWidth = function() { - var width = this.largestOptionLength(); - if (this._argsDescription && this._args.length) { - if (this.largestArgLength() > width) { - width = this.largestArgLength(); - } - } - - if (this.commands && this.commands.length) { - if (this.largestCommandLength() > width) { - width = this.largestCommandLength(); - } - } - - return width; -}; - -/** - * Return help for options. - * - * @return {String} - * @api private - */ - -Command.prototype.optionHelp = function() { - var width = this.padWidth(); - - var columns = process.stdout.columns || 80; - var descriptionWidth = columns - width - 4; - - // Append the help information - return this.options.map(function(option) { - const fullDesc = option.description + - ((!option.negate && option.defaultValue !== undefined) ? ' (default: ' + JSON.stringify(option.defaultValue) + ')' : ''); - return pad(option.flags, width) + ' ' + optionalWrap(fullDesc, descriptionWidth, width + 2); - }).concat([pad(this._helpFlags, width) + ' ' + optionalWrap(this._helpDescription, descriptionWidth, width + 2)]) - .join('\n'); -}; - -/** - * Return command help documentation. - * - * @return {String} - * @api private - */ - -Command.prototype.commandHelp = function() { - if (!this.commands.length) return ''; - - var commands = this.prepareCommands(); - var width = this.padWidth(); - - var columns = process.stdout.columns || 80; - var descriptionWidth = columns - width - 4; - - return [ - 'Commands:', - commands.map(function(cmd) { - var desc = cmd[1] ? ' ' + cmd[1] : ''; - return (desc ? pad(cmd[0], width) : cmd[0]) + optionalWrap(desc, descriptionWidth, width + 2); - }).join('\n').replace(/^/gm, ' '), - '' - ].join('\n'); -}; - -/** - * Return program help documentation. - * - * @return {String} - * @api private - */ - -Command.prototype.helpInformation = function() { - var desc = []; - if (this._description) { - desc = [ - this._description, - '' - ]; - - var argsDescription = this._argsDescription; - if (argsDescription && this._args.length) { - var width = this.padWidth(); - var columns = process.stdout.columns || 80; - var descriptionWidth = columns - width - 5; - desc.push('Arguments:'); - desc.push(''); - this._args.forEach(function(arg) { - desc.push(' ' + pad(arg.name, width) + ' ' + wrap(argsDescription[arg.name], descriptionWidth, width + 4)); - }); - desc.push(''); - } - } - - var cmdName = this._name; - if (this._alias) { - cmdName = cmdName + '|' + this._alias; - } - var parentCmdNames = ''; - for (var parentCmd = this.parent; parentCmd; parentCmd = parentCmd.parent) { - parentCmdNames = parentCmd.name() + ' ' + parentCmdNames; - } - var usage = [ - 'Usage: ' + parentCmdNames + cmdName + ' ' + this.usage(), - '' - ]; - - var cmds = []; - var commandHelp = this.commandHelp(); - if (commandHelp) cmds = [commandHelp]; - - var options = [ - 'Options:', - '' + this.optionHelp().replace(/^/gm, ' '), - '' - ]; - - return usage - .concat(desc) - .concat(options) - .concat(cmds) - .join('\n'); -}; - -/** - * Output help information for this command. - * - * When listener(s) are available for the helpLongFlag - * those callbacks are invoked. - * - * @api public - */ - -Command.prototype.outputHelp = function(cb) { - if (!cb) { - cb = function(passthru) { - return passthru; - }; - } - const cbOutput = cb(this.helpInformation()); - if (typeof cbOutput !== 'string' && !Buffer.isBuffer(cbOutput)) { - throw new Error('outputHelp callback must return a string or a Buffer'); - } - process.stdout.write(cbOutput); - this.emit(this._helpLongFlag); -}; - -/** - * You can pass in flags and a description to override the help - * flags and help description for your command. - * - * @param {String} [flags] - * @param {String} [description] - * @return {Command} - * @api public - */ - -Command.prototype.helpOption = function(flags, description) { - this._helpFlags = flags || this._helpFlags; - this._helpDescription = description || this._helpDescription; - - var splitFlags = this._helpFlags.split(/[ ,|]+/); - - if (splitFlags.length > 1) this._helpShortFlag = splitFlags.shift(); - - this._helpLongFlag = splitFlags.shift(); - - return this; -}; - -/** - * Output help information and exit. - * - * @param {Function} [cb] - * @api public - */ - -Command.prototype.help = function(cb) { - this.outputHelp(cb); - // exitCode: preserving original behaviour which was calling process.exit() - // message: do not have all displayed text available so only passing placeholder. - this._exit(process.exitCode || 0, 'commander.help', '(outputHelp)'); -}; - -/** - * Camel-case the given `flag` - * - * @param {String} flag - * @return {String} - * @api private - */ - -function camelcase(flag) { - return flag.split('-').reduce(function(str, word) { - return str + word[0].toUpperCase() + word.slice(1); - }); -} - -/** - * Pad `str` to `width`. - * - * @param {String} str - * @param {Number} width - * @return {String} - * @api private - */ - -function pad(str, width) { - var len = Math.max(0, width - str.length); - return str + Array(len + 1).join(' '); -} - -/** - * Wraps the given string with line breaks at the specified width while breaking - * words and indenting every but the first line on the left. - * - * @param {String} str - * @param {Number} width - * @param {Number} indent - * @return {String} - * @api private - */ -function wrap(str, width, indent) { - var regex = new RegExp('.{1,' + (width - 1) + '}([\\s\u200B]|$)|[^\\s\u200B]+?([\\s\u200B]|$)', 'g'); - var lines = str.match(regex) || []; - return lines.map(function(line, i) { - if (line.slice(-1) === '\n') { - line = line.slice(0, line.length - 1); - } - return ((i > 0 && indent) ? Array(indent + 1).join(' ') : '') + line.trimRight(); - }).join('\n'); -} - -/** - * Optionally wrap the given str to a max width of width characters per line - * while indenting with indent spaces. Do not wrap if insufficient width or - * string is manually formatted. - * - * @param {String} str - * @param {Number} width - * @param {Number} indent - * @return {String} - * @api private - */ -function optionalWrap(str, width, indent) { - // Detect manually wrapped and indented strings by searching for line breaks - // followed by multiple spaces/tabs. - if (str.match(/[\n]\s+/)) return str; - // Do not wrap to narrow columns (or can end up with a word per line). - const minWidth = 40; - if (width < minWidth) return str; - - return wrap(str, width, indent); -} - -/** - * Output help information if help flags specified - * - * @param {Command} cmd - command to output help for - * @param {Array} options - array of options to search for -h or --help - * @api private - */ - -function outputHelpIfRequested(cmd, options) { - options = options || []; - - for (var i = 0; i < options.length; i++) { - if (options[i] === cmd._helpLongFlag || options[i] === cmd._helpShortFlag) { - cmd.outputHelp(); - // (Do not have all displayed text available so only passing placeholder.) - cmd._exit(0, 'commander.helpDisplayed', '(outputHelp)'); - } - } -} - -/** - * Takes an argument and returns its human readable equivalent for help usage. - * - * @param {Object} arg - * @return {String} - * @api private - */ - -function humanReadableArgName(arg) { - var nameOutput = arg.name + (arg.variadic === true ? '...' : ''); - - return arg.required - ? '<' + nameOutput + '>' - : '[' + nameOutput + ']'; -} - -// for versions before node v0.8 when there weren't `fs.existsSync` -function exists(file) { - try { - if (fs.statSync(file).isFile()) { - return true; - } - } catch (e) { - return false; - } -} - -/** - * Scan arguments and increment port number for inspect calls (to avoid conflicts when spawning new command). - * - * @param {string[]} args - array of arguments from node.execArgv - * @returns {string[]} - * @api private - */ - -function incrementNodeInspectorPort(args) { - // Testing for these options: - // --inspect[=[host:]port] - // --inspect-brk[=[host:]port] - // --inspect-port=[host:]port - return args.map((arg) => { - var result = arg; - if (arg.indexOf('--inspect') === 0) { - var debugOption; - var debugHost = '127.0.0.1'; - var debugPort = '9229'; - var match; - if ((match = arg.match(/^(--inspect(-brk)?)$/)) !== null) { - // e.g. --inspect - debugOption = match[1]; - } else if ((match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+)$/)) !== null) { - debugOption = match[1]; - if (/^\d+$/.test(match[3])) { - // e.g. --inspect=1234 - debugPort = match[3]; - } else { - // e.g. --inspect=localhost - debugHost = match[3]; - } - } else if ((match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/)) !== null) { - // e.g. --inspect=localhost:1234 - debugOption = match[1]; - debugHost = match[3]; - debugPort = match[4]; - } - - if (debugOption && debugPort !== '0') { - result = `${debugOption}=${debugHost}:${parseInt(debugPort) + 1}`; - } - } - return result; - }); -} diff --git a/node_modules/commander/package.json b/node_modules/commander/package.json deleted file mode 100644 index e4781e5..0000000 --- a/node_modules/commander/package.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "commander", - "version": "4.1.1", - "description": "the complete solution for node.js command-line programs", - "keywords": [ - "commander", - "command", - "option", - "parser" - ], - "author": "TJ Holowaychuk ", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/tj/commander.js.git" - }, - "scripts": { - "lint": "eslint index.js \"tests/**/*.js\"", - "test": "jest && npm run test-typings", - "test-typings": "tsc -p tsconfig.json" - }, - "main": "index", - "files": [ - "index.js", - "typings/index.d.ts" - ], - "dependencies": {}, - "devDependencies": { - "@types/jest": "^24.0.23", - "@types/node": "^12.12.11", - "eslint": "^6.7.0", - "eslint-plugin-jest": "^22.21.0", - "jest": "^24.8.0", - "standard": "^14.3.1", - "typescript": "^3.7.2" - }, - "typings": "typings/index.d.ts", - "engines": { - "node": ">= 6" - } -} diff --git a/node_modules/commander/typings/index.d.ts b/node_modules/commander/typings/index.d.ts deleted file mode 100644 index 082a3a3..0000000 --- a/node_modules/commander/typings/index.d.ts +++ /dev/null @@ -1,311 +0,0 @@ -// Type definitions for commander -// Original definitions by: Alan Agius , Marcelo Dezem , vvakame , Jules Randolph - -/// - -declare namespace commander { - - interface CommanderError extends Error { - code: string; - exitCode: number; - message: string; - nestedError?: string; - } - type CommanderErrorConstructor = { new (exitCode: number, code: string, message: string): CommanderError }; - - interface Option { - flags: string; - required: boolean; // A value must be supplied when the option is specified. - optional: boolean; // A value is optional when the option is specified. - mandatory: boolean; // The option must have a value after parsing, which usually means it must be specified on command line. - bool: boolean; - short?: string; - long: string; - description: string; - } - type OptionConstructor = { new (flags: string, description?: string): Option }; - - interface Command extends NodeJS.EventEmitter { - [key: string]: any; // options as properties - - args: string[]; - - /** - * Set the program version to `str`. - * - * This method auto-registers the "-V, --version" flag - * which will print the version number when passed. - * - * You can optionally supply the flags and description to override the defaults. - */ - version(str: string, flags?: string, description?: string): Command; - - /** - * Define a command, implemented using an action handler. - * - * @remarks - * The command description is supplied using `.description`, not as a parameter to `.command`. - * - * @example - * ```ts - * program - * .command('clone [destination]') - * .description('clone a repository into a newly created directory') - * .action((source, destination) => { - * console.log('clone command called'); - * }); - * ``` - * - * @param nameAndArgs - command name and arguments, args are `` or `[optional]` and last may also be `variadic...` - * @param opts - configuration options - * @returns new command - */ - command(nameAndArgs: string, opts?: CommandOptions): Command; - /** - * Define a command, implemented in a separate executable file. - * - * @remarks - * The command description is supplied as the second parameter to `.command`. - * - * @example - * ```ts - * program - * .command('start ', 'start named service') - * .command('stop [service]', 'stop named serice, or all if no name supplied'); - * ``` - * - * @param nameAndArgs - command name and arguments, args are `` or `[optional]` and last may also be `variadic...` - * @param description - description of executable command - * @param opts - configuration options - * @returns top level command for chaining more command definitions - */ - command(nameAndArgs: string, description: string, opts?: commander.CommandOptions): Command; - - /** - * Define argument syntax for the top-level command. - * - * @returns Command for chaining - */ - arguments(desc: string): Command; - - /** - * Parse expected `args`. - * - * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`. - * - * @returns Command for chaining - */ - parseExpectedArgs(args: string[]): Command; - - /** - * Register callback to use as replacement for calling process.exit. - */ - exitOverride(callback?: (err: CommanderError) => never|void): Command; - - /** - * Register callback `fn` for the command. - * - * @example - * program - * .command('help') - * .description('display verbose help') - * .action(function() { - * // output help here - * }); - * - * @returns Command for chaining - */ - action(fn: (...args: any[]) => void | Promise): Command; - - /** - * Define option with `flags`, `description` and optional - * coercion `fn`. - * - * The `flags` string should contain both the short and long flags, - * separated by comma, a pipe or space. The following are all valid - * all will output this way when `--help` is used. - * - * "-p, --pepper" - * "-p|--pepper" - * "-p --pepper" - * - * @example - * // simple boolean defaulting to false - * program.option('-p, --pepper', 'add pepper'); - * - * --pepper - * program.pepper - * // => Boolean - * - * // simple boolean defaulting to true - * program.option('-C, --no-cheese', 'remove cheese'); - * - * program.cheese - * // => true - * - * --no-cheese - * program.cheese - * // => false - * - * // required argument - * program.option('-C, --chdir ', 'change the working directory'); - * - * --chdir /tmp - * program.chdir - * // => "/tmp" - * - * // optional argument - * program.option('-c, --cheese [type]', 'add cheese [marble]'); - * - * @returns Command for chaining - */ - option(flags: string, description?: string, fn?: ((arg1: any, arg2: any) => void) | RegExp, defaultValue?: any): Command; - option(flags: string, description?: string, defaultValue?: any): Command; - - /** - * Define a required option, which must have a value after parsing. This usually means - * the option must be specified on the command line. (Otherwise the same as .option().) - * - * The `flags` string should contain both the short and long flags, separated by comma, a pipe or space. - */ - requiredOption(flags: string, description?: string, fn?: ((arg1: any, arg2: any) => void) | RegExp, defaultValue?: any): Command; - requiredOption(flags: string, description?: string, defaultValue?: any): Command; - - - /** - * Whether to store option values as properties on command object, - * or store separately (specify false). In both cases the option values can be accessed using .opts(). - * - * @return Command for chaining - */ - storeOptionsAsProperties(value?: boolean): Command; - - /** - * Whether to pass command to action handler, - * or just the options (specify false). - * - * @return Command for chaining - */ - passCommandToAction(value?: boolean): Command; - - /** - * Allow unknown options on the command line. - * - * @param [arg] if `true` or omitted, no error will be thrown for unknown options. - * @returns Command for chaining - */ - allowUnknownOption(arg?: boolean): Command; - - /** - * Parse `argv`, setting options and invoking commands when defined. - * - * @returns Command for chaining - */ - parse(argv: string[]): Command; - - /** - * Parse `argv`, setting options and invoking commands when defined. - * - * Use parseAsync instead of parse if any of your action handlers are async. Returns a Promise. - * - * @returns Promise - */ - parseAsync(argv: string[]): Promise; - - /** - * Parse options from `argv` returning `argv` void of these options. - */ - parseOptions(argv: string[]): commander.ParseOptionsResult; - - /** - * Return an object containing options as key-value pairs - */ - opts(): { [key: string]: any }; - - /** - * Set the description. - * - * @returns Command for chaining - */ - description(str: string, argsDescription?: {[argName: string]: string}): Command; - /** - * Get the description. - */ - description(): string; - - /** - * Set an alias for the command. - * - * @returns Command for chaining - */ - alias(alias: string): Command; - /** - * Get alias for the command. - */ - alias(): string; - - /** - * Set the command usage. - * - * @returns Command for chaining - */ - usage(str: string): Command; - /** - * Get the command usage. - */ - usage(): string; - - /** - * Set the name of the command. - * - * @returns Command for chaining - */ - name(str: string): Command; - /** - * Get the name of the command. - */ - name(): string; - - /** - * Output help information for this command. - * - * When listener(s) are available for the helpLongFlag - * those callbacks are invoked. - */ - outputHelp(cb?: (str: string) => string): void; - - /** - * You can pass in flags and a description to override the help - * flags and help description for your command. - */ - helpOption(flags?: string, description?: string): Command; - - /** - * Output help information and exit. - */ - help(cb?: (str: string) => string): never; - } - type CommandConstructor = { new (name?: string): Command }; - - - interface CommandOptions { - noHelp?: boolean; - isDefault?: boolean; - executableFile?: string; - } - - interface ParseOptionsResult { - args: string[]; - unknown: string[]; - } - - interface CommanderStatic extends Command { - Command: CommandConstructor; - Option: OptionConstructor; - CommanderError:CommanderErrorConstructor; - } - -} - -declare const commander: commander.CommanderStatic; -export = commander; diff --git a/node_modules/cross-spawn/LICENSE b/node_modules/cross-spawn/LICENSE deleted file mode 100644 index 8407b9a..0000000 --- a/node_modules/cross-spawn/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018 Made With MOXY Lda - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/node_modules/cross-spawn/README.md b/node_modules/cross-spawn/README.md deleted file mode 100644 index 1ed9252..0000000 --- a/node_modules/cross-spawn/README.md +++ /dev/null @@ -1,89 +0,0 @@ -# cross-spawn - -[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][ci-image]][ci-url] [![Build status][appveyor-image]][appveyor-url] - -[npm-url]:https://npmjs.org/package/cross-spawn -[downloads-image]:https://img.shields.io/npm/dm/cross-spawn.svg -[npm-image]:https://img.shields.io/npm/v/cross-spawn.svg -[ci-url]:https://github.com/moxystudio/node-cross-spawn/actions/workflows/ci.yaml -[ci-image]:https://github.com/moxystudio/node-cross-spawn/actions/workflows/ci.yaml/badge.svg -[appveyor-url]:https://ci.appveyor.com/project/satazor/node-cross-spawn -[appveyor-image]:https://img.shields.io/appveyor/ci/satazor/node-cross-spawn/master.svg - -A cross platform solution to node's spawn and spawnSync. - -## Installation - -Node.js version 8 and up: -`$ npm install cross-spawn` - -Node.js version 7 and under: -`$ npm install cross-spawn@6` - -## Why - -Node has issues when using spawn on Windows: - -- It ignores [PATHEXT](https://github.com/joyent/node/issues/2318) -- It does not support [shebangs](https://en.wikipedia.org/wiki/Shebang_(Unix)) -- Has problems running commands with [spaces](https://github.com/nodejs/node/issues/7367) -- Has problems running commands with posix relative paths (e.g.: `./my-folder/my-executable`) -- Has an [issue](https://github.com/moxystudio/node-cross-spawn/issues/82) with command shims (files in `node_modules/.bin/`), where arguments with quotes and parenthesis would result in [invalid syntax error](https://github.com/moxystudio/node-cross-spawn/blob/e77b8f22a416db46b6196767bcd35601d7e11d54/test/index.test.js#L149) -- No `options.shell` support on node `` where `` must not contain any arguments. -If you would like to have the shebang support improved, feel free to contribute via a pull-request. - -Remember to always test your code on Windows! - - -## Tests - -`$ npm test` -`$ npm test -- --watch` during development - - -## License - -Released under the [MIT License](https://www.opensource.org/licenses/mit-license.php). diff --git a/node_modules/cross-spawn/index.js b/node_modules/cross-spawn/index.js deleted file mode 100644 index 5509742..0000000 --- a/node_modules/cross-spawn/index.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict'; - -const cp = require('child_process'); -const parse = require('./lib/parse'); -const enoent = require('./lib/enoent'); - -function spawn(command, args, options) { - // Parse the arguments - const parsed = parse(command, args, options); - - // Spawn the child process - const spawned = cp.spawn(parsed.command, parsed.args, parsed.options); - - // Hook into child process "exit" event to emit an error if the command - // does not exists, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16 - enoent.hookChildProcess(spawned, parsed); - - return spawned; -} - -function spawnSync(command, args, options) { - // Parse the arguments - const parsed = parse(command, args, options); - - // Spawn the child process - const result = cp.spawnSync(parsed.command, parsed.args, parsed.options); - - // Analyze if the command does not exist, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16 - result.error = result.error || enoent.verifyENOENTSync(result.status, parsed); - - return result; -} - -module.exports = spawn; -module.exports.spawn = spawn; -module.exports.sync = spawnSync; - -module.exports._parse = parse; -module.exports._enoent = enoent; diff --git a/node_modules/cross-spawn/lib/enoent.js b/node_modules/cross-spawn/lib/enoent.js deleted file mode 100644 index da33471..0000000 --- a/node_modules/cross-spawn/lib/enoent.js +++ /dev/null @@ -1,59 +0,0 @@ -'use strict'; - -const isWin = process.platform === 'win32'; - -function notFoundError(original, syscall) { - return Object.assign(new Error(`${syscall} ${original.command} ENOENT`), { - code: 'ENOENT', - errno: 'ENOENT', - syscall: `${syscall} ${original.command}`, - path: original.command, - spawnargs: original.args, - }); -} - -function hookChildProcess(cp, parsed) { - if (!isWin) { - return; - } - - const originalEmit = cp.emit; - - cp.emit = function (name, arg1) { - // If emitting "exit" event and exit code is 1, we need to check if - // the command exists and emit an "error" instead - // See https://github.com/IndigoUnited/node-cross-spawn/issues/16 - if (name === 'exit') { - const err = verifyENOENT(arg1, parsed); - - if (err) { - return originalEmit.call(cp, 'error', err); - } - } - - return originalEmit.apply(cp, arguments); // eslint-disable-line prefer-rest-params - }; -} - -function verifyENOENT(status, parsed) { - if (isWin && status === 1 && !parsed.file) { - return notFoundError(parsed.original, 'spawn'); - } - - return null; -} - -function verifyENOENTSync(status, parsed) { - if (isWin && status === 1 && !parsed.file) { - return notFoundError(parsed.original, 'spawnSync'); - } - - return null; -} - -module.exports = { - hookChildProcess, - verifyENOENT, - verifyENOENTSync, - notFoundError, -}; diff --git a/node_modules/cross-spawn/lib/parse.js b/node_modules/cross-spawn/lib/parse.js deleted file mode 100644 index 0129d74..0000000 --- a/node_modules/cross-spawn/lib/parse.js +++ /dev/null @@ -1,91 +0,0 @@ -'use strict'; - -const path = require('path'); -const resolveCommand = require('./util/resolveCommand'); -const escape = require('./util/escape'); -const readShebang = require('./util/readShebang'); - -const isWin = process.platform === 'win32'; -const isExecutableRegExp = /\.(?:com|exe)$/i; -const isCmdShimRegExp = /node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i; - -function detectShebang(parsed) { - parsed.file = resolveCommand(parsed); - - const shebang = parsed.file && readShebang(parsed.file); - - if (shebang) { - parsed.args.unshift(parsed.file); - parsed.command = shebang; - - return resolveCommand(parsed); - } - - return parsed.file; -} - -function parseNonShell(parsed) { - if (!isWin) { - return parsed; - } - - // Detect & add support for shebangs - const commandFile = detectShebang(parsed); - - // We don't need a shell if the command filename is an executable - const needsShell = !isExecutableRegExp.test(commandFile); - - // If a shell is required, use cmd.exe and take care of escaping everything correctly - // Note that `forceShell` is an hidden option used only in tests - if (parsed.options.forceShell || needsShell) { - // Need to double escape meta chars if the command is a cmd-shim located in `node_modules/.bin/` - // The cmd-shim simply calls execute the package bin file with NodeJS, proxying any argument - // Because the escape of metachars with ^ gets interpreted when the cmd.exe is first called, - // we need to double escape them - const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile); - - // Normalize posix paths into OS compatible paths (e.g.: foo/bar -> foo\bar) - // This is necessary otherwise it will always fail with ENOENT in those cases - parsed.command = path.normalize(parsed.command); - - // Escape command & arguments - parsed.command = escape.command(parsed.command); - parsed.args = parsed.args.map((arg) => escape.argument(arg, needsDoubleEscapeMetaChars)); - - const shellCommand = [parsed.command].concat(parsed.args).join(' '); - - parsed.args = ['/d', '/s', '/c', `"${shellCommand}"`]; - parsed.command = process.env.comspec || 'cmd.exe'; - parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped - } - - return parsed; -} - -function parse(command, args, options) { - // Normalize arguments, similar to nodejs - if (args && !Array.isArray(args)) { - options = args; - args = null; - } - - args = args ? args.slice(0) : []; // Clone array to avoid changing the original - options = Object.assign({}, options); // Clone object to avoid changing the original - - // Build our parsed object - const parsed = { - command, - args, - options, - file: undefined, - original: { - command, - args, - }, - }; - - // Delegate further parsing to shell or non-shell - return options.shell ? parsed : parseNonShell(parsed); -} - -module.exports = parse; diff --git a/node_modules/cross-spawn/lib/util/escape.js b/node_modules/cross-spawn/lib/util/escape.js deleted file mode 100644 index 7bf2905..0000000 --- a/node_modules/cross-spawn/lib/util/escape.js +++ /dev/null @@ -1,47 +0,0 @@ -'use strict'; - -// See http://www.robvanderwoude.com/escapechars.php -const metaCharsRegExp = /([()\][%!^"`<>&|;, *?])/g; - -function escapeCommand(arg) { - // Escape meta chars - arg = arg.replace(metaCharsRegExp, '^$1'); - - return arg; -} - -function escapeArgument(arg, doubleEscapeMetaChars) { - // Convert to string - arg = `${arg}`; - - // Algorithm below is based on https://qntm.org/cmd - // It's slightly altered to disable JS backtracking to avoid hanging on specially crafted input - // Please see https://github.com/moxystudio/node-cross-spawn/pull/160 for more information - - // Sequence of backslashes followed by a double quote: - // double up all the backslashes and escape the double quote - arg = arg.replace(/(?=(\\+?)?)\1"/g, '$1$1\\"'); - - // Sequence of backslashes followed by the end of the string - // (which will become a double quote later): - // double up all the backslashes - arg = arg.replace(/(?=(\\+?)?)\1$/, '$1$1'); - - // All other backslashes occur literally - - // Quote the whole thing: - arg = `"${arg}"`; - - // Escape meta chars - arg = arg.replace(metaCharsRegExp, '^$1'); - - // Double escape meta chars if necessary - if (doubleEscapeMetaChars) { - arg = arg.replace(metaCharsRegExp, '^$1'); - } - - return arg; -} - -module.exports.command = escapeCommand; -module.exports.argument = escapeArgument; diff --git a/node_modules/cross-spawn/lib/util/readShebang.js b/node_modules/cross-spawn/lib/util/readShebang.js deleted file mode 100644 index 5e83733..0000000 --- a/node_modules/cross-spawn/lib/util/readShebang.js +++ /dev/null @@ -1,23 +0,0 @@ -'use strict'; - -const fs = require('fs'); -const shebangCommand = require('shebang-command'); - -function readShebang(command) { - // Read the first 150 bytes from the file - const size = 150; - const buffer = Buffer.alloc(size); - - let fd; - - try { - fd = fs.openSync(command, 'r'); - fs.readSync(fd, buffer, 0, size, 0); - fs.closeSync(fd); - } catch (e) { /* Empty */ } - - // Attempt to extract shebang (null is returned if not a shebang) - return shebangCommand(buffer.toString()); -} - -module.exports = readShebang; diff --git a/node_modules/cross-spawn/lib/util/resolveCommand.js b/node_modules/cross-spawn/lib/util/resolveCommand.js deleted file mode 100644 index 7972455..0000000 --- a/node_modules/cross-spawn/lib/util/resolveCommand.js +++ /dev/null @@ -1,52 +0,0 @@ -'use strict'; - -const path = require('path'); -const which = require('which'); -const getPathKey = require('path-key'); - -function resolveCommandAttempt(parsed, withoutPathExt) { - const env = parsed.options.env || process.env; - const cwd = process.cwd(); - const hasCustomCwd = parsed.options.cwd != null; - // Worker threads do not have process.chdir() - const shouldSwitchCwd = hasCustomCwd && process.chdir !== undefined && !process.chdir.disabled; - - // If a custom `cwd` was specified, we need to change the process cwd - // because `which` will do stat calls but does not support a custom cwd - if (shouldSwitchCwd) { - try { - process.chdir(parsed.options.cwd); - } catch (err) { - /* Empty */ - } - } - - let resolved; - - try { - resolved = which.sync(parsed.command, { - path: env[getPathKey({ env })], - pathExt: withoutPathExt ? path.delimiter : undefined, - }); - } catch (e) { - /* Empty */ - } finally { - if (shouldSwitchCwd) { - process.chdir(cwd); - } - } - - // If we successfully resolved, ensure that an absolute path is returned - // Note that when a custom `cwd` was used, we need to resolve to an absolute path based on it - if (resolved) { - resolved = path.resolve(hasCustomCwd ? parsed.options.cwd : '', resolved); - } - - return resolved; -} - -function resolveCommand(parsed) { - return resolveCommandAttempt(parsed) || resolveCommandAttempt(parsed, true); -} - -module.exports = resolveCommand; diff --git a/node_modules/cross-spawn/package.json b/node_modules/cross-spawn/package.json deleted file mode 100644 index 24b2eb4..0000000 --- a/node_modules/cross-spawn/package.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "name": "cross-spawn", - "version": "7.0.6", - "description": "Cross platform child_process#spawn and child_process#spawnSync", - "keywords": [ - "spawn", - "spawnSync", - "windows", - "cross-platform", - "path-ext", - "shebang", - "cmd", - "execute" - ], - "author": "André Cruz ", - "homepage": "https://github.com/moxystudio/node-cross-spawn", - "repository": { - "type": "git", - "url": "git@github.com:moxystudio/node-cross-spawn.git" - }, - "license": "MIT", - "main": "index.js", - "files": [ - "lib" - ], - "scripts": { - "lint": "eslint .", - "test": "jest --env node --coverage", - "prerelease": "npm t && npm run lint", - "release": "standard-version", - "postrelease": "git push --follow-tags origin HEAD && npm publish" - }, - "husky": { - "hooks": { - "commit-msg": "commitlint -E HUSKY_GIT_PARAMS", - "pre-commit": "lint-staged" - } - }, - "lint-staged": { - "*.js": [ - "eslint --fix", - "git add" - ] - }, - "commitlint": { - "extends": [ - "@commitlint/config-conventional" - ] - }, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "devDependencies": { - "@commitlint/cli": "^8.1.0", - "@commitlint/config-conventional": "^8.1.0", - "babel-core": "^6.26.3", - "babel-jest": "^24.9.0", - "babel-preset-moxy": "^3.1.0", - "eslint": "^5.16.0", - "eslint-config-moxy": "^7.1.0", - "husky": "^3.0.5", - "jest": "^24.9.0", - "lint-staged": "^9.2.5", - "mkdirp": "^0.5.1", - "rimraf": "^3.0.0", - "standard-version": "^9.5.0" - }, - "engines": { - "node": ">= 8" - } -} diff --git a/node_modules/cssesc/LICENSE-MIT.txt b/node_modules/cssesc/LICENSE-MIT.txt deleted file mode 100644 index a41e0a7..0000000 --- a/node_modules/cssesc/LICENSE-MIT.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright Mathias Bynens - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/cssesc/README.md b/node_modules/cssesc/README.md deleted file mode 100644 index 58fb8fe..0000000 --- a/node_modules/cssesc/README.md +++ /dev/null @@ -1,201 +0,0 @@ -# cssesc [![Build status](https://travis-ci.org/mathiasbynens/cssesc.svg?branch=master)](https://travis-ci.org/mathiasbynens/cssesc) [![Code coverage status](https://img.shields.io/codecov/c/github/mathiasbynens/cssesc.svg)](https://codecov.io/gh/mathiasbynens/cssesc) - -A JavaScript library for escaping CSS strings and identifiers while generating the shortest possible ASCII-only output. - -This is a JavaScript library for [escaping text for use in CSS strings or identifiers](https://mathiasbynens.be/notes/css-escapes) while generating the shortest possible valid ASCII-only output. [Here’s an online demo.](https://mothereff.in/css-escapes) - -[A polyfill for the CSSOM `CSS.escape()` method is available in a separate repository.](https://mths.be/cssescape) (In comparison, _cssesc_ is much more powerful.) - -Feel free to fork if you see possible improvements! - -## Installation - -Via [npm](https://www.npmjs.com/): - -```bash -npm install cssesc -``` - -In a browser: - -```html - -``` - -In [Node.js](https://nodejs.org/): - -```js -const cssesc = require('cssesc'); -``` - -In Ruby using [the `ruby-cssesc` wrapper gem](https://github.com/borodean/ruby-cssesc): - -```bash -gem install ruby-cssesc -``` - -```ruby -require 'ruby-cssesc' -CSSEsc.escape('I ♥ Ruby', is_identifier: true) -``` - -In Sass using [`sassy-escape`](https://github.com/borodean/sassy-escape): - -```bash -gem install sassy-escape -``` - -```scss -body { - content: escape('I ♥ Sass', $is-identifier: true); -} -``` - -## API - -### `cssesc(value, options)` - -This function takes a value and returns an escaped version of the value where any characters that are not printable ASCII symbols are escaped using the shortest possible (but valid) [escape sequences for use in CSS strings or identifiers](https://mathiasbynens.be/notes/css-escapes). - -```js -cssesc('Ich ♥ Bücher'); -// → 'Ich \\2665 B\\FC cher' - -cssesc('foo 𝌆 bar'); -// → 'foo \\1D306 bar' -``` - -By default, `cssesc` returns a string that can be used as part of a CSS string. If the target is a CSS identifier rather than a CSS string, use the `isIdentifier: true` setting (see below). - -The optional `options` argument accepts an object with the following options: - -#### `isIdentifier` - -The default value for the `isIdentifier` option is `false`. This means that the input text will be escaped for use in a CSS string literal. If you want to use the result as a CSS identifier instead (in a selector, for example), set this option to `true`. - -```js -cssesc('123a2b'); -// → '123a2b' - -cssesc('123a2b', { - 'isIdentifier': true -}); -// → '\\31 23a2b' -``` - -#### `quotes` - -The default value for the `quotes` option is `'single'`. This means that any occurences of `'` in the input text will be escaped as `\'`, so that the output can be used in a CSS string literal wrapped in single quotes. - -```js -cssesc('Lorem ipsum "dolor" sit \'amet\' etc.'); -// → 'Lorem ipsum "dolor" sit \\\'amet\\\' etc.' -// → "Lorem ipsum \"dolor\" sit \\'amet\\' etc." - -cssesc('Lorem ipsum "dolor" sit \'amet\' etc.', { - 'quotes': 'single' -}); -// → 'Lorem ipsum "dolor" sit \\\'amet\\\' etc.' -// → "Lorem ipsum \"dolor\" sit \\'amet\\' etc." -``` - -If you want to use the output as part of a CSS string literal wrapped in double quotes, set the `quotes` option to `'double'`. - -```js -cssesc('Lorem ipsum "dolor" sit \'amet\' etc.', { - 'quotes': 'double' -}); -// → 'Lorem ipsum \\"dolor\\" sit \'amet\' etc.' -// → "Lorem ipsum \\\"dolor\\\" sit 'amet' etc." -``` - -#### `wrap` - -The `wrap` option takes a boolean value (`true` or `false`), and defaults to `false` (disabled). When enabled, the output will be a valid CSS string literal wrapped in quotes. The type of quotes can be specified through the `quotes` setting. - -```js -cssesc('Lorem ipsum "dolor" sit \'amet\' etc.', { - 'quotes': 'single', - 'wrap': true -}); -// → '\'Lorem ipsum "dolor" sit \\\'amet\\\' etc.\'' -// → "\'Lorem ipsum \"dolor\" sit \\\'amet\\\' etc.\'" - -cssesc('Lorem ipsum "dolor" sit \'amet\' etc.', { - 'quotes': 'double', - 'wrap': true -}); -// → '"Lorem ipsum \\"dolor\\" sit \'amet\' etc."' -// → "\"Lorem ipsum \\\"dolor\\\" sit \'amet\' etc.\"" -``` - -#### `escapeEverything` - -The `escapeEverything` option takes a boolean value (`true` or `false`), and defaults to `false` (disabled). When enabled, all the symbols in the output will be escaped, even printable ASCII symbols. - -```js -cssesc('lolwat"foo\'bar', { - 'escapeEverything': true -}); -// → '\\6C\\6F\\6C\\77\\61\\74\\"\\66\\6F\\6F\\\'\\62\\61\\72' -// → "\\6C\\6F\\6C\\77\\61\\74\\\"\\66\\6F\\6F\\'\\62\\61\\72" -``` - -#### Overriding the default options globally - -The global default settings can be overridden by modifying the `css.options` object. This saves you from passing in an `options` object for every call to `encode` if you want to use the non-default setting. - -```js -// Read the global default setting for `escapeEverything`: -cssesc.options.escapeEverything; -// → `false` by default - -// Override the global default setting for `escapeEverything`: -cssesc.options.escapeEverything = true; - -// Using the global default setting for `escapeEverything`, which is now `true`: -cssesc('foo © bar ≠ baz 𝌆 qux'); -// → '\\66\\6F\\6F\\ \\A9\\ \\62\\61\\72\\ \\2260\\ \\62\\61\\7A\\ \\1D306\\ \\71\\75\\78' -``` - -### `cssesc.version` - -A string representing the semantic version number. - -### Using the `cssesc` binary - -To use the `cssesc` binary in your shell, simply install cssesc globally using npm: - -```bash -npm install -g cssesc -``` - -After that you will be able to escape text for use in CSS strings or identifiers from the command line: - -```bash -$ cssesc 'föo ♥ bår 𝌆 baz' -f\F6o \2665 b\E5r \1D306 baz -``` - -If the output needs to be a CSS identifier rather than part of a string literal, use the `-i`/`--identifier` option: - -```bash -$ cssesc --identifier 'föo ♥ bår 𝌆 baz' -f\F6o\ \2665\ b\E5r\ \1D306\ baz -``` - -See `cssesc --help` for the full list of options. - -## Support - -This library supports the Node.js and browser versions mentioned in [`.babelrc`](https://github.com/mathiasbynens/cssesc/blob/master/.babelrc). For a version that supports a wider variety of legacy browsers and environments out-of-the-box, [see v0.1.0](https://github.com/mathiasbynens/cssesc/releases/tag/v0.1.0). - -## Author - -| [![twitter/mathias](https://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias "Follow @mathias on Twitter") | -|---| -| [Mathias Bynens](https://mathiasbynens.be/) | - -## License - -This library is available under the [MIT](https://mths.be/mit) license. diff --git a/node_modules/cssesc/bin/cssesc b/node_modules/cssesc/bin/cssesc deleted file mode 100644 index 188c034..0000000 --- a/node_modules/cssesc/bin/cssesc +++ /dev/null @@ -1,116 +0,0 @@ -#!/usr/bin/env node -const fs = require('fs'); -const cssesc = require('../cssesc.js'); -const strings = process.argv.splice(2); -const stdin = process.stdin; -const options = {}; -const log = console.log; - -const main = function() { - const option = strings[0]; - - if (/^(?:-h|--help|undefined)$/.test(option)) { - log( - 'cssesc v%s - https://mths.be/cssesc', - cssesc.version - ); - log([ - '\nUsage:\n', - '\tcssesc [string]', - '\tcssesc [-i | --identifier] [string]', - '\tcssesc [-s | --single-quotes] [string]', - '\tcssesc [-d | --double-quotes] [string]', - '\tcssesc [-w | --wrap] [string]', - '\tcssesc [-e | --escape-everything] [string]', - '\tcssesc [-v | --version]', - '\tcssesc [-h | --help]', - '\nExamples:\n', - '\tcssesc \'f\xF6o \u2665 b\xE5r \uD834\uDF06 baz\'', - '\tcssesc --identifier \'f\xF6o \u2665 b\xE5r \uD834\uDF06 baz\'', - '\tcssesc --escape-everything \'f\xF6o \u2665 b\xE5r \uD834\uDF06 baz\'', - '\tcssesc --double-quotes --wrap \'f\xF6o \u2665 b\xE5r \uD834\uDF06 baz\'', - '\techo \'f\xF6o \u2665 b\xE5r \uD834\uDF06 baz\' | cssesc' - ].join('\n')); - return process.exit(1); - } - - if (/^(?:-v|--version)$/.test(option)) { - log('v%s', cssesc.version); - return process.exit(1); - } - - strings.forEach(function(string) { - // Process options - if (/^(?:-i|--identifier)$/.test(string)) { - options.isIdentifier = true; - return; - } - if (/^(?:-s|--single-quotes)$/.test(string)) { - options.quotes = 'single'; - return; - } - if (/^(?:-d|--double-quotes)$/.test(string)) { - options.quotes = 'double'; - return; - } - if (/^(?:-w|--wrap)$/.test(string)) { - options.wrap = true; - return; - } - if (/^(?:-e|--escape-everything)$/.test(string)) { - options.escapeEverything = true; - return; - } - - // Process string(s) - let result; - try { - result = cssesc(string, options); - log(result); - } catch (exception) { - log(exception.message + '\n'); - log('Error: failed to escape.'); - log('If you think this is a bug in cssesc, please report it:'); - log('https://github.com/mathiasbynens/cssesc/issues/new'); - log( - '\nStack trace using cssesc@%s:\n', - cssesc.version - ); - log(exception.stack); - return process.exit(1); - } - }); - // Return with exit status 0 outside of the `forEach` loop, in case - // multiple strings were passed in. - return process.exit(0); - -}; - -if (stdin.isTTY) { - // handle shell arguments - main(); -} else { - let timeout; - // Either the script is called from within a non-TTY context, or `stdin` - // content is being piped in. - if (!process.stdout.isTTY) { - // The script was called from a non-TTY context. This is a rather uncommon - // use case we don’t actively support. However, we don’t want the script - // to wait forever in such cases, so… - timeout = setTimeout(function() { - // …if no piped data arrived after a whole minute, handle shell - // arguments instead. - main(); - }, 60000); - } - let data = ''; - stdin.on('data', function(chunk) { - clearTimeout(timeout); - data += chunk; - }); - stdin.on('end', function() { - strings.push(data.trim()); - main(); - }); - stdin.resume(); -} diff --git a/node_modules/cssesc/cssesc.js b/node_modules/cssesc/cssesc.js deleted file mode 100644 index 1c0928e..0000000 --- a/node_modules/cssesc/cssesc.js +++ /dev/null @@ -1,110 +0,0 @@ -/*! https://mths.be/cssesc v3.0.0 by @mathias */ -'use strict'; - -var object = {}; -var hasOwnProperty = object.hasOwnProperty; -var merge = function merge(options, defaults) { - if (!options) { - return defaults; - } - var result = {}; - for (var key in defaults) { - // `if (defaults.hasOwnProperty(key) { … }` is not needed here, since - // only recognized option names are used. - result[key] = hasOwnProperty.call(options, key) ? options[key] : defaults[key]; - } - return result; -}; - -var regexAnySingleEscape = /[ -,\.\/:-@\[-\^`\{-~]/; -var regexSingleEscape = /[ -,\.\/:-@\[\]\^`\{-~]/; -var regexAlwaysEscape = /['"\\]/; -var regexExcessiveSpaces = /(^|\\+)?(\\[A-F0-9]{1,6})\x20(?![a-fA-F0-9\x20])/g; - -// https://mathiasbynens.be/notes/css-escapes#css -var cssesc = function cssesc(string, options) { - options = merge(options, cssesc.options); - if (options.quotes != 'single' && options.quotes != 'double') { - options.quotes = 'single'; - } - var quote = options.quotes == 'double' ? '"' : '\''; - var isIdentifier = options.isIdentifier; - - var firstChar = string.charAt(0); - var output = ''; - var counter = 0; - var length = string.length; - while (counter < length) { - var character = string.charAt(counter++); - var codePoint = character.charCodeAt(); - var value = void 0; - // If it’s not a printable ASCII character… - if (codePoint < 0x20 || codePoint > 0x7E) { - if (codePoint >= 0xD800 && codePoint <= 0xDBFF && counter < length) { - // It’s a high surrogate, and there is a next character. - var extra = string.charCodeAt(counter++); - if ((extra & 0xFC00) == 0xDC00) { - // next character is low surrogate - codePoint = ((codePoint & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000; - } else { - // It’s an unmatched surrogate; only append this code unit, in case - // the next code unit is the high surrogate of a surrogate pair. - counter--; - } - } - value = '\\' + codePoint.toString(16).toUpperCase() + ' '; - } else { - if (options.escapeEverything) { - if (regexAnySingleEscape.test(character)) { - value = '\\' + character; - } else { - value = '\\' + codePoint.toString(16).toUpperCase() + ' '; - } - } else if (/[\t\n\f\r\x0B]/.test(character)) { - value = '\\' + codePoint.toString(16).toUpperCase() + ' '; - } else if (character == '\\' || !isIdentifier && (character == '"' && quote == character || character == '\'' && quote == character) || isIdentifier && regexSingleEscape.test(character)) { - value = '\\' + character; - } else { - value = character; - } - } - output += value; - } - - if (isIdentifier) { - if (/^-[-\d]/.test(output)) { - output = '\\-' + output.slice(1); - } else if (/\d/.test(firstChar)) { - output = '\\3' + firstChar + ' ' + output.slice(1); - } - } - - // Remove spaces after `\HEX` escapes that are not followed by a hex digit, - // since they’re redundant. Note that this is only possible if the escape - // sequence isn’t preceded by an odd number of backslashes. - output = output.replace(regexExcessiveSpaces, function ($0, $1, $2) { - if ($1 && $1.length % 2) { - // It’s not safe to remove the space, so don’t. - return $0; - } - // Strip the space. - return ($1 || '') + $2; - }); - - if (!isIdentifier && options.wrap) { - return quote + output + quote; - } - return output; -}; - -// Expose default options (so they can be overridden globally). -cssesc.options = { - 'escapeEverything': false, - 'isIdentifier': false, - 'quotes': 'single', - 'wrap': false -}; - -cssesc.version = '3.0.0'; - -module.exports = cssesc; diff --git a/node_modules/cssesc/man/cssesc.1 b/node_modules/cssesc/man/cssesc.1 deleted file mode 100644 index eee4996..0000000 --- a/node_modules/cssesc/man/cssesc.1 +++ /dev/null @@ -1,70 +0,0 @@ -.Dd August 9, 2013 -.Dt cssesc 1 -.Sh NAME -.Nm cssesc -.Nd escape text for use in CSS string literals or identifiers -.Sh SYNOPSIS -.Nm -.Op Fl i | -identifier Ar string -.br -.Op Fl s | -single-quotes Ar string -.br -.Op Fl d | -double-quotes Ar string -.br -.Op Fl w | -wrap Ar string -.br -.Op Fl e | -escape-everything Ar string -.br -.Op Fl v | -version -.br -.Op Fl h | -help -.Sh DESCRIPTION -.Nm -escapes strings for use in CSS string literals or identifiers while generating the shortest possible valid ASCII-only output. -.Sh OPTIONS -.Bl -ohang -offset -.It Sy "-s, --single-quotes" -Escape any occurences of ' in the input string as \\', so that the output can be used in a CSS string literal wrapped in single quotes. -.It Sy "-d, --double-quotes" -Escape any occurences of " in the input string as \\", so that the output can be used in a CSS string literal wrapped in double quotes. -.It Sy "-w, --wrap" -Make sure the output is a valid CSS string literal wrapped in quotes. The type of quotes can be specified using the -.Ar -s | --single-quotes -or -.Ar -d | --double-quotes -settings. -.It Sy "-e, --escape-everything" -Escape all the symbols in the output, even printable ASCII symbols. -.It Sy "-v, --version" -Print cssesc's version. -.It Sy "-h, --help" -Show the help screen. -.El -.Sh EXIT STATUS -The -.Nm cssesc -utility exits with one of the following values: -.Pp -.Bl -tag -width flag -compact -.It Li 0 -.Nm -successfully escaped the given text and printed the result. -.It Li 1 -.Nm -wasn't instructed to escape anything (for example, the -.Ar --help -flag was set); or, an error occurred. -.El -.Sh EXAMPLES -.Bl -ohang -offset -.It Sy "cssesc 'foo bar baz'" -Print an escaped version of the given text. -.It Sy echo\ 'foo bar baz'\ |\ cssesc -Print an escaped version of the text that gets piped in. -.El -.Sh BUGS -cssesc's bug tracker is located at . -.Sh AUTHOR -Mathias Bynens -.Sh WWW - diff --git a/node_modules/cssesc/package.json b/node_modules/cssesc/package.json deleted file mode 100644 index 076c84d..0000000 --- a/node_modules/cssesc/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "cssesc", - "version": "3.0.0", - "description": "A JavaScript library for escaping CSS strings and identifiers while generating the shortest possible ASCII-only output.", - "homepage": "https://mths.be/cssesc", - "engines": { - "node": ">=4" - }, - "main": "cssesc.js", - "bin": "bin/cssesc", - "man": "man/cssesc.1", - "keywords": [ - "css", - "escape", - "identifier", - "string", - "tool" - ], - "license": "MIT", - "author": { - "name": "Mathias Bynens", - "url": "https://mathiasbynens.be/" - }, - "repository": { - "type": "git", - "url": "https://github.com/mathiasbynens/cssesc.git" - }, - "bugs": "https://github.com/mathiasbynens/cssesc/issues", - "files": [ - "LICENSE-MIT.txt", - "cssesc.js", - "bin/", - "man/" - ], - "scripts": { - "build": "grunt template && babel cssesc.js -o cssesc.js", - "test": "mocha tests", - "cover": "istanbul cover --report html node_modules/.bin/_mocha tests -- -u exports -R spec" - }, - "devDependencies": { - "babel-cli": "^6.26.0", - "babel-preset-env": "^1.6.1", - "codecov": "^1.0.1", - "grunt": "^1.0.1", - "grunt-template": "^1.0.0", - "istanbul": "^0.4.4", - "mocha": "^2.5.3", - "regenerate": "^1.2.1", - "requirejs": "^2.1.16" - } -} diff --git a/node_modules/decamelize/index.js b/node_modules/decamelize/index.js deleted file mode 100644 index 8d5bab7..0000000 --- a/node_modules/decamelize/index.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict'; -module.exports = function (str, sep) { - if (typeof str !== 'string') { - throw new TypeError('Expected a string'); - } - - sep = typeof sep === 'undefined' ? '_' : sep; - - return str - .replace(/([a-z\d])([A-Z])/g, '$1' + sep + '$2') - .replace(/([A-Z]+)([A-Z][a-z\d]+)/g, '$1' + sep + '$2') - .toLowerCase(); -}; diff --git a/node_modules/decamelize/license b/node_modules/decamelize/license deleted file mode 100644 index 654d0bf..0000000 --- a/node_modules/decamelize/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/node_modules/decamelize/package.json b/node_modules/decamelize/package.json deleted file mode 100644 index ca35790..0000000 --- a/node_modules/decamelize/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "decamelize", - "version": "1.2.0", - "description": "Convert a camelized string into a lowercased one with a custom separator: unicornRainbow → unicorn_rainbow", - "license": "MIT", - "repository": "sindresorhus/decamelize", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=0.10.0" - }, - "scripts": { - "test": "xo && ava" - }, - "files": [ - "index.js" - ], - "keywords": [ - "decamelize", - "decamelcase", - "camelcase", - "lowercase", - "case", - "dash", - "hyphen", - "string", - "str", - "text", - "convert" - ], - "devDependencies": { - "ava": "*", - "xo": "*" - } -} diff --git a/node_modules/decamelize/readme.md b/node_modules/decamelize/readme.md deleted file mode 100644 index 624c7ee..0000000 --- a/node_modules/decamelize/readme.md +++ /dev/null @@ -1,48 +0,0 @@ -# decamelize [![Build Status](https://travis-ci.org/sindresorhus/decamelize.svg?branch=master)](https://travis-ci.org/sindresorhus/decamelize) - -> Convert a camelized string into a lowercased one with a custom separator
    -> Example: `unicornRainbow` → `unicorn_rainbow` - - -## Install - -``` -$ npm install --save decamelize -``` - - -## Usage - -```js -const decamelize = require('decamelize'); - -decamelize('unicornRainbow'); -//=> 'unicorn_rainbow' - -decamelize('unicornRainbow', '-'); -//=> 'unicorn-rainbow' -``` - - -## API - -### decamelize(input, [separator]) - -#### input - -Type: `string` - -#### separator - -Type: `string`
    -Default: `_` - - -## Related - -See [`camelcase`](https://github.com/sindresorhus/camelcase) for the inverse. - - -## License - -MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/didyoumean/LICENSE b/node_modules/didyoumean/LICENSE deleted file mode 100644 index 32c23db..0000000 --- a/node_modules/didyoumean/LICENSE +++ /dev/null @@ -1,14 +0,0 @@ -## License - -didYouMean.js copyright (c) 2013 Dave Porter. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License -[here](http://www.apache.org/licenses/LICENSE-2.0). - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/node_modules/didyoumean/README.md b/node_modules/didyoumean/README.md deleted file mode 100644 index cd16698..0000000 --- a/node_modules/didyoumean/README.md +++ /dev/null @@ -1,134 +0,0 @@ -didYouMean.js - A simple JavaScript matching engine -=================================================== - -[Available on GitHub](https://github.com/dcporter/didyoumean.js). - -A super-simple, highly optimized JS library for matching human-quality input to a list of potential -matches. You can use it to suggest a misspelled command-line utility option to a user, or to offer -links to nearby valid URLs on your 404 page. (The examples below are taken from a personal project, -my [HTML5 business card](http://dcporter.aws.af.cm/me), which uses didYouMean.js to suggest correct -URLs from misspelled ones, such as [dcporter.aws.af.cm/me/instagarm](http://dcporter.aws.af.cm/me/instagarm).) -Uses the [Levenshtein distance algorithm](https://en.wikipedia.org/wiki/Levenshtein_distance). - -didYouMean.js works in the browser as well as in node.js. To install it for use in node: - -``` -npm install didyoumean -``` - - -Examples --------- - -Matching against a list of strings: -``` -var input = 'insargrm' -var list = ['facebook', 'twitter', 'instagram', 'linkedin']; -console.log(didYouMean(input, list)); -> 'instagram' -// The method matches 'insargrm' to 'instagram'. - -input = 'google plus'; -console.log(didYouMean(input, list)); -> null -// The method was unable to find 'google plus' in the list of options. -``` - -Matching against a list of objects: -``` -var input = 'insargrm'; -var list = [ { id: 'facebook' }, { id: 'twitter' }, { id: 'instagram' }, { id: 'linkedin' } ]; -var key = 'id'; -console.log(didYouMean(input, list, key)); -> 'instagram' -// The method returns the matching value. - -didYouMean.returnWinningObject = true; -console.log(didYouMean(input, list, key)); -> { id: 'instagram' } -// The method returns the matching object. -``` - - -didYouMean(str, list, [key]) ----------------------------- - -- str: The string input to match. -- list: An array of strings or objects to match against. -- key (OPTIONAL): If your list array contains objects, you must specify the key which contains the string - to match against. - -Returns: the closest matching string, or null if no strings exceed the threshold. - - -Options -------- - -Options are set on the didYouMean function object. You may change them at any time. - -### threshold - - By default, the method will only return strings whose edit distance is less than 40% (0.4x) of their length. - For example, if a ten-letter string is five edits away from its nearest match, the method will return null. - - You can control this by setting the "threshold" value on the didYouMean function. For example, to set the - edit distance threshold to 50% of the input string's length: - - ``` - didYouMean.threshold = 0.5; - ``` - - To return the nearest match no matter the threshold, set this value to null. - -### thresholdAbsolute - - This option behaves the same as threshold, but instead takes an integer number of edit steps. For example, - if thresholdAbsolute is set to 20 (the default), then the method will only return strings whose edit distance - is less than 20. Both options apply. - -### caseSensitive - - By default, the method will perform case-insensitive comparisons. If you wish to force case sensitivity, set - the "caseSensitive" value to true: - - ``` - didYouMean.caseSensitive = true; - ``` - -### nullResultValue - - By default, the method will return null if there is no sufficiently close match. You can change this value here. - -### returnWinningObject - - By default, the method will return the winning string value (if any). If your list contains objects rather - than strings, you may set returnWinningObject to true. - - ``` - didYouMean.returnWinningObject = true; - ``` - - This option has no effect on lists of strings. - -### returnFirstMatch - - By default, the method will search all values and return the closest match. If you're simply looking for a "good- - enough" match, you can set your thresholds appropriately and set returnFirstMatch to true to substantially speed - things up. - - -License -------- - -didYouMean copyright (c) 2013-2014 Dave Porter. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License -[here](http://www.apache.org/licenses/LICENSE-2.0). - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/node_modules/didyoumean/didYouMean-1.2.1.js b/node_modules/didyoumean/didYouMean-1.2.1.js deleted file mode 100644 index febb30e..0000000 --- a/node_modules/didyoumean/didYouMean-1.2.1.js +++ /dev/null @@ -1,274 +0,0 @@ -/* - -didYouMean.js - A simple JavaScript matching engine -=================================================== - -[Available on GitHub](https://github.com/dcporter/didyoumean.js). - -A super-simple, highly optimized JS library for matching human-quality input to a list of potential -matches. You can use it to suggest a misspelled command-line utility option to a user, or to offer -links to nearby valid URLs on your 404 page. (The examples below are taken from a personal project, -my [HTML5 business card](http://dcporter.aws.af.cm/me), which uses didYouMean.js to suggest correct -URLs from misspelled ones, such as [dcporter.aws.af.cm/me/instagarm](http://dcporter.aws.af.cm/me/instagarm).) -Uses the [Levenshtein distance algorithm](https://en.wikipedia.org/wiki/Levenshtein_distance). - -didYouMean.js works in the browser as well as in node.js. To install it for use in node: - -``` -npm install didyoumean -``` - - -Examples --------- - -Matching against a list of strings: -``` -var input = 'insargrm' -var list = ['facebook', 'twitter', 'instagram', 'linkedin']; -console.log(didYouMean(input, list)); -> 'instagram' -// The method matches 'insargrm' to 'instagram'. - -input = 'google plus'; -console.log(didYouMean(input, list)); -> null -// The method was unable to find 'google plus' in the list of options. -``` - -Matching against a list of objects: -``` -var input = 'insargrm'; -var list = [ { id: 'facebook' }, { id: 'twitter' }, { id: 'instagram' }, { id: 'linkedin' } ]; -var key = 'id'; -console.log(didYouMean(input, list, key)); -> 'instagram' -// The method returns the matching value. - -didYouMean.returnWinningObject = true; -console.log(didYouMean(input, list, key)); -> { id: 'instagram' } -// The method returns the matching object. -``` - - -didYouMean(str, list, [key]) ----------------------------- - -- str: The string input to match. -- list: An array of strings or objects to match against. -- key (OPTIONAL): If your list array contains objects, you must specify the key which contains the string - to match against. - -Returns: the closest matching string, or null if no strings exceed the threshold. - - -Options -------- - -Options are set on the didYouMean function object. You may change them at any time. - -### threshold - - By default, the method will only return strings whose edit distance is less than 40% (0.4x) of their length. - For example, if a ten-letter string is five edits away from its nearest match, the method will return null. - - You can control this by setting the "threshold" value on the didYouMean function. For example, to set the - edit distance threshold to 50% of the input string's length: - - ``` - didYouMean.threshold = 0.5; - ``` - - To return the nearest match no matter the threshold, set this value to null. - -### thresholdAbsolute - - This option behaves the same as threshold, but instead takes an integer number of edit steps. For example, - if thresholdAbsolute is set to 20 (the default), then the method will only return strings whose edit distance - is less than 20. Both options apply. - -### caseSensitive - - By default, the method will perform case-insensitive comparisons. If you wish to force case sensitivity, set - the "caseSensitive" value to true: - - ``` - didYouMean.caseSensitive = true; - ``` - -### nullResultValue - - By default, the method will return null if there is no sufficiently close match. You can change this value here. - -### returnWinningObject - - By default, the method will return the winning string value (if any). If your list contains objects rather - than strings, you may set returnWinningObject to true. - - ``` - didYouMean.returnWinningObject = true; - ``` - - This option has no effect on lists of strings. - -### returnFirstMatch - - By default, the method will search all values and return the closest match. If you're simply looking for a "good- - enough" match, you can set your thresholds appropriately and set returnFirstMatch to true to substantially speed - things up. - - -License -------- - -didYouMean copyright (c) 2013-2014 Dave Porter. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License -[here](http://www.apache.org/licenses/LICENSE-2.0). - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -*/ -(function() { - "use strict"; - - // The didYouMean method. - function didYouMean(str, list, key) { - if (!str) return null; - - // If we're running a case-insensitive search, smallify str. - if (!didYouMean.caseSensitive) { str = str.toLowerCase(); } - - // Calculate the initial value (the threshold) if present. - var thresholdRelative = didYouMean.threshold === null ? null : didYouMean.threshold * str.length, - thresholdAbsolute = didYouMean.thresholdAbsolute, - winningVal; - if (thresholdRelative !== null && thresholdAbsolute !== null) winningVal = Math.min(thresholdRelative, thresholdAbsolute); - else if (thresholdRelative !== null) winningVal = thresholdRelative; - else if (thresholdAbsolute !== null) winningVal = thresholdAbsolute; - else winningVal = null; - - // Get the edit distance to each option. If the closest one is less than 40% (by default) of str's length, - // then return it. - var winner, candidate, testCandidate, val, - i, len = list.length; - for (i = 0; i < len; i++) { - // Get item. - candidate = list[i]; - // If there's a key, get the candidate value out of the object. - if (key) { candidate = candidate[key]; } - // Gatekeep. - if (!candidate) { continue; } - // If we're running a case-insensitive search, smallify the candidate. - if (!didYouMean.caseSensitive) { testCandidate = candidate.toLowerCase(); } - else { testCandidate = candidate; } - // Get and compare edit distance. - val = getEditDistance(str, testCandidate, winningVal); - // If this value is smaller than our current winning value, OR if we have no winning val yet (i.e. the - // threshold option is set to null, meaning the caller wants a match back no matter how bad it is), then - // this is our new winner. - if (winningVal === null || val < winningVal) { - winningVal = val; - // Set the winner to either the value or its object, depending on the returnWinningObject option. - if (key && didYouMean.returnWinningObject) winner = list[i]; - else winner = candidate; - // If we're returning the first match, return it now. - if (didYouMean.returnFirstMatch) return winner; - } - } - - // If we have a winner, return it. - return winner || didYouMean.nullResultValue; - } - - // Set default options. - didYouMean.threshold = 0.4; - didYouMean.thresholdAbsolute = 20; - didYouMean.caseSensitive = false; - didYouMean.nullResultValue = null; - didYouMean.returnWinningObject = null; - didYouMean.returnFirstMatch = false; - - // Expose. - // In node... - if (typeof module !== 'undefined' && module.exports) { - module.exports = didYouMean; - } - // Otherwise... - else { - window.didYouMean = didYouMean; - } - - var MAX_INT = Math.pow(2,32) - 1; // We could probably go higher than this, but for practical reasons let's not. - function getEditDistance(a, b, max) { - // Handle null or undefined max. - max = max || max === 0 ? max : MAX_INT; - - var lena = a.length; - var lenb = b.length; - - // Fast path - no A or B. - if (lena === 0) return Math.min(max + 1, lenb); - if (lenb === 0) return Math.min(max + 1, lena); - - // Fast path - length diff larger than max. - if (Math.abs(lena - lenb) > max) return max + 1; - - // Slow path. - var matrix = [], - i, j, colMin, minJ, maxJ; - - // Set up the first row ([0, 1, 2, 3, etc]). - for (i = 0; i <= lenb; i++) { matrix[i] = [i]; } - - // Set up the first column (same). - for (j = 0; j <= lena; j++) { matrix[0][j] = j; } - - // Loop over the rest of the columns. - for (i = 1; i <= lenb; i++) { - colMin = MAX_INT; - minJ = 1; - if (i > max) minJ = i - max; - maxJ = lenb + 1; - if (maxJ > max + i) maxJ = max + i; - // Loop over the rest of the rows. - for (j = 1; j <= lena; j++) { - // If j is out of bounds, just put a large value in the slot. - if (j < minJ || j > maxJ) { - matrix[i][j] = max + 1; - } - - // Otherwise do the normal Levenshtein thing. - else { - // If the characters are the same, there's no change in edit distance. - if (b.charAt(i - 1) === a.charAt(j - 1)) { - matrix[i][j] = matrix[i - 1][j - 1]; - } - // Otherwise, see if we're substituting, inserting or deleting. - else { - matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // Substitute - Math.min(matrix[i][j - 1] + 1, // Insert - matrix[i - 1][j] + 1)); // Delete - } - } - - // Either way, update colMin. - if (matrix[i][j] < colMin) colMin = matrix[i][j]; - } - - // If this column's minimum is greater than the allowed maximum, there's no point - // in going on with life. - if (colMin > max) return max + 1; - } - // If we made it this far without running into the max, then return the final matrix value. - return matrix[lenb][lena]; - } - -})(); diff --git a/node_modules/didyoumean/didYouMean-1.2.1.min.js b/node_modules/didyoumean/didYouMean-1.2.1.min.js deleted file mode 100644 index c41abd8..0000000 --- a/node_modules/didyoumean/didYouMean-1.2.1.min.js +++ /dev/null @@ -1,17 +0,0 @@ -/* - didYouMean.js copyright (c) 2013-2014 Dave Porter. - - [Available on GitHub](https://github.com/dcporter/didyoumean.js). - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License - [here](http://www.apache.org/licenses/LICENSE-2.0). - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ -(function(){"use strict";function e(t,r,i){if(!t)return null;if(!e.caseSensitive){t=t.toLowerCase()}var s=e.threshold===null?null:e.threshold*t.length,o=e.thresholdAbsolute,u;if(s!==null&&o!==null)u=Math.min(s,o);else if(s!==null)u=s;else if(o!==null)u=o;else u=null;var a,f,l,c,h,p=r.length;for(h=0;hr)return r+1;var o=[],u,a,f,l,c;for(u=0;u<=s;u++){o[u]=[u]}for(a=0;a<=i;a++){o[0][a]=a}for(u=1;u<=s;u++){f=t;l=1;if(u>r)l=u-r;c=s+1;if(c>r+u)c=r+u;for(a=1;a<=i;a++){if(ac){o[u][a]=r+1}else{if(n.charAt(u-1)===e.charAt(a-1)){o[u][a]=o[u-1][a-1]}else{o[u][a]=Math.min(o[u-1][a-1]+1,Math.min(o[u][a-1]+1,o[u-1][a]+1))}}if(o[u][a]r)return r+1}return o[s][i]}e.threshold=.4;e.thresholdAbsolute=20;e.caseSensitive=false;e.nullResultValue=null;e.returnWinningObject=null;e.returnFirstMatch=false;if(typeof module!=="undefined"&&module.exports){module.exports=e}else{window.didYouMean=e}var t=Math.pow(2,32)-1})(); \ No newline at end of file diff --git a/node_modules/didyoumean/package.json b/node_modules/didyoumean/package.json deleted file mode 100644 index 1301d03..0000000 --- a/node_modules/didyoumean/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "didyoumean", - "version": "1.2.2", - "description": "Match human-quality input to potential matches by edit distance.", - "homepage": "https://github.com/dcporter/didyoumean.js", - "author": { - "name": "Dave Porter", - "email": "dcporter@gmail.com", - "url": "http://dcporter.net/" - }, - "keywords": [ - "didyoumean", - "mean", - "edit", - "distance", - "levenshtein" - ], - "main": "./didYouMean-1.2.1.js", - "repository": { - "type": "git", - "url": "https://github.com/dcporter/didyoumean.js.git" - }, - "bugs": { - "url": "https://github.com/dcporter/didyoumean.js/issues" - }, - "license": "Apache-2.0" -} diff --git a/node_modules/dijkstrajs/.travis.yml b/node_modules/dijkstrajs/.travis.yml deleted file mode 100644 index 2d63faf..0000000 --- a/node_modules/dijkstrajs/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - "stable" -sudo: false diff --git a/node_modules/dijkstrajs/CONTRIBUTING.md b/node_modules/dijkstrajs/CONTRIBUTING.md deleted file mode 100644 index 5f25961..0000000 --- a/node_modules/dijkstrajs/CONTRIBUTING.md +++ /dev/null @@ -1,8 +0,0 @@ -Contributing -============ - -1. Fork it -2. Create your feature branch (`git checkout -b my-new-feature`) -3. Commit your changes (`git commit -am 'Add some feature'`) -4. Push to the branch (`git push origin my-new-feature`) -5. Create new Pull Request diff --git a/node_modules/dijkstrajs/LICENSE.md b/node_modules/dijkstrajs/LICENSE.md deleted file mode 100644 index b662d80..0000000 --- a/node_modules/dijkstrajs/LICENSE.md +++ /dev/null @@ -1,19 +0,0 @@ -``` -Dijkstra path-finding functions. Adapted from the Dijkstar Python project. - -Copyright (C) 2008 - Wyatt Baldwin - All rights reserved - -Licensed under the MIT license. - - http://www.opensource.org/licenses/mit-license.php - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -``` diff --git a/node_modules/dijkstrajs/README.md b/node_modules/dijkstrajs/README.md deleted file mode 100644 index 77deac7..0000000 --- a/node_modules/dijkstrajs/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# dijkstrajs.js - -dijkstrajs is a simple JavaScript implementation of Dijkstra's single-source shortest-paths algorithm. - -The code was originally written by Wyatt Baldwin and turned into a node module by Thomas Cort. - -## Requirements - -* [nodejs](http://nodejs.org/) - -## Installation - - npm install dijkstrajs - -## Examples - -See `test/dijkstra.test.js` in the sources for some example code. - diff --git a/node_modules/dijkstrajs/dijkstra.js b/node_modules/dijkstrajs/dijkstra.js deleted file mode 100644 index 4f83f1f..0000000 --- a/node_modules/dijkstrajs/dijkstra.js +++ /dev/null @@ -1,165 +0,0 @@ -'use strict'; - -/****************************************************************************** - * Created 2008-08-19. - * - * Dijkstra path-finding functions. Adapted from the Dijkstar Python project. - * - * Copyright (C) 2008 - * Wyatt Baldwin - * All rights reserved - * - * Licensed under the MIT license. - * - * http://www.opensource.org/licenses/mit-license.php - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - *****************************************************************************/ -var dijkstra = { - single_source_shortest_paths: function(graph, s, d) { - // Predecessor map for each node that has been encountered. - // node ID => predecessor node ID - var predecessors = {}; - - // Costs of shortest paths from s to all nodes encountered. - // node ID => cost - var costs = {}; - costs[s] = 0; - - // Costs of shortest paths from s to all nodes encountered; differs from - // `costs` in that it provides easy access to the node that currently has - // the known shortest path from s. - // XXX: Do we actually need both `costs` and `open`? - var open = dijkstra.PriorityQueue.make(); - open.push(s, 0); - - var closest, - u, v, - cost_of_s_to_u, - adjacent_nodes, - cost_of_e, - cost_of_s_to_u_plus_cost_of_e, - cost_of_s_to_v, - first_visit; - while (!open.empty()) { - // In the nodes remaining in graph that have a known cost from s, - // find the node, u, that currently has the shortest path from s. - closest = open.pop(); - u = closest.value; - cost_of_s_to_u = closest.cost; - - // Get nodes adjacent to u... - adjacent_nodes = graph[u] || {}; - - // ...and explore the edges that connect u to those nodes, updating - // the cost of the shortest paths to any or all of those nodes as - // necessary. v is the node across the current edge from u. - for (v in adjacent_nodes) { - if (adjacent_nodes.hasOwnProperty(v)) { - // Get the cost of the edge running from u to v. - cost_of_e = adjacent_nodes[v]; - - // Cost of s to u plus the cost of u to v across e--this is *a* - // cost from s to v that may or may not be less than the current - // known cost to v. - cost_of_s_to_u_plus_cost_of_e = cost_of_s_to_u + cost_of_e; - - // If we haven't visited v yet OR if the current known cost from s to - // v is greater than the new cost we just found (cost of s to u plus - // cost of u to v across e), update v's cost in the cost list and - // update v's predecessor in the predecessor list (it's now u). - cost_of_s_to_v = costs[v]; - first_visit = (typeof costs[v] === 'undefined'); - if (first_visit || cost_of_s_to_v > cost_of_s_to_u_plus_cost_of_e) { - costs[v] = cost_of_s_to_u_plus_cost_of_e; - open.push(v, cost_of_s_to_u_plus_cost_of_e); - predecessors[v] = u; - } - } - } - } - - if (typeof d !== 'undefined' && typeof costs[d] === 'undefined') { - var msg = ['Could not find a path from ', s, ' to ', d, '.'].join(''); - throw new Error(msg); - } - - return predecessors; - }, - - extract_shortest_path_from_predecessor_list: function(predecessors, d) { - var nodes = []; - var u = d; - var predecessor; - while (u) { - nodes.push(u); - predecessor = predecessors[u]; - u = predecessors[u]; - } - nodes.reverse(); - return nodes; - }, - - find_path: function(graph, s, d) { - var predecessors = dijkstra.single_source_shortest_paths(graph, s, d); - return dijkstra.extract_shortest_path_from_predecessor_list( - predecessors, d); - }, - - /** - * A very naive priority queue implementation. - */ - PriorityQueue: { - make: function (opts) { - var T = dijkstra.PriorityQueue, - t = {}, - key; - opts = opts || {}; - for (key in T) { - if (T.hasOwnProperty(key)) { - t[key] = T[key]; - } - } - t.queue = []; - t.sorter = opts.sorter || T.default_sorter; - return t; - }, - - default_sorter: function (a, b) { - return a.cost - b.cost; - }, - - /** - * Add a new item to the queue and ensure the highest priority element - * is at the front of the queue. - */ - push: function (value, cost) { - var item = {value: value, cost: cost}; - this.queue.push(item); - this.queue.sort(this.sorter); - }, - - /** - * Return the highest priority element in the queue. - */ - pop: function () { - return this.queue.shift(); - }, - - empty: function () { - return this.queue.length === 0; - } - } -}; - - -// node.js module exports -if (typeof module !== 'undefined') { - module.exports = dijkstra; -} diff --git a/node_modules/dijkstrajs/package.json b/node_modules/dijkstrajs/package.json deleted file mode 100644 index 67cd76d..0000000 --- a/node_modules/dijkstrajs/package.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "dijkstrajs", - "version": "1.0.3", - "description": "A simple JavaScript implementation of Dijkstra's single-source shortest-paths algorithm.", - "main": "dijkstra.js", - "scripts": { - "pretest": "jshint dijkstra.js", - "test": "mocha -R spec" - }, - "repository": { - "type": "git", - "url": "git://github.com/tcort/dijkstrajs" - }, - "keywords": [ - "dijkstra", - "shortest", - "path", - "search", - "graph" - ], - "license": "MIT", - "bugs": { - "url": "https://github.com/tcort/dijkstrajs/issues" - }, - "homepage": "https://github.com/tcort/dijkstrajs", - "devDependencies": { - "expect.js": "^0.3.1", - "jshint": "^2.13.6", - "mocha": "^10.2.0" - }, - "jshintConfig": { - "bitwise": true, - "curly": true, - "eqeqeq": true, - "forin": true, - "freeze": true, - "globalstrict": true, - "immed": true, - "indent": 4, - "moz": true, - "newcap": true, - "noarg": true, - "node": true, - "noempty": true, - "nonew": true, - "trailing": true, - "undef": true, - "smarttabs": true, - "strict": true, - "validthis": true, - "globals": { - "describe": false, - "it": false, - "before": false, - "beforeEach": false, - "after": false, - "afterEach": false - } - } -} diff --git a/node_modules/dijkstrajs/test/dijkstra.test.js b/node_modules/dijkstrajs/test/dijkstra.test.js deleted file mode 100644 index 865c5a0..0000000 --- a/node_modules/dijkstrajs/test/dijkstra.test.js +++ /dev/null @@ -1,96 +0,0 @@ -'use strict'; - -var expect = require('expect.js'); -var dijkstra = require('../dijkstra.js'); -var find_path = dijkstra.find_path; - -describe('dijkstra.js', function () { - - describe('.find_path()', function () { - - it('should find the path between two points, all edges have weight 1', function () { - // A B C - // D E F - // G H I - var graph = { - a: {b: 10, d: 1}, - b: {a: 1, c: 1, e: 1}, - c: {b: 1, f: 1}, - d: {a: 1, e: 1, g: 1}, - e: {b: 1, d: 1, f: 1, h: 1}, - f: {c: 1, e: 1, i: 1}, - g: {d: 1, h: 1}, - h: {e: 1, g: 1, i: 1}, - i: {f: 1, h: 1} - }; - var path = find_path(graph, 'a', 'i'); - expect(path).to.eql(['a', 'd', 'e', 'f', 'i']); - }); - - it('should find the path between two points, weighted edges', function () { - var graph = { - a: {b: 10, c: 100, d: 1}, - b: {c: 10}, - d: {b: 1, e: 1}, - e: {f: 1}, - f: {c: 1}, - g: {b: 1} - }; - - var path = find_path(graph, 'a', 'c'); - expect(path).to.eql(['a', 'd', 'e', 'f', 'c']); - path = find_path(graph, 'd', 'b'); - expect(path).to.eql(['d', 'b']); - }); - - it('should throw on unreachable destination', function () { - var graph = { - a: {b: 10, c: 100, d: 1}, - b: {c: 10}, - d: {b: 1, e: 1}, - e: {f: 1}, - f: {c: 1}, - g: {b: 1} - }; - - expect(function () { find_path(graph, 'c', 'a'); }).to.throwException(); - expect(function () { find_path(graph, 'a', 'g'); }).to.throwException(); - }); - - it('should throw on non-existent destination', function () { - var graph = { - a: {b: 10, c: 100, d: 1}, - b: {c: 10}, - d: {b: 1, e: 1}, - e: {f: 1}, - f: {c: 1}, - g: {b: 1} - }; - - expect(function () { find_path(graph, 'a', 'z'); }).to.throwException(); - }); - }); - - describe('.single_source_shortest_paths()', function () { - it('should find all paths from a node', function () { - var graph = { - a: {b: 10, c: 100, d: 1}, - b: {c: 10}, - d: {b: 1, e: 1}, - e: {f: 1}, - f: {c: 1}, - g: {b: 1} - }; - - // All paths from 'a' - var paths = dijkstra.single_source_shortest_paths(graph, 'a'); - expect(paths).to.eql({ - d: 'a', - b: 'd', - e: 'd', - f: 'e', - c: 'f' - }); - }); - }); -}); diff --git a/node_modules/dlv/README.md b/node_modules/dlv/README.md deleted file mode 100644 index 6a8429d..0000000 --- a/node_modules/dlv/README.md +++ /dev/null @@ -1,76 +0,0 @@ -# `dlv(obj, keypath)` [![NPM](https://img.shields.io/npm/v/dlv.svg)](https://npmjs.com/package/dlv) [![Build](https://travis-ci.org/developit/dlv.svg?branch=master)](https://travis-ci.org/developit/dlv) - -> Safely get a dot-notated path within a nested object, with ability to return a default if the full key path does not exist or the value is undefined - - -### Why? - -Smallest possible implementation: only **130 bytes.** - -You could write this yourself, but then you'd have to write [tests]. - -Supports ES Modules, CommonJS and globals. - - -### Installation - -`npm install --save dlv` - - -### Usage - -`delve(object, keypath, [default])` - -```js -import delve from 'dlv'; - -let obj = { - a: { - b: { - c: 1, - d: undefined, - e: null - } - } -}; - -//use string dot notation for keys -delve(obj, 'a.b.c') === 1; - -//or use an array key -delve(obj, ['a', 'b', 'c']) === 1; - -delve(obj, 'a.b') === obj.a.b; - -//returns undefined if the full key path does not exist and no default is specified -delve(obj, 'a.b.f') === undefined; - -//optional third parameter for default if the full key in path is missing -delve(obj, 'a.b.f', 'foo') === 'foo'; - -//or if the key exists but the value is undefined -delve(obj, 'a.b.d', 'foo') === 'foo'; - -//Non-truthy defined values are still returned if they exist at the full keypath -delve(obj, 'a.b.e', 'foo') === null; - -//undefined obj or key returns undefined, unless a default is supplied -delve(undefined, 'a.b.c') === undefined; -delve(undefined, 'a.b.c', 'foo') === 'foo'; -delve(obj, undefined, 'foo') === 'foo'; -``` - - -### Setter Counterparts - -- [dset](https://github.com/lukeed/dset) by [@lukeed](https://github.com/lukeed) is the spiritual "set" counterpart of `dlv` and very fast. -- [bury](https://github.com/kalmbach/bury) by [@kalmbach](https://github.com/kalmbach) does the opposite of `dlv` and is implemented in a very similar manner. - - -### License - -[MIT](https://oss.ninja/mit/developit/) - - -[preact]: https://github.com/developit/preact -[tests]: https://github.com/developit/dlv/blob/master/test.js diff --git a/node_modules/dlv/dist/dlv.es.js b/node_modules/dlv/dist/dlv.es.js deleted file mode 100644 index 06b981b..0000000 --- a/node_modules/dlv/dist/dlv.es.js +++ /dev/null @@ -1,2 +0,0 @@ -export default function(t,e,l,n,r){for(e=e.split?e.split("."):e,n=0;n (http://jasonformat.com)", - "repository": "developit/dlv", - "license": "MIT", - "devDependencies": { - "microbundle": "^0.11.0" - } -} diff --git a/node_modules/eastasianwidth/README.md b/node_modules/eastasianwidth/README.md deleted file mode 100644 index a8b71ee..0000000 --- a/node_modules/eastasianwidth/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# East Asian Width - -Get [East Asian Width](http://www.unicode.org/reports/tr11/) from a character. - -'F'(Fullwidth), 'H'(Halfwidth), 'W'(Wide), 'Na'(Narrow), 'A'(Ambiguous) or 'N'(Natural). - -Original Code is [東アジアの文字幅 (East Asian Width) の判定 - 中途](http://d.hatena.ne.jp/takenspc/20111126#1322252878). - -## Install - - $ npm install eastasianwidth - -## Usage - - var eaw = require('eastasianwidth'); - console.log(eaw.eastAsianWidth('₩')) // 'F' - console.log(eaw.eastAsianWidth('。')) // 'H' - console.log(eaw.eastAsianWidth('뀀')) // 'W' - console.log(eaw.eastAsianWidth('a')) // 'Na' - console.log(eaw.eastAsianWidth('①')) // 'A' - console.log(eaw.eastAsianWidth('ف')) // 'N' - - console.log(eaw.characterLength('₩')) // 2 - console.log(eaw.characterLength('。')) // 1 - console.log(eaw.characterLength('뀀')) // 2 - console.log(eaw.characterLength('a')) // 1 - console.log(eaw.characterLength('①')) // 2 - console.log(eaw.characterLength('ف')) // 1 - - console.log(eaw.length('あいうえお')) // 10 - console.log(eaw.length('abcdefg')) // 7 - console.log(eaw.length('¢₩。ᅵㄅ뀀¢⟭a⊙①بف')) // 19 diff --git a/node_modules/eastasianwidth/eastasianwidth.js b/node_modules/eastasianwidth/eastasianwidth.js deleted file mode 100644 index 7d0aa0f..0000000 --- a/node_modules/eastasianwidth/eastasianwidth.js +++ /dev/null @@ -1,311 +0,0 @@ -var eaw = {}; - -if ('undefined' == typeof module) { - window.eastasianwidth = eaw; -} else { - module.exports = eaw; -} - -eaw.eastAsianWidth = function(character) { - var x = character.charCodeAt(0); - var y = (character.length == 2) ? character.charCodeAt(1) : 0; - var codePoint = x; - if ((0xD800 <= x && x <= 0xDBFF) && (0xDC00 <= y && y <= 0xDFFF)) { - x &= 0x3FF; - y &= 0x3FF; - codePoint = (x << 10) | y; - codePoint += 0x10000; - } - - if ((0x3000 == codePoint) || - (0xFF01 <= codePoint && codePoint <= 0xFF60) || - (0xFFE0 <= codePoint && codePoint <= 0xFFE6)) { - return 'F'; - } - if ((0x20A9 == codePoint) || - (0xFF61 <= codePoint && codePoint <= 0xFFBE) || - (0xFFC2 <= codePoint && codePoint <= 0xFFC7) || - (0xFFCA <= codePoint && codePoint <= 0xFFCF) || - (0xFFD2 <= codePoint && codePoint <= 0xFFD7) || - (0xFFDA <= codePoint && codePoint <= 0xFFDC) || - (0xFFE8 <= codePoint && codePoint <= 0xFFEE)) { - return 'H'; - } - if ((0x1100 <= codePoint && codePoint <= 0x115F) || - (0x11A3 <= codePoint && codePoint <= 0x11A7) || - (0x11FA <= codePoint && codePoint <= 0x11FF) || - (0x2329 <= codePoint && codePoint <= 0x232A) || - (0x2E80 <= codePoint && codePoint <= 0x2E99) || - (0x2E9B <= codePoint && codePoint <= 0x2EF3) || - (0x2F00 <= codePoint && codePoint <= 0x2FD5) || - (0x2FF0 <= codePoint && codePoint <= 0x2FFB) || - (0x3001 <= codePoint && codePoint <= 0x303E) || - (0x3041 <= codePoint && codePoint <= 0x3096) || - (0x3099 <= codePoint && codePoint <= 0x30FF) || - (0x3105 <= codePoint && codePoint <= 0x312D) || - (0x3131 <= codePoint && codePoint <= 0x318E) || - (0x3190 <= codePoint && codePoint <= 0x31BA) || - (0x31C0 <= codePoint && codePoint <= 0x31E3) || - (0x31F0 <= codePoint && codePoint <= 0x321E) || - (0x3220 <= codePoint && codePoint <= 0x3247) || - (0x3250 <= codePoint && codePoint <= 0x32FE) || - (0x3300 <= codePoint && codePoint <= 0x4DBF) || - (0x4E00 <= codePoint && codePoint <= 0xA48C) || - (0xA490 <= codePoint && codePoint <= 0xA4C6) || - (0xA960 <= codePoint && codePoint <= 0xA97C) || - (0xAC00 <= codePoint && codePoint <= 0xD7A3) || - (0xD7B0 <= codePoint && codePoint <= 0xD7C6) || - (0xD7CB <= codePoint && codePoint <= 0xD7FB) || - (0xF900 <= codePoint && codePoint <= 0xFAFF) || - (0xFE10 <= codePoint && codePoint <= 0xFE19) || - (0xFE30 <= codePoint && codePoint <= 0xFE52) || - (0xFE54 <= codePoint && codePoint <= 0xFE66) || - (0xFE68 <= codePoint && codePoint <= 0xFE6B) || - (0x1B000 <= codePoint && codePoint <= 0x1B001) || - (0x1F200 <= codePoint && codePoint <= 0x1F202) || - (0x1F210 <= codePoint && codePoint <= 0x1F23A) || - (0x1F240 <= codePoint && codePoint <= 0x1F248) || - (0x1F250 <= codePoint && codePoint <= 0x1F251) || - (0x20000 <= codePoint && codePoint <= 0x2F73F) || - (0x2B740 <= codePoint && codePoint <= 0x2FFFD) || - (0x30000 <= codePoint && codePoint <= 0x3FFFD)) { - return 'W'; - } - if ((0x0020 <= codePoint && codePoint <= 0x007E) || - (0x00A2 <= codePoint && codePoint <= 0x00A3) || - (0x00A5 <= codePoint && codePoint <= 0x00A6) || - (0x00AC == codePoint) || - (0x00AF == codePoint) || - (0x27E6 <= codePoint && codePoint <= 0x27ED) || - (0x2985 <= codePoint && codePoint <= 0x2986)) { - return 'Na'; - } - if ((0x00A1 == codePoint) || - (0x00A4 == codePoint) || - (0x00A7 <= codePoint && codePoint <= 0x00A8) || - (0x00AA == codePoint) || - (0x00AD <= codePoint && codePoint <= 0x00AE) || - (0x00B0 <= codePoint && codePoint <= 0x00B4) || - (0x00B6 <= codePoint && codePoint <= 0x00BA) || - (0x00BC <= codePoint && codePoint <= 0x00BF) || - (0x00C6 == codePoint) || - (0x00D0 == codePoint) || - (0x00D7 <= codePoint && codePoint <= 0x00D8) || - (0x00DE <= codePoint && codePoint <= 0x00E1) || - (0x00E6 == codePoint) || - (0x00E8 <= codePoint && codePoint <= 0x00EA) || - (0x00EC <= codePoint && codePoint <= 0x00ED) || - (0x00F0 == codePoint) || - (0x00F2 <= codePoint && codePoint <= 0x00F3) || - (0x00F7 <= codePoint && codePoint <= 0x00FA) || - (0x00FC == codePoint) || - (0x00FE == codePoint) || - (0x0101 == codePoint) || - (0x0111 == codePoint) || - (0x0113 == codePoint) || - (0x011B == codePoint) || - (0x0126 <= codePoint && codePoint <= 0x0127) || - (0x012B == codePoint) || - (0x0131 <= codePoint && codePoint <= 0x0133) || - (0x0138 == codePoint) || - (0x013F <= codePoint && codePoint <= 0x0142) || - (0x0144 == codePoint) || - (0x0148 <= codePoint && codePoint <= 0x014B) || - (0x014D == codePoint) || - (0x0152 <= codePoint && codePoint <= 0x0153) || - (0x0166 <= codePoint && codePoint <= 0x0167) || - (0x016B == codePoint) || - (0x01CE == codePoint) || - (0x01D0 == codePoint) || - (0x01D2 == codePoint) || - (0x01D4 == codePoint) || - (0x01D6 == codePoint) || - (0x01D8 == codePoint) || - (0x01DA == codePoint) || - (0x01DC == codePoint) || - (0x0251 == codePoint) || - (0x0261 == codePoint) || - (0x02C4 == codePoint) || - (0x02C7 == codePoint) || - (0x02C9 <= codePoint && codePoint <= 0x02CB) || - (0x02CD == codePoint) || - (0x02D0 == codePoint) || - (0x02D8 <= codePoint && codePoint <= 0x02DB) || - (0x02DD == codePoint) || - (0x02DF == codePoint) || - (0x0300 <= codePoint && codePoint <= 0x036F) || - (0x0391 <= codePoint && codePoint <= 0x03A1) || - (0x03A3 <= codePoint && codePoint <= 0x03A9) || - (0x03B1 <= codePoint && codePoint <= 0x03C1) || - (0x03C3 <= codePoint && codePoint <= 0x03C9) || - (0x0401 == codePoint) || - (0x0410 <= codePoint && codePoint <= 0x044F) || - (0x0451 == codePoint) || - (0x2010 == codePoint) || - (0x2013 <= codePoint && codePoint <= 0x2016) || - (0x2018 <= codePoint && codePoint <= 0x2019) || - (0x201C <= codePoint && codePoint <= 0x201D) || - (0x2020 <= codePoint && codePoint <= 0x2022) || - (0x2024 <= codePoint && codePoint <= 0x2027) || - (0x2030 == codePoint) || - (0x2032 <= codePoint && codePoint <= 0x2033) || - (0x2035 == codePoint) || - (0x203B == codePoint) || - (0x203E == codePoint) || - (0x2074 == codePoint) || - (0x207F == codePoint) || - (0x2081 <= codePoint && codePoint <= 0x2084) || - (0x20AC == codePoint) || - (0x2103 == codePoint) || - (0x2105 == codePoint) || - (0x2109 == codePoint) || - (0x2113 == codePoint) || - (0x2116 == codePoint) || - (0x2121 <= codePoint && codePoint <= 0x2122) || - (0x2126 == codePoint) || - (0x212B == codePoint) || - (0x2153 <= codePoint && codePoint <= 0x2154) || - (0x215B <= codePoint && codePoint <= 0x215E) || - (0x2160 <= codePoint && codePoint <= 0x216B) || - (0x2170 <= codePoint && codePoint <= 0x2179) || - (0x2189 == codePoint) || - (0x2190 <= codePoint && codePoint <= 0x2199) || - (0x21B8 <= codePoint && codePoint <= 0x21B9) || - (0x21D2 == codePoint) || - (0x21D4 == codePoint) || - (0x21E7 == codePoint) || - (0x2200 == codePoint) || - (0x2202 <= codePoint && codePoint <= 0x2203) || - (0x2207 <= codePoint && codePoint <= 0x2208) || - (0x220B == codePoint) || - (0x220F == codePoint) || - (0x2211 == codePoint) || - (0x2215 == codePoint) || - (0x221A == codePoint) || - (0x221D <= codePoint && codePoint <= 0x2220) || - (0x2223 == codePoint) || - (0x2225 == codePoint) || - (0x2227 <= codePoint && codePoint <= 0x222C) || - (0x222E == codePoint) || - (0x2234 <= codePoint && codePoint <= 0x2237) || - (0x223C <= codePoint && codePoint <= 0x223D) || - (0x2248 == codePoint) || - (0x224C == codePoint) || - (0x2252 == codePoint) || - (0x2260 <= codePoint && codePoint <= 0x2261) || - (0x2264 <= codePoint && codePoint <= 0x2267) || - (0x226A <= codePoint && codePoint <= 0x226B) || - (0x226E <= codePoint && codePoint <= 0x226F) || - (0x2282 <= codePoint && codePoint <= 0x2283) || - (0x2286 <= codePoint && codePoint <= 0x2287) || - (0x2295 == codePoint) || - (0x2299 == codePoint) || - (0x22A5 == codePoint) || - (0x22BF == codePoint) || - (0x2312 == codePoint) || - (0x2460 <= codePoint && codePoint <= 0x24E9) || - (0x24EB <= codePoint && codePoint <= 0x254B) || - (0x2550 <= codePoint && codePoint <= 0x2573) || - (0x2580 <= codePoint && codePoint <= 0x258F) || - (0x2592 <= codePoint && codePoint <= 0x2595) || - (0x25A0 <= codePoint && codePoint <= 0x25A1) || - (0x25A3 <= codePoint && codePoint <= 0x25A9) || - (0x25B2 <= codePoint && codePoint <= 0x25B3) || - (0x25B6 <= codePoint && codePoint <= 0x25B7) || - (0x25BC <= codePoint && codePoint <= 0x25BD) || - (0x25C0 <= codePoint && codePoint <= 0x25C1) || - (0x25C6 <= codePoint && codePoint <= 0x25C8) || - (0x25CB == codePoint) || - (0x25CE <= codePoint && codePoint <= 0x25D1) || - (0x25E2 <= codePoint && codePoint <= 0x25E5) || - (0x25EF == codePoint) || - (0x2605 <= codePoint && codePoint <= 0x2606) || - (0x2609 == codePoint) || - (0x260E <= codePoint && codePoint <= 0x260F) || - (0x2614 <= codePoint && codePoint <= 0x2615) || - (0x261C == codePoint) || - (0x261E == codePoint) || - (0x2640 == codePoint) || - (0x2642 == codePoint) || - (0x2660 <= codePoint && codePoint <= 0x2661) || - (0x2663 <= codePoint && codePoint <= 0x2665) || - (0x2667 <= codePoint && codePoint <= 0x266A) || - (0x266C <= codePoint && codePoint <= 0x266D) || - (0x266F == codePoint) || - (0x269E <= codePoint && codePoint <= 0x269F) || - (0x26BE <= codePoint && codePoint <= 0x26BF) || - (0x26C4 <= codePoint && codePoint <= 0x26CD) || - (0x26CF <= codePoint && codePoint <= 0x26E1) || - (0x26E3 == codePoint) || - (0x26E8 <= codePoint && codePoint <= 0x26FF) || - (0x273D == codePoint) || - (0x2757 == codePoint) || - (0x2776 <= codePoint && codePoint <= 0x277F) || - (0x2B55 <= codePoint && codePoint <= 0x2B59) || - (0x3248 <= codePoint && codePoint <= 0x324F) || - (0xE000 <= codePoint && codePoint <= 0xF8FF) || - (0xFE00 <= codePoint && codePoint <= 0xFE0F) || - (0xFFFD == codePoint) || - (0x1F100 <= codePoint && codePoint <= 0x1F10A) || - (0x1F110 <= codePoint && codePoint <= 0x1F12D) || - (0x1F130 <= codePoint && codePoint <= 0x1F169) || - (0x1F170 <= codePoint && codePoint <= 0x1F19A) || - (0xE0100 <= codePoint && codePoint <= 0xE01EF) || - (0xF0000 <= codePoint && codePoint <= 0xFFFFD) || - (0x100000 <= codePoint && codePoint <= 0x10FFFD)) { - return 'A'; - } - - return 'N'; -}; - -eaw.characterLength = function(character) { - var code = this.eastAsianWidth(character); - if (code == 'F' || code == 'W' || code == 'A') { - return 2; - } else { - return 1; - } -}; - -// Split a string considering surrogate-pairs. -function stringToArray(string) { - return string.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF]/g) || []; -} - -eaw.length = function(string) { - var characters = stringToArray(string); - var len = 0; - for (var i = 0; i < characters.length; i++) { - len = len + this.characterLength(characters[i]); - } - return len; -}; - -eaw.slice = function(text, start, end) { - textLen = eaw.length(text) - start = start ? start : 0; - end = end ? end : 1; - if (start < 0) { - start = textLen + start; - } - if (end < 0) { - end = textLen + end; - } - var result = ''; - var eawLen = 0; - var chars = stringToArray(text); - for (var i = 0; i < chars.length; i++) { - var char = chars[i]; - var charLen = eaw.length(char); - if (eawLen >= start - (charLen == 2 ? 1 : 0)) { - if (eawLen + charLen <= end) { - result += char; - } else { - break; - } - } - eawLen += charLen; - } - return result; -}; diff --git a/node_modules/eastasianwidth/package.json b/node_modules/eastasianwidth/package.json deleted file mode 100644 index cb7ac6a..0000000 --- a/node_modules/eastasianwidth/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "eastasianwidth", - "version": "0.2.0", - "description": "Get East Asian Width from a character.", - "main": "eastasianwidth.js", - "files": [ - "eastasianwidth.js" - ], - "scripts": { - "test": "mocha" - }, - "repository": "git://github.com/komagata/eastasianwidth.git", - "author": "Masaki Komagata", - "license": "MIT", - "devDependencies": { - "mocha": "~1.9.0" - } -} diff --git a/node_modules/emoji-regex/LICENSE-MIT.txt b/node_modules/emoji-regex/LICENSE-MIT.txt deleted file mode 100644 index a41e0a7..0000000 --- a/node_modules/emoji-regex/LICENSE-MIT.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright Mathias Bynens - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/emoji-regex/README.md b/node_modules/emoji-regex/README.md deleted file mode 100644 index f10e173..0000000 --- a/node_modules/emoji-regex/README.md +++ /dev/null @@ -1,73 +0,0 @@ -# emoji-regex [![Build status](https://travis-ci.org/mathiasbynens/emoji-regex.svg?branch=master)](https://travis-ci.org/mathiasbynens/emoji-regex) - -_emoji-regex_ offers a regular expression to match all emoji symbols (including textual representations of emoji) as per the Unicode Standard. - -This repository contains a script that generates this regular expression based on [the data from Unicode v12](https://github.com/mathiasbynens/unicode-12.0.0). Because of this, the regular expression can easily be updated whenever new emoji are added to the Unicode standard. - -## Installation - -Via [npm](https://www.npmjs.com/): - -```bash -npm install emoji-regex -``` - -In [Node.js](https://nodejs.org/): - -```js -const emojiRegex = require('emoji-regex'); -// Note: because the regular expression has the global flag set, this module -// exports a function that returns the regex rather than exporting the regular -// expression itself, to make it impossible to (accidentally) mutate the -// original regular expression. - -const text = ` -\u{231A}: ⌚ default emoji presentation character (Emoji_Presentation) -\u{2194}\u{FE0F}: ↔️ default text presentation character rendered as emoji -\u{1F469}: 👩 emoji modifier base (Emoji_Modifier_Base) -\u{1F469}\u{1F3FF}: 👩🏿 emoji modifier base followed by a modifier -`; - -const regex = emojiRegex(); -let match; -while (match = regex.exec(text)) { - const emoji = match[0]; - console.log(`Matched sequence ${ emoji } — code points: ${ [...emoji].length }`); -} -``` - -Console output: - -``` -Matched sequence ⌚ — code points: 1 -Matched sequence ⌚ — code points: 1 -Matched sequence ↔️ — code points: 2 -Matched sequence ↔️ — code points: 2 -Matched sequence 👩 — code points: 1 -Matched sequence 👩 — code points: 1 -Matched sequence 👩🏿 — code points: 2 -Matched sequence 👩🏿 — code points: 2 -``` - -To match emoji in their textual representation as well (i.e. emoji that are not `Emoji_Presentation` symbols and that aren’t forced to render as emoji by a variation selector), `require` the other regex: - -```js -const emojiRegex = require('emoji-regex/text.js'); -``` - -Additionally, in environments which support ES2015 Unicode escapes, you may `require` ES2015-style versions of the regexes: - -```js -const emojiRegex = require('emoji-regex/es2015/index.js'); -const emojiRegexText = require('emoji-regex/es2015/text.js'); -``` - -## Author - -| [![twitter/mathias](https://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias "Follow @mathias on Twitter") | -|---| -| [Mathias Bynens](https://mathiasbynens.be/) | - -## License - -_emoji-regex_ is available under the [MIT](https://mths.be/mit) license. diff --git a/node_modules/emoji-regex/es2015/index.js b/node_modules/emoji-regex/es2015/index.js deleted file mode 100644 index b4cf3dc..0000000 --- a/node_modules/emoji-regex/es2015/index.js +++ /dev/null @@ -1,6 +0,0 @@ -"use strict"; - -module.exports = () => { - // https://mths.be/emoji - return /\u{1F3F4}\u{E0067}\u{E0062}(?:\u{E0065}\u{E006E}\u{E0067}|\u{E0073}\u{E0063}\u{E0074}|\u{E0077}\u{E006C}\u{E0073})\u{E007F}|\u{1F468}(?:\u{1F3FC}\u200D(?:\u{1F91D}\u200D\u{1F468}\u{1F3FB}|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FE}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FE}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FD}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FD}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FC}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F468}|[\u{1F468}\u{1F469}]\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}]|[\u{1F468}\u{1F469}]\u200D[\u{1F466}\u{1F467}]|[\u2695\u2696\u2708]\uFE0F|[\u{1F466}\u{1F467}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|(?:\u{1F3FB}\u200D[\u2695\u2696\u2708]|\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708])\uFE0F|\u{1F3FB}\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|[\u{1F3FB}-\u{1F3FF}])|(?:\u{1F9D1}\u{1F3FB}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FC}\u200D\u{1F91D}\u200D\u{1F469})\u{1F3FB}|\u{1F9D1}(?:\u{1F3FF}\u200D\u{1F91D}\u200D\u{1F9D1}[\u{1F3FB}-\u{1F3FF}]|\u200D\u{1F91D}\u200D\u{1F9D1})|(?:\u{1F9D1}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FF}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}-\u{1F3FE}]|(?:\u{1F9D1}\u{1F3FC}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FD}\u200D\u{1F91D}\u200D\u{1F469})[\u{1F3FB}\u{1F3FC}]|\u{1F469}(?:\u{1F3FE}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FD}\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FC}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FD}-\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FB}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FC}-\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FD}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FC}\u{1F3FE}\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}])|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F469}\u200D\u{1F469}\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|(?:\u{1F9D1}\u{1F3FD}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F469})[\u{1F3FB}-\u{1F3FD}]|\u{1F469}\u200D\u{1F466}\u200D\u{1F466}|\u{1F469}\u200D\u{1F469}\u200D[\u{1F466}\u{1F467}]|(?:\u{1F441}\uFE0F\u200D\u{1F5E8}|\u{1F469}(?:\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708]|\u{1F3FB}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}]\uFE0F|[\u{1F46F}\u{1F93C}\u{1F9DE}\u{1F9DF}])\u200D[\u2640\u2642]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D6}-\u{1F9DD}](?:[\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\u{1F3F4}\u200D\u2620)\uFE0F|\u{1F469}\u200D\u{1F467}\u200D[\u{1F466}\u{1F467}]|\u{1F3F3}\uFE0F\u200D\u{1F308}|\u{1F415}\u200D\u{1F9BA}|\u{1F469}\u200D\u{1F466}|\u{1F469}\u200D\u{1F467}|\u{1F1FD}\u{1F1F0}|\u{1F1F4}\u{1F1F2}|\u{1F1F6}\u{1F1E6}|[#\*0-9]\uFE0F\u20E3|\u{1F1E7}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EF}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1F9}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1ED}\u{1F1EF}-\u{1F1F4}\u{1F1F7}\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FF}]|\u{1F1EA}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1ED}\u{1F1F7}-\u{1F1FA}]|\u{1F9D1}[\u{1F3FB}-\u{1F3FF}]|\u{1F1F7}[\u{1F1EA}\u{1F1F4}\u{1F1F8}\u{1F1FA}\u{1F1FC}]|\u{1F469}[\u{1F3FB}-\u{1F3FF}]|\u{1F1F2}[\u{1F1E6}\u{1F1E8}-\u{1F1ED}\u{1F1F0}-\u{1F1FF}]|\u{1F1E6}[\u{1F1E8}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F2}\u{1F1F4}\u{1F1F6}-\u{1F1FA}\u{1F1FC}\u{1F1FD}\u{1F1FF}]|\u{1F1F0}[\u{1F1EA}\u{1F1EC}-\u{1F1EE}\u{1F1F2}\u{1F1F3}\u{1F1F5}\u{1F1F7}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1ED}[\u{1F1F0}\u{1F1F2}\u{1F1F3}\u{1F1F7}\u{1F1F9}\u{1F1FA}]|\u{1F1E9}[\u{1F1EA}\u{1F1EC}\u{1F1EF}\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1FF}]|\u{1F1FE}[\u{1F1EA}\u{1F1F9}]|\u{1F1EC}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EE}\u{1F1F1}-\u{1F1F3}\u{1F1F5}-\u{1F1FA}\u{1F1FC}\u{1F1FE}]|\u{1F1F8}[\u{1F1E6}-\u{1F1EA}\u{1F1EC}-\u{1F1F4}\u{1F1F7}-\u{1F1F9}\u{1F1FB}\u{1F1FD}-\u{1F1FF}]|\u{1F1EB}[\u{1F1EE}-\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1F7}]|\u{1F1F5}[\u{1F1E6}\u{1F1EA}-\u{1F1ED}\u{1F1F0}-\u{1F1F3}\u{1F1F7}-\u{1F1F9}\u{1F1FC}\u{1F1FE}]|\u{1F1FB}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1EE}\u{1F1F3}\u{1F1FA}]|\u{1F1F3}[\u{1F1E6}\u{1F1E8}\u{1F1EA}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F4}\u{1F1F5}\u{1F1F7}\u{1F1FA}\u{1F1FF}]|\u{1F1E8}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1EE}\u{1F1F0}-\u{1F1F5}\u{1F1F7}\u{1F1FA}-\u{1F1FF}]|\u{1F1F1}[\u{1F1E6}-\u{1F1E8}\u{1F1EE}\u{1F1F0}\u{1F1F7}-\u{1F1FB}\u{1F1FE}]|\u{1F1FF}[\u{1F1E6}\u{1F1F2}\u{1F1FC}]|\u{1F1FC}[\u{1F1EB}\u{1F1F8}]|\u{1F1FA}[\u{1F1E6}\u{1F1EC}\u{1F1F2}\u{1F1F3}\u{1F1F8}\u{1F1FE}\u{1F1FF}]|\u{1F1EE}[\u{1F1E8}-\u{1F1EA}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}]|\u{1F1EF}[\u{1F1EA}\u{1F1F2}\u{1F1F4}\u{1F1F5}]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]|[\u261D\u270A-\u270D\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F46B}-\u{1F46D}\u{1F470}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F4AA}\u{1F574}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F90F}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F930}-\u{1F936}\u{1F9B5}\u{1F9B6}\u{1F9BB}\u{1F9D2}-\u{1F9D5}][\u{1F3FB}-\u{1F3FF}]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55\u{1F004}\u{1F0CF}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F236}\u{1F238}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F320}\u{1F32D}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F37E}-\u{1F393}\u{1F3A0}-\u{1F3CA}\u{1F3CF}-\u{1F3D3}\u{1F3E0}-\u{1F3F0}\u{1F3F4}\u{1F3F8}-\u{1F43E}\u{1F440}\u{1F442}-\u{1F4FC}\u{1F4FF}-\u{1F53D}\u{1F54B}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F57A}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5FB}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CC}\u{1F6D0}-\u{1F6D2}\u{1F6D5}\u{1F6EB}\u{1F6EC}\u{1F6F4}-\u{1F6FA}\u{1F7E0}-\u{1F7EB}\u{1F90D}-\u{1F93A}\u{1F93C}-\u{1F945}\u{1F947}-\u{1F971}\u{1F973}-\u{1F976}\u{1F97A}-\u{1F9A2}\u{1F9A5}-\u{1F9AA}\u{1F9AE}-\u{1F9CA}\u{1F9CD}-\u{1F9FF}\u{1FA70}-\u{1FA73}\u{1FA78}-\u{1FA7A}\u{1FA80}-\u{1FA82}\u{1FA90}-\u{1FA95}]|[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299\u{1F004}\u{1F0CF}\u{1F170}\u{1F171}\u{1F17E}\u{1F17F}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F202}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F321}\u{1F324}-\u{1F393}\u{1F396}\u{1F397}\u{1F399}-\u{1F39B}\u{1F39E}-\u{1F3F0}\u{1F3F3}-\u{1F3F5}\u{1F3F7}-\u{1F4FD}\u{1F4FF}-\u{1F53D}\u{1F549}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F56F}\u{1F570}\u{1F573}-\u{1F57A}\u{1F587}\u{1F58A}-\u{1F58D}\u{1F590}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5A5}\u{1F5A8}\u{1F5B1}\u{1F5B2}\u{1F5BC}\u{1F5C2}-\u{1F5C4}\u{1F5D1}-\u{1F5D3}\u{1F5DC}-\u{1F5DE}\u{1F5E1}\u{1F5E3}\u{1F5E8}\u{1F5EF}\u{1F5F3}\u{1F5FA}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CB}-\u{1F6D2}\u{1F6D5}\u{1F6E0}-\u{1F6E5}\u{1F6E9}\u{1F6EB}\u{1F6EC}\u{1F6F0}\u{1F6F3}-\u{1F6FA}\u{1F7E0}-\u{1F7EB}\u{1F90D}-\u{1F93A}\u{1F93C}-\u{1F945}\u{1F947}-\u{1F971}\u{1F973}-\u{1F976}\u{1F97A}-\u{1F9A2}\u{1F9A5}-\u{1F9AA}\u{1F9AE}-\u{1F9CA}\u{1F9CD}-\u{1F9FF}\u{1FA70}-\u{1FA73}\u{1FA78}-\u{1FA7A}\u{1FA80}-\u{1FA82}\u{1FA90}-\u{1FA95}]\uFE0F|[\u261D\u26F9\u270A-\u270D\u{1F385}\u{1F3C2}-\u{1F3C4}\u{1F3C7}\u{1F3CA}-\u{1F3CC}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}-\u{1F478}\u{1F47C}\u{1F481}-\u{1F483}\u{1F485}-\u{1F487}\u{1F48F}\u{1F491}\u{1F4AA}\u{1F574}\u{1F575}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F645}-\u{1F647}\u{1F64B}-\u{1F64F}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F6C0}\u{1F6CC}\u{1F90F}\u{1F918}-\u{1F91F}\u{1F926}\u{1F930}-\u{1F939}\u{1F93C}-\u{1F93E}\u{1F9B5}\u{1F9B6}\u{1F9B8}\u{1F9B9}\u{1F9BB}\u{1F9CD}-\u{1F9CF}\u{1F9D1}-\u{1F9DD}]/gu; -}; diff --git a/node_modules/emoji-regex/es2015/text.js b/node_modules/emoji-regex/es2015/text.js deleted file mode 100644 index 780309d..0000000 --- a/node_modules/emoji-regex/es2015/text.js +++ /dev/null @@ -1,6 +0,0 @@ -"use strict"; - -module.exports = () => { - // https://mths.be/emoji - return /\u{1F3F4}\u{E0067}\u{E0062}(?:\u{E0065}\u{E006E}\u{E0067}|\u{E0073}\u{E0063}\u{E0074}|\u{E0077}\u{E006C}\u{E0073})\u{E007F}|\u{1F468}(?:\u{1F3FC}\u200D(?:\u{1F91D}\u200D\u{1F468}\u{1F3FB}|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FE}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FE}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FD}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FD}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FC}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F468}|[\u{1F468}\u{1F469}]\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}]|[\u{1F468}\u{1F469}]\u200D[\u{1F466}\u{1F467}]|[\u2695\u2696\u2708]\uFE0F|[\u{1F466}\u{1F467}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|(?:\u{1F3FB}\u200D[\u2695\u2696\u2708]|\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708])\uFE0F|\u{1F3FB}\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|[\u{1F3FB}-\u{1F3FF}])|(?:\u{1F9D1}\u{1F3FB}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FC}\u200D\u{1F91D}\u200D\u{1F469})\u{1F3FB}|\u{1F9D1}(?:\u{1F3FF}\u200D\u{1F91D}\u200D\u{1F9D1}[\u{1F3FB}-\u{1F3FF}]|\u200D\u{1F91D}\u200D\u{1F9D1})|(?:\u{1F9D1}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FF}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}-\u{1F3FE}]|(?:\u{1F9D1}\u{1F3FC}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FD}\u200D\u{1F91D}\u200D\u{1F469})[\u{1F3FB}\u{1F3FC}]|\u{1F469}(?:\u{1F3FE}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FD}\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FC}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FD}-\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FB}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FC}-\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FD}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FC}\u{1F3FE}\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}])|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F469}\u200D\u{1F469}\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|(?:\u{1F9D1}\u{1F3FD}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F469})[\u{1F3FB}-\u{1F3FD}]|\u{1F469}\u200D\u{1F466}\u200D\u{1F466}|\u{1F469}\u200D\u{1F469}\u200D[\u{1F466}\u{1F467}]|(?:\u{1F441}\uFE0F\u200D\u{1F5E8}|\u{1F469}(?:\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708]|\u{1F3FB}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}]\uFE0F|[\u{1F46F}\u{1F93C}\u{1F9DE}\u{1F9DF}])\u200D[\u2640\u2642]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D6}-\u{1F9DD}](?:[\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\u{1F3F4}\u200D\u2620)\uFE0F|\u{1F469}\u200D\u{1F467}\u200D[\u{1F466}\u{1F467}]|\u{1F3F3}\uFE0F\u200D\u{1F308}|\u{1F415}\u200D\u{1F9BA}|\u{1F469}\u200D\u{1F466}|\u{1F469}\u200D\u{1F467}|\u{1F1FD}\u{1F1F0}|\u{1F1F4}\u{1F1F2}|\u{1F1F6}\u{1F1E6}|[#\*0-9]\uFE0F\u20E3|\u{1F1E7}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EF}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1F9}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1ED}\u{1F1EF}-\u{1F1F4}\u{1F1F7}\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FF}]|\u{1F1EA}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1ED}\u{1F1F7}-\u{1F1FA}]|\u{1F9D1}[\u{1F3FB}-\u{1F3FF}]|\u{1F1F7}[\u{1F1EA}\u{1F1F4}\u{1F1F8}\u{1F1FA}\u{1F1FC}]|\u{1F469}[\u{1F3FB}-\u{1F3FF}]|\u{1F1F2}[\u{1F1E6}\u{1F1E8}-\u{1F1ED}\u{1F1F0}-\u{1F1FF}]|\u{1F1E6}[\u{1F1E8}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F2}\u{1F1F4}\u{1F1F6}-\u{1F1FA}\u{1F1FC}\u{1F1FD}\u{1F1FF}]|\u{1F1F0}[\u{1F1EA}\u{1F1EC}-\u{1F1EE}\u{1F1F2}\u{1F1F3}\u{1F1F5}\u{1F1F7}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1ED}[\u{1F1F0}\u{1F1F2}\u{1F1F3}\u{1F1F7}\u{1F1F9}\u{1F1FA}]|\u{1F1E9}[\u{1F1EA}\u{1F1EC}\u{1F1EF}\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1FF}]|\u{1F1FE}[\u{1F1EA}\u{1F1F9}]|\u{1F1EC}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EE}\u{1F1F1}-\u{1F1F3}\u{1F1F5}-\u{1F1FA}\u{1F1FC}\u{1F1FE}]|\u{1F1F8}[\u{1F1E6}-\u{1F1EA}\u{1F1EC}-\u{1F1F4}\u{1F1F7}-\u{1F1F9}\u{1F1FB}\u{1F1FD}-\u{1F1FF}]|\u{1F1EB}[\u{1F1EE}-\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1F7}]|\u{1F1F5}[\u{1F1E6}\u{1F1EA}-\u{1F1ED}\u{1F1F0}-\u{1F1F3}\u{1F1F7}-\u{1F1F9}\u{1F1FC}\u{1F1FE}]|\u{1F1FB}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1EE}\u{1F1F3}\u{1F1FA}]|\u{1F1F3}[\u{1F1E6}\u{1F1E8}\u{1F1EA}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F4}\u{1F1F5}\u{1F1F7}\u{1F1FA}\u{1F1FF}]|\u{1F1E8}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1EE}\u{1F1F0}-\u{1F1F5}\u{1F1F7}\u{1F1FA}-\u{1F1FF}]|\u{1F1F1}[\u{1F1E6}-\u{1F1E8}\u{1F1EE}\u{1F1F0}\u{1F1F7}-\u{1F1FB}\u{1F1FE}]|\u{1F1FF}[\u{1F1E6}\u{1F1F2}\u{1F1FC}]|\u{1F1FC}[\u{1F1EB}\u{1F1F8}]|\u{1F1FA}[\u{1F1E6}\u{1F1EC}\u{1F1F2}\u{1F1F3}\u{1F1F8}\u{1F1FE}\u{1F1FF}]|\u{1F1EE}[\u{1F1E8}-\u{1F1EA}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}]|\u{1F1EF}[\u{1F1EA}\u{1F1F2}\u{1F1F4}\u{1F1F5}]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]|[\u261D\u270A-\u270D\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F46B}-\u{1F46D}\u{1F470}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F4AA}\u{1F574}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F90F}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F930}-\u{1F936}\u{1F9B5}\u{1F9B6}\u{1F9BB}\u{1F9D2}-\u{1F9D5}][\u{1F3FB}-\u{1F3FF}]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55\u{1F004}\u{1F0CF}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F236}\u{1F238}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F320}\u{1F32D}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F37E}-\u{1F393}\u{1F3A0}-\u{1F3CA}\u{1F3CF}-\u{1F3D3}\u{1F3E0}-\u{1F3F0}\u{1F3F4}\u{1F3F8}-\u{1F43E}\u{1F440}\u{1F442}-\u{1F4FC}\u{1F4FF}-\u{1F53D}\u{1F54B}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F57A}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5FB}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CC}\u{1F6D0}-\u{1F6D2}\u{1F6D5}\u{1F6EB}\u{1F6EC}\u{1F6F4}-\u{1F6FA}\u{1F7E0}-\u{1F7EB}\u{1F90D}-\u{1F93A}\u{1F93C}-\u{1F945}\u{1F947}-\u{1F971}\u{1F973}-\u{1F976}\u{1F97A}-\u{1F9A2}\u{1F9A5}-\u{1F9AA}\u{1F9AE}-\u{1F9CA}\u{1F9CD}-\u{1F9FF}\u{1FA70}-\u{1FA73}\u{1FA78}-\u{1FA7A}\u{1FA80}-\u{1FA82}\u{1FA90}-\u{1FA95}]|[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299\u{1F004}\u{1F0CF}\u{1F170}\u{1F171}\u{1F17E}\u{1F17F}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F202}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F321}\u{1F324}-\u{1F393}\u{1F396}\u{1F397}\u{1F399}-\u{1F39B}\u{1F39E}-\u{1F3F0}\u{1F3F3}-\u{1F3F5}\u{1F3F7}-\u{1F4FD}\u{1F4FF}-\u{1F53D}\u{1F549}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F56F}\u{1F570}\u{1F573}-\u{1F57A}\u{1F587}\u{1F58A}-\u{1F58D}\u{1F590}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5A5}\u{1F5A8}\u{1F5B1}\u{1F5B2}\u{1F5BC}\u{1F5C2}-\u{1F5C4}\u{1F5D1}-\u{1F5D3}\u{1F5DC}-\u{1F5DE}\u{1F5E1}\u{1F5E3}\u{1F5E8}\u{1F5EF}\u{1F5F3}\u{1F5FA}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CB}-\u{1F6D2}\u{1F6D5}\u{1F6E0}-\u{1F6E5}\u{1F6E9}\u{1F6EB}\u{1F6EC}\u{1F6F0}\u{1F6F3}-\u{1F6FA}\u{1F7E0}-\u{1F7EB}\u{1F90D}-\u{1F93A}\u{1F93C}-\u{1F945}\u{1F947}-\u{1F971}\u{1F973}-\u{1F976}\u{1F97A}-\u{1F9A2}\u{1F9A5}-\u{1F9AA}\u{1F9AE}-\u{1F9CA}\u{1F9CD}-\u{1F9FF}\u{1FA70}-\u{1FA73}\u{1FA78}-\u{1FA7A}\u{1FA80}-\u{1FA82}\u{1FA90}-\u{1FA95}]\uFE0F?|[\u261D\u26F9\u270A-\u270D\u{1F385}\u{1F3C2}-\u{1F3C4}\u{1F3C7}\u{1F3CA}-\u{1F3CC}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}-\u{1F478}\u{1F47C}\u{1F481}-\u{1F483}\u{1F485}-\u{1F487}\u{1F48F}\u{1F491}\u{1F4AA}\u{1F574}\u{1F575}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F645}-\u{1F647}\u{1F64B}-\u{1F64F}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F6C0}\u{1F6CC}\u{1F90F}\u{1F918}-\u{1F91F}\u{1F926}\u{1F930}-\u{1F939}\u{1F93C}-\u{1F93E}\u{1F9B5}\u{1F9B6}\u{1F9B8}\u{1F9B9}\u{1F9BB}\u{1F9CD}-\u{1F9CF}\u{1F9D1}-\u{1F9DD}]/gu; -}; diff --git a/node_modules/emoji-regex/index.d.ts b/node_modules/emoji-regex/index.d.ts deleted file mode 100644 index 1955b47..0000000 --- a/node_modules/emoji-regex/index.d.ts +++ /dev/null @@ -1,23 +0,0 @@ -declare module 'emoji-regex' { - function emojiRegex(): RegExp; - - export default emojiRegex; -} - -declare module 'emoji-regex/text' { - function emojiRegex(): RegExp; - - export default emojiRegex; -} - -declare module 'emoji-regex/es2015' { - function emojiRegex(): RegExp; - - export default emojiRegex; -} - -declare module 'emoji-regex/es2015/text' { - function emojiRegex(): RegExp; - - export default emojiRegex; -} diff --git a/node_modules/emoji-regex/index.js b/node_modules/emoji-regex/index.js deleted file mode 100644 index d993a3a..0000000 --- a/node_modules/emoji-regex/index.js +++ /dev/null @@ -1,6 +0,0 @@ -"use strict"; - -module.exports = function () { - // https://mths.be/emoji - return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F|\uD83D\uDC68(?:\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68\uD83C\uDFFB|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83D[\uDC66\uDC67]|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708])\uFE0F|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C[\uDFFB-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)\uD83C\uDFFB|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB\uDFFC])|\uD83D\uDC69(?:\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB-\uDFFD])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620)\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF6\uD83C\uDDE6|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDBB\uDDD2-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5\uDEEB\uDEEC\uDEF4-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g; -}; diff --git a/node_modules/emoji-regex/package.json b/node_modules/emoji-regex/package.json deleted file mode 100644 index 6d32352..0000000 --- a/node_modules/emoji-regex/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "emoji-regex", - "version": "8.0.0", - "description": "A regular expression to match all Emoji-only symbols as per the Unicode Standard.", - "homepage": "https://mths.be/emoji-regex", - "main": "index.js", - "types": "index.d.ts", - "keywords": [ - "unicode", - "regex", - "regexp", - "regular expressions", - "code points", - "symbols", - "characters", - "emoji" - ], - "license": "MIT", - "author": { - "name": "Mathias Bynens", - "url": "https://mathiasbynens.be/" - }, - "repository": { - "type": "git", - "url": "https://github.com/mathiasbynens/emoji-regex.git" - }, - "bugs": "https://github.com/mathiasbynens/emoji-regex/issues", - "files": [ - "LICENSE-MIT.txt", - "index.js", - "index.d.ts", - "text.js", - "es2015/index.js", - "es2015/text.js" - ], - "scripts": { - "build": "rm -rf -- es2015; babel src -d .; NODE_ENV=es2015 babel src -d ./es2015; node script/inject-sequences.js", - "test": "mocha", - "test:watch": "npm run test -- --watch" - }, - "devDependencies": { - "@babel/cli": "^7.2.3", - "@babel/core": "^7.3.4", - "@babel/plugin-proposal-unicode-property-regex": "^7.2.0", - "@babel/preset-env": "^7.3.4", - "mocha": "^6.0.2", - "regexgen": "^1.3.0", - "unicode-12.0.0": "^0.7.9" - } -} diff --git a/node_modules/emoji-regex/text.js b/node_modules/emoji-regex/text.js deleted file mode 100644 index 0a55ce2..0000000 --- a/node_modules/emoji-regex/text.js +++ /dev/null @@ -1,6 +0,0 @@ -"use strict"; - -module.exports = function () { - // https://mths.be/emoji - return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F|\uD83D\uDC68(?:\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68\uD83C\uDFFB|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83D[\uDC66\uDC67]|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708])\uFE0F|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C[\uDFFB-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)\uD83C\uDFFB|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB\uDFFC])|\uD83D\uDC69(?:\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB-\uDFFD])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620)\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF6\uD83C\uDDE6|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDBB\uDDD2-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5\uDEEB\uDEEC\uDEF4-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])\uFE0F?|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g; -}; diff --git a/node_modules/esbuild/LICENSE.md b/node_modules/esbuild/LICENSE.md deleted file mode 100644 index 2027e8d..0000000 --- a/node_modules/esbuild/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2020 Evan Wallace - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/node_modules/esbuild/README.md b/node_modules/esbuild/README.md deleted file mode 100644 index 93863d1..0000000 --- a/node_modules/esbuild/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# esbuild - -This is a JavaScript bundler and minifier. See https://github.com/evanw/esbuild and the [JavaScript API documentation](https://esbuild.github.io/api/) for details. diff --git a/node_modules/esbuild/bin/esbuild b/node_modules/esbuild/bin/esbuild deleted file mode 100644 index b080c86..0000000 --- a/node_modules/esbuild/bin/esbuild +++ /dev/null @@ -1,223 +0,0 @@ -#!/usr/bin/env node -"use strict"; -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); - -// lib/npm/node-platform.ts -var fs = require("fs"); -var os = require("os"); -var path = require("path"); -var ESBUILD_BINARY_PATH = process.env.ESBUILD_BINARY_PATH || ESBUILD_BINARY_PATH; -var isValidBinaryPath = (x) => !!x && x !== "/usr/bin/esbuild"; -var packageDarwin_arm64 = "@esbuild/darwin-arm64"; -var packageDarwin_x64 = "@esbuild/darwin-x64"; -var knownWindowsPackages = { - "win32 arm64 LE": "@esbuild/win32-arm64", - "win32 ia32 LE": "@esbuild/win32-ia32", - "win32 x64 LE": "@esbuild/win32-x64" -}; -var knownUnixlikePackages = { - "aix ppc64 BE": "@esbuild/aix-ppc64", - "android arm64 LE": "@esbuild/android-arm64", - "darwin arm64 LE": "@esbuild/darwin-arm64", - "darwin x64 LE": "@esbuild/darwin-x64", - "freebsd arm64 LE": "@esbuild/freebsd-arm64", - "freebsd x64 LE": "@esbuild/freebsd-x64", - "linux arm LE": "@esbuild/linux-arm", - "linux arm64 LE": "@esbuild/linux-arm64", - "linux ia32 LE": "@esbuild/linux-ia32", - "linux mips64el LE": "@esbuild/linux-mips64el", - "linux ppc64 LE": "@esbuild/linux-ppc64", - "linux riscv64 LE": "@esbuild/linux-riscv64", - "linux s390x BE": "@esbuild/linux-s390x", - "linux x64 LE": "@esbuild/linux-x64", - "linux loong64 LE": "@esbuild/linux-loong64", - "netbsd arm64 LE": "@esbuild/netbsd-arm64", - "netbsd x64 LE": "@esbuild/netbsd-x64", - "openbsd arm64 LE": "@esbuild/openbsd-arm64", - "openbsd x64 LE": "@esbuild/openbsd-x64", - "sunos x64 LE": "@esbuild/sunos-x64" -}; -var knownWebAssemblyFallbackPackages = { - "android arm LE": "@esbuild/android-arm", - "android x64 LE": "@esbuild/android-x64", - "openharmony arm64 LE": "@esbuild/openharmony-arm64" -}; -function pkgAndSubpathForCurrentPlatform() { - let pkg; - let subpath; - let isWASM2 = false; - let platformKey = `${process.platform} ${os.arch()} ${os.endianness()}`; - if (platformKey in knownWindowsPackages) { - pkg = knownWindowsPackages[platformKey]; - subpath = "esbuild.exe"; - } else if (platformKey in knownUnixlikePackages) { - pkg = knownUnixlikePackages[platformKey]; - subpath = "bin/esbuild"; - } else if (platformKey in knownWebAssemblyFallbackPackages) { - pkg = knownWebAssemblyFallbackPackages[platformKey]; - subpath = "bin/esbuild"; - isWASM2 = true; - } else { - throw new Error(`Unsupported platform: ${platformKey}`); - } - return { pkg, subpath, isWASM: isWASM2 }; -} -function pkgForSomeOtherPlatform() { - const libMainJS = require.resolve("esbuild"); - const nodeModulesDirectory = path.dirname(path.dirname(path.dirname(libMainJS))); - if (path.basename(nodeModulesDirectory) === "node_modules") { - for (const unixKey in knownUnixlikePackages) { - try { - const pkg = knownUnixlikePackages[unixKey]; - if (fs.existsSync(path.join(nodeModulesDirectory, pkg))) return pkg; - } catch { - } - } - for (const windowsKey in knownWindowsPackages) { - try { - const pkg = knownWindowsPackages[windowsKey]; - if (fs.existsSync(path.join(nodeModulesDirectory, pkg))) return pkg; - } catch { - } - } - } - return null; -} -function downloadedBinPath(pkg, subpath) { - const esbuildLibDir = path.dirname(require.resolve("esbuild")); - return path.join(esbuildLibDir, `downloaded-${pkg.replace("/", "-")}-${path.basename(subpath)}`); -} -function generateBinPath() { - if (isValidBinaryPath(ESBUILD_BINARY_PATH)) { - if (!fs.existsSync(ESBUILD_BINARY_PATH)) { - console.warn(`[esbuild] Ignoring bad configuration: ESBUILD_BINARY_PATH=${ESBUILD_BINARY_PATH}`); - } else { - return { binPath: ESBUILD_BINARY_PATH, isWASM: false }; - } - } - const { pkg, subpath, isWASM: isWASM2 } = pkgAndSubpathForCurrentPlatform(); - let binPath2; - try { - binPath2 = require.resolve(`${pkg}/${subpath}`); - } catch (e) { - binPath2 = downloadedBinPath(pkg, subpath); - if (!fs.existsSync(binPath2)) { - try { - require.resolve(pkg); - } catch { - const otherPkg = pkgForSomeOtherPlatform(); - if (otherPkg) { - let suggestions = ` -Specifically the "${otherPkg}" package is present but this platform -needs the "${pkg}" package instead. People often get into this -situation by installing esbuild on Windows or macOS and copying "node_modules" -into a Docker image that runs Linux, or by copying "node_modules" between -Windows and WSL environments. - -If you are installing with npm, you can try not copying the "node_modules" -directory when you copy the files over, and running "npm ci" or "npm install" -on the destination platform after the copy. Or you could consider using yarn -instead of npm which has built-in support for installing a package on multiple -platforms simultaneously. - -If you are installing with yarn, you can try listing both this platform and the -other platform in your ".yarnrc.yml" file using the "supportedArchitectures" -feature: https://yarnpkg.com/configuration/yarnrc/#supportedArchitectures -Keep in mind that this means multiple copies of esbuild will be present. -`; - if (pkg === packageDarwin_x64 && otherPkg === packageDarwin_arm64 || pkg === packageDarwin_arm64 && otherPkg === packageDarwin_x64) { - suggestions = ` -Specifically the "${otherPkg}" package is present but this platform -needs the "${pkg}" package instead. People often get into this -situation by installing esbuild with npm running inside of Rosetta 2 and then -trying to use it with node running outside of Rosetta 2, or vice versa (Rosetta -2 is Apple's on-the-fly x86_64-to-arm64 translation service). - -If you are installing with npm, you can try ensuring that both npm and node are -not running under Rosetta 2 and then reinstalling esbuild. This likely involves -changing how you installed npm and/or node. For example, installing node with -the universal installer here should work: https://nodejs.org/en/download/. Or -you could consider using yarn instead of npm which has built-in support for -installing a package on multiple platforms simultaneously. - -If you are installing with yarn, you can try listing both "arm64" and "x64" -in your ".yarnrc.yml" file using the "supportedArchitectures" feature: -https://yarnpkg.com/configuration/yarnrc/#supportedArchitectures -Keep in mind that this means multiple copies of esbuild will be present. -`; - } - throw new Error(` -You installed esbuild for another platform than the one you're currently using. -This won't work because esbuild is written with native code and needs to -install a platform-specific binary executable. -${suggestions} -Another alternative is to use the "esbuild-wasm" package instead, which works -the same way on all platforms. But it comes with a heavy performance cost and -can sometimes be 10x slower than the "esbuild" package, so you may also not -want to do that. -`); - } - throw new Error(`The package "${pkg}" could not be found, and is needed by esbuild. - -If you are installing esbuild with npm, make sure that you don't specify the -"--no-optional" or "--omit=optional" flags. The "optionalDependencies" feature -of "package.json" is used by esbuild to install the correct binary executable -for your current platform.`); - } - throw e; - } - } - if (/\.zip\//.test(binPath2)) { - let pnpapi; - try { - pnpapi = require("pnpapi"); - } catch (e) { - } - if (pnpapi) { - const root = pnpapi.getPackageInformation(pnpapi.topLevel).packageLocation; - const binTargetPath = path.join( - root, - "node_modules", - ".cache", - "esbuild", - `pnpapi-${pkg.replace("/", "-")}-${"0.25.9"}-${path.basename(subpath)}` - ); - if (!fs.existsSync(binTargetPath)) { - fs.mkdirSync(path.dirname(binTargetPath), { recursive: true }); - fs.copyFileSync(binPath2, binTargetPath); - fs.chmodSync(binTargetPath, 493); - } - return { binPath: binTargetPath, isWASM: isWASM2 }; - } - } - return { binPath: binPath2, isWASM: isWASM2 }; -} - -// lib/npm/node-shim.ts -var { binPath, isWASM } = generateBinPath(); -if (isWASM) { - require("child_process").execFileSync("node", [binPath].concat(process.argv.slice(2)), { stdio: "inherit" }); -} else { - require("child_process").execFileSync(binPath, process.argv.slice(2), { stdio: "inherit" }); -} diff --git a/node_modules/esbuild/install.js b/node_modules/esbuild/install.js deleted file mode 100644 index 1019e62..0000000 --- a/node_modules/esbuild/install.js +++ /dev/null @@ -1,289 +0,0 @@ -"use strict"; -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); - -// lib/npm/node-platform.ts -var fs = require("fs"); -var os = require("os"); -var path = require("path"); -var ESBUILD_BINARY_PATH = process.env.ESBUILD_BINARY_PATH || ESBUILD_BINARY_PATH; -var isValidBinaryPath = (x) => !!x && x !== "/usr/bin/esbuild"; -var knownWindowsPackages = { - "win32 arm64 LE": "@esbuild/win32-arm64", - "win32 ia32 LE": "@esbuild/win32-ia32", - "win32 x64 LE": "@esbuild/win32-x64" -}; -var knownUnixlikePackages = { - "aix ppc64 BE": "@esbuild/aix-ppc64", - "android arm64 LE": "@esbuild/android-arm64", - "darwin arm64 LE": "@esbuild/darwin-arm64", - "darwin x64 LE": "@esbuild/darwin-x64", - "freebsd arm64 LE": "@esbuild/freebsd-arm64", - "freebsd x64 LE": "@esbuild/freebsd-x64", - "linux arm LE": "@esbuild/linux-arm", - "linux arm64 LE": "@esbuild/linux-arm64", - "linux ia32 LE": "@esbuild/linux-ia32", - "linux mips64el LE": "@esbuild/linux-mips64el", - "linux ppc64 LE": "@esbuild/linux-ppc64", - "linux riscv64 LE": "@esbuild/linux-riscv64", - "linux s390x BE": "@esbuild/linux-s390x", - "linux x64 LE": "@esbuild/linux-x64", - "linux loong64 LE": "@esbuild/linux-loong64", - "netbsd arm64 LE": "@esbuild/netbsd-arm64", - "netbsd x64 LE": "@esbuild/netbsd-x64", - "openbsd arm64 LE": "@esbuild/openbsd-arm64", - "openbsd x64 LE": "@esbuild/openbsd-x64", - "sunos x64 LE": "@esbuild/sunos-x64" -}; -var knownWebAssemblyFallbackPackages = { - "android arm LE": "@esbuild/android-arm", - "android x64 LE": "@esbuild/android-x64", - "openharmony arm64 LE": "@esbuild/openharmony-arm64" -}; -function pkgAndSubpathForCurrentPlatform() { - let pkg; - let subpath; - let isWASM = false; - let platformKey = `${process.platform} ${os.arch()} ${os.endianness()}`; - if (platformKey in knownWindowsPackages) { - pkg = knownWindowsPackages[platformKey]; - subpath = "esbuild.exe"; - } else if (platformKey in knownUnixlikePackages) { - pkg = knownUnixlikePackages[platformKey]; - subpath = "bin/esbuild"; - } else if (platformKey in knownWebAssemblyFallbackPackages) { - pkg = knownWebAssemblyFallbackPackages[platformKey]; - subpath = "bin/esbuild"; - isWASM = true; - } else { - throw new Error(`Unsupported platform: ${platformKey}`); - } - return { pkg, subpath, isWASM }; -} -function downloadedBinPath(pkg, subpath) { - const esbuildLibDir = path.dirname(require.resolve("esbuild")); - return path.join(esbuildLibDir, `downloaded-${pkg.replace("/", "-")}-${path.basename(subpath)}`); -} - -// lib/npm/node-install.ts -var fs2 = require("fs"); -var os2 = require("os"); -var path2 = require("path"); -var zlib = require("zlib"); -var https = require("https"); -var child_process = require("child_process"); -var versionFromPackageJSON = require(path2.join(__dirname, "package.json")).version; -var toPath = path2.join(__dirname, "bin", "esbuild"); -var isToPathJS = true; -function validateBinaryVersion(...command) { - command.push("--version"); - let stdout; - try { - stdout = child_process.execFileSync(command.shift(), command, { - // Without this, this install script strangely crashes with the error - // "EACCES: permission denied, write" but only on Ubuntu Linux when node is - // installed from the Snap Store. This is not a problem when you download - // the official version of node. The problem appears to be that stderr - // (i.e. file descriptor 2) isn't writable? - // - // More info: - // - https://snapcraft.io/ (what the Snap Store is) - // - https://nodejs.org/dist/ (download the official version of node) - // - https://github.com/evanw/esbuild/issues/1711#issuecomment-1027554035 - // - stdio: "pipe" - }).toString().trim(); - } catch (err) { - if (os2.platform() === "darwin" && /_SecTrustEvaluateWithError/.test(err + "")) { - let os3 = "this version of macOS"; - try { - os3 = "macOS " + child_process.execFileSync("sw_vers", ["-productVersion"]).toString().trim(); - } catch { - } - throw new Error(`The "esbuild" package cannot be installed because ${os3} is too outdated. - -The Go compiler (which esbuild relies on) no longer supports ${os3}, -which means the "esbuild" binary executable can't be run. You can either: - - * Update your version of macOS to one that the Go compiler supports - * Use the "esbuild-wasm" package instead of the "esbuild" package - * Build esbuild yourself using an older version of the Go compiler -`); - } - throw err; - } - if (stdout !== versionFromPackageJSON) { - throw new Error(`Expected ${JSON.stringify(versionFromPackageJSON)} but got ${JSON.stringify(stdout)}`); - } -} -function isYarn() { - const { npm_config_user_agent } = process.env; - if (npm_config_user_agent) { - return /\byarn\//.test(npm_config_user_agent); - } - return false; -} -function fetch(url) { - return new Promise((resolve, reject) => { - https.get(url, (res) => { - if ((res.statusCode === 301 || res.statusCode === 302) && res.headers.location) - return fetch(res.headers.location).then(resolve, reject); - if (res.statusCode !== 200) - return reject(new Error(`Server responded with ${res.statusCode}`)); - let chunks = []; - res.on("data", (chunk) => chunks.push(chunk)); - res.on("end", () => resolve(Buffer.concat(chunks))); - }).on("error", reject); - }); -} -function extractFileFromTarGzip(buffer, subpath) { - try { - buffer = zlib.unzipSync(buffer); - } catch (err) { - throw new Error(`Invalid gzip data in archive: ${err && err.message || err}`); - } - let str = (i, n) => String.fromCharCode(...buffer.subarray(i, i + n)).replace(/\0.*$/, ""); - let offset = 0; - subpath = `package/${subpath}`; - while (offset < buffer.length) { - let name = str(offset, 100); - let size = parseInt(str(offset + 124, 12), 8); - offset += 512; - if (!isNaN(size)) { - if (name === subpath) return buffer.subarray(offset, offset + size); - offset += size + 511 & ~511; - } - } - throw new Error(`Could not find ${JSON.stringify(subpath)} in archive`); -} -function installUsingNPM(pkg, subpath, binPath) { - const env = { ...process.env, npm_config_global: void 0 }; - const esbuildLibDir = path2.dirname(require.resolve("esbuild")); - const installDir = path2.join(esbuildLibDir, "npm-install"); - fs2.mkdirSync(installDir); - try { - fs2.writeFileSync(path2.join(installDir, "package.json"), "{}"); - child_process.execSync( - `npm install --loglevel=error --prefer-offline --no-audit --progress=false ${pkg}@${versionFromPackageJSON}`, - { cwd: installDir, stdio: "pipe", env } - ); - const installedBinPath = path2.join(installDir, "node_modules", pkg, subpath); - fs2.renameSync(installedBinPath, binPath); - } finally { - try { - removeRecursive(installDir); - } catch { - } - } -} -function removeRecursive(dir) { - for (const entry of fs2.readdirSync(dir)) { - const entryPath = path2.join(dir, entry); - let stats; - try { - stats = fs2.lstatSync(entryPath); - } catch { - continue; - } - if (stats.isDirectory()) removeRecursive(entryPath); - else fs2.unlinkSync(entryPath); - } - fs2.rmdirSync(dir); -} -function applyManualBinaryPathOverride(overridePath) { - const pathString = JSON.stringify(overridePath); - fs2.writeFileSync(toPath, `#!/usr/bin/env node -require('child_process').execFileSync(${pathString}, process.argv.slice(2), { stdio: 'inherit' }); -`); - const libMain = path2.join(__dirname, "lib", "main.js"); - const code = fs2.readFileSync(libMain, "utf8"); - fs2.writeFileSync(libMain, `var ESBUILD_BINARY_PATH = ${pathString}; -${code}`); -} -function maybeOptimizePackage(binPath) { - const { isWASM } = pkgAndSubpathForCurrentPlatform(); - if (os2.platform() !== "win32" && !isYarn() && !isWASM) { - const tempPath = path2.join(__dirname, "bin-esbuild"); - try { - fs2.linkSync(binPath, tempPath); - fs2.renameSync(tempPath, toPath); - isToPathJS = false; - fs2.unlinkSync(tempPath); - } catch { - } - } -} -async function downloadDirectlyFromNPM(pkg, subpath, binPath) { - const url = `https://registry.npmjs.org/${pkg}/-/${pkg.replace("@esbuild/", "")}-${versionFromPackageJSON}.tgz`; - console.error(`[esbuild] Trying to download ${JSON.stringify(url)}`); - try { - fs2.writeFileSync(binPath, extractFileFromTarGzip(await fetch(url), subpath)); - fs2.chmodSync(binPath, 493); - } catch (e) { - console.error(`[esbuild] Failed to download ${JSON.stringify(url)}: ${e && e.message || e}`); - throw e; - } -} -async function checkAndPreparePackage() { - if (isValidBinaryPath(ESBUILD_BINARY_PATH)) { - if (!fs2.existsSync(ESBUILD_BINARY_PATH)) { - console.warn(`[esbuild] Ignoring bad configuration: ESBUILD_BINARY_PATH=${ESBUILD_BINARY_PATH}`); - } else { - applyManualBinaryPathOverride(ESBUILD_BINARY_PATH); - return; - } - } - const { pkg, subpath } = pkgAndSubpathForCurrentPlatform(); - let binPath; - try { - binPath = require.resolve(`${pkg}/${subpath}`); - } catch (e) { - console.error(`[esbuild] Failed to find package "${pkg}" on the file system - -This can happen if you use the "--no-optional" flag. The "optionalDependencies" -package.json feature is used by esbuild to install the correct binary executable -for your current platform. This install script will now attempt to work around -this. If that fails, you need to remove the "--no-optional" flag to use esbuild. -`); - binPath = downloadedBinPath(pkg, subpath); - try { - console.error(`[esbuild] Trying to install package "${pkg}" using npm`); - installUsingNPM(pkg, subpath, binPath); - } catch (e2) { - console.error(`[esbuild] Failed to install package "${pkg}" using npm: ${e2 && e2.message || e2}`); - try { - await downloadDirectlyFromNPM(pkg, subpath, binPath); - } catch (e3) { - throw new Error(`Failed to install package "${pkg}"`); - } - } - } - maybeOptimizePackage(binPath); -} -checkAndPreparePackage().then(() => { - if (isToPathJS) { - validateBinaryVersion(process.execPath, toPath); - } else { - validateBinaryVersion(toPath); - } -}); diff --git a/node_modules/esbuild/lib/main.d.ts b/node_modules/esbuild/lib/main.d.ts deleted file mode 100644 index 9e69c39..0000000 --- a/node_modules/esbuild/lib/main.d.ts +++ /dev/null @@ -1,716 +0,0 @@ -export type Platform = 'browser' | 'node' | 'neutral' -export type Format = 'iife' | 'cjs' | 'esm' -export type Loader = 'base64' | 'binary' | 'copy' | 'css' | 'dataurl' | 'default' | 'empty' | 'file' | 'js' | 'json' | 'jsx' | 'local-css' | 'text' | 'ts' | 'tsx' -export type LogLevel = 'verbose' | 'debug' | 'info' | 'warning' | 'error' | 'silent' -export type Charset = 'ascii' | 'utf8' -export type Drop = 'console' | 'debugger' -export type AbsPaths = 'code' | 'log' | 'metafile' - -interface CommonOptions { - /** Documentation: https://esbuild.github.io/api/#sourcemap */ - sourcemap?: boolean | 'linked' | 'inline' | 'external' | 'both' - /** Documentation: https://esbuild.github.io/api/#legal-comments */ - legalComments?: 'none' | 'inline' | 'eof' | 'linked' | 'external' - /** Documentation: https://esbuild.github.io/api/#source-root */ - sourceRoot?: string - /** Documentation: https://esbuild.github.io/api/#sources-content */ - sourcesContent?: boolean - - /** Documentation: https://esbuild.github.io/api/#format */ - format?: Format - /** Documentation: https://esbuild.github.io/api/#global-name */ - globalName?: string - /** Documentation: https://esbuild.github.io/api/#target */ - target?: string | string[] - /** Documentation: https://esbuild.github.io/api/#supported */ - supported?: Record - /** Documentation: https://esbuild.github.io/api/#platform */ - platform?: Platform - - /** Documentation: https://esbuild.github.io/api/#mangle-props */ - mangleProps?: RegExp - /** Documentation: https://esbuild.github.io/api/#mangle-props */ - reserveProps?: RegExp - /** Documentation: https://esbuild.github.io/api/#mangle-props */ - mangleQuoted?: boolean - /** Documentation: https://esbuild.github.io/api/#mangle-props */ - mangleCache?: Record - /** Documentation: https://esbuild.github.io/api/#drop */ - drop?: Drop[] - /** Documentation: https://esbuild.github.io/api/#drop-labels */ - dropLabels?: string[] - /** Documentation: https://esbuild.github.io/api/#minify */ - minify?: boolean - /** Documentation: https://esbuild.github.io/api/#minify */ - minifyWhitespace?: boolean - /** Documentation: https://esbuild.github.io/api/#minify */ - minifyIdentifiers?: boolean - /** Documentation: https://esbuild.github.io/api/#minify */ - minifySyntax?: boolean - /** Documentation: https://esbuild.github.io/api/#line-limit */ - lineLimit?: number - /** Documentation: https://esbuild.github.io/api/#charset */ - charset?: Charset - /** Documentation: https://esbuild.github.io/api/#tree-shaking */ - treeShaking?: boolean - /** Documentation: https://esbuild.github.io/api/#ignore-annotations */ - ignoreAnnotations?: boolean - - /** Documentation: https://esbuild.github.io/api/#jsx */ - jsx?: 'transform' | 'preserve' | 'automatic' - /** Documentation: https://esbuild.github.io/api/#jsx-factory */ - jsxFactory?: string - /** Documentation: https://esbuild.github.io/api/#jsx-fragment */ - jsxFragment?: string - /** Documentation: https://esbuild.github.io/api/#jsx-import-source */ - jsxImportSource?: string - /** Documentation: https://esbuild.github.io/api/#jsx-development */ - jsxDev?: boolean - /** Documentation: https://esbuild.github.io/api/#jsx-side-effects */ - jsxSideEffects?: boolean - - /** Documentation: https://esbuild.github.io/api/#define */ - define?: { [key: string]: string } - /** Documentation: https://esbuild.github.io/api/#pure */ - pure?: string[] - /** Documentation: https://esbuild.github.io/api/#keep-names */ - keepNames?: boolean - - /** Documentation: https://esbuild.github.io/api/#abs-paths */ - absPaths?: AbsPaths[] - /** Documentation: https://esbuild.github.io/api/#color */ - color?: boolean - /** Documentation: https://esbuild.github.io/api/#log-level */ - logLevel?: LogLevel - /** Documentation: https://esbuild.github.io/api/#log-limit */ - logLimit?: number - /** Documentation: https://esbuild.github.io/api/#log-override */ - logOverride?: Record - - /** Documentation: https://esbuild.github.io/api/#tsconfig-raw */ - tsconfigRaw?: string | TsconfigRaw -} - -export interface TsconfigRaw { - compilerOptions?: { - alwaysStrict?: boolean - baseUrl?: string - experimentalDecorators?: boolean - importsNotUsedAsValues?: 'remove' | 'preserve' | 'error' - jsx?: 'preserve' | 'react-native' | 'react' | 'react-jsx' | 'react-jsxdev' - jsxFactory?: string - jsxFragmentFactory?: string - jsxImportSource?: string - paths?: Record - preserveValueImports?: boolean - strict?: boolean - target?: string - useDefineForClassFields?: boolean - verbatimModuleSyntax?: boolean - } -} - -export interface BuildOptions extends CommonOptions { - /** Documentation: https://esbuild.github.io/api/#bundle */ - bundle?: boolean - /** Documentation: https://esbuild.github.io/api/#splitting */ - splitting?: boolean - /** Documentation: https://esbuild.github.io/api/#preserve-symlinks */ - preserveSymlinks?: boolean - /** Documentation: https://esbuild.github.io/api/#outfile */ - outfile?: string - /** Documentation: https://esbuild.github.io/api/#metafile */ - metafile?: boolean - /** Documentation: https://esbuild.github.io/api/#outdir */ - outdir?: string - /** Documentation: https://esbuild.github.io/api/#outbase */ - outbase?: string - /** Documentation: https://esbuild.github.io/api/#external */ - external?: string[] - /** Documentation: https://esbuild.github.io/api/#packages */ - packages?: 'bundle' | 'external' - /** Documentation: https://esbuild.github.io/api/#alias */ - alias?: Record - /** Documentation: https://esbuild.github.io/api/#loader */ - loader?: { [ext: string]: Loader } - /** Documentation: https://esbuild.github.io/api/#resolve-extensions */ - resolveExtensions?: string[] - /** Documentation: https://esbuild.github.io/api/#main-fields */ - mainFields?: string[] - /** Documentation: https://esbuild.github.io/api/#conditions */ - conditions?: string[] - /** Documentation: https://esbuild.github.io/api/#write */ - write?: boolean - /** Documentation: https://esbuild.github.io/api/#allow-overwrite */ - allowOverwrite?: boolean - /** Documentation: https://esbuild.github.io/api/#tsconfig */ - tsconfig?: string - /** Documentation: https://esbuild.github.io/api/#out-extension */ - outExtension?: { [ext: string]: string } - /** Documentation: https://esbuild.github.io/api/#public-path */ - publicPath?: string - /** Documentation: https://esbuild.github.io/api/#entry-names */ - entryNames?: string - /** Documentation: https://esbuild.github.io/api/#chunk-names */ - chunkNames?: string - /** Documentation: https://esbuild.github.io/api/#asset-names */ - assetNames?: string - /** Documentation: https://esbuild.github.io/api/#inject */ - inject?: string[] - /** Documentation: https://esbuild.github.io/api/#banner */ - banner?: { [type: string]: string } - /** Documentation: https://esbuild.github.io/api/#footer */ - footer?: { [type: string]: string } - /** Documentation: https://esbuild.github.io/api/#entry-points */ - entryPoints?: (string | { in: string, out: string })[] | Record - /** Documentation: https://esbuild.github.io/api/#stdin */ - stdin?: StdinOptions - /** Documentation: https://esbuild.github.io/plugins/ */ - plugins?: Plugin[] - /** Documentation: https://esbuild.github.io/api/#working-directory */ - absWorkingDir?: string - /** Documentation: https://esbuild.github.io/api/#node-paths */ - nodePaths?: string[]; // The "NODE_PATH" variable from Node.js -} - -export interface StdinOptions { - contents: string | Uint8Array - resolveDir?: string - sourcefile?: string - loader?: Loader -} - -export interface Message { - id: string - pluginName: string - text: string - location: Location | null - notes: Note[] - - /** - * Optional user-specified data that is passed through unmodified. You can - * use this to stash the original error, for example. - */ - detail: any -} - -export interface Note { - text: string - location: Location | null -} - -export interface Location { - file: string - namespace: string - /** 1-based */ - line: number - /** 0-based, in bytes */ - column: number - /** in bytes */ - length: number - lineText: string - suggestion: string -} - -export interface OutputFile { - path: string - contents: Uint8Array - hash: string - /** "contents" as text (changes automatically with "contents") */ - readonly text: string -} - -export interface BuildResult { - errors: Message[] - warnings: Message[] - /** Only when "write: false" */ - outputFiles: OutputFile[] | (ProvidedOptions['write'] extends false ? never : undefined) - /** Only when "metafile: true" */ - metafile: Metafile | (ProvidedOptions['metafile'] extends true ? never : undefined) - /** Only when "mangleCache" is present */ - mangleCache: Record | (ProvidedOptions['mangleCache'] extends Object ? never : undefined) -} - -export interface BuildFailure extends Error { - errors: Message[] - warnings: Message[] -} - -/** Documentation: https://esbuild.github.io/api/#serve-arguments */ -export interface ServeOptions { - port?: number - host?: string - servedir?: string - keyfile?: string - certfile?: string - fallback?: string - cors?: CORSOptions - onRequest?: (args: ServeOnRequestArgs) => void -} - -/** Documentation: https://esbuild.github.io/api/#cors */ -export interface CORSOptions { - origin?: string | string[] -} - -export interface ServeOnRequestArgs { - remoteAddress: string - method: string - path: string - status: number - /** The time to generate the response, not to send it */ - timeInMS: number -} - -/** Documentation: https://esbuild.github.io/api/#serve-return-values */ -export interface ServeResult { - port: number - hosts: string[] -} - -export interface TransformOptions extends CommonOptions { - /** Documentation: https://esbuild.github.io/api/#sourcefile */ - sourcefile?: string - /** Documentation: https://esbuild.github.io/api/#loader */ - loader?: Loader - /** Documentation: https://esbuild.github.io/api/#banner */ - banner?: string - /** Documentation: https://esbuild.github.io/api/#footer */ - footer?: string -} - -export interface TransformResult { - code: string - map: string - warnings: Message[] - /** Only when "mangleCache" is present */ - mangleCache: Record | (ProvidedOptions['mangleCache'] extends Object ? never : undefined) - /** Only when "legalComments" is "external" */ - legalComments: string | (ProvidedOptions['legalComments'] extends 'external' ? never : undefined) -} - -export interface TransformFailure extends Error { - errors: Message[] - warnings: Message[] -} - -export interface Plugin { - name: string - setup: (build: PluginBuild) => (void | Promise) -} - -export interface PluginBuild { - /** Documentation: https://esbuild.github.io/plugins/#build-options */ - initialOptions: BuildOptions - - /** Documentation: https://esbuild.github.io/plugins/#resolve */ - resolve(path: string, options?: ResolveOptions): Promise - - /** Documentation: https://esbuild.github.io/plugins/#on-start */ - onStart(callback: () => - (OnStartResult | null | void | Promise)): void - - /** Documentation: https://esbuild.github.io/plugins/#on-end */ - onEnd(callback: (result: BuildResult) => - (OnEndResult | null | void | Promise)): void - - /** Documentation: https://esbuild.github.io/plugins/#on-resolve */ - onResolve(options: OnResolveOptions, callback: (args: OnResolveArgs) => - (OnResolveResult | null | undefined | Promise)): void - - /** Documentation: https://esbuild.github.io/plugins/#on-load */ - onLoad(options: OnLoadOptions, callback: (args: OnLoadArgs) => - (OnLoadResult | null | undefined | Promise)): void - - /** Documentation: https://esbuild.github.io/plugins/#on-dispose */ - onDispose(callback: () => void): void - - // This is a full copy of the esbuild library in case you need it - esbuild: { - context: typeof context, - build: typeof build, - buildSync: typeof buildSync, - transform: typeof transform, - transformSync: typeof transformSync, - formatMessages: typeof formatMessages, - formatMessagesSync: typeof formatMessagesSync, - analyzeMetafile: typeof analyzeMetafile, - analyzeMetafileSync: typeof analyzeMetafileSync, - initialize: typeof initialize, - version: typeof version, - } -} - -/** Documentation: https://esbuild.github.io/plugins/#resolve-options */ -export interface ResolveOptions { - pluginName?: string - importer?: string - namespace?: string - resolveDir?: string - kind?: ImportKind - pluginData?: any - with?: Record -} - -/** Documentation: https://esbuild.github.io/plugins/#resolve-results */ -export interface ResolveResult { - errors: Message[] - warnings: Message[] - - path: string - external: boolean - sideEffects: boolean - namespace: string - suffix: string - pluginData: any -} - -export interface OnStartResult { - errors?: PartialMessage[] - warnings?: PartialMessage[] -} - -export interface OnEndResult { - errors?: PartialMessage[] - warnings?: PartialMessage[] -} - -/** Documentation: https://esbuild.github.io/plugins/#on-resolve-options */ -export interface OnResolveOptions { - filter: RegExp - namespace?: string -} - -/** Documentation: https://esbuild.github.io/plugins/#on-resolve-arguments */ -export interface OnResolveArgs { - path: string - importer: string - namespace: string - resolveDir: string - kind: ImportKind - pluginData: any - with: Record -} - -export type ImportKind = - | 'entry-point' - - // JS - | 'import-statement' - | 'require-call' - | 'dynamic-import' - | 'require-resolve' - - // CSS - | 'import-rule' - | 'composes-from' - | 'url-token' - -/** Documentation: https://esbuild.github.io/plugins/#on-resolve-results */ -export interface OnResolveResult { - pluginName?: string - - errors?: PartialMessage[] - warnings?: PartialMessage[] - - path?: string - external?: boolean - sideEffects?: boolean - namespace?: string - suffix?: string - pluginData?: any - - watchFiles?: string[] - watchDirs?: string[] -} - -/** Documentation: https://esbuild.github.io/plugins/#on-load-options */ -export interface OnLoadOptions { - filter: RegExp - namespace?: string -} - -/** Documentation: https://esbuild.github.io/plugins/#on-load-arguments */ -export interface OnLoadArgs { - path: string - namespace: string - suffix: string - pluginData: any - with: Record -} - -/** Documentation: https://esbuild.github.io/plugins/#on-load-results */ -export interface OnLoadResult { - pluginName?: string - - errors?: PartialMessage[] - warnings?: PartialMessage[] - - contents?: string | Uint8Array - resolveDir?: string - loader?: Loader - pluginData?: any - - watchFiles?: string[] - watchDirs?: string[] -} - -export interface PartialMessage { - id?: string - pluginName?: string - text?: string - location?: Partial | null - notes?: PartialNote[] - detail?: any -} - -export interface PartialNote { - text?: string - location?: Partial | null -} - -/** Documentation: https://esbuild.github.io/api/#metafile */ -export interface Metafile { - inputs: { - [path: string]: { - bytes: number - imports: { - path: string - kind: ImportKind - external?: boolean - original?: string - with?: Record - }[] - format?: 'cjs' | 'esm' - with?: Record - } - } - outputs: { - [path: string]: { - bytes: number - inputs: { - [path: string]: { - bytesInOutput: number - } - } - imports: { - path: string - kind: ImportKind | 'file-loader' - external?: boolean - }[] - exports: string[] - entryPoint?: string - cssBundle?: string - } - } -} - -export interface FormatMessagesOptions { - kind: 'error' | 'warning' - color?: boolean - terminalWidth?: number -} - -export interface AnalyzeMetafileOptions { - color?: boolean - verbose?: boolean -} - -/** Documentation: https://esbuild.github.io/api/#watch-arguments */ -export interface WatchOptions { - delay?: number // In milliseconds -} - -export interface BuildContext { - /** Documentation: https://esbuild.github.io/api/#rebuild */ - rebuild(): Promise> - - /** Documentation: https://esbuild.github.io/api/#watch */ - watch(options?: WatchOptions): Promise - - /** Documentation: https://esbuild.github.io/api/#serve */ - serve(options?: ServeOptions): Promise - - cancel(): Promise - dispose(): Promise -} - -// This is a TypeScript type-level function which replaces any keys in "In" -// that aren't in "Out" with "never". We use this to reject properties with -// typos in object literals. See: https://stackoverflow.com/questions/49580725 -type SameShape = In & { [Key in Exclude]: never } - -/** - * This function invokes the "esbuild" command-line tool for you. It returns a - * promise that either resolves with a "BuildResult" object or rejects with a - * "BuildFailure" object. - * - * - Works in node: yes - * - Works in browser: yes - * - * Documentation: https://esbuild.github.io/api/#build - */ -export declare function build(options: SameShape): Promise> - -/** - * This is the advanced long-running form of "build" that supports additional - * features such as watch mode and a local development server. - * - * - Works in node: yes - * - Works in browser: no - * - * Documentation: https://esbuild.github.io/api/#build - */ -export declare function context(options: SameShape): Promise> - -/** - * This function transforms a single JavaScript file. It can be used to minify - * JavaScript, convert TypeScript/JSX to JavaScript, or convert newer JavaScript - * to older JavaScript. It returns a promise that is either resolved with a - * "TransformResult" object or rejected with a "TransformFailure" object. - * - * - Works in node: yes - * - Works in browser: yes - * - * Documentation: https://esbuild.github.io/api/#transform - */ -export declare function transform(input: string | Uint8Array, options?: SameShape): Promise> - -/** - * Converts log messages to formatted message strings suitable for printing in - * the terminal. This allows you to reuse the built-in behavior of esbuild's - * log message formatter. This is a batch-oriented API for efficiency. - * - * - Works in node: yes - * - Works in browser: yes - */ -export declare function formatMessages(messages: PartialMessage[], options: FormatMessagesOptions): Promise - -/** - * Pretty-prints an analysis of the metafile JSON to a string. This is just for - * convenience to be able to match esbuild's pretty-printing exactly. If you want - * to customize it, you can just inspect the data in the metafile yourself. - * - * - Works in node: yes - * - Works in browser: yes - * - * Documentation: https://esbuild.github.io/api/#analyze - */ -export declare function analyzeMetafile(metafile: Metafile | string, options?: AnalyzeMetafileOptions): Promise - -/** - * A synchronous version of "build". - * - * - Works in node: yes - * - Works in browser: no - * - * Documentation: https://esbuild.github.io/api/#build - */ -export declare function buildSync(options: SameShape): BuildResult - -/** - * A synchronous version of "transform". - * - * - Works in node: yes - * - Works in browser: no - * - * Documentation: https://esbuild.github.io/api/#transform - */ -export declare function transformSync(input: string | Uint8Array, options?: SameShape): TransformResult - -/** - * A synchronous version of "formatMessages". - * - * - Works in node: yes - * - Works in browser: no - */ -export declare function formatMessagesSync(messages: PartialMessage[], options: FormatMessagesOptions): string[] - -/** - * A synchronous version of "analyzeMetafile". - * - * - Works in node: yes - * - Works in browser: no - * - * Documentation: https://esbuild.github.io/api/#analyze - */ -export declare function analyzeMetafileSync(metafile: Metafile | string, options?: AnalyzeMetafileOptions): string - -/** - * This configures the browser-based version of esbuild. It is necessary to - * call this first and wait for the returned promise to be resolved before - * making other API calls when using esbuild in the browser. - * - * - Works in node: yes - * - Works in browser: yes ("options" is required) - * - * Documentation: https://esbuild.github.io/api/#browser - */ -export declare function initialize(options: InitializeOptions): Promise - -export interface InitializeOptions { - /** - * The URL of the "esbuild.wasm" file. This must be provided when running - * esbuild in the browser. - */ - wasmURL?: string | URL - - /** - * The result of calling "new WebAssembly.Module(buffer)" where "buffer" - * is a typed array or ArrayBuffer containing the binary code of the - * "esbuild.wasm" file. - * - * You can use this as an alternative to "wasmURL" for environments where it's - * not possible to download the WebAssembly module. - */ - wasmModule?: WebAssembly.Module - - /** - * By default esbuild runs the WebAssembly-based browser API in a web worker - * to avoid blocking the UI thread. This can be disabled by setting "worker" - * to false. - */ - worker?: boolean -} - -export let version: string - -// Call this function to terminate esbuild's child process. The child process -// is not terminated and re-created after each API call because it's more -// efficient to keep it around when there are multiple API calls. -// -// In node this happens automatically before the parent node process exits. So -// you only need to call this if you know you will not make any more esbuild -// API calls and you want to clean up resources. -// -// Unlike node, Deno lacks the necessary APIs to clean up child processes -// automatically. You must manually call stop() in Deno when you're done -// using esbuild or Deno will continue running forever. -// -// Another reason you might want to call this is if you are using esbuild from -// within a Deno test. Deno fails tests that create a child process without -// killing it before the test ends, so you have to call this function (and -// await the returned promise) in every Deno test that uses esbuild. -export declare function stop(): Promise - -// Note: These declarations exist to avoid type errors when you omit "dom" from -// "lib" in your "tsconfig.json" file. TypeScript confusingly declares the -// global "WebAssembly" type in "lib.dom.d.ts" even though it has nothing to do -// with the browser DOM and is present in many non-browser JavaScript runtimes -// (e.g. node and deno). Declaring it here allows esbuild's API to be used in -// these scenarios. -// -// There's an open issue about getting this problem corrected (although these -// declarations will need to remain even if this is fixed for backward -// compatibility with older TypeScript versions): -// -// https://github.com/microsoft/TypeScript-DOM-lib-generator/issues/826 -// -declare global { - namespace WebAssembly { - interface Module { - } - } - interface URL { - } -} diff --git a/node_modules/esbuild/lib/main.js b/node_modules/esbuild/lib/main.js deleted file mode 100644 index de88f8e..0000000 --- a/node_modules/esbuild/lib/main.js +++ /dev/null @@ -1,2242 +0,0 @@ -"use strict"; -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); - -// lib/npm/node.ts -var node_exports = {}; -__export(node_exports, { - analyzeMetafile: () => analyzeMetafile, - analyzeMetafileSync: () => analyzeMetafileSync, - build: () => build, - buildSync: () => buildSync, - context: () => context, - default: () => node_default, - formatMessages: () => formatMessages, - formatMessagesSync: () => formatMessagesSync, - initialize: () => initialize, - stop: () => stop, - transform: () => transform, - transformSync: () => transformSync, - version: () => version -}); -module.exports = __toCommonJS(node_exports); - -// lib/shared/stdio_protocol.ts -function encodePacket(packet) { - let visit = (value) => { - if (value === null) { - bb.write8(0); - } else if (typeof value === "boolean") { - bb.write8(1); - bb.write8(+value); - } else if (typeof value === "number") { - bb.write8(2); - bb.write32(value | 0); - } else if (typeof value === "string") { - bb.write8(3); - bb.write(encodeUTF8(value)); - } else if (value instanceof Uint8Array) { - bb.write8(4); - bb.write(value); - } else if (value instanceof Array) { - bb.write8(5); - bb.write32(value.length); - for (let item of value) { - visit(item); - } - } else { - let keys = Object.keys(value); - bb.write8(6); - bb.write32(keys.length); - for (let key of keys) { - bb.write(encodeUTF8(key)); - visit(value[key]); - } - } - }; - let bb = new ByteBuffer(); - bb.write32(0); - bb.write32(packet.id << 1 | +!packet.isRequest); - visit(packet.value); - writeUInt32LE(bb.buf, bb.len - 4, 0); - return bb.buf.subarray(0, bb.len); -} -function decodePacket(bytes) { - let visit = () => { - switch (bb.read8()) { - case 0: - return null; - case 1: - return !!bb.read8(); - case 2: - return bb.read32(); - case 3: - return decodeUTF8(bb.read()); - case 4: - return bb.read(); - case 5: { - let count = bb.read32(); - let value2 = []; - for (let i = 0; i < count; i++) { - value2.push(visit()); - } - return value2; - } - case 6: { - let count = bb.read32(); - let value2 = {}; - for (let i = 0; i < count; i++) { - value2[decodeUTF8(bb.read())] = visit(); - } - return value2; - } - default: - throw new Error("Invalid packet"); - } - }; - let bb = new ByteBuffer(bytes); - let id = bb.read32(); - let isRequest = (id & 1) === 0; - id >>>= 1; - let value = visit(); - if (bb.ptr !== bytes.length) { - throw new Error("Invalid packet"); - } - return { id, isRequest, value }; -} -var ByteBuffer = class { - constructor(buf = new Uint8Array(1024)) { - this.buf = buf; - this.len = 0; - this.ptr = 0; - } - _write(delta) { - if (this.len + delta > this.buf.length) { - let clone = new Uint8Array((this.len + delta) * 2); - clone.set(this.buf); - this.buf = clone; - } - this.len += delta; - return this.len - delta; - } - write8(value) { - let offset = this._write(1); - this.buf[offset] = value; - } - write32(value) { - let offset = this._write(4); - writeUInt32LE(this.buf, value, offset); - } - write(bytes) { - let offset = this._write(4 + bytes.length); - writeUInt32LE(this.buf, bytes.length, offset); - this.buf.set(bytes, offset + 4); - } - _read(delta) { - if (this.ptr + delta > this.buf.length) { - throw new Error("Invalid packet"); - } - this.ptr += delta; - return this.ptr - delta; - } - read8() { - return this.buf[this._read(1)]; - } - read32() { - return readUInt32LE(this.buf, this._read(4)); - } - read() { - let length = this.read32(); - let bytes = new Uint8Array(length); - let ptr = this._read(bytes.length); - bytes.set(this.buf.subarray(ptr, ptr + length)); - return bytes; - } -}; -var encodeUTF8; -var decodeUTF8; -var encodeInvariant; -if (typeof TextEncoder !== "undefined" && typeof TextDecoder !== "undefined") { - let encoder = new TextEncoder(); - let decoder = new TextDecoder(); - encodeUTF8 = (text) => encoder.encode(text); - decodeUTF8 = (bytes) => decoder.decode(bytes); - encodeInvariant = 'new TextEncoder().encode("")'; -} else if (typeof Buffer !== "undefined") { - encodeUTF8 = (text) => Buffer.from(text); - decodeUTF8 = (bytes) => { - let { buffer, byteOffset, byteLength } = bytes; - return Buffer.from(buffer, byteOffset, byteLength).toString(); - }; - encodeInvariant = 'Buffer.from("")'; -} else { - throw new Error("No UTF-8 codec found"); -} -if (!(encodeUTF8("") instanceof Uint8Array)) - throw new Error(`Invariant violation: "${encodeInvariant} instanceof Uint8Array" is incorrectly false - -This indicates that your JavaScript environment is broken. You cannot use -esbuild in this environment because esbuild relies on this invariant. This -is not a problem with esbuild. You need to fix your environment instead. -`); -function readUInt32LE(buffer, offset) { - return buffer[offset++] | buffer[offset++] << 8 | buffer[offset++] << 16 | buffer[offset++] << 24; -} -function writeUInt32LE(buffer, value, offset) { - buffer[offset++] = value; - buffer[offset++] = value >> 8; - buffer[offset++] = value >> 16; - buffer[offset++] = value >> 24; -} - -// lib/shared/common.ts -var quote = JSON.stringify; -var buildLogLevelDefault = "warning"; -var transformLogLevelDefault = "silent"; -function validateAndJoinStringArray(values, what) { - const toJoin = []; - for (const value of values) { - validateStringValue(value, what); - if (value.indexOf(",") >= 0) throw new Error(`Invalid ${what}: ${value}`); - toJoin.push(value); - } - return toJoin.join(","); -} -var canBeAnything = () => null; -var mustBeBoolean = (value) => typeof value === "boolean" ? null : "a boolean"; -var mustBeString = (value) => typeof value === "string" ? null : "a string"; -var mustBeRegExp = (value) => value instanceof RegExp ? null : "a RegExp object"; -var mustBeInteger = (value) => typeof value === "number" && value === (value | 0) ? null : "an integer"; -var mustBeValidPortNumber = (value) => typeof value === "number" && value === (value | 0) && value >= 0 && value <= 65535 ? null : "a valid port number"; -var mustBeFunction = (value) => typeof value === "function" ? null : "a function"; -var mustBeArray = (value) => Array.isArray(value) ? null : "an array"; -var mustBeArrayOfStrings = (value) => Array.isArray(value) && value.every((x) => typeof x === "string") ? null : "an array of strings"; -var mustBeObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value) ? null : "an object"; -var mustBeEntryPoints = (value) => typeof value === "object" && value !== null ? null : "an array or an object"; -var mustBeWebAssemblyModule = (value) => value instanceof WebAssembly.Module ? null : "a WebAssembly.Module"; -var mustBeObjectOrNull = (value) => typeof value === "object" && !Array.isArray(value) ? null : "an object or null"; -var mustBeStringOrBoolean = (value) => typeof value === "string" || typeof value === "boolean" ? null : "a string or a boolean"; -var mustBeStringOrObject = (value) => typeof value === "string" || typeof value === "object" && value !== null && !Array.isArray(value) ? null : "a string or an object"; -var mustBeStringOrArrayOfStrings = (value) => typeof value === "string" || Array.isArray(value) && value.every((x) => typeof x === "string") ? null : "a string or an array of strings"; -var mustBeStringOrUint8Array = (value) => typeof value === "string" || value instanceof Uint8Array ? null : "a string or a Uint8Array"; -var mustBeStringOrURL = (value) => typeof value === "string" || value instanceof URL ? null : "a string or a URL"; -function getFlag(object, keys, key, mustBeFn) { - let value = object[key]; - keys[key + ""] = true; - if (value === void 0) return void 0; - let mustBe = mustBeFn(value); - if (mustBe !== null) throw new Error(`${quote(key)} must be ${mustBe}`); - return value; -} -function checkForInvalidFlags(object, keys, where) { - for (let key in object) { - if (!(key in keys)) { - throw new Error(`Invalid option ${where}: ${quote(key)}`); - } - } -} -function validateInitializeOptions(options) { - let keys = /* @__PURE__ */ Object.create(null); - let wasmURL = getFlag(options, keys, "wasmURL", mustBeStringOrURL); - let wasmModule = getFlag(options, keys, "wasmModule", mustBeWebAssemblyModule); - let worker = getFlag(options, keys, "worker", mustBeBoolean); - checkForInvalidFlags(options, keys, "in initialize() call"); - return { - wasmURL, - wasmModule, - worker - }; -} -function validateMangleCache(mangleCache) { - let validated; - if (mangleCache !== void 0) { - validated = /* @__PURE__ */ Object.create(null); - for (let key in mangleCache) { - let value = mangleCache[key]; - if (typeof value === "string" || value === false) { - validated[key] = value; - } else { - throw new Error(`Expected ${quote(key)} in mangle cache to map to either a string or false`); - } - } - } - return validated; -} -function pushLogFlags(flags, options, keys, isTTY2, logLevelDefault) { - let color = getFlag(options, keys, "color", mustBeBoolean); - let logLevel = getFlag(options, keys, "logLevel", mustBeString); - let logLimit = getFlag(options, keys, "logLimit", mustBeInteger); - if (color !== void 0) flags.push(`--color=${color}`); - else if (isTTY2) flags.push(`--color=true`); - flags.push(`--log-level=${logLevel || logLevelDefault}`); - flags.push(`--log-limit=${logLimit || 0}`); -} -function validateStringValue(value, what, key) { - if (typeof value !== "string") { - throw new Error(`Expected value for ${what}${key !== void 0 ? " " + quote(key) : ""} to be a string, got ${typeof value} instead`); - } - return value; -} -function pushCommonFlags(flags, options, keys) { - let legalComments = getFlag(options, keys, "legalComments", mustBeString); - let sourceRoot = getFlag(options, keys, "sourceRoot", mustBeString); - let sourcesContent = getFlag(options, keys, "sourcesContent", mustBeBoolean); - let target = getFlag(options, keys, "target", mustBeStringOrArrayOfStrings); - let format = getFlag(options, keys, "format", mustBeString); - let globalName = getFlag(options, keys, "globalName", mustBeString); - let mangleProps = getFlag(options, keys, "mangleProps", mustBeRegExp); - let reserveProps = getFlag(options, keys, "reserveProps", mustBeRegExp); - let mangleQuoted = getFlag(options, keys, "mangleQuoted", mustBeBoolean); - let minify = getFlag(options, keys, "minify", mustBeBoolean); - let minifySyntax = getFlag(options, keys, "minifySyntax", mustBeBoolean); - let minifyWhitespace = getFlag(options, keys, "minifyWhitespace", mustBeBoolean); - let minifyIdentifiers = getFlag(options, keys, "minifyIdentifiers", mustBeBoolean); - let lineLimit = getFlag(options, keys, "lineLimit", mustBeInteger); - let drop = getFlag(options, keys, "drop", mustBeArrayOfStrings); - let dropLabels = getFlag(options, keys, "dropLabels", mustBeArrayOfStrings); - let charset = getFlag(options, keys, "charset", mustBeString); - let treeShaking = getFlag(options, keys, "treeShaking", mustBeBoolean); - let ignoreAnnotations = getFlag(options, keys, "ignoreAnnotations", mustBeBoolean); - let jsx = getFlag(options, keys, "jsx", mustBeString); - let jsxFactory = getFlag(options, keys, "jsxFactory", mustBeString); - let jsxFragment = getFlag(options, keys, "jsxFragment", mustBeString); - let jsxImportSource = getFlag(options, keys, "jsxImportSource", mustBeString); - let jsxDev = getFlag(options, keys, "jsxDev", mustBeBoolean); - let jsxSideEffects = getFlag(options, keys, "jsxSideEffects", mustBeBoolean); - let define = getFlag(options, keys, "define", mustBeObject); - let logOverride = getFlag(options, keys, "logOverride", mustBeObject); - let supported = getFlag(options, keys, "supported", mustBeObject); - let pure = getFlag(options, keys, "pure", mustBeArrayOfStrings); - let keepNames = getFlag(options, keys, "keepNames", mustBeBoolean); - let platform = getFlag(options, keys, "platform", mustBeString); - let tsconfigRaw = getFlag(options, keys, "tsconfigRaw", mustBeStringOrObject); - let absPaths = getFlag(options, keys, "absPaths", mustBeArrayOfStrings); - if (legalComments) flags.push(`--legal-comments=${legalComments}`); - if (sourceRoot !== void 0) flags.push(`--source-root=${sourceRoot}`); - if (sourcesContent !== void 0) flags.push(`--sources-content=${sourcesContent}`); - if (target) flags.push(`--target=${validateAndJoinStringArray(Array.isArray(target) ? target : [target], "target")}`); - if (format) flags.push(`--format=${format}`); - if (globalName) flags.push(`--global-name=${globalName}`); - if (platform) flags.push(`--platform=${platform}`); - if (tsconfigRaw) flags.push(`--tsconfig-raw=${typeof tsconfigRaw === "string" ? tsconfigRaw : JSON.stringify(tsconfigRaw)}`); - if (minify) flags.push("--minify"); - if (minifySyntax) flags.push("--minify-syntax"); - if (minifyWhitespace) flags.push("--minify-whitespace"); - if (minifyIdentifiers) flags.push("--minify-identifiers"); - if (lineLimit) flags.push(`--line-limit=${lineLimit}`); - if (charset) flags.push(`--charset=${charset}`); - if (treeShaking !== void 0) flags.push(`--tree-shaking=${treeShaking}`); - if (ignoreAnnotations) flags.push(`--ignore-annotations`); - if (drop) for (let what of drop) flags.push(`--drop:${validateStringValue(what, "drop")}`); - if (dropLabels) flags.push(`--drop-labels=${validateAndJoinStringArray(dropLabels, "drop label")}`); - if (absPaths) flags.push(`--abs-paths=${validateAndJoinStringArray(absPaths, "abs paths")}`); - if (mangleProps) flags.push(`--mangle-props=${jsRegExpToGoRegExp(mangleProps)}`); - if (reserveProps) flags.push(`--reserve-props=${jsRegExpToGoRegExp(reserveProps)}`); - if (mangleQuoted !== void 0) flags.push(`--mangle-quoted=${mangleQuoted}`); - if (jsx) flags.push(`--jsx=${jsx}`); - if (jsxFactory) flags.push(`--jsx-factory=${jsxFactory}`); - if (jsxFragment) flags.push(`--jsx-fragment=${jsxFragment}`); - if (jsxImportSource) flags.push(`--jsx-import-source=${jsxImportSource}`); - if (jsxDev) flags.push(`--jsx-dev`); - if (jsxSideEffects) flags.push(`--jsx-side-effects`); - if (define) { - for (let key in define) { - if (key.indexOf("=") >= 0) throw new Error(`Invalid define: ${key}`); - flags.push(`--define:${key}=${validateStringValue(define[key], "define", key)}`); - } - } - if (logOverride) { - for (let key in logOverride) { - if (key.indexOf("=") >= 0) throw new Error(`Invalid log override: ${key}`); - flags.push(`--log-override:${key}=${validateStringValue(logOverride[key], "log override", key)}`); - } - } - if (supported) { - for (let key in supported) { - if (key.indexOf("=") >= 0) throw new Error(`Invalid supported: ${key}`); - const value = supported[key]; - if (typeof value !== "boolean") throw new Error(`Expected value for supported ${quote(key)} to be a boolean, got ${typeof value} instead`); - flags.push(`--supported:${key}=${value}`); - } - } - if (pure) for (let fn of pure) flags.push(`--pure:${validateStringValue(fn, "pure")}`); - if (keepNames) flags.push(`--keep-names`); -} -function flagsForBuildOptions(callName, options, isTTY2, logLevelDefault, writeDefault) { - var _a2; - let flags = []; - let entries = []; - let keys = /* @__PURE__ */ Object.create(null); - let stdinContents = null; - let stdinResolveDir = null; - pushLogFlags(flags, options, keys, isTTY2, logLevelDefault); - pushCommonFlags(flags, options, keys); - let sourcemap = getFlag(options, keys, "sourcemap", mustBeStringOrBoolean); - let bundle = getFlag(options, keys, "bundle", mustBeBoolean); - let splitting = getFlag(options, keys, "splitting", mustBeBoolean); - let preserveSymlinks = getFlag(options, keys, "preserveSymlinks", mustBeBoolean); - let metafile = getFlag(options, keys, "metafile", mustBeBoolean); - let outfile = getFlag(options, keys, "outfile", mustBeString); - let outdir = getFlag(options, keys, "outdir", mustBeString); - let outbase = getFlag(options, keys, "outbase", mustBeString); - let tsconfig = getFlag(options, keys, "tsconfig", mustBeString); - let resolveExtensions = getFlag(options, keys, "resolveExtensions", mustBeArrayOfStrings); - let nodePathsInput = getFlag(options, keys, "nodePaths", mustBeArrayOfStrings); - let mainFields = getFlag(options, keys, "mainFields", mustBeArrayOfStrings); - let conditions = getFlag(options, keys, "conditions", mustBeArrayOfStrings); - let external = getFlag(options, keys, "external", mustBeArrayOfStrings); - let packages = getFlag(options, keys, "packages", mustBeString); - let alias = getFlag(options, keys, "alias", mustBeObject); - let loader = getFlag(options, keys, "loader", mustBeObject); - let outExtension = getFlag(options, keys, "outExtension", mustBeObject); - let publicPath = getFlag(options, keys, "publicPath", mustBeString); - let entryNames = getFlag(options, keys, "entryNames", mustBeString); - let chunkNames = getFlag(options, keys, "chunkNames", mustBeString); - let assetNames = getFlag(options, keys, "assetNames", mustBeString); - let inject = getFlag(options, keys, "inject", mustBeArrayOfStrings); - let banner = getFlag(options, keys, "banner", mustBeObject); - let footer = getFlag(options, keys, "footer", mustBeObject); - let entryPoints = getFlag(options, keys, "entryPoints", mustBeEntryPoints); - let absWorkingDir = getFlag(options, keys, "absWorkingDir", mustBeString); - let stdin = getFlag(options, keys, "stdin", mustBeObject); - let write = (_a2 = getFlag(options, keys, "write", mustBeBoolean)) != null ? _a2 : writeDefault; - let allowOverwrite = getFlag(options, keys, "allowOverwrite", mustBeBoolean); - let mangleCache = getFlag(options, keys, "mangleCache", mustBeObject); - keys.plugins = true; - checkForInvalidFlags(options, keys, `in ${callName}() call`); - if (sourcemap) flags.push(`--sourcemap${sourcemap === true ? "" : `=${sourcemap}`}`); - if (bundle) flags.push("--bundle"); - if (allowOverwrite) flags.push("--allow-overwrite"); - if (splitting) flags.push("--splitting"); - if (preserveSymlinks) flags.push("--preserve-symlinks"); - if (metafile) flags.push(`--metafile`); - if (outfile) flags.push(`--outfile=${outfile}`); - if (outdir) flags.push(`--outdir=${outdir}`); - if (outbase) flags.push(`--outbase=${outbase}`); - if (tsconfig) flags.push(`--tsconfig=${tsconfig}`); - if (packages) flags.push(`--packages=${packages}`); - if (resolveExtensions) flags.push(`--resolve-extensions=${validateAndJoinStringArray(resolveExtensions, "resolve extension")}`); - if (publicPath) flags.push(`--public-path=${publicPath}`); - if (entryNames) flags.push(`--entry-names=${entryNames}`); - if (chunkNames) flags.push(`--chunk-names=${chunkNames}`); - if (assetNames) flags.push(`--asset-names=${assetNames}`); - if (mainFields) flags.push(`--main-fields=${validateAndJoinStringArray(mainFields, "main field")}`); - if (conditions) flags.push(`--conditions=${validateAndJoinStringArray(conditions, "condition")}`); - if (external) for (let name of external) flags.push(`--external:${validateStringValue(name, "external")}`); - if (alias) { - for (let old in alias) { - if (old.indexOf("=") >= 0) throw new Error(`Invalid package name in alias: ${old}`); - flags.push(`--alias:${old}=${validateStringValue(alias[old], "alias", old)}`); - } - } - if (banner) { - for (let type in banner) { - if (type.indexOf("=") >= 0) throw new Error(`Invalid banner file type: ${type}`); - flags.push(`--banner:${type}=${validateStringValue(banner[type], "banner", type)}`); - } - } - if (footer) { - for (let type in footer) { - if (type.indexOf("=") >= 0) throw new Error(`Invalid footer file type: ${type}`); - flags.push(`--footer:${type}=${validateStringValue(footer[type], "footer", type)}`); - } - } - if (inject) for (let path3 of inject) flags.push(`--inject:${validateStringValue(path3, "inject")}`); - if (loader) { - for (let ext in loader) { - if (ext.indexOf("=") >= 0) throw new Error(`Invalid loader extension: ${ext}`); - flags.push(`--loader:${ext}=${validateStringValue(loader[ext], "loader", ext)}`); - } - } - if (outExtension) { - for (let ext in outExtension) { - if (ext.indexOf("=") >= 0) throw new Error(`Invalid out extension: ${ext}`); - flags.push(`--out-extension:${ext}=${validateStringValue(outExtension[ext], "out extension", ext)}`); - } - } - if (entryPoints) { - if (Array.isArray(entryPoints)) { - for (let i = 0, n = entryPoints.length; i < n; i++) { - let entryPoint = entryPoints[i]; - if (typeof entryPoint === "object" && entryPoint !== null) { - let entryPointKeys = /* @__PURE__ */ Object.create(null); - let input = getFlag(entryPoint, entryPointKeys, "in", mustBeString); - let output = getFlag(entryPoint, entryPointKeys, "out", mustBeString); - checkForInvalidFlags(entryPoint, entryPointKeys, "in entry point at index " + i); - if (input === void 0) throw new Error('Missing property "in" for entry point at index ' + i); - if (output === void 0) throw new Error('Missing property "out" for entry point at index ' + i); - entries.push([output, input]); - } else { - entries.push(["", validateStringValue(entryPoint, "entry point at index " + i)]); - } - } - } else { - for (let key in entryPoints) { - entries.push([key, validateStringValue(entryPoints[key], "entry point", key)]); - } - } - } - if (stdin) { - let stdinKeys = /* @__PURE__ */ Object.create(null); - let contents = getFlag(stdin, stdinKeys, "contents", mustBeStringOrUint8Array); - let resolveDir = getFlag(stdin, stdinKeys, "resolveDir", mustBeString); - let sourcefile = getFlag(stdin, stdinKeys, "sourcefile", mustBeString); - let loader2 = getFlag(stdin, stdinKeys, "loader", mustBeString); - checkForInvalidFlags(stdin, stdinKeys, 'in "stdin" object'); - if (sourcefile) flags.push(`--sourcefile=${sourcefile}`); - if (loader2) flags.push(`--loader=${loader2}`); - if (resolveDir) stdinResolveDir = resolveDir; - if (typeof contents === "string") stdinContents = encodeUTF8(contents); - else if (contents instanceof Uint8Array) stdinContents = contents; - } - let nodePaths = []; - if (nodePathsInput) { - for (let value of nodePathsInput) { - value += ""; - nodePaths.push(value); - } - } - return { - entries, - flags, - write, - stdinContents, - stdinResolveDir, - absWorkingDir, - nodePaths, - mangleCache: validateMangleCache(mangleCache) - }; -} -function flagsForTransformOptions(callName, options, isTTY2, logLevelDefault) { - let flags = []; - let keys = /* @__PURE__ */ Object.create(null); - pushLogFlags(flags, options, keys, isTTY2, logLevelDefault); - pushCommonFlags(flags, options, keys); - let sourcemap = getFlag(options, keys, "sourcemap", mustBeStringOrBoolean); - let sourcefile = getFlag(options, keys, "sourcefile", mustBeString); - let loader = getFlag(options, keys, "loader", mustBeString); - let banner = getFlag(options, keys, "banner", mustBeString); - let footer = getFlag(options, keys, "footer", mustBeString); - let mangleCache = getFlag(options, keys, "mangleCache", mustBeObject); - checkForInvalidFlags(options, keys, `in ${callName}() call`); - if (sourcemap) flags.push(`--sourcemap=${sourcemap === true ? "external" : sourcemap}`); - if (sourcefile) flags.push(`--sourcefile=${sourcefile}`); - if (loader) flags.push(`--loader=${loader}`); - if (banner) flags.push(`--banner=${banner}`); - if (footer) flags.push(`--footer=${footer}`); - return { - flags, - mangleCache: validateMangleCache(mangleCache) - }; -} -function createChannel(streamIn) { - const requestCallbacksByKey = {}; - const closeData = { didClose: false, reason: "" }; - let responseCallbacks = {}; - let nextRequestID = 0; - let nextBuildKey = 0; - let stdout = new Uint8Array(16 * 1024); - let stdoutUsed = 0; - let readFromStdout = (chunk) => { - let limit = stdoutUsed + chunk.length; - if (limit > stdout.length) { - let swap = new Uint8Array(limit * 2); - swap.set(stdout); - stdout = swap; - } - stdout.set(chunk, stdoutUsed); - stdoutUsed += chunk.length; - let offset = 0; - while (offset + 4 <= stdoutUsed) { - let length = readUInt32LE(stdout, offset); - if (offset + 4 + length > stdoutUsed) { - break; - } - offset += 4; - handleIncomingPacket(stdout.subarray(offset, offset + length)); - offset += length; - } - if (offset > 0) { - stdout.copyWithin(0, offset, stdoutUsed); - stdoutUsed -= offset; - } - }; - let afterClose = (error) => { - closeData.didClose = true; - if (error) closeData.reason = ": " + (error.message || error); - const text = "The service was stopped" + closeData.reason; - for (let id in responseCallbacks) { - responseCallbacks[id](text, null); - } - responseCallbacks = {}; - }; - let sendRequest = (refs, value, callback) => { - if (closeData.didClose) return callback("The service is no longer running" + closeData.reason, null); - let id = nextRequestID++; - responseCallbacks[id] = (error, response) => { - try { - callback(error, response); - } finally { - if (refs) refs.unref(); - } - }; - if (refs) refs.ref(); - streamIn.writeToStdin(encodePacket({ id, isRequest: true, value })); - }; - let sendResponse = (id, value) => { - if (closeData.didClose) throw new Error("The service is no longer running" + closeData.reason); - streamIn.writeToStdin(encodePacket({ id, isRequest: false, value })); - }; - let handleRequest = async (id, request) => { - try { - if (request.command === "ping") { - sendResponse(id, {}); - return; - } - if (typeof request.key === "number") { - const requestCallbacks = requestCallbacksByKey[request.key]; - if (!requestCallbacks) { - return; - } - const callback = requestCallbacks[request.command]; - if (callback) { - await callback(id, request); - return; - } - } - throw new Error(`Invalid command: ` + request.command); - } catch (e) { - const errors = [extractErrorMessageV8(e, streamIn, null, void 0, "")]; - try { - sendResponse(id, { errors }); - } catch { - } - } - }; - let isFirstPacket = true; - let handleIncomingPacket = (bytes) => { - if (isFirstPacket) { - isFirstPacket = false; - let binaryVersion = String.fromCharCode(...bytes); - if (binaryVersion !== "0.25.9") { - throw new Error(`Cannot start service: Host version "${"0.25.9"}" does not match binary version ${quote(binaryVersion)}`); - } - return; - } - let packet = decodePacket(bytes); - if (packet.isRequest) { - handleRequest(packet.id, packet.value); - } else { - let callback = responseCallbacks[packet.id]; - delete responseCallbacks[packet.id]; - if (packet.value.error) callback(packet.value.error, {}); - else callback(null, packet.value); - } - }; - let buildOrContext = ({ callName, refs, options, isTTY: isTTY2, defaultWD: defaultWD2, callback }) => { - let refCount = 0; - const buildKey = nextBuildKey++; - const requestCallbacks = {}; - const buildRefs = { - ref() { - if (++refCount === 1) { - if (refs) refs.ref(); - } - }, - unref() { - if (--refCount === 0) { - delete requestCallbacksByKey[buildKey]; - if (refs) refs.unref(); - } - } - }; - requestCallbacksByKey[buildKey] = requestCallbacks; - buildRefs.ref(); - buildOrContextImpl( - callName, - buildKey, - sendRequest, - sendResponse, - buildRefs, - streamIn, - requestCallbacks, - options, - isTTY2, - defaultWD2, - (err, res) => { - try { - callback(err, res); - } finally { - buildRefs.unref(); - } - } - ); - }; - let transform2 = ({ callName, refs, input, options, isTTY: isTTY2, fs: fs3, callback }) => { - const details = createObjectStash(); - let start = (inputPath) => { - try { - if (typeof input !== "string" && !(input instanceof Uint8Array)) - throw new Error('The input to "transform" must be a string or a Uint8Array'); - let { - flags, - mangleCache - } = flagsForTransformOptions(callName, options, isTTY2, transformLogLevelDefault); - let request = { - command: "transform", - flags, - inputFS: inputPath !== null, - input: inputPath !== null ? encodeUTF8(inputPath) : typeof input === "string" ? encodeUTF8(input) : input - }; - if (mangleCache) request.mangleCache = mangleCache; - sendRequest(refs, request, (error, response) => { - if (error) return callback(new Error(error), null); - let errors = replaceDetailsInMessages(response.errors, details); - let warnings = replaceDetailsInMessages(response.warnings, details); - let outstanding = 1; - let next = () => { - if (--outstanding === 0) { - let result = { - warnings, - code: response.code, - map: response.map, - mangleCache: void 0, - legalComments: void 0 - }; - if ("legalComments" in response) result.legalComments = response == null ? void 0 : response.legalComments; - if (response.mangleCache) result.mangleCache = response == null ? void 0 : response.mangleCache; - callback(null, result); - } - }; - if (errors.length > 0) return callback(failureErrorWithLog("Transform failed", errors, warnings), null); - if (response.codeFS) { - outstanding++; - fs3.readFile(response.code, (err, contents) => { - if (err !== null) { - callback(err, null); - } else { - response.code = contents; - next(); - } - }); - } - if (response.mapFS) { - outstanding++; - fs3.readFile(response.map, (err, contents) => { - if (err !== null) { - callback(err, null); - } else { - response.map = contents; - next(); - } - }); - } - next(); - }); - } catch (e) { - let flags = []; - try { - pushLogFlags(flags, options, {}, isTTY2, transformLogLevelDefault); - } catch { - } - const error = extractErrorMessageV8(e, streamIn, details, void 0, ""); - sendRequest(refs, { command: "error", flags, error }, () => { - error.detail = details.load(error.detail); - callback(failureErrorWithLog("Transform failed", [error], []), null); - }); - } - }; - if ((typeof input === "string" || input instanceof Uint8Array) && input.length > 1024 * 1024) { - let next = start; - start = () => fs3.writeFile(input, next); - } - start(null); - }; - let formatMessages2 = ({ callName, refs, messages, options, callback }) => { - if (!options) throw new Error(`Missing second argument in ${callName}() call`); - let keys = {}; - let kind = getFlag(options, keys, "kind", mustBeString); - let color = getFlag(options, keys, "color", mustBeBoolean); - let terminalWidth = getFlag(options, keys, "terminalWidth", mustBeInteger); - checkForInvalidFlags(options, keys, `in ${callName}() call`); - if (kind === void 0) throw new Error(`Missing "kind" in ${callName}() call`); - if (kind !== "error" && kind !== "warning") throw new Error(`Expected "kind" to be "error" or "warning" in ${callName}() call`); - let request = { - command: "format-msgs", - messages: sanitizeMessages(messages, "messages", null, "", terminalWidth), - isWarning: kind === "warning" - }; - if (color !== void 0) request.color = color; - if (terminalWidth !== void 0) request.terminalWidth = terminalWidth; - sendRequest(refs, request, (error, response) => { - if (error) return callback(new Error(error), null); - callback(null, response.messages); - }); - }; - let analyzeMetafile2 = ({ callName, refs, metafile, options, callback }) => { - if (options === void 0) options = {}; - let keys = {}; - let color = getFlag(options, keys, "color", mustBeBoolean); - let verbose = getFlag(options, keys, "verbose", mustBeBoolean); - checkForInvalidFlags(options, keys, `in ${callName}() call`); - let request = { - command: "analyze-metafile", - metafile - }; - if (color !== void 0) request.color = color; - if (verbose !== void 0) request.verbose = verbose; - sendRequest(refs, request, (error, response) => { - if (error) return callback(new Error(error), null); - callback(null, response.result); - }); - }; - return { - readFromStdout, - afterClose, - service: { - buildOrContext, - transform: transform2, - formatMessages: formatMessages2, - analyzeMetafile: analyzeMetafile2 - } - }; -} -function buildOrContextImpl(callName, buildKey, sendRequest, sendResponse, refs, streamIn, requestCallbacks, options, isTTY2, defaultWD2, callback) { - const details = createObjectStash(); - const isContext = callName === "context"; - const handleError = (e, pluginName) => { - const flags = []; - try { - pushLogFlags(flags, options, {}, isTTY2, buildLogLevelDefault); - } catch { - } - const message = extractErrorMessageV8(e, streamIn, details, void 0, pluginName); - sendRequest(refs, { command: "error", flags, error: message }, () => { - message.detail = details.load(message.detail); - callback(failureErrorWithLog(isContext ? "Context failed" : "Build failed", [message], []), null); - }); - }; - let plugins; - if (typeof options === "object") { - const value = options.plugins; - if (value !== void 0) { - if (!Array.isArray(value)) return handleError(new Error(`"plugins" must be an array`), ""); - plugins = value; - } - } - if (plugins && plugins.length > 0) { - if (streamIn.isSync) return handleError(new Error("Cannot use plugins in synchronous API calls"), ""); - handlePlugins( - buildKey, - sendRequest, - sendResponse, - refs, - streamIn, - requestCallbacks, - options, - plugins, - details - ).then( - (result) => { - if (!result.ok) return handleError(result.error, result.pluginName); - try { - buildOrContextContinue(result.requestPlugins, result.runOnEndCallbacks, result.scheduleOnDisposeCallbacks); - } catch (e) { - handleError(e, ""); - } - }, - (e) => handleError(e, "") - ); - return; - } - try { - buildOrContextContinue(null, (result, done) => done([], []), () => { - }); - } catch (e) { - handleError(e, ""); - } - function buildOrContextContinue(requestPlugins, runOnEndCallbacks, scheduleOnDisposeCallbacks) { - const writeDefault = streamIn.hasFS; - const { - entries, - flags, - write, - stdinContents, - stdinResolveDir, - absWorkingDir, - nodePaths, - mangleCache - } = flagsForBuildOptions(callName, options, isTTY2, buildLogLevelDefault, writeDefault); - if (write && !streamIn.hasFS) throw new Error(`The "write" option is unavailable in this environment`); - const request = { - command: "build", - key: buildKey, - entries, - flags, - write, - stdinContents, - stdinResolveDir, - absWorkingDir: absWorkingDir || defaultWD2, - nodePaths, - context: isContext - }; - if (requestPlugins) request.plugins = requestPlugins; - if (mangleCache) request.mangleCache = mangleCache; - const buildResponseToResult = (response, callback2) => { - const result = { - errors: replaceDetailsInMessages(response.errors, details), - warnings: replaceDetailsInMessages(response.warnings, details), - outputFiles: void 0, - metafile: void 0, - mangleCache: void 0 - }; - const originalErrors = result.errors.slice(); - const originalWarnings = result.warnings.slice(); - if (response.outputFiles) result.outputFiles = response.outputFiles.map(convertOutputFiles); - if (response.metafile) result.metafile = JSON.parse(response.metafile); - if (response.mangleCache) result.mangleCache = response.mangleCache; - if (response.writeToStdout !== void 0) console.log(decodeUTF8(response.writeToStdout).replace(/\n$/, "")); - runOnEndCallbacks(result, (onEndErrors, onEndWarnings) => { - if (originalErrors.length > 0 || onEndErrors.length > 0) { - const error = failureErrorWithLog("Build failed", originalErrors.concat(onEndErrors), originalWarnings.concat(onEndWarnings)); - return callback2(error, null, onEndErrors, onEndWarnings); - } - callback2(null, result, onEndErrors, onEndWarnings); - }); - }; - let latestResultPromise; - let provideLatestResult; - if (isContext) - requestCallbacks["on-end"] = (id, request2) => new Promise((resolve) => { - buildResponseToResult(request2, (err, result, onEndErrors, onEndWarnings) => { - const response = { - errors: onEndErrors, - warnings: onEndWarnings - }; - if (provideLatestResult) provideLatestResult(err, result); - latestResultPromise = void 0; - provideLatestResult = void 0; - sendResponse(id, response); - resolve(); - }); - }); - sendRequest(refs, request, (error, response) => { - if (error) return callback(new Error(error), null); - if (!isContext) { - return buildResponseToResult(response, (err, res) => { - scheduleOnDisposeCallbacks(); - return callback(err, res); - }); - } - if (response.errors.length > 0) { - return callback(failureErrorWithLog("Context failed", response.errors, response.warnings), null); - } - let didDispose = false; - const result = { - rebuild: () => { - if (!latestResultPromise) latestResultPromise = new Promise((resolve, reject) => { - let settlePromise; - provideLatestResult = (err, result2) => { - if (!settlePromise) settlePromise = () => err ? reject(err) : resolve(result2); - }; - const triggerAnotherBuild = () => { - const request2 = { - command: "rebuild", - key: buildKey - }; - sendRequest(refs, request2, (error2, response2) => { - if (error2) { - reject(new Error(error2)); - } else if (settlePromise) { - settlePromise(); - } else { - triggerAnotherBuild(); - } - }); - }; - triggerAnotherBuild(); - }); - return latestResultPromise; - }, - watch: (options2 = {}) => new Promise((resolve, reject) => { - if (!streamIn.hasFS) throw new Error(`Cannot use the "watch" API in this environment`); - const keys = {}; - const delay = getFlag(options2, keys, "delay", mustBeInteger); - checkForInvalidFlags(options2, keys, `in watch() call`); - const request2 = { - command: "watch", - key: buildKey - }; - if (delay) request2.delay = delay; - sendRequest(refs, request2, (error2) => { - if (error2) reject(new Error(error2)); - else resolve(void 0); - }); - }), - serve: (options2 = {}) => new Promise((resolve, reject) => { - if (!streamIn.hasFS) throw new Error(`Cannot use the "serve" API in this environment`); - const keys = {}; - const port = getFlag(options2, keys, "port", mustBeValidPortNumber); - const host = getFlag(options2, keys, "host", mustBeString); - const servedir = getFlag(options2, keys, "servedir", mustBeString); - const keyfile = getFlag(options2, keys, "keyfile", mustBeString); - const certfile = getFlag(options2, keys, "certfile", mustBeString); - const fallback = getFlag(options2, keys, "fallback", mustBeString); - const cors = getFlag(options2, keys, "cors", mustBeObject); - const onRequest = getFlag(options2, keys, "onRequest", mustBeFunction); - checkForInvalidFlags(options2, keys, `in serve() call`); - const request2 = { - command: "serve", - key: buildKey, - onRequest: !!onRequest - }; - if (port !== void 0) request2.port = port; - if (host !== void 0) request2.host = host; - if (servedir !== void 0) request2.servedir = servedir; - if (keyfile !== void 0) request2.keyfile = keyfile; - if (certfile !== void 0) request2.certfile = certfile; - if (fallback !== void 0) request2.fallback = fallback; - if (cors) { - const corsKeys = {}; - const origin = getFlag(cors, corsKeys, "origin", mustBeStringOrArrayOfStrings); - checkForInvalidFlags(cors, corsKeys, `on "cors" object`); - if (Array.isArray(origin)) request2.corsOrigin = origin; - else if (origin !== void 0) request2.corsOrigin = [origin]; - } - sendRequest(refs, request2, (error2, response2) => { - if (error2) return reject(new Error(error2)); - if (onRequest) { - requestCallbacks["serve-request"] = (id, request3) => { - onRequest(request3.args); - sendResponse(id, {}); - }; - } - resolve(response2); - }); - }), - cancel: () => new Promise((resolve) => { - if (didDispose) return resolve(); - const request2 = { - command: "cancel", - key: buildKey - }; - sendRequest(refs, request2, () => { - resolve(); - }); - }), - dispose: () => new Promise((resolve) => { - if (didDispose) return resolve(); - didDispose = true; - const request2 = { - command: "dispose", - key: buildKey - }; - sendRequest(refs, request2, () => { - resolve(); - scheduleOnDisposeCallbacks(); - refs.unref(); - }); - }) - }; - refs.ref(); - callback(null, result); - }); - } -} -var handlePlugins = async (buildKey, sendRequest, sendResponse, refs, streamIn, requestCallbacks, initialOptions, plugins, details) => { - let onStartCallbacks = []; - let onEndCallbacks = []; - let onResolveCallbacks = {}; - let onLoadCallbacks = {}; - let onDisposeCallbacks = []; - let nextCallbackID = 0; - let i = 0; - let requestPlugins = []; - let isSetupDone = false; - plugins = [...plugins]; - for (let item of plugins) { - let keys = {}; - if (typeof item !== "object") throw new Error(`Plugin at index ${i} must be an object`); - const name = getFlag(item, keys, "name", mustBeString); - if (typeof name !== "string" || name === "") throw new Error(`Plugin at index ${i} is missing a name`); - try { - let setup = getFlag(item, keys, "setup", mustBeFunction); - if (typeof setup !== "function") throw new Error(`Plugin is missing a setup function`); - checkForInvalidFlags(item, keys, `on plugin ${quote(name)}`); - let plugin = { - name, - onStart: false, - onEnd: false, - onResolve: [], - onLoad: [] - }; - i++; - let resolve = (path3, options = {}) => { - if (!isSetupDone) throw new Error('Cannot call "resolve" before plugin setup has completed'); - if (typeof path3 !== "string") throw new Error(`The path to resolve must be a string`); - let keys2 = /* @__PURE__ */ Object.create(null); - let pluginName = getFlag(options, keys2, "pluginName", mustBeString); - let importer = getFlag(options, keys2, "importer", mustBeString); - let namespace = getFlag(options, keys2, "namespace", mustBeString); - let resolveDir = getFlag(options, keys2, "resolveDir", mustBeString); - let kind = getFlag(options, keys2, "kind", mustBeString); - let pluginData = getFlag(options, keys2, "pluginData", canBeAnything); - let importAttributes = getFlag(options, keys2, "with", mustBeObject); - checkForInvalidFlags(options, keys2, "in resolve() call"); - return new Promise((resolve2, reject) => { - const request = { - command: "resolve", - path: path3, - key: buildKey, - pluginName: name - }; - if (pluginName != null) request.pluginName = pluginName; - if (importer != null) request.importer = importer; - if (namespace != null) request.namespace = namespace; - if (resolveDir != null) request.resolveDir = resolveDir; - if (kind != null) request.kind = kind; - else throw new Error(`Must specify "kind" when calling "resolve"`); - if (pluginData != null) request.pluginData = details.store(pluginData); - if (importAttributes != null) request.with = sanitizeStringMap(importAttributes, "with"); - sendRequest(refs, request, (error, response) => { - if (error !== null) reject(new Error(error)); - else resolve2({ - errors: replaceDetailsInMessages(response.errors, details), - warnings: replaceDetailsInMessages(response.warnings, details), - path: response.path, - external: response.external, - sideEffects: response.sideEffects, - namespace: response.namespace, - suffix: response.suffix, - pluginData: details.load(response.pluginData) - }); - }); - }); - }; - let promise = setup({ - initialOptions, - resolve, - onStart(callback) { - let registeredText = `This error came from the "onStart" callback registered here:`; - let registeredNote = extractCallerV8(new Error(registeredText), streamIn, "onStart"); - onStartCallbacks.push({ name, callback, note: registeredNote }); - plugin.onStart = true; - }, - onEnd(callback) { - let registeredText = `This error came from the "onEnd" callback registered here:`; - let registeredNote = extractCallerV8(new Error(registeredText), streamIn, "onEnd"); - onEndCallbacks.push({ name, callback, note: registeredNote }); - plugin.onEnd = true; - }, - onResolve(options, callback) { - let registeredText = `This error came from the "onResolve" callback registered here:`; - let registeredNote = extractCallerV8(new Error(registeredText), streamIn, "onResolve"); - let keys2 = {}; - let filter = getFlag(options, keys2, "filter", mustBeRegExp); - let namespace = getFlag(options, keys2, "namespace", mustBeString); - checkForInvalidFlags(options, keys2, `in onResolve() call for plugin ${quote(name)}`); - if (filter == null) throw new Error(`onResolve() call is missing a filter`); - let id = nextCallbackID++; - onResolveCallbacks[id] = { name, callback, note: registeredNote }; - plugin.onResolve.push({ id, filter: jsRegExpToGoRegExp(filter), namespace: namespace || "" }); - }, - onLoad(options, callback) { - let registeredText = `This error came from the "onLoad" callback registered here:`; - let registeredNote = extractCallerV8(new Error(registeredText), streamIn, "onLoad"); - let keys2 = {}; - let filter = getFlag(options, keys2, "filter", mustBeRegExp); - let namespace = getFlag(options, keys2, "namespace", mustBeString); - checkForInvalidFlags(options, keys2, `in onLoad() call for plugin ${quote(name)}`); - if (filter == null) throw new Error(`onLoad() call is missing a filter`); - let id = nextCallbackID++; - onLoadCallbacks[id] = { name, callback, note: registeredNote }; - plugin.onLoad.push({ id, filter: jsRegExpToGoRegExp(filter), namespace: namespace || "" }); - }, - onDispose(callback) { - onDisposeCallbacks.push(callback); - }, - esbuild: streamIn.esbuild - }); - if (promise) await promise; - requestPlugins.push(plugin); - } catch (e) { - return { ok: false, error: e, pluginName: name }; - } - } - requestCallbacks["on-start"] = async (id, request) => { - details.clear(); - let response = { errors: [], warnings: [] }; - await Promise.all(onStartCallbacks.map(async ({ name, callback, note }) => { - try { - let result = await callback(); - if (result != null) { - if (typeof result !== "object") throw new Error(`Expected onStart() callback in plugin ${quote(name)} to return an object`); - let keys = {}; - let errors = getFlag(result, keys, "errors", mustBeArray); - let warnings = getFlag(result, keys, "warnings", mustBeArray); - checkForInvalidFlags(result, keys, `from onStart() callback in plugin ${quote(name)}`); - if (errors != null) response.errors.push(...sanitizeMessages(errors, "errors", details, name, void 0)); - if (warnings != null) response.warnings.push(...sanitizeMessages(warnings, "warnings", details, name, void 0)); - } - } catch (e) { - response.errors.push(extractErrorMessageV8(e, streamIn, details, note && note(), name)); - } - })); - sendResponse(id, response); - }; - requestCallbacks["on-resolve"] = async (id, request) => { - let response = {}, name = "", callback, note; - for (let id2 of request.ids) { - try { - ({ name, callback, note } = onResolveCallbacks[id2]); - let result = await callback({ - path: request.path, - importer: request.importer, - namespace: request.namespace, - resolveDir: request.resolveDir, - kind: request.kind, - pluginData: details.load(request.pluginData), - with: request.with - }); - if (result != null) { - if (typeof result !== "object") throw new Error(`Expected onResolve() callback in plugin ${quote(name)} to return an object`); - let keys = {}; - let pluginName = getFlag(result, keys, "pluginName", mustBeString); - let path3 = getFlag(result, keys, "path", mustBeString); - let namespace = getFlag(result, keys, "namespace", mustBeString); - let suffix = getFlag(result, keys, "suffix", mustBeString); - let external = getFlag(result, keys, "external", mustBeBoolean); - let sideEffects = getFlag(result, keys, "sideEffects", mustBeBoolean); - let pluginData = getFlag(result, keys, "pluginData", canBeAnything); - let errors = getFlag(result, keys, "errors", mustBeArray); - let warnings = getFlag(result, keys, "warnings", mustBeArray); - let watchFiles = getFlag(result, keys, "watchFiles", mustBeArrayOfStrings); - let watchDirs = getFlag(result, keys, "watchDirs", mustBeArrayOfStrings); - checkForInvalidFlags(result, keys, `from onResolve() callback in plugin ${quote(name)}`); - response.id = id2; - if (pluginName != null) response.pluginName = pluginName; - if (path3 != null) response.path = path3; - if (namespace != null) response.namespace = namespace; - if (suffix != null) response.suffix = suffix; - if (external != null) response.external = external; - if (sideEffects != null) response.sideEffects = sideEffects; - if (pluginData != null) response.pluginData = details.store(pluginData); - if (errors != null) response.errors = sanitizeMessages(errors, "errors", details, name, void 0); - if (warnings != null) response.warnings = sanitizeMessages(warnings, "warnings", details, name, void 0); - if (watchFiles != null) response.watchFiles = sanitizeStringArray(watchFiles, "watchFiles"); - if (watchDirs != null) response.watchDirs = sanitizeStringArray(watchDirs, "watchDirs"); - break; - } - } catch (e) { - response = { id: id2, errors: [extractErrorMessageV8(e, streamIn, details, note && note(), name)] }; - break; - } - } - sendResponse(id, response); - }; - requestCallbacks["on-load"] = async (id, request) => { - let response = {}, name = "", callback, note; - for (let id2 of request.ids) { - try { - ({ name, callback, note } = onLoadCallbacks[id2]); - let result = await callback({ - path: request.path, - namespace: request.namespace, - suffix: request.suffix, - pluginData: details.load(request.pluginData), - with: request.with - }); - if (result != null) { - if (typeof result !== "object") throw new Error(`Expected onLoad() callback in plugin ${quote(name)} to return an object`); - let keys = {}; - let pluginName = getFlag(result, keys, "pluginName", mustBeString); - let contents = getFlag(result, keys, "contents", mustBeStringOrUint8Array); - let resolveDir = getFlag(result, keys, "resolveDir", mustBeString); - let pluginData = getFlag(result, keys, "pluginData", canBeAnything); - let loader = getFlag(result, keys, "loader", mustBeString); - let errors = getFlag(result, keys, "errors", mustBeArray); - let warnings = getFlag(result, keys, "warnings", mustBeArray); - let watchFiles = getFlag(result, keys, "watchFiles", mustBeArrayOfStrings); - let watchDirs = getFlag(result, keys, "watchDirs", mustBeArrayOfStrings); - checkForInvalidFlags(result, keys, `from onLoad() callback in plugin ${quote(name)}`); - response.id = id2; - if (pluginName != null) response.pluginName = pluginName; - if (contents instanceof Uint8Array) response.contents = contents; - else if (contents != null) response.contents = encodeUTF8(contents); - if (resolveDir != null) response.resolveDir = resolveDir; - if (pluginData != null) response.pluginData = details.store(pluginData); - if (loader != null) response.loader = loader; - if (errors != null) response.errors = sanitizeMessages(errors, "errors", details, name, void 0); - if (warnings != null) response.warnings = sanitizeMessages(warnings, "warnings", details, name, void 0); - if (watchFiles != null) response.watchFiles = sanitizeStringArray(watchFiles, "watchFiles"); - if (watchDirs != null) response.watchDirs = sanitizeStringArray(watchDirs, "watchDirs"); - break; - } - } catch (e) { - response = { id: id2, errors: [extractErrorMessageV8(e, streamIn, details, note && note(), name)] }; - break; - } - } - sendResponse(id, response); - }; - let runOnEndCallbacks = (result, done) => done([], []); - if (onEndCallbacks.length > 0) { - runOnEndCallbacks = (result, done) => { - (async () => { - const onEndErrors = []; - const onEndWarnings = []; - for (const { name, callback, note } of onEndCallbacks) { - let newErrors; - let newWarnings; - try { - const value = await callback(result); - if (value != null) { - if (typeof value !== "object") throw new Error(`Expected onEnd() callback in plugin ${quote(name)} to return an object`); - let keys = {}; - let errors = getFlag(value, keys, "errors", mustBeArray); - let warnings = getFlag(value, keys, "warnings", mustBeArray); - checkForInvalidFlags(value, keys, `from onEnd() callback in plugin ${quote(name)}`); - if (errors != null) newErrors = sanitizeMessages(errors, "errors", details, name, void 0); - if (warnings != null) newWarnings = sanitizeMessages(warnings, "warnings", details, name, void 0); - } - } catch (e) { - newErrors = [extractErrorMessageV8(e, streamIn, details, note && note(), name)]; - } - if (newErrors) { - onEndErrors.push(...newErrors); - try { - result.errors.push(...newErrors); - } catch { - } - } - if (newWarnings) { - onEndWarnings.push(...newWarnings); - try { - result.warnings.push(...newWarnings); - } catch { - } - } - } - done(onEndErrors, onEndWarnings); - })(); - }; - } - let scheduleOnDisposeCallbacks = () => { - for (const cb of onDisposeCallbacks) { - setTimeout(() => cb(), 0); - } - }; - isSetupDone = true; - return { - ok: true, - requestPlugins, - runOnEndCallbacks, - scheduleOnDisposeCallbacks - }; -}; -function createObjectStash() { - const map = /* @__PURE__ */ new Map(); - let nextID = 0; - return { - clear() { - map.clear(); - }, - load(id) { - return map.get(id); - }, - store(value) { - if (value === void 0) return -1; - const id = nextID++; - map.set(id, value); - return id; - } - }; -} -function extractCallerV8(e, streamIn, ident) { - let note; - let tried = false; - return () => { - if (tried) return note; - tried = true; - try { - let lines = (e.stack + "").split("\n"); - lines.splice(1, 1); - let location = parseStackLinesV8(streamIn, lines, ident); - if (location) { - note = { text: e.message, location }; - return note; - } - } catch { - } - }; -} -function extractErrorMessageV8(e, streamIn, stash, note, pluginName) { - let text = "Internal error"; - let location = null; - try { - text = (e && e.message || e) + ""; - } catch { - } - try { - location = parseStackLinesV8(streamIn, (e.stack + "").split("\n"), ""); - } catch { - } - return { id: "", pluginName, text, location, notes: note ? [note] : [], detail: stash ? stash.store(e) : -1 }; -} -function parseStackLinesV8(streamIn, lines, ident) { - let at = " at "; - if (streamIn.readFileSync && !lines[0].startsWith(at) && lines[1].startsWith(at)) { - for (let i = 1; i < lines.length; i++) { - let line = lines[i]; - if (!line.startsWith(at)) continue; - line = line.slice(at.length); - while (true) { - let match = /^(?:new |async )?\S+ \((.*)\)$/.exec(line); - if (match) { - line = match[1]; - continue; - } - match = /^eval at \S+ \((.*)\)(?:, \S+:\d+:\d+)?$/.exec(line); - if (match) { - line = match[1]; - continue; - } - match = /^(\S+):(\d+):(\d+)$/.exec(line); - if (match) { - let contents; - try { - contents = streamIn.readFileSync(match[1], "utf8"); - } catch { - break; - } - let lineText = contents.split(/\r\n|\r|\n|\u2028|\u2029/)[+match[2] - 1] || ""; - let column = +match[3] - 1; - let length = lineText.slice(column, column + ident.length) === ident ? ident.length : 0; - return { - file: match[1], - namespace: "file", - line: +match[2], - column: encodeUTF8(lineText.slice(0, column)).length, - length: encodeUTF8(lineText.slice(column, column + length)).length, - lineText: lineText + "\n" + lines.slice(1).join("\n"), - suggestion: "" - }; - } - break; - } - } - } - return null; -} -function failureErrorWithLog(text, errors, warnings) { - let limit = 5; - text += errors.length < 1 ? "" : ` with ${errors.length} error${errors.length < 2 ? "" : "s"}:` + errors.slice(0, limit + 1).map((e, i) => { - if (i === limit) return "\n..."; - if (!e.location) return ` -error: ${e.text}`; - let { file, line, column } = e.location; - let pluginText = e.pluginName ? `[plugin: ${e.pluginName}] ` : ""; - return ` -${file}:${line}:${column}: ERROR: ${pluginText}${e.text}`; - }).join(""); - let error = new Error(text); - for (const [key, value] of [["errors", errors], ["warnings", warnings]]) { - Object.defineProperty(error, key, { - configurable: true, - enumerable: true, - get: () => value, - set: (value2) => Object.defineProperty(error, key, { - configurable: true, - enumerable: true, - value: value2 - }) - }); - } - return error; -} -function replaceDetailsInMessages(messages, stash) { - for (const message of messages) { - message.detail = stash.load(message.detail); - } - return messages; -} -function sanitizeLocation(location, where, terminalWidth) { - if (location == null) return null; - let keys = {}; - let file = getFlag(location, keys, "file", mustBeString); - let namespace = getFlag(location, keys, "namespace", mustBeString); - let line = getFlag(location, keys, "line", mustBeInteger); - let column = getFlag(location, keys, "column", mustBeInteger); - let length = getFlag(location, keys, "length", mustBeInteger); - let lineText = getFlag(location, keys, "lineText", mustBeString); - let suggestion = getFlag(location, keys, "suggestion", mustBeString); - checkForInvalidFlags(location, keys, where); - if (lineText) { - const relevantASCII = lineText.slice( - 0, - (column && column > 0 ? column : 0) + (length && length > 0 ? length : 0) + (terminalWidth && terminalWidth > 0 ? terminalWidth : 80) - ); - if (!/[\x7F-\uFFFF]/.test(relevantASCII) && !/\n/.test(lineText)) { - lineText = relevantASCII; - } - } - return { - file: file || "", - namespace: namespace || "", - line: line || 0, - column: column || 0, - length: length || 0, - lineText: lineText || "", - suggestion: suggestion || "" - }; -} -function sanitizeMessages(messages, property, stash, fallbackPluginName, terminalWidth) { - let messagesClone = []; - let index = 0; - for (const message of messages) { - let keys = {}; - let id = getFlag(message, keys, "id", mustBeString); - let pluginName = getFlag(message, keys, "pluginName", mustBeString); - let text = getFlag(message, keys, "text", mustBeString); - let location = getFlag(message, keys, "location", mustBeObjectOrNull); - let notes = getFlag(message, keys, "notes", mustBeArray); - let detail = getFlag(message, keys, "detail", canBeAnything); - let where = `in element ${index} of "${property}"`; - checkForInvalidFlags(message, keys, where); - let notesClone = []; - if (notes) { - for (const note of notes) { - let noteKeys = {}; - let noteText = getFlag(note, noteKeys, "text", mustBeString); - let noteLocation = getFlag(note, noteKeys, "location", mustBeObjectOrNull); - checkForInvalidFlags(note, noteKeys, where); - notesClone.push({ - text: noteText || "", - location: sanitizeLocation(noteLocation, where, terminalWidth) - }); - } - } - messagesClone.push({ - id: id || "", - pluginName: pluginName || fallbackPluginName, - text: text || "", - location: sanitizeLocation(location, where, terminalWidth), - notes: notesClone, - detail: stash ? stash.store(detail) : -1 - }); - index++; - } - return messagesClone; -} -function sanitizeStringArray(values, property) { - const result = []; - for (const value of values) { - if (typeof value !== "string") throw new Error(`${quote(property)} must be an array of strings`); - result.push(value); - } - return result; -} -function sanitizeStringMap(map, property) { - const result = /* @__PURE__ */ Object.create(null); - for (const key in map) { - const value = map[key]; - if (typeof value !== "string") throw new Error(`key ${quote(key)} in object ${quote(property)} must be a string`); - result[key] = value; - } - return result; -} -function convertOutputFiles({ path: path3, contents, hash }) { - let text = null; - return { - path: path3, - contents, - hash, - get text() { - const binary = this.contents; - if (text === null || binary !== contents) { - contents = binary; - text = decodeUTF8(binary); - } - return text; - } - }; -} -function jsRegExpToGoRegExp(regexp) { - let result = regexp.source; - if (regexp.flags) result = `(?${regexp.flags})${result}`; - return result; -} - -// lib/npm/node-platform.ts -var fs = require("fs"); -var os = require("os"); -var path = require("path"); -var ESBUILD_BINARY_PATH = process.env.ESBUILD_BINARY_PATH || ESBUILD_BINARY_PATH; -var isValidBinaryPath = (x) => !!x && x !== "/usr/bin/esbuild"; -var packageDarwin_arm64 = "@esbuild/darwin-arm64"; -var packageDarwin_x64 = "@esbuild/darwin-x64"; -var knownWindowsPackages = { - "win32 arm64 LE": "@esbuild/win32-arm64", - "win32 ia32 LE": "@esbuild/win32-ia32", - "win32 x64 LE": "@esbuild/win32-x64" -}; -var knownUnixlikePackages = { - "aix ppc64 BE": "@esbuild/aix-ppc64", - "android arm64 LE": "@esbuild/android-arm64", - "darwin arm64 LE": "@esbuild/darwin-arm64", - "darwin x64 LE": "@esbuild/darwin-x64", - "freebsd arm64 LE": "@esbuild/freebsd-arm64", - "freebsd x64 LE": "@esbuild/freebsd-x64", - "linux arm LE": "@esbuild/linux-arm", - "linux arm64 LE": "@esbuild/linux-arm64", - "linux ia32 LE": "@esbuild/linux-ia32", - "linux mips64el LE": "@esbuild/linux-mips64el", - "linux ppc64 LE": "@esbuild/linux-ppc64", - "linux riscv64 LE": "@esbuild/linux-riscv64", - "linux s390x BE": "@esbuild/linux-s390x", - "linux x64 LE": "@esbuild/linux-x64", - "linux loong64 LE": "@esbuild/linux-loong64", - "netbsd arm64 LE": "@esbuild/netbsd-arm64", - "netbsd x64 LE": "@esbuild/netbsd-x64", - "openbsd arm64 LE": "@esbuild/openbsd-arm64", - "openbsd x64 LE": "@esbuild/openbsd-x64", - "sunos x64 LE": "@esbuild/sunos-x64" -}; -var knownWebAssemblyFallbackPackages = { - "android arm LE": "@esbuild/android-arm", - "android x64 LE": "@esbuild/android-x64", - "openharmony arm64 LE": "@esbuild/openharmony-arm64" -}; -function pkgAndSubpathForCurrentPlatform() { - let pkg; - let subpath; - let isWASM = false; - let platformKey = `${process.platform} ${os.arch()} ${os.endianness()}`; - if (platformKey in knownWindowsPackages) { - pkg = knownWindowsPackages[platformKey]; - subpath = "esbuild.exe"; - } else if (platformKey in knownUnixlikePackages) { - pkg = knownUnixlikePackages[platformKey]; - subpath = "bin/esbuild"; - } else if (platformKey in knownWebAssemblyFallbackPackages) { - pkg = knownWebAssemblyFallbackPackages[platformKey]; - subpath = "bin/esbuild"; - isWASM = true; - } else { - throw new Error(`Unsupported platform: ${platformKey}`); - } - return { pkg, subpath, isWASM }; -} -function pkgForSomeOtherPlatform() { - const libMainJS = require.resolve("esbuild"); - const nodeModulesDirectory = path.dirname(path.dirname(path.dirname(libMainJS))); - if (path.basename(nodeModulesDirectory) === "node_modules") { - for (const unixKey in knownUnixlikePackages) { - try { - const pkg = knownUnixlikePackages[unixKey]; - if (fs.existsSync(path.join(nodeModulesDirectory, pkg))) return pkg; - } catch { - } - } - for (const windowsKey in knownWindowsPackages) { - try { - const pkg = knownWindowsPackages[windowsKey]; - if (fs.existsSync(path.join(nodeModulesDirectory, pkg))) return pkg; - } catch { - } - } - } - return null; -} -function downloadedBinPath(pkg, subpath) { - const esbuildLibDir = path.dirname(require.resolve("esbuild")); - return path.join(esbuildLibDir, `downloaded-${pkg.replace("/", "-")}-${path.basename(subpath)}`); -} -function generateBinPath() { - if (isValidBinaryPath(ESBUILD_BINARY_PATH)) { - if (!fs.existsSync(ESBUILD_BINARY_PATH)) { - console.warn(`[esbuild] Ignoring bad configuration: ESBUILD_BINARY_PATH=${ESBUILD_BINARY_PATH}`); - } else { - return { binPath: ESBUILD_BINARY_PATH, isWASM: false }; - } - } - const { pkg, subpath, isWASM } = pkgAndSubpathForCurrentPlatform(); - let binPath; - try { - binPath = require.resolve(`${pkg}/${subpath}`); - } catch (e) { - binPath = downloadedBinPath(pkg, subpath); - if (!fs.existsSync(binPath)) { - try { - require.resolve(pkg); - } catch { - const otherPkg = pkgForSomeOtherPlatform(); - if (otherPkg) { - let suggestions = ` -Specifically the "${otherPkg}" package is present but this platform -needs the "${pkg}" package instead. People often get into this -situation by installing esbuild on Windows or macOS and copying "node_modules" -into a Docker image that runs Linux, or by copying "node_modules" between -Windows and WSL environments. - -If you are installing with npm, you can try not copying the "node_modules" -directory when you copy the files over, and running "npm ci" or "npm install" -on the destination platform after the copy. Or you could consider using yarn -instead of npm which has built-in support for installing a package on multiple -platforms simultaneously. - -If you are installing with yarn, you can try listing both this platform and the -other platform in your ".yarnrc.yml" file using the "supportedArchitectures" -feature: https://yarnpkg.com/configuration/yarnrc/#supportedArchitectures -Keep in mind that this means multiple copies of esbuild will be present. -`; - if (pkg === packageDarwin_x64 && otherPkg === packageDarwin_arm64 || pkg === packageDarwin_arm64 && otherPkg === packageDarwin_x64) { - suggestions = ` -Specifically the "${otherPkg}" package is present but this platform -needs the "${pkg}" package instead. People often get into this -situation by installing esbuild with npm running inside of Rosetta 2 and then -trying to use it with node running outside of Rosetta 2, or vice versa (Rosetta -2 is Apple's on-the-fly x86_64-to-arm64 translation service). - -If you are installing with npm, you can try ensuring that both npm and node are -not running under Rosetta 2 and then reinstalling esbuild. This likely involves -changing how you installed npm and/or node. For example, installing node with -the universal installer here should work: https://nodejs.org/en/download/. Or -you could consider using yarn instead of npm which has built-in support for -installing a package on multiple platforms simultaneously. - -If you are installing with yarn, you can try listing both "arm64" and "x64" -in your ".yarnrc.yml" file using the "supportedArchitectures" feature: -https://yarnpkg.com/configuration/yarnrc/#supportedArchitectures -Keep in mind that this means multiple copies of esbuild will be present. -`; - } - throw new Error(` -You installed esbuild for another platform than the one you're currently using. -This won't work because esbuild is written with native code and needs to -install a platform-specific binary executable. -${suggestions} -Another alternative is to use the "esbuild-wasm" package instead, which works -the same way on all platforms. But it comes with a heavy performance cost and -can sometimes be 10x slower than the "esbuild" package, so you may also not -want to do that. -`); - } - throw new Error(`The package "${pkg}" could not be found, and is needed by esbuild. - -If you are installing esbuild with npm, make sure that you don't specify the -"--no-optional" or "--omit=optional" flags. The "optionalDependencies" feature -of "package.json" is used by esbuild to install the correct binary executable -for your current platform.`); - } - throw e; - } - } - if (/\.zip\//.test(binPath)) { - let pnpapi; - try { - pnpapi = require("pnpapi"); - } catch (e) { - } - if (pnpapi) { - const root = pnpapi.getPackageInformation(pnpapi.topLevel).packageLocation; - const binTargetPath = path.join( - root, - "node_modules", - ".cache", - "esbuild", - `pnpapi-${pkg.replace("/", "-")}-${"0.25.9"}-${path.basename(subpath)}` - ); - if (!fs.existsSync(binTargetPath)) { - fs.mkdirSync(path.dirname(binTargetPath), { recursive: true }); - fs.copyFileSync(binPath, binTargetPath); - fs.chmodSync(binTargetPath, 493); - } - return { binPath: binTargetPath, isWASM }; - } - } - return { binPath, isWASM }; -} - -// lib/npm/node.ts -var child_process = require("child_process"); -var crypto = require("crypto"); -var path2 = require("path"); -var fs2 = require("fs"); -var os2 = require("os"); -var tty = require("tty"); -var worker_threads; -if (process.env.ESBUILD_WORKER_THREADS !== "0") { - try { - worker_threads = require("worker_threads"); - } catch { - } - let [major, minor] = process.versions.node.split("."); - if ( - // { - if ((!ESBUILD_BINARY_PATH || false) && (path2.basename(__filename) !== "main.js" || path2.basename(__dirname) !== "lib")) { - throw new Error( - `The esbuild JavaScript API cannot be bundled. Please mark the "esbuild" package as external so it's not included in the bundle. - -More information: The file containing the code for esbuild's JavaScript API (${__filename}) does not appear to be inside the esbuild package on the file system, which usually means that the esbuild package was bundled into another file. This is problematic because the API needs to run a binary executable inside the esbuild package which is located using a relative path from the API code to the executable. If the esbuild package is bundled, the relative path will be incorrect and the executable won't be found.` - ); - } - if (false) { - return ["node", [path2.join(__dirname, "..", "bin", "esbuild")]]; - } else { - const { binPath, isWASM } = generateBinPath(); - if (isWASM) { - return ["node", [binPath]]; - } else { - return [binPath, []]; - } - } -}; -var isTTY = () => tty.isatty(2); -var fsSync = { - readFile(tempFile, callback) { - try { - let contents = fs2.readFileSync(tempFile, "utf8"); - try { - fs2.unlinkSync(tempFile); - } catch { - } - callback(null, contents); - } catch (err) { - callback(err, null); - } - }, - writeFile(contents, callback) { - try { - let tempFile = randomFileName(); - fs2.writeFileSync(tempFile, contents); - callback(tempFile); - } catch { - callback(null); - } - } -}; -var fsAsync = { - readFile(tempFile, callback) { - try { - fs2.readFile(tempFile, "utf8", (err, contents) => { - try { - fs2.unlink(tempFile, () => callback(err, contents)); - } catch { - callback(err, contents); - } - }); - } catch (err) { - callback(err, null); - } - }, - writeFile(contents, callback) { - try { - let tempFile = randomFileName(); - fs2.writeFile(tempFile, contents, (err) => err !== null ? callback(null) : callback(tempFile)); - } catch { - callback(null); - } - } -}; -var version = "0.25.9"; -var build = (options) => ensureServiceIsRunning().build(options); -var context = (buildOptions) => ensureServiceIsRunning().context(buildOptions); -var transform = (input, options) => ensureServiceIsRunning().transform(input, options); -var formatMessages = (messages, options) => ensureServiceIsRunning().formatMessages(messages, options); -var analyzeMetafile = (messages, options) => ensureServiceIsRunning().analyzeMetafile(messages, options); -var buildSync = (options) => { - if (worker_threads && !isInternalWorkerThread) { - if (!workerThreadService) workerThreadService = startWorkerThreadService(worker_threads); - return workerThreadService.buildSync(options); - } - let result; - runServiceSync((service) => service.buildOrContext({ - callName: "buildSync", - refs: null, - options, - isTTY: isTTY(), - defaultWD, - callback: (err, res) => { - if (err) throw err; - result = res; - } - })); - return result; -}; -var transformSync = (input, options) => { - if (worker_threads && !isInternalWorkerThread) { - if (!workerThreadService) workerThreadService = startWorkerThreadService(worker_threads); - return workerThreadService.transformSync(input, options); - } - let result; - runServiceSync((service) => service.transform({ - callName: "transformSync", - refs: null, - input, - options: options || {}, - isTTY: isTTY(), - fs: fsSync, - callback: (err, res) => { - if (err) throw err; - result = res; - } - })); - return result; -}; -var formatMessagesSync = (messages, options) => { - if (worker_threads && !isInternalWorkerThread) { - if (!workerThreadService) workerThreadService = startWorkerThreadService(worker_threads); - return workerThreadService.formatMessagesSync(messages, options); - } - let result; - runServiceSync((service) => service.formatMessages({ - callName: "formatMessagesSync", - refs: null, - messages, - options, - callback: (err, res) => { - if (err) throw err; - result = res; - } - })); - return result; -}; -var analyzeMetafileSync = (metafile, options) => { - if (worker_threads && !isInternalWorkerThread) { - if (!workerThreadService) workerThreadService = startWorkerThreadService(worker_threads); - return workerThreadService.analyzeMetafileSync(metafile, options); - } - let result; - runServiceSync((service) => service.analyzeMetafile({ - callName: "analyzeMetafileSync", - refs: null, - metafile: typeof metafile === "string" ? metafile : JSON.stringify(metafile), - options, - callback: (err, res) => { - if (err) throw err; - result = res; - } - })); - return result; -}; -var stop = () => { - if (stopService) stopService(); - if (workerThreadService) workerThreadService.stop(); - return Promise.resolve(); -}; -var initializeWasCalled = false; -var initialize = (options) => { - options = validateInitializeOptions(options || {}); - if (options.wasmURL) throw new Error(`The "wasmURL" option only works in the browser`); - if (options.wasmModule) throw new Error(`The "wasmModule" option only works in the browser`); - if (options.worker) throw new Error(`The "worker" option only works in the browser`); - if (initializeWasCalled) throw new Error('Cannot call "initialize" more than once'); - ensureServiceIsRunning(); - initializeWasCalled = true; - return Promise.resolve(); -}; -var defaultWD = process.cwd(); -var longLivedService; -var stopService; -var ensureServiceIsRunning = () => { - if (longLivedService) return longLivedService; - let [command, args] = esbuildCommandAndArgs(); - let child = child_process.spawn(command, args.concat(`--service=${"0.25.9"}`, "--ping"), { - windowsHide: true, - stdio: ["pipe", "pipe", "inherit"], - cwd: defaultWD - }); - let { readFromStdout, afterClose, service } = createChannel({ - writeToStdin(bytes) { - child.stdin.write(bytes, (err) => { - if (err) afterClose(err); - }); - }, - readFileSync: fs2.readFileSync, - isSync: false, - hasFS: true, - esbuild: node_exports - }); - child.stdin.on("error", afterClose); - child.on("error", afterClose); - const stdin = child.stdin; - const stdout = child.stdout; - stdout.on("data", readFromStdout); - stdout.on("end", afterClose); - stopService = () => { - stdin.destroy(); - stdout.destroy(); - child.kill(); - initializeWasCalled = false; - longLivedService = void 0; - stopService = void 0; - }; - let refCount = 0; - child.unref(); - if (stdin.unref) { - stdin.unref(); - } - if (stdout.unref) { - stdout.unref(); - } - const refs = { - ref() { - if (++refCount === 1) child.ref(); - }, - unref() { - if (--refCount === 0) child.unref(); - } - }; - longLivedService = { - build: (options) => new Promise((resolve, reject) => { - service.buildOrContext({ - callName: "build", - refs, - options, - isTTY: isTTY(), - defaultWD, - callback: (err, res) => err ? reject(err) : resolve(res) - }); - }), - context: (options) => new Promise((resolve, reject) => service.buildOrContext({ - callName: "context", - refs, - options, - isTTY: isTTY(), - defaultWD, - callback: (err, res) => err ? reject(err) : resolve(res) - })), - transform: (input, options) => new Promise((resolve, reject) => service.transform({ - callName: "transform", - refs, - input, - options: options || {}, - isTTY: isTTY(), - fs: fsAsync, - callback: (err, res) => err ? reject(err) : resolve(res) - })), - formatMessages: (messages, options) => new Promise((resolve, reject) => service.formatMessages({ - callName: "formatMessages", - refs, - messages, - options, - callback: (err, res) => err ? reject(err) : resolve(res) - })), - analyzeMetafile: (metafile, options) => new Promise((resolve, reject) => service.analyzeMetafile({ - callName: "analyzeMetafile", - refs, - metafile: typeof metafile === "string" ? metafile : JSON.stringify(metafile), - options, - callback: (err, res) => err ? reject(err) : resolve(res) - })) - }; - return longLivedService; -}; -var runServiceSync = (callback) => { - let [command, args] = esbuildCommandAndArgs(); - let stdin = new Uint8Array(); - let { readFromStdout, afterClose, service } = createChannel({ - writeToStdin(bytes) { - if (stdin.length !== 0) throw new Error("Must run at most one command"); - stdin = bytes; - }, - isSync: true, - hasFS: true, - esbuild: node_exports - }); - callback(service); - let stdout = child_process.execFileSync(command, args.concat(`--service=${"0.25.9"}`), { - cwd: defaultWD, - windowsHide: true, - input: stdin, - // We don't know how large the output could be. If it's too large, the - // command will fail with ENOBUFS. Reserve 16mb for now since that feels - // like it should be enough. Also allow overriding this with an environment - // variable. - maxBuffer: +process.env.ESBUILD_MAX_BUFFER || 16 * 1024 * 1024 - }); - readFromStdout(stdout); - afterClose(null); -}; -var randomFileName = () => { - return path2.join(os2.tmpdir(), `esbuild-${crypto.randomBytes(32).toString("hex")}`); -}; -var workerThreadService = null; -var startWorkerThreadService = (worker_threads2) => { - let { port1: mainPort, port2: workerPort } = new worker_threads2.MessageChannel(); - let worker = new worker_threads2.Worker(__filename, { - workerData: { workerPort, defaultWD, esbuildVersion: "0.25.9" }, - transferList: [workerPort], - // From node's documentation: https://nodejs.org/api/worker_threads.html - // - // Take care when launching worker threads from preload scripts (scripts loaded - // and run using the `-r` command line flag). Unless the `execArgv` option is - // explicitly set, new Worker threads automatically inherit the command line flags - // from the running process and will preload the same preload scripts as the main - // thread. If the preload script unconditionally launches a worker thread, every - // thread spawned will spawn another until the application crashes. - // - execArgv: [] - }); - let nextID = 0; - let fakeBuildError = (text) => { - let error = new Error(`Build failed with 1 error: -error: ${text}`); - let errors = [{ id: "", pluginName: "", text, location: null, notes: [], detail: void 0 }]; - error.errors = errors; - error.warnings = []; - return error; - }; - let validateBuildSyncOptions = (options) => { - if (!options) return; - let plugins = options.plugins; - if (plugins && plugins.length > 0) throw fakeBuildError(`Cannot use plugins in synchronous API calls`); - }; - let applyProperties = (object, properties) => { - for (let key in properties) { - object[key] = properties[key]; - } - }; - let runCallSync = (command, args) => { - let id = nextID++; - let sharedBuffer = new SharedArrayBuffer(8); - let sharedBufferView = new Int32Array(sharedBuffer); - let msg = { sharedBuffer, id, command, args }; - worker.postMessage(msg); - let status = Atomics.wait(sharedBufferView, 0, 0); - if (status !== "ok" && status !== "not-equal") throw new Error("Internal error: Atomics.wait() failed: " + status); - let { message: { id: id2, resolve, reject, properties } } = worker_threads2.receiveMessageOnPort(mainPort); - if (id !== id2) throw new Error(`Internal error: Expected id ${id} but got id ${id2}`); - if (reject) { - applyProperties(reject, properties); - throw reject; - } - return resolve; - }; - worker.unref(); - return { - buildSync(options) { - validateBuildSyncOptions(options); - return runCallSync("build", [options]); - }, - transformSync(input, options) { - return runCallSync("transform", [input, options]); - }, - formatMessagesSync(messages, options) { - return runCallSync("formatMessages", [messages, options]); - }, - analyzeMetafileSync(metafile, options) { - return runCallSync("analyzeMetafile", [metafile, options]); - }, - stop() { - worker.terminate(); - workerThreadService = null; - } - }; -}; -var startSyncServiceWorker = () => { - let workerPort = worker_threads.workerData.workerPort; - let parentPort = worker_threads.parentPort; - let extractProperties = (object) => { - let properties = {}; - if (object && typeof object === "object") { - for (let key in object) { - properties[key] = object[key]; - } - } - return properties; - }; - try { - let service = ensureServiceIsRunning(); - defaultWD = worker_threads.workerData.defaultWD; - parentPort.on("message", (msg) => { - (async () => { - let { sharedBuffer, id, command, args } = msg; - let sharedBufferView = new Int32Array(sharedBuffer); - try { - switch (command) { - case "build": - workerPort.postMessage({ id, resolve: await service.build(args[0]) }); - break; - case "transform": - workerPort.postMessage({ id, resolve: await service.transform(args[0], args[1]) }); - break; - case "formatMessages": - workerPort.postMessage({ id, resolve: await service.formatMessages(args[0], args[1]) }); - break; - case "analyzeMetafile": - workerPort.postMessage({ id, resolve: await service.analyzeMetafile(args[0], args[1]) }); - break; - default: - throw new Error(`Invalid command: ${command}`); - } - } catch (reject) { - workerPort.postMessage({ id, reject, properties: extractProperties(reject) }); - } - Atomics.add(sharedBufferView, 0, 1); - Atomics.notify(sharedBufferView, 0, Infinity); - })(); - }); - } catch (reject) { - parentPort.on("message", (msg) => { - let { sharedBuffer, id } = msg; - let sharedBufferView = new Int32Array(sharedBuffer); - workerPort.postMessage({ id, reject, properties: extractProperties(reject) }); - Atomics.add(sharedBufferView, 0, 1); - Atomics.notify(sharedBufferView, 0, Infinity); - }); - } -}; -if (isInternalWorkerThread) { - startSyncServiceWorker(); -} -var node_default = node_exports; -// Annotate the CommonJS export names for ESM import in node: -0 && (module.exports = { - analyzeMetafile, - analyzeMetafileSync, - build, - buildSync, - context, - formatMessages, - formatMessagesSync, - initialize, - stop, - transform, - transformSync, - version -}); diff --git a/node_modules/esbuild/package.json b/node_modules/esbuild/package.json deleted file mode 100644 index 43c34ad..0000000 --- a/node_modules/esbuild/package.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "esbuild", - "version": "0.25.9", - "description": "An extremely fast JavaScript and CSS bundler and minifier.", - "repository": { - "type": "git", - "url": "git+https://github.com/evanw/esbuild.git" - }, - "scripts": { - "postinstall": "node install.js" - }, - "main": "lib/main.js", - "types": "lib/main.d.ts", - "engines": { - "node": ">=18" - }, - "bin": { - "esbuild": "bin/esbuild" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.9", - "@esbuild/android-arm": "0.25.9", - "@esbuild/android-arm64": "0.25.9", - "@esbuild/android-x64": "0.25.9", - "@esbuild/darwin-arm64": "0.25.9", - "@esbuild/darwin-x64": "0.25.9", - "@esbuild/freebsd-arm64": "0.25.9", - "@esbuild/freebsd-x64": "0.25.9", - "@esbuild/linux-arm": "0.25.9", - "@esbuild/linux-arm64": "0.25.9", - "@esbuild/linux-ia32": "0.25.9", - "@esbuild/linux-loong64": "0.25.9", - "@esbuild/linux-mips64el": "0.25.9", - "@esbuild/linux-ppc64": "0.25.9", - "@esbuild/linux-riscv64": "0.25.9", - "@esbuild/linux-s390x": "0.25.9", - "@esbuild/linux-x64": "0.25.9", - "@esbuild/netbsd-arm64": "0.25.9", - "@esbuild/netbsd-x64": "0.25.9", - "@esbuild/openbsd-arm64": "0.25.9", - "@esbuild/openbsd-x64": "0.25.9", - "@esbuild/openharmony-arm64": "0.25.9", - "@esbuild/sunos-x64": "0.25.9", - "@esbuild/win32-arm64": "0.25.9", - "@esbuild/win32-ia32": "0.25.9", - "@esbuild/win32-x64": "0.25.9" - }, - "license": "MIT" -} diff --git a/node_modules/fast-glob/LICENSE b/node_modules/fast-glob/LICENSE deleted file mode 100644 index 65a9994..0000000 --- a/node_modules/fast-glob/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Denis Malinochkin - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/node_modules/fast-glob/README.md b/node_modules/fast-glob/README.md deleted file mode 100644 index 1d7843a..0000000 --- a/node_modules/fast-glob/README.md +++ /dev/null @@ -1,830 +0,0 @@ -# fast-glob - -> It's a very fast and efficient [glob][glob_definition] library for [Node.js][node_js]. - -This package provides methods for traversing the file system and returning pathnames that matched a defined set of a specified pattern according to the rules used by the Unix Bash shell with some simplifications, meanwhile results are returned in **arbitrary order**. Quick, simple, effective. - -## Table of Contents - -
    -Details - -* [Highlights](#highlights) -* [Old and modern mode](#old-and-modern-mode) -* [Pattern syntax](#pattern-syntax) - * [Basic syntax](#basic-syntax) - * [Advanced syntax](#advanced-syntax) -* [Installation](#installation) -* [API](#api) - * [Asynchronous](#asynchronous) - * [Synchronous](#synchronous) - * [Stream](#stream) - * [patterns](#patterns) - * [[options]](#options) - * [Helpers](#helpers) - * [generateTasks](#generatetaskspatterns-options) - * [isDynamicPattern](#isdynamicpatternpattern-options) - * [escapePath](#escapepathpath) - * [convertPathToPattern](#convertpathtopatternpath) -* [Options](#options-3) - * [Common](#common) - * [concurrency](#concurrency) - * [cwd](#cwd) - * [deep](#deep) - * [followSymbolicLinks](#followsymboliclinks) - * [fs](#fs) - * [ignore](#ignore) - * [suppressErrors](#suppresserrors) - * [throwErrorOnBrokenSymbolicLink](#throwerroronbrokensymboliclink) - * [Output control](#output-control) - * [absolute](#absolute) - * [markDirectories](#markdirectories) - * [objectMode](#objectmode) - * [onlyDirectories](#onlydirectories) - * [onlyFiles](#onlyfiles) - * [stats](#stats) - * [unique](#unique) - * [Matching control](#matching-control) - * [braceExpansion](#braceexpansion) - * [caseSensitiveMatch](#casesensitivematch) - * [dot](#dot) - * [extglob](#extglob) - * [globstar](#globstar) - * [baseNameMatch](#basenamematch) -* [FAQ](#faq) - * [What is a static or dynamic pattern?](#what-is-a-static-or-dynamic-pattern) - * [How to write patterns on Windows?](#how-to-write-patterns-on-windows) - * [Why are parentheses match wrong?](#why-are-parentheses-match-wrong) - * [How to exclude directory from reading?](#how-to-exclude-directory-from-reading) - * [How to use UNC path?](#how-to-use-unc-path) - * [Compatible with `node-glob`?](#compatible-with-node-glob) -* [Benchmarks](#benchmarks) - * [Server](#server) - * [Nettop](#nettop) -* [Changelog](#changelog) -* [License](#license) - -
    - -## Highlights - -* Fast. Probably the fastest. -* Supports multiple and negative patterns. -* Synchronous, Promise and Stream API. -* Object mode. Can return more than just strings. -* Error-tolerant. - -## Old and modern mode - -This package works in two modes, depending on the environment in which it is used. - -* **Old mode**. Node.js below 10.10 or when the [`stats`](#stats) option is *enabled*. -* **Modern mode**. Node.js 10.10+ and the [`stats`](#stats) option is *disabled*. - -The modern mode is faster. Learn more about the [internal mechanism][nodelib_fs_scandir_old_and_modern_modern]. - -## Pattern syntax - -> :warning: Always use forward-slashes in glob expressions (patterns and [`ignore`](#ignore) option). Use backslashes for escaping characters. - -There is more than one form of syntax: basic and advanced. Below is a brief overview of the supported features. Also pay attention to our [FAQ](#faq). - -> :book: This package uses [`micromatch`][micromatch] as a library for pattern matching. - -### Basic syntax - -* An asterisk (`*`) — matches everything except slashes (path separators), hidden files (names starting with `.`). -* A double star or globstar (`**`) — matches zero or more directories. -* Question mark (`?`) – matches any single character except slashes (path separators). -* Sequence (`[seq]`) — matches any character in sequence. - -> :book: A few additional words about the [basic matching behavior][picomatch_matching_behavior]. - -Some examples: - -* `src/**/*.js` — matches all files in the `src` directory (any level of nesting) that have the `.js` extension. -* `src/*.??` — matches all files in the `src` directory (only first level of nesting) that have a two-character extension. -* `file-[01].js` — matches files: `file-0.js`, `file-1.js`. - -### Advanced syntax - -* [Escapes characters][micromatch_backslashes] (`\\`) — matching special characters (`$^*+?()[]`) as literals. -* [POSIX character classes][picomatch_posix_brackets] (`[[:digit:]]`). -* [Extended globs][micromatch_extglobs] (`?(pattern-list)`). -* [Bash style brace expansions][micromatch_braces] (`{}`). -* [Regexp character classes][micromatch_regex_character_classes] (`[1-5]`). -* [Regex groups][regular_expressions_brackets] (`(a|b)`). - -> :book: A few additional words about the [advanced matching behavior][micromatch_extended_globbing]. - -Some examples: - -* `src/**/*.{css,scss}` — matches all files in the `src` directory (any level of nesting) that have the `.css` or `.scss` extension. -* `file-[[:digit:]].js` — matches files: `file-0.js`, `file-1.js`, …, `file-9.js`. -* `file-{1..3}.js` — matches files: `file-1.js`, `file-2.js`, `file-3.js`. -* `file-(1|2)` — matches files: `file-1.js`, `file-2.js`. - -## Installation - -```console -npm install fast-glob -``` - -## API - -### Asynchronous - -```js -fg(patterns, [options]) -fg.async(patterns, [options]) -fg.glob(patterns, [options]) -``` - -Returns a `Promise` with an array of matching entries. - -```js -const fg = require('fast-glob'); - -const entries = await fg(['.editorconfig', '**/index.js'], { dot: true }); - -// ['.editorconfig', 'services/index.js'] -``` - -### Synchronous - -```js -fg.sync(patterns, [options]) -fg.globSync(patterns, [options]) -``` - -Returns an array of matching entries. - -```js -const fg = require('fast-glob'); - -const entries = fg.sync(['.editorconfig', '**/index.js'], { dot: true }); - -// ['.editorconfig', 'services/index.js'] -``` - -### Stream - -```js -fg.stream(patterns, [options]) -fg.globStream(patterns, [options]) -``` - -Returns a [`ReadableStream`][node_js_stream_readable_streams] when the `data` event will be emitted with matching entry. - -```js -const fg = require('fast-glob'); - -const stream = fg.stream(['.editorconfig', '**/index.js'], { dot: true }); - -for await (const entry of stream) { - // .editorconfig - // services/index.js -} -``` - -#### patterns - -* Required: `true` -* Type: `string | string[]` - -Any correct pattern(s). - -> :1234: [Pattern syntax](#pattern-syntax) -> -> :warning: This package does not respect the order of patterns. First, all the negative patterns are applied, and only then the positive patterns. If you want to get a certain order of records, use sorting or split calls. - -#### [options] - -* Required: `false` -* Type: [`Options`](#options-3) - -See [Options](#options-3) section. - -### Helpers - -#### `generateTasks(patterns, [options])` - -Returns the internal representation of patterns ([`Task`](./src/managers/tasks.ts) is a combining patterns by base directory). - -```js -fg.generateTasks('*'); - -[{ - base: '.', // Parent directory for all patterns inside this task - dynamic: true, // Dynamic or static patterns are in this task - patterns: ['*'], - positive: ['*'], - negative: [] -}] -``` - -##### patterns - -* Required: `true` -* Type: `string | string[]` - -Any correct pattern(s). - -##### [options] - -* Required: `false` -* Type: [`Options`](#options-3) - -See [Options](#options-3) section. - -#### `isDynamicPattern(pattern, [options])` - -Returns `true` if the passed pattern is a dynamic pattern. - -> :1234: [What is a static or dynamic pattern?](#what-is-a-static-or-dynamic-pattern) - -```js -fg.isDynamicPattern('*'); // true -fg.isDynamicPattern('abc'); // false -``` - -##### pattern - -* Required: `true` -* Type: `string` - -Any correct pattern. - -##### [options] - -* Required: `false` -* Type: [`Options`](#options-3) - -See [Options](#options-3) section. - -#### `escapePath(path)` - -Returns the path with escaped special characters depending on the platform. - -* Posix: - * `*?|(){}[]`; - * `!` at the beginning of line; - * `@+!` before the opening parenthesis; - * `\\` before non-special characters; -* Windows: - * `(){}[]` - * `!` at the beginning of line; - * `@+!` before the opening parenthesis; - * Characters like `*?|` cannot be used in the path ([windows_naming_conventions][windows_naming_conventions]), so they will not be escaped; - -```js -fg.escapePath('!abc'); -// \\!abc -fg.escapePath('[OpenSource] mrmlnc – fast-glob (Deluxe Edition) 2014') + '/*.flac' -// \\[OpenSource\\] mrmlnc – fast-glob \\(Deluxe Edition\\) 2014/*.flac - -fg.posix.escapePath('C:\\Program Files (x86)\\**\\*'); -// C:\\\\Program Files \\(x86\\)\\*\\*\\* -fg.win32.escapePath('C:\\Program Files (x86)\\**\\*'); -// Windows: C:\\Program Files \\(x86\\)\\**\\* -``` - -#### `convertPathToPattern(path)` - -Converts a path to a pattern depending on the platform, including special character escaping. - -* Posix. Works similarly to the `fg.posix.escapePath` method. -* Windows. Works similarly to the `fg.win32.escapePath` method, additionally converting backslashes to forward slashes in cases where they are not escape characters (`!()+@{}[]`). - -```js -fg.convertPathToPattern('[OpenSource] mrmlnc – fast-glob (Deluxe Edition) 2014') + '/*.flac'; -// \\[OpenSource\\] mrmlnc – fast-glob \\(Deluxe Edition\\) 2014/*.flac - -fg.convertPathToPattern('C:/Program Files (x86)/**/*'); -// Posix: C:/Program Files \\(x86\\)/\\*\\*/\\* -// Windows: C:/Program Files \\(x86\\)/**/* - -fg.convertPathToPattern('C:\\Program Files (x86)\\**\\*'); -// Posix: C:\\\\Program Files \\(x86\\)\\*\\*\\* -// Windows: C:/Program Files \\(x86\\)/**/* - -fg.posix.convertPathToPattern('\\\\?\\c:\\Program Files (x86)') + '/**/*'; -// Posix: \\\\\\?\\\\c:\\\\Program Files \\(x86\\)/**/* (broken pattern) -fg.win32.convertPathToPattern('\\\\?\\c:\\Program Files (x86)') + '/**/*'; -// Windows: //?/c:/Program Files \\(x86\\)/**/* -``` - -## Options - -### Common options - -#### concurrency - -* Type: `number` -* Default: `os.cpus().length` - -Specifies the maximum number of concurrent requests from a reader to read directories. - -> :book: The higher the number, the higher the performance and load on the file system. If you want to read in quiet mode, set the value to a comfortable number or `1`. - -
    - -More details - -In Node, there are [two types of threads][nodejs_thread_pool]: Event Loop (code) and a Thread Pool (fs, dns, …). The thread pool size controlled by the `UV_THREADPOOL_SIZE` environment variable. Its default size is 4 ([documentation][libuv_thread_pool]). The pool is one for all tasks within a single Node process. - -Any code can make 4 real concurrent accesses to the file system. The rest of the FS requests will wait in the queue. - -> :book: Each new instance of FG in the same Node process will use the same Thread pool. - -But this package also has the `concurrency` option. This option allows you to control the number of concurrent accesses to the FS at the package level. By default, this package has a value equal to the number of cores available for the current Node process. This allows you to set a value smaller than the pool size (`concurrency: 1`) or, conversely, to prepare tasks for the pool queue more quickly (`concurrency: Number.POSITIVE_INFINITY`). - -So, in fact, this package can **only make 4 concurrent requests to the FS**. You can increase this value by using an environment variable (`UV_THREADPOOL_SIZE`), but in practice this does not give a multiple advantage. - -
    - -#### cwd - -* Type: `string` -* Default: `process.cwd()` - -The current working directory in which to search. - -#### deep - -* Type: `number` -* Default: `Infinity` - -Specifies the maximum depth of a read directory relative to the start directory. - -For example, you have the following tree: - -```js -dir/ -└── one/ // 1 - └── two/ // 2 - └── file.js // 3 -``` - -```js -// With base directory -fg.sync('dir/**', { onlyFiles: false, deep: 1 }); // ['dir/one'] -fg.sync('dir/**', { onlyFiles: false, deep: 2 }); // ['dir/one', 'dir/one/two'] - -// With cwd option -fg.sync('**', { onlyFiles: false, cwd: 'dir', deep: 1 }); // ['one'] -fg.sync('**', { onlyFiles: false, cwd: 'dir', deep: 2 }); // ['one', 'one/two'] -``` - -> :book: If you specify a pattern with some base directory, this directory will not participate in the calculation of the depth of the found directories. Think of it as a [`cwd`](#cwd) option. - -#### followSymbolicLinks - -* Type: `boolean` -* Default: `true` - -Indicates whether to traverse descendants of symbolic link directories when expanding `**` patterns. - -> :book: Note that this option does not affect the base directory of the pattern. For example, if `./a` is a symlink to directory `./b` and you specified `['./a**', './b/**']` patterns, then directory `./a` will still be read. - -> :book: If the [`stats`](#stats) option is specified, the information about the symbolic link (`fs.lstat`) will be replaced with information about the entry (`fs.stat`) behind it. - -#### fs - -* Type: `FileSystemAdapter` -* Default: `fs.*` - -Custom implementation of methods for working with the file system. Supports objects with enumerable properties only. - -```ts -export interface FileSystemAdapter { - lstat?: typeof fs.lstat; - stat?: typeof fs.stat; - lstatSync?: typeof fs.lstatSync; - statSync?: typeof fs.statSync; - readdir?: typeof fs.readdir; - readdirSync?: typeof fs.readdirSync; -} -``` - -#### ignore - -* Type: `string[]` -* Default: `[]` - -An array of glob patterns to exclude matches. This is an alternative way to use negative patterns. - -```js -dir/ -├── package-lock.json -└── package.json -``` - -```js -fg.sync(['*.json', '!package-lock.json']); // ['package.json'] -fg.sync('*.json', { ignore: ['package-lock.json'] }); // ['package.json'] -``` - -#### suppressErrors - -* Type: `boolean` -* Default: `false` - -By default this package suppress only `ENOENT` errors. Set to `true` to suppress any error. - -> :book: Can be useful when the directory has entries with a special level of access. - -#### throwErrorOnBrokenSymbolicLink - -* Type: `boolean` -* Default: `false` - -Throw an error when symbolic link is broken if `true` or safely return `lstat` call if `false`. - -> :book: This option has no effect on errors when reading the symbolic link directory. - -### Output control - -#### absolute - -* Type: `boolean` -* Default: `false` - -Return the absolute path for entries. - -```js -fg.sync('*.js', { absolute: false }); // ['index.js'] -fg.sync('*.js', { absolute: true }); // ['/home/user/index.js'] -``` - -> :book: This option is required if you want to use negative patterns with absolute path, for example, `!${__dirname}/*.js`. - -#### markDirectories - -* Type: `boolean` -* Default: `false` - -Mark the directory path with the final slash. - -```js -fg.sync('*', { onlyFiles: false, markDirectories: false }); // ['index.js', 'controllers'] -fg.sync('*', { onlyFiles: false, markDirectories: true }); // ['index.js', 'controllers/'] -``` - -#### objectMode - -* Type: `boolean` -* Default: `false` - -Returns objects (instead of strings) describing entries. - -```js -fg.sync('*', { objectMode: false }); // ['src/index.js'] -fg.sync('*', { objectMode: true }); // [{ name: 'index.js', path: 'src/index.js', dirent: }] -``` - -The object has the following fields: - -* name (`string`) — the last part of the path (basename) -* path (`string`) — full path relative to the pattern base directory -* dirent ([`fs.Dirent`][node_js_fs_class_fs_dirent]) — instance of `fs.Dirent` - -> :book: An object is an internal representation of entry, so getting it does not affect performance. - -#### onlyDirectories - -* Type: `boolean` -* Default: `false` - -Return only directories. - -```js -fg.sync('*', { onlyDirectories: false }); // ['index.js', 'src'] -fg.sync('*', { onlyDirectories: true }); // ['src'] -``` - -> :book: If `true`, the [`onlyFiles`](#onlyfiles) option is automatically `false`. - -#### onlyFiles - -* Type: `boolean` -* Default: `true` - -Return only files. - -```js -fg.sync('*', { onlyFiles: false }); // ['index.js', 'src'] -fg.sync('*', { onlyFiles: true }); // ['index.js'] -``` - -#### stats - -* Type: `boolean` -* Default: `false` - -Enables an [object mode](#objectmode) with an additional field: - -* stats ([`fs.Stats`][node_js_fs_class_fs_stats]) — instance of `fs.Stats` - -```js -fg.sync('*', { stats: false }); // ['src/index.js'] -fg.sync('*', { stats: true }); // [{ name: 'index.js', path: 'src/index.js', dirent: , stats: }] -``` - -> :book: Returns `fs.stat` instead of `fs.lstat` for symbolic links when the [`followSymbolicLinks`](#followsymboliclinks) option is specified. -> -> :warning: Unlike [object mode](#objectmode) this mode requires additional calls to the file system. On average, this mode is slower at least twice. See [old and modern mode](#old-and-modern-mode) for more details. - -#### unique - -* Type: `boolean` -* Default: `true` - -Ensures that the returned entries are unique. - -```js -fg.sync(['*.json', 'package.json'], { unique: false }); // ['package.json', 'package.json'] -fg.sync(['*.json', 'package.json'], { unique: true }); // ['package.json'] -``` - -If `true` and similar entries are found, the result is the first found. - -### Matching control - -#### braceExpansion - -* Type: `boolean` -* Default: `true` - -Enables Bash-like brace expansion. - -> :1234: [Syntax description][bash_hackers_syntax_expansion_brace] or more [detailed description][micromatch_braces]. - -```js -dir/ -├── abd -├── acd -└── a{b,c}d -``` - -```js -fg.sync('a{b,c}d', { braceExpansion: false }); // ['a{b,c}d'] -fg.sync('a{b,c}d', { braceExpansion: true }); // ['abd', 'acd'] -``` - -#### caseSensitiveMatch - -* Type: `boolean` -* Default: `true` - -Enables a [case-sensitive][wikipedia_case_sensitivity] mode for matching files. - -```js -dir/ -├── file.txt -└── File.txt -``` - -```js -fg.sync('file.txt', { caseSensitiveMatch: false }); // ['file.txt', 'File.txt'] -fg.sync('file.txt', { caseSensitiveMatch: true }); // ['file.txt'] -``` - -#### dot - -* Type: `boolean` -* Default: `false` - -Allow patterns to match entries that begin with a period (`.`). - -> :book: Note that an explicit dot in a portion of the pattern will always match dot files. - -```js -dir/ -├── .editorconfig -└── package.json -``` - -```js -fg.sync('*', { dot: false }); // ['package.json'] -fg.sync('*', { dot: true }); // ['.editorconfig', 'package.json'] -``` - -#### extglob - -* Type: `boolean` -* Default: `true` - -Enables Bash-like `extglob` functionality. - -> :1234: [Syntax description][micromatch_extglobs]. - -```js -dir/ -├── README.md -└── package.json -``` - -```js -fg.sync('*.+(json|md)', { extglob: false }); // [] -fg.sync('*.+(json|md)', { extglob: true }); // ['README.md', 'package.json'] -``` - -#### globstar - -* Type: `boolean` -* Default: `true` - -Enables recursively repeats a pattern containing `**`. If `false`, `**` behaves exactly like `*`. - -```js -dir/ -└── a - └── b -``` - -```js -fg.sync('**', { onlyFiles: false, globstar: false }); // ['a'] -fg.sync('**', { onlyFiles: false, globstar: true }); // ['a', 'a/b'] -``` - -#### baseNameMatch - -* Type: `boolean` -* Default: `false` - -If set to `true`, then patterns without slashes will be matched against the basename of the path if it contains slashes. - -```js -dir/ -└── one/ - └── file.md -``` - -```js -fg.sync('*.md', { baseNameMatch: false }); // [] -fg.sync('*.md', { baseNameMatch: true }); // ['one/file.md'] -``` - -## FAQ - -## What is a static or dynamic pattern? - -All patterns can be divided into two types: - -* **static**. A pattern is considered static if it can be used to get an entry on the file system without using matching mechanisms. For example, the `file.js` pattern is a static pattern because we can just verify that it exists on the file system. -* **dynamic**. A pattern is considered dynamic if it cannot be used directly to find occurrences without using a matching mechanisms. For example, the `*` pattern is a dynamic pattern because we cannot use this pattern directly. - -A pattern is considered dynamic if it contains the following characters (`…` — any characters or their absence) or options: - -* The [`caseSensitiveMatch`](#casesensitivematch) option is disabled -* `\\` (the escape character) -* `*`, `?`, `!` (at the beginning of line) -* `[…]` -* `(…|…)` -* `@(…)`, `!(…)`, `*(…)`, `?(…)`, `+(…)` (respects the [`extglob`](#extglob) option) -* `{…,…}`, `{…..…}` (respects the [`braceExpansion`](#braceexpansion) option) - -## How to write patterns on Windows? - -Always use forward-slashes in glob expressions (patterns and [`ignore`](#ignore) option). Use backslashes for escaping characters. With the [`cwd`](#cwd) option use a convenient format. - -**Bad** - -```ts -[ - 'directory\\*', - path.join(process.cwd(), '**') -] -``` - -**Good** - -```ts -[ - 'directory/*', - fg.convertPathToPattern(process.cwd()) + '/**' -] -``` - -> :book: Use the [`.convertPathToPattern`](#convertpathtopatternpath) package to convert Windows-style path to a Unix-style path. - -Read more about [matching with backslashes][micromatch_backslashes]. - -## Why are parentheses match wrong? - -```js -dir/ -└── (special-*file).txt -``` - -```js -fg.sync(['(special-*file).txt']) // [] -``` - -Refers to Bash. You need to escape special characters: - -```js -fg.sync(['\\(special-*file\\).txt']) // ['(special-*file).txt'] -``` - -Read more about [matching special characters as literals][picomatch_matching_special_characters_as_literals]. Or use the [`.escapePath`](#escapepathpath). - -## How to exclude directory from reading? - -You can use a negative pattern like this: `!**/node_modules` or `!**/node_modules/**`. Also you can use [`ignore`](#ignore) option. Just look at the example below. - -```js -first/ -├── file.md -└── second/ - └── file.txt -``` - -If you don't want to read the `second` directory, you must write the following pattern: `!**/second` or `!**/second/**`. - -```js -fg.sync(['**/*.md', '!**/second']); // ['first/file.md'] -fg.sync(['**/*.md'], { ignore: ['**/second/**'] }); // ['first/file.md'] -``` - -> :warning: When you write `!**/second/**/*` it means that the directory will be **read**, but all the entries will not be included in the results. - -You have to understand that if you write the pattern to exclude directories, then the directory will not be read under any circumstances. - -## How to use UNC path? - -You cannot use [Uniform Naming Convention (UNC)][unc_path] paths as patterns (due to syntax) directly, but you can use them as [`cwd`](#cwd) directory or use the `fg.convertPathToPattern` method. - -```ts -// cwd -fg.sync('*', { cwd: '\\\\?\\C:\\Python27' /* or //?/C:/Python27 */ }); -fg.sync('Python27/*', { cwd: '\\\\?\\C:\\' /* or //?/C:/ */ }); - -// .convertPathToPattern -fg.sync(fg.convertPathToPattern('\\\\?\\c:\\Python27') + '/*'); -``` - -## Compatible with `node-glob`? - -| node-glob | fast-glob | -| :----------: | :-------: | -| `cwd` | [`cwd`](#cwd) | -| `root` | – | -| `dot` | [`dot`](#dot) | -| `nomount` | – | -| `mark` | [`markDirectories`](#markdirectories) | -| `nosort` | – | -| `nounique` | [`unique`](#unique) | -| `nobrace` | [`braceExpansion`](#braceexpansion) | -| `noglobstar` | [`globstar`](#globstar) | -| `noext` | [`extglob`](#extglob) | -| `nocase` | [`caseSensitiveMatch`](#casesensitivematch) | -| `matchBase` | [`baseNameMatch`](#basenamematch) | -| `nodir` | [`onlyFiles`](#onlyfiles) | -| `ignore` | [`ignore`](#ignore) | -| `follow` | [`followSymbolicLinks`](#followsymboliclinks) | -| `realpath` | – | -| `absolute` | [`absolute`](#absolute) | - -## Benchmarks - -You can see results [here](https://github.com/mrmlnc/fast-glob/actions/workflows/benchmark.yml?query=branch%3Amaster) for every commit into the `main` branch. - -* **Product benchmark** – comparison with the main competitors. -* **Regress benchmark** – regression between the current version and the version from the npm registry. - -## Changelog - -See the [Releases section of our GitHub project][github_releases] for changelog for each release version. - -## License - -This software is released under the terms of the MIT license. - -[bash_hackers_syntax_expansion_brace]: https://wiki.bash-hackers.org/syntax/expansion/brace -[github_releases]: https://github.com/mrmlnc/fast-glob/releases -[glob_definition]: https://en.wikipedia.org/wiki/Glob_(programming) -[glob_linux_man]: http://man7.org/linux/man-pages/man3/glob.3.html -[micromatch_backslashes]: https://github.com/micromatch/micromatch#backslashes -[micromatch_braces]: https://github.com/micromatch/braces -[micromatch_extended_globbing]: https://github.com/micromatch/micromatch#extended-globbing -[micromatch_extglobs]: https://github.com/micromatch/micromatch#extglobs -[micromatch_regex_character_classes]: https://github.com/micromatch/micromatch#regex-character-classes -[micromatch]: https://github.com/micromatch/micromatch -[node_js_fs_class_fs_dirent]: https://nodejs.org/api/fs.html#fs_class_fs_dirent -[node_js_fs_class_fs_stats]: https://nodejs.org/api/fs.html#fs_class_fs_stats -[node_js_stream_readable_streams]: https://nodejs.org/api/stream.html#stream_readable_streams -[node_js]: https://nodejs.org/en -[nodelib_fs_scandir_old_and_modern_modern]: https://github.com/nodelib/nodelib/blob/master/packages/fs/fs.scandir/README.md#old-and-modern-mode -[npm_normalize_path]: https://www.npmjs.com/package/normalize-path -[npm_unixify]: https://www.npmjs.com/package/unixify -[picomatch_matching_behavior]: https://github.com/micromatch/picomatch#matching-behavior-vs-bash -[picomatch_matching_special_characters_as_literals]: https://github.com/micromatch/picomatch#matching-special-characters-as-literals -[picomatch_posix_brackets]: https://github.com/micromatch/picomatch#posix-brackets -[regular_expressions_brackets]: https://www.regular-expressions.info/brackets.html -[unc_path]: https://learn.microsoft.com/openspecs/windows_protocols/ms-dtyp/62e862f4-2a51-452e-8eeb-dc4ff5ee33cc -[wikipedia_case_sensitivity]: https://en.wikipedia.org/wiki/Case_sensitivity -[nodejs_thread_pool]: https://nodejs.org/en/docs/guides/dont-block-the-event-loop -[libuv_thread_pool]: http://docs.libuv.org/en/v1.x/threadpool.html -[windows_naming_conventions]: https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions diff --git a/node_modules/fast-glob/node_modules/glob-parent/CHANGELOG.md b/node_modules/fast-glob/node_modules/glob-parent/CHANGELOG.md deleted file mode 100644 index fb9de96..0000000 --- a/node_modules/fast-glob/node_modules/glob-parent/CHANGELOG.md +++ /dev/null @@ -1,110 +0,0 @@ -### [5.1.2](https://github.com/gulpjs/glob-parent/compare/v5.1.1...v5.1.2) (2021-03-06) - - -### Bug Fixes - -* eliminate ReDoS ([#36](https://github.com/gulpjs/glob-parent/issues/36)) ([f923116](https://github.com/gulpjs/glob-parent/commit/f9231168b0041fea3f8f954b3cceb56269fc6366)) - -### [5.1.1](https://github.com/gulpjs/glob-parent/compare/v5.1.0...v5.1.1) (2021-01-27) - - -### Bug Fixes - -* unescape exclamation mark ([#26](https://github.com/gulpjs/glob-parent/issues/26)) ([a98874f](https://github.com/gulpjs/glob-parent/commit/a98874f1a59e407f4fb1beb0db4efa8392da60bb)) - -## [5.1.0](https://github.com/gulpjs/glob-parent/compare/v5.0.0...v5.1.0) (2021-01-27) - - -### Features - -* add `flipBackslashes` option to disable auto conversion of slashes (closes [#24](https://github.com/gulpjs/glob-parent/issues/24)) ([#25](https://github.com/gulpjs/glob-parent/issues/25)) ([eecf91d](https://github.com/gulpjs/glob-parent/commit/eecf91d5e3834ed78aee39c4eaaae654d76b87b3)) - -## [5.0.0](https://github.com/gulpjs/glob-parent/compare/v4.0.0...v5.0.0) (2021-01-27) - - -### ⚠ BREAKING CHANGES - -* Drop support for node <6 & bump dependencies - -### Miscellaneous Chores - -* Drop support for node <6 & bump dependencies ([896c0c0](https://github.com/gulpjs/glob-parent/commit/896c0c00b4e7362f60b96e7fc295ae929245255a)) - -## [4.0.0](https://github.com/gulpjs/glob-parent/compare/v3.1.0...v4.0.0) (2021-01-27) - - -### ⚠ BREAKING CHANGES - -* question marks are valid path characters on Windows so avoid flagging as a glob when alone -* Update is-glob dependency - -### Features - -* hoist regexps and strings for performance gains ([4a80667](https://github.com/gulpjs/glob-parent/commit/4a80667c69355c76a572a5892b0f133c8e1f457e)) -* question marks are valid path characters on Windows so avoid flagging as a glob when alone ([2a551dd](https://github.com/gulpjs/glob-parent/commit/2a551dd0dc3235e78bf3c94843d4107072d17841)) -* Update is-glob dependency ([e41fcd8](https://github.com/gulpjs/glob-parent/commit/e41fcd895d1f7bc617dba45c9d935a7949b9c281)) - -## [3.1.0](https://github.com/gulpjs/glob-parent/compare/v3.0.1...v3.1.0) (2021-01-27) - - -### Features - -* allow basic win32 backslash use ([272afa5](https://github.com/gulpjs/glob-parent/commit/272afa5fd070fc0f796386a5993d4ee4a846988b)) -* handle extglobs (parentheses) containing separators ([7db1bdb](https://github.com/gulpjs/glob-parent/commit/7db1bdb0756e55fd14619e8ce31aa31b17b117fd)) -* new approach to braces/brackets handling ([8269bd8](https://github.com/gulpjs/glob-parent/commit/8269bd89290d99fac9395a354fb56fdcdb80f0be)) -* pre-process braces/brackets sections ([9ef8a87](https://github.com/gulpjs/glob-parent/commit/9ef8a87f66b1a43d0591e7a8e4fc5a18415ee388)) -* preserve escaped brace/bracket at end of string ([8cfb0ba](https://github.com/gulpjs/glob-parent/commit/8cfb0ba84202d51571340dcbaf61b79d16a26c76)) - - -### Bug Fixes - -* trailing escaped square brackets ([99ec9fe](https://github.com/gulpjs/glob-parent/commit/99ec9fecc60ee488ded20a94dd4f18b4f55c4ccf)) - -### [3.0.1](https://github.com/gulpjs/glob-parent/compare/v3.0.0...v3.0.1) (2021-01-27) - - -### Features - -* use path-dirname ponyfill ([cdbea5f](https://github.com/gulpjs/glob-parent/commit/cdbea5f32a58a54e001a75ddd7c0fccd4776aacc)) - - -### Bug Fixes - -* unescape glob-escaped dirnames on output ([598c533](https://github.com/gulpjs/glob-parent/commit/598c533bdf49c1428bc063aa9b8db40c5a86b030)) - -## [3.0.0](https://github.com/gulpjs/glob-parent/compare/v2.0.0...v3.0.0) (2021-01-27) - - -### ⚠ BREAKING CHANGES - -* update is-glob dependency - -### Features - -* update is-glob dependency ([5c5f8ef](https://github.com/gulpjs/glob-parent/commit/5c5f8efcee362a8e7638cf8220666acd8784f6bd)) - -## [2.0.0](https://github.com/gulpjs/glob-parent/compare/v1.3.0...v2.0.0) (2021-01-27) - - -### Features - -* move up to dirname regardless of glob characters ([f97fb83](https://github.com/gulpjs/glob-parent/commit/f97fb83be2e0a9fc8d3b760e789d2ecadd6aa0c2)) - -## [1.3.0](https://github.com/gulpjs/glob-parent/compare/v1.2.0...v1.3.0) (2021-01-27) - -## [1.2.0](https://github.com/gulpjs/glob-parent/compare/v1.1.0...v1.2.0) (2021-01-27) - - -### Reverts - -* feat: make regex test strings smaller ([dc80fa9](https://github.com/gulpjs/glob-parent/commit/dc80fa9658dca20549cfeba44bbd37d5246fcce0)) - -## [1.1.0](https://github.com/gulpjs/glob-parent/compare/v1.0.0...v1.1.0) (2021-01-27) - - -### Features - -* make regex test strings smaller ([cd83220](https://github.com/gulpjs/glob-parent/commit/cd832208638f45169f986d80fcf66e401f35d233)) - -## 1.0.0 (2021-01-27) - diff --git a/node_modules/fast-glob/node_modules/glob-parent/LICENSE b/node_modules/fast-glob/node_modules/glob-parent/LICENSE deleted file mode 100644 index 63222d7..0000000 --- a/node_modules/fast-glob/node_modules/glob-parent/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) 2015, 2019 Elan Shanker - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/fast-glob/node_modules/glob-parent/README.md b/node_modules/fast-glob/node_modules/glob-parent/README.md deleted file mode 100644 index 36a2793..0000000 --- a/node_modules/fast-glob/node_modules/glob-parent/README.md +++ /dev/null @@ -1,137 +0,0 @@ -

    - - - -

    - -# glob-parent - -[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Azure Pipelines Build Status][azure-pipelines-image]][azure-pipelines-url] [![Travis Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] - -Extract the non-magic parent path from a glob string. - -## Usage - -```js -var globParent = require('glob-parent'); - -globParent('path/to/*.js'); // 'path/to' -globParent('/root/path/to/*.js'); // '/root/path/to' -globParent('/*.js'); // '/' -globParent('*.js'); // '.' -globParent('**/*.js'); // '.' -globParent('path/{to,from}'); // 'path' -globParent('path/!(to|from)'); // 'path' -globParent('path/?(to|from)'); // 'path' -globParent('path/+(to|from)'); // 'path' -globParent('path/*(to|from)'); // 'path' -globParent('path/@(to|from)'); // 'path' -globParent('path/**/*'); // 'path' - -// if provided a non-glob path, returns the nearest dir -globParent('path/foo/bar.js'); // 'path/foo' -globParent('path/foo/'); // 'path/foo' -globParent('path/foo'); // 'path' (see issue #3 for details) -``` - -## API - -### `globParent(maybeGlobString, [options])` - -Takes a string and returns the part of the path before the glob begins. Be aware of Escaping rules and Limitations below. - -#### options - -```js -{ - // Disables the automatic conversion of slashes for Windows - flipBackslashes: true -} -``` - -## Escaping - -The following characters have special significance in glob patterns and must be escaped if you want them to be treated as regular path characters: - -- `?` (question mark) unless used as a path segment alone -- `*` (asterisk) -- `|` (pipe) -- `(` (opening parenthesis) -- `)` (closing parenthesis) -- `{` (opening curly brace) -- `}` (closing curly brace) -- `[` (opening bracket) -- `]` (closing bracket) - -**Example** - -```js -globParent('foo/[bar]/') // 'foo' -globParent('foo/\\[bar]/') // 'foo/[bar]' -``` - -## Limitations - -### Braces & Brackets -This library attempts a quick and imperfect method of determining which path -parts have glob magic without fully parsing/lexing the pattern. There are some -advanced use cases that can trip it up, such as nested braces where the outer -pair is escaped and the inner one contains a path separator. If you find -yourself in the unlikely circumstance of being affected by this or need to -ensure higher-fidelity glob handling in your library, it is recommended that you -pre-process your input with [expand-braces] and/or [expand-brackets]. - -### Windows -Backslashes are not valid path separators for globs. If a path with backslashes -is provided anyway, for simple cases, glob-parent will replace the path -separator for you and return the non-glob parent path (now with -forward-slashes, which are still valid as Windows path separators). - -This cannot be used in conjunction with escape characters. - -```js -// BAD -globParent('C:\\Program Files \\(x86\\)\\*.ext') // 'C:/Program Files /(x86/)' - -// GOOD -globParent('C:/Program Files\\(x86\\)/*.ext') // 'C:/Program Files (x86)' -``` - -If you are using escape characters for a pattern without path parts (i.e. -relative to `cwd`), prefix with `./` to avoid confusing glob-parent. - -```js -// BAD -globParent('foo \\[bar]') // 'foo ' -globParent('foo \\[bar]*') // 'foo ' - -// GOOD -globParent('./foo \\[bar]') // 'foo [bar]' -globParent('./foo \\[bar]*') // '.' -``` - -## License - -ISC - -[expand-braces]: https://github.com/jonschlinkert/expand-braces -[expand-brackets]: https://github.com/jonschlinkert/expand-brackets - -[downloads-image]: https://img.shields.io/npm/dm/glob-parent.svg -[npm-url]: https://www.npmjs.com/package/glob-parent -[npm-image]: https://img.shields.io/npm/v/glob-parent.svg - -[azure-pipelines-url]: https://dev.azure.com/gulpjs/gulp/_build/latest?definitionId=2&branchName=master -[azure-pipelines-image]: https://dev.azure.com/gulpjs/gulp/_apis/build/status/glob-parent?branchName=master - -[travis-url]: https://travis-ci.org/gulpjs/glob-parent -[travis-image]: https://img.shields.io/travis/gulpjs/glob-parent.svg?label=travis-ci - -[appveyor-url]: https://ci.appveyor.com/project/gulpjs/glob-parent -[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/glob-parent.svg?label=appveyor - -[coveralls-url]: https://coveralls.io/r/gulpjs/glob-parent -[coveralls-image]: https://img.shields.io/coveralls/gulpjs/glob-parent/master.svg - -[gitter-url]: https://gitter.im/gulpjs/gulp -[gitter-image]: https://badges.gitter.im/gulpjs/gulp.svg diff --git a/node_modules/fast-glob/node_modules/glob-parent/index.js b/node_modules/fast-glob/node_modules/glob-parent/index.js deleted file mode 100644 index 09e257e..0000000 --- a/node_modules/fast-glob/node_modules/glob-parent/index.js +++ /dev/null @@ -1,42 +0,0 @@ -'use strict'; - -var isGlob = require('is-glob'); -var pathPosixDirname = require('path').posix.dirname; -var isWin32 = require('os').platform() === 'win32'; - -var slash = '/'; -var backslash = /\\/g; -var enclosure = /[\{\[].*[\}\]]$/; -var globby = /(^|[^\\])([\{\[]|\([^\)]+$)/; -var escaped = /\\([\!\*\?\|\[\]\(\)\{\}])/g; - -/** - * @param {string} str - * @param {Object} opts - * @param {boolean} [opts.flipBackslashes=true] - * @returns {string} - */ -module.exports = function globParent(str, opts) { - var options = Object.assign({ flipBackslashes: true }, opts); - - // flip windows path separators - if (options.flipBackslashes && isWin32 && str.indexOf(slash) < 0) { - str = str.replace(backslash, slash); - } - - // special case for strings ending in enclosure containing path separator - if (enclosure.test(str)) { - str += slash; - } - - // preserves full path in case of trailing path separator - str += 'a'; - - // remove path parts that are globby - do { - str = pathPosixDirname(str); - } while (isGlob(str) || globby.test(str)); - - // remove escape chars and return result - return str.replace(escaped, '$1'); -}; diff --git a/node_modules/fast-glob/node_modules/glob-parent/package.json b/node_modules/fast-glob/node_modules/glob-parent/package.json deleted file mode 100644 index 125c971..0000000 --- a/node_modules/fast-glob/node_modules/glob-parent/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "glob-parent", - "version": "5.1.2", - "description": "Extract the non-magic parent path from a glob string.", - "author": "Gulp Team (https://gulpjs.com/)", - "contributors": [ - "Elan Shanker (https://github.com/es128)", - "Blaine Bublitz " - ], - "repository": "gulpjs/glob-parent", - "license": "ISC", - "engines": { - "node": ">= 6" - }, - "main": "index.js", - "files": [ - "LICENSE", - "index.js" - ], - "scripts": { - "lint": "eslint .", - "pretest": "npm run lint", - "test": "nyc mocha --async-only", - "azure-pipelines": "nyc mocha --async-only --reporter xunit -O output=test.xunit", - "coveralls": "nyc report --reporter=text-lcov | coveralls" - }, - "dependencies": { - "is-glob": "^4.0.1" - }, - "devDependencies": { - "coveralls": "^3.0.11", - "eslint": "^2.13.1", - "eslint-config-gulp": "^3.0.1", - "expect": "^1.20.2", - "mocha": "^6.0.2", - "nyc": "^13.3.0" - }, - "keywords": [ - "glob", - "parent", - "strip", - "path", - "dirname", - "directory", - "base", - "wildcard" - ] -} diff --git a/node_modules/fast-glob/out/index.d.ts b/node_modules/fast-glob/out/index.d.ts deleted file mode 100644 index 46823bb..0000000 --- a/node_modules/fast-glob/out/index.d.ts +++ /dev/null @@ -1,40 +0,0 @@ -/// -import * as taskManager from './managers/tasks'; -import { Options as OptionsInternal } from './settings'; -import { Entry as EntryInternal, FileSystemAdapter as FileSystemAdapterInternal, Pattern as PatternInternal } from './types'; -type EntryObjectModePredicate = { - [TKey in keyof Pick]-?: true; -}; -type EntryStatsPredicate = { - [TKey in keyof Pick]-?: true; -}; -type EntryObjectPredicate = EntryObjectModePredicate | EntryStatsPredicate; -declare function FastGlob(source: PatternInternal | PatternInternal[], options: OptionsInternal & EntryObjectPredicate): Promise; -declare function FastGlob(source: PatternInternal | PatternInternal[], options?: OptionsInternal): Promise; -declare namespace FastGlob { - type Options = OptionsInternal; - type Entry = EntryInternal; - type Task = taskManager.Task; - type Pattern = PatternInternal; - type FileSystemAdapter = FileSystemAdapterInternal; - const glob: typeof FastGlob; - const globSync: typeof sync; - const globStream: typeof stream; - const async: typeof FastGlob; - function sync(source: PatternInternal | PatternInternal[], options: OptionsInternal & EntryObjectPredicate): EntryInternal[]; - function sync(source: PatternInternal | PatternInternal[], options?: OptionsInternal): string[]; - function stream(source: PatternInternal | PatternInternal[], options?: OptionsInternal): NodeJS.ReadableStream; - function generateTasks(source: PatternInternal | PatternInternal[], options?: OptionsInternal): Task[]; - function isDynamicPattern(source: PatternInternal, options?: OptionsInternal): boolean; - function escapePath(source: string): PatternInternal; - function convertPathToPattern(source: string): PatternInternal; - namespace posix { - function escapePath(source: string): PatternInternal; - function convertPathToPattern(source: string): PatternInternal; - } - namespace win32 { - function escapePath(source: string): PatternInternal; - function convertPathToPattern(source: string): PatternInternal; - } -} -export = FastGlob; diff --git a/node_modules/fast-glob/out/index.js b/node_modules/fast-glob/out/index.js deleted file mode 100644 index 90365d4..0000000 --- a/node_modules/fast-glob/out/index.js +++ /dev/null @@ -1,102 +0,0 @@ -"use strict"; -const taskManager = require("./managers/tasks"); -const async_1 = require("./providers/async"); -const stream_1 = require("./providers/stream"); -const sync_1 = require("./providers/sync"); -const settings_1 = require("./settings"); -const utils = require("./utils"); -async function FastGlob(source, options) { - assertPatternsInput(source); - const works = getWorks(source, async_1.default, options); - const result = await Promise.all(works); - return utils.array.flatten(result); -} -// https://github.com/typescript-eslint/typescript-eslint/issues/60 -// eslint-disable-next-line no-redeclare -(function (FastGlob) { - FastGlob.glob = FastGlob; - FastGlob.globSync = sync; - FastGlob.globStream = stream; - FastGlob.async = FastGlob; - function sync(source, options) { - assertPatternsInput(source); - const works = getWorks(source, sync_1.default, options); - return utils.array.flatten(works); - } - FastGlob.sync = sync; - function stream(source, options) { - assertPatternsInput(source); - const works = getWorks(source, stream_1.default, options); - /** - * The stream returned by the provider cannot work with an asynchronous iterator. - * To support asynchronous iterators, regardless of the number of tasks, we always multiplex streams. - * This affects performance (+25%). I don't see best solution right now. - */ - return utils.stream.merge(works); - } - FastGlob.stream = stream; - function generateTasks(source, options) { - assertPatternsInput(source); - const patterns = [].concat(source); - const settings = new settings_1.default(options); - return taskManager.generate(patterns, settings); - } - FastGlob.generateTasks = generateTasks; - function isDynamicPattern(source, options) { - assertPatternsInput(source); - const settings = new settings_1.default(options); - return utils.pattern.isDynamicPattern(source, settings); - } - FastGlob.isDynamicPattern = isDynamicPattern; - function escapePath(source) { - assertPatternsInput(source); - return utils.path.escape(source); - } - FastGlob.escapePath = escapePath; - function convertPathToPattern(source) { - assertPatternsInput(source); - return utils.path.convertPathToPattern(source); - } - FastGlob.convertPathToPattern = convertPathToPattern; - let posix; - (function (posix) { - function escapePath(source) { - assertPatternsInput(source); - return utils.path.escapePosixPath(source); - } - posix.escapePath = escapePath; - function convertPathToPattern(source) { - assertPatternsInput(source); - return utils.path.convertPosixPathToPattern(source); - } - posix.convertPathToPattern = convertPathToPattern; - })(posix = FastGlob.posix || (FastGlob.posix = {})); - let win32; - (function (win32) { - function escapePath(source) { - assertPatternsInput(source); - return utils.path.escapeWindowsPath(source); - } - win32.escapePath = escapePath; - function convertPathToPattern(source) { - assertPatternsInput(source); - return utils.path.convertWindowsPathToPattern(source); - } - win32.convertPathToPattern = convertPathToPattern; - })(win32 = FastGlob.win32 || (FastGlob.win32 = {})); -})(FastGlob || (FastGlob = {})); -function getWorks(source, _Provider, options) { - const patterns = [].concat(source); - const settings = new settings_1.default(options); - const tasks = taskManager.generate(patterns, settings); - const provider = new _Provider(settings); - return tasks.map(provider.read, provider); -} -function assertPatternsInput(input) { - const source = [].concat(input); - const isValidSource = source.every((item) => utils.string.isString(item) && !utils.string.isEmpty(item)); - if (!isValidSource) { - throw new TypeError('Patterns must be a string (non empty) or an array of strings'); - } -} -module.exports = FastGlob; diff --git a/node_modules/fast-glob/out/managers/tasks.d.ts b/node_modules/fast-glob/out/managers/tasks.d.ts deleted file mode 100644 index 59d2c42..0000000 --- a/node_modules/fast-glob/out/managers/tasks.d.ts +++ /dev/null @@ -1,22 +0,0 @@ -import Settings from '../settings'; -import { Pattern, PatternsGroup } from '../types'; -export type Task = { - base: string; - dynamic: boolean; - patterns: Pattern[]; - positive: Pattern[]; - negative: Pattern[]; -}; -export declare function generate(input: Pattern[], settings: Settings): Task[]; -/** - * Returns tasks grouped by basic pattern directories. - * - * Patterns that can be found inside (`./`) and outside (`../`) the current directory are handled separately. - * This is necessary because directory traversal starts at the base directory and goes deeper. - */ -export declare function convertPatternsToTasks(positive: Pattern[], negative: Pattern[], dynamic: boolean): Task[]; -export declare function getPositivePatterns(patterns: Pattern[]): Pattern[]; -export declare function getNegativePatternsAsPositive(patterns: Pattern[], ignore: Pattern[]): Pattern[]; -export declare function groupPatternsByBaseDirectory(patterns: Pattern[]): PatternsGroup; -export declare function convertPatternGroupsToTasks(positive: PatternsGroup, negative: Pattern[], dynamic: boolean): Task[]; -export declare function convertPatternGroupToTask(base: string, positive: Pattern[], negative: Pattern[], dynamic: boolean): Task; diff --git a/node_modules/fast-glob/out/managers/tasks.js b/node_modules/fast-glob/out/managers/tasks.js deleted file mode 100644 index 335a765..0000000 --- a/node_modules/fast-glob/out/managers/tasks.js +++ /dev/null @@ -1,110 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.convertPatternGroupToTask = exports.convertPatternGroupsToTasks = exports.groupPatternsByBaseDirectory = exports.getNegativePatternsAsPositive = exports.getPositivePatterns = exports.convertPatternsToTasks = exports.generate = void 0; -const utils = require("../utils"); -function generate(input, settings) { - const patterns = processPatterns(input, settings); - const ignore = processPatterns(settings.ignore, settings); - const positivePatterns = getPositivePatterns(patterns); - const negativePatterns = getNegativePatternsAsPositive(patterns, ignore); - const staticPatterns = positivePatterns.filter((pattern) => utils.pattern.isStaticPattern(pattern, settings)); - const dynamicPatterns = positivePatterns.filter((pattern) => utils.pattern.isDynamicPattern(pattern, settings)); - const staticTasks = convertPatternsToTasks(staticPatterns, negativePatterns, /* dynamic */ false); - const dynamicTasks = convertPatternsToTasks(dynamicPatterns, negativePatterns, /* dynamic */ true); - return staticTasks.concat(dynamicTasks); -} -exports.generate = generate; -function processPatterns(input, settings) { - let patterns = input; - /** - * The original pattern like `{,*,**,a/*}` can lead to problems checking the depth when matching entry - * and some problems with the micromatch package (see fast-glob issues: #365, #394). - * - * To solve this problem, we expand all patterns containing brace expansion. This can lead to a slight slowdown - * in matching in the case of a large set of patterns after expansion. - */ - if (settings.braceExpansion) { - patterns = utils.pattern.expandPatternsWithBraceExpansion(patterns); - } - /** - * If the `baseNameMatch` option is enabled, we must add globstar to patterns, so that they can be used - * at any nesting level. - * - * We do this here, because otherwise we have to complicate the filtering logic. For example, we need to change - * the pattern in the filter before creating a regular expression. There is no need to change the patterns - * in the application. Only on the input. - */ - if (settings.baseNameMatch) { - patterns = patterns.map((pattern) => pattern.includes('/') ? pattern : `**/${pattern}`); - } - /** - * This method also removes duplicate slashes that may have been in the pattern or formed as a result of expansion. - */ - return patterns.map((pattern) => utils.pattern.removeDuplicateSlashes(pattern)); -} -/** - * Returns tasks grouped by basic pattern directories. - * - * Patterns that can be found inside (`./`) and outside (`../`) the current directory are handled separately. - * This is necessary because directory traversal starts at the base directory and goes deeper. - */ -function convertPatternsToTasks(positive, negative, dynamic) { - const tasks = []; - const patternsOutsideCurrentDirectory = utils.pattern.getPatternsOutsideCurrentDirectory(positive); - const patternsInsideCurrentDirectory = utils.pattern.getPatternsInsideCurrentDirectory(positive); - const outsideCurrentDirectoryGroup = groupPatternsByBaseDirectory(patternsOutsideCurrentDirectory); - const insideCurrentDirectoryGroup = groupPatternsByBaseDirectory(patternsInsideCurrentDirectory); - tasks.push(...convertPatternGroupsToTasks(outsideCurrentDirectoryGroup, negative, dynamic)); - /* - * For the sake of reducing future accesses to the file system, we merge all tasks within the current directory - * into a global task, if at least one pattern refers to the root (`.`). In this case, the global task covers the rest. - */ - if ('.' in insideCurrentDirectoryGroup) { - tasks.push(convertPatternGroupToTask('.', patternsInsideCurrentDirectory, negative, dynamic)); - } - else { - tasks.push(...convertPatternGroupsToTasks(insideCurrentDirectoryGroup, negative, dynamic)); - } - return tasks; -} -exports.convertPatternsToTasks = convertPatternsToTasks; -function getPositivePatterns(patterns) { - return utils.pattern.getPositivePatterns(patterns); -} -exports.getPositivePatterns = getPositivePatterns; -function getNegativePatternsAsPositive(patterns, ignore) { - const negative = utils.pattern.getNegativePatterns(patterns).concat(ignore); - const positive = negative.map(utils.pattern.convertToPositivePattern); - return positive; -} -exports.getNegativePatternsAsPositive = getNegativePatternsAsPositive; -function groupPatternsByBaseDirectory(patterns) { - const group = {}; - return patterns.reduce((collection, pattern) => { - const base = utils.pattern.getBaseDirectory(pattern); - if (base in collection) { - collection[base].push(pattern); - } - else { - collection[base] = [pattern]; - } - return collection; - }, group); -} -exports.groupPatternsByBaseDirectory = groupPatternsByBaseDirectory; -function convertPatternGroupsToTasks(positive, negative, dynamic) { - return Object.keys(positive).map((base) => { - return convertPatternGroupToTask(base, positive[base], negative, dynamic); - }); -} -exports.convertPatternGroupsToTasks = convertPatternGroupsToTasks; -function convertPatternGroupToTask(base, positive, negative, dynamic) { - return { - dynamic, - positive, - negative, - base, - patterns: [].concat(positive, negative.map(utils.pattern.convertToNegativePattern)) - }; -} -exports.convertPatternGroupToTask = convertPatternGroupToTask; diff --git a/node_modules/fast-glob/out/providers/async.d.ts b/node_modules/fast-glob/out/providers/async.d.ts deleted file mode 100644 index 2742616..0000000 --- a/node_modules/fast-glob/out/providers/async.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Task } from '../managers/tasks'; -import { Entry, EntryItem, ReaderOptions } from '../types'; -import ReaderAsync from '../readers/async'; -import Provider from './provider'; -export default class ProviderAsync extends Provider> { - protected _reader: ReaderAsync; - read(task: Task): Promise; - api(root: string, task: Task, options: ReaderOptions): Promise; -} diff --git a/node_modules/fast-glob/out/providers/async.js b/node_modules/fast-glob/out/providers/async.js deleted file mode 100644 index 0c5286e..0000000 --- a/node_modules/fast-glob/out/providers/async.js +++ /dev/null @@ -1,23 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const async_1 = require("../readers/async"); -const provider_1 = require("./provider"); -class ProviderAsync extends provider_1.default { - constructor() { - super(...arguments); - this._reader = new async_1.default(this._settings); - } - async read(task) { - const root = this._getRootDirectory(task); - const options = this._getReaderOptions(task); - const entries = await this.api(root, task, options); - return entries.map((entry) => options.transform(entry)); - } - api(root, task, options) { - if (task.dynamic) { - return this._reader.dynamic(root, options); - } - return this._reader.static(task.patterns, options); - } -} -exports.default = ProviderAsync; diff --git a/node_modules/fast-glob/out/providers/filters/deep.d.ts b/node_modules/fast-glob/out/providers/filters/deep.d.ts deleted file mode 100644 index 377fab8..0000000 --- a/node_modules/fast-glob/out/providers/filters/deep.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { MicromatchOptions, EntryFilterFunction, Pattern } from '../../types'; -import Settings from '../../settings'; -export default class DeepFilter { - private readonly _settings; - private readonly _micromatchOptions; - constructor(_settings: Settings, _micromatchOptions: MicromatchOptions); - getFilter(basePath: string, positive: Pattern[], negative: Pattern[]): EntryFilterFunction; - private _getMatcher; - private _getNegativePatternsRe; - private _filter; - private _isSkippedByDeep; - private _getEntryLevel; - private _isSkippedSymbolicLink; - private _isSkippedByPositivePatterns; - private _isSkippedByNegativePatterns; -} diff --git a/node_modules/fast-glob/out/providers/filters/deep.js b/node_modules/fast-glob/out/providers/filters/deep.js deleted file mode 100644 index 644bf41..0000000 --- a/node_modules/fast-glob/out/providers/filters/deep.js +++ /dev/null @@ -1,62 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = require("../../utils"); -const partial_1 = require("../matchers/partial"); -class DeepFilter { - constructor(_settings, _micromatchOptions) { - this._settings = _settings; - this._micromatchOptions = _micromatchOptions; - } - getFilter(basePath, positive, negative) { - const matcher = this._getMatcher(positive); - const negativeRe = this._getNegativePatternsRe(negative); - return (entry) => this._filter(basePath, entry, matcher, negativeRe); - } - _getMatcher(patterns) { - return new partial_1.default(patterns, this._settings, this._micromatchOptions); - } - _getNegativePatternsRe(patterns) { - const affectDepthOfReadingPatterns = patterns.filter(utils.pattern.isAffectDepthOfReadingPattern); - return utils.pattern.convertPatternsToRe(affectDepthOfReadingPatterns, this._micromatchOptions); - } - _filter(basePath, entry, matcher, negativeRe) { - if (this._isSkippedByDeep(basePath, entry.path)) { - return false; - } - if (this._isSkippedSymbolicLink(entry)) { - return false; - } - const filepath = utils.path.removeLeadingDotSegment(entry.path); - if (this._isSkippedByPositivePatterns(filepath, matcher)) { - return false; - } - return this._isSkippedByNegativePatterns(filepath, negativeRe); - } - _isSkippedByDeep(basePath, entryPath) { - /** - * Avoid unnecessary depth calculations when it doesn't matter. - */ - if (this._settings.deep === Infinity) { - return false; - } - return this._getEntryLevel(basePath, entryPath) >= this._settings.deep; - } - _getEntryLevel(basePath, entryPath) { - const entryPathDepth = entryPath.split('/').length; - if (basePath === '') { - return entryPathDepth; - } - const basePathDepth = basePath.split('/').length; - return entryPathDepth - basePathDepth; - } - _isSkippedSymbolicLink(entry) { - return !this._settings.followSymbolicLinks && entry.dirent.isSymbolicLink(); - } - _isSkippedByPositivePatterns(entryPath, matcher) { - return !this._settings.baseNameMatch && !matcher.match(entryPath); - } - _isSkippedByNegativePatterns(entryPath, patternsRe) { - return !utils.pattern.matchAny(entryPath, patternsRe); - } -} -exports.default = DeepFilter; diff --git a/node_modules/fast-glob/out/providers/filters/entry.d.ts b/node_modules/fast-glob/out/providers/filters/entry.d.ts deleted file mode 100644 index 23db353..0000000 --- a/node_modules/fast-glob/out/providers/filters/entry.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -import Settings from '../../settings'; -import { EntryFilterFunction, MicromatchOptions, Pattern } from '../../types'; -export default class EntryFilter { - private readonly _settings; - private readonly _micromatchOptions; - readonly index: Map; - constructor(_settings: Settings, _micromatchOptions: MicromatchOptions); - getFilter(positive: Pattern[], negative: Pattern[]): EntryFilterFunction; - private _filter; - private _isDuplicateEntry; - private _createIndexRecord; - private _onlyFileFilter; - private _onlyDirectoryFilter; - private _isMatchToPatternsSet; - private _isMatchToAbsoluteNegative; - private _isMatchToPatterns; -} diff --git a/node_modules/fast-glob/out/providers/filters/entry.js b/node_modules/fast-glob/out/providers/filters/entry.js deleted file mode 100644 index 0c9210c..0000000 --- a/node_modules/fast-glob/out/providers/filters/entry.js +++ /dev/null @@ -1,85 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = require("../../utils"); -class EntryFilter { - constructor(_settings, _micromatchOptions) { - this._settings = _settings; - this._micromatchOptions = _micromatchOptions; - this.index = new Map(); - } - getFilter(positive, negative) { - const [absoluteNegative, relativeNegative] = utils.pattern.partitionAbsoluteAndRelative(negative); - const patterns = { - positive: { - all: utils.pattern.convertPatternsToRe(positive, this._micromatchOptions) - }, - negative: { - absolute: utils.pattern.convertPatternsToRe(absoluteNegative, Object.assign(Object.assign({}, this._micromatchOptions), { dot: true })), - relative: utils.pattern.convertPatternsToRe(relativeNegative, Object.assign(Object.assign({}, this._micromatchOptions), { dot: true })) - } - }; - return (entry) => this._filter(entry, patterns); - } - _filter(entry, patterns) { - const filepath = utils.path.removeLeadingDotSegment(entry.path); - if (this._settings.unique && this._isDuplicateEntry(filepath)) { - return false; - } - if (this._onlyFileFilter(entry) || this._onlyDirectoryFilter(entry)) { - return false; - } - const isMatched = this._isMatchToPatternsSet(filepath, patterns, entry.dirent.isDirectory()); - if (this._settings.unique && isMatched) { - this._createIndexRecord(filepath); - } - return isMatched; - } - _isDuplicateEntry(filepath) { - return this.index.has(filepath); - } - _createIndexRecord(filepath) { - this.index.set(filepath, undefined); - } - _onlyFileFilter(entry) { - return this._settings.onlyFiles && !entry.dirent.isFile(); - } - _onlyDirectoryFilter(entry) { - return this._settings.onlyDirectories && !entry.dirent.isDirectory(); - } - _isMatchToPatternsSet(filepath, patterns, isDirectory) { - const isMatched = this._isMatchToPatterns(filepath, patterns.positive.all, isDirectory); - if (!isMatched) { - return false; - } - const isMatchedByRelativeNegative = this._isMatchToPatterns(filepath, patterns.negative.relative, isDirectory); - if (isMatchedByRelativeNegative) { - return false; - } - const isMatchedByAbsoluteNegative = this._isMatchToAbsoluteNegative(filepath, patterns.negative.absolute, isDirectory); - if (isMatchedByAbsoluteNegative) { - return false; - } - return true; - } - _isMatchToAbsoluteNegative(filepath, patternsRe, isDirectory) { - if (patternsRe.length === 0) { - return false; - } - const fullpath = utils.path.makeAbsolute(this._settings.cwd, filepath); - return this._isMatchToPatterns(fullpath, patternsRe, isDirectory); - } - _isMatchToPatterns(filepath, patternsRe, isDirectory) { - if (patternsRe.length === 0) { - return false; - } - // Trying to match files and directories by patterns. - const isMatched = utils.pattern.matchAny(filepath, patternsRe); - // A pattern with a trailling slash can be used for directory matching. - // To apply such pattern, we need to add a tralling slash to the path. - if (!isMatched && isDirectory) { - return utils.pattern.matchAny(filepath + '/', patternsRe); - } - return isMatched; - } -} -exports.default = EntryFilter; diff --git a/node_modules/fast-glob/out/providers/filters/error.d.ts b/node_modules/fast-glob/out/providers/filters/error.d.ts deleted file mode 100644 index 170eb25..0000000 --- a/node_modules/fast-glob/out/providers/filters/error.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import Settings from '../../settings'; -import { ErrorFilterFunction } from '../../types'; -export default class ErrorFilter { - private readonly _settings; - constructor(_settings: Settings); - getFilter(): ErrorFilterFunction; - private _isNonFatalError; -} diff --git a/node_modules/fast-glob/out/providers/filters/error.js b/node_modules/fast-glob/out/providers/filters/error.js deleted file mode 100644 index 1c6f241..0000000 --- a/node_modules/fast-glob/out/providers/filters/error.js +++ /dev/null @@ -1,15 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = require("../../utils"); -class ErrorFilter { - constructor(_settings) { - this._settings = _settings; - } - getFilter() { - return (error) => this._isNonFatalError(error); - } - _isNonFatalError(error) { - return utils.errno.isEnoentCodeError(error) || this._settings.suppressErrors; - } -} -exports.default = ErrorFilter; diff --git a/node_modules/fast-glob/out/providers/matchers/matcher.d.ts b/node_modules/fast-glob/out/providers/matchers/matcher.d.ts deleted file mode 100644 index d04c232..0000000 --- a/node_modules/fast-glob/out/providers/matchers/matcher.d.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Pattern, MicromatchOptions, PatternRe } from '../../types'; -import Settings from '../../settings'; -export type PatternSegment = StaticPatternSegment | DynamicPatternSegment; -type StaticPatternSegment = { - dynamic: false; - pattern: Pattern; -}; -type DynamicPatternSegment = { - dynamic: true; - pattern: Pattern; - patternRe: PatternRe; -}; -export type PatternSection = PatternSegment[]; -export type PatternInfo = { - /** - * Indicates that the pattern has a globstar (more than a single section). - */ - complete: boolean; - pattern: Pattern; - segments: PatternSegment[]; - sections: PatternSection[]; -}; -export default abstract class Matcher { - private readonly _patterns; - private readonly _settings; - private readonly _micromatchOptions; - protected readonly _storage: PatternInfo[]; - constructor(_patterns: Pattern[], _settings: Settings, _micromatchOptions: MicromatchOptions); - private _fillStorage; - private _getPatternSegments; - private _splitSegmentsIntoSections; -} -export {}; diff --git a/node_modules/fast-glob/out/providers/matchers/matcher.js b/node_modules/fast-glob/out/providers/matchers/matcher.js deleted file mode 100644 index eae67c9..0000000 --- a/node_modules/fast-glob/out/providers/matchers/matcher.js +++ /dev/null @@ -1,45 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = require("../../utils"); -class Matcher { - constructor(_patterns, _settings, _micromatchOptions) { - this._patterns = _patterns; - this._settings = _settings; - this._micromatchOptions = _micromatchOptions; - this._storage = []; - this._fillStorage(); - } - _fillStorage() { - for (const pattern of this._patterns) { - const segments = this._getPatternSegments(pattern); - const sections = this._splitSegmentsIntoSections(segments); - this._storage.push({ - complete: sections.length <= 1, - pattern, - segments, - sections - }); - } - } - _getPatternSegments(pattern) { - const parts = utils.pattern.getPatternParts(pattern, this._micromatchOptions); - return parts.map((part) => { - const dynamic = utils.pattern.isDynamicPattern(part, this._settings); - if (!dynamic) { - return { - dynamic: false, - pattern: part - }; - } - return { - dynamic: true, - pattern: part, - patternRe: utils.pattern.makeRe(part, this._micromatchOptions) - }; - }); - } - _splitSegmentsIntoSections(segments) { - return utils.array.splitWhen(segments, (segment) => segment.dynamic && utils.pattern.hasGlobStar(segment.pattern)); - } -} -exports.default = Matcher; diff --git a/node_modules/fast-glob/out/providers/matchers/partial.d.ts b/node_modules/fast-glob/out/providers/matchers/partial.d.ts deleted file mode 100644 index 91520f6..0000000 --- a/node_modules/fast-glob/out/providers/matchers/partial.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import Matcher from './matcher'; -export default class PartialMatcher extends Matcher { - match(filepath: string): boolean; -} diff --git a/node_modules/fast-glob/out/providers/matchers/partial.js b/node_modules/fast-glob/out/providers/matchers/partial.js deleted file mode 100644 index 1dfffeb..0000000 --- a/node_modules/fast-glob/out/providers/matchers/partial.js +++ /dev/null @@ -1,38 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const matcher_1 = require("./matcher"); -class PartialMatcher extends matcher_1.default { - match(filepath) { - const parts = filepath.split('/'); - const levels = parts.length; - const patterns = this._storage.filter((info) => !info.complete || info.segments.length > levels); - for (const pattern of patterns) { - const section = pattern.sections[0]; - /** - * In this case, the pattern has a globstar and we must read all directories unconditionally, - * but only if the level has reached the end of the first group. - * - * fixtures/{a,b}/** - * ^ true/false ^ always true - */ - if (!pattern.complete && levels > section.length) { - return true; - } - const match = parts.every((part, index) => { - const segment = pattern.segments[index]; - if (segment.dynamic && segment.patternRe.test(part)) { - return true; - } - if (!segment.dynamic && segment.pattern === part) { - return true; - } - return false; - }); - if (match) { - return true; - } - } - return false; - } -} -exports.default = PartialMatcher; diff --git a/node_modules/fast-glob/out/providers/provider.d.ts b/node_modules/fast-glob/out/providers/provider.d.ts deleted file mode 100644 index 1053460..0000000 --- a/node_modules/fast-glob/out/providers/provider.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Task } from '../managers/tasks'; -import Settings from '../settings'; -import { MicromatchOptions, ReaderOptions } from '../types'; -import DeepFilter from './filters/deep'; -import EntryFilter from './filters/entry'; -import ErrorFilter from './filters/error'; -import EntryTransformer from './transformers/entry'; -export default abstract class Provider { - protected readonly _settings: Settings; - readonly errorFilter: ErrorFilter; - readonly entryFilter: EntryFilter; - readonly deepFilter: DeepFilter; - readonly entryTransformer: EntryTransformer; - constructor(_settings: Settings); - abstract read(_task: Task): T; - protected _getRootDirectory(task: Task): string; - protected _getReaderOptions(task: Task): ReaderOptions; - protected _getMicromatchOptions(): MicromatchOptions; -} diff --git a/node_modules/fast-glob/out/providers/provider.js b/node_modules/fast-glob/out/providers/provider.js deleted file mode 100644 index da88ee0..0000000 --- a/node_modules/fast-glob/out/providers/provider.js +++ /dev/null @@ -1,48 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const path = require("path"); -const deep_1 = require("./filters/deep"); -const entry_1 = require("./filters/entry"); -const error_1 = require("./filters/error"); -const entry_2 = require("./transformers/entry"); -class Provider { - constructor(_settings) { - this._settings = _settings; - this.errorFilter = new error_1.default(this._settings); - this.entryFilter = new entry_1.default(this._settings, this._getMicromatchOptions()); - this.deepFilter = new deep_1.default(this._settings, this._getMicromatchOptions()); - this.entryTransformer = new entry_2.default(this._settings); - } - _getRootDirectory(task) { - return path.resolve(this._settings.cwd, task.base); - } - _getReaderOptions(task) { - const basePath = task.base === '.' ? '' : task.base; - return { - basePath, - pathSegmentSeparator: '/', - concurrency: this._settings.concurrency, - deepFilter: this.deepFilter.getFilter(basePath, task.positive, task.negative), - entryFilter: this.entryFilter.getFilter(task.positive, task.negative), - errorFilter: this.errorFilter.getFilter(), - followSymbolicLinks: this._settings.followSymbolicLinks, - fs: this._settings.fs, - stats: this._settings.stats, - throwErrorOnBrokenSymbolicLink: this._settings.throwErrorOnBrokenSymbolicLink, - transform: this.entryTransformer.getTransformer() - }; - } - _getMicromatchOptions() { - return { - dot: this._settings.dot, - matchBase: this._settings.baseNameMatch, - nobrace: !this._settings.braceExpansion, - nocase: !this._settings.caseSensitiveMatch, - noext: !this._settings.extglob, - noglobstar: !this._settings.globstar, - posix: true, - strictSlashes: false - }; - } -} -exports.default = Provider; diff --git a/node_modules/fast-glob/out/providers/stream.d.ts b/node_modules/fast-glob/out/providers/stream.d.ts deleted file mode 100644 index 3d02a1f..0000000 --- a/node_modules/fast-glob/out/providers/stream.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -/// -import { Readable } from 'stream'; -import { Task } from '../managers/tasks'; -import ReaderStream from '../readers/stream'; -import { ReaderOptions } from '../types'; -import Provider from './provider'; -export default class ProviderStream extends Provider { - protected _reader: ReaderStream; - read(task: Task): Readable; - api(root: string, task: Task, options: ReaderOptions): Readable; -} diff --git a/node_modules/fast-glob/out/providers/stream.js b/node_modules/fast-glob/out/providers/stream.js deleted file mode 100644 index 85da62e..0000000 --- a/node_modules/fast-glob/out/providers/stream.js +++ /dev/null @@ -1,31 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = require("stream"); -const stream_2 = require("../readers/stream"); -const provider_1 = require("./provider"); -class ProviderStream extends provider_1.default { - constructor() { - super(...arguments); - this._reader = new stream_2.default(this._settings); - } - read(task) { - const root = this._getRootDirectory(task); - const options = this._getReaderOptions(task); - const source = this.api(root, task, options); - const destination = new stream_1.Readable({ objectMode: true, read: () => { } }); - source - .once('error', (error) => destination.emit('error', error)) - .on('data', (entry) => destination.emit('data', options.transform(entry))) - .once('end', () => destination.emit('end')); - destination - .once('close', () => source.destroy()); - return destination; - } - api(root, task, options) { - if (task.dynamic) { - return this._reader.dynamic(root, options); - } - return this._reader.static(task.patterns, options); - } -} -exports.default = ProviderStream; diff --git a/node_modules/fast-glob/out/providers/sync.d.ts b/node_modules/fast-glob/out/providers/sync.d.ts deleted file mode 100644 index 9c0fe1e..0000000 --- a/node_modules/fast-glob/out/providers/sync.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Task } from '../managers/tasks'; -import ReaderSync from '../readers/sync'; -import { Entry, EntryItem, ReaderOptions } from '../types'; -import Provider from './provider'; -export default class ProviderSync extends Provider { - protected _reader: ReaderSync; - read(task: Task): EntryItem[]; - api(root: string, task: Task, options: ReaderOptions): Entry[]; -} diff --git a/node_modules/fast-glob/out/providers/sync.js b/node_modules/fast-glob/out/providers/sync.js deleted file mode 100644 index d70aa1b..0000000 --- a/node_modules/fast-glob/out/providers/sync.js +++ /dev/null @@ -1,23 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const sync_1 = require("../readers/sync"); -const provider_1 = require("./provider"); -class ProviderSync extends provider_1.default { - constructor() { - super(...arguments); - this._reader = new sync_1.default(this._settings); - } - read(task) { - const root = this._getRootDirectory(task); - const options = this._getReaderOptions(task); - const entries = this.api(root, task, options); - return entries.map(options.transform); - } - api(root, task, options) { - if (task.dynamic) { - return this._reader.dynamic(root, options); - } - return this._reader.static(task.patterns, options); - } -} -exports.default = ProviderSync; diff --git a/node_modules/fast-glob/out/providers/transformers/entry.d.ts b/node_modules/fast-glob/out/providers/transformers/entry.d.ts deleted file mode 100644 index e9b85fa..0000000 --- a/node_modules/fast-glob/out/providers/transformers/entry.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import Settings from '../../settings'; -import { EntryTransformerFunction } from '../../types'; -export default class EntryTransformer { - private readonly _settings; - constructor(_settings: Settings); - getTransformer(): EntryTransformerFunction; - private _transform; -} diff --git a/node_modules/fast-glob/out/providers/transformers/entry.js b/node_modules/fast-glob/out/providers/transformers/entry.js deleted file mode 100644 index d11903c..0000000 --- a/node_modules/fast-glob/out/providers/transformers/entry.js +++ /dev/null @@ -1,26 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = require("../../utils"); -class EntryTransformer { - constructor(_settings) { - this._settings = _settings; - } - getTransformer() { - return (entry) => this._transform(entry); - } - _transform(entry) { - let filepath = entry.path; - if (this._settings.absolute) { - filepath = utils.path.makeAbsolute(this._settings.cwd, filepath); - filepath = utils.path.unixify(filepath); - } - if (this._settings.markDirectories && entry.dirent.isDirectory()) { - filepath += '/'; - } - if (!this._settings.objectMode) { - return filepath; - } - return Object.assign(Object.assign({}, entry), { path: filepath }); - } -} -exports.default = EntryTransformer; diff --git a/node_modules/fast-glob/out/readers/async.d.ts b/node_modules/fast-glob/out/readers/async.d.ts deleted file mode 100644 index fbca428..0000000 --- a/node_modules/fast-glob/out/readers/async.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import * as fsWalk from '@nodelib/fs.walk'; -import { Entry, ReaderOptions, Pattern } from '../types'; -import Reader from './reader'; -import ReaderStream from './stream'; -export default class ReaderAsync extends Reader> { - protected _walkAsync: typeof fsWalk.walk; - protected _readerStream: ReaderStream; - dynamic(root: string, options: ReaderOptions): Promise; - static(patterns: Pattern[], options: ReaderOptions): Promise; -} diff --git a/node_modules/fast-glob/out/readers/async.js b/node_modules/fast-glob/out/readers/async.js deleted file mode 100644 index d024145..0000000 --- a/node_modules/fast-glob/out/readers/async.js +++ /dev/null @@ -1,35 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const fsWalk = require("@nodelib/fs.walk"); -const reader_1 = require("./reader"); -const stream_1 = require("./stream"); -class ReaderAsync extends reader_1.default { - constructor() { - super(...arguments); - this._walkAsync = fsWalk.walk; - this._readerStream = new stream_1.default(this._settings); - } - dynamic(root, options) { - return new Promise((resolve, reject) => { - this._walkAsync(root, options, (error, entries) => { - if (error === null) { - resolve(entries); - } - else { - reject(error); - } - }); - }); - } - async static(patterns, options) { - const entries = []; - const stream = this._readerStream.static(patterns, options); - // After #235, replace it with an asynchronous iterator. - return new Promise((resolve, reject) => { - stream.once('error', reject); - stream.on('data', (entry) => entries.push(entry)); - stream.once('end', () => resolve(entries)); - }); - } -} -exports.default = ReaderAsync; diff --git a/node_modules/fast-glob/out/readers/reader.d.ts b/node_modules/fast-glob/out/readers/reader.d.ts deleted file mode 100644 index 2af16b6..0000000 --- a/node_modules/fast-glob/out/readers/reader.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -/// -import * as fs from 'fs'; -import * as fsStat from '@nodelib/fs.stat'; -import Settings from '../settings'; -import { Entry, ErrnoException, Pattern, ReaderOptions } from '../types'; -export default abstract class Reader { - protected readonly _settings: Settings; - protected readonly _fsStatSettings: fsStat.Settings; - constructor(_settings: Settings); - abstract dynamic(root: string, options: ReaderOptions): T; - abstract static(patterns: Pattern[], options: ReaderOptions): T; - protected _getFullEntryPath(filepath: string): string; - protected _makeEntry(stats: fs.Stats, pattern: Pattern): Entry; - protected _isFatalError(error: ErrnoException): boolean; -} diff --git a/node_modules/fast-glob/out/readers/reader.js b/node_modules/fast-glob/out/readers/reader.js deleted file mode 100644 index 7b40255..0000000 --- a/node_modules/fast-glob/out/readers/reader.js +++ /dev/null @@ -1,33 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const path = require("path"); -const fsStat = require("@nodelib/fs.stat"); -const utils = require("../utils"); -class Reader { - constructor(_settings) { - this._settings = _settings; - this._fsStatSettings = new fsStat.Settings({ - followSymbolicLink: this._settings.followSymbolicLinks, - fs: this._settings.fs, - throwErrorOnBrokenSymbolicLink: this._settings.followSymbolicLinks - }); - } - _getFullEntryPath(filepath) { - return path.resolve(this._settings.cwd, filepath); - } - _makeEntry(stats, pattern) { - const entry = { - name: pattern, - path: pattern, - dirent: utils.fs.createDirentFromStats(pattern, stats) - }; - if (this._settings.stats) { - entry.stats = stats; - } - return entry; - } - _isFatalError(error) { - return !utils.errno.isEnoentCodeError(error) && !this._settings.suppressErrors; - } -} -exports.default = Reader; diff --git a/node_modules/fast-glob/out/readers/stream.d.ts b/node_modules/fast-glob/out/readers/stream.d.ts deleted file mode 100644 index 1c74cac..0000000 --- a/node_modules/fast-glob/out/readers/stream.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -/// -import { Readable } from 'stream'; -import * as fsStat from '@nodelib/fs.stat'; -import * as fsWalk from '@nodelib/fs.walk'; -import { Pattern, ReaderOptions } from '../types'; -import Reader from './reader'; -export default class ReaderStream extends Reader { - protected _walkStream: typeof fsWalk.walkStream; - protected _stat: typeof fsStat.stat; - dynamic(root: string, options: ReaderOptions): Readable; - static(patterns: Pattern[], options: ReaderOptions): Readable; - private _getEntry; - private _getStat; -} diff --git a/node_modules/fast-glob/out/readers/stream.js b/node_modules/fast-glob/out/readers/stream.js deleted file mode 100644 index 317c6d5..0000000 --- a/node_modules/fast-glob/out/readers/stream.js +++ /dev/null @@ -1,55 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = require("stream"); -const fsStat = require("@nodelib/fs.stat"); -const fsWalk = require("@nodelib/fs.walk"); -const reader_1 = require("./reader"); -class ReaderStream extends reader_1.default { - constructor() { - super(...arguments); - this._walkStream = fsWalk.walkStream; - this._stat = fsStat.stat; - } - dynamic(root, options) { - return this._walkStream(root, options); - } - static(patterns, options) { - const filepaths = patterns.map(this._getFullEntryPath, this); - const stream = new stream_1.PassThrough({ objectMode: true }); - stream._write = (index, _enc, done) => { - return this._getEntry(filepaths[index], patterns[index], options) - .then((entry) => { - if (entry !== null && options.entryFilter(entry)) { - stream.push(entry); - } - if (index === filepaths.length - 1) { - stream.end(); - } - done(); - }) - .catch(done); - }; - for (let i = 0; i < filepaths.length; i++) { - stream.write(i); - } - return stream; - } - _getEntry(filepath, pattern, options) { - return this._getStat(filepath) - .then((stats) => this._makeEntry(stats, pattern)) - .catch((error) => { - if (options.errorFilter(error)) { - return null; - } - throw error; - }); - } - _getStat(filepath) { - return new Promise((resolve, reject) => { - this._stat(filepath, this._fsStatSettings, (error, stats) => { - return error === null ? resolve(stats) : reject(error); - }); - }); - } -} -exports.default = ReaderStream; diff --git a/node_modules/fast-glob/out/readers/sync.d.ts b/node_modules/fast-glob/out/readers/sync.d.ts deleted file mode 100644 index c96ffee..0000000 --- a/node_modules/fast-glob/out/readers/sync.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -import * as fsStat from '@nodelib/fs.stat'; -import * as fsWalk from '@nodelib/fs.walk'; -import { Entry, Pattern, ReaderOptions } from '../types'; -import Reader from './reader'; -export default class ReaderSync extends Reader { - protected _walkSync: typeof fsWalk.walkSync; - protected _statSync: typeof fsStat.statSync; - dynamic(root: string, options: ReaderOptions): Entry[]; - static(patterns: Pattern[], options: ReaderOptions): Entry[]; - private _getEntry; - private _getStat; -} diff --git a/node_modules/fast-glob/out/readers/sync.js b/node_modules/fast-glob/out/readers/sync.js deleted file mode 100644 index 4704d65..0000000 --- a/node_modules/fast-glob/out/readers/sync.js +++ /dev/null @@ -1,43 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const fsStat = require("@nodelib/fs.stat"); -const fsWalk = require("@nodelib/fs.walk"); -const reader_1 = require("./reader"); -class ReaderSync extends reader_1.default { - constructor() { - super(...arguments); - this._walkSync = fsWalk.walkSync; - this._statSync = fsStat.statSync; - } - dynamic(root, options) { - return this._walkSync(root, options); - } - static(patterns, options) { - const entries = []; - for (const pattern of patterns) { - const filepath = this._getFullEntryPath(pattern); - const entry = this._getEntry(filepath, pattern, options); - if (entry === null || !options.entryFilter(entry)) { - continue; - } - entries.push(entry); - } - return entries; - } - _getEntry(filepath, pattern, options) { - try { - const stats = this._getStat(filepath); - return this._makeEntry(stats, pattern); - } - catch (error) { - if (options.errorFilter(error)) { - return null; - } - throw error; - } - } - _getStat(filepath) { - return this._statSync(filepath, this._fsStatSettings); - } -} -exports.default = ReaderSync; diff --git a/node_modules/fast-glob/out/settings.d.ts b/node_modules/fast-glob/out/settings.d.ts deleted file mode 100644 index 76a74f8..0000000 --- a/node_modules/fast-glob/out/settings.d.ts +++ /dev/null @@ -1,164 +0,0 @@ -import { FileSystemAdapter, Pattern } from './types'; -export declare const DEFAULT_FILE_SYSTEM_ADAPTER: FileSystemAdapter; -export type Options = { - /** - * Return the absolute path for entries. - * - * @default false - */ - absolute?: boolean; - /** - * If set to `true`, then patterns without slashes will be matched against - * the basename of the path if it contains slashes. - * - * @default false - */ - baseNameMatch?: boolean; - /** - * Enables Bash-like brace expansion. - * - * @default true - */ - braceExpansion?: boolean; - /** - * Enables a case-sensitive mode for matching files. - * - * @default true - */ - caseSensitiveMatch?: boolean; - /** - * Specifies the maximum number of concurrent requests from a reader to read - * directories. - * - * @default os.cpus().length - */ - concurrency?: number; - /** - * The current working directory in which to search. - * - * @default process.cwd() - */ - cwd?: string; - /** - * Specifies the maximum depth of a read directory relative to the start - * directory. - * - * @default Infinity - */ - deep?: number; - /** - * Allow patterns to match entries that begin with a period (`.`). - * - * @default false - */ - dot?: boolean; - /** - * Enables Bash-like `extglob` functionality. - * - * @default true - */ - extglob?: boolean; - /** - * Indicates whether to traverse descendants of symbolic link directories. - * - * @default true - */ - followSymbolicLinks?: boolean; - /** - * Custom implementation of methods for working with the file system. - * - * @default fs.* - */ - fs?: Partial; - /** - * Enables recursively repeats a pattern containing `**`. - * If `false`, `**` behaves exactly like `*`. - * - * @default true - */ - globstar?: boolean; - /** - * An array of glob patterns to exclude matches. - * This is an alternative way to use negative patterns. - * - * @default [] - */ - ignore?: Pattern[]; - /** - * Mark the directory path with the final slash. - * - * @default false - */ - markDirectories?: boolean; - /** - * Returns objects (instead of strings) describing entries. - * - * @default false - */ - objectMode?: boolean; - /** - * Return only directories. - * - * @default false - */ - onlyDirectories?: boolean; - /** - * Return only files. - * - * @default true - */ - onlyFiles?: boolean; - /** - * Enables an object mode (`objectMode`) with an additional `stats` field. - * - * @default false - */ - stats?: boolean; - /** - * By default this package suppress only `ENOENT` errors. - * Set to `true` to suppress any error. - * - * @default false - */ - suppressErrors?: boolean; - /** - * Throw an error when symbolic link is broken if `true` or safely - * return `lstat` call if `false`. - * - * @default false - */ - throwErrorOnBrokenSymbolicLink?: boolean; - /** - * Ensures that the returned entries are unique. - * - * @default true - */ - unique?: boolean; -}; -export default class Settings { - private readonly _options; - readonly absolute: boolean; - readonly baseNameMatch: boolean; - readonly braceExpansion: boolean; - readonly caseSensitiveMatch: boolean; - readonly concurrency: number; - readonly cwd: string; - readonly deep: number; - readonly dot: boolean; - readonly extglob: boolean; - readonly followSymbolicLinks: boolean; - readonly fs: FileSystemAdapter; - readonly globstar: boolean; - readonly ignore: Pattern[]; - readonly markDirectories: boolean; - readonly objectMode: boolean; - readonly onlyDirectories: boolean; - readonly onlyFiles: boolean; - readonly stats: boolean; - readonly suppressErrors: boolean; - readonly throwErrorOnBrokenSymbolicLink: boolean; - readonly unique: boolean; - constructor(_options?: Options); - private _getValue; - private _getFileSystemMethods; -} diff --git a/node_modules/fast-glob/out/settings.js b/node_modules/fast-glob/out/settings.js deleted file mode 100644 index 23f916c..0000000 --- a/node_modules/fast-glob/out/settings.js +++ /dev/null @@ -1,59 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.DEFAULT_FILE_SYSTEM_ADAPTER = void 0; -const fs = require("fs"); -const os = require("os"); -/** - * The `os.cpus` method can return zero. We expect the number of cores to be greater than zero. - * https://github.com/nodejs/node/blob/7faeddf23a98c53896f8b574a6e66589e8fb1eb8/lib/os.js#L106-L107 - */ -const CPU_COUNT = Math.max(os.cpus().length, 1); -exports.DEFAULT_FILE_SYSTEM_ADAPTER = { - lstat: fs.lstat, - lstatSync: fs.lstatSync, - stat: fs.stat, - statSync: fs.statSync, - readdir: fs.readdir, - readdirSync: fs.readdirSync -}; -class Settings { - constructor(_options = {}) { - this._options = _options; - this.absolute = this._getValue(this._options.absolute, false); - this.baseNameMatch = this._getValue(this._options.baseNameMatch, false); - this.braceExpansion = this._getValue(this._options.braceExpansion, true); - this.caseSensitiveMatch = this._getValue(this._options.caseSensitiveMatch, true); - this.concurrency = this._getValue(this._options.concurrency, CPU_COUNT); - this.cwd = this._getValue(this._options.cwd, process.cwd()); - this.deep = this._getValue(this._options.deep, Infinity); - this.dot = this._getValue(this._options.dot, false); - this.extglob = this._getValue(this._options.extglob, true); - this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, true); - this.fs = this._getFileSystemMethods(this._options.fs); - this.globstar = this._getValue(this._options.globstar, true); - this.ignore = this._getValue(this._options.ignore, []); - this.markDirectories = this._getValue(this._options.markDirectories, false); - this.objectMode = this._getValue(this._options.objectMode, false); - this.onlyDirectories = this._getValue(this._options.onlyDirectories, false); - this.onlyFiles = this._getValue(this._options.onlyFiles, true); - this.stats = this._getValue(this._options.stats, false); - this.suppressErrors = this._getValue(this._options.suppressErrors, false); - this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, false); - this.unique = this._getValue(this._options.unique, true); - if (this.onlyDirectories) { - this.onlyFiles = false; - } - if (this.stats) { - this.objectMode = true; - } - // Remove the cast to the array in the next major (#404). - this.ignore = [].concat(this.ignore); - } - _getValue(option, value) { - return option === undefined ? value : option; - } - _getFileSystemMethods(methods = {}) { - return Object.assign(Object.assign({}, exports.DEFAULT_FILE_SYSTEM_ADAPTER), methods); - } -} -exports.default = Settings; diff --git a/node_modules/fast-glob/out/types/index.d.ts b/node_modules/fast-glob/out/types/index.d.ts deleted file mode 100644 index 6506caf..0000000 --- a/node_modules/fast-glob/out/types/index.d.ts +++ /dev/null @@ -1,31 +0,0 @@ -/// -import * as fsWalk from '@nodelib/fs.walk'; -export type ErrnoException = NodeJS.ErrnoException; -export type Entry = fsWalk.Entry; -export type EntryItem = string | Entry; -export type Pattern = string; -export type PatternRe = RegExp; -export type PatternsGroup = Record; -export type ReaderOptions = fsWalk.Options & { - transform(entry: Entry): EntryItem; - deepFilter: DeepFilterFunction; - entryFilter: EntryFilterFunction; - errorFilter: ErrorFilterFunction; - fs: FileSystemAdapter; - stats: boolean; -}; -export type ErrorFilterFunction = fsWalk.ErrorFilterFunction; -export type EntryFilterFunction = fsWalk.EntryFilterFunction; -export type DeepFilterFunction = fsWalk.DeepFilterFunction; -export type EntryTransformerFunction = (entry: Entry) => EntryItem; -export type MicromatchOptions = { - dot?: boolean; - matchBase?: boolean; - nobrace?: boolean; - nocase?: boolean; - noext?: boolean; - noglobstar?: boolean; - posix?: boolean; - strictSlashes?: boolean; -}; -export type FileSystemAdapter = fsWalk.FileSystemAdapter; diff --git a/node_modules/fast-glob/out/types/index.js b/node_modules/fast-glob/out/types/index.js deleted file mode 100644 index c8ad2e5..0000000 --- a/node_modules/fast-glob/out/types/index.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/node_modules/fast-glob/out/utils/array.d.ts b/node_modules/fast-glob/out/utils/array.d.ts deleted file mode 100644 index 98e7325..0000000 --- a/node_modules/fast-glob/out/utils/array.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export declare function flatten(items: T[][]): T[]; -export declare function splitWhen(items: T[], predicate: (item: T) => boolean): T[][]; diff --git a/node_modules/fast-glob/out/utils/array.js b/node_modules/fast-glob/out/utils/array.js deleted file mode 100644 index 50c406e..0000000 --- a/node_modules/fast-glob/out/utils/array.js +++ /dev/null @@ -1,22 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.splitWhen = exports.flatten = void 0; -function flatten(items) { - return items.reduce((collection, item) => [].concat(collection, item), []); -} -exports.flatten = flatten; -function splitWhen(items, predicate) { - const result = [[]]; - let groupIndex = 0; - for (const item of items) { - if (predicate(item)) { - groupIndex++; - result[groupIndex] = []; - } - else { - result[groupIndex].push(item); - } - } - return result; -} -exports.splitWhen = splitWhen; diff --git a/node_modules/fast-glob/out/utils/errno.d.ts b/node_modules/fast-glob/out/utils/errno.d.ts deleted file mode 100644 index 1c08d3b..0000000 --- a/node_modules/fast-glob/out/utils/errno.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -import { ErrnoException } from '../types'; -export declare function isEnoentCodeError(error: ErrnoException): boolean; diff --git a/node_modules/fast-glob/out/utils/errno.js b/node_modules/fast-glob/out/utils/errno.js deleted file mode 100644 index f0bd801..0000000 --- a/node_modules/fast-glob/out/utils/errno.js +++ /dev/null @@ -1,7 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.isEnoentCodeError = void 0; -function isEnoentCodeError(error) { - return error.code === 'ENOENT'; -} -exports.isEnoentCodeError = isEnoentCodeError; diff --git a/node_modules/fast-glob/out/utils/fs.d.ts b/node_modules/fast-glob/out/utils/fs.d.ts deleted file mode 100644 index 64c61ce..0000000 --- a/node_modules/fast-glob/out/utils/fs.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -/// -import * as fs from 'fs'; -import { Dirent } from '@nodelib/fs.walk'; -export declare function createDirentFromStats(name: string, stats: fs.Stats): Dirent; diff --git a/node_modules/fast-glob/out/utils/fs.js b/node_modules/fast-glob/out/utils/fs.js deleted file mode 100644 index ace7c74..0000000 --- a/node_modules/fast-glob/out/utils/fs.js +++ /dev/null @@ -1,19 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.createDirentFromStats = void 0; -class DirentFromStats { - constructor(name, stats) { - this.name = name; - this.isBlockDevice = stats.isBlockDevice.bind(stats); - this.isCharacterDevice = stats.isCharacterDevice.bind(stats); - this.isDirectory = stats.isDirectory.bind(stats); - this.isFIFO = stats.isFIFO.bind(stats); - this.isFile = stats.isFile.bind(stats); - this.isSocket = stats.isSocket.bind(stats); - this.isSymbolicLink = stats.isSymbolicLink.bind(stats); - } -} -function createDirentFromStats(name, stats) { - return new DirentFromStats(name, stats); -} -exports.createDirentFromStats = createDirentFromStats; diff --git a/node_modules/fast-glob/out/utils/index.d.ts b/node_modules/fast-glob/out/utils/index.d.ts deleted file mode 100644 index f634cad..0000000 --- a/node_modules/fast-glob/out/utils/index.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import * as array from './array'; -import * as errno from './errno'; -import * as fs from './fs'; -import * as path from './path'; -import * as pattern from './pattern'; -import * as stream from './stream'; -import * as string from './string'; -export { array, errno, fs, path, pattern, stream, string }; diff --git a/node_modules/fast-glob/out/utils/index.js b/node_modules/fast-glob/out/utils/index.js deleted file mode 100644 index 0f92c16..0000000 --- a/node_modules/fast-glob/out/utils/index.js +++ /dev/null @@ -1,17 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.string = exports.stream = exports.pattern = exports.path = exports.fs = exports.errno = exports.array = void 0; -const array = require("./array"); -exports.array = array; -const errno = require("./errno"); -exports.errno = errno; -const fs = require("./fs"); -exports.fs = fs; -const path = require("./path"); -exports.path = path; -const pattern = require("./pattern"); -exports.pattern = pattern; -const stream = require("./stream"); -exports.stream = stream; -const string = require("./string"); -exports.string = string; diff --git a/node_modules/fast-glob/out/utils/path.d.ts b/node_modules/fast-glob/out/utils/path.d.ts deleted file mode 100644 index 0b13f4b..0000000 --- a/node_modules/fast-glob/out/utils/path.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Pattern } from '../types'; -/** - * Designed to work only with simple paths: `dir\\file`. - */ -export declare function unixify(filepath: string): string; -export declare function makeAbsolute(cwd: string, filepath: string): string; -export declare function removeLeadingDotSegment(entry: string): string; -export declare const escape: typeof escapeWindowsPath; -export declare function escapeWindowsPath(pattern: Pattern): Pattern; -export declare function escapePosixPath(pattern: Pattern): Pattern; -export declare const convertPathToPattern: typeof convertWindowsPathToPattern; -export declare function convertWindowsPathToPattern(filepath: string): Pattern; -export declare function convertPosixPathToPattern(filepath: string): Pattern; diff --git a/node_modules/fast-glob/out/utils/path.js b/node_modules/fast-glob/out/utils/path.js deleted file mode 100644 index 7b53b39..0000000 --- a/node_modules/fast-glob/out/utils/path.js +++ /dev/null @@ -1,68 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.convertPosixPathToPattern = exports.convertWindowsPathToPattern = exports.convertPathToPattern = exports.escapePosixPath = exports.escapeWindowsPath = exports.escape = exports.removeLeadingDotSegment = exports.makeAbsolute = exports.unixify = void 0; -const os = require("os"); -const path = require("path"); -const IS_WINDOWS_PLATFORM = os.platform() === 'win32'; -const LEADING_DOT_SEGMENT_CHARACTERS_COUNT = 2; // ./ or .\\ -/** - * All non-escaped special characters. - * Posix: ()*?[]{|}, !+@ before (, ! at the beginning, \\ before non-special characters. - * Windows: (){}[], !+@ before (, ! at the beginning. - */ -const POSIX_UNESCAPED_GLOB_SYMBOLS_RE = /(\\?)([()*?[\]{|}]|^!|[!+@](?=\()|\\(?![!()*+?@[\]{|}]))/g; -const WINDOWS_UNESCAPED_GLOB_SYMBOLS_RE = /(\\?)([()[\]{}]|^!|[!+@](?=\())/g; -/** - * The device path (\\.\ or \\?\). - * https://learn.microsoft.com/en-us/dotnet/standard/io/file-path-formats#dos-device-paths - */ -const DOS_DEVICE_PATH_RE = /^\\\\([.?])/; -/** - * All backslashes except those escaping special characters. - * Windows: !()+@{} - * https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions - */ -const WINDOWS_BACKSLASHES_RE = /\\(?![!()+@[\]{}])/g; -/** - * Designed to work only with simple paths: `dir\\file`. - */ -function unixify(filepath) { - return filepath.replace(/\\/g, '/'); -} -exports.unixify = unixify; -function makeAbsolute(cwd, filepath) { - return path.resolve(cwd, filepath); -} -exports.makeAbsolute = makeAbsolute; -function removeLeadingDotSegment(entry) { - // We do not use `startsWith` because this is 10x slower than current implementation for some cases. - // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with - if (entry.charAt(0) === '.') { - const secondCharactery = entry.charAt(1); - if (secondCharactery === '/' || secondCharactery === '\\') { - return entry.slice(LEADING_DOT_SEGMENT_CHARACTERS_COUNT); - } - } - return entry; -} -exports.removeLeadingDotSegment = removeLeadingDotSegment; -exports.escape = IS_WINDOWS_PLATFORM ? escapeWindowsPath : escapePosixPath; -function escapeWindowsPath(pattern) { - return pattern.replace(WINDOWS_UNESCAPED_GLOB_SYMBOLS_RE, '\\$2'); -} -exports.escapeWindowsPath = escapeWindowsPath; -function escapePosixPath(pattern) { - return pattern.replace(POSIX_UNESCAPED_GLOB_SYMBOLS_RE, '\\$2'); -} -exports.escapePosixPath = escapePosixPath; -exports.convertPathToPattern = IS_WINDOWS_PLATFORM ? convertWindowsPathToPattern : convertPosixPathToPattern; -function convertWindowsPathToPattern(filepath) { - return escapeWindowsPath(filepath) - .replace(DOS_DEVICE_PATH_RE, '//$1') - .replace(WINDOWS_BACKSLASHES_RE, '/'); -} -exports.convertWindowsPathToPattern = convertWindowsPathToPattern; -function convertPosixPathToPattern(filepath) { - return escapePosixPath(filepath); -} -exports.convertPosixPathToPattern = convertPosixPathToPattern; diff --git a/node_modules/fast-glob/out/utils/pattern.d.ts b/node_modules/fast-glob/out/utils/pattern.d.ts deleted file mode 100644 index e3598a9..0000000 --- a/node_modules/fast-glob/out/utils/pattern.d.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { MicromatchOptions, Pattern, PatternRe } from '../types'; -type PatternTypeOptions = { - braceExpansion?: boolean; - caseSensitiveMatch?: boolean; - extglob?: boolean; -}; -export declare function isStaticPattern(pattern: Pattern, options?: PatternTypeOptions): boolean; -export declare function isDynamicPattern(pattern: Pattern, options?: PatternTypeOptions): boolean; -export declare function convertToPositivePattern(pattern: Pattern): Pattern; -export declare function convertToNegativePattern(pattern: Pattern): Pattern; -export declare function isNegativePattern(pattern: Pattern): boolean; -export declare function isPositivePattern(pattern: Pattern): boolean; -export declare function getNegativePatterns(patterns: Pattern[]): Pattern[]; -export declare function getPositivePatterns(patterns: Pattern[]): Pattern[]; -/** - * Returns patterns that can be applied inside the current directory. - * - * @example - * // ['./*', '*', 'a/*'] - * getPatternsInsideCurrentDirectory(['./*', '*', 'a/*', '../*', './../*']) - */ -export declare function getPatternsInsideCurrentDirectory(patterns: Pattern[]): Pattern[]; -/** - * Returns patterns to be expanded relative to (outside) the current directory. - * - * @example - * // ['../*', './../*'] - * getPatternsInsideCurrentDirectory(['./*', '*', 'a/*', '../*', './../*']) - */ -export declare function getPatternsOutsideCurrentDirectory(patterns: Pattern[]): Pattern[]; -export declare function isPatternRelatedToParentDirectory(pattern: Pattern): boolean; -export declare function getBaseDirectory(pattern: Pattern): string; -export declare function hasGlobStar(pattern: Pattern): boolean; -export declare function endsWithSlashGlobStar(pattern: Pattern): boolean; -export declare function isAffectDepthOfReadingPattern(pattern: Pattern): boolean; -export declare function expandPatternsWithBraceExpansion(patterns: Pattern[]): Pattern[]; -export declare function expandBraceExpansion(pattern: Pattern): Pattern[]; -export declare function getPatternParts(pattern: Pattern, options: MicromatchOptions): Pattern[]; -export declare function makeRe(pattern: Pattern, options: MicromatchOptions): PatternRe; -export declare function convertPatternsToRe(patterns: Pattern[], options: MicromatchOptions): PatternRe[]; -export declare function matchAny(entry: string, patternsRe: PatternRe[]): boolean; -/** - * This package only works with forward slashes as a path separator. - * Because of this, we cannot use the standard `path.normalize` method, because on Windows platform it will use of backslashes. - */ -export declare function removeDuplicateSlashes(pattern: string): string; -export declare function partitionAbsoluteAndRelative(patterns: Pattern[]): Pattern[][]; -export declare function isAbsolute(pattern: string): boolean; -export {}; diff --git a/node_modules/fast-glob/out/utils/pattern.js b/node_modules/fast-glob/out/utils/pattern.js deleted file mode 100644 index b2924e7..0000000 --- a/node_modules/fast-glob/out/utils/pattern.js +++ /dev/null @@ -1,206 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.isAbsolute = exports.partitionAbsoluteAndRelative = exports.removeDuplicateSlashes = exports.matchAny = exports.convertPatternsToRe = exports.makeRe = exports.getPatternParts = exports.expandBraceExpansion = exports.expandPatternsWithBraceExpansion = exports.isAffectDepthOfReadingPattern = exports.endsWithSlashGlobStar = exports.hasGlobStar = exports.getBaseDirectory = exports.isPatternRelatedToParentDirectory = exports.getPatternsOutsideCurrentDirectory = exports.getPatternsInsideCurrentDirectory = exports.getPositivePatterns = exports.getNegativePatterns = exports.isPositivePattern = exports.isNegativePattern = exports.convertToNegativePattern = exports.convertToPositivePattern = exports.isDynamicPattern = exports.isStaticPattern = void 0; -const path = require("path"); -const globParent = require("glob-parent"); -const micromatch = require("micromatch"); -const GLOBSTAR = '**'; -const ESCAPE_SYMBOL = '\\'; -const COMMON_GLOB_SYMBOLS_RE = /[*?]|^!/; -const REGEX_CHARACTER_CLASS_SYMBOLS_RE = /\[[^[]*]/; -const REGEX_GROUP_SYMBOLS_RE = /(?:^|[^!*+?@])\([^(]*\|[^|]*\)/; -const GLOB_EXTENSION_SYMBOLS_RE = /[!*+?@]\([^(]*\)/; -const BRACE_EXPANSION_SEPARATORS_RE = /,|\.\./; -/** - * Matches a sequence of two or more consecutive slashes, excluding the first two slashes at the beginning of the string. - * The latter is due to the presence of the device path at the beginning of the UNC path. - */ -const DOUBLE_SLASH_RE = /(?!^)\/{2,}/g; -function isStaticPattern(pattern, options = {}) { - return !isDynamicPattern(pattern, options); -} -exports.isStaticPattern = isStaticPattern; -function isDynamicPattern(pattern, options = {}) { - /** - * A special case with an empty string is necessary for matching patterns that start with a forward slash. - * An empty string cannot be a dynamic pattern. - * For example, the pattern `/lib/*` will be spread into parts: '', 'lib', '*'. - */ - if (pattern === '') { - return false; - } - /** - * When the `caseSensitiveMatch` option is disabled, all patterns must be marked as dynamic, because we cannot check - * filepath directly (without read directory). - */ - if (options.caseSensitiveMatch === false || pattern.includes(ESCAPE_SYMBOL)) { - return true; - } - if (COMMON_GLOB_SYMBOLS_RE.test(pattern) || REGEX_CHARACTER_CLASS_SYMBOLS_RE.test(pattern) || REGEX_GROUP_SYMBOLS_RE.test(pattern)) { - return true; - } - if (options.extglob !== false && GLOB_EXTENSION_SYMBOLS_RE.test(pattern)) { - return true; - } - if (options.braceExpansion !== false && hasBraceExpansion(pattern)) { - return true; - } - return false; -} -exports.isDynamicPattern = isDynamicPattern; -function hasBraceExpansion(pattern) { - const openingBraceIndex = pattern.indexOf('{'); - if (openingBraceIndex === -1) { - return false; - } - const closingBraceIndex = pattern.indexOf('}', openingBraceIndex + 1); - if (closingBraceIndex === -1) { - return false; - } - const braceContent = pattern.slice(openingBraceIndex, closingBraceIndex); - return BRACE_EXPANSION_SEPARATORS_RE.test(braceContent); -} -function convertToPositivePattern(pattern) { - return isNegativePattern(pattern) ? pattern.slice(1) : pattern; -} -exports.convertToPositivePattern = convertToPositivePattern; -function convertToNegativePattern(pattern) { - return '!' + pattern; -} -exports.convertToNegativePattern = convertToNegativePattern; -function isNegativePattern(pattern) { - return pattern.startsWith('!') && pattern[1] !== '('; -} -exports.isNegativePattern = isNegativePattern; -function isPositivePattern(pattern) { - return !isNegativePattern(pattern); -} -exports.isPositivePattern = isPositivePattern; -function getNegativePatterns(patterns) { - return patterns.filter(isNegativePattern); -} -exports.getNegativePatterns = getNegativePatterns; -function getPositivePatterns(patterns) { - return patterns.filter(isPositivePattern); -} -exports.getPositivePatterns = getPositivePatterns; -/** - * Returns patterns that can be applied inside the current directory. - * - * @example - * // ['./*', '*', 'a/*'] - * getPatternsInsideCurrentDirectory(['./*', '*', 'a/*', '../*', './../*']) - */ -function getPatternsInsideCurrentDirectory(patterns) { - return patterns.filter((pattern) => !isPatternRelatedToParentDirectory(pattern)); -} -exports.getPatternsInsideCurrentDirectory = getPatternsInsideCurrentDirectory; -/** - * Returns patterns to be expanded relative to (outside) the current directory. - * - * @example - * // ['../*', './../*'] - * getPatternsInsideCurrentDirectory(['./*', '*', 'a/*', '../*', './../*']) - */ -function getPatternsOutsideCurrentDirectory(patterns) { - return patterns.filter(isPatternRelatedToParentDirectory); -} -exports.getPatternsOutsideCurrentDirectory = getPatternsOutsideCurrentDirectory; -function isPatternRelatedToParentDirectory(pattern) { - return pattern.startsWith('..') || pattern.startsWith('./..'); -} -exports.isPatternRelatedToParentDirectory = isPatternRelatedToParentDirectory; -function getBaseDirectory(pattern) { - return globParent(pattern, { flipBackslashes: false }); -} -exports.getBaseDirectory = getBaseDirectory; -function hasGlobStar(pattern) { - return pattern.includes(GLOBSTAR); -} -exports.hasGlobStar = hasGlobStar; -function endsWithSlashGlobStar(pattern) { - return pattern.endsWith('/' + GLOBSTAR); -} -exports.endsWithSlashGlobStar = endsWithSlashGlobStar; -function isAffectDepthOfReadingPattern(pattern) { - const basename = path.basename(pattern); - return endsWithSlashGlobStar(pattern) || isStaticPattern(basename); -} -exports.isAffectDepthOfReadingPattern = isAffectDepthOfReadingPattern; -function expandPatternsWithBraceExpansion(patterns) { - return patterns.reduce((collection, pattern) => { - return collection.concat(expandBraceExpansion(pattern)); - }, []); -} -exports.expandPatternsWithBraceExpansion = expandPatternsWithBraceExpansion; -function expandBraceExpansion(pattern) { - const patterns = micromatch.braces(pattern, { expand: true, nodupes: true, keepEscaping: true }); - /** - * Sort the patterns by length so that the same depth patterns are processed side by side. - * `a/{b,}/{c,}/*` – `['a///*', 'a/b//*', 'a//c/*', 'a/b/c/*']` - */ - patterns.sort((a, b) => a.length - b.length); - /** - * Micromatch can return an empty string in the case of patterns like `{a,}`. - */ - return patterns.filter((pattern) => pattern !== ''); -} -exports.expandBraceExpansion = expandBraceExpansion; -function getPatternParts(pattern, options) { - let { parts } = micromatch.scan(pattern, Object.assign(Object.assign({}, options), { parts: true })); - /** - * The scan method returns an empty array in some cases. - * See micromatch/picomatch#58 for more details. - */ - if (parts.length === 0) { - parts = [pattern]; - } - /** - * The scan method does not return an empty part for the pattern with a forward slash. - * This is another part of micromatch/picomatch#58. - */ - if (parts[0].startsWith('/')) { - parts[0] = parts[0].slice(1); - parts.unshift(''); - } - return parts; -} -exports.getPatternParts = getPatternParts; -function makeRe(pattern, options) { - return micromatch.makeRe(pattern, options); -} -exports.makeRe = makeRe; -function convertPatternsToRe(patterns, options) { - return patterns.map((pattern) => makeRe(pattern, options)); -} -exports.convertPatternsToRe = convertPatternsToRe; -function matchAny(entry, patternsRe) { - return patternsRe.some((patternRe) => patternRe.test(entry)); -} -exports.matchAny = matchAny; -/** - * This package only works with forward slashes as a path separator. - * Because of this, we cannot use the standard `path.normalize` method, because on Windows platform it will use of backslashes. - */ -function removeDuplicateSlashes(pattern) { - return pattern.replace(DOUBLE_SLASH_RE, '/'); -} -exports.removeDuplicateSlashes = removeDuplicateSlashes; -function partitionAbsoluteAndRelative(patterns) { - const absolute = []; - const relative = []; - for (const pattern of patterns) { - if (isAbsolute(pattern)) { - absolute.push(pattern); - } - else { - relative.push(pattern); - } - } - return [absolute, relative]; -} -exports.partitionAbsoluteAndRelative = partitionAbsoluteAndRelative; -function isAbsolute(pattern) { - return path.isAbsolute(pattern); -} -exports.isAbsolute = isAbsolute; diff --git a/node_modules/fast-glob/out/utils/stream.d.ts b/node_modules/fast-glob/out/utils/stream.d.ts deleted file mode 100644 index 4daf913..0000000 --- a/node_modules/fast-glob/out/utils/stream.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -/// -/// -import { Readable } from 'stream'; -export declare function merge(streams: Readable[]): NodeJS.ReadableStream; diff --git a/node_modules/fast-glob/out/utils/stream.js b/node_modules/fast-glob/out/utils/stream.js deleted file mode 100644 index b32028c..0000000 --- a/node_modules/fast-glob/out/utils/stream.js +++ /dev/null @@ -1,17 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.merge = void 0; -const merge2 = require("merge2"); -function merge(streams) { - const mergedStream = merge2(streams); - streams.forEach((stream) => { - stream.once('error', (error) => mergedStream.emit('error', error)); - }); - mergedStream.once('close', () => propagateCloseEventToSources(streams)); - mergedStream.once('end', () => propagateCloseEventToSources(streams)); - return mergedStream; -} -exports.merge = merge; -function propagateCloseEventToSources(streams) { - streams.forEach((stream) => stream.emit('close')); -} diff --git a/node_modules/fast-glob/out/utils/string.d.ts b/node_modules/fast-glob/out/utils/string.d.ts deleted file mode 100644 index c884735..0000000 --- a/node_modules/fast-glob/out/utils/string.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export declare function isString(input: unknown): input is string; -export declare function isEmpty(input: string): boolean; diff --git a/node_modules/fast-glob/out/utils/string.js b/node_modules/fast-glob/out/utils/string.js deleted file mode 100644 index 76e7ea5..0000000 --- a/node_modules/fast-glob/out/utils/string.js +++ /dev/null @@ -1,11 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.isEmpty = exports.isString = void 0; -function isString(input) { - return typeof input === 'string'; -} -exports.isString = isString; -function isEmpty(input) { - return input === ''; -} -exports.isEmpty = isEmpty; diff --git a/node_modules/fast-glob/package.json b/node_modules/fast-glob/package.json deleted file mode 100644 index e910de9..0000000 --- a/node_modules/fast-glob/package.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "name": "fast-glob", - "version": "3.3.3", - "description": "It's a very fast and efficient glob library for Node.js", - "license": "MIT", - "repository": "mrmlnc/fast-glob", - "author": { - "name": "Denis Malinochkin", - "url": "https://mrmlnc.com" - }, - "engines": { - "node": ">=8.6.0" - }, - "main": "out/index.js", - "typings": "out/index.d.ts", - "files": [ - "out", - "!out/{benchmark,tests}", - "!out/**/*.map", - "!out/**/*.spec.*" - ], - "keywords": [ - "glob", - "patterns", - "fast", - "implementation" - ], - "devDependencies": { - "@nodelib/fs.macchiato": "^1.0.1", - "@types/glob-parent": "^5.1.0", - "@types/merge2": "^1.1.4", - "@types/micromatch": "^4.0.0", - "@types/mocha": "^5.2.7", - "@types/node": "^14.18.53", - "@types/picomatch": "^2.3.0", - "@types/sinon": "^7.5.0", - "bencho": "^0.1.1", - "eslint": "^6.5.1", - "eslint-config-mrmlnc": "^1.1.0", - "execa": "^7.1.1", - "fast-glob": "^3.0.4", - "fdir": "6.0.1", - "glob": "^10.0.0", - "hereby": "^1.8.1", - "mocha": "^6.2.1", - "rimraf": "^5.0.0", - "sinon": "^7.5.0", - "snap-shot-it": "^7.9.10", - "typescript": "^4.9.5" - }, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "scripts": { - "clean": "rimraf out", - "lint": "eslint \"src/**/*.ts\" --cache", - "compile": "tsc", - "test": "mocha \"out/**/*.spec.js\" -s 0", - "test:e2e": "mocha \"out/**/*.e2e.js\" -s 0", - "test:e2e:sync": "mocha \"out/**/*.e2e.js\" -s 0 --grep \"\\(sync\\)\"", - "test:e2e:async": "mocha \"out/**/*.e2e.js\" -s 0 --grep \"\\(async\\)\"", - "test:e2e:stream": "mocha \"out/**/*.e2e.js\" -s 0 --grep \"\\(stream\\)\"", - "build": "npm run clean && npm run compile && npm run lint && npm test", - "watch": "npm run clean && npm run compile -- -- --sourceMap --watch", - "bench:async": "npm run bench:product:async && npm run bench:regression:async", - "bench:stream": "npm run bench:product:stream && npm run bench:regression:stream", - "bench:sync": "npm run bench:product:sync && npm run bench:regression:sync", - "bench:product": "npm run bench:product:async && npm run bench:product:sync && npm run bench:product:stream", - "bench:product:async": "hereby bench:product:async", - "bench:product:sync": "hereby bench:product:sync", - "bench:product:stream": "hereby bench:product:stream", - "bench:regression": "npm run bench:regression:async && npm run bench:regression:sync && npm run bench:regression:stream", - "bench:regression:async": "hereby bench:regression:async", - "bench:regression:sync": "hereby bench:regression:sync", - "bench:regression:stream": "hereby bench:regression:stream" - } -} diff --git a/node_modules/fastq/.github/dependabot.yml b/node_modules/fastq/.github/dependabot.yml deleted file mode 100644 index 7e7cbe1..0000000 --- a/node_modules/fastq/.github/dependabot.yml +++ /dev/null @@ -1,11 +0,0 @@ -version: 2 -updates: -- package-ecosystem: npm - directory: "/" - schedule: - interval: daily - open-pull-requests-limit: 10 - ignore: - - dependency-name: standard - versions: - - 16.0.3 diff --git a/node_modules/fastq/.github/workflows/ci.yml b/node_modules/fastq/.github/workflows/ci.yml deleted file mode 100644 index 09dc7a3..0000000 --- a/node_modules/fastq/.github/workflows/ci.yml +++ /dev/null @@ -1,75 +0,0 @@ -name: ci - -on: [push, pull_request] - -jobs: - legacy: - runs-on: ubuntu-latest - - strategy: - matrix: - node-version: ['0.10', '0.12', 4.x, 6.x, 8.x, 10.x, 12.x, 13.x, 14.x, 15.x, 16.x] - - steps: - - uses: actions/checkout@v3 - with: - persist-credentials: false - - - name: Use Node.js - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - - name: Install - run: | - npm install --production && npm install tape - - - name: Run tests - run: | - npm run legacy - - test: - runs-on: ubuntu-latest - - strategy: - matrix: - node-version: [18.x, 20.x, 22.x] - - steps: - - uses: actions/checkout@v3 - with: - persist-credentials: false - - - name: Use Node.js - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }} - - - name: Install - run: | - npm install - - - name: Run tests - run: | - npm run test - - types: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - with: - persist-credentials: false - - - name: Use Node.js - uses: actions/setup-node@v3 - with: - node-version: 16 - - - name: Install - run: | - npm install - - - name: Run types tests - run: | - npm run typescript diff --git a/node_modules/fastq/LICENSE b/node_modules/fastq/LICENSE deleted file mode 100644 index 27c7bb4..0000000 --- a/node_modules/fastq/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright (c) 2015-2020, Matteo Collina - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/fastq/README.md b/node_modules/fastq/README.md deleted file mode 100644 index 1644111..0000000 --- a/node_modules/fastq/README.md +++ /dev/null @@ -1,312 +0,0 @@ -# fastq - -![ci][ci-url] -[![npm version][npm-badge]][npm-url] - -Fast, in memory work queue. - -Benchmarks (1 million tasks): - -* setImmediate: 812ms -* fastq: 854ms -* async.queue: 1298ms -* neoAsync.queue: 1249ms - -Obtained on node 12.16.1, on a dedicated server. - -If you need zero-overhead series function call, check out -[fastseries](http://npm.im/fastseries). For zero-overhead parallel -function call, check out [fastparallel](http://npm.im/fastparallel). - -[![js-standard-style](https://raw.githubusercontent.com/feross/standard/master/badge.png)](https://github.com/feross/standard) - - * Installation - * Usage - * API - * Licence & copyright - -## Install - -`npm i fastq --save` - -## Usage (callback API) - -```js -'use strict' - -const queue = require('fastq')(worker, 1) - -queue.push(42, function (err, result) { - if (err) { throw err } - console.log('the result is', result) -}) - -function worker (arg, cb) { - cb(null, arg * 2) -} -``` - -## Usage (promise API) - -```js -const queue = require('fastq').promise(worker, 1) - -async function worker (arg) { - return arg * 2 -} - -async function run () { - const result = await queue.push(42) - console.log('the result is', result) -} - -run() -``` - -### Setting "this" - -```js -'use strict' - -const that = { hello: 'world' } -const queue = require('fastq')(that, worker, 1) - -queue.push(42, function (err, result) { - if (err) { throw err } - console.log(this) - console.log('the result is', result) -}) - -function worker (arg, cb) { - console.log(this) - cb(null, arg * 2) -} -``` - -### Using with TypeScript (callback API) - -```ts -'use strict' - -import * as fastq from "fastq"; -import type { queue, done } from "fastq"; - -type Task = { - id: number -} - -const q: queue = fastq(worker, 1) - -q.push({ id: 42}) - -function worker (arg: Task, cb: done) { - console.log(arg.id) - cb(null) -} -``` - -### Using with TypeScript (promise API) - -```ts -'use strict' - -import * as fastq from "fastq"; -import type { queueAsPromised } from "fastq"; - -type Task = { - id: number -} - -const q: queueAsPromised = fastq.promise(asyncWorker, 1) - -q.push({ id: 42}).catch((err) => console.error(err)) - -async function asyncWorker (arg: Task): Promise { - // No need for a try-catch block, fastq handles errors automatically - console.log(arg.id) -} -``` - -## API - -* fastqueue() -* queue#push() -* queue#unshift() -* queue#pause() -* queue#resume() -* queue#idle() -* queue#length() -* queue#getQueue() -* queue#kill() -* queue#killAndDrain() -* queue#error() -* queue#concurrency -* queue#drain -* queue#empty -* queue#saturated -* fastqueue.promise() - -------------------------------------------------------- - -### fastqueue([that], worker, concurrency) - -Creates a new queue. - -Arguments: - -* `that`, optional context of the `worker` function. -* `worker`, worker function, it would be called with `that` as `this`, - if that is specified. -* `concurrency`, number of concurrent tasks that could be executed in - parallel. - -------------------------------------------------------- - -### queue.push(task, done) - -Add a task at the end of the queue. `done(err, result)` will be called -when the task was processed. - -------------------------------------------------------- - -### queue.unshift(task, done) - -Add a task at the beginning of the queue. `done(err, result)` will be called -when the task was processed. - -------------------------------------------------------- - -### queue.pause() - -Pause the processing of tasks. Currently worked tasks are not -stopped. - -------------------------------------------------------- - -### queue.resume() - -Resume the processing of tasks. - -------------------------------------------------------- - -### queue.idle() - -Returns `false` if there are tasks being processed or waiting to be processed. -`true` otherwise. - -------------------------------------------------------- - -### queue.length() - -Returns the number of tasks waiting to be processed (in the queue). - -------------------------------------------------------- - -### queue.getQueue() - -Returns all the tasks be processed (in the queue). Returns empty array when there are no tasks - -------------------------------------------------------- - -### queue.kill() - -Removes all tasks waiting to be processed, and reset `drain` to an empty -function. - -------------------------------------------------------- - -### queue.killAndDrain() - -Same than `kill` but the `drain` function will be called before reset to empty. - -------------------------------------------------------- - -### queue.error(handler) - -Set a global error handler. `handler(err, task)` will be called -each time a task is completed, `err` will be not null if the task has thrown an error. - -------------------------------------------------------- - -### queue.concurrency - -Property that returns the number of concurrent tasks that could be executed in -parallel. It can be altered at runtime. - -------------------------------------------------------- - -### queue.paused - -Property (Read-Only) that returns `true` when the queue is in a paused state. - -------------------------------------------------------- - -### queue.drain - -Function that will be called when the last -item from the queue has been processed by a worker. -It can be altered at runtime. - -------------------------------------------------------- - -### queue.empty - -Function that will be called when the last -item from the queue has been assigned to a worker. -It can be altered at runtime. - -------------------------------------------------------- - -### queue.saturated - -Function that will be called when the queue hits the concurrency -limit. -It can be altered at runtime. - -------------------------------------------------------- - -### fastqueue.promise([that], worker(arg), concurrency) - -Creates a new queue with `Promise` apis. It also offers all the methods -and properties of the object returned by [`fastqueue`](#fastqueue) with the modified -[`push`](#pushPromise) and [`unshift`](#unshiftPromise) methods. - -Node v10+ is required to use the promisified version. - -Arguments: -* `that`, optional context of the `worker` function. -* `worker`, worker function, it would be called with `that` as `this`, - if that is specified. It MUST return a `Promise`. -* `concurrency`, number of concurrent tasks that could be executed in - parallel. - - -#### queue.push(task) => Promise - -Add a task at the end of the queue. The returned `Promise` will be fulfilled (rejected) -when the task is completed successfully (unsuccessfully). - -This promise could be ignored as it will not lead to a `'unhandledRejection'`. - - -#### queue.unshift(task) => Promise - -Add a task at the beginning of the queue. The returned `Promise` will be fulfilled (rejected) -when the task is completed successfully (unsuccessfully). - -This promise could be ignored as it will not lead to a `'unhandledRejection'`. - - -#### queue.drained() => Promise - -Wait for the queue to be drained. The returned `Promise` will be resolved when all tasks in the queue have been processed by a worker. - -This promise could be ignored as it will not lead to a `'unhandledRejection'`. - -## License - -ISC - -[ci-url]: https://github.com/mcollina/fastq/workflows/ci/badge.svg -[npm-badge]: https://badge.fury.io/js/fastq.svg -[npm-url]: https://badge.fury.io/js/fastq diff --git a/node_modules/fastq/SECURITY.md b/node_modules/fastq/SECURITY.md deleted file mode 100644 index dd9f1d5..0000000 --- a/node_modules/fastq/SECURITY.md +++ /dev/null @@ -1,15 +0,0 @@ -# Security Policy - -## Supported Versions - -Use this section to tell people about which versions of your project are -currently being supported with security updates. - -| Version | Supported | -| ------- | ------------------ | -| 1.x | :white_check_mark: | -| < 1.0 | :x: | - -## Reporting a Vulnerability - -Please report all vulnerabilities at [https://github.com/mcollina/fastq/security](https://github.com/mcollina/fastq/security). diff --git a/node_modules/fastq/bench.js b/node_modules/fastq/bench.js deleted file mode 100644 index 4eaa829..0000000 --- a/node_modules/fastq/bench.js +++ /dev/null @@ -1,66 +0,0 @@ -'use strict' - -const max = 1000000 -const fastqueue = require('./')(worker, 1) -const { promisify } = require('util') -const immediate = promisify(setImmediate) -const qPromise = require('./').promise(immediate, 1) -const async = require('async') -const neo = require('neo-async') -const asyncqueue = async.queue(worker, 1) -const neoqueue = neo.queue(worker, 1) - -function bench (func, done) { - const key = max + '*' + func.name - let count = -1 - - console.time(key) - end() - - function end () { - if (++count < max) { - func(end) - } else { - console.timeEnd(key) - if (done) { - done() - } - } - } -} - -function benchFastQ (done) { - fastqueue.push(42, done) -} - -function benchAsyncQueue (done) { - asyncqueue.push(42, done) -} - -function benchNeoQueue (done) { - neoqueue.push(42, done) -} - -function worker (arg, cb) { - setImmediate(cb) -} - -function benchSetImmediate (cb) { - worker(42, cb) -} - -function benchFastQPromise (done) { - qPromise.push(42).then(function () { done() }, done) -} - -function runBench (done) { - async.eachSeries([ - benchSetImmediate, - benchFastQ, - benchNeoQueue, - benchAsyncQueue, - benchFastQPromise - ], bench, done) -} - -runBench(runBench) diff --git a/node_modules/fastq/example.js b/node_modules/fastq/example.js deleted file mode 100644 index 665fdc8..0000000 --- a/node_modules/fastq/example.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict' - -/* eslint-disable no-var */ - -var queue = require('./')(worker, 1) - -queue.push(42, function (err, result) { - if (err) { throw err } - console.log('the result is', result) -}) - -function worker (arg, cb) { - cb(null, 42 * 2) -} diff --git a/node_modules/fastq/example.mjs b/node_modules/fastq/example.mjs deleted file mode 100644 index 81be789..0000000 --- a/node_modules/fastq/example.mjs +++ /dev/null @@ -1,11 +0,0 @@ -import { promise as queueAsPromised } from './queue.js' - -/* eslint-disable */ - -const queue = queueAsPromised(worker, 1) - -console.log('the result is', await queue.push(42)) - -async function worker (arg) { - return 42 * 2 -} diff --git a/node_modules/fastq/index.d.ts b/node_modules/fastq/index.d.ts deleted file mode 100644 index 817cdb5..0000000 --- a/node_modules/fastq/index.d.ts +++ /dev/null @@ -1,57 +0,0 @@ -declare function fastq(context: C, worker: fastq.worker, concurrency: number): fastq.queue -declare function fastq(worker: fastq.worker, concurrency: number): fastq.queue - -declare namespace fastq { - type worker = (this: C, task: T, cb: fastq.done) => void - type asyncWorker = (this: C, task: T) => Promise - type done = (err: Error | null, result?: R) => void - type errorHandler = (err: Error, task: T) => void - - interface queue { - /** Add a task at the end of the queue. `done(err, result)` will be called when the task was processed. */ - push(task: T, done?: done): void - /** Add a task at the beginning of the queue. `done(err, result)` will be called when the task was processed. */ - unshift(task: T, done?: done): void - /** Pause the processing of tasks. Currently worked tasks are not stopped. */ - pause(): any - /** Resume the processing of tasks. */ - resume(): any - running(): number - /** Returns `false` if there are tasks being processed or waiting to be processed. `true` otherwise. */ - idle(): boolean - /** Returns the number of tasks waiting to be processed (in the queue). */ - length(): number - /** Returns all the tasks be processed (in the queue). Returns empty array when there are no tasks */ - getQueue(): T[] - /** Removes all tasks waiting to be processed, and reset `drain` to an empty function. */ - kill(): any - /** Same than `kill` but the `drain` function will be called before reset to empty. */ - killAndDrain(): any - /** Set a global error handler. `handler(err, task)` will be called each time a task is completed, `err` will be not null if the task has thrown an error. */ - error(handler: errorHandler): void - /** Property that returns the number of concurrent tasks that could be executed in parallel. It can be altered at runtime. */ - concurrency: number - /** Property (Read-Only) that returns `true` when the queue is in a paused state. */ - readonly paused: boolean - /** Function that will be called when the last item from the queue has been processed by a worker. It can be altered at runtime. */ - drain(): any - /** Function that will be called when the last item from the queue has been assigned to a worker. It can be altered at runtime. */ - empty: () => void - /** Function that will be called when the queue hits the concurrency limit. It can be altered at runtime. */ - saturated: () => void - } - - interface queueAsPromised extends queue { - /** Add a task at the end of the queue. The returned `Promise` will be fulfilled (rejected) when the task is completed successfully (unsuccessfully). */ - push(task: T): Promise - /** Add a task at the beginning of the queue. The returned `Promise` will be fulfilled (rejected) when the task is completed successfully (unsuccessfully). */ - unshift(task: T): Promise - /** Wait for the queue to be drained. The returned `Promise` will be resolved when all tasks in the queue have been processed by a worker. */ - drained(): Promise - } - - function promise(context: C, worker: fastq.asyncWorker, concurrency: number): fastq.queueAsPromised - function promise(worker: fastq.asyncWorker, concurrency: number): fastq.queueAsPromised -} - -export = fastq diff --git a/node_modules/fastq/package.json b/node_modules/fastq/package.json deleted file mode 100644 index 989151f..0000000 --- a/node_modules/fastq/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "fastq", - "version": "1.19.1", - "description": "Fast, in memory work queue", - "main": "queue.js", - "scripts": { - "lint": "standard --verbose | snazzy", - "unit": "nyc --lines 100 --branches 100 --functions 100 --check-coverage --reporter=text tape test/test.js test/promise.js", - "coverage": "nyc --reporter=html --reporter=cobertura --reporter=text tape test/test.js test/promise.js", - "test:report": "npm run lint && npm run unit:report", - "test": "npm run lint && npm run unit", - "typescript": "tsc --project ./test/tsconfig.json", - "legacy": "tape test/test.js" - }, - "pre-commit": [ - "test", - "typescript" - ], - "repository": { - "type": "git", - "url": "git+https://github.com/mcollina/fastq.git" - }, - "keywords": [ - "fast", - "queue", - "async", - "worker" - ], - "author": "Matteo Collina ", - "license": "ISC", - "bugs": { - "url": "https://github.com/mcollina/fastq/issues" - }, - "homepage": "https://github.com/mcollina/fastq#readme", - "devDependencies": { - "async": "^3.1.0", - "neo-async": "^2.6.1", - "nyc": "^17.0.0", - "pre-commit": "^1.2.2", - "snazzy": "^9.0.0", - "standard": "^16.0.0", - "tape": "^5.0.0", - "typescript": "^5.0.4" - }, - "dependencies": { - "reusify": "^1.0.4" - }, - "standard": { - "ignore": [ - "example.mjs" - ] - } -} diff --git a/node_modules/fastq/queue.js b/node_modules/fastq/queue.js deleted file mode 100644 index 7ea8a31..0000000 --- a/node_modules/fastq/queue.js +++ /dev/null @@ -1,311 +0,0 @@ -'use strict' - -/* eslint-disable no-var */ - -var reusify = require('reusify') - -function fastqueue (context, worker, _concurrency) { - if (typeof context === 'function') { - _concurrency = worker - worker = context - context = null - } - - if (!(_concurrency >= 1)) { - throw new Error('fastqueue concurrency must be equal to or greater than 1') - } - - var cache = reusify(Task) - var queueHead = null - var queueTail = null - var _running = 0 - var errorHandler = null - - var self = { - push: push, - drain: noop, - saturated: noop, - pause: pause, - paused: false, - - get concurrency () { - return _concurrency - }, - set concurrency (value) { - if (!(value >= 1)) { - throw new Error('fastqueue concurrency must be equal to or greater than 1') - } - _concurrency = value - - if (self.paused) return - for (; queueHead && _running < _concurrency;) { - _running++ - release() - } - }, - - running: running, - resume: resume, - idle: idle, - length: length, - getQueue: getQueue, - unshift: unshift, - empty: noop, - kill: kill, - killAndDrain: killAndDrain, - error: error - } - - return self - - function running () { - return _running - } - - function pause () { - self.paused = true - } - - function length () { - var current = queueHead - var counter = 0 - - while (current) { - current = current.next - counter++ - } - - return counter - } - - function getQueue () { - var current = queueHead - var tasks = [] - - while (current) { - tasks.push(current.value) - current = current.next - } - - return tasks - } - - function resume () { - if (!self.paused) return - self.paused = false - if (queueHead === null) { - _running++ - release() - return - } - for (; queueHead && _running < _concurrency;) { - _running++ - release() - } - } - - function idle () { - return _running === 0 && self.length() === 0 - } - - function push (value, done) { - var current = cache.get() - - current.context = context - current.release = release - current.value = value - current.callback = done || noop - current.errorHandler = errorHandler - - if (_running >= _concurrency || self.paused) { - if (queueTail) { - queueTail.next = current - queueTail = current - } else { - queueHead = current - queueTail = current - self.saturated() - } - } else { - _running++ - worker.call(context, current.value, current.worked) - } - } - - function unshift (value, done) { - var current = cache.get() - - current.context = context - current.release = release - current.value = value - current.callback = done || noop - current.errorHandler = errorHandler - - if (_running >= _concurrency || self.paused) { - if (queueHead) { - current.next = queueHead - queueHead = current - } else { - queueHead = current - queueTail = current - self.saturated() - } - } else { - _running++ - worker.call(context, current.value, current.worked) - } - } - - function release (holder) { - if (holder) { - cache.release(holder) - } - var next = queueHead - if (next && _running <= _concurrency) { - if (!self.paused) { - if (queueTail === queueHead) { - queueTail = null - } - queueHead = next.next - next.next = null - worker.call(context, next.value, next.worked) - if (queueTail === null) { - self.empty() - } - } else { - _running-- - } - } else if (--_running === 0) { - self.drain() - } - } - - function kill () { - queueHead = null - queueTail = null - self.drain = noop - } - - function killAndDrain () { - queueHead = null - queueTail = null - self.drain() - self.drain = noop - } - - function error (handler) { - errorHandler = handler - } -} - -function noop () {} - -function Task () { - this.value = null - this.callback = noop - this.next = null - this.release = noop - this.context = null - this.errorHandler = null - - var self = this - - this.worked = function worked (err, result) { - var callback = self.callback - var errorHandler = self.errorHandler - var val = self.value - self.value = null - self.callback = noop - if (self.errorHandler) { - errorHandler(err, val) - } - callback.call(self.context, err, result) - self.release(self) - } -} - -function queueAsPromised (context, worker, _concurrency) { - if (typeof context === 'function') { - _concurrency = worker - worker = context - context = null - } - - function asyncWrapper (arg, cb) { - worker.call(this, arg) - .then(function (res) { - cb(null, res) - }, cb) - } - - var queue = fastqueue(context, asyncWrapper, _concurrency) - - var pushCb = queue.push - var unshiftCb = queue.unshift - - queue.push = push - queue.unshift = unshift - queue.drained = drained - - return queue - - function push (value) { - var p = new Promise(function (resolve, reject) { - pushCb(value, function (err, result) { - if (err) { - reject(err) - return - } - resolve(result) - }) - }) - - // Let's fork the promise chain to - // make the error bubble up to the user but - // not lead to a unhandledRejection - p.catch(noop) - - return p - } - - function unshift (value) { - var p = new Promise(function (resolve, reject) { - unshiftCb(value, function (err, result) { - if (err) { - reject(err) - return - } - resolve(result) - }) - }) - - // Let's fork the promise chain to - // make the error bubble up to the user but - // not lead to a unhandledRejection - p.catch(noop) - - return p - } - - function drained () { - var p = new Promise(function (resolve) { - process.nextTick(function () { - if (queue.idle()) { - resolve() - } else { - var previousDrain = queue.drain - queue.drain = function () { - if (typeof previousDrain === 'function') previousDrain() - resolve() - queue.drain = previousDrain - } - } - }) - }) - - return p - } -} - -module.exports = fastqueue -module.exports.promise = queueAsPromised diff --git a/node_modules/fastq/test/example.ts b/node_modules/fastq/test/example.ts deleted file mode 100644 index a47d441..0000000 --- a/node_modules/fastq/test/example.ts +++ /dev/null @@ -1,83 +0,0 @@ -import * as fastq from '../' -import { promise as queueAsPromised } from '../' - -// Basic example - -const queue = fastq(worker, 1) - -queue.push('world', (err, result) => { - if (err) throw err - console.log('the result is', result) -}) - -queue.push('push without cb') - -queue.concurrency - -queue.drain() - -queue.empty = () => undefined - -console.log('the queue tasks are', queue.getQueue()) - -queue.idle() - -queue.kill() - -queue.killAndDrain() - -queue.length - -queue.pause() - -queue.resume() - -queue.running() - -queue.saturated = () => undefined - -queue.unshift('world', (err, result) => { - if (err) throw err - console.log('the result is', result) -}) - -queue.unshift('unshift without cb') - -function worker(task: any, cb: fastq.done) { - cb(null, 'hello ' + task) -} - -// Generics example - -interface GenericsContext { - base: number; -} - -const genericsQueue = fastq({ base: 6 }, genericsWorker, 1) - -genericsQueue.push(7, (err, done) => { - if (err) throw err - console.log('the result is', done) -}) - -genericsQueue.unshift(7, (err, done) => { - if (err) throw err - console.log('the result is', done) -}) - -function genericsWorker(this: GenericsContext, task: number, cb: fastq.done) { - cb(null, 'the meaning of life is ' + (this.base * task)) -} - -const queue2 = queueAsPromised(asyncWorker, 1) - -async function asyncWorker(task: any) { - return 'hello ' + task -} - -async function run () { - await queue.push(42) - await queue.unshift(42) -} - -run() diff --git a/node_modules/fastq/test/promise.js b/node_modules/fastq/test/promise.js deleted file mode 100644 index 45349a4..0000000 --- a/node_modules/fastq/test/promise.js +++ /dev/null @@ -1,291 +0,0 @@ -'use strict' - -const test = require('tape') -const buildQueue = require('../').promise -const { promisify } = require('util') -const sleep = promisify(setTimeout) -const immediate = promisify(setImmediate) - -test('concurrency', function (t) { - t.plan(2) - t.throws(buildQueue.bind(null, worker, 0)) - t.doesNotThrow(buildQueue.bind(null, worker, 1)) - - async function worker (arg) { - return true - } -}) - -test('worker execution', async function (t) { - const queue = buildQueue(worker, 1) - - const result = await queue.push(42) - - t.equal(result, true, 'result matches') - - async function worker (arg) { - t.equal(arg, 42) - return true - } -}) - -test('limit', async function (t) { - const queue = buildQueue(worker, 1) - - const [res1, res2] = await Promise.all([queue.push(10), queue.push(0)]) - t.equal(res1, 10, 'the result matches') - t.equal(res2, 0, 'the result matches') - - async function worker (arg) { - await sleep(arg) - return arg - } -}) - -test('multiple executions', async function (t) { - const queue = buildQueue(worker, 1) - const toExec = [1, 2, 3, 4, 5] - const expected = ['a', 'b', 'c', 'd', 'e'] - let count = 0 - - await Promise.all(toExec.map(async function (task, i) { - const result = await queue.push(task) - t.equal(result, expected[i], 'the result matches') - })) - - async function worker (arg) { - t.equal(arg, toExec[count], 'arg matches') - return expected[count++] - } -}) - -test('drained', async function (t) { - const queue = buildQueue(worker, 2) - - const toExec = new Array(10).fill(10) - let count = 0 - - async function worker (arg) { - await sleep(arg) - count++ - } - - toExec.forEach(function (i) { - queue.push(i) - }) - - await queue.drained() - - t.equal(count, toExec.length) - - toExec.forEach(function (i) { - queue.push(i) - }) - - await queue.drained() - - t.equal(count, toExec.length * 2) -}) - -test('drained with exception should not throw', async function (t) { - const queue = buildQueue(worker, 2) - - const toExec = new Array(10).fill(10) - - async function worker () { - throw new Error('foo') - } - - toExec.forEach(function (i) { - queue.push(i) - }) - - await queue.drained() -}) - -test('drained with drain function', async function (t) { - let drainCalled = false - const queue = buildQueue(worker, 2) - - queue.drain = function () { - drainCalled = true - } - - const toExec = new Array(10).fill(10) - let count = 0 - - async function worker (arg) { - await sleep(arg) - count++ - } - - toExec.forEach(function () { - queue.push() - }) - - await queue.drained() - - t.equal(count, toExec.length) - t.equal(drainCalled, true) -}) - -test('drained while idle should resolve', async function (t) { - const queue = buildQueue(worker, 2) - - async function worker (arg) { - await sleep(arg) - } - - await queue.drained() -}) - -test('drained while idle should not call the drain function', async function (t) { - let drainCalled = false - const queue = buildQueue(worker, 2) - - queue.drain = function () { - drainCalled = true - } - - async function worker (arg) { - await sleep(arg) - } - - await queue.drained() - - t.equal(drainCalled, false) -}) - -test('set this', async function (t) { - t.plan(1) - const that = {} - const queue = buildQueue(that, worker, 1) - - await queue.push(42) - - async function worker (arg) { - t.equal(this, that, 'this matches') - } -}) - -test('unshift', async function (t) { - const queue = buildQueue(worker, 1) - const expected = [1, 2, 3, 4] - - await Promise.all([ - queue.push(1), - queue.push(4), - queue.unshift(3), - queue.unshift(2) - ]) - - t.is(expected.length, 0) - - async function worker (arg) { - t.equal(expected.shift(), arg, 'tasks come in order') - } -}) - -test('push with worker throwing error', async function (t) { - t.plan(5) - const q = buildQueue(async function (task, cb) { - throw new Error('test error') - }, 1) - q.error(function (err, task) { - t.ok(err instanceof Error, 'global error handler should catch the error') - t.match(err.message, /test error/, 'error message should be "test error"') - t.equal(task, 42, 'The task executed should be passed') - }) - try { - await q.push(42) - } catch (err) { - t.ok(err instanceof Error, 'push callback should catch the error') - t.match(err.message, /test error/, 'error message should be "test error"') - } -}) - -test('unshift with worker throwing error', async function (t) { - t.plan(2) - const q = buildQueue(async function (task, cb) { - throw new Error('test error') - }, 1) - try { - await q.unshift(42) - } catch (err) { - t.ok(err instanceof Error, 'push callback should catch the error') - t.match(err.message, /test error/, 'error message should be "test error"') - } -}) - -test('no unhandledRejection (push)', async function (t) { - function handleRejection () { - t.fail('unhandledRejection') - } - process.once('unhandledRejection', handleRejection) - const q = buildQueue(async function (task, cb) { - throw new Error('test error') - }, 1) - - q.push(42) - - await immediate() - process.removeListener('unhandledRejection', handleRejection) -}) - -test('no unhandledRejection (unshift)', async function (t) { - function handleRejection () { - t.fail('unhandledRejection') - } - process.once('unhandledRejection', handleRejection) - const q = buildQueue(async function (task, cb) { - throw new Error('test error') - }, 1) - - q.unshift(42) - - await immediate() - process.removeListener('unhandledRejection', handleRejection) -}) - -test('drained should resolve after async tasks complete', async function (t) { - const logs = [] - - async function processTask () { - await new Promise(resolve => setTimeout(resolve, 0)) - logs.push('processed') - } - - const queue = buildQueue(processTask, 1) - queue.drain = () => logs.push('called drain') - - queue.drained().then(() => logs.push('drained promise resolved')) - - await Promise.all([ - queue.push(), - queue.push(), - queue.push() - ]) - - t.deepEqual(logs, [ - 'processed', - 'processed', - 'processed', - 'called drain', - 'drained promise resolved' - ], 'events happened in correct order') -}) - -test('drained should handle undefined drain function', async function (t) { - const queue = buildQueue(worker, 1) - - async function worker (arg) { - await sleep(10) - return arg - } - - queue.drain = undefined - queue.push(1) - await queue.drained() - - t.pass('drained resolved successfully with undefined drain') -}) diff --git a/node_modules/fastq/test/test.js b/node_modules/fastq/test/test.js deleted file mode 100644 index 79f0f6c..0000000 --- a/node_modules/fastq/test/test.js +++ /dev/null @@ -1,653 +0,0 @@ -'use strict' - -/* eslint-disable no-var */ - -var test = require('tape') -var buildQueue = require('../') - -test('concurrency', function (t) { - t.plan(6) - t.throws(buildQueue.bind(null, worker, 0)) - t.throws(buildQueue.bind(null, worker, NaN)) - t.doesNotThrow(buildQueue.bind(null, worker, 1)) - - var queue = buildQueue(worker, 1) - t.throws(function () { - queue.concurrency = 0 - }) - t.throws(function () { - queue.concurrency = NaN - }) - t.doesNotThrow(function () { - queue.concurrency = 2 - }) - - function worker (arg, cb) { - cb(null, true) - } -}) - -test('worker execution', function (t) { - t.plan(3) - - var queue = buildQueue(worker, 1) - - queue.push(42, function (err, result) { - t.error(err, 'no error') - t.equal(result, true, 'result matches') - }) - - function worker (arg, cb) { - t.equal(arg, 42) - cb(null, true) - } -}) - -test('limit', function (t) { - t.plan(4) - - var expected = [10, 0] - var queue = buildQueue(worker, 1) - - queue.push(10, result) - queue.push(0, result) - - function result (err, arg) { - t.error(err, 'no error') - t.equal(arg, expected.shift(), 'the result matches') - } - - function worker (arg, cb) { - setTimeout(cb, arg, null, arg) - } -}) - -test('multiple executions', function (t) { - t.plan(15) - - var queue = buildQueue(worker, 1) - var toExec = [1, 2, 3, 4, 5] - var count = 0 - - toExec.forEach(function (task) { - queue.push(task, done) - }) - - function done (err, result) { - t.error(err, 'no error') - t.equal(result, toExec[count - 1], 'the result matches') - } - - function worker (arg, cb) { - t.equal(arg, toExec[count], 'arg matches') - count++ - setImmediate(cb, null, arg) - } -}) - -test('multiple executions, one after another', function (t) { - t.plan(15) - - var queue = buildQueue(worker, 1) - var toExec = [1, 2, 3, 4, 5] - var count = 0 - - queue.push(toExec[0], done) - - function done (err, result) { - t.error(err, 'no error') - t.equal(result, toExec[count - 1], 'the result matches') - if (count < toExec.length) { - queue.push(toExec[count], done) - } - } - - function worker (arg, cb) { - t.equal(arg, toExec[count], 'arg matches') - count++ - setImmediate(cb, null, arg) - } -}) - -test('set this', function (t) { - t.plan(3) - - var that = {} - var queue = buildQueue(that, worker, 1) - - queue.push(42, function (err, result) { - t.error(err, 'no error') - t.equal(this, that, 'this matches') - }) - - function worker (arg, cb) { - t.equal(this, that, 'this matches') - cb(null, true) - } -}) - -test('drain', function (t) { - t.plan(4) - - var queue = buildQueue(worker, 1) - var worked = false - - queue.push(42, function (err, result) { - t.error(err, 'no error') - t.equal(result, true, 'result matches') - }) - - queue.drain = function () { - t.equal(true, worked, 'drained') - } - - function worker (arg, cb) { - t.equal(arg, 42) - worked = true - setImmediate(cb, null, true) - } -}) - -test('pause && resume', function (t) { - t.plan(13) - - var queue = buildQueue(worker, 1) - var worked = false - var expected = [42, 24] - - t.notOk(queue.paused, 'it should not be paused') - - queue.pause() - - queue.push(42, function (err, result) { - t.error(err, 'no error') - t.equal(result, true, 'result matches') - }) - - queue.push(24, function (err, result) { - t.error(err, 'no error') - t.equal(result, true, 'result matches') - }) - - t.notOk(worked, 'it should be paused') - t.ok(queue.paused, 'it should be paused') - - queue.resume() - queue.pause() - queue.resume() - queue.resume() // second resume is a no-op - - function worker (arg, cb) { - t.notOk(queue.paused, 'it should not be paused') - t.ok(queue.running() <= queue.concurrency, 'should respect the concurrency') - t.equal(arg, expected.shift()) - worked = true - process.nextTick(function () { cb(null, true) }) - } -}) - -test('pause in flight && resume', function (t) { - t.plan(16) - - var queue = buildQueue(worker, 1) - var expected = [42, 24, 12] - - t.notOk(queue.paused, 'it should not be paused') - - queue.push(42, function (err, result) { - t.error(err, 'no error') - t.equal(result, true, 'result matches') - t.ok(queue.paused, 'it should be paused') - process.nextTick(function () { - queue.resume() - queue.pause() - queue.resume() - }) - }) - - queue.push(24, function (err, result) { - t.error(err, 'no error') - t.equal(result, true, 'result matches') - t.notOk(queue.paused, 'it should not be paused') - }) - - queue.push(12, function (err, result) { - t.error(err, 'no error') - t.equal(result, true, 'result matches') - t.notOk(queue.paused, 'it should not be paused') - }) - - queue.pause() - - function worker (arg, cb) { - t.ok(queue.running() <= queue.concurrency, 'should respect the concurrency') - t.equal(arg, expected.shift()) - process.nextTick(function () { cb(null, true) }) - } -}) - -test('altering concurrency', function (t) { - t.plan(24) - - var queue = buildQueue(worker, 1) - - queue.push(24, workDone) - queue.push(24, workDone) - queue.push(24, workDone) - - queue.pause() - - queue.concurrency = 3 // concurrency changes are ignored while paused - queue.concurrency = 2 - - queue.resume() - - t.equal(queue.running(), 2, '2 jobs running') - - queue.concurrency = 3 - - t.equal(queue.running(), 3, '3 jobs running') - - queue.concurrency = 1 - - t.equal(queue.running(), 3, '3 jobs running') // running jobs can't be killed - - queue.push(24, workDone) - queue.push(24, workDone) - queue.push(24, workDone) - queue.push(24, workDone) - - function workDone (err, result) { - t.error(err, 'no error') - t.equal(result, true, 'result matches') - } - - function worker (arg, cb) { - t.ok(queue.running() <= queue.concurrency, 'should respect the concurrency') - setImmediate(function () { - cb(null, true) - }) - } -}) - -test('idle()', function (t) { - t.plan(12) - - var queue = buildQueue(worker, 1) - - t.ok(queue.idle(), 'queue is idle') - - queue.push(42, function (err, result) { - t.error(err, 'no error') - t.equal(result, true, 'result matches') - t.notOk(queue.idle(), 'queue is not idle') - }) - - queue.push(42, function (err, result) { - t.error(err, 'no error') - t.equal(result, true, 'result matches') - // it will go idle after executing this function - setImmediate(function () { - t.ok(queue.idle(), 'queue is now idle') - }) - }) - - t.notOk(queue.idle(), 'queue is not idle') - - function worker (arg, cb) { - t.notOk(queue.idle(), 'queue is not idle') - t.equal(arg, 42) - setImmediate(cb, null, true) - } -}) - -test('saturated', function (t) { - t.plan(9) - - var queue = buildQueue(worker, 1) - var preworked = 0 - var worked = 0 - - queue.saturated = function () { - t.pass('saturated') - t.equal(preworked, 1, 'started 1 task') - t.equal(worked, 0, 'worked zero task') - } - - queue.push(42, done) - queue.push(42, done) - - function done (err, result) { - t.error(err, 'no error') - t.equal(result, true, 'result matches') - } - - function worker (arg, cb) { - t.equal(arg, 42) - preworked++ - setImmediate(function () { - worked++ - cb(null, true) - }) - } -}) - -test('length', function (t) { - t.plan(7) - - var queue = buildQueue(worker, 1) - - t.equal(queue.length(), 0, 'nothing waiting') - queue.push(42, done) - t.equal(queue.length(), 0, 'nothing waiting') - queue.push(42, done) - t.equal(queue.length(), 1, 'one task waiting') - queue.push(42, done) - t.equal(queue.length(), 2, 'two tasks waiting') - - function done (err, result) { - t.error(err, 'no error') - } - - function worker (arg, cb) { - setImmediate(function () { - cb(null, true) - }) - } -}) - -test('getQueue', function (t) { - t.plan(10) - - var queue = buildQueue(worker, 1) - - t.equal(queue.getQueue().length, 0, 'nothing waiting') - queue.push(42, done) - t.equal(queue.getQueue().length, 0, 'nothing waiting') - queue.push(42, done) - t.equal(queue.getQueue().length, 1, 'one task waiting') - t.equal(queue.getQueue()[0], 42, 'should be equal') - queue.push(43, done) - t.equal(queue.getQueue().length, 2, 'two tasks waiting') - t.equal(queue.getQueue()[0], 42, 'should be equal') - t.equal(queue.getQueue()[1], 43, 'should be equal') - - function done (err, result) { - t.error(err, 'no error') - } - - function worker (arg, cb) { - setImmediate(function () { - cb(null, true) - }) - } -}) - -test('unshift', function (t) { - t.plan(8) - - var queue = buildQueue(worker, 1) - var expected = [1, 2, 3, 4] - - queue.push(1, done) - queue.push(4, done) - queue.unshift(3, done) - queue.unshift(2, done) - - function done (err, result) { - t.error(err, 'no error') - } - - function worker (arg, cb) { - t.equal(expected.shift(), arg, 'tasks come in order') - setImmediate(function () { - cb(null, true) - }) - } -}) - -test('unshift && empty', function (t) { - t.plan(2) - - var queue = buildQueue(worker, 1) - var completed = false - - queue.pause() - - queue.empty = function () { - t.notOk(completed, 'the task has not completed yet') - } - - queue.unshift(1, done) - - queue.resume() - - function done (err, result) { - completed = true - t.error(err, 'no error') - } - - function worker (arg, cb) { - setImmediate(function () { - cb(null, true) - }) - } -}) - -test('push && empty', function (t) { - t.plan(2) - - var queue = buildQueue(worker, 1) - var completed = false - - queue.pause() - - queue.empty = function () { - t.notOk(completed, 'the task has not completed yet') - } - - queue.push(1, done) - - queue.resume() - - function done (err, result) { - completed = true - t.error(err, 'no error') - } - - function worker (arg, cb) { - setImmediate(function () { - cb(null, true) - }) - } -}) - -test('kill', function (t) { - t.plan(5) - - var queue = buildQueue(worker, 1) - var expected = [1] - - var predrain = queue.drain - - queue.drain = function drain () { - t.fail('drain should never be called') - } - - queue.push(1, done) - queue.push(4, done) - queue.unshift(3, done) - queue.unshift(2, done) - queue.kill() - - function done (err, result) { - t.error(err, 'no error') - setImmediate(function () { - t.equal(queue.length(), 0, 'no queued tasks') - t.equal(queue.running(), 0, 'no running tasks') - t.equal(queue.drain, predrain, 'drain is back to default') - }) - } - - function worker (arg, cb) { - t.equal(expected.shift(), arg, 'tasks come in order') - setImmediate(function () { - cb(null, true) - }) - } -}) - -test('killAndDrain', function (t) { - t.plan(6) - - var queue = buildQueue(worker, 1) - var expected = [1] - - var predrain = queue.drain - - queue.drain = function drain () { - t.pass('drain has been called') - } - - queue.push(1, done) - queue.push(4, done) - queue.unshift(3, done) - queue.unshift(2, done) - queue.killAndDrain() - - function done (err, result) { - t.error(err, 'no error') - setImmediate(function () { - t.equal(queue.length(), 0, 'no queued tasks') - t.equal(queue.running(), 0, 'no running tasks') - t.equal(queue.drain, predrain, 'drain is back to default') - }) - } - - function worker (arg, cb) { - t.equal(expected.shift(), arg, 'tasks come in order') - setImmediate(function () { - cb(null, true) - }) - } -}) - -test('pause && idle', function (t) { - t.plan(11) - - var queue = buildQueue(worker, 1) - var worked = false - - t.notOk(queue.paused, 'it should not be paused') - t.ok(queue.idle(), 'should be idle') - - queue.pause() - - queue.push(42, function (err, result) { - t.error(err, 'no error') - t.equal(result, true, 'result matches') - }) - - t.notOk(worked, 'it should be paused') - t.ok(queue.paused, 'it should be paused') - t.notOk(queue.idle(), 'should not be idle') - - queue.resume() - - t.notOk(queue.paused, 'it should not be paused') - t.notOk(queue.idle(), 'it should not be idle') - - function worker (arg, cb) { - t.equal(arg, 42) - worked = true - process.nextTick(cb.bind(null, null, true)) - process.nextTick(function () { - t.ok(queue.idle(), 'is should be idle') - }) - } -}) - -test('push without cb', function (t) { - t.plan(1) - - var queue = buildQueue(worker, 1) - - queue.push(42) - - function worker (arg, cb) { - t.equal(arg, 42) - cb() - } -}) - -test('unshift without cb', function (t) { - t.plan(1) - - var queue = buildQueue(worker, 1) - - queue.unshift(42) - - function worker (arg, cb) { - t.equal(arg, 42) - cb() - } -}) - -test('push with worker throwing error', function (t) { - t.plan(5) - var q = buildQueue(function (task, cb) { - cb(new Error('test error'), null) - }, 1) - q.error(function (err, task) { - t.ok(err instanceof Error, 'global error handler should catch the error') - t.match(err.message, /test error/, 'error message should be "test error"') - t.equal(task, 42, 'The task executed should be passed') - }) - q.push(42, function (err) { - t.ok(err instanceof Error, 'push callback should catch the error') - t.match(err.message, /test error/, 'error message should be "test error"') - }) -}) - -test('unshift with worker throwing error', function (t) { - t.plan(5) - var q = buildQueue(function (task, cb) { - cb(new Error('test error'), null) - }, 1) - q.error(function (err, task) { - t.ok(err instanceof Error, 'global error handler should catch the error') - t.match(err.message, /test error/, 'error message should be "test error"') - t.equal(task, 42, 'The task executed should be passed') - }) - q.unshift(42, function (err) { - t.ok(err instanceof Error, 'unshift callback should catch the error') - t.match(err.message, /test error/, 'error message should be "test error"') - }) -}) - -test('pause/resume should trigger drain event', function (t) { - t.plan(1) - - var queue = buildQueue(worker, 1) - queue.pause() - queue.drain = function () { - t.pass('drain should be called') - } - - function worker (arg, cb) { - cb(null, true) - } - - queue.resume() -}) - -test('paused flag', function (t) { - t.plan(2) - - var queue = buildQueue(function (arg, cb) { - cb(null) - }, 1) - t.equal(queue.paused, false) - queue.pause() - t.equal(queue.paused, true) -}) diff --git a/node_modules/fastq/test/tsconfig.json b/node_modules/fastq/test/tsconfig.json deleted file mode 100644 index 66e16e9..0000000 --- a/node_modules/fastq/test/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compilerOptions": { - "target": "es6", - "module": "commonjs", - "noEmit": true, - "strict": true - }, - "files": [ - "./example.ts" - ] -} diff --git a/node_modules/fill-range/LICENSE b/node_modules/fill-range/LICENSE deleted file mode 100644 index 9af4a67..0000000 --- a/node_modules/fill-range/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014-present, Jon Schlinkert. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/node_modules/fill-range/README.md b/node_modules/fill-range/README.md deleted file mode 100644 index 8d756fe..0000000 --- a/node_modules/fill-range/README.md +++ /dev/null @@ -1,237 +0,0 @@ -# fill-range [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=W8YFZ425KND68) [![NPM version](https://img.shields.io/npm/v/fill-range.svg?style=flat)](https://www.npmjs.com/package/fill-range) [![NPM monthly downloads](https://img.shields.io/npm/dm/fill-range.svg?style=flat)](https://npmjs.org/package/fill-range) [![NPM total downloads](https://img.shields.io/npm/dt/fill-range.svg?style=flat)](https://npmjs.org/package/fill-range) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/fill-range.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/fill-range) - -> Fill in a range of numbers or letters, optionally passing an increment or `step` to use, or create a regex-compatible range with `options.toRegex` - -Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. - -## Install - -Install with [npm](https://www.npmjs.com/): - -```sh -$ npm install --save fill-range -``` - -## Usage - -Expands numbers and letters, optionally using a `step` as the last argument. _(Numbers may be defined as JavaScript numbers or strings)_. - -```js -const fill = require('fill-range'); -// fill(from, to[, step, options]); - -console.log(fill('1', '10')); //=> ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'] -console.log(fill('1', '10', { toRegex: true })); //=> [1-9]|10 -``` - -**Params** - -* `from`: **{String|Number}** the number or letter to start with -* `to`: **{String|Number}** the number or letter to end with -* `step`: **{String|Number|Object|Function}** Optionally pass a [step](#optionsstep) to use. -* `options`: **{Object|Function}**: See all available [options](#options) - -## Examples - -By default, an array of values is returned. - -**Alphabetical ranges** - -```js -console.log(fill('a', 'e')); //=> ['a', 'b', 'c', 'd', 'e'] -console.log(fill('A', 'E')); //=> [ 'A', 'B', 'C', 'D', 'E' ] -``` - -**Numerical ranges** - -Numbers can be defined as actual numbers or strings. - -```js -console.log(fill(1, 5)); //=> [ 1, 2, 3, 4, 5 ] -console.log(fill('1', '5')); //=> [ 1, 2, 3, 4, 5 ] -``` - -**Negative ranges** - -Numbers can be defined as actual numbers or strings. - -```js -console.log(fill('-5', '-1')); //=> [ '-5', '-4', '-3', '-2', '-1' ] -console.log(fill('-5', '5')); //=> [ '-5', '-4', '-3', '-2', '-1', '0', '1', '2', '3', '4', '5' ] -``` - -**Steps (increments)** - -```js -// numerical ranges with increments -console.log(fill('0', '25', 4)); //=> [ '0', '4', '8', '12', '16', '20', '24' ] -console.log(fill('0', '25', 5)); //=> [ '0', '5', '10', '15', '20', '25' ] -console.log(fill('0', '25', 6)); //=> [ '0', '6', '12', '18', '24' ] - -// alphabetical ranges with increments -console.log(fill('a', 'z', 4)); //=> [ 'a', 'e', 'i', 'm', 'q', 'u', 'y' ] -console.log(fill('a', 'z', 5)); //=> [ 'a', 'f', 'k', 'p', 'u', 'z' ] -console.log(fill('a', 'z', 6)); //=> [ 'a', 'g', 'm', 's', 'y' ] -``` - -## Options - -### options.step - -**Type**: `number` (formatted as a string or number) - -**Default**: `undefined` - -**Description**: The increment to use for the range. Can be used with letters or numbers. - -**Example(s)** - -```js -// numbers -console.log(fill('1', '10', 2)); //=> [ '1', '3', '5', '7', '9' ] -console.log(fill('1', '10', 3)); //=> [ '1', '4', '7', '10' ] -console.log(fill('1', '10', 4)); //=> [ '1', '5', '9' ] - -// letters -console.log(fill('a', 'z', 5)); //=> [ 'a', 'f', 'k', 'p', 'u', 'z' ] -console.log(fill('a', 'z', 7)); //=> [ 'a', 'h', 'o', 'v' ] -console.log(fill('a', 'z', 9)); //=> [ 'a', 'j', 's' ] -``` - -### options.strictRanges - -**Type**: `boolean` - -**Default**: `false` - -**Description**: By default, `null` is returned when an invalid range is passed. Enable this option to throw a `RangeError` on invalid ranges. - -**Example(s)** - -The following are all invalid: - -```js -fill('1.1', '2'); // decimals not supported in ranges -fill('a', '2'); // incompatible range values -fill(1, 10, 'foo'); // invalid "step" argument -``` - -### options.stringify - -**Type**: `boolean` - -**Default**: `undefined` - -**Description**: Cast all returned values to strings. By default, integers are returned as numbers. - -**Example(s)** - -```js -console.log(fill(1, 5)); //=> [ 1, 2, 3, 4, 5 ] -console.log(fill(1, 5, { stringify: true })); //=> [ '1', '2', '3', '4', '5' ] -``` - -### options.toRegex - -**Type**: `boolean` - -**Default**: `undefined` - -**Description**: Create a regex-compatible source string, instead of expanding values to an array. - -**Example(s)** - -```js -// alphabetical range -console.log(fill('a', 'e', { toRegex: true })); //=> '[a-e]' -// alphabetical with step -console.log(fill('a', 'z', 3, { toRegex: true })); //=> 'a|d|g|j|m|p|s|v|y' -// numerical range -console.log(fill('1', '100', { toRegex: true })); //=> '[1-9]|[1-9][0-9]|100' -// numerical range with zero padding -console.log(fill('000001', '100000', { toRegex: true })); -//=> '0{5}[1-9]|0{4}[1-9][0-9]|0{3}[1-9][0-9]{2}|0{2}[1-9][0-9]{3}|0[1-9][0-9]{4}|100000' -``` - -### options.transform - -**Type**: `function` - -**Default**: `undefined` - -**Description**: Customize each value in the returned array (or [string](#optionstoRegex)). _(you can also pass this function as the last argument to `fill()`)_. - -**Example(s)** - -```js -// add zero padding -console.log(fill(1, 5, value => String(value).padStart(4, '0'))); -//=> ['0001', '0002', '0003', '0004', '0005'] -``` - -## About - -
    -Contributing - -Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). - -
    - -
    -Running Tests - -Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: - -```sh -$ npm install && npm test -``` - -
    - -
    -Building docs - -_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ - -To generate the readme, run the following command: - -```sh -$ npm install -g verbose/verb#dev verb-generate-readme && verb -``` - -
    - -### Contributors - -| **Commits** | **Contributor** | -| --- | --- | -| 116 | [jonschlinkert](https://github.com/jonschlinkert) | -| 4 | [paulmillr](https://github.com/paulmillr) | -| 2 | [realityking](https://github.com/realityking) | -| 2 | [bluelovers](https://github.com/bluelovers) | -| 1 | [edorivai](https://github.com/edorivai) | -| 1 | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) | - -### Author - -**Jon Schlinkert** - -* [GitHub Profile](https://github.com/jonschlinkert) -* [Twitter Profile](https://twitter.com/jonschlinkert) -* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) - -Please consider supporting me on Patreon, or [start your own Patreon page](https://patreon.com/invite/bxpbvm)! - - - - - -### License - -Copyright © 2019, [Jon Schlinkert](https://github.com/jonschlinkert). -Released under the [MIT License](LICENSE). - -*** - -_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on April 08, 2019._ \ No newline at end of file diff --git a/node_modules/fill-range/index.js b/node_modules/fill-range/index.js deleted file mode 100644 index ddb212e..0000000 --- a/node_modules/fill-range/index.js +++ /dev/null @@ -1,248 +0,0 @@ -/*! - * fill-range - * - * Copyright (c) 2014-present, Jon Schlinkert. - * Licensed under the MIT License. - */ - -'use strict'; - -const util = require('util'); -const toRegexRange = require('to-regex-range'); - -const isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val); - -const transform = toNumber => { - return value => toNumber === true ? Number(value) : String(value); -}; - -const isValidValue = value => { - return typeof value === 'number' || (typeof value === 'string' && value !== ''); -}; - -const isNumber = num => Number.isInteger(+num); - -const zeros = input => { - let value = `${input}`; - let index = -1; - if (value[0] === '-') value = value.slice(1); - if (value === '0') return false; - while (value[++index] === '0'); - return index > 0; -}; - -const stringify = (start, end, options) => { - if (typeof start === 'string' || typeof end === 'string') { - return true; - } - return options.stringify === true; -}; - -const pad = (input, maxLength, toNumber) => { - if (maxLength > 0) { - let dash = input[0] === '-' ? '-' : ''; - if (dash) input = input.slice(1); - input = (dash + input.padStart(dash ? maxLength - 1 : maxLength, '0')); - } - if (toNumber === false) { - return String(input); - } - return input; -}; - -const toMaxLen = (input, maxLength) => { - let negative = input[0] === '-' ? '-' : ''; - if (negative) { - input = input.slice(1); - maxLength--; - } - while (input.length < maxLength) input = '0' + input; - return negative ? ('-' + input) : input; -}; - -const toSequence = (parts, options, maxLen) => { - parts.negatives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0); - parts.positives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0); - - let prefix = options.capture ? '' : '?:'; - let positives = ''; - let negatives = ''; - let result; - - if (parts.positives.length) { - positives = parts.positives.map(v => toMaxLen(String(v), maxLen)).join('|'); - } - - if (parts.negatives.length) { - negatives = `-(${prefix}${parts.negatives.map(v => toMaxLen(String(v), maxLen)).join('|')})`; - } - - if (positives && negatives) { - result = `${positives}|${negatives}`; - } else { - result = positives || negatives; - } - - if (options.wrap) { - return `(${prefix}${result})`; - } - - return result; -}; - -const toRange = (a, b, isNumbers, options) => { - if (isNumbers) { - return toRegexRange(a, b, { wrap: false, ...options }); - } - - let start = String.fromCharCode(a); - if (a === b) return start; - - let stop = String.fromCharCode(b); - return `[${start}-${stop}]`; -}; - -const toRegex = (start, end, options) => { - if (Array.isArray(start)) { - let wrap = options.wrap === true; - let prefix = options.capture ? '' : '?:'; - return wrap ? `(${prefix}${start.join('|')})` : start.join('|'); - } - return toRegexRange(start, end, options); -}; - -const rangeError = (...args) => { - return new RangeError('Invalid range arguments: ' + util.inspect(...args)); -}; - -const invalidRange = (start, end, options) => { - if (options.strictRanges === true) throw rangeError([start, end]); - return []; -}; - -const invalidStep = (step, options) => { - if (options.strictRanges === true) { - throw new TypeError(`Expected step "${step}" to be a number`); - } - return []; -}; - -const fillNumbers = (start, end, step = 1, options = {}) => { - let a = Number(start); - let b = Number(end); - - if (!Number.isInteger(a) || !Number.isInteger(b)) { - if (options.strictRanges === true) throw rangeError([start, end]); - return []; - } - - // fix negative zero - if (a === 0) a = 0; - if (b === 0) b = 0; - - let descending = a > b; - let startString = String(start); - let endString = String(end); - let stepString = String(step); - step = Math.max(Math.abs(step), 1); - - let padded = zeros(startString) || zeros(endString) || zeros(stepString); - let maxLen = padded ? Math.max(startString.length, endString.length, stepString.length) : 0; - let toNumber = padded === false && stringify(start, end, options) === false; - let format = options.transform || transform(toNumber); - - if (options.toRegex && step === 1) { - return toRange(toMaxLen(start, maxLen), toMaxLen(end, maxLen), true, options); - } - - let parts = { negatives: [], positives: [] }; - let push = num => parts[num < 0 ? 'negatives' : 'positives'].push(Math.abs(num)); - let range = []; - let index = 0; - - while (descending ? a >= b : a <= b) { - if (options.toRegex === true && step > 1) { - push(a); - } else { - range.push(pad(format(a, index), maxLen, toNumber)); - } - a = descending ? a - step : a + step; - index++; - } - - if (options.toRegex === true) { - return step > 1 - ? toSequence(parts, options, maxLen) - : toRegex(range, null, { wrap: false, ...options }); - } - - return range; -}; - -const fillLetters = (start, end, step = 1, options = {}) => { - if ((!isNumber(start) && start.length > 1) || (!isNumber(end) && end.length > 1)) { - return invalidRange(start, end, options); - } - - let format = options.transform || (val => String.fromCharCode(val)); - let a = `${start}`.charCodeAt(0); - let b = `${end}`.charCodeAt(0); - - let descending = a > b; - let min = Math.min(a, b); - let max = Math.max(a, b); - - if (options.toRegex && step === 1) { - return toRange(min, max, false, options); - } - - let range = []; - let index = 0; - - while (descending ? a >= b : a <= b) { - range.push(format(a, index)); - a = descending ? a - step : a + step; - index++; - } - - if (options.toRegex === true) { - return toRegex(range, null, { wrap: false, options }); - } - - return range; -}; - -const fill = (start, end, step, options = {}) => { - if (end == null && isValidValue(start)) { - return [start]; - } - - if (!isValidValue(start) || !isValidValue(end)) { - return invalidRange(start, end, options); - } - - if (typeof step === 'function') { - return fill(start, end, 1, { transform: step }); - } - - if (isObject(step)) { - return fill(start, end, 0, step); - } - - let opts = { ...options }; - if (opts.capture === true) opts.wrap = true; - step = step || opts.step || 1; - - if (!isNumber(step)) { - if (step != null && !isObject(step)) return invalidStep(step, opts); - return fill(start, end, 1, step); - } - - if (isNumber(start) && isNumber(end)) { - return fillNumbers(start, end, step, opts); - } - - return fillLetters(start, end, Math.max(Math.abs(step), 1), opts); -}; - -module.exports = fill; diff --git a/node_modules/fill-range/package.json b/node_modules/fill-range/package.json deleted file mode 100644 index 582357f..0000000 --- a/node_modules/fill-range/package.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "name": "fill-range", - "description": "Fill in a range of numbers or letters, optionally passing an increment or `step` to use, or create a regex-compatible range with `options.toRegex`", - "version": "7.1.1", - "homepage": "https://github.com/jonschlinkert/fill-range", - "author": "Jon Schlinkert (https://github.com/jonschlinkert)", - "contributors": [ - "Edo Rivai (edo.rivai.nl)", - "Jon Schlinkert (http://twitter.com/jonschlinkert)", - "Paul Miller (paulmillr.com)", - "Rouven Weßling (www.rouvenwessling.de)", - "(https://github.com/wtgtybhertgeghgtwtg)" - ], - "repository": "jonschlinkert/fill-range", - "bugs": { - "url": "https://github.com/jonschlinkert/fill-range/issues" - }, - "license": "MIT", - "files": [ - "index.js" - ], - "main": "index.js", - "engines": { - "node": ">=8" - }, - "scripts": { - "lint": "eslint --cache --cache-location node_modules/.cache/.eslintcache --report-unused-disable-directives --ignore-path .gitignore .", - "mocha": "mocha --reporter dot", - "test": "npm run lint && npm run mocha", - "test:ci": "npm run test:cover", - "test:cover": "nyc npm run mocha" - }, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "devDependencies": { - "gulp-format-md": "^2.0.0", - "mocha": "^6.1.1", - "nyc": "^15.1.0" - }, - "keywords": [ - "alpha", - "alphabetical", - "array", - "bash", - "brace", - "expand", - "expansion", - "fill", - "glob", - "match", - "matches", - "matching", - "number", - "numerical", - "range", - "ranges", - "regex", - "sh" - ], - "verb": { - "toc": false, - "layout": "default", - "tasks": [ - "readme" - ], - "plugins": [ - "gulp-format-md" - ], - "lint": { - "reflinks": true - } - } -} diff --git a/node_modules/find-up/index.d.ts b/node_modules/find-up/index.d.ts deleted file mode 100644 index 41e3192..0000000 --- a/node_modules/find-up/index.d.ts +++ /dev/null @@ -1,137 +0,0 @@ -import {Options as LocatePathOptions} from 'locate-path'; - -declare const stop: unique symbol; - -declare namespace findUp { - interface Options extends LocatePathOptions {} - - type StopSymbol = typeof stop; - - type Match = string | StopSymbol | undefined; -} - -declare const findUp: { - /** - Find a file or directory by walking up parent directories. - - @param name - Name of the file or directory to find. Can be multiple. - @returns The first path found (by respecting the order of `name`s) or `undefined` if none could be found. - - @example - ``` - // / - // └── Users - // └── sindresorhus - // ├── unicorn.png - // └── foo - // └── bar - // ├── baz - // └── example.js - - // example.js - import findUp = require('find-up'); - - (async () => { - console.log(await findUp('unicorn.png')); - //=> '/Users/sindresorhus/unicorn.png' - - console.log(await findUp(['rainbow.png', 'unicorn.png'])); - //=> '/Users/sindresorhus/unicorn.png' - })(); - ``` - */ - (name: string | string[], options?: findUp.Options): Promise; - - /** - Find a file or directory by walking up parent directories. - - @param matcher - Called for each directory in the search. Return a path or `findUp.stop` to stop the search. - @returns The first path found or `undefined` if none could be found. - - @example - ``` - import path = require('path'); - import findUp = require('find-up'); - - (async () => { - console.log(await findUp(async directory => { - const hasUnicorns = await findUp.exists(path.join(directory, 'unicorn.png')); - return hasUnicorns && directory; - }, {type: 'directory'})); - //=> '/Users/sindresorhus' - })(); - ``` - */ - (matcher: (directory: string) => (findUp.Match | Promise), options?: findUp.Options): Promise; - - sync: { - /** - Synchronously find a file or directory by walking up parent directories. - - @param name - Name of the file or directory to find. Can be multiple. - @returns The first path found (by respecting the order of `name`s) or `undefined` if none could be found. - */ - (name: string | string[], options?: findUp.Options): string | undefined; - - /** - Synchronously find a file or directory by walking up parent directories. - - @param matcher - Called for each directory in the search. Return a path or `findUp.stop` to stop the search. - @returns The first path found or `undefined` if none could be found. - - @example - ``` - import path = require('path'); - import findUp = require('find-up'); - - console.log(findUp.sync(directory => { - const hasUnicorns = findUp.sync.exists(path.join(directory, 'unicorn.png')); - return hasUnicorns && directory; - }, {type: 'directory'})); - //=> '/Users/sindresorhus' - ``` - */ - (matcher: (directory: string) => findUp.Match, options?: findUp.Options): string | undefined; - - /** - Synchronously check if a path exists. - - @param path - Path to the file or directory. - @returns Whether the path exists. - - @example - ``` - import findUp = require('find-up'); - - console.log(findUp.sync.exists('/Users/sindresorhus/unicorn.png')); - //=> true - ``` - */ - exists(path: string): boolean; - } - - /** - Check if a path exists. - - @param path - Path to a file or directory. - @returns Whether the path exists. - - @example - ``` - import findUp = require('find-up'); - - (async () => { - console.log(await findUp.exists('/Users/sindresorhus/unicorn.png')); - //=> true - })(); - ``` - */ - exists(path: string): Promise; - - /** - Return this in a `matcher` function to stop the search and force `findUp` to immediately return `undefined`. - */ - readonly stop: findUp.StopSymbol; -}; - -export = findUp; diff --git a/node_modules/find-up/index.js b/node_modules/find-up/index.js deleted file mode 100644 index ce564e5..0000000 --- a/node_modules/find-up/index.js +++ /dev/null @@ -1,89 +0,0 @@ -'use strict'; -const path = require('path'); -const locatePath = require('locate-path'); -const pathExists = require('path-exists'); - -const stop = Symbol('findUp.stop'); - -module.exports = async (name, options = {}) => { - let directory = path.resolve(options.cwd || ''); - const {root} = path.parse(directory); - const paths = [].concat(name); - - const runMatcher = async locateOptions => { - if (typeof name !== 'function') { - return locatePath(paths, locateOptions); - } - - const foundPath = await name(locateOptions.cwd); - if (typeof foundPath === 'string') { - return locatePath([foundPath], locateOptions); - } - - return foundPath; - }; - - // eslint-disable-next-line no-constant-condition - while (true) { - // eslint-disable-next-line no-await-in-loop - const foundPath = await runMatcher({...options, cwd: directory}); - - if (foundPath === stop) { - return; - } - - if (foundPath) { - return path.resolve(directory, foundPath); - } - - if (directory === root) { - return; - } - - directory = path.dirname(directory); - } -}; - -module.exports.sync = (name, options = {}) => { - let directory = path.resolve(options.cwd || ''); - const {root} = path.parse(directory); - const paths = [].concat(name); - - const runMatcher = locateOptions => { - if (typeof name !== 'function') { - return locatePath.sync(paths, locateOptions); - } - - const foundPath = name(locateOptions.cwd); - if (typeof foundPath === 'string') { - return locatePath.sync([foundPath], locateOptions); - } - - return foundPath; - }; - - // eslint-disable-next-line no-constant-condition - while (true) { - const foundPath = runMatcher({...options, cwd: directory}); - - if (foundPath === stop) { - return; - } - - if (foundPath) { - return path.resolve(directory, foundPath); - } - - if (directory === root) { - return; - } - - directory = path.dirname(directory); - } -}; - -module.exports.exists = pathExists; - -module.exports.sync.exists = pathExists.sync; - -module.exports.stop = stop; diff --git a/node_modules/find-up/license b/node_modules/find-up/license deleted file mode 100644 index e7af2f7..0000000 --- a/node_modules/find-up/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/find-up/package.json b/node_modules/find-up/package.json deleted file mode 100644 index cd50281..0000000 --- a/node_modules/find-up/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "find-up", - "version": "4.1.0", - "description": "Find a file or directory by walking up parent directories", - "license": "MIT", - "repository": "sindresorhus/find-up", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=8" - }, - "scripts": { - "test": "xo && ava && tsd" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "find", - "up", - "find-up", - "findup", - "look-up", - "look", - "file", - "search", - "match", - "package", - "resolve", - "parent", - "parents", - "folder", - "directory", - "walk", - "walking", - "path" - ], - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "devDependencies": { - "ava": "^2.1.0", - "is-path-inside": "^2.1.0", - "tempy": "^0.3.0", - "tsd": "^0.7.3", - "xo": "^0.24.0" - } -} diff --git a/node_modules/find-up/readme.md b/node_modules/find-up/readme.md deleted file mode 100644 index d6a21e5..0000000 --- a/node_modules/find-up/readme.md +++ /dev/null @@ -1,156 +0,0 @@ -# find-up [![Build Status](https://travis-ci.org/sindresorhus/find-up.svg?branch=master)](https://travis-ci.org/sindresorhus/find-up) - -> Find a file or directory by walking up parent directories - - -## Install - -``` -$ npm install find-up -``` - - -## Usage - -``` -/ -└── Users - └── sindresorhus - ├── unicorn.png - └── foo - └── bar - ├── baz - └── example.js -``` - -`example.js` - -```js -const path = require('path'); -const findUp = require('find-up'); - -(async () => { - console.log(await findUp('unicorn.png')); - //=> '/Users/sindresorhus/unicorn.png' - - console.log(await findUp(['rainbow.png', 'unicorn.png'])); - //=> '/Users/sindresorhus/unicorn.png' - - console.log(await findUp(async directory => { - const hasUnicorns = await findUp.exists(path.join(directory, 'unicorn.png')); - return hasUnicorns && directory; - }, {type: 'directory'})); - //=> '/Users/sindresorhus' -})(); -``` - - -## API - -### findUp(name, options?) -### findUp(matcher, options?) - -Returns a `Promise` for either the path or `undefined` if it couldn't be found. - -### findUp([...name], options?) - -Returns a `Promise` for either the first path found (by respecting the order of the array) or `undefined` if none could be found. - -### findUp.sync(name, options?) -### findUp.sync(matcher, options?) - -Returns a path or `undefined` if it couldn't be found. - -### findUp.sync([...name], options?) - -Returns the first path found (by respecting the order of the array) or `undefined` if none could be found. - -#### name - -Type: `string` - -Name of the file or directory to find. - -#### matcher - -Type: `Function` - -A function that will be called with each directory until it returns a `string` with the path, which stops the search, or the root directory has been reached and nothing was found. Useful if you want to match files with certain patterns, set of permissions, or other advanced use-cases. - -When using async mode, the `matcher` may optionally be an async or promise-returning function that returns the path. - -#### options - -Type: `object` - -##### cwd - -Type: `string`
    -Default: `process.cwd()` - -Directory to start from. - -##### type - -Type: `string`
    -Default: `'file'`
    -Values: `'file'` `'directory'` - -The type of paths that can match. - -##### allowSymlinks - -Type: `boolean`
    -Default: `true` - -Allow symbolic links to match if they point to the chosen path type. - -### findUp.exists(path) - -Returns a `Promise` of whether the path exists. - -### findUp.sync.exists(path) - -Returns a `boolean` of whether the path exists. - -#### path - -Type: `string` - -Path to a file or directory. - -### findUp.stop - -A [`Symbol`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol) that can be returned by a `matcher` function to stop the search and cause `findUp` to immediately return `undefined`. Useful as a performance optimization in case the current working directory is deeply nested in the filesystem. - -```js -const path = require('path'); -const findUp = require('find-up'); - -(async () => { - await findUp(directory => { - return path.basename(directory) === 'work' ? findUp.stop : 'logo.png'; - }); -})(); -``` - - -## Related - -- [find-up-cli](https://github.com/sindresorhus/find-up-cli) - CLI for this module -- [pkg-up](https://github.com/sindresorhus/pkg-up) - Find the closest package.json file -- [pkg-dir](https://github.com/sindresorhus/pkg-dir) - Find the root directory of an npm package -- [resolve-from](https://github.com/sindresorhus/resolve-from) - Resolve the path of a module like `require.resolve()` but from a given path - - ---- - -
    - - Get professional support for 'find-up' with a Tidelift subscription - -
    - - Tidelift helps make open source sustainable for maintainers while giving companies
    assurances about security, maintenance, and licensing for their dependencies. -
    -
    diff --git a/node_modules/foreground-child/LICENSE b/node_modules/foreground-child/LICENSE deleted file mode 100644 index 2d80720..0000000 --- a/node_modules/foreground-child/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) 2015-2023 Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/foreground-child/README.md b/node_modules/foreground-child/README.md deleted file mode 100644 index 477ca57..0000000 --- a/node_modules/foreground-child/README.md +++ /dev/null @@ -1,128 +0,0 @@ -# foreground-child - -Run a child as if it's the foreground process. Give it stdio. Exit -when it exits. - -Mostly this module is here to support some use cases around -wrapping child processes for test coverage and such. But it's -also generally useful any time you want one program to execute -another as if it's the "main" process, for example, if a program -takes a `--cmd` argument to execute in some way. - -## USAGE - -```js -import { foregroundChild } from 'foreground-child' -// hybrid module, this also works: -// const { foregroundChild } = require('foreground-child') - -// cats out this file -const child = foregroundChild('cat', [__filename]) - -// At this point, it's best to just do nothing else. -// return or whatever. -// If the child gets a signal, or just exits, then this -// parent process will exit in the same way. -``` - -You can provide custom spawn options by passing an object after -the program and arguments: - -```js -const child = foregroundChild(`cat ${__filename}`, { shell: true }) -``` - -A callback can optionally be provided, if you want to perform an -action before your foreground-child exits: - -```js -const child = foregroundChild('cat', [__filename], spawnOptions, () => { - doSomeActions() -}) -``` - -The callback can return a Promise in order to perform -asynchronous actions. If the callback does not return a promise, -then it must complete its actions within a single JavaScript -tick. - -```js -const child = foregroundChild('cat', [__filename], async () => { - await doSomeAsyncActions() -}) -``` - -If the callback throws or rejects, then it will be unhandled, and -node will exit in error. - -If the callback returns a string value, then that will be used as -the signal to exit the parent process. If it returns a number, -then that number will be used as the parent exit status code. If -it returns boolean `false`, then the parent process will not be -terminated. If it returns `undefined`, then it will exit with the -same signal/code as the child process. - -## Caveats - -The "normal" standard IO file descriptors (0, 1, and 2 for stdin, -stdout, and stderr respectively) are shared with the child process. -Additionally, if there is an IPC channel set up in the parent, then -messages are proxied to the child on file descriptor 3. - -In Node, it's possible to also map arbitrary file descriptors -into a child process. In these cases, foreground-child will not -map the file descriptors into the child. If file descriptors 0, -1, or 2 are used for the IPC channel, then strange behavior may -happen (like printing IPC messages to stderr, for example). - -Note that a SIGKILL will always kill the parent process, but -will not proxy the signal to the child process, because SIGKILL -cannot be caught. In order to address this, a special "watchdog" -child process is spawned which will send a SIGKILL to the child -process if it does not terminate within half a second after the -watchdog receives a SIGHUP due to its parent terminating. - -On Windows, issuing a `process.kill(process.pid, signal)` with a -fatal termination signal may cause the process to exit with a `1` -status code rather than reporting the signal properly. This -module tries to do the right thing, but on Windows systems, you -may see that incorrect result. There is as far as I'm aware no -workaround for this. - -## util: `foreground-child/proxy-signals` - -If you just want to proxy the signals to a child process that the -main process receives, you can use the `proxy-signals` export -from this package. - -```js -import { proxySignals } from 'foreground-child/proxy-signals' - -const childProcess = spawn('command', ['some', 'args']) -proxySignals(childProcess) -``` - -Now, any fatal signal received by the current process will be -proxied to the child process. - -It doesn't go in the other direction; ie, signals sent to the -child process will not affect the parent. For that, listen to the -child `exit` or `close` events, and handle them appropriately. - -## util: `foreground-child/watchdog` - -If you are spawning a child process, and want to ensure that it -isn't left dangling if the parent process exits, you can use the -watchdog utility exported by this module. - -```js -import { watchdog } from 'foreground-child/watchdog' - -const childProcess = spawn('command', ['some', 'args']) -const watchdogProcess = watchdog(childProcess) - -// watchdogProcess is a reference to the process monitoring the -// parent and child. There's usually no reason to do anything -// with it, as it's silent and will terminate -// automatically when it's no longer needed. -``` diff --git a/node_modules/foreground-child/dist/commonjs/all-signals.d.ts b/node_modules/foreground-child/dist/commonjs/all-signals.d.ts deleted file mode 100644 index ecc0a62..0000000 --- a/node_modules/foreground-child/dist/commonjs/all-signals.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export declare const allSignals: NodeJS.Signals[]; -//# sourceMappingURL=all-signals.d.ts.map \ No newline at end of file diff --git a/node_modules/foreground-child/dist/commonjs/all-signals.d.ts.map b/node_modules/foreground-child/dist/commonjs/all-signals.d.ts.map deleted file mode 100644 index cd1c161..0000000 --- a/node_modules/foreground-child/dist/commonjs/all-signals.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"all-signals.d.ts","sourceRoot":"","sources":["../../src/all-signals.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,UAAU,EAShB,MAAM,CAAC,OAAO,EAAE,CAAA"} \ No newline at end of file diff --git a/node_modules/foreground-child/dist/commonjs/all-signals.js b/node_modules/foreground-child/dist/commonjs/all-signals.js deleted file mode 100644 index 1692af0..0000000 --- a/node_modules/foreground-child/dist/commonjs/all-signals.js +++ /dev/null @@ -1,58 +0,0 @@ -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.allSignals = void 0; -const node_constants_1 = __importDefault(require("node:constants")); -exports.allSignals = -// this is the full list of signals that Node will let us do anything with -Object.keys(node_constants_1.default).filter(k => k.startsWith('SIG') && - // https://github.com/tapjs/signal-exit/issues/21 - k !== 'SIGPROF' && - // no sense trying to listen for SIGKILL, it's impossible - k !== 'SIGKILL'); -// These are some obscure signals that are reported by kill -l -// on macOS, Linux, or Windows, but which don't have any mapping -// in Node.js. No sense trying if they're just going to throw -// every time on every platform. -// -// 'SIGEMT', -// 'SIGLOST', -// 'SIGPOLL', -// 'SIGRTMAX', -// 'SIGRTMAX-1', -// 'SIGRTMAX-10', -// 'SIGRTMAX-11', -// 'SIGRTMAX-12', -// 'SIGRTMAX-13', -// 'SIGRTMAX-14', -// 'SIGRTMAX-15', -// 'SIGRTMAX-2', -// 'SIGRTMAX-3', -// 'SIGRTMAX-4', -// 'SIGRTMAX-5', -// 'SIGRTMAX-6', -// 'SIGRTMAX-7', -// 'SIGRTMAX-8', -// 'SIGRTMAX-9', -// 'SIGRTMIN', -// 'SIGRTMIN+1', -// 'SIGRTMIN+10', -// 'SIGRTMIN+11', -// 'SIGRTMIN+12', -// 'SIGRTMIN+13', -// 'SIGRTMIN+14', -// 'SIGRTMIN+15', -// 'SIGRTMIN+16', -// 'SIGRTMIN+2', -// 'SIGRTMIN+3', -// 'SIGRTMIN+4', -// 'SIGRTMIN+5', -// 'SIGRTMIN+6', -// 'SIGRTMIN+7', -// 'SIGRTMIN+8', -// 'SIGRTMIN+9', -// 'SIGSTKFLT', -// 'SIGUNUSED', -//# sourceMappingURL=all-signals.js.map \ No newline at end of file diff --git a/node_modules/foreground-child/dist/commonjs/all-signals.js.map b/node_modules/foreground-child/dist/commonjs/all-signals.js.map deleted file mode 100644 index 51c056d..0000000 --- a/node_modules/foreground-child/dist/commonjs/all-signals.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"all-signals.js","sourceRoot":"","sources":["../../src/all-signals.ts"],"names":[],"mappings":";;;;;;AAAA,oEAAsC;AACzB,QAAA,UAAU;AACrB,0EAA0E;AAC1E,MAAM,CAAC,IAAI,CAAC,wBAAS,CAAC,CAAC,MAAM,CAC3B,CAAC,CAAC,EAAE,CACF,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC;IACnB,iDAAiD;IACjD,CAAC,KAAK,SAAS;IACf,yDAAyD;IACzD,CAAC,KAAK,SAAS,CACE,CAAA;AAEvB,8DAA8D;AAC9D,gEAAgE;AAChE,6DAA6D;AAC7D,gCAAgC;AAChC,EAAE;AACF,YAAY;AACZ,aAAa;AACb,aAAa;AACb,cAAc;AACd,gBAAgB;AAChB,iBAAiB;AACjB,iBAAiB;AACjB,iBAAiB;AACjB,iBAAiB;AACjB,iBAAiB;AACjB,iBAAiB;AACjB,gBAAgB;AAChB,gBAAgB;AAChB,gBAAgB;AAChB,gBAAgB;AAChB,gBAAgB;AAChB,gBAAgB;AAChB,gBAAgB;AAChB,gBAAgB;AAChB,cAAc;AACd,gBAAgB;AAChB,iBAAiB;AACjB,iBAAiB;AACjB,iBAAiB;AACjB,iBAAiB;AACjB,iBAAiB;AACjB,iBAAiB;AACjB,iBAAiB;AACjB,gBAAgB;AAChB,gBAAgB;AAChB,gBAAgB;AAChB,gBAAgB;AAChB,gBAAgB;AAChB,gBAAgB;AAChB,gBAAgB;AAChB,gBAAgB;AAChB,eAAe;AACf,eAAe","sourcesContent":["import constants from 'node:constants'\nexport const allSignals =\n // this is the full list of signals that Node will let us do anything with\n Object.keys(constants).filter(\n k =>\n k.startsWith('SIG') &&\n // https://github.com/tapjs/signal-exit/issues/21\n k !== 'SIGPROF' &&\n // no sense trying to listen for SIGKILL, it's impossible\n k !== 'SIGKILL',\n ) as NodeJS.Signals[]\n\n// These are some obscure signals that are reported by kill -l\n// on macOS, Linux, or Windows, but which don't have any mapping\n// in Node.js. No sense trying if they're just going to throw\n// every time on every platform.\n//\n// 'SIGEMT',\n// 'SIGLOST',\n// 'SIGPOLL',\n// 'SIGRTMAX',\n// 'SIGRTMAX-1',\n// 'SIGRTMAX-10',\n// 'SIGRTMAX-11',\n// 'SIGRTMAX-12',\n// 'SIGRTMAX-13',\n// 'SIGRTMAX-14',\n// 'SIGRTMAX-15',\n// 'SIGRTMAX-2',\n// 'SIGRTMAX-3',\n// 'SIGRTMAX-4',\n// 'SIGRTMAX-5',\n// 'SIGRTMAX-6',\n// 'SIGRTMAX-7',\n// 'SIGRTMAX-8',\n// 'SIGRTMAX-9',\n// 'SIGRTMIN',\n// 'SIGRTMIN+1',\n// 'SIGRTMIN+10',\n// 'SIGRTMIN+11',\n// 'SIGRTMIN+12',\n// 'SIGRTMIN+13',\n// 'SIGRTMIN+14',\n// 'SIGRTMIN+15',\n// 'SIGRTMIN+16',\n// 'SIGRTMIN+2',\n// 'SIGRTMIN+3',\n// 'SIGRTMIN+4',\n// 'SIGRTMIN+5',\n// 'SIGRTMIN+6',\n// 'SIGRTMIN+7',\n// 'SIGRTMIN+8',\n// 'SIGRTMIN+9',\n// 'SIGSTKFLT',\n// 'SIGUNUSED',\n"]} \ No newline at end of file diff --git a/node_modules/foreground-child/dist/commonjs/index.d.ts b/node_modules/foreground-child/dist/commonjs/index.d.ts deleted file mode 100644 index d15b38e..0000000 --- a/node_modules/foreground-child/dist/commonjs/index.d.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { ChildProcessByStdio, SpawnOptions, ChildProcess } from 'child_process'; -/** - * The signature for the cleanup method. - * - * Arguments indicate the exit status of the child process. - * - * If a Promise is returned, then the process is not terminated - * until it resolves, and the resolution value is treated as the - * exit status (if a number) or signal exit (if a signal string). - * - * If `undefined` is returned, then no change is made, and the parent - * exits in the same way that the child exited. - * - * If boolean `false` is returned, then the parent's exit is canceled. - * - * If a number is returned, then the parent process exits with the number - * as its exitCode. - * - * If a signal string is returned, then the parent process is killed with - * the same signal that caused the child to exit. - */ -export type Cleanup = (code: number | null, signal: null | NodeJS.Signals, processInfo: { - watchdogPid?: ChildProcess['pid']; -}) => void | undefined | number | NodeJS.Signals | false | Promise; -export type FgArgs = [program: string | [cmd: string, ...args: string[]], cleanup?: Cleanup] | [ - program: [cmd: string, ...args: string[]], - opts?: SpawnOptions, - cleanup?: Cleanup -] | [program: string, cleanup?: Cleanup] | [program: string, opts?: SpawnOptions, cleanup?: Cleanup] | [program: string, args?: string[], cleanup?: Cleanup] | [ - program: string, - args?: string[], - opts?: SpawnOptions, - cleanup?: Cleanup -]; -/** - * Normalizes the arguments passed to `foregroundChild`. - * - * Exposed for testing. - * - * @internal - */ -export declare const normalizeFgArgs: (fgArgs: FgArgs) => [program: string, args: string[], spawnOpts: SpawnOptions, cleanup: Cleanup]; -/** - * Spawn the specified program as a "foreground" process, or at least as - * close as is possible given node's lack of exec-without-fork. - * - * Cleanup method may be used to modify or ignore the result of the child's - * exit code or signal. If cleanup returns undefined (or a Promise that - * resolves to undefined), then the parent will exit in the same way that - * the child did. - * - * Return boolean `false` to prevent the parent's exit entirely. - */ -export declare function foregroundChild(cmd: string | [cmd: string, ...args: string[]], cleanup?: Cleanup): ChildProcessByStdio; -export declare function foregroundChild(program: string, args?: string[], cleanup?: Cleanup): ChildProcessByStdio; -export declare function foregroundChild(program: string, spawnOpts?: SpawnOptions, cleanup?: Cleanup): ChildProcessByStdio; -export declare function foregroundChild(program: string, args?: string[], spawnOpts?: SpawnOptions, cleanup?: Cleanup): ChildProcessByStdio; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/foreground-child/dist/commonjs/index.d.ts.map b/node_modules/foreground-child/dist/commonjs/index.d.ts.map deleted file mode 100644 index b26fecd..0000000 --- a/node_modules/foreground-child/dist/commonjs/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EAInB,YAAY,EACZ,YAAY,EACb,MAAM,eAAe,CAAA;AAUtB;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,MAAM,OAAO,GAAG,CACpB,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,OAAO,EAC7B,WAAW,EAAE;IACX,WAAW,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,CAAA;CAClC,KAEC,IAAI,GACJ,SAAS,GACT,MAAM,GACN,MAAM,CAAC,OAAO,GACd,KAAK,GACL,OAAO,CAAC,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,CAAA;AAE/D,MAAM,MAAM,MAAM,GACd,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,GACvE;IACE,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC;IACzC,IAAI,CAAC,EAAE,YAAY;IACnB,OAAO,CAAC,EAAE,OAAO;CAClB,GACD,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,GACpC,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,GACzD,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,GACrD;IACE,OAAO,EAAE,MAAM;IACf,IAAI,CAAC,EAAE,MAAM,EAAE;IACf,IAAI,CAAC,EAAE,YAAY;IACnB,OAAO,CAAC,EAAE,OAAO;CAClB,CAAA;AAEL;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,WAClB,MAAM,KACb,CACD,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,SAAS,EAAE,YAAY,EACvB,OAAO,EAAE,OAAO,CAqBjB,CAAA;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,EAC9C,OAAO,CAAC,EAAE,OAAO,GAChB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AACxC,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,EAAE,EACf,OAAO,CAAC,EAAE,OAAO,GAChB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AACxC,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,YAAY,EACxB,OAAO,CAAC,EAAE,OAAO,GAChB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AACxC,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,EAAE,EACf,SAAS,CAAC,EAAE,YAAY,EACxB,OAAO,CAAC,EAAE,OAAO,GAChB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/foreground-child/dist/commonjs/index.js b/node_modules/foreground-child/dist/commonjs/index.js deleted file mode 100644 index 6db65c6..0000000 --- a/node_modules/foreground-child/dist/commonjs/index.js +++ /dev/null @@ -1,123 +0,0 @@ -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.normalizeFgArgs = void 0; -exports.foregroundChild = foregroundChild; -const child_process_1 = require("child_process"); -const cross_spawn_1 = __importDefault(require("cross-spawn")); -const signal_exit_1 = require("signal-exit"); -const proxy_signals_js_1 = require("./proxy-signals.js"); -const watchdog_js_1 = require("./watchdog.js"); -/* c8 ignore start */ -const spawn = process?.platform === 'win32' ? cross_spawn_1.default : child_process_1.spawn; -/** - * Normalizes the arguments passed to `foregroundChild`. - * - * Exposed for testing. - * - * @internal - */ -const normalizeFgArgs = (fgArgs) => { - let [program, args = [], spawnOpts = {}, cleanup = () => { }] = fgArgs; - if (typeof args === 'function') { - cleanup = args; - spawnOpts = {}; - args = []; - } - else if (!!args && typeof args === 'object' && !Array.isArray(args)) { - if (typeof spawnOpts === 'function') - cleanup = spawnOpts; - spawnOpts = args; - args = []; - } - else if (typeof spawnOpts === 'function') { - cleanup = spawnOpts; - spawnOpts = {}; - } - if (Array.isArray(program)) { - const [pp, ...pa] = program; - program = pp; - args = pa; - } - return [program, args, { ...spawnOpts }, cleanup]; -}; -exports.normalizeFgArgs = normalizeFgArgs; -function foregroundChild(...fgArgs) { - const [program, args, spawnOpts, cleanup] = (0, exports.normalizeFgArgs)(fgArgs); - spawnOpts.stdio = [0, 1, 2]; - if (process.send) { - spawnOpts.stdio.push('ipc'); - } - const child = spawn(program, args, spawnOpts); - const childHangup = () => { - try { - child.kill('SIGHUP'); - /* c8 ignore start */ - } - catch (_) { - // SIGHUP is weird on windows - child.kill('SIGTERM'); - } - /* c8 ignore stop */ - }; - const removeOnExit = (0, signal_exit_1.onExit)(childHangup); - (0, proxy_signals_js_1.proxySignals)(child); - const dog = (0, watchdog_js_1.watchdog)(child); - let done = false; - child.on('close', async (code, signal) => { - /* c8 ignore start */ - if (done) - return; - /* c8 ignore stop */ - done = true; - const result = cleanup(code, signal, { - watchdogPid: dog.pid, - }); - const res = isPromise(result) ? await result : result; - removeOnExit(); - if (res === false) - return; - else if (typeof res === 'string') { - signal = res; - code = null; - } - else if (typeof res === 'number') { - code = res; - signal = null; - } - if (signal) { - // If there is nothing else keeping the event loop alive, - // then there's a race between a graceful exit and getting - // the signal to this process. Put this timeout here to - // make sure we're still alive to get the signal, and thus - // exit with the intended signal code. - /* istanbul ignore next */ - setTimeout(() => { }, 2000); - try { - process.kill(process.pid, signal); - /* c8 ignore start */ - } - catch (_) { - process.kill(process.pid, 'SIGTERM'); - } - /* c8 ignore stop */ - } - else { - process.exit(code || 0); - } - }); - if (process.send) { - process.removeAllListeners('message'); - child.on('message', (message, sendHandle) => { - process.send?.(message, sendHandle); - }); - process.on('message', (message, sendHandle) => { - child.send(message, sendHandle); - }); - } - return child; -} -const isPromise = (o) => !!o && typeof o === 'object' && typeof o.then === 'function'; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/foreground-child/dist/commonjs/index.js.map b/node_modules/foreground-child/dist/commonjs/index.js.map deleted file mode 100644 index 56037c8..0000000 --- a/node_modules/foreground-child/dist/commonjs/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ChildProcessByStdio,\n SendHandle,\n Serializable,\n spawn as nodeSpawn,\n SpawnOptions,\n ChildProcess,\n} from 'child_process'\nimport crossSpawn from 'cross-spawn'\nimport { onExit } from 'signal-exit'\nimport { proxySignals } from './proxy-signals.js'\nimport { watchdog } from './watchdog.js'\n\n/* c8 ignore start */\nconst spawn = process?.platform === 'win32' ? crossSpawn : nodeSpawn\n/* c8 ignore stop */\n\n/**\n * The signature for the cleanup method.\n *\n * Arguments indicate the exit status of the child process.\n *\n * If a Promise is returned, then the process is not terminated\n * until it resolves, and the resolution value is treated as the\n * exit status (if a number) or signal exit (if a signal string).\n *\n * If `undefined` is returned, then no change is made, and the parent\n * exits in the same way that the child exited.\n *\n * If boolean `false` is returned, then the parent's exit is canceled.\n *\n * If a number is returned, then the parent process exits with the number\n * as its exitCode.\n *\n * If a signal string is returned, then the parent process is killed with\n * the same signal that caused the child to exit.\n */\nexport type Cleanup = (\n code: number | null,\n signal: null | NodeJS.Signals,\n processInfo: {\n watchdogPid?: ChildProcess['pid']\n },\n) =>\n | void\n | undefined\n | number\n | NodeJS.Signals\n | false\n | Promise\n\nexport type FgArgs =\n | [program: string | [cmd: string, ...args: string[]], cleanup?: Cleanup]\n | [\n program: [cmd: string, ...args: string[]],\n opts?: SpawnOptions,\n cleanup?: Cleanup,\n ]\n | [program: string, cleanup?: Cleanup]\n | [program: string, opts?: SpawnOptions, cleanup?: Cleanup]\n | [program: string, args?: string[], cleanup?: Cleanup]\n | [\n program: string,\n args?: string[],\n opts?: SpawnOptions,\n cleanup?: Cleanup,\n ]\n\n/**\n * Normalizes the arguments passed to `foregroundChild`.\n *\n * Exposed for testing.\n *\n * @internal\n */\nexport const normalizeFgArgs = (\n fgArgs: FgArgs,\n): [\n program: string,\n args: string[],\n spawnOpts: SpawnOptions,\n cleanup: Cleanup,\n] => {\n let [program, args = [], spawnOpts = {}, cleanup = () => {}] = fgArgs\n if (typeof args === 'function') {\n cleanup = args\n spawnOpts = {}\n args = []\n } else if (!!args && typeof args === 'object' && !Array.isArray(args)) {\n if (typeof spawnOpts === 'function') cleanup = spawnOpts\n spawnOpts = args\n args = []\n } else if (typeof spawnOpts === 'function') {\n cleanup = spawnOpts\n spawnOpts = {}\n }\n if (Array.isArray(program)) {\n const [pp, ...pa] = program\n program = pp\n args = pa\n }\n return [program, args, { ...spawnOpts }, cleanup]\n}\n\n/**\n * Spawn the specified program as a \"foreground\" process, or at least as\n * close as is possible given node's lack of exec-without-fork.\n *\n * Cleanup method may be used to modify or ignore the result of the child's\n * exit code or signal. If cleanup returns undefined (or a Promise that\n * resolves to undefined), then the parent will exit in the same way that\n * the child did.\n *\n * Return boolean `false` to prevent the parent's exit entirely.\n */\nexport function foregroundChild(\n cmd: string | [cmd: string, ...args: string[]],\n cleanup?: Cleanup,\n): ChildProcessByStdio\nexport function foregroundChild(\n program: string,\n args?: string[],\n cleanup?: Cleanup,\n): ChildProcessByStdio\nexport function foregroundChild(\n program: string,\n spawnOpts?: SpawnOptions,\n cleanup?: Cleanup,\n): ChildProcessByStdio\nexport function foregroundChild(\n program: string,\n args?: string[],\n spawnOpts?: SpawnOptions,\n cleanup?: Cleanup,\n): ChildProcessByStdio\nexport function foregroundChild(\n ...fgArgs: FgArgs\n): ChildProcessByStdio {\n const [program, args, spawnOpts, cleanup] = normalizeFgArgs(fgArgs)\n\n spawnOpts.stdio = [0, 1, 2]\n if (process.send) {\n spawnOpts.stdio.push('ipc')\n }\n\n const child = spawn(program, args, spawnOpts) as ChildProcessByStdio<\n null,\n null,\n null\n >\n\n const childHangup = () => {\n try {\n child.kill('SIGHUP')\n\n /* c8 ignore start */\n } catch (_) {\n // SIGHUP is weird on windows\n child.kill('SIGTERM')\n }\n /* c8 ignore stop */\n }\n const removeOnExit = onExit(childHangup)\n\n proxySignals(child)\n const dog = watchdog(child)\n\n let done = false\n child.on('close', async (code, signal) => {\n /* c8 ignore start */\n if (done) return\n /* c8 ignore stop */\n done = true\n const result = cleanup(code, signal, {\n watchdogPid: dog.pid,\n })\n const res = isPromise(result) ? await result : result\n removeOnExit()\n\n if (res === false) return\n else if (typeof res === 'string') {\n signal = res\n code = null\n } else if (typeof res === 'number') {\n code = res\n signal = null\n }\n\n if (signal) {\n // If there is nothing else keeping the event loop alive,\n // then there's a race between a graceful exit and getting\n // the signal to this process. Put this timeout here to\n // make sure we're still alive to get the signal, and thus\n // exit with the intended signal code.\n /* istanbul ignore next */\n setTimeout(() => {}, 2000)\n try {\n process.kill(process.pid, signal)\n /* c8 ignore start */\n } catch (_) {\n process.kill(process.pid, 'SIGTERM')\n }\n /* c8 ignore stop */\n } else {\n process.exit(code || 0)\n }\n })\n\n if (process.send) {\n process.removeAllListeners('message')\n\n child.on('message', (message, sendHandle) => {\n process.send?.(message, sendHandle)\n })\n\n process.on('message', (message, sendHandle) => {\n child.send(\n message as Serializable,\n sendHandle as SendHandle | undefined,\n )\n })\n }\n\n return child\n}\n\nconst isPromise = (o: any): o is Promise =>\n !!o && typeof o === 'object' && typeof o.then === 'function'\n"]} \ No newline at end of file diff --git a/node_modules/foreground-child/dist/commonjs/package.json b/node_modules/foreground-child/dist/commonjs/package.json deleted file mode 100644 index 5bbefff..0000000 --- a/node_modules/foreground-child/dist/commonjs/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "commonjs" -} diff --git a/node_modules/foreground-child/dist/commonjs/proxy-signals.d.ts b/node_modules/foreground-child/dist/commonjs/proxy-signals.d.ts deleted file mode 100644 index edf17bd..0000000 --- a/node_modules/foreground-child/dist/commonjs/proxy-signals.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { type ChildProcess } from 'child_process'; -/** - * Starts forwarding signals to `child` through `parent`. - */ -export declare const proxySignals: (child: ChildProcess) => () => void; -//# sourceMappingURL=proxy-signals.d.ts.map \ No newline at end of file diff --git a/node_modules/foreground-child/dist/commonjs/proxy-signals.d.ts.map b/node_modules/foreground-child/dist/commonjs/proxy-signals.d.ts.map deleted file mode 100644 index 7c19279..0000000 --- a/node_modules/foreground-child/dist/commonjs/proxy-signals.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"proxy-signals.d.ts","sourceRoot":"","sources":["../../src/proxy-signals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAA;AAGjD;;GAEG;AACH,eAAO,MAAM,YAAY,UAAW,YAAY,eA4B/C,CAAA"} \ No newline at end of file diff --git a/node_modules/foreground-child/dist/commonjs/proxy-signals.js b/node_modules/foreground-child/dist/commonjs/proxy-signals.js deleted file mode 100644 index 3913e7b..0000000 --- a/node_modules/foreground-child/dist/commonjs/proxy-signals.js +++ /dev/null @@ -1,38 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.proxySignals = void 0; -const all_signals_js_1 = require("./all-signals.js"); -/** - * Starts forwarding signals to `child` through `parent`. - */ -const proxySignals = (child) => { - const listeners = new Map(); - for (const sig of all_signals_js_1.allSignals) { - const listener = () => { - // some signals can only be received, not sent - try { - child.kill(sig); - /* c8 ignore start */ - } - catch (_) { } - /* c8 ignore stop */ - }; - try { - // if it's a signal this system doesn't recognize, skip it - process.on(sig, listener); - listeners.set(sig, listener); - /* c8 ignore start */ - } - catch (_) { } - /* c8 ignore stop */ - } - const unproxy = () => { - for (const [sig, listener] of listeners) { - process.removeListener(sig, listener); - } - }; - child.on('exit', unproxy); - return unproxy; -}; -exports.proxySignals = proxySignals; -//# sourceMappingURL=proxy-signals.js.map \ No newline at end of file diff --git a/node_modules/foreground-child/dist/commonjs/proxy-signals.js.map b/node_modules/foreground-child/dist/commonjs/proxy-signals.js.map deleted file mode 100644 index 1995822..0000000 --- a/node_modules/foreground-child/dist/commonjs/proxy-signals.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"proxy-signals.js","sourceRoot":"","sources":["../../src/proxy-signals.ts"],"names":[],"mappings":";;;AACA,qDAA6C;AAE7C;;GAEG;AACI,MAAM,YAAY,GAAG,CAAC,KAAmB,EAAE,EAAE;IAClD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAE,CAAA;IAE3B,KAAK,MAAM,GAAG,IAAI,2BAAU,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,8CAA8C;YAC9C,IAAI,CAAC;gBACH,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACf,qBAAqB;YACvB,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC,CAAA,CAAC;YACd,oBAAoB;QACtB,CAAC,CAAA;QACD,IAAI,CAAC;YACH,0DAA0D;YAC1D,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;YACzB,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;YAC5B,qBAAqB;QACvB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC,CAAA,CAAC;QACd,oBAAoB;IACtB,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,SAAS,EAAE,CAAC;YACxC,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;QACvC,CAAC;IACH,CAAC,CAAA;IACD,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACzB,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AA5BY,QAAA,YAAY,gBA4BxB","sourcesContent":["import { type ChildProcess } from 'child_process'\nimport { allSignals } from './all-signals.js'\n\n/**\n * Starts forwarding signals to `child` through `parent`.\n */\nexport const proxySignals = (child: ChildProcess) => {\n const listeners = new Map()\n\n for (const sig of allSignals) {\n const listener = () => {\n // some signals can only be received, not sent\n try {\n child.kill(sig)\n /* c8 ignore start */\n } catch (_) {}\n /* c8 ignore stop */\n }\n try {\n // if it's a signal this system doesn't recognize, skip it\n process.on(sig, listener)\n listeners.set(sig, listener)\n /* c8 ignore start */\n } catch (_) {}\n /* c8 ignore stop */\n }\n\n const unproxy = () => {\n for (const [sig, listener] of listeners) {\n process.removeListener(sig, listener)\n }\n }\n child.on('exit', unproxy)\n return unproxy\n}\n"]} \ No newline at end of file diff --git a/node_modules/foreground-child/dist/commonjs/watchdog.d.ts b/node_modules/foreground-child/dist/commonjs/watchdog.d.ts deleted file mode 100644 index f10c9de..0000000 --- a/node_modules/foreground-child/dist/commonjs/watchdog.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { ChildProcess } from 'child_process'; -/** - * Pass in a ChildProcess, and this will spawn a watchdog process that - * will make sure it exits if the parent does, thus preventing any - * dangling detached zombie processes. - * - * If the child ends before the parent, then the watchdog will terminate. - */ -export declare const watchdog: (child: ChildProcess) => ChildProcess; -//# sourceMappingURL=watchdog.d.ts.map \ No newline at end of file diff --git a/node_modules/foreground-child/dist/commonjs/watchdog.d.ts.map b/node_modules/foreground-child/dist/commonjs/watchdog.d.ts.map deleted file mode 100644 index d9ec243..0000000 --- a/node_modules/foreground-child/dist/commonjs/watchdog.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"watchdog.d.ts","sourceRoot":"","sources":["../../src/watchdog.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAS,MAAM,eAAe,CAAA;AAyBnD;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,UAAW,YAAY,iBAc3C,CAAA"} \ No newline at end of file diff --git a/node_modules/foreground-child/dist/commonjs/watchdog.js b/node_modules/foreground-child/dist/commonjs/watchdog.js deleted file mode 100644 index 514e234..0000000 --- a/node_modules/foreground-child/dist/commonjs/watchdog.js +++ /dev/null @@ -1,50 +0,0 @@ -"use strict"; -// this spawns a child process that listens for SIGHUP when the -// parent process exits, and after 200ms, sends a SIGKILL to the -// child, in case it did not terminate. -Object.defineProperty(exports, "__esModule", { value: true }); -exports.watchdog = void 0; -const child_process_1 = require("child_process"); -const watchdogCode = String.raw ` -const pid = parseInt(process.argv[1], 10) -process.title = 'node (foreground-child watchdog pid=' + pid + ')' -if (!isNaN(pid)) { - let barked = false - // keepalive - const interval = setInterval(() => {}, 60000) - const bark = () => { - clearInterval(interval) - if (barked) return - barked = true - process.removeListener('SIGHUP', bark) - setTimeout(() => { - try { - process.kill(pid, 'SIGKILL') - setTimeout(() => process.exit(), 200) - } catch (_) {} - }, 500) - }) - process.on('SIGHUP', bark) -} -`; -/** - * Pass in a ChildProcess, and this will spawn a watchdog process that - * will make sure it exits if the parent does, thus preventing any - * dangling detached zombie processes. - * - * If the child ends before the parent, then the watchdog will terminate. - */ -const watchdog = (child) => { - let dogExited = false; - const dog = (0, child_process_1.spawn)(process.execPath, ['-e', watchdogCode, String(child.pid)], { - stdio: 'ignore', - }); - dog.on('exit', () => (dogExited = true)); - child.on('exit', () => { - if (!dogExited) - dog.kill('SIGKILL'); - }); - return dog; -}; -exports.watchdog = watchdog; -//# sourceMappingURL=watchdog.js.map \ No newline at end of file diff --git a/node_modules/foreground-child/dist/commonjs/watchdog.js.map b/node_modules/foreground-child/dist/commonjs/watchdog.js.map deleted file mode 100644 index d486c97..0000000 --- a/node_modules/foreground-child/dist/commonjs/watchdog.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"watchdog.js","sourceRoot":"","sources":["../../src/watchdog.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,gEAAgE;AAChE,uCAAuC;;;AAEvC,iDAAmD;AAEnD,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;CAqB9B,CAAA;AAED;;;;;;GAMG;AACI,MAAM,QAAQ,GAAG,CAAC,KAAmB,EAAE,EAAE;IAC9C,IAAI,SAAS,GAAG,KAAK,CAAA;IACrB,MAAM,GAAG,GAAG,IAAA,qBAAK,EACf,OAAO,CAAC,QAAQ,EAChB,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EACvC;QACE,KAAK,EAAE,QAAQ;KAChB,CACF,CAAA;IACD,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAA;IACxC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;QACpB,IAAI,CAAC,SAAS;YAAE,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IACF,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAdY,QAAA,QAAQ,YAcpB","sourcesContent":["// this spawns a child process that listens for SIGHUP when the\n// parent process exits, and after 200ms, sends a SIGKILL to the\n// child, in case it did not terminate.\n\nimport { ChildProcess, spawn } from 'child_process'\n\nconst watchdogCode = String.raw`\nconst pid = parseInt(process.argv[1], 10)\nprocess.title = 'node (foreground-child watchdog pid=' + pid + ')'\nif (!isNaN(pid)) {\n let barked = false\n // keepalive\n const interval = setInterval(() => {}, 60000)\n const bark = () => {\n clearInterval(interval)\n if (barked) return\n barked = true\n process.removeListener('SIGHUP', bark)\n setTimeout(() => {\n try {\n process.kill(pid, 'SIGKILL')\n setTimeout(() => process.exit(), 200)\n } catch (_) {}\n }, 500)\n })\n process.on('SIGHUP', bark)\n}\n`\n\n/**\n * Pass in a ChildProcess, and this will spawn a watchdog process that\n * will make sure it exits if the parent does, thus preventing any\n * dangling detached zombie processes.\n *\n * If the child ends before the parent, then the watchdog will terminate.\n */\nexport const watchdog = (child: ChildProcess) => {\n let dogExited = false\n const dog = spawn(\n process.execPath,\n ['-e', watchdogCode, String(child.pid)],\n {\n stdio: 'ignore',\n },\n )\n dog.on('exit', () => (dogExited = true))\n child.on('exit', () => {\n if (!dogExited) dog.kill('SIGKILL')\n })\n return dog\n}\n"]} \ No newline at end of file diff --git a/node_modules/foreground-child/dist/esm/all-signals.d.ts b/node_modules/foreground-child/dist/esm/all-signals.d.ts deleted file mode 100644 index ecc0a62..0000000 --- a/node_modules/foreground-child/dist/esm/all-signals.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export declare const allSignals: NodeJS.Signals[]; -//# sourceMappingURL=all-signals.d.ts.map \ No newline at end of file diff --git a/node_modules/foreground-child/dist/esm/all-signals.d.ts.map b/node_modules/foreground-child/dist/esm/all-signals.d.ts.map deleted file mode 100644 index cd1c161..0000000 --- a/node_modules/foreground-child/dist/esm/all-signals.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"all-signals.d.ts","sourceRoot":"","sources":["../../src/all-signals.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,UAAU,EAShB,MAAM,CAAC,OAAO,EAAE,CAAA"} \ No newline at end of file diff --git a/node_modules/foreground-child/dist/esm/all-signals.js b/node_modules/foreground-child/dist/esm/all-signals.js deleted file mode 100644 index 7e8d54d..0000000 --- a/node_modules/foreground-child/dist/esm/all-signals.js +++ /dev/null @@ -1,52 +0,0 @@ -import constants from 'node:constants'; -export const allSignals = -// this is the full list of signals that Node will let us do anything with -Object.keys(constants).filter(k => k.startsWith('SIG') && - // https://github.com/tapjs/signal-exit/issues/21 - k !== 'SIGPROF' && - // no sense trying to listen for SIGKILL, it's impossible - k !== 'SIGKILL'); -// These are some obscure signals that are reported by kill -l -// on macOS, Linux, or Windows, but which don't have any mapping -// in Node.js. No sense trying if they're just going to throw -// every time on every platform. -// -// 'SIGEMT', -// 'SIGLOST', -// 'SIGPOLL', -// 'SIGRTMAX', -// 'SIGRTMAX-1', -// 'SIGRTMAX-10', -// 'SIGRTMAX-11', -// 'SIGRTMAX-12', -// 'SIGRTMAX-13', -// 'SIGRTMAX-14', -// 'SIGRTMAX-15', -// 'SIGRTMAX-2', -// 'SIGRTMAX-3', -// 'SIGRTMAX-4', -// 'SIGRTMAX-5', -// 'SIGRTMAX-6', -// 'SIGRTMAX-7', -// 'SIGRTMAX-8', -// 'SIGRTMAX-9', -// 'SIGRTMIN', -// 'SIGRTMIN+1', -// 'SIGRTMIN+10', -// 'SIGRTMIN+11', -// 'SIGRTMIN+12', -// 'SIGRTMIN+13', -// 'SIGRTMIN+14', -// 'SIGRTMIN+15', -// 'SIGRTMIN+16', -// 'SIGRTMIN+2', -// 'SIGRTMIN+3', -// 'SIGRTMIN+4', -// 'SIGRTMIN+5', -// 'SIGRTMIN+6', -// 'SIGRTMIN+7', -// 'SIGRTMIN+8', -// 'SIGRTMIN+9', -// 'SIGSTKFLT', -// 'SIGUNUSED', -//# sourceMappingURL=all-signals.js.map \ No newline at end of file diff --git a/node_modules/foreground-child/dist/esm/all-signals.js.map b/node_modules/foreground-child/dist/esm/all-signals.js.map deleted file mode 100644 index 1c63c6b..0000000 --- a/node_modules/foreground-child/dist/esm/all-signals.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"all-signals.js","sourceRoot":"","sources":["../../src/all-signals.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,gBAAgB,CAAA;AACtC,MAAM,CAAC,MAAM,UAAU;AACrB,0EAA0E;AAC1E,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAC3B,CAAC,CAAC,EAAE,CACF,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC;IACnB,iDAAiD;IACjD,CAAC,KAAK,SAAS;IACf,yDAAyD;IACzD,CAAC,KAAK,SAAS,CACE,CAAA;AAEvB,8DAA8D;AAC9D,gEAAgE;AAChE,6DAA6D;AAC7D,gCAAgC;AAChC,EAAE;AACF,YAAY;AACZ,aAAa;AACb,aAAa;AACb,cAAc;AACd,gBAAgB;AAChB,iBAAiB;AACjB,iBAAiB;AACjB,iBAAiB;AACjB,iBAAiB;AACjB,iBAAiB;AACjB,iBAAiB;AACjB,gBAAgB;AAChB,gBAAgB;AAChB,gBAAgB;AAChB,gBAAgB;AAChB,gBAAgB;AAChB,gBAAgB;AAChB,gBAAgB;AAChB,gBAAgB;AAChB,cAAc;AACd,gBAAgB;AAChB,iBAAiB;AACjB,iBAAiB;AACjB,iBAAiB;AACjB,iBAAiB;AACjB,iBAAiB;AACjB,iBAAiB;AACjB,iBAAiB;AACjB,gBAAgB;AAChB,gBAAgB;AAChB,gBAAgB;AAChB,gBAAgB;AAChB,gBAAgB;AAChB,gBAAgB;AAChB,gBAAgB;AAChB,gBAAgB;AAChB,eAAe;AACf,eAAe","sourcesContent":["import constants from 'node:constants'\nexport const allSignals =\n // this is the full list of signals that Node will let us do anything with\n Object.keys(constants).filter(\n k =>\n k.startsWith('SIG') &&\n // https://github.com/tapjs/signal-exit/issues/21\n k !== 'SIGPROF' &&\n // no sense trying to listen for SIGKILL, it's impossible\n k !== 'SIGKILL',\n ) as NodeJS.Signals[]\n\n// These are some obscure signals that are reported by kill -l\n// on macOS, Linux, or Windows, but which don't have any mapping\n// in Node.js. No sense trying if they're just going to throw\n// every time on every platform.\n//\n// 'SIGEMT',\n// 'SIGLOST',\n// 'SIGPOLL',\n// 'SIGRTMAX',\n// 'SIGRTMAX-1',\n// 'SIGRTMAX-10',\n// 'SIGRTMAX-11',\n// 'SIGRTMAX-12',\n// 'SIGRTMAX-13',\n// 'SIGRTMAX-14',\n// 'SIGRTMAX-15',\n// 'SIGRTMAX-2',\n// 'SIGRTMAX-3',\n// 'SIGRTMAX-4',\n// 'SIGRTMAX-5',\n// 'SIGRTMAX-6',\n// 'SIGRTMAX-7',\n// 'SIGRTMAX-8',\n// 'SIGRTMAX-9',\n// 'SIGRTMIN',\n// 'SIGRTMIN+1',\n// 'SIGRTMIN+10',\n// 'SIGRTMIN+11',\n// 'SIGRTMIN+12',\n// 'SIGRTMIN+13',\n// 'SIGRTMIN+14',\n// 'SIGRTMIN+15',\n// 'SIGRTMIN+16',\n// 'SIGRTMIN+2',\n// 'SIGRTMIN+3',\n// 'SIGRTMIN+4',\n// 'SIGRTMIN+5',\n// 'SIGRTMIN+6',\n// 'SIGRTMIN+7',\n// 'SIGRTMIN+8',\n// 'SIGRTMIN+9',\n// 'SIGSTKFLT',\n// 'SIGUNUSED',\n"]} \ No newline at end of file diff --git a/node_modules/foreground-child/dist/esm/index.d.ts b/node_modules/foreground-child/dist/esm/index.d.ts deleted file mode 100644 index d15b38e..0000000 --- a/node_modules/foreground-child/dist/esm/index.d.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { ChildProcessByStdio, SpawnOptions, ChildProcess } from 'child_process'; -/** - * The signature for the cleanup method. - * - * Arguments indicate the exit status of the child process. - * - * If a Promise is returned, then the process is not terminated - * until it resolves, and the resolution value is treated as the - * exit status (if a number) or signal exit (if a signal string). - * - * If `undefined` is returned, then no change is made, and the parent - * exits in the same way that the child exited. - * - * If boolean `false` is returned, then the parent's exit is canceled. - * - * If a number is returned, then the parent process exits with the number - * as its exitCode. - * - * If a signal string is returned, then the parent process is killed with - * the same signal that caused the child to exit. - */ -export type Cleanup = (code: number | null, signal: null | NodeJS.Signals, processInfo: { - watchdogPid?: ChildProcess['pid']; -}) => void | undefined | number | NodeJS.Signals | false | Promise; -export type FgArgs = [program: string | [cmd: string, ...args: string[]], cleanup?: Cleanup] | [ - program: [cmd: string, ...args: string[]], - opts?: SpawnOptions, - cleanup?: Cleanup -] | [program: string, cleanup?: Cleanup] | [program: string, opts?: SpawnOptions, cleanup?: Cleanup] | [program: string, args?: string[], cleanup?: Cleanup] | [ - program: string, - args?: string[], - opts?: SpawnOptions, - cleanup?: Cleanup -]; -/** - * Normalizes the arguments passed to `foregroundChild`. - * - * Exposed for testing. - * - * @internal - */ -export declare const normalizeFgArgs: (fgArgs: FgArgs) => [program: string, args: string[], spawnOpts: SpawnOptions, cleanup: Cleanup]; -/** - * Spawn the specified program as a "foreground" process, or at least as - * close as is possible given node's lack of exec-without-fork. - * - * Cleanup method may be used to modify or ignore the result of the child's - * exit code or signal. If cleanup returns undefined (or a Promise that - * resolves to undefined), then the parent will exit in the same way that - * the child did. - * - * Return boolean `false` to prevent the parent's exit entirely. - */ -export declare function foregroundChild(cmd: string | [cmd: string, ...args: string[]], cleanup?: Cleanup): ChildProcessByStdio; -export declare function foregroundChild(program: string, args?: string[], cleanup?: Cleanup): ChildProcessByStdio; -export declare function foregroundChild(program: string, spawnOpts?: SpawnOptions, cleanup?: Cleanup): ChildProcessByStdio; -export declare function foregroundChild(program: string, args?: string[], spawnOpts?: SpawnOptions, cleanup?: Cleanup): ChildProcessByStdio; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/foreground-child/dist/esm/index.d.ts.map b/node_modules/foreground-child/dist/esm/index.d.ts.map deleted file mode 100644 index b26fecd..0000000 --- a/node_modules/foreground-child/dist/esm/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EAInB,YAAY,EACZ,YAAY,EACb,MAAM,eAAe,CAAA;AAUtB;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,MAAM,OAAO,GAAG,CACpB,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,OAAO,EAC7B,WAAW,EAAE;IACX,WAAW,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,CAAA;CAClC,KAEC,IAAI,GACJ,SAAS,GACT,MAAM,GACN,MAAM,CAAC,OAAO,GACd,KAAK,GACL,OAAO,CAAC,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,CAAA;AAE/D,MAAM,MAAM,MAAM,GACd,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,GACvE;IACE,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC;IACzC,IAAI,CAAC,EAAE,YAAY;IACnB,OAAO,CAAC,EAAE,OAAO;CAClB,GACD,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,GACpC,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,GACzD,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,GACrD;IACE,OAAO,EAAE,MAAM;IACf,IAAI,CAAC,EAAE,MAAM,EAAE;IACf,IAAI,CAAC,EAAE,YAAY;IACnB,OAAO,CAAC,EAAE,OAAO;CAClB,CAAA;AAEL;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,WAClB,MAAM,KACb,CACD,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,SAAS,EAAE,YAAY,EACvB,OAAO,EAAE,OAAO,CAqBjB,CAAA;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,EAC9C,OAAO,CAAC,EAAE,OAAO,GAChB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AACxC,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,EAAE,EACf,OAAO,CAAC,EAAE,OAAO,GAChB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AACxC,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,YAAY,EACxB,OAAO,CAAC,EAAE,OAAO,GAChB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AACxC,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,EAAE,EACf,SAAS,CAAC,EAAE,YAAY,EACxB,OAAO,CAAC,EAAE,OAAO,GAChB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/foreground-child/dist/esm/index.js b/node_modules/foreground-child/dist/esm/index.js deleted file mode 100644 index 6266b58..0000000 --- a/node_modules/foreground-child/dist/esm/index.js +++ /dev/null @@ -1,115 +0,0 @@ -import { spawn as nodeSpawn, } from 'child_process'; -import crossSpawn from 'cross-spawn'; -import { onExit } from 'signal-exit'; -import { proxySignals } from './proxy-signals.js'; -import { watchdog } from './watchdog.js'; -/* c8 ignore start */ -const spawn = process?.platform === 'win32' ? crossSpawn : nodeSpawn; -/** - * Normalizes the arguments passed to `foregroundChild`. - * - * Exposed for testing. - * - * @internal - */ -export const normalizeFgArgs = (fgArgs) => { - let [program, args = [], spawnOpts = {}, cleanup = () => { }] = fgArgs; - if (typeof args === 'function') { - cleanup = args; - spawnOpts = {}; - args = []; - } - else if (!!args && typeof args === 'object' && !Array.isArray(args)) { - if (typeof spawnOpts === 'function') - cleanup = spawnOpts; - spawnOpts = args; - args = []; - } - else if (typeof spawnOpts === 'function') { - cleanup = spawnOpts; - spawnOpts = {}; - } - if (Array.isArray(program)) { - const [pp, ...pa] = program; - program = pp; - args = pa; - } - return [program, args, { ...spawnOpts }, cleanup]; -}; -export function foregroundChild(...fgArgs) { - const [program, args, spawnOpts, cleanup] = normalizeFgArgs(fgArgs); - spawnOpts.stdio = [0, 1, 2]; - if (process.send) { - spawnOpts.stdio.push('ipc'); - } - const child = spawn(program, args, spawnOpts); - const childHangup = () => { - try { - child.kill('SIGHUP'); - /* c8 ignore start */ - } - catch (_) { - // SIGHUP is weird on windows - child.kill('SIGTERM'); - } - /* c8 ignore stop */ - }; - const removeOnExit = onExit(childHangup); - proxySignals(child); - const dog = watchdog(child); - let done = false; - child.on('close', async (code, signal) => { - /* c8 ignore start */ - if (done) - return; - /* c8 ignore stop */ - done = true; - const result = cleanup(code, signal, { - watchdogPid: dog.pid, - }); - const res = isPromise(result) ? await result : result; - removeOnExit(); - if (res === false) - return; - else if (typeof res === 'string') { - signal = res; - code = null; - } - else if (typeof res === 'number') { - code = res; - signal = null; - } - if (signal) { - // If there is nothing else keeping the event loop alive, - // then there's a race between a graceful exit and getting - // the signal to this process. Put this timeout here to - // make sure we're still alive to get the signal, and thus - // exit with the intended signal code. - /* istanbul ignore next */ - setTimeout(() => { }, 2000); - try { - process.kill(process.pid, signal); - /* c8 ignore start */ - } - catch (_) { - process.kill(process.pid, 'SIGTERM'); - } - /* c8 ignore stop */ - } - else { - process.exit(code || 0); - } - }); - if (process.send) { - process.removeAllListeners('message'); - child.on('message', (message, sendHandle) => { - process.send?.(message, sendHandle); - }); - process.on('message', (message, sendHandle) => { - child.send(message, sendHandle); - }); - } - return child; -} -const isPromise = (o) => !!o && typeof o === 'object' && typeof o.then === 'function'; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/foreground-child/dist/esm/index.js.map b/node_modules/foreground-child/dist/esm/index.js.map deleted file mode 100644 index 7d9d1bd..0000000 --- a/node_modules/foreground-child/dist/esm/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ChildProcessByStdio,\n SendHandle,\n Serializable,\n spawn as nodeSpawn,\n SpawnOptions,\n ChildProcess,\n} from 'child_process'\nimport crossSpawn from 'cross-spawn'\nimport { onExit } from 'signal-exit'\nimport { proxySignals } from './proxy-signals.js'\nimport { watchdog } from './watchdog.js'\n\n/* c8 ignore start */\nconst spawn = process?.platform === 'win32' ? crossSpawn : nodeSpawn\n/* c8 ignore stop */\n\n/**\n * The signature for the cleanup method.\n *\n * Arguments indicate the exit status of the child process.\n *\n * If a Promise is returned, then the process is not terminated\n * until it resolves, and the resolution value is treated as the\n * exit status (if a number) or signal exit (if a signal string).\n *\n * If `undefined` is returned, then no change is made, and the parent\n * exits in the same way that the child exited.\n *\n * If boolean `false` is returned, then the parent's exit is canceled.\n *\n * If a number is returned, then the parent process exits with the number\n * as its exitCode.\n *\n * If a signal string is returned, then the parent process is killed with\n * the same signal that caused the child to exit.\n */\nexport type Cleanup = (\n code: number | null,\n signal: null | NodeJS.Signals,\n processInfo: {\n watchdogPid?: ChildProcess['pid']\n },\n) =>\n | void\n | undefined\n | number\n | NodeJS.Signals\n | false\n | Promise\n\nexport type FgArgs =\n | [program: string | [cmd: string, ...args: string[]], cleanup?: Cleanup]\n | [\n program: [cmd: string, ...args: string[]],\n opts?: SpawnOptions,\n cleanup?: Cleanup,\n ]\n | [program: string, cleanup?: Cleanup]\n | [program: string, opts?: SpawnOptions, cleanup?: Cleanup]\n | [program: string, args?: string[], cleanup?: Cleanup]\n | [\n program: string,\n args?: string[],\n opts?: SpawnOptions,\n cleanup?: Cleanup,\n ]\n\n/**\n * Normalizes the arguments passed to `foregroundChild`.\n *\n * Exposed for testing.\n *\n * @internal\n */\nexport const normalizeFgArgs = (\n fgArgs: FgArgs,\n): [\n program: string,\n args: string[],\n spawnOpts: SpawnOptions,\n cleanup: Cleanup,\n] => {\n let [program, args = [], spawnOpts = {}, cleanup = () => {}] = fgArgs\n if (typeof args === 'function') {\n cleanup = args\n spawnOpts = {}\n args = []\n } else if (!!args && typeof args === 'object' && !Array.isArray(args)) {\n if (typeof spawnOpts === 'function') cleanup = spawnOpts\n spawnOpts = args\n args = []\n } else if (typeof spawnOpts === 'function') {\n cleanup = spawnOpts\n spawnOpts = {}\n }\n if (Array.isArray(program)) {\n const [pp, ...pa] = program\n program = pp\n args = pa\n }\n return [program, args, { ...spawnOpts }, cleanup]\n}\n\n/**\n * Spawn the specified program as a \"foreground\" process, or at least as\n * close as is possible given node's lack of exec-without-fork.\n *\n * Cleanup method may be used to modify or ignore the result of the child's\n * exit code or signal. If cleanup returns undefined (or a Promise that\n * resolves to undefined), then the parent will exit in the same way that\n * the child did.\n *\n * Return boolean `false` to prevent the parent's exit entirely.\n */\nexport function foregroundChild(\n cmd: string | [cmd: string, ...args: string[]],\n cleanup?: Cleanup,\n): ChildProcessByStdio\nexport function foregroundChild(\n program: string,\n args?: string[],\n cleanup?: Cleanup,\n): ChildProcessByStdio\nexport function foregroundChild(\n program: string,\n spawnOpts?: SpawnOptions,\n cleanup?: Cleanup,\n): ChildProcessByStdio\nexport function foregroundChild(\n program: string,\n args?: string[],\n spawnOpts?: SpawnOptions,\n cleanup?: Cleanup,\n): ChildProcessByStdio\nexport function foregroundChild(\n ...fgArgs: FgArgs\n): ChildProcessByStdio {\n const [program, args, spawnOpts, cleanup] = normalizeFgArgs(fgArgs)\n\n spawnOpts.stdio = [0, 1, 2]\n if (process.send) {\n spawnOpts.stdio.push('ipc')\n }\n\n const child = spawn(program, args, spawnOpts) as ChildProcessByStdio<\n null,\n null,\n null\n >\n\n const childHangup = () => {\n try {\n child.kill('SIGHUP')\n\n /* c8 ignore start */\n } catch (_) {\n // SIGHUP is weird on windows\n child.kill('SIGTERM')\n }\n /* c8 ignore stop */\n }\n const removeOnExit = onExit(childHangup)\n\n proxySignals(child)\n const dog = watchdog(child)\n\n let done = false\n child.on('close', async (code, signal) => {\n /* c8 ignore start */\n if (done) return\n /* c8 ignore stop */\n done = true\n const result = cleanup(code, signal, {\n watchdogPid: dog.pid,\n })\n const res = isPromise(result) ? await result : result\n removeOnExit()\n\n if (res === false) return\n else if (typeof res === 'string') {\n signal = res\n code = null\n } else if (typeof res === 'number') {\n code = res\n signal = null\n }\n\n if (signal) {\n // If there is nothing else keeping the event loop alive,\n // then there's a race between a graceful exit and getting\n // the signal to this process. Put this timeout here to\n // make sure we're still alive to get the signal, and thus\n // exit with the intended signal code.\n /* istanbul ignore next */\n setTimeout(() => {}, 2000)\n try {\n process.kill(process.pid, signal)\n /* c8 ignore start */\n } catch (_) {\n process.kill(process.pid, 'SIGTERM')\n }\n /* c8 ignore stop */\n } else {\n process.exit(code || 0)\n }\n })\n\n if (process.send) {\n process.removeAllListeners('message')\n\n child.on('message', (message, sendHandle) => {\n process.send?.(message, sendHandle)\n })\n\n process.on('message', (message, sendHandle) => {\n child.send(\n message as Serializable,\n sendHandle as SendHandle | undefined,\n )\n })\n }\n\n return child\n}\n\nconst isPromise = (o: any): o is Promise =>\n !!o && typeof o === 'object' && typeof o.then === 'function'\n"]} \ No newline at end of file diff --git a/node_modules/foreground-child/dist/esm/package.json b/node_modules/foreground-child/dist/esm/package.json deleted file mode 100644 index 3dbc1ca..0000000 --- a/node_modules/foreground-child/dist/esm/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "module" -} diff --git a/node_modules/foreground-child/dist/esm/proxy-signals.d.ts b/node_modules/foreground-child/dist/esm/proxy-signals.d.ts deleted file mode 100644 index edf17bd..0000000 --- a/node_modules/foreground-child/dist/esm/proxy-signals.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { type ChildProcess } from 'child_process'; -/** - * Starts forwarding signals to `child` through `parent`. - */ -export declare const proxySignals: (child: ChildProcess) => () => void; -//# sourceMappingURL=proxy-signals.d.ts.map \ No newline at end of file diff --git a/node_modules/foreground-child/dist/esm/proxy-signals.d.ts.map b/node_modules/foreground-child/dist/esm/proxy-signals.d.ts.map deleted file mode 100644 index 7c19279..0000000 --- a/node_modules/foreground-child/dist/esm/proxy-signals.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"proxy-signals.d.ts","sourceRoot":"","sources":["../../src/proxy-signals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAA;AAGjD;;GAEG;AACH,eAAO,MAAM,YAAY,UAAW,YAAY,eA4B/C,CAAA"} \ No newline at end of file diff --git a/node_modules/foreground-child/dist/esm/proxy-signals.js b/node_modules/foreground-child/dist/esm/proxy-signals.js deleted file mode 100644 index 8e1efe3..0000000 --- a/node_modules/foreground-child/dist/esm/proxy-signals.js +++ /dev/null @@ -1,34 +0,0 @@ -import { allSignals } from './all-signals.js'; -/** - * Starts forwarding signals to `child` through `parent`. - */ -export const proxySignals = (child) => { - const listeners = new Map(); - for (const sig of allSignals) { - const listener = () => { - // some signals can only be received, not sent - try { - child.kill(sig); - /* c8 ignore start */ - } - catch (_) { } - /* c8 ignore stop */ - }; - try { - // if it's a signal this system doesn't recognize, skip it - process.on(sig, listener); - listeners.set(sig, listener); - /* c8 ignore start */ - } - catch (_) { } - /* c8 ignore stop */ - } - const unproxy = () => { - for (const [sig, listener] of listeners) { - process.removeListener(sig, listener); - } - }; - child.on('exit', unproxy); - return unproxy; -}; -//# sourceMappingURL=proxy-signals.js.map \ No newline at end of file diff --git a/node_modules/foreground-child/dist/esm/proxy-signals.js.map b/node_modules/foreground-child/dist/esm/proxy-signals.js.map deleted file mode 100644 index 978750f..0000000 --- a/node_modules/foreground-child/dist/esm/proxy-signals.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"proxy-signals.js","sourceRoot":"","sources":["../../src/proxy-signals.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAmB,EAAE,EAAE;IAClD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAE,CAAA;IAE3B,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,8CAA8C;YAC9C,IAAI,CAAC;gBACH,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACf,qBAAqB;YACvB,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC,CAAA,CAAC;YACd,oBAAoB;QACtB,CAAC,CAAA;QACD,IAAI,CAAC;YACH,0DAA0D;YAC1D,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;YACzB,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;YAC5B,qBAAqB;QACvB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC,CAAA,CAAC;QACd,oBAAoB;IACtB,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,SAAS,EAAE,CAAC;YACxC,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;QACvC,CAAC;IACH,CAAC,CAAA;IACD,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACzB,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA","sourcesContent":["import { type ChildProcess } from 'child_process'\nimport { allSignals } from './all-signals.js'\n\n/**\n * Starts forwarding signals to `child` through `parent`.\n */\nexport const proxySignals = (child: ChildProcess) => {\n const listeners = new Map()\n\n for (const sig of allSignals) {\n const listener = () => {\n // some signals can only be received, not sent\n try {\n child.kill(sig)\n /* c8 ignore start */\n } catch (_) {}\n /* c8 ignore stop */\n }\n try {\n // if it's a signal this system doesn't recognize, skip it\n process.on(sig, listener)\n listeners.set(sig, listener)\n /* c8 ignore start */\n } catch (_) {}\n /* c8 ignore stop */\n }\n\n const unproxy = () => {\n for (const [sig, listener] of listeners) {\n process.removeListener(sig, listener)\n }\n }\n child.on('exit', unproxy)\n return unproxy\n}\n"]} \ No newline at end of file diff --git a/node_modules/foreground-child/dist/esm/watchdog.d.ts b/node_modules/foreground-child/dist/esm/watchdog.d.ts deleted file mode 100644 index f10c9de..0000000 --- a/node_modules/foreground-child/dist/esm/watchdog.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { ChildProcess } from 'child_process'; -/** - * Pass in a ChildProcess, and this will spawn a watchdog process that - * will make sure it exits if the parent does, thus preventing any - * dangling detached zombie processes. - * - * If the child ends before the parent, then the watchdog will terminate. - */ -export declare const watchdog: (child: ChildProcess) => ChildProcess; -//# sourceMappingURL=watchdog.d.ts.map \ No newline at end of file diff --git a/node_modules/foreground-child/dist/esm/watchdog.d.ts.map b/node_modules/foreground-child/dist/esm/watchdog.d.ts.map deleted file mode 100644 index d9ec243..0000000 --- a/node_modules/foreground-child/dist/esm/watchdog.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"watchdog.d.ts","sourceRoot":"","sources":["../../src/watchdog.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAS,MAAM,eAAe,CAAA;AAyBnD;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,UAAW,YAAY,iBAc3C,CAAA"} \ No newline at end of file diff --git a/node_modules/foreground-child/dist/esm/watchdog.js b/node_modules/foreground-child/dist/esm/watchdog.js deleted file mode 100644 index 7aa184e..0000000 --- a/node_modules/foreground-child/dist/esm/watchdog.js +++ /dev/null @@ -1,46 +0,0 @@ -// this spawns a child process that listens for SIGHUP when the -// parent process exits, and after 200ms, sends a SIGKILL to the -// child, in case it did not terminate. -import { spawn } from 'child_process'; -const watchdogCode = String.raw ` -const pid = parseInt(process.argv[1], 10) -process.title = 'node (foreground-child watchdog pid=' + pid + ')' -if (!isNaN(pid)) { - let barked = false - // keepalive - const interval = setInterval(() => {}, 60000) - const bark = () => { - clearInterval(interval) - if (barked) return - barked = true - process.removeListener('SIGHUP', bark) - setTimeout(() => { - try { - process.kill(pid, 'SIGKILL') - setTimeout(() => process.exit(), 200) - } catch (_) {} - }, 500) - }) - process.on('SIGHUP', bark) -} -`; -/** - * Pass in a ChildProcess, and this will spawn a watchdog process that - * will make sure it exits if the parent does, thus preventing any - * dangling detached zombie processes. - * - * If the child ends before the parent, then the watchdog will terminate. - */ -export const watchdog = (child) => { - let dogExited = false; - const dog = spawn(process.execPath, ['-e', watchdogCode, String(child.pid)], { - stdio: 'ignore', - }); - dog.on('exit', () => (dogExited = true)); - child.on('exit', () => { - if (!dogExited) - dog.kill('SIGKILL'); - }); - return dog; -}; -//# sourceMappingURL=watchdog.js.map \ No newline at end of file diff --git a/node_modules/foreground-child/dist/esm/watchdog.js.map b/node_modules/foreground-child/dist/esm/watchdog.js.map deleted file mode 100644 index 6f4e39f..0000000 --- a/node_modules/foreground-child/dist/esm/watchdog.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"watchdog.js","sourceRoot":"","sources":["../../src/watchdog.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,gEAAgE;AAChE,uCAAuC;AAEvC,OAAO,EAAgB,KAAK,EAAE,MAAM,eAAe,CAAA;AAEnD,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;CAqB9B,CAAA;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAmB,EAAE,EAAE;IAC9C,IAAI,SAAS,GAAG,KAAK,CAAA;IACrB,MAAM,GAAG,GAAG,KAAK,CACf,OAAO,CAAC,QAAQ,EAChB,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EACvC;QACE,KAAK,EAAE,QAAQ;KAChB,CACF,CAAA;IACD,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAA;IACxC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;QACpB,IAAI,CAAC,SAAS;YAAE,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IACF,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA","sourcesContent":["// this spawns a child process that listens for SIGHUP when the\n// parent process exits, and after 200ms, sends a SIGKILL to the\n// child, in case it did not terminate.\n\nimport { ChildProcess, spawn } from 'child_process'\n\nconst watchdogCode = String.raw`\nconst pid = parseInt(process.argv[1], 10)\nprocess.title = 'node (foreground-child watchdog pid=' + pid + ')'\nif (!isNaN(pid)) {\n let barked = false\n // keepalive\n const interval = setInterval(() => {}, 60000)\n const bark = () => {\n clearInterval(interval)\n if (barked) return\n barked = true\n process.removeListener('SIGHUP', bark)\n setTimeout(() => {\n try {\n process.kill(pid, 'SIGKILL')\n setTimeout(() => process.exit(), 200)\n } catch (_) {}\n }, 500)\n })\n process.on('SIGHUP', bark)\n}\n`\n\n/**\n * Pass in a ChildProcess, and this will spawn a watchdog process that\n * will make sure it exits if the parent does, thus preventing any\n * dangling detached zombie processes.\n *\n * If the child ends before the parent, then the watchdog will terminate.\n */\nexport const watchdog = (child: ChildProcess) => {\n let dogExited = false\n const dog = spawn(\n process.execPath,\n ['-e', watchdogCode, String(child.pid)],\n {\n stdio: 'ignore',\n },\n )\n dog.on('exit', () => (dogExited = true))\n child.on('exit', () => {\n if (!dogExited) dog.kill('SIGKILL')\n })\n return dog\n}\n"]} \ No newline at end of file diff --git a/node_modules/foreground-child/package.json b/node_modules/foreground-child/package.json deleted file mode 100644 index 75f5b99..0000000 --- a/node_modules/foreground-child/package.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "name": "foreground-child", - "version": "3.3.1", - "description": "Run a child as if it's the foreground process. Give it stdio. Exit when it exits.", - "main": "./dist/commonjs/index.js", - "types": "./dist/commonjs/index.d.ts", - "exports": { - "./watchdog": { - "import": { - "types": "./dist/esm/watchdog.d.ts", - "default": "./dist/esm/watchdog.js" - }, - "require": { - "types": "./dist/commonjs/watchdog.d.ts", - "default": "./dist/commonjs/watchdog.js" - } - }, - "./proxy-signals": { - "import": { - "types": "./dist/esm/proxy-signals.d.ts", - "default": "./dist/esm/proxy-signals.js" - }, - "require": { - "types": "./dist/commonjs/proxy-signals.d.ts", - "default": "./dist/commonjs/proxy-signals.js" - } - }, - "./package.json": "./package.json", - ".": { - "import": { - "types": "./dist/esm/index.d.ts", - "default": "./dist/esm/index.js" - }, - "require": { - "types": "./dist/commonjs/index.d.ts", - "default": "./dist/commonjs/index.js" - } - } - }, - "files": [ - "dist" - ], - "engines": { - "node": ">=14" - }, - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "scripts": { - "preversion": "npm test", - "postversion": "npm publish", - "prepublishOnly": "git push origin --follow-tags", - "prepare": "tshy", - "pretest": "npm run prepare", - "presnap": "npm run prepare", - "test": "tap", - "snap": "tap", - "format": "prettier --write . --log-level warn", - "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts" - }, - "prettier": { - "experimentalTernaries": true, - "semi": false, - "printWidth": 75, - "tabWidth": 2, - "useTabs": false, - "singleQuote": true, - "jsxSingleQuote": false, - "bracketSameLine": true, - "arrowParens": "avoid", - "endOfLine": "lf" - }, - "tap": { - "typecheck": true - }, - "repository": { - "type": "git", - "url": "git+https://github.com/tapjs/foreground-child.git" - }, - "author": "Isaac Z. Schlueter (http://blog.izs.me/)", - "license": "ISC", - "devDependencies": { - "@types/cross-spawn": "^6.0.2", - "@types/node": "^18.15.11", - "@types/tap": "^15.0.8", - "prettier": "^3.3.2", - "tap": "^21.1.0", - "tshy": "^3.0.2", - "typedoc": "^0.24.2", - "typescript": "^5.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "tshy": { - "exports": { - "./watchdog": "./src/watchdog.ts", - "./proxy-signals": "./src/proxy-signals.ts", - "./package.json": "./package.json", - ".": "./src/index.ts" - } - }, - "type": "module", - "module": "./dist/esm/index.js" -} diff --git a/node_modules/function-bind/.eslintrc b/node_modules/function-bind/.eslintrc deleted file mode 100644 index 71a054f..0000000 --- a/node_modules/function-bind/.eslintrc +++ /dev/null @@ -1,21 +0,0 @@ -{ - "root": true, - - "extends": "@ljharb", - - "rules": { - "func-name-matching": 0, - "indent": [2, 4], - "no-new-func": [1], - }, - - "overrides": [ - { - "files": "test/**", - "rules": { - "max-lines-per-function": 0, - "strict": [0] - }, - }, - ], -} diff --git a/node_modules/function-bind/.github/FUNDING.yml b/node_modules/function-bind/.github/FUNDING.yml deleted file mode 100644 index 7448219..0000000 --- a/node_modules/function-bind/.github/FUNDING.yml +++ /dev/null @@ -1,12 +0,0 @@ -# These are supported funding model platforms - -github: [ljharb] -patreon: # Replace with a single Patreon username -open_collective: # Replace with a single Open Collective username -ko_fi: # Replace with a single Ko-fi username -tidelift: npm/function-bind -community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -liberapay: # Replace with a single Liberapay username -issuehunt: # Replace with a single IssueHunt username -otechie: # Replace with a single Otechie username -custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/node_modules/function-bind/.github/SECURITY.md b/node_modules/function-bind/.github/SECURITY.md deleted file mode 100644 index 82e4285..0000000 --- a/node_modules/function-bind/.github/SECURITY.md +++ /dev/null @@ -1,3 +0,0 @@ -# Security - -Please email [@ljharb](https://github.com/ljharb) or see https://tidelift.com/security if you have a potential security vulnerability to report. diff --git a/node_modules/function-bind/.nycrc b/node_modules/function-bind/.nycrc deleted file mode 100644 index 1826526..0000000 --- a/node_modules/function-bind/.nycrc +++ /dev/null @@ -1,13 +0,0 @@ -{ - "all": true, - "check-coverage": false, - "reporter": ["text-summary", "text", "html", "json"], - "lines": 86, - "statements": 85.93, - "functions": 82.43, - "branches": 76.06, - "exclude": [ - "coverage", - "test" - ] -} diff --git a/node_modules/function-bind/CHANGELOG.md b/node_modules/function-bind/CHANGELOG.md deleted file mode 100644 index f9e6cc0..0000000 --- a/node_modules/function-bind/CHANGELOG.md +++ /dev/null @@ -1,136 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - -## [v1.1.2](https://github.com/ljharb/function-bind/compare/v1.1.1...v1.1.2) - 2023-10-12 - -### Merged - -- Point to the correct file [`#16`](https://github.com/ljharb/function-bind/pull/16) - -### Commits - -- [Tests] migrate tests to Github Actions [`4f8b57c`](https://github.com/ljharb/function-bind/commit/4f8b57c02f2011fe9ae353d5e74e8745f0988af8) -- [Tests] remove `jscs` [`90eb2ed`](https://github.com/ljharb/function-bind/commit/90eb2edbeefd5b76cd6c3a482ea3454db169b31f) -- [meta] update `.gitignore` [`53fcdc3`](https://github.com/ljharb/function-bind/commit/53fcdc371cd66634d6e9b71c836a50f437e89fed) -- [Tests] up to `node` `v11.10`, `v10.15`, `v9.11`, `v8.15`, `v6.16`, `v4.9`; use `nvm install-latest-npm`; run audit script in tests [`1fe8f6e`](https://github.com/ljharb/function-bind/commit/1fe8f6e9aed0dfa8d8b3cdbd00c7f5ea0cd2b36e) -- [meta] add `auto-changelog` [`1921fcb`](https://github.com/ljharb/function-bind/commit/1921fcb5b416b63ffc4acad051b6aad5722f777d) -- [Robustness] remove runtime dependency on all builtins except `.apply` [`f743e61`](https://github.com/ljharb/function-bind/commit/f743e61aa6bb2360358c04d4884c9db853d118b7) -- Docs: enable badges; update wording [`503cb12`](https://github.com/ljharb/function-bind/commit/503cb12d998b5f91822776c73332c7adcd6355dd) -- [readme] update badges [`290c5db`](https://github.com/ljharb/function-bind/commit/290c5dbbbda7264efaeb886552a374b869a4bb48) -- [Tests] switch to nyc for coverage [`ea360ba`](https://github.com/ljharb/function-bind/commit/ea360ba907fc2601ed18d01a3827fa2d3533cdf8) -- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape` [`cae5e9e`](https://github.com/ljharb/function-bind/commit/cae5e9e07a5578dc6df26c03ee22851ce05b943c) -- [meta] add `funding` field; create FUNDING.yml [`c9f4274`](https://github.com/ljharb/function-bind/commit/c9f4274aa80ea3aae9657a3938fdba41a3b04ca6) -- [Tests] fix eslint errors from #15 [`f69aaa2`](https://github.com/ljharb/function-bind/commit/f69aaa2beb2fdab4415bfb885760a699d0b9c964) -- [actions] fix permissions [`99a0cd9`](https://github.com/ljharb/function-bind/commit/99a0cd9f3b5bac223a0d572f081834cd73314be7) -- [meta] use `npmignore` to autogenerate an npmignore file [`f03b524`](https://github.com/ljharb/function-bind/commit/f03b524ca91f75a109a5d062f029122c86ecd1ae) -- [Dev Deps] update `@ljharb/eslint‑config`, `eslint`, `tape` [`7af9300`](https://github.com/ljharb/function-bind/commit/7af930023ae2ce7645489532821e4fbbcd7a2280) -- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `covert`, `tape` [`64a9127`](https://github.com/ljharb/function-bind/commit/64a9127ab0bd331b93d6572eaf6e9971967fc08c) -- [Tests] use `aud` instead of `npm audit` [`e75069c`](https://github.com/ljharb/function-bind/commit/e75069c50010a8fcce2a9ce2324934c35fdb4386) -- [Dev Deps] update `@ljharb/eslint-config`, `aud`, `tape` [`d03555c`](https://github.com/ljharb/function-bind/commit/d03555ca59dea3b71ce710045e4303b9e2619e28) -- [meta] add `safe-publish-latest` [`9c8f809`](https://github.com/ljharb/function-bind/commit/9c8f8092aed027d7e80c94f517aa892385b64f09) -- [Dev Deps] update `@ljharb/eslint-config`, `tape` [`baf6893`](https://github.com/ljharb/function-bind/commit/baf6893e27f5b59abe88bc1995e6f6ed1e527397) -- [meta] create SECURITY.md [`4db1779`](https://github.com/ljharb/function-bind/commit/4db17799f1f28ae294cb95e0081ca2b591c3911b) -- [Tests] add `npm run audit` [`c8b38ec`](https://github.com/ljharb/function-bind/commit/c8b38ec40ed3f85dabdee40ed4148f1748375bc2) -- Revert "Point to the correct file" [`05cdf0f`](https://github.com/ljharb/function-bind/commit/05cdf0fa205c6a3c5ba40bbedd1dfa9874f915c9) - -## [v1.1.1](https://github.com/ljharb/function-bind/compare/v1.1.0...v1.1.1) - 2017-08-28 - -### Commits - -- [Tests] up to `node` `v8`; newer npm breaks on older node; fix scripts [`817f7d2`](https://github.com/ljharb/function-bind/commit/817f7d28470fdbff8ef608d4d565dd4d1430bc5e) -- [Dev Deps] update `eslint`, `jscs`, `tape`, `@ljharb/eslint-config` [`854288b`](https://github.com/ljharb/function-bind/commit/854288b1b6f5c555f89aceb9eff1152510262084) -- [Dev Deps] update `tape`, `jscs`, `eslint`, `@ljharb/eslint-config` [`83e639f`](https://github.com/ljharb/function-bind/commit/83e639ff74e6cd6921285bccec22c1bcf72311bd) -- Only apps should have lockfiles [`5ed97f5`](https://github.com/ljharb/function-bind/commit/5ed97f51235c17774e0832e122abda0f3229c908) -- Use a SPDX-compliant “license” field. [`5feefea`](https://github.com/ljharb/function-bind/commit/5feefea0dc0193993e83e5df01ded424403a5381) - -## [v1.1.0](https://github.com/ljharb/function-bind/compare/v1.0.2...v1.1.0) - 2016-02-14 - -### Commits - -- Update `eslint`, `tape`; use my personal shared `eslint` config [`9c9062a`](https://github.com/ljharb/function-bind/commit/9c9062abbe9dd70b59ea2c3a3c3a81f29b457097) -- Add `npm run eslint` [`dd96c56`](https://github.com/ljharb/function-bind/commit/dd96c56720034a3c1ffee10b8a59a6f7c53e24ad) -- [New] return the native `bind` when available. [`82186e0`](https://github.com/ljharb/function-bind/commit/82186e03d73e580f95ff167e03f3582bed90ed72) -- [Dev Deps] update `tape`, `jscs`, `eslint`, `@ljharb/eslint-config` [`a3dd767`](https://github.com/ljharb/function-bind/commit/a3dd76720c795cb7f4586b0544efabf8aa107b8b) -- Update `eslint` [`3dae2f7`](https://github.com/ljharb/function-bind/commit/3dae2f7423de30a2d20313ddb1edc19660142fe9) -- Update `tape`, `covert`, `jscs` [`a181eee`](https://github.com/ljharb/function-bind/commit/a181eee0cfa24eb229c6e843a971f36e060a2f6a) -- [Tests] up to `node` `v5.6`, `v4.3` [`964929a`](https://github.com/ljharb/function-bind/commit/964929a6a4ddb36fb128de2bcc20af5e4f22e1ed) -- Test up to `io.js` `v2.1` [`2be7310`](https://github.com/ljharb/function-bind/commit/2be7310f2f74886a7124ca925be411117d41d5ea) -- Update `tape`, `jscs`, `eslint`, `@ljharb/eslint-config` [`45f3d68`](https://github.com/ljharb/function-bind/commit/45f3d6865c6ca93726abcef54febe009087af101) -- [Dev Deps] update `tape`, `jscs` [`6e1340d`](https://github.com/ljharb/function-bind/commit/6e1340d94642deaecad3e717825db641af4f8b1f) -- [Tests] up to `io.js` `v3.3`, `node` `v4.1` [`d9bad2b`](https://github.com/ljharb/function-bind/commit/d9bad2b778b1b3a6dd2876087b88b3acf319f8cc) -- Update `eslint` [`935590c`](https://github.com/ljharb/function-bind/commit/935590caa024ab356102e4858e8fc315b2ccc446) -- [Dev Deps] update `jscs`, `eslint`, `@ljharb/eslint-config` [`8c9a1ef`](https://github.com/ljharb/function-bind/commit/8c9a1efd848e5167887aa8501857a0940a480c57) -- Test on `io.js` `v2.2` [`9a3a38c`](https://github.com/ljharb/function-bind/commit/9a3a38c92013aed6e108666e7bd40969b84ac86e) -- Run `travis-ci` tests on `iojs` and `node` v0.12; speed up builds; allow 0.8 failures. [`69afc26`](https://github.com/ljharb/function-bind/commit/69afc2617405b147dd2a8d8ae73ca9e9283f18b4) -- [Dev Deps] Update `tape`, `eslint` [`36c1be0`](https://github.com/ljharb/function-bind/commit/36c1be0ab12b45fe5df6b0fdb01a5d5137fd0115) -- Update `tape`, `jscs` [`98d8303`](https://github.com/ljharb/function-bind/commit/98d8303cd5ca1c6b8f985469f86b0d44d7d45f6e) -- Update `jscs` [`9633a4e`](https://github.com/ljharb/function-bind/commit/9633a4e9fbf82051c240855166e468ba8ba0846f) -- Update `tape`, `jscs` [`c80ef0f`](https://github.com/ljharb/function-bind/commit/c80ef0f46efc9791e76fa50de4414092ac147831) -- Test up to `io.js` `v3.0` [`7e2c853`](https://github.com/ljharb/function-bind/commit/7e2c8537d52ab9cf5a655755561d8917684c0df4) -- Test on `io.js` `v2.4` [`5a199a2`](https://github.com/ljharb/function-bind/commit/5a199a27ba46795ba5eaf0845d07d4b8232895c9) -- Test on `io.js` `v2.3` [`a511b88`](https://github.com/ljharb/function-bind/commit/a511b8896de0bddf3b56862daa416c701f4d0453) -- Fixing a typo from 822b4e1938db02dc9584aa434fd3a45cb20caf43 [`732d6b6`](https://github.com/ljharb/function-bind/commit/732d6b63a9b33b45230e630dbcac7a10855d3266) -- Update `jscs` [`da52a48`](https://github.com/ljharb/function-bind/commit/da52a4886c06d6490f46ae30b15e4163ba08905d) -- Lock covert to v1.0.0. [`d6150fd`](https://github.com/ljharb/function-bind/commit/d6150fda1e6f486718ebdeff823333d9e48e7430) - -## [v1.0.2](https://github.com/ljharb/function-bind/compare/v1.0.1...v1.0.2) - 2014-10-04 - -## [v1.0.1](https://github.com/ljharb/function-bind/compare/v1.0.0...v1.0.1) - 2014-10-03 - -### Merged - -- make CI build faster [`#3`](https://github.com/ljharb/function-bind/pull/3) - -### Commits - -- Using my standard jscs.json [`d8ee94c`](https://github.com/ljharb/function-bind/commit/d8ee94c993eff0a84cf5744fe6a29627f5cffa1a) -- Adding `npm run lint` [`7571ab7`](https://github.com/ljharb/function-bind/commit/7571ab7dfdbd99b25a1dbb2d232622bd6f4f9c10) -- Using consistent indentation [`e91a1b1`](https://github.com/ljharb/function-bind/commit/e91a1b13a61e99ec1e530e299b55508f74218a95) -- Updating jscs [`7e17892`](https://github.com/ljharb/function-bind/commit/7e1789284bc629bc9c1547a61c9b227bbd8c7a65) -- Using consistent quotes [`c50b57f`](https://github.com/ljharb/function-bind/commit/c50b57fcd1c5ec38320979c837006069ebe02b77) -- Adding keywords [`cb94631`](https://github.com/ljharb/function-bind/commit/cb946314eed35f21186a25fb42fc118772f9ee00) -- Directly export a function expression instead of using a declaration, and relying on hoisting. [`5a33c5f`](https://github.com/ljharb/function-bind/commit/5a33c5f45642de180e0d207110bf7d1843ceb87c) -- Naming npm URL and badge in README; use SVG [`2aef8fc`](https://github.com/ljharb/function-bind/commit/2aef8fcb79d54e63a58ae557c4e60949e05d5e16) -- Naming deps URLs in README [`04228d7`](https://github.com/ljharb/function-bind/commit/04228d766670ee45ca24e98345c1f6a7621065b5) -- Naming travis-ci URLs in README; using SVG [`62c810c`](https://github.com/ljharb/function-bind/commit/62c810c2f54ced956cd4d4ab7b793055addfe36e) -- Make sure functions are invoked correctly (also passing coverage tests) [`2b289b4`](https://github.com/ljharb/function-bind/commit/2b289b4dfbf037ffcfa4dc95eb540f6165e9e43a) -- Removing the strict mode pragmas; they make tests fail. [`1aa701d`](https://github.com/ljharb/function-bind/commit/1aa701d199ddc3782476e8f7eef82679be97b845) -- Adding myself as a contributor [`85fd57b`](https://github.com/ljharb/function-bind/commit/85fd57b0860e5a7af42de9a287f3f265fc6d72fc) -- Adding strict mode pragmas [`915b08e`](https://github.com/ljharb/function-bind/commit/915b08e084c86a722eafe7245e21db74aa21ca4c) -- Adding devDeps URLs to README [`4ccc731`](https://github.com/ljharb/function-bind/commit/4ccc73112c1769859e4ca3076caf4086b3cba2cd) -- Fixing the description. [`a7a472c`](https://github.com/ljharb/function-bind/commit/a7a472cf649af515c635cf560fc478fbe48999c8) -- Using a function expression instead of a function declaration. [`b5d3e4e`](https://github.com/ljharb/function-bind/commit/b5d3e4ea6aaffc63888953eeb1fbc7ff45f1fa14) -- Updating tape [`f086be6`](https://github.com/ljharb/function-bind/commit/f086be6029fb56dde61a258c1340600fa174d1e0) -- Updating jscs [`5f9bdb3`](https://github.com/ljharb/function-bind/commit/5f9bdb375ab13ba48f30852aab94029520c54d71) -- Updating jscs [`9b409ba`](https://github.com/ljharb/function-bind/commit/9b409ba6118e23395a4e5d83ef39152aab9d3bfc) -- Run coverage as part of tests. [`8e1b6d4`](https://github.com/ljharb/function-bind/commit/8e1b6d459f047d1bd4fee814e01247c984c80bd0) -- Run linter as part of tests [`c1ca83f`](https://github.com/ljharb/function-bind/commit/c1ca83f832df94587d09e621beba682fabfaa987) -- Updating covert [`701e837`](https://github.com/ljharb/function-bind/commit/701e83774b57b4d3ef631e1948143f43a72f4bb9) - -## [v1.0.0](https://github.com/ljharb/function-bind/compare/v0.2.0...v1.0.0) - 2014-08-09 - -### Commits - -- Make sure old and unstable nodes don't fail Travis [`27adca3`](https://github.com/ljharb/function-bind/commit/27adca34a4ab6ad67b6dfde43942a1b103ce4d75) -- Fixing an issue when the bound function is called as a constructor in ES3. [`e20122d`](https://github.com/ljharb/function-bind/commit/e20122d267d92ce553859b280cbbea5d27c07731) -- Adding `npm run coverage` [`a2e29c4`](https://github.com/ljharb/function-bind/commit/a2e29c4ecaef9e2f6cd1603e868c139073375502) -- Updating tape [`b741168`](https://github.com/ljharb/function-bind/commit/b741168b12b235b1717ff696087645526b69213c) -- Upgrading tape [`63631a0`](https://github.com/ljharb/function-bind/commit/63631a04c7fbe97cc2fa61829cc27246d6986f74) -- Updating tape [`363cb46`](https://github.com/ljharb/function-bind/commit/363cb46dafb23cb3e347729a22f9448051d78464) - -## v0.2.0 - 2014-03-23 - -### Commits - -- Updating test coverage to match es5-shim. [`aa94d44`](https://github.com/ljharb/function-bind/commit/aa94d44b8f9d7f69f10e060db7709aa7a694e5d4) -- initial [`942ee07`](https://github.com/ljharb/function-bind/commit/942ee07e94e542d91798137bc4b80b926137e066) -- Setting the bound function's length properly. [`079f46a`](https://github.com/ljharb/function-bind/commit/079f46a2d3515b7c0b308c2c13fceb641f97ca25) -- Ensuring that some older browsers will throw when given a regex. [`36ac55b`](https://github.com/ljharb/function-bind/commit/36ac55b87f460d4330253c92870aa26fbfe8227f) -- Removing npm scripts that don't have dependencies [`9d2be60`](https://github.com/ljharb/function-bind/commit/9d2be600002cb8bc8606f8f3585ad3e05868c750) -- Updating tape [`297a4ac`](https://github.com/ljharb/function-bind/commit/297a4acc5464db381940aafb194d1c88f4e678f3) -- Skipping length tests for now. [`d9891ea`](https://github.com/ljharb/function-bind/commit/d9891ea4d2aaffa69f408339cdd61ff740f70565) -- don't take my tea [`dccd930`](https://github.com/ljharb/function-bind/commit/dccd930bfd60ea10cb178d28c97550c3bc8c1e07) diff --git a/node_modules/function-bind/LICENSE b/node_modules/function-bind/LICENSE deleted file mode 100644 index 62d6d23..0000000 --- a/node_modules/function-bind/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2013 Raynos. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - diff --git a/node_modules/function-bind/README.md b/node_modules/function-bind/README.md deleted file mode 100644 index 814c20b..0000000 --- a/node_modules/function-bind/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# function-bind [![Version Badge][npm-version-svg]][package-url] - -[![github actions][actions-image]][actions-url] - -[![dependency status][deps-svg]][deps-url] -[![dev dependency status][dev-deps-svg]][dev-deps-url] -[![License][license-image]][license-url] -[![Downloads][downloads-image]][downloads-url] - -[![npm badge][npm-badge-png]][package-url] - -Implementation of function.prototype.bind - -Old versions of phantomjs, Internet Explorer < 9, and node < 0.6 don't support `Function.prototype.bind`. - -## Example - -```js -Function.prototype.bind = require("function-bind") -``` - -## Installation - -`npm install function-bind` - -## Contributors - - - Raynos - -## MIT Licenced - -[package-url]: https://npmjs.org/package/function-bind -[npm-version-svg]: https://versionbadg.es/Raynos/function-bind.svg -[deps-svg]: https://david-dm.org/Raynos/function-bind.svg -[deps-url]: https://david-dm.org/Raynos/function-bind -[dev-deps-svg]: https://david-dm.org/Raynos/function-bind/dev-status.svg -[dev-deps-url]: https://david-dm.org/Raynos/function-bind#info=devDependencies -[npm-badge-png]: https://nodei.co/npm/function-bind.png?downloads=true&stars=true -[license-image]: https://img.shields.io/npm/l/function-bind.svg -[license-url]: LICENSE -[downloads-image]: https://img.shields.io/npm/dm/function-bind.svg -[downloads-url]: https://npm-stat.com/charts.html?package=function-bind -[codecov-image]: https://codecov.io/gh/Raynos/function-bind/branch/main/graphs/badge.svg -[codecov-url]: https://app.codecov.io/gh/Raynos/function-bind/ -[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/Raynos/function-bind -[actions-url]: https://github.com/Raynos/function-bind/actions diff --git a/node_modules/function-bind/implementation.js b/node_modules/function-bind/implementation.js deleted file mode 100644 index fd4384c..0000000 --- a/node_modules/function-bind/implementation.js +++ /dev/null @@ -1,84 +0,0 @@ -'use strict'; - -/* eslint no-invalid-this: 1 */ - -var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible '; -var toStr = Object.prototype.toString; -var max = Math.max; -var funcType = '[object Function]'; - -var concatty = function concatty(a, b) { - var arr = []; - - for (var i = 0; i < a.length; i += 1) { - arr[i] = a[i]; - } - for (var j = 0; j < b.length; j += 1) { - arr[j + a.length] = b[j]; - } - - return arr; -}; - -var slicy = function slicy(arrLike, offset) { - var arr = []; - for (var i = offset || 0, j = 0; i < arrLike.length; i += 1, j += 1) { - arr[j] = arrLike[i]; - } - return arr; -}; - -var joiny = function (arr, joiner) { - var str = ''; - for (var i = 0; i < arr.length; i += 1) { - str += arr[i]; - if (i + 1 < arr.length) { - str += joiner; - } - } - return str; -}; - -module.exports = function bind(that) { - var target = this; - if (typeof target !== 'function' || toStr.apply(target) !== funcType) { - throw new TypeError(ERROR_MESSAGE + target); - } - var args = slicy(arguments, 1); - - var bound; - var binder = function () { - if (this instanceof bound) { - var result = target.apply( - this, - concatty(args, arguments) - ); - if (Object(result) === result) { - return result; - } - return this; - } - return target.apply( - that, - concatty(args, arguments) - ); - - }; - - var boundLength = max(0, target.length - args.length); - var boundArgs = []; - for (var i = 0; i < boundLength; i++) { - boundArgs[i] = '$' + i; - } - - bound = Function('binder', 'return function (' + joiny(boundArgs, ',') + '){ return binder.apply(this,arguments); }')(binder); - - if (target.prototype) { - var Empty = function Empty() {}; - Empty.prototype = target.prototype; - bound.prototype = new Empty(); - Empty.prototype = null; - } - - return bound; -}; diff --git a/node_modules/function-bind/index.js b/node_modules/function-bind/index.js deleted file mode 100644 index 3bb6b96..0000000 --- a/node_modules/function-bind/index.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict'; - -var implementation = require('./implementation'); - -module.exports = Function.prototype.bind || implementation; diff --git a/node_modules/function-bind/package.json b/node_modules/function-bind/package.json deleted file mode 100644 index 6185963..0000000 --- a/node_modules/function-bind/package.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "name": "function-bind", - "version": "1.1.2", - "description": "Implementation of Function.prototype.bind", - "keywords": [ - "function", - "bind", - "shim", - "es5" - ], - "author": "Raynos ", - "repository": { - "type": "git", - "url": "https://github.com/Raynos/function-bind.git" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - }, - "main": "index", - "homepage": "https://github.com/Raynos/function-bind", - "contributors": [ - { - "name": "Raynos" - }, - { - "name": "Jordan Harband", - "url": "https://github.com/ljharb" - } - ], - "bugs": { - "url": "https://github.com/Raynos/function-bind/issues", - "email": "raynos2@gmail.com" - }, - "devDependencies": { - "@ljharb/eslint-config": "^21.1.0", - "aud": "^2.0.3", - "auto-changelog": "^2.4.0", - "eslint": "=8.8.0", - "in-publish": "^2.0.1", - "npmignore": "^0.3.0", - "nyc": "^10.3.2", - "safe-publish-latest": "^2.0.0", - "tape": "^5.7.1" - }, - "license": "MIT", - "scripts": { - "prepublishOnly": "safe-publish-latest", - "prepublish": "not-in-publish || npm run prepublishOnly", - "prepack": "npmignore --auto --commentLines=autogenerated", - "pretest": "npm run lint", - "test": "npm run tests-only", - "posttest": "aud --production", - "tests-only": "nyc tape 'test/**/*.js'", - "lint": "eslint --ext=js,mjs .", - "version": "auto-changelog && git add CHANGELOG.md", - "postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\"" - }, - "testling": { - "files": "test/index.js", - "browsers": [ - "ie/8..latest", - "firefox/16..latest", - "firefox/nightly", - "chrome/22..latest", - "chrome/canary", - "opera/12..latest", - "opera/next", - "safari/5.1..latest", - "ipad/6.0..latest", - "iphone/6.0..latest", - "android-browser/4.2..latest" - ] - }, - "auto-changelog": { - "output": "CHANGELOG.md", - "template": "keepachangelog", - "unreleased": false, - "commitLimit": false, - "backfillLimit": false, - "hideCredit": true - }, - "publishConfig": { - "ignore": [ - ".github/workflows" - ] - } -} diff --git a/node_modules/function-bind/test/.eslintrc b/node_modules/function-bind/test/.eslintrc deleted file mode 100644 index 8a56d5b..0000000 --- a/node_modules/function-bind/test/.eslintrc +++ /dev/null @@ -1,9 +0,0 @@ -{ - "rules": { - "array-bracket-newline": 0, - "array-element-newline": 0, - "max-statements-per-line": [2, { "max": 2 }], - "no-invalid-this": 0, - "no-magic-numbers": 0, - } -} diff --git a/node_modules/function-bind/test/index.js b/node_modules/function-bind/test/index.js deleted file mode 100644 index 2edecce..0000000 --- a/node_modules/function-bind/test/index.js +++ /dev/null @@ -1,252 +0,0 @@ -// jscs:disable requireUseStrict - -var test = require('tape'); - -var functionBind = require('../implementation'); -var getCurrentContext = function () { return this; }; - -test('functionBind is a function', function (t) { - t.equal(typeof functionBind, 'function'); - t.end(); -}); - -test('non-functions', function (t) { - var nonFunctions = [true, false, [], {}, 42, 'foo', NaN, /a/g]; - t.plan(nonFunctions.length); - for (var i = 0; i < nonFunctions.length; ++i) { - try { functionBind.call(nonFunctions[i]); } catch (ex) { - t.ok(ex instanceof TypeError, 'throws when given ' + String(nonFunctions[i])); - } - } - t.end(); -}); - -test('without a context', function (t) { - t.test('binds properly', function (st) { - var args, context; - var namespace = { - func: functionBind.call(function () { - args = Array.prototype.slice.call(arguments); - context = this; - }) - }; - namespace.func(1, 2, 3); - st.deepEqual(args, [1, 2, 3]); - st.equal(context, getCurrentContext.call()); - st.end(); - }); - - t.test('binds properly, and still supplies bound arguments', function (st) { - var args, context; - var namespace = { - func: functionBind.call(function () { - args = Array.prototype.slice.call(arguments); - context = this; - }, undefined, 1, 2, 3) - }; - namespace.func(4, 5, 6); - st.deepEqual(args, [1, 2, 3, 4, 5, 6]); - st.equal(context, getCurrentContext.call()); - st.end(); - }); - - t.test('returns properly', function (st) { - var args; - var namespace = { - func: functionBind.call(function () { - args = Array.prototype.slice.call(arguments); - return this; - }, null) - }; - var context = namespace.func(1, 2, 3); - st.equal(context, getCurrentContext.call(), 'returned context is namespaced context'); - st.deepEqual(args, [1, 2, 3], 'passed arguments are correct'); - st.end(); - }); - - t.test('returns properly with bound arguments', function (st) { - var args; - var namespace = { - func: functionBind.call(function () { - args = Array.prototype.slice.call(arguments); - return this; - }, null, 1, 2, 3) - }; - var context = namespace.func(4, 5, 6); - st.equal(context, getCurrentContext.call(), 'returned context is namespaced context'); - st.deepEqual(args, [1, 2, 3, 4, 5, 6], 'passed arguments are correct'); - st.end(); - }); - - t.test('called as a constructor', function (st) { - var thunkify = function (value) { - return function () { return value; }; - }; - st.test('returns object value', function (sst) { - var expectedReturnValue = [1, 2, 3]; - var Constructor = functionBind.call(thunkify(expectedReturnValue), null); - var result = new Constructor(); - sst.equal(result, expectedReturnValue); - sst.end(); - }); - - st.test('does not return primitive value', function (sst) { - var Constructor = functionBind.call(thunkify(42), null); - var result = new Constructor(); - sst.notEqual(result, 42); - sst.end(); - }); - - st.test('object from bound constructor is instance of original and bound constructor', function (sst) { - var A = function (x) { - this.name = x || 'A'; - }; - var B = functionBind.call(A, null, 'B'); - - var result = new B(); - sst.ok(result instanceof B, 'result is instance of bound constructor'); - sst.ok(result instanceof A, 'result is instance of original constructor'); - sst.end(); - }); - - st.end(); - }); - - t.end(); -}); - -test('with a context', function (t) { - t.test('with no bound arguments', function (st) { - var args, context; - var boundContext = {}; - var namespace = { - func: functionBind.call(function () { - args = Array.prototype.slice.call(arguments); - context = this; - }, boundContext) - }; - namespace.func(1, 2, 3); - st.equal(context, boundContext, 'binds a context properly'); - st.deepEqual(args, [1, 2, 3], 'supplies passed arguments'); - st.end(); - }); - - t.test('with bound arguments', function (st) { - var args, context; - var boundContext = {}; - var namespace = { - func: functionBind.call(function () { - args = Array.prototype.slice.call(arguments); - context = this; - }, boundContext, 1, 2, 3) - }; - namespace.func(4, 5, 6); - st.equal(context, boundContext, 'binds a context properly'); - st.deepEqual(args, [1, 2, 3, 4, 5, 6], 'supplies bound and passed arguments'); - st.end(); - }); - - t.test('returns properly', function (st) { - var boundContext = {}; - var args; - var namespace = { - func: functionBind.call(function () { - args = Array.prototype.slice.call(arguments); - return this; - }, boundContext) - }; - var context = namespace.func(1, 2, 3); - st.equal(context, boundContext, 'returned context is bound context'); - st.notEqual(context, getCurrentContext.call(), 'returned context is not lexical context'); - st.deepEqual(args, [1, 2, 3], 'passed arguments are correct'); - st.end(); - }); - - t.test('returns properly with bound arguments', function (st) { - var boundContext = {}; - var args; - var namespace = { - func: functionBind.call(function () { - args = Array.prototype.slice.call(arguments); - return this; - }, boundContext, 1, 2, 3) - }; - var context = namespace.func(4, 5, 6); - st.equal(context, boundContext, 'returned context is bound context'); - st.notEqual(context, getCurrentContext.call(), 'returned context is not lexical context'); - st.deepEqual(args, [1, 2, 3, 4, 5, 6], 'passed arguments are correct'); - st.end(); - }); - - t.test('passes the correct arguments when called as a constructor', function (st) { - var expected = { name: 'Correct' }; - var namespace = { - Func: functionBind.call(function (arg) { - return arg; - }, { name: 'Incorrect' }) - }; - var returned = new namespace.Func(expected); - st.equal(returned, expected, 'returns the right arg when called as a constructor'); - st.end(); - }); - - t.test('has the new instance\'s context when called as a constructor', function (st) { - var actualContext; - var expectedContext = { foo: 'bar' }; - var namespace = { - Func: functionBind.call(function () { - actualContext = this; - }, expectedContext) - }; - var result = new namespace.Func(); - st.equal(result instanceof namespace.Func, true); - st.notEqual(actualContext, expectedContext); - st.end(); - }); - - t.end(); -}); - -test('bound function length', function (t) { - t.test('sets a correct length without thisArg', function (st) { - var subject = functionBind.call(function (a, b, c) { return a + b + c; }); - st.equal(subject.length, 3); - st.equal(subject(1, 2, 3), 6); - st.end(); - }); - - t.test('sets a correct length with thisArg', function (st) { - var subject = functionBind.call(function (a, b, c) { return a + b + c; }, {}); - st.equal(subject.length, 3); - st.equal(subject(1, 2, 3), 6); - st.end(); - }); - - t.test('sets a correct length without thisArg and first argument', function (st) { - var subject = functionBind.call(function (a, b, c) { return a + b + c; }, undefined, 1); - st.equal(subject.length, 2); - st.equal(subject(2, 3), 6); - st.end(); - }); - - t.test('sets a correct length with thisArg and first argument', function (st) { - var subject = functionBind.call(function (a, b, c) { return a + b + c; }, {}, 1); - st.equal(subject.length, 2); - st.equal(subject(2, 3), 6); - st.end(); - }); - - t.test('sets a correct length without thisArg and too many arguments', function (st) { - var subject = functionBind.call(function (a, b, c) { return a + b + c; }, undefined, 1, 2, 3, 4); - st.equal(subject.length, 0); - st.equal(subject(), 6); - st.end(); - }); - - t.test('sets a correct length with thisArg and too many arguments', function (st) { - var subject = functionBind.call(function (a, b, c) { return a + b + c; }, {}, 1, 2, 3, 4); - st.equal(subject.length, 0); - st.equal(subject(), 6); - st.end(); - }); -}); diff --git a/node_modules/get-caller-file/LICENSE.md b/node_modules/get-caller-file/LICENSE.md deleted file mode 100644 index bf3e1c0..0000000 --- a/node_modules/get-caller-file/LICENSE.md +++ /dev/null @@ -1,6 +0,0 @@ -ISC License (ISC) -Copyright 2018 Stefan Penner - -Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/get-caller-file/README.md b/node_modules/get-caller-file/README.md deleted file mode 100644 index a7d8c07..0000000 --- a/node_modules/get-caller-file/README.md +++ /dev/null @@ -1,41 +0,0 @@ -# get-caller-file - -[![Build Status](https://travis-ci.org/stefanpenner/get-caller-file.svg?branch=master)](https://travis-ci.org/stefanpenner/get-caller-file) -[![Build status](https://ci.appveyor.com/api/projects/status/ol2q94g1932cy14a/branch/master?svg=true)](https://ci.appveyor.com/project/embercli/get-caller-file/branch/master) - -This is a utility, which allows a function to figure out from which file it was invoked. It does so by inspecting v8's stack trace at the time it is invoked. - -Inspired by http://stackoverflow.com/questions/13227489 - -*note: this relies on Node/V8 specific APIs, as such other runtimes may not work* - -## Installation - -```bash -yarn add get-caller-file -``` - -## Usage - -Given: - -```js -// ./foo.js -const getCallerFile = require('get-caller-file'); - -module.exports = function() { - return getCallerFile(); // figures out who called it -}; -``` - -```js -// index.js -const foo = require('./foo'); - -foo() // => /full/path/to/this/file/index.js -``` - - -## Options: - -* `getCallerFile(position = 2)`: where position is stack frame whos fileName we want. diff --git a/node_modules/get-caller-file/index.d.ts b/node_modules/get-caller-file/index.d.ts deleted file mode 100644 index babed69..0000000 --- a/node_modules/get-caller-file/index.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -declare const _default: (position?: number) => any; -export = _default; diff --git a/node_modules/get-caller-file/index.js b/node_modules/get-caller-file/index.js deleted file mode 100644 index 57304f8..0000000 --- a/node_modules/get-caller-file/index.js +++ /dev/null @@ -1,22 +0,0 @@ -"use strict"; -// Call this function in a another function to find out the file from -// which that function was called from. (Inspects the v8 stack trace) -// -// Inspired by http://stackoverflow.com/questions/13227489 -module.exports = function getCallerFile(position) { - if (position === void 0) { position = 2; } - if (position >= Error.stackTraceLimit) { - throw new TypeError('getCallerFile(position) requires position be less then Error.stackTraceLimit but position was: `' + position + '` and Error.stackTraceLimit was: `' + Error.stackTraceLimit + '`'); - } - var oldPrepareStackTrace = Error.prepareStackTrace; - Error.prepareStackTrace = function (_, stack) { return stack; }; - var stack = new Error().stack; - Error.prepareStackTrace = oldPrepareStackTrace; - if (stack !== null && typeof stack === 'object') { - // stack[0] holds this file - // stack[1] holds where this function was called - // stack[2] holds the file we're interested in - return stack[position] ? stack[position].getFileName() : undefined; - } -}; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/get-caller-file/index.js.map b/node_modules/get-caller-file/index.js.map deleted file mode 100644 index 89c655c..0000000 --- a/node_modules/get-caller-file/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";AAAA,qEAAqE;AACrE,qEAAqE;AACrE,EAAE;AACF,0DAA0D;AAE1D,iBAAS,SAAS,aAAa,CAAC,QAAY;IAAZ,yBAAA,EAAA,YAAY;IAC1C,IAAI,QAAQ,IAAI,KAAK,CAAC,eAAe,EAAE;QACrC,MAAM,IAAI,SAAS,CAAC,kGAAkG,GAAG,QAAQ,GAAG,oCAAoC,GAAG,KAAK,CAAC,eAAe,GAAG,GAAG,CAAC,CAAC;KACzM;IAED,IAAM,oBAAoB,GAAG,KAAK,CAAC,iBAAiB,CAAC;IACrD,KAAK,CAAC,iBAAiB,GAAG,UAAC,CAAC,EAAE,KAAK,IAAM,OAAA,KAAK,EAAL,CAAK,CAAC;IAC/C,IAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC,KAAK,CAAC;IAChC,KAAK,CAAC,iBAAiB,GAAG,oBAAoB,CAAC;IAG/C,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAC/C,2BAA2B;QAC3B,gDAAgD;QAChD,8CAA8C;QAC9C,OAAO,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAE,KAAK,CAAC,QAAQ,CAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;KAC7E;AACH,CAAC,CAAC"} \ No newline at end of file diff --git a/node_modules/get-caller-file/package.json b/node_modules/get-caller-file/package.json deleted file mode 100644 index b0dd571..0000000 --- a/node_modules/get-caller-file/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "get-caller-file", - "version": "2.0.5", - "description": "", - "main": "index.js", - "directories": { - "test": "tests" - }, - "files": [ - "index.js", - "index.js.map", - "index.d.ts" - ], - "scripts": { - "prepare": "tsc", - "test": "mocha test", - "test:debug": "mocha test" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/stefanpenner/get-caller-file.git" - }, - "author": "Stefan Penner", - "license": "ISC", - "bugs": { - "url": "https://github.com/stefanpenner/get-caller-file/issues" - }, - "homepage": "https://github.com/stefanpenner/get-caller-file#readme", - "devDependencies": { - "@types/chai": "^4.1.7", - "@types/ensure-posix-path": "^1.0.0", - "@types/mocha": "^5.2.6", - "@types/node": "^11.10.5", - "chai": "^4.1.2", - "ensure-posix-path": "^1.0.1", - "mocha": "^5.2.0", - "typescript": "^3.3.3333" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } -} diff --git a/node_modules/glob-parent/LICENSE b/node_modules/glob-parent/LICENSE deleted file mode 100644 index d701b08..0000000 --- a/node_modules/glob-parent/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) 2015, 2019 Elan Shanker, 2021 Blaine Bublitz , Eric Schoffstall and other contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/glob-parent/README.md b/node_modules/glob-parent/README.md deleted file mode 100644 index 6ae18a1..0000000 --- a/node_modules/glob-parent/README.md +++ /dev/null @@ -1,134 +0,0 @@ -

    - - - -

    - -# glob-parent - -[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][ci-image]][ci-url] [![Coveralls Status][coveralls-image]][coveralls-url] - -Extract the non-magic parent path from a glob string. - -## Usage - -```js -var globParent = require('glob-parent'); - -globParent('path/to/*.js'); // 'path/to' -globParent('/root/path/to/*.js'); // '/root/path/to' -globParent('/*.js'); // '/' -globParent('*.js'); // '.' -globParent('**/*.js'); // '.' -globParent('path/{to,from}'); // 'path' -globParent('path/!(to|from)'); // 'path' -globParent('path/?(to|from)'); // 'path' -globParent('path/+(to|from)'); // 'path' -globParent('path/*(to|from)'); // 'path' -globParent('path/@(to|from)'); // 'path' -globParent('path/**/*'); // 'path' - -// if provided a non-glob path, returns the nearest dir -globParent('path/foo/bar.js'); // 'path/foo' -globParent('path/foo/'); // 'path/foo' -globParent('path/foo'); // 'path' (see issue #3 for details) -``` - -## API - -### `globParent(maybeGlobString, [options])` - -Takes a string and returns the part of the path before the glob begins. Be aware of Escaping rules and Limitations below. - -#### options - -```js -{ - // Disables the automatic conversion of slashes for Windows - flipBackslashes: true; -} -``` - -## Escaping - -The following characters have special significance in glob patterns and must be escaped if you want them to be treated as regular path characters: - -- `?` (question mark) unless used as a path segment alone -- `*` (asterisk) -- `|` (pipe) -- `(` (opening parenthesis) -- `)` (closing parenthesis) -- `{` (opening curly brace) -- `}` (closing curly brace) -- `[` (opening bracket) -- `]` (closing bracket) - -**Example** - -```js -globParent('foo/[bar]/'); // 'foo' -globParent('foo/\\[bar]/'); // 'foo/[bar]' -``` - -## Limitations - -### Braces & Brackets - -This library attempts a quick and imperfect method of determining which path -parts have glob magic without fully parsing/lexing the pattern. There are some -advanced use cases that can trip it up, such as nested braces where the outer -pair is escaped and the inner one contains a path separator. If you find -yourself in the unlikely circumstance of being affected by this or need to -ensure higher-fidelity glob handling in your library, it is recommended that you -pre-process your input with [expand-braces] and/or [expand-brackets]. - -### Windows - -Backslashes are not valid path separators for globs. If a path with backslashes -is provided anyway, for simple cases, glob-parent will replace the path -separator for you and return the non-glob parent path (now with -forward-slashes, which are still valid as Windows path separators). - -This cannot be used in conjunction with escape characters. - -```js -// BAD -globParent('C:\\Program Files \\(x86\\)\\*.ext'); // 'C:/Program Files /(x86/)' - -// GOOD -globParent('C:/Program Files\\(x86\\)/*.ext'); // 'C:/Program Files (x86)' -``` - -If you are using escape characters for a pattern without path parts (i.e. -relative to `cwd`), prefix with `./` to avoid confusing glob-parent. - -```js -// BAD -globParent('foo \\[bar]'); // 'foo ' -globParent('foo \\[bar]*'); // 'foo ' - -// GOOD -globParent('./foo \\[bar]'); // 'foo [bar]' -globParent('./foo \\[bar]*'); // '.' -``` - -## License - -ISC - - -[downloads-image]: https://img.shields.io/npm/dm/glob-parent.svg?style=flat-square -[npm-url]: https://www.npmjs.com/package/glob-parent -[npm-image]: https://img.shields.io/npm/v/glob-parent.svg?style=flat-square - -[ci-url]: https://github.com/gulpjs/glob-parent/actions?query=workflow:dev -[ci-image]: https://img.shields.io/github/workflow/status/gulpjs/glob-parent/dev?style=flat-square - -[coveralls-url]: https://coveralls.io/r/gulpjs/glob-parent -[coveralls-image]: https://img.shields.io/coveralls/gulpjs/glob-parent/master.svg?style=flat-square - - - -[expand-braces]: https://github.com/jonschlinkert/expand-braces -[expand-brackets]: https://github.com/jonschlinkert/expand-brackets - diff --git a/node_modules/glob-parent/index.js b/node_modules/glob-parent/index.js deleted file mode 100644 index 09dde64..0000000 --- a/node_modules/glob-parent/index.js +++ /dev/null @@ -1,75 +0,0 @@ -'use strict'; - -var isGlob = require('is-glob'); -var pathPosixDirname = require('path').posix.dirname; -var isWin32 = require('os').platform() === 'win32'; - -var slash = '/'; -var backslash = /\\/g; -var escaped = /\\([!*?|[\](){}])/g; - -/** - * @param {string} str - * @param {Object} opts - * @param {boolean} [opts.flipBackslashes=true] - */ -module.exports = function globParent(str, opts) { - var options = Object.assign({ flipBackslashes: true }, opts); - - // flip windows path separators - if (options.flipBackslashes && isWin32 && str.indexOf(slash) < 0) { - str = str.replace(backslash, slash); - } - - // special case for strings ending in enclosure containing path separator - if (isEnclosure(str)) { - str += slash; - } - - // preserves full path in case of trailing path separator - str += 'a'; - - // remove path parts that are globby - do { - str = pathPosixDirname(str); - } while (isGlobby(str)); - - // remove escape chars and return result - return str.replace(escaped, '$1'); -}; - -function isEnclosure(str) { - var lastChar = str.slice(-1); - - var enclosureStart; - switch (lastChar) { - case '}': - enclosureStart = '{'; - break; - case ']': - enclosureStart = '['; - break; - default: - return false; - } - - var foundIndex = str.indexOf(enclosureStart); - if (foundIndex < 0) { - return false; - } - - return str.slice(foundIndex + 1, -1).includes(slash); -} - -function isGlobby(str) { - if (/\([^()]+$/.test(str)) { - return true; - } - if (str[0] === '{' || str[0] === '[') { - return true; - } - if (/[^\\][{[]/.test(str)) { - return true; - } - return isGlob(str); -} diff --git a/node_modules/glob-parent/package.json b/node_modules/glob-parent/package.json deleted file mode 100644 index baeab42..0000000 --- a/node_modules/glob-parent/package.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "name": "glob-parent", - "version": "6.0.2", - "description": "Extract the non-magic parent path from a glob string.", - "author": "Gulp Team (https://gulpjs.com/)", - "contributors": [ - "Elan Shanker (https://github.com/es128)", - "Blaine Bublitz " - ], - "repository": "gulpjs/glob-parent", - "license": "ISC", - "engines": { - "node": ">=10.13.0" - }, - "main": "index.js", - "files": [ - "LICENSE", - "index.js" - ], - "scripts": { - "lint": "eslint .", - "pretest": "npm run lint", - "test": "nyc mocha --async-only" - }, - "dependencies": { - "is-glob": "^4.0.3" - }, - "devDependencies": { - "eslint": "^7.0.0", - "eslint-config-gulp": "^5.0.0", - "expect": "^26.0.1", - "mocha": "^7.1.2", - "nyc": "^15.0.1" - }, - "nyc": { - "reporter": [ - "lcov", - "text-summary" - ] - }, - "prettier": { - "singleQuote": true - }, - "keywords": [ - "glob", - "parent", - "strip", - "path", - "dirname", - "directory", - "base", - "wildcard" - ] -} diff --git a/node_modules/glob/LICENSE b/node_modules/glob/LICENSE deleted file mode 100644 index ec7df93..0000000 --- a/node_modules/glob/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) 2009-2023 Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/glob/README.md b/node_modules/glob/README.md deleted file mode 100644 index 023cd77..0000000 --- a/node_modules/glob/README.md +++ /dev/null @@ -1,1265 +0,0 @@ -# Glob - -Match files using the patterns the shell uses. - -The most correct and second fastest glob implementation in -JavaScript. (See **Comparison to Other JavaScript Glob -Implementations** at the bottom of this readme.) - -![a fun cartoon logo made of glob characters](https://github.com/isaacs/node-glob/raw/main/logo/glob.png) - -## Usage - -Install with npm - -``` -npm i glob -``` - -**Note** the npm package name is _not_ `node-glob` that's a -different thing that was abandoned years ago. Just `glob`. - -```js -// load using import -import { glob, globSync, globStream, globStreamSync, Glob } from 'glob' -// or using commonjs, that's fine, too -const { - glob, - globSync, - globStream, - globStreamSync, - Glob, -} = require('glob') - -// the main glob() and globSync() resolve/return array of filenames - -// all js files, but don't look in node_modules -const jsfiles = await glob('**/*.js', { ignore: 'node_modules/**' }) - -// pass in a signal to cancel the glob walk -const stopAfter100ms = await glob('**/*.css', { - signal: AbortSignal.timeout(100), -}) - -// multiple patterns supported as well -const images = await glob(['css/*.{png,jpeg}', 'public/*.{png,jpeg}']) - -// but of course you can do that with the glob pattern also -// the sync function is the same, just returns a string[] instead -// of Promise -const imagesAlt = globSync('{css,public}/*.{png,jpeg}') - -// you can also stream them, this is a Minipass stream -const filesStream = globStream(['**/*.dat', 'logs/**/*.log']) - -// construct a Glob object if you wanna do it that way, which -// allows for much faster walks if you have to look in the same -// folder multiple times. -const g = new Glob('**/foo', {}) -// glob objects are async iterators, can also do globIterate() or -// g.iterate(), same deal -for await (const file of g) { - console.log('found a foo file:', file) -} -// pass a glob as the glob options to reuse its settings and caches -const g2 = new Glob('**/bar', g) -// sync iteration works as well -for (const file of g2) { - console.log('found a bar file:', file) -} - -// you can also pass withFileTypes: true to get Path objects -// these are like a Dirent, but with some more added powers -// check out http://npm.im/path-scurry for more info on their API -const g3 = new Glob('**/baz/**', { withFileTypes: true }) -g3.stream().on('data', path => { - console.log( - 'got a path object', - path.fullpath(), - path.isDirectory(), - path.readdirSync().map(e => e.name), - ) -}) - -// if you use stat:true and withFileTypes, you can sort results -// by things like modified time, filter by permission mode, etc. -// All Stats fields will be available in that case. Slightly -// slower, though. -// For example: -const results = await glob('**', { stat: true, withFileTypes: true }) - -const timeSortedFiles = results - .sort((a, b) => a.mtimeMs - b.mtimeMs) - .map(path => path.fullpath()) - -const groupReadableFiles = results - .filter(path => path.mode & 0o040) - .map(path => path.fullpath()) - -// custom ignores can be done like this, for example by saying -// you'll ignore all markdown files, and all folders named 'docs' -const customIgnoreResults = await glob('**', { - ignore: { - ignored: p => /\.md$/.test(p.name), - childrenIgnored: p => p.isNamed('docs'), - }, -}) - -// another fun use case, only return files with the same name as -// their parent folder, plus either `.ts` or `.js` -const folderNamedModules = await glob('**/*.{ts,js}', { - ignore: { - ignored: p => { - const pp = p.parent - return !(p.isNamed(pp.name + '.ts') || p.isNamed(pp.name + '.js')) - }, - }, -}) - -// find all files edited in the last hour, to do this, we ignore -// all of them that are more than an hour old -const newFiles = await glob('**', { - // need stat so we have mtime - stat: true, - // only want the files, not the dirs - nodir: true, - ignore: { - ignored: p => { - return new Date() - p.mtime > 60 * 60 * 1000 - }, - // could add similar childrenIgnored here as well, but - // directory mtime is inconsistent across platforms, so - // probably better not to, unless you know the system - // tracks this reliably. - }, -}) -``` - -**Note** Glob patterns should always use `/` as a path separator, -even on Windows systems, as `\` is used to escape glob -characters. If you wish to use `\` as a path separator _instead -of_ using it as an escape character on Windows platforms, you may -set `windowsPathsNoEscape:true` in the options. In this mode, -special glob characters cannot be escaped, making it impossible -to match a literal `*` `?` and so on in filenames. - -## Command Line Interface - -``` -$ glob -h - -Usage: - glob [options] [ [ ...]] - -Expand the positional glob expression arguments into any matching file system -paths found. - - -c --cmd= - Run the command provided, passing the glob expression - matches as arguments. - - -A --all By default, the glob cli command will not expand any - arguments that are an exact match to a file on disk. - - This prevents double-expanding, in case the shell - expands an argument whose filename is a glob - expression. - - For example, if 'app/*.ts' would match 'app/[id].ts', - then on Windows powershell or cmd.exe, 'glob app/*.ts' - will expand to 'app/[id].ts', as expected. However, in - posix shells such as bash or zsh, the shell will first - expand 'app/*.ts' to a list of filenames. Then glob - will look for a file matching 'app/[id].ts' (ie, - 'app/i.ts' or 'app/d.ts'), which is unexpected. - - Setting '--all' prevents this behavior, causing glob to - treat ALL patterns as glob expressions to be expanded, - even if they are an exact match to a file on disk. - - When setting this option, be sure to enquote arguments - so that the shell will not expand them prior to passing - them to the glob command process. - - -a --absolute Expand to absolute paths - -d --dot-relative Prepend './' on relative matches - -m --mark Append a / on any directories matched - -x --posix Always resolve to posix style paths, using '/' as the - directory separator, even on Windows. Drive letter - absolute matches on Windows will be expanded to their - full resolved UNC maths, eg instead of 'C:\foo\bar', it - will expand to '//?/C:/foo/bar'. - - -f --follow Follow symlinked directories when expanding '**' - -R --realpath Call 'fs.realpath' on all of the results. In the case - of an entry that cannot be resolved, the entry is - omitted. This incurs a slight performance penalty, of - course, because of the added system calls. - - -s --stat Call 'fs.lstat' on all entries, whether required or not - to determine if it's a valid match. - - -b --match-base Perform a basename-only match if the pattern does not - contain any slash characters. That is, '*.js' would be - treated as equivalent to '**/*.js', matching js files - in all directories. - - --dot Allow patterns to match files/directories that start - with '.', even if the pattern does not start with '.' - - --nobrace Do not expand {...} patterns - --nocase Perform a case-insensitive match. This defaults to - 'true' on macOS and Windows platforms, and false on all - others. - - Note: 'nocase' should only be explicitly set when it is - known that the filesystem's case sensitivity differs - from the platform default. If set 'true' on - case-insensitive file systems, then the walk may return - more or less results than expected. - - --nodir Do not match directories, only files. - - Note: to *only* match directories, append a '/' at the - end of the pattern. - - --noext Do not expand extglob patterns, such as '+(a|b)' - --noglobstar Do not expand '**' against multiple path portions. Ie, - treat it as a normal '*' instead. - - --windows-path-no-escape - Use '\' as a path separator *only*, and *never* as an - escape character. If set, all '\' characters are - replaced with '/' in the pattern. - - -D --max-depth= Maximum depth to traverse from the current working - directory - - -C --cwd= Current working directory to execute/match in - -r --root= A string path resolved against the 'cwd', which is used - as the starting point for absolute patterns that start - with '/' (but not drive letters or UNC paths on - Windows). - - Note that this *doesn't* necessarily limit the walk to - the 'root' directory, and doesn't affect the cwd - starting point for non-absolute patterns. A pattern - containing '..' will still be able to traverse out of - the root directory, if it is not an actual root - directory on the filesystem, and any non-absolute - patterns will still be matched in the 'cwd'. - - To start absolute and non-absolute patterns in the same - path, you can use '--root=' to set it to the empty - string. However, be aware that on Windows systems, a - pattern like 'x:/*' or '//host/share/*' will *always* - start in the 'x:/' or '//host/share/' directory, - regardless of the --root setting. - - --platform= Defaults to the value of 'process.platform' if - available, or 'linux' if not. Setting --platform=win32 - on non-Windows systems may cause strange behavior! - - -i --ignore= - Glob patterns to ignore Can be set multiple times - -v --debug Output a huge amount of noisy debug information about - patterns as they are parsed and used to match files. - - -h --help Show this usage information -``` - -## `glob(pattern: string | string[], options?: GlobOptions) => Promise` - -Perform an asynchronous glob search for the pattern(s) specified. -Returns -[Path](https://isaacs.github.io/path-scurry/classes/PathBase) -objects if the `withFileTypes` option is set to `true`. See below -for full options field desciptions. - -## `globSync(pattern: string | string[], options?: GlobOptions) => string[] | Path[]` - -Synchronous form of `glob()`. - -Alias: `glob.sync()` - -## `globIterate(pattern: string | string[], options?: GlobOptions) => AsyncGenerator` - -Return an async iterator for walking glob pattern matches. - -Alias: `glob.iterate()` - -## `globIterateSync(pattern: string | string[], options?: GlobOptions) => Generator` - -Return a sync iterator for walking glob pattern matches. - -Alias: `glob.iterate.sync()`, `glob.sync.iterate()` - -## `globStream(pattern: string | string[], options?: GlobOptions) => Minipass` - -Return a stream that emits all the strings or `Path` objects and -then emits `end` when completed. - -Alias: `glob.stream()` - -## `globStreamSync(pattern: string | string[], options?: GlobOptions) => Minipass` - -Syncronous form of `globStream()`. Will read all the matches as -fast as you consume them, even all in a single tick if you -consume them immediately, but will still respond to backpressure -if they're not consumed immediately. - -Alias: `glob.stream.sync()`, `glob.sync.stream()` - -## `hasMagic(pattern: string | string[], options?: GlobOptions) => boolean` - -Returns `true` if the provided pattern contains any "magic" glob -characters, given the options provided. - -Brace expansion is not considered "magic" unless the -`magicalBraces` option is set, as brace expansion just turns one -string into an array of strings. So a pattern like `'x{a,b}y'` -would return `false`, because `'xay'` and `'xby'` both do not -contain any magic glob characters, and it's treated the same as -if you had called it on `['xay', 'xby']`. When -`magicalBraces:true` is in the options, brace expansion _is_ -treated as a pattern having magic. - -## `escape(pattern: string, options?: GlobOptions) => string` - -Escape all magic characters in a glob pattern, so that it will -only ever match literal strings - -If the `windowsPathsNoEscape` option is used, then characters are -escaped by wrapping in `[]`, because a magic character wrapped in -a character class can only be satisfied by that exact character. - -Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot -be escaped or unescaped. - -## `unescape(pattern: string, options?: GlobOptions) => string` - -Un-escape a glob string that may contain some escaped characters. - -If the `windowsPathsNoEscape` option is used, then square-brace -escapes are removed, but not backslash escapes. For example, it -will turn the string `'[*]'` into `*`, but it will not turn -`'\\*'` into `'*'`, because `\` is a path separator in -`windowsPathsNoEscape` mode. - -When `windowsPathsNoEscape` is not set, then both brace escapes -and backslash escapes are removed. - -Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot -be escaped or unescaped. - -## Class `Glob` - -An object that can perform glob pattern traversals. - -### `const g = new Glob(pattern: string | string[], options: GlobOptions)` - -Options object is required. - -See full options descriptions below. - -Note that a previous `Glob` object can be passed as the -`GlobOptions` to another `Glob` instantiation to re-use settings -and caches with a new pattern. - -Traversal functions can be called multiple times to run the walk -again. - -### `g.stream()` - -Stream results asynchronously, - -### `g.streamSync()` - -Stream results synchronously. - -### `g.iterate()` - -Default async iteration function. Returns an AsyncGenerator that -iterates over the results. - -### `g.iterateSync()` - -Default sync iteration function. Returns a Generator that -iterates over the results. - -### `g.walk()` - -Returns a Promise that resolves to the results array. - -### `g.walkSync()` - -Returns a results array. - -### Properties - -All options are stored as properties on the `Glob` object. - -- `opts` The options provided to the constructor. -- `patterns` An array of parsed immutable `Pattern` objects. - -## Options - -Exported as `GlobOptions` TypeScript interface. A `GlobOptions` -object may be provided to any of the exported methods, and must -be provided to the `Glob` constructor. - -All options are optional, boolean, and false by default, unless -otherwise noted. - -All resolved options are added to the Glob object as properties. - -If you are running many `glob` operations, you can pass a Glob -object as the `options` argument to a subsequent operation to -share the previously loaded cache. - -- `cwd` String path or `file://` string or URL object. The - current working directory in which to search. Defaults to - `process.cwd()`. See also: "Windows, CWDs, Drive Letters, and - UNC Paths", below. - - This option may be either a string path or a `file://` URL - object or string. - -- `root` A string path resolved against the `cwd` option, which - is used as the starting point for absolute patterns that start - with `/`, (but not drive letters or UNC paths on Windows). - - Note that this _doesn't_ necessarily limit the walk to the - `root` directory, and doesn't affect the cwd starting point for - non-absolute patterns. A pattern containing `..` will still be - able to traverse out of the root directory, if it is not an - actual root directory on the filesystem, and any non-absolute - patterns will be matched in the `cwd`. For example, the - pattern `/../*` with `{root:'/some/path'}` will return all - files in `/some`, not all files in `/some/path`. The pattern - `*` with `{root:'/some/path'}` will return all the entries in - the cwd, not the entries in `/some/path`. - - To start absolute and non-absolute patterns in the same - path, you can use `{root:''}`. However, be aware that on - Windows systems, a pattern like `x:/*` or `//host/share/*` will - _always_ start in the `x:/` or `//host/share` directory, - regardless of the `root` setting. - -- `windowsPathsNoEscape` Use `\\` as a path separator _only_, and - _never_ as an escape character. If set, all `\\` characters are - replaced with `/` in the pattern. - - Note that this makes it **impossible** to match against paths - containing literal glob pattern characters, but allows matching - with patterns constructed using `path.join()` and - `path.resolve()` on Windows platforms, mimicking the (buggy!) - behavior of Glob v7 and before on Windows. Please use with - caution, and be mindful of [the caveat below about Windows - paths](#windows). (For legacy reasons, this is also set if - `allowWindowsEscape` is set to the exact value `false`.) - -- `dot` Include `.dot` files in normal matches and `globstar` - matches. Note that an explicit dot in a portion of the pattern - will always match dot files. - -- `magicalBraces` Treat brace expansion like `{a,b}` as a "magic" - pattern. Has no effect if {@link nobrace} is set. - - Only has effect on the {@link hasMagic} function, no effect on - glob pattern matching itself. - -- `dotRelative` Prepend all relative path strings with `./` (or - `.\` on Windows). - - Without this option, returned relative paths are "bare", so - instead of returning `'./foo/bar'`, they are returned as - `'foo/bar'`. - - Relative patterns starting with `'../'` are not prepended with - `./`, even if this option is set. - -- `mark` Add a `/` character to directory matches. Note that this - requires additional stat calls. - -- `nobrace` Do not expand `{a,b}` and `{1..3}` brace sets. - -- `noglobstar` Do not match `**` against multiple filenames. (Ie, - treat it as a normal `*` instead.) - -- `noext` Do not match "extglob" patterns such as `+(a|b)`. - -- `nocase` Perform a case-insensitive match. This defaults to - `true` on macOS and Windows systems, and `false` on all others. - - **Note** `nocase` should only be explicitly set when it is - known that the filesystem's case sensitivity differs from the - platform default. If set `true` on case-sensitive file - systems, or `false` on case-insensitive file systems, then the - walk may return more or less results than expected. - -- `maxDepth` Specify a number to limit the depth of the directory - traversal to this many levels below the `cwd`. - -- `matchBase` Perform a basename-only match if the pattern does - not contain any slash characters. That is, `*.js` would be - treated as equivalent to `**/*.js`, matching all js files in - all directories. - -- `nodir` Do not match directories, only files. (Note: to match - _only_ directories, put a `/` at the end of the pattern.) - - Note: when `follow` and `nodir` are both set, then symbolic - links to directories are also omitted. - -- `stat` Call `lstat()` on all entries, whether required or not - to determine whether it's a valid match. When used with - `withFileTypes`, this means that matches will include data such - as modified time, permissions, and so on. Note that this will - incur a performance cost due to the added system calls. - -- `ignore` string or string[], or an object with `ignore` and - `ignoreChildren` methods. - - If a string or string[] is provided, then this is treated as a - glob pattern or array of glob patterns to exclude from matches. - To ignore all children within a directory, as well as the entry - itself, append `'/**'` to the ignore pattern. - - **Note** `ignore` patterns are _always_ in `dot:true` mode, - regardless of any other settings. - - If an object is provided that has `ignored(path)` and/or - `childrenIgnored(path)` methods, then these methods will be - called to determine whether any Path is a match or if its - children should be traversed, respectively. - -- `follow` Follow symlinked directories when expanding `**` - patterns. This can result in a lot of duplicate references in - the presence of cyclic links, and make performance quite bad. - - By default, a `**` in a pattern will follow 1 symbolic link if - it is not the first item in the pattern, or none if it is the - first item in the pattern, following the same behavior as Bash. - - Note: when `follow` and `nodir` are both set, then symbolic - links to directories are also omitted. - -- `realpath` Set to true to call `fs.realpath` on all of the - results. In the case of an entry that cannot be resolved, the - entry is omitted. This incurs a slight performance penalty, of - course, because of the added system calls. - -- `absolute` Set to true to always receive absolute paths for - matched files. Set to `false` to always receive relative paths - for matched files. - - By default, when this option is not set, absolute paths are - returned for patterns that are absolute, and otherwise paths - are returned that are relative to the `cwd` setting. - - This does _not_ make an extra system call to get the realpath, - it only does string path resolution. - - `absolute` may not be used along with `withFileTypes`. - -- `posix` Set to true to use `/` as the path separator in - returned results. On posix systems, this has no effect. On - Windows systems, this will return `/` delimited path results, - and absolute paths will be returned in their full resolved UNC - path form, eg insted of `'C:\\foo\\bar'`, it will return - `//?/C:/foo/bar`. - -- `platform` Defaults to value of `process.platform` if - available, or `'linux'` if not. Setting `platform:'win32'` on - non-Windows systems may cause strange behavior. - -- `withFileTypes` Return [PathScurry](http://npm.im/path-scurry) - `Path` objects instead of strings. These are similar to a - NodeJS `Dirent` object, but with additional methods and - properties. - - `withFileTypes` may not be used along with `absolute`. - -- `signal` An AbortSignal which will cancel the Glob walk when - triggered. - -- `fs` An override object to pass in custom filesystem methods. - See [PathScurry docs](http://npm.im/path-scurry) for what can - be overridden. - -- `scurry` A [PathScurry](http://npm.im/path-scurry) object used - to traverse the file system. If the `nocase` option is set - explicitly, then any provided `scurry` object must match this - setting. - -- `includeChildMatches` boolean, default `true`. Do not match any - children of any matches. For example, the pattern `**\/foo` - would match `a/foo`, but not `a/foo/b/foo` in this mode. - - This is especially useful for cases like "find all - `node_modules` folders, but not the ones in `node_modules`". - - In order to support this, the `Ignore` implementation must - support an `add(pattern: string)` method. If using the default - `Ignore` class, then this is fine, but if this is set to - `false`, and a custom `Ignore` is provided that does not have - an `add()` method, then it will throw an error. - - **Caveat** It _only_ ignores matches that would be a descendant - of a previous match, and only if that descendant is matched - _after_ the ancestor is encountered. Since the file system walk - happens in indeterminate order, it's possible that a match will - already be added before its ancestor, if multiple or braced - patterns are used. - - For example: - - ```js - const results = await glob( - [ - // likely to match first, since it's just a stat - 'a/b/c/d/e/f', - - // this pattern is more complicated! It must to various readdir() - // calls and test the results against a regular expression, and that - // is certainly going to take a little bit longer. - // - // So, later on, it encounters a match at 'a/b/c/d/e', but it's too - // late to ignore a/b/c/d/e/f, because it's already been emitted. - 'a/[bdf]/?/[a-z]/*', - ], - { includeChildMatches: false }, - ) - ``` - - It's best to only set this to `false` if you can be reasonably - sure that no components of the pattern will potentially match - one another's file system descendants, or if the occasional - included child entry will not cause problems. - -## Glob Primer - -Much more information about glob pattern expansion can be found -by running `man bash` and searching for `Pattern Matching`. - -"Globs" are the patterns you type when you do stuff like `ls -*.js` on the command line, or put `build/*` in a `.gitignore` -file. - -Before parsing the path part patterns, braced sections are -expanded into a set. Braced sections start with `{` and end with -`}`, with 2 or more comma-delimited sections within. Braced -sections may contain slash characters, so `a{/b/c,bcd}` would -expand into `a/b/c` and `abcd`. - -The following characters have special magic meaning when used in -a path portion. With the exception of `**`, none of these match -path separators (ie, `/` on all platforms, and `\` on Windows). - -- `*` Matches 0 or more characters in a single path portion. - When alone in a path portion, it must match at least 1 - character. If `dot:true` is not specified, then `*` will not - match against a `.` character at the start of a path portion. -- `?` Matches 1 character. If `dot:true` is not specified, then - `?` will not match against a `.` character at the start of a - path portion. -- `[...]` Matches a range of characters, similar to a RegExp - range. If the first character of the range is `!` or `^` then - it matches any character not in the range. If the first - character is `]`, then it will be considered the same as `\]`, - rather than the end of the character class. -- `!(pattern|pattern|pattern)` Matches anything that does not - match any of the patterns provided. May _not_ contain `/` - characters. Similar to `*`, if alone in a path portion, then - the path portion must have at least one character. -- `?(pattern|pattern|pattern)` Matches zero or one occurrence of - the patterns provided. May _not_ contain `/` characters. -- `+(pattern|pattern|pattern)` Matches one or more occurrences of - the patterns provided. May _not_ contain `/` characters. -- `*(a|b|c)` Matches zero or more occurrences of the patterns - provided. May _not_ contain `/` characters. -- `@(pattern|pat*|pat?erN)` Matches exactly one of the patterns - provided. May _not_ contain `/` characters. -- `**` If a "globstar" is alone in a path portion, then it - matches zero or more directories and subdirectories searching - for matches. It does not crawl symlinked directories, unless - `{follow:true}` is passed in the options object. A pattern - like `a/b/**` will only match `a/b` if it is a directory. - Follows 1 symbolic link if not the first item in the pattern, - or 0 if it is the first item, unless `follow:true` is set, in - which case it follows all symbolic links. - -`[:class:]` patterns are supported by this implementation, but -`[=c=]` and `[.symbol.]` style class patterns are not. - -### Dots - -If a file or directory path portion has a `.` as the first -character, then it will not match any glob pattern unless that -pattern's corresponding path part also has a `.` as its first -character. - -For example, the pattern `a/.*/c` would match the file at -`a/.b/c`. However the pattern `a/*/c` would not, because `*` does -not start with a dot character. - -You can make glob treat dots as normal characters by setting -`dot:true` in the options. - -### Basename Matching - -If you set `matchBase:true` in the options, and the pattern has -no slashes in it, then it will seek for any file anywhere in the -tree with a matching basename. For example, `*.js` would match -`test/simple/basic.js`. - -### Empty Sets - -If no matching files are found, then an empty array is returned. -This differs from the shell, where the pattern itself is -returned. For example: - -```sh -$ echo a*s*d*f -a*s*d*f -``` - -## Comparisons to other fnmatch/glob implementations - -While strict compliance with the existing standards is a -worthwhile goal, some discrepancies exist between node-glob and -other implementations, and are intentional. - -The double-star character `**` is supported by default, unless -the `noglobstar` flag is set. This is supported in the manner of -bsdglob and bash 5, where `**` only has special significance if -it is the only thing in a path part. That is, `a/**/b` will match -`a/x/y/b`, but `a/**b` will not. - -Note that symlinked directories are not traversed as part of a -`**`, though their contents may match against subsequent portions -of the pattern. This prevents infinite loops and duplicates and -the like. You can force glob to traverse symlinks with `**` by -setting `{follow:true}` in the options. - -There is no equivalent of the `nonull` option. A pattern that -does not find any matches simply resolves to nothing. (An empty -array, immediately ended stream, etc.) - -If brace expansion is not disabled, then it is performed before -any other interpretation of the glob pattern. Thus, a pattern -like `+(a|{b),c)}`, which would not be valid in bash or zsh, is -expanded **first** into the set of `+(a|b)` and `+(a|c)`, and -those patterns are checked for validity. Since those two are -valid, matching proceeds. - -The character class patterns `[:class:]` (posix standard named -classes) style class patterns are supported and unicode-aware, -but `[=c=]` (locale-specific character collation weight), and -`[.symbol.]` (collating symbol), are not. - -### Repeated Slashes - -Unlike Bash and zsh, repeated `/` are always coalesced into a -single path separator. - -### Comments and Negation - -Previously, this module let you mark a pattern as a "comment" if -it started with a `#` character, or a "negated" pattern if it -started with a `!` character. - -These options were deprecated in version 5, and removed in -version 6. - -To specify things that should not match, use the `ignore` option. - -## Windows - -**Please only use forward-slashes in glob expressions.** - -Though windows uses either `/` or `\` as its path separator, only -`/` characters are used by this glob implementation. You must use -forward-slashes **only** in glob expressions. Back-slashes will -always be interpreted as escape characters, not path separators. - -Results from absolute patterns such as `/foo/*` are mounted onto -the root setting using `path.join`. On windows, this will by -default result in `/foo/*` matching `C:\foo\bar.txt`. - -To automatically coerce all `\` characters to `/` in pattern -strings, **thus making it impossible to escape literal glob -characters**, you may set the `windowsPathsNoEscape` option to -`true`. - -### Windows, CWDs, Drive Letters, and UNC Paths - -On posix systems, when a pattern starts with `/`, any `cwd` -option is ignored, and the traversal starts at `/`, plus any -non-magic path portions specified in the pattern. - -On Windows systems, the behavior is similar, but the concept of -an "absolute path" is somewhat more involved. - -#### UNC Paths - -A UNC path may be used as the start of a pattern on Windows -platforms. For example, a pattern like: `//?/x:/*` will return -all file entries in the root of the `x:` drive. A pattern like -`//ComputerName/Share/*` will return all files in the associated -share. - -UNC path roots are always compared case insensitively. - -#### Drive Letters - -A pattern starting with a drive letter, like `c:/*`, will search -in that drive, regardless of any `cwd` option provided. - -If the pattern starts with `/`, and is not a UNC path, and there -is an explicit `cwd` option set with a drive letter, then the -drive letter in the `cwd` is used as the root of the directory -traversal. - -For example, `glob('/tmp', { cwd: 'c:/any/thing' })` will return -`['c:/tmp']` as the result. - -If an explicit `cwd` option is not provided, and the pattern -starts with `/`, then the traversal will run on the root of the -drive provided as the `cwd` option. (That is, it is the result of -`path.resolve('/')`.) - -## Race Conditions - -Glob searching, by its very nature, is susceptible to race -conditions, since it relies on directory walking. - -As a result, it is possible that a file that exists when glob -looks for it may have been deleted or modified by the time it -returns the result. - -By design, this implementation caches all readdir calls that it -makes, in order to cut down on system overhead. However, this -also makes it even more susceptible to races, especially if the -cache object is reused between glob calls. - -Users are thus advised not to use a glob result as a guarantee of -filesystem state in the face of rapid changes. For the vast -majority of operations, this is never a problem. - -### See Also: - -- `man sh` -- `man bash` [Pattern - Matching](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html) -- `man 3 fnmatch` -- `man 5 gitignore` -- [minimatch documentation](https://github.com/isaacs/minimatch) - -## Glob Logo - -Glob's logo was created by [Tanya -Brassie](http://tanyabrassie.com/). Logo files can be found -[here](https://github.com/isaacs/node-glob/tree/master/logo). - -The logo is licensed under a [Creative Commons -Attribution-ShareAlike 4.0 International -License](https://creativecommons.org/licenses/by-sa/4.0/). - -## Contributing - -Any change to behavior (including bugfixes) must come with a -test. - -Patches that fail tests or reduce performance will be rejected. - -```sh -# to run tests -npm test - -# to re-generate test fixtures -npm run test-regen - -# run the benchmarks -npm run bench - -# to profile javascript -npm run prof -``` - -## Comparison to Other JavaScript Glob Implementations - -**tl;dr** - -- If you want glob matching that is as faithful as possible to - Bash pattern expansion semantics, and as fast as possible - within that constraint, _use this module_. -- If you are reasonably sure that the patterns you will encounter - are relatively simple, and want the absolutely fastest glob - matcher out there, _use [fast-glob](http://npm.im/fast-glob)_. -- If you are reasonably sure that the patterns you will encounter - are relatively simple, and want the convenience of - automatically respecting `.gitignore` files, _use - [globby](http://npm.im/globby)_. - -There are some other glob matcher libraries on npm, but these -three are (in my opinion, as of 2023) the best. - ---- - -**full explanation** - -Every library reflects a set of opinions and priorities in the -trade-offs it makes. Other than this library, I can personally -recommend both [globby](http://npm.im/globby) and -[fast-glob](http://npm.im/fast-glob), though they differ in their -benefits and drawbacks. - -Both have very nice APIs and are reasonably fast. - -`fast-glob` is, as far as I am aware, the fastest glob -implementation in JavaScript today. However, there are many -cases where the choices that `fast-glob` makes in pursuit of -speed mean that its results differ from the results returned by -Bash and other sh-like shells, which may be surprising. - -In my testing, `fast-glob` is around 10-20% faster than this -module when walking over 200k files nested 4 directories -deep[1](#fn-webscale). However, there are some inconsistencies -with Bash matching behavior that this module does not suffer -from: - -- `**` only matches files, not directories -- `..` path portions are not handled unless they appear at the - start of the pattern -- `./!()` will not match any files that _start_ with - ``, even if they do not match ``. For - example, `!(9).txt` will not match `9999.txt`. -- Some brace patterns in the middle of a pattern will result in - failing to find certain matches. -- Extglob patterns are allowed to contain `/` characters. - -Globby exhibits all of the same pattern semantics as fast-glob, -(as it is a wrapper around fast-glob) and is slightly slower than -node-glob (by about 10-20% in the benchmark test set, or in other -words, anywhere from 20-50% slower than fast-glob). However, it -adds some API conveniences that may be worth the costs. - -- Support for `.gitignore` and other ignore files. -- Support for negated globs (ie, patterns starting with `!` - rather than using a separate `ignore` option). - -The priority of this module is "correctness" in the sense of -performing a glob pattern expansion as faithfully as possible to -the behavior of Bash and other sh-like shells, with as much speed -as possible. - -Note that prior versions of `node-glob` are _not_ on this list. -Former versions of this module are far too slow for any cases -where performance matters at all, and were designed with APIs -that are extremely dated by current JavaScript standards. - ---- - -[1]: In the cases where this module -returns results and `fast-glob` doesn't, it's even faster, of -course. - -![lumpy space princess saying 'oh my GLOB'](https://github.com/isaacs/node-glob/raw/main/oh-my-glob.gif) - -### Benchmark Results - -First number is time, smaller is better. - -Second number is the count of results returned. - -``` ---- pattern: '**' --- -~~ sync ~~ -node fast-glob sync 0m0.598s 200364 -node globby sync 0m0.765s 200364 -node current globSync mjs 0m0.683s 222656 -node current glob syncStream 0m0.649s 222656 -~~ async ~~ -node fast-glob async 0m0.350s 200364 -node globby async 0m0.509s 200364 -node current glob async mjs 0m0.463s 222656 -node current glob stream 0m0.411s 222656 - ---- pattern: '**/..' --- -~~ sync ~~ -node fast-glob sync 0m0.486s 0 -node globby sync 0m0.769s 200364 -node current globSync mjs 0m0.564s 2242 -node current glob syncStream 0m0.583s 2242 -~~ async ~~ -node fast-glob async 0m0.283s 0 -node globby async 0m0.512s 200364 -node current glob async mjs 0m0.299s 2242 -node current glob stream 0m0.312s 2242 - ---- pattern: './**/0/**/0/**/0/**/0/**/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.490s 10 -node globby sync 0m0.517s 10 -node current globSync mjs 0m0.540s 10 -node current glob syncStream 0m0.550s 10 -~~ async ~~ -node fast-glob async 0m0.290s 10 -node globby async 0m0.296s 10 -node current glob async mjs 0m0.278s 10 -node current glob stream 0m0.302s 10 - ---- pattern: './**/[01]/**/[12]/**/[23]/**/[45]/**/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.500s 160 -node globby sync 0m0.528s 160 -node current globSync mjs 0m0.556s 160 -node current glob syncStream 0m0.573s 160 -~~ async ~~ -node fast-glob async 0m0.283s 160 -node globby async 0m0.301s 160 -node current glob async mjs 0m0.306s 160 -node current glob stream 0m0.322s 160 - ---- pattern: './**/0/**/0/**/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.502s 5230 -node globby sync 0m0.527s 5230 -node current globSync mjs 0m0.544s 5230 -node current glob syncStream 0m0.557s 5230 -~~ async ~~ -node fast-glob async 0m0.285s 5230 -node globby async 0m0.305s 5230 -node current glob async mjs 0m0.304s 5230 -node current glob stream 0m0.310s 5230 - ---- pattern: '**/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.580s 200023 -node globby sync 0m0.771s 200023 -node current globSync mjs 0m0.685s 200023 -node current glob syncStream 0m0.649s 200023 -~~ async ~~ -node fast-glob async 0m0.349s 200023 -node globby async 0m0.509s 200023 -node current glob async mjs 0m0.427s 200023 -node current glob stream 0m0.388s 200023 - ---- pattern: '{**/*.txt,**/?/**/*.txt,**/?/**/?/**/*.txt,**/?/**/?/**/?/**/*.txt,**/?/**/?/**/?/**/?/**/*.txt}' --- -~~ sync ~~ -node fast-glob sync 0m0.589s 200023 -node globby sync 0m0.771s 200023 -node current globSync mjs 0m0.716s 200023 -node current glob syncStream 0m0.684s 200023 -~~ async ~~ -node fast-glob async 0m0.351s 200023 -node globby async 0m0.518s 200023 -node current glob async mjs 0m0.462s 200023 -node current glob stream 0m0.468s 200023 - ---- pattern: '**/5555/0000/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.496s 1000 -node globby sync 0m0.519s 1000 -node current globSync mjs 0m0.539s 1000 -node current glob syncStream 0m0.567s 1000 -~~ async ~~ -node fast-glob async 0m0.285s 1000 -node globby async 0m0.299s 1000 -node current glob async mjs 0m0.305s 1000 -node current glob stream 0m0.301s 1000 - ---- pattern: './**/0/**/../[01]/**/0/../**/0/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.484s 0 -node globby sync 0m0.507s 0 -node current globSync mjs 0m0.577s 4880 -node current glob syncStream 0m0.586s 4880 -~~ async ~~ -node fast-glob async 0m0.280s 0 -node globby async 0m0.298s 0 -node current glob async mjs 0m0.327s 4880 -node current glob stream 0m0.324s 4880 - ---- pattern: '**/????/????/????/????/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.547s 100000 -node globby sync 0m0.673s 100000 -node current globSync mjs 0m0.626s 100000 -node current glob syncStream 0m0.618s 100000 -~~ async ~~ -node fast-glob async 0m0.315s 100000 -node globby async 0m0.414s 100000 -node current glob async mjs 0m0.366s 100000 -node current glob stream 0m0.345s 100000 - ---- pattern: './{**/?{/**/?{/**/?{/**/?,,,,},,,,},,,,},,,}/**/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.588s 100000 -node globby sync 0m0.670s 100000 -node current globSync mjs 0m0.717s 200023 -node current glob syncStream 0m0.687s 200023 -~~ async ~~ -node fast-glob async 0m0.343s 100000 -node globby async 0m0.418s 100000 -node current glob async mjs 0m0.519s 200023 -node current glob stream 0m0.451s 200023 - ---- pattern: '**/!(0|9).txt' --- -~~ sync ~~ -node fast-glob sync 0m0.573s 160023 -node globby sync 0m0.731s 160023 -node current globSync mjs 0m0.680s 180023 -node current glob syncStream 0m0.659s 180023 -~~ async ~~ -node fast-glob async 0m0.345s 160023 -node globby async 0m0.476s 160023 -node current glob async mjs 0m0.427s 180023 -node current glob stream 0m0.388s 180023 - ---- pattern: './{*/**/../{*/**/../{*/**/../{*/**/../{*/**,,,,},,,,},,,,},,,,},,,,}/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.483s 0 -node globby sync 0m0.512s 0 -node current globSync mjs 0m0.811s 200023 -node current glob syncStream 0m0.773s 200023 -~~ async ~~ -node fast-glob async 0m0.280s 0 -node globby async 0m0.299s 0 -node current glob async mjs 0m0.617s 200023 -node current glob stream 0m0.568s 200023 - ---- pattern: './*/**/../*/**/../*/**/../*/**/../*/**/../*/**/../*/**/../*/**/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.485s 0 -node globby sync 0m0.507s 0 -node current globSync mjs 0m0.759s 200023 -node current glob syncStream 0m0.740s 200023 -~~ async ~~ -node fast-glob async 0m0.281s 0 -node globby async 0m0.297s 0 -node current glob async mjs 0m0.544s 200023 -node current glob stream 0m0.464s 200023 - ---- pattern: './*/**/../*/**/../*/**/../*/**/../*/**/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.486s 0 -node globby sync 0m0.513s 0 -node current globSync mjs 0m0.734s 200023 -node current glob syncStream 0m0.696s 200023 -~~ async ~~ -node fast-glob async 0m0.286s 0 -node globby async 0m0.296s 0 -node current glob async mjs 0m0.506s 200023 -node current glob stream 0m0.483s 200023 - ---- pattern: './0/**/../1/**/../2/**/../3/**/../4/**/../5/**/../6/**/../7/**/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.060s 0 -node globby sync 0m0.074s 0 -node current globSync mjs 0m0.067s 0 -node current glob syncStream 0m0.066s 0 -~~ async ~~ -node fast-glob async 0m0.060s 0 -node globby async 0m0.075s 0 -node current glob async mjs 0m0.066s 0 -node current glob stream 0m0.067s 0 - ---- pattern: './**/?/**/?/**/?/**/?/**/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.568s 100000 -node globby sync 0m0.651s 100000 -node current globSync mjs 0m0.619s 100000 -node current glob syncStream 0m0.617s 100000 -~~ async ~~ -node fast-glob async 0m0.332s 100000 -node globby async 0m0.409s 100000 -node current glob async mjs 0m0.372s 100000 -node current glob stream 0m0.351s 100000 - ---- pattern: '**/*/**/*/**/*/**/*/**' --- -~~ sync ~~ -node fast-glob sync 0m0.603s 200113 -node globby sync 0m0.798s 200113 -node current globSync mjs 0m0.730s 222137 -node current glob syncStream 0m0.693s 222137 -~~ async ~~ -node fast-glob async 0m0.356s 200113 -node globby async 0m0.525s 200113 -node current glob async mjs 0m0.508s 222137 -node current glob stream 0m0.455s 222137 - ---- pattern: './**/*/**/*/**/*/**/*/**/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.622s 200000 -node globby sync 0m0.792s 200000 -node current globSync mjs 0m0.722s 200000 -node current glob syncStream 0m0.695s 200000 -~~ async ~~ -node fast-glob async 0m0.369s 200000 -node globby async 0m0.527s 200000 -node current glob async mjs 0m0.502s 200000 -node current glob stream 0m0.481s 200000 - ---- pattern: '**/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.588s 200023 -node globby sync 0m0.771s 200023 -node current globSync mjs 0m0.684s 200023 -node current glob syncStream 0m0.658s 200023 -~~ async ~~ -node fast-glob async 0m0.352s 200023 -node globby async 0m0.516s 200023 -node current glob async mjs 0m0.432s 200023 -node current glob stream 0m0.384s 200023 - ---- pattern: './**/**/**/**/**/**/**/**/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.589s 200023 -node globby sync 0m0.766s 200023 -node current globSync mjs 0m0.682s 200023 -node current glob syncStream 0m0.652s 200023 -~~ async ~~ -node fast-glob async 0m0.352s 200023 -node globby async 0m0.523s 200023 -node current glob async mjs 0m0.436s 200023 -node current glob stream 0m0.380s 200023 - ---- pattern: '**/*/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.592s 200023 -node globby sync 0m0.776s 200023 -node current globSync mjs 0m0.691s 200023 -node current glob syncStream 0m0.659s 200023 -~~ async ~~ -node fast-glob async 0m0.357s 200023 -node globby async 0m0.513s 200023 -node current glob async mjs 0m0.471s 200023 -node current glob stream 0m0.424s 200023 - ---- pattern: '**/*/**/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.585s 200023 -node globby sync 0m0.766s 200023 -node current globSync mjs 0m0.694s 200023 -node current glob syncStream 0m0.664s 200023 -~~ async ~~ -node fast-glob async 0m0.350s 200023 -node globby async 0m0.514s 200023 -node current glob async mjs 0m0.472s 200023 -node current glob stream 0m0.424s 200023 - ---- pattern: '**/[0-9]/**/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.544s 100000 -node globby sync 0m0.636s 100000 -node current globSync mjs 0m0.626s 100000 -node current glob syncStream 0m0.621s 100000 -~~ async ~~ -node fast-glob async 0m0.322s 100000 -node globby async 0m0.404s 100000 -node current glob async mjs 0m0.360s 100000 -node current glob stream 0m0.352s 100000 -``` diff --git a/node_modules/glob/dist/commonjs/glob.d.ts b/node_modules/glob/dist/commonjs/glob.d.ts deleted file mode 100644 index 25262b3..0000000 --- a/node_modules/glob/dist/commonjs/glob.d.ts +++ /dev/null @@ -1,388 +0,0 @@ -import { Minimatch } from 'minimatch'; -import { Minipass } from 'minipass'; -import { FSOption, Path, PathScurry } from 'path-scurry'; -import { IgnoreLike } from './ignore.js'; -import { Pattern } from './pattern.js'; -export type MatchSet = Minimatch['set']; -export type GlobParts = Exclude; -/** - * A `GlobOptions` object may be provided to any of the exported methods, and - * must be provided to the `Glob` constructor. - * - * All options are optional, boolean, and false by default, unless otherwise - * noted. - * - * All resolved options are added to the Glob object as properties. - * - * If you are running many `glob` operations, you can pass a Glob object as the - * `options` argument to a subsequent operation to share the previously loaded - * cache. - */ -export interface GlobOptions { - /** - * Set to `true` to always receive absolute paths for - * matched files. Set to `false` to always return relative paths. - * - * When this option is not set, absolute paths are returned for patterns - * that are absolute, and otherwise paths are returned that are relative - * to the `cwd` setting. - * - * This does _not_ make an extra system call to get - * the realpath, it only does string path resolution. - * - * Conflicts with {@link withFileTypes} - */ - absolute?: boolean; - /** - * Set to false to enable {@link windowsPathsNoEscape} - * - * @deprecated - */ - allowWindowsEscape?: boolean; - /** - * The current working directory in which to search. Defaults to - * `process.cwd()`. - * - * May be eiher a string path or a `file://` URL object or string. - */ - cwd?: string | URL; - /** - * Include `.dot` files in normal matches and `globstar` - * matches. Note that an explicit dot in a portion of the pattern - * will always match dot files. - */ - dot?: boolean; - /** - * Prepend all relative path strings with `./` (or `.\` on Windows). - * - * Without this option, returned relative paths are "bare", so instead of - * returning `'./foo/bar'`, they are returned as `'foo/bar'`. - * - * Relative patterns starting with `'../'` are not prepended with `./`, even - * if this option is set. - */ - dotRelative?: boolean; - /** - * Follow symlinked directories when expanding `**` - * patterns. This can result in a lot of duplicate references in - * the presence of cyclic links, and make performance quite bad. - * - * By default, a `**` in a pattern will follow 1 symbolic link if - * it is not the first item in the pattern, or none if it is the - * first item in the pattern, following the same behavior as Bash. - */ - follow?: boolean; - /** - * string or string[], or an object with `ignore` and `ignoreChildren` - * methods. - * - * If a string or string[] is provided, then this is treated as a glob - * pattern or array of glob patterns to exclude from matches. To ignore all - * children within a directory, as well as the entry itself, append `'/**'` - * to the ignore pattern. - * - * **Note** `ignore` patterns are _always_ in `dot:true` mode, regardless of - * any other settings. - * - * If an object is provided that has `ignored(path)` and/or - * `childrenIgnored(path)` methods, then these methods will be called to - * determine whether any Path is a match or if its children should be - * traversed, respectively. - */ - ignore?: string | string[] | IgnoreLike; - /** - * Treat brace expansion like `{a,b}` as a "magic" pattern. Has no - * effect if {@link nobrace} is set. - * - * Only has effect on the {@link hasMagic} function. - */ - magicalBraces?: boolean; - /** - * Add a `/` character to directory matches. Note that this requires - * additional stat calls in some cases. - */ - mark?: boolean; - /** - * Perform a basename-only match if the pattern does not contain any slash - * characters. That is, `*.js` would be treated as equivalent to - * `**\/*.js`, matching all js files in all directories. - */ - matchBase?: boolean; - /** - * Limit the directory traversal to a given depth below the cwd. - * Note that this does NOT prevent traversal to sibling folders, - * root patterns, and so on. It only limits the maximum folder depth - * that the walk will descend, relative to the cwd. - */ - maxDepth?: number; - /** - * Do not expand `{a,b}` and `{1..3}` brace sets. - */ - nobrace?: boolean; - /** - * Perform a case-insensitive match. This defaults to `true` on macOS and - * Windows systems, and `false` on all others. - * - * **Note** `nocase` should only be explicitly set when it is - * known that the filesystem's case sensitivity differs from the - * platform default. If set `true` on case-sensitive file - * systems, or `false` on case-insensitive file systems, then the - * walk may return more or less results than expected. - */ - nocase?: boolean; - /** - * Do not match directories, only files. (Note: to match - * _only_ directories, put a `/` at the end of the pattern.) - */ - nodir?: boolean; - /** - * Do not match "extglob" patterns such as `+(a|b)`. - */ - noext?: boolean; - /** - * Do not match `**` against multiple filenames. (Ie, treat it as a normal - * `*` instead.) - * - * Conflicts with {@link matchBase} - */ - noglobstar?: boolean; - /** - * Defaults to value of `process.platform` if available, or `'linux'` if - * not. Setting `platform:'win32'` on non-Windows systems may cause strange - * behavior. - */ - platform?: NodeJS.Platform; - /** - * Set to true to call `fs.realpath` on all of the - * results. In the case of an entry that cannot be resolved, the - * entry is omitted. This incurs a slight performance penalty, of - * course, because of the added system calls. - */ - realpath?: boolean; - /** - * - * A string path resolved against the `cwd` option, which - * is used as the starting point for absolute patterns that start - * with `/`, (but not drive letters or UNC paths on Windows). - * - * Note that this _doesn't_ necessarily limit the walk to the - * `root` directory, and doesn't affect the cwd starting point for - * non-absolute patterns. A pattern containing `..` will still be - * able to traverse out of the root directory, if it is not an - * actual root directory on the filesystem, and any non-absolute - * patterns will be matched in the `cwd`. For example, the - * pattern `/../*` with `{root:'/some/path'}` will return all - * files in `/some`, not all files in `/some/path`. The pattern - * `*` with `{root:'/some/path'}` will return all the entries in - * the cwd, not the entries in `/some/path`. - * - * To start absolute and non-absolute patterns in the same - * path, you can use `{root:''}`. However, be aware that on - * Windows systems, a pattern like `x:/*` or `//host/share/*` will - * _always_ start in the `x:/` or `//host/share` directory, - * regardless of the `root` setting. - */ - root?: string; - /** - * A [PathScurry](http://npm.im/path-scurry) object used - * to traverse the file system. If the `nocase` option is set - * explicitly, then any provided `scurry` object must match this - * setting. - */ - scurry?: PathScurry; - /** - * Call `lstat()` on all entries, whether required or not to determine - * if it's a valid match. When used with {@link withFileTypes}, this means - * that matches will include data such as modified time, permissions, and - * so on. Note that this will incur a performance cost due to the added - * system calls. - */ - stat?: boolean; - /** - * An AbortSignal which will cancel the Glob walk when - * triggered. - */ - signal?: AbortSignal; - /** - * Use `\\` as a path separator _only_, and - * _never_ as an escape character. If set, all `\\` characters are - * replaced with `/` in the pattern. - * - * Note that this makes it **impossible** to match against paths - * containing literal glob pattern characters, but allows matching - * with patterns constructed using `path.join()` and - * `path.resolve()` on Windows platforms, mimicking the (buggy!) - * behavior of Glob v7 and before on Windows. Please use with - * caution, and be mindful of [the caveat below about Windows - * paths](#windows). (For legacy reasons, this is also set if - * `allowWindowsEscape` is set to the exact value `false`.) - */ - windowsPathsNoEscape?: boolean; - /** - * Return [PathScurry](http://npm.im/path-scurry) - * `Path` objects instead of strings. These are similar to a - * NodeJS `Dirent` object, but with additional methods and - * properties. - * - * Conflicts with {@link absolute} - */ - withFileTypes?: boolean; - /** - * An fs implementation to override some or all of the defaults. See - * http://npm.im/path-scurry for details about what can be overridden. - */ - fs?: FSOption; - /** - * Just passed along to Minimatch. Note that this makes all pattern - * matching operations slower and *extremely* noisy. - */ - debug?: boolean; - /** - * Return `/` delimited paths, even on Windows. - * - * On posix systems, this has no effect. But, on Windows, it means that - * paths will be `/` delimited, and absolute paths will be their full - * resolved UNC forms, eg instead of `'C:\\foo\\bar'`, it would return - * `'//?/C:/foo/bar'` - */ - posix?: boolean; - /** - * Do not match any children of any matches. For example, the pattern - * `**\/foo` would match `a/foo`, but not `a/foo/b/foo` in this mode. - * - * This is especially useful for cases like "find all `node_modules` - * folders, but not the ones in `node_modules`". - * - * In order to support this, the `Ignore` implementation must support an - * `add(pattern: string)` method. If using the default `Ignore` class, then - * this is fine, but if this is set to `false`, and a custom `Ignore` is - * provided that does not have an `add()` method, then it will throw an - * error. - * - * **Caveat** It *only* ignores matches that would be a descendant of a - * previous match, and only if that descendant is matched *after* the - * ancestor is encountered. Since the file system walk happens in - * indeterminate order, it's possible that a match will already be added - * before its ancestor, if multiple or braced patterns are used. - * - * For example: - * - * ```ts - * const results = await glob([ - * // likely to match first, since it's just a stat - * 'a/b/c/d/e/f', - * - * // this pattern is more complicated! It must to various readdir() - * // calls and test the results against a regular expression, and that - * // is certainly going to take a little bit longer. - * // - * // So, later on, it encounters a match at 'a/b/c/d/e', but it's too - * // late to ignore a/b/c/d/e/f, because it's already been emitted. - * 'a/[bdf]/?/[a-z]/*', - * ], { includeChildMatches: false }) - * ``` - * - * It's best to only set this to `false` if you can be reasonably sure that - * no components of the pattern will potentially match one another's file - * system descendants, or if the occasional included child entry will not - * cause problems. - * - * @default true - */ - includeChildMatches?: boolean; -} -export type GlobOptionsWithFileTypesTrue = GlobOptions & { - withFileTypes: true; - absolute?: undefined; - mark?: undefined; - posix?: undefined; -}; -export type GlobOptionsWithFileTypesFalse = GlobOptions & { - withFileTypes?: false; -}; -export type GlobOptionsWithFileTypesUnset = GlobOptions & { - withFileTypes?: undefined; -}; -export type Result = Opts extends GlobOptionsWithFileTypesTrue ? Path : Opts extends GlobOptionsWithFileTypesFalse ? string : Opts extends GlobOptionsWithFileTypesUnset ? string : string | Path; -export type Results = Result[]; -export type FileTypes = Opts extends GlobOptionsWithFileTypesTrue ? true : Opts extends GlobOptionsWithFileTypesFalse ? false : Opts extends GlobOptionsWithFileTypesUnset ? false : boolean; -/** - * An object that can perform glob pattern traversals. - */ -export declare class Glob implements GlobOptions { - absolute?: boolean; - cwd: string; - root?: string; - dot: boolean; - dotRelative: boolean; - follow: boolean; - ignore?: string | string[] | IgnoreLike; - magicalBraces: boolean; - mark?: boolean; - matchBase: boolean; - maxDepth: number; - nobrace: boolean; - nocase: boolean; - nodir: boolean; - noext: boolean; - noglobstar: boolean; - pattern: string[]; - platform: NodeJS.Platform; - realpath: boolean; - scurry: PathScurry; - stat: boolean; - signal?: AbortSignal; - windowsPathsNoEscape: boolean; - withFileTypes: FileTypes; - includeChildMatches: boolean; - /** - * The options provided to the constructor. - */ - opts: Opts; - /** - * An array of parsed immutable {@link Pattern} objects. - */ - patterns: Pattern[]; - /** - * All options are stored as properties on the `Glob` object. - * - * See {@link GlobOptions} for full options descriptions. - * - * Note that a previous `Glob` object can be passed as the - * `GlobOptions` to another `Glob` instantiation to re-use settings - * and caches with a new pattern. - * - * Traversal functions can be called multiple times to run the walk - * again. - */ - constructor(pattern: string | string[], opts: Opts); - /** - * Returns a Promise that resolves to the results array. - */ - walk(): Promise>; - /** - * synchronous {@link Glob.walk} - */ - walkSync(): Results; - /** - * Stream results asynchronously. - */ - stream(): Minipass, Result>; - /** - * Stream results synchronously. - */ - streamSync(): Minipass, Result>; - /** - * Default sync iteration function. Returns a Generator that - * iterates over the results. - */ - iterateSync(): Generator, void, void>; - [Symbol.iterator](): Generator, void, void>; - /** - * Default async iteration function. Returns an AsyncGenerator that - * iterates over the results. - */ - iterate(): AsyncGenerator, void, void>; - [Symbol.asyncIterator](): AsyncGenerator, void, void>; -} -//# sourceMappingURL=glob.d.ts.map \ No newline at end of file diff --git a/node_modules/glob/dist/commonjs/glob.d.ts.map b/node_modules/glob/dist/commonjs/glob.d.ts.map deleted file mode 100644 index c32dc74..0000000 --- a/node_modules/glob/dist/commonjs/glob.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../src/glob.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/glob/dist/commonjs/glob.js b/node_modules/glob/dist/commonjs/glob.js deleted file mode 100644 index e1339bb..0000000 --- a/node_modules/glob/dist/commonjs/glob.js +++ /dev/null @@ -1,247 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Glob = void 0; -const minimatch_1 = require("minimatch"); -const node_url_1 = require("node:url"); -const path_scurry_1 = require("path-scurry"); -const pattern_js_1 = require("./pattern.js"); -const walker_js_1 = require("./walker.js"); -// if no process global, just call it linux. -// so we default to case-sensitive, / separators -const defaultPlatform = (typeof process === 'object' && - process && - typeof process.platform === 'string') ? - process.platform - : 'linux'; -/** - * An object that can perform glob pattern traversals. - */ -class Glob { - absolute; - cwd; - root; - dot; - dotRelative; - follow; - ignore; - magicalBraces; - mark; - matchBase; - maxDepth; - nobrace; - nocase; - nodir; - noext; - noglobstar; - pattern; - platform; - realpath; - scurry; - stat; - signal; - windowsPathsNoEscape; - withFileTypes; - includeChildMatches; - /** - * The options provided to the constructor. - */ - opts; - /** - * An array of parsed immutable {@link Pattern} objects. - */ - patterns; - /** - * All options are stored as properties on the `Glob` object. - * - * See {@link GlobOptions} for full options descriptions. - * - * Note that a previous `Glob` object can be passed as the - * `GlobOptions` to another `Glob` instantiation to re-use settings - * and caches with a new pattern. - * - * Traversal functions can be called multiple times to run the walk - * again. - */ - constructor(pattern, opts) { - /* c8 ignore start */ - if (!opts) - throw new TypeError('glob options required'); - /* c8 ignore stop */ - this.withFileTypes = !!opts.withFileTypes; - this.signal = opts.signal; - this.follow = !!opts.follow; - this.dot = !!opts.dot; - this.dotRelative = !!opts.dotRelative; - this.nodir = !!opts.nodir; - this.mark = !!opts.mark; - if (!opts.cwd) { - this.cwd = ''; - } - else if (opts.cwd instanceof URL || opts.cwd.startsWith('file://')) { - opts.cwd = (0, node_url_1.fileURLToPath)(opts.cwd); - } - this.cwd = opts.cwd || ''; - this.root = opts.root; - this.magicalBraces = !!opts.magicalBraces; - this.nobrace = !!opts.nobrace; - this.noext = !!opts.noext; - this.realpath = !!opts.realpath; - this.absolute = opts.absolute; - this.includeChildMatches = opts.includeChildMatches !== false; - this.noglobstar = !!opts.noglobstar; - this.matchBase = !!opts.matchBase; - this.maxDepth = - typeof opts.maxDepth === 'number' ? opts.maxDepth : Infinity; - this.stat = !!opts.stat; - this.ignore = opts.ignore; - if (this.withFileTypes && this.absolute !== undefined) { - throw new Error('cannot set absolute and withFileTypes:true'); - } - if (typeof pattern === 'string') { - pattern = [pattern]; - } - this.windowsPathsNoEscape = - !!opts.windowsPathsNoEscape || - opts.allowWindowsEscape === - false; - if (this.windowsPathsNoEscape) { - pattern = pattern.map(p => p.replace(/\\/g, '/')); - } - if (this.matchBase) { - if (opts.noglobstar) { - throw new TypeError('base matching requires globstar'); - } - pattern = pattern.map(p => (p.includes('/') ? p : `./**/${p}`)); - } - this.pattern = pattern; - this.platform = opts.platform || defaultPlatform; - this.opts = { ...opts, platform: this.platform }; - if (opts.scurry) { - this.scurry = opts.scurry; - if (opts.nocase !== undefined && - opts.nocase !== opts.scurry.nocase) { - throw new Error('nocase option contradicts provided scurry option'); - } - } - else { - const Scurry = opts.platform === 'win32' ? path_scurry_1.PathScurryWin32 - : opts.platform === 'darwin' ? path_scurry_1.PathScurryDarwin - : opts.platform ? path_scurry_1.PathScurryPosix - : path_scurry_1.PathScurry; - this.scurry = new Scurry(this.cwd, { - nocase: opts.nocase, - fs: opts.fs, - }); - } - this.nocase = this.scurry.nocase; - // If you do nocase:true on a case-sensitive file system, then - // we need to use regexps instead of strings for non-magic - // path portions, because statting `aBc` won't return results - // for the file `AbC` for example. - const nocaseMagicOnly = this.platform === 'darwin' || this.platform === 'win32'; - const mmo = { - // default nocase based on platform - ...opts, - dot: this.dot, - matchBase: this.matchBase, - nobrace: this.nobrace, - nocase: this.nocase, - nocaseMagicOnly, - nocomment: true, - noext: this.noext, - nonegate: true, - optimizationLevel: 2, - platform: this.platform, - windowsPathsNoEscape: this.windowsPathsNoEscape, - debug: !!this.opts.debug, - }; - const mms = this.pattern.map(p => new minimatch_1.Minimatch(p, mmo)); - const [matchSet, globParts] = mms.reduce((set, m) => { - set[0].push(...m.set); - set[1].push(...m.globParts); - return set; - }, [[], []]); - this.patterns = matchSet.map((set, i) => { - const g = globParts[i]; - /* c8 ignore start */ - if (!g) - throw new Error('invalid pattern object'); - /* c8 ignore stop */ - return new pattern_js_1.Pattern(set, g, 0, this.platform); - }); - } - async walk() { - // Walkers always return array of Path objects, so we just have to - // coerce them into the right shape. It will have already called - // realpath() if the option was set to do so, so we know that's cached. - // start out knowing the cwd, at least - return [ - ...(await new walker_js_1.GlobWalker(this.patterns, this.scurry.cwd, { - ...this.opts, - maxDepth: this.maxDepth !== Infinity ? - this.maxDepth + this.scurry.cwd.depth() - : Infinity, - platform: this.platform, - nocase: this.nocase, - includeChildMatches: this.includeChildMatches, - }).walk()), - ]; - } - walkSync() { - return [ - ...new walker_js_1.GlobWalker(this.patterns, this.scurry.cwd, { - ...this.opts, - maxDepth: this.maxDepth !== Infinity ? - this.maxDepth + this.scurry.cwd.depth() - : Infinity, - platform: this.platform, - nocase: this.nocase, - includeChildMatches: this.includeChildMatches, - }).walkSync(), - ]; - } - stream() { - return new walker_js_1.GlobStream(this.patterns, this.scurry.cwd, { - ...this.opts, - maxDepth: this.maxDepth !== Infinity ? - this.maxDepth + this.scurry.cwd.depth() - : Infinity, - platform: this.platform, - nocase: this.nocase, - includeChildMatches: this.includeChildMatches, - }).stream(); - } - streamSync() { - return new walker_js_1.GlobStream(this.patterns, this.scurry.cwd, { - ...this.opts, - maxDepth: this.maxDepth !== Infinity ? - this.maxDepth + this.scurry.cwd.depth() - : Infinity, - platform: this.platform, - nocase: this.nocase, - includeChildMatches: this.includeChildMatches, - }).streamSync(); - } - /** - * Default sync iteration function. Returns a Generator that - * iterates over the results. - */ - iterateSync() { - return this.streamSync()[Symbol.iterator](); - } - [Symbol.iterator]() { - return this.iterateSync(); - } - /** - * Default async iteration function. Returns an AsyncGenerator that - * iterates over the results. - */ - iterate() { - return this.stream()[Symbol.asyncIterator](); - } - [Symbol.asyncIterator]() { - return this.iterate(); - } -} -exports.Glob = Glob; -//# sourceMappingURL=glob.js.map \ No newline at end of file diff --git a/node_modules/glob/dist/commonjs/glob.js.map b/node_modules/glob/dist/commonjs/glob.js.map deleted file mode 100644 index ddab419..0000000 --- a/node_modules/glob/dist/commonjs/glob.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/glob.ts"],"names":[],"mappings":"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","sourcesContent":["import { Minimatch, MinimatchOptions } from 'minimatch'\nimport { Minipass } from 'minipass'\nimport { fileURLToPath } from 'node:url'\nimport {\n FSOption,\n Path,\n PathScurry,\n PathScurryDarwin,\n PathScurryPosix,\n PathScurryWin32,\n} from 'path-scurry'\nimport { IgnoreLike } from './ignore.js'\nimport { Pattern } from './pattern.js'\nimport { GlobStream, GlobWalker } from './walker.js'\n\nexport type MatchSet = Minimatch['set']\nexport type GlobParts = Exclude\n\n// if no process global, just call it linux.\n// so we default to case-sensitive, / separators\nconst defaultPlatform: NodeJS.Platform =\n (\n typeof process === 'object' &&\n process &&\n typeof process.platform === 'string'\n ) ?\n process.platform\n : 'linux'\n\n/**\n * A `GlobOptions` object may be provided to any of the exported methods, and\n * must be provided to the `Glob` constructor.\n *\n * All options are optional, boolean, and false by default, unless otherwise\n * noted.\n *\n * All resolved options are added to the Glob object as properties.\n *\n * If you are running many `glob` operations, you can pass a Glob object as the\n * `options` argument to a subsequent operation to share the previously loaded\n * cache.\n */\nexport interface GlobOptions {\n /**\n * Set to `true` to always receive absolute paths for\n * matched files. Set to `false` to always return relative paths.\n *\n * When this option is not set, absolute paths are returned for patterns\n * that are absolute, and otherwise paths are returned that are relative\n * to the `cwd` setting.\n *\n * This does _not_ make an extra system call to get\n * the realpath, it only does string path resolution.\n *\n * Conflicts with {@link withFileTypes}\n */\n absolute?: boolean\n\n /**\n * Set to false to enable {@link windowsPathsNoEscape}\n *\n * @deprecated\n */\n allowWindowsEscape?: boolean\n\n /**\n * The current working directory in which to search. Defaults to\n * `process.cwd()`.\n *\n * May be eiher a string path or a `file://` URL object or string.\n */\n cwd?: string | URL\n\n /**\n * Include `.dot` files in normal matches and `globstar`\n * matches. Note that an explicit dot in a portion of the pattern\n * will always match dot files.\n */\n dot?: boolean\n\n /**\n * Prepend all relative path strings with `./` (or `.\\` on Windows).\n *\n * Without this option, returned relative paths are \"bare\", so instead of\n * returning `'./foo/bar'`, they are returned as `'foo/bar'`.\n *\n * Relative patterns starting with `'../'` are not prepended with `./`, even\n * if this option is set.\n */\n dotRelative?: boolean\n\n /**\n * Follow symlinked directories when expanding `**`\n * patterns. This can result in a lot of duplicate references in\n * the presence of cyclic links, and make performance quite bad.\n *\n * By default, a `**` in a pattern will follow 1 symbolic link if\n * it is not the first item in the pattern, or none if it is the\n * first item in the pattern, following the same behavior as Bash.\n */\n follow?: boolean\n\n /**\n * string or string[], or an object with `ignore` and `ignoreChildren`\n * methods.\n *\n * If a string or string[] is provided, then this is treated as a glob\n * pattern or array of glob patterns to exclude from matches. To ignore all\n * children within a directory, as well as the entry itself, append `'/**'`\n * to the ignore pattern.\n *\n * **Note** `ignore` patterns are _always_ in `dot:true` mode, regardless of\n * any other settings.\n *\n * If an object is provided that has `ignored(path)` and/or\n * `childrenIgnored(path)` methods, then these methods will be called to\n * determine whether any Path is a match or if its children should be\n * traversed, respectively.\n */\n ignore?: string | string[] | IgnoreLike\n\n /**\n * Treat brace expansion like `{a,b}` as a \"magic\" pattern. Has no\n * effect if {@link nobrace} is set.\n *\n * Only has effect on the {@link hasMagic} function.\n */\n magicalBraces?: boolean\n\n /**\n * Add a `/` character to directory matches. Note that this requires\n * additional stat calls in some cases.\n */\n mark?: boolean\n\n /**\n * Perform a basename-only match if the pattern does not contain any slash\n * characters. That is, `*.js` would be treated as equivalent to\n * `**\\/*.js`, matching all js files in all directories.\n */\n matchBase?: boolean\n\n /**\n * Limit the directory traversal to a given depth below the cwd.\n * Note that this does NOT prevent traversal to sibling folders,\n * root patterns, and so on. It only limits the maximum folder depth\n * that the walk will descend, relative to the cwd.\n */\n maxDepth?: number\n\n /**\n * Do not expand `{a,b}` and `{1..3}` brace sets.\n */\n nobrace?: boolean\n\n /**\n * Perform a case-insensitive match. This defaults to `true` on macOS and\n * Windows systems, and `false` on all others.\n *\n * **Note** `nocase` should only be explicitly set when it is\n * known that the filesystem's case sensitivity differs from the\n * platform default. If set `true` on case-sensitive file\n * systems, or `false` on case-insensitive file systems, then the\n * walk may return more or less results than expected.\n */\n nocase?: boolean\n\n /**\n * Do not match directories, only files. (Note: to match\n * _only_ directories, put a `/` at the end of the pattern.)\n */\n nodir?: boolean\n\n /**\n * Do not match \"extglob\" patterns such as `+(a|b)`.\n */\n noext?: boolean\n\n /**\n * Do not match `**` against multiple filenames. (Ie, treat it as a normal\n * `*` instead.)\n *\n * Conflicts with {@link matchBase}\n */\n noglobstar?: boolean\n\n /**\n * Defaults to value of `process.platform` if available, or `'linux'` if\n * not. Setting `platform:'win32'` on non-Windows systems may cause strange\n * behavior.\n */\n platform?: NodeJS.Platform\n\n /**\n * Set to true to call `fs.realpath` on all of the\n * results. In the case of an entry that cannot be resolved, the\n * entry is omitted. This incurs a slight performance penalty, of\n * course, because of the added system calls.\n */\n realpath?: boolean\n\n /**\n *\n * A string path resolved against the `cwd` option, which\n * is used as the starting point for absolute patterns that start\n * with `/`, (but not drive letters or UNC paths on Windows).\n *\n * Note that this _doesn't_ necessarily limit the walk to the\n * `root` directory, and doesn't affect the cwd starting point for\n * non-absolute patterns. A pattern containing `..` will still be\n * able to traverse out of the root directory, if it is not an\n * actual root directory on the filesystem, and any non-absolute\n * patterns will be matched in the `cwd`. For example, the\n * pattern `/../*` with `{root:'/some/path'}` will return all\n * files in `/some`, not all files in `/some/path`. The pattern\n * `*` with `{root:'/some/path'}` will return all the entries in\n * the cwd, not the entries in `/some/path`.\n *\n * To start absolute and non-absolute patterns in the same\n * path, you can use `{root:''}`. However, be aware that on\n * Windows systems, a pattern like `x:/*` or `//host/share/*` will\n * _always_ start in the `x:/` or `//host/share` directory,\n * regardless of the `root` setting.\n */\n root?: string\n\n /**\n * A [PathScurry](http://npm.im/path-scurry) object used\n * to traverse the file system. If the `nocase` option is set\n * explicitly, then any provided `scurry` object must match this\n * setting.\n */\n scurry?: PathScurry\n\n /**\n * Call `lstat()` on all entries, whether required or not to determine\n * if it's a valid match. When used with {@link withFileTypes}, this means\n * that matches will include data such as modified time, permissions, and\n * so on. Note that this will incur a performance cost due to the added\n * system calls.\n */\n stat?: boolean\n\n /**\n * An AbortSignal which will cancel the Glob walk when\n * triggered.\n */\n signal?: AbortSignal\n\n /**\n * Use `\\\\` as a path separator _only_, and\n * _never_ as an escape character. If set, all `\\\\` characters are\n * replaced with `/` in the pattern.\n *\n * Note that this makes it **impossible** to match against paths\n * containing literal glob pattern characters, but allows matching\n * with patterns constructed using `path.join()` and\n * `path.resolve()` on Windows platforms, mimicking the (buggy!)\n * behavior of Glob v7 and before on Windows. Please use with\n * caution, and be mindful of [the caveat below about Windows\n * paths](#windows). (For legacy reasons, this is also set if\n * `allowWindowsEscape` is set to the exact value `false`.)\n */\n windowsPathsNoEscape?: boolean\n\n /**\n * Return [PathScurry](http://npm.im/path-scurry)\n * `Path` objects instead of strings. These are similar to a\n * NodeJS `Dirent` object, but with additional methods and\n * properties.\n *\n * Conflicts with {@link absolute}\n */\n withFileTypes?: boolean\n\n /**\n * An fs implementation to override some or all of the defaults. See\n * http://npm.im/path-scurry for details about what can be overridden.\n */\n fs?: FSOption\n\n /**\n * Just passed along to Minimatch. Note that this makes all pattern\n * matching operations slower and *extremely* noisy.\n */\n debug?: boolean\n\n /**\n * Return `/` delimited paths, even on Windows.\n *\n * On posix systems, this has no effect. But, on Windows, it means that\n * paths will be `/` delimited, and absolute paths will be their full\n * resolved UNC forms, eg instead of `'C:\\\\foo\\\\bar'`, it would return\n * `'//?/C:/foo/bar'`\n */\n posix?: boolean\n\n /**\n * Do not match any children of any matches. For example, the pattern\n * `**\\/foo` would match `a/foo`, but not `a/foo/b/foo` in this mode.\n *\n * This is especially useful for cases like \"find all `node_modules`\n * folders, but not the ones in `node_modules`\".\n *\n * In order to support this, the `Ignore` implementation must support an\n * `add(pattern: string)` method. If using the default `Ignore` class, then\n * this is fine, but if this is set to `false`, and a custom `Ignore` is\n * provided that does not have an `add()` method, then it will throw an\n * error.\n *\n * **Caveat** It *only* ignores matches that would be a descendant of a\n * previous match, and only if that descendant is matched *after* the\n * ancestor is encountered. Since the file system walk happens in\n * indeterminate order, it's possible that a match will already be added\n * before its ancestor, if multiple or braced patterns are used.\n *\n * For example:\n *\n * ```ts\n * const results = await glob([\n * // likely to match first, since it's just a stat\n * 'a/b/c/d/e/f',\n *\n * // this pattern is more complicated! It must to various readdir()\n * // calls and test the results against a regular expression, and that\n * // is certainly going to take a little bit longer.\n * //\n * // So, later on, it encounters a match at 'a/b/c/d/e', but it's too\n * // late to ignore a/b/c/d/e/f, because it's already been emitted.\n * 'a/[bdf]/?/[a-z]/*',\n * ], { includeChildMatches: false })\n * ```\n *\n * It's best to only set this to `false` if you can be reasonably sure that\n * no components of the pattern will potentially match one another's file\n * system descendants, or if the occasional included child entry will not\n * cause problems.\n *\n * @default true\n */\n includeChildMatches?: boolean\n}\n\nexport type GlobOptionsWithFileTypesTrue = GlobOptions & {\n withFileTypes: true\n // string options not relevant if returning Path objects.\n absolute?: undefined\n mark?: undefined\n posix?: undefined\n}\n\nexport type GlobOptionsWithFileTypesFalse = GlobOptions & {\n withFileTypes?: false\n}\n\nexport type GlobOptionsWithFileTypesUnset = GlobOptions & {\n withFileTypes?: undefined\n}\n\nexport type Result =\n Opts extends GlobOptionsWithFileTypesTrue ? Path\n : Opts extends GlobOptionsWithFileTypesFalse ? string\n : Opts extends GlobOptionsWithFileTypesUnset ? string\n : string | Path\nexport type Results = Result[]\n\nexport type FileTypes =\n Opts extends GlobOptionsWithFileTypesTrue ? true\n : Opts extends GlobOptionsWithFileTypesFalse ? false\n : Opts extends GlobOptionsWithFileTypesUnset ? false\n : boolean\n\n/**\n * An object that can perform glob pattern traversals.\n */\nexport class Glob implements GlobOptions {\n absolute?: boolean\n cwd: string\n root?: string\n dot: boolean\n dotRelative: boolean\n follow: boolean\n ignore?: string | string[] | IgnoreLike\n magicalBraces: boolean\n mark?: boolean\n matchBase: boolean\n maxDepth: number\n nobrace: boolean\n nocase: boolean\n nodir: boolean\n noext: boolean\n noglobstar: boolean\n pattern: string[]\n platform: NodeJS.Platform\n realpath: boolean\n scurry: PathScurry\n stat: boolean\n signal?: AbortSignal\n windowsPathsNoEscape: boolean\n withFileTypes: FileTypes\n includeChildMatches: boolean\n\n /**\n * The options provided to the constructor.\n */\n opts: Opts\n\n /**\n * An array of parsed immutable {@link Pattern} objects.\n */\n patterns: Pattern[]\n\n /**\n * All options are stored as properties on the `Glob` object.\n *\n * See {@link GlobOptions} for full options descriptions.\n *\n * Note that a previous `Glob` object can be passed as the\n * `GlobOptions` to another `Glob` instantiation to re-use settings\n * and caches with a new pattern.\n *\n * Traversal functions can be called multiple times to run the walk\n * again.\n */\n constructor(pattern: string | string[], opts: Opts) {\n /* c8 ignore start */\n if (!opts) throw new TypeError('glob options required')\n /* c8 ignore stop */\n this.withFileTypes = !!opts.withFileTypes as FileTypes\n this.signal = opts.signal\n this.follow = !!opts.follow\n this.dot = !!opts.dot\n this.dotRelative = !!opts.dotRelative\n this.nodir = !!opts.nodir\n this.mark = !!opts.mark\n if (!opts.cwd) {\n this.cwd = ''\n } else if (opts.cwd instanceof URL || opts.cwd.startsWith('file://')) {\n opts.cwd = fileURLToPath(opts.cwd)\n }\n this.cwd = opts.cwd || ''\n this.root = opts.root\n this.magicalBraces = !!opts.magicalBraces\n this.nobrace = !!opts.nobrace\n this.noext = !!opts.noext\n this.realpath = !!opts.realpath\n this.absolute = opts.absolute\n this.includeChildMatches = opts.includeChildMatches !== false\n\n this.noglobstar = !!opts.noglobstar\n this.matchBase = !!opts.matchBase\n this.maxDepth =\n typeof opts.maxDepth === 'number' ? opts.maxDepth : Infinity\n this.stat = !!opts.stat\n this.ignore = opts.ignore\n\n if (this.withFileTypes && this.absolute !== undefined) {\n throw new Error('cannot set absolute and withFileTypes:true')\n }\n\n if (typeof pattern === 'string') {\n pattern = [pattern]\n }\n\n this.windowsPathsNoEscape =\n !!opts.windowsPathsNoEscape ||\n (opts as { allowWindowsEscape?: boolean }).allowWindowsEscape ===\n false\n\n if (this.windowsPathsNoEscape) {\n pattern = pattern.map(p => p.replace(/\\\\/g, '/'))\n }\n\n if (this.matchBase) {\n if (opts.noglobstar) {\n throw new TypeError('base matching requires globstar')\n }\n pattern = pattern.map(p => (p.includes('/') ? p : `./**/${p}`))\n }\n\n this.pattern = pattern\n\n this.platform = opts.platform || defaultPlatform\n this.opts = { ...opts, platform: this.platform }\n if (opts.scurry) {\n this.scurry = opts.scurry\n if (\n opts.nocase !== undefined &&\n opts.nocase !== opts.scurry.nocase\n ) {\n throw new Error('nocase option contradicts provided scurry option')\n }\n } else {\n const Scurry =\n opts.platform === 'win32' ? PathScurryWin32\n : opts.platform === 'darwin' ? PathScurryDarwin\n : opts.platform ? PathScurryPosix\n : PathScurry\n this.scurry = new Scurry(this.cwd, {\n nocase: opts.nocase,\n fs: opts.fs,\n })\n }\n this.nocase = this.scurry.nocase\n\n // If you do nocase:true on a case-sensitive file system, then\n // we need to use regexps instead of strings for non-magic\n // path portions, because statting `aBc` won't return results\n // for the file `AbC` for example.\n const nocaseMagicOnly =\n this.platform === 'darwin' || this.platform === 'win32'\n\n const mmo: MinimatchOptions = {\n // default nocase based on platform\n ...opts,\n dot: this.dot,\n matchBase: this.matchBase,\n nobrace: this.nobrace,\n nocase: this.nocase,\n nocaseMagicOnly,\n nocomment: true,\n noext: this.noext,\n nonegate: true,\n optimizationLevel: 2,\n platform: this.platform,\n windowsPathsNoEscape: this.windowsPathsNoEscape,\n debug: !!this.opts.debug,\n }\n\n const mms = this.pattern.map(p => new Minimatch(p, mmo))\n const [matchSet, globParts] = mms.reduce(\n (set: [MatchSet, GlobParts], m) => {\n set[0].push(...m.set)\n set[1].push(...m.globParts)\n return set\n },\n [[], []],\n )\n this.patterns = matchSet.map((set, i) => {\n const g = globParts[i]\n /* c8 ignore start */\n if (!g) throw new Error('invalid pattern object')\n /* c8 ignore stop */\n return new Pattern(set, g, 0, this.platform)\n })\n }\n\n /**\n * Returns a Promise that resolves to the results array.\n */\n async walk(): Promise>\n async walk(): Promise<(string | Path)[]> {\n // Walkers always return array of Path objects, so we just have to\n // coerce them into the right shape. It will have already called\n // realpath() if the option was set to do so, so we know that's cached.\n // start out knowing the cwd, at least\n return [\n ...(await new GlobWalker(this.patterns, this.scurry.cwd, {\n ...this.opts,\n maxDepth:\n this.maxDepth !== Infinity ?\n this.maxDepth + this.scurry.cwd.depth()\n : Infinity,\n platform: this.platform,\n nocase: this.nocase,\n includeChildMatches: this.includeChildMatches,\n }).walk()),\n ]\n }\n\n /**\n * synchronous {@link Glob.walk}\n */\n walkSync(): Results\n walkSync(): (string | Path)[] {\n return [\n ...new GlobWalker(this.patterns, this.scurry.cwd, {\n ...this.opts,\n maxDepth:\n this.maxDepth !== Infinity ?\n this.maxDepth + this.scurry.cwd.depth()\n : Infinity,\n platform: this.platform,\n nocase: this.nocase,\n includeChildMatches: this.includeChildMatches,\n }).walkSync(),\n ]\n }\n\n /**\n * Stream results asynchronously.\n */\n stream(): Minipass, Result>\n stream(): Minipass {\n return new GlobStream(this.patterns, this.scurry.cwd, {\n ...this.opts,\n maxDepth:\n this.maxDepth !== Infinity ?\n this.maxDepth + this.scurry.cwd.depth()\n : Infinity,\n platform: this.platform,\n nocase: this.nocase,\n includeChildMatches: this.includeChildMatches,\n }).stream()\n }\n\n /**\n * Stream results synchronously.\n */\n streamSync(): Minipass, Result>\n streamSync(): Minipass {\n return new GlobStream(this.patterns, this.scurry.cwd, {\n ...this.opts,\n maxDepth:\n this.maxDepth !== Infinity ?\n this.maxDepth + this.scurry.cwd.depth()\n : Infinity,\n platform: this.platform,\n nocase: this.nocase,\n includeChildMatches: this.includeChildMatches,\n }).streamSync()\n }\n\n /**\n * Default sync iteration function. Returns a Generator that\n * iterates over the results.\n */\n iterateSync(): Generator, void, void> {\n return this.streamSync()[Symbol.iterator]()\n }\n [Symbol.iterator]() {\n return this.iterateSync()\n }\n\n /**\n * Default async iteration function. Returns an AsyncGenerator that\n * iterates over the results.\n */\n iterate(): AsyncGenerator, void, void> {\n return this.stream()[Symbol.asyncIterator]()\n }\n [Symbol.asyncIterator]() {\n return this.iterate()\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/glob/dist/commonjs/has-magic.d.ts b/node_modules/glob/dist/commonjs/has-magic.d.ts deleted file mode 100644 index 8aec3bd..0000000 --- a/node_modules/glob/dist/commonjs/has-magic.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { GlobOptions } from './glob.js'; -/** - * Return true if the patterns provided contain any magic glob characters, - * given the options provided. - * - * Brace expansion is not considered "magic" unless the `magicalBraces` option - * is set, as brace expansion just turns one string into an array of strings. - * So a pattern like `'x{a,b}y'` would return `false`, because `'xay'` and - * `'xby'` both do not contain any magic glob characters, and it's treated the - * same as if you had called it on `['xay', 'xby']`. When `magicalBraces:true` - * is in the options, brace expansion _is_ treated as a pattern having magic. - */ -export declare const hasMagic: (pattern: string | string[], options?: GlobOptions) => boolean; -//# sourceMappingURL=has-magic.d.ts.map \ No newline at end of file diff --git a/node_modules/glob/dist/commonjs/has-magic.d.ts.map b/node_modules/glob/dist/commonjs/has-magic.d.ts.map deleted file mode 100644 index b24dd4e..0000000 --- a/node_modules/glob/dist/commonjs/has-magic.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"has-magic.d.ts","sourceRoot":"","sources":["../../src/has-magic.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAEvC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,QAAQ,YACV,MAAM,GAAG,MAAM,EAAE,YACjB,WAAW,KACnB,OAQF,CAAA"} \ No newline at end of file diff --git a/node_modules/glob/dist/commonjs/has-magic.js b/node_modules/glob/dist/commonjs/has-magic.js deleted file mode 100644 index 0918bd5..0000000 --- a/node_modules/glob/dist/commonjs/has-magic.js +++ /dev/null @@ -1,27 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.hasMagic = void 0; -const minimatch_1 = require("minimatch"); -/** - * Return true if the patterns provided contain any magic glob characters, - * given the options provided. - * - * Brace expansion is not considered "magic" unless the `magicalBraces` option - * is set, as brace expansion just turns one string into an array of strings. - * So a pattern like `'x{a,b}y'` would return `false`, because `'xay'` and - * `'xby'` both do not contain any magic glob characters, and it's treated the - * same as if you had called it on `['xay', 'xby']`. When `magicalBraces:true` - * is in the options, brace expansion _is_ treated as a pattern having magic. - */ -const hasMagic = (pattern, options = {}) => { - if (!Array.isArray(pattern)) { - pattern = [pattern]; - } - for (const p of pattern) { - if (new minimatch_1.Minimatch(p, options).hasMagic()) - return true; - } - return false; -}; -exports.hasMagic = hasMagic; -//# sourceMappingURL=has-magic.js.map \ No newline at end of file diff --git a/node_modules/glob/dist/commonjs/has-magic.js.map b/node_modules/glob/dist/commonjs/has-magic.js.map deleted file mode 100644 index 44deab2..0000000 --- a/node_modules/glob/dist/commonjs/has-magic.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"has-magic.js","sourceRoot":"","sources":["../../src/has-magic.ts"],"names":[],"mappings":";;;AAAA,yCAAqC;AAGrC;;;;;;;;;;GAUG;AACI,MAAM,QAAQ,GAAG,CACtB,OAA0B,EAC1B,UAAuB,EAAE,EAChB,EAAE;IACX,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC,OAAO,CAAC,CAAA;IACrB,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,IAAI,qBAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE;YAAE,OAAO,IAAI,CAAA;IACvD,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAXY,QAAA,QAAQ,YAWpB","sourcesContent":["import { Minimatch } from 'minimatch'\nimport { GlobOptions } from './glob.js'\n\n/**\n * Return true if the patterns provided contain any magic glob characters,\n * given the options provided.\n *\n * Brace expansion is not considered \"magic\" unless the `magicalBraces` option\n * is set, as brace expansion just turns one string into an array of strings.\n * So a pattern like `'x{a,b}y'` would return `false`, because `'xay'` and\n * `'xby'` both do not contain any magic glob characters, and it's treated the\n * same as if you had called it on `['xay', 'xby']`. When `magicalBraces:true`\n * is in the options, brace expansion _is_ treated as a pattern having magic.\n */\nexport const hasMagic = (\n pattern: string | string[],\n options: GlobOptions = {},\n): boolean => {\n if (!Array.isArray(pattern)) {\n pattern = [pattern]\n }\n for (const p of pattern) {\n if (new Minimatch(p, options).hasMagic()) return true\n }\n return false\n}\n"]} \ No newline at end of file diff --git a/node_modules/glob/dist/commonjs/ignore.d.ts b/node_modules/glob/dist/commonjs/ignore.d.ts deleted file mode 100644 index 1893b16..0000000 --- a/node_modules/glob/dist/commonjs/ignore.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Minimatch, MinimatchOptions } from 'minimatch'; -import { Path } from 'path-scurry'; -import { GlobWalkerOpts } from './walker.js'; -export interface IgnoreLike { - ignored?: (p: Path) => boolean; - childrenIgnored?: (p: Path) => boolean; - add?: (ignore: string) => void; -} -/** - * Class used to process ignored patterns - */ -export declare class Ignore implements IgnoreLike { - relative: Minimatch[]; - relativeChildren: Minimatch[]; - absolute: Minimatch[]; - absoluteChildren: Minimatch[]; - platform: NodeJS.Platform; - mmopts: MinimatchOptions; - constructor(ignored: string[], { nobrace, nocase, noext, noglobstar, platform, }: GlobWalkerOpts); - add(ign: string): void; - ignored(p: Path): boolean; - childrenIgnored(p: Path): boolean; -} -//# sourceMappingURL=ignore.d.ts.map \ No newline at end of file diff --git a/node_modules/glob/dist/commonjs/ignore.d.ts.map b/node_modules/glob/dist/commonjs/ignore.d.ts.map deleted file mode 100644 index 57d6ab6..0000000 --- a/node_modules/glob/dist/commonjs/ignore.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ignore.d.ts","sourceRoot":"","sources":["../../src/ignore.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,OAAO,CAAA;IAC9B,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,OAAO,CAAA;IACtC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;CAC/B;AAWD;;GAEG;AACH,qBAAa,MAAO,YAAW,UAAU;IACvC,QAAQ,EAAE,SAAS,EAAE,CAAA;IACrB,gBAAgB,EAAE,SAAS,EAAE,CAAA;IAC7B,QAAQ,EAAE,SAAS,EAAE,CAAA;IACrB,gBAAgB,EAAE,SAAS,EAAE,CAAA;IAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAA;IACzB,MAAM,EAAE,gBAAgB,CAAA;gBAGtB,OAAO,EAAE,MAAM,EAAE,EACjB,EACE,OAAO,EACP,MAAM,EACN,KAAK,EACL,UAAU,EACV,QAA0B,GAC3B,EAAE,cAAc;IAqBnB,GAAG,CAAC,GAAG,EAAE,MAAM;IAyCf,OAAO,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO;IAczB,eAAe,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO;CAWlC"} \ No newline at end of file diff --git a/node_modules/glob/dist/commonjs/ignore.js b/node_modules/glob/dist/commonjs/ignore.js deleted file mode 100644 index 5f1fde0..0000000 --- a/node_modules/glob/dist/commonjs/ignore.js +++ /dev/null @@ -1,119 +0,0 @@ -"use strict"; -// give it a pattern, and it'll be able to tell you if -// a given path should be ignored. -// Ignoring a path ignores its children if the pattern ends in /** -// Ignores are always parsed in dot:true mode -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Ignore = void 0; -const minimatch_1 = require("minimatch"); -const pattern_js_1 = require("./pattern.js"); -const defaultPlatform = (typeof process === 'object' && - process && - typeof process.platform === 'string') ? - process.platform - : 'linux'; -/** - * Class used to process ignored patterns - */ -class Ignore { - relative; - relativeChildren; - absolute; - absoluteChildren; - platform; - mmopts; - constructor(ignored, { nobrace, nocase, noext, noglobstar, platform = defaultPlatform, }) { - this.relative = []; - this.absolute = []; - this.relativeChildren = []; - this.absoluteChildren = []; - this.platform = platform; - this.mmopts = { - dot: true, - nobrace, - nocase, - noext, - noglobstar, - optimizationLevel: 2, - platform, - nocomment: true, - nonegate: true, - }; - for (const ign of ignored) - this.add(ign); - } - add(ign) { - // this is a little weird, but it gives us a clean set of optimized - // minimatch matchers, without getting tripped up if one of them - // ends in /** inside a brace section, and it's only inefficient at - // the start of the walk, not along it. - // It'd be nice if the Pattern class just had a .test() method, but - // handling globstars is a bit of a pita, and that code already lives - // in minimatch anyway. - // Another way would be if maybe Minimatch could take its set/globParts - // as an option, and then we could at least just use Pattern to test - // for absolute-ness. - // Yet another way, Minimatch could take an array of glob strings, and - // a cwd option, and do the right thing. - const mm = new minimatch_1.Minimatch(ign, this.mmopts); - for (let i = 0; i < mm.set.length; i++) { - const parsed = mm.set[i]; - const globParts = mm.globParts[i]; - /* c8 ignore start */ - if (!parsed || !globParts) { - throw new Error('invalid pattern object'); - } - // strip off leading ./ portions - // https://github.com/isaacs/node-glob/issues/570 - while (parsed[0] === '.' && globParts[0] === '.') { - parsed.shift(); - globParts.shift(); - } - /* c8 ignore stop */ - const p = new pattern_js_1.Pattern(parsed, globParts, 0, this.platform); - const m = new minimatch_1.Minimatch(p.globString(), this.mmopts); - const children = globParts[globParts.length - 1] === '**'; - const absolute = p.isAbsolute(); - if (absolute) - this.absolute.push(m); - else - this.relative.push(m); - if (children) { - if (absolute) - this.absoluteChildren.push(m); - else - this.relativeChildren.push(m); - } - } - } - ignored(p) { - const fullpath = p.fullpath(); - const fullpaths = `${fullpath}/`; - const relative = p.relative() || '.'; - const relatives = `${relative}/`; - for (const m of this.relative) { - if (m.match(relative) || m.match(relatives)) - return true; - } - for (const m of this.absolute) { - if (m.match(fullpath) || m.match(fullpaths)) - return true; - } - return false; - } - childrenIgnored(p) { - const fullpath = p.fullpath() + '/'; - const relative = (p.relative() || '.') + '/'; - for (const m of this.relativeChildren) { - if (m.match(relative)) - return true; - } - for (const m of this.absoluteChildren) { - if (m.match(fullpath)) - return true; - } - return false; - } -} -exports.Ignore = Ignore; -//# sourceMappingURL=ignore.js.map \ No newline at end of file diff --git a/node_modules/glob/dist/commonjs/ignore.js.map b/node_modules/glob/dist/commonjs/ignore.js.map deleted file mode 100644 index d9dfdfa..0000000 --- a/node_modules/glob/dist/commonjs/ignore.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ignore.js","sourceRoot":"","sources":["../../src/ignore.ts"],"names":[],"mappings":";AAAA,sDAAsD;AACtD,kCAAkC;AAClC,kEAAkE;AAClE,6CAA6C;;;AAE7C,yCAAuD;AAEvD,6CAAsC;AAStC,MAAM,eAAe,GACnB,CACE,OAAO,OAAO,KAAK,QAAQ;IAC3B,OAAO;IACP,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CACrC,CAAC,CAAC;IACD,OAAO,CAAC,QAAQ;IAClB,CAAC,CAAC,OAAO,CAAA;AAEX;;GAEG;AACH,MAAa,MAAM;IACjB,QAAQ,CAAa;IACrB,gBAAgB,CAAa;IAC7B,QAAQ,CAAa;IACrB,gBAAgB,CAAa;IAC7B,QAAQ,CAAiB;IACzB,MAAM,CAAkB;IAExB,YACE,OAAiB,EACjB,EACE,OAAO,EACP,MAAM,EACN,KAAK,EACL,UAAU,EACV,QAAQ,GAAG,eAAe,GACX;QAEjB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;QAClB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;QAClB,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAA;QAC1B,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAA;QAC1B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,MAAM,GAAG;YACZ,GAAG,EAAE,IAAI;YACT,OAAO;YACP,MAAM;YACN,KAAK;YACL,UAAU;YACV,iBAAiB,EAAE,CAAC;YACpB,QAAQ;YACR,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,IAAI;SACf,CAAA;QACD,KAAK,MAAM,GAAG,IAAI,OAAO;YAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC1C,CAAC;IAED,GAAG,CAAC,GAAW;QACb,mEAAmE;QACnE,gEAAgE;QAChE,mEAAmE;QACnE,uCAAuC;QACvC,mEAAmE;QACnE,qEAAqE;QACrE,uBAAuB;QACvB,uEAAuE;QACvE,oEAAoE;QACpE,qBAAqB;QACrB,sEAAsE;QACtE,wCAAwC;QACxC,MAAM,EAAE,GAAG,IAAI,qBAAS,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACxB,MAAM,SAAS,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YACjC,qBAAqB;YACrB,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;YAC3C,CAAC;YACD,gCAAgC;YAChC,iDAAiD;YACjD,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACjD,MAAM,CAAC,KAAK,EAAE,CAAA;gBACd,SAAS,CAAC,KAAK,EAAE,CAAA;YACnB,CAAC;YACD,oBAAoB;YACpB,MAAM,CAAC,GAAG,IAAI,oBAAO,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC1D,MAAM,CAAC,GAAG,IAAI,qBAAS,CAAC,CAAC,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;YACpD,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,CAAA;YACzD,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,EAAE,CAAA;YAC/B,IAAI,QAAQ;gBAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;;gBAC9B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAC1B,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,QAAQ;oBAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;;oBACtC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACpC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,CAAO;QACb,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC7B,MAAM,SAAS,GAAG,GAAG,QAAQ,GAAG,CAAA;QAChC,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAA;QACpC,MAAM,SAAS,GAAG,GAAG,QAAQ,GAAG,CAAA;QAChC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;gBAAE,OAAO,IAAI,CAAA;QAC1D,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;gBAAE,OAAO,IAAI,CAAA;QAC1D,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,eAAe,CAAC,CAAO;QACrB,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAA;QACnC,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,GAAG,GAAG,CAAA;QAC5C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtC,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAAE,OAAO,IAAI,CAAA;QACpC,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtC,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAAE,OAAO,IAAI,CAAA;QACpC,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;CACF;AAvGD,wBAuGC","sourcesContent":["// give it a pattern, and it'll be able to tell you if\n// a given path should be ignored.\n// Ignoring a path ignores its children if the pattern ends in /**\n// Ignores are always parsed in dot:true mode\n\nimport { Minimatch, MinimatchOptions } from 'minimatch'\nimport { Path } from 'path-scurry'\nimport { Pattern } from './pattern.js'\nimport { GlobWalkerOpts } from './walker.js'\n\nexport interface IgnoreLike {\n ignored?: (p: Path) => boolean\n childrenIgnored?: (p: Path) => boolean\n add?: (ignore: string) => void\n}\n\nconst defaultPlatform: NodeJS.Platform =\n (\n typeof process === 'object' &&\n process &&\n typeof process.platform === 'string'\n ) ?\n process.platform\n : 'linux'\n\n/**\n * Class used to process ignored patterns\n */\nexport class Ignore implements IgnoreLike {\n relative: Minimatch[]\n relativeChildren: Minimatch[]\n absolute: Minimatch[]\n absoluteChildren: Minimatch[]\n platform: NodeJS.Platform\n mmopts: MinimatchOptions\n\n constructor(\n ignored: string[],\n {\n nobrace,\n nocase,\n noext,\n noglobstar,\n platform = defaultPlatform,\n }: GlobWalkerOpts,\n ) {\n this.relative = []\n this.absolute = []\n this.relativeChildren = []\n this.absoluteChildren = []\n this.platform = platform\n this.mmopts = {\n dot: true,\n nobrace,\n nocase,\n noext,\n noglobstar,\n optimizationLevel: 2,\n platform,\n nocomment: true,\n nonegate: true,\n }\n for (const ign of ignored) this.add(ign)\n }\n\n add(ign: string) {\n // this is a little weird, but it gives us a clean set of optimized\n // minimatch matchers, without getting tripped up if one of them\n // ends in /** inside a brace section, and it's only inefficient at\n // the start of the walk, not along it.\n // It'd be nice if the Pattern class just had a .test() method, but\n // handling globstars is a bit of a pita, and that code already lives\n // in minimatch anyway.\n // Another way would be if maybe Minimatch could take its set/globParts\n // as an option, and then we could at least just use Pattern to test\n // for absolute-ness.\n // Yet another way, Minimatch could take an array of glob strings, and\n // a cwd option, and do the right thing.\n const mm = new Minimatch(ign, this.mmopts)\n for (let i = 0; i < mm.set.length; i++) {\n const parsed = mm.set[i]\n const globParts = mm.globParts[i]\n /* c8 ignore start */\n if (!parsed || !globParts) {\n throw new Error('invalid pattern object')\n }\n // strip off leading ./ portions\n // https://github.com/isaacs/node-glob/issues/570\n while (parsed[0] === '.' && globParts[0] === '.') {\n parsed.shift()\n globParts.shift()\n }\n /* c8 ignore stop */\n const p = new Pattern(parsed, globParts, 0, this.platform)\n const m = new Minimatch(p.globString(), this.mmopts)\n const children = globParts[globParts.length - 1] === '**'\n const absolute = p.isAbsolute()\n if (absolute) this.absolute.push(m)\n else this.relative.push(m)\n if (children) {\n if (absolute) this.absoluteChildren.push(m)\n else this.relativeChildren.push(m)\n }\n }\n }\n\n ignored(p: Path): boolean {\n const fullpath = p.fullpath()\n const fullpaths = `${fullpath}/`\n const relative = p.relative() || '.'\n const relatives = `${relative}/`\n for (const m of this.relative) {\n if (m.match(relative) || m.match(relatives)) return true\n }\n for (const m of this.absolute) {\n if (m.match(fullpath) || m.match(fullpaths)) return true\n }\n return false\n }\n\n childrenIgnored(p: Path): boolean {\n const fullpath = p.fullpath() + '/'\n const relative = (p.relative() || '.') + '/'\n for (const m of this.relativeChildren) {\n if (m.match(relative)) return true\n }\n for (const m of this.absoluteChildren) {\n if (m.match(fullpath)) return true\n }\n return false\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/glob/dist/commonjs/index.d.ts b/node_modules/glob/dist/commonjs/index.d.ts deleted file mode 100644 index 9c326dd..0000000 --- a/node_modules/glob/dist/commonjs/index.d.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { Minipass } from 'minipass'; -import { Path } from 'path-scurry'; -import type { GlobOptions, GlobOptionsWithFileTypesFalse, GlobOptionsWithFileTypesTrue, GlobOptionsWithFileTypesUnset } from './glob.js'; -import { Glob } from './glob.js'; -export { escape, unescape } from 'minimatch'; -export type { FSOption, Path, WalkOptions, WalkOptionsWithFileTypesTrue, WalkOptionsWithFileTypesUnset, } from 'path-scurry'; -export { Glob } from './glob.js'; -export type { GlobOptions, GlobOptionsWithFileTypesFalse, GlobOptionsWithFileTypesTrue, GlobOptionsWithFileTypesUnset, } from './glob.js'; -export { hasMagic } from './has-magic.js'; -export { Ignore } from './ignore.js'; -export type { IgnoreLike } from './ignore.js'; -export type { MatchStream } from './walker.js'; -/** - * Syncronous form of {@link globStream}. Will read all the matches as fast as - * you consume them, even all in a single tick if you consume them immediately, - * but will still respond to backpressure if they're not consumed immediately. - */ -export declare function globStreamSync(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Minipass; -export declare function globStreamSync(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): Minipass; -export declare function globStreamSync(pattern: string | string[], options: GlobOptionsWithFileTypesUnset): Minipass; -export declare function globStreamSync(pattern: string | string[], options: GlobOptions): Minipass | Minipass; -/** - * Return a stream that emits all the strings or `Path` objects and - * then emits `end` when completed. - */ -export declare function globStream(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): Minipass; -export declare function globStream(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Minipass; -export declare function globStream(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): Minipass; -export declare function globStream(pattern: string | string[], options: GlobOptions): Minipass | Minipass; -/** - * Synchronous form of {@link glob} - */ -export declare function globSync(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): string[]; -export declare function globSync(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Path[]; -export declare function globSync(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): string[]; -export declare function globSync(pattern: string | string[], options: GlobOptions): Path[] | string[]; -/** - * Perform an asynchronous glob search for the pattern(s) specified. Returns - * [Path](https://isaacs.github.io/path-scurry/classes/PathBase) objects if the - * {@link withFileTypes} option is set to `true`. See {@link GlobOptions} for - * full option descriptions. - */ -declare function glob_(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): Promise; -declare function glob_(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Promise; -declare function glob_(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): Promise; -declare function glob_(pattern: string | string[], options: GlobOptions): Promise; -/** - * Return a sync iterator for walking glob pattern matches. - */ -export declare function globIterateSync(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): Generator; -export declare function globIterateSync(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Generator; -export declare function globIterateSync(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): Generator; -export declare function globIterateSync(pattern: string | string[], options: GlobOptions): Generator | Generator; -/** - * Return an async iterator for walking glob pattern matches. - */ -export declare function globIterate(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): AsyncGenerator; -export declare function globIterate(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): AsyncGenerator; -export declare function globIterate(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): AsyncGenerator; -export declare function globIterate(pattern: string | string[], options: GlobOptions): AsyncGenerator | AsyncGenerator; -export declare const streamSync: typeof globStreamSync; -export declare const stream: typeof globStream & { - sync: typeof globStreamSync; -}; -export declare const iterateSync: typeof globIterateSync; -export declare const iterate: typeof globIterate & { - sync: typeof globIterateSync; -}; -export declare const sync: typeof globSync & { - stream: typeof globStreamSync; - iterate: typeof globIterateSync; -}; -export declare const glob: typeof glob_ & { - glob: typeof glob_; - globSync: typeof globSync; - sync: typeof globSync & { - stream: typeof globStreamSync; - iterate: typeof globIterateSync; - }; - globStream: typeof globStream; - stream: typeof globStream & { - sync: typeof globStreamSync; - }; - globStreamSync: typeof globStreamSync; - streamSync: typeof globStreamSync; - globIterate: typeof globIterate; - iterate: typeof globIterate & { - sync: typeof globIterateSync; - }; - globIterateSync: typeof globIterateSync; - iterateSync: typeof globIterateSync; - Glob: typeof Glob; - hasMagic: (pattern: string | string[], options?: GlobOptions) => boolean; - escape: (s: string, { windowsPathsNoEscape, }?: Pick) => string; - unescape: (s: string, { windowsPathsNoEscape, }?: Pick) => string; -}; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/glob/dist/commonjs/index.d.ts.map b/node_modules/glob/dist/commonjs/index.d.ts.map deleted file mode 100644 index 5fb3225..0000000 --- a/node_modules/glob/dist/commonjs/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/glob/dist/commonjs/index.js b/node_modules/glob/dist/commonjs/index.js deleted file mode 100644 index 151495d..0000000 --- a/node_modules/glob/dist/commonjs/index.js +++ /dev/null @@ -1,68 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.glob = exports.sync = exports.iterate = exports.iterateSync = exports.stream = exports.streamSync = exports.Ignore = exports.hasMagic = exports.Glob = exports.unescape = exports.escape = void 0; -exports.globStreamSync = globStreamSync; -exports.globStream = globStream; -exports.globSync = globSync; -exports.globIterateSync = globIterateSync; -exports.globIterate = globIterate; -const minimatch_1 = require("minimatch"); -const glob_js_1 = require("./glob.js"); -const has_magic_js_1 = require("./has-magic.js"); -var minimatch_2 = require("minimatch"); -Object.defineProperty(exports, "escape", { enumerable: true, get: function () { return minimatch_2.escape; } }); -Object.defineProperty(exports, "unescape", { enumerable: true, get: function () { return minimatch_2.unescape; } }); -var glob_js_2 = require("./glob.js"); -Object.defineProperty(exports, "Glob", { enumerable: true, get: function () { return glob_js_2.Glob; } }); -var has_magic_js_2 = require("./has-magic.js"); -Object.defineProperty(exports, "hasMagic", { enumerable: true, get: function () { return has_magic_js_2.hasMagic; } }); -var ignore_js_1 = require("./ignore.js"); -Object.defineProperty(exports, "Ignore", { enumerable: true, get: function () { return ignore_js_1.Ignore; } }); -function globStreamSync(pattern, options = {}) { - return new glob_js_1.Glob(pattern, options).streamSync(); -} -function globStream(pattern, options = {}) { - return new glob_js_1.Glob(pattern, options).stream(); -} -function globSync(pattern, options = {}) { - return new glob_js_1.Glob(pattern, options).walkSync(); -} -async function glob_(pattern, options = {}) { - return new glob_js_1.Glob(pattern, options).walk(); -} -function globIterateSync(pattern, options = {}) { - return new glob_js_1.Glob(pattern, options).iterateSync(); -} -function globIterate(pattern, options = {}) { - return new glob_js_1.Glob(pattern, options).iterate(); -} -// aliases: glob.sync.stream() glob.stream.sync() glob.sync() etc -exports.streamSync = globStreamSync; -exports.stream = Object.assign(globStream, { sync: globStreamSync }); -exports.iterateSync = globIterateSync; -exports.iterate = Object.assign(globIterate, { - sync: globIterateSync, -}); -exports.sync = Object.assign(globSync, { - stream: globStreamSync, - iterate: globIterateSync, -}); -exports.glob = Object.assign(glob_, { - glob: glob_, - globSync, - sync: exports.sync, - globStream, - stream: exports.stream, - globStreamSync, - streamSync: exports.streamSync, - globIterate, - iterate: exports.iterate, - globIterateSync, - iterateSync: exports.iterateSync, - Glob: glob_js_1.Glob, - hasMagic: has_magic_js_1.hasMagic, - escape: minimatch_1.escape, - unescape: minimatch_1.unescape, -}); -exports.glob.glob = exports.glob; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/glob/dist/commonjs/index.js.map b/node_modules/glob/dist/commonjs/index.js.map deleted file mode 100644 index e648b1d..0000000 --- a/node_modules/glob/dist/commonjs/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAqDA,wCAKC;AAsBD,gCAKC;AAqBD,4BAKC;AAkDD,0CAKC;AAqBD,kCAKC;AAhMD,yCAA4C;AAS5C,uCAAgC;AAChC,iDAAyC;AAEzC,uCAA4C;AAAnC,mGAAA,MAAM,OAAA;AAAE,qGAAA,QAAQ,OAAA;AAQzB,qCAAgC;AAAvB,+FAAA,IAAI,OAAA;AAOb,+CAAyC;AAAhC,wGAAA,QAAQ,OAAA;AACjB,yCAAoC;AAA3B,mGAAA,MAAM,OAAA;AAyBf,SAAgB,cAAc,CAC5B,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,cAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,UAAU,EAAE,CAAA;AAChD,CAAC;AAsBD,SAAgB,UAAU,CACxB,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,cAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,EAAE,CAAA;AAC5C,CAAC;AAqBD,SAAgB,QAAQ,CACtB,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,cAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAA;AAC9C,CAAC;AAwBD,KAAK,UAAU,KAAK,CAClB,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,cAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;AAC1C,CAAC;AAqBD,SAAgB,eAAe,CAC7B,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,cAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAA;AACjD,CAAC;AAqBD,SAAgB,WAAW,CACzB,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,cAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,OAAO,EAAE,CAAA;AAC7C,CAAC;AAED,iEAAiE;AACpD,QAAA,UAAU,GAAG,cAAc,CAAA;AAC3B,QAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAA;AAC5D,QAAA,WAAW,GAAG,eAAe,CAAA;AAC7B,QAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE;IAChD,IAAI,EAAE,eAAe;CACtB,CAAC,CAAA;AACW,QAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE;IAC1C,MAAM,EAAE,cAAc;IACtB,OAAO,EAAE,eAAe;CACzB,CAAC,CAAA;AAEW,QAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;IACvC,IAAI,EAAE,KAAK;IACX,QAAQ;IACR,IAAI,EAAJ,YAAI;IACJ,UAAU;IACV,MAAM,EAAN,cAAM;IACN,cAAc;IACd,UAAU,EAAV,kBAAU;IACV,WAAW;IACX,OAAO,EAAP,eAAO;IACP,eAAe;IACf,WAAW,EAAX,mBAAW;IACX,IAAI,EAAJ,cAAI;IACJ,QAAQ,EAAR,uBAAQ;IACR,MAAM,EAAN,kBAAM;IACN,QAAQ,EAAR,oBAAQ;CACT,CAAC,CAAA;AACF,YAAI,CAAC,IAAI,GAAG,YAAI,CAAA","sourcesContent":["import { escape, unescape } from 'minimatch'\nimport { Minipass } from 'minipass'\nimport { Path } from 'path-scurry'\nimport type {\n GlobOptions,\n GlobOptionsWithFileTypesFalse,\n GlobOptionsWithFileTypesTrue,\n GlobOptionsWithFileTypesUnset,\n} from './glob.js'\nimport { Glob } from './glob.js'\nimport { hasMagic } from './has-magic.js'\n\nexport { escape, unescape } from 'minimatch'\nexport type {\n FSOption,\n Path,\n WalkOptions,\n WalkOptionsWithFileTypesTrue,\n WalkOptionsWithFileTypesUnset,\n} from 'path-scurry'\nexport { Glob } from './glob.js'\nexport type {\n GlobOptions,\n GlobOptionsWithFileTypesFalse,\n GlobOptionsWithFileTypesTrue,\n GlobOptionsWithFileTypesUnset,\n} from './glob.js'\nexport { hasMagic } from './has-magic.js'\nexport { Ignore } from './ignore.js'\nexport type { IgnoreLike } from './ignore.js'\nexport type { MatchStream } from './walker.js'\n\n/**\n * Syncronous form of {@link globStream}. Will read all the matches as fast as\n * you consume them, even all in a single tick if you consume them immediately,\n * but will still respond to backpressure if they're not consumed immediately.\n */\nexport function globStreamSync(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesTrue,\n): Minipass\nexport function globStreamSync(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesFalse,\n): Minipass\nexport function globStreamSync(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesUnset,\n): Minipass\nexport function globStreamSync(\n pattern: string | string[],\n options: GlobOptions,\n): Minipass | Minipass\nexport function globStreamSync(\n pattern: string | string[],\n options: GlobOptions = {},\n) {\n return new Glob(pattern, options).streamSync()\n}\n\n/**\n * Return a stream that emits all the strings or `Path` objects and\n * then emits `end` when completed.\n */\nexport function globStream(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesFalse,\n): Minipass\nexport function globStream(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesTrue,\n): Minipass\nexport function globStream(\n pattern: string | string[],\n options?: GlobOptionsWithFileTypesUnset | undefined,\n): Minipass\nexport function globStream(\n pattern: string | string[],\n options: GlobOptions,\n): Minipass | Minipass\nexport function globStream(\n pattern: string | string[],\n options: GlobOptions = {},\n) {\n return new Glob(pattern, options).stream()\n}\n\n/**\n * Synchronous form of {@link glob}\n */\nexport function globSync(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesFalse,\n): string[]\nexport function globSync(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesTrue,\n): Path[]\nexport function globSync(\n pattern: string | string[],\n options?: GlobOptionsWithFileTypesUnset | undefined,\n): string[]\nexport function globSync(\n pattern: string | string[],\n options: GlobOptions,\n): Path[] | string[]\nexport function globSync(\n pattern: string | string[],\n options: GlobOptions = {},\n) {\n return new Glob(pattern, options).walkSync()\n}\n\n/**\n * Perform an asynchronous glob search for the pattern(s) specified. Returns\n * [Path](https://isaacs.github.io/path-scurry/classes/PathBase) objects if the\n * {@link withFileTypes} option is set to `true`. See {@link GlobOptions} for\n * full option descriptions.\n */\nasync function glob_(\n pattern: string | string[],\n options?: GlobOptionsWithFileTypesUnset | undefined,\n): Promise\nasync function glob_(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesTrue,\n): Promise\nasync function glob_(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesFalse,\n): Promise\nasync function glob_(\n pattern: string | string[],\n options: GlobOptions,\n): Promise\nasync function glob_(\n pattern: string | string[],\n options: GlobOptions = {},\n) {\n return new Glob(pattern, options).walk()\n}\n\n/**\n * Return a sync iterator for walking glob pattern matches.\n */\nexport function globIterateSync(\n pattern: string | string[],\n options?: GlobOptionsWithFileTypesUnset | undefined,\n): Generator\nexport function globIterateSync(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesTrue,\n): Generator\nexport function globIterateSync(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesFalse,\n): Generator\nexport function globIterateSync(\n pattern: string | string[],\n options: GlobOptions,\n): Generator | Generator\nexport function globIterateSync(\n pattern: string | string[],\n options: GlobOptions = {},\n) {\n return new Glob(pattern, options).iterateSync()\n}\n\n/**\n * Return an async iterator for walking glob pattern matches.\n */\nexport function globIterate(\n pattern: string | string[],\n options?: GlobOptionsWithFileTypesUnset | undefined,\n): AsyncGenerator\nexport function globIterate(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesTrue,\n): AsyncGenerator\nexport function globIterate(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesFalse,\n): AsyncGenerator\nexport function globIterate(\n pattern: string | string[],\n options: GlobOptions,\n): AsyncGenerator | AsyncGenerator\nexport function globIterate(\n pattern: string | string[],\n options: GlobOptions = {},\n) {\n return new Glob(pattern, options).iterate()\n}\n\n// aliases: glob.sync.stream() glob.stream.sync() glob.sync() etc\nexport const streamSync = globStreamSync\nexport const stream = Object.assign(globStream, { sync: globStreamSync })\nexport const iterateSync = globIterateSync\nexport const iterate = Object.assign(globIterate, {\n sync: globIterateSync,\n})\nexport const sync = Object.assign(globSync, {\n stream: globStreamSync,\n iterate: globIterateSync,\n})\n\nexport const glob = Object.assign(glob_, {\n glob: glob_,\n globSync,\n sync,\n globStream,\n stream,\n globStreamSync,\n streamSync,\n globIterate,\n iterate,\n globIterateSync,\n iterateSync,\n Glob,\n hasMagic,\n escape,\n unescape,\n})\nglob.glob = glob\n"]} \ No newline at end of file diff --git a/node_modules/glob/dist/commonjs/package.json b/node_modules/glob/dist/commonjs/package.json deleted file mode 100644 index 5bbefff..0000000 --- a/node_modules/glob/dist/commonjs/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "commonjs" -} diff --git a/node_modules/glob/dist/commonjs/pattern.d.ts b/node_modules/glob/dist/commonjs/pattern.d.ts deleted file mode 100644 index 9636df3..0000000 --- a/node_modules/glob/dist/commonjs/pattern.d.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { GLOBSTAR } from 'minimatch'; -export type MMPattern = string | RegExp | typeof GLOBSTAR; -export type PatternList = [p: MMPattern, ...rest: MMPattern[]]; -export type UNCPatternList = [ - p0: '', - p1: '', - p2: string, - p3: string, - ...rest: MMPattern[] -]; -export type DrivePatternList = [p0: string, ...rest: MMPattern[]]; -export type AbsolutePatternList = [p0: '', ...rest: MMPattern[]]; -export type GlobList = [p: string, ...rest: string[]]; -/** - * An immutable-ish view on an array of glob parts and their parsed - * results - */ -export declare class Pattern { - #private; - readonly length: number; - constructor(patternList: MMPattern[], globList: string[], index: number, platform: NodeJS.Platform); - /** - * The first entry in the parsed list of patterns - */ - pattern(): MMPattern; - /** - * true of if pattern() returns a string - */ - isString(): boolean; - /** - * true of if pattern() returns GLOBSTAR - */ - isGlobstar(): boolean; - /** - * true if pattern() returns a regexp - */ - isRegExp(): boolean; - /** - * The /-joined set of glob parts that make up this pattern - */ - globString(): string; - /** - * true if there are more pattern parts after this one - */ - hasMore(): boolean; - /** - * The rest of the pattern after this part, or null if this is the end - */ - rest(): Pattern | null; - /** - * true if the pattern represents a //unc/path/ on windows - */ - isUNC(): boolean; - /** - * True if the pattern starts with a drive letter on Windows - */ - isDrive(): boolean; - /** - * True if the pattern is rooted on an absolute path - */ - isAbsolute(): boolean; - /** - * consume the root of the pattern, and return it - */ - root(): string; - /** - * Check to see if the current globstar pattern is allowed to follow - * a symbolic link. - */ - checkFollowGlobstar(): boolean; - /** - * Mark that the current globstar pattern is following a symbolic link - */ - markFollowGlobstar(): boolean; -} -//# sourceMappingURL=pattern.d.ts.map \ No newline at end of file diff --git a/node_modules/glob/dist/commonjs/pattern.d.ts.map b/node_modules/glob/dist/commonjs/pattern.d.ts.map deleted file mode 100644 index cdf3223..0000000 --- a/node_modules/glob/dist/commonjs/pattern.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"pattern.d.ts","sourceRoot":"","sources":["../../src/pattern.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,QAAQ,CAAA;AAGzD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;AAC9D,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,MAAM;IACV,GAAG,IAAI,EAAE,SAAS,EAAE;CACrB,CAAA;AACD,MAAM,MAAM,gBAAgB,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;AACjE,MAAM,MAAM,mBAAmB,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;AAChE,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;AAMrD;;;GAGG;AACH,qBAAa,OAAO;;IAIlB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;gBAUrB,WAAW,EAAE,SAAS,EAAE,EACxB,QAAQ,EAAE,MAAM,EAAE,EAClB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,CAAC,QAAQ;IA6D3B;;OAEG;IACH,OAAO,IAAI,SAAS;IAIpB;;OAEG;IACH,QAAQ,IAAI,OAAO;IAGnB;;OAEG;IACH,UAAU,IAAI,OAAO;IAGrB;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;OAEG;IACH,UAAU,IAAI,MAAM;IAUpB;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,IAAI,IAAI,OAAO,GAAG,IAAI;IAetB;;OAEG;IACH,KAAK,IAAI,OAAO;IAoBhB;;OAEG;IACH,OAAO,IAAI,OAAO;IAelB;;OAEG;IACH,UAAU,IAAI,OAAO;IAUrB;;OAEG;IACH,IAAI,IAAI,MAAM;IASd;;;OAGG;IACH,mBAAmB,IAAI,OAAO;IAQ9B;;OAEG;IACH,kBAAkB,IAAI,OAAO;CAM9B"} \ No newline at end of file diff --git a/node_modules/glob/dist/commonjs/pattern.js b/node_modules/glob/dist/commonjs/pattern.js deleted file mode 100644 index f0de35f..0000000 --- a/node_modules/glob/dist/commonjs/pattern.js +++ /dev/null @@ -1,219 +0,0 @@ -"use strict"; -// this is just a very light wrapper around 2 arrays with an offset index -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Pattern = void 0; -const minimatch_1 = require("minimatch"); -const isPatternList = (pl) => pl.length >= 1; -const isGlobList = (gl) => gl.length >= 1; -/** - * An immutable-ish view on an array of glob parts and their parsed - * results - */ -class Pattern { - #patternList; - #globList; - #index; - length; - #platform; - #rest; - #globString; - #isDrive; - #isUNC; - #isAbsolute; - #followGlobstar = true; - constructor(patternList, globList, index, platform) { - if (!isPatternList(patternList)) { - throw new TypeError('empty pattern list'); - } - if (!isGlobList(globList)) { - throw new TypeError('empty glob list'); - } - if (globList.length !== patternList.length) { - throw new TypeError('mismatched pattern list and glob list lengths'); - } - this.length = patternList.length; - if (index < 0 || index >= this.length) { - throw new TypeError('index out of range'); - } - this.#patternList = patternList; - this.#globList = globList; - this.#index = index; - this.#platform = platform; - // normalize root entries of absolute patterns on initial creation. - if (this.#index === 0) { - // c: => ['c:/'] - // C:/ => ['C:/'] - // C:/x => ['C:/', 'x'] - // //host/share => ['//host/share/'] - // //host/share/ => ['//host/share/'] - // //host/share/x => ['//host/share/', 'x'] - // /etc => ['/', 'etc'] - // / => ['/'] - if (this.isUNC()) { - // '' / '' / 'host' / 'share' - const [p0, p1, p2, p3, ...prest] = this.#patternList; - const [g0, g1, g2, g3, ...grest] = this.#globList; - if (prest[0] === '') { - // ends in / - prest.shift(); - grest.shift(); - } - const p = [p0, p1, p2, p3, ''].join('/'); - const g = [g0, g1, g2, g3, ''].join('/'); - this.#patternList = [p, ...prest]; - this.#globList = [g, ...grest]; - this.length = this.#patternList.length; - } - else if (this.isDrive() || this.isAbsolute()) { - const [p1, ...prest] = this.#patternList; - const [g1, ...grest] = this.#globList; - if (prest[0] === '') { - // ends in / - prest.shift(); - grest.shift(); - } - const p = p1 + '/'; - const g = g1 + '/'; - this.#patternList = [p, ...prest]; - this.#globList = [g, ...grest]; - this.length = this.#patternList.length; - } - } - } - /** - * The first entry in the parsed list of patterns - */ - pattern() { - return this.#patternList[this.#index]; - } - /** - * true of if pattern() returns a string - */ - isString() { - return typeof this.#patternList[this.#index] === 'string'; - } - /** - * true of if pattern() returns GLOBSTAR - */ - isGlobstar() { - return this.#patternList[this.#index] === minimatch_1.GLOBSTAR; - } - /** - * true if pattern() returns a regexp - */ - isRegExp() { - return this.#patternList[this.#index] instanceof RegExp; - } - /** - * The /-joined set of glob parts that make up this pattern - */ - globString() { - return (this.#globString = - this.#globString || - (this.#index === 0 ? - this.isAbsolute() ? - this.#globList[0] + this.#globList.slice(1).join('/') - : this.#globList.join('/') - : this.#globList.slice(this.#index).join('/'))); - } - /** - * true if there are more pattern parts after this one - */ - hasMore() { - return this.length > this.#index + 1; - } - /** - * The rest of the pattern after this part, or null if this is the end - */ - rest() { - if (this.#rest !== undefined) - return this.#rest; - if (!this.hasMore()) - return (this.#rest = null); - this.#rest = new Pattern(this.#patternList, this.#globList, this.#index + 1, this.#platform); - this.#rest.#isAbsolute = this.#isAbsolute; - this.#rest.#isUNC = this.#isUNC; - this.#rest.#isDrive = this.#isDrive; - return this.#rest; - } - /** - * true if the pattern represents a //unc/path/ on windows - */ - isUNC() { - const pl = this.#patternList; - return this.#isUNC !== undefined ? - this.#isUNC - : (this.#isUNC = - this.#platform === 'win32' && - this.#index === 0 && - pl[0] === '' && - pl[1] === '' && - typeof pl[2] === 'string' && - !!pl[2] && - typeof pl[3] === 'string' && - !!pl[3]); - } - // pattern like C:/... - // split = ['C:', ...] - // XXX: would be nice to handle patterns like `c:*` to test the cwd - // in c: for *, but I don't know of a way to even figure out what that - // cwd is without actually chdir'ing into it? - /** - * True if the pattern starts with a drive letter on Windows - */ - isDrive() { - const pl = this.#patternList; - return this.#isDrive !== undefined ? - this.#isDrive - : (this.#isDrive = - this.#platform === 'win32' && - this.#index === 0 && - this.length > 1 && - typeof pl[0] === 'string' && - /^[a-z]:$/i.test(pl[0])); - } - // pattern = '/' or '/...' or '/x/...' - // split = ['', ''] or ['', ...] or ['', 'x', ...] - // Drive and UNC both considered absolute on windows - /** - * True if the pattern is rooted on an absolute path - */ - isAbsolute() { - const pl = this.#patternList; - return this.#isAbsolute !== undefined ? - this.#isAbsolute - : (this.#isAbsolute = - (pl[0] === '' && pl.length > 1) || - this.isDrive() || - this.isUNC()); - } - /** - * consume the root of the pattern, and return it - */ - root() { - const p = this.#patternList[0]; - return (typeof p === 'string' && this.isAbsolute() && this.#index === 0) ? - p - : ''; - } - /** - * Check to see if the current globstar pattern is allowed to follow - * a symbolic link. - */ - checkFollowGlobstar() { - return !(this.#index === 0 || - !this.isGlobstar() || - !this.#followGlobstar); - } - /** - * Mark that the current globstar pattern is following a symbolic link - */ - markFollowGlobstar() { - if (this.#index === 0 || !this.isGlobstar() || !this.#followGlobstar) - return false; - this.#followGlobstar = false; - return true; - } -} -exports.Pattern = Pattern; -//# sourceMappingURL=pattern.js.map \ No newline at end of file diff --git a/node_modules/glob/dist/commonjs/pattern.js.map b/node_modules/glob/dist/commonjs/pattern.js.map deleted file mode 100644 index fc10ea5..0000000 --- a/node_modules/glob/dist/commonjs/pattern.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"pattern.js","sourceRoot":"","sources":["../../src/pattern.ts"],"names":[],"mappings":"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","sourcesContent":["// this is just a very light wrapper around 2 arrays with an offset index\n\nimport { GLOBSTAR } from 'minimatch'\nexport type MMPattern = string | RegExp | typeof GLOBSTAR\n\n// an array of length >= 1\nexport type PatternList = [p: MMPattern, ...rest: MMPattern[]]\nexport type UNCPatternList = [\n p0: '',\n p1: '',\n p2: string,\n p3: string,\n ...rest: MMPattern[],\n]\nexport type DrivePatternList = [p0: string, ...rest: MMPattern[]]\nexport type AbsolutePatternList = [p0: '', ...rest: MMPattern[]]\nexport type GlobList = [p: string, ...rest: string[]]\n\nconst isPatternList = (pl: MMPattern[]): pl is PatternList =>\n pl.length >= 1\nconst isGlobList = (gl: string[]): gl is GlobList => gl.length >= 1\n\n/**\n * An immutable-ish view on an array of glob parts and their parsed\n * results\n */\nexport class Pattern {\n readonly #patternList: PatternList\n readonly #globList: GlobList\n readonly #index: number\n readonly length: number\n readonly #platform: NodeJS.Platform\n #rest?: Pattern | null\n #globString?: string\n #isDrive?: boolean\n #isUNC?: boolean\n #isAbsolute?: boolean\n #followGlobstar: boolean = true\n\n constructor(\n patternList: MMPattern[],\n globList: string[],\n index: number,\n platform: NodeJS.Platform,\n ) {\n if (!isPatternList(patternList)) {\n throw new TypeError('empty pattern list')\n }\n if (!isGlobList(globList)) {\n throw new TypeError('empty glob list')\n }\n if (globList.length !== patternList.length) {\n throw new TypeError('mismatched pattern list and glob list lengths')\n }\n this.length = patternList.length\n if (index < 0 || index >= this.length) {\n throw new TypeError('index out of range')\n }\n this.#patternList = patternList\n this.#globList = globList\n this.#index = index\n this.#platform = platform\n\n // normalize root entries of absolute patterns on initial creation.\n if (this.#index === 0) {\n // c: => ['c:/']\n // C:/ => ['C:/']\n // C:/x => ['C:/', 'x']\n // //host/share => ['//host/share/']\n // //host/share/ => ['//host/share/']\n // //host/share/x => ['//host/share/', 'x']\n // /etc => ['/', 'etc']\n // / => ['/']\n if (this.isUNC()) {\n // '' / '' / 'host' / 'share'\n const [p0, p1, p2, p3, ...prest] = this.#patternList\n const [g0, g1, g2, g3, ...grest] = this.#globList\n if (prest[0] === '') {\n // ends in /\n prest.shift()\n grest.shift()\n }\n const p = [p0, p1, p2, p3, ''].join('/')\n const g = [g0, g1, g2, g3, ''].join('/')\n this.#patternList = [p, ...prest]\n this.#globList = [g, ...grest]\n this.length = this.#patternList.length\n } else if (this.isDrive() || this.isAbsolute()) {\n const [p1, ...prest] = this.#patternList\n const [g1, ...grest] = this.#globList\n if (prest[0] === '') {\n // ends in /\n prest.shift()\n grest.shift()\n }\n const p = (p1 as string) + '/'\n const g = g1 + '/'\n this.#patternList = [p, ...prest]\n this.#globList = [g, ...grest]\n this.length = this.#patternList.length\n }\n }\n }\n\n /**\n * The first entry in the parsed list of patterns\n */\n pattern(): MMPattern {\n return this.#patternList[this.#index] as MMPattern\n }\n\n /**\n * true of if pattern() returns a string\n */\n isString(): boolean {\n return typeof this.#patternList[this.#index] === 'string'\n }\n /**\n * true of if pattern() returns GLOBSTAR\n */\n isGlobstar(): boolean {\n return this.#patternList[this.#index] === GLOBSTAR\n }\n /**\n * true if pattern() returns a regexp\n */\n isRegExp(): boolean {\n return this.#patternList[this.#index] instanceof RegExp\n }\n\n /**\n * The /-joined set of glob parts that make up this pattern\n */\n globString(): string {\n return (this.#globString =\n this.#globString ||\n (this.#index === 0 ?\n this.isAbsolute() ?\n this.#globList[0] + this.#globList.slice(1).join('/')\n : this.#globList.join('/')\n : this.#globList.slice(this.#index).join('/')))\n }\n\n /**\n * true if there are more pattern parts after this one\n */\n hasMore(): boolean {\n return this.length > this.#index + 1\n }\n\n /**\n * The rest of the pattern after this part, or null if this is the end\n */\n rest(): Pattern | null {\n if (this.#rest !== undefined) return this.#rest\n if (!this.hasMore()) return (this.#rest = null)\n this.#rest = new Pattern(\n this.#patternList,\n this.#globList,\n this.#index + 1,\n this.#platform,\n )\n this.#rest.#isAbsolute = this.#isAbsolute\n this.#rest.#isUNC = this.#isUNC\n this.#rest.#isDrive = this.#isDrive\n return this.#rest\n }\n\n /**\n * true if the pattern represents a //unc/path/ on windows\n */\n isUNC(): boolean {\n const pl = this.#patternList\n return this.#isUNC !== undefined ?\n this.#isUNC\n : (this.#isUNC =\n this.#platform === 'win32' &&\n this.#index === 0 &&\n pl[0] === '' &&\n pl[1] === '' &&\n typeof pl[2] === 'string' &&\n !!pl[2] &&\n typeof pl[3] === 'string' &&\n !!pl[3])\n }\n\n // pattern like C:/...\n // split = ['C:', ...]\n // XXX: would be nice to handle patterns like `c:*` to test the cwd\n // in c: for *, but I don't know of a way to even figure out what that\n // cwd is without actually chdir'ing into it?\n /**\n * True if the pattern starts with a drive letter on Windows\n */\n isDrive(): boolean {\n const pl = this.#patternList\n return this.#isDrive !== undefined ?\n this.#isDrive\n : (this.#isDrive =\n this.#platform === 'win32' &&\n this.#index === 0 &&\n this.length > 1 &&\n typeof pl[0] === 'string' &&\n /^[a-z]:$/i.test(pl[0]))\n }\n\n // pattern = '/' or '/...' or '/x/...'\n // split = ['', ''] or ['', ...] or ['', 'x', ...]\n // Drive and UNC both considered absolute on windows\n /**\n * True if the pattern is rooted on an absolute path\n */\n isAbsolute(): boolean {\n const pl = this.#patternList\n return this.#isAbsolute !== undefined ?\n this.#isAbsolute\n : (this.#isAbsolute =\n (pl[0] === '' && pl.length > 1) ||\n this.isDrive() ||\n this.isUNC())\n }\n\n /**\n * consume the root of the pattern, and return it\n */\n root(): string {\n const p = this.#patternList[0]\n return (\n typeof p === 'string' && this.isAbsolute() && this.#index === 0\n ) ?\n p\n : ''\n }\n\n /**\n * Check to see if the current globstar pattern is allowed to follow\n * a symbolic link.\n */\n checkFollowGlobstar(): boolean {\n return !(\n this.#index === 0 ||\n !this.isGlobstar() ||\n !this.#followGlobstar\n )\n }\n\n /**\n * Mark that the current globstar pattern is following a symbolic link\n */\n markFollowGlobstar(): boolean {\n if (this.#index === 0 || !this.isGlobstar() || !this.#followGlobstar)\n return false\n this.#followGlobstar = false\n return true\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/glob/dist/commonjs/processor.d.ts b/node_modules/glob/dist/commonjs/processor.d.ts deleted file mode 100644 index ccedfbf..0000000 --- a/node_modules/glob/dist/commonjs/processor.d.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { MMRegExp } from 'minimatch'; -import { Path } from 'path-scurry'; -import { Pattern } from './pattern.js'; -import { GlobWalkerOpts } from './walker.js'; -/** - * A cache of which patterns have been processed for a given Path - */ -export declare class HasWalkedCache { - store: Map>; - constructor(store?: Map>); - copy(): HasWalkedCache; - hasWalked(target: Path, pattern: Pattern): boolean | undefined; - storeWalked(target: Path, pattern: Pattern): void; -} -/** - * A record of which paths have been matched in a given walk step, - * and whether they only are considered a match if they are a directory, - * and whether their absolute or relative path should be returned. - */ -export declare class MatchRecord { - store: Map; - add(target: Path, absolute: boolean, ifDir: boolean): void; - entries(): [Path, boolean, boolean][]; -} -/** - * A collection of patterns that must be processed in a subsequent step - * for a given path. - */ -export declare class SubWalks { - store: Map; - add(target: Path, pattern: Pattern): void; - get(target: Path): Pattern[]; - entries(): [Path, Pattern[]][]; - keys(): Path[]; -} -/** - * The class that processes patterns for a given path. - * - * Handles child entry filtering, and determining whether a path's - * directory contents must be read. - */ -export declare class Processor { - hasWalkedCache: HasWalkedCache; - matches: MatchRecord; - subwalks: SubWalks; - patterns?: Pattern[]; - follow: boolean; - dot: boolean; - opts: GlobWalkerOpts; - constructor(opts: GlobWalkerOpts, hasWalkedCache?: HasWalkedCache); - processPatterns(target: Path, patterns: Pattern[]): this; - subwalkTargets(): Path[]; - child(): Processor; - filterEntries(parent: Path, entries: Path[]): Processor; - testGlobstar(e: Path, pattern: Pattern, rest: Pattern | null, absolute: boolean): void; - testRegExp(e: Path, p: MMRegExp, rest: Pattern | null, absolute: boolean): void; - testString(e: Path, p: string, rest: Pattern | null, absolute: boolean): void; -} -//# sourceMappingURL=processor.d.ts.map \ No newline at end of file diff --git a/node_modules/glob/dist/commonjs/processor.d.ts.map b/node_modules/glob/dist/commonjs/processor.d.ts.map deleted file mode 100644 index aa266fe..0000000 --- a/node_modules/glob/dist/commonjs/processor.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"processor.d.ts","sourceRoot":"","sources":["../../src/processor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAY,QAAQ,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAa,OAAO,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C;;GAEG;AACH,qBAAa,cAAc;IACzB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;gBACnB,KAAK,GAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IAGvD,IAAI;IAGJ,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO;IAGxC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO;CAM3C;AAED;;;;GAIG;AACH,qBAAa,WAAW;IACtB,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAY;IACpC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO;IAMnD,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE;CAOtC;AAED;;;GAGG;AACH,qBAAa,QAAQ;IACnB,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAY;IACvC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO;IAWlC,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,EAAE;IAS5B,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE;IAG9B,IAAI,IAAI,IAAI,EAAE;CAGf;AAED;;;;;GAKG;AACH,qBAAa,SAAS;IACpB,cAAc,EAAE,cAAc,CAAA;IAC9B,OAAO,cAAoB;IAC3B,QAAQ,WAAiB;IACzB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;IACpB,MAAM,EAAE,OAAO,CAAA;IACf,GAAG,EAAE,OAAO,CAAA;IACZ,IAAI,EAAE,cAAc,CAAA;gBAER,IAAI,EAAE,cAAc,EAAE,cAAc,CAAC,EAAE,cAAc;IAQjE,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE;IAmGjD,cAAc,IAAI,IAAI,EAAE;IAIxB,KAAK;IAQL,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,SAAS;IAqBvD,YAAY,CACV,CAAC,EAAE,IAAI,EACP,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,OAAO,GAAG,IAAI,EACpB,QAAQ,EAAE,OAAO;IA8CnB,UAAU,CACR,CAAC,EAAE,IAAI,EACP,CAAC,EAAE,QAAQ,EACX,IAAI,EAAE,OAAO,GAAG,IAAI,EACpB,QAAQ,EAAE,OAAO;IAUnB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,EAAE,QAAQ,EAAE,OAAO;CASvE"} \ No newline at end of file diff --git a/node_modules/glob/dist/commonjs/processor.js b/node_modules/glob/dist/commonjs/processor.js deleted file mode 100644 index ee3bb43..0000000 --- a/node_modules/glob/dist/commonjs/processor.js +++ /dev/null @@ -1,301 +0,0 @@ -"use strict"; -// synchronous utility for filtering entries and calculating subwalks -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Processor = exports.SubWalks = exports.MatchRecord = exports.HasWalkedCache = void 0; -const minimatch_1 = require("minimatch"); -/** - * A cache of which patterns have been processed for a given Path - */ -class HasWalkedCache { - store; - constructor(store = new Map()) { - this.store = store; - } - copy() { - return new HasWalkedCache(new Map(this.store)); - } - hasWalked(target, pattern) { - return this.store.get(target.fullpath())?.has(pattern.globString()); - } - storeWalked(target, pattern) { - const fullpath = target.fullpath(); - const cached = this.store.get(fullpath); - if (cached) - cached.add(pattern.globString()); - else - this.store.set(fullpath, new Set([pattern.globString()])); - } -} -exports.HasWalkedCache = HasWalkedCache; -/** - * A record of which paths have been matched in a given walk step, - * and whether they only are considered a match if they are a directory, - * and whether their absolute or relative path should be returned. - */ -class MatchRecord { - store = new Map(); - add(target, absolute, ifDir) { - const n = (absolute ? 2 : 0) | (ifDir ? 1 : 0); - const current = this.store.get(target); - this.store.set(target, current === undefined ? n : n & current); - } - // match, absolute, ifdir - entries() { - return [...this.store.entries()].map(([path, n]) => [ - path, - !!(n & 2), - !!(n & 1), - ]); - } -} -exports.MatchRecord = MatchRecord; -/** - * A collection of patterns that must be processed in a subsequent step - * for a given path. - */ -class SubWalks { - store = new Map(); - add(target, pattern) { - if (!target.canReaddir()) { - return; - } - const subs = this.store.get(target); - if (subs) { - if (!subs.find(p => p.globString() === pattern.globString())) { - subs.push(pattern); - } - } - else - this.store.set(target, [pattern]); - } - get(target) { - const subs = this.store.get(target); - /* c8 ignore start */ - if (!subs) { - throw new Error('attempting to walk unknown path'); - } - /* c8 ignore stop */ - return subs; - } - entries() { - return this.keys().map(k => [k, this.store.get(k)]); - } - keys() { - return [...this.store.keys()].filter(t => t.canReaddir()); - } -} -exports.SubWalks = SubWalks; -/** - * The class that processes patterns for a given path. - * - * Handles child entry filtering, and determining whether a path's - * directory contents must be read. - */ -class Processor { - hasWalkedCache; - matches = new MatchRecord(); - subwalks = new SubWalks(); - patterns; - follow; - dot; - opts; - constructor(opts, hasWalkedCache) { - this.opts = opts; - this.follow = !!opts.follow; - this.dot = !!opts.dot; - this.hasWalkedCache = - hasWalkedCache ? hasWalkedCache.copy() : new HasWalkedCache(); - } - processPatterns(target, patterns) { - this.patterns = patterns; - const processingSet = patterns.map(p => [target, p]); - // map of paths to the magic-starting subwalks they need to walk - // first item in patterns is the filter - for (let [t, pattern] of processingSet) { - this.hasWalkedCache.storeWalked(t, pattern); - const root = pattern.root(); - const absolute = pattern.isAbsolute() && this.opts.absolute !== false; - // start absolute patterns at root - if (root) { - t = t.resolve(root === '/' && this.opts.root !== undefined ? - this.opts.root - : root); - const rest = pattern.rest(); - if (!rest) { - this.matches.add(t, true, false); - continue; - } - else { - pattern = rest; - } - } - if (t.isENOENT()) - continue; - let p; - let rest; - let changed = false; - while (typeof (p = pattern.pattern()) === 'string' && - (rest = pattern.rest())) { - const c = t.resolve(p); - t = c; - pattern = rest; - changed = true; - } - p = pattern.pattern(); - rest = pattern.rest(); - if (changed) { - if (this.hasWalkedCache.hasWalked(t, pattern)) - continue; - this.hasWalkedCache.storeWalked(t, pattern); - } - // now we have either a final string for a known entry, - // more strings for an unknown entry, - // or a pattern starting with magic, mounted on t. - if (typeof p === 'string') { - // must not be final entry, otherwise we would have - // concatenated it earlier. - const ifDir = p === '..' || p === '' || p === '.'; - this.matches.add(t.resolve(p), absolute, ifDir); - continue; - } - else if (p === minimatch_1.GLOBSTAR) { - // if no rest, match and subwalk pattern - // if rest, process rest and subwalk pattern - // if it's a symlink, but we didn't get here by way of a - // globstar match (meaning it's the first time THIS globstar - // has traversed a symlink), then we follow it. Otherwise, stop. - if (!t.isSymbolicLink() || - this.follow || - pattern.checkFollowGlobstar()) { - this.subwalks.add(t, pattern); - } - const rp = rest?.pattern(); - const rrest = rest?.rest(); - if (!rest || ((rp === '' || rp === '.') && !rrest)) { - // only HAS to be a dir if it ends in **/ or **/. - // but ending in ** will match files as well. - this.matches.add(t, absolute, rp === '' || rp === '.'); - } - else { - if (rp === '..') { - // this would mean you're matching **/.. at the fs root, - // and no thanks, I'm not gonna test that specific case. - /* c8 ignore start */ - const tp = t.parent || t; - /* c8 ignore stop */ - if (!rrest) - this.matches.add(tp, absolute, true); - else if (!this.hasWalkedCache.hasWalked(tp, rrest)) { - this.subwalks.add(tp, rrest); - } - } - } - } - else if (p instanceof RegExp) { - this.subwalks.add(t, pattern); - } - } - return this; - } - subwalkTargets() { - return this.subwalks.keys(); - } - child() { - return new Processor(this.opts, this.hasWalkedCache); - } - // return a new Processor containing the subwalks for each - // child entry, and a set of matches, and - // a hasWalkedCache that's a copy of this one - // then we're going to call - filterEntries(parent, entries) { - const patterns = this.subwalks.get(parent); - // put matches and entry walks into the results processor - const results = this.child(); - for (const e of entries) { - for (const pattern of patterns) { - const absolute = pattern.isAbsolute(); - const p = pattern.pattern(); - const rest = pattern.rest(); - if (p === minimatch_1.GLOBSTAR) { - results.testGlobstar(e, pattern, rest, absolute); - } - else if (p instanceof RegExp) { - results.testRegExp(e, p, rest, absolute); - } - else { - results.testString(e, p, rest, absolute); - } - } - } - return results; - } - testGlobstar(e, pattern, rest, absolute) { - if (this.dot || !e.name.startsWith('.')) { - if (!pattern.hasMore()) { - this.matches.add(e, absolute, false); - } - if (e.canReaddir()) { - // if we're in follow mode or it's not a symlink, just keep - // testing the same pattern. If there's more after the globstar, - // then this symlink consumes the globstar. If not, then we can - // follow at most ONE symlink along the way, so we mark it, which - // also checks to ensure that it wasn't already marked. - if (this.follow || !e.isSymbolicLink()) { - this.subwalks.add(e, pattern); - } - else if (e.isSymbolicLink()) { - if (rest && pattern.checkFollowGlobstar()) { - this.subwalks.add(e, rest); - } - else if (pattern.markFollowGlobstar()) { - this.subwalks.add(e, pattern); - } - } - } - } - // if the NEXT thing matches this entry, then also add - // the rest. - if (rest) { - const rp = rest.pattern(); - if (typeof rp === 'string' && - // dots and empty were handled already - rp !== '..' && - rp !== '' && - rp !== '.') { - this.testString(e, rp, rest.rest(), absolute); - } - else if (rp === '..') { - /* c8 ignore start */ - const ep = e.parent || e; - /* c8 ignore stop */ - this.subwalks.add(ep, rest); - } - else if (rp instanceof RegExp) { - this.testRegExp(e, rp, rest.rest(), absolute); - } - } - } - testRegExp(e, p, rest, absolute) { - if (!p.test(e.name)) - return; - if (!rest) { - this.matches.add(e, absolute, false); - } - else { - this.subwalks.add(e, rest); - } - } - testString(e, p, rest, absolute) { - // should never happen? - if (!e.isNamed(p)) - return; - if (!rest) { - this.matches.add(e, absolute, false); - } - else { - this.subwalks.add(e, rest); - } - } -} -exports.Processor = Processor; -//# sourceMappingURL=processor.js.map \ No newline at end of file diff --git a/node_modules/glob/dist/commonjs/processor.js.map b/node_modules/glob/dist/commonjs/processor.js.map deleted file mode 100644 index 58a7088..0000000 --- a/node_modules/glob/dist/commonjs/processor.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"processor.js","sourceRoot":"","sources":["../../src/processor.ts"],"names":[],"mappings":"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","sourcesContent":["// synchronous utility for filtering entries and calculating subwalks\n\nimport { GLOBSTAR, MMRegExp } from 'minimatch'\nimport { Path } from 'path-scurry'\nimport { MMPattern, Pattern } from './pattern.js'\nimport { GlobWalkerOpts } from './walker.js'\n\n/**\n * A cache of which patterns have been processed for a given Path\n */\nexport class HasWalkedCache {\n store: Map>\n constructor(store: Map> = new Map()) {\n this.store = store\n }\n copy() {\n return new HasWalkedCache(new Map(this.store))\n }\n hasWalked(target: Path, pattern: Pattern) {\n return this.store.get(target.fullpath())?.has(pattern.globString())\n }\n storeWalked(target: Path, pattern: Pattern) {\n const fullpath = target.fullpath()\n const cached = this.store.get(fullpath)\n if (cached) cached.add(pattern.globString())\n else this.store.set(fullpath, new Set([pattern.globString()]))\n }\n}\n\n/**\n * A record of which paths have been matched in a given walk step,\n * and whether they only are considered a match if they are a directory,\n * and whether their absolute or relative path should be returned.\n */\nexport class MatchRecord {\n store: Map = new Map()\n add(target: Path, absolute: boolean, ifDir: boolean) {\n const n = (absolute ? 2 : 0) | (ifDir ? 1 : 0)\n const current = this.store.get(target)\n this.store.set(target, current === undefined ? n : n & current)\n }\n // match, absolute, ifdir\n entries(): [Path, boolean, boolean][] {\n return [...this.store.entries()].map(([path, n]) => [\n path,\n !!(n & 2),\n !!(n & 1),\n ])\n }\n}\n\n/**\n * A collection of patterns that must be processed in a subsequent step\n * for a given path.\n */\nexport class SubWalks {\n store: Map = new Map()\n add(target: Path, pattern: Pattern) {\n if (!target.canReaddir()) {\n return\n }\n const subs = this.store.get(target)\n if (subs) {\n if (!subs.find(p => p.globString() === pattern.globString())) {\n subs.push(pattern)\n }\n } else this.store.set(target, [pattern])\n }\n get(target: Path): Pattern[] {\n const subs = this.store.get(target)\n /* c8 ignore start */\n if (!subs) {\n throw new Error('attempting to walk unknown path')\n }\n /* c8 ignore stop */\n return subs\n }\n entries(): [Path, Pattern[]][] {\n return this.keys().map(k => [k, this.store.get(k) as Pattern[]])\n }\n keys(): Path[] {\n return [...this.store.keys()].filter(t => t.canReaddir())\n }\n}\n\n/**\n * The class that processes patterns for a given path.\n *\n * Handles child entry filtering, and determining whether a path's\n * directory contents must be read.\n */\nexport class Processor {\n hasWalkedCache: HasWalkedCache\n matches = new MatchRecord()\n subwalks = new SubWalks()\n patterns?: Pattern[]\n follow: boolean\n dot: boolean\n opts: GlobWalkerOpts\n\n constructor(opts: GlobWalkerOpts, hasWalkedCache?: HasWalkedCache) {\n this.opts = opts\n this.follow = !!opts.follow\n this.dot = !!opts.dot\n this.hasWalkedCache =\n hasWalkedCache ? hasWalkedCache.copy() : new HasWalkedCache()\n }\n\n processPatterns(target: Path, patterns: Pattern[]) {\n this.patterns = patterns\n const processingSet: [Path, Pattern][] = patterns.map(p => [target, p])\n\n // map of paths to the magic-starting subwalks they need to walk\n // first item in patterns is the filter\n\n for (let [t, pattern] of processingSet) {\n this.hasWalkedCache.storeWalked(t, pattern)\n\n const root = pattern.root()\n const absolute = pattern.isAbsolute() && this.opts.absolute !== false\n\n // start absolute patterns at root\n if (root) {\n t = t.resolve(\n root === '/' && this.opts.root !== undefined ?\n this.opts.root\n : root,\n )\n const rest = pattern.rest()\n if (!rest) {\n this.matches.add(t, true, false)\n continue\n } else {\n pattern = rest\n }\n }\n\n if (t.isENOENT()) continue\n\n let p: MMPattern\n let rest: Pattern | null\n let changed = false\n while (\n typeof (p = pattern.pattern()) === 'string' &&\n (rest = pattern.rest())\n ) {\n const c = t.resolve(p)\n t = c\n pattern = rest\n changed = true\n }\n p = pattern.pattern()\n rest = pattern.rest()\n if (changed) {\n if (this.hasWalkedCache.hasWalked(t, pattern)) continue\n this.hasWalkedCache.storeWalked(t, pattern)\n }\n\n // now we have either a final string for a known entry,\n // more strings for an unknown entry,\n // or a pattern starting with magic, mounted on t.\n if (typeof p === 'string') {\n // must not be final entry, otherwise we would have\n // concatenated it earlier.\n const ifDir = p === '..' || p === '' || p === '.'\n this.matches.add(t.resolve(p), absolute, ifDir)\n continue\n } else if (p === GLOBSTAR) {\n // if no rest, match and subwalk pattern\n // if rest, process rest and subwalk pattern\n // if it's a symlink, but we didn't get here by way of a\n // globstar match (meaning it's the first time THIS globstar\n // has traversed a symlink), then we follow it. Otherwise, stop.\n if (\n !t.isSymbolicLink() ||\n this.follow ||\n pattern.checkFollowGlobstar()\n ) {\n this.subwalks.add(t, pattern)\n }\n const rp = rest?.pattern()\n const rrest = rest?.rest()\n if (!rest || ((rp === '' || rp === '.') && !rrest)) {\n // only HAS to be a dir if it ends in **/ or **/.\n // but ending in ** will match files as well.\n this.matches.add(t, absolute, rp === '' || rp === '.')\n } else {\n if (rp === '..') {\n // this would mean you're matching **/.. at the fs root,\n // and no thanks, I'm not gonna test that specific case.\n /* c8 ignore start */\n const tp = t.parent || t\n /* c8 ignore stop */\n if (!rrest) this.matches.add(tp, absolute, true)\n else if (!this.hasWalkedCache.hasWalked(tp, rrest)) {\n this.subwalks.add(tp, rrest)\n }\n }\n }\n } else if (p instanceof RegExp) {\n this.subwalks.add(t, pattern)\n }\n }\n\n return this\n }\n\n subwalkTargets(): Path[] {\n return this.subwalks.keys()\n }\n\n child() {\n return new Processor(this.opts, this.hasWalkedCache)\n }\n\n // return a new Processor containing the subwalks for each\n // child entry, and a set of matches, and\n // a hasWalkedCache that's a copy of this one\n // then we're going to call\n filterEntries(parent: Path, entries: Path[]): Processor {\n const patterns = this.subwalks.get(parent)\n // put matches and entry walks into the results processor\n const results = this.child()\n for (const e of entries) {\n for (const pattern of patterns) {\n const absolute = pattern.isAbsolute()\n const p = pattern.pattern()\n const rest = pattern.rest()\n if (p === GLOBSTAR) {\n results.testGlobstar(e, pattern, rest, absolute)\n } else if (p instanceof RegExp) {\n results.testRegExp(e, p, rest, absolute)\n } else {\n results.testString(e, p, rest, absolute)\n }\n }\n }\n return results\n }\n\n testGlobstar(\n e: Path,\n pattern: Pattern,\n rest: Pattern | null,\n absolute: boolean,\n ) {\n if (this.dot || !e.name.startsWith('.')) {\n if (!pattern.hasMore()) {\n this.matches.add(e, absolute, false)\n }\n if (e.canReaddir()) {\n // if we're in follow mode or it's not a symlink, just keep\n // testing the same pattern. If there's more after the globstar,\n // then this symlink consumes the globstar. If not, then we can\n // follow at most ONE symlink along the way, so we mark it, which\n // also checks to ensure that it wasn't already marked.\n if (this.follow || !e.isSymbolicLink()) {\n this.subwalks.add(e, pattern)\n } else if (e.isSymbolicLink()) {\n if (rest && pattern.checkFollowGlobstar()) {\n this.subwalks.add(e, rest)\n } else if (pattern.markFollowGlobstar()) {\n this.subwalks.add(e, pattern)\n }\n }\n }\n }\n // if the NEXT thing matches this entry, then also add\n // the rest.\n if (rest) {\n const rp = rest.pattern()\n if (\n typeof rp === 'string' &&\n // dots and empty were handled already\n rp !== '..' &&\n rp !== '' &&\n rp !== '.'\n ) {\n this.testString(e, rp, rest.rest(), absolute)\n } else if (rp === '..') {\n /* c8 ignore start */\n const ep = e.parent || e\n /* c8 ignore stop */\n this.subwalks.add(ep, rest)\n } else if (rp instanceof RegExp) {\n this.testRegExp(e, rp, rest.rest(), absolute)\n }\n }\n }\n\n testRegExp(\n e: Path,\n p: MMRegExp,\n rest: Pattern | null,\n absolute: boolean,\n ) {\n if (!p.test(e.name)) return\n if (!rest) {\n this.matches.add(e, absolute, false)\n } else {\n this.subwalks.add(e, rest)\n }\n }\n\n testString(e: Path, p: string, rest: Pattern | null, absolute: boolean) {\n // should never happen?\n if (!e.isNamed(p)) return\n if (!rest) {\n this.matches.add(e, absolute, false)\n } else {\n this.subwalks.add(e, rest)\n }\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/glob/dist/commonjs/walker.d.ts b/node_modules/glob/dist/commonjs/walker.d.ts deleted file mode 100644 index 499c8f4..0000000 --- a/node_modules/glob/dist/commonjs/walker.d.ts +++ /dev/null @@ -1,97 +0,0 @@ -/** - * Single-use utility classes to provide functionality to the {@link Glob} - * methods. - * - * @module - */ -import { Minipass } from 'minipass'; -import { Path } from 'path-scurry'; -import { IgnoreLike } from './ignore.js'; -import { Pattern } from './pattern.js'; -import { Processor } from './processor.js'; -export interface GlobWalkerOpts { - absolute?: boolean; - allowWindowsEscape?: boolean; - cwd?: string | URL; - dot?: boolean; - dotRelative?: boolean; - follow?: boolean; - ignore?: string | string[] | IgnoreLike; - mark?: boolean; - matchBase?: boolean; - maxDepth?: number; - nobrace?: boolean; - nocase?: boolean; - nodir?: boolean; - noext?: boolean; - noglobstar?: boolean; - platform?: NodeJS.Platform; - posix?: boolean; - realpath?: boolean; - root?: string; - stat?: boolean; - signal?: AbortSignal; - windowsPathsNoEscape?: boolean; - withFileTypes?: boolean; - includeChildMatches?: boolean; -} -export type GWOFileTypesTrue = GlobWalkerOpts & { - withFileTypes: true; -}; -export type GWOFileTypesFalse = GlobWalkerOpts & { - withFileTypes: false; -}; -export type GWOFileTypesUnset = GlobWalkerOpts & { - withFileTypes?: undefined; -}; -export type Result = O extends GWOFileTypesTrue ? Path : O extends GWOFileTypesFalse ? string : O extends GWOFileTypesUnset ? string : Path | string; -export type Matches = O extends GWOFileTypesTrue ? Set : O extends GWOFileTypesFalse ? Set : O extends GWOFileTypesUnset ? Set : Set; -export type MatchStream = Minipass, Result>; -/** - * basic walking utilities that all the glob walker types use - */ -export declare abstract class GlobUtil { - #private; - path: Path; - patterns: Pattern[]; - opts: O; - seen: Set; - paused: boolean; - aborted: boolean; - signal?: AbortSignal; - maxDepth: number; - includeChildMatches: boolean; - constructor(patterns: Pattern[], path: Path, opts: O); - pause(): void; - resume(): void; - onResume(fn: () => any): void; - matchCheck(e: Path, ifDir: boolean): Promise; - matchCheckTest(e: Path | undefined, ifDir: boolean): Path | undefined; - matchCheckSync(e: Path, ifDir: boolean): Path | undefined; - abstract matchEmit(p: Result): void; - abstract matchEmit(p: string | Path): void; - matchFinish(e: Path, absolute: boolean): void; - match(e: Path, absolute: boolean, ifDir: boolean): Promise; - matchSync(e: Path, absolute: boolean, ifDir: boolean): void; - walkCB(target: Path, patterns: Pattern[], cb: () => any): void; - walkCB2(target: Path, patterns: Pattern[], processor: Processor, cb: () => any): any; - walkCB3(target: Path, entries: Path[], processor: Processor, cb: () => any): void; - walkCBSync(target: Path, patterns: Pattern[], cb: () => any): void; - walkCB2Sync(target: Path, patterns: Pattern[], processor: Processor, cb: () => any): any; - walkCB3Sync(target: Path, entries: Path[], processor: Processor, cb: () => any): void; -} -export declare class GlobWalker extends GlobUtil { - matches: Set>; - constructor(patterns: Pattern[], path: Path, opts: O); - matchEmit(e: Result): void; - walk(): Promise>>; - walkSync(): Set>; -} -export declare class GlobStream extends GlobUtil { - results: Minipass, Result>; - constructor(patterns: Pattern[], path: Path, opts: O); - matchEmit(e: Result): void; - stream(): MatchStream; - streamSync(): MatchStream; -} -//# sourceMappingURL=walker.d.ts.map \ No newline at end of file diff --git a/node_modules/glob/dist/commonjs/walker.d.ts.map b/node_modules/glob/dist/commonjs/walker.d.ts.map deleted file mode 100644 index 769957b..0000000 --- a/node_modules/glob/dist/commonjs/walker.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"walker.d.ts","sourceRoot":"","sources":["../../src/walker.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/glob/dist/commonjs/walker.js b/node_modules/glob/dist/commonjs/walker.js deleted file mode 100644 index cb15946..0000000 --- a/node_modules/glob/dist/commonjs/walker.js +++ /dev/null @@ -1,387 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GlobStream = exports.GlobWalker = exports.GlobUtil = void 0; -/** - * Single-use utility classes to provide functionality to the {@link Glob} - * methods. - * - * @module - */ -const minipass_1 = require("minipass"); -const ignore_js_1 = require("./ignore.js"); -const processor_js_1 = require("./processor.js"); -const makeIgnore = (ignore, opts) => typeof ignore === 'string' ? new ignore_js_1.Ignore([ignore], opts) - : Array.isArray(ignore) ? new ignore_js_1.Ignore(ignore, opts) - : ignore; -/** - * basic walking utilities that all the glob walker types use - */ -class GlobUtil { - path; - patterns; - opts; - seen = new Set(); - paused = false; - aborted = false; - #onResume = []; - #ignore; - #sep; - signal; - maxDepth; - includeChildMatches; - constructor(patterns, path, opts) { - this.patterns = patterns; - this.path = path; - this.opts = opts; - this.#sep = !opts.posix && opts.platform === 'win32' ? '\\' : '/'; - this.includeChildMatches = opts.includeChildMatches !== false; - if (opts.ignore || !this.includeChildMatches) { - this.#ignore = makeIgnore(opts.ignore ?? [], opts); - if (!this.includeChildMatches && - typeof this.#ignore.add !== 'function') { - const m = 'cannot ignore child matches, ignore lacks add() method.'; - throw new Error(m); - } - } - // ignore, always set with maxDepth, but it's optional on the - // GlobOptions type - /* c8 ignore start */ - this.maxDepth = opts.maxDepth || Infinity; - /* c8 ignore stop */ - if (opts.signal) { - this.signal = opts.signal; - this.signal.addEventListener('abort', () => { - this.#onResume.length = 0; - }); - } - } - #ignored(path) { - return this.seen.has(path) || !!this.#ignore?.ignored?.(path); - } - #childrenIgnored(path) { - return !!this.#ignore?.childrenIgnored?.(path); - } - // backpressure mechanism - pause() { - this.paused = true; - } - resume() { - /* c8 ignore start */ - if (this.signal?.aborted) - return; - /* c8 ignore stop */ - this.paused = false; - let fn = undefined; - while (!this.paused && (fn = this.#onResume.shift())) { - fn(); - } - } - onResume(fn) { - if (this.signal?.aborted) - return; - /* c8 ignore start */ - if (!this.paused) { - fn(); - } - else { - /* c8 ignore stop */ - this.#onResume.push(fn); - } - } - // do the requisite realpath/stat checking, and return the path - // to add or undefined to filter it out. - async matchCheck(e, ifDir) { - if (ifDir && this.opts.nodir) - return undefined; - let rpc; - if (this.opts.realpath) { - rpc = e.realpathCached() || (await e.realpath()); - if (!rpc) - return undefined; - e = rpc; - } - const needStat = e.isUnknown() || this.opts.stat; - const s = needStat ? await e.lstat() : e; - if (this.opts.follow && this.opts.nodir && s?.isSymbolicLink()) { - const target = await s.realpath(); - /* c8 ignore start */ - if (target && (target.isUnknown() || this.opts.stat)) { - await target.lstat(); - } - /* c8 ignore stop */ - } - return this.matchCheckTest(s, ifDir); - } - matchCheckTest(e, ifDir) { - return (e && - (this.maxDepth === Infinity || e.depth() <= this.maxDepth) && - (!ifDir || e.canReaddir()) && - (!this.opts.nodir || !e.isDirectory()) && - (!this.opts.nodir || - !this.opts.follow || - !e.isSymbolicLink() || - !e.realpathCached()?.isDirectory()) && - !this.#ignored(e)) ? - e - : undefined; - } - matchCheckSync(e, ifDir) { - if (ifDir && this.opts.nodir) - return undefined; - let rpc; - if (this.opts.realpath) { - rpc = e.realpathCached() || e.realpathSync(); - if (!rpc) - return undefined; - e = rpc; - } - const needStat = e.isUnknown() || this.opts.stat; - const s = needStat ? e.lstatSync() : e; - if (this.opts.follow && this.opts.nodir && s?.isSymbolicLink()) { - const target = s.realpathSync(); - if (target && (target?.isUnknown() || this.opts.stat)) { - target.lstatSync(); - } - } - return this.matchCheckTest(s, ifDir); - } - matchFinish(e, absolute) { - if (this.#ignored(e)) - return; - // we know we have an ignore if this is false, but TS doesn't - if (!this.includeChildMatches && this.#ignore?.add) { - const ign = `${e.relativePosix()}/**`; - this.#ignore.add(ign); - } - const abs = this.opts.absolute === undefined ? absolute : this.opts.absolute; - this.seen.add(e); - const mark = this.opts.mark && e.isDirectory() ? this.#sep : ''; - // ok, we have what we need! - if (this.opts.withFileTypes) { - this.matchEmit(e); - } - else if (abs) { - const abs = this.opts.posix ? e.fullpathPosix() : e.fullpath(); - this.matchEmit(abs + mark); - } - else { - const rel = this.opts.posix ? e.relativePosix() : e.relative(); - const pre = this.opts.dotRelative && !rel.startsWith('..' + this.#sep) ? - '.' + this.#sep - : ''; - this.matchEmit(!rel ? '.' + mark : pre + rel + mark); - } - } - async match(e, absolute, ifDir) { - const p = await this.matchCheck(e, ifDir); - if (p) - this.matchFinish(p, absolute); - } - matchSync(e, absolute, ifDir) { - const p = this.matchCheckSync(e, ifDir); - if (p) - this.matchFinish(p, absolute); - } - walkCB(target, patterns, cb) { - /* c8 ignore start */ - if (this.signal?.aborted) - cb(); - /* c8 ignore stop */ - this.walkCB2(target, patterns, new processor_js_1.Processor(this.opts), cb); - } - walkCB2(target, patterns, processor, cb) { - if (this.#childrenIgnored(target)) - return cb(); - if (this.signal?.aborted) - cb(); - if (this.paused) { - this.onResume(() => this.walkCB2(target, patterns, processor, cb)); - return; - } - processor.processPatterns(target, patterns); - // done processing. all of the above is sync, can be abstracted out. - // subwalks is a map of paths to the entry filters they need - // matches is a map of paths to [absolute, ifDir] tuples. - let tasks = 1; - const next = () => { - if (--tasks === 0) - cb(); - }; - for (const [m, absolute, ifDir] of processor.matches.entries()) { - if (this.#ignored(m)) - continue; - tasks++; - this.match(m, absolute, ifDir).then(() => next()); - } - for (const t of processor.subwalkTargets()) { - if (this.maxDepth !== Infinity && t.depth() >= this.maxDepth) { - continue; - } - tasks++; - const childrenCached = t.readdirCached(); - if (t.calledReaddir()) - this.walkCB3(t, childrenCached, processor, next); - else { - t.readdirCB((_, entries) => this.walkCB3(t, entries, processor, next), true); - } - } - next(); - } - walkCB3(target, entries, processor, cb) { - processor = processor.filterEntries(target, entries); - let tasks = 1; - const next = () => { - if (--tasks === 0) - cb(); - }; - for (const [m, absolute, ifDir] of processor.matches.entries()) { - if (this.#ignored(m)) - continue; - tasks++; - this.match(m, absolute, ifDir).then(() => next()); - } - for (const [target, patterns] of processor.subwalks.entries()) { - tasks++; - this.walkCB2(target, patterns, processor.child(), next); - } - next(); - } - walkCBSync(target, patterns, cb) { - /* c8 ignore start */ - if (this.signal?.aborted) - cb(); - /* c8 ignore stop */ - this.walkCB2Sync(target, patterns, new processor_js_1.Processor(this.opts), cb); - } - walkCB2Sync(target, patterns, processor, cb) { - if (this.#childrenIgnored(target)) - return cb(); - if (this.signal?.aborted) - cb(); - if (this.paused) { - this.onResume(() => this.walkCB2Sync(target, patterns, processor, cb)); - return; - } - processor.processPatterns(target, patterns); - // done processing. all of the above is sync, can be abstracted out. - // subwalks is a map of paths to the entry filters they need - // matches is a map of paths to [absolute, ifDir] tuples. - let tasks = 1; - const next = () => { - if (--tasks === 0) - cb(); - }; - for (const [m, absolute, ifDir] of processor.matches.entries()) { - if (this.#ignored(m)) - continue; - this.matchSync(m, absolute, ifDir); - } - for (const t of processor.subwalkTargets()) { - if (this.maxDepth !== Infinity && t.depth() >= this.maxDepth) { - continue; - } - tasks++; - const children = t.readdirSync(); - this.walkCB3Sync(t, children, processor, next); - } - next(); - } - walkCB3Sync(target, entries, processor, cb) { - processor = processor.filterEntries(target, entries); - let tasks = 1; - const next = () => { - if (--tasks === 0) - cb(); - }; - for (const [m, absolute, ifDir] of processor.matches.entries()) { - if (this.#ignored(m)) - continue; - this.matchSync(m, absolute, ifDir); - } - for (const [target, patterns] of processor.subwalks.entries()) { - tasks++; - this.walkCB2Sync(target, patterns, processor.child(), next); - } - next(); - } -} -exports.GlobUtil = GlobUtil; -class GlobWalker extends GlobUtil { - matches = new Set(); - constructor(patterns, path, opts) { - super(patterns, path, opts); - } - matchEmit(e) { - this.matches.add(e); - } - async walk() { - if (this.signal?.aborted) - throw this.signal.reason; - if (this.path.isUnknown()) { - await this.path.lstat(); - } - await new Promise((res, rej) => { - this.walkCB(this.path, this.patterns, () => { - if (this.signal?.aborted) { - rej(this.signal.reason); - } - else { - res(this.matches); - } - }); - }); - return this.matches; - } - walkSync() { - if (this.signal?.aborted) - throw this.signal.reason; - if (this.path.isUnknown()) { - this.path.lstatSync(); - } - // nothing for the callback to do, because this never pauses - this.walkCBSync(this.path, this.patterns, () => { - if (this.signal?.aborted) - throw this.signal.reason; - }); - return this.matches; - } -} -exports.GlobWalker = GlobWalker; -class GlobStream extends GlobUtil { - results; - constructor(patterns, path, opts) { - super(patterns, path, opts); - this.results = new minipass_1.Minipass({ - signal: this.signal, - objectMode: true, - }); - this.results.on('drain', () => this.resume()); - this.results.on('resume', () => this.resume()); - } - matchEmit(e) { - this.results.write(e); - if (!this.results.flowing) - this.pause(); - } - stream() { - const target = this.path; - if (target.isUnknown()) { - target.lstat().then(() => { - this.walkCB(target, this.patterns, () => this.results.end()); - }); - } - else { - this.walkCB(target, this.patterns, () => this.results.end()); - } - return this.results; - } - streamSync() { - if (this.path.isUnknown()) { - this.path.lstatSync(); - } - this.walkCBSync(this.path, this.patterns, () => this.results.end()); - return this.results; - } -} -exports.GlobStream = GlobStream; -//# sourceMappingURL=walker.js.map \ No newline at end of file diff --git a/node_modules/glob/dist/commonjs/walker.js.map b/node_modules/glob/dist/commonjs/walker.js.map deleted file mode 100644 index 49b0138..0000000 --- a/node_modules/glob/dist/commonjs/walker.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"walker.js","sourceRoot":"","sources":["../../src/walker.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Single-use utility classes to provide functionality to the {@link Glob}\n * methods.\n *\n * @module\n */\nimport { Minipass } from 'minipass'\nimport { Path } from 'path-scurry'\nimport { Ignore, IgnoreLike } from './ignore.js'\n\n// XXX can we somehow make it so that it NEVER processes a given path more than\n// once, enough that the match set tracking is no longer needed? that'd speed\n// things up a lot. Or maybe bring back nounique, and skip it in that case?\n\n// a single minimatch set entry with 1 or more parts\nimport { Pattern } from './pattern.js'\nimport { Processor } from './processor.js'\n\nexport interface GlobWalkerOpts {\n absolute?: boolean\n allowWindowsEscape?: boolean\n cwd?: string | URL\n dot?: boolean\n dotRelative?: boolean\n follow?: boolean\n ignore?: string | string[] | IgnoreLike\n mark?: boolean\n matchBase?: boolean\n // Note: maxDepth here means \"maximum actual Path.depth()\",\n // not \"maximum depth beyond cwd\"\n maxDepth?: number\n nobrace?: boolean\n nocase?: boolean\n nodir?: boolean\n noext?: boolean\n noglobstar?: boolean\n platform?: NodeJS.Platform\n posix?: boolean\n realpath?: boolean\n root?: string\n stat?: boolean\n signal?: AbortSignal\n windowsPathsNoEscape?: boolean\n withFileTypes?: boolean\n includeChildMatches?: boolean\n}\n\nexport type GWOFileTypesTrue = GlobWalkerOpts & {\n withFileTypes: true\n}\nexport type GWOFileTypesFalse = GlobWalkerOpts & {\n withFileTypes: false\n}\nexport type GWOFileTypesUnset = GlobWalkerOpts & {\n withFileTypes?: undefined\n}\n\nexport type Result =\n O extends GWOFileTypesTrue ? Path\n : O extends GWOFileTypesFalse ? string\n : O extends GWOFileTypesUnset ? string\n : Path | string\n\nexport type Matches =\n O extends GWOFileTypesTrue ? Set\n : O extends GWOFileTypesFalse ? Set\n : O extends GWOFileTypesUnset ? Set\n : Set\n\nexport type MatchStream = Minipass<\n Result,\n Result\n>\n\nconst makeIgnore = (\n ignore: string | string[] | IgnoreLike,\n opts: GlobWalkerOpts,\n): IgnoreLike =>\n typeof ignore === 'string' ? new Ignore([ignore], opts)\n : Array.isArray(ignore) ? new Ignore(ignore, opts)\n : ignore\n\n/**\n * basic walking utilities that all the glob walker types use\n */\nexport abstract class GlobUtil {\n path: Path\n patterns: Pattern[]\n opts: O\n seen: Set = new Set()\n paused: boolean = false\n aborted: boolean = false\n #onResume: (() => any)[] = []\n #ignore?: IgnoreLike\n #sep: '\\\\' | '/'\n signal?: AbortSignal\n maxDepth: number\n includeChildMatches: boolean\n\n constructor(patterns: Pattern[], path: Path, opts: O)\n constructor(patterns: Pattern[], path: Path, opts: O) {\n this.patterns = patterns\n this.path = path\n this.opts = opts\n this.#sep = !opts.posix && opts.platform === 'win32' ? '\\\\' : '/'\n this.includeChildMatches = opts.includeChildMatches !== false\n if (opts.ignore || !this.includeChildMatches) {\n this.#ignore = makeIgnore(opts.ignore ?? [], opts)\n if (\n !this.includeChildMatches &&\n typeof this.#ignore.add !== 'function'\n ) {\n const m = 'cannot ignore child matches, ignore lacks add() method.'\n throw new Error(m)\n }\n }\n // ignore, always set with maxDepth, but it's optional on the\n // GlobOptions type\n /* c8 ignore start */\n this.maxDepth = opts.maxDepth || Infinity\n /* c8 ignore stop */\n if (opts.signal) {\n this.signal = opts.signal\n this.signal.addEventListener('abort', () => {\n this.#onResume.length = 0\n })\n }\n }\n\n #ignored(path: Path): boolean {\n return this.seen.has(path) || !!this.#ignore?.ignored?.(path)\n }\n #childrenIgnored(path: Path): boolean {\n return !!this.#ignore?.childrenIgnored?.(path)\n }\n\n // backpressure mechanism\n pause() {\n this.paused = true\n }\n resume() {\n /* c8 ignore start */\n if (this.signal?.aborted) return\n /* c8 ignore stop */\n this.paused = false\n let fn: (() => any) | undefined = undefined\n while (!this.paused && (fn = this.#onResume.shift())) {\n fn()\n }\n }\n onResume(fn: () => any) {\n if (this.signal?.aborted) return\n /* c8 ignore start */\n if (!this.paused) {\n fn()\n } else {\n /* c8 ignore stop */\n this.#onResume.push(fn)\n }\n }\n\n // do the requisite realpath/stat checking, and return the path\n // to add or undefined to filter it out.\n async matchCheck(e: Path, ifDir: boolean): Promise {\n if (ifDir && this.opts.nodir) return undefined\n let rpc: Path | undefined\n if (this.opts.realpath) {\n rpc = e.realpathCached() || (await e.realpath())\n if (!rpc) return undefined\n e = rpc\n }\n const needStat = e.isUnknown() || this.opts.stat\n const s = needStat ? await e.lstat() : e\n if (this.opts.follow && this.opts.nodir && s?.isSymbolicLink()) {\n const target = await s.realpath()\n /* c8 ignore start */\n if (target && (target.isUnknown() || this.opts.stat)) {\n await target.lstat()\n }\n /* c8 ignore stop */\n }\n return this.matchCheckTest(s, ifDir)\n }\n\n matchCheckTest(e: Path | undefined, ifDir: boolean): Path | undefined {\n return (\n e &&\n (this.maxDepth === Infinity || e.depth() <= this.maxDepth) &&\n (!ifDir || e.canReaddir()) &&\n (!this.opts.nodir || !e.isDirectory()) &&\n (!this.opts.nodir ||\n !this.opts.follow ||\n !e.isSymbolicLink() ||\n !e.realpathCached()?.isDirectory()) &&\n !this.#ignored(e)\n ) ?\n e\n : undefined\n }\n\n matchCheckSync(e: Path, ifDir: boolean): Path | undefined {\n if (ifDir && this.opts.nodir) return undefined\n let rpc: Path | undefined\n if (this.opts.realpath) {\n rpc = e.realpathCached() || e.realpathSync()\n if (!rpc) return undefined\n e = rpc\n }\n const needStat = e.isUnknown() || this.opts.stat\n const s = needStat ? e.lstatSync() : e\n if (this.opts.follow && this.opts.nodir && s?.isSymbolicLink()) {\n const target = s.realpathSync()\n if (target && (target?.isUnknown() || this.opts.stat)) {\n target.lstatSync()\n }\n }\n return this.matchCheckTest(s, ifDir)\n }\n\n abstract matchEmit(p: Result): void\n abstract matchEmit(p: string | Path): void\n\n matchFinish(e: Path, absolute: boolean) {\n if (this.#ignored(e)) return\n // we know we have an ignore if this is false, but TS doesn't\n if (!this.includeChildMatches && this.#ignore?.add) {\n const ign = `${e.relativePosix()}/**`\n this.#ignore.add(ign)\n }\n const abs =\n this.opts.absolute === undefined ? absolute : this.opts.absolute\n this.seen.add(e)\n const mark = this.opts.mark && e.isDirectory() ? this.#sep : ''\n // ok, we have what we need!\n if (this.opts.withFileTypes) {\n this.matchEmit(e)\n } else if (abs) {\n const abs = this.opts.posix ? e.fullpathPosix() : e.fullpath()\n this.matchEmit(abs + mark)\n } else {\n const rel = this.opts.posix ? e.relativePosix() : e.relative()\n const pre =\n this.opts.dotRelative && !rel.startsWith('..' + this.#sep) ?\n '.' + this.#sep\n : ''\n this.matchEmit(!rel ? '.' + mark : pre + rel + mark)\n }\n }\n\n async match(e: Path, absolute: boolean, ifDir: boolean): Promise {\n const p = await this.matchCheck(e, ifDir)\n if (p) this.matchFinish(p, absolute)\n }\n\n matchSync(e: Path, absolute: boolean, ifDir: boolean): void {\n const p = this.matchCheckSync(e, ifDir)\n if (p) this.matchFinish(p, absolute)\n }\n\n walkCB(target: Path, patterns: Pattern[], cb: () => any) {\n /* c8 ignore start */\n if (this.signal?.aborted) cb()\n /* c8 ignore stop */\n this.walkCB2(target, patterns, new Processor(this.opts), cb)\n }\n\n walkCB2(\n target: Path,\n patterns: Pattern[],\n processor: Processor,\n cb: () => any,\n ) {\n if (this.#childrenIgnored(target)) return cb()\n if (this.signal?.aborted) cb()\n if (this.paused) {\n this.onResume(() => this.walkCB2(target, patterns, processor, cb))\n return\n }\n processor.processPatterns(target, patterns)\n\n // done processing. all of the above is sync, can be abstracted out.\n // subwalks is a map of paths to the entry filters they need\n // matches is a map of paths to [absolute, ifDir] tuples.\n let tasks = 1\n const next = () => {\n if (--tasks === 0) cb()\n }\n\n for (const [m, absolute, ifDir] of processor.matches.entries()) {\n if (this.#ignored(m)) continue\n tasks++\n this.match(m, absolute, ifDir).then(() => next())\n }\n\n for (const t of processor.subwalkTargets()) {\n if (this.maxDepth !== Infinity && t.depth() >= this.maxDepth) {\n continue\n }\n tasks++\n const childrenCached = t.readdirCached()\n if (t.calledReaddir())\n this.walkCB3(t, childrenCached, processor, next)\n else {\n t.readdirCB(\n (_, entries) => this.walkCB3(t, entries, processor, next),\n true,\n )\n }\n }\n\n next()\n }\n\n walkCB3(\n target: Path,\n entries: Path[],\n processor: Processor,\n cb: () => any,\n ) {\n processor = processor.filterEntries(target, entries)\n\n let tasks = 1\n const next = () => {\n if (--tasks === 0) cb()\n }\n\n for (const [m, absolute, ifDir] of processor.matches.entries()) {\n if (this.#ignored(m)) continue\n tasks++\n this.match(m, absolute, ifDir).then(() => next())\n }\n for (const [target, patterns] of processor.subwalks.entries()) {\n tasks++\n this.walkCB2(target, patterns, processor.child(), next)\n }\n\n next()\n }\n\n walkCBSync(target: Path, patterns: Pattern[], cb: () => any) {\n /* c8 ignore start */\n if (this.signal?.aborted) cb()\n /* c8 ignore stop */\n this.walkCB2Sync(target, patterns, new Processor(this.opts), cb)\n }\n\n walkCB2Sync(\n target: Path,\n patterns: Pattern[],\n processor: Processor,\n cb: () => any,\n ) {\n if (this.#childrenIgnored(target)) return cb()\n if (this.signal?.aborted) cb()\n if (this.paused) {\n this.onResume(() =>\n this.walkCB2Sync(target, patterns, processor, cb),\n )\n return\n }\n processor.processPatterns(target, patterns)\n\n // done processing. all of the above is sync, can be abstracted out.\n // subwalks is a map of paths to the entry filters they need\n // matches is a map of paths to [absolute, ifDir] tuples.\n let tasks = 1\n const next = () => {\n if (--tasks === 0) cb()\n }\n\n for (const [m, absolute, ifDir] of processor.matches.entries()) {\n if (this.#ignored(m)) continue\n this.matchSync(m, absolute, ifDir)\n }\n\n for (const t of processor.subwalkTargets()) {\n if (this.maxDepth !== Infinity && t.depth() >= this.maxDepth) {\n continue\n }\n tasks++\n const children = t.readdirSync()\n this.walkCB3Sync(t, children, processor, next)\n }\n\n next()\n }\n\n walkCB3Sync(\n target: Path,\n entries: Path[],\n processor: Processor,\n cb: () => any,\n ) {\n processor = processor.filterEntries(target, entries)\n\n let tasks = 1\n const next = () => {\n if (--tasks === 0) cb()\n }\n\n for (const [m, absolute, ifDir] of processor.matches.entries()) {\n if (this.#ignored(m)) continue\n this.matchSync(m, absolute, ifDir)\n }\n for (const [target, patterns] of processor.subwalks.entries()) {\n tasks++\n this.walkCB2Sync(target, patterns, processor.child(), next)\n }\n\n next()\n }\n}\n\nexport class GlobWalker<\n O extends GlobWalkerOpts = GlobWalkerOpts,\n> extends GlobUtil {\n matches = new Set>()\n\n constructor(patterns: Pattern[], path: Path, opts: O) {\n super(patterns, path, opts)\n }\n\n matchEmit(e: Result): void {\n this.matches.add(e)\n }\n\n async walk(): Promise>> {\n if (this.signal?.aborted) throw this.signal.reason\n if (this.path.isUnknown()) {\n await this.path.lstat()\n }\n await new Promise((res, rej) => {\n this.walkCB(this.path, this.patterns, () => {\n if (this.signal?.aborted) {\n rej(this.signal.reason)\n } else {\n res(this.matches)\n }\n })\n })\n return this.matches\n }\n\n walkSync(): Set> {\n if (this.signal?.aborted) throw this.signal.reason\n if (this.path.isUnknown()) {\n this.path.lstatSync()\n }\n // nothing for the callback to do, because this never pauses\n this.walkCBSync(this.path, this.patterns, () => {\n if (this.signal?.aborted) throw this.signal.reason\n })\n return this.matches\n }\n}\n\nexport class GlobStream<\n O extends GlobWalkerOpts = GlobWalkerOpts,\n> extends GlobUtil {\n results: Minipass, Result>\n\n constructor(patterns: Pattern[], path: Path, opts: O) {\n super(patterns, path, opts)\n this.results = new Minipass, Result>({\n signal: this.signal,\n objectMode: true,\n })\n this.results.on('drain', () => this.resume())\n this.results.on('resume', () => this.resume())\n }\n\n matchEmit(e: Result): void {\n this.results.write(e)\n if (!this.results.flowing) this.pause()\n }\n\n stream(): MatchStream {\n const target = this.path\n if (target.isUnknown()) {\n target.lstat().then(() => {\n this.walkCB(target, this.patterns, () => this.results.end())\n })\n } else {\n this.walkCB(target, this.patterns, () => this.results.end())\n }\n return this.results\n }\n\n streamSync(): MatchStream {\n if (this.path.isUnknown()) {\n this.path.lstatSync()\n }\n this.walkCBSync(this.path, this.patterns, () => this.results.end())\n return this.results\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/glob/dist/esm/bin.d.mts b/node_modules/glob/dist/esm/bin.d.mts deleted file mode 100644 index 77298e4..0000000 --- a/node_modules/glob/dist/esm/bin.d.mts +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env node -export {}; -//# sourceMappingURL=bin.d.mts.map \ No newline at end of file diff --git a/node_modules/glob/dist/esm/bin.d.mts.map b/node_modules/glob/dist/esm/bin.d.mts.map deleted file mode 100644 index ec64bdd..0000000 --- a/node_modules/glob/dist/esm/bin.d.mts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"bin.d.mts","sourceRoot":"","sources":["../../src/bin.mts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/glob/dist/esm/bin.mjs b/node_modules/glob/dist/esm/bin.mjs deleted file mode 100644 index 5c7bf1e..0000000 --- a/node_modules/glob/dist/esm/bin.mjs +++ /dev/null @@ -1,270 +0,0 @@ -#!/usr/bin/env node -import { foregroundChild } from 'foreground-child'; -import { existsSync } from 'fs'; -import { jack } from 'jackspeak'; -import { loadPackageJson } from 'package-json-from-dist'; -import { join } from 'path'; -import { globStream } from './index.js'; -const { version } = loadPackageJson(import.meta.url, '../package.json'); -const j = jack({ - usage: 'glob [options] [ [ ...]]', -}) - .description(` - Glob v${version} - - Expand the positional glob expression arguments into any matching file - system paths found. - `) - .opt({ - cmd: { - short: 'c', - hint: 'command', - description: `Run the command provided, passing the glob expression - matches as arguments.`, - }, -}) - .opt({ - default: { - short: 'p', - hint: 'pattern', - description: `If no positional arguments are provided, glob will use - this pattern`, - }, -}) - .flag({ - all: { - short: 'A', - description: `By default, the glob cli command will not expand any - arguments that are an exact match to a file on disk. - - This prevents double-expanding, in case the shell expands - an argument whose filename is a glob expression. - - For example, if 'app/*.ts' would match 'app/[id].ts', then - on Windows powershell or cmd.exe, 'glob app/*.ts' will - expand to 'app/[id].ts', as expected. However, in posix - shells such as bash or zsh, the shell will first expand - 'app/*.ts' to a list of filenames. Then glob will look - for a file matching 'app/[id].ts' (ie, 'app/i.ts' or - 'app/d.ts'), which is unexpected. - - Setting '--all' prevents this behavior, causing glob - to treat ALL patterns as glob expressions to be expanded, - even if they are an exact match to a file on disk. - - When setting this option, be sure to enquote arguments - so that the shell will not expand them prior to passing - them to the glob command process. - `, - }, - absolute: { - short: 'a', - description: 'Expand to absolute paths', - }, - 'dot-relative': { - short: 'd', - description: `Prepend './' on relative matches`, - }, - mark: { - short: 'm', - description: `Append a / on any directories matched`, - }, - posix: { - short: 'x', - description: `Always resolve to posix style paths, using '/' as the - directory separator, even on Windows. Drive letter - absolute matches on Windows will be expanded to their - full resolved UNC maths, eg instead of 'C:\\foo\\bar', - it will expand to '//?/C:/foo/bar'. - `, - }, - follow: { - short: 'f', - description: `Follow symlinked directories when expanding '**'`, - }, - realpath: { - short: 'R', - description: `Call 'fs.realpath' on all of the results. In the case - of an entry that cannot be resolved, the entry is - omitted. This incurs a slight performance penalty, of - course, because of the added system calls.`, - }, - stat: { - short: 's', - description: `Call 'fs.lstat' on all entries, whether required or not - to determine if it's a valid match.`, - }, - 'match-base': { - short: 'b', - description: `Perform a basename-only match if the pattern does not - contain any slash characters. That is, '*.js' would be - treated as equivalent to '**/*.js', matching js files - in all directories. - `, - }, - dot: { - description: `Allow patterns to match files/directories that start - with '.', even if the pattern does not start with '.' - `, - }, - nobrace: { - description: 'Do not expand {...} patterns', - }, - nocase: { - description: `Perform a case-insensitive match. This defaults to - 'true' on macOS and Windows platforms, and false on - all others. - - Note: 'nocase' should only be explicitly set when it is - known that the filesystem's case sensitivity differs - from the platform default. If set 'true' on - case-insensitive file systems, then the walk may return - more or less results than expected. - `, - }, - nodir: { - description: `Do not match directories, only files. - - Note: to *only* match directories, append a '/' at the - end of the pattern. - `, - }, - noext: { - description: `Do not expand extglob patterns, such as '+(a|b)'`, - }, - noglobstar: { - description: `Do not expand '**' against multiple path portions. - Ie, treat it as a normal '*' instead.`, - }, - 'windows-path-no-escape': { - description: `Use '\\' as a path separator *only*, and *never* as an - escape character. If set, all '\\' characters are - replaced with '/' in the pattern.`, - }, -}) - .num({ - 'max-depth': { - short: 'D', - description: `Maximum depth to traverse from the current - working directory`, - }, -}) - .opt({ - cwd: { - short: 'C', - description: 'Current working directory to execute/match in', - default: process.cwd(), - }, - root: { - short: 'r', - description: `A string path resolved against the 'cwd', which is - used as the starting point for absolute patterns that - start with '/' (but not drive letters or UNC paths - on Windows). - - Note that this *doesn't* necessarily limit the walk to - the 'root' directory, and doesn't affect the cwd - starting point for non-absolute patterns. A pattern - containing '..' will still be able to traverse out of - the root directory, if it is not an actual root directory - on the filesystem, and any non-absolute patterns will - still be matched in the 'cwd'. - - To start absolute and non-absolute patterns in the same - path, you can use '--root=' to set it to the empty - string. However, be aware that on Windows systems, a - pattern like 'x:/*' or '//host/share/*' will *always* - start in the 'x:/' or '//host/share/' directory, - regardless of the --root setting. - `, - }, - platform: { - description: `Defaults to the value of 'process.platform' if - available, or 'linux' if not. Setting --platform=win32 - on non-Windows systems may cause strange behavior!`, - validOptions: [ - 'aix', - 'android', - 'darwin', - 'freebsd', - 'haiku', - 'linux', - 'openbsd', - 'sunos', - 'win32', - 'cygwin', - 'netbsd', - ], - }, -}) - .optList({ - ignore: { - short: 'i', - description: `Glob patterns to ignore`, - }, -}) - .flag({ - debug: { - short: 'v', - description: `Output a huge amount of noisy debug information about - patterns as they are parsed and used to match files.`, - }, -}) - .flag({ - help: { - short: 'h', - description: 'Show this usage information', - }, -}); -try { - const { positionals, values } = j.parse(); - if (values.help) { - console.log(j.usage()); - process.exit(0); - } - if (positionals.length === 0 && !values.default) - throw 'No patterns provided'; - if (positionals.length === 0 && values.default) - positionals.push(values.default); - const patterns = values.all ? positionals : positionals.filter(p => !existsSync(p)); - const matches = values.all ? - [] - : positionals.filter(p => existsSync(p)).map(p => join(p)); - const stream = globStream(patterns, { - absolute: values.absolute, - cwd: values.cwd, - dot: values.dot, - dotRelative: values['dot-relative'], - follow: values.follow, - ignore: values.ignore, - mark: values.mark, - matchBase: values['match-base'], - maxDepth: values['max-depth'], - nobrace: values.nobrace, - nocase: values.nocase, - nodir: values.nodir, - noext: values.noext, - noglobstar: values.noglobstar, - platform: values.platform, - realpath: values.realpath, - root: values.root, - stat: values.stat, - debug: values.debug, - posix: values.posix, - }); - const cmd = values.cmd; - if (!cmd) { - matches.forEach(m => console.log(m)); - stream.on('data', f => console.log(f)); - } - else { - stream.on('data', f => matches.push(f)); - stream.on('end', () => foregroundChild(cmd, matches, { shell: true })); - } -} -catch (e) { - console.error(j.usage()); - console.error(e instanceof Error ? e.message : String(e)); - process.exit(1); -} -//# sourceMappingURL=bin.mjs.map \ No newline at end of file diff --git a/node_modules/glob/dist/esm/bin.mjs.map b/node_modules/glob/dist/esm/bin.mjs.map deleted file mode 100644 index 67247d5..0000000 --- a/node_modules/glob/dist/esm/bin.mjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"bin.mjs","sourceRoot":"","sources":["../../src/bin.mts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport { foregroundChild } from 'foreground-child'\nimport { existsSync } from 'fs'\nimport { jack } from 'jackspeak'\nimport { loadPackageJson } from 'package-json-from-dist'\nimport { join } from 'path'\nimport { globStream } from './index.js'\n\nconst { version } = loadPackageJson(import.meta.url, '../package.json')\n\nconst j = jack({\n usage: 'glob [options] [ [ ...]]',\n})\n .description(\n `\n Glob v${version}\n\n Expand the positional glob expression arguments into any matching file\n system paths found.\n `,\n )\n .opt({\n cmd: {\n short: 'c',\n hint: 'command',\n description: `Run the command provided, passing the glob expression\n matches as arguments.`,\n },\n })\n .opt({\n default: {\n short: 'p',\n hint: 'pattern',\n description: `If no positional arguments are provided, glob will use\n this pattern`,\n },\n })\n .flag({\n all: {\n short: 'A',\n description: `By default, the glob cli command will not expand any\n arguments that are an exact match to a file on disk.\n\n This prevents double-expanding, in case the shell expands\n an argument whose filename is a glob expression.\n\n For example, if 'app/*.ts' would match 'app/[id].ts', then\n on Windows powershell or cmd.exe, 'glob app/*.ts' will\n expand to 'app/[id].ts', as expected. However, in posix\n shells such as bash or zsh, the shell will first expand\n 'app/*.ts' to a list of filenames. Then glob will look\n for a file matching 'app/[id].ts' (ie, 'app/i.ts' or\n 'app/d.ts'), which is unexpected.\n\n Setting '--all' prevents this behavior, causing glob\n to treat ALL patterns as glob expressions to be expanded,\n even if they are an exact match to a file on disk.\n\n When setting this option, be sure to enquote arguments\n so that the shell will not expand them prior to passing\n them to the glob command process.\n `,\n },\n absolute: {\n short: 'a',\n description: 'Expand to absolute paths',\n },\n 'dot-relative': {\n short: 'd',\n description: `Prepend './' on relative matches`,\n },\n mark: {\n short: 'm',\n description: `Append a / on any directories matched`,\n },\n posix: {\n short: 'x',\n description: `Always resolve to posix style paths, using '/' as the\n directory separator, even on Windows. Drive letter\n absolute matches on Windows will be expanded to their\n full resolved UNC maths, eg instead of 'C:\\\\foo\\\\bar',\n it will expand to '//?/C:/foo/bar'.\n `,\n },\n\n follow: {\n short: 'f',\n description: `Follow symlinked directories when expanding '**'`,\n },\n realpath: {\n short: 'R',\n description: `Call 'fs.realpath' on all of the results. In the case\n of an entry that cannot be resolved, the entry is\n omitted. This incurs a slight performance penalty, of\n course, because of the added system calls.`,\n },\n stat: {\n short: 's',\n description: `Call 'fs.lstat' on all entries, whether required or not\n to determine if it's a valid match.`,\n },\n 'match-base': {\n short: 'b',\n description: `Perform a basename-only match if the pattern does not\n contain any slash characters. That is, '*.js' would be\n treated as equivalent to '**/*.js', matching js files\n in all directories.\n `,\n },\n\n dot: {\n description: `Allow patterns to match files/directories that start\n with '.', even if the pattern does not start with '.'\n `,\n },\n nobrace: {\n description: 'Do not expand {...} patterns',\n },\n nocase: {\n description: `Perform a case-insensitive match. This defaults to\n 'true' on macOS and Windows platforms, and false on\n all others.\n\n Note: 'nocase' should only be explicitly set when it is\n known that the filesystem's case sensitivity differs\n from the platform default. If set 'true' on\n case-insensitive file systems, then the walk may return\n more or less results than expected.\n `,\n },\n nodir: {\n description: `Do not match directories, only files.\n\n Note: to *only* match directories, append a '/' at the\n end of the pattern.\n `,\n },\n noext: {\n description: `Do not expand extglob patterns, such as '+(a|b)'`,\n },\n noglobstar: {\n description: `Do not expand '**' against multiple path portions.\n Ie, treat it as a normal '*' instead.`,\n },\n 'windows-path-no-escape': {\n description: `Use '\\\\' as a path separator *only*, and *never* as an\n escape character. If set, all '\\\\' characters are\n replaced with '/' in the pattern.`,\n },\n })\n .num({\n 'max-depth': {\n short: 'D',\n description: `Maximum depth to traverse from the current\n working directory`,\n },\n })\n .opt({\n cwd: {\n short: 'C',\n description: 'Current working directory to execute/match in',\n default: process.cwd(),\n },\n root: {\n short: 'r',\n description: `A string path resolved against the 'cwd', which is\n used as the starting point for absolute patterns that\n start with '/' (but not drive letters or UNC paths\n on Windows).\n\n Note that this *doesn't* necessarily limit the walk to\n the 'root' directory, and doesn't affect the cwd\n starting point for non-absolute patterns. A pattern\n containing '..' will still be able to traverse out of\n the root directory, if it is not an actual root directory\n on the filesystem, and any non-absolute patterns will\n still be matched in the 'cwd'.\n\n To start absolute and non-absolute patterns in the same\n path, you can use '--root=' to set it to the empty\n string. However, be aware that on Windows systems, a\n pattern like 'x:/*' or '//host/share/*' will *always*\n start in the 'x:/' or '//host/share/' directory,\n regardless of the --root setting.\n `,\n },\n platform: {\n description: `Defaults to the value of 'process.platform' if\n available, or 'linux' if not. Setting --platform=win32\n on non-Windows systems may cause strange behavior!`,\n validOptions: [\n 'aix',\n 'android',\n 'darwin',\n 'freebsd',\n 'haiku',\n 'linux',\n 'openbsd',\n 'sunos',\n 'win32',\n 'cygwin',\n 'netbsd',\n ],\n },\n })\n .optList({\n ignore: {\n short: 'i',\n description: `Glob patterns to ignore`,\n },\n })\n .flag({\n debug: {\n short: 'v',\n description: `Output a huge amount of noisy debug information about\n patterns as they are parsed and used to match files.`,\n },\n })\n .flag({\n help: {\n short: 'h',\n description: 'Show this usage information',\n },\n })\n\ntry {\n const { positionals, values } = j.parse()\n if (values.help) {\n console.log(j.usage())\n process.exit(0)\n }\n if (positionals.length === 0 && !values.default)\n throw 'No patterns provided'\n if (positionals.length === 0 && values.default)\n positionals.push(values.default)\n const patterns =\n values.all ? positionals : positionals.filter(p => !existsSync(p))\n const matches =\n values.all ?\n []\n : positionals.filter(p => existsSync(p)).map(p => join(p))\n const stream = globStream(patterns, {\n absolute: values.absolute,\n cwd: values.cwd,\n dot: values.dot,\n dotRelative: values['dot-relative'],\n follow: values.follow,\n ignore: values.ignore,\n mark: values.mark,\n matchBase: values['match-base'],\n maxDepth: values['max-depth'],\n nobrace: values.nobrace,\n nocase: values.nocase,\n nodir: values.nodir,\n noext: values.noext,\n noglobstar: values.noglobstar,\n platform: values.platform as undefined | NodeJS.Platform,\n realpath: values.realpath,\n root: values.root,\n stat: values.stat,\n debug: values.debug,\n posix: values.posix,\n })\n\n const cmd = values.cmd\n if (!cmd) {\n matches.forEach(m => console.log(m))\n stream.on('data', f => console.log(f))\n } else {\n stream.on('data', f => matches.push(f))\n stream.on('end', () => foregroundChild(cmd, matches, { shell: true }))\n }\n} catch (e) {\n console.error(j.usage())\n console.error(e instanceof Error ? e.message : String(e))\n process.exit(1)\n}\n"]} \ No newline at end of file diff --git a/node_modules/glob/dist/esm/glob.d.ts b/node_modules/glob/dist/esm/glob.d.ts deleted file mode 100644 index 25262b3..0000000 --- a/node_modules/glob/dist/esm/glob.d.ts +++ /dev/null @@ -1,388 +0,0 @@ -import { Minimatch } from 'minimatch'; -import { Minipass } from 'minipass'; -import { FSOption, Path, PathScurry } from 'path-scurry'; -import { IgnoreLike } from './ignore.js'; -import { Pattern } from './pattern.js'; -export type MatchSet = Minimatch['set']; -export type GlobParts = Exclude; -/** - * A `GlobOptions` object may be provided to any of the exported methods, and - * must be provided to the `Glob` constructor. - * - * All options are optional, boolean, and false by default, unless otherwise - * noted. - * - * All resolved options are added to the Glob object as properties. - * - * If you are running many `glob` operations, you can pass a Glob object as the - * `options` argument to a subsequent operation to share the previously loaded - * cache. - */ -export interface GlobOptions { - /** - * Set to `true` to always receive absolute paths for - * matched files. Set to `false` to always return relative paths. - * - * When this option is not set, absolute paths are returned for patterns - * that are absolute, and otherwise paths are returned that are relative - * to the `cwd` setting. - * - * This does _not_ make an extra system call to get - * the realpath, it only does string path resolution. - * - * Conflicts with {@link withFileTypes} - */ - absolute?: boolean; - /** - * Set to false to enable {@link windowsPathsNoEscape} - * - * @deprecated - */ - allowWindowsEscape?: boolean; - /** - * The current working directory in which to search. Defaults to - * `process.cwd()`. - * - * May be eiher a string path or a `file://` URL object or string. - */ - cwd?: string | URL; - /** - * Include `.dot` files in normal matches and `globstar` - * matches. Note that an explicit dot in a portion of the pattern - * will always match dot files. - */ - dot?: boolean; - /** - * Prepend all relative path strings with `./` (or `.\` on Windows). - * - * Without this option, returned relative paths are "bare", so instead of - * returning `'./foo/bar'`, they are returned as `'foo/bar'`. - * - * Relative patterns starting with `'../'` are not prepended with `./`, even - * if this option is set. - */ - dotRelative?: boolean; - /** - * Follow symlinked directories when expanding `**` - * patterns. This can result in a lot of duplicate references in - * the presence of cyclic links, and make performance quite bad. - * - * By default, a `**` in a pattern will follow 1 symbolic link if - * it is not the first item in the pattern, or none if it is the - * first item in the pattern, following the same behavior as Bash. - */ - follow?: boolean; - /** - * string or string[], or an object with `ignore` and `ignoreChildren` - * methods. - * - * If a string or string[] is provided, then this is treated as a glob - * pattern or array of glob patterns to exclude from matches. To ignore all - * children within a directory, as well as the entry itself, append `'/**'` - * to the ignore pattern. - * - * **Note** `ignore` patterns are _always_ in `dot:true` mode, regardless of - * any other settings. - * - * If an object is provided that has `ignored(path)` and/or - * `childrenIgnored(path)` methods, then these methods will be called to - * determine whether any Path is a match or if its children should be - * traversed, respectively. - */ - ignore?: string | string[] | IgnoreLike; - /** - * Treat brace expansion like `{a,b}` as a "magic" pattern. Has no - * effect if {@link nobrace} is set. - * - * Only has effect on the {@link hasMagic} function. - */ - magicalBraces?: boolean; - /** - * Add a `/` character to directory matches. Note that this requires - * additional stat calls in some cases. - */ - mark?: boolean; - /** - * Perform a basename-only match if the pattern does not contain any slash - * characters. That is, `*.js` would be treated as equivalent to - * `**\/*.js`, matching all js files in all directories. - */ - matchBase?: boolean; - /** - * Limit the directory traversal to a given depth below the cwd. - * Note that this does NOT prevent traversal to sibling folders, - * root patterns, and so on. It only limits the maximum folder depth - * that the walk will descend, relative to the cwd. - */ - maxDepth?: number; - /** - * Do not expand `{a,b}` and `{1..3}` brace sets. - */ - nobrace?: boolean; - /** - * Perform a case-insensitive match. This defaults to `true` on macOS and - * Windows systems, and `false` on all others. - * - * **Note** `nocase` should only be explicitly set when it is - * known that the filesystem's case sensitivity differs from the - * platform default. If set `true` on case-sensitive file - * systems, or `false` on case-insensitive file systems, then the - * walk may return more or less results than expected. - */ - nocase?: boolean; - /** - * Do not match directories, only files. (Note: to match - * _only_ directories, put a `/` at the end of the pattern.) - */ - nodir?: boolean; - /** - * Do not match "extglob" patterns such as `+(a|b)`. - */ - noext?: boolean; - /** - * Do not match `**` against multiple filenames. (Ie, treat it as a normal - * `*` instead.) - * - * Conflicts with {@link matchBase} - */ - noglobstar?: boolean; - /** - * Defaults to value of `process.platform` if available, or `'linux'` if - * not. Setting `platform:'win32'` on non-Windows systems may cause strange - * behavior. - */ - platform?: NodeJS.Platform; - /** - * Set to true to call `fs.realpath` on all of the - * results. In the case of an entry that cannot be resolved, the - * entry is omitted. This incurs a slight performance penalty, of - * course, because of the added system calls. - */ - realpath?: boolean; - /** - * - * A string path resolved against the `cwd` option, which - * is used as the starting point for absolute patterns that start - * with `/`, (but not drive letters or UNC paths on Windows). - * - * Note that this _doesn't_ necessarily limit the walk to the - * `root` directory, and doesn't affect the cwd starting point for - * non-absolute patterns. A pattern containing `..` will still be - * able to traverse out of the root directory, if it is not an - * actual root directory on the filesystem, and any non-absolute - * patterns will be matched in the `cwd`. For example, the - * pattern `/../*` with `{root:'/some/path'}` will return all - * files in `/some`, not all files in `/some/path`. The pattern - * `*` with `{root:'/some/path'}` will return all the entries in - * the cwd, not the entries in `/some/path`. - * - * To start absolute and non-absolute patterns in the same - * path, you can use `{root:''}`. However, be aware that on - * Windows systems, a pattern like `x:/*` or `//host/share/*` will - * _always_ start in the `x:/` or `//host/share` directory, - * regardless of the `root` setting. - */ - root?: string; - /** - * A [PathScurry](http://npm.im/path-scurry) object used - * to traverse the file system. If the `nocase` option is set - * explicitly, then any provided `scurry` object must match this - * setting. - */ - scurry?: PathScurry; - /** - * Call `lstat()` on all entries, whether required or not to determine - * if it's a valid match. When used with {@link withFileTypes}, this means - * that matches will include data such as modified time, permissions, and - * so on. Note that this will incur a performance cost due to the added - * system calls. - */ - stat?: boolean; - /** - * An AbortSignal which will cancel the Glob walk when - * triggered. - */ - signal?: AbortSignal; - /** - * Use `\\` as a path separator _only_, and - * _never_ as an escape character. If set, all `\\` characters are - * replaced with `/` in the pattern. - * - * Note that this makes it **impossible** to match against paths - * containing literal glob pattern characters, but allows matching - * with patterns constructed using `path.join()` and - * `path.resolve()` on Windows platforms, mimicking the (buggy!) - * behavior of Glob v7 and before on Windows. Please use with - * caution, and be mindful of [the caveat below about Windows - * paths](#windows). (For legacy reasons, this is also set if - * `allowWindowsEscape` is set to the exact value `false`.) - */ - windowsPathsNoEscape?: boolean; - /** - * Return [PathScurry](http://npm.im/path-scurry) - * `Path` objects instead of strings. These are similar to a - * NodeJS `Dirent` object, but with additional methods and - * properties. - * - * Conflicts with {@link absolute} - */ - withFileTypes?: boolean; - /** - * An fs implementation to override some or all of the defaults. See - * http://npm.im/path-scurry for details about what can be overridden. - */ - fs?: FSOption; - /** - * Just passed along to Minimatch. Note that this makes all pattern - * matching operations slower and *extremely* noisy. - */ - debug?: boolean; - /** - * Return `/` delimited paths, even on Windows. - * - * On posix systems, this has no effect. But, on Windows, it means that - * paths will be `/` delimited, and absolute paths will be their full - * resolved UNC forms, eg instead of `'C:\\foo\\bar'`, it would return - * `'//?/C:/foo/bar'` - */ - posix?: boolean; - /** - * Do not match any children of any matches. For example, the pattern - * `**\/foo` would match `a/foo`, but not `a/foo/b/foo` in this mode. - * - * This is especially useful for cases like "find all `node_modules` - * folders, but not the ones in `node_modules`". - * - * In order to support this, the `Ignore` implementation must support an - * `add(pattern: string)` method. If using the default `Ignore` class, then - * this is fine, but if this is set to `false`, and a custom `Ignore` is - * provided that does not have an `add()` method, then it will throw an - * error. - * - * **Caveat** It *only* ignores matches that would be a descendant of a - * previous match, and only if that descendant is matched *after* the - * ancestor is encountered. Since the file system walk happens in - * indeterminate order, it's possible that a match will already be added - * before its ancestor, if multiple or braced patterns are used. - * - * For example: - * - * ```ts - * const results = await glob([ - * // likely to match first, since it's just a stat - * 'a/b/c/d/e/f', - * - * // this pattern is more complicated! It must to various readdir() - * // calls and test the results against a regular expression, and that - * // is certainly going to take a little bit longer. - * // - * // So, later on, it encounters a match at 'a/b/c/d/e', but it's too - * // late to ignore a/b/c/d/e/f, because it's already been emitted. - * 'a/[bdf]/?/[a-z]/*', - * ], { includeChildMatches: false }) - * ``` - * - * It's best to only set this to `false` if you can be reasonably sure that - * no components of the pattern will potentially match one another's file - * system descendants, or if the occasional included child entry will not - * cause problems. - * - * @default true - */ - includeChildMatches?: boolean; -} -export type GlobOptionsWithFileTypesTrue = GlobOptions & { - withFileTypes: true; - absolute?: undefined; - mark?: undefined; - posix?: undefined; -}; -export type GlobOptionsWithFileTypesFalse = GlobOptions & { - withFileTypes?: false; -}; -export type GlobOptionsWithFileTypesUnset = GlobOptions & { - withFileTypes?: undefined; -}; -export type Result = Opts extends GlobOptionsWithFileTypesTrue ? Path : Opts extends GlobOptionsWithFileTypesFalse ? string : Opts extends GlobOptionsWithFileTypesUnset ? string : string | Path; -export type Results = Result[]; -export type FileTypes = Opts extends GlobOptionsWithFileTypesTrue ? true : Opts extends GlobOptionsWithFileTypesFalse ? false : Opts extends GlobOptionsWithFileTypesUnset ? false : boolean; -/** - * An object that can perform glob pattern traversals. - */ -export declare class Glob implements GlobOptions { - absolute?: boolean; - cwd: string; - root?: string; - dot: boolean; - dotRelative: boolean; - follow: boolean; - ignore?: string | string[] | IgnoreLike; - magicalBraces: boolean; - mark?: boolean; - matchBase: boolean; - maxDepth: number; - nobrace: boolean; - nocase: boolean; - nodir: boolean; - noext: boolean; - noglobstar: boolean; - pattern: string[]; - platform: NodeJS.Platform; - realpath: boolean; - scurry: PathScurry; - stat: boolean; - signal?: AbortSignal; - windowsPathsNoEscape: boolean; - withFileTypes: FileTypes; - includeChildMatches: boolean; - /** - * The options provided to the constructor. - */ - opts: Opts; - /** - * An array of parsed immutable {@link Pattern} objects. - */ - patterns: Pattern[]; - /** - * All options are stored as properties on the `Glob` object. - * - * See {@link GlobOptions} for full options descriptions. - * - * Note that a previous `Glob` object can be passed as the - * `GlobOptions` to another `Glob` instantiation to re-use settings - * and caches with a new pattern. - * - * Traversal functions can be called multiple times to run the walk - * again. - */ - constructor(pattern: string | string[], opts: Opts); - /** - * Returns a Promise that resolves to the results array. - */ - walk(): Promise>; - /** - * synchronous {@link Glob.walk} - */ - walkSync(): Results; - /** - * Stream results asynchronously. - */ - stream(): Minipass, Result>; - /** - * Stream results synchronously. - */ - streamSync(): Minipass, Result>; - /** - * Default sync iteration function. Returns a Generator that - * iterates over the results. - */ - iterateSync(): Generator, void, void>; - [Symbol.iterator](): Generator, void, void>; - /** - * Default async iteration function. Returns an AsyncGenerator that - * iterates over the results. - */ - iterate(): AsyncGenerator, void, void>; - [Symbol.asyncIterator](): AsyncGenerator, void, void>; -} -//# sourceMappingURL=glob.d.ts.map \ No newline at end of file diff --git a/node_modules/glob/dist/esm/glob.d.ts.map b/node_modules/glob/dist/esm/glob.d.ts.map deleted file mode 100644 index c32dc74..0000000 --- a/node_modules/glob/dist/esm/glob.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../src/glob.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/glob/dist/esm/glob.js b/node_modules/glob/dist/esm/glob.js deleted file mode 100644 index c9ff3b0..0000000 --- a/node_modules/glob/dist/esm/glob.js +++ /dev/null @@ -1,243 +0,0 @@ -import { Minimatch } from 'minimatch'; -import { fileURLToPath } from 'node:url'; -import { PathScurry, PathScurryDarwin, PathScurryPosix, PathScurryWin32, } from 'path-scurry'; -import { Pattern } from './pattern.js'; -import { GlobStream, GlobWalker } from './walker.js'; -// if no process global, just call it linux. -// so we default to case-sensitive, / separators -const defaultPlatform = (typeof process === 'object' && - process && - typeof process.platform === 'string') ? - process.platform - : 'linux'; -/** - * An object that can perform glob pattern traversals. - */ -export class Glob { - absolute; - cwd; - root; - dot; - dotRelative; - follow; - ignore; - magicalBraces; - mark; - matchBase; - maxDepth; - nobrace; - nocase; - nodir; - noext; - noglobstar; - pattern; - platform; - realpath; - scurry; - stat; - signal; - windowsPathsNoEscape; - withFileTypes; - includeChildMatches; - /** - * The options provided to the constructor. - */ - opts; - /** - * An array of parsed immutable {@link Pattern} objects. - */ - patterns; - /** - * All options are stored as properties on the `Glob` object. - * - * See {@link GlobOptions} for full options descriptions. - * - * Note that a previous `Glob` object can be passed as the - * `GlobOptions` to another `Glob` instantiation to re-use settings - * and caches with a new pattern. - * - * Traversal functions can be called multiple times to run the walk - * again. - */ - constructor(pattern, opts) { - /* c8 ignore start */ - if (!opts) - throw new TypeError('glob options required'); - /* c8 ignore stop */ - this.withFileTypes = !!opts.withFileTypes; - this.signal = opts.signal; - this.follow = !!opts.follow; - this.dot = !!opts.dot; - this.dotRelative = !!opts.dotRelative; - this.nodir = !!opts.nodir; - this.mark = !!opts.mark; - if (!opts.cwd) { - this.cwd = ''; - } - else if (opts.cwd instanceof URL || opts.cwd.startsWith('file://')) { - opts.cwd = fileURLToPath(opts.cwd); - } - this.cwd = opts.cwd || ''; - this.root = opts.root; - this.magicalBraces = !!opts.magicalBraces; - this.nobrace = !!opts.nobrace; - this.noext = !!opts.noext; - this.realpath = !!opts.realpath; - this.absolute = opts.absolute; - this.includeChildMatches = opts.includeChildMatches !== false; - this.noglobstar = !!opts.noglobstar; - this.matchBase = !!opts.matchBase; - this.maxDepth = - typeof opts.maxDepth === 'number' ? opts.maxDepth : Infinity; - this.stat = !!opts.stat; - this.ignore = opts.ignore; - if (this.withFileTypes && this.absolute !== undefined) { - throw new Error('cannot set absolute and withFileTypes:true'); - } - if (typeof pattern === 'string') { - pattern = [pattern]; - } - this.windowsPathsNoEscape = - !!opts.windowsPathsNoEscape || - opts.allowWindowsEscape === - false; - if (this.windowsPathsNoEscape) { - pattern = pattern.map(p => p.replace(/\\/g, '/')); - } - if (this.matchBase) { - if (opts.noglobstar) { - throw new TypeError('base matching requires globstar'); - } - pattern = pattern.map(p => (p.includes('/') ? p : `./**/${p}`)); - } - this.pattern = pattern; - this.platform = opts.platform || defaultPlatform; - this.opts = { ...opts, platform: this.platform }; - if (opts.scurry) { - this.scurry = opts.scurry; - if (opts.nocase !== undefined && - opts.nocase !== opts.scurry.nocase) { - throw new Error('nocase option contradicts provided scurry option'); - } - } - else { - const Scurry = opts.platform === 'win32' ? PathScurryWin32 - : opts.platform === 'darwin' ? PathScurryDarwin - : opts.platform ? PathScurryPosix - : PathScurry; - this.scurry = new Scurry(this.cwd, { - nocase: opts.nocase, - fs: opts.fs, - }); - } - this.nocase = this.scurry.nocase; - // If you do nocase:true on a case-sensitive file system, then - // we need to use regexps instead of strings for non-magic - // path portions, because statting `aBc` won't return results - // for the file `AbC` for example. - const nocaseMagicOnly = this.platform === 'darwin' || this.platform === 'win32'; - const mmo = { - // default nocase based on platform - ...opts, - dot: this.dot, - matchBase: this.matchBase, - nobrace: this.nobrace, - nocase: this.nocase, - nocaseMagicOnly, - nocomment: true, - noext: this.noext, - nonegate: true, - optimizationLevel: 2, - platform: this.platform, - windowsPathsNoEscape: this.windowsPathsNoEscape, - debug: !!this.opts.debug, - }; - const mms = this.pattern.map(p => new Minimatch(p, mmo)); - const [matchSet, globParts] = mms.reduce((set, m) => { - set[0].push(...m.set); - set[1].push(...m.globParts); - return set; - }, [[], []]); - this.patterns = matchSet.map((set, i) => { - const g = globParts[i]; - /* c8 ignore start */ - if (!g) - throw new Error('invalid pattern object'); - /* c8 ignore stop */ - return new Pattern(set, g, 0, this.platform); - }); - } - async walk() { - // Walkers always return array of Path objects, so we just have to - // coerce them into the right shape. It will have already called - // realpath() if the option was set to do so, so we know that's cached. - // start out knowing the cwd, at least - return [ - ...(await new GlobWalker(this.patterns, this.scurry.cwd, { - ...this.opts, - maxDepth: this.maxDepth !== Infinity ? - this.maxDepth + this.scurry.cwd.depth() - : Infinity, - platform: this.platform, - nocase: this.nocase, - includeChildMatches: this.includeChildMatches, - }).walk()), - ]; - } - walkSync() { - return [ - ...new GlobWalker(this.patterns, this.scurry.cwd, { - ...this.opts, - maxDepth: this.maxDepth !== Infinity ? - this.maxDepth + this.scurry.cwd.depth() - : Infinity, - platform: this.platform, - nocase: this.nocase, - includeChildMatches: this.includeChildMatches, - }).walkSync(), - ]; - } - stream() { - return new GlobStream(this.patterns, this.scurry.cwd, { - ...this.opts, - maxDepth: this.maxDepth !== Infinity ? - this.maxDepth + this.scurry.cwd.depth() - : Infinity, - platform: this.platform, - nocase: this.nocase, - includeChildMatches: this.includeChildMatches, - }).stream(); - } - streamSync() { - return new GlobStream(this.patterns, this.scurry.cwd, { - ...this.opts, - maxDepth: this.maxDepth !== Infinity ? - this.maxDepth + this.scurry.cwd.depth() - : Infinity, - platform: this.platform, - nocase: this.nocase, - includeChildMatches: this.includeChildMatches, - }).streamSync(); - } - /** - * Default sync iteration function. Returns a Generator that - * iterates over the results. - */ - iterateSync() { - return this.streamSync()[Symbol.iterator](); - } - [Symbol.iterator]() { - return this.iterateSync(); - } - /** - * Default async iteration function. Returns an AsyncGenerator that - * iterates over the results. - */ - iterate() { - return this.stream()[Symbol.asyncIterator](); - } - [Symbol.asyncIterator]() { - return this.iterate(); - } -} -//# sourceMappingURL=glob.js.map \ No newline at end of file diff --git a/node_modules/glob/dist/esm/glob.js.map b/node_modules/glob/dist/esm/glob.js.map deleted file mode 100644 index a62c323..0000000 --- a/node_modules/glob/dist/esm/glob.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/glob.ts"],"names":[],"mappings":"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","sourcesContent":["import { Minimatch, MinimatchOptions } from 'minimatch'\nimport { Minipass } from 'minipass'\nimport { fileURLToPath } from 'node:url'\nimport {\n FSOption,\n Path,\n PathScurry,\n PathScurryDarwin,\n PathScurryPosix,\n PathScurryWin32,\n} from 'path-scurry'\nimport { IgnoreLike } from './ignore.js'\nimport { Pattern } from './pattern.js'\nimport { GlobStream, GlobWalker } from './walker.js'\n\nexport type MatchSet = Minimatch['set']\nexport type GlobParts = Exclude\n\n// if no process global, just call it linux.\n// so we default to case-sensitive, / separators\nconst defaultPlatform: NodeJS.Platform =\n (\n typeof process === 'object' &&\n process &&\n typeof process.platform === 'string'\n ) ?\n process.platform\n : 'linux'\n\n/**\n * A `GlobOptions` object may be provided to any of the exported methods, and\n * must be provided to the `Glob` constructor.\n *\n * All options are optional, boolean, and false by default, unless otherwise\n * noted.\n *\n * All resolved options are added to the Glob object as properties.\n *\n * If you are running many `glob` operations, you can pass a Glob object as the\n * `options` argument to a subsequent operation to share the previously loaded\n * cache.\n */\nexport interface GlobOptions {\n /**\n * Set to `true` to always receive absolute paths for\n * matched files. Set to `false` to always return relative paths.\n *\n * When this option is not set, absolute paths are returned for patterns\n * that are absolute, and otherwise paths are returned that are relative\n * to the `cwd` setting.\n *\n * This does _not_ make an extra system call to get\n * the realpath, it only does string path resolution.\n *\n * Conflicts with {@link withFileTypes}\n */\n absolute?: boolean\n\n /**\n * Set to false to enable {@link windowsPathsNoEscape}\n *\n * @deprecated\n */\n allowWindowsEscape?: boolean\n\n /**\n * The current working directory in which to search. Defaults to\n * `process.cwd()`.\n *\n * May be eiher a string path or a `file://` URL object or string.\n */\n cwd?: string | URL\n\n /**\n * Include `.dot` files in normal matches and `globstar`\n * matches. Note that an explicit dot in a portion of the pattern\n * will always match dot files.\n */\n dot?: boolean\n\n /**\n * Prepend all relative path strings with `./` (or `.\\` on Windows).\n *\n * Without this option, returned relative paths are \"bare\", so instead of\n * returning `'./foo/bar'`, they are returned as `'foo/bar'`.\n *\n * Relative patterns starting with `'../'` are not prepended with `./`, even\n * if this option is set.\n */\n dotRelative?: boolean\n\n /**\n * Follow symlinked directories when expanding `**`\n * patterns. This can result in a lot of duplicate references in\n * the presence of cyclic links, and make performance quite bad.\n *\n * By default, a `**` in a pattern will follow 1 symbolic link if\n * it is not the first item in the pattern, or none if it is the\n * first item in the pattern, following the same behavior as Bash.\n */\n follow?: boolean\n\n /**\n * string or string[], or an object with `ignore` and `ignoreChildren`\n * methods.\n *\n * If a string or string[] is provided, then this is treated as a glob\n * pattern or array of glob patterns to exclude from matches. To ignore all\n * children within a directory, as well as the entry itself, append `'/**'`\n * to the ignore pattern.\n *\n * **Note** `ignore` patterns are _always_ in `dot:true` mode, regardless of\n * any other settings.\n *\n * If an object is provided that has `ignored(path)` and/or\n * `childrenIgnored(path)` methods, then these methods will be called to\n * determine whether any Path is a match or if its children should be\n * traversed, respectively.\n */\n ignore?: string | string[] | IgnoreLike\n\n /**\n * Treat brace expansion like `{a,b}` as a \"magic\" pattern. Has no\n * effect if {@link nobrace} is set.\n *\n * Only has effect on the {@link hasMagic} function.\n */\n magicalBraces?: boolean\n\n /**\n * Add a `/` character to directory matches. Note that this requires\n * additional stat calls in some cases.\n */\n mark?: boolean\n\n /**\n * Perform a basename-only match if the pattern does not contain any slash\n * characters. That is, `*.js` would be treated as equivalent to\n * `**\\/*.js`, matching all js files in all directories.\n */\n matchBase?: boolean\n\n /**\n * Limit the directory traversal to a given depth below the cwd.\n * Note that this does NOT prevent traversal to sibling folders,\n * root patterns, and so on. It only limits the maximum folder depth\n * that the walk will descend, relative to the cwd.\n */\n maxDepth?: number\n\n /**\n * Do not expand `{a,b}` and `{1..3}` brace sets.\n */\n nobrace?: boolean\n\n /**\n * Perform a case-insensitive match. This defaults to `true` on macOS and\n * Windows systems, and `false` on all others.\n *\n * **Note** `nocase` should only be explicitly set when it is\n * known that the filesystem's case sensitivity differs from the\n * platform default. If set `true` on case-sensitive file\n * systems, or `false` on case-insensitive file systems, then the\n * walk may return more or less results than expected.\n */\n nocase?: boolean\n\n /**\n * Do not match directories, only files. (Note: to match\n * _only_ directories, put a `/` at the end of the pattern.)\n */\n nodir?: boolean\n\n /**\n * Do not match \"extglob\" patterns such as `+(a|b)`.\n */\n noext?: boolean\n\n /**\n * Do not match `**` against multiple filenames. (Ie, treat it as a normal\n * `*` instead.)\n *\n * Conflicts with {@link matchBase}\n */\n noglobstar?: boolean\n\n /**\n * Defaults to value of `process.platform` if available, or `'linux'` if\n * not. Setting `platform:'win32'` on non-Windows systems may cause strange\n * behavior.\n */\n platform?: NodeJS.Platform\n\n /**\n * Set to true to call `fs.realpath` on all of the\n * results. In the case of an entry that cannot be resolved, the\n * entry is omitted. This incurs a slight performance penalty, of\n * course, because of the added system calls.\n */\n realpath?: boolean\n\n /**\n *\n * A string path resolved against the `cwd` option, which\n * is used as the starting point for absolute patterns that start\n * with `/`, (but not drive letters or UNC paths on Windows).\n *\n * Note that this _doesn't_ necessarily limit the walk to the\n * `root` directory, and doesn't affect the cwd starting point for\n * non-absolute patterns. A pattern containing `..` will still be\n * able to traverse out of the root directory, if it is not an\n * actual root directory on the filesystem, and any non-absolute\n * patterns will be matched in the `cwd`. For example, the\n * pattern `/../*` with `{root:'/some/path'}` will return all\n * files in `/some`, not all files in `/some/path`. The pattern\n * `*` with `{root:'/some/path'}` will return all the entries in\n * the cwd, not the entries in `/some/path`.\n *\n * To start absolute and non-absolute patterns in the same\n * path, you can use `{root:''}`. However, be aware that on\n * Windows systems, a pattern like `x:/*` or `//host/share/*` will\n * _always_ start in the `x:/` or `//host/share` directory,\n * regardless of the `root` setting.\n */\n root?: string\n\n /**\n * A [PathScurry](http://npm.im/path-scurry) object used\n * to traverse the file system. If the `nocase` option is set\n * explicitly, then any provided `scurry` object must match this\n * setting.\n */\n scurry?: PathScurry\n\n /**\n * Call `lstat()` on all entries, whether required or not to determine\n * if it's a valid match. When used with {@link withFileTypes}, this means\n * that matches will include data such as modified time, permissions, and\n * so on. Note that this will incur a performance cost due to the added\n * system calls.\n */\n stat?: boolean\n\n /**\n * An AbortSignal which will cancel the Glob walk when\n * triggered.\n */\n signal?: AbortSignal\n\n /**\n * Use `\\\\` as a path separator _only_, and\n * _never_ as an escape character. If set, all `\\\\` characters are\n * replaced with `/` in the pattern.\n *\n * Note that this makes it **impossible** to match against paths\n * containing literal glob pattern characters, but allows matching\n * with patterns constructed using `path.join()` and\n * `path.resolve()` on Windows platforms, mimicking the (buggy!)\n * behavior of Glob v7 and before on Windows. Please use with\n * caution, and be mindful of [the caveat below about Windows\n * paths](#windows). (For legacy reasons, this is also set if\n * `allowWindowsEscape` is set to the exact value `false`.)\n */\n windowsPathsNoEscape?: boolean\n\n /**\n * Return [PathScurry](http://npm.im/path-scurry)\n * `Path` objects instead of strings. These are similar to a\n * NodeJS `Dirent` object, but with additional methods and\n * properties.\n *\n * Conflicts with {@link absolute}\n */\n withFileTypes?: boolean\n\n /**\n * An fs implementation to override some or all of the defaults. See\n * http://npm.im/path-scurry for details about what can be overridden.\n */\n fs?: FSOption\n\n /**\n * Just passed along to Minimatch. Note that this makes all pattern\n * matching operations slower and *extremely* noisy.\n */\n debug?: boolean\n\n /**\n * Return `/` delimited paths, even on Windows.\n *\n * On posix systems, this has no effect. But, on Windows, it means that\n * paths will be `/` delimited, and absolute paths will be their full\n * resolved UNC forms, eg instead of `'C:\\\\foo\\\\bar'`, it would return\n * `'//?/C:/foo/bar'`\n */\n posix?: boolean\n\n /**\n * Do not match any children of any matches. For example, the pattern\n * `**\\/foo` would match `a/foo`, but not `a/foo/b/foo` in this mode.\n *\n * This is especially useful for cases like \"find all `node_modules`\n * folders, but not the ones in `node_modules`\".\n *\n * In order to support this, the `Ignore` implementation must support an\n * `add(pattern: string)` method. If using the default `Ignore` class, then\n * this is fine, but if this is set to `false`, and a custom `Ignore` is\n * provided that does not have an `add()` method, then it will throw an\n * error.\n *\n * **Caveat** It *only* ignores matches that would be a descendant of a\n * previous match, and only if that descendant is matched *after* the\n * ancestor is encountered. Since the file system walk happens in\n * indeterminate order, it's possible that a match will already be added\n * before its ancestor, if multiple or braced patterns are used.\n *\n * For example:\n *\n * ```ts\n * const results = await glob([\n * // likely to match first, since it's just a stat\n * 'a/b/c/d/e/f',\n *\n * // this pattern is more complicated! It must to various readdir()\n * // calls and test the results against a regular expression, and that\n * // is certainly going to take a little bit longer.\n * //\n * // So, later on, it encounters a match at 'a/b/c/d/e', but it's too\n * // late to ignore a/b/c/d/e/f, because it's already been emitted.\n * 'a/[bdf]/?/[a-z]/*',\n * ], { includeChildMatches: false })\n * ```\n *\n * It's best to only set this to `false` if you can be reasonably sure that\n * no components of the pattern will potentially match one another's file\n * system descendants, or if the occasional included child entry will not\n * cause problems.\n *\n * @default true\n */\n includeChildMatches?: boolean\n}\n\nexport type GlobOptionsWithFileTypesTrue = GlobOptions & {\n withFileTypes: true\n // string options not relevant if returning Path objects.\n absolute?: undefined\n mark?: undefined\n posix?: undefined\n}\n\nexport type GlobOptionsWithFileTypesFalse = GlobOptions & {\n withFileTypes?: false\n}\n\nexport type GlobOptionsWithFileTypesUnset = GlobOptions & {\n withFileTypes?: undefined\n}\n\nexport type Result =\n Opts extends GlobOptionsWithFileTypesTrue ? Path\n : Opts extends GlobOptionsWithFileTypesFalse ? string\n : Opts extends GlobOptionsWithFileTypesUnset ? string\n : string | Path\nexport type Results = Result[]\n\nexport type FileTypes =\n Opts extends GlobOptionsWithFileTypesTrue ? true\n : Opts extends GlobOptionsWithFileTypesFalse ? false\n : Opts extends GlobOptionsWithFileTypesUnset ? false\n : boolean\n\n/**\n * An object that can perform glob pattern traversals.\n */\nexport class Glob implements GlobOptions {\n absolute?: boolean\n cwd: string\n root?: string\n dot: boolean\n dotRelative: boolean\n follow: boolean\n ignore?: string | string[] | IgnoreLike\n magicalBraces: boolean\n mark?: boolean\n matchBase: boolean\n maxDepth: number\n nobrace: boolean\n nocase: boolean\n nodir: boolean\n noext: boolean\n noglobstar: boolean\n pattern: string[]\n platform: NodeJS.Platform\n realpath: boolean\n scurry: PathScurry\n stat: boolean\n signal?: AbortSignal\n windowsPathsNoEscape: boolean\n withFileTypes: FileTypes\n includeChildMatches: boolean\n\n /**\n * The options provided to the constructor.\n */\n opts: Opts\n\n /**\n * An array of parsed immutable {@link Pattern} objects.\n */\n patterns: Pattern[]\n\n /**\n * All options are stored as properties on the `Glob` object.\n *\n * See {@link GlobOptions} for full options descriptions.\n *\n * Note that a previous `Glob` object can be passed as the\n * `GlobOptions` to another `Glob` instantiation to re-use settings\n * and caches with a new pattern.\n *\n * Traversal functions can be called multiple times to run the walk\n * again.\n */\n constructor(pattern: string | string[], opts: Opts) {\n /* c8 ignore start */\n if (!opts) throw new TypeError('glob options required')\n /* c8 ignore stop */\n this.withFileTypes = !!opts.withFileTypes as FileTypes\n this.signal = opts.signal\n this.follow = !!opts.follow\n this.dot = !!opts.dot\n this.dotRelative = !!opts.dotRelative\n this.nodir = !!opts.nodir\n this.mark = !!opts.mark\n if (!opts.cwd) {\n this.cwd = ''\n } else if (opts.cwd instanceof URL || opts.cwd.startsWith('file://')) {\n opts.cwd = fileURLToPath(opts.cwd)\n }\n this.cwd = opts.cwd || ''\n this.root = opts.root\n this.magicalBraces = !!opts.magicalBraces\n this.nobrace = !!opts.nobrace\n this.noext = !!opts.noext\n this.realpath = !!opts.realpath\n this.absolute = opts.absolute\n this.includeChildMatches = opts.includeChildMatches !== false\n\n this.noglobstar = !!opts.noglobstar\n this.matchBase = !!opts.matchBase\n this.maxDepth =\n typeof opts.maxDepth === 'number' ? opts.maxDepth : Infinity\n this.stat = !!opts.stat\n this.ignore = opts.ignore\n\n if (this.withFileTypes && this.absolute !== undefined) {\n throw new Error('cannot set absolute and withFileTypes:true')\n }\n\n if (typeof pattern === 'string') {\n pattern = [pattern]\n }\n\n this.windowsPathsNoEscape =\n !!opts.windowsPathsNoEscape ||\n (opts as { allowWindowsEscape?: boolean }).allowWindowsEscape ===\n false\n\n if (this.windowsPathsNoEscape) {\n pattern = pattern.map(p => p.replace(/\\\\/g, '/'))\n }\n\n if (this.matchBase) {\n if (opts.noglobstar) {\n throw new TypeError('base matching requires globstar')\n }\n pattern = pattern.map(p => (p.includes('/') ? p : `./**/${p}`))\n }\n\n this.pattern = pattern\n\n this.platform = opts.platform || defaultPlatform\n this.opts = { ...opts, platform: this.platform }\n if (opts.scurry) {\n this.scurry = opts.scurry\n if (\n opts.nocase !== undefined &&\n opts.nocase !== opts.scurry.nocase\n ) {\n throw new Error('nocase option contradicts provided scurry option')\n }\n } else {\n const Scurry =\n opts.platform === 'win32' ? PathScurryWin32\n : opts.platform === 'darwin' ? PathScurryDarwin\n : opts.platform ? PathScurryPosix\n : PathScurry\n this.scurry = new Scurry(this.cwd, {\n nocase: opts.nocase,\n fs: opts.fs,\n })\n }\n this.nocase = this.scurry.nocase\n\n // If you do nocase:true on a case-sensitive file system, then\n // we need to use regexps instead of strings for non-magic\n // path portions, because statting `aBc` won't return results\n // for the file `AbC` for example.\n const nocaseMagicOnly =\n this.platform === 'darwin' || this.platform === 'win32'\n\n const mmo: MinimatchOptions = {\n // default nocase based on platform\n ...opts,\n dot: this.dot,\n matchBase: this.matchBase,\n nobrace: this.nobrace,\n nocase: this.nocase,\n nocaseMagicOnly,\n nocomment: true,\n noext: this.noext,\n nonegate: true,\n optimizationLevel: 2,\n platform: this.platform,\n windowsPathsNoEscape: this.windowsPathsNoEscape,\n debug: !!this.opts.debug,\n }\n\n const mms = this.pattern.map(p => new Minimatch(p, mmo))\n const [matchSet, globParts] = mms.reduce(\n (set: [MatchSet, GlobParts], m) => {\n set[0].push(...m.set)\n set[1].push(...m.globParts)\n return set\n },\n [[], []],\n )\n this.patterns = matchSet.map((set, i) => {\n const g = globParts[i]\n /* c8 ignore start */\n if (!g) throw new Error('invalid pattern object')\n /* c8 ignore stop */\n return new Pattern(set, g, 0, this.platform)\n })\n }\n\n /**\n * Returns a Promise that resolves to the results array.\n */\n async walk(): Promise>\n async walk(): Promise<(string | Path)[]> {\n // Walkers always return array of Path objects, so we just have to\n // coerce them into the right shape. It will have already called\n // realpath() if the option was set to do so, so we know that's cached.\n // start out knowing the cwd, at least\n return [\n ...(await new GlobWalker(this.patterns, this.scurry.cwd, {\n ...this.opts,\n maxDepth:\n this.maxDepth !== Infinity ?\n this.maxDepth + this.scurry.cwd.depth()\n : Infinity,\n platform: this.platform,\n nocase: this.nocase,\n includeChildMatches: this.includeChildMatches,\n }).walk()),\n ]\n }\n\n /**\n * synchronous {@link Glob.walk}\n */\n walkSync(): Results\n walkSync(): (string | Path)[] {\n return [\n ...new GlobWalker(this.patterns, this.scurry.cwd, {\n ...this.opts,\n maxDepth:\n this.maxDepth !== Infinity ?\n this.maxDepth + this.scurry.cwd.depth()\n : Infinity,\n platform: this.platform,\n nocase: this.nocase,\n includeChildMatches: this.includeChildMatches,\n }).walkSync(),\n ]\n }\n\n /**\n * Stream results asynchronously.\n */\n stream(): Minipass, Result>\n stream(): Minipass {\n return new GlobStream(this.patterns, this.scurry.cwd, {\n ...this.opts,\n maxDepth:\n this.maxDepth !== Infinity ?\n this.maxDepth + this.scurry.cwd.depth()\n : Infinity,\n platform: this.platform,\n nocase: this.nocase,\n includeChildMatches: this.includeChildMatches,\n }).stream()\n }\n\n /**\n * Stream results synchronously.\n */\n streamSync(): Minipass, Result>\n streamSync(): Minipass {\n return new GlobStream(this.patterns, this.scurry.cwd, {\n ...this.opts,\n maxDepth:\n this.maxDepth !== Infinity ?\n this.maxDepth + this.scurry.cwd.depth()\n : Infinity,\n platform: this.platform,\n nocase: this.nocase,\n includeChildMatches: this.includeChildMatches,\n }).streamSync()\n }\n\n /**\n * Default sync iteration function. Returns a Generator that\n * iterates over the results.\n */\n iterateSync(): Generator, void, void> {\n return this.streamSync()[Symbol.iterator]()\n }\n [Symbol.iterator]() {\n return this.iterateSync()\n }\n\n /**\n * Default async iteration function. Returns an AsyncGenerator that\n * iterates over the results.\n */\n iterate(): AsyncGenerator, void, void> {\n return this.stream()[Symbol.asyncIterator]()\n }\n [Symbol.asyncIterator]() {\n return this.iterate()\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/glob/dist/esm/has-magic.d.ts b/node_modules/glob/dist/esm/has-magic.d.ts deleted file mode 100644 index 8aec3bd..0000000 --- a/node_modules/glob/dist/esm/has-magic.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { GlobOptions } from './glob.js'; -/** - * Return true if the patterns provided contain any magic glob characters, - * given the options provided. - * - * Brace expansion is not considered "magic" unless the `magicalBraces` option - * is set, as brace expansion just turns one string into an array of strings. - * So a pattern like `'x{a,b}y'` would return `false`, because `'xay'` and - * `'xby'` both do not contain any magic glob characters, and it's treated the - * same as if you had called it on `['xay', 'xby']`. When `magicalBraces:true` - * is in the options, brace expansion _is_ treated as a pattern having magic. - */ -export declare const hasMagic: (pattern: string | string[], options?: GlobOptions) => boolean; -//# sourceMappingURL=has-magic.d.ts.map \ No newline at end of file diff --git a/node_modules/glob/dist/esm/has-magic.d.ts.map b/node_modules/glob/dist/esm/has-magic.d.ts.map deleted file mode 100644 index b24dd4e..0000000 --- a/node_modules/glob/dist/esm/has-magic.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"has-magic.d.ts","sourceRoot":"","sources":["../../src/has-magic.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAEvC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,QAAQ,YACV,MAAM,GAAG,MAAM,EAAE,YACjB,WAAW,KACnB,OAQF,CAAA"} \ No newline at end of file diff --git a/node_modules/glob/dist/esm/has-magic.js b/node_modules/glob/dist/esm/has-magic.js deleted file mode 100644 index ba2321a..0000000 --- a/node_modules/glob/dist/esm/has-magic.js +++ /dev/null @@ -1,23 +0,0 @@ -import { Minimatch } from 'minimatch'; -/** - * Return true if the patterns provided contain any magic glob characters, - * given the options provided. - * - * Brace expansion is not considered "magic" unless the `magicalBraces` option - * is set, as brace expansion just turns one string into an array of strings. - * So a pattern like `'x{a,b}y'` would return `false`, because `'xay'` and - * `'xby'` both do not contain any magic glob characters, and it's treated the - * same as if you had called it on `['xay', 'xby']`. When `magicalBraces:true` - * is in the options, brace expansion _is_ treated as a pattern having magic. - */ -export const hasMagic = (pattern, options = {}) => { - if (!Array.isArray(pattern)) { - pattern = [pattern]; - } - for (const p of pattern) { - if (new Minimatch(p, options).hasMagic()) - return true; - } - return false; -}; -//# sourceMappingURL=has-magic.js.map \ No newline at end of file diff --git a/node_modules/glob/dist/esm/has-magic.js.map b/node_modules/glob/dist/esm/has-magic.js.map deleted file mode 100644 index a20f5aa..0000000 --- a/node_modules/glob/dist/esm/has-magic.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"has-magic.js","sourceRoot":"","sources":["../../src/has-magic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAGrC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,OAA0B,EAC1B,UAAuB,EAAE,EAChB,EAAE;IACX,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC,OAAO,CAAC,CAAA;IACrB,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,IAAI,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE;YAAE,OAAO,IAAI,CAAA;IACvD,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA","sourcesContent":["import { Minimatch } from 'minimatch'\nimport { GlobOptions } from './glob.js'\n\n/**\n * Return true if the patterns provided contain any magic glob characters,\n * given the options provided.\n *\n * Brace expansion is not considered \"magic\" unless the `magicalBraces` option\n * is set, as brace expansion just turns one string into an array of strings.\n * So a pattern like `'x{a,b}y'` would return `false`, because `'xay'` and\n * `'xby'` both do not contain any magic glob characters, and it's treated the\n * same as if you had called it on `['xay', 'xby']`. When `magicalBraces:true`\n * is in the options, brace expansion _is_ treated as a pattern having magic.\n */\nexport const hasMagic = (\n pattern: string | string[],\n options: GlobOptions = {},\n): boolean => {\n if (!Array.isArray(pattern)) {\n pattern = [pattern]\n }\n for (const p of pattern) {\n if (new Minimatch(p, options).hasMagic()) return true\n }\n return false\n}\n"]} \ No newline at end of file diff --git a/node_modules/glob/dist/esm/ignore.d.ts b/node_modules/glob/dist/esm/ignore.d.ts deleted file mode 100644 index 1893b16..0000000 --- a/node_modules/glob/dist/esm/ignore.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Minimatch, MinimatchOptions } from 'minimatch'; -import { Path } from 'path-scurry'; -import { GlobWalkerOpts } from './walker.js'; -export interface IgnoreLike { - ignored?: (p: Path) => boolean; - childrenIgnored?: (p: Path) => boolean; - add?: (ignore: string) => void; -} -/** - * Class used to process ignored patterns - */ -export declare class Ignore implements IgnoreLike { - relative: Minimatch[]; - relativeChildren: Minimatch[]; - absolute: Minimatch[]; - absoluteChildren: Minimatch[]; - platform: NodeJS.Platform; - mmopts: MinimatchOptions; - constructor(ignored: string[], { nobrace, nocase, noext, noglobstar, platform, }: GlobWalkerOpts); - add(ign: string): void; - ignored(p: Path): boolean; - childrenIgnored(p: Path): boolean; -} -//# sourceMappingURL=ignore.d.ts.map \ No newline at end of file diff --git a/node_modules/glob/dist/esm/ignore.d.ts.map b/node_modules/glob/dist/esm/ignore.d.ts.map deleted file mode 100644 index 57d6ab6..0000000 --- a/node_modules/glob/dist/esm/ignore.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ignore.d.ts","sourceRoot":"","sources":["../../src/ignore.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,OAAO,CAAA;IAC9B,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,OAAO,CAAA;IACtC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;CAC/B;AAWD;;GAEG;AACH,qBAAa,MAAO,YAAW,UAAU;IACvC,QAAQ,EAAE,SAAS,EAAE,CAAA;IACrB,gBAAgB,EAAE,SAAS,EAAE,CAAA;IAC7B,QAAQ,EAAE,SAAS,EAAE,CAAA;IACrB,gBAAgB,EAAE,SAAS,EAAE,CAAA;IAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAA;IACzB,MAAM,EAAE,gBAAgB,CAAA;gBAGtB,OAAO,EAAE,MAAM,EAAE,EACjB,EACE,OAAO,EACP,MAAM,EACN,KAAK,EACL,UAAU,EACV,QAA0B,GAC3B,EAAE,cAAc;IAqBnB,GAAG,CAAC,GAAG,EAAE,MAAM;IAyCf,OAAO,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO;IAczB,eAAe,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO;CAWlC"} \ No newline at end of file diff --git a/node_modules/glob/dist/esm/ignore.js b/node_modules/glob/dist/esm/ignore.js deleted file mode 100644 index 539c4a4..0000000 --- a/node_modules/glob/dist/esm/ignore.js +++ /dev/null @@ -1,115 +0,0 @@ -// give it a pattern, and it'll be able to tell you if -// a given path should be ignored. -// Ignoring a path ignores its children if the pattern ends in /** -// Ignores are always parsed in dot:true mode -import { Minimatch } from 'minimatch'; -import { Pattern } from './pattern.js'; -const defaultPlatform = (typeof process === 'object' && - process && - typeof process.platform === 'string') ? - process.platform - : 'linux'; -/** - * Class used to process ignored patterns - */ -export class Ignore { - relative; - relativeChildren; - absolute; - absoluteChildren; - platform; - mmopts; - constructor(ignored, { nobrace, nocase, noext, noglobstar, platform = defaultPlatform, }) { - this.relative = []; - this.absolute = []; - this.relativeChildren = []; - this.absoluteChildren = []; - this.platform = platform; - this.mmopts = { - dot: true, - nobrace, - nocase, - noext, - noglobstar, - optimizationLevel: 2, - platform, - nocomment: true, - nonegate: true, - }; - for (const ign of ignored) - this.add(ign); - } - add(ign) { - // this is a little weird, but it gives us a clean set of optimized - // minimatch matchers, without getting tripped up if one of them - // ends in /** inside a brace section, and it's only inefficient at - // the start of the walk, not along it. - // It'd be nice if the Pattern class just had a .test() method, but - // handling globstars is a bit of a pita, and that code already lives - // in minimatch anyway. - // Another way would be if maybe Minimatch could take its set/globParts - // as an option, and then we could at least just use Pattern to test - // for absolute-ness. - // Yet another way, Minimatch could take an array of glob strings, and - // a cwd option, and do the right thing. - const mm = new Minimatch(ign, this.mmopts); - for (let i = 0; i < mm.set.length; i++) { - const parsed = mm.set[i]; - const globParts = mm.globParts[i]; - /* c8 ignore start */ - if (!parsed || !globParts) { - throw new Error('invalid pattern object'); - } - // strip off leading ./ portions - // https://github.com/isaacs/node-glob/issues/570 - while (parsed[0] === '.' && globParts[0] === '.') { - parsed.shift(); - globParts.shift(); - } - /* c8 ignore stop */ - const p = new Pattern(parsed, globParts, 0, this.platform); - const m = new Minimatch(p.globString(), this.mmopts); - const children = globParts[globParts.length - 1] === '**'; - const absolute = p.isAbsolute(); - if (absolute) - this.absolute.push(m); - else - this.relative.push(m); - if (children) { - if (absolute) - this.absoluteChildren.push(m); - else - this.relativeChildren.push(m); - } - } - } - ignored(p) { - const fullpath = p.fullpath(); - const fullpaths = `${fullpath}/`; - const relative = p.relative() || '.'; - const relatives = `${relative}/`; - for (const m of this.relative) { - if (m.match(relative) || m.match(relatives)) - return true; - } - for (const m of this.absolute) { - if (m.match(fullpath) || m.match(fullpaths)) - return true; - } - return false; - } - childrenIgnored(p) { - const fullpath = p.fullpath() + '/'; - const relative = (p.relative() || '.') + '/'; - for (const m of this.relativeChildren) { - if (m.match(relative)) - return true; - } - for (const m of this.absoluteChildren) { - if (m.match(fullpath)) - return true; - } - return false; - } -} -//# sourceMappingURL=ignore.js.map \ No newline at end of file diff --git a/node_modules/glob/dist/esm/ignore.js.map b/node_modules/glob/dist/esm/ignore.js.map deleted file mode 100644 index 2cddba2..0000000 --- a/node_modules/glob/dist/esm/ignore.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ignore.js","sourceRoot":"","sources":["../../src/ignore.ts"],"names":[],"mappings":"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","sourcesContent":["// give it a pattern, and it'll be able to tell you if\n// a given path should be ignored.\n// Ignoring a path ignores its children if the pattern ends in /**\n// Ignores are always parsed in dot:true mode\n\nimport { Minimatch, MinimatchOptions } from 'minimatch'\nimport { Path } from 'path-scurry'\nimport { Pattern } from './pattern.js'\nimport { GlobWalkerOpts } from './walker.js'\n\nexport interface IgnoreLike {\n ignored?: (p: Path) => boolean\n childrenIgnored?: (p: Path) => boolean\n add?: (ignore: string) => void\n}\n\nconst defaultPlatform: NodeJS.Platform =\n (\n typeof process === 'object' &&\n process &&\n typeof process.platform === 'string'\n ) ?\n process.platform\n : 'linux'\n\n/**\n * Class used to process ignored patterns\n */\nexport class Ignore implements IgnoreLike {\n relative: Minimatch[]\n relativeChildren: Minimatch[]\n absolute: Minimatch[]\n absoluteChildren: Minimatch[]\n platform: NodeJS.Platform\n mmopts: MinimatchOptions\n\n constructor(\n ignored: string[],\n {\n nobrace,\n nocase,\n noext,\n noglobstar,\n platform = defaultPlatform,\n }: GlobWalkerOpts,\n ) {\n this.relative = []\n this.absolute = []\n this.relativeChildren = []\n this.absoluteChildren = []\n this.platform = platform\n this.mmopts = {\n dot: true,\n nobrace,\n nocase,\n noext,\n noglobstar,\n optimizationLevel: 2,\n platform,\n nocomment: true,\n nonegate: true,\n }\n for (const ign of ignored) this.add(ign)\n }\n\n add(ign: string) {\n // this is a little weird, but it gives us a clean set of optimized\n // minimatch matchers, without getting tripped up if one of them\n // ends in /** inside a brace section, and it's only inefficient at\n // the start of the walk, not along it.\n // It'd be nice if the Pattern class just had a .test() method, but\n // handling globstars is a bit of a pita, and that code already lives\n // in minimatch anyway.\n // Another way would be if maybe Minimatch could take its set/globParts\n // as an option, and then we could at least just use Pattern to test\n // for absolute-ness.\n // Yet another way, Minimatch could take an array of glob strings, and\n // a cwd option, and do the right thing.\n const mm = new Minimatch(ign, this.mmopts)\n for (let i = 0; i < mm.set.length; i++) {\n const parsed = mm.set[i]\n const globParts = mm.globParts[i]\n /* c8 ignore start */\n if (!parsed || !globParts) {\n throw new Error('invalid pattern object')\n }\n // strip off leading ./ portions\n // https://github.com/isaacs/node-glob/issues/570\n while (parsed[0] === '.' && globParts[0] === '.') {\n parsed.shift()\n globParts.shift()\n }\n /* c8 ignore stop */\n const p = new Pattern(parsed, globParts, 0, this.platform)\n const m = new Minimatch(p.globString(), this.mmopts)\n const children = globParts[globParts.length - 1] === '**'\n const absolute = p.isAbsolute()\n if (absolute) this.absolute.push(m)\n else this.relative.push(m)\n if (children) {\n if (absolute) this.absoluteChildren.push(m)\n else this.relativeChildren.push(m)\n }\n }\n }\n\n ignored(p: Path): boolean {\n const fullpath = p.fullpath()\n const fullpaths = `${fullpath}/`\n const relative = p.relative() || '.'\n const relatives = `${relative}/`\n for (const m of this.relative) {\n if (m.match(relative) || m.match(relatives)) return true\n }\n for (const m of this.absolute) {\n if (m.match(fullpath) || m.match(fullpaths)) return true\n }\n return false\n }\n\n childrenIgnored(p: Path): boolean {\n const fullpath = p.fullpath() + '/'\n const relative = (p.relative() || '.') + '/'\n for (const m of this.relativeChildren) {\n if (m.match(relative)) return true\n }\n for (const m of this.absoluteChildren) {\n if (m.match(fullpath)) return true\n }\n return false\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/glob/dist/esm/index.d.ts b/node_modules/glob/dist/esm/index.d.ts deleted file mode 100644 index 9c326dd..0000000 --- a/node_modules/glob/dist/esm/index.d.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { Minipass } from 'minipass'; -import { Path } from 'path-scurry'; -import type { GlobOptions, GlobOptionsWithFileTypesFalse, GlobOptionsWithFileTypesTrue, GlobOptionsWithFileTypesUnset } from './glob.js'; -import { Glob } from './glob.js'; -export { escape, unescape } from 'minimatch'; -export type { FSOption, Path, WalkOptions, WalkOptionsWithFileTypesTrue, WalkOptionsWithFileTypesUnset, } from 'path-scurry'; -export { Glob } from './glob.js'; -export type { GlobOptions, GlobOptionsWithFileTypesFalse, GlobOptionsWithFileTypesTrue, GlobOptionsWithFileTypesUnset, } from './glob.js'; -export { hasMagic } from './has-magic.js'; -export { Ignore } from './ignore.js'; -export type { IgnoreLike } from './ignore.js'; -export type { MatchStream } from './walker.js'; -/** - * Syncronous form of {@link globStream}. Will read all the matches as fast as - * you consume them, even all in a single tick if you consume them immediately, - * but will still respond to backpressure if they're not consumed immediately. - */ -export declare function globStreamSync(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Minipass; -export declare function globStreamSync(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): Minipass; -export declare function globStreamSync(pattern: string | string[], options: GlobOptionsWithFileTypesUnset): Minipass; -export declare function globStreamSync(pattern: string | string[], options: GlobOptions): Minipass | Minipass; -/** - * Return a stream that emits all the strings or `Path` objects and - * then emits `end` when completed. - */ -export declare function globStream(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): Minipass; -export declare function globStream(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Minipass; -export declare function globStream(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): Minipass; -export declare function globStream(pattern: string | string[], options: GlobOptions): Minipass | Minipass; -/** - * Synchronous form of {@link glob} - */ -export declare function globSync(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): string[]; -export declare function globSync(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Path[]; -export declare function globSync(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): string[]; -export declare function globSync(pattern: string | string[], options: GlobOptions): Path[] | string[]; -/** - * Perform an asynchronous glob search for the pattern(s) specified. Returns - * [Path](https://isaacs.github.io/path-scurry/classes/PathBase) objects if the - * {@link withFileTypes} option is set to `true`. See {@link GlobOptions} for - * full option descriptions. - */ -declare function glob_(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): Promise; -declare function glob_(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Promise; -declare function glob_(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): Promise; -declare function glob_(pattern: string | string[], options: GlobOptions): Promise; -/** - * Return a sync iterator for walking glob pattern matches. - */ -export declare function globIterateSync(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): Generator; -export declare function globIterateSync(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Generator; -export declare function globIterateSync(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): Generator; -export declare function globIterateSync(pattern: string | string[], options: GlobOptions): Generator | Generator; -/** - * Return an async iterator for walking glob pattern matches. - */ -export declare function globIterate(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): AsyncGenerator; -export declare function globIterate(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): AsyncGenerator; -export declare function globIterate(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): AsyncGenerator; -export declare function globIterate(pattern: string | string[], options: GlobOptions): AsyncGenerator | AsyncGenerator; -export declare const streamSync: typeof globStreamSync; -export declare const stream: typeof globStream & { - sync: typeof globStreamSync; -}; -export declare const iterateSync: typeof globIterateSync; -export declare const iterate: typeof globIterate & { - sync: typeof globIterateSync; -}; -export declare const sync: typeof globSync & { - stream: typeof globStreamSync; - iterate: typeof globIterateSync; -}; -export declare const glob: typeof glob_ & { - glob: typeof glob_; - globSync: typeof globSync; - sync: typeof globSync & { - stream: typeof globStreamSync; - iterate: typeof globIterateSync; - }; - globStream: typeof globStream; - stream: typeof globStream & { - sync: typeof globStreamSync; - }; - globStreamSync: typeof globStreamSync; - streamSync: typeof globStreamSync; - globIterate: typeof globIterate; - iterate: typeof globIterate & { - sync: typeof globIterateSync; - }; - globIterateSync: typeof globIterateSync; - iterateSync: typeof globIterateSync; - Glob: typeof Glob; - hasMagic: (pattern: string | string[], options?: GlobOptions) => boolean; - escape: (s: string, { windowsPathsNoEscape, }?: Pick) => string; - unescape: (s: string, { windowsPathsNoEscape, }?: Pick) => string; -}; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/glob/dist/esm/index.d.ts.map b/node_modules/glob/dist/esm/index.d.ts.map deleted file mode 100644 index 5fb3225..0000000 --- a/node_modules/glob/dist/esm/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,KAAK,EACV,WAAW,EACX,6BAA6B,EAC7B,4BAA4B,EAC5B,6BAA6B,EAC9B,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAGhC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAC5C,YAAY,EACV,QAAQ,EACR,IAAI,EACJ,WAAW,EACX,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,YAAY,EACV,WAAW,EACX,6BAA6B,EAC7B,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AACvB,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAC3B,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAC3B,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAQlD;;;GAGG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAC3B,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AACvB,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,6BAA6B,GAAG,SAAS,GAClD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAC3B,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAQlD;;GAEG;AACH,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,MAAM,EAAE,CAAA;AACX,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,IAAI,EAAE,CAAA;AACT,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,6BAA6B,GAAG,SAAS,GAClD,MAAM,EAAE,CAAA;AACX,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,IAAI,EAAE,GAAG,MAAM,EAAE,CAAA;AAQpB;;;;;GAKG;AACH,iBAAe,KAAK,CAClB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,6BAA6B,GAAG,SAAS,GAClD,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;AACpB,iBAAe,KAAK,CAClB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;AAClB,iBAAe,KAAK,CAClB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;AACpB,iBAAe,KAAK,CAClB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;AAQ7B;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,6BAA6B,GAAG,SAAS,GAClD,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAChC,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAC9B,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAChC,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAQ9D;;GAEG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,6BAA6B,GAAG,SAAS,GAClD,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AACrC,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AACnC,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AACrC,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AASxE,eAAO,MAAM,UAAU,uBAAiB,CAAA;AACxC,eAAO,MAAM,MAAM;;CAAsD,CAAA;AACzE,eAAO,MAAM,WAAW,wBAAkB,CAAA;AAC1C,eAAO,MAAM,OAAO;;CAElB,CAAA;AACF,eAAO,MAAM,IAAI;;;CAGf,CAAA;AAEF,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;CAgBf,CAAA"} \ No newline at end of file diff --git a/node_modules/glob/dist/esm/index.js b/node_modules/glob/dist/esm/index.js deleted file mode 100644 index e15c1f9..0000000 --- a/node_modules/glob/dist/esm/index.js +++ /dev/null @@ -1,55 +0,0 @@ -import { escape, unescape } from 'minimatch'; -import { Glob } from './glob.js'; -import { hasMagic } from './has-magic.js'; -export { escape, unescape } from 'minimatch'; -export { Glob } from './glob.js'; -export { hasMagic } from './has-magic.js'; -export { Ignore } from './ignore.js'; -export function globStreamSync(pattern, options = {}) { - return new Glob(pattern, options).streamSync(); -} -export function globStream(pattern, options = {}) { - return new Glob(pattern, options).stream(); -} -export function globSync(pattern, options = {}) { - return new Glob(pattern, options).walkSync(); -} -async function glob_(pattern, options = {}) { - return new Glob(pattern, options).walk(); -} -export function globIterateSync(pattern, options = {}) { - return new Glob(pattern, options).iterateSync(); -} -export function globIterate(pattern, options = {}) { - return new Glob(pattern, options).iterate(); -} -// aliases: glob.sync.stream() glob.stream.sync() glob.sync() etc -export const streamSync = globStreamSync; -export const stream = Object.assign(globStream, { sync: globStreamSync }); -export const iterateSync = globIterateSync; -export const iterate = Object.assign(globIterate, { - sync: globIterateSync, -}); -export const sync = Object.assign(globSync, { - stream: globStreamSync, - iterate: globIterateSync, -}); -export const glob = Object.assign(glob_, { - glob: glob_, - globSync, - sync, - globStream, - stream, - globStreamSync, - streamSync, - globIterate, - iterate, - globIterateSync, - iterateSync, - Glob, - hasMagic, - escape, - unescape, -}); -glob.glob = glob; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/glob/dist/esm/index.js.map b/node_modules/glob/dist/esm/index.js.map deleted file mode 100644 index a4f93dd..0000000 --- a/node_modules/glob/dist/esm/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAS5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAQ5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAOhC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAyBpC,MAAM,UAAU,cAAc,CAC5B,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,UAAU,EAAE,CAAA;AAChD,CAAC;AAsBD,MAAM,UAAU,UAAU,CACxB,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,EAAE,CAAA;AAC5C,CAAC;AAqBD,MAAM,UAAU,QAAQ,CACtB,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAA;AAC9C,CAAC;AAwBD,KAAK,UAAU,KAAK,CAClB,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;AAC1C,CAAC;AAqBD,MAAM,UAAU,eAAe,CAC7B,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAA;AACjD,CAAC;AAqBD,MAAM,UAAU,WAAW,CACzB,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,OAAO,EAAE,CAAA;AAC7C,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,MAAM,UAAU,GAAG,cAAc,CAAA;AACxC,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAA;AACzE,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAA;AAC1C,MAAM,CAAC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE;IAChD,IAAI,EAAE,eAAe;CACtB,CAAC,CAAA;AACF,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE;IAC1C,MAAM,EAAE,cAAc;IACtB,OAAO,EAAE,eAAe;CACzB,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;IACvC,IAAI,EAAE,KAAK;IACX,QAAQ;IACR,IAAI;IACJ,UAAU;IACV,MAAM;IACN,cAAc;IACd,UAAU;IACV,WAAW;IACX,OAAO;IACP,eAAe;IACf,WAAW;IACX,IAAI;IACJ,QAAQ;IACR,MAAM;IACN,QAAQ;CACT,CAAC,CAAA;AACF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA","sourcesContent":["import { escape, unescape } from 'minimatch'\nimport { Minipass } from 'minipass'\nimport { Path } from 'path-scurry'\nimport type {\n GlobOptions,\n GlobOptionsWithFileTypesFalse,\n GlobOptionsWithFileTypesTrue,\n GlobOptionsWithFileTypesUnset,\n} from './glob.js'\nimport { Glob } from './glob.js'\nimport { hasMagic } from './has-magic.js'\n\nexport { escape, unescape } from 'minimatch'\nexport type {\n FSOption,\n Path,\n WalkOptions,\n WalkOptionsWithFileTypesTrue,\n WalkOptionsWithFileTypesUnset,\n} from 'path-scurry'\nexport { Glob } from './glob.js'\nexport type {\n GlobOptions,\n GlobOptionsWithFileTypesFalse,\n GlobOptionsWithFileTypesTrue,\n GlobOptionsWithFileTypesUnset,\n} from './glob.js'\nexport { hasMagic } from './has-magic.js'\nexport { Ignore } from './ignore.js'\nexport type { IgnoreLike } from './ignore.js'\nexport type { MatchStream } from './walker.js'\n\n/**\n * Syncronous form of {@link globStream}. Will read all the matches as fast as\n * you consume them, even all in a single tick if you consume them immediately,\n * but will still respond to backpressure if they're not consumed immediately.\n */\nexport function globStreamSync(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesTrue,\n): Minipass\nexport function globStreamSync(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesFalse,\n): Minipass\nexport function globStreamSync(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesUnset,\n): Minipass\nexport function globStreamSync(\n pattern: string | string[],\n options: GlobOptions,\n): Minipass | Minipass\nexport function globStreamSync(\n pattern: string | string[],\n options: GlobOptions = {},\n) {\n return new Glob(pattern, options).streamSync()\n}\n\n/**\n * Return a stream that emits all the strings or `Path` objects and\n * then emits `end` when completed.\n */\nexport function globStream(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesFalse,\n): Minipass\nexport function globStream(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesTrue,\n): Minipass\nexport function globStream(\n pattern: string | string[],\n options?: GlobOptionsWithFileTypesUnset | undefined,\n): Minipass\nexport function globStream(\n pattern: string | string[],\n options: GlobOptions,\n): Minipass | Minipass\nexport function globStream(\n pattern: string | string[],\n options: GlobOptions = {},\n) {\n return new Glob(pattern, options).stream()\n}\n\n/**\n * Synchronous form of {@link glob}\n */\nexport function globSync(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesFalse,\n): string[]\nexport function globSync(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesTrue,\n): Path[]\nexport function globSync(\n pattern: string | string[],\n options?: GlobOptionsWithFileTypesUnset | undefined,\n): string[]\nexport function globSync(\n pattern: string | string[],\n options: GlobOptions,\n): Path[] | string[]\nexport function globSync(\n pattern: string | string[],\n options: GlobOptions = {},\n) {\n return new Glob(pattern, options).walkSync()\n}\n\n/**\n * Perform an asynchronous glob search for the pattern(s) specified. Returns\n * [Path](https://isaacs.github.io/path-scurry/classes/PathBase) objects if the\n * {@link withFileTypes} option is set to `true`. See {@link GlobOptions} for\n * full option descriptions.\n */\nasync function glob_(\n pattern: string | string[],\n options?: GlobOptionsWithFileTypesUnset | undefined,\n): Promise\nasync function glob_(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesTrue,\n): Promise\nasync function glob_(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesFalse,\n): Promise\nasync function glob_(\n pattern: string | string[],\n options: GlobOptions,\n): Promise\nasync function glob_(\n pattern: string | string[],\n options: GlobOptions = {},\n) {\n return new Glob(pattern, options).walk()\n}\n\n/**\n * Return a sync iterator for walking glob pattern matches.\n */\nexport function globIterateSync(\n pattern: string | string[],\n options?: GlobOptionsWithFileTypesUnset | undefined,\n): Generator\nexport function globIterateSync(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesTrue,\n): Generator\nexport function globIterateSync(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesFalse,\n): Generator\nexport function globIterateSync(\n pattern: string | string[],\n options: GlobOptions,\n): Generator | Generator\nexport function globIterateSync(\n pattern: string | string[],\n options: GlobOptions = {},\n) {\n return new Glob(pattern, options).iterateSync()\n}\n\n/**\n * Return an async iterator for walking glob pattern matches.\n */\nexport function globIterate(\n pattern: string | string[],\n options?: GlobOptionsWithFileTypesUnset | undefined,\n): AsyncGenerator\nexport function globIterate(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesTrue,\n): AsyncGenerator\nexport function globIterate(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesFalse,\n): AsyncGenerator\nexport function globIterate(\n pattern: string | string[],\n options: GlobOptions,\n): AsyncGenerator | AsyncGenerator\nexport function globIterate(\n pattern: string | string[],\n options: GlobOptions = {},\n) {\n return new Glob(pattern, options).iterate()\n}\n\n// aliases: glob.sync.stream() glob.stream.sync() glob.sync() etc\nexport const streamSync = globStreamSync\nexport const stream = Object.assign(globStream, { sync: globStreamSync })\nexport const iterateSync = globIterateSync\nexport const iterate = Object.assign(globIterate, {\n sync: globIterateSync,\n})\nexport const sync = Object.assign(globSync, {\n stream: globStreamSync,\n iterate: globIterateSync,\n})\n\nexport const glob = Object.assign(glob_, {\n glob: glob_,\n globSync,\n sync,\n globStream,\n stream,\n globStreamSync,\n streamSync,\n globIterate,\n iterate,\n globIterateSync,\n iterateSync,\n Glob,\n hasMagic,\n escape,\n unescape,\n})\nglob.glob = glob\n"]} \ No newline at end of file diff --git a/node_modules/glob/dist/esm/package.json b/node_modules/glob/dist/esm/package.json deleted file mode 100644 index 3dbc1ca..0000000 --- a/node_modules/glob/dist/esm/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "module" -} diff --git a/node_modules/glob/dist/esm/pattern.d.ts b/node_modules/glob/dist/esm/pattern.d.ts deleted file mode 100644 index 9636df3..0000000 --- a/node_modules/glob/dist/esm/pattern.d.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { GLOBSTAR } from 'minimatch'; -export type MMPattern = string | RegExp | typeof GLOBSTAR; -export type PatternList = [p: MMPattern, ...rest: MMPattern[]]; -export type UNCPatternList = [ - p0: '', - p1: '', - p2: string, - p3: string, - ...rest: MMPattern[] -]; -export type DrivePatternList = [p0: string, ...rest: MMPattern[]]; -export type AbsolutePatternList = [p0: '', ...rest: MMPattern[]]; -export type GlobList = [p: string, ...rest: string[]]; -/** - * An immutable-ish view on an array of glob parts and their parsed - * results - */ -export declare class Pattern { - #private; - readonly length: number; - constructor(patternList: MMPattern[], globList: string[], index: number, platform: NodeJS.Platform); - /** - * The first entry in the parsed list of patterns - */ - pattern(): MMPattern; - /** - * true of if pattern() returns a string - */ - isString(): boolean; - /** - * true of if pattern() returns GLOBSTAR - */ - isGlobstar(): boolean; - /** - * true if pattern() returns a regexp - */ - isRegExp(): boolean; - /** - * The /-joined set of glob parts that make up this pattern - */ - globString(): string; - /** - * true if there are more pattern parts after this one - */ - hasMore(): boolean; - /** - * The rest of the pattern after this part, or null if this is the end - */ - rest(): Pattern | null; - /** - * true if the pattern represents a //unc/path/ on windows - */ - isUNC(): boolean; - /** - * True if the pattern starts with a drive letter on Windows - */ - isDrive(): boolean; - /** - * True if the pattern is rooted on an absolute path - */ - isAbsolute(): boolean; - /** - * consume the root of the pattern, and return it - */ - root(): string; - /** - * Check to see if the current globstar pattern is allowed to follow - * a symbolic link. - */ - checkFollowGlobstar(): boolean; - /** - * Mark that the current globstar pattern is following a symbolic link - */ - markFollowGlobstar(): boolean; -} -//# sourceMappingURL=pattern.d.ts.map \ No newline at end of file diff --git a/node_modules/glob/dist/esm/pattern.d.ts.map b/node_modules/glob/dist/esm/pattern.d.ts.map deleted file mode 100644 index cdf3223..0000000 --- a/node_modules/glob/dist/esm/pattern.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"pattern.d.ts","sourceRoot":"","sources":["../../src/pattern.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,QAAQ,CAAA;AAGzD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;AAC9D,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,MAAM;IACV,GAAG,IAAI,EAAE,SAAS,EAAE;CACrB,CAAA;AACD,MAAM,MAAM,gBAAgB,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;AACjE,MAAM,MAAM,mBAAmB,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;AAChE,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;AAMrD;;;GAGG;AACH,qBAAa,OAAO;;IAIlB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;gBAUrB,WAAW,EAAE,SAAS,EAAE,EACxB,QAAQ,EAAE,MAAM,EAAE,EAClB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,CAAC,QAAQ;IA6D3B;;OAEG;IACH,OAAO,IAAI,SAAS;IAIpB;;OAEG;IACH,QAAQ,IAAI,OAAO;IAGnB;;OAEG;IACH,UAAU,IAAI,OAAO;IAGrB;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;OAEG;IACH,UAAU,IAAI,MAAM;IAUpB;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,IAAI,IAAI,OAAO,GAAG,IAAI;IAetB;;OAEG;IACH,KAAK,IAAI,OAAO;IAoBhB;;OAEG;IACH,OAAO,IAAI,OAAO;IAelB;;OAEG;IACH,UAAU,IAAI,OAAO;IAUrB;;OAEG;IACH,IAAI,IAAI,MAAM;IASd;;;OAGG;IACH,mBAAmB,IAAI,OAAO;IAQ9B;;OAEG;IACH,kBAAkB,IAAI,OAAO;CAM9B"} \ No newline at end of file diff --git a/node_modules/glob/dist/esm/pattern.js b/node_modules/glob/dist/esm/pattern.js deleted file mode 100644 index b41defa..0000000 --- a/node_modules/glob/dist/esm/pattern.js +++ /dev/null @@ -1,215 +0,0 @@ -// this is just a very light wrapper around 2 arrays with an offset index -import { GLOBSTAR } from 'minimatch'; -const isPatternList = (pl) => pl.length >= 1; -const isGlobList = (gl) => gl.length >= 1; -/** - * An immutable-ish view on an array of glob parts and their parsed - * results - */ -export class Pattern { - #patternList; - #globList; - #index; - length; - #platform; - #rest; - #globString; - #isDrive; - #isUNC; - #isAbsolute; - #followGlobstar = true; - constructor(patternList, globList, index, platform) { - if (!isPatternList(patternList)) { - throw new TypeError('empty pattern list'); - } - if (!isGlobList(globList)) { - throw new TypeError('empty glob list'); - } - if (globList.length !== patternList.length) { - throw new TypeError('mismatched pattern list and glob list lengths'); - } - this.length = patternList.length; - if (index < 0 || index >= this.length) { - throw new TypeError('index out of range'); - } - this.#patternList = patternList; - this.#globList = globList; - this.#index = index; - this.#platform = platform; - // normalize root entries of absolute patterns on initial creation. - if (this.#index === 0) { - // c: => ['c:/'] - // C:/ => ['C:/'] - // C:/x => ['C:/', 'x'] - // //host/share => ['//host/share/'] - // //host/share/ => ['//host/share/'] - // //host/share/x => ['//host/share/', 'x'] - // /etc => ['/', 'etc'] - // / => ['/'] - if (this.isUNC()) { - // '' / '' / 'host' / 'share' - const [p0, p1, p2, p3, ...prest] = this.#patternList; - const [g0, g1, g2, g3, ...grest] = this.#globList; - if (prest[0] === '') { - // ends in / - prest.shift(); - grest.shift(); - } - const p = [p0, p1, p2, p3, ''].join('/'); - const g = [g0, g1, g2, g3, ''].join('/'); - this.#patternList = [p, ...prest]; - this.#globList = [g, ...grest]; - this.length = this.#patternList.length; - } - else if (this.isDrive() || this.isAbsolute()) { - const [p1, ...prest] = this.#patternList; - const [g1, ...grest] = this.#globList; - if (prest[0] === '') { - // ends in / - prest.shift(); - grest.shift(); - } - const p = p1 + '/'; - const g = g1 + '/'; - this.#patternList = [p, ...prest]; - this.#globList = [g, ...grest]; - this.length = this.#patternList.length; - } - } - } - /** - * The first entry in the parsed list of patterns - */ - pattern() { - return this.#patternList[this.#index]; - } - /** - * true of if pattern() returns a string - */ - isString() { - return typeof this.#patternList[this.#index] === 'string'; - } - /** - * true of if pattern() returns GLOBSTAR - */ - isGlobstar() { - return this.#patternList[this.#index] === GLOBSTAR; - } - /** - * true if pattern() returns a regexp - */ - isRegExp() { - return this.#patternList[this.#index] instanceof RegExp; - } - /** - * The /-joined set of glob parts that make up this pattern - */ - globString() { - return (this.#globString = - this.#globString || - (this.#index === 0 ? - this.isAbsolute() ? - this.#globList[0] + this.#globList.slice(1).join('/') - : this.#globList.join('/') - : this.#globList.slice(this.#index).join('/'))); - } - /** - * true if there are more pattern parts after this one - */ - hasMore() { - return this.length > this.#index + 1; - } - /** - * The rest of the pattern after this part, or null if this is the end - */ - rest() { - if (this.#rest !== undefined) - return this.#rest; - if (!this.hasMore()) - return (this.#rest = null); - this.#rest = new Pattern(this.#patternList, this.#globList, this.#index + 1, this.#platform); - this.#rest.#isAbsolute = this.#isAbsolute; - this.#rest.#isUNC = this.#isUNC; - this.#rest.#isDrive = this.#isDrive; - return this.#rest; - } - /** - * true if the pattern represents a //unc/path/ on windows - */ - isUNC() { - const pl = this.#patternList; - return this.#isUNC !== undefined ? - this.#isUNC - : (this.#isUNC = - this.#platform === 'win32' && - this.#index === 0 && - pl[0] === '' && - pl[1] === '' && - typeof pl[2] === 'string' && - !!pl[2] && - typeof pl[3] === 'string' && - !!pl[3]); - } - // pattern like C:/... - // split = ['C:', ...] - // XXX: would be nice to handle patterns like `c:*` to test the cwd - // in c: for *, but I don't know of a way to even figure out what that - // cwd is without actually chdir'ing into it? - /** - * True if the pattern starts with a drive letter on Windows - */ - isDrive() { - const pl = this.#patternList; - return this.#isDrive !== undefined ? - this.#isDrive - : (this.#isDrive = - this.#platform === 'win32' && - this.#index === 0 && - this.length > 1 && - typeof pl[0] === 'string' && - /^[a-z]:$/i.test(pl[0])); - } - // pattern = '/' or '/...' or '/x/...' - // split = ['', ''] or ['', ...] or ['', 'x', ...] - // Drive and UNC both considered absolute on windows - /** - * True if the pattern is rooted on an absolute path - */ - isAbsolute() { - const pl = this.#patternList; - return this.#isAbsolute !== undefined ? - this.#isAbsolute - : (this.#isAbsolute = - (pl[0] === '' && pl.length > 1) || - this.isDrive() || - this.isUNC()); - } - /** - * consume the root of the pattern, and return it - */ - root() { - const p = this.#patternList[0]; - return (typeof p === 'string' && this.isAbsolute() && this.#index === 0) ? - p - : ''; - } - /** - * Check to see if the current globstar pattern is allowed to follow - * a symbolic link. - */ - checkFollowGlobstar() { - return !(this.#index === 0 || - !this.isGlobstar() || - !this.#followGlobstar); - } - /** - * Mark that the current globstar pattern is following a symbolic link - */ - markFollowGlobstar() { - if (this.#index === 0 || !this.isGlobstar() || !this.#followGlobstar) - return false; - this.#followGlobstar = false; - return true; - } -} -//# sourceMappingURL=pattern.js.map \ No newline at end of file diff --git a/node_modules/glob/dist/esm/pattern.js.map b/node_modules/glob/dist/esm/pattern.js.map deleted file mode 100644 index 566a306..0000000 --- a/node_modules/glob/dist/esm/pattern.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"pattern.js","sourceRoot":"","sources":["../../src/pattern.ts"],"names":[],"mappings":"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","sourcesContent":["// this is just a very light wrapper around 2 arrays with an offset index\n\nimport { GLOBSTAR } from 'minimatch'\nexport type MMPattern = string | RegExp | typeof GLOBSTAR\n\n// an array of length >= 1\nexport type PatternList = [p: MMPattern, ...rest: MMPattern[]]\nexport type UNCPatternList = [\n p0: '',\n p1: '',\n p2: string,\n p3: string,\n ...rest: MMPattern[],\n]\nexport type DrivePatternList = [p0: string, ...rest: MMPattern[]]\nexport type AbsolutePatternList = [p0: '', ...rest: MMPattern[]]\nexport type GlobList = [p: string, ...rest: string[]]\n\nconst isPatternList = (pl: MMPattern[]): pl is PatternList =>\n pl.length >= 1\nconst isGlobList = (gl: string[]): gl is GlobList => gl.length >= 1\n\n/**\n * An immutable-ish view on an array of glob parts and their parsed\n * results\n */\nexport class Pattern {\n readonly #patternList: PatternList\n readonly #globList: GlobList\n readonly #index: number\n readonly length: number\n readonly #platform: NodeJS.Platform\n #rest?: Pattern | null\n #globString?: string\n #isDrive?: boolean\n #isUNC?: boolean\n #isAbsolute?: boolean\n #followGlobstar: boolean = true\n\n constructor(\n patternList: MMPattern[],\n globList: string[],\n index: number,\n platform: NodeJS.Platform,\n ) {\n if (!isPatternList(patternList)) {\n throw new TypeError('empty pattern list')\n }\n if (!isGlobList(globList)) {\n throw new TypeError('empty glob list')\n }\n if (globList.length !== patternList.length) {\n throw new TypeError('mismatched pattern list and glob list lengths')\n }\n this.length = patternList.length\n if (index < 0 || index >= this.length) {\n throw new TypeError('index out of range')\n }\n this.#patternList = patternList\n this.#globList = globList\n this.#index = index\n this.#platform = platform\n\n // normalize root entries of absolute patterns on initial creation.\n if (this.#index === 0) {\n // c: => ['c:/']\n // C:/ => ['C:/']\n // C:/x => ['C:/', 'x']\n // //host/share => ['//host/share/']\n // //host/share/ => ['//host/share/']\n // //host/share/x => ['//host/share/', 'x']\n // /etc => ['/', 'etc']\n // / => ['/']\n if (this.isUNC()) {\n // '' / '' / 'host' / 'share'\n const [p0, p1, p2, p3, ...prest] = this.#patternList\n const [g0, g1, g2, g3, ...grest] = this.#globList\n if (prest[0] === '') {\n // ends in /\n prest.shift()\n grest.shift()\n }\n const p = [p0, p1, p2, p3, ''].join('/')\n const g = [g0, g1, g2, g3, ''].join('/')\n this.#patternList = [p, ...prest]\n this.#globList = [g, ...grest]\n this.length = this.#patternList.length\n } else if (this.isDrive() || this.isAbsolute()) {\n const [p1, ...prest] = this.#patternList\n const [g1, ...grest] = this.#globList\n if (prest[0] === '') {\n // ends in /\n prest.shift()\n grest.shift()\n }\n const p = (p1 as string) + '/'\n const g = g1 + '/'\n this.#patternList = [p, ...prest]\n this.#globList = [g, ...grest]\n this.length = this.#patternList.length\n }\n }\n }\n\n /**\n * The first entry in the parsed list of patterns\n */\n pattern(): MMPattern {\n return this.#patternList[this.#index] as MMPattern\n }\n\n /**\n * true of if pattern() returns a string\n */\n isString(): boolean {\n return typeof this.#patternList[this.#index] === 'string'\n }\n /**\n * true of if pattern() returns GLOBSTAR\n */\n isGlobstar(): boolean {\n return this.#patternList[this.#index] === GLOBSTAR\n }\n /**\n * true if pattern() returns a regexp\n */\n isRegExp(): boolean {\n return this.#patternList[this.#index] instanceof RegExp\n }\n\n /**\n * The /-joined set of glob parts that make up this pattern\n */\n globString(): string {\n return (this.#globString =\n this.#globString ||\n (this.#index === 0 ?\n this.isAbsolute() ?\n this.#globList[0] + this.#globList.slice(1).join('/')\n : this.#globList.join('/')\n : this.#globList.slice(this.#index).join('/')))\n }\n\n /**\n * true if there are more pattern parts after this one\n */\n hasMore(): boolean {\n return this.length > this.#index + 1\n }\n\n /**\n * The rest of the pattern after this part, or null if this is the end\n */\n rest(): Pattern | null {\n if (this.#rest !== undefined) return this.#rest\n if (!this.hasMore()) return (this.#rest = null)\n this.#rest = new Pattern(\n this.#patternList,\n this.#globList,\n this.#index + 1,\n this.#platform,\n )\n this.#rest.#isAbsolute = this.#isAbsolute\n this.#rest.#isUNC = this.#isUNC\n this.#rest.#isDrive = this.#isDrive\n return this.#rest\n }\n\n /**\n * true if the pattern represents a //unc/path/ on windows\n */\n isUNC(): boolean {\n const pl = this.#patternList\n return this.#isUNC !== undefined ?\n this.#isUNC\n : (this.#isUNC =\n this.#platform === 'win32' &&\n this.#index === 0 &&\n pl[0] === '' &&\n pl[1] === '' &&\n typeof pl[2] === 'string' &&\n !!pl[2] &&\n typeof pl[3] === 'string' &&\n !!pl[3])\n }\n\n // pattern like C:/...\n // split = ['C:', ...]\n // XXX: would be nice to handle patterns like `c:*` to test the cwd\n // in c: for *, but I don't know of a way to even figure out what that\n // cwd is without actually chdir'ing into it?\n /**\n * True if the pattern starts with a drive letter on Windows\n */\n isDrive(): boolean {\n const pl = this.#patternList\n return this.#isDrive !== undefined ?\n this.#isDrive\n : (this.#isDrive =\n this.#platform === 'win32' &&\n this.#index === 0 &&\n this.length > 1 &&\n typeof pl[0] === 'string' &&\n /^[a-z]:$/i.test(pl[0]))\n }\n\n // pattern = '/' or '/...' or '/x/...'\n // split = ['', ''] or ['', ...] or ['', 'x', ...]\n // Drive and UNC both considered absolute on windows\n /**\n * True if the pattern is rooted on an absolute path\n */\n isAbsolute(): boolean {\n const pl = this.#patternList\n return this.#isAbsolute !== undefined ?\n this.#isAbsolute\n : (this.#isAbsolute =\n (pl[0] === '' && pl.length > 1) ||\n this.isDrive() ||\n this.isUNC())\n }\n\n /**\n * consume the root of the pattern, and return it\n */\n root(): string {\n const p = this.#patternList[0]\n return (\n typeof p === 'string' && this.isAbsolute() && this.#index === 0\n ) ?\n p\n : ''\n }\n\n /**\n * Check to see if the current globstar pattern is allowed to follow\n * a symbolic link.\n */\n checkFollowGlobstar(): boolean {\n return !(\n this.#index === 0 ||\n !this.isGlobstar() ||\n !this.#followGlobstar\n )\n }\n\n /**\n * Mark that the current globstar pattern is following a symbolic link\n */\n markFollowGlobstar(): boolean {\n if (this.#index === 0 || !this.isGlobstar() || !this.#followGlobstar)\n return false\n this.#followGlobstar = false\n return true\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/glob/dist/esm/processor.d.ts b/node_modules/glob/dist/esm/processor.d.ts deleted file mode 100644 index ccedfbf..0000000 --- a/node_modules/glob/dist/esm/processor.d.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { MMRegExp } from 'minimatch'; -import { Path } from 'path-scurry'; -import { Pattern } from './pattern.js'; -import { GlobWalkerOpts } from './walker.js'; -/** - * A cache of which patterns have been processed for a given Path - */ -export declare class HasWalkedCache { - store: Map>; - constructor(store?: Map>); - copy(): HasWalkedCache; - hasWalked(target: Path, pattern: Pattern): boolean | undefined; - storeWalked(target: Path, pattern: Pattern): void; -} -/** - * A record of which paths have been matched in a given walk step, - * and whether they only are considered a match if they are a directory, - * and whether their absolute or relative path should be returned. - */ -export declare class MatchRecord { - store: Map; - add(target: Path, absolute: boolean, ifDir: boolean): void; - entries(): [Path, boolean, boolean][]; -} -/** - * A collection of patterns that must be processed in a subsequent step - * for a given path. - */ -export declare class SubWalks { - store: Map; - add(target: Path, pattern: Pattern): void; - get(target: Path): Pattern[]; - entries(): [Path, Pattern[]][]; - keys(): Path[]; -} -/** - * The class that processes patterns for a given path. - * - * Handles child entry filtering, and determining whether a path's - * directory contents must be read. - */ -export declare class Processor { - hasWalkedCache: HasWalkedCache; - matches: MatchRecord; - subwalks: SubWalks; - patterns?: Pattern[]; - follow: boolean; - dot: boolean; - opts: GlobWalkerOpts; - constructor(opts: GlobWalkerOpts, hasWalkedCache?: HasWalkedCache); - processPatterns(target: Path, patterns: Pattern[]): this; - subwalkTargets(): Path[]; - child(): Processor; - filterEntries(parent: Path, entries: Path[]): Processor; - testGlobstar(e: Path, pattern: Pattern, rest: Pattern | null, absolute: boolean): void; - testRegExp(e: Path, p: MMRegExp, rest: Pattern | null, absolute: boolean): void; - testString(e: Path, p: string, rest: Pattern | null, absolute: boolean): void; -} -//# sourceMappingURL=processor.d.ts.map \ No newline at end of file diff --git a/node_modules/glob/dist/esm/processor.d.ts.map b/node_modules/glob/dist/esm/processor.d.ts.map deleted file mode 100644 index aa266fe..0000000 --- a/node_modules/glob/dist/esm/processor.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"processor.d.ts","sourceRoot":"","sources":["../../src/processor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAY,QAAQ,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAa,OAAO,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C;;GAEG;AACH,qBAAa,cAAc;IACzB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;gBACnB,KAAK,GAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IAGvD,IAAI;IAGJ,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO;IAGxC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO;CAM3C;AAED;;;;GAIG;AACH,qBAAa,WAAW;IACtB,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAY;IACpC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO;IAMnD,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE;CAOtC;AAED;;;GAGG;AACH,qBAAa,QAAQ;IACnB,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAY;IACvC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO;IAWlC,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,EAAE;IAS5B,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE;IAG9B,IAAI,IAAI,IAAI,EAAE;CAGf;AAED;;;;;GAKG;AACH,qBAAa,SAAS;IACpB,cAAc,EAAE,cAAc,CAAA;IAC9B,OAAO,cAAoB;IAC3B,QAAQ,WAAiB;IACzB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;IACpB,MAAM,EAAE,OAAO,CAAA;IACf,GAAG,EAAE,OAAO,CAAA;IACZ,IAAI,EAAE,cAAc,CAAA;gBAER,IAAI,EAAE,cAAc,EAAE,cAAc,CAAC,EAAE,cAAc;IAQjE,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE;IAmGjD,cAAc,IAAI,IAAI,EAAE;IAIxB,KAAK;IAQL,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,SAAS;IAqBvD,YAAY,CACV,CAAC,EAAE,IAAI,EACP,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,OAAO,GAAG,IAAI,EACpB,QAAQ,EAAE,OAAO;IA8CnB,UAAU,CACR,CAAC,EAAE,IAAI,EACP,CAAC,EAAE,QAAQ,EACX,IAAI,EAAE,OAAO,GAAG,IAAI,EACpB,QAAQ,EAAE,OAAO;IAUnB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,EAAE,QAAQ,EAAE,OAAO;CASvE"} \ No newline at end of file diff --git a/node_modules/glob/dist/esm/processor.js b/node_modules/glob/dist/esm/processor.js deleted file mode 100644 index f874892..0000000 --- a/node_modules/glob/dist/esm/processor.js +++ /dev/null @@ -1,294 +0,0 @@ -// synchronous utility for filtering entries and calculating subwalks -import { GLOBSTAR } from 'minimatch'; -/** - * A cache of which patterns have been processed for a given Path - */ -export class HasWalkedCache { - store; - constructor(store = new Map()) { - this.store = store; - } - copy() { - return new HasWalkedCache(new Map(this.store)); - } - hasWalked(target, pattern) { - return this.store.get(target.fullpath())?.has(pattern.globString()); - } - storeWalked(target, pattern) { - const fullpath = target.fullpath(); - const cached = this.store.get(fullpath); - if (cached) - cached.add(pattern.globString()); - else - this.store.set(fullpath, new Set([pattern.globString()])); - } -} -/** - * A record of which paths have been matched in a given walk step, - * and whether they only are considered a match if they are a directory, - * and whether their absolute or relative path should be returned. - */ -export class MatchRecord { - store = new Map(); - add(target, absolute, ifDir) { - const n = (absolute ? 2 : 0) | (ifDir ? 1 : 0); - const current = this.store.get(target); - this.store.set(target, current === undefined ? n : n & current); - } - // match, absolute, ifdir - entries() { - return [...this.store.entries()].map(([path, n]) => [ - path, - !!(n & 2), - !!(n & 1), - ]); - } -} -/** - * A collection of patterns that must be processed in a subsequent step - * for a given path. - */ -export class SubWalks { - store = new Map(); - add(target, pattern) { - if (!target.canReaddir()) { - return; - } - const subs = this.store.get(target); - if (subs) { - if (!subs.find(p => p.globString() === pattern.globString())) { - subs.push(pattern); - } - } - else - this.store.set(target, [pattern]); - } - get(target) { - const subs = this.store.get(target); - /* c8 ignore start */ - if (!subs) { - throw new Error('attempting to walk unknown path'); - } - /* c8 ignore stop */ - return subs; - } - entries() { - return this.keys().map(k => [k, this.store.get(k)]); - } - keys() { - return [...this.store.keys()].filter(t => t.canReaddir()); - } -} -/** - * The class that processes patterns for a given path. - * - * Handles child entry filtering, and determining whether a path's - * directory contents must be read. - */ -export class Processor { - hasWalkedCache; - matches = new MatchRecord(); - subwalks = new SubWalks(); - patterns; - follow; - dot; - opts; - constructor(opts, hasWalkedCache) { - this.opts = opts; - this.follow = !!opts.follow; - this.dot = !!opts.dot; - this.hasWalkedCache = - hasWalkedCache ? hasWalkedCache.copy() : new HasWalkedCache(); - } - processPatterns(target, patterns) { - this.patterns = patterns; - const processingSet = patterns.map(p => [target, p]); - // map of paths to the magic-starting subwalks they need to walk - // first item in patterns is the filter - for (let [t, pattern] of processingSet) { - this.hasWalkedCache.storeWalked(t, pattern); - const root = pattern.root(); - const absolute = pattern.isAbsolute() && this.opts.absolute !== false; - // start absolute patterns at root - if (root) { - t = t.resolve(root === '/' && this.opts.root !== undefined ? - this.opts.root - : root); - const rest = pattern.rest(); - if (!rest) { - this.matches.add(t, true, false); - continue; - } - else { - pattern = rest; - } - } - if (t.isENOENT()) - continue; - let p; - let rest; - let changed = false; - while (typeof (p = pattern.pattern()) === 'string' && - (rest = pattern.rest())) { - const c = t.resolve(p); - t = c; - pattern = rest; - changed = true; - } - p = pattern.pattern(); - rest = pattern.rest(); - if (changed) { - if (this.hasWalkedCache.hasWalked(t, pattern)) - continue; - this.hasWalkedCache.storeWalked(t, pattern); - } - // now we have either a final string for a known entry, - // more strings for an unknown entry, - // or a pattern starting with magic, mounted on t. - if (typeof p === 'string') { - // must not be final entry, otherwise we would have - // concatenated it earlier. - const ifDir = p === '..' || p === '' || p === '.'; - this.matches.add(t.resolve(p), absolute, ifDir); - continue; - } - else if (p === GLOBSTAR) { - // if no rest, match and subwalk pattern - // if rest, process rest and subwalk pattern - // if it's a symlink, but we didn't get here by way of a - // globstar match (meaning it's the first time THIS globstar - // has traversed a symlink), then we follow it. Otherwise, stop. - if (!t.isSymbolicLink() || - this.follow || - pattern.checkFollowGlobstar()) { - this.subwalks.add(t, pattern); - } - const rp = rest?.pattern(); - const rrest = rest?.rest(); - if (!rest || ((rp === '' || rp === '.') && !rrest)) { - // only HAS to be a dir if it ends in **/ or **/. - // but ending in ** will match files as well. - this.matches.add(t, absolute, rp === '' || rp === '.'); - } - else { - if (rp === '..') { - // this would mean you're matching **/.. at the fs root, - // and no thanks, I'm not gonna test that specific case. - /* c8 ignore start */ - const tp = t.parent || t; - /* c8 ignore stop */ - if (!rrest) - this.matches.add(tp, absolute, true); - else if (!this.hasWalkedCache.hasWalked(tp, rrest)) { - this.subwalks.add(tp, rrest); - } - } - } - } - else if (p instanceof RegExp) { - this.subwalks.add(t, pattern); - } - } - return this; - } - subwalkTargets() { - return this.subwalks.keys(); - } - child() { - return new Processor(this.opts, this.hasWalkedCache); - } - // return a new Processor containing the subwalks for each - // child entry, and a set of matches, and - // a hasWalkedCache that's a copy of this one - // then we're going to call - filterEntries(parent, entries) { - const patterns = this.subwalks.get(parent); - // put matches and entry walks into the results processor - const results = this.child(); - for (const e of entries) { - for (const pattern of patterns) { - const absolute = pattern.isAbsolute(); - const p = pattern.pattern(); - const rest = pattern.rest(); - if (p === GLOBSTAR) { - results.testGlobstar(e, pattern, rest, absolute); - } - else if (p instanceof RegExp) { - results.testRegExp(e, p, rest, absolute); - } - else { - results.testString(e, p, rest, absolute); - } - } - } - return results; - } - testGlobstar(e, pattern, rest, absolute) { - if (this.dot || !e.name.startsWith('.')) { - if (!pattern.hasMore()) { - this.matches.add(e, absolute, false); - } - if (e.canReaddir()) { - // if we're in follow mode or it's not a symlink, just keep - // testing the same pattern. If there's more after the globstar, - // then this symlink consumes the globstar. If not, then we can - // follow at most ONE symlink along the way, so we mark it, which - // also checks to ensure that it wasn't already marked. - if (this.follow || !e.isSymbolicLink()) { - this.subwalks.add(e, pattern); - } - else if (e.isSymbolicLink()) { - if (rest && pattern.checkFollowGlobstar()) { - this.subwalks.add(e, rest); - } - else if (pattern.markFollowGlobstar()) { - this.subwalks.add(e, pattern); - } - } - } - } - // if the NEXT thing matches this entry, then also add - // the rest. - if (rest) { - const rp = rest.pattern(); - if (typeof rp === 'string' && - // dots and empty were handled already - rp !== '..' && - rp !== '' && - rp !== '.') { - this.testString(e, rp, rest.rest(), absolute); - } - else if (rp === '..') { - /* c8 ignore start */ - const ep = e.parent || e; - /* c8 ignore stop */ - this.subwalks.add(ep, rest); - } - else if (rp instanceof RegExp) { - this.testRegExp(e, rp, rest.rest(), absolute); - } - } - } - testRegExp(e, p, rest, absolute) { - if (!p.test(e.name)) - return; - if (!rest) { - this.matches.add(e, absolute, false); - } - else { - this.subwalks.add(e, rest); - } - } - testString(e, p, rest, absolute) { - // should never happen? - if (!e.isNamed(p)) - return; - if (!rest) { - this.matches.add(e, absolute, false); - } - else { - this.subwalks.add(e, rest); - } - } -} -//# sourceMappingURL=processor.js.map \ No newline at end of file diff --git a/node_modules/glob/dist/esm/processor.js.map b/node_modules/glob/dist/esm/processor.js.map deleted file mode 100644 index 05a8324..0000000 --- a/node_modules/glob/dist/esm/processor.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"processor.js","sourceRoot":"","sources":["../../src/processor.ts"],"names":[],"mappings":"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","sourcesContent":["// synchronous utility for filtering entries and calculating subwalks\n\nimport { GLOBSTAR, MMRegExp } from 'minimatch'\nimport { Path } from 'path-scurry'\nimport { MMPattern, Pattern } from './pattern.js'\nimport { GlobWalkerOpts } from './walker.js'\n\n/**\n * A cache of which patterns have been processed for a given Path\n */\nexport class HasWalkedCache {\n store: Map>\n constructor(store: Map> = new Map()) {\n this.store = store\n }\n copy() {\n return new HasWalkedCache(new Map(this.store))\n }\n hasWalked(target: Path, pattern: Pattern) {\n return this.store.get(target.fullpath())?.has(pattern.globString())\n }\n storeWalked(target: Path, pattern: Pattern) {\n const fullpath = target.fullpath()\n const cached = this.store.get(fullpath)\n if (cached) cached.add(pattern.globString())\n else this.store.set(fullpath, new Set([pattern.globString()]))\n }\n}\n\n/**\n * A record of which paths have been matched in a given walk step,\n * and whether they only are considered a match if they are a directory,\n * and whether their absolute or relative path should be returned.\n */\nexport class MatchRecord {\n store: Map = new Map()\n add(target: Path, absolute: boolean, ifDir: boolean) {\n const n = (absolute ? 2 : 0) | (ifDir ? 1 : 0)\n const current = this.store.get(target)\n this.store.set(target, current === undefined ? n : n & current)\n }\n // match, absolute, ifdir\n entries(): [Path, boolean, boolean][] {\n return [...this.store.entries()].map(([path, n]) => [\n path,\n !!(n & 2),\n !!(n & 1),\n ])\n }\n}\n\n/**\n * A collection of patterns that must be processed in a subsequent step\n * for a given path.\n */\nexport class SubWalks {\n store: Map = new Map()\n add(target: Path, pattern: Pattern) {\n if (!target.canReaddir()) {\n return\n }\n const subs = this.store.get(target)\n if (subs) {\n if (!subs.find(p => p.globString() === pattern.globString())) {\n subs.push(pattern)\n }\n } else this.store.set(target, [pattern])\n }\n get(target: Path): Pattern[] {\n const subs = this.store.get(target)\n /* c8 ignore start */\n if (!subs) {\n throw new Error('attempting to walk unknown path')\n }\n /* c8 ignore stop */\n return subs\n }\n entries(): [Path, Pattern[]][] {\n return this.keys().map(k => [k, this.store.get(k) as Pattern[]])\n }\n keys(): Path[] {\n return [...this.store.keys()].filter(t => t.canReaddir())\n }\n}\n\n/**\n * The class that processes patterns for a given path.\n *\n * Handles child entry filtering, and determining whether a path's\n * directory contents must be read.\n */\nexport class Processor {\n hasWalkedCache: HasWalkedCache\n matches = new MatchRecord()\n subwalks = new SubWalks()\n patterns?: Pattern[]\n follow: boolean\n dot: boolean\n opts: GlobWalkerOpts\n\n constructor(opts: GlobWalkerOpts, hasWalkedCache?: HasWalkedCache) {\n this.opts = opts\n this.follow = !!opts.follow\n this.dot = !!opts.dot\n this.hasWalkedCache =\n hasWalkedCache ? hasWalkedCache.copy() : new HasWalkedCache()\n }\n\n processPatterns(target: Path, patterns: Pattern[]) {\n this.patterns = patterns\n const processingSet: [Path, Pattern][] = patterns.map(p => [target, p])\n\n // map of paths to the magic-starting subwalks they need to walk\n // first item in patterns is the filter\n\n for (let [t, pattern] of processingSet) {\n this.hasWalkedCache.storeWalked(t, pattern)\n\n const root = pattern.root()\n const absolute = pattern.isAbsolute() && this.opts.absolute !== false\n\n // start absolute patterns at root\n if (root) {\n t = t.resolve(\n root === '/' && this.opts.root !== undefined ?\n this.opts.root\n : root,\n )\n const rest = pattern.rest()\n if (!rest) {\n this.matches.add(t, true, false)\n continue\n } else {\n pattern = rest\n }\n }\n\n if (t.isENOENT()) continue\n\n let p: MMPattern\n let rest: Pattern | null\n let changed = false\n while (\n typeof (p = pattern.pattern()) === 'string' &&\n (rest = pattern.rest())\n ) {\n const c = t.resolve(p)\n t = c\n pattern = rest\n changed = true\n }\n p = pattern.pattern()\n rest = pattern.rest()\n if (changed) {\n if (this.hasWalkedCache.hasWalked(t, pattern)) continue\n this.hasWalkedCache.storeWalked(t, pattern)\n }\n\n // now we have either a final string for a known entry,\n // more strings for an unknown entry,\n // or a pattern starting with magic, mounted on t.\n if (typeof p === 'string') {\n // must not be final entry, otherwise we would have\n // concatenated it earlier.\n const ifDir = p === '..' || p === '' || p === '.'\n this.matches.add(t.resolve(p), absolute, ifDir)\n continue\n } else if (p === GLOBSTAR) {\n // if no rest, match and subwalk pattern\n // if rest, process rest and subwalk pattern\n // if it's a symlink, but we didn't get here by way of a\n // globstar match (meaning it's the first time THIS globstar\n // has traversed a symlink), then we follow it. Otherwise, stop.\n if (\n !t.isSymbolicLink() ||\n this.follow ||\n pattern.checkFollowGlobstar()\n ) {\n this.subwalks.add(t, pattern)\n }\n const rp = rest?.pattern()\n const rrest = rest?.rest()\n if (!rest || ((rp === '' || rp === '.') && !rrest)) {\n // only HAS to be a dir if it ends in **/ or **/.\n // but ending in ** will match files as well.\n this.matches.add(t, absolute, rp === '' || rp === '.')\n } else {\n if (rp === '..') {\n // this would mean you're matching **/.. at the fs root,\n // and no thanks, I'm not gonna test that specific case.\n /* c8 ignore start */\n const tp = t.parent || t\n /* c8 ignore stop */\n if (!rrest) this.matches.add(tp, absolute, true)\n else if (!this.hasWalkedCache.hasWalked(tp, rrest)) {\n this.subwalks.add(tp, rrest)\n }\n }\n }\n } else if (p instanceof RegExp) {\n this.subwalks.add(t, pattern)\n }\n }\n\n return this\n }\n\n subwalkTargets(): Path[] {\n return this.subwalks.keys()\n }\n\n child() {\n return new Processor(this.opts, this.hasWalkedCache)\n }\n\n // return a new Processor containing the subwalks for each\n // child entry, and a set of matches, and\n // a hasWalkedCache that's a copy of this one\n // then we're going to call\n filterEntries(parent: Path, entries: Path[]): Processor {\n const patterns = this.subwalks.get(parent)\n // put matches and entry walks into the results processor\n const results = this.child()\n for (const e of entries) {\n for (const pattern of patterns) {\n const absolute = pattern.isAbsolute()\n const p = pattern.pattern()\n const rest = pattern.rest()\n if (p === GLOBSTAR) {\n results.testGlobstar(e, pattern, rest, absolute)\n } else if (p instanceof RegExp) {\n results.testRegExp(e, p, rest, absolute)\n } else {\n results.testString(e, p, rest, absolute)\n }\n }\n }\n return results\n }\n\n testGlobstar(\n e: Path,\n pattern: Pattern,\n rest: Pattern | null,\n absolute: boolean,\n ) {\n if (this.dot || !e.name.startsWith('.')) {\n if (!pattern.hasMore()) {\n this.matches.add(e, absolute, false)\n }\n if (e.canReaddir()) {\n // if we're in follow mode or it's not a symlink, just keep\n // testing the same pattern. If there's more after the globstar,\n // then this symlink consumes the globstar. If not, then we can\n // follow at most ONE symlink along the way, so we mark it, which\n // also checks to ensure that it wasn't already marked.\n if (this.follow || !e.isSymbolicLink()) {\n this.subwalks.add(e, pattern)\n } else if (e.isSymbolicLink()) {\n if (rest && pattern.checkFollowGlobstar()) {\n this.subwalks.add(e, rest)\n } else if (pattern.markFollowGlobstar()) {\n this.subwalks.add(e, pattern)\n }\n }\n }\n }\n // if the NEXT thing matches this entry, then also add\n // the rest.\n if (rest) {\n const rp = rest.pattern()\n if (\n typeof rp === 'string' &&\n // dots and empty were handled already\n rp !== '..' &&\n rp !== '' &&\n rp !== '.'\n ) {\n this.testString(e, rp, rest.rest(), absolute)\n } else if (rp === '..') {\n /* c8 ignore start */\n const ep = e.parent || e\n /* c8 ignore stop */\n this.subwalks.add(ep, rest)\n } else if (rp instanceof RegExp) {\n this.testRegExp(e, rp, rest.rest(), absolute)\n }\n }\n }\n\n testRegExp(\n e: Path,\n p: MMRegExp,\n rest: Pattern | null,\n absolute: boolean,\n ) {\n if (!p.test(e.name)) return\n if (!rest) {\n this.matches.add(e, absolute, false)\n } else {\n this.subwalks.add(e, rest)\n }\n }\n\n testString(e: Path, p: string, rest: Pattern | null, absolute: boolean) {\n // should never happen?\n if (!e.isNamed(p)) return\n if (!rest) {\n this.matches.add(e, absolute, false)\n } else {\n this.subwalks.add(e, rest)\n }\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/glob/dist/esm/walker.d.ts b/node_modules/glob/dist/esm/walker.d.ts deleted file mode 100644 index 499c8f4..0000000 --- a/node_modules/glob/dist/esm/walker.d.ts +++ /dev/null @@ -1,97 +0,0 @@ -/** - * Single-use utility classes to provide functionality to the {@link Glob} - * methods. - * - * @module - */ -import { Minipass } from 'minipass'; -import { Path } from 'path-scurry'; -import { IgnoreLike } from './ignore.js'; -import { Pattern } from './pattern.js'; -import { Processor } from './processor.js'; -export interface GlobWalkerOpts { - absolute?: boolean; - allowWindowsEscape?: boolean; - cwd?: string | URL; - dot?: boolean; - dotRelative?: boolean; - follow?: boolean; - ignore?: string | string[] | IgnoreLike; - mark?: boolean; - matchBase?: boolean; - maxDepth?: number; - nobrace?: boolean; - nocase?: boolean; - nodir?: boolean; - noext?: boolean; - noglobstar?: boolean; - platform?: NodeJS.Platform; - posix?: boolean; - realpath?: boolean; - root?: string; - stat?: boolean; - signal?: AbortSignal; - windowsPathsNoEscape?: boolean; - withFileTypes?: boolean; - includeChildMatches?: boolean; -} -export type GWOFileTypesTrue = GlobWalkerOpts & { - withFileTypes: true; -}; -export type GWOFileTypesFalse = GlobWalkerOpts & { - withFileTypes: false; -}; -export type GWOFileTypesUnset = GlobWalkerOpts & { - withFileTypes?: undefined; -}; -export type Result = O extends GWOFileTypesTrue ? Path : O extends GWOFileTypesFalse ? string : O extends GWOFileTypesUnset ? string : Path | string; -export type Matches = O extends GWOFileTypesTrue ? Set : O extends GWOFileTypesFalse ? Set : O extends GWOFileTypesUnset ? Set : Set; -export type MatchStream = Minipass, Result>; -/** - * basic walking utilities that all the glob walker types use - */ -export declare abstract class GlobUtil { - #private; - path: Path; - patterns: Pattern[]; - opts: O; - seen: Set; - paused: boolean; - aborted: boolean; - signal?: AbortSignal; - maxDepth: number; - includeChildMatches: boolean; - constructor(patterns: Pattern[], path: Path, opts: O); - pause(): void; - resume(): void; - onResume(fn: () => any): void; - matchCheck(e: Path, ifDir: boolean): Promise; - matchCheckTest(e: Path | undefined, ifDir: boolean): Path | undefined; - matchCheckSync(e: Path, ifDir: boolean): Path | undefined; - abstract matchEmit(p: Result): void; - abstract matchEmit(p: string | Path): void; - matchFinish(e: Path, absolute: boolean): void; - match(e: Path, absolute: boolean, ifDir: boolean): Promise; - matchSync(e: Path, absolute: boolean, ifDir: boolean): void; - walkCB(target: Path, patterns: Pattern[], cb: () => any): void; - walkCB2(target: Path, patterns: Pattern[], processor: Processor, cb: () => any): any; - walkCB3(target: Path, entries: Path[], processor: Processor, cb: () => any): void; - walkCBSync(target: Path, patterns: Pattern[], cb: () => any): void; - walkCB2Sync(target: Path, patterns: Pattern[], processor: Processor, cb: () => any): any; - walkCB3Sync(target: Path, entries: Path[], processor: Processor, cb: () => any): void; -} -export declare class GlobWalker extends GlobUtil { - matches: Set>; - constructor(patterns: Pattern[], path: Path, opts: O); - matchEmit(e: Result): void; - walk(): Promise>>; - walkSync(): Set>; -} -export declare class GlobStream extends GlobUtil { - results: Minipass, Result>; - constructor(patterns: Pattern[], path: Path, opts: O); - matchEmit(e: Result): void; - stream(): MatchStream; - streamSync(): MatchStream; -} -//# sourceMappingURL=walker.d.ts.map \ No newline at end of file diff --git a/node_modules/glob/dist/esm/walker.d.ts.map b/node_modules/glob/dist/esm/walker.d.ts.map deleted file mode 100644 index 769957b..0000000 --- a/node_modules/glob/dist/esm/walker.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"walker.d.ts","sourceRoot":"","sources":["../../src/walker.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/glob/dist/esm/walker.js b/node_modules/glob/dist/esm/walker.js deleted file mode 100644 index 3d68196..0000000 --- a/node_modules/glob/dist/esm/walker.js +++ /dev/null @@ -1,381 +0,0 @@ -/** - * Single-use utility classes to provide functionality to the {@link Glob} - * methods. - * - * @module - */ -import { Minipass } from 'minipass'; -import { Ignore } from './ignore.js'; -import { Processor } from './processor.js'; -const makeIgnore = (ignore, opts) => typeof ignore === 'string' ? new Ignore([ignore], opts) - : Array.isArray(ignore) ? new Ignore(ignore, opts) - : ignore; -/** - * basic walking utilities that all the glob walker types use - */ -export class GlobUtil { - path; - patterns; - opts; - seen = new Set(); - paused = false; - aborted = false; - #onResume = []; - #ignore; - #sep; - signal; - maxDepth; - includeChildMatches; - constructor(patterns, path, opts) { - this.patterns = patterns; - this.path = path; - this.opts = opts; - this.#sep = !opts.posix && opts.platform === 'win32' ? '\\' : '/'; - this.includeChildMatches = opts.includeChildMatches !== false; - if (opts.ignore || !this.includeChildMatches) { - this.#ignore = makeIgnore(opts.ignore ?? [], opts); - if (!this.includeChildMatches && - typeof this.#ignore.add !== 'function') { - const m = 'cannot ignore child matches, ignore lacks add() method.'; - throw new Error(m); - } - } - // ignore, always set with maxDepth, but it's optional on the - // GlobOptions type - /* c8 ignore start */ - this.maxDepth = opts.maxDepth || Infinity; - /* c8 ignore stop */ - if (opts.signal) { - this.signal = opts.signal; - this.signal.addEventListener('abort', () => { - this.#onResume.length = 0; - }); - } - } - #ignored(path) { - return this.seen.has(path) || !!this.#ignore?.ignored?.(path); - } - #childrenIgnored(path) { - return !!this.#ignore?.childrenIgnored?.(path); - } - // backpressure mechanism - pause() { - this.paused = true; - } - resume() { - /* c8 ignore start */ - if (this.signal?.aborted) - return; - /* c8 ignore stop */ - this.paused = false; - let fn = undefined; - while (!this.paused && (fn = this.#onResume.shift())) { - fn(); - } - } - onResume(fn) { - if (this.signal?.aborted) - return; - /* c8 ignore start */ - if (!this.paused) { - fn(); - } - else { - /* c8 ignore stop */ - this.#onResume.push(fn); - } - } - // do the requisite realpath/stat checking, and return the path - // to add or undefined to filter it out. - async matchCheck(e, ifDir) { - if (ifDir && this.opts.nodir) - return undefined; - let rpc; - if (this.opts.realpath) { - rpc = e.realpathCached() || (await e.realpath()); - if (!rpc) - return undefined; - e = rpc; - } - const needStat = e.isUnknown() || this.opts.stat; - const s = needStat ? await e.lstat() : e; - if (this.opts.follow && this.opts.nodir && s?.isSymbolicLink()) { - const target = await s.realpath(); - /* c8 ignore start */ - if (target && (target.isUnknown() || this.opts.stat)) { - await target.lstat(); - } - /* c8 ignore stop */ - } - return this.matchCheckTest(s, ifDir); - } - matchCheckTest(e, ifDir) { - return (e && - (this.maxDepth === Infinity || e.depth() <= this.maxDepth) && - (!ifDir || e.canReaddir()) && - (!this.opts.nodir || !e.isDirectory()) && - (!this.opts.nodir || - !this.opts.follow || - !e.isSymbolicLink() || - !e.realpathCached()?.isDirectory()) && - !this.#ignored(e)) ? - e - : undefined; - } - matchCheckSync(e, ifDir) { - if (ifDir && this.opts.nodir) - return undefined; - let rpc; - if (this.opts.realpath) { - rpc = e.realpathCached() || e.realpathSync(); - if (!rpc) - return undefined; - e = rpc; - } - const needStat = e.isUnknown() || this.opts.stat; - const s = needStat ? e.lstatSync() : e; - if (this.opts.follow && this.opts.nodir && s?.isSymbolicLink()) { - const target = s.realpathSync(); - if (target && (target?.isUnknown() || this.opts.stat)) { - target.lstatSync(); - } - } - return this.matchCheckTest(s, ifDir); - } - matchFinish(e, absolute) { - if (this.#ignored(e)) - return; - // we know we have an ignore if this is false, but TS doesn't - if (!this.includeChildMatches && this.#ignore?.add) { - const ign = `${e.relativePosix()}/**`; - this.#ignore.add(ign); - } - const abs = this.opts.absolute === undefined ? absolute : this.opts.absolute; - this.seen.add(e); - const mark = this.opts.mark && e.isDirectory() ? this.#sep : ''; - // ok, we have what we need! - if (this.opts.withFileTypes) { - this.matchEmit(e); - } - else if (abs) { - const abs = this.opts.posix ? e.fullpathPosix() : e.fullpath(); - this.matchEmit(abs + mark); - } - else { - const rel = this.opts.posix ? e.relativePosix() : e.relative(); - const pre = this.opts.dotRelative && !rel.startsWith('..' + this.#sep) ? - '.' + this.#sep - : ''; - this.matchEmit(!rel ? '.' + mark : pre + rel + mark); - } - } - async match(e, absolute, ifDir) { - const p = await this.matchCheck(e, ifDir); - if (p) - this.matchFinish(p, absolute); - } - matchSync(e, absolute, ifDir) { - const p = this.matchCheckSync(e, ifDir); - if (p) - this.matchFinish(p, absolute); - } - walkCB(target, patterns, cb) { - /* c8 ignore start */ - if (this.signal?.aborted) - cb(); - /* c8 ignore stop */ - this.walkCB2(target, patterns, new Processor(this.opts), cb); - } - walkCB2(target, patterns, processor, cb) { - if (this.#childrenIgnored(target)) - return cb(); - if (this.signal?.aborted) - cb(); - if (this.paused) { - this.onResume(() => this.walkCB2(target, patterns, processor, cb)); - return; - } - processor.processPatterns(target, patterns); - // done processing. all of the above is sync, can be abstracted out. - // subwalks is a map of paths to the entry filters they need - // matches is a map of paths to [absolute, ifDir] tuples. - let tasks = 1; - const next = () => { - if (--tasks === 0) - cb(); - }; - for (const [m, absolute, ifDir] of processor.matches.entries()) { - if (this.#ignored(m)) - continue; - tasks++; - this.match(m, absolute, ifDir).then(() => next()); - } - for (const t of processor.subwalkTargets()) { - if (this.maxDepth !== Infinity && t.depth() >= this.maxDepth) { - continue; - } - tasks++; - const childrenCached = t.readdirCached(); - if (t.calledReaddir()) - this.walkCB3(t, childrenCached, processor, next); - else { - t.readdirCB((_, entries) => this.walkCB3(t, entries, processor, next), true); - } - } - next(); - } - walkCB3(target, entries, processor, cb) { - processor = processor.filterEntries(target, entries); - let tasks = 1; - const next = () => { - if (--tasks === 0) - cb(); - }; - for (const [m, absolute, ifDir] of processor.matches.entries()) { - if (this.#ignored(m)) - continue; - tasks++; - this.match(m, absolute, ifDir).then(() => next()); - } - for (const [target, patterns] of processor.subwalks.entries()) { - tasks++; - this.walkCB2(target, patterns, processor.child(), next); - } - next(); - } - walkCBSync(target, patterns, cb) { - /* c8 ignore start */ - if (this.signal?.aborted) - cb(); - /* c8 ignore stop */ - this.walkCB2Sync(target, patterns, new Processor(this.opts), cb); - } - walkCB2Sync(target, patterns, processor, cb) { - if (this.#childrenIgnored(target)) - return cb(); - if (this.signal?.aborted) - cb(); - if (this.paused) { - this.onResume(() => this.walkCB2Sync(target, patterns, processor, cb)); - return; - } - processor.processPatterns(target, patterns); - // done processing. all of the above is sync, can be abstracted out. - // subwalks is a map of paths to the entry filters they need - // matches is a map of paths to [absolute, ifDir] tuples. - let tasks = 1; - const next = () => { - if (--tasks === 0) - cb(); - }; - for (const [m, absolute, ifDir] of processor.matches.entries()) { - if (this.#ignored(m)) - continue; - this.matchSync(m, absolute, ifDir); - } - for (const t of processor.subwalkTargets()) { - if (this.maxDepth !== Infinity && t.depth() >= this.maxDepth) { - continue; - } - tasks++; - const children = t.readdirSync(); - this.walkCB3Sync(t, children, processor, next); - } - next(); - } - walkCB3Sync(target, entries, processor, cb) { - processor = processor.filterEntries(target, entries); - let tasks = 1; - const next = () => { - if (--tasks === 0) - cb(); - }; - for (const [m, absolute, ifDir] of processor.matches.entries()) { - if (this.#ignored(m)) - continue; - this.matchSync(m, absolute, ifDir); - } - for (const [target, patterns] of processor.subwalks.entries()) { - tasks++; - this.walkCB2Sync(target, patterns, processor.child(), next); - } - next(); - } -} -export class GlobWalker extends GlobUtil { - matches = new Set(); - constructor(patterns, path, opts) { - super(patterns, path, opts); - } - matchEmit(e) { - this.matches.add(e); - } - async walk() { - if (this.signal?.aborted) - throw this.signal.reason; - if (this.path.isUnknown()) { - await this.path.lstat(); - } - await new Promise((res, rej) => { - this.walkCB(this.path, this.patterns, () => { - if (this.signal?.aborted) { - rej(this.signal.reason); - } - else { - res(this.matches); - } - }); - }); - return this.matches; - } - walkSync() { - if (this.signal?.aborted) - throw this.signal.reason; - if (this.path.isUnknown()) { - this.path.lstatSync(); - } - // nothing for the callback to do, because this never pauses - this.walkCBSync(this.path, this.patterns, () => { - if (this.signal?.aborted) - throw this.signal.reason; - }); - return this.matches; - } -} -export class GlobStream extends GlobUtil { - results; - constructor(patterns, path, opts) { - super(patterns, path, opts); - this.results = new Minipass({ - signal: this.signal, - objectMode: true, - }); - this.results.on('drain', () => this.resume()); - this.results.on('resume', () => this.resume()); - } - matchEmit(e) { - this.results.write(e); - if (!this.results.flowing) - this.pause(); - } - stream() { - const target = this.path; - if (target.isUnknown()) { - target.lstat().then(() => { - this.walkCB(target, this.patterns, () => this.results.end()); - }); - } - else { - this.walkCB(target, this.patterns, () => this.results.end()); - } - return this.results; - } - streamSync() { - if (this.path.isUnknown()) { - this.path.lstatSync(); - } - this.walkCBSync(this.path, this.patterns, () => this.results.end()); - return this.results; - } -} -//# sourceMappingURL=walker.js.map \ No newline at end of file diff --git a/node_modules/glob/dist/esm/walker.js.map b/node_modules/glob/dist/esm/walker.js.map deleted file mode 100644 index daeeda6..0000000 --- a/node_modules/glob/dist/esm/walker.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"walker.js","sourceRoot":"","sources":["../../src/walker.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Single-use utility classes to provide functionality to the {@link Glob}\n * methods.\n *\n * @module\n */\nimport { Minipass } from 'minipass'\nimport { Path } from 'path-scurry'\nimport { Ignore, IgnoreLike } from './ignore.js'\n\n// XXX can we somehow make it so that it NEVER processes a given path more than\n// once, enough that the match set tracking is no longer needed? that'd speed\n// things up a lot. Or maybe bring back nounique, and skip it in that case?\n\n// a single minimatch set entry with 1 or more parts\nimport { Pattern } from './pattern.js'\nimport { Processor } from './processor.js'\n\nexport interface GlobWalkerOpts {\n absolute?: boolean\n allowWindowsEscape?: boolean\n cwd?: string | URL\n dot?: boolean\n dotRelative?: boolean\n follow?: boolean\n ignore?: string | string[] | IgnoreLike\n mark?: boolean\n matchBase?: boolean\n // Note: maxDepth here means \"maximum actual Path.depth()\",\n // not \"maximum depth beyond cwd\"\n maxDepth?: number\n nobrace?: boolean\n nocase?: boolean\n nodir?: boolean\n noext?: boolean\n noglobstar?: boolean\n platform?: NodeJS.Platform\n posix?: boolean\n realpath?: boolean\n root?: string\n stat?: boolean\n signal?: AbortSignal\n windowsPathsNoEscape?: boolean\n withFileTypes?: boolean\n includeChildMatches?: boolean\n}\n\nexport type GWOFileTypesTrue = GlobWalkerOpts & {\n withFileTypes: true\n}\nexport type GWOFileTypesFalse = GlobWalkerOpts & {\n withFileTypes: false\n}\nexport type GWOFileTypesUnset = GlobWalkerOpts & {\n withFileTypes?: undefined\n}\n\nexport type Result =\n O extends GWOFileTypesTrue ? Path\n : O extends GWOFileTypesFalse ? string\n : O extends GWOFileTypesUnset ? string\n : Path | string\n\nexport type Matches =\n O extends GWOFileTypesTrue ? Set\n : O extends GWOFileTypesFalse ? Set\n : O extends GWOFileTypesUnset ? Set\n : Set\n\nexport type MatchStream = Minipass<\n Result,\n Result\n>\n\nconst makeIgnore = (\n ignore: string | string[] | IgnoreLike,\n opts: GlobWalkerOpts,\n): IgnoreLike =>\n typeof ignore === 'string' ? new Ignore([ignore], opts)\n : Array.isArray(ignore) ? new Ignore(ignore, opts)\n : ignore\n\n/**\n * basic walking utilities that all the glob walker types use\n */\nexport abstract class GlobUtil {\n path: Path\n patterns: Pattern[]\n opts: O\n seen: Set = new Set()\n paused: boolean = false\n aborted: boolean = false\n #onResume: (() => any)[] = []\n #ignore?: IgnoreLike\n #sep: '\\\\' | '/'\n signal?: AbortSignal\n maxDepth: number\n includeChildMatches: boolean\n\n constructor(patterns: Pattern[], path: Path, opts: O)\n constructor(patterns: Pattern[], path: Path, opts: O) {\n this.patterns = patterns\n this.path = path\n this.opts = opts\n this.#sep = !opts.posix && opts.platform === 'win32' ? '\\\\' : '/'\n this.includeChildMatches = opts.includeChildMatches !== false\n if (opts.ignore || !this.includeChildMatches) {\n this.#ignore = makeIgnore(opts.ignore ?? [], opts)\n if (\n !this.includeChildMatches &&\n typeof this.#ignore.add !== 'function'\n ) {\n const m = 'cannot ignore child matches, ignore lacks add() method.'\n throw new Error(m)\n }\n }\n // ignore, always set with maxDepth, but it's optional on the\n // GlobOptions type\n /* c8 ignore start */\n this.maxDepth = opts.maxDepth || Infinity\n /* c8 ignore stop */\n if (opts.signal) {\n this.signal = opts.signal\n this.signal.addEventListener('abort', () => {\n this.#onResume.length = 0\n })\n }\n }\n\n #ignored(path: Path): boolean {\n return this.seen.has(path) || !!this.#ignore?.ignored?.(path)\n }\n #childrenIgnored(path: Path): boolean {\n return !!this.#ignore?.childrenIgnored?.(path)\n }\n\n // backpressure mechanism\n pause() {\n this.paused = true\n }\n resume() {\n /* c8 ignore start */\n if (this.signal?.aborted) return\n /* c8 ignore stop */\n this.paused = false\n let fn: (() => any) | undefined = undefined\n while (!this.paused && (fn = this.#onResume.shift())) {\n fn()\n }\n }\n onResume(fn: () => any) {\n if (this.signal?.aborted) return\n /* c8 ignore start */\n if (!this.paused) {\n fn()\n } else {\n /* c8 ignore stop */\n this.#onResume.push(fn)\n }\n }\n\n // do the requisite realpath/stat checking, and return the path\n // to add or undefined to filter it out.\n async matchCheck(e: Path, ifDir: boolean): Promise {\n if (ifDir && this.opts.nodir) return undefined\n let rpc: Path | undefined\n if (this.opts.realpath) {\n rpc = e.realpathCached() || (await e.realpath())\n if (!rpc) return undefined\n e = rpc\n }\n const needStat = e.isUnknown() || this.opts.stat\n const s = needStat ? await e.lstat() : e\n if (this.opts.follow && this.opts.nodir && s?.isSymbolicLink()) {\n const target = await s.realpath()\n /* c8 ignore start */\n if (target && (target.isUnknown() || this.opts.stat)) {\n await target.lstat()\n }\n /* c8 ignore stop */\n }\n return this.matchCheckTest(s, ifDir)\n }\n\n matchCheckTest(e: Path | undefined, ifDir: boolean): Path | undefined {\n return (\n e &&\n (this.maxDepth === Infinity || e.depth() <= this.maxDepth) &&\n (!ifDir || e.canReaddir()) &&\n (!this.opts.nodir || !e.isDirectory()) &&\n (!this.opts.nodir ||\n !this.opts.follow ||\n !e.isSymbolicLink() ||\n !e.realpathCached()?.isDirectory()) &&\n !this.#ignored(e)\n ) ?\n e\n : undefined\n }\n\n matchCheckSync(e: Path, ifDir: boolean): Path | undefined {\n if (ifDir && this.opts.nodir) return undefined\n let rpc: Path | undefined\n if (this.opts.realpath) {\n rpc = e.realpathCached() || e.realpathSync()\n if (!rpc) return undefined\n e = rpc\n }\n const needStat = e.isUnknown() || this.opts.stat\n const s = needStat ? e.lstatSync() : e\n if (this.opts.follow && this.opts.nodir && s?.isSymbolicLink()) {\n const target = s.realpathSync()\n if (target && (target?.isUnknown() || this.opts.stat)) {\n target.lstatSync()\n }\n }\n return this.matchCheckTest(s, ifDir)\n }\n\n abstract matchEmit(p: Result): void\n abstract matchEmit(p: string | Path): void\n\n matchFinish(e: Path, absolute: boolean) {\n if (this.#ignored(e)) return\n // we know we have an ignore if this is false, but TS doesn't\n if (!this.includeChildMatches && this.#ignore?.add) {\n const ign = `${e.relativePosix()}/**`\n this.#ignore.add(ign)\n }\n const abs =\n this.opts.absolute === undefined ? absolute : this.opts.absolute\n this.seen.add(e)\n const mark = this.opts.mark && e.isDirectory() ? this.#sep : ''\n // ok, we have what we need!\n if (this.opts.withFileTypes) {\n this.matchEmit(e)\n } else if (abs) {\n const abs = this.opts.posix ? e.fullpathPosix() : e.fullpath()\n this.matchEmit(abs + mark)\n } else {\n const rel = this.opts.posix ? e.relativePosix() : e.relative()\n const pre =\n this.opts.dotRelative && !rel.startsWith('..' + this.#sep) ?\n '.' + this.#sep\n : ''\n this.matchEmit(!rel ? '.' + mark : pre + rel + mark)\n }\n }\n\n async match(e: Path, absolute: boolean, ifDir: boolean): Promise {\n const p = await this.matchCheck(e, ifDir)\n if (p) this.matchFinish(p, absolute)\n }\n\n matchSync(e: Path, absolute: boolean, ifDir: boolean): void {\n const p = this.matchCheckSync(e, ifDir)\n if (p) this.matchFinish(p, absolute)\n }\n\n walkCB(target: Path, patterns: Pattern[], cb: () => any) {\n /* c8 ignore start */\n if (this.signal?.aborted) cb()\n /* c8 ignore stop */\n this.walkCB2(target, patterns, new Processor(this.opts), cb)\n }\n\n walkCB2(\n target: Path,\n patterns: Pattern[],\n processor: Processor,\n cb: () => any,\n ) {\n if (this.#childrenIgnored(target)) return cb()\n if (this.signal?.aborted) cb()\n if (this.paused) {\n this.onResume(() => this.walkCB2(target, patterns, processor, cb))\n return\n }\n processor.processPatterns(target, patterns)\n\n // done processing. all of the above is sync, can be abstracted out.\n // subwalks is a map of paths to the entry filters they need\n // matches is a map of paths to [absolute, ifDir] tuples.\n let tasks = 1\n const next = () => {\n if (--tasks === 0) cb()\n }\n\n for (const [m, absolute, ifDir] of processor.matches.entries()) {\n if (this.#ignored(m)) continue\n tasks++\n this.match(m, absolute, ifDir).then(() => next())\n }\n\n for (const t of processor.subwalkTargets()) {\n if (this.maxDepth !== Infinity && t.depth() >= this.maxDepth) {\n continue\n }\n tasks++\n const childrenCached = t.readdirCached()\n if (t.calledReaddir())\n this.walkCB3(t, childrenCached, processor, next)\n else {\n t.readdirCB(\n (_, entries) => this.walkCB3(t, entries, processor, next),\n true,\n )\n }\n }\n\n next()\n }\n\n walkCB3(\n target: Path,\n entries: Path[],\n processor: Processor,\n cb: () => any,\n ) {\n processor = processor.filterEntries(target, entries)\n\n let tasks = 1\n const next = () => {\n if (--tasks === 0) cb()\n }\n\n for (const [m, absolute, ifDir] of processor.matches.entries()) {\n if (this.#ignored(m)) continue\n tasks++\n this.match(m, absolute, ifDir).then(() => next())\n }\n for (const [target, patterns] of processor.subwalks.entries()) {\n tasks++\n this.walkCB2(target, patterns, processor.child(), next)\n }\n\n next()\n }\n\n walkCBSync(target: Path, patterns: Pattern[], cb: () => any) {\n /* c8 ignore start */\n if (this.signal?.aborted) cb()\n /* c8 ignore stop */\n this.walkCB2Sync(target, patterns, new Processor(this.opts), cb)\n }\n\n walkCB2Sync(\n target: Path,\n patterns: Pattern[],\n processor: Processor,\n cb: () => any,\n ) {\n if (this.#childrenIgnored(target)) return cb()\n if (this.signal?.aborted) cb()\n if (this.paused) {\n this.onResume(() =>\n this.walkCB2Sync(target, patterns, processor, cb),\n )\n return\n }\n processor.processPatterns(target, patterns)\n\n // done processing. all of the above is sync, can be abstracted out.\n // subwalks is a map of paths to the entry filters they need\n // matches is a map of paths to [absolute, ifDir] tuples.\n let tasks = 1\n const next = () => {\n if (--tasks === 0) cb()\n }\n\n for (const [m, absolute, ifDir] of processor.matches.entries()) {\n if (this.#ignored(m)) continue\n this.matchSync(m, absolute, ifDir)\n }\n\n for (const t of processor.subwalkTargets()) {\n if (this.maxDepth !== Infinity && t.depth() >= this.maxDepth) {\n continue\n }\n tasks++\n const children = t.readdirSync()\n this.walkCB3Sync(t, children, processor, next)\n }\n\n next()\n }\n\n walkCB3Sync(\n target: Path,\n entries: Path[],\n processor: Processor,\n cb: () => any,\n ) {\n processor = processor.filterEntries(target, entries)\n\n let tasks = 1\n const next = () => {\n if (--tasks === 0) cb()\n }\n\n for (const [m, absolute, ifDir] of processor.matches.entries()) {\n if (this.#ignored(m)) continue\n this.matchSync(m, absolute, ifDir)\n }\n for (const [target, patterns] of processor.subwalks.entries()) {\n tasks++\n this.walkCB2Sync(target, patterns, processor.child(), next)\n }\n\n next()\n }\n}\n\nexport class GlobWalker<\n O extends GlobWalkerOpts = GlobWalkerOpts,\n> extends GlobUtil {\n matches = new Set>()\n\n constructor(patterns: Pattern[], path: Path, opts: O) {\n super(patterns, path, opts)\n }\n\n matchEmit(e: Result): void {\n this.matches.add(e)\n }\n\n async walk(): Promise>> {\n if (this.signal?.aborted) throw this.signal.reason\n if (this.path.isUnknown()) {\n await this.path.lstat()\n }\n await new Promise((res, rej) => {\n this.walkCB(this.path, this.patterns, () => {\n if (this.signal?.aborted) {\n rej(this.signal.reason)\n } else {\n res(this.matches)\n }\n })\n })\n return this.matches\n }\n\n walkSync(): Set> {\n if (this.signal?.aborted) throw this.signal.reason\n if (this.path.isUnknown()) {\n this.path.lstatSync()\n }\n // nothing for the callback to do, because this never pauses\n this.walkCBSync(this.path, this.patterns, () => {\n if (this.signal?.aborted) throw this.signal.reason\n })\n return this.matches\n }\n}\n\nexport class GlobStream<\n O extends GlobWalkerOpts = GlobWalkerOpts,\n> extends GlobUtil {\n results: Minipass, Result>\n\n constructor(patterns: Pattern[], path: Path, opts: O) {\n super(patterns, path, opts)\n this.results = new Minipass, Result>({\n signal: this.signal,\n objectMode: true,\n })\n this.results.on('drain', () => this.resume())\n this.results.on('resume', () => this.resume())\n }\n\n matchEmit(e: Result): void {\n this.results.write(e)\n if (!this.results.flowing) this.pause()\n }\n\n stream(): MatchStream {\n const target = this.path\n if (target.isUnknown()) {\n target.lstat().then(() => {\n this.walkCB(target, this.patterns, () => this.results.end())\n })\n } else {\n this.walkCB(target, this.patterns, () => this.results.end())\n }\n return this.results\n }\n\n streamSync(): MatchStream {\n if (this.path.isUnknown()) {\n this.path.lstatSync()\n }\n this.walkCBSync(this.path, this.patterns, () => this.results.end())\n return this.results\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/glob/package.json b/node_modules/glob/package.json deleted file mode 100644 index 6d4893b..0000000 --- a/node_modules/glob/package.json +++ /dev/null @@ -1,99 +0,0 @@ -{ - "author": "Isaac Z. Schlueter (https://blog.izs.me/)", - "publishConfig": { - "tag": "legacy-v10" - }, - "name": "glob", - "description": "the most correct and second fastest glob implementation in JavaScript", - "version": "10.4.5", - "type": "module", - "tshy": { - "main": true, - "exports": { - "./package.json": "./package.json", - ".": "./src/index.ts" - } - }, - "bin": "./dist/esm/bin.mjs", - "main": "./dist/commonjs/index.js", - "types": "./dist/commonjs/index.d.ts", - "exports": { - "./package.json": "./package.json", - ".": { - "import": { - "types": "./dist/esm/index.d.ts", - "default": "./dist/esm/index.js" - }, - "require": { - "types": "./dist/commonjs/index.d.ts", - "default": "./dist/commonjs/index.js" - } - } - }, - "repository": { - "type": "git", - "url": "git://github.com/isaacs/node-glob.git" - }, - "files": [ - "dist" - ], - "scripts": { - "preversion": "npm test", - "postversion": "npm publish", - "prepublishOnly": "git push origin --follow-tags", - "prepare": "tshy", - "pretest": "npm run prepare", - "presnap": "npm run prepare", - "test": "tap", - "snap": "tap", - "format": "prettier --write . --log-level warn", - "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts", - "prepublish": "npm run benchclean", - "profclean": "rm -f v8.log profile.txt", - "test-regen": "npm run profclean && TEST_REGEN=1 node --no-warnings --loader ts-node/esm test/00-setup.ts", - "prebench": "npm run prepare", - "bench": "bash benchmark.sh", - "preprof": "npm run prepare", - "prof": "bash prof.sh", - "benchclean": "node benchclean.cjs" - }, - "prettier": { - "experimentalTernaries": true, - "semi": false, - "printWidth": 75, - "tabWidth": 2, - "useTabs": false, - "singleQuote": true, - "jsxSingleQuote": false, - "bracketSameLine": true, - "arrowParens": "avoid", - "endOfLine": "lf" - }, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "devDependencies": { - "@types/node": "^20.11.30", - "memfs": "^3.4.13", - "mkdirp": "^3.0.1", - "prettier": "^3.2.5", - "rimraf": "^5.0.7", - "sync-content": "^1.0.2", - "tap": "^19.0.0", - "tshy": "^1.14.0", - "typedoc": "^0.25.12" - }, - "tap": { - "before": "test/00-setup.ts" - }, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "module": "./dist/esm/index.js" -} diff --git a/node_modules/hasown/.eslintrc b/node_modules/hasown/.eslintrc deleted file mode 100644 index 3b5d9e9..0000000 --- a/node_modules/hasown/.eslintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "root": true, - - "extends": "@ljharb", -} diff --git a/node_modules/hasown/.github/FUNDING.yml b/node_modules/hasown/.github/FUNDING.yml deleted file mode 100644 index d68c8b7..0000000 --- a/node_modules/hasown/.github/FUNDING.yml +++ /dev/null @@ -1,12 +0,0 @@ -# These are supported funding model platforms - -github: [ljharb] -patreon: # Replace with a single Patreon username -open_collective: # Replace with a single Open Collective username -ko_fi: # Replace with a single Ko-fi username -tidelift: npm/hasown -community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -liberapay: # Replace with a single Liberapay username -issuehunt: # Replace with a single IssueHunt username -otechie: # Replace with a single Otechie username -custom: # Replace with a single custom sponsorship URL diff --git a/node_modules/hasown/.nycrc b/node_modules/hasown/.nycrc deleted file mode 100644 index 1826526..0000000 --- a/node_modules/hasown/.nycrc +++ /dev/null @@ -1,13 +0,0 @@ -{ - "all": true, - "check-coverage": false, - "reporter": ["text-summary", "text", "html", "json"], - "lines": 86, - "statements": 85.93, - "functions": 82.43, - "branches": 76.06, - "exclude": [ - "coverage", - "test" - ] -} diff --git a/node_modules/hasown/CHANGELOG.md b/node_modules/hasown/CHANGELOG.md deleted file mode 100644 index 2b0a980..0000000 --- a/node_modules/hasown/CHANGELOG.md +++ /dev/null @@ -1,40 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - -## [v2.0.2](https://github.com/inspect-js/hasOwn/compare/v2.0.1...v2.0.2) - 2024-03-10 - -### Commits - -- [types] use shared config [`68e9d4d`](https://github.com/inspect-js/hasOwn/commit/68e9d4dab6facb4f05f02c6baea94a3f2a4e44b2) -- [actions] remove redundant finisher; use reusable workflow [`241a68e`](https://github.com/inspect-js/hasOwn/commit/241a68e13ea1fe52bec5ba7f74144befc31fae7b) -- [Tests] increase coverage [`4125c0d`](https://github.com/inspect-js/hasOwn/commit/4125c0d6121db56ae30e38346dfb0c000b04f0a7) -- [Tests] skip `npm ls` in old node due to TS [`01b9282`](https://github.com/inspect-js/hasOwn/commit/01b92822f9971dea031eafdd14767df41d61c202) -- [types] improve predicate type [`d340f85`](https://github.com/inspect-js/hasOwn/commit/d340f85ce02e286ef61096cbbb6697081d40a12b) -- [Dev Deps] update `tape` [`70089fc`](https://github.com/inspect-js/hasOwn/commit/70089fcf544e64acc024cbe60f5a9b00acad86de) -- [Tests] use `@arethetypeswrong/cli` [`50b272c`](https://github.com/inspect-js/hasOwn/commit/50b272c829f40d053a3dd91c9796e0ac0b2af084) - -## [v2.0.1](https://github.com/inspect-js/hasOwn/compare/v2.0.0...v2.0.1) - 2024-02-10 - -### Commits - -- [types] use a handwritten d.ts file; fix exported type [`012b989`](https://github.com/inspect-js/hasOwn/commit/012b9898ccf91dc441e2ebf594ff70270a5fda58) -- [Dev Deps] update `@types/function-bind`, `@types/mock-property`, `@types/tape`, `aud`, `mock-property`, `npmignore`, `tape`, `typescript` [`977a56f`](https://github.com/inspect-js/hasOwn/commit/977a56f51a1f8b20566f3c471612137894644025) -- [meta] add `sideEffects` flag [`3a60b7b`](https://github.com/inspect-js/hasOwn/commit/3a60b7bf42fccd8c605e5f145a6fcc83b13cb46f) - -## [v2.0.0](https://github.com/inspect-js/hasOwn/compare/v1.0.1...v2.0.0) - 2023-10-19 - -### Commits - -- revamped implementation, tests, readme [`72bf8b3`](https://github.com/inspect-js/hasOwn/commit/72bf8b338e77a638f0a290c63ffaed18339c36b4) -- [meta] revamp package.json [`079775f`](https://github.com/inspect-js/hasOwn/commit/079775fb1ec72c1c6334069593617a0be3847458) -- Only apps should have lockfiles [`6640e23`](https://github.com/inspect-js/hasOwn/commit/6640e233d1bb8b65260880f90787637db157d215) - -## v1.0.1 - 2023-10-10 - -### Commits - -- Initial commit [`8dbfde6`](https://github.com/inspect-js/hasOwn/commit/8dbfde6e8fb0ebb076fab38d138f2984eb340a62) diff --git a/node_modules/hasown/LICENSE b/node_modules/hasown/LICENSE deleted file mode 100644 index 0314929..0000000 --- a/node_modules/hasown/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) Jordan Harband and contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/node_modules/hasown/README.md b/node_modules/hasown/README.md deleted file mode 100644 index f759b8a..0000000 --- a/node_modules/hasown/README.md +++ /dev/null @@ -1,40 +0,0 @@ -# hasown [![Version Badge][npm-version-svg]][package-url] - -[![github actions][actions-image]][actions-url] -[![coverage][codecov-image]][codecov-url] -[![License][license-image]][license-url] -[![Downloads][downloads-image]][downloads-url] - -[![npm badge][npm-badge-png]][package-url] - -A robust, ES3 compatible, "has own property" predicate. - -## Example - -```js -const assert = require('assert'); -const hasOwn = require('hasown'); - -assert.equal(hasOwn({}, 'toString'), false); -assert.equal(hasOwn([], 'length'), true); -assert.equal(hasOwn({ a: 42 }, 'a'), true); -``` - -## Tests -Simply clone the repo, `npm install`, and run `npm test` - -[package-url]: https://npmjs.org/package/hasown -[npm-version-svg]: https://versionbadg.es/inspect-js/hasown.svg -[deps-svg]: https://david-dm.org/inspect-js/hasOwn.svg -[deps-url]: https://david-dm.org/inspect-js/hasOwn -[dev-deps-svg]: https://david-dm.org/inspect-js/hasOwn/dev-status.svg -[dev-deps-url]: https://david-dm.org/inspect-js/hasOwn#info=devDependencies -[npm-badge-png]: https://nodei.co/npm/hasown.png?downloads=true&stars=true -[license-image]: https://img.shields.io/npm/l/hasown.svg -[license-url]: LICENSE -[downloads-image]: https://img.shields.io/npm/dm/hasown.svg -[downloads-url]: https://npm-stat.com/charts.html?package=hasown -[codecov-image]: https://codecov.io/gh/inspect-js/hasOwn/branch/main/graphs/badge.svg -[codecov-url]: https://app.codecov.io/gh/inspect-js/hasOwn/ -[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/inspect-js/hasOwn -[actions-url]: https://github.com/inspect-js/hasOwn/actions diff --git a/node_modules/hasown/index.d.ts b/node_modules/hasown/index.d.ts deleted file mode 100644 index aafdf3b..0000000 --- a/node_modules/hasown/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -declare function hasOwn(o: O, p: K): o is O & Record; - -export = hasOwn; diff --git a/node_modules/hasown/index.js b/node_modules/hasown/index.js deleted file mode 100644 index 34e6059..0000000 --- a/node_modules/hasown/index.js +++ /dev/null @@ -1,8 +0,0 @@ -'use strict'; - -var call = Function.prototype.call; -var $hasOwn = Object.prototype.hasOwnProperty; -var bind = require('function-bind'); - -/** @type {import('.')} */ -module.exports = bind.call(call, $hasOwn); diff --git a/node_modules/hasown/package.json b/node_modules/hasown/package.json deleted file mode 100644 index 8502e13..0000000 --- a/node_modules/hasown/package.json +++ /dev/null @@ -1,92 +0,0 @@ -{ - "name": "hasown", - "version": "2.0.2", - "description": "A robust, ES3 compatible, \"has own property\" predicate.", - "main": "index.js", - "exports": { - ".": "./index.js", - "./package.json": "./package.json" - }, - "types": "index.d.ts", - "sideEffects": false, - "scripts": { - "prepack": "npmignore --auto --commentLines=autogenerated", - "prepublish": "not-in-publish || npm run prepublishOnly", - "prepublishOnly": "safe-publish-latest", - "prelint": "evalmd README.md", - "lint": "eslint --ext=js,mjs .", - "postlint": "npm run tsc", - "pretest": "npm run lint", - "tsc": "tsc -p .", - "posttsc": "attw -P", - "tests-only": "nyc tape 'test/**/*.js'", - "test": "npm run tests-only", - "posttest": "aud --production", - "version": "auto-changelog && git add CHANGELOG.md", - "postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\"" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/inspect-js/hasOwn.git" - }, - "keywords": [ - "has", - "hasOwnProperty", - "hasOwn", - "has-own", - "own", - "has", - "property", - "in", - "javascript", - "ecmascript" - ], - "author": "Jordan Harband ", - "license": "MIT", - "bugs": { - "url": "https://github.com/inspect-js/hasOwn/issues" - }, - "homepage": "https://github.com/inspect-js/hasOwn#readme", - "dependencies": { - "function-bind": "^1.1.2" - }, - "devDependencies": { - "@arethetypeswrong/cli": "^0.15.1", - "@ljharb/eslint-config": "^21.1.0", - "@ljharb/tsconfig": "^0.2.0", - "@types/function-bind": "^1.1.10", - "@types/mock-property": "^1.0.2", - "@types/tape": "^5.6.4", - "aud": "^2.0.4", - "auto-changelog": "^2.4.0", - "eslint": "=8.8.0", - "evalmd": "^0.0.19", - "in-publish": "^2.0.1", - "mock-property": "^1.0.3", - "npmignore": "^0.3.1", - "nyc": "^10.3.2", - "safe-publish-latest": "^2.0.0", - "tape": "^5.7.5", - "typescript": "next" - }, - "engines": { - "node": ">= 0.4" - }, - "testling": { - "files": "test/index.js" - }, - "auto-changelog": { - "output": "CHANGELOG.md", - "template": "keepachangelog", - "unreleased": false, - "commitLimit": false, - "backfillLimit": false, - "hideCredit": true - }, - "publishConfig": { - "ignore": [ - ".github/workflows", - "test" - ] - } -} diff --git a/node_modules/hasown/tsconfig.json b/node_modules/hasown/tsconfig.json deleted file mode 100644 index 0930c56..0000000 --- a/node_modules/hasown/tsconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "@ljharb/tsconfig", - "exclude": [ - "coverage", - ], -} diff --git a/node_modules/html5-qrcode/LICENSE b/node_modules/html5-qrcode/LICENSE deleted file mode 100644 index 06900aa..0000000 --- a/node_modules/html5-qrcode/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [2020] [MINHAZ ] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/node_modules/html5-qrcode/README.md b/node_modules/html5-qrcode/README.md deleted file mode 100644 index 1441ce5..0000000 --- a/node_modules/html5-qrcode/README.md +++ /dev/null @@ -1,398 +0,0 @@ -# Html5-QRCode - -## Lightweight & cross platform QR Code and Bar code scanning library for the web - -Use this lightweight library to easily / quickly integrate QR code, bar code, and other common code scanning capabilities to your web application. - -## Key highlights -- 🔲 Support scanning [different types of bar codes and QR codes](#supported-code-formats). - -- 🖥 Supports [different platforms](#supported-platforms) be it Android, IOS, MacOs, Windows or Linux - -- 🌐 Supports [different browsers](#supported-platforms) like Chrome, Firefox, Safari, Edge, Opera ... - -- 📷 Supports scanning with camera as well as local files - -- ➡️ Comes with an [end to end library with UI](#easy-mode---with-end-to-end-scanner-user-interface) as well as a [low level library to build your own UI with](#pro-mode---if-you-want-to-implement-your-own-user-interface). - -- 🔦 Supports customisations like [flash/torch support](#showtorchbuttonifsupported---boolean--undefined), zooming etc. - - -Supports two kinds of APIs - -- `Html5QrcodeScanner` — End-to-end scanner with UI, integrate with less than ten lines of code. - -- `Html5Qrcode` — Powerful set of APIs you can use to build your UI without worrying about camera setup, handling permissions, reading codes, etc. - -> Support for scanning local files on the device is a new addition and helpful for the web browser which does not support inline web-camera access in smartphones. **Note:** This doesn't upload files to any server — everything is done locally. - -[![CircleCI](https://dl.circleci.com/status-badge/img/gh/mebjas/html5-qrcode/tree/master.svg?style=svg)](https://dl.circleci.com/status-badge/redirect/gh/mebjas/html5-qrcode/tree/master) [![GitHub issues](https://img.shields.io/github/issues/mebjas/html5-qrcode)](https://github.com/mebjas/html5-qrcode/issues) [![GitHub tag (latest by date)](https://img.shields.io/github/v/tag/mebjas/html5-qrcode)](https://github.com/mebjas/html5-qrcode/releases) ![GitHub](https://img.shields.io/github/license/mebjas/html5-qrcode) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/51e4f0ef8b0b42e1b93ce29875dd23a0)](https://www.codacy.com/gh/mebjas/html5-qrcode/dashboard?utm_source=github.com&utm_medium=referral&utm_content=mebjas/html5-qrcode&utm_campaign=Badge_Grade) [![Gitter](https://badges.gitter.im/html5-qrcode/community.svg)](https://gitter.im/html5-qrcode/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) - -![GitHub all releases](https://img.shields.io/github/downloads/mebjas/html5-qrcode/total?label=Github%20downloads&style=for-the-badge) [![npm](https://img.shields.io/npm/dw/html5-qrcode?label=npm%20downloads&style=for-the-badge)](https://www.npmjs.com/package/html5-qrcode) [![](https://img.shields.io/badge/Medium-12100E?style=for-the-badge&logo=medium&logoColor=white)](https://bit.ly/3CZiASv) - -| | | -| -- | -- | -| _Demo at [scanapp.org](https://scanapp.org)_ | _Demo at [qrcode.minhazav.dev](https://qrcode.minhazav.dev) - **Scanning different types of codes**_ | - -## We need your help! - -![image](https://user-images.githubusercontent.com/3007365/222830114-e5bcca15-bf8a-434e-9f48-339e82a0a4ef.png) -Help incentivise feature development, bug fixing by supporting the sponsorhip goals of this project. See [list of sponsered feature requests here](https://github.com/mebjas/html5-qrcode/wiki/Feature-request-sponsorship-goals#feature-requests). - -[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/L3L84G0C8) - -## Documentation - -The documentation for this project has been moved to [scanapp.org/html5-qrcode-docs](https://scanapp.org/html5-qrcode-docs/). - -- [Getting started](https://scanapp.org/html5-qrcode-docs/docs/intro) -- [Supported frameworks](https://scanapp.org/html5-qrcode-docs/docs/supported_frameworks) -- [Supported 1D and 2D Code formats](https://scanapp.org/html5-qrcode-docs/docs/supported_code_formats) -- [Detailed API documentation](https://scanapp.org/html5-qrcode-docs/docs/apis) - -## Supported platforms - -We are working continuously on adding support for more and more platforms. If you find a platform or a browser where the library is not working, please feel free to file an issue. Check the [demo link](https://blog.minhazav.dev/research/html5-qrcode.html) to test it out. - -**Legends** -- ![](https://scanapp.org/assets/github_assets/done.png) Means full support — inline webcam and file based -- ![](https://scanapp.org/assets/github_assets/partial.png) Means partial support — only file based, webcam in progress - -### PC / Mac - -| Firefox
    Firefox | Chrome
    Chrome | Safari
    Safari | Opera
    Opera | Edge
    Edge -| --------- | --------- | --------- | --------- | ------- | -|![](https://scanapp.org/assets/github_assets/done.png)| ![](https://scanapp.org/assets/github_assets/done.png)| ![](https://scanapp.org/assets/github_assets/done.png)| ![](https://scanapp.org/assets/github_assets/done.png) | ![](https://scanapp.org/assets/github_assets/done.png) - -### Android - -| Chrome
    Chrome | Firefox
    Firefox | Edge
    Edge | Opera
    Opera | Opera-Mini
    Opera Mini | UC
    UC -| --------- | --------- | --------- | --------- | --------- | --------- | -|![](https://scanapp.org/assets/github_assets/done.png)| ![](https://scanapp.org/assets/github_assets/done.png)| ![](https://scanapp.org/assets/github_assets/done.png)| ![](https://scanapp.org/assets/github_assets/done.png)| ![](https://scanapp.org/assets/github_assets/partial.png) | ![](https://scanapp.org/assets/github_assets/partial.png) - -### IOS - -| Safari
    Safari | Chrome
    Chrome | Firefox
    Firefox | Edge
    Edge -| --------- | --------- | --------- | --------- | -|![](https://scanapp.org/assets/github_assets/done.png)| ![](https://scanapp.org/assets/github_assets/done.png)* | ![](https://scanapp.org/assets/github_assets/done.png)* | ![](https://scanapp.org/assets/github_assets/partial.png) - - -> \* Supported for IOS versions >= 15.1 -> -> Before version 15.1, Webkit for IOS is used by Chrome, Firefox, and other browsers in IOS and they do not have webcam permissions yet. There is an ongoing issue on fixing the support for iOS - [issue/14](https://github.com/mebjas/html5-qrcode/issues/14) - -### Framework support -The library can be easily used with several other frameworks, I have been adding examples for a few of them and would continue to add more. - -|| | | | -| -------- | -------- | -------- | -------- | -------- | -| [Html5](./examples/html5) | [VueJs](./examples/vuejs) | [ElectronJs](./examples/electron) | [React](https://github.com/scanapp-org/html5-qrcode-react) | [Lit](./examples/lit) - -### Supported Code formats -Code scanning is dependent on [Zxing-js](https://github.com/zxing-js/library) library. We will be working on top of it to add support for more types of code scanning. If you feel a certain type of code would be helpful to have, please file a feature request. - -| Code | Example | -| ---- | ----- | -| QR Code | | -| AZTEC | | -| CODE_39| | -| CODE_93| | -| CODE_128| | -| ITF| | -| EAN_13| | -| EAN_8| | -| PDF_417| | -| UPC_A| | -| UPC_E| | -| DATA_MATRIX| | -| MAXICODE*| | -| RSS_14*| | -| RSS_EXPANDED*| | - -> *Formats are not supported by our experimental integration with native -> BarcodeDetector API integration ([Read more](/experimental.md)). - -## Description - [View Demo](https://blog.minhazav.dev/research/html5-qrcode.html) - -> See an end to end scanner experience at [scanapp.org](https://scanapp.org). - -This is a cross-platform JavaScript library to integrate QR code, bar codes & a few other types of code scanning capabilities to your applications running on HTML5 compatible browser. - -Supports: -- Querying camera on the device (with user permissions) -- Rendering live camera feed, with easy to use user interface for scanning -- Supports scanning a different kind of QR codes, bar codes and other formats -- Supports selecting image files from the device for scanning codes - -## How to use - -Find detailed guidelines on how to use this library on [scanapp.org/html5-qrcode-docs](https://scanapp.org/html5-qrcode-docs/docs/intro). - -## Demo -
    -_Scan this image or visit [blog.minhazav.dev/research/html5-qrcode.html](https://blog.minhazav.dev/research/html5-qrcode.html)_ - -### For more information -Check these articles on how to use this library: - -- [QR and barcode scanner using HTML and JavaScript](https://minhazav.medium.com/qr-and-barcode-scanner-using-html-and-javascript-2cdc937f793d) -- [HTML5 QR Code scanning — launched v1.0.1 without jQuery dependency and refactored Promise based APIs](https://blog.minhazav.dev/HTML5-QR-Code-scanning-launched-v1.0.1/). -- [HTML5 QR Code scanning with JavaScript — Support for scanning the local file and using default camera added (v1.0.5)](https://blog.minhazav.dev/HTML5-QR-Code-scanning-support-for-local-file-and-default-camera/) - -## Screenshots -![screenshot](https://scanapp.org/assets/github_assets/screen.gif)
    -_Figure: Screenshot from Google Chrome running on MacBook Pro_ - -## Documentation -Find the full API documentation at [scanapp.org/html5-qrcode-docs/docs/apis](https://scanapp.org/html5-qrcode-docs/docs/apis). - -### Extra optional `configuration` in `start()` method -Configuration object that can be used to configure both the scanning behavior and the user interface (UI). Most of the fields have default properties that will be used unless a different value is provided. If you do not want to override anything, you can just pass in an empty object `{}`. - -#### `fps` — Integer, Example = 10 -A.K.A frame per second, the default value for this is 2, but it can be increased to get faster scanning. Increasing too high value could affect performance. Value `>1000` will simply fail. - -#### `qrbox` — `QrDimensions` or `QrDimensionFunction` (Optional), Example = `{ width: 250, height: 250 }` -Use this property to limit the region of the viewfinder you want to use for scanning. The rest of the viewfinder would be shaded. For example, by passing config `{ qrbox : { width: 250, height: 250 } }`, the screen will look like: - - - -This can be used to set a rectangular scanning area with config like: - -```js -let config = { qrbox : { width: 400, height: 150 } } -``` - -This config also accepts a function of type -```ts -/** - * A function that takes in the width and height of the video stream -* and returns QrDimensions. -* -* Viewfinder refers to the video showing camera stream. -*/ -type QrDimensionFunction = - (viewfinderWidth: number, viewfinderHeight: number) => QrDimensions; -``` - -This allows you to set dynamic QR box dimensions based on the video dimensions. See this blog article for example: [Setting dynamic QR box size in Html5-qrcode - ScanApp blog](https://scanapp.org/blog/2022/01/09/setting-dynamic-qr-box-size-in-html5-qrcode.html) - -> This might be desirable for bar code scanning. - -If this value is not set, no shaded QR box will be rendered and the scanner will scan the entire area of video stream. - -#### `aspectRatio` — Float, Example 1.777778 for 16:9 aspect ratio -Use this property to render the video feed in a certain aspect ratio. Passing a nonstandard aspect ratio like `100000:1` could lead to the video feed not even showing up. Ideal values can be: -| Value | Aspect Ratio | Use Case | -| ----- | ------------ | -------- | -|1.333334 | 4:3 | Standard camera aspect ratio | -|1.777778 | 16:9 | Full screen, cinematic | -|1.0 | 1:1 | Square view | - -If you do not pass any value, the whole viewfinder would be used for scanning. -**Note**: this value has to be smaller than the width and height of the `QR code HTML element`. - -#### `disableFlip` — Boolean (Optional), default = false -By default, the scanner can scan for horizontally flipped QR Codes. This also enables scanning QR code using the front camera on mobile devices which are sometimes mirrored. This is `false` by default and I recommend changing this only if: -- You are sure that the camera feed cannot be mirrored (Horizontally flipped) -- You are facing performance issues with this enabled. - -Here's an example of a normal and mirrored QR Code -| Normal QR Code | Mirrored QR Code | -| ----- | ---- | -| |
    | - -#### `rememberLastUsedCamera` — Boolean (Optional), default = true -If `true` the last camera used by the user and weather or not permission was granted would be remembered in the local storage. If the user has previously granted permissions — the request permission option in the UI will be skipped and the last selected camera would be launched automatically for scanning. - -If `true` the library shall remember if the camera permissions were previously -granted and what camera was last used. If the permissions is already granted for -"camera", QR code scanning will automatically * start for previously used camera. - -#### `supportedScanTypes` - `Array | []` -> This is only supported for `Html5QrcodeScanner`. - -Default = `[Html5QrcodeScanType.SCAN_TYPE_CAMERA, Html5QrcodeScanType.SCAN_TYPE_FILE]` - -This field can be used to: -- Limit support to either of `Camera` or `File` based scan. -- Change default scan type. - -How to use: - -```js -function onScanSuccess(decodedText, decodedResult) { - // handle the scanned code as you like, for example: - console.log(`Code matched = ${decodedText}`, decodedResult); -} - -let config = { - fps: 10, - qrbox: {width: 100, height: 100}, - rememberLastUsedCamera: true, - // Only support camera scan type. - supportedScanTypes: [Html5QrcodeScanType.SCAN_TYPE_CAMERA] -}; - -let html5QrcodeScanner = new Html5QrcodeScanner( - "reader", config, /* verbose= */ false); -html5QrcodeScanner.render(onScanSuccess); -``` - -For file based scan only choose: -```js -supportedScanTypes: [Html5QrcodeScanType.SCAN_TYPE_FILE] -``` - -For supporting both as it is today, you can ignore this field or set as: -```js -supportedScanTypes: [ - Html5QrcodeScanType.SCAN_TYPE_CAMERA, - Html5QrcodeScanType.SCAN_TYPE_FILE] -``` - -To set the file based scan as defult change the order: -```js -supportedScanTypes: [ - Html5QrcodeScanType.SCAN_TYPE_FILE, - Html5QrcodeScanType.SCAN_TYPE_CAMERA] -``` - -#### `showTorchButtonIfSupported` - `boolean | undefined` -> This is only supported for `Html5QrcodeScanner`. - -If `true` the rendered UI will have button to turn flash on or off based on device + browser support. The value is `false` by default. - -### Scanning only specific formats -By default, both camera stream and image files are scanned against all the -supported code formats. Both `Html5QrcodeScanner` and `Html5Qrcode` classes can - be configured to only support a subset of supported formats. Supported formats -are defined in -[enum Html5QrcodeSupportedFormats](https://github.com/mebjas/html5-qrcode/blob/master/src/core.ts#L14). - -```ts -enum Html5QrcodeSupportedFormats { - QR_CODE = 0, - AZTEC, - CODABAR, - CODE_39, - CODE_93, - CODE_128, - DATA_MATRIX, - MAXICODE, - ITF, - EAN_13, - EAN_8, - PDF_417, - RSS_14, - RSS_EXPANDED, - UPC_A, - UPC_E, - UPC_EAN_EXTENSION, -} -``` - -I recommend using this only if you need to explicitly omit support for certain -formats or want to reduce the number of scans done per second for performance -reasons. - -#### Scanning only QR code with `Html5Qrcode` -```js -const html5QrCode = new Html5Qrcode( - "reader", { formatsToSupport: [ Html5QrcodeSupportedFormats.QR_CODE ] }); -const qrCodeSuccessCallback = (decodedText, decodedResult) => { - /* handle success */ -}; -const config = { fps: 10, qrbox: { width: 250, height: 250 } }; - -// If you want to prefer front camera -html5QrCode.start({ facingMode: "user" }, config, qrCodeSuccessCallback); -``` - -#### Scanning only QR code and UPC codes with `Html5QrcodeScanner` -```js -function onScanSuccess(decodedText, decodedResult) { - // Handle the scanned code as you like, for example: - console.log(`Code matched = ${decodedText}`, decodedResult); -} - -const formatsToSupport = [ - Html5QrcodeSupportedFormats.QR_CODE, - Html5QrcodeSupportedFormats.UPC_A, - Html5QrcodeSupportedFormats.UPC_E, - Html5QrcodeSupportedFormats.UPC_EAN_EXTENSION, -]; -const html5QrcodeScanner = new Html5QrcodeScanner( - "reader", - { - fps: 10, - qrbox: { width: 250, height: 250 }, - formatsToSupport: formatsToSupport - }, - /* verbose= */ false); -html5QrcodeScanner.render(onScanSuccess); -``` - -## Experimental features -The library now supports some experimental features which are supported in the -library but not recommended for production usage either due to limited testing -done or limited compatibility for underlying APIs used. Read more about it [here](/experimental.md). -Some experimental features include: -- [Support for BarcodeDetector JavaScript API](/experimental.md) - -## How to modify and build -1. Code changes should only be made to [/src](./src) only. - -2. Run `npm install` to install all dependencies. - -3. Run `npm run-script build` to build JavaScript output. The output JavaScript distribution is built to [/dist/html5-qrcode.min.js](./dist/html5-qrcode.min.js). If you are developing on Windows OS, run `npm run-script build-windows`. - -4. Testing - - Run `npm test` - - Run the tests before sending a pull request, all tests should run. - - Please add tests for new behaviors sent in PR. - -5. Send a pull request - - Include code changes only to `./src`. **Do not change `./dist` manually.** - - In the pull request add a comment like - ```text - @all-contributors please add @mebjas for this new feature or tests - ``` - - For calling out your contributions, the bot will update the contributions file. - - Code will be built & published by the author in batches. - -## How to contribute -You can contribute to the project in several ways: - -- File issue ticket for any observed bug or compatibility issue with the project. -- File feature request for missing features. -- Take open bugs or feature request and work on it and send a Pull Request. -- Write unit tests for existing codebase (which is not covered by tests today). **Help wanted on this** - [read more](./tests). - -## Support 💖 - -This project would not be possible without all of our fantastic contributors and [sponsors](https://github.com/sponsors/mebjas). If you'd like to support the maintenance and upkeep of this project you can [donate via GitHub Sponsors](https://github.com/sponsors/mebjas). - -**Sponsor the project for priortising feature requests / bugs relevant to you**. (Depends on scope of ask and bandwidth of the contributors). - - -webauthor@ -ben-gy -bujjivadu - - -Help incentivise feature development, bug fixing by supporting the sponsorhip goals of this project. See [list of sponsered feature requests here](https://github.com/mebjas/html5-qrcode/wiki/Feature-request-sponsorship-goals#feature-requests). - -Also, huge thanks to following organizations for non monitery sponsorships - - -
    - -
    -
    - -
    - - -## Credits -The decoder used for the QR code reading is from `Zxing-js` https://github.com/zxing-js/library
    diff --git a/node_modules/html5-qrcode/camera/core-impl.d.ts b/node_modules/html5-qrcode/camera/core-impl.d.ts deleted file mode 100644 index ffc8a05..0000000 --- a/node_modules/html5-qrcode/camera/core-impl.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Camera, CameraRenderingOptions, RenderedCamera, RenderingCallbacks } from "./core"; -export declare class CameraImpl implements Camera { - private readonly mediaStream; - private constructor(); - render(parentElement: HTMLElement, options: CameraRenderingOptions, callbacks: RenderingCallbacks): Promise; - static create(videoConstraints: MediaTrackConstraints): Promise; -} diff --git a/node_modules/html5-qrcode/camera/core.d.ts b/node_modules/html5-qrcode/camera/core.d.ts deleted file mode 100644 index 52e27b5..0000000 --- a/node_modules/html5-qrcode/camera/core.d.ts +++ /dev/null @@ -1,41 +0,0 @@ -export interface CameraDevice { - id: string; - label: string; -} -export interface CameraCapability { - isSupported(): boolean; - apply(value: T): Promise; - value(): T | null; -} -export interface RangeCameraCapability extends CameraCapability { - min(): number; - max(): number; - step(): number; -} -export interface BooleanCameraCapability extends CameraCapability { -} -export interface CameraCapabilities { - zoomFeature(): RangeCameraCapability; - torchFeature(): BooleanCameraCapability; -} -export type OnRenderSurfaceReady = (viewfinderWidth: number, viewfinderHeight: number) => void; -export interface RenderingCallbacks { - onRenderSurfaceReady: OnRenderSurfaceReady; -} -export interface RenderedCamera { - getSurface(): HTMLVideoElement; - pause(): void; - resume(onResumeCallback: () => void): void; - isPaused(): boolean; - close(): Promise; - getRunningTrackCapabilities(): MediaTrackCapabilities; - getRunningTrackSettings(): MediaTrackSettings; - applyVideoConstraints(constraints: MediaTrackConstraints): Promise; - getCapabilities(): CameraCapabilities; -} -export interface CameraRenderingOptions { - aspectRatio?: number; -} -export interface Camera { - render(parentElement: HTMLElement, options: CameraRenderingOptions, callbacks: RenderingCallbacks): Promise; -} diff --git a/node_modules/html5-qrcode/camera/factories.d.ts b/node_modules/html5-qrcode/camera/factories.d.ts deleted file mode 100644 index df98f8f..0000000 --- a/node_modules/html5-qrcode/camera/factories.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Camera } from "./core"; -export declare class CameraFactory { - static failIfNotSupported(): Promise; - private constructor(); - create(videoConstraints: MediaTrackConstraints): Promise; -} diff --git a/node_modules/html5-qrcode/camera/permissions.d.ts b/node_modules/html5-qrcode/camera/permissions.d.ts deleted file mode 100644 index 4209c55..0000000 --- a/node_modules/html5-qrcode/camera/permissions.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export declare class CameraPermissions { - static hasPermissions(): Promise; -} diff --git a/node_modules/html5-qrcode/camera/retriever.d.ts b/node_modules/html5-qrcode/camera/retriever.d.ts deleted file mode 100644 index 0baac12..0000000 --- a/node_modules/html5-qrcode/camera/retriever.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { CameraDevice } from "./core"; -export declare class CameraRetriever { - static retrieve(): Promise>; - private static rejectWithError; - private static isHttpsOrLocalhost; - private static getCamerasFromMediaDevices; - private static getCamerasFromMediaStreamTrack; -} diff --git a/node_modules/html5-qrcode/cjs/camera/core-impl.d.ts b/node_modules/html5-qrcode/cjs/camera/core-impl.d.ts deleted file mode 100644 index ffc8a05..0000000 --- a/node_modules/html5-qrcode/cjs/camera/core-impl.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Camera, CameraRenderingOptions, RenderedCamera, RenderingCallbacks } from "./core"; -export declare class CameraImpl implements Camera { - private readonly mediaStream; - private constructor(); - render(parentElement: HTMLElement, options: CameraRenderingOptions, callbacks: RenderingCallbacks): Promise; - static create(videoConstraints: MediaTrackConstraints): Promise; -} diff --git a/node_modules/html5-qrcode/cjs/camera/core-impl.js b/node_modules/html5-qrcode/cjs/camera/core-impl.js deleted file mode 100644 index ef7bf76..0000000 --- a/node_modules/html5-qrcode/cjs/camera/core-impl.js +++ /dev/null @@ -1,314 +0,0 @@ -"use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - if (typeof b !== "function" && b !== null) - throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (g && (g = 0, op[0] && (_ = 0)), _) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.CameraImpl = void 0; -var AbstractCameraCapability = (function () { - function AbstractCameraCapability(name, track) { - this.name = name; - this.track = track; - } - AbstractCameraCapability.prototype.isSupported = function () { - if (!this.track.getCapabilities) { - return false; - } - return this.name in this.track.getCapabilities(); - }; - AbstractCameraCapability.prototype.apply = function (value) { - var constraint = {}; - constraint[this.name] = value; - var constraints = { advanced: [constraint] }; - return this.track.applyConstraints(constraints); - }; - AbstractCameraCapability.prototype.value = function () { - var settings = this.track.getSettings(); - if (this.name in settings) { - var settingValue = settings[this.name]; - return settingValue; - } - return null; - }; - return AbstractCameraCapability; -}()); -var AbstractRangeCameraCapability = (function (_super) { - __extends(AbstractRangeCameraCapability, _super); - function AbstractRangeCameraCapability(name, track) { - return _super.call(this, name, track) || this; - } - AbstractRangeCameraCapability.prototype.min = function () { - return this.getCapabilities().min; - }; - AbstractRangeCameraCapability.prototype.max = function () { - return this.getCapabilities().max; - }; - AbstractRangeCameraCapability.prototype.step = function () { - return this.getCapabilities().step; - }; - AbstractRangeCameraCapability.prototype.apply = function (value) { - var constraint = {}; - constraint[this.name] = value; - var constraints = { advanced: [constraint] }; - return this.track.applyConstraints(constraints); - }; - AbstractRangeCameraCapability.prototype.getCapabilities = function () { - this.failIfNotSupported(); - var capabilities = this.track.getCapabilities(); - var capability = capabilities[this.name]; - return { - min: capability.min, - max: capability.max, - step: capability.step, - }; - }; - AbstractRangeCameraCapability.prototype.failIfNotSupported = function () { - if (!this.isSupported()) { - throw new Error("".concat(this.name, " capability not supported")); - } - }; - return AbstractRangeCameraCapability; -}(AbstractCameraCapability)); -var ZoomFeatureImpl = (function (_super) { - __extends(ZoomFeatureImpl, _super); - function ZoomFeatureImpl(track) { - return _super.call(this, "zoom", track) || this; - } - return ZoomFeatureImpl; -}(AbstractRangeCameraCapability)); -var TorchFeatureImpl = (function (_super) { - __extends(TorchFeatureImpl, _super); - function TorchFeatureImpl(track) { - return _super.call(this, "torch", track) || this; - } - return TorchFeatureImpl; -}(AbstractCameraCapability)); -var CameraCapabilitiesImpl = (function () { - function CameraCapabilitiesImpl(track) { - this.track = track; - } - CameraCapabilitiesImpl.prototype.zoomFeature = function () { - return new ZoomFeatureImpl(this.track); - }; - CameraCapabilitiesImpl.prototype.torchFeature = function () { - return new TorchFeatureImpl(this.track); - }; - return CameraCapabilitiesImpl; -}()); -var RenderedCameraImpl = (function () { - function RenderedCameraImpl(parentElement, mediaStream, callbacks) { - this.isClosed = false; - this.parentElement = parentElement; - this.mediaStream = mediaStream; - this.callbacks = callbacks; - this.surface = this.createVideoElement(this.parentElement.clientWidth); - parentElement.append(this.surface); - } - RenderedCameraImpl.prototype.createVideoElement = function (width) { - var videoElement = document.createElement("video"); - videoElement.style.width = "".concat(width, "px"); - videoElement.style.display = "block"; - videoElement.muted = true; - videoElement.setAttribute("muted", "true"); - videoElement.playsInline = true; - return videoElement; - }; - RenderedCameraImpl.prototype.setupSurface = function () { - var _this = this; - this.surface.onabort = function () { - throw "RenderedCameraImpl video surface onabort() called"; - }; - this.surface.onerror = function () { - throw "RenderedCameraImpl video surface onerror() called"; - }; - var onVideoStart = function () { - var videoWidth = _this.surface.clientWidth; - var videoHeight = _this.surface.clientHeight; - _this.callbacks.onRenderSurfaceReady(videoWidth, videoHeight); - _this.surface.removeEventListener("playing", onVideoStart); - }; - this.surface.addEventListener("playing", onVideoStart); - this.surface.srcObject = this.mediaStream; - this.surface.play(); - }; - RenderedCameraImpl.create = function (parentElement, mediaStream, options, callbacks) { - return __awaiter(this, void 0, void 0, function () { - var renderedCamera, aspectRatioConstraint; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - renderedCamera = new RenderedCameraImpl(parentElement, mediaStream, callbacks); - if (!options.aspectRatio) return [3, 2]; - aspectRatioConstraint = { - aspectRatio: options.aspectRatio - }; - return [4, renderedCamera.getFirstTrackOrFail().applyConstraints(aspectRatioConstraint)]; - case 1: - _a.sent(); - _a.label = 2; - case 2: - renderedCamera.setupSurface(); - return [2, renderedCamera]; - } - }); - }); - }; - RenderedCameraImpl.prototype.failIfClosed = function () { - if (this.isClosed) { - throw "The RenderedCamera has already been closed."; - } - }; - RenderedCameraImpl.prototype.getFirstTrackOrFail = function () { - this.failIfClosed(); - if (this.mediaStream.getVideoTracks().length === 0) { - throw "No video tracks found"; - } - return this.mediaStream.getVideoTracks()[0]; - }; - RenderedCameraImpl.prototype.pause = function () { - this.failIfClosed(); - this.surface.pause(); - }; - RenderedCameraImpl.prototype.resume = function (onResumeCallback) { - this.failIfClosed(); - var $this = this; - var onVideoResume = function () { - setTimeout(onResumeCallback, 200); - $this.surface.removeEventListener("playing", onVideoResume); - }; - this.surface.addEventListener("playing", onVideoResume); - this.surface.play(); - }; - RenderedCameraImpl.prototype.isPaused = function () { - this.failIfClosed(); - return this.surface.paused; - }; - RenderedCameraImpl.prototype.getSurface = function () { - this.failIfClosed(); - return this.surface; - }; - RenderedCameraImpl.prototype.getRunningTrackCapabilities = function () { - return this.getFirstTrackOrFail().getCapabilities(); - }; - RenderedCameraImpl.prototype.getRunningTrackSettings = function () { - return this.getFirstTrackOrFail().getSettings(); - }; - RenderedCameraImpl.prototype.applyVideoConstraints = function (constraints) { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - if ("aspectRatio" in constraints) { - throw "Changing 'aspectRatio' in run-time is not yet supported."; - } - return [2, this.getFirstTrackOrFail().applyConstraints(constraints)]; - }); - }); - }; - RenderedCameraImpl.prototype.close = function () { - if (this.isClosed) { - return Promise.resolve(); - } - var $this = this; - return new Promise(function (resolve, _) { - var tracks = $this.mediaStream.getVideoTracks(); - var tracksToClose = tracks.length; - var tracksClosed = 0; - $this.mediaStream.getVideoTracks().forEach(function (videoTrack) { - $this.mediaStream.removeTrack(videoTrack); - videoTrack.stop(); - ++tracksClosed; - if (tracksClosed >= tracksToClose) { - $this.isClosed = true; - $this.parentElement.removeChild($this.surface); - resolve(); - } - }); - }); - }; - RenderedCameraImpl.prototype.getCapabilities = function () { - return new CameraCapabilitiesImpl(this.getFirstTrackOrFail()); - }; - return RenderedCameraImpl; -}()); -var CameraImpl = (function () { - function CameraImpl(mediaStream) { - this.mediaStream = mediaStream; - } - CameraImpl.prototype.render = function (parentElement, options, callbacks) { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - return [2, RenderedCameraImpl.create(parentElement, this.mediaStream, options, callbacks)]; - }); - }); - }; - CameraImpl.create = function (videoConstraints) { - return __awaiter(this, void 0, void 0, function () { - var constraints, mediaStream; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - if (!navigator.mediaDevices) { - throw "navigator.mediaDevices not supported"; - } - constraints = { - audio: false, - video: videoConstraints - }; - return [4, navigator.mediaDevices.getUserMedia(constraints)]; - case 1: - mediaStream = _a.sent(); - return [2, new CameraImpl(mediaStream)]; - } - }); - }); - }; - return CameraImpl; -}()); -exports.CameraImpl = CameraImpl; -//# sourceMappingURL=core-impl.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/camera/core-impl.js.map b/node_modules/html5-qrcode/cjs/camera/core-impl.js.map deleted file mode 100644 index ca20c6e..0000000 --- a/node_modules/html5-qrcode/cjs/camera/core-impl.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"core-impl.js","sourceRoot":"","sources":["../../../src/camera/core-impl.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/camera/core.d.ts b/node_modules/html5-qrcode/cjs/camera/core.d.ts deleted file mode 100644 index 52e27b5..0000000 --- a/node_modules/html5-qrcode/cjs/camera/core.d.ts +++ /dev/null @@ -1,41 +0,0 @@ -export interface CameraDevice { - id: string; - label: string; -} -export interface CameraCapability { - isSupported(): boolean; - apply(value: T): Promise; - value(): T | null; -} -export interface RangeCameraCapability extends CameraCapability { - min(): number; - max(): number; - step(): number; -} -export interface BooleanCameraCapability extends CameraCapability { -} -export interface CameraCapabilities { - zoomFeature(): RangeCameraCapability; - torchFeature(): BooleanCameraCapability; -} -export type OnRenderSurfaceReady = (viewfinderWidth: number, viewfinderHeight: number) => void; -export interface RenderingCallbacks { - onRenderSurfaceReady: OnRenderSurfaceReady; -} -export interface RenderedCamera { - getSurface(): HTMLVideoElement; - pause(): void; - resume(onResumeCallback: () => void): void; - isPaused(): boolean; - close(): Promise; - getRunningTrackCapabilities(): MediaTrackCapabilities; - getRunningTrackSettings(): MediaTrackSettings; - applyVideoConstraints(constraints: MediaTrackConstraints): Promise; - getCapabilities(): CameraCapabilities; -} -export interface CameraRenderingOptions { - aspectRatio?: number; -} -export interface Camera { - render(parentElement: HTMLElement, options: CameraRenderingOptions, callbacks: RenderingCallbacks): Promise; -} diff --git a/node_modules/html5-qrcode/cjs/camera/core.js b/node_modules/html5-qrcode/cjs/camera/core.js deleted file mode 100644 index 383d5be..0000000 --- a/node_modules/html5-qrcode/cjs/camera/core.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=core.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/camera/core.js.map b/node_modules/html5-qrcode/cjs/camera/core.js.map deleted file mode 100644 index 28f32d7..0000000 --- a/node_modules/html5-qrcode/cjs/camera/core.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/camera/core.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/camera/factories.d.ts b/node_modules/html5-qrcode/cjs/camera/factories.d.ts deleted file mode 100644 index df98f8f..0000000 --- a/node_modules/html5-qrcode/cjs/camera/factories.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Camera } from "./core"; -export declare class CameraFactory { - static failIfNotSupported(): Promise; - private constructor(); - create(videoConstraints: MediaTrackConstraints): Promise; -} diff --git a/node_modules/html5-qrcode/cjs/camera/factories.js b/node_modules/html5-qrcode/cjs/camera/factories.js deleted file mode 100644 index acbbe11..0000000 --- a/node_modules/html5-qrcode/cjs/camera/factories.js +++ /dev/null @@ -1,64 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (g && (g = 0, op[0] && (_ = 0)), _) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.CameraFactory = void 0; -var core_impl_1 = require("./core-impl"); -var CameraFactory = (function () { - function CameraFactory() { - } - CameraFactory.failIfNotSupported = function () { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - if (!navigator.mediaDevices) { - throw "navigator.mediaDevices not supported"; - } - return [2, new CameraFactory()]; - }); - }); - }; - CameraFactory.prototype.create = function (videoConstraints) { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - return [2, core_impl_1.CameraImpl.create(videoConstraints)]; - }); - }); - }; - return CameraFactory; -}()); -exports.CameraFactory = CameraFactory; -//# sourceMappingURL=factories.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/camera/factories.js.map b/node_modules/html5-qrcode/cjs/camera/factories.js.map deleted file mode 100644 index 9faf783..0000000 --- a/node_modules/html5-qrcode/cjs/camera/factories.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"factories.js","sourceRoot":"","sources":["../../../src/camera/factories.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,yCAAyC;AAGzC;IAcI;IAAqC,CAAC;IARlB,gCAAkB,GAAtC;;;gBACI,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;oBACzB,MAAM,sCAAsC,CAAC;iBAChD;gBAED,WAAO,IAAI,aAAa,EAAE,EAAC;;;KAC9B;IAKY,8BAAM,GAAnB,UAAoB,gBAAuC;;;gBAEvD,WAAO,sBAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC;;;KAC9C;IACL,oBAAC;AAAD,CAAC,AArBD,IAqBC;AArBY,sCAAa"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/camera/permissions.d.ts b/node_modules/html5-qrcode/cjs/camera/permissions.d.ts deleted file mode 100644 index 4209c55..0000000 --- a/node_modules/html5-qrcode/cjs/camera/permissions.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export declare class CameraPermissions { - static hasPermissions(): Promise; -} diff --git a/node_modules/html5-qrcode/cjs/camera/permissions.js b/node_modules/html5-qrcode/cjs/camera/permissions.js deleted file mode 100644 index a8fd8ca..0000000 --- a/node_modules/html5-qrcode/cjs/camera/permissions.js +++ /dev/null @@ -1,65 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (g && (g = 0, op[0] && (_ = 0)), _) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.CameraPermissions = void 0; -var CameraPermissions = (function () { - function CameraPermissions() { - } - CameraPermissions.hasPermissions = function () { - return __awaiter(this, void 0, void 0, function () { - var devices, _i, devices_1, device; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4, navigator.mediaDevices.enumerateDevices()]; - case 1: - devices = _a.sent(); - for (_i = 0, devices_1 = devices; _i < devices_1.length; _i++) { - device = devices_1[_i]; - if (device.kind === "videoinput" && device.label) { - return [2, true]; - } - } - return [2, false]; - } - }); - }); - }; - return CameraPermissions; -}()); -exports.CameraPermissions = CameraPermissions; -//# sourceMappingURL=permissions.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/camera/permissions.js.map b/node_modules/html5-qrcode/cjs/camera/permissions.js.map deleted file mode 100644 index 95eb926..0000000 --- a/node_modules/html5-qrcode/cjs/camera/permissions.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../src/camera/permissions.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYC;IAAA;IAqBD,CAAC;IAfuB,gCAAc,GAAlC;;;;;4BAIgB,WAAM,SAAS,CAAC,YAAY,CAAC,gBAAgB,EAAE,EAAA;;wBAAzD,OAAO,GAAG,SAA+C;wBAC7D,WAA4B,EAAP,mBAAO,EAAP,qBAAO,EAAP,IAAO,EAAE;4BAAnB,MAAM;4BAGf,IAAG,MAAM,CAAC,IAAI,KAAK,YAAY,IAAI,MAAM,CAAC,KAAK,EAAE;gCAC/C,WAAO,IAAI,EAAC;6BACb;yBACF;wBAED,WAAO,KAAK,EAAC;;;;KACd;IACL,wBAAC;AAAD,CAAC,AArBA,IAqBA;AArBa,8CAAiB"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/camera/retriever.d.ts b/node_modules/html5-qrcode/cjs/camera/retriever.d.ts deleted file mode 100644 index 0baac12..0000000 --- a/node_modules/html5-qrcode/cjs/camera/retriever.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { CameraDevice } from "./core"; -export declare class CameraRetriever { - static retrieve(): Promise>; - private static rejectWithError; - private static isHttpsOrLocalhost; - private static getCamerasFromMediaDevices; - private static getCamerasFromMediaStreamTrack; -} diff --git a/node_modules/html5-qrcode/cjs/camera/retriever.js b/node_modules/html5-qrcode/cjs/camera/retriever.js deleted file mode 100644 index 329c343..0000000 --- a/node_modules/html5-qrcode/cjs/camera/retriever.js +++ /dev/null @@ -1,127 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (g && (g = 0, op[0] && (_ = 0)), _) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.CameraRetriever = void 0; -var strings_1 = require("../strings"); -var CameraRetriever = (function () { - function CameraRetriever() { - } - CameraRetriever.retrieve = function () { - if (navigator.mediaDevices) { - return CameraRetriever.getCamerasFromMediaDevices(); - } - var mst = MediaStreamTrack; - if (MediaStreamTrack && mst.getSources) { - return CameraRetriever.getCamerasFromMediaStreamTrack(); - } - return CameraRetriever.rejectWithError(); - }; - CameraRetriever.rejectWithError = function () { - var errorMessage = strings_1.Html5QrcodeStrings.unableToQuerySupportedDevices(); - if (!CameraRetriever.isHttpsOrLocalhost()) { - errorMessage = strings_1.Html5QrcodeStrings.insecureContextCameraQueryError(); - } - return Promise.reject(errorMessage); - }; - CameraRetriever.isHttpsOrLocalhost = function () { - if (location.protocol === "https:") { - return true; - } - var host = location.host.split(":")[0]; - return host === "127.0.0.1" || host === "localhost"; - }; - CameraRetriever.getCamerasFromMediaDevices = function () { - return __awaiter(this, void 0, void 0, function () { - var closeActiveStreams, mediaStream, devices, results, _i, devices_1, device; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - closeActiveStreams = function (stream) { - var tracks = stream.getVideoTracks(); - for (var _i = 0, tracks_1 = tracks; _i < tracks_1.length; _i++) { - var track = tracks_1[_i]; - track.enabled = false; - track.stop(); - stream.removeTrack(track); - } - }; - return [4, navigator.mediaDevices.getUserMedia({ audio: false, video: true })]; - case 1: - mediaStream = _a.sent(); - return [4, navigator.mediaDevices.enumerateDevices()]; - case 2: - devices = _a.sent(); - results = []; - for (_i = 0, devices_1 = devices; _i < devices_1.length; _i++) { - device = devices_1[_i]; - if (device.kind === "videoinput") { - results.push({ - id: device.deviceId, - label: device.label - }); - } - } - closeActiveStreams(mediaStream); - return [2, results]; - } - }); - }); - }; - CameraRetriever.getCamerasFromMediaStreamTrack = function () { - return new Promise(function (resolve, _) { - var callback = function (sourceInfos) { - var results = []; - for (var _i = 0, sourceInfos_1 = sourceInfos; _i < sourceInfos_1.length; _i++) { - var sourceInfo = sourceInfos_1[_i]; - if (sourceInfo.kind === "video") { - results.push({ - id: sourceInfo.id, - label: sourceInfo.label - }); - } - } - resolve(results); - }; - var mst = MediaStreamTrack; - mst.getSources(callback); - }); - }; - return CameraRetriever; -}()); -exports.CameraRetriever = CameraRetriever; -//# sourceMappingURL=retriever.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/camera/retriever.js.map b/node_modules/html5-qrcode/cjs/camera/retriever.js.map deleted file mode 100644 index 15cd41b..0000000 --- a/node_modules/html5-qrcode/cjs/camera/retriever.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"retriever.js","sourceRoot":"","sources":["../../../src/camera/retriever.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/code-decoder.d.ts b/node_modules/html5-qrcode/cjs/code-decoder.d.ts deleted file mode 100644 index 13d5426..0000000 --- a/node_modules/html5-qrcode/cjs/code-decoder.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { QrcodeResult, Html5QrcodeSupportedFormats, Logger, RobustQrcodeDecoderAsync } from "./core"; -export declare class Html5QrcodeShim implements RobustQrcodeDecoderAsync { - private verbose; - private primaryDecoder; - private secondaryDecoder; - private readonly EXECUTIONS_TO_REPORT_PERFORMANCE; - private executions; - private executionResults; - private wasPrimaryDecoderUsedInLastDecode; - constructor(requestedFormats: Array, useBarCodeDetectorIfSupported: boolean, verbose: boolean, logger: Logger); - decodeAsync(canvas: HTMLCanvasElement): Promise; - decodeRobustlyAsync(canvas: HTMLCanvasElement): Promise; - private getDecoder; - private possiblyLogPerformance; - possiblyFlushPerformanceReport(): void; -} diff --git a/node_modules/html5-qrcode/cjs/code-decoder.js b/node_modules/html5-qrcode/cjs/code-decoder.js deleted file mode 100644 index 1815562..0000000 --- a/node_modules/html5-qrcode/cjs/code-decoder.js +++ /dev/null @@ -1,141 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (g && (g = 0, op[0] && (_ = 0)), _) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Html5QrcodeShim = void 0; -var zxing_html5_qrcode_decoder_1 = require("./zxing-html5-qrcode-decoder"); -var native_bar_code_detector_1 = require("./native-bar-code-detector"); -var Html5QrcodeShim = (function () { - function Html5QrcodeShim(requestedFormats, useBarCodeDetectorIfSupported, verbose, logger) { - this.EXECUTIONS_TO_REPORT_PERFORMANCE = 100; - this.executions = 0; - this.executionResults = []; - this.wasPrimaryDecoderUsedInLastDecode = false; - this.verbose = verbose; - if (useBarCodeDetectorIfSupported - && native_bar_code_detector_1.BarcodeDetectorDelegate.isSupported()) { - this.primaryDecoder = new native_bar_code_detector_1.BarcodeDetectorDelegate(requestedFormats, verbose, logger); - this.secondaryDecoder = new zxing_html5_qrcode_decoder_1.ZXingHtml5QrcodeDecoder(requestedFormats, verbose, logger); - } - else { - this.primaryDecoder = new zxing_html5_qrcode_decoder_1.ZXingHtml5QrcodeDecoder(requestedFormats, verbose, logger); - } - } - Html5QrcodeShim.prototype.decodeAsync = function (canvas) { - return __awaiter(this, void 0, void 0, function () { - var startTime; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - startTime = performance.now(); - _a.label = 1; - case 1: - _a.trys.push([1, , 3, 4]); - return [4, this.getDecoder().decodeAsync(canvas)]; - case 2: return [2, _a.sent()]; - case 3: - this.possiblyLogPerformance(startTime); - return [7]; - case 4: return [2]; - } - }); - }); - }; - Html5QrcodeShim.prototype.decodeRobustlyAsync = function (canvas) { - return __awaiter(this, void 0, void 0, function () { - var startTime, error_1; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - startTime = performance.now(); - _a.label = 1; - case 1: - _a.trys.push([1, 3, 4, 5]); - return [4, this.primaryDecoder.decodeAsync(canvas)]; - case 2: return [2, _a.sent()]; - case 3: - error_1 = _a.sent(); - if (this.secondaryDecoder) { - return [2, this.secondaryDecoder.decodeAsync(canvas)]; - } - throw error_1; - case 4: - this.possiblyLogPerformance(startTime); - return [7]; - case 5: return [2]; - } - }); - }); - }; - Html5QrcodeShim.prototype.getDecoder = function () { - if (!this.secondaryDecoder) { - return this.primaryDecoder; - } - if (this.wasPrimaryDecoderUsedInLastDecode === false) { - this.wasPrimaryDecoderUsedInLastDecode = true; - return this.primaryDecoder; - } - this.wasPrimaryDecoderUsedInLastDecode = false; - return this.secondaryDecoder; - }; - Html5QrcodeShim.prototype.possiblyLogPerformance = function (startTime) { - if (!this.verbose) { - return; - } - var executionTime = performance.now() - startTime; - this.executionResults.push(executionTime); - this.executions++; - this.possiblyFlushPerformanceReport(); - }; - Html5QrcodeShim.prototype.possiblyFlushPerformanceReport = function () { - if (this.executions < this.EXECUTIONS_TO_REPORT_PERFORMANCE) { - return; - } - var sum = 0; - for (var _i = 0, _a = this.executionResults; _i < _a.length; _i++) { - var executionTime = _a[_i]; - sum += executionTime; - } - var mean = sum / this.executionResults.length; - console.log("".concat(mean, " ms for ").concat(this.executionResults.length, " last runs.")); - this.executions = 0; - this.executionResults = []; - }; - return Html5QrcodeShim; -}()); -exports.Html5QrcodeShim = Html5QrcodeShim; -//# sourceMappingURL=code-decoder.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/code-decoder.js.map b/node_modules/html5-qrcode/cjs/code-decoder.js.map deleted file mode 100644 index 7c8f693..0000000 --- a/node_modules/html5-qrcode/cjs/code-decoder.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"code-decoder.js","sourceRoot":"","sources":["../../src/code-decoder.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/core.d.ts b/node_modules/html5-qrcode/cjs/core.d.ts deleted file mode 100644 index 0d0206d..0000000 --- a/node_modules/html5-qrcode/cjs/core.d.ts +++ /dev/null @@ -1,105 +0,0 @@ -export declare enum Html5QrcodeSupportedFormats { - QR_CODE = 0, - AZTEC = 1, - CODABAR = 2, - CODE_39 = 3, - CODE_93 = 4, - CODE_128 = 5, - DATA_MATRIX = 6, - MAXICODE = 7, - ITF = 8, - EAN_13 = 9, - EAN_8 = 10, - PDF_417 = 11, - RSS_14 = 12, - RSS_EXPANDED = 13, - UPC_A = 14, - UPC_E = 15, - UPC_EAN_EXTENSION = 16 -} -export declare enum DecodedTextType { - UNKNOWN = 0, - URL = 1 -} -export declare function isValidHtml5QrcodeSupportedFormats(format: any): boolean; -export declare enum Html5QrcodeScanType { - SCAN_TYPE_CAMERA = 0, - SCAN_TYPE_FILE = 1 -} -export declare class Html5QrcodeConstants { - static GITHUB_PROJECT_URL: string; - static SCAN_DEFAULT_FPS: number; - static DEFAULT_DISABLE_FLIP: boolean; - static DEFAULT_REMEMBER_LAST_CAMERA_USED: boolean; - static DEFAULT_SUPPORTED_SCAN_TYPE: Html5QrcodeScanType[]; -} -export interface QrDimensions { - width: number; - height: number; -} -export type QrDimensionFunction = (viewfinderWidth: number, viewfinderHeight: number) => QrDimensions; -export interface QrBounds extends QrDimensions { - x: number; - y: number; -} -export declare class QrcodeResultFormat { - readonly format: Html5QrcodeSupportedFormats; - readonly formatName: string; - private constructor(); - toString(): string; - static create(format: Html5QrcodeSupportedFormats): QrcodeResultFormat; -} -export interface QrcodeResultDebugData { - decoderName?: string; -} -export interface QrcodeResult { - text: string; - format?: QrcodeResultFormat; - bounds?: QrBounds; - decodedTextType?: DecodedTextType; - debugData?: QrcodeResultDebugData; -} -export interface Html5QrcodeResult { - decodedText: string; - result: QrcodeResult; -} -export declare class Html5QrcodeResultFactory { - static createFromText(decodedText: string): Html5QrcodeResult; - static createFromQrcodeResult(qrcodeResult: QrcodeResult): Html5QrcodeResult; -} -export declare enum Html5QrcodeErrorTypes { - UNKWOWN_ERROR = 0, - IMPLEMENTATION_ERROR = 1, - NO_CODE_FOUND_ERROR = 2 -} -export interface Html5QrcodeError { - errorMessage: string; - type: Html5QrcodeErrorTypes; -} -export declare class Html5QrcodeErrorFactory { - static createFrom(error: any): Html5QrcodeError; -} -export type QrcodeSuccessCallback = (decodedText: string, result: Html5QrcodeResult) => void; -export type QrcodeErrorCallback = (errorMessage: string, error: Html5QrcodeError) => void; -export interface QrcodeDecoderAsync { - decodeAsync(canvas: HTMLCanvasElement): Promise; -} -export interface RobustQrcodeDecoderAsync extends QrcodeDecoderAsync { - decodeRobustlyAsync(canvas: HTMLCanvasElement): Promise; -} -export interface Logger { - log(message: string): void; - warn(message: string): void; - logError(message: string, isExperimental?: boolean): void; - logErrors(errors: Array): void; -} -export declare class BaseLoggger implements Logger { - private verbose; - constructor(verbose: boolean); - log(message: string): void; - warn(message: string): void; - logError(message: string, isExperimental?: boolean): void; - logErrors(errors: Array): void; -} -export declare function isNullOrUndefined(obj?: any): boolean; -export declare function clip(value: number, minValue: number, maxValue: number): number; diff --git a/node_modules/html5-qrcode/cjs/core.js b/node_modules/html5-qrcode/cjs/core.js deleted file mode 100644 index cbac339..0000000 --- a/node_modules/html5-qrcode/cjs/core.js +++ /dev/null @@ -1,171 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.clip = exports.isNullOrUndefined = exports.BaseLoggger = exports.Html5QrcodeErrorFactory = exports.Html5QrcodeErrorTypes = exports.Html5QrcodeResultFactory = exports.QrcodeResultFormat = exports.Html5QrcodeConstants = exports.Html5QrcodeScanType = exports.isValidHtml5QrcodeSupportedFormats = exports.DecodedTextType = exports.Html5QrcodeSupportedFormats = void 0; -var Html5QrcodeSupportedFormats; -(function (Html5QrcodeSupportedFormats) { - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["QR_CODE"] = 0] = "QR_CODE"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["AZTEC"] = 1] = "AZTEC"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["CODABAR"] = 2] = "CODABAR"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["CODE_39"] = 3] = "CODE_39"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["CODE_93"] = 4] = "CODE_93"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["CODE_128"] = 5] = "CODE_128"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["DATA_MATRIX"] = 6] = "DATA_MATRIX"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["MAXICODE"] = 7] = "MAXICODE"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["ITF"] = 8] = "ITF"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["EAN_13"] = 9] = "EAN_13"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["EAN_8"] = 10] = "EAN_8"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["PDF_417"] = 11] = "PDF_417"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["RSS_14"] = 12] = "RSS_14"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["RSS_EXPANDED"] = 13] = "RSS_EXPANDED"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["UPC_A"] = 14] = "UPC_A"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["UPC_E"] = 15] = "UPC_E"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["UPC_EAN_EXTENSION"] = 16] = "UPC_EAN_EXTENSION"; -})(Html5QrcodeSupportedFormats = exports.Html5QrcodeSupportedFormats || (exports.Html5QrcodeSupportedFormats = {})); -var html5QrcodeSupportedFormatsTextMap = new Map([ - [Html5QrcodeSupportedFormats.QR_CODE, "QR_CODE"], - [Html5QrcodeSupportedFormats.AZTEC, "AZTEC"], - [Html5QrcodeSupportedFormats.CODABAR, "CODABAR"], - [Html5QrcodeSupportedFormats.CODE_39, "CODE_39"], - [Html5QrcodeSupportedFormats.CODE_93, "CODE_93"], - [Html5QrcodeSupportedFormats.CODE_128, "CODE_128"], - [Html5QrcodeSupportedFormats.DATA_MATRIX, "DATA_MATRIX"], - [Html5QrcodeSupportedFormats.MAXICODE, "MAXICODE"], - [Html5QrcodeSupportedFormats.ITF, "ITF"], - [Html5QrcodeSupportedFormats.EAN_13, "EAN_13"], - [Html5QrcodeSupportedFormats.EAN_8, "EAN_8"], - [Html5QrcodeSupportedFormats.PDF_417, "PDF_417"], - [Html5QrcodeSupportedFormats.RSS_14, "RSS_14"], - [Html5QrcodeSupportedFormats.RSS_EXPANDED, "RSS_EXPANDED"], - [Html5QrcodeSupportedFormats.UPC_A, "UPC_A"], - [Html5QrcodeSupportedFormats.UPC_E, "UPC_E"], - [Html5QrcodeSupportedFormats.UPC_EAN_EXTENSION, "UPC_EAN_EXTENSION"] -]); -var DecodedTextType; -(function (DecodedTextType) { - DecodedTextType[DecodedTextType["UNKNOWN"] = 0] = "UNKNOWN"; - DecodedTextType[DecodedTextType["URL"] = 1] = "URL"; -})(DecodedTextType = exports.DecodedTextType || (exports.DecodedTextType = {})); -function isValidHtml5QrcodeSupportedFormats(format) { - return Object.values(Html5QrcodeSupportedFormats).includes(format); -} -exports.isValidHtml5QrcodeSupportedFormats = isValidHtml5QrcodeSupportedFormats; -var Html5QrcodeScanType; -(function (Html5QrcodeScanType) { - Html5QrcodeScanType[Html5QrcodeScanType["SCAN_TYPE_CAMERA"] = 0] = "SCAN_TYPE_CAMERA"; - Html5QrcodeScanType[Html5QrcodeScanType["SCAN_TYPE_FILE"] = 1] = "SCAN_TYPE_FILE"; -})(Html5QrcodeScanType = exports.Html5QrcodeScanType || (exports.Html5QrcodeScanType = {})); -var Html5QrcodeConstants = (function () { - function Html5QrcodeConstants() { - } - Html5QrcodeConstants.GITHUB_PROJECT_URL = "https://github.com/mebjas/html5-qrcode"; - Html5QrcodeConstants.SCAN_DEFAULT_FPS = 2; - Html5QrcodeConstants.DEFAULT_DISABLE_FLIP = false; - Html5QrcodeConstants.DEFAULT_REMEMBER_LAST_CAMERA_USED = true; - Html5QrcodeConstants.DEFAULT_SUPPORTED_SCAN_TYPE = [ - Html5QrcodeScanType.SCAN_TYPE_CAMERA, - Html5QrcodeScanType.SCAN_TYPE_FILE - ]; - return Html5QrcodeConstants; -}()); -exports.Html5QrcodeConstants = Html5QrcodeConstants; -var QrcodeResultFormat = (function () { - function QrcodeResultFormat(format, formatName) { - this.format = format; - this.formatName = formatName; - } - QrcodeResultFormat.prototype.toString = function () { - return this.formatName; - }; - QrcodeResultFormat.create = function (format) { - if (!html5QrcodeSupportedFormatsTextMap.has(format)) { - throw "".concat(format, " not in html5QrcodeSupportedFormatsTextMap"); - } - return new QrcodeResultFormat(format, html5QrcodeSupportedFormatsTextMap.get(format)); - }; - return QrcodeResultFormat; -}()); -exports.QrcodeResultFormat = QrcodeResultFormat; -var Html5QrcodeResultFactory = (function () { - function Html5QrcodeResultFactory() { - } - Html5QrcodeResultFactory.createFromText = function (decodedText) { - var qrcodeResult = { - text: decodedText - }; - return { - decodedText: decodedText, - result: qrcodeResult - }; - }; - Html5QrcodeResultFactory.createFromQrcodeResult = function (qrcodeResult) { - return { - decodedText: qrcodeResult.text, - result: qrcodeResult - }; - }; - return Html5QrcodeResultFactory; -}()); -exports.Html5QrcodeResultFactory = Html5QrcodeResultFactory; -var Html5QrcodeErrorTypes; -(function (Html5QrcodeErrorTypes) { - Html5QrcodeErrorTypes[Html5QrcodeErrorTypes["UNKWOWN_ERROR"] = 0] = "UNKWOWN_ERROR"; - Html5QrcodeErrorTypes[Html5QrcodeErrorTypes["IMPLEMENTATION_ERROR"] = 1] = "IMPLEMENTATION_ERROR"; - Html5QrcodeErrorTypes[Html5QrcodeErrorTypes["NO_CODE_FOUND_ERROR"] = 2] = "NO_CODE_FOUND_ERROR"; -})(Html5QrcodeErrorTypes = exports.Html5QrcodeErrorTypes || (exports.Html5QrcodeErrorTypes = {})); -var Html5QrcodeErrorFactory = (function () { - function Html5QrcodeErrorFactory() { - } - Html5QrcodeErrorFactory.createFrom = function (error) { - return { - errorMessage: error, - type: Html5QrcodeErrorTypes.UNKWOWN_ERROR - }; - }; - return Html5QrcodeErrorFactory; -}()); -exports.Html5QrcodeErrorFactory = Html5QrcodeErrorFactory; -var BaseLoggger = (function () { - function BaseLoggger(verbose) { - this.verbose = verbose; - } - BaseLoggger.prototype.log = function (message) { - if (this.verbose) { - console.log(message); - } - }; - BaseLoggger.prototype.warn = function (message) { - if (this.verbose) { - console.warn(message); - } - }; - BaseLoggger.prototype.logError = function (message, isExperimental) { - if (this.verbose || isExperimental === true) { - console.error(message); - } - }; - BaseLoggger.prototype.logErrors = function (errors) { - if (errors.length === 0) { - throw "Logger#logError called without arguments"; - } - if (this.verbose) { - console.error(errors); - } - }; - return BaseLoggger; -}()); -exports.BaseLoggger = BaseLoggger; -function isNullOrUndefined(obj) { - return (typeof obj === "undefined") || obj === null; -} -exports.isNullOrUndefined = isNullOrUndefined; -function clip(value, minValue, maxValue) { - if (value > maxValue) { - return maxValue; - } - if (value < minValue) { - return minValue; - } - return value; -} -exports.clip = clip; -//# sourceMappingURL=core.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/core.js.map b/node_modules/html5-qrcode/cjs/core.js.map deleted file mode 100644 index a724609..0000000 --- a/node_modules/html5-qrcode/cjs/core.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/core.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/experimental-features.d.ts b/node_modules/html5-qrcode/cjs/experimental-features.d.ts deleted file mode 100644 index 0413abe..0000000 --- a/node_modules/html5-qrcode/cjs/experimental-features.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface ExperimentalFeaturesConfig { - useBarCodeDetectorIfSupported?: boolean | undefined; -} diff --git a/node_modules/html5-qrcode/cjs/experimental-features.js b/node_modules/html5-qrcode/cjs/experimental-features.js deleted file mode 100644 index ecfcd7e..0000000 --- a/node_modules/html5-qrcode/cjs/experimental-features.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=experimental-features.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/experimental-features.js.map b/node_modules/html5-qrcode/cjs/experimental-features.js.map deleted file mode 100644 index 8b8b9dd..0000000 --- a/node_modules/html5-qrcode/cjs/experimental-features.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"experimental-features.js","sourceRoot":"","sources":["../../src/experimental-features.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/html5-qrcode-scanner.d.ts b/node_modules/html5-qrcode/cjs/html5-qrcode-scanner.d.ts deleted file mode 100644 index 417175b..0000000 --- a/node_modules/html5-qrcode/cjs/html5-qrcode-scanner.d.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { Html5QrcodeScanType, QrcodeSuccessCallback, QrcodeErrorCallback } from "./core"; -import { Html5QrcodeConfigs, Html5QrcodeCameraScanConfig } from "./html5-qrcode"; -import { Html5QrcodeScannerState } from "./state-manager"; -export interface Html5QrcodeScannerConfig extends Html5QrcodeCameraScanConfig, Html5QrcodeConfigs { - rememberLastUsedCamera?: boolean | undefined; - supportedScanTypes?: Array | []; - showTorchButtonIfSupported?: boolean | undefined; - showZoomSliderIfSupported?: boolean | undefined; - defaultZoomValueIfSupported?: number | undefined; -} -export declare class Html5QrcodeScanner { - private elementId; - private config; - private verbose; - private currentScanType; - private sectionSwapAllowed; - private persistedDataManager; - private scanTypeSelector; - private logger; - private html5Qrcode; - private qrCodeSuccessCallback; - private qrCodeErrorCallback; - private lastMatchFound; - private cameraScanImage; - private fileScanImage; - private fileSelectionUi; - constructor(elementId: string, config: Html5QrcodeScannerConfig | undefined, verbose: boolean | undefined); - render(qrCodeSuccessCallback: QrcodeSuccessCallback, qrCodeErrorCallback: QrcodeErrorCallback | undefined): void; - pause(shouldPauseVideo?: boolean): void; - resume(): void; - getState(): Html5QrcodeScannerState; - clear(): Promise; - getRunningTrackCapabilities(): MediaTrackCapabilities; - getRunningTrackSettings(): MediaTrackSettings; - applyVideoConstraints(videoConstaints: MediaTrackConstraints): Promise; - private getHtml5QrcodeOrFail; - private createConfig; - private createBasicLayout; - private resetBasicLayout; - private setupInitialDashboard; - private createHeader; - private createSection; - private createCameraListUi; - private createPermissionButton; - private createPermissionsUi; - private createSectionControlPanel; - private renderFileScanUi; - private renderCameraSelection; - private createSectionSwap; - private startCameraScanIfPermissionExistsOnSwap; - private resetHeaderMessage; - private setHeaderMessage; - private showHideScanTypeSwapLink; - private insertCameraScanImageToScanRegion; - private insertFileScanImageToScanRegion; - private clearScanRegion; - private getDashboardSectionId; - private getDashboardSectionCameraScanRegionId; - private getDashboardSectionSwapLinkId; - private getScanRegionId; - private getDashboardId; - private getHeaderMessageContainerId; - private getCameraPermissionButtonId; - private getCameraScanRegion; - private getDashboardSectionSwapLink; - private getHeaderMessageDiv; -} diff --git a/node_modules/html5-qrcode/cjs/html5-qrcode-scanner.js b/node_modules/html5-qrcode/cjs/html5-qrcode-scanner.js deleted file mode 100644 index 200425c..0000000 --- a/node_modules/html5-qrcode/cjs/html5-qrcode-scanner.js +++ /dev/null @@ -1,661 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Html5QrcodeScanner = void 0; -var core_1 = require("./core"); -var html5_qrcode_1 = require("./html5-qrcode"); -var strings_1 = require("./strings"); -var image_assets_1 = require("./image-assets"); -var storage_1 = require("./storage"); -var ui_1 = require("./ui"); -var permissions_1 = require("./camera/permissions"); -var scan_type_selector_1 = require("./ui/scanner/scan-type-selector"); -var torch_button_1 = require("./ui/scanner/torch-button"); -var file_selection_ui_1 = require("./ui/scanner/file-selection-ui"); -var base_1 = require("./ui/scanner/base"); -var camera_selection_ui_1 = require("./ui/scanner/camera-selection-ui"); -var camera_zoom_ui_1 = require("./ui/scanner/camera-zoom-ui"); -var Html5QrcodeScannerStatus; -(function (Html5QrcodeScannerStatus) { - Html5QrcodeScannerStatus[Html5QrcodeScannerStatus["STATUS_DEFAULT"] = 0] = "STATUS_DEFAULT"; - Html5QrcodeScannerStatus[Html5QrcodeScannerStatus["STATUS_SUCCESS"] = 1] = "STATUS_SUCCESS"; - Html5QrcodeScannerStatus[Html5QrcodeScannerStatus["STATUS_WARNING"] = 2] = "STATUS_WARNING"; - Html5QrcodeScannerStatus[Html5QrcodeScannerStatus["STATUS_REQUESTING_PERMISSION"] = 3] = "STATUS_REQUESTING_PERMISSION"; -})(Html5QrcodeScannerStatus || (Html5QrcodeScannerStatus = {})); -function toHtml5QrcodeCameraScanConfig(config) { - return { - fps: config.fps, - qrbox: config.qrbox, - aspectRatio: config.aspectRatio, - disableFlip: config.disableFlip, - videoConstraints: config.videoConstraints - }; -} -function toHtml5QrcodeFullConfig(config, verbose) { - return { - formatsToSupport: config.formatsToSupport, - useBarCodeDetectorIfSupported: config.useBarCodeDetectorIfSupported, - experimentalFeatures: config.experimentalFeatures, - verbose: verbose - }; -} -var Html5QrcodeScanner = (function () { - function Html5QrcodeScanner(elementId, config, verbose) { - this.lastMatchFound = null; - this.cameraScanImage = null; - this.fileScanImage = null; - this.fileSelectionUi = null; - this.elementId = elementId; - this.config = this.createConfig(config); - this.verbose = verbose === true; - if (!document.getElementById(elementId)) { - throw "HTML Element with id=".concat(elementId, " not found"); - } - this.scanTypeSelector = new scan_type_selector_1.ScanTypeSelector(this.config.supportedScanTypes); - this.currentScanType = this.scanTypeSelector.getDefaultScanType(); - this.sectionSwapAllowed = true; - this.logger = new core_1.BaseLoggger(this.verbose); - this.persistedDataManager = new storage_1.PersistedDataManager(); - if (config.rememberLastUsedCamera !== true) { - this.persistedDataManager.reset(); - } - } - Html5QrcodeScanner.prototype.render = function (qrCodeSuccessCallback, qrCodeErrorCallback) { - var _this = this; - this.lastMatchFound = null; - this.qrCodeSuccessCallback - = function (decodedText, result) { - if (qrCodeSuccessCallback) { - qrCodeSuccessCallback(decodedText, result); - } - else { - if (_this.lastMatchFound === decodedText) { - return; - } - _this.lastMatchFound = decodedText; - _this.setHeaderMessage(strings_1.Html5QrcodeScannerStrings.lastMatch(decodedText), Html5QrcodeScannerStatus.STATUS_SUCCESS); - } - }; - this.qrCodeErrorCallback = - function (errorMessage, error) { - if (qrCodeErrorCallback) { - qrCodeErrorCallback(errorMessage, error); - } - }; - var container = document.getElementById(this.elementId); - if (!container) { - throw "HTML Element with id=".concat(this.elementId, " not found"); - } - container.innerHTML = ""; - this.createBasicLayout(container); - this.html5Qrcode = new html5_qrcode_1.Html5Qrcode(this.getScanRegionId(), toHtml5QrcodeFullConfig(this.config, this.verbose)); - }; - Html5QrcodeScanner.prototype.pause = function (shouldPauseVideo) { - if ((0, core_1.isNullOrUndefined)(shouldPauseVideo) || shouldPauseVideo !== true) { - shouldPauseVideo = false; - } - this.getHtml5QrcodeOrFail().pause(shouldPauseVideo); - }; - Html5QrcodeScanner.prototype.resume = function () { - this.getHtml5QrcodeOrFail().resume(); - }; - Html5QrcodeScanner.prototype.getState = function () { - return this.getHtml5QrcodeOrFail().getState(); - }; - Html5QrcodeScanner.prototype.clear = function () { - var _this = this; - var emptyHtmlContainer = function () { - var mainContainer = document.getElementById(_this.elementId); - if (mainContainer) { - mainContainer.innerHTML = ""; - _this.resetBasicLayout(mainContainer); - } - }; - if (this.html5Qrcode) { - return new Promise(function (resolve, reject) { - if (!_this.html5Qrcode) { - resolve(); - return; - } - if (_this.html5Qrcode.isScanning) { - _this.html5Qrcode.stop().then(function (_) { - if (!_this.html5Qrcode) { - resolve(); - return; - } - _this.html5Qrcode.clear(); - emptyHtmlContainer(); - resolve(); - }).catch(function (error) { - if (_this.verbose) { - _this.logger.logError("Unable to stop qrcode scanner", error); - } - reject(error); - }); - } - else { - _this.html5Qrcode.clear(); - emptyHtmlContainer(); - resolve(); - } - }); - } - return Promise.resolve(); - }; - Html5QrcodeScanner.prototype.getRunningTrackCapabilities = function () { - return this.getHtml5QrcodeOrFail().getRunningTrackCapabilities(); - }; - Html5QrcodeScanner.prototype.getRunningTrackSettings = function () { - return this.getHtml5QrcodeOrFail().getRunningTrackSettings(); - }; - Html5QrcodeScanner.prototype.applyVideoConstraints = function (videoConstaints) { - return this.getHtml5QrcodeOrFail().applyVideoConstraints(videoConstaints); - }; - Html5QrcodeScanner.prototype.getHtml5QrcodeOrFail = function () { - if (!this.html5Qrcode) { - throw "Code scanner not initialized."; - } - return this.html5Qrcode; - }; - Html5QrcodeScanner.prototype.createConfig = function (config) { - if (config) { - if (!config.fps) { - config.fps = core_1.Html5QrcodeConstants.SCAN_DEFAULT_FPS; - } - if (config.rememberLastUsedCamera !== (!core_1.Html5QrcodeConstants.DEFAULT_REMEMBER_LAST_CAMERA_USED)) { - config.rememberLastUsedCamera - = core_1.Html5QrcodeConstants.DEFAULT_REMEMBER_LAST_CAMERA_USED; - } - if (!config.supportedScanTypes) { - config.supportedScanTypes - = core_1.Html5QrcodeConstants.DEFAULT_SUPPORTED_SCAN_TYPE; - } - return config; - } - return { - fps: core_1.Html5QrcodeConstants.SCAN_DEFAULT_FPS, - rememberLastUsedCamera: core_1.Html5QrcodeConstants.DEFAULT_REMEMBER_LAST_CAMERA_USED, - supportedScanTypes: core_1.Html5QrcodeConstants.DEFAULT_SUPPORTED_SCAN_TYPE - }; - }; - Html5QrcodeScanner.prototype.createBasicLayout = function (parent) { - parent.style.position = "relative"; - parent.style.padding = "0px"; - parent.style.border = "1px solid silver"; - this.createHeader(parent); - var qrCodeScanRegion = document.createElement("div"); - var scanRegionId = this.getScanRegionId(); - qrCodeScanRegion.id = scanRegionId; - qrCodeScanRegion.style.width = "100%"; - qrCodeScanRegion.style.minHeight = "100px"; - qrCodeScanRegion.style.textAlign = "center"; - parent.appendChild(qrCodeScanRegion); - if (scan_type_selector_1.ScanTypeSelector.isCameraScanType(this.currentScanType)) { - this.insertCameraScanImageToScanRegion(); - } - else { - this.insertFileScanImageToScanRegion(); - } - var qrCodeDashboard = document.createElement("div"); - var dashboardId = this.getDashboardId(); - qrCodeDashboard.id = dashboardId; - qrCodeDashboard.style.width = "100%"; - parent.appendChild(qrCodeDashboard); - this.setupInitialDashboard(qrCodeDashboard); - }; - Html5QrcodeScanner.prototype.resetBasicLayout = function (mainContainer) { - mainContainer.style.border = "none"; - }; - Html5QrcodeScanner.prototype.setupInitialDashboard = function (dashboard) { - this.createSection(dashboard); - this.createSectionControlPanel(); - if (this.scanTypeSelector.hasMoreThanOneScanType()) { - this.createSectionSwap(); - } - }; - Html5QrcodeScanner.prototype.createHeader = function (dashboard) { - var header = document.createElement("div"); - header.style.textAlign = "left"; - header.style.margin = "0px"; - dashboard.appendChild(header); - var libraryInfo = new ui_1.LibraryInfoContainer(); - libraryInfo.renderInto(header); - var headerMessageContainer = document.createElement("div"); - headerMessageContainer.id = this.getHeaderMessageContainerId(); - headerMessageContainer.style.display = "none"; - headerMessageContainer.style.textAlign = "center"; - headerMessageContainer.style.fontSize = "14px"; - headerMessageContainer.style.padding = "2px 10px"; - headerMessageContainer.style.margin = "4px"; - headerMessageContainer.style.borderTop = "1px solid #f6f6f6"; - header.appendChild(headerMessageContainer); - }; - Html5QrcodeScanner.prototype.createSection = function (dashboard) { - var section = document.createElement("div"); - section.id = this.getDashboardSectionId(); - section.style.width = "100%"; - section.style.padding = "10px 0px 10px 0px"; - section.style.textAlign = "left"; - dashboard.appendChild(section); - }; - Html5QrcodeScanner.prototype.createCameraListUi = function (scpCameraScanRegion, requestPermissionContainer, requestPermissionButton) { - var $this = this; - $this.showHideScanTypeSwapLink(false); - $this.setHeaderMessage(strings_1.Html5QrcodeScannerStrings.cameraPermissionRequesting()); - var createPermissionButtonIfNotExists = function () { - if (!requestPermissionButton) { - $this.createPermissionButton(scpCameraScanRegion, requestPermissionContainer); - } - }; - html5_qrcode_1.Html5Qrcode.getCameras().then(function (cameras) { - $this.persistedDataManager.setHasPermission(true); - $this.showHideScanTypeSwapLink(true); - $this.resetHeaderMessage(); - if (cameras && cameras.length > 0) { - scpCameraScanRegion.removeChild(requestPermissionContainer); - $this.renderCameraSelection(cameras); - } - else { - $this.setHeaderMessage(strings_1.Html5QrcodeScannerStrings.noCameraFound(), Html5QrcodeScannerStatus.STATUS_WARNING); - createPermissionButtonIfNotExists(); - } - }).catch(function (error) { - $this.persistedDataManager.setHasPermission(false); - if (requestPermissionButton) { - requestPermissionButton.disabled = false; - } - else { - createPermissionButtonIfNotExists(); - } - $this.setHeaderMessage(error, Html5QrcodeScannerStatus.STATUS_WARNING); - $this.showHideScanTypeSwapLink(true); - }); - }; - Html5QrcodeScanner.prototype.createPermissionButton = function (scpCameraScanRegion, requestPermissionContainer) { - var $this = this; - var requestPermissionButton = base_1.BaseUiElementFactory - .createElement("button", this.getCameraPermissionButtonId()); - requestPermissionButton.innerText - = strings_1.Html5QrcodeScannerStrings.cameraPermissionTitle(); - requestPermissionButton.addEventListener("click", function () { - requestPermissionButton.disabled = true; - $this.createCameraListUi(scpCameraScanRegion, requestPermissionContainer, requestPermissionButton); - }); - requestPermissionContainer.appendChild(requestPermissionButton); - }; - Html5QrcodeScanner.prototype.createPermissionsUi = function (scpCameraScanRegion, requestPermissionContainer) { - var $this = this; - if (scan_type_selector_1.ScanTypeSelector.isCameraScanType(this.currentScanType) - && this.persistedDataManager.hasCameraPermissions()) { - permissions_1.CameraPermissions.hasPermissions().then(function (hasPermissions) { - if (hasPermissions) { - $this.createCameraListUi(scpCameraScanRegion, requestPermissionContainer); - } - else { - $this.persistedDataManager.setHasPermission(false); - $this.createPermissionButton(scpCameraScanRegion, requestPermissionContainer); - } - }).catch(function (_) { - $this.persistedDataManager.setHasPermission(false); - $this.createPermissionButton(scpCameraScanRegion, requestPermissionContainer); - }); - return; - } - this.createPermissionButton(scpCameraScanRegion, requestPermissionContainer); - }; - Html5QrcodeScanner.prototype.createSectionControlPanel = function () { - var section = document.getElementById(this.getDashboardSectionId()); - var sectionControlPanel = document.createElement("div"); - section.appendChild(sectionControlPanel); - var scpCameraScanRegion = document.createElement("div"); - scpCameraScanRegion.id = this.getDashboardSectionCameraScanRegionId(); - scpCameraScanRegion.style.display - = scan_type_selector_1.ScanTypeSelector.isCameraScanType(this.currentScanType) - ? "block" : "none"; - sectionControlPanel.appendChild(scpCameraScanRegion); - var requestPermissionContainer = document.createElement("div"); - requestPermissionContainer.style.textAlign = "center"; - scpCameraScanRegion.appendChild(requestPermissionContainer); - if (this.scanTypeSelector.isCameraScanRequired()) { - this.createPermissionsUi(scpCameraScanRegion, requestPermissionContainer); - } - this.renderFileScanUi(sectionControlPanel); - }; - Html5QrcodeScanner.prototype.renderFileScanUi = function (parent) { - var showOnRender = scan_type_selector_1.ScanTypeSelector.isFileScanType(this.currentScanType); - var $this = this; - var onFileSelected = function (file) { - if (!$this.html5Qrcode) { - throw "html5Qrcode not defined"; - } - if (!scan_type_selector_1.ScanTypeSelector.isFileScanType($this.currentScanType)) { - return; - } - $this.setHeaderMessage(strings_1.Html5QrcodeScannerStrings.loadingImage()); - $this.html5Qrcode.scanFileV2(file, true) - .then(function (html5qrcodeResult) { - $this.resetHeaderMessage(); - $this.qrCodeSuccessCallback(html5qrcodeResult.decodedText, html5qrcodeResult); - }) - .catch(function (error) { - $this.setHeaderMessage(error, Html5QrcodeScannerStatus.STATUS_WARNING); - $this.qrCodeErrorCallback(error, core_1.Html5QrcodeErrorFactory.createFrom(error)); - }); - }; - this.fileSelectionUi = file_selection_ui_1.FileSelectionUi.create(parent, showOnRender, onFileSelected); - }; - Html5QrcodeScanner.prototype.renderCameraSelection = function (cameras) { - var _this = this; - var $this = this; - var scpCameraScanRegion = document.getElementById(this.getDashboardSectionCameraScanRegionId()); - scpCameraScanRegion.style.textAlign = "center"; - var cameraZoomUi = camera_zoom_ui_1.CameraZoomUi.create(scpCameraScanRegion, false); - var renderCameraZoomUiIfSupported = function (cameraCapabilities) { - var zoomCapability = cameraCapabilities.zoomFeature(); - if (!zoomCapability.isSupported()) { - return; - } - cameraZoomUi.setOnCameraZoomValueChangeCallback(function (zoomValue) { - zoomCapability.apply(zoomValue); - }); - var defaultZoom = 1; - if (_this.config.defaultZoomValueIfSupported) { - defaultZoom = _this.config.defaultZoomValueIfSupported; - } - defaultZoom = (0, core_1.clip)(defaultZoom, zoomCapability.min(), zoomCapability.max()); - cameraZoomUi.setValues(zoomCapability.min(), zoomCapability.max(), defaultZoom, zoomCapability.step()); - cameraZoomUi.show(); - }; - var cameraSelectUi = camera_selection_ui_1.CameraSelectionUi.create(scpCameraScanRegion, cameras); - var cameraActionContainer = document.createElement("span"); - var cameraActionStartButton = base_1.BaseUiElementFactory.createElement("button", base_1.PublicUiElementIdAndClasses.CAMERA_START_BUTTON_ID); - cameraActionStartButton.innerText - = strings_1.Html5QrcodeScannerStrings.scanButtonStartScanningText(); - cameraActionContainer.appendChild(cameraActionStartButton); - var cameraActionStopButton = base_1.BaseUiElementFactory.createElement("button", base_1.PublicUiElementIdAndClasses.CAMERA_STOP_BUTTON_ID); - cameraActionStopButton.innerText - = strings_1.Html5QrcodeScannerStrings.scanButtonStopScanningText(); - cameraActionStopButton.style.display = "none"; - cameraActionStopButton.disabled = true; - cameraActionContainer.appendChild(cameraActionStopButton); - var torchButton; - var createAndShowTorchButtonIfSupported = function (cameraCapabilities) { - if (!cameraCapabilities.torchFeature().isSupported()) { - if (torchButton) { - torchButton.hide(); - } - return; - } - if (!torchButton) { - torchButton = torch_button_1.TorchButton.create(cameraActionContainer, cameraCapabilities.torchFeature(), { display: "none", marginLeft: "5px" }, function (errorMessage) { - $this.setHeaderMessage(errorMessage, Html5QrcodeScannerStatus.STATUS_WARNING); - }); - } - else { - torchButton.updateTorchCapability(cameraCapabilities.torchFeature()); - } - torchButton.show(); - }; - scpCameraScanRegion.appendChild(cameraActionContainer); - var resetCameraActionStartButton = function (shouldShow) { - if (!shouldShow) { - cameraActionStartButton.style.display = "none"; - } - cameraActionStartButton.innerText - = strings_1.Html5QrcodeScannerStrings - .scanButtonStartScanningText(); - cameraActionStartButton.style.opacity = "1"; - cameraActionStartButton.disabled = false; - if (shouldShow) { - cameraActionStartButton.style.display = "inline-block"; - } - }; - cameraActionStartButton.addEventListener("click", function (_) { - cameraActionStartButton.innerText - = strings_1.Html5QrcodeScannerStrings.scanButtonScanningStarting(); - cameraSelectUi.disable(); - cameraActionStartButton.disabled = true; - cameraActionStartButton.style.opacity = "0.5"; - if (_this.scanTypeSelector.hasMoreThanOneScanType()) { - $this.showHideScanTypeSwapLink(false); - } - $this.resetHeaderMessage(); - var cameraId = cameraSelectUi.getValue(); - $this.persistedDataManager.setLastUsedCameraId(cameraId); - $this.html5Qrcode.start(cameraId, toHtml5QrcodeCameraScanConfig($this.config), $this.qrCodeSuccessCallback, $this.qrCodeErrorCallback) - .then(function (_) { - cameraActionStopButton.disabled = false; - cameraActionStopButton.style.display = "inline-block"; - resetCameraActionStartButton(false); - var cameraCapabilities = $this.html5Qrcode.getRunningTrackCameraCapabilities(); - if (_this.config.showTorchButtonIfSupported === true) { - createAndShowTorchButtonIfSupported(cameraCapabilities); - } - if (_this.config.showZoomSliderIfSupported === true) { - renderCameraZoomUiIfSupported(cameraCapabilities); - } - }) - .catch(function (error) { - $this.showHideScanTypeSwapLink(true); - cameraSelectUi.enable(); - resetCameraActionStartButton(true); - $this.setHeaderMessage(error, Html5QrcodeScannerStatus.STATUS_WARNING); - }); - }); - if (cameraSelectUi.hasSingleItem()) { - cameraActionStartButton.click(); - } - cameraActionStopButton.addEventListener("click", function (_) { - if (!$this.html5Qrcode) { - throw "html5Qrcode not defined"; - } - cameraActionStopButton.disabled = true; - $this.html5Qrcode.stop() - .then(function (_) { - if (_this.scanTypeSelector.hasMoreThanOneScanType()) { - $this.showHideScanTypeSwapLink(true); - } - cameraSelectUi.enable(); - cameraActionStartButton.disabled = false; - cameraActionStopButton.style.display = "none"; - cameraActionStartButton.style.display = "inline-block"; - if (torchButton) { - torchButton.reset(); - torchButton.hide(); - } - cameraZoomUi.removeOnCameraZoomValueChangeCallback(); - cameraZoomUi.hide(); - $this.insertCameraScanImageToScanRegion(); - }).catch(function (error) { - cameraActionStopButton.disabled = false; - $this.setHeaderMessage(error, Html5QrcodeScannerStatus.STATUS_WARNING); - }); - }); - if ($this.persistedDataManager.getLastUsedCameraId()) { - var cameraId = $this.persistedDataManager.getLastUsedCameraId(); - if (cameraSelectUi.hasValue(cameraId)) { - cameraSelectUi.setValue(cameraId); - cameraActionStartButton.click(); - } - else { - $this.persistedDataManager.resetLastUsedCameraId(); - } - } - }; - Html5QrcodeScanner.prototype.createSectionSwap = function () { - var $this = this; - var TEXT_IF_CAMERA_SCAN_SELECTED = strings_1.Html5QrcodeScannerStrings.textIfCameraScanSelected(); - var TEXT_IF_FILE_SCAN_SELECTED = strings_1.Html5QrcodeScannerStrings.textIfFileScanSelected(); - var section = document.getElementById(this.getDashboardSectionId()); - var switchContainer = document.createElement("div"); - switchContainer.style.textAlign = "center"; - var switchScanTypeLink = base_1.BaseUiElementFactory.createElement("span", this.getDashboardSectionSwapLinkId()); - switchScanTypeLink.style.textDecoration = "underline"; - switchScanTypeLink.style.cursor = "pointer"; - switchScanTypeLink.innerText - = scan_type_selector_1.ScanTypeSelector.isCameraScanType(this.currentScanType) - ? TEXT_IF_CAMERA_SCAN_SELECTED : TEXT_IF_FILE_SCAN_SELECTED; - switchScanTypeLink.addEventListener("click", function () { - if (!$this.sectionSwapAllowed) { - if ($this.verbose) { - $this.logger.logError("Section swap called when not allowed"); - } - return; - } - $this.resetHeaderMessage(); - $this.fileSelectionUi.resetValue(); - $this.sectionSwapAllowed = false; - if (scan_type_selector_1.ScanTypeSelector.isCameraScanType($this.currentScanType)) { - $this.clearScanRegion(); - $this.getCameraScanRegion().style.display = "none"; - $this.fileSelectionUi.show(); - switchScanTypeLink.innerText = TEXT_IF_FILE_SCAN_SELECTED; - $this.currentScanType = core_1.Html5QrcodeScanType.SCAN_TYPE_FILE; - $this.insertFileScanImageToScanRegion(); - } - else { - $this.clearScanRegion(); - $this.getCameraScanRegion().style.display = "block"; - $this.fileSelectionUi.hide(); - switchScanTypeLink.innerText = TEXT_IF_CAMERA_SCAN_SELECTED; - $this.currentScanType = core_1.Html5QrcodeScanType.SCAN_TYPE_CAMERA; - $this.insertCameraScanImageToScanRegion(); - $this.startCameraScanIfPermissionExistsOnSwap(); - } - $this.sectionSwapAllowed = true; - }); - switchContainer.appendChild(switchScanTypeLink); - section.appendChild(switchContainer); - }; - Html5QrcodeScanner.prototype.startCameraScanIfPermissionExistsOnSwap = function () { - var _this = this; - var $this = this; - if (this.persistedDataManager.hasCameraPermissions()) { - permissions_1.CameraPermissions.hasPermissions().then(function (hasPermissions) { - if (hasPermissions) { - var permissionButton = document.getElementById($this.getCameraPermissionButtonId()); - if (!permissionButton) { - _this.logger.logError("Permission button not found, fail;"); - throw "Permission button not found"; - } - permissionButton.click(); - } - else { - $this.persistedDataManager.setHasPermission(false); - } - }).catch(function (_) { - $this.persistedDataManager.setHasPermission(false); - }); - return; - } - }; - Html5QrcodeScanner.prototype.resetHeaderMessage = function () { - var messageDiv = document.getElementById(this.getHeaderMessageContainerId()); - messageDiv.style.display = "none"; - }; - Html5QrcodeScanner.prototype.setHeaderMessage = function (messageText, scannerStatus) { - if (!scannerStatus) { - scannerStatus = Html5QrcodeScannerStatus.STATUS_DEFAULT; - } - var messageDiv = this.getHeaderMessageDiv(); - messageDiv.innerText = messageText; - messageDiv.style.display = "block"; - switch (scannerStatus) { - case Html5QrcodeScannerStatus.STATUS_SUCCESS: - messageDiv.style.background = "rgba(106, 175, 80, 0.26)"; - messageDiv.style.color = "#477735"; - break; - case Html5QrcodeScannerStatus.STATUS_WARNING: - messageDiv.style.background = "rgba(203, 36, 49, 0.14)"; - messageDiv.style.color = "#cb2431"; - break; - case Html5QrcodeScannerStatus.STATUS_DEFAULT: - default: - messageDiv.style.background = "rgba(0, 0, 0, 0)"; - messageDiv.style.color = "rgb(17, 17, 17)"; - break; - } - }; - Html5QrcodeScanner.prototype.showHideScanTypeSwapLink = function (shouldDisplay) { - if (this.scanTypeSelector.hasMoreThanOneScanType()) { - if (shouldDisplay !== true) { - shouldDisplay = false; - } - this.sectionSwapAllowed = shouldDisplay; - this.getDashboardSectionSwapLink().style.display - = shouldDisplay ? "inline-block" : "none"; - } - }; - Html5QrcodeScanner.prototype.insertCameraScanImageToScanRegion = function () { - var $this = this; - var qrCodeScanRegion = document.getElementById(this.getScanRegionId()); - if (this.cameraScanImage) { - qrCodeScanRegion.innerHTML = "
    "; - qrCodeScanRegion.appendChild(this.cameraScanImage); - return; - } - this.cameraScanImage = new Image; - this.cameraScanImage.onload = function (_) { - qrCodeScanRegion.innerHTML = "
    "; - qrCodeScanRegion.appendChild($this.cameraScanImage); - }; - this.cameraScanImage.width = 64; - this.cameraScanImage.style.opacity = "0.8"; - this.cameraScanImage.src = image_assets_1.ASSET_CAMERA_SCAN; - this.cameraScanImage.alt = strings_1.Html5QrcodeScannerStrings.cameraScanAltText(); - }; - Html5QrcodeScanner.prototype.insertFileScanImageToScanRegion = function () { - var $this = this; - var qrCodeScanRegion = document.getElementById(this.getScanRegionId()); - if (this.fileScanImage) { - qrCodeScanRegion.innerHTML = "
    "; - qrCodeScanRegion.appendChild(this.fileScanImage); - return; - } - this.fileScanImage = new Image; - this.fileScanImage.onload = function (_) { - qrCodeScanRegion.innerHTML = "
    "; - qrCodeScanRegion.appendChild($this.fileScanImage); - }; - this.fileScanImage.width = 64; - this.fileScanImage.style.opacity = "0.8"; - this.fileScanImage.src = image_assets_1.ASSET_FILE_SCAN; - this.fileScanImage.alt = strings_1.Html5QrcodeScannerStrings.fileScanAltText(); - }; - Html5QrcodeScanner.prototype.clearScanRegion = function () { - var qrCodeScanRegion = document.getElementById(this.getScanRegionId()); - qrCodeScanRegion.innerHTML = ""; - }; - Html5QrcodeScanner.prototype.getDashboardSectionId = function () { - return "".concat(this.elementId, "__dashboard_section"); - }; - Html5QrcodeScanner.prototype.getDashboardSectionCameraScanRegionId = function () { - return "".concat(this.elementId, "__dashboard_section_csr"); - }; - Html5QrcodeScanner.prototype.getDashboardSectionSwapLinkId = function () { - return base_1.PublicUiElementIdAndClasses.SCAN_TYPE_CHANGE_ANCHOR_ID; - }; - Html5QrcodeScanner.prototype.getScanRegionId = function () { - return "".concat(this.elementId, "__scan_region"); - }; - Html5QrcodeScanner.prototype.getDashboardId = function () { - return "".concat(this.elementId, "__dashboard"); - }; - Html5QrcodeScanner.prototype.getHeaderMessageContainerId = function () { - return "".concat(this.elementId, "__header_message"); - }; - Html5QrcodeScanner.prototype.getCameraPermissionButtonId = function () { - return base_1.PublicUiElementIdAndClasses.CAMERA_PERMISSION_BUTTON_ID; - }; - Html5QrcodeScanner.prototype.getCameraScanRegion = function () { - return document.getElementById(this.getDashboardSectionCameraScanRegionId()); - }; - Html5QrcodeScanner.prototype.getDashboardSectionSwapLink = function () { - return document.getElementById(this.getDashboardSectionSwapLinkId()); - }; - Html5QrcodeScanner.prototype.getHeaderMessageDiv = function () { - return document.getElementById(this.getHeaderMessageContainerId()); - }; - return Html5QrcodeScanner; -}()); -exports.Html5QrcodeScanner = Html5QrcodeScanner; -//# sourceMappingURL=html5-qrcode-scanner.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/html5-qrcode-scanner.js.map b/node_modules/html5-qrcode/cjs/html5-qrcode-scanner.js.map deleted file mode 100644 index ecb0462..0000000 --- a/node_modules/html5-qrcode/cjs/html5-qrcode-scanner.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"html5-qrcode-scanner.js","sourceRoot":"","sources":["../../src/html5-qrcode-scanner.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/html5-qrcode.d.ts b/node_modules/html5-qrcode/cjs/html5-qrcode.d.ts deleted file mode 100644 index 0e57693..0000000 --- a/node_modules/html5-qrcode/cjs/html5-qrcode.d.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { QrcodeErrorCallback, QrcodeSuccessCallback, Html5QrcodeSupportedFormats, Html5QrcodeResult, QrDimensions, QrDimensionFunction } from "./core"; -import { CameraDevice, CameraCapabilities } from "./camera/core"; -import { ExperimentalFeaturesConfig } from "./experimental-features"; -import { Html5QrcodeScannerState } from "./state-manager"; -export interface Html5QrcodeConfigs { - formatsToSupport?: Array | undefined; - useBarCodeDetectorIfSupported?: boolean | undefined; - experimentalFeatures?: ExperimentalFeaturesConfig | undefined; -} -export interface Html5QrcodeFullConfig extends Html5QrcodeConfigs { - verbose: boolean | undefined; -} -export interface Html5QrcodeCameraScanConfig { - fps: number | undefined; - qrbox?: number | QrDimensions | QrDimensionFunction | undefined; - aspectRatio?: number | undefined; - disableFlip?: boolean | undefined; - videoConstraints?: MediaTrackConstraints | undefined; -} -export declare class Html5Qrcode { - private readonly logger; - private readonly elementId; - private readonly verbose; - private readonly qrcode; - private shouldScan; - private element; - private canvasElement; - private scannerPausedUiElement; - private hasBorderShaders; - private borderShaders; - private qrMatch; - private renderedCamera; - private foreverScanTimeout; - private qrRegion; - private context; - private lastScanImageFile; - private stateManagerProxy; - isScanning: boolean; - constructor(elementId: string, configOrVerbosityFlag?: boolean | Html5QrcodeFullConfig | undefined); - start(cameraIdOrConfig: string | MediaTrackConstraints, configuration: Html5QrcodeCameraScanConfig | undefined, qrCodeSuccessCallback: QrcodeSuccessCallback | undefined, qrCodeErrorCallback: QrcodeErrorCallback | undefined): Promise; - pause(shouldPauseVideo?: boolean): void; - resume(): void; - getState(): Html5QrcodeScannerState; - stop(): Promise; - scanFile(imageFile: File, showImage?: boolean): Promise; - scanFileV2(imageFile: File, showImage?: boolean): Promise; - clear(): void; - static getCameras(): Promise>; - getRunningTrackCapabilities(): MediaTrackCapabilities; - getRunningTrackSettings(): MediaTrackSettings; - getRunningTrackCameraCapabilities(): CameraCapabilities; - applyVideoConstraints(videoConstaints: MediaTrackConstraints): Promise; - private getRenderedCameraOrFail; - private getSupportedFormats; - private getUseBarCodeDetectorIfSupported; - private validateQrboxSize; - private validateQrboxConfig; - private toQrdimensions; - private setupUi; - private createScannerPausedUiElement; - private scanContext; - private foreverScan; - private createVideoConstraints; - private computeCanvasDrawConfig; - private clearElement; - private possiblyUpdateShaders; - private possiblyCloseLastScanImageFile; - private createCanvasElement; - private getShadedRegionBounds; - private possiblyInsertShadingElement; - private insertShaderBorders; - private showPausedState; - private hidePausedState; - private getTimeoutFps; -} diff --git a/node_modules/html5-qrcode/cjs/html5-qrcode.js b/node_modules/html5-qrcode/cjs/html5-qrcode.js deleted file mode 100644 index 27601fb..0000000 --- a/node_modules/html5-qrcode/cjs/html5-qrcode.js +++ /dev/null @@ -1,843 +0,0 @@ -"use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - if (typeof b !== "function" && b !== null) - throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Html5Qrcode = void 0; -var core_1 = require("./core"); -var strings_1 = require("./strings"); -var utils_1 = require("./utils"); -var code_decoder_1 = require("./code-decoder"); -var factories_1 = require("./camera/factories"); -var retriever_1 = require("./camera/retriever"); -var state_manager_1 = require("./state-manager"); -var Constants = (function (_super) { - __extends(Constants, _super); - function Constants() { - return _super !== null && _super.apply(this, arguments) || this; - } - Constants.DEFAULT_WIDTH = 300; - Constants.DEFAULT_WIDTH_OFFSET = 2; - Constants.FILE_SCAN_MIN_HEIGHT = 300; - Constants.FILE_SCAN_HIDDEN_CANVAS_PADDING = 100; - Constants.MIN_QR_BOX_SIZE = 50; - Constants.SHADED_LEFT = 1; - Constants.SHADED_RIGHT = 2; - Constants.SHADED_TOP = 3; - Constants.SHADED_BOTTOM = 4; - Constants.SHADED_REGION_ELEMENT_ID = "qr-shaded-region"; - Constants.VERBOSE = false; - Constants.BORDER_SHADER_DEFAULT_COLOR = "#ffffff"; - Constants.BORDER_SHADER_MATCH_COLOR = "rgb(90, 193, 56)"; - return Constants; -}(core_1.Html5QrcodeConstants)); -var InternalHtml5QrcodeConfig = (function () { - function InternalHtml5QrcodeConfig(config, logger) { - this.logger = logger; - this.fps = Constants.SCAN_DEFAULT_FPS; - if (!config) { - this.disableFlip = Constants.DEFAULT_DISABLE_FLIP; - } - else { - if (config.fps) { - this.fps = config.fps; - } - this.disableFlip = config.disableFlip === true; - this.qrbox = config.qrbox; - this.aspectRatio = config.aspectRatio; - this.videoConstraints = config.videoConstraints; - } - } - InternalHtml5QrcodeConfig.prototype.isMediaStreamConstraintsValid = function () { - if (!this.videoConstraints) { - this.logger.logError("Empty videoConstraints", true); - return false; - } - return utils_1.VideoConstraintsUtil.isMediaStreamConstraintsValid(this.videoConstraints, this.logger); - }; - InternalHtml5QrcodeConfig.prototype.isShadedBoxEnabled = function () { - return !(0, core_1.isNullOrUndefined)(this.qrbox); - }; - InternalHtml5QrcodeConfig.create = function (config, logger) { - return new InternalHtml5QrcodeConfig(config, logger); - }; - return InternalHtml5QrcodeConfig; -}()); -var Html5Qrcode = (function () { - function Html5Qrcode(elementId, configOrVerbosityFlag) { - this.element = null; - this.canvasElement = null; - this.scannerPausedUiElement = null; - this.hasBorderShaders = null; - this.borderShaders = null; - this.qrMatch = null; - this.renderedCamera = null; - this.qrRegion = null; - this.context = null; - this.lastScanImageFile = null; - this.isScanning = false; - if (!document.getElementById(elementId)) { - throw "HTML Element with id=".concat(elementId, " not found"); - } - this.elementId = elementId; - this.verbose = false; - var experimentalFeatureConfig; - var configObject; - if (typeof configOrVerbosityFlag == "boolean") { - this.verbose = configOrVerbosityFlag === true; - } - else if (configOrVerbosityFlag) { - configObject = configOrVerbosityFlag; - this.verbose = configObject.verbose === true; - experimentalFeatureConfig = configObject.experimentalFeatures; - } - this.logger = new core_1.BaseLoggger(this.verbose); - this.qrcode = new code_decoder_1.Html5QrcodeShim(this.getSupportedFormats(configOrVerbosityFlag), this.getUseBarCodeDetectorIfSupported(configObject), this.verbose, this.logger); - this.foreverScanTimeout; - this.shouldScan = true; - this.stateManagerProxy = state_manager_1.StateManagerFactory.create(); - } - Html5Qrcode.prototype.start = function (cameraIdOrConfig, configuration, qrCodeSuccessCallback, qrCodeErrorCallback) { - var _this = this; - if (!cameraIdOrConfig) { - throw "cameraIdOrConfig is required"; - } - if (!qrCodeSuccessCallback - || typeof qrCodeSuccessCallback != "function") { - throw "qrCodeSuccessCallback is required and should be a function."; - } - var qrCodeErrorCallbackInternal; - if (qrCodeErrorCallback) { - qrCodeErrorCallbackInternal = qrCodeErrorCallback; - } - else { - qrCodeErrorCallbackInternal - = this.verbose ? this.logger.log : function () { }; - } - var internalConfig = InternalHtml5QrcodeConfig.create(configuration, this.logger); - this.clearElement(); - var videoConstraintsAvailableAndValid = false; - if (internalConfig.videoConstraints) { - if (!internalConfig.isMediaStreamConstraintsValid()) { - this.logger.logError("'videoConstraints' is not valid 'MediaStreamConstraints, " - + "it will be ignored.'", true); - } - else { - videoConstraintsAvailableAndValid = true; - } - } - var areVideoConstraintsEnabled = videoConstraintsAvailableAndValid; - var element = document.getElementById(this.elementId); - var rootElementWidth = element.clientWidth - ? element.clientWidth : Constants.DEFAULT_WIDTH; - element.style.position = "relative"; - this.shouldScan = true; - this.element = element; - var $this = this; - var toScanningStateChangeTransaction = this.stateManagerProxy.startTransition(state_manager_1.Html5QrcodeScannerState.SCANNING); - return new Promise(function (resolve, reject) { - var videoConstraints = areVideoConstraintsEnabled - ? internalConfig.videoConstraints - : $this.createVideoConstraints(cameraIdOrConfig); - if (!videoConstraints) { - toScanningStateChangeTransaction.cancel(); - reject("videoConstraints should be defined"); - return; - } - var cameraRenderingOptions = {}; - if (!areVideoConstraintsEnabled || internalConfig.aspectRatio) { - cameraRenderingOptions.aspectRatio = internalConfig.aspectRatio; - } - var renderingCallbacks = { - onRenderSurfaceReady: function (viewfinderWidth, viewfinderHeight) { - $this.setupUi(viewfinderWidth, viewfinderHeight, internalConfig); - $this.isScanning = true; - $this.foreverScan(internalConfig, qrCodeSuccessCallback, qrCodeErrorCallbackInternal); - } - }; - factories_1.CameraFactory.failIfNotSupported().then(function (factory) { - factory.create(videoConstraints).then(function (camera) { - return camera.render(_this.element, cameraRenderingOptions, renderingCallbacks) - .then(function (renderedCamera) { - $this.renderedCamera = renderedCamera; - toScanningStateChangeTransaction.execute(); - resolve(null); - }) - .catch(function (error) { - toScanningStateChangeTransaction.cancel(); - reject(error); - }); - }).catch(function (error) { - toScanningStateChangeTransaction.cancel(); - reject(strings_1.Html5QrcodeStrings.errorGettingUserMedia(error)); - }); - }).catch(function (_) { - toScanningStateChangeTransaction.cancel(); - reject(strings_1.Html5QrcodeStrings.cameraStreamingNotSupported()); - }); - }); - }; - Html5Qrcode.prototype.pause = function (shouldPauseVideo) { - if (!this.stateManagerProxy.isStrictlyScanning()) { - throw "Cannot pause, scanner is not scanning."; - } - this.stateManagerProxy.directTransition(state_manager_1.Html5QrcodeScannerState.PAUSED); - this.showPausedState(); - if ((0, core_1.isNullOrUndefined)(shouldPauseVideo) || shouldPauseVideo !== true) { - shouldPauseVideo = false; - } - if (shouldPauseVideo && this.renderedCamera) { - this.renderedCamera.pause(); - } - }; - Html5Qrcode.prototype.resume = function () { - if (!this.stateManagerProxy.isPaused()) { - throw "Cannot result, scanner is not paused."; - } - if (!this.renderedCamera) { - throw "renderedCamera doesn't exist while trying resume()"; - } - var $this = this; - var transitionToScanning = function () { - $this.stateManagerProxy.directTransition(state_manager_1.Html5QrcodeScannerState.SCANNING); - $this.hidePausedState(); - }; - if (!this.renderedCamera.isPaused()) { - transitionToScanning(); - return; - } - this.renderedCamera.resume(function () { - transitionToScanning(); - }); - }; - Html5Qrcode.prototype.getState = function () { - return this.stateManagerProxy.getState(); - }; - Html5Qrcode.prototype.stop = function () { - var _this = this; - if (!this.stateManagerProxy.isScanning()) { - throw "Cannot stop, scanner is not running or paused."; - } - var toStoppedStateTransaction = this.stateManagerProxy.startTransition(state_manager_1.Html5QrcodeScannerState.NOT_STARTED); - this.shouldScan = false; - if (this.foreverScanTimeout) { - clearTimeout(this.foreverScanTimeout); - } - var removeQrRegion = function () { - if (!_this.element) { - return; - } - var childElement = document.getElementById(Constants.SHADED_REGION_ELEMENT_ID); - if (childElement) { - _this.element.removeChild(childElement); - } - }; - var $this = this; - return this.renderedCamera.close().then(function () { - $this.renderedCamera = null; - if ($this.element) { - $this.element.removeChild($this.canvasElement); - $this.canvasElement = null; - } - removeQrRegion(); - if ($this.qrRegion) { - $this.qrRegion = null; - } - if ($this.context) { - $this.context = null; - } - toStoppedStateTransaction.execute(); - $this.hidePausedState(); - $this.isScanning = false; - return Promise.resolve(); - }); - }; - Html5Qrcode.prototype.scanFile = function (imageFile, showImage) { - return this.scanFileV2(imageFile, showImage) - .then(function (html5qrcodeResult) { return html5qrcodeResult.decodedText; }); - }; - Html5Qrcode.prototype.scanFileV2 = function (imageFile, showImage) { - var _this = this; - if (!imageFile || !(imageFile instanceof File)) { - throw "imageFile argument is mandatory and should be instance " - + "of File. Use 'event.target.files[0]'."; - } - if ((0, core_1.isNullOrUndefined)(showImage)) { - showImage = true; - } - if (!this.stateManagerProxy.canScanFile()) { - throw "Cannot start file scan - ongoing camera scan"; - } - return new Promise(function (resolve, reject) { - _this.possiblyCloseLastScanImageFile(); - _this.clearElement(); - _this.lastScanImageFile = URL.createObjectURL(imageFile); - var inputImage = new Image; - inputImage.onload = function () { - var imageWidth = inputImage.width; - var imageHeight = inputImage.height; - var element = document.getElementById(_this.elementId); - var containerWidth = element.clientWidth - ? element.clientWidth : Constants.DEFAULT_WIDTH; - var containerHeight = Math.max(element.clientHeight ? element.clientHeight : imageHeight, Constants.FILE_SCAN_MIN_HEIGHT); - var config = _this.computeCanvasDrawConfig(imageWidth, imageHeight, containerWidth, containerHeight); - if (showImage) { - var visibleCanvas = _this.createCanvasElement(containerWidth, containerHeight, "qr-canvas-visible"); - visibleCanvas.style.display = "inline-block"; - element.appendChild(visibleCanvas); - var context_1 = visibleCanvas.getContext("2d"); - if (!context_1) { - throw "Unable to get 2d context from canvas"; - } - context_1.canvas.width = containerWidth; - context_1.canvas.height = containerHeight; - context_1.drawImage(inputImage, 0, 0, imageWidth, imageHeight, config.x, config.y, config.width, config.height); - } - var padding = Constants.FILE_SCAN_HIDDEN_CANVAS_PADDING; - var hiddenImageWidth = Math.max(inputImage.width, config.width); - var hiddenImageHeight = Math.max(inputImage.height, config.height); - var hiddenCanvasWidth = hiddenImageWidth + 2 * padding; - var hiddenCanvasHeight = hiddenImageHeight + 2 * padding; - var hiddenCanvas = _this.createCanvasElement(hiddenCanvasWidth, hiddenCanvasHeight); - element.appendChild(hiddenCanvas); - var context = hiddenCanvas.getContext("2d"); - if (!context) { - throw "Unable to get 2d context from canvas"; - } - context.canvas.width = hiddenCanvasWidth; - context.canvas.height = hiddenCanvasHeight; - context.drawImage(inputImage, 0, 0, imageWidth, imageHeight, padding, padding, hiddenImageWidth, hiddenImageHeight); - try { - _this.qrcode.decodeRobustlyAsync(hiddenCanvas) - .then(function (result) { - resolve(core_1.Html5QrcodeResultFactory.createFromQrcodeResult(result)); - }) - .catch(reject); - } - catch (exception) { - reject("QR code parse error, error = ".concat(exception)); - } - }; - inputImage.onerror = reject; - inputImage.onabort = reject; - inputImage.onstalled = reject; - inputImage.onsuspend = reject; - inputImage.src = URL.createObjectURL(imageFile); - }); - }; - Html5Qrcode.prototype.clear = function () { - this.clearElement(); - }; - Html5Qrcode.getCameras = function () { - return retriever_1.CameraRetriever.retrieve(); - }; - Html5Qrcode.prototype.getRunningTrackCapabilities = function () { - return this.getRenderedCameraOrFail().getRunningTrackCapabilities(); - }; - Html5Qrcode.prototype.getRunningTrackSettings = function () { - return this.getRenderedCameraOrFail().getRunningTrackSettings(); - }; - Html5Qrcode.prototype.getRunningTrackCameraCapabilities = function () { - return this.getRenderedCameraOrFail().getCapabilities(); - }; - Html5Qrcode.prototype.applyVideoConstraints = function (videoConstaints) { - if (!videoConstaints) { - throw "videoConstaints is required argument."; - } - else if (!utils_1.VideoConstraintsUtil.isMediaStreamConstraintsValid(videoConstaints, this.logger)) { - throw "invalid videoConstaints passed, check logs for more details"; - } - return this.getRenderedCameraOrFail().applyVideoConstraints(videoConstaints); - }; - Html5Qrcode.prototype.getRenderedCameraOrFail = function () { - if (this.renderedCamera == null) { - throw "Scanning is not in running state, call this API only when" - + " QR code scanning using camera is in running state."; - } - return this.renderedCamera; - }; - Html5Qrcode.prototype.getSupportedFormats = function (configOrVerbosityFlag) { - var allFormats = [ - core_1.Html5QrcodeSupportedFormats.QR_CODE, - core_1.Html5QrcodeSupportedFormats.AZTEC, - core_1.Html5QrcodeSupportedFormats.CODABAR, - core_1.Html5QrcodeSupportedFormats.CODE_39, - core_1.Html5QrcodeSupportedFormats.CODE_93, - core_1.Html5QrcodeSupportedFormats.CODE_128, - core_1.Html5QrcodeSupportedFormats.DATA_MATRIX, - core_1.Html5QrcodeSupportedFormats.MAXICODE, - core_1.Html5QrcodeSupportedFormats.ITF, - core_1.Html5QrcodeSupportedFormats.EAN_13, - core_1.Html5QrcodeSupportedFormats.EAN_8, - core_1.Html5QrcodeSupportedFormats.PDF_417, - core_1.Html5QrcodeSupportedFormats.RSS_14, - core_1.Html5QrcodeSupportedFormats.RSS_EXPANDED, - core_1.Html5QrcodeSupportedFormats.UPC_A, - core_1.Html5QrcodeSupportedFormats.UPC_E, - core_1.Html5QrcodeSupportedFormats.UPC_EAN_EXTENSION, - ]; - if (!configOrVerbosityFlag - || typeof configOrVerbosityFlag == "boolean") { - return allFormats; - } - if (!configOrVerbosityFlag.formatsToSupport) { - return allFormats; - } - if (!Array.isArray(configOrVerbosityFlag.formatsToSupport)) { - throw "configOrVerbosityFlag.formatsToSupport should be undefined " - + "or an array."; - } - if (configOrVerbosityFlag.formatsToSupport.length === 0) { - throw "Atleast 1 formatsToSupport is needed."; - } - var supportedFormats = []; - for (var _i = 0, _a = configOrVerbosityFlag.formatsToSupport; _i < _a.length; _i++) { - var format = _a[_i]; - if ((0, core_1.isValidHtml5QrcodeSupportedFormats)(format)) { - supportedFormats.push(format); - } - else { - this.logger.warn("Invalid format: ".concat(format, " passed in config, ignoring.")); - } - } - if (supportedFormats.length === 0) { - throw "None of formatsToSupport match supported values."; - } - return supportedFormats; - }; - Html5Qrcode.prototype.getUseBarCodeDetectorIfSupported = function (config) { - if ((0, core_1.isNullOrUndefined)(config)) { - return true; - } - if (!(0, core_1.isNullOrUndefined)(config.useBarCodeDetectorIfSupported)) { - return config.useBarCodeDetectorIfSupported !== false; - } - if ((0, core_1.isNullOrUndefined)(config.experimentalFeatures)) { - return true; - } - var experimentalFeatures = config.experimentalFeatures; - if ((0, core_1.isNullOrUndefined)(experimentalFeatures.useBarCodeDetectorIfSupported)) { - return true; - } - return experimentalFeatures.useBarCodeDetectorIfSupported !== false; - }; - Html5Qrcode.prototype.validateQrboxSize = function (viewfinderWidth, viewfinderHeight, internalConfig) { - var _this = this; - var qrboxSize = internalConfig.qrbox; - this.validateQrboxConfig(qrboxSize); - var qrDimensions = this.toQrdimensions(viewfinderWidth, viewfinderHeight, qrboxSize); - var validateMinSize = function (size) { - if (size < Constants.MIN_QR_BOX_SIZE) { - throw "minimum size of 'config.qrbox' dimension value is" - + " ".concat(Constants.MIN_QR_BOX_SIZE, "px."); - } - }; - var correctWidthBasedOnRootElementSize = function (configWidth) { - if (configWidth > viewfinderWidth) { - _this.logger.warn("`qrbox.width` or `qrbox` is larger than the" - + " width of the root element. The width will be truncated" - + " to the width of root element."); - configWidth = viewfinderWidth; - } - return configWidth; - }; - validateMinSize(qrDimensions.width); - validateMinSize(qrDimensions.height); - qrDimensions.width = correctWidthBasedOnRootElementSize(qrDimensions.width); - }; - Html5Qrcode.prototype.validateQrboxConfig = function (qrboxSize) { - if (typeof qrboxSize === "number") { - return; - } - if (typeof qrboxSize === "function") { - return; - } - if (qrboxSize.width === undefined || qrboxSize.height === undefined) { - throw "Invalid instance of QrDimensions passed for " - + "'config.qrbox'. Both 'width' and 'height' should be set."; - } - }; - Html5Qrcode.prototype.toQrdimensions = function (viewfinderWidth, viewfinderHeight, qrboxSize) { - if (typeof qrboxSize === "number") { - return { width: qrboxSize, height: qrboxSize }; - } - else if (typeof qrboxSize === "function") { - try { - return qrboxSize(viewfinderWidth, viewfinderHeight); - } - catch (error) { - throw new Error("qrbox config was passed as a function but it failed with " - + "unknown error" + error); - } - } - return qrboxSize; - }; - Html5Qrcode.prototype.setupUi = function (viewfinderWidth, viewfinderHeight, internalConfig) { - if (internalConfig.isShadedBoxEnabled()) { - this.validateQrboxSize(viewfinderWidth, viewfinderHeight, internalConfig); - } - var qrboxSize = (0, core_1.isNullOrUndefined)(internalConfig.qrbox) ? - { width: viewfinderWidth, height: viewfinderHeight } : internalConfig.qrbox; - this.validateQrboxConfig(qrboxSize); - var qrDimensions = this.toQrdimensions(viewfinderWidth, viewfinderHeight, qrboxSize); - if (qrDimensions.height > viewfinderHeight) { - this.logger.warn("[Html5Qrcode] config.qrbox has height that is" - + "greater than the height of the video stream. Shading will be" - + " ignored"); - } - var shouldShadingBeApplied = internalConfig.isShadedBoxEnabled() - && qrDimensions.height <= viewfinderHeight; - var defaultQrRegion = { - x: 0, - y: 0, - width: viewfinderWidth, - height: viewfinderHeight - }; - var qrRegion = shouldShadingBeApplied - ? this.getShadedRegionBounds(viewfinderWidth, viewfinderHeight, qrDimensions) - : defaultQrRegion; - var canvasElement = this.createCanvasElement(qrRegion.width, qrRegion.height); - var contextAttributes = { willReadFrequently: true }; - var context = canvasElement.getContext("2d", contextAttributes); - context.canvas.width = qrRegion.width; - context.canvas.height = qrRegion.height; - this.element.append(canvasElement); - if (shouldShadingBeApplied) { - this.possiblyInsertShadingElement(this.element, viewfinderWidth, viewfinderHeight, qrDimensions); - } - this.createScannerPausedUiElement(this.element); - this.qrRegion = qrRegion; - this.context = context; - this.canvasElement = canvasElement; - }; - Html5Qrcode.prototype.createScannerPausedUiElement = function (rootElement) { - var scannerPausedUiElement = document.createElement("div"); - scannerPausedUiElement.innerText = strings_1.Html5QrcodeStrings.scannerPaused(); - scannerPausedUiElement.style.display = "none"; - scannerPausedUiElement.style.position = "absolute"; - scannerPausedUiElement.style.top = "0px"; - scannerPausedUiElement.style.zIndex = "1"; - scannerPausedUiElement.style.background = "rgba(9, 9, 9, 0.46)"; - scannerPausedUiElement.style.color = "#FFECEC"; - scannerPausedUiElement.style.textAlign = "center"; - scannerPausedUiElement.style.width = "100%"; - rootElement.appendChild(scannerPausedUiElement); - this.scannerPausedUiElement = scannerPausedUiElement; - }; - Html5Qrcode.prototype.scanContext = function (qrCodeSuccessCallback, qrCodeErrorCallback) { - var _this = this; - if (this.stateManagerProxy.isPaused()) { - return Promise.resolve(false); - } - return this.qrcode.decodeAsync(this.canvasElement) - .then(function (result) { - qrCodeSuccessCallback(result.text, core_1.Html5QrcodeResultFactory.createFromQrcodeResult(result)); - _this.possiblyUpdateShaders(true); - return true; - }).catch(function (error) { - _this.possiblyUpdateShaders(false); - var errorMessage = strings_1.Html5QrcodeStrings.codeParseError(error); - qrCodeErrorCallback(errorMessage, core_1.Html5QrcodeErrorFactory.createFrom(errorMessage)); - return false; - }); - }; - Html5Qrcode.prototype.foreverScan = function (internalConfig, qrCodeSuccessCallback, qrCodeErrorCallback) { - var _this = this; - if (!this.shouldScan) { - return; - } - if (!this.renderedCamera) { - return; - } - var videoElement = this.renderedCamera.getSurface(); - var widthRatio = videoElement.videoWidth / videoElement.clientWidth; - var heightRatio = videoElement.videoHeight / videoElement.clientHeight; - if (!this.qrRegion) { - throw "qrRegion undefined when localMediaStream is ready."; - } - var sWidthOffset = this.qrRegion.width * widthRatio; - var sHeightOffset = this.qrRegion.height * heightRatio; - var sxOffset = this.qrRegion.x * widthRatio; - var syOffset = this.qrRegion.y * heightRatio; - this.context.drawImage(videoElement, sxOffset, syOffset, sWidthOffset, sHeightOffset, 0, 0, this.qrRegion.width, this.qrRegion.height); - var triggerNextScan = function () { - _this.foreverScanTimeout = setTimeout(function () { - _this.foreverScan(internalConfig, qrCodeSuccessCallback, qrCodeErrorCallback); - }, _this.getTimeoutFps(internalConfig.fps)); - }; - this.scanContext(qrCodeSuccessCallback, qrCodeErrorCallback) - .then(function (isSuccessfull) { - if (!isSuccessfull && internalConfig.disableFlip !== true) { - _this.context.translate(_this.context.canvas.width, 0); - _this.context.scale(-1, 1); - _this.scanContext(qrCodeSuccessCallback, qrCodeErrorCallback) - .finally(function () { - triggerNextScan(); - }); - } - else { - triggerNextScan(); - } - }).catch(function (error) { - _this.logger.logError("Error happend while scanning context", error); - triggerNextScan(); - }); - }; - Html5Qrcode.prototype.createVideoConstraints = function (cameraIdOrConfig) { - if (typeof cameraIdOrConfig == "string") { - return { deviceId: { exact: cameraIdOrConfig } }; - } - else if (typeof cameraIdOrConfig == "object") { - var facingModeKey = "facingMode"; - var deviceIdKey = "deviceId"; - var allowedFacingModeValues_1 = { "user": true, "environment": true }; - var exactKey = "exact"; - var isValidFacingModeValue = function (value) { - if (value in allowedFacingModeValues_1) { - return true; - } - else { - throw "config has invalid 'facingMode' value = " - + "'".concat(value, "'"); - } - }; - var keys = Object.keys(cameraIdOrConfig); - if (keys.length !== 1) { - throw "'cameraIdOrConfig' object should have exactly 1 key," - + " if passed as an object, found ".concat(keys.length, " keys"); - } - var key = Object.keys(cameraIdOrConfig)[0]; - if (key !== facingModeKey && key !== deviceIdKey) { - throw "Only '".concat(facingModeKey, "' and '").concat(deviceIdKey, "' ") - + " are supported for 'cameraIdOrConfig'"; - } - if (key === facingModeKey) { - var facingMode = cameraIdOrConfig.facingMode; - if (typeof facingMode == "string") { - if (isValidFacingModeValue(facingMode)) { - return { facingMode: facingMode }; - } - } - else if (typeof facingMode == "object") { - if (exactKey in facingMode) { - if (isValidFacingModeValue(facingMode["".concat(exactKey)])) { - return { - facingMode: { - exact: facingMode["".concat(exactKey)] - } - }; - } - } - else { - throw "'facingMode' should be string or object with" - + " ".concat(exactKey, " as key."); - } - } - else { - var type_1 = (typeof facingMode); - throw "Invalid type of 'facingMode' = ".concat(type_1); - } - } - else { - var deviceId = cameraIdOrConfig.deviceId; - if (typeof deviceId == "string") { - return { deviceId: deviceId }; - } - else if (typeof deviceId == "object") { - if (exactKey in deviceId) { - return { - deviceId: { exact: deviceId["".concat(exactKey)] } - }; - } - else { - throw "'deviceId' should be string or object with" - + " ".concat(exactKey, " as key."); - } - } - else { - var type_2 = (typeof deviceId); - throw "Invalid type of 'deviceId' = ".concat(type_2); - } - } - } - var type = (typeof cameraIdOrConfig); - throw "Invalid type of 'cameraIdOrConfig' = ".concat(type); - }; - Html5Qrcode.prototype.computeCanvasDrawConfig = function (imageWidth, imageHeight, containerWidth, containerHeight) { - if (imageWidth <= containerWidth - && imageHeight <= containerHeight) { - var xoffset = (containerWidth - imageWidth) / 2; - var yoffset = (containerHeight - imageHeight) / 2; - return { - x: xoffset, - y: yoffset, - width: imageWidth, - height: imageHeight - }; - } - else { - var formerImageWidth = imageWidth; - var formerImageHeight = imageHeight; - if (imageWidth > containerWidth) { - imageHeight = (containerWidth / imageWidth) * imageHeight; - imageWidth = containerWidth; - } - if (imageHeight > containerHeight) { - imageWidth = (containerHeight / imageHeight) * imageWidth; - imageHeight = containerHeight; - } - this.logger.log("Image downsampled from " - + "".concat(formerImageWidth, "X").concat(formerImageHeight) - + " to ".concat(imageWidth, "X").concat(imageHeight, ".")); - return this.computeCanvasDrawConfig(imageWidth, imageHeight, containerWidth, containerHeight); - } - }; - Html5Qrcode.prototype.clearElement = function () { - if (this.stateManagerProxy.isScanning()) { - throw "Cannot clear while scan is ongoing, close it first."; - } - var element = document.getElementById(this.elementId); - if (element) { - element.innerHTML = ""; - } - }; - Html5Qrcode.prototype.possiblyUpdateShaders = function (qrMatch) { - if (this.qrMatch === qrMatch) { - return; - } - if (this.hasBorderShaders - && this.borderShaders - && this.borderShaders.length) { - this.borderShaders.forEach(function (shader) { - shader.style.backgroundColor = qrMatch - ? Constants.BORDER_SHADER_MATCH_COLOR - : Constants.BORDER_SHADER_DEFAULT_COLOR; - }); - } - this.qrMatch = qrMatch; - }; - Html5Qrcode.prototype.possiblyCloseLastScanImageFile = function () { - if (this.lastScanImageFile) { - URL.revokeObjectURL(this.lastScanImageFile); - this.lastScanImageFile = null; - } - }; - Html5Qrcode.prototype.createCanvasElement = function (width, height, customId) { - var canvasWidth = width; - var canvasHeight = height; - var canvasElement = document.createElement("canvas"); - canvasElement.style.width = "".concat(canvasWidth, "px"); - canvasElement.style.height = "".concat(canvasHeight, "px"); - canvasElement.style.display = "none"; - canvasElement.id = (0, core_1.isNullOrUndefined)(customId) - ? "qr-canvas" : customId; - return canvasElement; - }; - Html5Qrcode.prototype.getShadedRegionBounds = function (width, height, qrboxSize) { - if (qrboxSize.width > width || qrboxSize.height > height) { - throw "'config.qrbox' dimensions should not be greater than the " - + "dimensions of the root HTML element."; - } - return { - x: (width - qrboxSize.width) / 2, - y: (height - qrboxSize.height) / 2, - width: qrboxSize.width, - height: qrboxSize.height - }; - }; - Html5Qrcode.prototype.possiblyInsertShadingElement = function (element, width, height, qrboxSize) { - if ((width - qrboxSize.width) < 1 || (height - qrboxSize.height) < 1) { - return; - } - var shadingElement = document.createElement("div"); - shadingElement.style.position = "absolute"; - var rightLeftBorderSize = (width - qrboxSize.width) / 2; - var topBottomBorderSize = (height - qrboxSize.height) / 2; - shadingElement.style.borderLeft - = "".concat(rightLeftBorderSize, "px solid rgba(0, 0, 0, 0.48)"); - shadingElement.style.borderRight - = "".concat(rightLeftBorderSize, "px solid rgba(0, 0, 0, 0.48)"); - shadingElement.style.borderTop - = "".concat(topBottomBorderSize, "px solid rgba(0, 0, 0, 0.48)"); - shadingElement.style.borderBottom - = "".concat(topBottomBorderSize, "px solid rgba(0, 0, 0, 0.48)"); - shadingElement.style.boxSizing = "border-box"; - shadingElement.style.top = "0px"; - shadingElement.style.bottom = "0px"; - shadingElement.style.left = "0px"; - shadingElement.style.right = "0px"; - shadingElement.id = "".concat(Constants.SHADED_REGION_ELEMENT_ID); - if ((width - qrboxSize.width) < 11 - || (height - qrboxSize.height) < 11) { - this.hasBorderShaders = false; - } - else { - var smallSize = 5; - var largeSize = 40; - this.insertShaderBorders(shadingElement, largeSize, smallSize, -smallSize, null, 0, true); - this.insertShaderBorders(shadingElement, largeSize, smallSize, -smallSize, null, 0, false); - this.insertShaderBorders(shadingElement, largeSize, smallSize, null, -smallSize, 0, true); - this.insertShaderBorders(shadingElement, largeSize, smallSize, null, -smallSize, 0, false); - this.insertShaderBorders(shadingElement, smallSize, largeSize + smallSize, -smallSize, null, -smallSize, true); - this.insertShaderBorders(shadingElement, smallSize, largeSize + smallSize, null, -smallSize, -smallSize, true); - this.insertShaderBorders(shadingElement, smallSize, largeSize + smallSize, -smallSize, null, -smallSize, false); - this.insertShaderBorders(shadingElement, smallSize, largeSize + smallSize, null, -smallSize, -smallSize, false); - this.hasBorderShaders = true; - } - element.append(shadingElement); - }; - Html5Qrcode.prototype.insertShaderBorders = function (shaderElem, width, height, top, bottom, side, isLeft) { - var elem = document.createElement("div"); - elem.style.position = "absolute"; - elem.style.backgroundColor = Constants.BORDER_SHADER_DEFAULT_COLOR; - elem.style.width = "".concat(width, "px"); - elem.style.height = "".concat(height, "px"); - if (top !== null) { - elem.style.top = "".concat(top, "px"); - } - if (bottom !== null) { - elem.style.bottom = "".concat(bottom, "px"); - } - if (isLeft) { - elem.style.left = "".concat(side, "px"); - } - else { - elem.style.right = "".concat(side, "px"); - } - if (!this.borderShaders) { - this.borderShaders = []; - } - this.borderShaders.push(elem); - shaderElem.appendChild(elem); - }; - Html5Qrcode.prototype.showPausedState = function () { - if (!this.scannerPausedUiElement) { - throw "[internal error] scanner paused UI element not found"; - } - this.scannerPausedUiElement.style.display = "block"; - }; - Html5Qrcode.prototype.hidePausedState = function () { - if (!this.scannerPausedUiElement) { - throw "[internal error] scanner paused UI element not found"; - } - this.scannerPausedUiElement.style.display = "none"; - }; - Html5Qrcode.prototype.getTimeoutFps = function (fps) { - return 1000 / fps; - }; - return Html5Qrcode; -}()); -exports.Html5Qrcode = Html5Qrcode; -//# sourceMappingURL=html5-qrcode.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/html5-qrcode.js.map b/node_modules/html5-qrcode/cjs/html5-qrcode.js.map deleted file mode 100644 index ffdc1b9..0000000 --- a/node_modules/html5-qrcode/cjs/html5-qrcode.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"html5-qrcode.js","sourceRoot":"","sources":["../../src/html5-qrcode.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/image-assets.d.ts b/node_modules/html5-qrcode/cjs/image-assets.d.ts deleted file mode 100644 index 59387ac..0000000 --- a/node_modules/html5-qrcode/cjs/image-assets.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export declare const ASSET_CAMERA_SCAN: string; -export declare const ASSET_FILE_SCAN: string; -export declare const ASSET_INFO_ICON_16PX: string; -export declare const ASSET_CLOSE_ICON_16PX: string; diff --git a/node_modules/html5-qrcode/cjs/image-assets.js b/node_modules/html5-qrcode/cjs/image-assets.js deleted file mode 100644 index 2ac885c..0000000 --- a/node_modules/html5-qrcode/cjs/image-assets.js +++ /dev/null @@ -1,9 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ASSET_CLOSE_ICON_16PX = exports.ASSET_INFO_ICON_16PX = exports.ASSET_FILE_SCAN = exports.ASSET_CAMERA_SCAN = void 0; -var SVG_XML_PREFIX = "data:image/svg+xml;base64,"; -exports.ASSET_CAMERA_SCAN = SVG_XML_PREFIX + "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzNzEuNjQzIDM3MS42NDMiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDM3MS42NDMgMzcxLjY0MyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBhdGggZD0iTTEwNS4wODQgMzguMjcxaDE2My43Njh2MjBIMTA1LjA4NHoiLz48cGF0aCBkPSJNMzExLjU5NiAxOTAuMTg5Yy03LjQ0MS05LjM0Ny0xOC40MDMtMTYuMjA2LTMyLjc0My0yMC41MjJWMzBjMC0xNi41NDItMTMuNDU4LTMwLTMwLTMwSDEyNS4wODRjLTE2LjU0MiAwLTMwIDEzLjQ1OC0zMCAzMHYxMjAuMTQzaC04LjI5NmMtMTYuNTQyIDAtMzAgMTMuNDU4LTMwIDMwdjEuMzMzYTI5LjgwNCAyOS44MDQgMCAwIDAgNC42MDMgMTUuOTM5Yy03LjM0IDUuNDc0LTEyLjEwMyAxNC4yMjEtMTIuMTAzIDI0LjA2MXYxLjMzM2MwIDkuODQgNC43NjMgMTguNTg3IDEyLjEwMyAyNC4wNjJhMjkuODEgMjkuODEgMCAwIDAtNC42MDMgMTUuOTM4djEuMzMzYzAgMTYuNTQyIDEzLjQ1OCAzMCAzMCAzMGg4LjMyNGMuNDI3IDExLjYzMSA3LjUwMyAyMS41ODcgMTcuNTM0IDI2LjE3Ny45MzEgMTAuNTAzIDQuMDg0IDMwLjE4NyAxNC43NjggNDUuNTM3YTkuOTg4IDkuOTg4IDAgMCAwIDguMjE2IDQuMjg4IDkuOTU4IDkuOTU4IDAgMCAwIDUuNzA0LTEuNzkzYzQuNTMzLTMuMTU1IDUuNjUtOS4zODggMi40OTUtMTMuOTIxLTYuNzk4LTkuNzY3LTkuNjAyLTIyLjYwOC0xMC43Ni0zMS40aDgyLjY4NWMuMjcyLjQxNC41NDUuODE4LjgxNSAxLjIxIDMuMTQyIDQuNTQxIDkuMzcyIDUuNjc5IDEzLjkxMyAyLjUzNCA0LjU0Mi0zLjE0MiA1LjY3Ny05LjM3MSAyLjUzNS0xMy45MTMtMTEuOTE5LTE3LjIyOS04Ljc4Ny0zNS44ODQgOS41ODEtNTcuMDEyIDMuMDY3LTIuNjUyIDEyLjMwNy0xMS43MzIgMTEuMjE3LTI0LjAzMy0uODI4LTkuMzQzLTcuMTA5LTE3LjE5NC0xOC42NjktMjMuMzM3YTkuODU3IDkuODU3IDAgMCAwLTEuMDYxLS40ODZjLS40NjYtLjE4Mi0xMS40MDMtNC41NzktOS43NDEtMTUuNzA2IDEuMDA3LTYuNzM3IDE0Ljc2OC04LjI3MyAyMy43NjYtNy42NjYgMjMuMTU2IDEuNTY5IDM5LjY5OCA3LjgwMyA0Ny44MzYgMTguMDI2IDUuNzUyIDcuMjI1IDcuNjA3IDE2LjYyMyA1LjY3MyAyOC43MzMtLjQxMyAyLjU4NS0uODI0IDUuMjQxLTEuMjQ1IDcuOTU5LTUuNzU2IDM3LjE5NC0xMi45MTkgODMuNDgzLTQ5Ljg3IDExNC42NjEtNC4yMjEgMy41NjEtNC43NTYgOS44Ny0xLjE5NCAxNC4wOTJhOS45OCA5Ljk4IDAgMCAwIDcuNjQ4IDMuNTUxIDkuOTU1IDkuOTU1IDAgMCAwIDYuNDQ0LTIuMzU4YzQyLjY3Mi0zNi4wMDUgNTAuODAyLTg4LjUzMyA1Ni43MzctMTI2Ljg4OC40MTUtMi42ODQuODIxLTUuMzA5IDEuMjI5LTcuODYzIDIuODM0LTE3LjcyMS0uNDU1LTMyLjY0MS05Ljc3Mi00NC4zNDV6bS0yMzIuMzA4IDQyLjYyYy01LjUxNCAwLTEwLTQuNDg2LTEwLTEwdi0xLjMzM2MwLTUuNTE0IDQuNDg2LTEwIDEwLTEwaDE1djIxLjMzM2gtMTV6bS0yLjUtNTIuNjY2YzAtNS41MTQgNC40ODYtMTAgMTAtMTBoNy41djIxLjMzM2gtNy41Yy01LjUxNCAwLTEwLTQuNDg2LTEwLTEwdi0xLjMzM3ptMTcuNSA5My45OTloLTcuNWMtNS41MTQgMC0xMC00LjQ4Ni0xMC0xMHYtMS4zMzNjMC01LjUxNCA0LjQ4Ni0xMCAxMC0xMGg3LjV2MjEuMzMzem0zMC43OTYgMjguODg3Yy01LjUxNCAwLTEwLTQuNDg2LTEwLTEwdi04LjI3MWg5MS40NTdjLS44NTEgNi42NjgtLjQzNyAxMi43ODcuNzMxIDE4LjI3MWgtODIuMTg4em03OS40ODItMTEzLjY5OGMtMy4xMjQgMjAuOTA2IDEyLjQyNyAzMy4xODQgMjEuNjI1IDM3LjA0IDUuNDQxIDIuOTY4IDcuNTUxIDUuNjQ3IDcuNzAxIDcuMTg4LjIxIDIuMTUtMi41NTMgNS42ODQtNC40NzcgNy4yNTEtLjQ4Mi4zNzgtLjkyOS44LTEuMzM1IDEuMjYxLTYuOTg3IDcuOTM2LTExLjk4MiAxNS41Mi0xNS40MzIgMjIuNjg4aC05Ny41NjRWMzBjMC01LjUxNCA0LjQ4Ni0xMCAxMC0xMGgxMjMuNzY5YzUuNTE0IDAgMTAgNC40ODYgMTAgMTB2MTM1LjU3OWMtMy4wMzItLjM4MS02LjE1LS42OTQtOS4zODktLjkxNC0yNS4xNTktMS42OTQtNDIuMzcgNy43NDgtNDQuODk4IDI0LjY2NnoiLz48cGF0aCBkPSJNMTc5LjEyOSA4My4xNjdoLTI0LjA2YTUgNSAwIDAgMC01IDV2MjQuMDYxYTUgNSAwIDAgMCA1IDVoMjQuMDZhNSA1IDAgMCAwIDUtNVY4OC4xNjdhNSA1IDAgMCAwLTUtNXpNMTcyLjYyOSAxNDIuODZoLTEyLjU2VjEzMC44YTUgNSAwIDEgMC0xMCAwdjE3LjA2MWE1IDUgMCAwIDAgNSA1aDE3LjU2YTUgNSAwIDEgMCAwLTEwLjAwMXpNMjE2LjU2OCA4My4xNjdoLTI0LjA2YTUgNSAwIDAgMC01IDV2MjQuMDYxYTUgNSAwIDAgMCA1IDVoMjQuMDZhNSA1IDAgMCAwIDUtNVY4OC4xNjdhNSA1IDAgMCAwLTUtNXptLTUgMjQuMDYxaC0xNC4wNlY5My4xNjdoMTQuMDZ2MTQuMDYxek0yMTEuNjY5IDEyNS45MzZIMTk3LjQxYTUgNSAwIDAgMC01IDV2MTQuMjU3YTUgNSAwIDAgMCA1IDVoMTQuMjU5YTUgNSAwIDAgMCA1LTV2LTE0LjI1N2E1IDUgMCAwIDAtNS01eiIvPjwvc3ZnPg=="; -exports.ASSET_FILE_SCAN = SVG_XML_PREFIX + "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1OS4wMTggNTkuMDE4IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1OS4wMTggNTkuMDE4IiB4bWw6c3BhY2U9InByZXNlcnZlIj48cGF0aCBkPSJtNTguNzQxIDU0LjgwOS01Ljk2OS02LjI0NGExMC43NCAxMC43NCAwIDAgMCAyLjgyLTcuMjVjMC01Ljk1My00Ljg0My0xMC43OTYtMTAuNzk2LTEwLjc5NlMzNCAzNS4zNjEgMzQgNDEuMzE0IDM4Ljg0MyA1Mi4xMSA0NC43OTYgNTIuMTFjMi40NDEgMCA0LjY4OC0uODI0IDYuNDk5LTIuMTk2bDYuMDAxIDYuMjc3YS45OTguOTk4IDAgMCAwIDEuNDE0LjAzMiAxIDEgMCAwIDAgLjAzMS0xLjQxNHpNMzYgNDEuMzE0YzAtNC44NSAzLjk0Ni04Ljc5NiA4Ljc5Ni04Ljc5NnM4Ljc5NiAzLjk0NiA4Ljc5NiA4Ljc5Ni0zLjk0NiA4Ljc5Ni04Ljc5NiA4Ljc5NlMzNiA0Ni4xNjQgMzYgNDEuMzE0ek0xMC40MzEgMTYuMDg4YzAgMy4wNyAyLjQ5OCA1LjU2OCA1LjU2OSA1LjU2OHM1LjU2OS0yLjQ5OCA1LjU2OS01LjU2OGMwLTMuMDcxLTIuNDk4LTUuNTY5LTUuNTY5LTUuNTY5cy01LjU2OSAyLjQ5OC01LjU2OSA1LjU2OXptOS4xMzggMGMwIDEuOTY4LTEuNjAyIDMuNTY4LTMuNTY5IDMuNTY4cy0zLjU2OS0xLjYwMS0zLjU2OS0zLjU2OCAxLjYwMi0zLjU2OSAzLjU2OS0zLjU2OSAzLjU2OSAxLjYwMSAzLjU2OSAzLjU2OXoiLz48cGF0aCBkPSJtMzAuODgyIDI4Ljk4NyA5LjE4LTEwLjA1NCAxMS4yNjIgMTAuMzIzYTEgMSAwIDAgMCAxLjM1MS0xLjQ3NWwtMTItMTFhMSAxIDAgMCAwLTEuNDE0LjA2M2wtOS43OTQgMTAuNzI3LTQuNzQzLTQuNzQzYTEuMDAzIDEuMDAzIDAgMCAwLTEuMzY4LS4wNDRMNi4zMzkgMzcuNzY4YTEgMSAwIDEgMCAxLjMyMiAxLjUwMWwxNi4zMTMtMTQuMzYyIDcuMzE5IDcuMzE4YS45OTkuOTk5IDAgMSAwIDEuNDE0LTEuNDE0bC0xLjgyNS0xLjgyNHoiLz48cGF0aCBkPSJNMzAgNDYuNTE4SDJ2LTQyaDU0djI4YTEgMSAwIDEgMCAyIDB2LTI5YTEgMSAwIDAgMC0xLTFIMWExIDEgMCAwIDAtMSAxdjQ0YTEgMSAwIDAgMCAxIDFoMjlhMSAxIDAgMSAwIDAtMnoiLz48L3N2Zz4="; -exports.ASSET_INFO_ICON_16PX = SVG_XML_PREFIX + "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NjAgNDYwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA0NjAgNDYwIiB4bWw6c3BhY2U9InByZXNlcnZlIj48cGF0aCBkPSJNMjMwIDBDMTAyLjk3NSAwIDAgMTAyLjk3NSAwIDIzMHMxMDIuOTc1IDIzMCAyMzAgMjMwIDIzMC0xMDIuOTc0IDIzMC0yMzBTMzU3LjAyNSAwIDIzMCAwem0zOC4zMzMgMzc3LjM2YzAgOC42NzYtNy4wMzQgMTUuNzEtMTUuNzEgMTUuNzFoLTQzLjEwMWMtOC42NzYgMC0xNS43MS03LjAzNC0xNS43MS0xNS43MVYyMDIuNDc3YzAtOC42NzYgNy4wMzMtMTUuNzEgMTUuNzEtMTUuNzFoNDMuMTAxYzguNjc2IDAgMTUuNzEgNy4wMzMgMTUuNzEgMTUuNzFWMzc3LjM2ek0yMzAgMTU3Yy0yMS41MzkgMC0zOS0xNy40NjEtMzktMzlzMTcuNDYxLTM5IDM5LTM5IDM5IDE3LjQ2MSAzOSAzOS0xNy40NjEgMzktMzkgMzl6Ii8+PC9zdmc+"; -exports.ASSET_CLOSE_ICON_16PX = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAQgAAAEIBarqQRAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAE1SURBVDiNfdI7S0NBEAXgLya1otFgpbYSbISAgpXYi6CmiH9KCAiChaVga6OiWPgfRDQ+0itaGVNosXtluWwcuMzePfM4M3sq8lbHBubwg1dc4m1E/J/N4ghDPOIsfk/4xiEao5KX0McFljN4C9d4QTPXuY99jP3DsIoDPGM6BY5i5yI5R7O4q+ImFkJY2DCh3cAH2klyB+9J1xUMMAG7eCh1a+Mr+k48b5diXrFVwwLuS+BJ9MfR7+G0FHOHhTHhnXNWS87VDF4pcnfQK4Ep7XScNLmPTZgURNKKYENYWDpzW1BhscS1WHS8CDgURFJQrWcoF3c13KKbgg1BYQfy8xZWEzTTw1QZbAoKu8FqJnktdu5hcVSHmchiILzzuaDQvjBzV2m8yohCE1jHfPx/xhU+y4G/D75ELlRJsSYAAAAASUVORK5CYII="; -//# sourceMappingURL=image-assets.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/image-assets.js.map b/node_modules/html5-qrcode/cjs/image-assets.js.map deleted file mode 100644 index 5c33243..0000000 --- a/node_modules/html5-qrcode/cjs/image-assets.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"image-assets.js","sourceRoot":"","sources":["../../src/image-assets.ts"],"names":[],"mappings":";;;AASA,IAAM,cAAc,GAAG,4BAA4B,CAAC;AAEvC,QAAA,iBAAiB,GAAW,cAAc,GAAG,82GAA82G,CAAC;AAE55G,QAAA,eAAe,GAAW,cAAc,GAAG,s8CAAs8C,CAAC;AAEl/C,QAAA,oBAAoB,GAAY,cAAc,GAAG,8oBAA8oB,CAAC;AAEhsB,QAAA,qBAAqB,GAAY,omBAAomB,CAAC"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/index.d.ts b/node_modules/html5-qrcode/cjs/index.d.ts deleted file mode 100644 index d6b90c6..0000000 --- a/node_modules/html5-qrcode/cjs/index.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { Html5Qrcode, Html5QrcodeFullConfig, Html5QrcodeCameraScanConfig } from "./html5-qrcode"; -export { Html5QrcodeScanner } from "./html5-qrcode-scanner"; -export { Html5QrcodeSupportedFormats, Html5QrcodeResult, QrcodeSuccessCallback, QrcodeErrorCallback } from "./core"; -export { Html5QrcodeScannerState } from "./state-manager"; -export { Html5QrcodeScanType } from "./core"; -export { CameraCapabilities, CameraDevice } from "./camera/core"; diff --git a/node_modules/html5-qrcode/cjs/index.js b/node_modules/html5-qrcode/cjs/index.js deleted file mode 100644 index 7afb6ce..0000000 --- a/node_modules/html5-qrcode/cjs/index.js +++ /dev/null @@ -1,14 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Html5QrcodeScanType = exports.Html5QrcodeScannerState = exports.Html5QrcodeSupportedFormats = exports.Html5QrcodeScanner = exports.Html5Qrcode = void 0; -var html5_qrcode_1 = require("./html5-qrcode"); -Object.defineProperty(exports, "Html5Qrcode", { enumerable: true, get: function () { return html5_qrcode_1.Html5Qrcode; } }); -var html5_qrcode_scanner_1 = require("./html5-qrcode-scanner"); -Object.defineProperty(exports, "Html5QrcodeScanner", { enumerable: true, get: function () { return html5_qrcode_scanner_1.Html5QrcodeScanner; } }); -var core_1 = require("./core"); -Object.defineProperty(exports, "Html5QrcodeSupportedFormats", { enumerable: true, get: function () { return core_1.Html5QrcodeSupportedFormats; } }); -var state_manager_1 = require("./state-manager"); -Object.defineProperty(exports, "Html5QrcodeScannerState", { enumerable: true, get: function () { return state_manager_1.Html5QrcodeScannerState; } }); -var core_2 = require("./core"); -Object.defineProperty(exports, "Html5QrcodeScanType", { enumerable: true, get: function () { return core_2.Html5QrcodeScanType; } }); -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/index.js.map b/node_modules/html5-qrcode/cjs/index.js.map deleted file mode 100644 index 649f5f2..0000000 --- a/node_modules/html5-qrcode/cjs/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAcA,+CAIwB;AAHpB,2GAAA,WAAW,OAAA;AAIf,+DAA4D;AAAnD,0HAAA,kBAAkB,OAAA;AAC3B,+BAKgB;AAJZ,mHAAA,2BAA2B,OAAA;AAK/B,iDAA0D;AAAjD,wHAAA,uBAAuB,OAAA;AAChC,+BAA6C;AAApC,2GAAA,mBAAmB,OAAA"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/native-bar-code-detector.d.ts b/node_modules/html5-qrcode/cjs/native-bar-code-detector.d.ts deleted file mode 100644 index 85ef95e..0000000 --- a/node_modules/html5-qrcode/cjs/native-bar-code-detector.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { QrcodeResult, Html5QrcodeSupportedFormats, QrcodeDecoderAsync, Logger } from "./core"; -export declare class BarcodeDetectorDelegate implements QrcodeDecoderAsync { - private readonly formatMap; - private readonly reverseFormatMap; - private verbose; - private logger; - private detector; - static isSupported(): boolean; - constructor(requestedFormats: Array, verbose: boolean, logger: Logger); - decodeAsync(canvas: HTMLCanvasElement): Promise; - private selectLargestBarcode; - private createBarcodeDetectorFormats; - private toHtml5QrcodeSupportedFormats; - private createReverseFormatMap; - private createDebugData; -} diff --git a/node_modules/html5-qrcode/cjs/native-bar-code-detector.js b/node_modules/html5-qrcode/cjs/native-bar-code-detector.js deleted file mode 100644 index 7892030..0000000 --- a/node_modules/html5-qrcode/cjs/native-bar-code-detector.js +++ /dev/null @@ -1,148 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (g && (g = 0, op[0] && (_ = 0)), _) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.BarcodeDetectorDelegate = void 0; -var core_1 = require("./core"); -var BarcodeDetectorDelegate = (function () { - function BarcodeDetectorDelegate(requestedFormats, verbose, logger) { - this.formatMap = new Map([ - [core_1.Html5QrcodeSupportedFormats.QR_CODE, "qr_code"], - [core_1.Html5QrcodeSupportedFormats.AZTEC, "aztec"], - [core_1.Html5QrcodeSupportedFormats.CODABAR, "codabar"], - [core_1.Html5QrcodeSupportedFormats.CODE_39, "code_39"], - [core_1.Html5QrcodeSupportedFormats.CODE_93, "code_93"], - [core_1.Html5QrcodeSupportedFormats.CODE_128, "code_128"], - [core_1.Html5QrcodeSupportedFormats.DATA_MATRIX, "data_matrix"], - [core_1.Html5QrcodeSupportedFormats.ITF, "itf"], - [core_1.Html5QrcodeSupportedFormats.EAN_13, "ean_13"], - [core_1.Html5QrcodeSupportedFormats.EAN_8, "ean_8"], - [core_1.Html5QrcodeSupportedFormats.PDF_417, "pdf417"], - [core_1.Html5QrcodeSupportedFormats.UPC_A, "upc_a"], - [core_1.Html5QrcodeSupportedFormats.UPC_E, "upc_e"] - ]); - this.reverseFormatMap = this.createReverseFormatMap(); - if (!BarcodeDetectorDelegate.isSupported()) { - throw "Use html5qrcode.min.js without edit, Use " - + "BarcodeDetectorDelegate only if it isSupported();"; - } - this.verbose = verbose; - this.logger = logger; - var formats = this.createBarcodeDetectorFormats(requestedFormats); - this.detector = new BarcodeDetector(formats); - if (!this.detector) { - throw "BarcodeDetector detector not supported"; - } - } - BarcodeDetectorDelegate.isSupported = function () { - if (!("BarcodeDetector" in window)) { - return false; - } - var dummyDetector = new BarcodeDetector({ formats: ["qr_code"] }); - return typeof dummyDetector !== "undefined"; - }; - BarcodeDetectorDelegate.prototype.decodeAsync = function (canvas) { - return __awaiter(this, void 0, void 0, function () { - var barcodes, largestBarcode; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4, this.detector.detect(canvas)]; - case 1: - barcodes = _a.sent(); - if (!barcodes || barcodes.length === 0) { - throw "No barcode or QR code detected."; - } - largestBarcode = this.selectLargestBarcode(barcodes); - return [2, { - text: largestBarcode.rawValue, - format: core_1.QrcodeResultFormat.create(this.toHtml5QrcodeSupportedFormats(largestBarcode.format)), - debugData: this.createDebugData() - }]; - } - }); - }); - }; - BarcodeDetectorDelegate.prototype.selectLargestBarcode = function (barcodes) { - var largestBarcode = null; - var maxArea = 0; - for (var _i = 0, barcodes_1 = barcodes; _i < barcodes_1.length; _i++) { - var barcode = barcodes_1[_i]; - var area = barcode.boundingBox.width * barcode.boundingBox.height; - if (area > maxArea) { - maxArea = area; - largestBarcode = barcode; - } - } - if (!largestBarcode) { - throw "No largest barcode found"; - } - return largestBarcode; - }; - BarcodeDetectorDelegate.prototype.createBarcodeDetectorFormats = function (requestedFormats) { - var formats = []; - for (var _i = 0, requestedFormats_1 = requestedFormats; _i < requestedFormats_1.length; _i++) { - var requestedFormat = requestedFormats_1[_i]; - if (this.formatMap.has(requestedFormat)) { - formats.push(this.formatMap.get(requestedFormat)); - } - else { - this.logger.warn("".concat(requestedFormat, " is not supported by") - + "BarcodeDetectorDelegate"); - } - } - return { formats: formats }; - }; - BarcodeDetectorDelegate.prototype.toHtml5QrcodeSupportedFormats = function (barcodeDetectorFormat) { - if (!this.reverseFormatMap.has(barcodeDetectorFormat)) { - throw "reverseFormatMap doesn't have ".concat(barcodeDetectorFormat); - } - return this.reverseFormatMap.get(barcodeDetectorFormat); - }; - BarcodeDetectorDelegate.prototype.createReverseFormatMap = function () { - var result = new Map(); - this.formatMap.forEach(function (value, key, _) { - result.set(value, key); - }); - return result; - }; - BarcodeDetectorDelegate.prototype.createDebugData = function () { - return { decoderName: "BarcodeDetector" }; - }; - return BarcodeDetectorDelegate; -}()); -exports.BarcodeDetectorDelegate = BarcodeDetectorDelegate; -//# sourceMappingURL=native-bar-code-detector.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/native-bar-code-detector.js.map b/node_modules/html5-qrcode/cjs/native-bar-code-detector.js.map deleted file mode 100644 index 824651d..0000000 --- a/node_modules/html5-qrcode/cjs/native-bar-code-detector.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"native-bar-code-detector.js","sourceRoot":"","sources":["../../src/native-bar-code-detector.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,+BAOgB;AA4Cf;IA4CG,iCACI,gBAAoD,EACpD,OAAgB,EAChB,MAAc;QA3CD,cAAS,GACpB,IAAI,GAAG,CAAC;YACN,CAAE,kCAA2B,CAAC,OAAO,EAAE,SAAS,CAAE;YAClD,CAAE,kCAA2B,CAAC,KAAK,EAAE,OAAO,CAAE;YAC9C,CAAE,kCAA2B,CAAC,OAAO,EAAE,SAAS,CAAE;YAClD,CAAE,kCAA2B,CAAC,OAAO,EAAE,SAAS,CAAE;YAClD,CAAE,kCAA2B,CAAC,OAAO,EAAE,SAAS,CAAE;YAClD,CAAE,kCAA2B,CAAC,QAAQ,EAAE,UAAU,CAAE;YACpD,CAAE,kCAA2B,CAAC,WAAW,EAAG,aAAa,CAAE;YAC3D,CAAE,kCAA2B,CAAC,GAAG,EAAE,KAAK,CAAE;YAC1C,CAAE,kCAA2B,CAAC,MAAM,EAAE,QAAQ,CAAE;YAChD,CAAE,kCAA2B,CAAC,KAAK,EAAE,OAAO,CAAE;YAC9C,CAAE,kCAA2B,CAAC,OAAO,EAAE,QAAQ,CAAE;YACjD,CAAE,kCAA2B,CAAC,KAAK,EAAE,OAAO,CAAE;YAC9C,CAAE,kCAA2B,CAAC,KAAK,EAAE,OAAO,CAAE;SACjD,CAAC,CAAC;QACU,qBAAgB,GAC3B,IAAI,CAAC,sBAAsB,EAAE,CAAC;QA2BhC,IAAI,CAAC,uBAAuB,CAAC,WAAW,EAAE,EAAE;YACxC,MAAM,2CAA2C;kBAC3C,mDAAmD,CAAC;SAC7D;QACD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAGrB,IAAM,OAAO,GAAG,IAAI,CAAC,4BAA4B,CAAC,gBAAgB,CAAC,CAAC;QACpE,IAAI,CAAC,QAAQ,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;QAG7C,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAChB,MAAM,wCAAwC,CAAC;SAClD;IACL,CAAC;IA3Ba,mCAAW,GAAzB;QACI,IAAI,CAAC,CAAC,iBAAiB,IAAI,MAAM,CAAC,EAAE;YAChC,OAAO,KAAK,CAAC;SAChB;QACD,IAAM,aAAa,GAAG,IAAI,eAAe,CAAC,EAAC,OAAO,EAAE,CAAE,SAAS,CAAE,EAAC,CAAC,CAAC;QACpE,OAAO,OAAO,aAAa,KAAK,WAAW,CAAC;IAChD,CAAC;IAuBK,6CAAW,GAAjB,UAAkB,MAAyB;;;;;4BAEjC,WAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAA;;wBADlC,QAAQ,GACR,SAAkC;wBACxC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;4BACpC,MAAM,iCAAiC,CAAC;yBAC3C;wBAOG,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;wBACzD,WAAO;gCACH,IAAI,EAAE,cAAc,CAAC,QAAQ;gCAC7B,MAAM,EAAE,yBAAkB,CAAC,MAAM,CAC7B,IAAI,CAAC,6BAA6B,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;gCAC9D,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE;6BACpC,EAAC;;;;KACL;IAEO,sDAAoB,GAA5B,UAA6B,QAAsC;QAE/D,IAAI,cAAc,GAAiC,IAAI,CAAC;QACxD,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAoB,UAAQ,EAAR,qBAAQ,EAAR,sBAAQ,EAAR,IAAQ,EAAE;YAAzB,IAAI,OAAO,iBAAA;YACZ,IAAI,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC;YAClE,IAAI,IAAI,GAAG,OAAO,EAAE;gBAChB,OAAO,GAAG,IAAI,CAAC;gBACf,cAAc,GAAG,OAAO,CAAC;aAC5B;SACJ;QACD,IAAI,CAAC,cAAc,EAAE;YACjB,MAAM,0BAA0B,CAAC;SACpC;QACD,OAAO,cAAe,CAAC;IAC3B,CAAC;IAEO,8DAA4B,GAApC,UACI,gBAAoD;QAEhD,IAAI,OAAO,GAAkB,EAAE,CAAC;QAChC,KAA8B,UAAgB,EAAhB,qCAAgB,EAAhB,8BAAgB,EAAhB,IAAgB,EAAE;YAA3C,IAAM,eAAe,yBAAA;YACtB,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE;gBACrC,OAAO,CAAC,IAAI,CACR,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAE,CAAC,CAAC;aAC7C;iBAAM;gBACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAG,eAAe,yBAAsB;sBACnD,yBAAyB,CAAC,CAAC;aACpC;SACJ;QACD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IACpC,CAAC;IAEO,+DAA6B,GAArC,UAAsC,qBAA6B;QAE/D,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE;YACnD,MAAM,wCAAiC,qBAAqB,CAAE,CAAC;SAClE;QACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,qBAAqB,CAAE,CAAC;IAC7D,CAAC;IAEO,wDAAsB,GAA9B;QACI,IAAI,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,SAAS,CAAC,OAAO,CAClB,UAAC,KAAa,EAAE,GAAgC,EAAE,CAAC;YACnD,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAClB,CAAC;IAEO,iDAAe,GAAvB;QACI,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC;IAC9C,CAAC;IACL,8BAAC;AAAD,CAAC,AA3IA,IA2IA;AA3Ia,0DAAuB"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/state-manager.d.ts b/node_modules/html5-qrcode/cjs/state-manager.d.ts deleted file mode 100644 index 1c740bb..0000000 --- a/node_modules/html5-qrcode/cjs/state-manager.d.ts +++ /dev/null @@ -1,29 +0,0 @@ -export declare enum Html5QrcodeScannerState { - UNKNOWN = 0, - NOT_STARTED = 1, - SCANNING = 2, - PAUSED = 3 -} -export interface StateManagerTransaction { - execute(): void; - cancel(): void; -} -export interface StateManager { - startTransition(newState: Html5QrcodeScannerState): StateManagerTransaction; - directTransition(newState: Html5QrcodeScannerState): void; - getState(): Html5QrcodeScannerState; -} -export declare class StateManagerProxy { - private stateManager; - constructor(stateManager: StateManager); - startTransition(newState: Html5QrcodeScannerState): StateManagerTransaction; - directTransition(newState: Html5QrcodeScannerState): void; - getState(): Html5QrcodeScannerState; - canScanFile(): boolean; - isScanning(): boolean; - isStrictlyScanning(): boolean; - isPaused(): boolean; -} -export declare class StateManagerFactory { - static create(): StateManagerProxy; -} diff --git a/node_modules/html5-qrcode/cjs/state-manager.js b/node_modules/html5-qrcode/cjs/state-manager.js deleted file mode 100644 index a89a9c6..0000000 --- a/node_modules/html5-qrcode/cjs/state-manager.js +++ /dev/null @@ -1,112 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.StateManagerFactory = exports.StateManagerProxy = exports.Html5QrcodeScannerState = void 0; -var Html5QrcodeScannerState; -(function (Html5QrcodeScannerState) { - Html5QrcodeScannerState[Html5QrcodeScannerState["UNKNOWN"] = 0] = "UNKNOWN"; - Html5QrcodeScannerState[Html5QrcodeScannerState["NOT_STARTED"] = 1] = "NOT_STARTED"; - Html5QrcodeScannerState[Html5QrcodeScannerState["SCANNING"] = 2] = "SCANNING"; - Html5QrcodeScannerState[Html5QrcodeScannerState["PAUSED"] = 3] = "PAUSED"; -})(Html5QrcodeScannerState = exports.Html5QrcodeScannerState || (exports.Html5QrcodeScannerState = {})); -var StateManagerImpl = (function () { - function StateManagerImpl() { - this.state = Html5QrcodeScannerState.NOT_STARTED; - this.onGoingTransactionNewState = Html5QrcodeScannerState.UNKNOWN; - } - StateManagerImpl.prototype.directTransition = function (newState) { - this.failIfTransitionOngoing(); - this.validateTransition(newState); - this.state = newState; - }; - StateManagerImpl.prototype.startTransition = function (newState) { - this.failIfTransitionOngoing(); - this.validateTransition(newState); - this.onGoingTransactionNewState = newState; - return this; - }; - StateManagerImpl.prototype.execute = function () { - if (this.onGoingTransactionNewState - === Html5QrcodeScannerState.UNKNOWN) { - throw "Transaction is already cancelled, cannot execute()."; - } - var tempNewState = this.onGoingTransactionNewState; - this.onGoingTransactionNewState = Html5QrcodeScannerState.UNKNOWN; - this.directTransition(tempNewState); - }; - StateManagerImpl.prototype.cancel = function () { - if (this.onGoingTransactionNewState - === Html5QrcodeScannerState.UNKNOWN) { - throw "Transaction is already cancelled, cannot cancel()."; - } - this.onGoingTransactionNewState = Html5QrcodeScannerState.UNKNOWN; - }; - StateManagerImpl.prototype.getState = function () { - return this.state; - }; - StateManagerImpl.prototype.failIfTransitionOngoing = function () { - if (this.onGoingTransactionNewState - !== Html5QrcodeScannerState.UNKNOWN) { - throw "Cannot transition to a new state, already under transition"; - } - }; - StateManagerImpl.prototype.validateTransition = function (newState) { - switch (this.state) { - case Html5QrcodeScannerState.UNKNOWN: - throw "Transition from unknown is not allowed"; - case Html5QrcodeScannerState.NOT_STARTED: - this.failIfNewStateIs(newState, [Html5QrcodeScannerState.PAUSED]); - break; - case Html5QrcodeScannerState.SCANNING: - break; - case Html5QrcodeScannerState.PAUSED: - break; - } - }; - StateManagerImpl.prototype.failIfNewStateIs = function (newState, disallowedStatesToTransition) { - for (var _i = 0, disallowedStatesToTransition_1 = disallowedStatesToTransition; _i < disallowedStatesToTransition_1.length; _i++) { - var disallowedState = disallowedStatesToTransition_1[_i]; - if (newState === disallowedState) { - throw "Cannot transition from ".concat(this.state, " to ").concat(newState); - } - } - }; - return StateManagerImpl; -}()); -var StateManagerProxy = (function () { - function StateManagerProxy(stateManager) { - this.stateManager = stateManager; - } - StateManagerProxy.prototype.startTransition = function (newState) { - return this.stateManager.startTransition(newState); - }; - StateManagerProxy.prototype.directTransition = function (newState) { - this.stateManager.directTransition(newState); - }; - StateManagerProxy.prototype.getState = function () { - return this.stateManager.getState(); - }; - StateManagerProxy.prototype.canScanFile = function () { - return this.stateManager.getState() === Html5QrcodeScannerState.NOT_STARTED; - }; - StateManagerProxy.prototype.isScanning = function () { - return this.stateManager.getState() !== Html5QrcodeScannerState.NOT_STARTED; - }; - StateManagerProxy.prototype.isStrictlyScanning = function () { - return this.stateManager.getState() === Html5QrcodeScannerState.SCANNING; - }; - StateManagerProxy.prototype.isPaused = function () { - return this.stateManager.getState() === Html5QrcodeScannerState.PAUSED; - }; - return StateManagerProxy; -}()); -exports.StateManagerProxy = StateManagerProxy; -var StateManagerFactory = (function () { - function StateManagerFactory() { - } - StateManagerFactory.create = function () { - return new StateManagerProxy(new StateManagerImpl()); - }; - return StateManagerFactory; -}()); -exports.StateManagerFactory = StateManagerFactory; -//# sourceMappingURL=state-manager.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/state-manager.js.map b/node_modules/html5-qrcode/cjs/state-manager.js.map deleted file mode 100644 index 7cddf8a..0000000 --- a/node_modules/html5-qrcode/cjs/state-manager.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"state-manager.js","sourceRoot":"","sources":["../../src/state-manager.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/storage.d.ts b/node_modules/html5-qrcode/cjs/storage.d.ts deleted file mode 100644 index cae73a3..0000000 --- a/node_modules/html5-qrcode/cjs/storage.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -export declare class PersistedDataManager { - private data; - private static LOCAL_STORAGE_KEY; - constructor(); - hasCameraPermissions(): boolean; - getLastUsedCameraId(): string | null; - setHasPermission(hasPermission: boolean): void; - setLastUsedCameraId(lastUsedCameraId: string): void; - resetLastUsedCameraId(): void; - reset(): void; - private flush; -} diff --git a/node_modules/html5-qrcode/cjs/storage.js b/node_modules/html5-qrcode/cjs/storage.js deleted file mode 100644 index ba59389..0000000 --- a/node_modules/html5-qrcode/cjs/storage.js +++ /dev/null @@ -1,55 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.PersistedDataManager = void 0; -var PersistedDataFactory = (function () { - function PersistedDataFactory() { - } - PersistedDataFactory.createDefault = function () { - return { - hasPermission: false, - lastUsedCameraId: null - }; - }; - return PersistedDataFactory; -}()); -var PersistedDataManager = (function () { - function PersistedDataManager() { - this.data = PersistedDataFactory.createDefault(); - var data = localStorage.getItem(PersistedDataManager.LOCAL_STORAGE_KEY); - if (!data) { - this.reset(); - } - else { - this.data = JSON.parse(data); - } - } - PersistedDataManager.prototype.hasCameraPermissions = function () { - return this.data.hasPermission; - }; - PersistedDataManager.prototype.getLastUsedCameraId = function () { - return this.data.lastUsedCameraId; - }; - PersistedDataManager.prototype.setHasPermission = function (hasPermission) { - this.data.hasPermission = hasPermission; - this.flush(); - }; - PersistedDataManager.prototype.setLastUsedCameraId = function (lastUsedCameraId) { - this.data.lastUsedCameraId = lastUsedCameraId; - this.flush(); - }; - PersistedDataManager.prototype.resetLastUsedCameraId = function () { - this.data.lastUsedCameraId = null; - this.flush(); - }; - PersistedDataManager.prototype.reset = function () { - this.data = PersistedDataFactory.createDefault(); - this.flush(); - }; - PersistedDataManager.prototype.flush = function () { - localStorage.setItem(PersistedDataManager.LOCAL_STORAGE_KEY, JSON.stringify(this.data)); - }; - PersistedDataManager.LOCAL_STORAGE_KEY = "HTML5_QRCODE_DATA"; - return PersistedDataManager; -}()); -exports.PersistedDataManager = PersistedDataManager; -//# sourceMappingURL=storage.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/storage.js.map b/node_modules/html5-qrcode/cjs/storage.js.map deleted file mode 100644 index aeda3f0..0000000 --- a/node_modules/html5-qrcode/cjs/storage.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/storage.ts"],"names":[],"mappings":";;;AAeA;IAAA;IAOA,CAAC;IANU,kCAAa,GAApB;QACI,OAAO;YACH,aAAa,EAAE,KAAK;YACpB,gBAAgB,EAAE,IAAI;SACzB,CAAC;IACN,CAAC;IACL,2BAAC;AAAD,CAAC,AAPD,IAOC;AAED;IAKI;QAHQ,SAAI,GAAkB,oBAAoB,CAAC,aAAa,EAAE,CAAC;QAI/D,IAAI,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;QACxE,IAAI,CAAC,IAAI,EAAE;YACP,IAAI,CAAC,KAAK,EAAE,CAAC;SAChB;aAAM;YACH,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SAChC;IACL,CAAC;IAEM,mDAAoB,GAA3B;QACI,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;IACnC,CAAC;IAEM,kDAAmB,GAA1B;QACI,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC;IACtC,CAAC;IAEM,+CAAgB,GAAvB,UAAwB,aAAsB;QAC1C,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACxC,IAAI,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;IAEM,kDAAmB,GAA1B,UAA2B,gBAAwB;QAC/C,IAAI,CAAC,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;IAEM,oDAAqB,GAA5B;QACI,IAAI,CAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAClC,IAAI,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;IAEM,oCAAK,GAAZ;QACI,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC,aAAa,EAAE,CAAC;QACjD,IAAI,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;IAEO,oCAAK,GAAb;QACI,YAAY,CAAC,OAAO,CAChB,oBAAoB,CAAC,iBAAiB,EACtC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACnC,CAAC;IA3Cc,sCAAiB,GAAW,mBAAmB,CAAC;IA4CnE,2BAAC;CAAA,AA/CD,IA+CC;AA/CY,oDAAoB"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/strings.d.ts b/node_modules/html5-qrcode/cjs/strings.d.ts deleted file mode 100644 index bb99f90..0000000 --- a/node_modules/html5-qrcode/cjs/strings.d.ts +++ /dev/null @@ -1,45 +0,0 @@ -export declare class Html5QrcodeStrings { - static codeParseError(exception: any): string; - static errorGettingUserMedia(error: any): string; - static onlyDeviceSupportedError(): string; - static cameraStreamingNotSupported(): string; - static unableToQuerySupportedDevices(): string; - static insecureContextCameraQueryError(): string; - static scannerPaused(): string; -} -export declare class Html5QrcodeScannerStrings { - static scanningStatus(): string; - static idleStatus(): string; - static errorStatus(): string; - static permissionStatus(): string; - static noCameraFoundErrorStatus(): string; - static lastMatch(decodedText: string): string; - static codeScannerTitle(): string; - static cameraPermissionTitle(): string; - static cameraPermissionRequesting(): string; - static noCameraFound(): string; - static scanButtonStopScanningText(): string; - static scanButtonStartScanningText(): string; - static torchOnButton(): string; - static torchOffButton(): string; - static torchOnFailedMessage(): string; - static torchOffFailedMessage(): string; - static scanButtonScanningStarting(): string; - static textIfCameraScanSelected(): string; - static textIfFileScanSelected(): string; - static selectCamera(): string; - static fileSelectionChooseImage(): string; - static fileSelectionChooseAnother(): string; - static fileSelectionNoImageSelected(): string; - static anonymousCameraPrefix(): string; - static dragAndDropMessage(): string; - static dragAndDropMessageOnlyImages(): string; - static zoom(): string; - static loadingImage(): string; - static cameraScanAltText(): string; - static fileScanAltText(): string; -} -export declare class LibraryInfoStrings { - static poweredBy(): string; - static reportIssues(): string; -} diff --git a/node_modules/html5-qrcode/cjs/strings.js b/node_modules/html5-qrcode/cjs/strings.js deleted file mode 100644 index 97bfbf5..0000000 --- a/node_modules/html5-qrcode/cjs/strings.js +++ /dev/null @@ -1,142 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.LibraryInfoStrings = exports.Html5QrcodeScannerStrings = exports.Html5QrcodeStrings = void 0; -var Html5QrcodeStrings = (function () { - function Html5QrcodeStrings() { - } - Html5QrcodeStrings.codeParseError = function (exception) { - return "QR code parse error, error = ".concat(exception); - }; - Html5QrcodeStrings.errorGettingUserMedia = function (error) { - return "Error getting userMedia, error = ".concat(error); - }; - Html5QrcodeStrings.onlyDeviceSupportedError = function () { - return "The device doesn't support navigator.mediaDevices , only " - + "supported cameraIdOrConfig in this case is deviceId parameter " - + "(string)."; - }; - Html5QrcodeStrings.cameraStreamingNotSupported = function () { - return "Camera streaming not supported by the browser."; - }; - Html5QrcodeStrings.unableToQuerySupportedDevices = function () { - return "Unable to query supported devices, unknown error."; - }; - Html5QrcodeStrings.insecureContextCameraQueryError = function () { - return "Camera access is only supported in secure context like https " - + "or localhost."; - }; - Html5QrcodeStrings.scannerPaused = function () { - return "Scanner paused"; - }; - return Html5QrcodeStrings; -}()); -exports.Html5QrcodeStrings = Html5QrcodeStrings; -var Html5QrcodeScannerStrings = (function () { - function Html5QrcodeScannerStrings() { - } - Html5QrcodeScannerStrings.scanningStatus = function () { - return "Scanning"; - }; - Html5QrcodeScannerStrings.idleStatus = function () { - return "Idle"; - }; - Html5QrcodeScannerStrings.errorStatus = function () { - return "Error"; - }; - Html5QrcodeScannerStrings.permissionStatus = function () { - return "Permission"; - }; - Html5QrcodeScannerStrings.noCameraFoundErrorStatus = function () { - return "No Cameras"; - }; - Html5QrcodeScannerStrings.lastMatch = function (decodedText) { - return "Last Match: ".concat(decodedText); - }; - Html5QrcodeScannerStrings.codeScannerTitle = function () { - return "Code Scanner"; - }; - Html5QrcodeScannerStrings.cameraPermissionTitle = function () { - return "Request Camera Permissions"; - }; - Html5QrcodeScannerStrings.cameraPermissionRequesting = function () { - return "Requesting camera permissions..."; - }; - Html5QrcodeScannerStrings.noCameraFound = function () { - return "No camera found"; - }; - Html5QrcodeScannerStrings.scanButtonStopScanningText = function () { - return "Stop Scanning"; - }; - Html5QrcodeScannerStrings.scanButtonStartScanningText = function () { - return "Start Scanning"; - }; - Html5QrcodeScannerStrings.torchOnButton = function () { - return "Switch On Torch"; - }; - Html5QrcodeScannerStrings.torchOffButton = function () { - return "Switch Off Torch"; - }; - Html5QrcodeScannerStrings.torchOnFailedMessage = function () { - return "Failed to turn on torch"; - }; - Html5QrcodeScannerStrings.torchOffFailedMessage = function () { - return "Failed to turn off torch"; - }; - Html5QrcodeScannerStrings.scanButtonScanningStarting = function () { - return "Launching Camera..."; - }; - Html5QrcodeScannerStrings.textIfCameraScanSelected = function () { - return "Scan an Image File"; - }; - Html5QrcodeScannerStrings.textIfFileScanSelected = function () { - return "Scan using camera directly"; - }; - Html5QrcodeScannerStrings.selectCamera = function () { - return "Select Camera"; - }; - Html5QrcodeScannerStrings.fileSelectionChooseImage = function () { - return "Choose Image"; - }; - Html5QrcodeScannerStrings.fileSelectionChooseAnother = function () { - return "Choose Another"; - }; - Html5QrcodeScannerStrings.fileSelectionNoImageSelected = function () { - return "No image choosen"; - }; - Html5QrcodeScannerStrings.anonymousCameraPrefix = function () { - return "Anonymous Camera"; - }; - Html5QrcodeScannerStrings.dragAndDropMessage = function () { - return "Or drop an image to scan"; - }; - Html5QrcodeScannerStrings.dragAndDropMessageOnlyImages = function () { - return "Or drop an image to scan (other files not supported)"; - }; - Html5QrcodeScannerStrings.zoom = function () { - return "zoom"; - }; - Html5QrcodeScannerStrings.loadingImage = function () { - return "Loading image..."; - }; - Html5QrcodeScannerStrings.cameraScanAltText = function () { - return "Camera based scan"; - }; - Html5QrcodeScannerStrings.fileScanAltText = function () { - return "Fule based scan"; - }; - return Html5QrcodeScannerStrings; -}()); -exports.Html5QrcodeScannerStrings = Html5QrcodeScannerStrings; -var LibraryInfoStrings = (function () { - function LibraryInfoStrings() { - } - LibraryInfoStrings.poweredBy = function () { - return "Powered by "; - }; - LibraryInfoStrings.reportIssues = function () { - return "Report issues"; - }; - return LibraryInfoStrings; -}()); -exports.LibraryInfoStrings = LibraryInfoStrings; -//# sourceMappingURL=strings.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/strings.js.map b/node_modules/html5-qrcode/cjs/strings.js.map deleted file mode 100644 index ff51b44..0000000 --- a/node_modules/html5-qrcode/cjs/strings.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"strings.js","sourceRoot":"","sources":["../../src/strings.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/ui.d.ts b/node_modules/html5-qrcode/cjs/ui.d.ts deleted file mode 100644 index 5f03fe9..0000000 --- a/node_modules/html5-qrcode/cjs/ui.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -export declare class LibraryInfoContainer { - private infoDiv; - private infoIcon; - constructor(); - renderInto(parent: HTMLElement): void; -} diff --git a/node_modules/html5-qrcode/cjs/ui.js b/node_modules/html5-qrcode/cjs/ui.js deleted file mode 100644 index a4c4d32..0000000 --- a/node_modules/html5-qrcode/cjs/ui.js +++ /dev/null @@ -1,118 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.LibraryInfoContainer = void 0; -var image_assets_1 = require("./image-assets"); -var strings_1 = require("./strings"); -var LibraryInfoDiv = (function () { - function LibraryInfoDiv() { - this.infoDiv = document.createElement("div"); - } - LibraryInfoDiv.prototype.renderInto = function (parent) { - this.infoDiv.style.position = "absolute"; - this.infoDiv.style.top = "10px"; - this.infoDiv.style.right = "10px"; - this.infoDiv.style.zIndex = "2"; - this.infoDiv.style.display = "none"; - this.infoDiv.style.padding = "5pt"; - this.infoDiv.style.border = "1px solid #171717"; - this.infoDiv.style.fontSize = "10pt"; - this.infoDiv.style.background = "rgb(0 0 0 / 69%)"; - this.infoDiv.style.borderRadius = "5px"; - this.infoDiv.style.textAlign = "center"; - this.infoDiv.style.fontWeight = "400"; - this.infoDiv.style.color = "white"; - this.infoDiv.innerText = strings_1.LibraryInfoStrings.poweredBy(); - var projectLink = document.createElement("a"); - projectLink.innerText = "ScanApp"; - projectLink.href = "https://scanapp.org"; - projectLink.target = "new"; - projectLink.style.color = "white"; - this.infoDiv.appendChild(projectLink); - var breakElemFirst = document.createElement("br"); - var breakElemSecond = document.createElement("br"); - this.infoDiv.appendChild(breakElemFirst); - this.infoDiv.appendChild(breakElemSecond); - var reportIssueLink = document.createElement("a"); - reportIssueLink.innerText = strings_1.LibraryInfoStrings.reportIssues(); - reportIssueLink.href = "https://github.com/mebjas/html5-qrcode/issues"; - reportIssueLink.target = "new"; - reportIssueLink.style.color = "white"; - this.infoDiv.appendChild(reportIssueLink); - parent.appendChild(this.infoDiv); - }; - LibraryInfoDiv.prototype.show = function () { - this.infoDiv.style.display = "block"; - }; - LibraryInfoDiv.prototype.hide = function () { - this.infoDiv.style.display = "none"; - }; - return LibraryInfoDiv; -}()); -var LibraryInfoIcon = (function () { - function LibraryInfoIcon(onTapIn, onTapOut) { - this.isShowingInfoIcon = true; - this.onTapIn = onTapIn; - this.onTapOut = onTapOut; - this.infoIcon = document.createElement("img"); - } - LibraryInfoIcon.prototype.renderInto = function (parent) { - var _this = this; - this.infoIcon.alt = "Info icon"; - this.infoIcon.src = image_assets_1.ASSET_INFO_ICON_16PX; - this.infoIcon.style.position = "absolute"; - this.infoIcon.style.top = "4px"; - this.infoIcon.style.right = "4px"; - this.infoIcon.style.opacity = "0.6"; - this.infoIcon.style.cursor = "pointer"; - this.infoIcon.style.zIndex = "2"; - this.infoIcon.style.width = "16px"; - this.infoIcon.style.height = "16px"; - this.infoIcon.onmouseover = function (_) { return _this.onHoverIn(); }; - this.infoIcon.onmouseout = function (_) { return _this.onHoverOut(); }; - this.infoIcon.onclick = function (_) { return _this.onClick(); }; - parent.appendChild(this.infoIcon); - }; - LibraryInfoIcon.prototype.onHoverIn = function () { - if (this.isShowingInfoIcon) { - this.infoIcon.style.opacity = "1"; - } - }; - LibraryInfoIcon.prototype.onHoverOut = function () { - if (this.isShowingInfoIcon) { - this.infoIcon.style.opacity = "0.6"; - } - }; - LibraryInfoIcon.prototype.onClick = function () { - if (this.isShowingInfoIcon) { - this.isShowingInfoIcon = false; - this.onTapIn(); - this.infoIcon.src = image_assets_1.ASSET_CLOSE_ICON_16PX; - this.infoIcon.style.opacity = "1"; - } - else { - this.isShowingInfoIcon = true; - this.onTapOut(); - this.infoIcon.src = image_assets_1.ASSET_INFO_ICON_16PX; - this.infoIcon.style.opacity = "0.6"; - } - }; - return LibraryInfoIcon; -}()); -var LibraryInfoContainer = (function () { - function LibraryInfoContainer() { - var _this = this; - this.infoDiv = new LibraryInfoDiv(); - this.infoIcon = new LibraryInfoIcon(function () { - _this.infoDiv.show(); - }, function () { - _this.infoDiv.hide(); - }); - } - LibraryInfoContainer.prototype.renderInto = function (parent) { - this.infoDiv.renderInto(parent); - this.infoIcon.renderInto(parent); - }; - return LibraryInfoContainer; -}()); -exports.LibraryInfoContainer = LibraryInfoContainer; -//# sourceMappingURL=ui.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/ui.js.map b/node_modules/html5-qrcode/cjs/ui.js.map deleted file mode 100644 index 31868f4..0000000 --- a/node_modules/html5-qrcode/cjs/ui.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/ui.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/ui/scanner/base.d.ts b/node_modules/html5-qrcode/cjs/ui/scanner/base.d.ts deleted file mode 100644 index 1f6ba9c..0000000 --- a/node_modules/html5-qrcode/cjs/ui/scanner/base.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -export declare class PublicUiElementIdAndClasses { - static ALL_ELEMENT_CLASS: string; - static CAMERA_PERMISSION_BUTTON_ID: string; - static CAMERA_START_BUTTON_ID: string; - static CAMERA_STOP_BUTTON_ID: string; - static TORCH_BUTTON_ID: string; - static CAMERA_SELECTION_SELECT_ID: string; - static FILE_SELECTION_BUTTON_ID: string; - static ZOOM_SLIDER_ID: string; - static SCAN_TYPE_CHANGE_ANCHOR_ID: string; - static TORCH_BUTTON_CLASS_TORCH_ON: string; - static TORCH_BUTTON_CLASS_TORCH_OFF: string; -} -export declare class BaseUiElementFactory { - static createElement(elementType: string, elementId: string): Type; -} diff --git a/node_modules/html5-qrcode/cjs/ui/scanner/base.js b/node_modules/html5-qrcode/cjs/ui/scanner/base.js deleted file mode 100644 index bcdabfc..0000000 --- a/node_modules/html5-qrcode/cjs/ui/scanner/base.js +++ /dev/null @@ -1,36 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.BaseUiElementFactory = exports.PublicUiElementIdAndClasses = void 0; -var PublicUiElementIdAndClasses = (function () { - function PublicUiElementIdAndClasses() { - } - PublicUiElementIdAndClasses.ALL_ELEMENT_CLASS = "html5-qrcode-element"; - PublicUiElementIdAndClasses.CAMERA_PERMISSION_BUTTON_ID = "html5-qrcode-button-camera-permission"; - PublicUiElementIdAndClasses.CAMERA_START_BUTTON_ID = "html5-qrcode-button-camera-start"; - PublicUiElementIdAndClasses.CAMERA_STOP_BUTTON_ID = "html5-qrcode-button-camera-stop"; - PublicUiElementIdAndClasses.TORCH_BUTTON_ID = "html5-qrcode-button-torch"; - PublicUiElementIdAndClasses.CAMERA_SELECTION_SELECT_ID = "html5-qrcode-select-camera"; - PublicUiElementIdAndClasses.FILE_SELECTION_BUTTON_ID = "html5-qrcode-button-file-selection"; - PublicUiElementIdAndClasses.ZOOM_SLIDER_ID = "html5-qrcode-input-range-zoom"; - PublicUiElementIdAndClasses.SCAN_TYPE_CHANGE_ANCHOR_ID = "html5-qrcode-anchor-scan-type-change"; - PublicUiElementIdAndClasses.TORCH_BUTTON_CLASS_TORCH_ON = "html5-qrcode-button-torch-on"; - PublicUiElementIdAndClasses.TORCH_BUTTON_CLASS_TORCH_OFF = "html5-qrcode-button-torch-off"; - return PublicUiElementIdAndClasses; -}()); -exports.PublicUiElementIdAndClasses = PublicUiElementIdAndClasses; -var BaseUiElementFactory = (function () { - function BaseUiElementFactory() { - } - BaseUiElementFactory.createElement = function (elementType, elementId) { - var element = (document.createElement(elementType)); - element.id = elementId; - element.classList.add(PublicUiElementIdAndClasses.ALL_ELEMENT_CLASS); - if (elementType === "button") { - element.setAttribute("type", "button"); - } - return element; - }; - return BaseUiElementFactory; -}()); -exports.BaseUiElementFactory = BaseUiElementFactory; -//# sourceMappingURL=base.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/ui/scanner/base.js.map b/node_modules/html5-qrcode/cjs/ui/scanner/base.js.map deleted file mode 100644 index 436f8c4..0000000 --- a/node_modules/html5-qrcode/cjs/ui/scanner/base.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../src/ui/scanner/base.ts"],"names":[],"mappings":";;;AAcA;IAAA;IA4CA,CAAC;IAxCU,6CAAiB,GAAG,sBAAsB,CAAC;IAG3C,uDAA2B,GAAG,uCAAuC,CAAC;IAGtE,kDAAsB,GAAG,kCAAkC,CAAC;IAG5D,iDAAqB,GAAG,iCAAiC,CAAC;IAG1D,2CAAe,GAAG,2BAA2B,CAAC;IAG9C,sDAA0B,GAAG,4BAA4B,CAAC;IAG1D,oDAAwB,GAAG,oCAAoC,CAAC;IAGhE,0CAAc,GAAG,+BAA+B,CAAC;IAMjD,sDAA0B,GAAG,sCAAsC,CAAC;IAOpE,uDAA2B,GAAG,8BAA8B,CAAC;IAG7D,wDAA4B,GAAG,+BAA+B,CAAC;IAG1E,kCAAC;CAAA,AA5CD,IA4CC;AA5CY,kEAA2B;AAiDxC;IAAA;IAiBA,CAAC;IAXiB,kCAAa,GAA3B,UACI,WAAmB,EAAE,SAAiB;QAEtC,IAAI,OAAO,GAAe,CAAC,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC;QACvB,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,2BAA2B,CAAC,iBAAiB,CAAC,CAAC;QACrE,IAAI,WAAW,KAAK,QAAQ,EAAE;YAC1B,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;SAC1C;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IACL,2BAAC;AAAD,CAAC,AAjBD,IAiBC;AAjBY,oDAAoB"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/ui/scanner/camera-selection-ui.d.ts b/node_modules/html5-qrcode/cjs/ui/scanner/camera-selection-ui.d.ts deleted file mode 100644 index 2090ed5..0000000 --- a/node_modules/html5-qrcode/cjs/ui/scanner/camera-selection-ui.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { CameraDevice } from "../../camera/core"; -export declare class CameraSelectionUi { - private readonly selectElement; - private readonly options; - private readonly cameras; - private constructor(); - private render; - disable(): void; - isDisabled(): boolean; - enable(): void; - getValue(): string; - hasValue(value: string): boolean; - setValue(value: string): void; - hasSingleItem(): boolean; - numCameras(): number; - static create(parentElement: HTMLElement, cameras: Array): CameraSelectionUi; -} diff --git a/node_modules/html5-qrcode/cjs/ui/scanner/camera-selection-ui.js b/node_modules/html5-qrcode/cjs/ui/scanner/camera-selection-ui.js deleted file mode 100644 index 3c9a9d9..0000000 --- a/node_modules/html5-qrcode/cjs/ui/scanner/camera-selection-ui.js +++ /dev/null @@ -1,89 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.CameraSelectionUi = void 0; -var base_1 = require("./base"); -var strings_1 = require("../../strings"); -var CameraSelectionUi = (function () { - function CameraSelectionUi(cameras) { - this.selectElement = base_1.BaseUiElementFactory - .createElement("select", base_1.PublicUiElementIdAndClasses.CAMERA_SELECTION_SELECT_ID); - this.cameras = cameras; - this.options = []; - } - CameraSelectionUi.prototype.render = function (parentElement) { - var cameraSelectionContainer = document.createElement("span"); - cameraSelectionContainer.style.marginRight = "10px"; - var numCameras = this.cameras.length; - if (numCameras === 0) { - throw new Error("No cameras found"); - } - if (numCameras === 1) { - cameraSelectionContainer.style.display = "none"; - } - else { - var selectCameraString = strings_1.Html5QrcodeScannerStrings.selectCamera(); - cameraSelectionContainer.innerText - = "".concat(selectCameraString, " (").concat(this.cameras.length, ") "); - } - var anonymousCameraId = 1; - for (var _i = 0, _a = this.cameras; _i < _a.length; _i++) { - var camera = _a[_i]; - var value = camera.id; - var name_1 = camera.label == null ? value : camera.label; - if (!name_1 || name_1 === "") { - name_1 = [ - strings_1.Html5QrcodeScannerStrings.anonymousCameraPrefix(), - anonymousCameraId++ - ].join(" "); - } - var option = document.createElement("option"); - option.value = value; - option.innerText = name_1; - this.options.push(option); - this.selectElement.appendChild(option); - } - cameraSelectionContainer.appendChild(this.selectElement); - parentElement.appendChild(cameraSelectionContainer); - }; - CameraSelectionUi.prototype.disable = function () { - this.selectElement.disabled = true; - }; - CameraSelectionUi.prototype.isDisabled = function () { - return this.selectElement.disabled === true; - }; - CameraSelectionUi.prototype.enable = function () { - this.selectElement.disabled = false; - }; - CameraSelectionUi.prototype.getValue = function () { - return this.selectElement.value; - }; - CameraSelectionUi.prototype.hasValue = function (value) { - for (var _i = 0, _a = this.options; _i < _a.length; _i++) { - var option = _a[_i]; - if (option.value === value) { - return true; - } - } - return false; - }; - CameraSelectionUi.prototype.setValue = function (value) { - if (!this.hasValue(value)) { - throw new Error("".concat(value, " is not present in the camera list.")); - } - this.selectElement.value = value; - }; - CameraSelectionUi.prototype.hasSingleItem = function () { - return this.cameras.length === 1; - }; - CameraSelectionUi.prototype.numCameras = function () { - return this.cameras.length; - }; - CameraSelectionUi.create = function (parentElement, cameras) { - var cameraSelectUi = new CameraSelectionUi(cameras); - cameraSelectUi.render(parentElement); - return cameraSelectUi; - }; - return CameraSelectionUi; -}()); -exports.CameraSelectionUi = CameraSelectionUi; -//# sourceMappingURL=camera-selection-ui.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/ui/scanner/camera-selection-ui.js.map b/node_modules/html5-qrcode/cjs/ui/scanner/camera-selection-ui.js.map deleted file mode 100644 index 8d16948..0000000 --- a/node_modules/html5-qrcode/cjs/ui/scanner/camera-selection-ui.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"camera-selection-ui.js","sourceRoot":"","sources":["../../../../src/ui/scanner/camera-selection-ui.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/ui/scanner/camera-zoom-ui.d.ts b/node_modules/html5-qrcode/cjs/ui/scanner/camera-zoom-ui.d.ts deleted file mode 100644 index 215bb3f..0000000 --- a/node_modules/html5-qrcode/cjs/ui/scanner/camera-zoom-ui.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -export type OnCameraZoomValueChangeCallback = (zoomValue: number) => void; -export declare class CameraZoomUi { - private zoomElementContainer; - private rangeInput; - private rangeText; - private onChangeCallback; - private constructor(); - private render; - private onValueChange; - setValues(minValue: number, maxValue: number, defaultValue: number, step: number): void; - show(): void; - hide(): void; - setOnCameraZoomValueChangeCallback(onChangeCallback: OnCameraZoomValueChangeCallback): void; - removeOnCameraZoomValueChangeCallback(): void; - static create(parentElement: HTMLElement, renderOnCreate: boolean): CameraZoomUi; -} diff --git a/node_modules/html5-qrcode/cjs/ui/scanner/camera-zoom-ui.js b/node_modules/html5-qrcode/cjs/ui/scanner/camera-zoom-ui.js deleted file mode 100644 index c3dee1b..0000000 --- a/node_modules/html5-qrcode/cjs/ui/scanner/camera-zoom-ui.js +++ /dev/null @@ -1,73 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.CameraZoomUi = void 0; -var base_1 = require("./base"); -var strings_1 = require("../../strings"); -var CameraZoomUi = (function () { - function CameraZoomUi() { - this.onChangeCallback = null; - this.zoomElementContainer = document.createElement("div"); - this.rangeInput = base_1.BaseUiElementFactory.createElement("input", base_1.PublicUiElementIdAndClasses.ZOOM_SLIDER_ID); - this.rangeInput.type = "range"; - this.rangeText = document.createElement("span"); - this.rangeInput.min = "1"; - this.rangeInput.max = "5"; - this.rangeInput.value = "1"; - this.rangeInput.step = "0.1"; - } - CameraZoomUi.prototype.render = function (parentElement, renderOnCreate) { - this.zoomElementContainer.style.display - = renderOnCreate ? "block" : "none"; - this.zoomElementContainer.style.padding = "5px 10px"; - this.zoomElementContainer.style.textAlign = "center"; - parentElement.appendChild(this.zoomElementContainer); - this.rangeInput.style.display = "inline-block"; - this.rangeInput.style.width = "50%"; - this.rangeInput.style.height = "5px"; - this.rangeInput.style.background = "#d3d3d3"; - this.rangeInput.style.outline = "none"; - this.rangeInput.style.opacity = "0.7"; - var zoomString = strings_1.Html5QrcodeScannerStrings.zoom(); - this.rangeText.innerText = "".concat(this.rangeInput.value, "x ").concat(zoomString); - this.rangeText.style.marginRight = "10px"; - var $this = this; - this.rangeInput.addEventListener("input", function () { return $this.onValueChange(); }); - this.rangeInput.addEventListener("change", function () { return $this.onValueChange(); }); - this.zoomElementContainer.appendChild(this.rangeInput); - this.zoomElementContainer.appendChild(this.rangeText); - }; - CameraZoomUi.prototype.onValueChange = function () { - var zoomString = strings_1.Html5QrcodeScannerStrings.zoom(); - this.rangeText.innerText = "".concat(this.rangeInput.value, "x ").concat(zoomString); - if (this.onChangeCallback) { - this.onChangeCallback(parseFloat(this.rangeInput.value)); - } - }; - CameraZoomUi.prototype.setValues = function (minValue, maxValue, defaultValue, step) { - this.rangeInput.min = minValue.toString(); - this.rangeInput.max = maxValue.toString(); - this.rangeInput.step = step.toString(); - this.rangeInput.value = defaultValue.toString(); - this.onValueChange(); - }; - CameraZoomUi.prototype.show = function () { - this.zoomElementContainer.style.display = "block"; - }; - CameraZoomUi.prototype.hide = function () { - this.zoomElementContainer.style.display = "none"; - }; - CameraZoomUi.prototype.setOnCameraZoomValueChangeCallback = function (onChangeCallback) { - this.onChangeCallback = onChangeCallback; - }; - CameraZoomUi.prototype.removeOnCameraZoomValueChangeCallback = function () { - this.onChangeCallback = null; - }; - CameraZoomUi.create = function (parentElement, renderOnCreate) { - var cameraZoomUi = new CameraZoomUi(); - cameraZoomUi.render(parentElement, renderOnCreate); - return cameraZoomUi; - }; - return CameraZoomUi; -}()); -exports.CameraZoomUi = CameraZoomUi; -//# sourceMappingURL=camera-zoom-ui.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/ui/scanner/camera-zoom-ui.js.map b/node_modules/html5-qrcode/cjs/ui/scanner/camera-zoom-ui.js.map deleted file mode 100644 index 42f3c22..0000000 --- a/node_modules/html5-qrcode/cjs/ui/scanner/camera-zoom-ui.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"camera-zoom-ui.js","sourceRoot":"","sources":["../../../../src/ui/scanner/camera-zoom-ui.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/ui/scanner/file-selection-ui.d.ts b/node_modules/html5-qrcode/cjs/ui/scanner/file-selection-ui.d.ts deleted file mode 100644 index 768f5ed..0000000 --- a/node_modules/html5-qrcode/cjs/ui/scanner/file-selection-ui.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -export type OnFileSelected = (file: File) => void; -export declare class FileSelectionUi { - private readonly fileBasedScanRegion; - private readonly fileScanInput; - private readonly fileSelectionButton; - private constructor(); - hide(): void; - show(): void; - isShowing(): boolean; - resetValue(): void; - private createFileBasedScanRegion; - private fileBasedScanRegionDefaultBorder; - private fileBasedScanRegionActiveBorder; - private createDragAndDropMessage; - private setImageNameToButton; - private setInitialValueToButton; - private getFileScanInputId; - static create(parentElement: HTMLDivElement, showOnRender: boolean, onFileSelected: OnFileSelected): FileSelectionUi; -} diff --git a/node_modules/html5-qrcode/cjs/ui/scanner/file-selection-ui.js b/node_modules/html5-qrcode/cjs/ui/scanner/file-selection-ui.js deleted file mode 100644 index 62d6698..0000000 --- a/node_modules/html5-qrcode/cjs/ui/scanner/file-selection-ui.js +++ /dev/null @@ -1,170 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.FileSelectionUi = void 0; -var strings_1 = require("../../strings"); -var base_1 = require("./base"); -var FileSelectionUi = (function () { - function FileSelectionUi(parentElement, showOnRender, onFileSelected) { - this.fileBasedScanRegion = this.createFileBasedScanRegion(); - this.fileBasedScanRegion.style.display - = showOnRender ? "block" : "none"; - parentElement.appendChild(this.fileBasedScanRegion); - var fileScanLabel = document.createElement("label"); - fileScanLabel.setAttribute("for", this.getFileScanInputId()); - fileScanLabel.style.display = "inline-block"; - this.fileBasedScanRegion.appendChild(fileScanLabel); - this.fileSelectionButton - = base_1.BaseUiElementFactory.createElement("button", base_1.PublicUiElementIdAndClasses.FILE_SELECTION_BUTTON_ID); - this.setInitialValueToButton(); - this.fileSelectionButton.addEventListener("click", function (_) { - fileScanLabel.click(); - }); - fileScanLabel.append(this.fileSelectionButton); - this.fileScanInput - = base_1.BaseUiElementFactory.createElement("input", this.getFileScanInputId()); - this.fileScanInput.type = "file"; - this.fileScanInput.accept = "image/*"; - this.fileScanInput.style.display = "none"; - fileScanLabel.appendChild(this.fileScanInput); - var $this = this; - this.fileScanInput.addEventListener("change", function (e) { - if (e == null || e.target == null) { - return; - } - var target = e.target; - if (target.files && target.files.length === 0) { - return; - } - var fileList = target.files; - var file = fileList[0]; - var fileName = file.name; - $this.setImageNameToButton(fileName); - onFileSelected(file); - }); - var dragAndDropMessage = this.createDragAndDropMessage(); - this.fileBasedScanRegion.appendChild(dragAndDropMessage); - this.fileBasedScanRegion.addEventListener("dragenter", function (event) { - $this.fileBasedScanRegion.style.border - = $this.fileBasedScanRegionActiveBorder(); - event.stopPropagation(); - event.preventDefault(); - }); - this.fileBasedScanRegion.addEventListener("dragleave", function (event) { - $this.fileBasedScanRegion.style.border - = $this.fileBasedScanRegionDefaultBorder(); - event.stopPropagation(); - event.preventDefault(); - }); - this.fileBasedScanRegion.addEventListener("dragover", function (event) { - $this.fileBasedScanRegion.style.border - = $this.fileBasedScanRegionActiveBorder(); - event.stopPropagation(); - event.preventDefault(); - }); - this.fileBasedScanRegion.addEventListener("drop", function (event) { - event.stopPropagation(); - event.preventDefault(); - $this.fileBasedScanRegion.style.border - = $this.fileBasedScanRegionDefaultBorder(); - var dataTransfer = event.dataTransfer; - if (dataTransfer) { - var files = dataTransfer.files; - if (!files || files.length === 0) { - return; - } - var isAnyFileImage = false; - for (var i = 0; i < files.length; ++i) { - var file = files.item(i); - if (!file) { - continue; - } - var imageType = /image.*/; - if (!file.type.match(imageType)) { - continue; - } - isAnyFileImage = true; - var fileName = file.name; - $this.setImageNameToButton(fileName); - onFileSelected(file); - dragAndDropMessage.innerText - = strings_1.Html5QrcodeScannerStrings.dragAndDropMessage(); - break; - } - if (!isAnyFileImage) { - dragAndDropMessage.innerText - = strings_1.Html5QrcodeScannerStrings - .dragAndDropMessageOnlyImages(); - } - } - }); - } - FileSelectionUi.prototype.hide = function () { - this.fileBasedScanRegion.style.display = "none"; - this.fileScanInput.disabled = true; - }; - FileSelectionUi.prototype.show = function () { - this.fileBasedScanRegion.style.display = "block"; - this.fileScanInput.disabled = false; - }; - FileSelectionUi.prototype.isShowing = function () { - return this.fileBasedScanRegion.style.display === "block"; - }; - FileSelectionUi.prototype.resetValue = function () { - this.fileScanInput.value = ""; - this.setInitialValueToButton(); - }; - FileSelectionUi.prototype.createFileBasedScanRegion = function () { - var fileBasedScanRegion = document.createElement("div"); - fileBasedScanRegion.style.textAlign = "center"; - fileBasedScanRegion.style.margin = "auto"; - fileBasedScanRegion.style.width = "80%"; - fileBasedScanRegion.style.maxWidth = "600px"; - fileBasedScanRegion.style.border - = this.fileBasedScanRegionDefaultBorder(); - fileBasedScanRegion.style.padding = "10px"; - fileBasedScanRegion.style.marginBottom = "10px"; - return fileBasedScanRegion; - }; - FileSelectionUi.prototype.fileBasedScanRegionDefaultBorder = function () { - return "6px dashed #ebebeb"; - }; - FileSelectionUi.prototype.fileBasedScanRegionActiveBorder = function () { - return "6px dashed rgb(153 151 151)"; - }; - FileSelectionUi.prototype.createDragAndDropMessage = function () { - var dragAndDropMessage = document.createElement("div"); - dragAndDropMessage.innerText - = strings_1.Html5QrcodeScannerStrings.dragAndDropMessage(); - dragAndDropMessage.style.fontWeight = "400"; - return dragAndDropMessage; - }; - FileSelectionUi.prototype.setImageNameToButton = function (imageFileName) { - var MAX_CHARS = 20; - if (imageFileName.length > MAX_CHARS) { - var start8Chars = imageFileName.substring(0, 8); - var length_1 = imageFileName.length; - var last8Chars = imageFileName.substring(length_1 - 8, length_1); - imageFileName = "".concat(start8Chars, "....").concat(last8Chars); - } - var newText = strings_1.Html5QrcodeScannerStrings.fileSelectionChooseAnother() - + " - " - + imageFileName; - this.fileSelectionButton.innerText = newText; - }; - FileSelectionUi.prototype.setInitialValueToButton = function () { - var initialText = strings_1.Html5QrcodeScannerStrings.fileSelectionChooseImage() - + " - " - + strings_1.Html5QrcodeScannerStrings.fileSelectionNoImageSelected(); - this.fileSelectionButton.innerText = initialText; - }; - FileSelectionUi.prototype.getFileScanInputId = function () { - return "html5-qrcode-private-filescan-input"; - }; - FileSelectionUi.create = function (parentElement, showOnRender, onFileSelected) { - var button = new FileSelectionUi(parentElement, showOnRender, onFileSelected); - return button; - }; - return FileSelectionUi; -}()); -exports.FileSelectionUi = FileSelectionUi; -//# sourceMappingURL=file-selection-ui.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/ui/scanner/file-selection-ui.js.map b/node_modules/html5-qrcode/cjs/ui/scanner/file-selection-ui.js.map deleted file mode 100644 index b860ebf..0000000 --- a/node_modules/html5-qrcode/cjs/ui/scanner/file-selection-ui.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"file-selection-ui.js","sourceRoot":"","sources":["../../../../src/ui/scanner/file-selection-ui.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/ui/scanner/scan-type-selector.d.ts b/node_modules/html5-qrcode/cjs/ui/scanner/scan-type-selector.d.ts deleted file mode 100644 index 2f0e134..0000000 --- a/node_modules/html5-qrcode/cjs/ui/scanner/scan-type-selector.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Html5QrcodeScanType } from "../../core"; -export declare class ScanTypeSelector { - private supportedScanTypes; - constructor(supportedScanTypes?: Array | []); - getDefaultScanType(): Html5QrcodeScanType; - hasMoreThanOneScanType(): boolean; - isCameraScanRequired(): boolean; - static isCameraScanType(scanType: Html5QrcodeScanType): boolean; - static isFileScanType(scanType: Html5QrcodeScanType): boolean; - private validateAndReturnScanTypes; -} diff --git a/node_modules/html5-qrcode/cjs/ui/scanner/scan-type-selector.js b/node_modules/html5-qrcode/cjs/ui/scanner/scan-type-selector.js deleted file mode 100644 index df70b55..0000000 --- a/node_modules/html5-qrcode/cjs/ui/scanner/scan-type-selector.js +++ /dev/null @@ -1,51 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ScanTypeSelector = void 0; -var core_1 = require("../../core"); -var ScanTypeSelector = (function () { - function ScanTypeSelector(supportedScanTypes) { - this.supportedScanTypes = this.validateAndReturnScanTypes(supportedScanTypes); - } - ScanTypeSelector.prototype.getDefaultScanType = function () { - return this.supportedScanTypes[0]; - }; - ScanTypeSelector.prototype.hasMoreThanOneScanType = function () { - return this.supportedScanTypes.length > 1; - }; - ScanTypeSelector.prototype.isCameraScanRequired = function () { - for (var _i = 0, _a = this.supportedScanTypes; _i < _a.length; _i++) { - var scanType = _a[_i]; - if (ScanTypeSelector.isCameraScanType(scanType)) { - return true; - } - } - return false; - }; - ScanTypeSelector.isCameraScanType = function (scanType) { - return scanType === core_1.Html5QrcodeScanType.SCAN_TYPE_CAMERA; - }; - ScanTypeSelector.isFileScanType = function (scanType) { - return scanType === core_1.Html5QrcodeScanType.SCAN_TYPE_FILE; - }; - ScanTypeSelector.prototype.validateAndReturnScanTypes = function (supportedScanTypes) { - if (!supportedScanTypes || supportedScanTypes.length === 0) { - return core_1.Html5QrcodeConstants.DEFAULT_SUPPORTED_SCAN_TYPE; - } - var maxExpectedValues = core_1.Html5QrcodeConstants.DEFAULT_SUPPORTED_SCAN_TYPE.length; - if (supportedScanTypes.length > maxExpectedValues) { - throw "Max ".concat(maxExpectedValues, " values expected for ") - + "supportedScanTypes"; - } - for (var _i = 0, supportedScanTypes_1 = supportedScanTypes; _i < supportedScanTypes_1.length; _i++) { - var scanType = supportedScanTypes_1[_i]; - if (!core_1.Html5QrcodeConstants.DEFAULT_SUPPORTED_SCAN_TYPE - .includes(scanType)) { - throw "Unsupported scan type ".concat(scanType); - } - } - return supportedScanTypes; - }; - return ScanTypeSelector; -}()); -exports.ScanTypeSelector = ScanTypeSelector; -//# sourceMappingURL=scan-type-selector.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/ui/scanner/scan-type-selector.js.map b/node_modules/html5-qrcode/cjs/ui/scanner/scan-type-selector.js.map deleted file mode 100644 index 99e5226..0000000 --- a/node_modules/html5-qrcode/cjs/ui/scanner/scan-type-selector.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"scan-type-selector.js","sourceRoot":"","sources":["../../../../src/ui/scanner/scan-type-selector.ts"],"names":[],"mappings":";;;AAUA,mCAGoB;AAGpB;IAGI,0BAAY,kBAAoD;QAC5D,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,0BAA0B,CACrD,kBAAkB,CAAC,CAAC;IAC5B,CAAC;IAMM,6CAAkB,GAAzB;QACI,OAAO,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;IAMM,iDAAsB,GAA7B;QACI,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9C,CAAC;IAGM,+CAAoB,GAA3B;QACI,KAAuB,UAAuB,EAAvB,KAAA,IAAI,CAAC,kBAAkB,EAAvB,cAAuB,EAAvB,IAAuB,EAAE;YAA3C,IAAM,QAAQ,SAAA;YACf,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE;gBAC7C,OAAO,IAAI,CAAC;aACf;SACJ;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAGa,iCAAgB,GAA9B,UAA+B,QAA6B;QACxD,OAAO,QAAQ,KAAK,0BAAmB,CAAC,gBAAgB,CAAC;IAC7D,CAAC;IAGa,+BAAc,GAA5B,UAA6B,QAA6B;QACtD,OAAO,QAAQ,KAAK,0BAAmB,CAAC,cAAc,CAAC;IAC3D,CAAC;IAQO,qDAA0B,GAAlC,UACI,kBAA8C;QAG9C,IAAI,CAAC,kBAAkB,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE;YACxD,OAAO,2BAAoB,CAAC,2BAA2B,CAAC;SAC3D;QAGD,IAAI,iBAAiB,GACf,2BAAoB,CAAC,2BAA2B,CAAC,MAAM,CAAC;QAC9D,IAAI,kBAAkB,CAAC,MAAM,GAAG,iBAAiB,EAAE;YAC/C,MAAM,cAAO,iBAAiB,0BAAuB;kBAC/C,oBAAoB,CAAC;SAC9B;QAGD,KAAuB,UAAkB,EAAlB,yCAAkB,EAAlB,gCAAkB,EAAlB,IAAkB,EAAE;YAAtC,IAAM,QAAQ,2BAAA;YACf,IAAI,CAAC,2BAAoB,CAAC,2BAA2B;iBAC5C,QAAQ,CAAC,QAAQ,CAAC,EAAE;gBACzB,MAAM,gCAAyB,QAAQ,CAAE,CAAC;aAC7C;SACJ;QAED,OAAO,kBAAkB,CAAC;IAC9B,CAAC;IAEL,uBAAC;AAAD,CAAC,AA7ED,IA6EC;AA7EY,4CAAgB"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/ui/scanner/torch-button.d.ts b/node_modules/html5-qrcode/cjs/ui/scanner/torch-button.d.ts deleted file mode 100644 index a862a10..0000000 --- a/node_modules/html5-qrcode/cjs/ui/scanner/torch-button.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { BooleanCameraCapability } from "../../camera/core"; -export type OnTorchActionFailureCallback = (failureMessage: string) => void; -interface TorchButtonController { - disable(): void; - enable(): void; - setText(text: string): void; -} -export interface TorchButtonOptions { - display: string; - marginLeft: string; -} -export declare class TorchButton implements TorchButtonController { - private readonly torchButton; - private readonly onTorchActionFailureCallback; - private torchController; - private constructor(); - private render; - updateTorchCapability(torchCapability: BooleanCameraCapability): void; - getTorchButton(): HTMLButtonElement; - hide(): void; - show(): void; - disable(): void; - enable(): void; - setText(text: string): void; - reset(): void; - static create(parentElement: HTMLElement, torchCapability: BooleanCameraCapability, torchButtonOptions: TorchButtonOptions, onTorchActionFailureCallback: OnTorchActionFailureCallback): TorchButton; -} -export {}; diff --git a/node_modules/html5-qrcode/cjs/ui/scanner/torch-button.js b/node_modules/html5-qrcode/cjs/ui/scanner/torch-button.js deleted file mode 100644 index 4e1b7b2..0000000 --- a/node_modules/html5-qrcode/cjs/ui/scanner/torch-button.js +++ /dev/null @@ -1,171 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (g && (g = 0, op[0] && (_ = 0)), _) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TorchButton = void 0; -var strings_1 = require("../../strings"); -var base_1 = require("./base"); -var TorchController = (function () { - function TorchController(torchCapability, buttonController, onTorchActionFailureCallback) { - this.isTorchOn = false; - this.torchCapability = torchCapability; - this.buttonController = buttonController; - this.onTorchActionFailureCallback = onTorchActionFailureCallback; - } - TorchController.prototype.isTorchEnabled = function () { - return this.isTorchOn; - }; - TorchController.prototype.flipState = function () { - return __awaiter(this, void 0, void 0, function () { - var isTorchOnExpected, error_1; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - this.buttonController.disable(); - isTorchOnExpected = !this.isTorchOn; - _a.label = 1; - case 1: - _a.trys.push([1, 3, , 4]); - return [4, this.torchCapability.apply(isTorchOnExpected)]; - case 2: - _a.sent(); - this.updateUiBasedOnLatestSettings(this.torchCapability.value(), isTorchOnExpected); - return [3, 4]; - case 3: - error_1 = _a.sent(); - this.propagateFailure(isTorchOnExpected, error_1); - this.buttonController.enable(); - return [3, 4]; - case 4: return [2]; - } - }); - }); - }; - TorchController.prototype.updateUiBasedOnLatestSettings = function (isTorchOn, isTorchOnExpected) { - if (isTorchOn === isTorchOnExpected) { - this.buttonController.setText(isTorchOnExpected - ? strings_1.Html5QrcodeScannerStrings.torchOffButton() - : strings_1.Html5QrcodeScannerStrings.torchOnButton()); - this.isTorchOn = isTorchOnExpected; - } - else { - this.propagateFailure(isTorchOnExpected); - } - this.buttonController.enable(); - }; - TorchController.prototype.propagateFailure = function (isTorchOnExpected, error) { - var errorMessage = isTorchOnExpected - ? strings_1.Html5QrcodeScannerStrings.torchOnFailedMessage() - : strings_1.Html5QrcodeScannerStrings.torchOffFailedMessage(); - if (error) { - errorMessage += "; Error = " + error; - } - this.onTorchActionFailureCallback(errorMessage); - }; - TorchController.prototype.reset = function () { - this.isTorchOn = false; - }; - return TorchController; -}()); -var TorchButton = (function () { - function TorchButton(torchCapability, onTorchActionFailureCallback) { - this.onTorchActionFailureCallback = onTorchActionFailureCallback; - this.torchButton - = base_1.BaseUiElementFactory.createElement("button", base_1.PublicUiElementIdAndClasses.TORCH_BUTTON_ID); - this.torchController = new TorchController(torchCapability, this, onTorchActionFailureCallback); - } - TorchButton.prototype.render = function (parentElement, torchButtonOptions) { - var _this = this; - this.torchButton.innerText - = strings_1.Html5QrcodeScannerStrings.torchOnButton(); - this.torchButton.style.display = torchButtonOptions.display; - this.torchButton.style.marginLeft = torchButtonOptions.marginLeft; - var $this = this; - this.torchButton.addEventListener("click", function (_) { return __awaiter(_this, void 0, void 0, function () { - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4, $this.torchController.flipState()]; - case 1: - _a.sent(); - if ($this.torchController.isTorchEnabled()) { - $this.torchButton.classList.remove(base_1.PublicUiElementIdAndClasses.TORCH_BUTTON_CLASS_TORCH_OFF); - $this.torchButton.classList.add(base_1.PublicUiElementIdAndClasses.TORCH_BUTTON_CLASS_TORCH_ON); - } - else { - $this.torchButton.classList.remove(base_1.PublicUiElementIdAndClasses.TORCH_BUTTON_CLASS_TORCH_ON); - $this.torchButton.classList.add(base_1.PublicUiElementIdAndClasses.TORCH_BUTTON_CLASS_TORCH_OFF); - } - return [2]; - } - }); - }); }); - parentElement.appendChild(this.torchButton); - }; - TorchButton.prototype.updateTorchCapability = function (torchCapability) { - this.torchController = new TorchController(torchCapability, this, this.onTorchActionFailureCallback); - }; - TorchButton.prototype.getTorchButton = function () { - return this.torchButton; - }; - TorchButton.prototype.hide = function () { - this.torchButton.style.display = "none"; - }; - TorchButton.prototype.show = function () { - this.torchButton.style.display = "inline-block"; - }; - TorchButton.prototype.disable = function () { - this.torchButton.disabled = true; - }; - TorchButton.prototype.enable = function () { - this.torchButton.disabled = false; - }; - TorchButton.prototype.setText = function (text) { - this.torchButton.innerText = text; - }; - TorchButton.prototype.reset = function () { - this.torchButton.innerText = strings_1.Html5QrcodeScannerStrings.torchOnButton(); - this.torchController.reset(); - }; - TorchButton.create = function (parentElement, torchCapability, torchButtonOptions, onTorchActionFailureCallback) { - var button = new TorchButton(torchCapability, onTorchActionFailureCallback); - button.render(parentElement, torchButtonOptions); - return button; - }; - return TorchButton; -}()); -exports.TorchButton = TorchButton; -//# sourceMappingURL=torch-button.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/ui/scanner/torch-button.js.map b/node_modules/html5-qrcode/cjs/ui/scanner/torch-button.js.map deleted file mode 100644 index 8cc399e..0000000 --- a/node_modules/html5-qrcode/cjs/ui/scanner/torch-button.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"torch-button.js","sourceRoot":"","sources":["../../../../src/ui/scanner/torch-button.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/utils.d.ts b/node_modules/html5-qrcode/cjs/utils.d.ts deleted file mode 100644 index 1b060ed..0000000 --- a/node_modules/html5-qrcode/cjs/utils.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { Logger } from "./core"; -export declare class VideoConstraintsUtil { - static isMediaStreamConstraintsValid(videoConstraints: MediaTrackConstraints, logger: Logger): boolean; -} diff --git a/node_modules/html5-qrcode/cjs/utils.js b/node_modules/html5-qrcode/cjs/utils.js deleted file mode 100644 index 80d2660..0000000 --- a/node_modules/html5-qrcode/cjs/utils.js +++ /dev/null @@ -1,38 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.VideoConstraintsUtil = void 0; -var VideoConstraintsUtil = (function () { - function VideoConstraintsUtil() { - } - VideoConstraintsUtil.isMediaStreamConstraintsValid = function (videoConstraints, logger) { - if (typeof videoConstraints !== "object") { - var typeofVideoConstraints = typeof videoConstraints; - logger.logError("videoConstraints should be of type object, the " - + "object passed is of type ".concat(typeofVideoConstraints, "."), true); - return false; - } - var bannedKeys = [ - "autoGainControl", - "channelCount", - "echoCancellation", - "latency", - "noiseSuppression", - "sampleRate", - "sampleSize", - "volume" - ]; - var bannedkeysSet = new Set(bannedKeys); - var keysInVideoConstraints = Object.keys(videoConstraints); - for (var _i = 0, keysInVideoConstraints_1 = keysInVideoConstraints; _i < keysInVideoConstraints_1.length; _i++) { - var key = keysInVideoConstraints_1[_i]; - if (bannedkeysSet.has(key)) { - logger.logError("".concat(key, " is not supported videoConstaints."), true); - return false; - } - } - return true; - }; - return VideoConstraintsUtil; -}()); -exports.VideoConstraintsUtil = VideoConstraintsUtil; -//# sourceMappingURL=utils.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/utils.js.map b/node_modules/html5-qrcode/cjs/utils.js.map deleted file mode 100644 index 9273fab..0000000 --- a/node_modules/html5-qrcode/cjs/utils.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":";;;AAeA;IAAA;IAqCA,CAAC;IApCiB,kDAA6B,GAA3C,UACI,gBAAuC,EACvC,MAAc;QACd,IAAI,OAAO,gBAAgB,KAAK,QAAQ,EAAE;YACtC,IAAM,sBAAsB,GAAG,OAAO,gBAAgB,CAAC;YACvD,MAAM,CAAC,QAAQ,CACX,iDAAiD;kBAC3C,mCAA4B,sBAAsB,MAAG,EACvC,IAAI,CAAC,CAAC;YAC9B,OAAO,KAAK,CAAC;SAChB;QAGD,IAAM,UAAU,GAAG;YACf,iBAAiB;YACjB,cAAc;YACd,kBAAkB;YAClB,SAAS;YACT,kBAAkB;YAClB,YAAY;YACZ,YAAY;YACZ,QAAQ;SACX,CAAC;QACF,IAAM,aAAa,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAM,sBAAsB,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7D,KAAkB,UAAsB,EAAtB,iDAAsB,EAAtB,oCAAsB,EAAtB,IAAsB,EAAE;YAArC,IAAM,GAAG,+BAAA;YACV,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;gBACxB,MAAM,CAAC,QAAQ,CACX,UAAG,GAAG,uCAAoC,EACtB,IAAI,CAAC,CAAC;gBAC9B,OAAO,KAAK,CAAC;aAChB;SACJ;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IACL,2BAAC;AAAD,CAAC,AArCD,IAqCC;AArCY,oDAAoB"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/zxing-html5-qrcode-decoder.d.ts b/node_modules/html5-qrcode/cjs/zxing-html5-qrcode-decoder.d.ts deleted file mode 100644 index 411d377..0000000 --- a/node_modules/html5-qrcode/cjs/zxing-html5-qrcode-decoder.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { QrcodeResult, Html5QrcodeSupportedFormats, Logger, QrcodeDecoderAsync } from "./core"; -export declare class ZXingHtml5QrcodeDecoder implements QrcodeDecoderAsync { - private readonly formatMap; - private readonly reverseFormatMap; - private hints; - private verbose; - private logger; - constructor(requestedFormats: Array, verbose: boolean, logger: Logger); - decodeAsync(canvas: HTMLCanvasElement): Promise; - private decode; - private createReverseFormatMap; - private toHtml5QrcodeSupportedFormats; - private createZXingFormats; - private createDebugData; -} diff --git a/node_modules/html5-qrcode/cjs/zxing-html5-qrcode-decoder.js b/node_modules/html5-qrcode/cjs/zxing-html5-qrcode-decoder.js deleted file mode 100644 index 1bb0e37..0000000 --- a/node_modules/html5-qrcode/cjs/zxing-html5-qrcode-decoder.js +++ /dev/null @@ -1,109 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ZXingHtml5QrcodeDecoder = void 0; -var ZXing = require("../third_party/zxing-js.umd"); -var core_1 = require("./core"); -var ZXingHtml5QrcodeDecoder = (function () { - function ZXingHtml5QrcodeDecoder(requestedFormats, verbose, logger) { - this.formatMap = new Map([ - [core_1.Html5QrcodeSupportedFormats.QR_CODE, ZXing.BarcodeFormat.QR_CODE], - [core_1.Html5QrcodeSupportedFormats.AZTEC, ZXing.BarcodeFormat.AZTEC], - [core_1.Html5QrcodeSupportedFormats.CODABAR, ZXing.BarcodeFormat.CODABAR], - [core_1.Html5QrcodeSupportedFormats.CODE_39, ZXing.BarcodeFormat.CODE_39], - [core_1.Html5QrcodeSupportedFormats.CODE_93, ZXing.BarcodeFormat.CODE_93], - [ - core_1.Html5QrcodeSupportedFormats.CODE_128, - ZXing.BarcodeFormat.CODE_128 - ], - [ - core_1.Html5QrcodeSupportedFormats.DATA_MATRIX, - ZXing.BarcodeFormat.DATA_MATRIX - ], - [ - core_1.Html5QrcodeSupportedFormats.MAXICODE, - ZXing.BarcodeFormat.MAXICODE - ], - [core_1.Html5QrcodeSupportedFormats.ITF, ZXing.BarcodeFormat.ITF], - [core_1.Html5QrcodeSupportedFormats.EAN_13, ZXing.BarcodeFormat.EAN_13], - [core_1.Html5QrcodeSupportedFormats.EAN_8, ZXing.BarcodeFormat.EAN_8], - [core_1.Html5QrcodeSupportedFormats.PDF_417, ZXing.BarcodeFormat.PDF_417], - [core_1.Html5QrcodeSupportedFormats.RSS_14, ZXing.BarcodeFormat.RSS_14], - [ - core_1.Html5QrcodeSupportedFormats.RSS_EXPANDED, - ZXing.BarcodeFormat.RSS_EXPANDED - ], - [core_1.Html5QrcodeSupportedFormats.UPC_A, ZXing.BarcodeFormat.UPC_A], - [core_1.Html5QrcodeSupportedFormats.UPC_E, ZXing.BarcodeFormat.UPC_E], - [ - core_1.Html5QrcodeSupportedFormats.UPC_EAN_EXTENSION, - ZXing.BarcodeFormat.UPC_EAN_EXTENSION - ] - ]); - this.reverseFormatMap = this.createReverseFormatMap(); - if (!ZXing) { - throw "Use html5qrcode.min.js without edit, ZXing not found."; - } - this.verbose = verbose; - this.logger = logger; - var formats = this.createZXingFormats(requestedFormats); - var hints = new Map(); - hints.set(ZXing.DecodeHintType.POSSIBLE_FORMATS, formats); - hints.set(ZXing.DecodeHintType.TRY_HARDER, false); - this.hints = hints; - } - ZXingHtml5QrcodeDecoder.prototype.decodeAsync = function (canvas) { - var _this = this; - return new Promise(function (resolve, reject) { - try { - resolve(_this.decode(canvas)); - } - catch (error) { - reject(error); - } - }); - }; - ZXingHtml5QrcodeDecoder.prototype.decode = function (canvas) { - var zxingDecoder = new ZXing.MultiFormatReader(this.verbose, this.hints); - var luminanceSource = new ZXing.HTMLCanvasElementLuminanceSource(canvas); - var binaryBitmap = new ZXing.BinaryBitmap(new ZXing.HybridBinarizer(luminanceSource)); - var result = zxingDecoder.decode(binaryBitmap); - return { - text: result.text, - format: core_1.QrcodeResultFormat.create(this.toHtml5QrcodeSupportedFormats(result.format)), - debugData: this.createDebugData() - }; - }; - ZXingHtml5QrcodeDecoder.prototype.createReverseFormatMap = function () { - var result = new Map(); - this.formatMap.forEach(function (value, key, _) { - result.set(value, key); - }); - return result; - }; - ZXingHtml5QrcodeDecoder.prototype.toHtml5QrcodeSupportedFormats = function (zxingFormat) { - if (!this.reverseFormatMap.has(zxingFormat)) { - throw "reverseFormatMap doesn't have ".concat(zxingFormat); - } - return this.reverseFormatMap.get(zxingFormat); - }; - ZXingHtml5QrcodeDecoder.prototype.createZXingFormats = function (requestedFormats) { - var zxingFormats = []; - for (var _i = 0, requestedFormats_1 = requestedFormats; _i < requestedFormats_1.length; _i++) { - var requestedFormat = requestedFormats_1[_i]; - if (this.formatMap.has(requestedFormat)) { - zxingFormats.push(this.formatMap.get(requestedFormat)); - } - else { - this.logger.logError("".concat(requestedFormat, " is not supported by") - + "ZXingHtml5QrcodeShim"); - } - } - return zxingFormats; - }; - ZXingHtml5QrcodeDecoder.prototype.createDebugData = function () { - return { decoderName: "zxing-js" }; - }; - return ZXingHtml5QrcodeDecoder; -}()); -exports.ZXingHtml5QrcodeDecoder = ZXingHtml5QrcodeDecoder; -//# sourceMappingURL=zxing-html5-qrcode-decoder.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/cjs/zxing-html5-qrcode-decoder.js.map b/node_modules/html5-qrcode/cjs/zxing-html5-qrcode-decoder.js.map deleted file mode 100644 index e33c888..0000000 --- a/node_modules/html5-qrcode/cjs/zxing-html5-qrcode-decoder.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"zxing-html5-qrcode-decoder.js","sourceRoot":"","sources":["../../src/zxing-html5-qrcode-decoder.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/code-decoder.d.ts b/node_modules/html5-qrcode/code-decoder.d.ts deleted file mode 100644 index 13d5426..0000000 --- a/node_modules/html5-qrcode/code-decoder.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { QrcodeResult, Html5QrcodeSupportedFormats, Logger, RobustQrcodeDecoderAsync } from "./core"; -export declare class Html5QrcodeShim implements RobustQrcodeDecoderAsync { - private verbose; - private primaryDecoder; - private secondaryDecoder; - private readonly EXECUTIONS_TO_REPORT_PERFORMANCE; - private executions; - private executionResults; - private wasPrimaryDecoderUsedInLastDecode; - constructor(requestedFormats: Array, useBarCodeDetectorIfSupported: boolean, verbose: boolean, logger: Logger); - decodeAsync(canvas: HTMLCanvasElement): Promise; - decodeRobustlyAsync(canvas: HTMLCanvasElement): Promise; - private getDecoder; - private possiblyLogPerformance; - possiblyFlushPerformanceReport(): void; -} diff --git a/node_modules/html5-qrcode/core.d.ts b/node_modules/html5-qrcode/core.d.ts deleted file mode 100644 index 0d0206d..0000000 --- a/node_modules/html5-qrcode/core.d.ts +++ /dev/null @@ -1,105 +0,0 @@ -export declare enum Html5QrcodeSupportedFormats { - QR_CODE = 0, - AZTEC = 1, - CODABAR = 2, - CODE_39 = 3, - CODE_93 = 4, - CODE_128 = 5, - DATA_MATRIX = 6, - MAXICODE = 7, - ITF = 8, - EAN_13 = 9, - EAN_8 = 10, - PDF_417 = 11, - RSS_14 = 12, - RSS_EXPANDED = 13, - UPC_A = 14, - UPC_E = 15, - UPC_EAN_EXTENSION = 16 -} -export declare enum DecodedTextType { - UNKNOWN = 0, - URL = 1 -} -export declare function isValidHtml5QrcodeSupportedFormats(format: any): boolean; -export declare enum Html5QrcodeScanType { - SCAN_TYPE_CAMERA = 0, - SCAN_TYPE_FILE = 1 -} -export declare class Html5QrcodeConstants { - static GITHUB_PROJECT_URL: string; - static SCAN_DEFAULT_FPS: number; - static DEFAULT_DISABLE_FLIP: boolean; - static DEFAULT_REMEMBER_LAST_CAMERA_USED: boolean; - static DEFAULT_SUPPORTED_SCAN_TYPE: Html5QrcodeScanType[]; -} -export interface QrDimensions { - width: number; - height: number; -} -export type QrDimensionFunction = (viewfinderWidth: number, viewfinderHeight: number) => QrDimensions; -export interface QrBounds extends QrDimensions { - x: number; - y: number; -} -export declare class QrcodeResultFormat { - readonly format: Html5QrcodeSupportedFormats; - readonly formatName: string; - private constructor(); - toString(): string; - static create(format: Html5QrcodeSupportedFormats): QrcodeResultFormat; -} -export interface QrcodeResultDebugData { - decoderName?: string; -} -export interface QrcodeResult { - text: string; - format?: QrcodeResultFormat; - bounds?: QrBounds; - decodedTextType?: DecodedTextType; - debugData?: QrcodeResultDebugData; -} -export interface Html5QrcodeResult { - decodedText: string; - result: QrcodeResult; -} -export declare class Html5QrcodeResultFactory { - static createFromText(decodedText: string): Html5QrcodeResult; - static createFromQrcodeResult(qrcodeResult: QrcodeResult): Html5QrcodeResult; -} -export declare enum Html5QrcodeErrorTypes { - UNKWOWN_ERROR = 0, - IMPLEMENTATION_ERROR = 1, - NO_CODE_FOUND_ERROR = 2 -} -export interface Html5QrcodeError { - errorMessage: string; - type: Html5QrcodeErrorTypes; -} -export declare class Html5QrcodeErrorFactory { - static createFrom(error: any): Html5QrcodeError; -} -export type QrcodeSuccessCallback = (decodedText: string, result: Html5QrcodeResult) => void; -export type QrcodeErrorCallback = (errorMessage: string, error: Html5QrcodeError) => void; -export interface QrcodeDecoderAsync { - decodeAsync(canvas: HTMLCanvasElement): Promise; -} -export interface RobustQrcodeDecoderAsync extends QrcodeDecoderAsync { - decodeRobustlyAsync(canvas: HTMLCanvasElement): Promise; -} -export interface Logger { - log(message: string): void; - warn(message: string): void; - logError(message: string, isExperimental?: boolean): void; - logErrors(errors: Array): void; -} -export declare class BaseLoggger implements Logger { - private verbose; - constructor(verbose: boolean); - log(message: string): void; - warn(message: string): void; - logError(message: string, isExperimental?: boolean): void; - logErrors(errors: Array): void; -} -export declare function isNullOrUndefined(obj?: any): boolean; -export declare function clip(value: number, minValue: number, maxValue: number): number; diff --git a/node_modules/html5-qrcode/es2015/camera/core-impl.d.ts b/node_modules/html5-qrcode/es2015/camera/core-impl.d.ts deleted file mode 100644 index ffc8a05..0000000 --- a/node_modules/html5-qrcode/es2015/camera/core-impl.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Camera, CameraRenderingOptions, RenderedCamera, RenderingCallbacks } from "./core"; -export declare class CameraImpl implements Camera { - private readonly mediaStream; - private constructor(); - render(parentElement: HTMLElement, options: CameraRenderingOptions, callbacks: RenderingCallbacks): Promise; - static create(videoConstraints: MediaTrackConstraints): Promise; -} diff --git a/node_modules/html5-qrcode/es2015/camera/core-impl.js b/node_modules/html5-qrcode/es2015/camera/core-impl.js deleted file mode 100644 index afd2d80..0000000 --- a/node_modules/html5-qrcode/es2015/camera/core-impl.js +++ /dev/null @@ -1,236 +0,0 @@ -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -class AbstractCameraCapability { - constructor(name, track) { - this.name = name; - this.track = track; - } - isSupported() { - if (!this.track.getCapabilities) { - return false; - } - return this.name in this.track.getCapabilities(); - } - apply(value) { - let constraint = {}; - constraint[this.name] = value; - let constraints = { advanced: [constraint] }; - return this.track.applyConstraints(constraints); - } - value() { - let settings = this.track.getSettings(); - if (this.name in settings) { - let settingValue = settings[this.name]; - return settingValue; - } - return null; - } -} -class AbstractRangeCameraCapability extends AbstractCameraCapability { - constructor(name, track) { - super(name, track); - } - min() { - return this.getCapabilities().min; - } - max() { - return this.getCapabilities().max; - } - step() { - return this.getCapabilities().step; - } - apply(value) { - let constraint = {}; - constraint[this.name] = value; - let constraints = { advanced: [constraint] }; - return this.track.applyConstraints(constraints); - } - getCapabilities() { - this.failIfNotSupported(); - let capabilities = this.track.getCapabilities(); - let capability = capabilities[this.name]; - return { - min: capability.min, - max: capability.max, - step: capability.step, - }; - } - failIfNotSupported() { - if (!this.isSupported()) { - throw new Error(`${this.name} capability not supported`); - } - } -} -class ZoomFeatureImpl extends AbstractRangeCameraCapability { - constructor(track) { - super("zoom", track); - } -} -class TorchFeatureImpl extends AbstractCameraCapability { - constructor(track) { - super("torch", track); - } -} -class CameraCapabilitiesImpl { - constructor(track) { - this.track = track; - } - zoomFeature() { - return new ZoomFeatureImpl(this.track); - } - torchFeature() { - return new TorchFeatureImpl(this.track); - } -} -class RenderedCameraImpl { - constructor(parentElement, mediaStream, callbacks) { - this.isClosed = false; - this.parentElement = parentElement; - this.mediaStream = mediaStream; - this.callbacks = callbacks; - this.surface = this.createVideoElement(this.parentElement.clientWidth); - parentElement.append(this.surface); - } - createVideoElement(width) { - const videoElement = document.createElement("video"); - videoElement.style.width = `${width}px`; - videoElement.style.display = "block"; - videoElement.muted = true; - videoElement.setAttribute("muted", "true"); - videoElement.playsInline = true; - return videoElement; - } - setupSurface() { - this.surface.onabort = () => { - throw "RenderedCameraImpl video surface onabort() called"; - }; - this.surface.onerror = () => { - throw "RenderedCameraImpl video surface onerror() called"; - }; - let onVideoStart = () => { - const videoWidth = this.surface.clientWidth; - const videoHeight = this.surface.clientHeight; - this.callbacks.onRenderSurfaceReady(videoWidth, videoHeight); - this.surface.removeEventListener("playing", onVideoStart); - }; - this.surface.addEventListener("playing", onVideoStart); - this.surface.srcObject = this.mediaStream; - this.surface.play(); - } - static create(parentElement, mediaStream, options, callbacks) { - return __awaiter(this, void 0, void 0, function* () { - let renderedCamera = new RenderedCameraImpl(parentElement, mediaStream, callbacks); - if (options.aspectRatio) { - let aspectRatioConstraint = { - aspectRatio: options.aspectRatio - }; - yield renderedCamera.getFirstTrackOrFail().applyConstraints(aspectRatioConstraint); - } - renderedCamera.setupSurface(); - return renderedCamera; - }); - } - failIfClosed() { - if (this.isClosed) { - throw "The RenderedCamera has already been closed."; - } - } - getFirstTrackOrFail() { - this.failIfClosed(); - if (this.mediaStream.getVideoTracks().length === 0) { - throw "No video tracks found"; - } - return this.mediaStream.getVideoTracks()[0]; - } - pause() { - this.failIfClosed(); - this.surface.pause(); - } - resume(onResumeCallback) { - this.failIfClosed(); - let $this = this; - const onVideoResume = () => { - setTimeout(onResumeCallback, 200); - $this.surface.removeEventListener("playing", onVideoResume); - }; - this.surface.addEventListener("playing", onVideoResume); - this.surface.play(); - } - isPaused() { - this.failIfClosed(); - return this.surface.paused; - } - getSurface() { - this.failIfClosed(); - return this.surface; - } - getRunningTrackCapabilities() { - return this.getFirstTrackOrFail().getCapabilities(); - } - getRunningTrackSettings() { - return this.getFirstTrackOrFail().getSettings(); - } - applyVideoConstraints(constraints) { - return __awaiter(this, void 0, void 0, function* () { - if ("aspectRatio" in constraints) { - throw "Changing 'aspectRatio' in run-time is not yet supported."; - } - return this.getFirstTrackOrFail().applyConstraints(constraints); - }); - } - close() { - if (this.isClosed) { - return Promise.resolve(); - } - let $this = this; - return new Promise((resolve, _) => { - let tracks = $this.mediaStream.getVideoTracks(); - const tracksToClose = tracks.length; - var tracksClosed = 0; - $this.mediaStream.getVideoTracks().forEach((videoTrack) => { - $this.mediaStream.removeTrack(videoTrack); - videoTrack.stop(); - ++tracksClosed; - if (tracksClosed >= tracksToClose) { - $this.isClosed = true; - $this.parentElement.removeChild($this.surface); - resolve(); - } - }); - }); - } - getCapabilities() { - return new CameraCapabilitiesImpl(this.getFirstTrackOrFail()); - } -} -export class CameraImpl { - constructor(mediaStream) { - this.mediaStream = mediaStream; - } - render(parentElement, options, callbacks) { - return __awaiter(this, void 0, void 0, function* () { - return RenderedCameraImpl.create(parentElement, this.mediaStream, options, callbacks); - }); - } - static create(videoConstraints) { - return __awaiter(this, void 0, void 0, function* () { - if (!navigator.mediaDevices) { - throw "navigator.mediaDevices not supported"; - } - let constraints = { - audio: false, - video: videoConstraints - }; - let mediaStream = yield navigator.mediaDevices.getUserMedia(constraints); - return new CameraImpl(mediaStream); - }); - } -} -//# sourceMappingURL=core-impl.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/camera/core-impl.js.map b/node_modules/html5-qrcode/es2015/camera/core-impl.js.map deleted file mode 100644 index 75ed98f..0000000 --- a/node_modules/html5-qrcode/es2015/camera/core-impl.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"core-impl.js","sourceRoot":"","sources":["../../../src/camera/core-impl.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/camera/core.d.ts b/node_modules/html5-qrcode/es2015/camera/core.d.ts deleted file mode 100644 index 52e27b5..0000000 --- a/node_modules/html5-qrcode/es2015/camera/core.d.ts +++ /dev/null @@ -1,41 +0,0 @@ -export interface CameraDevice { - id: string; - label: string; -} -export interface CameraCapability { - isSupported(): boolean; - apply(value: T): Promise; - value(): T | null; -} -export interface RangeCameraCapability extends CameraCapability { - min(): number; - max(): number; - step(): number; -} -export interface BooleanCameraCapability extends CameraCapability { -} -export interface CameraCapabilities { - zoomFeature(): RangeCameraCapability; - torchFeature(): BooleanCameraCapability; -} -export type OnRenderSurfaceReady = (viewfinderWidth: number, viewfinderHeight: number) => void; -export interface RenderingCallbacks { - onRenderSurfaceReady: OnRenderSurfaceReady; -} -export interface RenderedCamera { - getSurface(): HTMLVideoElement; - pause(): void; - resume(onResumeCallback: () => void): void; - isPaused(): boolean; - close(): Promise; - getRunningTrackCapabilities(): MediaTrackCapabilities; - getRunningTrackSettings(): MediaTrackSettings; - applyVideoConstraints(constraints: MediaTrackConstraints): Promise; - getCapabilities(): CameraCapabilities; -} -export interface CameraRenderingOptions { - aspectRatio?: number; -} -export interface Camera { - render(parentElement: HTMLElement, options: CameraRenderingOptions, callbacks: RenderingCallbacks): Promise; -} diff --git a/node_modules/html5-qrcode/es2015/camera/core.js b/node_modules/html5-qrcode/es2015/camera/core.js deleted file mode 100644 index d59ace3..0000000 --- a/node_modules/html5-qrcode/es2015/camera/core.js +++ /dev/null @@ -1,2 +0,0 @@ -export {}; -//# sourceMappingURL=core.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/camera/core.js.map b/node_modules/html5-qrcode/es2015/camera/core.js.map deleted file mode 100644 index 28f32d7..0000000 --- a/node_modules/html5-qrcode/es2015/camera/core.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/camera/core.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/camera/factories.d.ts b/node_modules/html5-qrcode/es2015/camera/factories.d.ts deleted file mode 100644 index df98f8f..0000000 --- a/node_modules/html5-qrcode/es2015/camera/factories.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Camera } from "./core"; -export declare class CameraFactory { - static failIfNotSupported(): Promise; - private constructor(); - create(videoConstraints: MediaTrackConstraints): Promise; -} diff --git a/node_modules/html5-qrcode/es2015/camera/factories.js b/node_modules/html5-qrcode/es2015/camera/factories.js deleted file mode 100644 index ff79ee4..0000000 --- a/node_modules/html5-qrcode/es2015/camera/factories.js +++ /dev/null @@ -1,27 +0,0 @@ -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -import { CameraImpl } from "./core-impl"; -export class CameraFactory { - static failIfNotSupported() { - return __awaiter(this, void 0, void 0, function* () { - if (!navigator.mediaDevices) { - throw "navigator.mediaDevices not supported"; - } - return new CameraFactory(); - }); - } - constructor() { } - create(videoConstraints) { - return __awaiter(this, void 0, void 0, function* () { - return CameraImpl.create(videoConstraints); - }); - } -} -//# sourceMappingURL=factories.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/camera/factories.js.map b/node_modules/html5-qrcode/es2015/camera/factories.js.map deleted file mode 100644 index b6b440c..0000000 --- a/node_modules/html5-qrcode/es2015/camera/factories.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"factories.js","sourceRoot":"","sources":["../../../src/camera/factories.ts"],"names":[],"mappings":";;;;;;;;;AAQA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,OAAO,aAAa;IAMf,MAAM,CAAO,kBAAkB;;YAClC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;gBACzB,MAAM,sCAAsC,CAAC;aAChD;YAED,OAAO,IAAI,aAAa,EAAE,CAAC;QAC/B,CAAC;KAAA;IAED,gBAAqC,CAAC;IAGzB,MAAM,CAAC,gBAAuC;;YAEvD,OAAO,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC/C,CAAC;KAAA;CACJ"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/camera/permissions.d.ts b/node_modules/html5-qrcode/es2015/camera/permissions.d.ts deleted file mode 100644 index 4209c55..0000000 --- a/node_modules/html5-qrcode/es2015/camera/permissions.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export declare class CameraPermissions { - static hasPermissions(): Promise; -} diff --git a/node_modules/html5-qrcode/es2015/camera/permissions.js b/node_modules/html5-qrcode/es2015/camera/permissions.js deleted file mode 100644 index 1e7e778..0000000 --- a/node_modules/html5-qrcode/es2015/camera/permissions.js +++ /dev/null @@ -1,23 +0,0 @@ -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -export class CameraPermissions { - static hasPermissions() { - return __awaiter(this, void 0, void 0, function* () { - let devices = yield navigator.mediaDevices.enumerateDevices(); - for (const device of devices) { - if (device.kind === "videoinput" && device.label) { - return true; - } - } - return false; - }); - } -} -//# sourceMappingURL=permissions.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/camera/permissions.js.map b/node_modules/html5-qrcode/es2015/camera/permissions.js.map deleted file mode 100644 index a7b26f0..0000000 --- a/node_modules/html5-qrcode/es2015/camera/permissions.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../src/camera/permissions.ts"],"names":[],"mappings":";;;;;;;;;AAYC,MAAM,OAAO,iBAAiB;IAMpB,MAAM,CAAO,cAAc;;YAIhC,IAAI,OAAO,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC;YAC9D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;gBAG5B,IAAG,MAAM,CAAC,IAAI,KAAK,YAAY,IAAI,MAAM,CAAC,KAAK,EAAE;oBAC/C,OAAO,IAAI,CAAC;iBACb;aACF;YAED,OAAO,KAAK,CAAC;QACf,CAAC;KAAA;CACJ"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/camera/retriever.d.ts b/node_modules/html5-qrcode/es2015/camera/retriever.d.ts deleted file mode 100644 index 0baac12..0000000 --- a/node_modules/html5-qrcode/es2015/camera/retriever.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { CameraDevice } from "./core"; -export declare class CameraRetriever { - static retrieve(): Promise>; - private static rejectWithError; - private static isHttpsOrLocalhost; - private static getCamerasFromMediaDevices; - private static getCamerasFromMediaStreamTrack; -} diff --git a/node_modules/html5-qrcode/es2015/camera/retriever.js b/node_modules/html5-qrcode/es2015/camera/retriever.js deleted file mode 100644 index 0112ebb..0000000 --- a/node_modules/html5-qrcode/es2015/camera/retriever.js +++ /dev/null @@ -1,80 +0,0 @@ -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -import { Html5QrcodeStrings } from "../strings"; -export class CameraRetriever { - static retrieve() { - if (navigator.mediaDevices) { - return CameraRetriever.getCamerasFromMediaDevices(); - } - var mst = MediaStreamTrack; - if (MediaStreamTrack && mst.getSources) { - return CameraRetriever.getCamerasFromMediaStreamTrack(); - } - return CameraRetriever.rejectWithError(); - } - static rejectWithError() { - let errorMessage = Html5QrcodeStrings.unableToQuerySupportedDevices(); - if (!CameraRetriever.isHttpsOrLocalhost()) { - errorMessage = Html5QrcodeStrings.insecureContextCameraQueryError(); - } - return Promise.reject(errorMessage); - } - static isHttpsOrLocalhost() { - if (location.protocol === "https:") { - return true; - } - const host = location.host.split(":")[0]; - return host === "127.0.0.1" || host === "localhost"; - } - static getCamerasFromMediaDevices() { - return __awaiter(this, void 0, void 0, function* () { - const closeActiveStreams = (stream) => { - const tracks = stream.getVideoTracks(); - for (const track of tracks) { - track.enabled = false; - track.stop(); - stream.removeTrack(track); - } - }; - let mediaStream = yield navigator.mediaDevices.getUserMedia({ audio: false, video: true }); - let devices = yield navigator.mediaDevices.enumerateDevices(); - let results = []; - for (const device of devices) { - if (device.kind === "videoinput") { - results.push({ - id: device.deviceId, - label: device.label - }); - } - } - closeActiveStreams(mediaStream); - return results; - }); - } - static getCamerasFromMediaStreamTrack() { - return new Promise((resolve, _) => { - const callback = (sourceInfos) => { - const results = []; - for (const sourceInfo of sourceInfos) { - if (sourceInfo.kind === "video") { - results.push({ - id: sourceInfo.id, - label: sourceInfo.label - }); - } - } - resolve(results); - }; - var mst = MediaStreamTrack; - mst.getSources(callback); - }); - } -} -//# sourceMappingURL=retriever.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/camera/retriever.js.map b/node_modules/html5-qrcode/es2015/camera/retriever.js.map deleted file mode 100644 index 8ad1186..0000000 --- a/node_modules/html5-qrcode/es2015/camera/retriever.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"retriever.js","sourceRoot":"","sources":["../../../src/camera/retriever.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/code-decoder.d.ts b/node_modules/html5-qrcode/es2015/code-decoder.d.ts deleted file mode 100644 index 13d5426..0000000 --- a/node_modules/html5-qrcode/es2015/code-decoder.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { QrcodeResult, Html5QrcodeSupportedFormats, Logger, RobustQrcodeDecoderAsync } from "./core"; -export declare class Html5QrcodeShim implements RobustQrcodeDecoderAsync { - private verbose; - private primaryDecoder; - private secondaryDecoder; - private readonly EXECUTIONS_TO_REPORT_PERFORMANCE; - private executions; - private executionResults; - private wasPrimaryDecoderUsedInLastDecode; - constructor(requestedFormats: Array, useBarCodeDetectorIfSupported: boolean, verbose: boolean, logger: Logger); - decodeAsync(canvas: HTMLCanvasElement): Promise; - decodeRobustlyAsync(canvas: HTMLCanvasElement): Promise; - private getDecoder; - private possiblyLogPerformance; - possiblyFlushPerformanceReport(): void; -} diff --git a/node_modules/html5-qrcode/es2015/code-decoder.js b/node_modules/html5-qrcode/es2015/code-decoder.js deleted file mode 100644 index 4567dc6..0000000 --- a/node_modules/html5-qrcode/es2015/code-decoder.js +++ /dev/null @@ -1,90 +0,0 @@ -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -import { ZXingHtml5QrcodeDecoder } from "./zxing-html5-qrcode-decoder"; -import { BarcodeDetectorDelegate } from "./native-bar-code-detector"; -export class Html5QrcodeShim { - constructor(requestedFormats, useBarCodeDetectorIfSupported, verbose, logger) { - this.EXECUTIONS_TO_REPORT_PERFORMANCE = 100; - this.executions = 0; - this.executionResults = []; - this.wasPrimaryDecoderUsedInLastDecode = false; - this.verbose = verbose; - if (useBarCodeDetectorIfSupported - && BarcodeDetectorDelegate.isSupported()) { - this.primaryDecoder = new BarcodeDetectorDelegate(requestedFormats, verbose, logger); - this.secondaryDecoder = new ZXingHtml5QrcodeDecoder(requestedFormats, verbose, logger); - } - else { - this.primaryDecoder = new ZXingHtml5QrcodeDecoder(requestedFormats, verbose, logger); - } - } - decodeAsync(canvas) { - return __awaiter(this, void 0, void 0, function* () { - let startTime = performance.now(); - try { - return yield this.getDecoder().decodeAsync(canvas); - } - finally { - this.possiblyLogPerformance(startTime); - } - }); - } - decodeRobustlyAsync(canvas) { - return __awaiter(this, void 0, void 0, function* () { - let startTime = performance.now(); - try { - return yield this.primaryDecoder.decodeAsync(canvas); - } - catch (error) { - if (this.secondaryDecoder) { - return this.secondaryDecoder.decodeAsync(canvas); - } - throw error; - } - finally { - this.possiblyLogPerformance(startTime); - } - }); - } - getDecoder() { - if (!this.secondaryDecoder) { - return this.primaryDecoder; - } - if (this.wasPrimaryDecoderUsedInLastDecode === false) { - this.wasPrimaryDecoderUsedInLastDecode = true; - return this.primaryDecoder; - } - this.wasPrimaryDecoderUsedInLastDecode = false; - return this.secondaryDecoder; - } - possiblyLogPerformance(startTime) { - if (!this.verbose) { - return; - } - let executionTime = performance.now() - startTime; - this.executionResults.push(executionTime); - this.executions++; - this.possiblyFlushPerformanceReport(); - } - possiblyFlushPerformanceReport() { - if (this.executions < this.EXECUTIONS_TO_REPORT_PERFORMANCE) { - return; - } - let sum = 0; - for (let executionTime of this.executionResults) { - sum += executionTime; - } - let mean = sum / this.executionResults.length; - console.log(`${mean} ms for ${this.executionResults.length} last runs.`); - this.executions = 0; - this.executionResults = []; - } -} -//# sourceMappingURL=code-decoder.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/code-decoder.js.map b/node_modules/html5-qrcode/es2015/code-decoder.js.map deleted file mode 100644 index a9a0947..0000000 --- a/node_modules/html5-qrcode/es2015/code-decoder.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"code-decoder.js","sourceRoot":"","sources":["../../src/code-decoder.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/core.d.ts b/node_modules/html5-qrcode/es2015/core.d.ts deleted file mode 100644 index 0d0206d..0000000 --- a/node_modules/html5-qrcode/es2015/core.d.ts +++ /dev/null @@ -1,105 +0,0 @@ -export declare enum Html5QrcodeSupportedFormats { - QR_CODE = 0, - AZTEC = 1, - CODABAR = 2, - CODE_39 = 3, - CODE_93 = 4, - CODE_128 = 5, - DATA_MATRIX = 6, - MAXICODE = 7, - ITF = 8, - EAN_13 = 9, - EAN_8 = 10, - PDF_417 = 11, - RSS_14 = 12, - RSS_EXPANDED = 13, - UPC_A = 14, - UPC_E = 15, - UPC_EAN_EXTENSION = 16 -} -export declare enum DecodedTextType { - UNKNOWN = 0, - URL = 1 -} -export declare function isValidHtml5QrcodeSupportedFormats(format: any): boolean; -export declare enum Html5QrcodeScanType { - SCAN_TYPE_CAMERA = 0, - SCAN_TYPE_FILE = 1 -} -export declare class Html5QrcodeConstants { - static GITHUB_PROJECT_URL: string; - static SCAN_DEFAULT_FPS: number; - static DEFAULT_DISABLE_FLIP: boolean; - static DEFAULT_REMEMBER_LAST_CAMERA_USED: boolean; - static DEFAULT_SUPPORTED_SCAN_TYPE: Html5QrcodeScanType[]; -} -export interface QrDimensions { - width: number; - height: number; -} -export type QrDimensionFunction = (viewfinderWidth: number, viewfinderHeight: number) => QrDimensions; -export interface QrBounds extends QrDimensions { - x: number; - y: number; -} -export declare class QrcodeResultFormat { - readonly format: Html5QrcodeSupportedFormats; - readonly formatName: string; - private constructor(); - toString(): string; - static create(format: Html5QrcodeSupportedFormats): QrcodeResultFormat; -} -export interface QrcodeResultDebugData { - decoderName?: string; -} -export interface QrcodeResult { - text: string; - format?: QrcodeResultFormat; - bounds?: QrBounds; - decodedTextType?: DecodedTextType; - debugData?: QrcodeResultDebugData; -} -export interface Html5QrcodeResult { - decodedText: string; - result: QrcodeResult; -} -export declare class Html5QrcodeResultFactory { - static createFromText(decodedText: string): Html5QrcodeResult; - static createFromQrcodeResult(qrcodeResult: QrcodeResult): Html5QrcodeResult; -} -export declare enum Html5QrcodeErrorTypes { - UNKWOWN_ERROR = 0, - IMPLEMENTATION_ERROR = 1, - NO_CODE_FOUND_ERROR = 2 -} -export interface Html5QrcodeError { - errorMessage: string; - type: Html5QrcodeErrorTypes; -} -export declare class Html5QrcodeErrorFactory { - static createFrom(error: any): Html5QrcodeError; -} -export type QrcodeSuccessCallback = (decodedText: string, result: Html5QrcodeResult) => void; -export type QrcodeErrorCallback = (errorMessage: string, error: Html5QrcodeError) => void; -export interface QrcodeDecoderAsync { - decodeAsync(canvas: HTMLCanvasElement): Promise; -} -export interface RobustQrcodeDecoderAsync extends QrcodeDecoderAsync { - decodeRobustlyAsync(canvas: HTMLCanvasElement): Promise; -} -export interface Logger { - log(message: string): void; - warn(message: string): void; - logError(message: string, isExperimental?: boolean): void; - logErrors(errors: Array): void; -} -export declare class BaseLoggger implements Logger { - private verbose; - constructor(verbose: boolean); - log(message: string): void; - warn(message: string): void; - logError(message: string, isExperimental?: boolean): void; - logErrors(errors: Array): void; -} -export declare function isNullOrUndefined(obj?: any): boolean; -export declare function clip(value: number, minValue: number, maxValue: number): number; diff --git a/node_modules/html5-qrcode/es2015/core.js b/node_modules/html5-qrcode/es2015/core.js deleted file mode 100644 index 769580e..0000000 --- a/node_modules/html5-qrcode/es2015/core.js +++ /dev/null @@ -1,149 +0,0 @@ -export var Html5QrcodeSupportedFormats; -(function (Html5QrcodeSupportedFormats) { - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["QR_CODE"] = 0] = "QR_CODE"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["AZTEC"] = 1] = "AZTEC"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["CODABAR"] = 2] = "CODABAR"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["CODE_39"] = 3] = "CODE_39"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["CODE_93"] = 4] = "CODE_93"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["CODE_128"] = 5] = "CODE_128"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["DATA_MATRIX"] = 6] = "DATA_MATRIX"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["MAXICODE"] = 7] = "MAXICODE"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["ITF"] = 8] = "ITF"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["EAN_13"] = 9] = "EAN_13"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["EAN_8"] = 10] = "EAN_8"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["PDF_417"] = 11] = "PDF_417"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["RSS_14"] = 12] = "RSS_14"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["RSS_EXPANDED"] = 13] = "RSS_EXPANDED"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["UPC_A"] = 14] = "UPC_A"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["UPC_E"] = 15] = "UPC_E"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["UPC_EAN_EXTENSION"] = 16] = "UPC_EAN_EXTENSION"; -})(Html5QrcodeSupportedFormats || (Html5QrcodeSupportedFormats = {})); -const html5QrcodeSupportedFormatsTextMap = new Map([ - [Html5QrcodeSupportedFormats.QR_CODE, "QR_CODE"], - [Html5QrcodeSupportedFormats.AZTEC, "AZTEC"], - [Html5QrcodeSupportedFormats.CODABAR, "CODABAR"], - [Html5QrcodeSupportedFormats.CODE_39, "CODE_39"], - [Html5QrcodeSupportedFormats.CODE_93, "CODE_93"], - [Html5QrcodeSupportedFormats.CODE_128, "CODE_128"], - [Html5QrcodeSupportedFormats.DATA_MATRIX, "DATA_MATRIX"], - [Html5QrcodeSupportedFormats.MAXICODE, "MAXICODE"], - [Html5QrcodeSupportedFormats.ITF, "ITF"], - [Html5QrcodeSupportedFormats.EAN_13, "EAN_13"], - [Html5QrcodeSupportedFormats.EAN_8, "EAN_8"], - [Html5QrcodeSupportedFormats.PDF_417, "PDF_417"], - [Html5QrcodeSupportedFormats.RSS_14, "RSS_14"], - [Html5QrcodeSupportedFormats.RSS_EXPANDED, "RSS_EXPANDED"], - [Html5QrcodeSupportedFormats.UPC_A, "UPC_A"], - [Html5QrcodeSupportedFormats.UPC_E, "UPC_E"], - [Html5QrcodeSupportedFormats.UPC_EAN_EXTENSION, "UPC_EAN_EXTENSION"] -]); -export var DecodedTextType; -(function (DecodedTextType) { - DecodedTextType[DecodedTextType["UNKNOWN"] = 0] = "UNKNOWN"; - DecodedTextType[DecodedTextType["URL"] = 1] = "URL"; -})(DecodedTextType || (DecodedTextType = {})); -export function isValidHtml5QrcodeSupportedFormats(format) { - return Object.values(Html5QrcodeSupportedFormats).includes(format); -} -export var Html5QrcodeScanType; -(function (Html5QrcodeScanType) { - Html5QrcodeScanType[Html5QrcodeScanType["SCAN_TYPE_CAMERA"] = 0] = "SCAN_TYPE_CAMERA"; - Html5QrcodeScanType[Html5QrcodeScanType["SCAN_TYPE_FILE"] = 1] = "SCAN_TYPE_FILE"; -})(Html5QrcodeScanType || (Html5QrcodeScanType = {})); -export class Html5QrcodeConstants { -} -Html5QrcodeConstants.GITHUB_PROJECT_URL = "https://github.com/mebjas/html5-qrcode"; -Html5QrcodeConstants.SCAN_DEFAULT_FPS = 2; -Html5QrcodeConstants.DEFAULT_DISABLE_FLIP = false; -Html5QrcodeConstants.DEFAULT_REMEMBER_LAST_CAMERA_USED = true; -Html5QrcodeConstants.DEFAULT_SUPPORTED_SCAN_TYPE = [ - Html5QrcodeScanType.SCAN_TYPE_CAMERA, - Html5QrcodeScanType.SCAN_TYPE_FILE -]; -export class QrcodeResultFormat { - constructor(format, formatName) { - this.format = format; - this.formatName = formatName; - } - toString() { - return this.formatName; - } - static create(format) { - if (!html5QrcodeSupportedFormatsTextMap.has(format)) { - throw `${format} not in html5QrcodeSupportedFormatsTextMap`; - } - return new QrcodeResultFormat(format, html5QrcodeSupportedFormatsTextMap.get(format)); - } -} -export class Html5QrcodeResultFactory { - static createFromText(decodedText) { - let qrcodeResult = { - text: decodedText - }; - return { - decodedText: decodedText, - result: qrcodeResult - }; - } - static createFromQrcodeResult(qrcodeResult) { - return { - decodedText: qrcodeResult.text, - result: qrcodeResult - }; - } -} -export var Html5QrcodeErrorTypes; -(function (Html5QrcodeErrorTypes) { - Html5QrcodeErrorTypes[Html5QrcodeErrorTypes["UNKWOWN_ERROR"] = 0] = "UNKWOWN_ERROR"; - Html5QrcodeErrorTypes[Html5QrcodeErrorTypes["IMPLEMENTATION_ERROR"] = 1] = "IMPLEMENTATION_ERROR"; - Html5QrcodeErrorTypes[Html5QrcodeErrorTypes["NO_CODE_FOUND_ERROR"] = 2] = "NO_CODE_FOUND_ERROR"; -})(Html5QrcodeErrorTypes || (Html5QrcodeErrorTypes = {})); -export class Html5QrcodeErrorFactory { - static createFrom(error) { - return { - errorMessage: error, - type: Html5QrcodeErrorTypes.UNKWOWN_ERROR - }; - } -} -export class BaseLoggger { - constructor(verbose) { - this.verbose = verbose; - } - log(message) { - if (this.verbose) { - console.log(message); - } - } - warn(message) { - if (this.verbose) { - console.warn(message); - } - } - logError(message, isExperimental) { - if (this.verbose || isExperimental === true) { - console.error(message); - } - } - logErrors(errors) { - if (errors.length === 0) { - throw "Logger#logError called without arguments"; - } - if (this.verbose) { - console.error(errors); - } - } -} -export function isNullOrUndefined(obj) { - return (typeof obj === "undefined") || obj === null; -} -export function clip(value, minValue, maxValue) { - if (value > maxValue) { - return maxValue; - } - if (value < minValue) { - return minValue; - } - return value; -} -//# sourceMappingURL=core.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/core.js.map b/node_modules/html5-qrcode/es2015/core.js.map deleted file mode 100644 index 61321cc..0000000 --- a/node_modules/html5-qrcode/es2015/core.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/core.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/experimental-features.d.ts b/node_modules/html5-qrcode/es2015/experimental-features.d.ts deleted file mode 100644 index 0413abe..0000000 --- a/node_modules/html5-qrcode/es2015/experimental-features.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface ExperimentalFeaturesConfig { - useBarCodeDetectorIfSupported?: boolean | undefined; -} diff --git a/node_modules/html5-qrcode/es2015/experimental-features.js b/node_modules/html5-qrcode/es2015/experimental-features.js deleted file mode 100644 index ab918ba..0000000 --- a/node_modules/html5-qrcode/es2015/experimental-features.js +++ /dev/null @@ -1,2 +0,0 @@ -export {}; -//# sourceMappingURL=experimental-features.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/experimental-features.js.map b/node_modules/html5-qrcode/es2015/experimental-features.js.map deleted file mode 100644 index 8b8b9dd..0000000 --- a/node_modules/html5-qrcode/es2015/experimental-features.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"experimental-features.js","sourceRoot":"","sources":["../../src/experimental-features.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/html5-qrcode-scanner.d.ts b/node_modules/html5-qrcode/es2015/html5-qrcode-scanner.d.ts deleted file mode 100644 index 417175b..0000000 --- a/node_modules/html5-qrcode/es2015/html5-qrcode-scanner.d.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { Html5QrcodeScanType, QrcodeSuccessCallback, QrcodeErrorCallback } from "./core"; -import { Html5QrcodeConfigs, Html5QrcodeCameraScanConfig } from "./html5-qrcode"; -import { Html5QrcodeScannerState } from "./state-manager"; -export interface Html5QrcodeScannerConfig extends Html5QrcodeCameraScanConfig, Html5QrcodeConfigs { - rememberLastUsedCamera?: boolean | undefined; - supportedScanTypes?: Array | []; - showTorchButtonIfSupported?: boolean | undefined; - showZoomSliderIfSupported?: boolean | undefined; - defaultZoomValueIfSupported?: number | undefined; -} -export declare class Html5QrcodeScanner { - private elementId; - private config; - private verbose; - private currentScanType; - private sectionSwapAllowed; - private persistedDataManager; - private scanTypeSelector; - private logger; - private html5Qrcode; - private qrCodeSuccessCallback; - private qrCodeErrorCallback; - private lastMatchFound; - private cameraScanImage; - private fileScanImage; - private fileSelectionUi; - constructor(elementId: string, config: Html5QrcodeScannerConfig | undefined, verbose: boolean | undefined); - render(qrCodeSuccessCallback: QrcodeSuccessCallback, qrCodeErrorCallback: QrcodeErrorCallback | undefined): void; - pause(shouldPauseVideo?: boolean): void; - resume(): void; - getState(): Html5QrcodeScannerState; - clear(): Promise; - getRunningTrackCapabilities(): MediaTrackCapabilities; - getRunningTrackSettings(): MediaTrackSettings; - applyVideoConstraints(videoConstaints: MediaTrackConstraints): Promise; - private getHtml5QrcodeOrFail; - private createConfig; - private createBasicLayout; - private resetBasicLayout; - private setupInitialDashboard; - private createHeader; - private createSection; - private createCameraListUi; - private createPermissionButton; - private createPermissionsUi; - private createSectionControlPanel; - private renderFileScanUi; - private renderCameraSelection; - private createSectionSwap; - private startCameraScanIfPermissionExistsOnSwap; - private resetHeaderMessage; - private setHeaderMessage; - private showHideScanTypeSwapLink; - private insertCameraScanImageToScanRegion; - private insertFileScanImageToScanRegion; - private clearScanRegion; - private getDashboardSectionId; - private getDashboardSectionCameraScanRegionId; - private getDashboardSectionSwapLinkId; - private getScanRegionId; - private getDashboardId; - private getHeaderMessageContainerId; - private getCameraPermissionButtonId; - private getCameraScanRegion; - private getDashboardSectionSwapLink; - private getHeaderMessageDiv; -} diff --git a/node_modules/html5-qrcode/es2015/html5-qrcode-scanner.js b/node_modules/html5-qrcode/es2015/html5-qrcode-scanner.js deleted file mode 100644 index 81acc11..0000000 --- a/node_modules/html5-qrcode/es2015/html5-qrcode-scanner.js +++ /dev/null @@ -1,652 +0,0 @@ -import { Html5QrcodeConstants, Html5QrcodeScanType, Html5QrcodeErrorFactory, BaseLoggger, isNullOrUndefined, clip, } from "./core"; -import { Html5Qrcode, } from "./html5-qrcode"; -import { Html5QrcodeScannerStrings, } from "./strings"; -import { ASSET_FILE_SCAN, ASSET_CAMERA_SCAN, } from "./image-assets"; -import { PersistedDataManager } from "./storage"; -import { LibraryInfoContainer } from "./ui"; -import { CameraPermissions } from "./camera/permissions"; -import { ScanTypeSelector } from "./ui/scanner/scan-type-selector"; -import { TorchButton } from "./ui/scanner/torch-button"; -import { FileSelectionUi } from "./ui/scanner/file-selection-ui"; -import { BaseUiElementFactory, PublicUiElementIdAndClasses } from "./ui/scanner/base"; -import { CameraSelectionUi } from "./ui/scanner/camera-selection-ui"; -import { CameraZoomUi } from "./ui/scanner/camera-zoom-ui"; -var Html5QrcodeScannerStatus; -(function (Html5QrcodeScannerStatus) { - Html5QrcodeScannerStatus[Html5QrcodeScannerStatus["STATUS_DEFAULT"] = 0] = "STATUS_DEFAULT"; - Html5QrcodeScannerStatus[Html5QrcodeScannerStatus["STATUS_SUCCESS"] = 1] = "STATUS_SUCCESS"; - Html5QrcodeScannerStatus[Html5QrcodeScannerStatus["STATUS_WARNING"] = 2] = "STATUS_WARNING"; - Html5QrcodeScannerStatus[Html5QrcodeScannerStatus["STATUS_REQUESTING_PERMISSION"] = 3] = "STATUS_REQUESTING_PERMISSION"; -})(Html5QrcodeScannerStatus || (Html5QrcodeScannerStatus = {})); -function toHtml5QrcodeCameraScanConfig(config) { - return { - fps: config.fps, - qrbox: config.qrbox, - aspectRatio: config.aspectRatio, - disableFlip: config.disableFlip, - videoConstraints: config.videoConstraints - }; -} -function toHtml5QrcodeFullConfig(config, verbose) { - return { - formatsToSupport: config.formatsToSupport, - useBarCodeDetectorIfSupported: config.useBarCodeDetectorIfSupported, - experimentalFeatures: config.experimentalFeatures, - verbose: verbose - }; -} -export class Html5QrcodeScanner { - constructor(elementId, config, verbose) { - this.lastMatchFound = null; - this.cameraScanImage = null; - this.fileScanImage = null; - this.fileSelectionUi = null; - this.elementId = elementId; - this.config = this.createConfig(config); - this.verbose = verbose === true; - if (!document.getElementById(elementId)) { - throw `HTML Element with id=${elementId} not found`; - } - this.scanTypeSelector = new ScanTypeSelector(this.config.supportedScanTypes); - this.currentScanType = this.scanTypeSelector.getDefaultScanType(); - this.sectionSwapAllowed = true; - this.logger = new BaseLoggger(this.verbose); - this.persistedDataManager = new PersistedDataManager(); - if (config.rememberLastUsedCamera !== true) { - this.persistedDataManager.reset(); - } - } - render(qrCodeSuccessCallback, qrCodeErrorCallback) { - this.lastMatchFound = null; - this.qrCodeSuccessCallback - = (decodedText, result) => { - if (qrCodeSuccessCallback) { - qrCodeSuccessCallback(decodedText, result); - } - else { - if (this.lastMatchFound === decodedText) { - return; - } - this.lastMatchFound = decodedText; - this.setHeaderMessage(Html5QrcodeScannerStrings.lastMatch(decodedText), Html5QrcodeScannerStatus.STATUS_SUCCESS); - } - }; - this.qrCodeErrorCallback = - (errorMessage, error) => { - if (qrCodeErrorCallback) { - qrCodeErrorCallback(errorMessage, error); - } - }; - const container = document.getElementById(this.elementId); - if (!container) { - throw `HTML Element with id=${this.elementId} not found`; - } - container.innerHTML = ""; - this.createBasicLayout(container); - this.html5Qrcode = new Html5Qrcode(this.getScanRegionId(), toHtml5QrcodeFullConfig(this.config, this.verbose)); - } - pause(shouldPauseVideo) { - if (isNullOrUndefined(shouldPauseVideo) || shouldPauseVideo !== true) { - shouldPauseVideo = false; - } - this.getHtml5QrcodeOrFail().pause(shouldPauseVideo); - } - resume() { - this.getHtml5QrcodeOrFail().resume(); - } - getState() { - return this.getHtml5QrcodeOrFail().getState(); - } - clear() { - const emptyHtmlContainer = () => { - const mainContainer = document.getElementById(this.elementId); - if (mainContainer) { - mainContainer.innerHTML = ""; - this.resetBasicLayout(mainContainer); - } - }; - if (this.html5Qrcode) { - return new Promise((resolve, reject) => { - if (!this.html5Qrcode) { - resolve(); - return; - } - if (this.html5Qrcode.isScanning) { - this.html5Qrcode.stop().then((_) => { - if (!this.html5Qrcode) { - resolve(); - return; - } - this.html5Qrcode.clear(); - emptyHtmlContainer(); - resolve(); - }).catch((error) => { - if (this.verbose) { - this.logger.logError("Unable to stop qrcode scanner", error); - } - reject(error); - }); - } - else { - this.html5Qrcode.clear(); - emptyHtmlContainer(); - resolve(); - } - }); - } - return Promise.resolve(); - } - getRunningTrackCapabilities() { - return this.getHtml5QrcodeOrFail().getRunningTrackCapabilities(); - } - getRunningTrackSettings() { - return this.getHtml5QrcodeOrFail().getRunningTrackSettings(); - } - applyVideoConstraints(videoConstaints) { - return this.getHtml5QrcodeOrFail().applyVideoConstraints(videoConstaints); - } - getHtml5QrcodeOrFail() { - if (!this.html5Qrcode) { - throw "Code scanner not initialized."; - } - return this.html5Qrcode; - } - createConfig(config) { - if (config) { - if (!config.fps) { - config.fps = Html5QrcodeConstants.SCAN_DEFAULT_FPS; - } - if (config.rememberLastUsedCamera !== (!Html5QrcodeConstants.DEFAULT_REMEMBER_LAST_CAMERA_USED)) { - config.rememberLastUsedCamera - = Html5QrcodeConstants.DEFAULT_REMEMBER_LAST_CAMERA_USED; - } - if (!config.supportedScanTypes) { - config.supportedScanTypes - = Html5QrcodeConstants.DEFAULT_SUPPORTED_SCAN_TYPE; - } - return config; - } - return { - fps: Html5QrcodeConstants.SCAN_DEFAULT_FPS, - rememberLastUsedCamera: Html5QrcodeConstants.DEFAULT_REMEMBER_LAST_CAMERA_USED, - supportedScanTypes: Html5QrcodeConstants.DEFAULT_SUPPORTED_SCAN_TYPE - }; - } - createBasicLayout(parent) { - parent.style.position = "relative"; - parent.style.padding = "0px"; - parent.style.border = "1px solid silver"; - this.createHeader(parent); - const qrCodeScanRegion = document.createElement("div"); - const scanRegionId = this.getScanRegionId(); - qrCodeScanRegion.id = scanRegionId; - qrCodeScanRegion.style.width = "100%"; - qrCodeScanRegion.style.minHeight = "100px"; - qrCodeScanRegion.style.textAlign = "center"; - parent.appendChild(qrCodeScanRegion); - if (ScanTypeSelector.isCameraScanType(this.currentScanType)) { - this.insertCameraScanImageToScanRegion(); - } - else { - this.insertFileScanImageToScanRegion(); - } - const qrCodeDashboard = document.createElement("div"); - const dashboardId = this.getDashboardId(); - qrCodeDashboard.id = dashboardId; - qrCodeDashboard.style.width = "100%"; - parent.appendChild(qrCodeDashboard); - this.setupInitialDashboard(qrCodeDashboard); - } - resetBasicLayout(mainContainer) { - mainContainer.style.border = "none"; - } - setupInitialDashboard(dashboard) { - this.createSection(dashboard); - this.createSectionControlPanel(); - if (this.scanTypeSelector.hasMoreThanOneScanType()) { - this.createSectionSwap(); - } - } - createHeader(dashboard) { - const header = document.createElement("div"); - header.style.textAlign = "left"; - header.style.margin = "0px"; - dashboard.appendChild(header); - let libraryInfo = new LibraryInfoContainer(); - libraryInfo.renderInto(header); - const headerMessageContainer = document.createElement("div"); - headerMessageContainer.id = this.getHeaderMessageContainerId(); - headerMessageContainer.style.display = "none"; - headerMessageContainer.style.textAlign = "center"; - headerMessageContainer.style.fontSize = "14px"; - headerMessageContainer.style.padding = "2px 10px"; - headerMessageContainer.style.margin = "4px"; - headerMessageContainer.style.borderTop = "1px solid #f6f6f6"; - header.appendChild(headerMessageContainer); - } - createSection(dashboard) { - const section = document.createElement("div"); - section.id = this.getDashboardSectionId(); - section.style.width = "100%"; - section.style.padding = "10px 0px 10px 0px"; - section.style.textAlign = "left"; - dashboard.appendChild(section); - } - createCameraListUi(scpCameraScanRegion, requestPermissionContainer, requestPermissionButton) { - const $this = this; - $this.showHideScanTypeSwapLink(false); - $this.setHeaderMessage(Html5QrcodeScannerStrings.cameraPermissionRequesting()); - const createPermissionButtonIfNotExists = () => { - if (!requestPermissionButton) { - $this.createPermissionButton(scpCameraScanRegion, requestPermissionContainer); - } - }; - Html5Qrcode.getCameras().then((cameras) => { - $this.persistedDataManager.setHasPermission(true); - $this.showHideScanTypeSwapLink(true); - $this.resetHeaderMessage(); - if (cameras && cameras.length > 0) { - scpCameraScanRegion.removeChild(requestPermissionContainer); - $this.renderCameraSelection(cameras); - } - else { - $this.setHeaderMessage(Html5QrcodeScannerStrings.noCameraFound(), Html5QrcodeScannerStatus.STATUS_WARNING); - createPermissionButtonIfNotExists(); - } - }).catch((error) => { - $this.persistedDataManager.setHasPermission(false); - if (requestPermissionButton) { - requestPermissionButton.disabled = false; - } - else { - createPermissionButtonIfNotExists(); - } - $this.setHeaderMessage(error, Html5QrcodeScannerStatus.STATUS_WARNING); - $this.showHideScanTypeSwapLink(true); - }); - } - createPermissionButton(scpCameraScanRegion, requestPermissionContainer) { - const $this = this; - const requestPermissionButton = BaseUiElementFactory - .createElement("button", this.getCameraPermissionButtonId()); - requestPermissionButton.innerText - = Html5QrcodeScannerStrings.cameraPermissionTitle(); - requestPermissionButton.addEventListener("click", function () { - requestPermissionButton.disabled = true; - $this.createCameraListUi(scpCameraScanRegion, requestPermissionContainer, requestPermissionButton); - }); - requestPermissionContainer.appendChild(requestPermissionButton); - } - createPermissionsUi(scpCameraScanRegion, requestPermissionContainer) { - const $this = this; - if (ScanTypeSelector.isCameraScanType(this.currentScanType) - && this.persistedDataManager.hasCameraPermissions()) { - CameraPermissions.hasPermissions().then((hasPermissions) => { - if (hasPermissions) { - $this.createCameraListUi(scpCameraScanRegion, requestPermissionContainer); - } - else { - $this.persistedDataManager.setHasPermission(false); - $this.createPermissionButton(scpCameraScanRegion, requestPermissionContainer); - } - }).catch((_) => { - $this.persistedDataManager.setHasPermission(false); - $this.createPermissionButton(scpCameraScanRegion, requestPermissionContainer); - }); - return; - } - this.createPermissionButton(scpCameraScanRegion, requestPermissionContainer); - } - createSectionControlPanel() { - const section = document.getElementById(this.getDashboardSectionId()); - const sectionControlPanel = document.createElement("div"); - section.appendChild(sectionControlPanel); - const scpCameraScanRegion = document.createElement("div"); - scpCameraScanRegion.id = this.getDashboardSectionCameraScanRegionId(); - scpCameraScanRegion.style.display - = ScanTypeSelector.isCameraScanType(this.currentScanType) - ? "block" : "none"; - sectionControlPanel.appendChild(scpCameraScanRegion); - const requestPermissionContainer = document.createElement("div"); - requestPermissionContainer.style.textAlign = "center"; - scpCameraScanRegion.appendChild(requestPermissionContainer); - if (this.scanTypeSelector.isCameraScanRequired()) { - this.createPermissionsUi(scpCameraScanRegion, requestPermissionContainer); - } - this.renderFileScanUi(sectionControlPanel); - } - renderFileScanUi(parent) { - let showOnRender = ScanTypeSelector.isFileScanType(this.currentScanType); - const $this = this; - let onFileSelected = (file) => { - if (!$this.html5Qrcode) { - throw "html5Qrcode not defined"; - } - if (!ScanTypeSelector.isFileScanType($this.currentScanType)) { - return; - } - $this.setHeaderMessage(Html5QrcodeScannerStrings.loadingImage()); - $this.html5Qrcode.scanFileV2(file, true) - .then((html5qrcodeResult) => { - $this.resetHeaderMessage(); - $this.qrCodeSuccessCallback(html5qrcodeResult.decodedText, html5qrcodeResult); - }) - .catch((error) => { - $this.setHeaderMessage(error, Html5QrcodeScannerStatus.STATUS_WARNING); - $this.qrCodeErrorCallback(error, Html5QrcodeErrorFactory.createFrom(error)); - }); - }; - this.fileSelectionUi = FileSelectionUi.create(parent, showOnRender, onFileSelected); - } - renderCameraSelection(cameras) { - const $this = this; - const scpCameraScanRegion = document.getElementById(this.getDashboardSectionCameraScanRegionId()); - scpCameraScanRegion.style.textAlign = "center"; - let cameraZoomUi = CameraZoomUi.create(scpCameraScanRegion, false); - const renderCameraZoomUiIfSupported = (cameraCapabilities) => { - let zoomCapability = cameraCapabilities.zoomFeature(); - if (!zoomCapability.isSupported()) { - return; - } - cameraZoomUi.setOnCameraZoomValueChangeCallback((zoomValue) => { - zoomCapability.apply(zoomValue); - }); - let defaultZoom = 1; - if (this.config.defaultZoomValueIfSupported) { - defaultZoom = this.config.defaultZoomValueIfSupported; - } - defaultZoom = clip(defaultZoom, zoomCapability.min(), zoomCapability.max()); - cameraZoomUi.setValues(zoomCapability.min(), zoomCapability.max(), defaultZoom, zoomCapability.step()); - cameraZoomUi.show(); - }; - let cameraSelectUi = CameraSelectionUi.create(scpCameraScanRegion, cameras); - const cameraActionContainer = document.createElement("span"); - const cameraActionStartButton = BaseUiElementFactory.createElement("button", PublicUiElementIdAndClasses.CAMERA_START_BUTTON_ID); - cameraActionStartButton.innerText - = Html5QrcodeScannerStrings.scanButtonStartScanningText(); - cameraActionContainer.appendChild(cameraActionStartButton); - const cameraActionStopButton = BaseUiElementFactory.createElement("button", PublicUiElementIdAndClasses.CAMERA_STOP_BUTTON_ID); - cameraActionStopButton.innerText - = Html5QrcodeScannerStrings.scanButtonStopScanningText(); - cameraActionStopButton.style.display = "none"; - cameraActionStopButton.disabled = true; - cameraActionContainer.appendChild(cameraActionStopButton); - let torchButton; - const createAndShowTorchButtonIfSupported = (cameraCapabilities) => { - if (!cameraCapabilities.torchFeature().isSupported()) { - if (torchButton) { - torchButton.hide(); - } - return; - } - if (!torchButton) { - torchButton = TorchButton.create(cameraActionContainer, cameraCapabilities.torchFeature(), { display: "none", marginLeft: "5px" }, (errorMessage) => { - $this.setHeaderMessage(errorMessage, Html5QrcodeScannerStatus.STATUS_WARNING); - }); - } - else { - torchButton.updateTorchCapability(cameraCapabilities.torchFeature()); - } - torchButton.show(); - }; - scpCameraScanRegion.appendChild(cameraActionContainer); - const resetCameraActionStartButton = (shouldShow) => { - if (!shouldShow) { - cameraActionStartButton.style.display = "none"; - } - cameraActionStartButton.innerText - = Html5QrcodeScannerStrings - .scanButtonStartScanningText(); - cameraActionStartButton.style.opacity = "1"; - cameraActionStartButton.disabled = false; - if (shouldShow) { - cameraActionStartButton.style.display = "inline-block"; - } - }; - cameraActionStartButton.addEventListener("click", (_) => { - cameraActionStartButton.innerText - = Html5QrcodeScannerStrings.scanButtonScanningStarting(); - cameraSelectUi.disable(); - cameraActionStartButton.disabled = true; - cameraActionStartButton.style.opacity = "0.5"; - if (this.scanTypeSelector.hasMoreThanOneScanType()) { - $this.showHideScanTypeSwapLink(false); - } - $this.resetHeaderMessage(); - const cameraId = cameraSelectUi.getValue(); - $this.persistedDataManager.setLastUsedCameraId(cameraId); - $this.html5Qrcode.start(cameraId, toHtml5QrcodeCameraScanConfig($this.config), $this.qrCodeSuccessCallback, $this.qrCodeErrorCallback) - .then((_) => { - cameraActionStopButton.disabled = false; - cameraActionStopButton.style.display = "inline-block"; - resetCameraActionStartButton(false); - const cameraCapabilities = $this.html5Qrcode.getRunningTrackCameraCapabilities(); - if (this.config.showTorchButtonIfSupported === true) { - createAndShowTorchButtonIfSupported(cameraCapabilities); - } - if (this.config.showZoomSliderIfSupported === true) { - renderCameraZoomUiIfSupported(cameraCapabilities); - } - }) - .catch((error) => { - $this.showHideScanTypeSwapLink(true); - cameraSelectUi.enable(); - resetCameraActionStartButton(true); - $this.setHeaderMessage(error, Html5QrcodeScannerStatus.STATUS_WARNING); - }); - }); - if (cameraSelectUi.hasSingleItem()) { - cameraActionStartButton.click(); - } - cameraActionStopButton.addEventListener("click", (_) => { - if (!$this.html5Qrcode) { - throw "html5Qrcode not defined"; - } - cameraActionStopButton.disabled = true; - $this.html5Qrcode.stop() - .then((_) => { - if (this.scanTypeSelector.hasMoreThanOneScanType()) { - $this.showHideScanTypeSwapLink(true); - } - cameraSelectUi.enable(); - cameraActionStartButton.disabled = false; - cameraActionStopButton.style.display = "none"; - cameraActionStartButton.style.display = "inline-block"; - if (torchButton) { - torchButton.reset(); - torchButton.hide(); - } - cameraZoomUi.removeOnCameraZoomValueChangeCallback(); - cameraZoomUi.hide(); - $this.insertCameraScanImageToScanRegion(); - }).catch((error) => { - cameraActionStopButton.disabled = false; - $this.setHeaderMessage(error, Html5QrcodeScannerStatus.STATUS_WARNING); - }); - }); - if ($this.persistedDataManager.getLastUsedCameraId()) { - const cameraId = $this.persistedDataManager.getLastUsedCameraId(); - if (cameraSelectUi.hasValue(cameraId)) { - cameraSelectUi.setValue(cameraId); - cameraActionStartButton.click(); - } - else { - $this.persistedDataManager.resetLastUsedCameraId(); - } - } - } - createSectionSwap() { - const $this = this; - const TEXT_IF_CAMERA_SCAN_SELECTED = Html5QrcodeScannerStrings.textIfCameraScanSelected(); - const TEXT_IF_FILE_SCAN_SELECTED = Html5QrcodeScannerStrings.textIfFileScanSelected(); - const section = document.getElementById(this.getDashboardSectionId()); - const switchContainer = document.createElement("div"); - switchContainer.style.textAlign = "center"; - const switchScanTypeLink = BaseUiElementFactory.createElement("span", this.getDashboardSectionSwapLinkId()); - switchScanTypeLink.style.textDecoration = "underline"; - switchScanTypeLink.style.cursor = "pointer"; - switchScanTypeLink.innerText - = ScanTypeSelector.isCameraScanType(this.currentScanType) - ? TEXT_IF_CAMERA_SCAN_SELECTED : TEXT_IF_FILE_SCAN_SELECTED; - switchScanTypeLink.addEventListener("click", function () { - if (!$this.sectionSwapAllowed) { - if ($this.verbose) { - $this.logger.logError("Section swap called when not allowed"); - } - return; - } - $this.resetHeaderMessage(); - $this.fileSelectionUi.resetValue(); - $this.sectionSwapAllowed = false; - if (ScanTypeSelector.isCameraScanType($this.currentScanType)) { - $this.clearScanRegion(); - $this.getCameraScanRegion().style.display = "none"; - $this.fileSelectionUi.show(); - switchScanTypeLink.innerText = TEXT_IF_FILE_SCAN_SELECTED; - $this.currentScanType = Html5QrcodeScanType.SCAN_TYPE_FILE; - $this.insertFileScanImageToScanRegion(); - } - else { - $this.clearScanRegion(); - $this.getCameraScanRegion().style.display = "block"; - $this.fileSelectionUi.hide(); - switchScanTypeLink.innerText = TEXT_IF_CAMERA_SCAN_SELECTED; - $this.currentScanType = Html5QrcodeScanType.SCAN_TYPE_CAMERA; - $this.insertCameraScanImageToScanRegion(); - $this.startCameraScanIfPermissionExistsOnSwap(); - } - $this.sectionSwapAllowed = true; - }); - switchContainer.appendChild(switchScanTypeLink); - section.appendChild(switchContainer); - } - startCameraScanIfPermissionExistsOnSwap() { - const $this = this; - if (this.persistedDataManager.hasCameraPermissions()) { - CameraPermissions.hasPermissions().then((hasPermissions) => { - if (hasPermissions) { - let permissionButton = document.getElementById($this.getCameraPermissionButtonId()); - if (!permissionButton) { - this.logger.logError("Permission button not found, fail;"); - throw "Permission button not found"; - } - permissionButton.click(); - } - else { - $this.persistedDataManager.setHasPermission(false); - } - }).catch((_) => { - $this.persistedDataManager.setHasPermission(false); - }); - return; - } - } - resetHeaderMessage() { - const messageDiv = document.getElementById(this.getHeaderMessageContainerId()); - messageDiv.style.display = "none"; - } - setHeaderMessage(messageText, scannerStatus) { - if (!scannerStatus) { - scannerStatus = Html5QrcodeScannerStatus.STATUS_DEFAULT; - } - const messageDiv = this.getHeaderMessageDiv(); - messageDiv.innerText = messageText; - messageDiv.style.display = "block"; - switch (scannerStatus) { - case Html5QrcodeScannerStatus.STATUS_SUCCESS: - messageDiv.style.background = "rgba(106, 175, 80, 0.26)"; - messageDiv.style.color = "#477735"; - break; - case Html5QrcodeScannerStatus.STATUS_WARNING: - messageDiv.style.background = "rgba(203, 36, 49, 0.14)"; - messageDiv.style.color = "#cb2431"; - break; - case Html5QrcodeScannerStatus.STATUS_DEFAULT: - default: - messageDiv.style.background = "rgba(0, 0, 0, 0)"; - messageDiv.style.color = "rgb(17, 17, 17)"; - break; - } - } - showHideScanTypeSwapLink(shouldDisplay) { - if (this.scanTypeSelector.hasMoreThanOneScanType()) { - if (shouldDisplay !== true) { - shouldDisplay = false; - } - this.sectionSwapAllowed = shouldDisplay; - this.getDashboardSectionSwapLink().style.display - = shouldDisplay ? "inline-block" : "none"; - } - } - insertCameraScanImageToScanRegion() { - const $this = this; - const qrCodeScanRegion = document.getElementById(this.getScanRegionId()); - if (this.cameraScanImage) { - qrCodeScanRegion.innerHTML = "
    "; - qrCodeScanRegion.appendChild(this.cameraScanImage); - return; - } - this.cameraScanImage = new Image; - this.cameraScanImage.onload = (_) => { - qrCodeScanRegion.innerHTML = "
    "; - qrCodeScanRegion.appendChild($this.cameraScanImage); - }; - this.cameraScanImage.width = 64; - this.cameraScanImage.style.opacity = "0.8"; - this.cameraScanImage.src = ASSET_CAMERA_SCAN; - this.cameraScanImage.alt = Html5QrcodeScannerStrings.cameraScanAltText(); - } - insertFileScanImageToScanRegion() { - const $this = this; - const qrCodeScanRegion = document.getElementById(this.getScanRegionId()); - if (this.fileScanImage) { - qrCodeScanRegion.innerHTML = "
    "; - qrCodeScanRegion.appendChild(this.fileScanImage); - return; - } - this.fileScanImage = new Image; - this.fileScanImage.onload = (_) => { - qrCodeScanRegion.innerHTML = "
    "; - qrCodeScanRegion.appendChild($this.fileScanImage); - }; - this.fileScanImage.width = 64; - this.fileScanImage.style.opacity = "0.8"; - this.fileScanImage.src = ASSET_FILE_SCAN; - this.fileScanImage.alt = Html5QrcodeScannerStrings.fileScanAltText(); - } - clearScanRegion() { - const qrCodeScanRegion = document.getElementById(this.getScanRegionId()); - qrCodeScanRegion.innerHTML = ""; - } - getDashboardSectionId() { - return `${this.elementId}__dashboard_section`; - } - getDashboardSectionCameraScanRegionId() { - return `${this.elementId}__dashboard_section_csr`; - } - getDashboardSectionSwapLinkId() { - return PublicUiElementIdAndClasses.SCAN_TYPE_CHANGE_ANCHOR_ID; - } - getScanRegionId() { - return `${this.elementId}__scan_region`; - } - getDashboardId() { - return `${this.elementId}__dashboard`; - } - getHeaderMessageContainerId() { - return `${this.elementId}__header_message`; - } - getCameraPermissionButtonId() { - return PublicUiElementIdAndClasses.CAMERA_PERMISSION_BUTTON_ID; - } - getCameraScanRegion() { - return document.getElementById(this.getDashboardSectionCameraScanRegionId()); - } - getDashboardSectionSwapLink() { - return document.getElementById(this.getDashboardSectionSwapLinkId()); - } - getHeaderMessageDiv() { - return document.getElementById(this.getHeaderMessageContainerId()); - } -} -//# sourceMappingURL=html5-qrcode-scanner.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/html5-qrcode-scanner.js.map b/node_modules/html5-qrcode/es2015/html5-qrcode-scanner.js.map deleted file mode 100644 index f70d4db..0000000 --- a/node_modules/html5-qrcode/es2015/html5-qrcode-scanner.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"html5-qrcode-scanner.js","sourceRoot":"","sources":["../../src/html5-qrcode-scanner.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/html5-qrcode.d.ts b/node_modules/html5-qrcode/es2015/html5-qrcode.d.ts deleted file mode 100644 index 0e57693..0000000 --- a/node_modules/html5-qrcode/es2015/html5-qrcode.d.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { QrcodeErrorCallback, QrcodeSuccessCallback, Html5QrcodeSupportedFormats, Html5QrcodeResult, QrDimensions, QrDimensionFunction } from "./core"; -import { CameraDevice, CameraCapabilities } from "./camera/core"; -import { ExperimentalFeaturesConfig } from "./experimental-features"; -import { Html5QrcodeScannerState } from "./state-manager"; -export interface Html5QrcodeConfigs { - formatsToSupport?: Array | undefined; - useBarCodeDetectorIfSupported?: boolean | undefined; - experimentalFeatures?: ExperimentalFeaturesConfig | undefined; -} -export interface Html5QrcodeFullConfig extends Html5QrcodeConfigs { - verbose: boolean | undefined; -} -export interface Html5QrcodeCameraScanConfig { - fps: number | undefined; - qrbox?: number | QrDimensions | QrDimensionFunction | undefined; - aspectRatio?: number | undefined; - disableFlip?: boolean | undefined; - videoConstraints?: MediaTrackConstraints | undefined; -} -export declare class Html5Qrcode { - private readonly logger; - private readonly elementId; - private readonly verbose; - private readonly qrcode; - private shouldScan; - private element; - private canvasElement; - private scannerPausedUiElement; - private hasBorderShaders; - private borderShaders; - private qrMatch; - private renderedCamera; - private foreverScanTimeout; - private qrRegion; - private context; - private lastScanImageFile; - private stateManagerProxy; - isScanning: boolean; - constructor(elementId: string, configOrVerbosityFlag?: boolean | Html5QrcodeFullConfig | undefined); - start(cameraIdOrConfig: string | MediaTrackConstraints, configuration: Html5QrcodeCameraScanConfig | undefined, qrCodeSuccessCallback: QrcodeSuccessCallback | undefined, qrCodeErrorCallback: QrcodeErrorCallback | undefined): Promise; - pause(shouldPauseVideo?: boolean): void; - resume(): void; - getState(): Html5QrcodeScannerState; - stop(): Promise; - scanFile(imageFile: File, showImage?: boolean): Promise; - scanFileV2(imageFile: File, showImage?: boolean): Promise; - clear(): void; - static getCameras(): Promise>; - getRunningTrackCapabilities(): MediaTrackCapabilities; - getRunningTrackSettings(): MediaTrackSettings; - getRunningTrackCameraCapabilities(): CameraCapabilities; - applyVideoConstraints(videoConstaints: MediaTrackConstraints): Promise; - private getRenderedCameraOrFail; - private getSupportedFormats; - private getUseBarCodeDetectorIfSupported; - private validateQrboxSize; - private validateQrboxConfig; - private toQrdimensions; - private setupUi; - private createScannerPausedUiElement; - private scanContext; - private foreverScan; - private createVideoConstraints; - private computeCanvasDrawConfig; - private clearElement; - private possiblyUpdateShaders; - private possiblyCloseLastScanImageFile; - private createCanvasElement; - private getShadedRegionBounds; - private possiblyInsertShadingElement; - private insertShaderBorders; - private showPausedState; - private hidePausedState; - private getTimeoutFps; -} diff --git a/node_modules/html5-qrcode/es2015/html5-qrcode.js b/node_modules/html5-qrcode/es2015/html5-qrcode.js deleted file mode 100644 index 1c4ff8d..0000000 --- a/node_modules/html5-qrcode/es2015/html5-qrcode.js +++ /dev/null @@ -1,810 +0,0 @@ -import { BaseLoggger, Html5QrcodeResultFactory, Html5QrcodeErrorFactory, Html5QrcodeSupportedFormats, isValidHtml5QrcodeSupportedFormats, Html5QrcodeConstants, isNullOrUndefined } from "./core"; -import { Html5QrcodeStrings } from "./strings"; -import { VideoConstraintsUtil } from "./utils"; -import { Html5QrcodeShim } from "./code-decoder"; -import { CameraFactory } from "./camera/factories"; -import { CameraRetriever } from "./camera/retriever"; -import { StateManagerFactory, Html5QrcodeScannerState } from "./state-manager"; -class Constants extends Html5QrcodeConstants { -} -Constants.DEFAULT_WIDTH = 300; -Constants.DEFAULT_WIDTH_OFFSET = 2; -Constants.FILE_SCAN_MIN_HEIGHT = 300; -Constants.FILE_SCAN_HIDDEN_CANVAS_PADDING = 100; -Constants.MIN_QR_BOX_SIZE = 50; -Constants.SHADED_LEFT = 1; -Constants.SHADED_RIGHT = 2; -Constants.SHADED_TOP = 3; -Constants.SHADED_BOTTOM = 4; -Constants.SHADED_REGION_ELEMENT_ID = "qr-shaded-region"; -Constants.VERBOSE = false; -Constants.BORDER_SHADER_DEFAULT_COLOR = "#ffffff"; -Constants.BORDER_SHADER_MATCH_COLOR = "rgb(90, 193, 56)"; -class InternalHtml5QrcodeConfig { - constructor(config, logger) { - this.logger = logger; - this.fps = Constants.SCAN_DEFAULT_FPS; - if (!config) { - this.disableFlip = Constants.DEFAULT_DISABLE_FLIP; - } - else { - if (config.fps) { - this.fps = config.fps; - } - this.disableFlip = config.disableFlip === true; - this.qrbox = config.qrbox; - this.aspectRatio = config.aspectRatio; - this.videoConstraints = config.videoConstraints; - } - } - isMediaStreamConstraintsValid() { - if (!this.videoConstraints) { - this.logger.logError("Empty videoConstraints", true); - return false; - } - return VideoConstraintsUtil.isMediaStreamConstraintsValid(this.videoConstraints, this.logger); - } - isShadedBoxEnabled() { - return !isNullOrUndefined(this.qrbox); - } - static create(config, logger) { - return new InternalHtml5QrcodeConfig(config, logger); - } -} -export class Html5Qrcode { - constructor(elementId, configOrVerbosityFlag) { - this.element = null; - this.canvasElement = null; - this.scannerPausedUiElement = null; - this.hasBorderShaders = null; - this.borderShaders = null; - this.qrMatch = null; - this.renderedCamera = null; - this.qrRegion = null; - this.context = null; - this.lastScanImageFile = null; - this.isScanning = false; - if (!document.getElementById(elementId)) { - throw `HTML Element with id=${elementId} not found`; - } - this.elementId = elementId; - this.verbose = false; - let experimentalFeatureConfig; - let configObject; - if (typeof configOrVerbosityFlag == "boolean") { - this.verbose = configOrVerbosityFlag === true; - } - else if (configOrVerbosityFlag) { - configObject = configOrVerbosityFlag; - this.verbose = configObject.verbose === true; - experimentalFeatureConfig = configObject.experimentalFeatures; - } - this.logger = new BaseLoggger(this.verbose); - this.qrcode = new Html5QrcodeShim(this.getSupportedFormats(configOrVerbosityFlag), this.getUseBarCodeDetectorIfSupported(configObject), this.verbose, this.logger); - this.foreverScanTimeout; - this.shouldScan = true; - this.stateManagerProxy = StateManagerFactory.create(); - } - start(cameraIdOrConfig, configuration, qrCodeSuccessCallback, qrCodeErrorCallback) { - if (!cameraIdOrConfig) { - throw "cameraIdOrConfig is required"; - } - if (!qrCodeSuccessCallback - || typeof qrCodeSuccessCallback != "function") { - throw "qrCodeSuccessCallback is required and should be a function."; - } - let qrCodeErrorCallbackInternal; - if (qrCodeErrorCallback) { - qrCodeErrorCallbackInternal = qrCodeErrorCallback; - } - else { - qrCodeErrorCallbackInternal - = this.verbose ? this.logger.log : () => { }; - } - const internalConfig = InternalHtml5QrcodeConfig.create(configuration, this.logger); - this.clearElement(); - let videoConstraintsAvailableAndValid = false; - if (internalConfig.videoConstraints) { - if (!internalConfig.isMediaStreamConstraintsValid()) { - this.logger.logError("'videoConstraints' is not valid 'MediaStreamConstraints, " - + "it will be ignored.'", true); - } - else { - videoConstraintsAvailableAndValid = true; - } - } - const areVideoConstraintsEnabled = videoConstraintsAvailableAndValid; - const element = document.getElementById(this.elementId); - const rootElementWidth = element.clientWidth - ? element.clientWidth : Constants.DEFAULT_WIDTH; - element.style.position = "relative"; - this.shouldScan = true; - this.element = element; - const $this = this; - const toScanningStateChangeTransaction = this.stateManagerProxy.startTransition(Html5QrcodeScannerState.SCANNING); - return new Promise((resolve, reject) => { - const videoConstraints = areVideoConstraintsEnabled - ? internalConfig.videoConstraints - : $this.createVideoConstraints(cameraIdOrConfig); - if (!videoConstraints) { - toScanningStateChangeTransaction.cancel(); - reject("videoConstraints should be defined"); - return; - } - let cameraRenderingOptions = {}; - if (!areVideoConstraintsEnabled || internalConfig.aspectRatio) { - cameraRenderingOptions.aspectRatio = internalConfig.aspectRatio; - } - let renderingCallbacks = { - onRenderSurfaceReady: (viewfinderWidth, viewfinderHeight) => { - $this.setupUi(viewfinderWidth, viewfinderHeight, internalConfig); - $this.isScanning = true; - $this.foreverScan(internalConfig, qrCodeSuccessCallback, qrCodeErrorCallbackInternal); - } - }; - CameraFactory.failIfNotSupported().then((factory) => { - factory.create(videoConstraints).then((camera) => { - return camera.render(this.element, cameraRenderingOptions, renderingCallbacks) - .then((renderedCamera) => { - $this.renderedCamera = renderedCamera; - toScanningStateChangeTransaction.execute(); - resolve(null); - }) - .catch((error) => { - toScanningStateChangeTransaction.cancel(); - reject(error); - }); - }).catch((error) => { - toScanningStateChangeTransaction.cancel(); - reject(Html5QrcodeStrings.errorGettingUserMedia(error)); - }); - }).catch((_) => { - toScanningStateChangeTransaction.cancel(); - reject(Html5QrcodeStrings.cameraStreamingNotSupported()); - }); - }); - } - pause(shouldPauseVideo) { - if (!this.stateManagerProxy.isStrictlyScanning()) { - throw "Cannot pause, scanner is not scanning."; - } - this.stateManagerProxy.directTransition(Html5QrcodeScannerState.PAUSED); - this.showPausedState(); - if (isNullOrUndefined(shouldPauseVideo) || shouldPauseVideo !== true) { - shouldPauseVideo = false; - } - if (shouldPauseVideo && this.renderedCamera) { - this.renderedCamera.pause(); - } - } - resume() { - if (!this.stateManagerProxy.isPaused()) { - throw "Cannot result, scanner is not paused."; - } - if (!this.renderedCamera) { - throw "renderedCamera doesn't exist while trying resume()"; - } - const $this = this; - const transitionToScanning = () => { - $this.stateManagerProxy.directTransition(Html5QrcodeScannerState.SCANNING); - $this.hidePausedState(); - }; - if (!this.renderedCamera.isPaused()) { - transitionToScanning(); - return; - } - this.renderedCamera.resume(() => { - transitionToScanning(); - }); - } - getState() { - return this.stateManagerProxy.getState(); - } - stop() { - if (!this.stateManagerProxy.isScanning()) { - throw "Cannot stop, scanner is not running or paused."; - } - const toStoppedStateTransaction = this.stateManagerProxy.startTransition(Html5QrcodeScannerState.NOT_STARTED); - this.shouldScan = false; - if (this.foreverScanTimeout) { - clearTimeout(this.foreverScanTimeout); - } - const removeQrRegion = () => { - if (!this.element) { - return; - } - let childElement = document.getElementById(Constants.SHADED_REGION_ELEMENT_ID); - if (childElement) { - this.element.removeChild(childElement); - } - }; - let $this = this; - return this.renderedCamera.close().then(() => { - $this.renderedCamera = null; - if ($this.element) { - $this.element.removeChild($this.canvasElement); - $this.canvasElement = null; - } - removeQrRegion(); - if ($this.qrRegion) { - $this.qrRegion = null; - } - if ($this.context) { - $this.context = null; - } - toStoppedStateTransaction.execute(); - $this.hidePausedState(); - $this.isScanning = false; - return Promise.resolve(); - }); - } - scanFile(imageFile, showImage) { - return this.scanFileV2(imageFile, showImage) - .then((html5qrcodeResult) => html5qrcodeResult.decodedText); - } - scanFileV2(imageFile, showImage) { - if (!imageFile || !(imageFile instanceof File)) { - throw "imageFile argument is mandatory and should be instance " - + "of File. Use 'event.target.files[0]'."; - } - if (isNullOrUndefined(showImage)) { - showImage = true; - } - if (!this.stateManagerProxy.canScanFile()) { - throw "Cannot start file scan - ongoing camera scan"; - } - return new Promise((resolve, reject) => { - this.possiblyCloseLastScanImageFile(); - this.clearElement(); - this.lastScanImageFile = URL.createObjectURL(imageFile); - const inputImage = new Image; - inputImage.onload = () => { - const imageWidth = inputImage.width; - const imageHeight = inputImage.height; - const element = document.getElementById(this.elementId); - const containerWidth = element.clientWidth - ? element.clientWidth : Constants.DEFAULT_WIDTH; - const containerHeight = Math.max(element.clientHeight ? element.clientHeight : imageHeight, Constants.FILE_SCAN_MIN_HEIGHT); - const config = this.computeCanvasDrawConfig(imageWidth, imageHeight, containerWidth, containerHeight); - if (showImage) { - const visibleCanvas = this.createCanvasElement(containerWidth, containerHeight, "qr-canvas-visible"); - visibleCanvas.style.display = "inline-block"; - element.appendChild(visibleCanvas); - const context = visibleCanvas.getContext("2d"); - if (!context) { - throw "Unable to get 2d context from canvas"; - } - context.canvas.width = containerWidth; - context.canvas.height = containerHeight; - context.drawImage(inputImage, 0, 0, imageWidth, imageHeight, config.x, config.y, config.width, config.height); - } - let padding = Constants.FILE_SCAN_HIDDEN_CANVAS_PADDING; - let hiddenImageWidth = Math.max(inputImage.width, config.width); - let hiddenImageHeight = Math.max(inputImage.height, config.height); - let hiddenCanvasWidth = hiddenImageWidth + 2 * padding; - let hiddenCanvasHeight = hiddenImageHeight + 2 * padding; - const hiddenCanvas = this.createCanvasElement(hiddenCanvasWidth, hiddenCanvasHeight); - element.appendChild(hiddenCanvas); - const context = hiddenCanvas.getContext("2d"); - if (!context) { - throw "Unable to get 2d context from canvas"; - } - context.canvas.width = hiddenCanvasWidth; - context.canvas.height = hiddenCanvasHeight; - context.drawImage(inputImage, 0, 0, imageWidth, imageHeight, padding, padding, hiddenImageWidth, hiddenImageHeight); - try { - this.qrcode.decodeRobustlyAsync(hiddenCanvas) - .then((result) => { - resolve(Html5QrcodeResultFactory.createFromQrcodeResult(result)); - }) - .catch(reject); - } - catch (exception) { - reject(`QR code parse error, error = ${exception}`); - } - }; - inputImage.onerror = reject; - inputImage.onabort = reject; - inputImage.onstalled = reject; - inputImage.onsuspend = reject; - inputImage.src = URL.createObjectURL(imageFile); - }); - } - clear() { - this.clearElement(); - } - static getCameras() { - return CameraRetriever.retrieve(); - } - getRunningTrackCapabilities() { - return this.getRenderedCameraOrFail().getRunningTrackCapabilities(); - } - getRunningTrackSettings() { - return this.getRenderedCameraOrFail().getRunningTrackSettings(); - } - getRunningTrackCameraCapabilities() { - return this.getRenderedCameraOrFail().getCapabilities(); - } - applyVideoConstraints(videoConstaints) { - if (!videoConstaints) { - throw "videoConstaints is required argument."; - } - else if (!VideoConstraintsUtil.isMediaStreamConstraintsValid(videoConstaints, this.logger)) { - throw "invalid videoConstaints passed, check logs for more details"; - } - return this.getRenderedCameraOrFail().applyVideoConstraints(videoConstaints); - } - getRenderedCameraOrFail() { - if (this.renderedCamera == null) { - throw "Scanning is not in running state, call this API only when" - + " QR code scanning using camera is in running state."; - } - return this.renderedCamera; - } - getSupportedFormats(configOrVerbosityFlag) { - const allFormats = [ - Html5QrcodeSupportedFormats.QR_CODE, - Html5QrcodeSupportedFormats.AZTEC, - Html5QrcodeSupportedFormats.CODABAR, - Html5QrcodeSupportedFormats.CODE_39, - Html5QrcodeSupportedFormats.CODE_93, - Html5QrcodeSupportedFormats.CODE_128, - Html5QrcodeSupportedFormats.DATA_MATRIX, - Html5QrcodeSupportedFormats.MAXICODE, - Html5QrcodeSupportedFormats.ITF, - Html5QrcodeSupportedFormats.EAN_13, - Html5QrcodeSupportedFormats.EAN_8, - Html5QrcodeSupportedFormats.PDF_417, - Html5QrcodeSupportedFormats.RSS_14, - Html5QrcodeSupportedFormats.RSS_EXPANDED, - Html5QrcodeSupportedFormats.UPC_A, - Html5QrcodeSupportedFormats.UPC_E, - Html5QrcodeSupportedFormats.UPC_EAN_EXTENSION, - ]; - if (!configOrVerbosityFlag - || typeof configOrVerbosityFlag == "boolean") { - return allFormats; - } - if (!configOrVerbosityFlag.formatsToSupport) { - return allFormats; - } - if (!Array.isArray(configOrVerbosityFlag.formatsToSupport)) { - throw "configOrVerbosityFlag.formatsToSupport should be undefined " - + "or an array."; - } - if (configOrVerbosityFlag.formatsToSupport.length === 0) { - throw "Atleast 1 formatsToSupport is needed."; - } - const supportedFormats = []; - for (const format of configOrVerbosityFlag.formatsToSupport) { - if (isValidHtml5QrcodeSupportedFormats(format)) { - supportedFormats.push(format); - } - else { - this.logger.warn(`Invalid format: ${format} passed in config, ignoring.`); - } - } - if (supportedFormats.length === 0) { - throw "None of formatsToSupport match supported values."; - } - return supportedFormats; - } - getUseBarCodeDetectorIfSupported(config) { - if (isNullOrUndefined(config)) { - return true; - } - if (!isNullOrUndefined(config.useBarCodeDetectorIfSupported)) { - return config.useBarCodeDetectorIfSupported !== false; - } - if (isNullOrUndefined(config.experimentalFeatures)) { - return true; - } - let experimentalFeatures = config.experimentalFeatures; - if (isNullOrUndefined(experimentalFeatures.useBarCodeDetectorIfSupported)) { - return true; - } - return experimentalFeatures.useBarCodeDetectorIfSupported !== false; - } - validateQrboxSize(viewfinderWidth, viewfinderHeight, internalConfig) { - const qrboxSize = internalConfig.qrbox; - this.validateQrboxConfig(qrboxSize); - let qrDimensions = this.toQrdimensions(viewfinderWidth, viewfinderHeight, qrboxSize); - const validateMinSize = (size) => { - if (size < Constants.MIN_QR_BOX_SIZE) { - throw "minimum size of 'config.qrbox' dimension value is" - + ` ${Constants.MIN_QR_BOX_SIZE}px.`; - } - }; - const correctWidthBasedOnRootElementSize = (configWidth) => { - if (configWidth > viewfinderWidth) { - this.logger.warn("`qrbox.width` or `qrbox` is larger than the" - + " width of the root element. The width will be truncated" - + " to the width of root element."); - configWidth = viewfinderWidth; - } - return configWidth; - }; - validateMinSize(qrDimensions.width); - validateMinSize(qrDimensions.height); - qrDimensions.width = correctWidthBasedOnRootElementSize(qrDimensions.width); - } - validateQrboxConfig(qrboxSize) { - if (typeof qrboxSize === "number") { - return; - } - if (typeof qrboxSize === "function") { - return; - } - if (qrboxSize.width === undefined || qrboxSize.height === undefined) { - throw "Invalid instance of QrDimensions passed for " - + "'config.qrbox'. Both 'width' and 'height' should be set."; - } - } - toQrdimensions(viewfinderWidth, viewfinderHeight, qrboxSize) { - if (typeof qrboxSize === "number") { - return { width: qrboxSize, height: qrboxSize }; - } - else if (typeof qrboxSize === "function") { - try { - return qrboxSize(viewfinderWidth, viewfinderHeight); - } - catch (error) { - throw new Error("qrbox config was passed as a function but it failed with " - + "unknown error" + error); - } - } - return qrboxSize; - } - setupUi(viewfinderWidth, viewfinderHeight, internalConfig) { - if (internalConfig.isShadedBoxEnabled()) { - this.validateQrboxSize(viewfinderWidth, viewfinderHeight, internalConfig); - } - const qrboxSize = isNullOrUndefined(internalConfig.qrbox) ? - { width: viewfinderWidth, height: viewfinderHeight } : internalConfig.qrbox; - this.validateQrboxConfig(qrboxSize); - let qrDimensions = this.toQrdimensions(viewfinderWidth, viewfinderHeight, qrboxSize); - if (qrDimensions.height > viewfinderHeight) { - this.logger.warn("[Html5Qrcode] config.qrbox has height that is" - + "greater than the height of the video stream. Shading will be" - + " ignored"); - } - const shouldShadingBeApplied = internalConfig.isShadedBoxEnabled() - && qrDimensions.height <= viewfinderHeight; - const defaultQrRegion = { - x: 0, - y: 0, - width: viewfinderWidth, - height: viewfinderHeight - }; - const qrRegion = shouldShadingBeApplied - ? this.getShadedRegionBounds(viewfinderWidth, viewfinderHeight, qrDimensions) - : defaultQrRegion; - const canvasElement = this.createCanvasElement(qrRegion.width, qrRegion.height); - const contextAttributes = { willReadFrequently: true }; - const context = canvasElement.getContext("2d", contextAttributes); - context.canvas.width = qrRegion.width; - context.canvas.height = qrRegion.height; - this.element.append(canvasElement); - if (shouldShadingBeApplied) { - this.possiblyInsertShadingElement(this.element, viewfinderWidth, viewfinderHeight, qrDimensions); - } - this.createScannerPausedUiElement(this.element); - this.qrRegion = qrRegion; - this.context = context; - this.canvasElement = canvasElement; - } - createScannerPausedUiElement(rootElement) { - const scannerPausedUiElement = document.createElement("div"); - scannerPausedUiElement.innerText = Html5QrcodeStrings.scannerPaused(); - scannerPausedUiElement.style.display = "none"; - scannerPausedUiElement.style.position = "absolute"; - scannerPausedUiElement.style.top = "0px"; - scannerPausedUiElement.style.zIndex = "1"; - scannerPausedUiElement.style.background = "rgba(9, 9, 9, 0.46)"; - scannerPausedUiElement.style.color = "#FFECEC"; - scannerPausedUiElement.style.textAlign = "center"; - scannerPausedUiElement.style.width = "100%"; - rootElement.appendChild(scannerPausedUiElement); - this.scannerPausedUiElement = scannerPausedUiElement; - } - scanContext(qrCodeSuccessCallback, qrCodeErrorCallback) { - if (this.stateManagerProxy.isPaused()) { - return Promise.resolve(false); - } - return this.qrcode.decodeAsync(this.canvasElement) - .then((result) => { - qrCodeSuccessCallback(result.text, Html5QrcodeResultFactory.createFromQrcodeResult(result)); - this.possiblyUpdateShaders(true); - return true; - }).catch((error) => { - this.possiblyUpdateShaders(false); - let errorMessage = Html5QrcodeStrings.codeParseError(error); - qrCodeErrorCallback(errorMessage, Html5QrcodeErrorFactory.createFrom(errorMessage)); - return false; - }); - } - foreverScan(internalConfig, qrCodeSuccessCallback, qrCodeErrorCallback) { - if (!this.shouldScan) { - return; - } - if (!this.renderedCamera) { - return; - } - const videoElement = this.renderedCamera.getSurface(); - const widthRatio = videoElement.videoWidth / videoElement.clientWidth; - const heightRatio = videoElement.videoHeight / videoElement.clientHeight; - if (!this.qrRegion) { - throw "qrRegion undefined when localMediaStream is ready."; - } - const sWidthOffset = this.qrRegion.width * widthRatio; - const sHeightOffset = this.qrRegion.height * heightRatio; - const sxOffset = this.qrRegion.x * widthRatio; - const syOffset = this.qrRegion.y * heightRatio; - this.context.drawImage(videoElement, sxOffset, syOffset, sWidthOffset, sHeightOffset, 0, 0, this.qrRegion.width, this.qrRegion.height); - const triggerNextScan = () => { - this.foreverScanTimeout = setTimeout(() => { - this.foreverScan(internalConfig, qrCodeSuccessCallback, qrCodeErrorCallback); - }, this.getTimeoutFps(internalConfig.fps)); - }; - this.scanContext(qrCodeSuccessCallback, qrCodeErrorCallback) - .then((isSuccessfull) => { - if (!isSuccessfull && internalConfig.disableFlip !== true) { - this.context.translate(this.context.canvas.width, 0); - this.context.scale(-1, 1); - this.scanContext(qrCodeSuccessCallback, qrCodeErrorCallback) - .finally(() => { - triggerNextScan(); - }); - } - else { - triggerNextScan(); - } - }).catch((error) => { - this.logger.logError("Error happend while scanning context", error); - triggerNextScan(); - }); - } - createVideoConstraints(cameraIdOrConfig) { - if (typeof cameraIdOrConfig == "string") { - return { deviceId: { exact: cameraIdOrConfig } }; - } - else if (typeof cameraIdOrConfig == "object") { - const facingModeKey = "facingMode"; - const deviceIdKey = "deviceId"; - const allowedFacingModeValues = { "user": true, "environment": true }; - const exactKey = "exact"; - const isValidFacingModeValue = (value) => { - if (value in allowedFacingModeValues) { - return true; - } - else { - throw "config has invalid 'facingMode' value = " - + `'${value}'`; - } - }; - const keys = Object.keys(cameraIdOrConfig); - if (keys.length !== 1) { - throw "'cameraIdOrConfig' object should have exactly 1 key," - + ` if passed as an object, found ${keys.length} keys`; - } - const key = Object.keys(cameraIdOrConfig)[0]; - if (key !== facingModeKey && key !== deviceIdKey) { - throw `Only '${facingModeKey}' and '${deviceIdKey}' ` - + " are supported for 'cameraIdOrConfig'"; - } - if (key === facingModeKey) { - const facingMode = cameraIdOrConfig.facingMode; - if (typeof facingMode == "string") { - if (isValidFacingModeValue(facingMode)) { - return { facingMode: facingMode }; - } - } - else if (typeof facingMode == "object") { - if (exactKey in facingMode) { - if (isValidFacingModeValue(facingMode[`${exactKey}`])) { - return { - facingMode: { - exact: facingMode[`${exactKey}`] - } - }; - } - } - else { - throw "'facingMode' should be string or object with" - + ` ${exactKey} as key.`; - } - } - else { - const type = (typeof facingMode); - throw `Invalid type of 'facingMode' = ${type}`; - } - } - else { - const deviceId = cameraIdOrConfig.deviceId; - if (typeof deviceId == "string") { - return { deviceId: deviceId }; - } - else if (typeof deviceId == "object") { - if (exactKey in deviceId) { - return { - deviceId: { exact: deviceId[`${exactKey}`] } - }; - } - else { - throw "'deviceId' should be string or object with" - + ` ${exactKey} as key.`; - } - } - else { - const type = (typeof deviceId); - throw `Invalid type of 'deviceId' = ${type}`; - } - } - } - const type = (typeof cameraIdOrConfig); - throw `Invalid type of 'cameraIdOrConfig' = ${type}`; - } - computeCanvasDrawConfig(imageWidth, imageHeight, containerWidth, containerHeight) { - if (imageWidth <= containerWidth - && imageHeight <= containerHeight) { - const xoffset = (containerWidth - imageWidth) / 2; - const yoffset = (containerHeight - imageHeight) / 2; - return { - x: xoffset, - y: yoffset, - width: imageWidth, - height: imageHeight - }; - } - else { - const formerImageWidth = imageWidth; - const formerImageHeight = imageHeight; - if (imageWidth > containerWidth) { - imageHeight = (containerWidth / imageWidth) * imageHeight; - imageWidth = containerWidth; - } - if (imageHeight > containerHeight) { - imageWidth = (containerHeight / imageHeight) * imageWidth; - imageHeight = containerHeight; - } - this.logger.log("Image downsampled from " - + `${formerImageWidth}X${formerImageHeight}` - + ` to ${imageWidth}X${imageHeight}.`); - return this.computeCanvasDrawConfig(imageWidth, imageHeight, containerWidth, containerHeight); - } - } - clearElement() { - if (this.stateManagerProxy.isScanning()) { - throw "Cannot clear while scan is ongoing, close it first."; - } - const element = document.getElementById(this.elementId); - if (element) { - element.innerHTML = ""; - } - } - possiblyUpdateShaders(qrMatch) { - if (this.qrMatch === qrMatch) { - return; - } - if (this.hasBorderShaders - && this.borderShaders - && this.borderShaders.length) { - this.borderShaders.forEach((shader) => { - shader.style.backgroundColor = qrMatch - ? Constants.BORDER_SHADER_MATCH_COLOR - : Constants.BORDER_SHADER_DEFAULT_COLOR; - }); - } - this.qrMatch = qrMatch; - } - possiblyCloseLastScanImageFile() { - if (this.lastScanImageFile) { - URL.revokeObjectURL(this.lastScanImageFile); - this.lastScanImageFile = null; - } - } - createCanvasElement(width, height, customId) { - const canvasWidth = width; - const canvasHeight = height; - const canvasElement = document.createElement("canvas"); - canvasElement.style.width = `${canvasWidth}px`; - canvasElement.style.height = `${canvasHeight}px`; - canvasElement.style.display = "none"; - canvasElement.id = isNullOrUndefined(customId) - ? "qr-canvas" : customId; - return canvasElement; - } - getShadedRegionBounds(width, height, qrboxSize) { - if (qrboxSize.width > width || qrboxSize.height > height) { - throw "'config.qrbox' dimensions should not be greater than the " - + "dimensions of the root HTML element."; - } - return { - x: (width - qrboxSize.width) / 2, - y: (height - qrboxSize.height) / 2, - width: qrboxSize.width, - height: qrboxSize.height - }; - } - possiblyInsertShadingElement(element, width, height, qrboxSize) { - if ((width - qrboxSize.width) < 1 || (height - qrboxSize.height) < 1) { - return; - } - const shadingElement = document.createElement("div"); - shadingElement.style.position = "absolute"; - const rightLeftBorderSize = (width - qrboxSize.width) / 2; - const topBottomBorderSize = (height - qrboxSize.height) / 2; - shadingElement.style.borderLeft - = `${rightLeftBorderSize}px solid rgba(0, 0, 0, 0.48)`; - shadingElement.style.borderRight - = `${rightLeftBorderSize}px solid rgba(0, 0, 0, 0.48)`; - shadingElement.style.borderTop - = `${topBottomBorderSize}px solid rgba(0, 0, 0, 0.48)`; - shadingElement.style.borderBottom - = `${topBottomBorderSize}px solid rgba(0, 0, 0, 0.48)`; - shadingElement.style.boxSizing = "border-box"; - shadingElement.style.top = "0px"; - shadingElement.style.bottom = "0px"; - shadingElement.style.left = "0px"; - shadingElement.style.right = "0px"; - shadingElement.id = `${Constants.SHADED_REGION_ELEMENT_ID}`; - if ((width - qrboxSize.width) < 11 - || (height - qrboxSize.height) < 11) { - this.hasBorderShaders = false; - } - else { - const smallSize = 5; - const largeSize = 40; - this.insertShaderBorders(shadingElement, largeSize, smallSize, -smallSize, null, 0, true); - this.insertShaderBorders(shadingElement, largeSize, smallSize, -smallSize, null, 0, false); - this.insertShaderBorders(shadingElement, largeSize, smallSize, null, -smallSize, 0, true); - this.insertShaderBorders(shadingElement, largeSize, smallSize, null, -smallSize, 0, false); - this.insertShaderBorders(shadingElement, smallSize, largeSize + smallSize, -smallSize, null, -smallSize, true); - this.insertShaderBorders(shadingElement, smallSize, largeSize + smallSize, null, -smallSize, -smallSize, true); - this.insertShaderBorders(shadingElement, smallSize, largeSize + smallSize, -smallSize, null, -smallSize, false); - this.insertShaderBorders(shadingElement, smallSize, largeSize + smallSize, null, -smallSize, -smallSize, false); - this.hasBorderShaders = true; - } - element.append(shadingElement); - } - insertShaderBorders(shaderElem, width, height, top, bottom, side, isLeft) { - const elem = document.createElement("div"); - elem.style.position = "absolute"; - elem.style.backgroundColor = Constants.BORDER_SHADER_DEFAULT_COLOR; - elem.style.width = `${width}px`; - elem.style.height = `${height}px`; - if (top !== null) { - elem.style.top = `${top}px`; - } - if (bottom !== null) { - elem.style.bottom = `${bottom}px`; - } - if (isLeft) { - elem.style.left = `${side}px`; - } - else { - elem.style.right = `${side}px`; - } - if (!this.borderShaders) { - this.borderShaders = []; - } - this.borderShaders.push(elem); - shaderElem.appendChild(elem); - } - showPausedState() { - if (!this.scannerPausedUiElement) { - throw "[internal error] scanner paused UI element not found"; - } - this.scannerPausedUiElement.style.display = "block"; - } - hidePausedState() { - if (!this.scannerPausedUiElement) { - throw "[internal error] scanner paused UI element not found"; - } - this.scannerPausedUiElement.style.display = "none"; - } - getTimeoutFps(fps) { - return 1000 / fps; - } -} -//# sourceMappingURL=html5-qrcode.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/html5-qrcode.js.map b/node_modules/html5-qrcode/es2015/html5-qrcode.js.map deleted file mode 100644 index 516cb89..0000000 --- a/node_modules/html5-qrcode/es2015/html5-qrcode.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"html5-qrcode.js","sourceRoot":"","sources":["../../src/html5-qrcode.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/image-assets.d.ts b/node_modules/html5-qrcode/es2015/image-assets.d.ts deleted file mode 100644 index 59387ac..0000000 --- a/node_modules/html5-qrcode/es2015/image-assets.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export declare const ASSET_CAMERA_SCAN: string; -export declare const ASSET_FILE_SCAN: string; -export declare const ASSET_INFO_ICON_16PX: string; -export declare const ASSET_CLOSE_ICON_16PX: string; diff --git a/node_modules/html5-qrcode/es2015/image-assets.js b/node_modules/html5-qrcode/es2015/image-assets.js deleted file mode 100644 index 1cf59a4..0000000 --- a/node_modules/html5-qrcode/es2015/image-assets.js +++ /dev/null @@ -1,6 +0,0 @@ -const SVG_XML_PREFIX = "data:image/svg+xml;base64,"; -export const ASSET_CAMERA_SCAN = SVG_XML_PREFIX + "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzNzEuNjQzIDM3MS42NDMiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDM3MS42NDMgMzcxLjY0MyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBhdGggZD0iTTEwNS4wODQgMzguMjcxaDE2My43Njh2MjBIMTA1LjA4NHoiLz48cGF0aCBkPSJNMzExLjU5NiAxOTAuMTg5Yy03LjQ0MS05LjM0Ny0xOC40MDMtMTYuMjA2LTMyLjc0My0yMC41MjJWMzBjMC0xNi41NDItMTMuNDU4LTMwLTMwLTMwSDEyNS4wODRjLTE2LjU0MiAwLTMwIDEzLjQ1OC0zMCAzMHYxMjAuMTQzaC04LjI5NmMtMTYuNTQyIDAtMzAgMTMuNDU4LTMwIDMwdjEuMzMzYTI5LjgwNCAyOS44MDQgMCAwIDAgNC42MDMgMTUuOTM5Yy03LjM0IDUuNDc0LTEyLjEwMyAxNC4yMjEtMTIuMTAzIDI0LjA2MXYxLjMzM2MwIDkuODQgNC43NjMgMTguNTg3IDEyLjEwMyAyNC4wNjJhMjkuODEgMjkuODEgMCAwIDAtNC42MDMgMTUuOTM4djEuMzMzYzAgMTYuNTQyIDEzLjQ1OCAzMCAzMCAzMGg4LjMyNGMuNDI3IDExLjYzMSA3LjUwMyAyMS41ODcgMTcuNTM0IDI2LjE3Ny45MzEgMTAuNTAzIDQuMDg0IDMwLjE4NyAxNC43NjggNDUuNTM3YTkuOTg4IDkuOTg4IDAgMCAwIDguMjE2IDQuMjg4IDkuOTU4IDkuOTU4IDAgMCAwIDUuNzA0LTEuNzkzYzQuNTMzLTMuMTU1IDUuNjUtOS4zODggMi40OTUtMTMuOTIxLTYuNzk4LTkuNzY3LTkuNjAyLTIyLjYwOC0xMC43Ni0zMS40aDgyLjY4NWMuMjcyLjQxNC41NDUuODE4LjgxNSAxLjIxIDMuMTQyIDQuNTQxIDkuMzcyIDUuNjc5IDEzLjkxMyAyLjUzNCA0LjU0Mi0zLjE0MiA1LjY3Ny05LjM3MSAyLjUzNS0xMy45MTMtMTEuOTE5LTE3LjIyOS04Ljc4Ny0zNS44ODQgOS41ODEtNTcuMDEyIDMuMDY3LTIuNjUyIDEyLjMwNy0xMS43MzIgMTEuMjE3LTI0LjAzMy0uODI4LTkuMzQzLTcuMTA5LTE3LjE5NC0xOC42NjktMjMuMzM3YTkuODU3IDkuODU3IDAgMCAwLTEuMDYxLS40ODZjLS40NjYtLjE4Mi0xMS40MDMtNC41NzktOS43NDEtMTUuNzA2IDEuMDA3LTYuNzM3IDE0Ljc2OC04LjI3MyAyMy43NjYtNy42NjYgMjMuMTU2IDEuNTY5IDM5LjY5OCA3LjgwMyA0Ny44MzYgMTguMDI2IDUuNzUyIDcuMjI1IDcuNjA3IDE2LjYyMyA1LjY3MyAyOC43MzMtLjQxMyAyLjU4NS0uODI0IDUuMjQxLTEuMjQ1IDcuOTU5LTUuNzU2IDM3LjE5NC0xMi45MTkgODMuNDgzLTQ5Ljg3IDExNC42NjEtNC4yMjEgMy41NjEtNC43NTYgOS44Ny0xLjE5NCAxNC4wOTJhOS45OCA5Ljk4IDAgMCAwIDcuNjQ4IDMuNTUxIDkuOTU1IDkuOTU1IDAgMCAwIDYuNDQ0LTIuMzU4YzQyLjY3Mi0zNi4wMDUgNTAuODAyLTg4LjUzMyA1Ni43MzctMTI2Ljg4OC40MTUtMi42ODQuODIxLTUuMzA5IDEuMjI5LTcuODYzIDIuODM0LTE3LjcyMS0uNDU1LTMyLjY0MS05Ljc3Mi00NC4zNDV6bS0yMzIuMzA4IDQyLjYyYy01LjUxNCAwLTEwLTQuNDg2LTEwLTEwdi0xLjMzM2MwLTUuNTE0IDQuNDg2LTEwIDEwLTEwaDE1djIxLjMzM2gtMTV6bS0yLjUtNTIuNjY2YzAtNS41MTQgNC40ODYtMTAgMTAtMTBoNy41djIxLjMzM2gtNy41Yy01LjUxNCAwLTEwLTQuNDg2LTEwLTEwdi0xLjMzM3ptMTcuNSA5My45OTloLTcuNWMtNS41MTQgMC0xMC00LjQ4Ni0xMC0xMHYtMS4zMzNjMC01LjUxNCA0LjQ4Ni0xMCAxMC0xMGg3LjV2MjEuMzMzem0zMC43OTYgMjguODg3Yy01LjUxNCAwLTEwLTQuNDg2LTEwLTEwdi04LjI3MWg5MS40NTdjLS44NTEgNi42NjgtLjQzNyAxMi43ODcuNzMxIDE4LjI3MWgtODIuMTg4em03OS40ODItMTEzLjY5OGMtMy4xMjQgMjAuOTA2IDEyLjQyNyAzMy4xODQgMjEuNjI1IDM3LjA0IDUuNDQxIDIuOTY4IDcuNTUxIDUuNjQ3IDcuNzAxIDcuMTg4LjIxIDIuMTUtMi41NTMgNS42ODQtNC40NzcgNy4yNTEtLjQ4Mi4zNzgtLjkyOS44LTEuMzM1IDEuMjYxLTYuOTg3IDcuOTM2LTExLjk4MiAxNS41Mi0xNS40MzIgMjIuNjg4aC05Ny41NjRWMzBjMC01LjUxNCA0LjQ4Ni0xMCAxMC0xMGgxMjMuNzY5YzUuNTE0IDAgMTAgNC40ODYgMTAgMTB2MTM1LjU3OWMtMy4wMzItLjM4MS02LjE1LS42OTQtOS4zODktLjkxNC0yNS4xNTktMS42OTQtNDIuMzcgNy43NDgtNDQuODk4IDI0LjY2NnoiLz48cGF0aCBkPSJNMTc5LjEyOSA4My4xNjdoLTI0LjA2YTUgNSAwIDAgMC01IDV2MjQuMDYxYTUgNSAwIDAgMCA1IDVoMjQuMDZhNSA1IDAgMCAwIDUtNVY4OC4xNjdhNSA1IDAgMCAwLTUtNXpNMTcyLjYyOSAxNDIuODZoLTEyLjU2VjEzMC44YTUgNSAwIDEgMC0xMCAwdjE3LjA2MWE1IDUgMCAwIDAgNSA1aDE3LjU2YTUgNSAwIDEgMCAwLTEwLjAwMXpNMjE2LjU2OCA4My4xNjdoLTI0LjA2YTUgNSAwIDAgMC01IDV2MjQuMDYxYTUgNSAwIDAgMCA1IDVoMjQuMDZhNSA1IDAgMCAwIDUtNVY4OC4xNjdhNSA1IDAgMCAwLTUtNXptLTUgMjQuMDYxaC0xNC4wNlY5My4xNjdoMTQuMDZ2MTQuMDYxek0yMTEuNjY5IDEyNS45MzZIMTk3LjQxYTUgNSAwIDAgMC01IDV2MTQuMjU3YTUgNSAwIDAgMCA1IDVoMTQuMjU5YTUgNSAwIDAgMCA1LTV2LTE0LjI1N2E1IDUgMCAwIDAtNS01eiIvPjwvc3ZnPg=="; -export const ASSET_FILE_SCAN = SVG_XML_PREFIX + "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1OS4wMTggNTkuMDE4IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1OS4wMTggNTkuMDE4IiB4bWw6c3BhY2U9InByZXNlcnZlIj48cGF0aCBkPSJtNTguNzQxIDU0LjgwOS01Ljk2OS02LjI0NGExMC43NCAxMC43NCAwIDAgMCAyLjgyLTcuMjVjMC01Ljk1My00Ljg0My0xMC43OTYtMTAuNzk2LTEwLjc5NlMzNCAzNS4zNjEgMzQgNDEuMzE0IDM4Ljg0MyA1Mi4xMSA0NC43OTYgNTIuMTFjMi40NDEgMCA0LjY4OC0uODI0IDYuNDk5LTIuMTk2bDYuMDAxIDYuMjc3YS45OTguOTk4IDAgMCAwIDEuNDE0LjAzMiAxIDEgMCAwIDAgLjAzMS0xLjQxNHpNMzYgNDEuMzE0YzAtNC44NSAzLjk0Ni04Ljc5NiA4Ljc5Ni04Ljc5NnM4Ljc5NiAzLjk0NiA4Ljc5NiA4Ljc5Ni0zLjk0NiA4Ljc5Ni04Ljc5NiA4Ljc5NlMzNiA0Ni4xNjQgMzYgNDEuMzE0ek0xMC40MzEgMTYuMDg4YzAgMy4wNyAyLjQ5OCA1LjU2OCA1LjU2OSA1LjU2OHM1LjU2OS0yLjQ5OCA1LjU2OS01LjU2OGMwLTMuMDcxLTIuNDk4LTUuNTY5LTUuNTY5LTUuNTY5cy01LjU2OSAyLjQ5OC01LjU2OSA1LjU2OXptOS4xMzggMGMwIDEuOTY4LTEuNjAyIDMuNTY4LTMuNTY5IDMuNTY4cy0zLjU2OS0xLjYwMS0zLjU2OS0zLjU2OCAxLjYwMi0zLjU2OSAzLjU2OS0zLjU2OSAzLjU2OSAxLjYwMSAzLjU2OSAzLjU2OXoiLz48cGF0aCBkPSJtMzAuODgyIDI4Ljk4NyA5LjE4LTEwLjA1NCAxMS4yNjIgMTAuMzIzYTEgMSAwIDAgMCAxLjM1MS0xLjQ3NWwtMTItMTFhMSAxIDAgMCAwLTEuNDE0LjA2M2wtOS43OTQgMTAuNzI3LTQuNzQzLTQuNzQzYTEuMDAzIDEuMDAzIDAgMCAwLTEuMzY4LS4wNDRMNi4zMzkgMzcuNzY4YTEgMSAwIDEgMCAxLjMyMiAxLjUwMWwxNi4zMTMtMTQuMzYyIDcuMzE5IDcuMzE4YS45OTkuOTk5IDAgMSAwIDEuNDE0LTEuNDE0bC0xLjgyNS0xLjgyNHoiLz48cGF0aCBkPSJNMzAgNDYuNTE4SDJ2LTQyaDU0djI4YTEgMSAwIDEgMCAyIDB2LTI5YTEgMSAwIDAgMC0xLTFIMWExIDEgMCAwIDAtMSAxdjQ0YTEgMSAwIDAgMCAxIDFoMjlhMSAxIDAgMSAwIDAtMnoiLz48L3N2Zz4="; -export const ASSET_INFO_ICON_16PX = SVG_XML_PREFIX + "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NjAgNDYwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA0NjAgNDYwIiB4bWw6c3BhY2U9InByZXNlcnZlIj48cGF0aCBkPSJNMjMwIDBDMTAyLjk3NSAwIDAgMTAyLjk3NSAwIDIzMHMxMDIuOTc1IDIzMCAyMzAgMjMwIDIzMC0xMDIuOTc0IDIzMC0yMzBTMzU3LjAyNSAwIDIzMCAwem0zOC4zMzMgMzc3LjM2YzAgOC42NzYtNy4wMzQgMTUuNzEtMTUuNzEgMTUuNzFoLTQzLjEwMWMtOC42NzYgMC0xNS43MS03LjAzNC0xNS43MS0xNS43MVYyMDIuNDc3YzAtOC42NzYgNy4wMzMtMTUuNzEgMTUuNzEtMTUuNzFoNDMuMTAxYzguNjc2IDAgMTUuNzEgNy4wMzMgMTUuNzEgMTUuNzFWMzc3LjM2ek0yMzAgMTU3Yy0yMS41MzkgMC0zOS0xNy40NjEtMzktMzlzMTcuNDYxLTM5IDM5LTM5IDM5IDE3LjQ2MSAzOSAzOS0xNy40NjEgMzktMzkgMzl6Ii8+PC9zdmc+"; -export const ASSET_CLOSE_ICON_16PX = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAQgAAAEIBarqQRAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAE1SURBVDiNfdI7S0NBEAXgLya1otFgpbYSbISAgpXYi6CmiH9KCAiChaVga6OiWPgfRDQ+0itaGVNosXtluWwcuMzePfM4M3sq8lbHBubwg1dc4m1E/J/N4ghDPOIsfk/4xiEao5KX0McFljN4C9d4QTPXuY99jP3DsIoDPGM6BY5i5yI5R7O4q+ImFkJY2DCh3cAH2klyB+9J1xUMMAG7eCh1a+Mr+k48b5diXrFVwwLuS+BJ9MfR7+G0FHOHhTHhnXNWS87VDF4pcnfQK4Ep7XScNLmPTZgURNKKYENYWDpzW1BhscS1WHS8CDgURFJQrWcoF3c13KKbgg1BYQfy8xZWEzTTw1QZbAoKu8FqJnktdu5hcVSHmchiILzzuaDQvjBzV2m8yohCE1jHfPx/xhU+y4G/D75ELlRJsSYAAAAASUVORK5CYII="; -//# sourceMappingURL=image-assets.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/image-assets.js.map b/node_modules/html5-qrcode/es2015/image-assets.js.map deleted file mode 100644 index 5480f6b..0000000 --- a/node_modules/html5-qrcode/es2015/image-assets.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"image-assets.js","sourceRoot":"","sources":["../../src/image-assets.ts"],"names":[],"mappings":"AASA,MAAM,cAAc,GAAG,4BAA4B,CAAC;AAEpD,MAAM,CAAC,MAAM,iBAAiB,GAAW,cAAc,GAAG,82GAA82G,CAAC;AAEz6G,MAAM,CAAC,MAAM,eAAe,GAAW,cAAc,GAAG,s8CAAs8C,CAAC;AAE//C,MAAM,CAAC,MAAM,oBAAoB,GAAY,cAAc,GAAG,8oBAA8oB,CAAC;AAE7sB,MAAM,CAAC,MAAM,qBAAqB,GAAY,omBAAomB,CAAC"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/index.d.ts b/node_modules/html5-qrcode/es2015/index.d.ts deleted file mode 100644 index d6b90c6..0000000 --- a/node_modules/html5-qrcode/es2015/index.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { Html5Qrcode, Html5QrcodeFullConfig, Html5QrcodeCameraScanConfig } from "./html5-qrcode"; -export { Html5QrcodeScanner } from "./html5-qrcode-scanner"; -export { Html5QrcodeSupportedFormats, Html5QrcodeResult, QrcodeSuccessCallback, QrcodeErrorCallback } from "./core"; -export { Html5QrcodeScannerState } from "./state-manager"; -export { Html5QrcodeScanType } from "./core"; -export { CameraCapabilities, CameraDevice } from "./camera/core"; diff --git a/node_modules/html5-qrcode/es2015/index.js b/node_modules/html5-qrcode/es2015/index.js deleted file mode 100644 index 890331e..0000000 --- a/node_modules/html5-qrcode/es2015/index.js +++ /dev/null @@ -1,6 +0,0 @@ -export { Html5Qrcode } from "./html5-qrcode"; -export { Html5QrcodeScanner } from "./html5-qrcode-scanner"; -export { Html5QrcodeSupportedFormats } from "./core"; -export { Html5QrcodeScannerState } from "./state-manager"; -export { Html5QrcodeScanType } from "./core"; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/index.js.map b/node_modules/html5-qrcode/es2015/index.js.map deleted file mode 100644 index 8eede83..0000000 --- a/node_modules/html5-qrcode/es2015/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,EACH,WAAW,EAGd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EACH,2BAA2B,EAI9B,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/native-bar-code-detector.d.ts b/node_modules/html5-qrcode/es2015/native-bar-code-detector.d.ts deleted file mode 100644 index 85ef95e..0000000 --- a/node_modules/html5-qrcode/es2015/native-bar-code-detector.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { QrcodeResult, Html5QrcodeSupportedFormats, QrcodeDecoderAsync, Logger } from "./core"; -export declare class BarcodeDetectorDelegate implements QrcodeDecoderAsync { - private readonly formatMap; - private readonly reverseFormatMap; - private verbose; - private logger; - private detector; - static isSupported(): boolean; - constructor(requestedFormats: Array, verbose: boolean, logger: Logger); - decodeAsync(canvas: HTMLCanvasElement): Promise; - private selectLargestBarcode; - private createBarcodeDetectorFormats; - private toHtml5QrcodeSupportedFormats; - private createReverseFormatMap; - private createDebugData; -} diff --git a/node_modules/html5-qrcode/es2015/native-bar-code-detector.js b/node_modules/html5-qrcode/es2015/native-bar-code-detector.js deleted file mode 100644 index 8b045c5..0000000 --- a/node_modules/html5-qrcode/es2015/native-bar-code-detector.js +++ /dev/null @@ -1,107 +0,0 @@ -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -import { QrcodeResultFormat, Html5QrcodeSupportedFormats } from "./core"; -export class BarcodeDetectorDelegate { - static isSupported() { - if (!("BarcodeDetector" in window)) { - return false; - } - const dummyDetector = new BarcodeDetector({ formats: ["qr_code"] }); - return typeof dummyDetector !== "undefined"; - } - constructor(requestedFormats, verbose, logger) { - this.formatMap = new Map([ - [Html5QrcodeSupportedFormats.QR_CODE, "qr_code"], - [Html5QrcodeSupportedFormats.AZTEC, "aztec"], - [Html5QrcodeSupportedFormats.CODABAR, "codabar"], - [Html5QrcodeSupportedFormats.CODE_39, "code_39"], - [Html5QrcodeSupportedFormats.CODE_93, "code_93"], - [Html5QrcodeSupportedFormats.CODE_128, "code_128"], - [Html5QrcodeSupportedFormats.DATA_MATRIX, "data_matrix"], - [Html5QrcodeSupportedFormats.ITF, "itf"], - [Html5QrcodeSupportedFormats.EAN_13, "ean_13"], - [Html5QrcodeSupportedFormats.EAN_8, "ean_8"], - [Html5QrcodeSupportedFormats.PDF_417, "pdf417"], - [Html5QrcodeSupportedFormats.UPC_A, "upc_a"], - [Html5QrcodeSupportedFormats.UPC_E, "upc_e"] - ]); - this.reverseFormatMap = this.createReverseFormatMap(); - if (!BarcodeDetectorDelegate.isSupported()) { - throw "Use html5qrcode.min.js without edit, Use " - + "BarcodeDetectorDelegate only if it isSupported();"; - } - this.verbose = verbose; - this.logger = logger; - const formats = this.createBarcodeDetectorFormats(requestedFormats); - this.detector = new BarcodeDetector(formats); - if (!this.detector) { - throw "BarcodeDetector detector not supported"; - } - } - decodeAsync(canvas) { - return __awaiter(this, void 0, void 0, function* () { - const barcodes = yield this.detector.detect(canvas); - if (!barcodes || barcodes.length === 0) { - throw "No barcode or QR code detected."; - } - let largestBarcode = this.selectLargestBarcode(barcodes); - return { - text: largestBarcode.rawValue, - format: QrcodeResultFormat.create(this.toHtml5QrcodeSupportedFormats(largestBarcode.format)), - debugData: this.createDebugData() - }; - }); - } - selectLargestBarcode(barcodes) { - let largestBarcode = null; - let maxArea = 0; - for (let barcode of barcodes) { - let area = barcode.boundingBox.width * barcode.boundingBox.height; - if (area > maxArea) { - maxArea = area; - largestBarcode = barcode; - } - } - if (!largestBarcode) { - throw "No largest barcode found"; - } - return largestBarcode; - } - createBarcodeDetectorFormats(requestedFormats) { - let formats = []; - for (const requestedFormat of requestedFormats) { - if (this.formatMap.has(requestedFormat)) { - formats.push(this.formatMap.get(requestedFormat)); - } - else { - this.logger.warn(`${requestedFormat} is not supported by` - + "BarcodeDetectorDelegate"); - } - } - return { formats: formats }; - } - toHtml5QrcodeSupportedFormats(barcodeDetectorFormat) { - if (!this.reverseFormatMap.has(barcodeDetectorFormat)) { - throw `reverseFormatMap doesn't have ${barcodeDetectorFormat}`; - } - return this.reverseFormatMap.get(barcodeDetectorFormat); - } - createReverseFormatMap() { - let result = new Map(); - this.formatMap.forEach((value, key, _) => { - result.set(value, key); - }); - return result; - } - createDebugData() { - return { decoderName: "BarcodeDetector" }; - } -} -//# sourceMappingURL=native-bar-code-detector.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/native-bar-code-detector.js.map b/node_modules/html5-qrcode/es2015/native-bar-code-detector.js.map deleted file mode 100644 index 4b533af..0000000 --- a/node_modules/html5-qrcode/es2015/native-bar-code-detector.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"native-bar-code-detector.js","sourceRoot":"","sources":["../../src/native-bar-code-detector.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/state-manager.d.ts b/node_modules/html5-qrcode/es2015/state-manager.d.ts deleted file mode 100644 index 1c740bb..0000000 --- a/node_modules/html5-qrcode/es2015/state-manager.d.ts +++ /dev/null @@ -1,29 +0,0 @@ -export declare enum Html5QrcodeScannerState { - UNKNOWN = 0, - NOT_STARTED = 1, - SCANNING = 2, - PAUSED = 3 -} -export interface StateManagerTransaction { - execute(): void; - cancel(): void; -} -export interface StateManager { - startTransition(newState: Html5QrcodeScannerState): StateManagerTransaction; - directTransition(newState: Html5QrcodeScannerState): void; - getState(): Html5QrcodeScannerState; -} -export declare class StateManagerProxy { - private stateManager; - constructor(stateManager: StateManager); - startTransition(newState: Html5QrcodeScannerState): StateManagerTransaction; - directTransition(newState: Html5QrcodeScannerState): void; - getState(): Html5QrcodeScannerState; - canScanFile(): boolean; - isScanning(): boolean; - isStrictlyScanning(): boolean; - isPaused(): boolean; -} -export declare class StateManagerFactory { - static create(): StateManagerProxy; -} diff --git a/node_modules/html5-qrcode/es2015/state-manager.js b/node_modules/html5-qrcode/es2015/state-manager.js deleted file mode 100644 index e4f3154..0000000 --- a/node_modules/html5-qrcode/es2015/state-manager.js +++ /dev/null @@ -1,101 +0,0 @@ -export var Html5QrcodeScannerState; -(function (Html5QrcodeScannerState) { - Html5QrcodeScannerState[Html5QrcodeScannerState["UNKNOWN"] = 0] = "UNKNOWN"; - Html5QrcodeScannerState[Html5QrcodeScannerState["NOT_STARTED"] = 1] = "NOT_STARTED"; - Html5QrcodeScannerState[Html5QrcodeScannerState["SCANNING"] = 2] = "SCANNING"; - Html5QrcodeScannerState[Html5QrcodeScannerState["PAUSED"] = 3] = "PAUSED"; -})(Html5QrcodeScannerState || (Html5QrcodeScannerState = {})); -class StateManagerImpl { - constructor() { - this.state = Html5QrcodeScannerState.NOT_STARTED; - this.onGoingTransactionNewState = Html5QrcodeScannerState.UNKNOWN; - } - directTransition(newState) { - this.failIfTransitionOngoing(); - this.validateTransition(newState); - this.state = newState; - } - startTransition(newState) { - this.failIfTransitionOngoing(); - this.validateTransition(newState); - this.onGoingTransactionNewState = newState; - return this; - } - execute() { - if (this.onGoingTransactionNewState - === Html5QrcodeScannerState.UNKNOWN) { - throw "Transaction is already cancelled, cannot execute()."; - } - const tempNewState = this.onGoingTransactionNewState; - this.onGoingTransactionNewState = Html5QrcodeScannerState.UNKNOWN; - this.directTransition(tempNewState); - } - cancel() { - if (this.onGoingTransactionNewState - === Html5QrcodeScannerState.UNKNOWN) { - throw "Transaction is already cancelled, cannot cancel()."; - } - this.onGoingTransactionNewState = Html5QrcodeScannerState.UNKNOWN; - } - getState() { - return this.state; - } - failIfTransitionOngoing() { - if (this.onGoingTransactionNewState - !== Html5QrcodeScannerState.UNKNOWN) { - throw "Cannot transition to a new state, already under transition"; - } - } - validateTransition(newState) { - switch (this.state) { - case Html5QrcodeScannerState.UNKNOWN: - throw "Transition from unknown is not allowed"; - case Html5QrcodeScannerState.NOT_STARTED: - this.failIfNewStateIs(newState, [Html5QrcodeScannerState.PAUSED]); - break; - case Html5QrcodeScannerState.SCANNING: - break; - case Html5QrcodeScannerState.PAUSED: - break; - } - } - failIfNewStateIs(newState, disallowedStatesToTransition) { - for (const disallowedState of disallowedStatesToTransition) { - if (newState === disallowedState) { - throw `Cannot transition from ${this.state} to ${newState}`; - } - } - } -} -export class StateManagerProxy { - constructor(stateManager) { - this.stateManager = stateManager; - } - startTransition(newState) { - return this.stateManager.startTransition(newState); - } - directTransition(newState) { - this.stateManager.directTransition(newState); - } - getState() { - return this.stateManager.getState(); - } - canScanFile() { - return this.stateManager.getState() === Html5QrcodeScannerState.NOT_STARTED; - } - isScanning() { - return this.stateManager.getState() !== Html5QrcodeScannerState.NOT_STARTED; - } - isStrictlyScanning() { - return this.stateManager.getState() === Html5QrcodeScannerState.SCANNING; - } - isPaused() { - return this.stateManager.getState() === Html5QrcodeScannerState.PAUSED; - } -} -export class StateManagerFactory { - static create() { - return new StateManagerProxy(new StateManagerImpl()); - } -} -//# sourceMappingURL=state-manager.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/state-manager.js.map b/node_modules/html5-qrcode/es2015/state-manager.js.map deleted file mode 100644 index d60cd6b..0000000 --- a/node_modules/html5-qrcode/es2015/state-manager.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"state-manager.js","sourceRoot":"","sources":["../../src/state-manager.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/storage.d.ts b/node_modules/html5-qrcode/es2015/storage.d.ts deleted file mode 100644 index cae73a3..0000000 --- a/node_modules/html5-qrcode/es2015/storage.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -export declare class PersistedDataManager { - private data; - private static LOCAL_STORAGE_KEY; - constructor(); - hasCameraPermissions(): boolean; - getLastUsedCameraId(): string | null; - setHasPermission(hasPermission: boolean): void; - setLastUsedCameraId(lastUsedCameraId: string): void; - resetLastUsedCameraId(): void; - reset(): void; - private flush; -} diff --git a/node_modules/html5-qrcode/es2015/storage.js b/node_modules/html5-qrcode/es2015/storage.js deleted file mode 100644 index 40b07e9..0000000 --- a/node_modules/html5-qrcode/es2015/storage.js +++ /dev/null @@ -1,47 +0,0 @@ -class PersistedDataFactory { - static createDefault() { - return { - hasPermission: false, - lastUsedCameraId: null - }; - } -} -export class PersistedDataManager { - constructor() { - this.data = PersistedDataFactory.createDefault(); - let data = localStorage.getItem(PersistedDataManager.LOCAL_STORAGE_KEY); - if (!data) { - this.reset(); - } - else { - this.data = JSON.parse(data); - } - } - hasCameraPermissions() { - return this.data.hasPermission; - } - getLastUsedCameraId() { - return this.data.lastUsedCameraId; - } - setHasPermission(hasPermission) { - this.data.hasPermission = hasPermission; - this.flush(); - } - setLastUsedCameraId(lastUsedCameraId) { - this.data.lastUsedCameraId = lastUsedCameraId; - this.flush(); - } - resetLastUsedCameraId() { - this.data.lastUsedCameraId = null; - this.flush(); - } - reset() { - this.data = PersistedDataFactory.createDefault(); - this.flush(); - } - flush() { - localStorage.setItem(PersistedDataManager.LOCAL_STORAGE_KEY, JSON.stringify(this.data)); - } -} -PersistedDataManager.LOCAL_STORAGE_KEY = "HTML5_QRCODE_DATA"; -//# sourceMappingURL=storage.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/storage.js.map b/node_modules/html5-qrcode/es2015/storage.js.map deleted file mode 100644 index b038ac3..0000000 --- a/node_modules/html5-qrcode/es2015/storage.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/storage.ts"],"names":[],"mappings":"AAeA,MAAM,oBAAoB;IACtB,MAAM,CAAC,aAAa;QAChB,OAAO;YACH,aAAa,EAAE,KAAK;YACpB,gBAAgB,EAAE,IAAI;SACzB,CAAC;IACN,CAAC;CACJ;AAED,MAAM,OAAO,oBAAoB;IAK7B;QAHQ,SAAI,GAAkB,oBAAoB,CAAC,aAAa,EAAE,CAAC;QAI/D,IAAI,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;QACxE,IAAI,CAAC,IAAI,EAAE;YACP,IAAI,CAAC,KAAK,EAAE,CAAC;SAChB;aAAM;YACH,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SAChC;IACL,CAAC;IAEM,oBAAoB;QACvB,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;IACnC,CAAC;IAEM,mBAAmB;QACtB,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC;IACtC,CAAC;IAEM,gBAAgB,CAAC,aAAsB;QAC1C,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACxC,IAAI,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;IAEM,mBAAmB,CAAC,gBAAwB;QAC/C,IAAI,CAAC,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;IAEM,qBAAqB;QACxB,IAAI,CAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAClC,IAAI,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;IAEM,KAAK;QACR,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC,aAAa,EAAE,CAAC;QACjD,IAAI,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;IAEO,KAAK;QACT,YAAY,CAAC,OAAO,CAChB,oBAAoB,CAAC,iBAAiB,EACtC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACnC,CAAC;;AA3Cc,sCAAiB,GAAW,mBAAmB,CAAC"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/strings.d.ts b/node_modules/html5-qrcode/es2015/strings.d.ts deleted file mode 100644 index bb99f90..0000000 --- a/node_modules/html5-qrcode/es2015/strings.d.ts +++ /dev/null @@ -1,45 +0,0 @@ -export declare class Html5QrcodeStrings { - static codeParseError(exception: any): string; - static errorGettingUserMedia(error: any): string; - static onlyDeviceSupportedError(): string; - static cameraStreamingNotSupported(): string; - static unableToQuerySupportedDevices(): string; - static insecureContextCameraQueryError(): string; - static scannerPaused(): string; -} -export declare class Html5QrcodeScannerStrings { - static scanningStatus(): string; - static idleStatus(): string; - static errorStatus(): string; - static permissionStatus(): string; - static noCameraFoundErrorStatus(): string; - static lastMatch(decodedText: string): string; - static codeScannerTitle(): string; - static cameraPermissionTitle(): string; - static cameraPermissionRequesting(): string; - static noCameraFound(): string; - static scanButtonStopScanningText(): string; - static scanButtonStartScanningText(): string; - static torchOnButton(): string; - static torchOffButton(): string; - static torchOnFailedMessage(): string; - static torchOffFailedMessage(): string; - static scanButtonScanningStarting(): string; - static textIfCameraScanSelected(): string; - static textIfFileScanSelected(): string; - static selectCamera(): string; - static fileSelectionChooseImage(): string; - static fileSelectionChooseAnother(): string; - static fileSelectionNoImageSelected(): string; - static anonymousCameraPrefix(): string; - static dragAndDropMessage(): string; - static dragAndDropMessageOnlyImages(): string; - static zoom(): string; - static loadingImage(): string; - static cameraScanAltText(): string; - static fileScanAltText(): string; -} -export declare class LibraryInfoStrings { - static poweredBy(): string; - static reportIssues(): string; -} diff --git a/node_modules/html5-qrcode/es2015/strings.js b/node_modules/html5-qrcode/es2015/strings.js deleted file mode 100644 index a8c8eb2..0000000 --- a/node_modules/html5-qrcode/es2015/strings.js +++ /dev/null @@ -1,127 +0,0 @@ -export class Html5QrcodeStrings { - static codeParseError(exception) { - return `QR code parse error, error = ${exception}`; - } - static errorGettingUserMedia(error) { - return `Error getting userMedia, error = ${error}`; - } - static onlyDeviceSupportedError() { - return "The device doesn't support navigator.mediaDevices , only " - + "supported cameraIdOrConfig in this case is deviceId parameter " - + "(string)."; - } - static cameraStreamingNotSupported() { - return "Camera streaming not supported by the browser."; - } - static unableToQuerySupportedDevices() { - return "Unable to query supported devices, unknown error."; - } - static insecureContextCameraQueryError() { - return "Camera access is only supported in secure context like https " - + "or localhost."; - } - static scannerPaused() { - return "Scanner paused"; - } -} -export class Html5QrcodeScannerStrings { - static scanningStatus() { - return "Scanning"; - } - static idleStatus() { - return "Idle"; - } - static errorStatus() { - return "Error"; - } - static permissionStatus() { - return "Permission"; - } - static noCameraFoundErrorStatus() { - return "No Cameras"; - } - static lastMatch(decodedText) { - return `Last Match: ${decodedText}`; - } - static codeScannerTitle() { - return "Code Scanner"; - } - static cameraPermissionTitle() { - return "Request Camera Permissions"; - } - static cameraPermissionRequesting() { - return "Requesting camera permissions..."; - } - static noCameraFound() { - return "No camera found"; - } - static scanButtonStopScanningText() { - return "Stop Scanning"; - } - static scanButtonStartScanningText() { - return "Start Scanning"; - } - static torchOnButton() { - return "Switch On Torch"; - } - static torchOffButton() { - return "Switch Off Torch"; - } - static torchOnFailedMessage() { - return "Failed to turn on torch"; - } - static torchOffFailedMessage() { - return "Failed to turn off torch"; - } - static scanButtonScanningStarting() { - return "Launching Camera..."; - } - static textIfCameraScanSelected() { - return "Scan an Image File"; - } - static textIfFileScanSelected() { - return "Scan using camera directly"; - } - static selectCamera() { - return "Select Camera"; - } - static fileSelectionChooseImage() { - return "Choose Image"; - } - static fileSelectionChooseAnother() { - return "Choose Another"; - } - static fileSelectionNoImageSelected() { - return "No image choosen"; - } - static anonymousCameraPrefix() { - return "Anonymous Camera"; - } - static dragAndDropMessage() { - return "Or drop an image to scan"; - } - static dragAndDropMessageOnlyImages() { - return "Or drop an image to scan (other files not supported)"; - } - static zoom() { - return "zoom"; - } - static loadingImage() { - return "Loading image..."; - } - static cameraScanAltText() { - return "Camera based scan"; - } - static fileScanAltText() { - return "Fule based scan"; - } -} -export class LibraryInfoStrings { - static poweredBy() { - return "Powered by "; - } - static reportIssues() { - return "Report issues"; - } -} -//# sourceMappingURL=strings.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/strings.js.map b/node_modules/html5-qrcode/es2015/strings.js.map deleted file mode 100644 index 5fe4ce0..0000000 --- a/node_modules/html5-qrcode/es2015/strings.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"strings.js","sourceRoot":"","sources":["../../src/strings.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/ui.d.ts b/node_modules/html5-qrcode/es2015/ui.d.ts deleted file mode 100644 index 5f03fe9..0000000 --- a/node_modules/html5-qrcode/es2015/ui.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -export declare class LibraryInfoContainer { - private infoDiv; - private infoIcon; - constructor(); - renderInto(parent: HTMLElement): void; -} diff --git a/node_modules/html5-qrcode/es2015/ui.js b/node_modules/html5-qrcode/es2015/ui.js deleted file mode 100644 index e52572f..0000000 --- a/node_modules/html5-qrcode/es2015/ui.js +++ /dev/null @@ -1,109 +0,0 @@ -import { ASSET_CLOSE_ICON_16PX, ASSET_INFO_ICON_16PX } from "./image-assets"; -import { LibraryInfoStrings } from "./strings"; -class LibraryInfoDiv { - constructor() { - this.infoDiv = document.createElement("div"); - } - renderInto(parent) { - this.infoDiv.style.position = "absolute"; - this.infoDiv.style.top = "10px"; - this.infoDiv.style.right = "10px"; - this.infoDiv.style.zIndex = "2"; - this.infoDiv.style.display = "none"; - this.infoDiv.style.padding = "5pt"; - this.infoDiv.style.border = "1px solid #171717"; - this.infoDiv.style.fontSize = "10pt"; - this.infoDiv.style.background = "rgb(0 0 0 / 69%)"; - this.infoDiv.style.borderRadius = "5px"; - this.infoDiv.style.textAlign = "center"; - this.infoDiv.style.fontWeight = "400"; - this.infoDiv.style.color = "white"; - this.infoDiv.innerText = LibraryInfoStrings.poweredBy(); - const projectLink = document.createElement("a"); - projectLink.innerText = "ScanApp"; - projectLink.href = "https://scanapp.org"; - projectLink.target = "new"; - projectLink.style.color = "white"; - this.infoDiv.appendChild(projectLink); - const breakElemFirst = document.createElement("br"); - const breakElemSecond = document.createElement("br"); - this.infoDiv.appendChild(breakElemFirst); - this.infoDiv.appendChild(breakElemSecond); - const reportIssueLink = document.createElement("a"); - reportIssueLink.innerText = LibraryInfoStrings.reportIssues(); - reportIssueLink.href = "https://github.com/mebjas/html5-qrcode/issues"; - reportIssueLink.target = "new"; - reportIssueLink.style.color = "white"; - this.infoDiv.appendChild(reportIssueLink); - parent.appendChild(this.infoDiv); - } - show() { - this.infoDiv.style.display = "block"; - } - hide() { - this.infoDiv.style.display = "none"; - } -} -class LibraryInfoIcon { - constructor(onTapIn, onTapOut) { - this.isShowingInfoIcon = true; - this.onTapIn = onTapIn; - this.onTapOut = onTapOut; - this.infoIcon = document.createElement("img"); - } - renderInto(parent) { - this.infoIcon.alt = "Info icon"; - this.infoIcon.src = ASSET_INFO_ICON_16PX; - this.infoIcon.style.position = "absolute"; - this.infoIcon.style.top = "4px"; - this.infoIcon.style.right = "4px"; - this.infoIcon.style.opacity = "0.6"; - this.infoIcon.style.cursor = "pointer"; - this.infoIcon.style.zIndex = "2"; - this.infoIcon.style.width = "16px"; - this.infoIcon.style.height = "16px"; - this.infoIcon.onmouseover = (_) => this.onHoverIn(); - this.infoIcon.onmouseout = (_) => this.onHoverOut(); - this.infoIcon.onclick = (_) => this.onClick(); - parent.appendChild(this.infoIcon); - } - onHoverIn() { - if (this.isShowingInfoIcon) { - this.infoIcon.style.opacity = "1"; - } - } - onHoverOut() { - if (this.isShowingInfoIcon) { - this.infoIcon.style.opacity = "0.6"; - } - } - onClick() { - if (this.isShowingInfoIcon) { - this.isShowingInfoIcon = false; - this.onTapIn(); - this.infoIcon.src = ASSET_CLOSE_ICON_16PX; - this.infoIcon.style.opacity = "1"; - } - else { - this.isShowingInfoIcon = true; - this.onTapOut(); - this.infoIcon.src = ASSET_INFO_ICON_16PX; - this.infoIcon.style.opacity = "0.6"; - } - } -} -export class LibraryInfoContainer { - constructor() { - this.infoDiv = new LibraryInfoDiv(); - this.infoIcon = new LibraryInfoIcon(() => { - this.infoDiv.show(); - }, () => { - this.infoDiv.hide(); - }); - } - renderInto(parent) { - this.infoDiv.renderInto(parent); - this.infoIcon.renderInto(parent); - } -} -//# sourceMappingURL=ui.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/ui.js.map b/node_modules/html5-qrcode/es2015/ui.js.map deleted file mode 100644 index 8612e8c..0000000 --- a/node_modules/html5-qrcode/es2015/ui.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/ui.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/ui/scanner/base.d.ts b/node_modules/html5-qrcode/es2015/ui/scanner/base.d.ts deleted file mode 100644 index 1f6ba9c..0000000 --- a/node_modules/html5-qrcode/es2015/ui/scanner/base.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -export declare class PublicUiElementIdAndClasses { - static ALL_ELEMENT_CLASS: string; - static CAMERA_PERMISSION_BUTTON_ID: string; - static CAMERA_START_BUTTON_ID: string; - static CAMERA_STOP_BUTTON_ID: string; - static TORCH_BUTTON_ID: string; - static CAMERA_SELECTION_SELECT_ID: string; - static FILE_SELECTION_BUTTON_ID: string; - static ZOOM_SLIDER_ID: string; - static SCAN_TYPE_CHANGE_ANCHOR_ID: string; - static TORCH_BUTTON_CLASS_TORCH_ON: string; - static TORCH_BUTTON_CLASS_TORCH_OFF: string; -} -export declare class BaseUiElementFactory { - static createElement(elementType: string, elementId: string): Type; -} diff --git a/node_modules/html5-qrcode/es2015/ui/scanner/base.js b/node_modules/html5-qrcode/es2015/ui/scanner/base.js deleted file mode 100644 index fe6b9cf..0000000 --- a/node_modules/html5-qrcode/es2015/ui/scanner/base.js +++ /dev/null @@ -1,25 +0,0 @@ -export class PublicUiElementIdAndClasses { -} -PublicUiElementIdAndClasses.ALL_ELEMENT_CLASS = "html5-qrcode-element"; -PublicUiElementIdAndClasses.CAMERA_PERMISSION_BUTTON_ID = "html5-qrcode-button-camera-permission"; -PublicUiElementIdAndClasses.CAMERA_START_BUTTON_ID = "html5-qrcode-button-camera-start"; -PublicUiElementIdAndClasses.CAMERA_STOP_BUTTON_ID = "html5-qrcode-button-camera-stop"; -PublicUiElementIdAndClasses.TORCH_BUTTON_ID = "html5-qrcode-button-torch"; -PublicUiElementIdAndClasses.CAMERA_SELECTION_SELECT_ID = "html5-qrcode-select-camera"; -PublicUiElementIdAndClasses.FILE_SELECTION_BUTTON_ID = "html5-qrcode-button-file-selection"; -PublicUiElementIdAndClasses.ZOOM_SLIDER_ID = "html5-qrcode-input-range-zoom"; -PublicUiElementIdAndClasses.SCAN_TYPE_CHANGE_ANCHOR_ID = "html5-qrcode-anchor-scan-type-change"; -PublicUiElementIdAndClasses.TORCH_BUTTON_CLASS_TORCH_ON = "html5-qrcode-button-torch-on"; -PublicUiElementIdAndClasses.TORCH_BUTTON_CLASS_TORCH_OFF = "html5-qrcode-button-torch-off"; -export class BaseUiElementFactory { - static createElement(elementType, elementId) { - let element = (document.createElement(elementType)); - element.id = elementId; - element.classList.add(PublicUiElementIdAndClasses.ALL_ELEMENT_CLASS); - if (elementType === "button") { - element.setAttribute("type", "button"); - } - return element; - } -} -//# sourceMappingURL=base.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/ui/scanner/base.js.map b/node_modules/html5-qrcode/es2015/ui/scanner/base.js.map deleted file mode 100644 index e40a70a..0000000 --- a/node_modules/html5-qrcode/es2015/ui/scanner/base.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../src/ui/scanner/base.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,2BAA2B;;AAI7B,6CAAiB,GAAG,sBAAsB,CAAC;AAG3C,uDAA2B,GAAG,uCAAuC,CAAC;AAGtE,kDAAsB,GAAG,kCAAkC,CAAC;AAG5D,iDAAqB,GAAG,iCAAiC,CAAC;AAG1D,2CAAe,GAAG,2BAA2B,CAAC;AAG9C,sDAA0B,GAAG,4BAA4B,CAAC;AAG1D,oDAAwB,GAAG,oCAAoC,CAAC;AAGhE,0CAAc,GAAG,+BAA+B,CAAC;AAMjD,sDAA0B,GAAG,sCAAsC,CAAC;AAOpE,uDAA2B,GAAG,8BAA8B,CAAC;AAG7D,wDAA4B,GAAG,+BAA+B,CAAC;AAQ1E,MAAM,OAAO,oBAAoB;IAMtB,MAAM,CAAC,aAAa,CACvB,WAAmB,EAAE,SAAiB;QAEtC,IAAI,OAAO,GAAe,CAAC,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC;QACvB,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,2BAA2B,CAAC,iBAAiB,CAAC,CAAC;QACrE,IAAI,WAAW,KAAK,QAAQ,EAAE;YAC1B,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;SAC1C;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;CACJ"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/ui/scanner/camera-selection-ui.d.ts b/node_modules/html5-qrcode/es2015/ui/scanner/camera-selection-ui.d.ts deleted file mode 100644 index 2090ed5..0000000 --- a/node_modules/html5-qrcode/es2015/ui/scanner/camera-selection-ui.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { CameraDevice } from "../../camera/core"; -export declare class CameraSelectionUi { - private readonly selectElement; - private readonly options; - private readonly cameras; - private constructor(); - private render; - disable(): void; - isDisabled(): boolean; - enable(): void; - getValue(): string; - hasValue(value: string): boolean; - setValue(value: string): void; - hasSingleItem(): boolean; - numCameras(): number; - static create(parentElement: HTMLElement, cameras: Array): CameraSelectionUi; -} diff --git a/node_modules/html5-qrcode/es2015/ui/scanner/camera-selection-ui.js b/node_modules/html5-qrcode/es2015/ui/scanner/camera-selection-ui.js deleted file mode 100644 index 6b68f7b..0000000 --- a/node_modules/html5-qrcode/es2015/ui/scanner/camera-selection-ui.js +++ /dev/null @@ -1,82 +0,0 @@ -import { BaseUiElementFactory, PublicUiElementIdAndClasses } from "./base"; -import { Html5QrcodeScannerStrings } from "../../strings"; -export class CameraSelectionUi { - constructor(cameras) { - this.selectElement = BaseUiElementFactory - .createElement("select", PublicUiElementIdAndClasses.CAMERA_SELECTION_SELECT_ID); - this.cameras = cameras; - this.options = []; - } - render(parentElement) { - const cameraSelectionContainer = document.createElement("span"); - cameraSelectionContainer.style.marginRight = "10px"; - const numCameras = this.cameras.length; - if (numCameras === 0) { - throw new Error("No cameras found"); - } - if (numCameras === 1) { - cameraSelectionContainer.style.display = "none"; - } - else { - const selectCameraString = Html5QrcodeScannerStrings.selectCamera(); - cameraSelectionContainer.innerText - = `${selectCameraString} (${this.cameras.length}) `; - } - let anonymousCameraId = 1; - for (const camera of this.cameras) { - const value = camera.id; - let name = camera.label == null ? value : camera.label; - if (!name || name === "") { - name = [ - Html5QrcodeScannerStrings.anonymousCameraPrefix(), - anonymousCameraId++ - ].join(" "); - } - const option = document.createElement("option"); - option.value = value; - option.innerText = name; - this.options.push(option); - this.selectElement.appendChild(option); - } - cameraSelectionContainer.appendChild(this.selectElement); - parentElement.appendChild(cameraSelectionContainer); - } - disable() { - this.selectElement.disabled = true; - } - isDisabled() { - return this.selectElement.disabled === true; - } - enable() { - this.selectElement.disabled = false; - } - getValue() { - return this.selectElement.value; - } - hasValue(value) { - for (const option of this.options) { - if (option.value === value) { - return true; - } - } - return false; - } - setValue(value) { - if (!this.hasValue(value)) { - throw new Error(`${value} is not present in the camera list.`); - } - this.selectElement.value = value; - } - hasSingleItem() { - return this.cameras.length === 1; - } - numCameras() { - return this.cameras.length; - } - static create(parentElement, cameras) { - let cameraSelectUi = new CameraSelectionUi(cameras); - cameraSelectUi.render(parentElement); - return cameraSelectUi; - } -} -//# sourceMappingURL=camera-selection-ui.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/ui/scanner/camera-selection-ui.js.map b/node_modules/html5-qrcode/es2015/ui/scanner/camera-selection-ui.js.map deleted file mode 100644 index a310ef3..0000000 --- a/node_modules/html5-qrcode/es2015/ui/scanner/camera-selection-ui.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"camera-selection-ui.js","sourceRoot":"","sources":["../../../../src/ui/scanner/camera-selection-ui.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/ui/scanner/camera-zoom-ui.d.ts b/node_modules/html5-qrcode/es2015/ui/scanner/camera-zoom-ui.d.ts deleted file mode 100644 index 215bb3f..0000000 --- a/node_modules/html5-qrcode/es2015/ui/scanner/camera-zoom-ui.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -export type OnCameraZoomValueChangeCallback = (zoomValue: number) => void; -export declare class CameraZoomUi { - private zoomElementContainer; - private rangeInput; - private rangeText; - private onChangeCallback; - private constructor(); - private render; - private onValueChange; - setValues(minValue: number, maxValue: number, defaultValue: number, step: number): void; - show(): void; - hide(): void; - setOnCameraZoomValueChangeCallback(onChangeCallback: OnCameraZoomValueChangeCallback): void; - removeOnCameraZoomValueChangeCallback(): void; - static create(parentElement: HTMLElement, renderOnCreate: boolean): CameraZoomUi; -} diff --git a/node_modules/html5-qrcode/es2015/ui/scanner/camera-zoom-ui.js b/node_modules/html5-qrcode/es2015/ui/scanner/camera-zoom-ui.js deleted file mode 100644 index d44c2c0..0000000 --- a/node_modules/html5-qrcode/es2015/ui/scanner/camera-zoom-ui.js +++ /dev/null @@ -1,68 +0,0 @@ -import { BaseUiElementFactory, PublicUiElementIdAndClasses } from "./base"; -import { Html5QrcodeScannerStrings } from "../../strings"; -export class CameraZoomUi { - constructor() { - this.onChangeCallback = null; - this.zoomElementContainer = document.createElement("div"); - this.rangeInput = BaseUiElementFactory.createElement("input", PublicUiElementIdAndClasses.ZOOM_SLIDER_ID); - this.rangeInput.type = "range"; - this.rangeText = document.createElement("span"); - this.rangeInput.min = "1"; - this.rangeInput.max = "5"; - this.rangeInput.value = "1"; - this.rangeInput.step = "0.1"; - } - render(parentElement, renderOnCreate) { - this.zoomElementContainer.style.display - = renderOnCreate ? "block" : "none"; - this.zoomElementContainer.style.padding = "5px 10px"; - this.zoomElementContainer.style.textAlign = "center"; - parentElement.appendChild(this.zoomElementContainer); - this.rangeInput.style.display = "inline-block"; - this.rangeInput.style.width = "50%"; - this.rangeInput.style.height = "5px"; - this.rangeInput.style.background = "#d3d3d3"; - this.rangeInput.style.outline = "none"; - this.rangeInput.style.opacity = "0.7"; - let zoomString = Html5QrcodeScannerStrings.zoom(); - this.rangeText.innerText = `${this.rangeInput.value}x ${zoomString}`; - this.rangeText.style.marginRight = "10px"; - let $this = this; - this.rangeInput.addEventListener("input", () => $this.onValueChange()); - this.rangeInput.addEventListener("change", () => $this.onValueChange()); - this.zoomElementContainer.appendChild(this.rangeInput); - this.zoomElementContainer.appendChild(this.rangeText); - } - onValueChange() { - let zoomString = Html5QrcodeScannerStrings.zoom(); - this.rangeText.innerText = `${this.rangeInput.value}x ${zoomString}`; - if (this.onChangeCallback) { - this.onChangeCallback(parseFloat(this.rangeInput.value)); - } - } - setValues(minValue, maxValue, defaultValue, step) { - this.rangeInput.min = minValue.toString(); - this.rangeInput.max = maxValue.toString(); - this.rangeInput.step = step.toString(); - this.rangeInput.value = defaultValue.toString(); - this.onValueChange(); - } - show() { - this.zoomElementContainer.style.display = "block"; - } - hide() { - this.zoomElementContainer.style.display = "none"; - } - setOnCameraZoomValueChangeCallback(onChangeCallback) { - this.onChangeCallback = onChangeCallback; - } - removeOnCameraZoomValueChangeCallback() { - this.onChangeCallback = null; - } - static create(parentElement, renderOnCreate) { - let cameraZoomUi = new CameraZoomUi(); - cameraZoomUi.render(parentElement, renderOnCreate); - return cameraZoomUi; - } -} -//# sourceMappingURL=camera-zoom-ui.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/ui/scanner/camera-zoom-ui.js.map b/node_modules/html5-qrcode/es2015/ui/scanner/camera-zoom-ui.js.map deleted file mode 100644 index 96ebeff..0000000 --- a/node_modules/html5-qrcode/es2015/ui/scanner/camera-zoom-ui.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"camera-zoom-ui.js","sourceRoot":"","sources":["../../../../src/ui/scanner/camera-zoom-ui.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/ui/scanner/file-selection-ui.d.ts b/node_modules/html5-qrcode/es2015/ui/scanner/file-selection-ui.d.ts deleted file mode 100644 index 768f5ed..0000000 --- a/node_modules/html5-qrcode/es2015/ui/scanner/file-selection-ui.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -export type OnFileSelected = (file: File) => void; -export declare class FileSelectionUi { - private readonly fileBasedScanRegion; - private readonly fileScanInput; - private readonly fileSelectionButton; - private constructor(); - hide(): void; - show(): void; - isShowing(): boolean; - resetValue(): void; - private createFileBasedScanRegion; - private fileBasedScanRegionDefaultBorder; - private fileBasedScanRegionActiveBorder; - private createDragAndDropMessage; - private setImageNameToButton; - private setInitialValueToButton; - private getFileScanInputId; - static create(parentElement: HTMLDivElement, showOnRender: boolean, onFileSelected: OnFileSelected): FileSelectionUi; -} diff --git a/node_modules/html5-qrcode/es2015/ui/scanner/file-selection-ui.js b/node_modules/html5-qrcode/es2015/ui/scanner/file-selection-ui.js deleted file mode 100644 index 1bf3106..0000000 --- a/node_modules/html5-qrcode/es2015/ui/scanner/file-selection-ui.js +++ /dev/null @@ -1,165 +0,0 @@ -import { Html5QrcodeScannerStrings } from "../../strings"; -import { BaseUiElementFactory, PublicUiElementIdAndClasses } from "./base"; -export class FileSelectionUi { - constructor(parentElement, showOnRender, onFileSelected) { - this.fileBasedScanRegion = this.createFileBasedScanRegion(); - this.fileBasedScanRegion.style.display - = showOnRender ? "block" : "none"; - parentElement.appendChild(this.fileBasedScanRegion); - let fileScanLabel = document.createElement("label"); - fileScanLabel.setAttribute("for", this.getFileScanInputId()); - fileScanLabel.style.display = "inline-block"; - this.fileBasedScanRegion.appendChild(fileScanLabel); - this.fileSelectionButton - = BaseUiElementFactory.createElement("button", PublicUiElementIdAndClasses.FILE_SELECTION_BUTTON_ID); - this.setInitialValueToButton(); - this.fileSelectionButton.addEventListener("click", (_) => { - fileScanLabel.click(); - }); - fileScanLabel.append(this.fileSelectionButton); - this.fileScanInput - = BaseUiElementFactory.createElement("input", this.getFileScanInputId()); - this.fileScanInput.type = "file"; - this.fileScanInput.accept = "image/*"; - this.fileScanInput.style.display = "none"; - fileScanLabel.appendChild(this.fileScanInput); - let $this = this; - this.fileScanInput.addEventListener("change", (e) => { - if (e == null || e.target == null) { - return; - } - let target = e.target; - if (target.files && target.files.length === 0) { - return; - } - let fileList = target.files; - const file = fileList[0]; - let fileName = file.name; - $this.setImageNameToButton(fileName); - onFileSelected(file); - }); - let dragAndDropMessage = this.createDragAndDropMessage(); - this.fileBasedScanRegion.appendChild(dragAndDropMessage); - this.fileBasedScanRegion.addEventListener("dragenter", function (event) { - $this.fileBasedScanRegion.style.border - = $this.fileBasedScanRegionActiveBorder(); - event.stopPropagation(); - event.preventDefault(); - }); - this.fileBasedScanRegion.addEventListener("dragleave", function (event) { - $this.fileBasedScanRegion.style.border - = $this.fileBasedScanRegionDefaultBorder(); - event.stopPropagation(); - event.preventDefault(); - }); - this.fileBasedScanRegion.addEventListener("dragover", function (event) { - $this.fileBasedScanRegion.style.border - = $this.fileBasedScanRegionActiveBorder(); - event.stopPropagation(); - event.preventDefault(); - }); - this.fileBasedScanRegion.addEventListener("drop", function (event) { - event.stopPropagation(); - event.preventDefault(); - $this.fileBasedScanRegion.style.border - = $this.fileBasedScanRegionDefaultBorder(); - var dataTransfer = event.dataTransfer; - if (dataTransfer) { - let files = dataTransfer.files; - if (!files || files.length === 0) { - return; - } - let isAnyFileImage = false; - for (let i = 0; i < files.length; ++i) { - let file = files.item(i); - if (!file) { - continue; - } - let imageType = /image.*/; - if (!file.type.match(imageType)) { - continue; - } - isAnyFileImage = true; - let fileName = file.name; - $this.setImageNameToButton(fileName); - onFileSelected(file); - dragAndDropMessage.innerText - = Html5QrcodeScannerStrings.dragAndDropMessage(); - break; - } - if (!isAnyFileImage) { - dragAndDropMessage.innerText - = Html5QrcodeScannerStrings - .dragAndDropMessageOnlyImages(); - } - } - }); - } - hide() { - this.fileBasedScanRegion.style.display = "none"; - this.fileScanInput.disabled = true; - } - show() { - this.fileBasedScanRegion.style.display = "block"; - this.fileScanInput.disabled = false; - } - isShowing() { - return this.fileBasedScanRegion.style.display === "block"; - } - resetValue() { - this.fileScanInput.value = ""; - this.setInitialValueToButton(); - } - createFileBasedScanRegion() { - let fileBasedScanRegion = document.createElement("div"); - fileBasedScanRegion.style.textAlign = "center"; - fileBasedScanRegion.style.margin = "auto"; - fileBasedScanRegion.style.width = "80%"; - fileBasedScanRegion.style.maxWidth = "600px"; - fileBasedScanRegion.style.border - = this.fileBasedScanRegionDefaultBorder(); - fileBasedScanRegion.style.padding = "10px"; - fileBasedScanRegion.style.marginBottom = "10px"; - return fileBasedScanRegion; - } - fileBasedScanRegionDefaultBorder() { - return "6px dashed #ebebeb"; - } - fileBasedScanRegionActiveBorder() { - return "6px dashed rgb(153 151 151)"; - } - createDragAndDropMessage() { - let dragAndDropMessage = document.createElement("div"); - dragAndDropMessage.innerText - = Html5QrcodeScannerStrings.dragAndDropMessage(); - dragAndDropMessage.style.fontWeight = "400"; - return dragAndDropMessage; - } - setImageNameToButton(imageFileName) { - const MAX_CHARS = 20; - if (imageFileName.length > MAX_CHARS) { - let start8Chars = imageFileName.substring(0, 8); - let length = imageFileName.length; - let last8Chars = imageFileName.substring(length - 8, length); - imageFileName = `${start8Chars}....${last8Chars}`; - } - let newText = Html5QrcodeScannerStrings.fileSelectionChooseAnother() - + " - " - + imageFileName; - this.fileSelectionButton.innerText = newText; - } - setInitialValueToButton() { - let initialText = Html5QrcodeScannerStrings.fileSelectionChooseImage() - + " - " - + Html5QrcodeScannerStrings.fileSelectionNoImageSelected(); - this.fileSelectionButton.innerText = initialText; - } - getFileScanInputId() { - return "html5-qrcode-private-filescan-input"; - } - static create(parentElement, showOnRender, onFileSelected) { - let button = new FileSelectionUi(parentElement, showOnRender, onFileSelected); - return button; - } -} -//# sourceMappingURL=file-selection-ui.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/ui/scanner/file-selection-ui.js.map b/node_modules/html5-qrcode/es2015/ui/scanner/file-selection-ui.js.map deleted file mode 100644 index 1dc5220..0000000 --- a/node_modules/html5-qrcode/es2015/ui/scanner/file-selection-ui.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"file-selection-ui.js","sourceRoot":"","sources":["../../../../src/ui/scanner/file-selection-ui.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/ui/scanner/scan-type-selector.d.ts b/node_modules/html5-qrcode/es2015/ui/scanner/scan-type-selector.d.ts deleted file mode 100644 index 2f0e134..0000000 --- a/node_modules/html5-qrcode/es2015/ui/scanner/scan-type-selector.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Html5QrcodeScanType } from "../../core"; -export declare class ScanTypeSelector { - private supportedScanTypes; - constructor(supportedScanTypes?: Array | []); - getDefaultScanType(): Html5QrcodeScanType; - hasMoreThanOneScanType(): boolean; - isCameraScanRequired(): boolean; - static isCameraScanType(scanType: Html5QrcodeScanType): boolean; - static isFileScanType(scanType: Html5QrcodeScanType): boolean; - private validateAndReturnScanTypes; -} diff --git a/node_modules/html5-qrcode/es2015/ui/scanner/scan-type-selector.js b/node_modules/html5-qrcode/es2015/ui/scanner/scan-type-selector.js deleted file mode 100644 index 624427f..0000000 --- a/node_modules/html5-qrcode/es2015/ui/scanner/scan-type-selector.js +++ /dev/null @@ -1,44 +0,0 @@ -import { Html5QrcodeScanType, Html5QrcodeConstants } from "../../core"; -export class ScanTypeSelector { - constructor(supportedScanTypes) { - this.supportedScanTypes = this.validateAndReturnScanTypes(supportedScanTypes); - } - getDefaultScanType() { - return this.supportedScanTypes[0]; - } - hasMoreThanOneScanType() { - return this.supportedScanTypes.length > 1; - } - isCameraScanRequired() { - for (const scanType of this.supportedScanTypes) { - if (ScanTypeSelector.isCameraScanType(scanType)) { - return true; - } - } - return false; - } - static isCameraScanType(scanType) { - return scanType === Html5QrcodeScanType.SCAN_TYPE_CAMERA; - } - static isFileScanType(scanType) { - return scanType === Html5QrcodeScanType.SCAN_TYPE_FILE; - } - validateAndReturnScanTypes(supportedScanTypes) { - if (!supportedScanTypes || supportedScanTypes.length === 0) { - return Html5QrcodeConstants.DEFAULT_SUPPORTED_SCAN_TYPE; - } - let maxExpectedValues = Html5QrcodeConstants.DEFAULT_SUPPORTED_SCAN_TYPE.length; - if (supportedScanTypes.length > maxExpectedValues) { - throw `Max ${maxExpectedValues} values expected for ` - + "supportedScanTypes"; - } - for (const scanType of supportedScanTypes) { - if (!Html5QrcodeConstants.DEFAULT_SUPPORTED_SCAN_TYPE - .includes(scanType)) { - throw `Unsupported scan type ${scanType}`; - } - } - return supportedScanTypes; - } -} -//# sourceMappingURL=scan-type-selector.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/ui/scanner/scan-type-selector.js.map b/node_modules/html5-qrcode/es2015/ui/scanner/scan-type-selector.js.map deleted file mode 100644 index e8750db..0000000 --- a/node_modules/html5-qrcode/es2015/ui/scanner/scan-type-selector.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"scan-type-selector.js","sourceRoot":"","sources":["../../../../src/ui/scanner/scan-type-selector.ts"],"names":[],"mappings":"AAUA,OAAO,EACH,mBAAmB,EACnB,oBAAoB,EACvB,MAAM,YAAY,CAAC;AAGpB,MAAM,OAAO,gBAAgB;IAGzB,YAAY,kBAAoD;QAC5D,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,0BAA0B,CACrD,kBAAkB,CAAC,CAAC;IAC5B,CAAC;IAMM,kBAAkB;QACrB,OAAO,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;IAMM,sBAAsB;QACzB,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9C,CAAC;IAGM,oBAAoB;QACvB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,kBAAkB,EAAE;YAC5C,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE;gBAC7C,OAAO,IAAI,CAAC;aACf;SACJ;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAGM,MAAM,CAAC,gBAAgB,CAAC,QAA6B;QACxD,OAAO,QAAQ,KAAK,mBAAmB,CAAC,gBAAgB,CAAC;IAC7D,CAAC;IAGM,MAAM,CAAC,cAAc,CAAC,QAA6B;QACtD,OAAO,QAAQ,KAAK,mBAAmB,CAAC,cAAc,CAAC;IAC3D,CAAC;IAQO,0BAA0B,CAC9B,kBAA8C;QAG9C,IAAI,CAAC,kBAAkB,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE;YACxD,OAAO,oBAAoB,CAAC,2BAA2B,CAAC;SAC3D;QAGD,IAAI,iBAAiB,GACf,oBAAoB,CAAC,2BAA2B,CAAC,MAAM,CAAC;QAC9D,IAAI,kBAAkB,CAAC,MAAM,GAAG,iBAAiB,EAAE;YAC/C,MAAM,OAAO,iBAAiB,uBAAuB;kBAC/C,oBAAoB,CAAC;SAC9B;QAGD,KAAK,MAAM,QAAQ,IAAI,kBAAkB,EAAE;YACvC,IAAI,CAAC,oBAAoB,CAAC,2BAA2B;iBAC5C,QAAQ,CAAC,QAAQ,CAAC,EAAE;gBACzB,MAAM,yBAAyB,QAAQ,EAAE,CAAC;aAC7C;SACJ;QAED,OAAO,kBAAkB,CAAC;IAC9B,CAAC;CAEJ"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/ui/scanner/torch-button.d.ts b/node_modules/html5-qrcode/es2015/ui/scanner/torch-button.d.ts deleted file mode 100644 index a862a10..0000000 --- a/node_modules/html5-qrcode/es2015/ui/scanner/torch-button.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { BooleanCameraCapability } from "../../camera/core"; -export type OnTorchActionFailureCallback = (failureMessage: string) => void; -interface TorchButtonController { - disable(): void; - enable(): void; - setText(text: string): void; -} -export interface TorchButtonOptions { - display: string; - marginLeft: string; -} -export declare class TorchButton implements TorchButtonController { - private readonly torchButton; - private readonly onTorchActionFailureCallback; - private torchController; - private constructor(); - private render; - updateTorchCapability(torchCapability: BooleanCameraCapability): void; - getTorchButton(): HTMLButtonElement; - hide(): void; - show(): void; - disable(): void; - enable(): void; - setText(text: string): void; - reset(): void; - static create(parentElement: HTMLElement, torchCapability: BooleanCameraCapability, torchButtonOptions: TorchButtonOptions, onTorchActionFailureCallback: OnTorchActionFailureCallback): TorchButton; -} -export {}; diff --git a/node_modules/html5-qrcode/es2015/ui/scanner/torch-button.js b/node_modules/html5-qrcode/es2015/ui/scanner/torch-button.js deleted file mode 100644 index f3fa699..0000000 --- a/node_modules/html5-qrcode/es2015/ui/scanner/torch-button.js +++ /dev/null @@ -1,118 +0,0 @@ -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -import { Html5QrcodeScannerStrings } from "../../strings"; -import { BaseUiElementFactory, PublicUiElementIdAndClasses } from "./base"; -class TorchController { - constructor(torchCapability, buttonController, onTorchActionFailureCallback) { - this.isTorchOn = false; - this.torchCapability = torchCapability; - this.buttonController = buttonController; - this.onTorchActionFailureCallback = onTorchActionFailureCallback; - } - isTorchEnabled() { - return this.isTorchOn; - } - flipState() { - return __awaiter(this, void 0, void 0, function* () { - this.buttonController.disable(); - let isTorchOnExpected = !this.isTorchOn; - try { - yield this.torchCapability.apply(isTorchOnExpected); - this.updateUiBasedOnLatestSettings(this.torchCapability.value(), isTorchOnExpected); - } - catch (error) { - this.propagateFailure(isTorchOnExpected, error); - this.buttonController.enable(); - } - }); - } - updateUiBasedOnLatestSettings(isTorchOn, isTorchOnExpected) { - if (isTorchOn === isTorchOnExpected) { - this.buttonController.setText(isTorchOnExpected - ? Html5QrcodeScannerStrings.torchOffButton() - : Html5QrcodeScannerStrings.torchOnButton()); - this.isTorchOn = isTorchOnExpected; - } - else { - this.propagateFailure(isTorchOnExpected); - } - this.buttonController.enable(); - } - propagateFailure(isTorchOnExpected, error) { - let errorMessage = isTorchOnExpected - ? Html5QrcodeScannerStrings.torchOnFailedMessage() - : Html5QrcodeScannerStrings.torchOffFailedMessage(); - if (error) { - errorMessage += "; Error = " + error; - } - this.onTorchActionFailureCallback(errorMessage); - } - reset() { - this.isTorchOn = false; - } -} -export class TorchButton { - constructor(torchCapability, onTorchActionFailureCallback) { - this.onTorchActionFailureCallback = onTorchActionFailureCallback; - this.torchButton - = BaseUiElementFactory.createElement("button", PublicUiElementIdAndClasses.TORCH_BUTTON_ID); - this.torchController = new TorchController(torchCapability, this, onTorchActionFailureCallback); - } - render(parentElement, torchButtonOptions) { - this.torchButton.innerText - = Html5QrcodeScannerStrings.torchOnButton(); - this.torchButton.style.display = torchButtonOptions.display; - this.torchButton.style.marginLeft = torchButtonOptions.marginLeft; - let $this = this; - this.torchButton.addEventListener("click", (_) => __awaiter(this, void 0, void 0, function* () { - yield $this.torchController.flipState(); - if ($this.torchController.isTorchEnabled()) { - $this.torchButton.classList.remove(PublicUiElementIdAndClasses.TORCH_BUTTON_CLASS_TORCH_OFF); - $this.torchButton.classList.add(PublicUiElementIdAndClasses.TORCH_BUTTON_CLASS_TORCH_ON); - } - else { - $this.torchButton.classList.remove(PublicUiElementIdAndClasses.TORCH_BUTTON_CLASS_TORCH_ON); - $this.torchButton.classList.add(PublicUiElementIdAndClasses.TORCH_BUTTON_CLASS_TORCH_OFF); - } - })); - parentElement.appendChild(this.torchButton); - } - updateTorchCapability(torchCapability) { - this.torchController = new TorchController(torchCapability, this, this.onTorchActionFailureCallback); - } - getTorchButton() { - return this.torchButton; - } - hide() { - this.torchButton.style.display = "none"; - } - show() { - this.torchButton.style.display = "inline-block"; - } - disable() { - this.torchButton.disabled = true; - } - enable() { - this.torchButton.disabled = false; - } - setText(text) { - this.torchButton.innerText = text; - } - reset() { - this.torchButton.innerText = Html5QrcodeScannerStrings.torchOnButton(); - this.torchController.reset(); - } - static create(parentElement, torchCapability, torchButtonOptions, onTorchActionFailureCallback) { - let button = new TorchButton(torchCapability, onTorchActionFailureCallback); - button.render(parentElement, torchButtonOptions); - return button; - } -} -//# sourceMappingURL=torch-button.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/ui/scanner/torch-button.js.map b/node_modules/html5-qrcode/es2015/ui/scanner/torch-button.js.map deleted file mode 100644 index cf9293f..0000000 --- a/node_modules/html5-qrcode/es2015/ui/scanner/torch-button.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"torch-button.js","sourceRoot":"","sources":["../../../../src/ui/scanner/torch-button.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/utils.d.ts b/node_modules/html5-qrcode/es2015/utils.d.ts deleted file mode 100644 index 1b060ed..0000000 --- a/node_modules/html5-qrcode/es2015/utils.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { Logger } from "./core"; -export declare class VideoConstraintsUtil { - static isMediaStreamConstraintsValid(videoConstraints: MediaTrackConstraints, logger: Logger): boolean; -} diff --git a/node_modules/html5-qrcode/es2015/utils.js b/node_modules/html5-qrcode/es2015/utils.js deleted file mode 100644 index 7812e2e..0000000 --- a/node_modules/html5-qrcode/es2015/utils.js +++ /dev/null @@ -1,30 +0,0 @@ -export class VideoConstraintsUtil { - static isMediaStreamConstraintsValid(videoConstraints, logger) { - if (typeof videoConstraints !== "object") { - const typeofVideoConstraints = typeof videoConstraints; - logger.logError("videoConstraints should be of type object, the " - + `object passed is of type ${typeofVideoConstraints}.`, true); - return false; - } - const bannedKeys = [ - "autoGainControl", - "channelCount", - "echoCancellation", - "latency", - "noiseSuppression", - "sampleRate", - "sampleSize", - "volume" - ]; - const bannedkeysSet = new Set(bannedKeys); - const keysInVideoConstraints = Object.keys(videoConstraints); - for (const key of keysInVideoConstraints) { - if (bannedkeysSet.has(key)) { - logger.logError(`${key} is not supported videoConstaints.`, true); - return false; - } - } - return true; - } -} -//# sourceMappingURL=utils.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/utils.js.map b/node_modules/html5-qrcode/es2015/utils.js.map deleted file mode 100644 index e5e1ca1..0000000 --- a/node_modules/html5-qrcode/es2015/utils.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAeA,MAAM,OAAO,oBAAoB;IACtB,MAAM,CAAC,6BAA6B,CACvC,gBAAuC,EACvC,MAAc;QACd,IAAI,OAAO,gBAAgB,KAAK,QAAQ,EAAE;YACtC,MAAM,sBAAsB,GAAG,OAAO,gBAAgB,CAAC;YACvD,MAAM,CAAC,QAAQ,CACX,iDAAiD;kBAC3C,4BAA4B,sBAAsB,GAAG,EACvC,IAAI,CAAC,CAAC;YAC9B,OAAO,KAAK,CAAC;SAChB;QAGD,MAAM,UAAU,GAAG;YACf,iBAAiB;YACjB,cAAc;YACd,kBAAkB;YAClB,SAAS;YACT,kBAAkB;YAClB,YAAY;YACZ,YAAY;YACZ,QAAQ;SACX,CAAC;QACF,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,sBAAsB,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7D,KAAK,MAAM,GAAG,IAAI,sBAAsB,EAAE;YACtC,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;gBACxB,MAAM,CAAC,QAAQ,CACX,GAAG,GAAG,oCAAoC,EACtB,IAAI,CAAC,CAAC;gBAC9B,OAAO,KAAK,CAAC;aAChB;SACJ;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/zxing-html5-qrcode-decoder.d.ts b/node_modules/html5-qrcode/es2015/zxing-html5-qrcode-decoder.d.ts deleted file mode 100644 index 411d377..0000000 --- a/node_modules/html5-qrcode/es2015/zxing-html5-qrcode-decoder.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { QrcodeResult, Html5QrcodeSupportedFormats, Logger, QrcodeDecoderAsync } from "./core"; -export declare class ZXingHtml5QrcodeDecoder implements QrcodeDecoderAsync { - private readonly formatMap; - private readonly reverseFormatMap; - private hints; - private verbose; - private logger; - constructor(requestedFormats: Array, verbose: boolean, logger: Logger); - decodeAsync(canvas: HTMLCanvasElement): Promise; - private decode; - private createReverseFormatMap; - private toHtml5QrcodeSupportedFormats; - private createZXingFormats; - private createDebugData; -} diff --git a/node_modules/html5-qrcode/es2015/zxing-html5-qrcode-decoder.js b/node_modules/html5-qrcode/es2015/zxing-html5-qrcode-decoder.js deleted file mode 100644 index ac81e2e..0000000 --- a/node_modules/html5-qrcode/es2015/zxing-html5-qrcode-decoder.js +++ /dev/null @@ -1,102 +0,0 @@ -import * as ZXing from "../third_party/zxing-js.umd"; -import { QrcodeResultFormat, Html5QrcodeSupportedFormats } from "./core"; -export class ZXingHtml5QrcodeDecoder { - constructor(requestedFormats, verbose, logger) { - this.formatMap = new Map([ - [Html5QrcodeSupportedFormats.QR_CODE, ZXing.BarcodeFormat.QR_CODE], - [Html5QrcodeSupportedFormats.AZTEC, ZXing.BarcodeFormat.AZTEC], - [Html5QrcodeSupportedFormats.CODABAR, ZXing.BarcodeFormat.CODABAR], - [Html5QrcodeSupportedFormats.CODE_39, ZXing.BarcodeFormat.CODE_39], - [Html5QrcodeSupportedFormats.CODE_93, ZXing.BarcodeFormat.CODE_93], - [ - Html5QrcodeSupportedFormats.CODE_128, - ZXing.BarcodeFormat.CODE_128 - ], - [ - Html5QrcodeSupportedFormats.DATA_MATRIX, - ZXing.BarcodeFormat.DATA_MATRIX - ], - [ - Html5QrcodeSupportedFormats.MAXICODE, - ZXing.BarcodeFormat.MAXICODE - ], - [Html5QrcodeSupportedFormats.ITF, ZXing.BarcodeFormat.ITF], - [Html5QrcodeSupportedFormats.EAN_13, ZXing.BarcodeFormat.EAN_13], - [Html5QrcodeSupportedFormats.EAN_8, ZXing.BarcodeFormat.EAN_8], - [Html5QrcodeSupportedFormats.PDF_417, ZXing.BarcodeFormat.PDF_417], - [Html5QrcodeSupportedFormats.RSS_14, ZXing.BarcodeFormat.RSS_14], - [ - Html5QrcodeSupportedFormats.RSS_EXPANDED, - ZXing.BarcodeFormat.RSS_EXPANDED - ], - [Html5QrcodeSupportedFormats.UPC_A, ZXing.BarcodeFormat.UPC_A], - [Html5QrcodeSupportedFormats.UPC_E, ZXing.BarcodeFormat.UPC_E], - [ - Html5QrcodeSupportedFormats.UPC_EAN_EXTENSION, - ZXing.BarcodeFormat.UPC_EAN_EXTENSION - ] - ]); - this.reverseFormatMap = this.createReverseFormatMap(); - if (!ZXing) { - throw "Use html5qrcode.min.js without edit, ZXing not found."; - } - this.verbose = verbose; - this.logger = logger; - const formats = this.createZXingFormats(requestedFormats); - const hints = new Map(); - hints.set(ZXing.DecodeHintType.POSSIBLE_FORMATS, formats); - hints.set(ZXing.DecodeHintType.TRY_HARDER, false); - this.hints = hints; - } - decodeAsync(canvas) { - return new Promise((resolve, reject) => { - try { - resolve(this.decode(canvas)); - } - catch (error) { - reject(error); - } - }); - } - decode(canvas) { - const zxingDecoder = new ZXing.MultiFormatReader(this.verbose, this.hints); - const luminanceSource = new ZXing.HTMLCanvasElementLuminanceSource(canvas); - const binaryBitmap = new ZXing.BinaryBitmap(new ZXing.HybridBinarizer(luminanceSource)); - let result = zxingDecoder.decode(binaryBitmap); - return { - text: result.text, - format: QrcodeResultFormat.create(this.toHtml5QrcodeSupportedFormats(result.format)), - debugData: this.createDebugData() - }; - } - createReverseFormatMap() { - let result = new Map(); - this.formatMap.forEach((value, key, _) => { - result.set(value, key); - }); - return result; - } - toHtml5QrcodeSupportedFormats(zxingFormat) { - if (!this.reverseFormatMap.has(zxingFormat)) { - throw `reverseFormatMap doesn't have ${zxingFormat}`; - } - return this.reverseFormatMap.get(zxingFormat); - } - createZXingFormats(requestedFormats) { - let zxingFormats = []; - for (const requestedFormat of requestedFormats) { - if (this.formatMap.has(requestedFormat)) { - zxingFormats.push(this.formatMap.get(requestedFormat)); - } - else { - this.logger.logError(`${requestedFormat} is not supported by` - + "ZXingHtml5QrcodeShim"); - } - } - return zxingFormats; - } - createDebugData() { - return { decoderName: "zxing-js" }; - } -} -//# sourceMappingURL=zxing-html5-qrcode-decoder.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/es2015/zxing-html5-qrcode-decoder.js.map b/node_modules/html5-qrcode/es2015/zxing-html5-qrcode-decoder.js.map deleted file mode 100644 index aa9640f..0000000 --- a/node_modules/html5-qrcode/es2015/zxing-html5-qrcode-decoder.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"zxing-html5-qrcode-decoder.js","sourceRoot":"","sources":["../../src/zxing-html5-qrcode-decoder.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/camera/core-impl.d.ts b/node_modules/html5-qrcode/esm/camera/core-impl.d.ts deleted file mode 100644 index ffc8a05..0000000 --- a/node_modules/html5-qrcode/esm/camera/core-impl.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Camera, CameraRenderingOptions, RenderedCamera, RenderingCallbacks } from "./core"; -export declare class CameraImpl implements Camera { - private readonly mediaStream; - private constructor(); - render(parentElement: HTMLElement, options: CameraRenderingOptions, callbacks: RenderingCallbacks): Promise; - static create(videoConstraints: MediaTrackConstraints): Promise; -} diff --git a/node_modules/html5-qrcode/esm/camera/core-impl.js b/node_modules/html5-qrcode/esm/camera/core-impl.js deleted file mode 100644 index 48948cb..0000000 --- a/node_modules/html5-qrcode/esm/camera/core-impl.js +++ /dev/null @@ -1,311 +0,0 @@ -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - if (typeof b !== "function" && b !== null) - throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (g && (g = 0, op[0] && (_ = 0)), _) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -var AbstractCameraCapability = (function () { - function AbstractCameraCapability(name, track) { - this.name = name; - this.track = track; - } - AbstractCameraCapability.prototype.isSupported = function () { - if (!this.track.getCapabilities) { - return false; - } - return this.name in this.track.getCapabilities(); - }; - AbstractCameraCapability.prototype.apply = function (value) { - var constraint = {}; - constraint[this.name] = value; - var constraints = { advanced: [constraint] }; - return this.track.applyConstraints(constraints); - }; - AbstractCameraCapability.prototype.value = function () { - var settings = this.track.getSettings(); - if (this.name in settings) { - var settingValue = settings[this.name]; - return settingValue; - } - return null; - }; - return AbstractCameraCapability; -}()); -var AbstractRangeCameraCapability = (function (_super) { - __extends(AbstractRangeCameraCapability, _super); - function AbstractRangeCameraCapability(name, track) { - return _super.call(this, name, track) || this; - } - AbstractRangeCameraCapability.prototype.min = function () { - return this.getCapabilities().min; - }; - AbstractRangeCameraCapability.prototype.max = function () { - return this.getCapabilities().max; - }; - AbstractRangeCameraCapability.prototype.step = function () { - return this.getCapabilities().step; - }; - AbstractRangeCameraCapability.prototype.apply = function (value) { - var constraint = {}; - constraint[this.name] = value; - var constraints = { advanced: [constraint] }; - return this.track.applyConstraints(constraints); - }; - AbstractRangeCameraCapability.prototype.getCapabilities = function () { - this.failIfNotSupported(); - var capabilities = this.track.getCapabilities(); - var capability = capabilities[this.name]; - return { - min: capability.min, - max: capability.max, - step: capability.step, - }; - }; - AbstractRangeCameraCapability.prototype.failIfNotSupported = function () { - if (!this.isSupported()) { - throw new Error("".concat(this.name, " capability not supported")); - } - }; - return AbstractRangeCameraCapability; -}(AbstractCameraCapability)); -var ZoomFeatureImpl = (function (_super) { - __extends(ZoomFeatureImpl, _super); - function ZoomFeatureImpl(track) { - return _super.call(this, "zoom", track) || this; - } - return ZoomFeatureImpl; -}(AbstractRangeCameraCapability)); -var TorchFeatureImpl = (function (_super) { - __extends(TorchFeatureImpl, _super); - function TorchFeatureImpl(track) { - return _super.call(this, "torch", track) || this; - } - return TorchFeatureImpl; -}(AbstractCameraCapability)); -var CameraCapabilitiesImpl = (function () { - function CameraCapabilitiesImpl(track) { - this.track = track; - } - CameraCapabilitiesImpl.prototype.zoomFeature = function () { - return new ZoomFeatureImpl(this.track); - }; - CameraCapabilitiesImpl.prototype.torchFeature = function () { - return new TorchFeatureImpl(this.track); - }; - return CameraCapabilitiesImpl; -}()); -var RenderedCameraImpl = (function () { - function RenderedCameraImpl(parentElement, mediaStream, callbacks) { - this.isClosed = false; - this.parentElement = parentElement; - this.mediaStream = mediaStream; - this.callbacks = callbacks; - this.surface = this.createVideoElement(this.parentElement.clientWidth); - parentElement.append(this.surface); - } - RenderedCameraImpl.prototype.createVideoElement = function (width) { - var videoElement = document.createElement("video"); - videoElement.style.width = "".concat(width, "px"); - videoElement.style.display = "block"; - videoElement.muted = true; - videoElement.setAttribute("muted", "true"); - videoElement.playsInline = true; - return videoElement; - }; - RenderedCameraImpl.prototype.setupSurface = function () { - var _this = this; - this.surface.onabort = function () { - throw "RenderedCameraImpl video surface onabort() called"; - }; - this.surface.onerror = function () { - throw "RenderedCameraImpl video surface onerror() called"; - }; - var onVideoStart = function () { - var videoWidth = _this.surface.clientWidth; - var videoHeight = _this.surface.clientHeight; - _this.callbacks.onRenderSurfaceReady(videoWidth, videoHeight); - _this.surface.removeEventListener("playing", onVideoStart); - }; - this.surface.addEventListener("playing", onVideoStart); - this.surface.srcObject = this.mediaStream; - this.surface.play(); - }; - RenderedCameraImpl.create = function (parentElement, mediaStream, options, callbacks) { - return __awaiter(this, void 0, void 0, function () { - var renderedCamera, aspectRatioConstraint; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - renderedCamera = new RenderedCameraImpl(parentElement, mediaStream, callbacks); - if (!options.aspectRatio) return [3, 2]; - aspectRatioConstraint = { - aspectRatio: options.aspectRatio - }; - return [4, renderedCamera.getFirstTrackOrFail().applyConstraints(aspectRatioConstraint)]; - case 1: - _a.sent(); - _a.label = 2; - case 2: - renderedCamera.setupSurface(); - return [2, renderedCamera]; - } - }); - }); - }; - RenderedCameraImpl.prototype.failIfClosed = function () { - if (this.isClosed) { - throw "The RenderedCamera has already been closed."; - } - }; - RenderedCameraImpl.prototype.getFirstTrackOrFail = function () { - this.failIfClosed(); - if (this.mediaStream.getVideoTracks().length === 0) { - throw "No video tracks found"; - } - return this.mediaStream.getVideoTracks()[0]; - }; - RenderedCameraImpl.prototype.pause = function () { - this.failIfClosed(); - this.surface.pause(); - }; - RenderedCameraImpl.prototype.resume = function (onResumeCallback) { - this.failIfClosed(); - var $this = this; - var onVideoResume = function () { - setTimeout(onResumeCallback, 200); - $this.surface.removeEventListener("playing", onVideoResume); - }; - this.surface.addEventListener("playing", onVideoResume); - this.surface.play(); - }; - RenderedCameraImpl.prototype.isPaused = function () { - this.failIfClosed(); - return this.surface.paused; - }; - RenderedCameraImpl.prototype.getSurface = function () { - this.failIfClosed(); - return this.surface; - }; - RenderedCameraImpl.prototype.getRunningTrackCapabilities = function () { - return this.getFirstTrackOrFail().getCapabilities(); - }; - RenderedCameraImpl.prototype.getRunningTrackSettings = function () { - return this.getFirstTrackOrFail().getSettings(); - }; - RenderedCameraImpl.prototype.applyVideoConstraints = function (constraints) { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - if ("aspectRatio" in constraints) { - throw "Changing 'aspectRatio' in run-time is not yet supported."; - } - return [2, this.getFirstTrackOrFail().applyConstraints(constraints)]; - }); - }); - }; - RenderedCameraImpl.prototype.close = function () { - if (this.isClosed) { - return Promise.resolve(); - } - var $this = this; - return new Promise(function (resolve, _) { - var tracks = $this.mediaStream.getVideoTracks(); - var tracksToClose = tracks.length; - var tracksClosed = 0; - $this.mediaStream.getVideoTracks().forEach(function (videoTrack) { - $this.mediaStream.removeTrack(videoTrack); - videoTrack.stop(); - ++tracksClosed; - if (tracksClosed >= tracksToClose) { - $this.isClosed = true; - $this.parentElement.removeChild($this.surface); - resolve(); - } - }); - }); - }; - RenderedCameraImpl.prototype.getCapabilities = function () { - return new CameraCapabilitiesImpl(this.getFirstTrackOrFail()); - }; - return RenderedCameraImpl; -}()); -var CameraImpl = (function () { - function CameraImpl(mediaStream) { - this.mediaStream = mediaStream; - } - CameraImpl.prototype.render = function (parentElement, options, callbacks) { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - return [2, RenderedCameraImpl.create(parentElement, this.mediaStream, options, callbacks)]; - }); - }); - }; - CameraImpl.create = function (videoConstraints) { - return __awaiter(this, void 0, void 0, function () { - var constraints, mediaStream; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - if (!navigator.mediaDevices) { - throw "navigator.mediaDevices not supported"; - } - constraints = { - audio: false, - video: videoConstraints - }; - return [4, navigator.mediaDevices.getUserMedia(constraints)]; - case 1: - mediaStream = _a.sent(); - return [2, new CameraImpl(mediaStream)]; - } - }); - }); - }; - return CameraImpl; -}()); -export { CameraImpl }; -//# sourceMappingURL=core-impl.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/camera/core-impl.js.map b/node_modules/html5-qrcode/esm/camera/core-impl.js.map deleted file mode 100644 index b505382..0000000 --- a/node_modules/html5-qrcode/esm/camera/core-impl.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"core-impl.js","sourceRoot":"","sources":["../../../src/camera/core-impl.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA;IAII,kCAAY,IAAY,EAAE,KAAuB;QAC7C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAEM,8CAAW,GAAlB;QAII,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE;YAC7B,OAAO,KAAK,CAAC;SAChB;QACD,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;IACrD,CAAC;IAEM,wCAAK,GAAZ,UAAa,KAAQ;QACjB,IAAI,UAAU,GAAQ,EAAE,CAAC;QACzB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAC9B,IAAI,WAAW,GAAG,EAAE,QAAQ,EAAE,CAAE,UAAU,CAAE,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACpD,CAAC;IAEM,wCAAK,GAAZ;QACI,IAAI,QAAQ,GAAQ,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QAC7C,IAAI,IAAI,CAAC,IAAI,IAAI,QAAQ,EAAE;YACvB,IAAI,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvC,OAAO,YAAY,CAAC;SACvB;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IACL,+BAAC;AAAD,CAAC,AAnCD,IAmCC;AAED;IAAqD,iDAAgC;IACjF,uCAAY,IAAY,EAAE,KAAuB;eAC9C,kBAAM,IAAI,EAAE,KAAK,CAAC;IACrB,CAAC;IAEM,2CAAG,GAAV;QACI,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC;IACtC,CAAC;IAEM,2CAAG,GAAV;QACI,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC;IACtC,CAAC;IAEM,4CAAI,GAAX;QACI,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC;IACvC,CAAC;IAEM,6CAAK,GAAZ,UAAa,KAAa;QACtB,IAAI,UAAU,GAAQ,EAAE,CAAC;QACzB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAC9B,IAAI,WAAW,GAAG,EAAC,QAAQ,EAAE,CAAE,UAAU,CAAE,EAAC,CAAC;QAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACpD,CAAC;IAEO,uDAAe,GAAvB;QACI,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,YAAY,GAAQ,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;QACrD,IAAI,UAAU,GAAQ,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,OAAO;YACH,GAAG,EAAE,UAAU,CAAC,GAAG;YACnB,GAAG,EAAE,UAAU,CAAC,GAAG;YACnB,IAAI,EAAE,UAAU,CAAC,IAAI;SACxB,CAAC;IACN,CAAC;IAEO,0DAAkB,GAA1B;QACI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;YACrB,MAAM,IAAI,KAAK,CAAC,UAAG,IAAI,CAAC,IAAI,8BAA2B,CAAC,CAAC;SAC5D;IACL,CAAC;IACL,oCAAC;AAAD,CAAC,AAxCD,CAAqD,wBAAwB,GAwC5E;AAGD;IAA8B,mCAA6B;IACvD,yBAAY,KAAuB;eAC/B,kBAAM,MAAM,EAAE,KAAK,CAAC;IACxB,CAAC;IACL,sBAAC;AAAD,CAAC,AAJD,CAA8B,6BAA6B,GAI1D;AAGD;IAA+B,oCAAiC;IAC5D,0BAAY,KAAuB;eAC/B,kBAAM,OAAO,EAAE,KAAK,CAAC;IACzB,CAAC;IACL,uBAAC;AAAD,CAAC,AAJD,CAA+B,wBAAwB,GAItD;AAGD;IAGI,gCAAY,KAAuB;QAC/B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,4CAAW,GAAX;QACI,OAAO,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,6CAAY,GAAZ;QACI,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IACL,6BAAC;AAAD,CAAC,AAdD,IAcC;AAGD;IASI,4BACI,aAA0B,EAC1B,WAAwB,EACxB,SAA6B;QALzB,aAAQ,GAAY,KAAK,CAAC;QAM9B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAE3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QAGvE,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAEO,+CAAkB,GAA1B,UAA2B,KAAa;QACpC,IAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACrD,YAAY,CAAC,KAAK,CAAC,KAAK,GAAG,UAAG,KAAK,OAAI,CAAC;QACxC,YAAY,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;QACrC,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC;QAC1B,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACrC,YAAa,CAAC,WAAW,GAAG,IAAI,CAAC;QACvC,OAAO,YAAY,CAAC;IACxB,CAAC;IAEO,yCAAY,GAApB;QAAA,iBAmBC;QAlBG,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG;YACnB,MAAM,mDAAmD,CAAC;QAC9D,CAAC,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG;YACnB,MAAM,mDAAmD,CAAC;QAC9D,CAAC,CAAC;QAEF,IAAI,YAAY,GAAG;YACf,IAAM,UAAU,GAAG,KAAI,CAAC,OAAO,CAAC,WAAW,CAAC;YAC5C,IAAM,WAAW,GAAG,KAAI,CAAC,OAAO,CAAC,YAAY,CAAC;YAC9C,KAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;YAC7D,KAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAC9D,CAAC,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QACvD,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC;QAC1C,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IAEY,yBAAM,GAAnB,UACI,aAA0B,EAC1B,WAAwB,EACxB,OAA+B,EAC/B,SAA6B;;;;;;wBAEzB,cAAc,GAAG,IAAI,kBAAkB,CACvC,aAAa,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;6BACvC,OAAO,CAAC,WAAW,EAAnB,cAAmB;wBACf,qBAAqB,GAAG;4BACxB,WAAW,EAAE,OAAO,CAAC,WAAY;yBACpC,CAAC;wBACF,WAAM,cAAc,CAAC,mBAAmB,EAAE,CAAC,gBAAgB,CACvD,qBAAqB,CAAC,EAAA;;wBAD1B,SAC0B,CAAC;;;wBAGhC,cAAc,CAAC,YAAY,EAAE,CAAC;wBAC7B,WAAO,cAAc,EAAC;;;;KACzB;IAEO,yCAAY,GAApB;QACI,IAAI,IAAI,CAAC,QAAQ,EAAE;YACf,MAAM,6CAA6C,CAAC;SACvD;IACL,CAAC;IAEO,gDAAmB,GAA3B;QACI,IAAI,CAAC,YAAY,EAAE,CAAC;QAEpB,IAAI,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;YAChD,MAAM,uBAAuB,CAAC;SACjC;QAED,OAAO,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IAGM,kCAAK,GAAZ;QACI,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IAEM,mCAAM,GAAb,UAAc,gBAA4B;QACtC,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,KAAK,GAAG,IAAI,CAAC;QAEjB,IAAM,aAAa,GAAG;YAGlB,UAAU,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;YAClC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAChE,CAAC,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IAEM,qCAAQ,GAAf;QACI,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC/B,CAAC;IAEM,uCAAU,GAAjB;QACI,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAEM,wDAA2B,GAAlC;QACI,OAAO,IAAI,CAAC,mBAAmB,EAAE,CAAC,eAAe,EAAE,CAAC;IACxD,CAAC;IAEM,oDAAuB,GAA9B;QACI,OAAO,IAAI,CAAC,mBAAmB,EAAE,CAAC,WAAW,EAAE,CAAC;IACpD,CAAC;IAEY,kDAAqB,GAAlC,UAAmC,WAAkC;;;gBAEjE,IAAI,aAAa,IAAI,WAAW,EAAE;oBAC9B,MAAM,0DAA0D,CAAC;iBACpE;gBAED,WAAO,IAAI,CAAC,mBAAmB,EAAE,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAC;;;KACnE;IAEM,kCAAK,GAAZ;QACI,IAAI,IAAI,CAAC,QAAQ,EAAE;YAEf,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;SAC5B;QAED,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,OAAO,IAAI,OAAO,CAAC,UAAC,OAAO,EAAE,CAAC;YAC1B,IAAI,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC;YAChD,IAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC;YACpC,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,KAAK,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,UAAC,UAAU;gBAClD,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;gBAC1C,UAAU,CAAC,IAAI,EAAE,CAAC;gBAClB,EAAE,YAAY,CAAC;gBAEf,IAAI,YAAY,IAAI,aAAa,EAAE;oBAC/B,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;oBACtB,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAC/C,OAAO,EAAE,CAAC;iBACb;YACL,CAAC,CAAC,CAAC;QAGP,CAAC,CAAC,CAAC;IACP,CAAC;IAED,4CAAe,GAAf;QACI,OAAO,IAAI,sBAAsB,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAClE,CAAC;IAEL,yBAAC;AAAD,CAAC,AAzKD,IAyKC;AAGD;IAGI,oBAAoB,WAAwB;QACxC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACnC,CAAC;IAEK,2BAAM,GAAZ,UACI,aAA0B,EAC1B,OAA+B,EAC/B,SAA6B;;;gBAE7B,WAAO,kBAAkB,CAAC,MAAM,CAC5B,aAAa,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,SAAS,CAAC,EAAC;;;KAC5D;IAEY,iBAAM,GAAnB,UAAoB,gBAAuC;;;;;;wBAEvD,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;4BACzB,MAAM,sCAAsC,CAAC;yBAChD;wBACG,WAAW,GAA2B;4BACtC,KAAK,EAAE,KAAK;4BACZ,KAAK,EAAE,gBAAgB;yBAC1B,CAAC;wBAEgB,WAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CACvD,WAAW,CAAC,EAAA;;wBADZ,WAAW,GAAG,SACF;wBAChB,WAAO,IAAI,UAAU,CAAC,WAAW,CAAC,EAAC;;;;KACtC;IACL,iBAAC;AAAD,CAAC,AA9BD,IA8BC"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/camera/core.d.ts b/node_modules/html5-qrcode/esm/camera/core.d.ts deleted file mode 100644 index 52e27b5..0000000 --- a/node_modules/html5-qrcode/esm/camera/core.d.ts +++ /dev/null @@ -1,41 +0,0 @@ -export interface CameraDevice { - id: string; - label: string; -} -export interface CameraCapability { - isSupported(): boolean; - apply(value: T): Promise; - value(): T | null; -} -export interface RangeCameraCapability extends CameraCapability { - min(): number; - max(): number; - step(): number; -} -export interface BooleanCameraCapability extends CameraCapability { -} -export interface CameraCapabilities { - zoomFeature(): RangeCameraCapability; - torchFeature(): BooleanCameraCapability; -} -export type OnRenderSurfaceReady = (viewfinderWidth: number, viewfinderHeight: number) => void; -export interface RenderingCallbacks { - onRenderSurfaceReady: OnRenderSurfaceReady; -} -export interface RenderedCamera { - getSurface(): HTMLVideoElement; - pause(): void; - resume(onResumeCallback: () => void): void; - isPaused(): boolean; - close(): Promise; - getRunningTrackCapabilities(): MediaTrackCapabilities; - getRunningTrackSettings(): MediaTrackSettings; - applyVideoConstraints(constraints: MediaTrackConstraints): Promise; - getCapabilities(): CameraCapabilities; -} -export interface CameraRenderingOptions { - aspectRatio?: number; -} -export interface Camera { - render(parentElement: HTMLElement, options: CameraRenderingOptions, callbacks: RenderingCallbacks): Promise; -} diff --git a/node_modules/html5-qrcode/esm/camera/core.js b/node_modules/html5-qrcode/esm/camera/core.js deleted file mode 100644 index d59ace3..0000000 --- a/node_modules/html5-qrcode/esm/camera/core.js +++ /dev/null @@ -1,2 +0,0 @@ -export {}; -//# sourceMappingURL=core.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/camera/core.js.map b/node_modules/html5-qrcode/esm/camera/core.js.map deleted file mode 100644 index 28f32d7..0000000 --- a/node_modules/html5-qrcode/esm/camera/core.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/camera/core.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/camera/factories.d.ts b/node_modules/html5-qrcode/esm/camera/factories.d.ts deleted file mode 100644 index df98f8f..0000000 --- a/node_modules/html5-qrcode/esm/camera/factories.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Camera } from "./core"; -export declare class CameraFactory { - static failIfNotSupported(): Promise; - private constructor(); - create(videoConstraints: MediaTrackConstraints): Promise; -} diff --git a/node_modules/html5-qrcode/esm/camera/factories.js b/node_modules/html5-qrcode/esm/camera/factories.js deleted file mode 100644 index 8e315c3..0000000 --- a/node_modules/html5-qrcode/esm/camera/factories.js +++ /dev/null @@ -1,61 +0,0 @@ -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (g && (g = 0, op[0] && (_ = 0)), _) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -import { CameraImpl } from "./core-impl"; -var CameraFactory = (function () { - function CameraFactory() { - } - CameraFactory.failIfNotSupported = function () { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - if (!navigator.mediaDevices) { - throw "navigator.mediaDevices not supported"; - } - return [2, new CameraFactory()]; - }); - }); - }; - CameraFactory.prototype.create = function (videoConstraints) { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - return [2, CameraImpl.create(videoConstraints)]; - }); - }); - }; - return CameraFactory; -}()); -export { CameraFactory }; -//# sourceMappingURL=factories.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/camera/factories.js.map b/node_modules/html5-qrcode/esm/camera/factories.js.map deleted file mode 100644 index 88c473f..0000000 --- a/node_modules/html5-qrcode/esm/camera/factories.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"factories.js","sourceRoot":"","sources":["../../../src/camera/factories.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC;IAcI;IAAqC,CAAC;IARlB,gCAAkB,GAAtC;;;gBACI,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;oBACzB,MAAM,sCAAsC,CAAC;iBAChD;gBAED,WAAO,IAAI,aAAa,EAAE,EAAC;;;KAC9B;IAKY,8BAAM,GAAnB,UAAoB,gBAAuC;;;gBAEvD,WAAO,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC;;;KAC9C;IACL,oBAAC;AAAD,CAAC,AArBD,IAqBC"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/camera/permissions.d.ts b/node_modules/html5-qrcode/esm/camera/permissions.d.ts deleted file mode 100644 index 4209c55..0000000 --- a/node_modules/html5-qrcode/esm/camera/permissions.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export declare class CameraPermissions { - static hasPermissions(): Promise; -} diff --git a/node_modules/html5-qrcode/esm/camera/permissions.js b/node_modules/html5-qrcode/esm/camera/permissions.js deleted file mode 100644 index 633d3f7..0000000 --- a/node_modules/html5-qrcode/esm/camera/permissions.js +++ /dev/null @@ -1,62 +0,0 @@ -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (g && (g = 0, op[0] && (_ = 0)), _) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -var CameraPermissions = (function () { - function CameraPermissions() { - } - CameraPermissions.hasPermissions = function () { - return __awaiter(this, void 0, void 0, function () { - var devices, _i, devices_1, device; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4, navigator.mediaDevices.enumerateDevices()]; - case 1: - devices = _a.sent(); - for (_i = 0, devices_1 = devices; _i < devices_1.length; _i++) { - device = devices_1[_i]; - if (device.kind === "videoinput" && device.label) { - return [2, true]; - } - } - return [2, false]; - } - }); - }); - }; - return CameraPermissions; -}()); -export { CameraPermissions }; -//# sourceMappingURL=permissions.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/camera/permissions.js.map b/node_modules/html5-qrcode/esm/camera/permissions.js.map deleted file mode 100644 index 329191a..0000000 --- a/node_modules/html5-qrcode/esm/camera/permissions.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../src/camera/permissions.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYC;IAAA;IAqBD,CAAC;IAfuB,gCAAc,GAAlC;;;;;4BAIgB,WAAM,SAAS,CAAC,YAAY,CAAC,gBAAgB,EAAE,EAAA;;wBAAzD,OAAO,GAAG,SAA+C;wBAC7D,WAA4B,EAAP,mBAAO,EAAP,qBAAO,EAAP,IAAO,EAAE;4BAAnB,MAAM;4BAGf,IAAG,MAAM,CAAC,IAAI,KAAK,YAAY,IAAI,MAAM,CAAC,KAAK,EAAE;gCAC/C,WAAO,IAAI,EAAC;6BACb;yBACF;wBAED,WAAO,KAAK,EAAC;;;;KACd;IACL,wBAAC;AAAD,CAAC,AArBA,IAqBA"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/camera/retriever.d.ts b/node_modules/html5-qrcode/esm/camera/retriever.d.ts deleted file mode 100644 index 0baac12..0000000 --- a/node_modules/html5-qrcode/esm/camera/retriever.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { CameraDevice } from "./core"; -export declare class CameraRetriever { - static retrieve(): Promise>; - private static rejectWithError; - private static isHttpsOrLocalhost; - private static getCamerasFromMediaDevices; - private static getCamerasFromMediaStreamTrack; -} diff --git a/node_modules/html5-qrcode/esm/camera/retriever.js b/node_modules/html5-qrcode/esm/camera/retriever.js deleted file mode 100644 index fd1a895..0000000 --- a/node_modules/html5-qrcode/esm/camera/retriever.js +++ /dev/null @@ -1,124 +0,0 @@ -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (g && (g = 0, op[0] && (_ = 0)), _) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -import { Html5QrcodeStrings } from "../strings"; -var CameraRetriever = (function () { - function CameraRetriever() { - } - CameraRetriever.retrieve = function () { - if (navigator.mediaDevices) { - return CameraRetriever.getCamerasFromMediaDevices(); - } - var mst = MediaStreamTrack; - if (MediaStreamTrack && mst.getSources) { - return CameraRetriever.getCamerasFromMediaStreamTrack(); - } - return CameraRetriever.rejectWithError(); - }; - CameraRetriever.rejectWithError = function () { - var errorMessage = Html5QrcodeStrings.unableToQuerySupportedDevices(); - if (!CameraRetriever.isHttpsOrLocalhost()) { - errorMessage = Html5QrcodeStrings.insecureContextCameraQueryError(); - } - return Promise.reject(errorMessage); - }; - CameraRetriever.isHttpsOrLocalhost = function () { - if (location.protocol === "https:") { - return true; - } - var host = location.host.split(":")[0]; - return host === "127.0.0.1" || host === "localhost"; - }; - CameraRetriever.getCamerasFromMediaDevices = function () { - return __awaiter(this, void 0, void 0, function () { - var closeActiveStreams, mediaStream, devices, results, _i, devices_1, device; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - closeActiveStreams = function (stream) { - var tracks = stream.getVideoTracks(); - for (var _i = 0, tracks_1 = tracks; _i < tracks_1.length; _i++) { - var track = tracks_1[_i]; - track.enabled = false; - track.stop(); - stream.removeTrack(track); - } - }; - return [4, navigator.mediaDevices.getUserMedia({ audio: false, video: true })]; - case 1: - mediaStream = _a.sent(); - return [4, navigator.mediaDevices.enumerateDevices()]; - case 2: - devices = _a.sent(); - results = []; - for (_i = 0, devices_1 = devices; _i < devices_1.length; _i++) { - device = devices_1[_i]; - if (device.kind === "videoinput") { - results.push({ - id: device.deviceId, - label: device.label - }); - } - } - closeActiveStreams(mediaStream); - return [2, results]; - } - }); - }); - }; - CameraRetriever.getCamerasFromMediaStreamTrack = function () { - return new Promise(function (resolve, _) { - var callback = function (sourceInfos) { - var results = []; - for (var _i = 0, sourceInfos_1 = sourceInfos; _i < sourceInfos_1.length; _i++) { - var sourceInfo = sourceInfos_1[_i]; - if (sourceInfo.kind === "video") { - results.push({ - id: sourceInfo.id, - label: sourceInfo.label - }); - } - } - resolve(results); - }; - var mst = MediaStreamTrack; - mst.getSources(callback); - }); - }; - return CameraRetriever; -}()); -export { CameraRetriever }; -//# sourceMappingURL=retriever.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/camera/retriever.js.map b/node_modules/html5-qrcode/esm/camera/retriever.js.map deleted file mode 100644 index 65b01bb..0000000 --- a/node_modules/html5-qrcode/esm/camera/retriever.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"retriever.js","sourceRoot":"","sources":["../../../src/camera/retriever.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/code-decoder.d.ts b/node_modules/html5-qrcode/esm/code-decoder.d.ts deleted file mode 100644 index 13d5426..0000000 --- a/node_modules/html5-qrcode/esm/code-decoder.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { QrcodeResult, Html5QrcodeSupportedFormats, Logger, RobustQrcodeDecoderAsync } from "./core"; -export declare class Html5QrcodeShim implements RobustQrcodeDecoderAsync { - private verbose; - private primaryDecoder; - private secondaryDecoder; - private readonly EXECUTIONS_TO_REPORT_PERFORMANCE; - private executions; - private executionResults; - private wasPrimaryDecoderUsedInLastDecode; - constructor(requestedFormats: Array, useBarCodeDetectorIfSupported: boolean, verbose: boolean, logger: Logger); - decodeAsync(canvas: HTMLCanvasElement): Promise; - decodeRobustlyAsync(canvas: HTMLCanvasElement): Promise; - private getDecoder; - private possiblyLogPerformance; - possiblyFlushPerformanceReport(): void; -} diff --git a/node_modules/html5-qrcode/esm/code-decoder.js b/node_modules/html5-qrcode/esm/code-decoder.js deleted file mode 100644 index 0715bae..0000000 --- a/node_modules/html5-qrcode/esm/code-decoder.js +++ /dev/null @@ -1,138 +0,0 @@ -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (g && (g = 0, op[0] && (_ = 0)), _) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -import { ZXingHtml5QrcodeDecoder } from "./zxing-html5-qrcode-decoder"; -import { BarcodeDetectorDelegate } from "./native-bar-code-detector"; -var Html5QrcodeShim = (function () { - function Html5QrcodeShim(requestedFormats, useBarCodeDetectorIfSupported, verbose, logger) { - this.EXECUTIONS_TO_REPORT_PERFORMANCE = 100; - this.executions = 0; - this.executionResults = []; - this.wasPrimaryDecoderUsedInLastDecode = false; - this.verbose = verbose; - if (useBarCodeDetectorIfSupported - && BarcodeDetectorDelegate.isSupported()) { - this.primaryDecoder = new BarcodeDetectorDelegate(requestedFormats, verbose, logger); - this.secondaryDecoder = new ZXingHtml5QrcodeDecoder(requestedFormats, verbose, logger); - } - else { - this.primaryDecoder = new ZXingHtml5QrcodeDecoder(requestedFormats, verbose, logger); - } - } - Html5QrcodeShim.prototype.decodeAsync = function (canvas) { - return __awaiter(this, void 0, void 0, function () { - var startTime; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - startTime = performance.now(); - _a.label = 1; - case 1: - _a.trys.push([1, , 3, 4]); - return [4, this.getDecoder().decodeAsync(canvas)]; - case 2: return [2, _a.sent()]; - case 3: - this.possiblyLogPerformance(startTime); - return [7]; - case 4: return [2]; - } - }); - }); - }; - Html5QrcodeShim.prototype.decodeRobustlyAsync = function (canvas) { - return __awaiter(this, void 0, void 0, function () { - var startTime, error_1; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - startTime = performance.now(); - _a.label = 1; - case 1: - _a.trys.push([1, 3, 4, 5]); - return [4, this.primaryDecoder.decodeAsync(canvas)]; - case 2: return [2, _a.sent()]; - case 3: - error_1 = _a.sent(); - if (this.secondaryDecoder) { - return [2, this.secondaryDecoder.decodeAsync(canvas)]; - } - throw error_1; - case 4: - this.possiblyLogPerformance(startTime); - return [7]; - case 5: return [2]; - } - }); - }); - }; - Html5QrcodeShim.prototype.getDecoder = function () { - if (!this.secondaryDecoder) { - return this.primaryDecoder; - } - if (this.wasPrimaryDecoderUsedInLastDecode === false) { - this.wasPrimaryDecoderUsedInLastDecode = true; - return this.primaryDecoder; - } - this.wasPrimaryDecoderUsedInLastDecode = false; - return this.secondaryDecoder; - }; - Html5QrcodeShim.prototype.possiblyLogPerformance = function (startTime) { - if (!this.verbose) { - return; - } - var executionTime = performance.now() - startTime; - this.executionResults.push(executionTime); - this.executions++; - this.possiblyFlushPerformanceReport(); - }; - Html5QrcodeShim.prototype.possiblyFlushPerformanceReport = function () { - if (this.executions < this.EXECUTIONS_TO_REPORT_PERFORMANCE) { - return; - } - var sum = 0; - for (var _i = 0, _a = this.executionResults; _i < _a.length; _i++) { - var executionTime = _a[_i]; - sum += executionTime; - } - var mean = sum / this.executionResults.length; - console.log("".concat(mean, " ms for ").concat(this.executionResults.length, " last runs.")); - this.executions = 0; - this.executionResults = []; - }; - return Html5QrcodeShim; -}()); -export { Html5QrcodeShim }; -//# sourceMappingURL=code-decoder.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/code-decoder.js.map b/node_modules/html5-qrcode/esm/code-decoder.js.map deleted file mode 100644 index 08ccf35..0000000 --- a/node_modules/html5-qrcode/esm/code-decoder.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"code-decoder.js","sourceRoot":"","sources":["../../src/code-decoder.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/core.d.ts b/node_modules/html5-qrcode/esm/core.d.ts deleted file mode 100644 index 0d0206d..0000000 --- a/node_modules/html5-qrcode/esm/core.d.ts +++ /dev/null @@ -1,105 +0,0 @@ -export declare enum Html5QrcodeSupportedFormats { - QR_CODE = 0, - AZTEC = 1, - CODABAR = 2, - CODE_39 = 3, - CODE_93 = 4, - CODE_128 = 5, - DATA_MATRIX = 6, - MAXICODE = 7, - ITF = 8, - EAN_13 = 9, - EAN_8 = 10, - PDF_417 = 11, - RSS_14 = 12, - RSS_EXPANDED = 13, - UPC_A = 14, - UPC_E = 15, - UPC_EAN_EXTENSION = 16 -} -export declare enum DecodedTextType { - UNKNOWN = 0, - URL = 1 -} -export declare function isValidHtml5QrcodeSupportedFormats(format: any): boolean; -export declare enum Html5QrcodeScanType { - SCAN_TYPE_CAMERA = 0, - SCAN_TYPE_FILE = 1 -} -export declare class Html5QrcodeConstants { - static GITHUB_PROJECT_URL: string; - static SCAN_DEFAULT_FPS: number; - static DEFAULT_DISABLE_FLIP: boolean; - static DEFAULT_REMEMBER_LAST_CAMERA_USED: boolean; - static DEFAULT_SUPPORTED_SCAN_TYPE: Html5QrcodeScanType[]; -} -export interface QrDimensions { - width: number; - height: number; -} -export type QrDimensionFunction = (viewfinderWidth: number, viewfinderHeight: number) => QrDimensions; -export interface QrBounds extends QrDimensions { - x: number; - y: number; -} -export declare class QrcodeResultFormat { - readonly format: Html5QrcodeSupportedFormats; - readonly formatName: string; - private constructor(); - toString(): string; - static create(format: Html5QrcodeSupportedFormats): QrcodeResultFormat; -} -export interface QrcodeResultDebugData { - decoderName?: string; -} -export interface QrcodeResult { - text: string; - format?: QrcodeResultFormat; - bounds?: QrBounds; - decodedTextType?: DecodedTextType; - debugData?: QrcodeResultDebugData; -} -export interface Html5QrcodeResult { - decodedText: string; - result: QrcodeResult; -} -export declare class Html5QrcodeResultFactory { - static createFromText(decodedText: string): Html5QrcodeResult; - static createFromQrcodeResult(qrcodeResult: QrcodeResult): Html5QrcodeResult; -} -export declare enum Html5QrcodeErrorTypes { - UNKWOWN_ERROR = 0, - IMPLEMENTATION_ERROR = 1, - NO_CODE_FOUND_ERROR = 2 -} -export interface Html5QrcodeError { - errorMessage: string; - type: Html5QrcodeErrorTypes; -} -export declare class Html5QrcodeErrorFactory { - static createFrom(error: any): Html5QrcodeError; -} -export type QrcodeSuccessCallback = (decodedText: string, result: Html5QrcodeResult) => void; -export type QrcodeErrorCallback = (errorMessage: string, error: Html5QrcodeError) => void; -export interface QrcodeDecoderAsync { - decodeAsync(canvas: HTMLCanvasElement): Promise; -} -export interface RobustQrcodeDecoderAsync extends QrcodeDecoderAsync { - decodeRobustlyAsync(canvas: HTMLCanvasElement): Promise; -} -export interface Logger { - log(message: string): void; - warn(message: string): void; - logError(message: string, isExperimental?: boolean): void; - logErrors(errors: Array): void; -} -export declare class BaseLoggger implements Logger { - private verbose; - constructor(verbose: boolean); - log(message: string): void; - warn(message: string): void; - logError(message: string, isExperimental?: boolean): void; - logErrors(errors: Array): void; -} -export declare function isNullOrUndefined(obj?: any): boolean; -export declare function clip(value: number, minValue: number, maxValue: number): number; diff --git a/node_modules/html5-qrcode/esm/core.js b/node_modules/html5-qrcode/esm/core.js deleted file mode 100644 index 0c45ffa..0000000 --- a/node_modules/html5-qrcode/esm/core.js +++ /dev/null @@ -1,165 +0,0 @@ -export var Html5QrcodeSupportedFormats; -(function (Html5QrcodeSupportedFormats) { - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["QR_CODE"] = 0] = "QR_CODE"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["AZTEC"] = 1] = "AZTEC"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["CODABAR"] = 2] = "CODABAR"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["CODE_39"] = 3] = "CODE_39"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["CODE_93"] = 4] = "CODE_93"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["CODE_128"] = 5] = "CODE_128"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["DATA_MATRIX"] = 6] = "DATA_MATRIX"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["MAXICODE"] = 7] = "MAXICODE"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["ITF"] = 8] = "ITF"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["EAN_13"] = 9] = "EAN_13"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["EAN_8"] = 10] = "EAN_8"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["PDF_417"] = 11] = "PDF_417"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["RSS_14"] = 12] = "RSS_14"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["RSS_EXPANDED"] = 13] = "RSS_EXPANDED"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["UPC_A"] = 14] = "UPC_A"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["UPC_E"] = 15] = "UPC_E"; - Html5QrcodeSupportedFormats[Html5QrcodeSupportedFormats["UPC_EAN_EXTENSION"] = 16] = "UPC_EAN_EXTENSION"; -})(Html5QrcodeSupportedFormats || (Html5QrcodeSupportedFormats = {})); -var html5QrcodeSupportedFormatsTextMap = new Map([ - [Html5QrcodeSupportedFormats.QR_CODE, "QR_CODE"], - [Html5QrcodeSupportedFormats.AZTEC, "AZTEC"], - [Html5QrcodeSupportedFormats.CODABAR, "CODABAR"], - [Html5QrcodeSupportedFormats.CODE_39, "CODE_39"], - [Html5QrcodeSupportedFormats.CODE_93, "CODE_93"], - [Html5QrcodeSupportedFormats.CODE_128, "CODE_128"], - [Html5QrcodeSupportedFormats.DATA_MATRIX, "DATA_MATRIX"], - [Html5QrcodeSupportedFormats.MAXICODE, "MAXICODE"], - [Html5QrcodeSupportedFormats.ITF, "ITF"], - [Html5QrcodeSupportedFormats.EAN_13, "EAN_13"], - [Html5QrcodeSupportedFormats.EAN_8, "EAN_8"], - [Html5QrcodeSupportedFormats.PDF_417, "PDF_417"], - [Html5QrcodeSupportedFormats.RSS_14, "RSS_14"], - [Html5QrcodeSupportedFormats.RSS_EXPANDED, "RSS_EXPANDED"], - [Html5QrcodeSupportedFormats.UPC_A, "UPC_A"], - [Html5QrcodeSupportedFormats.UPC_E, "UPC_E"], - [Html5QrcodeSupportedFormats.UPC_EAN_EXTENSION, "UPC_EAN_EXTENSION"] -]); -export var DecodedTextType; -(function (DecodedTextType) { - DecodedTextType[DecodedTextType["UNKNOWN"] = 0] = "UNKNOWN"; - DecodedTextType[DecodedTextType["URL"] = 1] = "URL"; -})(DecodedTextType || (DecodedTextType = {})); -export function isValidHtml5QrcodeSupportedFormats(format) { - return Object.values(Html5QrcodeSupportedFormats).includes(format); -} -export var Html5QrcodeScanType; -(function (Html5QrcodeScanType) { - Html5QrcodeScanType[Html5QrcodeScanType["SCAN_TYPE_CAMERA"] = 0] = "SCAN_TYPE_CAMERA"; - Html5QrcodeScanType[Html5QrcodeScanType["SCAN_TYPE_FILE"] = 1] = "SCAN_TYPE_FILE"; -})(Html5QrcodeScanType || (Html5QrcodeScanType = {})); -var Html5QrcodeConstants = (function () { - function Html5QrcodeConstants() { - } - Html5QrcodeConstants.GITHUB_PROJECT_URL = "https://github.com/mebjas/html5-qrcode"; - Html5QrcodeConstants.SCAN_DEFAULT_FPS = 2; - Html5QrcodeConstants.DEFAULT_DISABLE_FLIP = false; - Html5QrcodeConstants.DEFAULT_REMEMBER_LAST_CAMERA_USED = true; - Html5QrcodeConstants.DEFAULT_SUPPORTED_SCAN_TYPE = [ - Html5QrcodeScanType.SCAN_TYPE_CAMERA, - Html5QrcodeScanType.SCAN_TYPE_FILE - ]; - return Html5QrcodeConstants; -}()); -export { Html5QrcodeConstants }; -var QrcodeResultFormat = (function () { - function QrcodeResultFormat(format, formatName) { - this.format = format; - this.formatName = formatName; - } - QrcodeResultFormat.prototype.toString = function () { - return this.formatName; - }; - QrcodeResultFormat.create = function (format) { - if (!html5QrcodeSupportedFormatsTextMap.has(format)) { - throw "".concat(format, " not in html5QrcodeSupportedFormatsTextMap"); - } - return new QrcodeResultFormat(format, html5QrcodeSupportedFormatsTextMap.get(format)); - }; - return QrcodeResultFormat; -}()); -export { QrcodeResultFormat }; -var Html5QrcodeResultFactory = (function () { - function Html5QrcodeResultFactory() { - } - Html5QrcodeResultFactory.createFromText = function (decodedText) { - var qrcodeResult = { - text: decodedText - }; - return { - decodedText: decodedText, - result: qrcodeResult - }; - }; - Html5QrcodeResultFactory.createFromQrcodeResult = function (qrcodeResult) { - return { - decodedText: qrcodeResult.text, - result: qrcodeResult - }; - }; - return Html5QrcodeResultFactory; -}()); -export { Html5QrcodeResultFactory }; -export var Html5QrcodeErrorTypes; -(function (Html5QrcodeErrorTypes) { - Html5QrcodeErrorTypes[Html5QrcodeErrorTypes["UNKWOWN_ERROR"] = 0] = "UNKWOWN_ERROR"; - Html5QrcodeErrorTypes[Html5QrcodeErrorTypes["IMPLEMENTATION_ERROR"] = 1] = "IMPLEMENTATION_ERROR"; - Html5QrcodeErrorTypes[Html5QrcodeErrorTypes["NO_CODE_FOUND_ERROR"] = 2] = "NO_CODE_FOUND_ERROR"; -})(Html5QrcodeErrorTypes || (Html5QrcodeErrorTypes = {})); -var Html5QrcodeErrorFactory = (function () { - function Html5QrcodeErrorFactory() { - } - Html5QrcodeErrorFactory.createFrom = function (error) { - return { - errorMessage: error, - type: Html5QrcodeErrorTypes.UNKWOWN_ERROR - }; - }; - return Html5QrcodeErrorFactory; -}()); -export { Html5QrcodeErrorFactory }; -var BaseLoggger = (function () { - function BaseLoggger(verbose) { - this.verbose = verbose; - } - BaseLoggger.prototype.log = function (message) { - if (this.verbose) { - console.log(message); - } - }; - BaseLoggger.prototype.warn = function (message) { - if (this.verbose) { - console.warn(message); - } - }; - BaseLoggger.prototype.logError = function (message, isExperimental) { - if (this.verbose || isExperimental === true) { - console.error(message); - } - }; - BaseLoggger.prototype.logErrors = function (errors) { - if (errors.length === 0) { - throw "Logger#logError called without arguments"; - } - if (this.verbose) { - console.error(errors); - } - }; - return BaseLoggger; -}()); -export { BaseLoggger }; -export function isNullOrUndefined(obj) { - return (typeof obj === "undefined") || obj === null; -} -export function clip(value, minValue, maxValue) { - if (value > maxValue) { - return maxValue; - } - if (value < minValue) { - return minValue; - } - return value; -} -//# sourceMappingURL=core.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/core.js.map b/node_modules/html5-qrcode/esm/core.js.map deleted file mode 100644 index 97bdca2..0000000 --- a/node_modules/html5-qrcode/esm/core.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/core.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/experimental-features.d.ts b/node_modules/html5-qrcode/esm/experimental-features.d.ts deleted file mode 100644 index 0413abe..0000000 --- a/node_modules/html5-qrcode/esm/experimental-features.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface ExperimentalFeaturesConfig { - useBarCodeDetectorIfSupported?: boolean | undefined; -} diff --git a/node_modules/html5-qrcode/esm/experimental-features.js b/node_modules/html5-qrcode/esm/experimental-features.js deleted file mode 100644 index ab918ba..0000000 --- a/node_modules/html5-qrcode/esm/experimental-features.js +++ /dev/null @@ -1,2 +0,0 @@ -export {}; -//# sourceMappingURL=experimental-features.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/experimental-features.js.map b/node_modules/html5-qrcode/esm/experimental-features.js.map deleted file mode 100644 index 8b8b9dd..0000000 --- a/node_modules/html5-qrcode/esm/experimental-features.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"experimental-features.js","sourceRoot":"","sources":["../../src/experimental-features.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/html5-qrcode-scanner.d.ts b/node_modules/html5-qrcode/esm/html5-qrcode-scanner.d.ts deleted file mode 100644 index 417175b..0000000 --- a/node_modules/html5-qrcode/esm/html5-qrcode-scanner.d.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { Html5QrcodeScanType, QrcodeSuccessCallback, QrcodeErrorCallback } from "./core"; -import { Html5QrcodeConfigs, Html5QrcodeCameraScanConfig } from "./html5-qrcode"; -import { Html5QrcodeScannerState } from "./state-manager"; -export interface Html5QrcodeScannerConfig extends Html5QrcodeCameraScanConfig, Html5QrcodeConfigs { - rememberLastUsedCamera?: boolean | undefined; - supportedScanTypes?: Array | []; - showTorchButtonIfSupported?: boolean | undefined; - showZoomSliderIfSupported?: boolean | undefined; - defaultZoomValueIfSupported?: number | undefined; -} -export declare class Html5QrcodeScanner { - private elementId; - private config; - private verbose; - private currentScanType; - private sectionSwapAllowed; - private persistedDataManager; - private scanTypeSelector; - private logger; - private html5Qrcode; - private qrCodeSuccessCallback; - private qrCodeErrorCallback; - private lastMatchFound; - private cameraScanImage; - private fileScanImage; - private fileSelectionUi; - constructor(elementId: string, config: Html5QrcodeScannerConfig | undefined, verbose: boolean | undefined); - render(qrCodeSuccessCallback: QrcodeSuccessCallback, qrCodeErrorCallback: QrcodeErrorCallback | undefined): void; - pause(shouldPauseVideo?: boolean): void; - resume(): void; - getState(): Html5QrcodeScannerState; - clear(): Promise; - getRunningTrackCapabilities(): MediaTrackCapabilities; - getRunningTrackSettings(): MediaTrackSettings; - applyVideoConstraints(videoConstaints: MediaTrackConstraints): Promise; - private getHtml5QrcodeOrFail; - private createConfig; - private createBasicLayout; - private resetBasicLayout; - private setupInitialDashboard; - private createHeader; - private createSection; - private createCameraListUi; - private createPermissionButton; - private createPermissionsUi; - private createSectionControlPanel; - private renderFileScanUi; - private renderCameraSelection; - private createSectionSwap; - private startCameraScanIfPermissionExistsOnSwap; - private resetHeaderMessage; - private setHeaderMessage; - private showHideScanTypeSwapLink; - private insertCameraScanImageToScanRegion; - private insertFileScanImageToScanRegion; - private clearScanRegion; - private getDashboardSectionId; - private getDashboardSectionCameraScanRegionId; - private getDashboardSectionSwapLinkId; - private getScanRegionId; - private getDashboardId; - private getHeaderMessageContainerId; - private getCameraPermissionButtonId; - private getCameraScanRegion; - private getDashboardSectionSwapLink; - private getHeaderMessageDiv; -} diff --git a/node_modules/html5-qrcode/esm/html5-qrcode-scanner.js b/node_modules/html5-qrcode/esm/html5-qrcode-scanner.js deleted file mode 100644 index e55afdd..0000000 --- a/node_modules/html5-qrcode/esm/html5-qrcode-scanner.js +++ /dev/null @@ -1,658 +0,0 @@ -import { Html5QrcodeConstants, Html5QrcodeScanType, Html5QrcodeErrorFactory, BaseLoggger, isNullOrUndefined, clip, } from "./core"; -import { Html5Qrcode, } from "./html5-qrcode"; -import { Html5QrcodeScannerStrings, } from "./strings"; -import { ASSET_FILE_SCAN, ASSET_CAMERA_SCAN, } from "./image-assets"; -import { PersistedDataManager } from "./storage"; -import { LibraryInfoContainer } from "./ui"; -import { CameraPermissions } from "./camera/permissions"; -import { ScanTypeSelector } from "./ui/scanner/scan-type-selector"; -import { TorchButton } from "./ui/scanner/torch-button"; -import { FileSelectionUi } from "./ui/scanner/file-selection-ui"; -import { BaseUiElementFactory, PublicUiElementIdAndClasses } from "./ui/scanner/base"; -import { CameraSelectionUi } from "./ui/scanner/camera-selection-ui"; -import { CameraZoomUi } from "./ui/scanner/camera-zoom-ui"; -var Html5QrcodeScannerStatus; -(function (Html5QrcodeScannerStatus) { - Html5QrcodeScannerStatus[Html5QrcodeScannerStatus["STATUS_DEFAULT"] = 0] = "STATUS_DEFAULT"; - Html5QrcodeScannerStatus[Html5QrcodeScannerStatus["STATUS_SUCCESS"] = 1] = "STATUS_SUCCESS"; - Html5QrcodeScannerStatus[Html5QrcodeScannerStatus["STATUS_WARNING"] = 2] = "STATUS_WARNING"; - Html5QrcodeScannerStatus[Html5QrcodeScannerStatus["STATUS_REQUESTING_PERMISSION"] = 3] = "STATUS_REQUESTING_PERMISSION"; -})(Html5QrcodeScannerStatus || (Html5QrcodeScannerStatus = {})); -function toHtml5QrcodeCameraScanConfig(config) { - return { - fps: config.fps, - qrbox: config.qrbox, - aspectRatio: config.aspectRatio, - disableFlip: config.disableFlip, - videoConstraints: config.videoConstraints - }; -} -function toHtml5QrcodeFullConfig(config, verbose) { - return { - formatsToSupport: config.formatsToSupport, - useBarCodeDetectorIfSupported: config.useBarCodeDetectorIfSupported, - experimentalFeatures: config.experimentalFeatures, - verbose: verbose - }; -} -var Html5QrcodeScanner = (function () { - function Html5QrcodeScanner(elementId, config, verbose) { - this.lastMatchFound = null; - this.cameraScanImage = null; - this.fileScanImage = null; - this.fileSelectionUi = null; - this.elementId = elementId; - this.config = this.createConfig(config); - this.verbose = verbose === true; - if (!document.getElementById(elementId)) { - throw "HTML Element with id=".concat(elementId, " not found"); - } - this.scanTypeSelector = new ScanTypeSelector(this.config.supportedScanTypes); - this.currentScanType = this.scanTypeSelector.getDefaultScanType(); - this.sectionSwapAllowed = true; - this.logger = new BaseLoggger(this.verbose); - this.persistedDataManager = new PersistedDataManager(); - if (config.rememberLastUsedCamera !== true) { - this.persistedDataManager.reset(); - } - } - Html5QrcodeScanner.prototype.render = function (qrCodeSuccessCallback, qrCodeErrorCallback) { - var _this = this; - this.lastMatchFound = null; - this.qrCodeSuccessCallback - = function (decodedText, result) { - if (qrCodeSuccessCallback) { - qrCodeSuccessCallback(decodedText, result); - } - else { - if (_this.lastMatchFound === decodedText) { - return; - } - _this.lastMatchFound = decodedText; - _this.setHeaderMessage(Html5QrcodeScannerStrings.lastMatch(decodedText), Html5QrcodeScannerStatus.STATUS_SUCCESS); - } - }; - this.qrCodeErrorCallback = - function (errorMessage, error) { - if (qrCodeErrorCallback) { - qrCodeErrorCallback(errorMessage, error); - } - }; - var container = document.getElementById(this.elementId); - if (!container) { - throw "HTML Element with id=".concat(this.elementId, " not found"); - } - container.innerHTML = ""; - this.createBasicLayout(container); - this.html5Qrcode = new Html5Qrcode(this.getScanRegionId(), toHtml5QrcodeFullConfig(this.config, this.verbose)); - }; - Html5QrcodeScanner.prototype.pause = function (shouldPauseVideo) { - if (isNullOrUndefined(shouldPauseVideo) || shouldPauseVideo !== true) { - shouldPauseVideo = false; - } - this.getHtml5QrcodeOrFail().pause(shouldPauseVideo); - }; - Html5QrcodeScanner.prototype.resume = function () { - this.getHtml5QrcodeOrFail().resume(); - }; - Html5QrcodeScanner.prototype.getState = function () { - return this.getHtml5QrcodeOrFail().getState(); - }; - Html5QrcodeScanner.prototype.clear = function () { - var _this = this; - var emptyHtmlContainer = function () { - var mainContainer = document.getElementById(_this.elementId); - if (mainContainer) { - mainContainer.innerHTML = ""; - _this.resetBasicLayout(mainContainer); - } - }; - if (this.html5Qrcode) { - return new Promise(function (resolve, reject) { - if (!_this.html5Qrcode) { - resolve(); - return; - } - if (_this.html5Qrcode.isScanning) { - _this.html5Qrcode.stop().then(function (_) { - if (!_this.html5Qrcode) { - resolve(); - return; - } - _this.html5Qrcode.clear(); - emptyHtmlContainer(); - resolve(); - }).catch(function (error) { - if (_this.verbose) { - _this.logger.logError("Unable to stop qrcode scanner", error); - } - reject(error); - }); - } - else { - _this.html5Qrcode.clear(); - emptyHtmlContainer(); - resolve(); - } - }); - } - return Promise.resolve(); - }; - Html5QrcodeScanner.prototype.getRunningTrackCapabilities = function () { - return this.getHtml5QrcodeOrFail().getRunningTrackCapabilities(); - }; - Html5QrcodeScanner.prototype.getRunningTrackSettings = function () { - return this.getHtml5QrcodeOrFail().getRunningTrackSettings(); - }; - Html5QrcodeScanner.prototype.applyVideoConstraints = function (videoConstaints) { - return this.getHtml5QrcodeOrFail().applyVideoConstraints(videoConstaints); - }; - Html5QrcodeScanner.prototype.getHtml5QrcodeOrFail = function () { - if (!this.html5Qrcode) { - throw "Code scanner not initialized."; - } - return this.html5Qrcode; - }; - Html5QrcodeScanner.prototype.createConfig = function (config) { - if (config) { - if (!config.fps) { - config.fps = Html5QrcodeConstants.SCAN_DEFAULT_FPS; - } - if (config.rememberLastUsedCamera !== (!Html5QrcodeConstants.DEFAULT_REMEMBER_LAST_CAMERA_USED)) { - config.rememberLastUsedCamera - = Html5QrcodeConstants.DEFAULT_REMEMBER_LAST_CAMERA_USED; - } - if (!config.supportedScanTypes) { - config.supportedScanTypes - = Html5QrcodeConstants.DEFAULT_SUPPORTED_SCAN_TYPE; - } - return config; - } - return { - fps: Html5QrcodeConstants.SCAN_DEFAULT_FPS, - rememberLastUsedCamera: Html5QrcodeConstants.DEFAULT_REMEMBER_LAST_CAMERA_USED, - supportedScanTypes: Html5QrcodeConstants.DEFAULT_SUPPORTED_SCAN_TYPE - }; - }; - Html5QrcodeScanner.prototype.createBasicLayout = function (parent) { - parent.style.position = "relative"; - parent.style.padding = "0px"; - parent.style.border = "1px solid silver"; - this.createHeader(parent); - var qrCodeScanRegion = document.createElement("div"); - var scanRegionId = this.getScanRegionId(); - qrCodeScanRegion.id = scanRegionId; - qrCodeScanRegion.style.width = "100%"; - qrCodeScanRegion.style.minHeight = "100px"; - qrCodeScanRegion.style.textAlign = "center"; - parent.appendChild(qrCodeScanRegion); - if (ScanTypeSelector.isCameraScanType(this.currentScanType)) { - this.insertCameraScanImageToScanRegion(); - } - else { - this.insertFileScanImageToScanRegion(); - } - var qrCodeDashboard = document.createElement("div"); - var dashboardId = this.getDashboardId(); - qrCodeDashboard.id = dashboardId; - qrCodeDashboard.style.width = "100%"; - parent.appendChild(qrCodeDashboard); - this.setupInitialDashboard(qrCodeDashboard); - }; - Html5QrcodeScanner.prototype.resetBasicLayout = function (mainContainer) { - mainContainer.style.border = "none"; - }; - Html5QrcodeScanner.prototype.setupInitialDashboard = function (dashboard) { - this.createSection(dashboard); - this.createSectionControlPanel(); - if (this.scanTypeSelector.hasMoreThanOneScanType()) { - this.createSectionSwap(); - } - }; - Html5QrcodeScanner.prototype.createHeader = function (dashboard) { - var header = document.createElement("div"); - header.style.textAlign = "left"; - header.style.margin = "0px"; - dashboard.appendChild(header); - var libraryInfo = new LibraryInfoContainer(); - libraryInfo.renderInto(header); - var headerMessageContainer = document.createElement("div"); - headerMessageContainer.id = this.getHeaderMessageContainerId(); - headerMessageContainer.style.display = "none"; - headerMessageContainer.style.textAlign = "center"; - headerMessageContainer.style.fontSize = "14px"; - headerMessageContainer.style.padding = "2px 10px"; - headerMessageContainer.style.margin = "4px"; - headerMessageContainer.style.borderTop = "1px solid #f6f6f6"; - header.appendChild(headerMessageContainer); - }; - Html5QrcodeScanner.prototype.createSection = function (dashboard) { - var section = document.createElement("div"); - section.id = this.getDashboardSectionId(); - section.style.width = "100%"; - section.style.padding = "10px 0px 10px 0px"; - section.style.textAlign = "left"; - dashboard.appendChild(section); - }; - Html5QrcodeScanner.prototype.createCameraListUi = function (scpCameraScanRegion, requestPermissionContainer, requestPermissionButton) { - var $this = this; - $this.showHideScanTypeSwapLink(false); - $this.setHeaderMessage(Html5QrcodeScannerStrings.cameraPermissionRequesting()); - var createPermissionButtonIfNotExists = function () { - if (!requestPermissionButton) { - $this.createPermissionButton(scpCameraScanRegion, requestPermissionContainer); - } - }; - Html5Qrcode.getCameras().then(function (cameras) { - $this.persistedDataManager.setHasPermission(true); - $this.showHideScanTypeSwapLink(true); - $this.resetHeaderMessage(); - if (cameras && cameras.length > 0) { - scpCameraScanRegion.removeChild(requestPermissionContainer); - $this.renderCameraSelection(cameras); - } - else { - $this.setHeaderMessage(Html5QrcodeScannerStrings.noCameraFound(), Html5QrcodeScannerStatus.STATUS_WARNING); - createPermissionButtonIfNotExists(); - } - }).catch(function (error) { - $this.persistedDataManager.setHasPermission(false); - if (requestPermissionButton) { - requestPermissionButton.disabled = false; - } - else { - createPermissionButtonIfNotExists(); - } - $this.setHeaderMessage(error, Html5QrcodeScannerStatus.STATUS_WARNING); - $this.showHideScanTypeSwapLink(true); - }); - }; - Html5QrcodeScanner.prototype.createPermissionButton = function (scpCameraScanRegion, requestPermissionContainer) { - var $this = this; - var requestPermissionButton = BaseUiElementFactory - .createElement("button", this.getCameraPermissionButtonId()); - requestPermissionButton.innerText - = Html5QrcodeScannerStrings.cameraPermissionTitle(); - requestPermissionButton.addEventListener("click", function () { - requestPermissionButton.disabled = true; - $this.createCameraListUi(scpCameraScanRegion, requestPermissionContainer, requestPermissionButton); - }); - requestPermissionContainer.appendChild(requestPermissionButton); - }; - Html5QrcodeScanner.prototype.createPermissionsUi = function (scpCameraScanRegion, requestPermissionContainer) { - var $this = this; - if (ScanTypeSelector.isCameraScanType(this.currentScanType) - && this.persistedDataManager.hasCameraPermissions()) { - CameraPermissions.hasPermissions().then(function (hasPermissions) { - if (hasPermissions) { - $this.createCameraListUi(scpCameraScanRegion, requestPermissionContainer); - } - else { - $this.persistedDataManager.setHasPermission(false); - $this.createPermissionButton(scpCameraScanRegion, requestPermissionContainer); - } - }).catch(function (_) { - $this.persistedDataManager.setHasPermission(false); - $this.createPermissionButton(scpCameraScanRegion, requestPermissionContainer); - }); - return; - } - this.createPermissionButton(scpCameraScanRegion, requestPermissionContainer); - }; - Html5QrcodeScanner.prototype.createSectionControlPanel = function () { - var section = document.getElementById(this.getDashboardSectionId()); - var sectionControlPanel = document.createElement("div"); - section.appendChild(sectionControlPanel); - var scpCameraScanRegion = document.createElement("div"); - scpCameraScanRegion.id = this.getDashboardSectionCameraScanRegionId(); - scpCameraScanRegion.style.display - = ScanTypeSelector.isCameraScanType(this.currentScanType) - ? "block" : "none"; - sectionControlPanel.appendChild(scpCameraScanRegion); - var requestPermissionContainer = document.createElement("div"); - requestPermissionContainer.style.textAlign = "center"; - scpCameraScanRegion.appendChild(requestPermissionContainer); - if (this.scanTypeSelector.isCameraScanRequired()) { - this.createPermissionsUi(scpCameraScanRegion, requestPermissionContainer); - } - this.renderFileScanUi(sectionControlPanel); - }; - Html5QrcodeScanner.prototype.renderFileScanUi = function (parent) { - var showOnRender = ScanTypeSelector.isFileScanType(this.currentScanType); - var $this = this; - var onFileSelected = function (file) { - if (!$this.html5Qrcode) { - throw "html5Qrcode not defined"; - } - if (!ScanTypeSelector.isFileScanType($this.currentScanType)) { - return; - } - $this.setHeaderMessage(Html5QrcodeScannerStrings.loadingImage()); - $this.html5Qrcode.scanFileV2(file, true) - .then(function (html5qrcodeResult) { - $this.resetHeaderMessage(); - $this.qrCodeSuccessCallback(html5qrcodeResult.decodedText, html5qrcodeResult); - }) - .catch(function (error) { - $this.setHeaderMessage(error, Html5QrcodeScannerStatus.STATUS_WARNING); - $this.qrCodeErrorCallback(error, Html5QrcodeErrorFactory.createFrom(error)); - }); - }; - this.fileSelectionUi = FileSelectionUi.create(parent, showOnRender, onFileSelected); - }; - Html5QrcodeScanner.prototype.renderCameraSelection = function (cameras) { - var _this = this; - var $this = this; - var scpCameraScanRegion = document.getElementById(this.getDashboardSectionCameraScanRegionId()); - scpCameraScanRegion.style.textAlign = "center"; - var cameraZoomUi = CameraZoomUi.create(scpCameraScanRegion, false); - var renderCameraZoomUiIfSupported = function (cameraCapabilities) { - var zoomCapability = cameraCapabilities.zoomFeature(); - if (!zoomCapability.isSupported()) { - return; - } - cameraZoomUi.setOnCameraZoomValueChangeCallback(function (zoomValue) { - zoomCapability.apply(zoomValue); - }); - var defaultZoom = 1; - if (_this.config.defaultZoomValueIfSupported) { - defaultZoom = _this.config.defaultZoomValueIfSupported; - } - defaultZoom = clip(defaultZoom, zoomCapability.min(), zoomCapability.max()); - cameraZoomUi.setValues(zoomCapability.min(), zoomCapability.max(), defaultZoom, zoomCapability.step()); - cameraZoomUi.show(); - }; - var cameraSelectUi = CameraSelectionUi.create(scpCameraScanRegion, cameras); - var cameraActionContainer = document.createElement("span"); - var cameraActionStartButton = BaseUiElementFactory.createElement("button", PublicUiElementIdAndClasses.CAMERA_START_BUTTON_ID); - cameraActionStartButton.innerText - = Html5QrcodeScannerStrings.scanButtonStartScanningText(); - cameraActionContainer.appendChild(cameraActionStartButton); - var cameraActionStopButton = BaseUiElementFactory.createElement("button", PublicUiElementIdAndClasses.CAMERA_STOP_BUTTON_ID); - cameraActionStopButton.innerText - = Html5QrcodeScannerStrings.scanButtonStopScanningText(); - cameraActionStopButton.style.display = "none"; - cameraActionStopButton.disabled = true; - cameraActionContainer.appendChild(cameraActionStopButton); - var torchButton; - var createAndShowTorchButtonIfSupported = function (cameraCapabilities) { - if (!cameraCapabilities.torchFeature().isSupported()) { - if (torchButton) { - torchButton.hide(); - } - return; - } - if (!torchButton) { - torchButton = TorchButton.create(cameraActionContainer, cameraCapabilities.torchFeature(), { display: "none", marginLeft: "5px" }, function (errorMessage) { - $this.setHeaderMessage(errorMessage, Html5QrcodeScannerStatus.STATUS_WARNING); - }); - } - else { - torchButton.updateTorchCapability(cameraCapabilities.torchFeature()); - } - torchButton.show(); - }; - scpCameraScanRegion.appendChild(cameraActionContainer); - var resetCameraActionStartButton = function (shouldShow) { - if (!shouldShow) { - cameraActionStartButton.style.display = "none"; - } - cameraActionStartButton.innerText - = Html5QrcodeScannerStrings - .scanButtonStartScanningText(); - cameraActionStartButton.style.opacity = "1"; - cameraActionStartButton.disabled = false; - if (shouldShow) { - cameraActionStartButton.style.display = "inline-block"; - } - }; - cameraActionStartButton.addEventListener("click", function (_) { - cameraActionStartButton.innerText - = Html5QrcodeScannerStrings.scanButtonScanningStarting(); - cameraSelectUi.disable(); - cameraActionStartButton.disabled = true; - cameraActionStartButton.style.opacity = "0.5"; - if (_this.scanTypeSelector.hasMoreThanOneScanType()) { - $this.showHideScanTypeSwapLink(false); - } - $this.resetHeaderMessage(); - var cameraId = cameraSelectUi.getValue(); - $this.persistedDataManager.setLastUsedCameraId(cameraId); - $this.html5Qrcode.start(cameraId, toHtml5QrcodeCameraScanConfig($this.config), $this.qrCodeSuccessCallback, $this.qrCodeErrorCallback) - .then(function (_) { - cameraActionStopButton.disabled = false; - cameraActionStopButton.style.display = "inline-block"; - resetCameraActionStartButton(false); - var cameraCapabilities = $this.html5Qrcode.getRunningTrackCameraCapabilities(); - if (_this.config.showTorchButtonIfSupported === true) { - createAndShowTorchButtonIfSupported(cameraCapabilities); - } - if (_this.config.showZoomSliderIfSupported === true) { - renderCameraZoomUiIfSupported(cameraCapabilities); - } - }) - .catch(function (error) { - $this.showHideScanTypeSwapLink(true); - cameraSelectUi.enable(); - resetCameraActionStartButton(true); - $this.setHeaderMessage(error, Html5QrcodeScannerStatus.STATUS_WARNING); - }); - }); - if (cameraSelectUi.hasSingleItem()) { - cameraActionStartButton.click(); - } - cameraActionStopButton.addEventListener("click", function (_) { - if (!$this.html5Qrcode) { - throw "html5Qrcode not defined"; - } - cameraActionStopButton.disabled = true; - $this.html5Qrcode.stop() - .then(function (_) { - if (_this.scanTypeSelector.hasMoreThanOneScanType()) { - $this.showHideScanTypeSwapLink(true); - } - cameraSelectUi.enable(); - cameraActionStartButton.disabled = false; - cameraActionStopButton.style.display = "none"; - cameraActionStartButton.style.display = "inline-block"; - if (torchButton) { - torchButton.reset(); - torchButton.hide(); - } - cameraZoomUi.removeOnCameraZoomValueChangeCallback(); - cameraZoomUi.hide(); - $this.insertCameraScanImageToScanRegion(); - }).catch(function (error) { - cameraActionStopButton.disabled = false; - $this.setHeaderMessage(error, Html5QrcodeScannerStatus.STATUS_WARNING); - }); - }); - if ($this.persistedDataManager.getLastUsedCameraId()) { - var cameraId = $this.persistedDataManager.getLastUsedCameraId(); - if (cameraSelectUi.hasValue(cameraId)) { - cameraSelectUi.setValue(cameraId); - cameraActionStartButton.click(); - } - else { - $this.persistedDataManager.resetLastUsedCameraId(); - } - } - }; - Html5QrcodeScanner.prototype.createSectionSwap = function () { - var $this = this; - var TEXT_IF_CAMERA_SCAN_SELECTED = Html5QrcodeScannerStrings.textIfCameraScanSelected(); - var TEXT_IF_FILE_SCAN_SELECTED = Html5QrcodeScannerStrings.textIfFileScanSelected(); - var section = document.getElementById(this.getDashboardSectionId()); - var switchContainer = document.createElement("div"); - switchContainer.style.textAlign = "center"; - var switchScanTypeLink = BaseUiElementFactory.createElement("span", this.getDashboardSectionSwapLinkId()); - switchScanTypeLink.style.textDecoration = "underline"; - switchScanTypeLink.style.cursor = "pointer"; - switchScanTypeLink.innerText - = ScanTypeSelector.isCameraScanType(this.currentScanType) - ? TEXT_IF_CAMERA_SCAN_SELECTED : TEXT_IF_FILE_SCAN_SELECTED; - switchScanTypeLink.addEventListener("click", function () { - if (!$this.sectionSwapAllowed) { - if ($this.verbose) { - $this.logger.logError("Section swap called when not allowed"); - } - return; - } - $this.resetHeaderMessage(); - $this.fileSelectionUi.resetValue(); - $this.sectionSwapAllowed = false; - if (ScanTypeSelector.isCameraScanType($this.currentScanType)) { - $this.clearScanRegion(); - $this.getCameraScanRegion().style.display = "none"; - $this.fileSelectionUi.show(); - switchScanTypeLink.innerText = TEXT_IF_FILE_SCAN_SELECTED; - $this.currentScanType = Html5QrcodeScanType.SCAN_TYPE_FILE; - $this.insertFileScanImageToScanRegion(); - } - else { - $this.clearScanRegion(); - $this.getCameraScanRegion().style.display = "block"; - $this.fileSelectionUi.hide(); - switchScanTypeLink.innerText = TEXT_IF_CAMERA_SCAN_SELECTED; - $this.currentScanType = Html5QrcodeScanType.SCAN_TYPE_CAMERA; - $this.insertCameraScanImageToScanRegion(); - $this.startCameraScanIfPermissionExistsOnSwap(); - } - $this.sectionSwapAllowed = true; - }); - switchContainer.appendChild(switchScanTypeLink); - section.appendChild(switchContainer); - }; - Html5QrcodeScanner.prototype.startCameraScanIfPermissionExistsOnSwap = function () { - var _this = this; - var $this = this; - if (this.persistedDataManager.hasCameraPermissions()) { - CameraPermissions.hasPermissions().then(function (hasPermissions) { - if (hasPermissions) { - var permissionButton = document.getElementById($this.getCameraPermissionButtonId()); - if (!permissionButton) { - _this.logger.logError("Permission button not found, fail;"); - throw "Permission button not found"; - } - permissionButton.click(); - } - else { - $this.persistedDataManager.setHasPermission(false); - } - }).catch(function (_) { - $this.persistedDataManager.setHasPermission(false); - }); - return; - } - }; - Html5QrcodeScanner.prototype.resetHeaderMessage = function () { - var messageDiv = document.getElementById(this.getHeaderMessageContainerId()); - messageDiv.style.display = "none"; - }; - Html5QrcodeScanner.prototype.setHeaderMessage = function (messageText, scannerStatus) { - if (!scannerStatus) { - scannerStatus = Html5QrcodeScannerStatus.STATUS_DEFAULT; - } - var messageDiv = this.getHeaderMessageDiv(); - messageDiv.innerText = messageText; - messageDiv.style.display = "block"; - switch (scannerStatus) { - case Html5QrcodeScannerStatus.STATUS_SUCCESS: - messageDiv.style.background = "rgba(106, 175, 80, 0.26)"; - messageDiv.style.color = "#477735"; - break; - case Html5QrcodeScannerStatus.STATUS_WARNING: - messageDiv.style.background = "rgba(203, 36, 49, 0.14)"; - messageDiv.style.color = "#cb2431"; - break; - case Html5QrcodeScannerStatus.STATUS_DEFAULT: - default: - messageDiv.style.background = "rgba(0, 0, 0, 0)"; - messageDiv.style.color = "rgb(17, 17, 17)"; - break; - } - }; - Html5QrcodeScanner.prototype.showHideScanTypeSwapLink = function (shouldDisplay) { - if (this.scanTypeSelector.hasMoreThanOneScanType()) { - if (shouldDisplay !== true) { - shouldDisplay = false; - } - this.sectionSwapAllowed = shouldDisplay; - this.getDashboardSectionSwapLink().style.display - = shouldDisplay ? "inline-block" : "none"; - } - }; - Html5QrcodeScanner.prototype.insertCameraScanImageToScanRegion = function () { - var $this = this; - var qrCodeScanRegion = document.getElementById(this.getScanRegionId()); - if (this.cameraScanImage) { - qrCodeScanRegion.innerHTML = "
    "; - qrCodeScanRegion.appendChild(this.cameraScanImage); - return; - } - this.cameraScanImage = new Image; - this.cameraScanImage.onload = function (_) { - qrCodeScanRegion.innerHTML = "
    "; - qrCodeScanRegion.appendChild($this.cameraScanImage); - }; - this.cameraScanImage.width = 64; - this.cameraScanImage.style.opacity = "0.8"; - this.cameraScanImage.src = ASSET_CAMERA_SCAN; - this.cameraScanImage.alt = Html5QrcodeScannerStrings.cameraScanAltText(); - }; - Html5QrcodeScanner.prototype.insertFileScanImageToScanRegion = function () { - var $this = this; - var qrCodeScanRegion = document.getElementById(this.getScanRegionId()); - if (this.fileScanImage) { - qrCodeScanRegion.innerHTML = "
    "; - qrCodeScanRegion.appendChild(this.fileScanImage); - return; - } - this.fileScanImage = new Image; - this.fileScanImage.onload = function (_) { - qrCodeScanRegion.innerHTML = "
    "; - qrCodeScanRegion.appendChild($this.fileScanImage); - }; - this.fileScanImage.width = 64; - this.fileScanImage.style.opacity = "0.8"; - this.fileScanImage.src = ASSET_FILE_SCAN; - this.fileScanImage.alt = Html5QrcodeScannerStrings.fileScanAltText(); - }; - Html5QrcodeScanner.prototype.clearScanRegion = function () { - var qrCodeScanRegion = document.getElementById(this.getScanRegionId()); - qrCodeScanRegion.innerHTML = ""; - }; - Html5QrcodeScanner.prototype.getDashboardSectionId = function () { - return "".concat(this.elementId, "__dashboard_section"); - }; - Html5QrcodeScanner.prototype.getDashboardSectionCameraScanRegionId = function () { - return "".concat(this.elementId, "__dashboard_section_csr"); - }; - Html5QrcodeScanner.prototype.getDashboardSectionSwapLinkId = function () { - return PublicUiElementIdAndClasses.SCAN_TYPE_CHANGE_ANCHOR_ID; - }; - Html5QrcodeScanner.prototype.getScanRegionId = function () { - return "".concat(this.elementId, "__scan_region"); - }; - Html5QrcodeScanner.prototype.getDashboardId = function () { - return "".concat(this.elementId, "__dashboard"); - }; - Html5QrcodeScanner.prototype.getHeaderMessageContainerId = function () { - return "".concat(this.elementId, "__header_message"); - }; - Html5QrcodeScanner.prototype.getCameraPermissionButtonId = function () { - return PublicUiElementIdAndClasses.CAMERA_PERMISSION_BUTTON_ID; - }; - Html5QrcodeScanner.prototype.getCameraScanRegion = function () { - return document.getElementById(this.getDashboardSectionCameraScanRegionId()); - }; - Html5QrcodeScanner.prototype.getDashboardSectionSwapLink = function () { - return document.getElementById(this.getDashboardSectionSwapLinkId()); - }; - Html5QrcodeScanner.prototype.getHeaderMessageDiv = function () { - return document.getElementById(this.getHeaderMessageContainerId()); - }; - return Html5QrcodeScanner; -}()); -export { Html5QrcodeScanner }; -//# sourceMappingURL=html5-qrcode-scanner.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/html5-qrcode-scanner.js.map b/node_modules/html5-qrcode/esm/html5-qrcode-scanner.js.map deleted file mode 100644 index d4b0249..0000000 --- a/node_modules/html5-qrcode/esm/html5-qrcode-scanner.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"html5-qrcode-scanner.js","sourceRoot":"","sources":["../../src/html5-qrcode-scanner.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/html5-qrcode.d.ts b/node_modules/html5-qrcode/esm/html5-qrcode.d.ts deleted file mode 100644 index 0e57693..0000000 --- a/node_modules/html5-qrcode/esm/html5-qrcode.d.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { QrcodeErrorCallback, QrcodeSuccessCallback, Html5QrcodeSupportedFormats, Html5QrcodeResult, QrDimensions, QrDimensionFunction } from "./core"; -import { CameraDevice, CameraCapabilities } from "./camera/core"; -import { ExperimentalFeaturesConfig } from "./experimental-features"; -import { Html5QrcodeScannerState } from "./state-manager"; -export interface Html5QrcodeConfigs { - formatsToSupport?: Array | undefined; - useBarCodeDetectorIfSupported?: boolean | undefined; - experimentalFeatures?: ExperimentalFeaturesConfig | undefined; -} -export interface Html5QrcodeFullConfig extends Html5QrcodeConfigs { - verbose: boolean | undefined; -} -export interface Html5QrcodeCameraScanConfig { - fps: number | undefined; - qrbox?: number | QrDimensions | QrDimensionFunction | undefined; - aspectRatio?: number | undefined; - disableFlip?: boolean | undefined; - videoConstraints?: MediaTrackConstraints | undefined; -} -export declare class Html5Qrcode { - private readonly logger; - private readonly elementId; - private readonly verbose; - private readonly qrcode; - private shouldScan; - private element; - private canvasElement; - private scannerPausedUiElement; - private hasBorderShaders; - private borderShaders; - private qrMatch; - private renderedCamera; - private foreverScanTimeout; - private qrRegion; - private context; - private lastScanImageFile; - private stateManagerProxy; - isScanning: boolean; - constructor(elementId: string, configOrVerbosityFlag?: boolean | Html5QrcodeFullConfig | undefined); - start(cameraIdOrConfig: string | MediaTrackConstraints, configuration: Html5QrcodeCameraScanConfig | undefined, qrCodeSuccessCallback: QrcodeSuccessCallback | undefined, qrCodeErrorCallback: QrcodeErrorCallback | undefined): Promise; - pause(shouldPauseVideo?: boolean): void; - resume(): void; - getState(): Html5QrcodeScannerState; - stop(): Promise; - scanFile(imageFile: File, showImage?: boolean): Promise; - scanFileV2(imageFile: File, showImage?: boolean): Promise; - clear(): void; - static getCameras(): Promise>; - getRunningTrackCapabilities(): MediaTrackCapabilities; - getRunningTrackSettings(): MediaTrackSettings; - getRunningTrackCameraCapabilities(): CameraCapabilities; - applyVideoConstraints(videoConstaints: MediaTrackConstraints): Promise; - private getRenderedCameraOrFail; - private getSupportedFormats; - private getUseBarCodeDetectorIfSupported; - private validateQrboxSize; - private validateQrboxConfig; - private toQrdimensions; - private setupUi; - private createScannerPausedUiElement; - private scanContext; - private foreverScan; - private createVideoConstraints; - private computeCanvasDrawConfig; - private clearElement; - private possiblyUpdateShaders; - private possiblyCloseLastScanImageFile; - private createCanvasElement; - private getShadedRegionBounds; - private possiblyInsertShadingElement; - private insertShaderBorders; - private showPausedState; - private hidePausedState; - private getTimeoutFps; -} diff --git a/node_modules/html5-qrcode/esm/html5-qrcode.js b/node_modules/html5-qrcode/esm/html5-qrcode.js deleted file mode 100644 index b8bc869..0000000 --- a/node_modules/html5-qrcode/esm/html5-qrcode.js +++ /dev/null @@ -1,840 +0,0 @@ -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - if (typeof b !== "function" && b !== null) - throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -import { BaseLoggger, Html5QrcodeResultFactory, Html5QrcodeErrorFactory, Html5QrcodeSupportedFormats, isValidHtml5QrcodeSupportedFormats, Html5QrcodeConstants, isNullOrUndefined } from "./core"; -import { Html5QrcodeStrings } from "./strings"; -import { VideoConstraintsUtil } from "./utils"; -import { Html5QrcodeShim } from "./code-decoder"; -import { CameraFactory } from "./camera/factories"; -import { CameraRetriever } from "./camera/retriever"; -import { StateManagerFactory, Html5QrcodeScannerState } from "./state-manager"; -var Constants = (function (_super) { - __extends(Constants, _super); - function Constants() { - return _super !== null && _super.apply(this, arguments) || this; - } - Constants.DEFAULT_WIDTH = 300; - Constants.DEFAULT_WIDTH_OFFSET = 2; - Constants.FILE_SCAN_MIN_HEIGHT = 300; - Constants.FILE_SCAN_HIDDEN_CANVAS_PADDING = 100; - Constants.MIN_QR_BOX_SIZE = 50; - Constants.SHADED_LEFT = 1; - Constants.SHADED_RIGHT = 2; - Constants.SHADED_TOP = 3; - Constants.SHADED_BOTTOM = 4; - Constants.SHADED_REGION_ELEMENT_ID = "qr-shaded-region"; - Constants.VERBOSE = false; - Constants.BORDER_SHADER_DEFAULT_COLOR = "#ffffff"; - Constants.BORDER_SHADER_MATCH_COLOR = "rgb(90, 193, 56)"; - return Constants; -}(Html5QrcodeConstants)); -var InternalHtml5QrcodeConfig = (function () { - function InternalHtml5QrcodeConfig(config, logger) { - this.logger = logger; - this.fps = Constants.SCAN_DEFAULT_FPS; - if (!config) { - this.disableFlip = Constants.DEFAULT_DISABLE_FLIP; - } - else { - if (config.fps) { - this.fps = config.fps; - } - this.disableFlip = config.disableFlip === true; - this.qrbox = config.qrbox; - this.aspectRatio = config.aspectRatio; - this.videoConstraints = config.videoConstraints; - } - } - InternalHtml5QrcodeConfig.prototype.isMediaStreamConstraintsValid = function () { - if (!this.videoConstraints) { - this.logger.logError("Empty videoConstraints", true); - return false; - } - return VideoConstraintsUtil.isMediaStreamConstraintsValid(this.videoConstraints, this.logger); - }; - InternalHtml5QrcodeConfig.prototype.isShadedBoxEnabled = function () { - return !isNullOrUndefined(this.qrbox); - }; - InternalHtml5QrcodeConfig.create = function (config, logger) { - return new InternalHtml5QrcodeConfig(config, logger); - }; - return InternalHtml5QrcodeConfig; -}()); -var Html5Qrcode = (function () { - function Html5Qrcode(elementId, configOrVerbosityFlag) { - this.element = null; - this.canvasElement = null; - this.scannerPausedUiElement = null; - this.hasBorderShaders = null; - this.borderShaders = null; - this.qrMatch = null; - this.renderedCamera = null; - this.qrRegion = null; - this.context = null; - this.lastScanImageFile = null; - this.isScanning = false; - if (!document.getElementById(elementId)) { - throw "HTML Element with id=".concat(elementId, " not found"); - } - this.elementId = elementId; - this.verbose = false; - var experimentalFeatureConfig; - var configObject; - if (typeof configOrVerbosityFlag == "boolean") { - this.verbose = configOrVerbosityFlag === true; - } - else if (configOrVerbosityFlag) { - configObject = configOrVerbosityFlag; - this.verbose = configObject.verbose === true; - experimentalFeatureConfig = configObject.experimentalFeatures; - } - this.logger = new BaseLoggger(this.verbose); - this.qrcode = new Html5QrcodeShim(this.getSupportedFormats(configOrVerbosityFlag), this.getUseBarCodeDetectorIfSupported(configObject), this.verbose, this.logger); - this.foreverScanTimeout; - this.shouldScan = true; - this.stateManagerProxy = StateManagerFactory.create(); - } - Html5Qrcode.prototype.start = function (cameraIdOrConfig, configuration, qrCodeSuccessCallback, qrCodeErrorCallback) { - var _this = this; - if (!cameraIdOrConfig) { - throw "cameraIdOrConfig is required"; - } - if (!qrCodeSuccessCallback - || typeof qrCodeSuccessCallback != "function") { - throw "qrCodeSuccessCallback is required and should be a function."; - } - var qrCodeErrorCallbackInternal; - if (qrCodeErrorCallback) { - qrCodeErrorCallbackInternal = qrCodeErrorCallback; - } - else { - qrCodeErrorCallbackInternal - = this.verbose ? this.logger.log : function () { }; - } - var internalConfig = InternalHtml5QrcodeConfig.create(configuration, this.logger); - this.clearElement(); - var videoConstraintsAvailableAndValid = false; - if (internalConfig.videoConstraints) { - if (!internalConfig.isMediaStreamConstraintsValid()) { - this.logger.logError("'videoConstraints' is not valid 'MediaStreamConstraints, " - + "it will be ignored.'", true); - } - else { - videoConstraintsAvailableAndValid = true; - } - } - var areVideoConstraintsEnabled = videoConstraintsAvailableAndValid; - var element = document.getElementById(this.elementId); - var rootElementWidth = element.clientWidth - ? element.clientWidth : Constants.DEFAULT_WIDTH; - element.style.position = "relative"; - this.shouldScan = true; - this.element = element; - var $this = this; - var toScanningStateChangeTransaction = this.stateManagerProxy.startTransition(Html5QrcodeScannerState.SCANNING); - return new Promise(function (resolve, reject) { - var videoConstraints = areVideoConstraintsEnabled - ? internalConfig.videoConstraints - : $this.createVideoConstraints(cameraIdOrConfig); - if (!videoConstraints) { - toScanningStateChangeTransaction.cancel(); - reject("videoConstraints should be defined"); - return; - } - var cameraRenderingOptions = {}; - if (!areVideoConstraintsEnabled || internalConfig.aspectRatio) { - cameraRenderingOptions.aspectRatio = internalConfig.aspectRatio; - } - var renderingCallbacks = { - onRenderSurfaceReady: function (viewfinderWidth, viewfinderHeight) { - $this.setupUi(viewfinderWidth, viewfinderHeight, internalConfig); - $this.isScanning = true; - $this.foreverScan(internalConfig, qrCodeSuccessCallback, qrCodeErrorCallbackInternal); - } - }; - CameraFactory.failIfNotSupported().then(function (factory) { - factory.create(videoConstraints).then(function (camera) { - return camera.render(_this.element, cameraRenderingOptions, renderingCallbacks) - .then(function (renderedCamera) { - $this.renderedCamera = renderedCamera; - toScanningStateChangeTransaction.execute(); - resolve(null); - }) - .catch(function (error) { - toScanningStateChangeTransaction.cancel(); - reject(error); - }); - }).catch(function (error) { - toScanningStateChangeTransaction.cancel(); - reject(Html5QrcodeStrings.errorGettingUserMedia(error)); - }); - }).catch(function (_) { - toScanningStateChangeTransaction.cancel(); - reject(Html5QrcodeStrings.cameraStreamingNotSupported()); - }); - }); - }; - Html5Qrcode.prototype.pause = function (shouldPauseVideo) { - if (!this.stateManagerProxy.isStrictlyScanning()) { - throw "Cannot pause, scanner is not scanning."; - } - this.stateManagerProxy.directTransition(Html5QrcodeScannerState.PAUSED); - this.showPausedState(); - if (isNullOrUndefined(shouldPauseVideo) || shouldPauseVideo !== true) { - shouldPauseVideo = false; - } - if (shouldPauseVideo && this.renderedCamera) { - this.renderedCamera.pause(); - } - }; - Html5Qrcode.prototype.resume = function () { - if (!this.stateManagerProxy.isPaused()) { - throw "Cannot result, scanner is not paused."; - } - if (!this.renderedCamera) { - throw "renderedCamera doesn't exist while trying resume()"; - } - var $this = this; - var transitionToScanning = function () { - $this.stateManagerProxy.directTransition(Html5QrcodeScannerState.SCANNING); - $this.hidePausedState(); - }; - if (!this.renderedCamera.isPaused()) { - transitionToScanning(); - return; - } - this.renderedCamera.resume(function () { - transitionToScanning(); - }); - }; - Html5Qrcode.prototype.getState = function () { - return this.stateManagerProxy.getState(); - }; - Html5Qrcode.prototype.stop = function () { - var _this = this; - if (!this.stateManagerProxy.isScanning()) { - throw "Cannot stop, scanner is not running or paused."; - } - var toStoppedStateTransaction = this.stateManagerProxy.startTransition(Html5QrcodeScannerState.NOT_STARTED); - this.shouldScan = false; - if (this.foreverScanTimeout) { - clearTimeout(this.foreverScanTimeout); - } - var removeQrRegion = function () { - if (!_this.element) { - return; - } - var childElement = document.getElementById(Constants.SHADED_REGION_ELEMENT_ID); - if (childElement) { - _this.element.removeChild(childElement); - } - }; - var $this = this; - return this.renderedCamera.close().then(function () { - $this.renderedCamera = null; - if ($this.element) { - $this.element.removeChild($this.canvasElement); - $this.canvasElement = null; - } - removeQrRegion(); - if ($this.qrRegion) { - $this.qrRegion = null; - } - if ($this.context) { - $this.context = null; - } - toStoppedStateTransaction.execute(); - $this.hidePausedState(); - $this.isScanning = false; - return Promise.resolve(); - }); - }; - Html5Qrcode.prototype.scanFile = function (imageFile, showImage) { - return this.scanFileV2(imageFile, showImage) - .then(function (html5qrcodeResult) { return html5qrcodeResult.decodedText; }); - }; - Html5Qrcode.prototype.scanFileV2 = function (imageFile, showImage) { - var _this = this; - if (!imageFile || !(imageFile instanceof File)) { - throw "imageFile argument is mandatory and should be instance " - + "of File. Use 'event.target.files[0]'."; - } - if (isNullOrUndefined(showImage)) { - showImage = true; - } - if (!this.stateManagerProxy.canScanFile()) { - throw "Cannot start file scan - ongoing camera scan"; - } - return new Promise(function (resolve, reject) { - _this.possiblyCloseLastScanImageFile(); - _this.clearElement(); - _this.lastScanImageFile = URL.createObjectURL(imageFile); - var inputImage = new Image; - inputImage.onload = function () { - var imageWidth = inputImage.width; - var imageHeight = inputImage.height; - var element = document.getElementById(_this.elementId); - var containerWidth = element.clientWidth - ? element.clientWidth : Constants.DEFAULT_WIDTH; - var containerHeight = Math.max(element.clientHeight ? element.clientHeight : imageHeight, Constants.FILE_SCAN_MIN_HEIGHT); - var config = _this.computeCanvasDrawConfig(imageWidth, imageHeight, containerWidth, containerHeight); - if (showImage) { - var visibleCanvas = _this.createCanvasElement(containerWidth, containerHeight, "qr-canvas-visible"); - visibleCanvas.style.display = "inline-block"; - element.appendChild(visibleCanvas); - var context_1 = visibleCanvas.getContext("2d"); - if (!context_1) { - throw "Unable to get 2d context from canvas"; - } - context_1.canvas.width = containerWidth; - context_1.canvas.height = containerHeight; - context_1.drawImage(inputImage, 0, 0, imageWidth, imageHeight, config.x, config.y, config.width, config.height); - } - var padding = Constants.FILE_SCAN_HIDDEN_CANVAS_PADDING; - var hiddenImageWidth = Math.max(inputImage.width, config.width); - var hiddenImageHeight = Math.max(inputImage.height, config.height); - var hiddenCanvasWidth = hiddenImageWidth + 2 * padding; - var hiddenCanvasHeight = hiddenImageHeight + 2 * padding; - var hiddenCanvas = _this.createCanvasElement(hiddenCanvasWidth, hiddenCanvasHeight); - element.appendChild(hiddenCanvas); - var context = hiddenCanvas.getContext("2d"); - if (!context) { - throw "Unable to get 2d context from canvas"; - } - context.canvas.width = hiddenCanvasWidth; - context.canvas.height = hiddenCanvasHeight; - context.drawImage(inputImage, 0, 0, imageWidth, imageHeight, padding, padding, hiddenImageWidth, hiddenImageHeight); - try { - _this.qrcode.decodeRobustlyAsync(hiddenCanvas) - .then(function (result) { - resolve(Html5QrcodeResultFactory.createFromQrcodeResult(result)); - }) - .catch(reject); - } - catch (exception) { - reject("QR code parse error, error = ".concat(exception)); - } - }; - inputImage.onerror = reject; - inputImage.onabort = reject; - inputImage.onstalled = reject; - inputImage.onsuspend = reject; - inputImage.src = URL.createObjectURL(imageFile); - }); - }; - Html5Qrcode.prototype.clear = function () { - this.clearElement(); - }; - Html5Qrcode.getCameras = function () { - return CameraRetriever.retrieve(); - }; - Html5Qrcode.prototype.getRunningTrackCapabilities = function () { - return this.getRenderedCameraOrFail().getRunningTrackCapabilities(); - }; - Html5Qrcode.prototype.getRunningTrackSettings = function () { - return this.getRenderedCameraOrFail().getRunningTrackSettings(); - }; - Html5Qrcode.prototype.getRunningTrackCameraCapabilities = function () { - return this.getRenderedCameraOrFail().getCapabilities(); - }; - Html5Qrcode.prototype.applyVideoConstraints = function (videoConstaints) { - if (!videoConstaints) { - throw "videoConstaints is required argument."; - } - else if (!VideoConstraintsUtil.isMediaStreamConstraintsValid(videoConstaints, this.logger)) { - throw "invalid videoConstaints passed, check logs for more details"; - } - return this.getRenderedCameraOrFail().applyVideoConstraints(videoConstaints); - }; - Html5Qrcode.prototype.getRenderedCameraOrFail = function () { - if (this.renderedCamera == null) { - throw "Scanning is not in running state, call this API only when" - + " QR code scanning using camera is in running state."; - } - return this.renderedCamera; - }; - Html5Qrcode.prototype.getSupportedFormats = function (configOrVerbosityFlag) { - var allFormats = [ - Html5QrcodeSupportedFormats.QR_CODE, - Html5QrcodeSupportedFormats.AZTEC, - Html5QrcodeSupportedFormats.CODABAR, - Html5QrcodeSupportedFormats.CODE_39, - Html5QrcodeSupportedFormats.CODE_93, - Html5QrcodeSupportedFormats.CODE_128, - Html5QrcodeSupportedFormats.DATA_MATRIX, - Html5QrcodeSupportedFormats.MAXICODE, - Html5QrcodeSupportedFormats.ITF, - Html5QrcodeSupportedFormats.EAN_13, - Html5QrcodeSupportedFormats.EAN_8, - Html5QrcodeSupportedFormats.PDF_417, - Html5QrcodeSupportedFormats.RSS_14, - Html5QrcodeSupportedFormats.RSS_EXPANDED, - Html5QrcodeSupportedFormats.UPC_A, - Html5QrcodeSupportedFormats.UPC_E, - Html5QrcodeSupportedFormats.UPC_EAN_EXTENSION, - ]; - if (!configOrVerbosityFlag - || typeof configOrVerbosityFlag == "boolean") { - return allFormats; - } - if (!configOrVerbosityFlag.formatsToSupport) { - return allFormats; - } - if (!Array.isArray(configOrVerbosityFlag.formatsToSupport)) { - throw "configOrVerbosityFlag.formatsToSupport should be undefined " - + "or an array."; - } - if (configOrVerbosityFlag.formatsToSupport.length === 0) { - throw "Atleast 1 formatsToSupport is needed."; - } - var supportedFormats = []; - for (var _i = 0, _a = configOrVerbosityFlag.formatsToSupport; _i < _a.length; _i++) { - var format = _a[_i]; - if (isValidHtml5QrcodeSupportedFormats(format)) { - supportedFormats.push(format); - } - else { - this.logger.warn("Invalid format: ".concat(format, " passed in config, ignoring.")); - } - } - if (supportedFormats.length === 0) { - throw "None of formatsToSupport match supported values."; - } - return supportedFormats; - }; - Html5Qrcode.prototype.getUseBarCodeDetectorIfSupported = function (config) { - if (isNullOrUndefined(config)) { - return true; - } - if (!isNullOrUndefined(config.useBarCodeDetectorIfSupported)) { - return config.useBarCodeDetectorIfSupported !== false; - } - if (isNullOrUndefined(config.experimentalFeatures)) { - return true; - } - var experimentalFeatures = config.experimentalFeatures; - if (isNullOrUndefined(experimentalFeatures.useBarCodeDetectorIfSupported)) { - return true; - } - return experimentalFeatures.useBarCodeDetectorIfSupported !== false; - }; - Html5Qrcode.prototype.validateQrboxSize = function (viewfinderWidth, viewfinderHeight, internalConfig) { - var _this = this; - var qrboxSize = internalConfig.qrbox; - this.validateQrboxConfig(qrboxSize); - var qrDimensions = this.toQrdimensions(viewfinderWidth, viewfinderHeight, qrboxSize); - var validateMinSize = function (size) { - if (size < Constants.MIN_QR_BOX_SIZE) { - throw "minimum size of 'config.qrbox' dimension value is" - + " ".concat(Constants.MIN_QR_BOX_SIZE, "px."); - } - }; - var correctWidthBasedOnRootElementSize = function (configWidth) { - if (configWidth > viewfinderWidth) { - _this.logger.warn("`qrbox.width` or `qrbox` is larger than the" - + " width of the root element. The width will be truncated" - + " to the width of root element."); - configWidth = viewfinderWidth; - } - return configWidth; - }; - validateMinSize(qrDimensions.width); - validateMinSize(qrDimensions.height); - qrDimensions.width = correctWidthBasedOnRootElementSize(qrDimensions.width); - }; - Html5Qrcode.prototype.validateQrboxConfig = function (qrboxSize) { - if (typeof qrboxSize === "number") { - return; - } - if (typeof qrboxSize === "function") { - return; - } - if (qrboxSize.width === undefined || qrboxSize.height === undefined) { - throw "Invalid instance of QrDimensions passed for " - + "'config.qrbox'. Both 'width' and 'height' should be set."; - } - }; - Html5Qrcode.prototype.toQrdimensions = function (viewfinderWidth, viewfinderHeight, qrboxSize) { - if (typeof qrboxSize === "number") { - return { width: qrboxSize, height: qrboxSize }; - } - else if (typeof qrboxSize === "function") { - try { - return qrboxSize(viewfinderWidth, viewfinderHeight); - } - catch (error) { - throw new Error("qrbox config was passed as a function but it failed with " - + "unknown error" + error); - } - } - return qrboxSize; - }; - Html5Qrcode.prototype.setupUi = function (viewfinderWidth, viewfinderHeight, internalConfig) { - if (internalConfig.isShadedBoxEnabled()) { - this.validateQrboxSize(viewfinderWidth, viewfinderHeight, internalConfig); - } - var qrboxSize = isNullOrUndefined(internalConfig.qrbox) ? - { width: viewfinderWidth, height: viewfinderHeight } : internalConfig.qrbox; - this.validateQrboxConfig(qrboxSize); - var qrDimensions = this.toQrdimensions(viewfinderWidth, viewfinderHeight, qrboxSize); - if (qrDimensions.height > viewfinderHeight) { - this.logger.warn("[Html5Qrcode] config.qrbox has height that is" - + "greater than the height of the video stream. Shading will be" - + " ignored"); - } - var shouldShadingBeApplied = internalConfig.isShadedBoxEnabled() - && qrDimensions.height <= viewfinderHeight; - var defaultQrRegion = { - x: 0, - y: 0, - width: viewfinderWidth, - height: viewfinderHeight - }; - var qrRegion = shouldShadingBeApplied - ? this.getShadedRegionBounds(viewfinderWidth, viewfinderHeight, qrDimensions) - : defaultQrRegion; - var canvasElement = this.createCanvasElement(qrRegion.width, qrRegion.height); - var contextAttributes = { willReadFrequently: true }; - var context = canvasElement.getContext("2d", contextAttributes); - context.canvas.width = qrRegion.width; - context.canvas.height = qrRegion.height; - this.element.append(canvasElement); - if (shouldShadingBeApplied) { - this.possiblyInsertShadingElement(this.element, viewfinderWidth, viewfinderHeight, qrDimensions); - } - this.createScannerPausedUiElement(this.element); - this.qrRegion = qrRegion; - this.context = context; - this.canvasElement = canvasElement; - }; - Html5Qrcode.prototype.createScannerPausedUiElement = function (rootElement) { - var scannerPausedUiElement = document.createElement("div"); - scannerPausedUiElement.innerText = Html5QrcodeStrings.scannerPaused(); - scannerPausedUiElement.style.display = "none"; - scannerPausedUiElement.style.position = "absolute"; - scannerPausedUiElement.style.top = "0px"; - scannerPausedUiElement.style.zIndex = "1"; - scannerPausedUiElement.style.background = "rgba(9, 9, 9, 0.46)"; - scannerPausedUiElement.style.color = "#FFECEC"; - scannerPausedUiElement.style.textAlign = "center"; - scannerPausedUiElement.style.width = "100%"; - rootElement.appendChild(scannerPausedUiElement); - this.scannerPausedUiElement = scannerPausedUiElement; - }; - Html5Qrcode.prototype.scanContext = function (qrCodeSuccessCallback, qrCodeErrorCallback) { - var _this = this; - if (this.stateManagerProxy.isPaused()) { - return Promise.resolve(false); - } - return this.qrcode.decodeAsync(this.canvasElement) - .then(function (result) { - qrCodeSuccessCallback(result.text, Html5QrcodeResultFactory.createFromQrcodeResult(result)); - _this.possiblyUpdateShaders(true); - return true; - }).catch(function (error) { - _this.possiblyUpdateShaders(false); - var errorMessage = Html5QrcodeStrings.codeParseError(error); - qrCodeErrorCallback(errorMessage, Html5QrcodeErrorFactory.createFrom(errorMessage)); - return false; - }); - }; - Html5Qrcode.prototype.foreverScan = function (internalConfig, qrCodeSuccessCallback, qrCodeErrorCallback) { - var _this = this; - if (!this.shouldScan) { - return; - } - if (!this.renderedCamera) { - return; - } - var videoElement = this.renderedCamera.getSurface(); - var widthRatio = videoElement.videoWidth / videoElement.clientWidth; - var heightRatio = videoElement.videoHeight / videoElement.clientHeight; - if (!this.qrRegion) { - throw "qrRegion undefined when localMediaStream is ready."; - } - var sWidthOffset = this.qrRegion.width * widthRatio; - var sHeightOffset = this.qrRegion.height * heightRatio; - var sxOffset = this.qrRegion.x * widthRatio; - var syOffset = this.qrRegion.y * heightRatio; - this.context.drawImage(videoElement, sxOffset, syOffset, sWidthOffset, sHeightOffset, 0, 0, this.qrRegion.width, this.qrRegion.height); - var triggerNextScan = function () { - _this.foreverScanTimeout = setTimeout(function () { - _this.foreverScan(internalConfig, qrCodeSuccessCallback, qrCodeErrorCallback); - }, _this.getTimeoutFps(internalConfig.fps)); - }; - this.scanContext(qrCodeSuccessCallback, qrCodeErrorCallback) - .then(function (isSuccessfull) { - if (!isSuccessfull && internalConfig.disableFlip !== true) { - _this.context.translate(_this.context.canvas.width, 0); - _this.context.scale(-1, 1); - _this.scanContext(qrCodeSuccessCallback, qrCodeErrorCallback) - .finally(function () { - triggerNextScan(); - }); - } - else { - triggerNextScan(); - } - }).catch(function (error) { - _this.logger.logError("Error happend while scanning context", error); - triggerNextScan(); - }); - }; - Html5Qrcode.prototype.createVideoConstraints = function (cameraIdOrConfig) { - if (typeof cameraIdOrConfig == "string") { - return { deviceId: { exact: cameraIdOrConfig } }; - } - else if (typeof cameraIdOrConfig == "object") { - var facingModeKey = "facingMode"; - var deviceIdKey = "deviceId"; - var allowedFacingModeValues_1 = { "user": true, "environment": true }; - var exactKey = "exact"; - var isValidFacingModeValue = function (value) { - if (value in allowedFacingModeValues_1) { - return true; - } - else { - throw "config has invalid 'facingMode' value = " - + "'".concat(value, "'"); - } - }; - var keys = Object.keys(cameraIdOrConfig); - if (keys.length !== 1) { - throw "'cameraIdOrConfig' object should have exactly 1 key," - + " if passed as an object, found ".concat(keys.length, " keys"); - } - var key = Object.keys(cameraIdOrConfig)[0]; - if (key !== facingModeKey && key !== deviceIdKey) { - throw "Only '".concat(facingModeKey, "' and '").concat(deviceIdKey, "' ") - + " are supported for 'cameraIdOrConfig'"; - } - if (key === facingModeKey) { - var facingMode = cameraIdOrConfig.facingMode; - if (typeof facingMode == "string") { - if (isValidFacingModeValue(facingMode)) { - return { facingMode: facingMode }; - } - } - else if (typeof facingMode == "object") { - if (exactKey in facingMode) { - if (isValidFacingModeValue(facingMode["".concat(exactKey)])) { - return { - facingMode: { - exact: facingMode["".concat(exactKey)] - } - }; - } - } - else { - throw "'facingMode' should be string or object with" - + " ".concat(exactKey, " as key."); - } - } - else { - var type_1 = (typeof facingMode); - throw "Invalid type of 'facingMode' = ".concat(type_1); - } - } - else { - var deviceId = cameraIdOrConfig.deviceId; - if (typeof deviceId == "string") { - return { deviceId: deviceId }; - } - else if (typeof deviceId == "object") { - if (exactKey in deviceId) { - return { - deviceId: { exact: deviceId["".concat(exactKey)] } - }; - } - else { - throw "'deviceId' should be string or object with" - + " ".concat(exactKey, " as key."); - } - } - else { - var type_2 = (typeof deviceId); - throw "Invalid type of 'deviceId' = ".concat(type_2); - } - } - } - var type = (typeof cameraIdOrConfig); - throw "Invalid type of 'cameraIdOrConfig' = ".concat(type); - }; - Html5Qrcode.prototype.computeCanvasDrawConfig = function (imageWidth, imageHeight, containerWidth, containerHeight) { - if (imageWidth <= containerWidth - && imageHeight <= containerHeight) { - var xoffset = (containerWidth - imageWidth) / 2; - var yoffset = (containerHeight - imageHeight) / 2; - return { - x: xoffset, - y: yoffset, - width: imageWidth, - height: imageHeight - }; - } - else { - var formerImageWidth = imageWidth; - var formerImageHeight = imageHeight; - if (imageWidth > containerWidth) { - imageHeight = (containerWidth / imageWidth) * imageHeight; - imageWidth = containerWidth; - } - if (imageHeight > containerHeight) { - imageWidth = (containerHeight / imageHeight) * imageWidth; - imageHeight = containerHeight; - } - this.logger.log("Image downsampled from " - + "".concat(formerImageWidth, "X").concat(formerImageHeight) - + " to ".concat(imageWidth, "X").concat(imageHeight, ".")); - return this.computeCanvasDrawConfig(imageWidth, imageHeight, containerWidth, containerHeight); - } - }; - Html5Qrcode.prototype.clearElement = function () { - if (this.stateManagerProxy.isScanning()) { - throw "Cannot clear while scan is ongoing, close it first."; - } - var element = document.getElementById(this.elementId); - if (element) { - element.innerHTML = ""; - } - }; - Html5Qrcode.prototype.possiblyUpdateShaders = function (qrMatch) { - if (this.qrMatch === qrMatch) { - return; - } - if (this.hasBorderShaders - && this.borderShaders - && this.borderShaders.length) { - this.borderShaders.forEach(function (shader) { - shader.style.backgroundColor = qrMatch - ? Constants.BORDER_SHADER_MATCH_COLOR - : Constants.BORDER_SHADER_DEFAULT_COLOR; - }); - } - this.qrMatch = qrMatch; - }; - Html5Qrcode.prototype.possiblyCloseLastScanImageFile = function () { - if (this.lastScanImageFile) { - URL.revokeObjectURL(this.lastScanImageFile); - this.lastScanImageFile = null; - } - }; - Html5Qrcode.prototype.createCanvasElement = function (width, height, customId) { - var canvasWidth = width; - var canvasHeight = height; - var canvasElement = document.createElement("canvas"); - canvasElement.style.width = "".concat(canvasWidth, "px"); - canvasElement.style.height = "".concat(canvasHeight, "px"); - canvasElement.style.display = "none"; - canvasElement.id = isNullOrUndefined(customId) - ? "qr-canvas" : customId; - return canvasElement; - }; - Html5Qrcode.prototype.getShadedRegionBounds = function (width, height, qrboxSize) { - if (qrboxSize.width > width || qrboxSize.height > height) { - throw "'config.qrbox' dimensions should not be greater than the " - + "dimensions of the root HTML element."; - } - return { - x: (width - qrboxSize.width) / 2, - y: (height - qrboxSize.height) / 2, - width: qrboxSize.width, - height: qrboxSize.height - }; - }; - Html5Qrcode.prototype.possiblyInsertShadingElement = function (element, width, height, qrboxSize) { - if ((width - qrboxSize.width) < 1 || (height - qrboxSize.height) < 1) { - return; - } - var shadingElement = document.createElement("div"); - shadingElement.style.position = "absolute"; - var rightLeftBorderSize = (width - qrboxSize.width) / 2; - var topBottomBorderSize = (height - qrboxSize.height) / 2; - shadingElement.style.borderLeft - = "".concat(rightLeftBorderSize, "px solid rgba(0, 0, 0, 0.48)"); - shadingElement.style.borderRight - = "".concat(rightLeftBorderSize, "px solid rgba(0, 0, 0, 0.48)"); - shadingElement.style.borderTop - = "".concat(topBottomBorderSize, "px solid rgba(0, 0, 0, 0.48)"); - shadingElement.style.borderBottom - = "".concat(topBottomBorderSize, "px solid rgba(0, 0, 0, 0.48)"); - shadingElement.style.boxSizing = "border-box"; - shadingElement.style.top = "0px"; - shadingElement.style.bottom = "0px"; - shadingElement.style.left = "0px"; - shadingElement.style.right = "0px"; - shadingElement.id = "".concat(Constants.SHADED_REGION_ELEMENT_ID); - if ((width - qrboxSize.width) < 11 - || (height - qrboxSize.height) < 11) { - this.hasBorderShaders = false; - } - else { - var smallSize = 5; - var largeSize = 40; - this.insertShaderBorders(shadingElement, largeSize, smallSize, -smallSize, null, 0, true); - this.insertShaderBorders(shadingElement, largeSize, smallSize, -smallSize, null, 0, false); - this.insertShaderBorders(shadingElement, largeSize, smallSize, null, -smallSize, 0, true); - this.insertShaderBorders(shadingElement, largeSize, smallSize, null, -smallSize, 0, false); - this.insertShaderBorders(shadingElement, smallSize, largeSize + smallSize, -smallSize, null, -smallSize, true); - this.insertShaderBorders(shadingElement, smallSize, largeSize + smallSize, null, -smallSize, -smallSize, true); - this.insertShaderBorders(shadingElement, smallSize, largeSize + smallSize, -smallSize, null, -smallSize, false); - this.insertShaderBorders(shadingElement, smallSize, largeSize + smallSize, null, -smallSize, -smallSize, false); - this.hasBorderShaders = true; - } - element.append(shadingElement); - }; - Html5Qrcode.prototype.insertShaderBorders = function (shaderElem, width, height, top, bottom, side, isLeft) { - var elem = document.createElement("div"); - elem.style.position = "absolute"; - elem.style.backgroundColor = Constants.BORDER_SHADER_DEFAULT_COLOR; - elem.style.width = "".concat(width, "px"); - elem.style.height = "".concat(height, "px"); - if (top !== null) { - elem.style.top = "".concat(top, "px"); - } - if (bottom !== null) { - elem.style.bottom = "".concat(bottom, "px"); - } - if (isLeft) { - elem.style.left = "".concat(side, "px"); - } - else { - elem.style.right = "".concat(side, "px"); - } - if (!this.borderShaders) { - this.borderShaders = []; - } - this.borderShaders.push(elem); - shaderElem.appendChild(elem); - }; - Html5Qrcode.prototype.showPausedState = function () { - if (!this.scannerPausedUiElement) { - throw "[internal error] scanner paused UI element not found"; - } - this.scannerPausedUiElement.style.display = "block"; - }; - Html5Qrcode.prototype.hidePausedState = function () { - if (!this.scannerPausedUiElement) { - throw "[internal error] scanner paused UI element not found"; - } - this.scannerPausedUiElement.style.display = "none"; - }; - Html5Qrcode.prototype.getTimeoutFps = function (fps) { - return 1000 / fps; - }; - return Html5Qrcode; -}()); -export { Html5Qrcode }; -//# sourceMappingURL=html5-qrcode.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/html5-qrcode.js.map b/node_modules/html5-qrcode/esm/html5-qrcode.js.map deleted file mode 100644 index a29f6b6..0000000 --- a/node_modules/html5-qrcode/esm/html5-qrcode.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"html5-qrcode.js","sourceRoot":"","sources":["../../src/html5-qrcode.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/image-assets.d.ts b/node_modules/html5-qrcode/esm/image-assets.d.ts deleted file mode 100644 index 59387ac..0000000 --- a/node_modules/html5-qrcode/esm/image-assets.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export declare const ASSET_CAMERA_SCAN: string; -export declare const ASSET_FILE_SCAN: string; -export declare const ASSET_INFO_ICON_16PX: string; -export declare const ASSET_CLOSE_ICON_16PX: string; diff --git a/node_modules/html5-qrcode/esm/image-assets.js b/node_modules/html5-qrcode/esm/image-assets.js deleted file mode 100644 index 0b2e73c..0000000 --- a/node_modules/html5-qrcode/esm/image-assets.js +++ /dev/null @@ -1,6 +0,0 @@ -var SVG_XML_PREFIX = "data:image/svg+xml;base64,"; -export var ASSET_CAMERA_SCAN = SVG_XML_PREFIX + "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzNzEuNjQzIDM3MS42NDMiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDM3MS42NDMgMzcxLjY0MyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBhdGggZD0iTTEwNS4wODQgMzguMjcxaDE2My43Njh2MjBIMTA1LjA4NHoiLz48cGF0aCBkPSJNMzExLjU5NiAxOTAuMTg5Yy03LjQ0MS05LjM0Ny0xOC40MDMtMTYuMjA2LTMyLjc0My0yMC41MjJWMzBjMC0xNi41NDItMTMuNDU4LTMwLTMwLTMwSDEyNS4wODRjLTE2LjU0MiAwLTMwIDEzLjQ1OC0zMCAzMHYxMjAuMTQzaC04LjI5NmMtMTYuNTQyIDAtMzAgMTMuNDU4LTMwIDMwdjEuMzMzYTI5LjgwNCAyOS44MDQgMCAwIDAgNC42MDMgMTUuOTM5Yy03LjM0IDUuNDc0LTEyLjEwMyAxNC4yMjEtMTIuMTAzIDI0LjA2MXYxLjMzM2MwIDkuODQgNC43NjMgMTguNTg3IDEyLjEwMyAyNC4wNjJhMjkuODEgMjkuODEgMCAwIDAtNC42MDMgMTUuOTM4djEuMzMzYzAgMTYuNTQyIDEzLjQ1OCAzMCAzMCAzMGg4LjMyNGMuNDI3IDExLjYzMSA3LjUwMyAyMS41ODcgMTcuNTM0IDI2LjE3Ny45MzEgMTAuNTAzIDQuMDg0IDMwLjE4NyAxNC43NjggNDUuNTM3YTkuOTg4IDkuOTg4IDAgMCAwIDguMjE2IDQuMjg4IDkuOTU4IDkuOTU4IDAgMCAwIDUuNzA0LTEuNzkzYzQuNTMzLTMuMTU1IDUuNjUtOS4zODggMi40OTUtMTMuOTIxLTYuNzk4LTkuNzY3LTkuNjAyLTIyLjYwOC0xMC43Ni0zMS40aDgyLjY4NWMuMjcyLjQxNC41NDUuODE4LjgxNSAxLjIxIDMuMTQyIDQuNTQxIDkuMzcyIDUuNjc5IDEzLjkxMyAyLjUzNCA0LjU0Mi0zLjE0MiA1LjY3Ny05LjM3MSAyLjUzNS0xMy45MTMtMTEuOTE5LTE3LjIyOS04Ljc4Ny0zNS44ODQgOS41ODEtNTcuMDEyIDMuMDY3LTIuNjUyIDEyLjMwNy0xMS43MzIgMTEuMjE3LTI0LjAzMy0uODI4LTkuMzQzLTcuMTA5LTE3LjE5NC0xOC42NjktMjMuMzM3YTkuODU3IDkuODU3IDAgMCAwLTEuMDYxLS40ODZjLS40NjYtLjE4Mi0xMS40MDMtNC41NzktOS43NDEtMTUuNzA2IDEuMDA3LTYuNzM3IDE0Ljc2OC04LjI3MyAyMy43NjYtNy42NjYgMjMuMTU2IDEuNTY5IDM5LjY5OCA3LjgwMyA0Ny44MzYgMTguMDI2IDUuNzUyIDcuMjI1IDcuNjA3IDE2LjYyMyA1LjY3MyAyOC43MzMtLjQxMyAyLjU4NS0uODI0IDUuMjQxLTEuMjQ1IDcuOTU5LTUuNzU2IDM3LjE5NC0xMi45MTkgODMuNDgzLTQ5Ljg3IDExNC42NjEtNC4yMjEgMy41NjEtNC43NTYgOS44Ny0xLjE5NCAxNC4wOTJhOS45OCA5Ljk4IDAgMCAwIDcuNjQ4IDMuNTUxIDkuOTU1IDkuOTU1IDAgMCAwIDYuNDQ0LTIuMzU4YzQyLjY3Mi0zNi4wMDUgNTAuODAyLTg4LjUzMyA1Ni43MzctMTI2Ljg4OC40MTUtMi42ODQuODIxLTUuMzA5IDEuMjI5LTcuODYzIDIuODM0LTE3LjcyMS0uNDU1LTMyLjY0MS05Ljc3Mi00NC4zNDV6bS0yMzIuMzA4IDQyLjYyYy01LjUxNCAwLTEwLTQuNDg2LTEwLTEwdi0xLjMzM2MwLTUuNTE0IDQuNDg2LTEwIDEwLTEwaDE1djIxLjMzM2gtMTV6bS0yLjUtNTIuNjY2YzAtNS41MTQgNC40ODYtMTAgMTAtMTBoNy41djIxLjMzM2gtNy41Yy01LjUxNCAwLTEwLTQuNDg2LTEwLTEwdi0xLjMzM3ptMTcuNSA5My45OTloLTcuNWMtNS41MTQgMC0xMC00LjQ4Ni0xMC0xMHYtMS4zMzNjMC01LjUxNCA0LjQ4Ni0xMCAxMC0xMGg3LjV2MjEuMzMzem0zMC43OTYgMjguODg3Yy01LjUxNCAwLTEwLTQuNDg2LTEwLTEwdi04LjI3MWg5MS40NTdjLS44NTEgNi42NjgtLjQzNyAxMi43ODcuNzMxIDE4LjI3MWgtODIuMTg4em03OS40ODItMTEzLjY5OGMtMy4xMjQgMjAuOTA2IDEyLjQyNyAzMy4xODQgMjEuNjI1IDM3LjA0IDUuNDQxIDIuOTY4IDcuNTUxIDUuNjQ3IDcuNzAxIDcuMTg4LjIxIDIuMTUtMi41NTMgNS42ODQtNC40NzcgNy4yNTEtLjQ4Mi4zNzgtLjkyOS44LTEuMzM1IDEuMjYxLTYuOTg3IDcuOTM2LTExLjk4MiAxNS41Mi0xNS40MzIgMjIuNjg4aC05Ny41NjRWMzBjMC01LjUxNCA0LjQ4Ni0xMCAxMC0xMGgxMjMuNzY5YzUuNTE0IDAgMTAgNC40ODYgMTAgMTB2MTM1LjU3OWMtMy4wMzItLjM4MS02LjE1LS42OTQtOS4zODktLjkxNC0yNS4xNTktMS42OTQtNDIuMzcgNy43NDgtNDQuODk4IDI0LjY2NnoiLz48cGF0aCBkPSJNMTc5LjEyOSA4My4xNjdoLTI0LjA2YTUgNSAwIDAgMC01IDV2MjQuMDYxYTUgNSAwIDAgMCA1IDVoMjQuMDZhNSA1IDAgMCAwIDUtNVY4OC4xNjdhNSA1IDAgMCAwLTUtNXpNMTcyLjYyOSAxNDIuODZoLTEyLjU2VjEzMC44YTUgNSAwIDEgMC0xMCAwdjE3LjA2MWE1IDUgMCAwIDAgNSA1aDE3LjU2YTUgNSAwIDEgMCAwLTEwLjAwMXpNMjE2LjU2OCA4My4xNjdoLTI0LjA2YTUgNSAwIDAgMC01IDV2MjQuMDYxYTUgNSAwIDAgMCA1IDVoMjQuMDZhNSA1IDAgMCAwIDUtNVY4OC4xNjdhNSA1IDAgMCAwLTUtNXptLTUgMjQuMDYxaC0xNC4wNlY5My4xNjdoMTQuMDZ2MTQuMDYxek0yMTEuNjY5IDEyNS45MzZIMTk3LjQxYTUgNSAwIDAgMC01IDV2MTQuMjU3YTUgNSAwIDAgMCA1IDVoMTQuMjU5YTUgNSAwIDAgMCA1LTV2LTE0LjI1N2E1IDUgMCAwIDAtNS01eiIvPjwvc3ZnPg=="; -export var ASSET_FILE_SCAN = SVG_XML_PREFIX + "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1OS4wMTggNTkuMDE4IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1OS4wMTggNTkuMDE4IiB4bWw6c3BhY2U9InByZXNlcnZlIj48cGF0aCBkPSJtNTguNzQxIDU0LjgwOS01Ljk2OS02LjI0NGExMC43NCAxMC43NCAwIDAgMCAyLjgyLTcuMjVjMC01Ljk1My00Ljg0My0xMC43OTYtMTAuNzk2LTEwLjc5NlMzNCAzNS4zNjEgMzQgNDEuMzE0IDM4Ljg0MyA1Mi4xMSA0NC43OTYgNTIuMTFjMi40NDEgMCA0LjY4OC0uODI0IDYuNDk5LTIuMTk2bDYuMDAxIDYuMjc3YS45OTguOTk4IDAgMCAwIDEuNDE0LjAzMiAxIDEgMCAwIDAgLjAzMS0xLjQxNHpNMzYgNDEuMzE0YzAtNC44NSAzLjk0Ni04Ljc5NiA4Ljc5Ni04Ljc5NnM4Ljc5NiAzLjk0NiA4Ljc5NiA4Ljc5Ni0zLjk0NiA4Ljc5Ni04Ljc5NiA4Ljc5NlMzNiA0Ni4xNjQgMzYgNDEuMzE0ek0xMC40MzEgMTYuMDg4YzAgMy4wNyAyLjQ5OCA1LjU2OCA1LjU2OSA1LjU2OHM1LjU2OS0yLjQ5OCA1LjU2OS01LjU2OGMwLTMuMDcxLTIuNDk4LTUuNTY5LTUuNTY5LTUuNTY5cy01LjU2OSAyLjQ5OC01LjU2OSA1LjU2OXptOS4xMzggMGMwIDEuOTY4LTEuNjAyIDMuNTY4LTMuNTY5IDMuNTY4cy0zLjU2OS0xLjYwMS0zLjU2OS0zLjU2OCAxLjYwMi0zLjU2OSAzLjU2OS0zLjU2OSAzLjU2OSAxLjYwMSAzLjU2OSAzLjU2OXoiLz48cGF0aCBkPSJtMzAuODgyIDI4Ljk4NyA5LjE4LTEwLjA1NCAxMS4yNjIgMTAuMzIzYTEgMSAwIDAgMCAxLjM1MS0xLjQ3NWwtMTItMTFhMSAxIDAgMCAwLTEuNDE0LjA2M2wtOS43OTQgMTAuNzI3LTQuNzQzLTQuNzQzYTEuMDAzIDEuMDAzIDAgMCAwLTEuMzY4LS4wNDRMNi4zMzkgMzcuNzY4YTEgMSAwIDEgMCAxLjMyMiAxLjUwMWwxNi4zMTMtMTQuMzYyIDcuMzE5IDcuMzE4YS45OTkuOTk5IDAgMSAwIDEuNDE0LTEuNDE0bC0xLjgyNS0xLjgyNHoiLz48cGF0aCBkPSJNMzAgNDYuNTE4SDJ2LTQyaDU0djI4YTEgMSAwIDEgMCAyIDB2LTI5YTEgMSAwIDAgMC0xLTFIMWExIDEgMCAwIDAtMSAxdjQ0YTEgMSAwIDAgMCAxIDFoMjlhMSAxIDAgMSAwIDAtMnoiLz48L3N2Zz4="; -export var ASSET_INFO_ICON_16PX = SVG_XML_PREFIX + "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NjAgNDYwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA0NjAgNDYwIiB4bWw6c3BhY2U9InByZXNlcnZlIj48cGF0aCBkPSJNMjMwIDBDMTAyLjk3NSAwIDAgMTAyLjk3NSAwIDIzMHMxMDIuOTc1IDIzMCAyMzAgMjMwIDIzMC0xMDIuOTc0IDIzMC0yMzBTMzU3LjAyNSAwIDIzMCAwem0zOC4zMzMgMzc3LjM2YzAgOC42NzYtNy4wMzQgMTUuNzEtMTUuNzEgMTUuNzFoLTQzLjEwMWMtOC42NzYgMC0xNS43MS03LjAzNC0xNS43MS0xNS43MVYyMDIuNDc3YzAtOC42NzYgNy4wMzMtMTUuNzEgMTUuNzEtMTUuNzFoNDMuMTAxYzguNjc2IDAgMTUuNzEgNy4wMzMgMTUuNzEgMTUuNzFWMzc3LjM2ek0yMzAgMTU3Yy0yMS41MzkgMC0zOS0xNy40NjEtMzktMzlzMTcuNDYxLTM5IDM5LTM5IDM5IDE3LjQ2MSAzOSAzOS0xNy40NjEgMzktMzkgMzl6Ii8+PC9zdmc+"; -export var ASSET_CLOSE_ICON_16PX = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAQgAAAEIBarqQRAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAE1SURBVDiNfdI7S0NBEAXgLya1otFgpbYSbISAgpXYi6CmiH9KCAiChaVga6OiWPgfRDQ+0itaGVNosXtluWwcuMzePfM4M3sq8lbHBubwg1dc4m1E/J/N4ghDPOIsfk/4xiEao5KX0McFljN4C9d4QTPXuY99jP3DsIoDPGM6BY5i5yI5R7O4q+ImFkJY2DCh3cAH2klyB+9J1xUMMAG7eCh1a+Mr+k48b5diXrFVwwLuS+BJ9MfR7+G0FHOHhTHhnXNWS87VDF4pcnfQK4Ep7XScNLmPTZgURNKKYENYWDpzW1BhscS1WHS8CDgURFJQrWcoF3c13KKbgg1BYQfy8xZWEzTTw1QZbAoKu8FqJnktdu5hcVSHmchiILzzuaDQvjBzV2m8yohCE1jHfPx/xhU+y4G/D75ELlRJsSYAAAAASUVORK5CYII="; -//# sourceMappingURL=image-assets.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/image-assets.js.map b/node_modules/html5-qrcode/esm/image-assets.js.map deleted file mode 100644 index 4ba7fe1..0000000 --- a/node_modules/html5-qrcode/esm/image-assets.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"image-assets.js","sourceRoot":"","sources":["../../src/image-assets.ts"],"names":[],"mappings":"AASA,IAAM,cAAc,GAAG,4BAA4B,CAAC;AAEpD,MAAM,CAAC,IAAM,iBAAiB,GAAW,cAAc,GAAG,82GAA82G,CAAC;AAEz6G,MAAM,CAAC,IAAM,eAAe,GAAW,cAAc,GAAG,s8CAAs8C,CAAC;AAE//C,MAAM,CAAC,IAAM,oBAAoB,GAAY,cAAc,GAAG,8oBAA8oB,CAAC;AAE7sB,MAAM,CAAC,IAAM,qBAAqB,GAAY,omBAAomB,CAAC"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/index.d.ts b/node_modules/html5-qrcode/esm/index.d.ts deleted file mode 100644 index d6b90c6..0000000 --- a/node_modules/html5-qrcode/esm/index.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { Html5Qrcode, Html5QrcodeFullConfig, Html5QrcodeCameraScanConfig } from "./html5-qrcode"; -export { Html5QrcodeScanner } from "./html5-qrcode-scanner"; -export { Html5QrcodeSupportedFormats, Html5QrcodeResult, QrcodeSuccessCallback, QrcodeErrorCallback } from "./core"; -export { Html5QrcodeScannerState } from "./state-manager"; -export { Html5QrcodeScanType } from "./core"; -export { CameraCapabilities, CameraDevice } from "./camera/core"; diff --git a/node_modules/html5-qrcode/esm/index.js b/node_modules/html5-qrcode/esm/index.js deleted file mode 100644 index 890331e..0000000 --- a/node_modules/html5-qrcode/esm/index.js +++ /dev/null @@ -1,6 +0,0 @@ -export { Html5Qrcode } from "./html5-qrcode"; -export { Html5QrcodeScanner } from "./html5-qrcode-scanner"; -export { Html5QrcodeSupportedFormats } from "./core"; -export { Html5QrcodeScannerState } from "./state-manager"; -export { Html5QrcodeScanType } from "./core"; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/index.js.map b/node_modules/html5-qrcode/esm/index.js.map deleted file mode 100644 index 8eede83..0000000 --- a/node_modules/html5-qrcode/esm/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,EACH,WAAW,EAGd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EACH,2BAA2B,EAI9B,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/native-bar-code-detector.d.ts b/node_modules/html5-qrcode/esm/native-bar-code-detector.d.ts deleted file mode 100644 index 85ef95e..0000000 --- a/node_modules/html5-qrcode/esm/native-bar-code-detector.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { QrcodeResult, Html5QrcodeSupportedFormats, QrcodeDecoderAsync, Logger } from "./core"; -export declare class BarcodeDetectorDelegate implements QrcodeDecoderAsync { - private readonly formatMap; - private readonly reverseFormatMap; - private verbose; - private logger; - private detector; - static isSupported(): boolean; - constructor(requestedFormats: Array, verbose: boolean, logger: Logger); - decodeAsync(canvas: HTMLCanvasElement): Promise; - private selectLargestBarcode; - private createBarcodeDetectorFormats; - private toHtml5QrcodeSupportedFormats; - private createReverseFormatMap; - private createDebugData; -} diff --git a/node_modules/html5-qrcode/esm/native-bar-code-detector.js b/node_modules/html5-qrcode/esm/native-bar-code-detector.js deleted file mode 100644 index 5760e30..0000000 --- a/node_modules/html5-qrcode/esm/native-bar-code-detector.js +++ /dev/null @@ -1,145 +0,0 @@ -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (g && (g = 0, op[0] && (_ = 0)), _) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -import { QrcodeResultFormat, Html5QrcodeSupportedFormats } from "./core"; -var BarcodeDetectorDelegate = (function () { - function BarcodeDetectorDelegate(requestedFormats, verbose, logger) { - this.formatMap = new Map([ - [Html5QrcodeSupportedFormats.QR_CODE, "qr_code"], - [Html5QrcodeSupportedFormats.AZTEC, "aztec"], - [Html5QrcodeSupportedFormats.CODABAR, "codabar"], - [Html5QrcodeSupportedFormats.CODE_39, "code_39"], - [Html5QrcodeSupportedFormats.CODE_93, "code_93"], - [Html5QrcodeSupportedFormats.CODE_128, "code_128"], - [Html5QrcodeSupportedFormats.DATA_MATRIX, "data_matrix"], - [Html5QrcodeSupportedFormats.ITF, "itf"], - [Html5QrcodeSupportedFormats.EAN_13, "ean_13"], - [Html5QrcodeSupportedFormats.EAN_8, "ean_8"], - [Html5QrcodeSupportedFormats.PDF_417, "pdf417"], - [Html5QrcodeSupportedFormats.UPC_A, "upc_a"], - [Html5QrcodeSupportedFormats.UPC_E, "upc_e"] - ]); - this.reverseFormatMap = this.createReverseFormatMap(); - if (!BarcodeDetectorDelegate.isSupported()) { - throw "Use html5qrcode.min.js without edit, Use " - + "BarcodeDetectorDelegate only if it isSupported();"; - } - this.verbose = verbose; - this.logger = logger; - var formats = this.createBarcodeDetectorFormats(requestedFormats); - this.detector = new BarcodeDetector(formats); - if (!this.detector) { - throw "BarcodeDetector detector not supported"; - } - } - BarcodeDetectorDelegate.isSupported = function () { - if (!("BarcodeDetector" in window)) { - return false; - } - var dummyDetector = new BarcodeDetector({ formats: ["qr_code"] }); - return typeof dummyDetector !== "undefined"; - }; - BarcodeDetectorDelegate.prototype.decodeAsync = function (canvas) { - return __awaiter(this, void 0, void 0, function () { - var barcodes, largestBarcode; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4, this.detector.detect(canvas)]; - case 1: - barcodes = _a.sent(); - if (!barcodes || barcodes.length === 0) { - throw "No barcode or QR code detected."; - } - largestBarcode = this.selectLargestBarcode(barcodes); - return [2, { - text: largestBarcode.rawValue, - format: QrcodeResultFormat.create(this.toHtml5QrcodeSupportedFormats(largestBarcode.format)), - debugData: this.createDebugData() - }]; - } - }); - }); - }; - BarcodeDetectorDelegate.prototype.selectLargestBarcode = function (barcodes) { - var largestBarcode = null; - var maxArea = 0; - for (var _i = 0, barcodes_1 = barcodes; _i < barcodes_1.length; _i++) { - var barcode = barcodes_1[_i]; - var area = barcode.boundingBox.width * barcode.boundingBox.height; - if (area > maxArea) { - maxArea = area; - largestBarcode = barcode; - } - } - if (!largestBarcode) { - throw "No largest barcode found"; - } - return largestBarcode; - }; - BarcodeDetectorDelegate.prototype.createBarcodeDetectorFormats = function (requestedFormats) { - var formats = []; - for (var _i = 0, requestedFormats_1 = requestedFormats; _i < requestedFormats_1.length; _i++) { - var requestedFormat = requestedFormats_1[_i]; - if (this.formatMap.has(requestedFormat)) { - formats.push(this.formatMap.get(requestedFormat)); - } - else { - this.logger.warn("".concat(requestedFormat, " is not supported by") - + "BarcodeDetectorDelegate"); - } - } - return { formats: formats }; - }; - BarcodeDetectorDelegate.prototype.toHtml5QrcodeSupportedFormats = function (barcodeDetectorFormat) { - if (!this.reverseFormatMap.has(barcodeDetectorFormat)) { - throw "reverseFormatMap doesn't have ".concat(barcodeDetectorFormat); - } - return this.reverseFormatMap.get(barcodeDetectorFormat); - }; - BarcodeDetectorDelegate.prototype.createReverseFormatMap = function () { - var result = new Map(); - this.formatMap.forEach(function (value, key, _) { - result.set(value, key); - }); - return result; - }; - BarcodeDetectorDelegate.prototype.createDebugData = function () { - return { decoderName: "BarcodeDetector" }; - }; - return BarcodeDetectorDelegate; -}()); -export { BarcodeDetectorDelegate }; -//# sourceMappingURL=native-bar-code-detector.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/native-bar-code-detector.js.map b/node_modules/html5-qrcode/esm/native-bar-code-detector.js.map deleted file mode 100644 index 08a79f3..0000000 --- a/node_modules/html5-qrcode/esm/native-bar-code-detector.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"native-bar-code-detector.js","sourceRoot":"","sources":["../../src/native-bar-code-detector.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,OAAO,EAGH,kBAAkB,EAClB,2BAA2B,EAG9B,MAAM,QAAQ,CAAC;AA4Cf;IA4CG,iCACI,gBAAoD,EACpD,OAAgB,EAChB,MAAc;QA3CD,cAAS,GACpB,IAAI,GAAG,CAAC;YACN,CAAE,2BAA2B,CAAC,OAAO,EAAE,SAAS,CAAE;YAClD,CAAE,2BAA2B,CAAC,KAAK,EAAE,OAAO,CAAE;YAC9C,CAAE,2BAA2B,CAAC,OAAO,EAAE,SAAS,CAAE;YAClD,CAAE,2BAA2B,CAAC,OAAO,EAAE,SAAS,CAAE;YAClD,CAAE,2BAA2B,CAAC,OAAO,EAAE,SAAS,CAAE;YAClD,CAAE,2BAA2B,CAAC,QAAQ,EAAE,UAAU,CAAE;YACpD,CAAE,2BAA2B,CAAC,WAAW,EAAG,aAAa,CAAE;YAC3D,CAAE,2BAA2B,CAAC,GAAG,EAAE,KAAK,CAAE;YAC1C,CAAE,2BAA2B,CAAC,MAAM,EAAE,QAAQ,CAAE;YAChD,CAAE,2BAA2B,CAAC,KAAK,EAAE,OAAO,CAAE;YAC9C,CAAE,2BAA2B,CAAC,OAAO,EAAE,QAAQ,CAAE;YACjD,CAAE,2BAA2B,CAAC,KAAK,EAAE,OAAO,CAAE;YAC9C,CAAE,2BAA2B,CAAC,KAAK,EAAE,OAAO,CAAE;SACjD,CAAC,CAAC;QACU,qBAAgB,GAC3B,IAAI,CAAC,sBAAsB,EAAE,CAAC;QA2BhC,IAAI,CAAC,uBAAuB,CAAC,WAAW,EAAE,EAAE;YACxC,MAAM,2CAA2C;kBAC3C,mDAAmD,CAAC;SAC7D;QACD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAGrB,IAAM,OAAO,GAAG,IAAI,CAAC,4BAA4B,CAAC,gBAAgB,CAAC,CAAC;QACpE,IAAI,CAAC,QAAQ,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;QAG7C,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAChB,MAAM,wCAAwC,CAAC;SAClD;IACL,CAAC;IA3Ba,mCAAW,GAAzB;QACI,IAAI,CAAC,CAAC,iBAAiB,IAAI,MAAM,CAAC,EAAE;YAChC,OAAO,KAAK,CAAC;SAChB;QACD,IAAM,aAAa,GAAG,IAAI,eAAe,CAAC,EAAC,OAAO,EAAE,CAAE,SAAS,CAAE,EAAC,CAAC,CAAC;QACpE,OAAO,OAAO,aAAa,KAAK,WAAW,CAAC;IAChD,CAAC;IAuBK,6CAAW,GAAjB,UAAkB,MAAyB;;;;;4BAEjC,WAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAA;;wBADlC,QAAQ,GACR,SAAkC;wBACxC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;4BACpC,MAAM,iCAAiC,CAAC;yBAC3C;wBAOG,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;wBACzD,WAAO;gCACH,IAAI,EAAE,cAAc,CAAC,QAAQ;gCAC7B,MAAM,EAAE,kBAAkB,CAAC,MAAM,CAC7B,IAAI,CAAC,6BAA6B,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;gCAC9D,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE;6BACpC,EAAC;;;;KACL;IAEO,sDAAoB,GAA5B,UAA6B,QAAsC;QAE/D,IAAI,cAAc,GAAiC,IAAI,CAAC;QACxD,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAoB,UAAQ,EAAR,qBAAQ,EAAR,sBAAQ,EAAR,IAAQ,EAAE;YAAzB,IAAI,OAAO,iBAAA;YACZ,IAAI,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC;YAClE,IAAI,IAAI,GAAG,OAAO,EAAE;gBAChB,OAAO,GAAG,IAAI,CAAC;gBACf,cAAc,GAAG,OAAO,CAAC;aAC5B;SACJ;QACD,IAAI,CAAC,cAAc,EAAE;YACjB,MAAM,0BAA0B,CAAC;SACpC;QACD,OAAO,cAAe,CAAC;IAC3B,CAAC;IAEO,8DAA4B,GAApC,UACI,gBAAoD;QAEhD,IAAI,OAAO,GAAkB,EAAE,CAAC;QAChC,KAA8B,UAAgB,EAAhB,qCAAgB,EAAhB,8BAAgB,EAAhB,IAAgB,EAAE;YAA3C,IAAM,eAAe,yBAAA;YACtB,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE;gBACrC,OAAO,CAAC,IAAI,CACR,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAE,CAAC,CAAC;aAC7C;iBAAM;gBACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAG,eAAe,yBAAsB;sBACnD,yBAAyB,CAAC,CAAC;aACpC;SACJ;QACD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IACpC,CAAC;IAEO,+DAA6B,GAArC,UAAsC,qBAA6B;QAE/D,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE;YACnD,MAAM,wCAAiC,qBAAqB,CAAE,CAAC;SAClE;QACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,qBAAqB,CAAE,CAAC;IAC7D,CAAC;IAEO,wDAAsB,GAA9B;QACI,IAAI,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,SAAS,CAAC,OAAO,CAClB,UAAC,KAAa,EAAE,GAAgC,EAAE,CAAC;YACnD,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAClB,CAAC;IAEO,iDAAe,GAAvB;QACI,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC;IAC9C,CAAC;IACL,8BAAC;AAAD,CAAC,AA3IA,IA2IA"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/state-manager.d.ts b/node_modules/html5-qrcode/esm/state-manager.d.ts deleted file mode 100644 index 1c740bb..0000000 --- a/node_modules/html5-qrcode/esm/state-manager.d.ts +++ /dev/null @@ -1,29 +0,0 @@ -export declare enum Html5QrcodeScannerState { - UNKNOWN = 0, - NOT_STARTED = 1, - SCANNING = 2, - PAUSED = 3 -} -export interface StateManagerTransaction { - execute(): void; - cancel(): void; -} -export interface StateManager { - startTransition(newState: Html5QrcodeScannerState): StateManagerTransaction; - directTransition(newState: Html5QrcodeScannerState): void; - getState(): Html5QrcodeScannerState; -} -export declare class StateManagerProxy { - private stateManager; - constructor(stateManager: StateManager); - startTransition(newState: Html5QrcodeScannerState): StateManagerTransaction; - directTransition(newState: Html5QrcodeScannerState): void; - getState(): Html5QrcodeScannerState; - canScanFile(): boolean; - isScanning(): boolean; - isStrictlyScanning(): boolean; - isPaused(): boolean; -} -export declare class StateManagerFactory { - static create(): StateManagerProxy; -} diff --git a/node_modules/html5-qrcode/esm/state-manager.js b/node_modules/html5-qrcode/esm/state-manager.js deleted file mode 100644 index 71a71d4..0000000 --- a/node_modules/html5-qrcode/esm/state-manager.js +++ /dev/null @@ -1,109 +0,0 @@ -export var Html5QrcodeScannerState; -(function (Html5QrcodeScannerState) { - Html5QrcodeScannerState[Html5QrcodeScannerState["UNKNOWN"] = 0] = "UNKNOWN"; - Html5QrcodeScannerState[Html5QrcodeScannerState["NOT_STARTED"] = 1] = "NOT_STARTED"; - Html5QrcodeScannerState[Html5QrcodeScannerState["SCANNING"] = 2] = "SCANNING"; - Html5QrcodeScannerState[Html5QrcodeScannerState["PAUSED"] = 3] = "PAUSED"; -})(Html5QrcodeScannerState || (Html5QrcodeScannerState = {})); -var StateManagerImpl = (function () { - function StateManagerImpl() { - this.state = Html5QrcodeScannerState.NOT_STARTED; - this.onGoingTransactionNewState = Html5QrcodeScannerState.UNKNOWN; - } - StateManagerImpl.prototype.directTransition = function (newState) { - this.failIfTransitionOngoing(); - this.validateTransition(newState); - this.state = newState; - }; - StateManagerImpl.prototype.startTransition = function (newState) { - this.failIfTransitionOngoing(); - this.validateTransition(newState); - this.onGoingTransactionNewState = newState; - return this; - }; - StateManagerImpl.prototype.execute = function () { - if (this.onGoingTransactionNewState - === Html5QrcodeScannerState.UNKNOWN) { - throw "Transaction is already cancelled, cannot execute()."; - } - var tempNewState = this.onGoingTransactionNewState; - this.onGoingTransactionNewState = Html5QrcodeScannerState.UNKNOWN; - this.directTransition(tempNewState); - }; - StateManagerImpl.prototype.cancel = function () { - if (this.onGoingTransactionNewState - === Html5QrcodeScannerState.UNKNOWN) { - throw "Transaction is already cancelled, cannot cancel()."; - } - this.onGoingTransactionNewState = Html5QrcodeScannerState.UNKNOWN; - }; - StateManagerImpl.prototype.getState = function () { - return this.state; - }; - StateManagerImpl.prototype.failIfTransitionOngoing = function () { - if (this.onGoingTransactionNewState - !== Html5QrcodeScannerState.UNKNOWN) { - throw "Cannot transition to a new state, already under transition"; - } - }; - StateManagerImpl.prototype.validateTransition = function (newState) { - switch (this.state) { - case Html5QrcodeScannerState.UNKNOWN: - throw "Transition from unknown is not allowed"; - case Html5QrcodeScannerState.NOT_STARTED: - this.failIfNewStateIs(newState, [Html5QrcodeScannerState.PAUSED]); - break; - case Html5QrcodeScannerState.SCANNING: - break; - case Html5QrcodeScannerState.PAUSED: - break; - } - }; - StateManagerImpl.prototype.failIfNewStateIs = function (newState, disallowedStatesToTransition) { - for (var _i = 0, disallowedStatesToTransition_1 = disallowedStatesToTransition; _i < disallowedStatesToTransition_1.length; _i++) { - var disallowedState = disallowedStatesToTransition_1[_i]; - if (newState === disallowedState) { - throw "Cannot transition from ".concat(this.state, " to ").concat(newState); - } - } - }; - return StateManagerImpl; -}()); -var StateManagerProxy = (function () { - function StateManagerProxy(stateManager) { - this.stateManager = stateManager; - } - StateManagerProxy.prototype.startTransition = function (newState) { - return this.stateManager.startTransition(newState); - }; - StateManagerProxy.prototype.directTransition = function (newState) { - this.stateManager.directTransition(newState); - }; - StateManagerProxy.prototype.getState = function () { - return this.stateManager.getState(); - }; - StateManagerProxy.prototype.canScanFile = function () { - return this.stateManager.getState() === Html5QrcodeScannerState.NOT_STARTED; - }; - StateManagerProxy.prototype.isScanning = function () { - return this.stateManager.getState() !== Html5QrcodeScannerState.NOT_STARTED; - }; - StateManagerProxy.prototype.isStrictlyScanning = function () { - return this.stateManager.getState() === Html5QrcodeScannerState.SCANNING; - }; - StateManagerProxy.prototype.isPaused = function () { - return this.stateManager.getState() === Html5QrcodeScannerState.PAUSED; - }; - return StateManagerProxy; -}()); -export { StateManagerProxy }; -var StateManagerFactory = (function () { - function StateManagerFactory() { - } - StateManagerFactory.create = function () { - return new StateManagerProxy(new StateManagerImpl()); - }; - return StateManagerFactory; -}()); -export { StateManagerFactory }; -//# sourceMappingURL=state-manager.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/state-manager.js.map b/node_modules/html5-qrcode/esm/state-manager.js.map deleted file mode 100644 index b1ebd19..0000000 --- a/node_modules/html5-qrcode/esm/state-manager.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"state-manager.js","sourceRoot":"","sources":["../../src/state-manager.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/storage.d.ts b/node_modules/html5-qrcode/esm/storage.d.ts deleted file mode 100644 index cae73a3..0000000 --- a/node_modules/html5-qrcode/esm/storage.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -export declare class PersistedDataManager { - private data; - private static LOCAL_STORAGE_KEY; - constructor(); - hasCameraPermissions(): boolean; - getLastUsedCameraId(): string | null; - setHasPermission(hasPermission: boolean): void; - setLastUsedCameraId(lastUsedCameraId: string): void; - resetLastUsedCameraId(): void; - reset(): void; - private flush; -} diff --git a/node_modules/html5-qrcode/esm/storage.js b/node_modules/html5-qrcode/esm/storage.js deleted file mode 100644 index 9d2215e..0000000 --- a/node_modules/html5-qrcode/esm/storage.js +++ /dev/null @@ -1,52 +0,0 @@ -var PersistedDataFactory = (function () { - function PersistedDataFactory() { - } - PersistedDataFactory.createDefault = function () { - return { - hasPermission: false, - lastUsedCameraId: null - }; - }; - return PersistedDataFactory; -}()); -var PersistedDataManager = (function () { - function PersistedDataManager() { - this.data = PersistedDataFactory.createDefault(); - var data = localStorage.getItem(PersistedDataManager.LOCAL_STORAGE_KEY); - if (!data) { - this.reset(); - } - else { - this.data = JSON.parse(data); - } - } - PersistedDataManager.prototype.hasCameraPermissions = function () { - return this.data.hasPermission; - }; - PersistedDataManager.prototype.getLastUsedCameraId = function () { - return this.data.lastUsedCameraId; - }; - PersistedDataManager.prototype.setHasPermission = function (hasPermission) { - this.data.hasPermission = hasPermission; - this.flush(); - }; - PersistedDataManager.prototype.setLastUsedCameraId = function (lastUsedCameraId) { - this.data.lastUsedCameraId = lastUsedCameraId; - this.flush(); - }; - PersistedDataManager.prototype.resetLastUsedCameraId = function () { - this.data.lastUsedCameraId = null; - this.flush(); - }; - PersistedDataManager.prototype.reset = function () { - this.data = PersistedDataFactory.createDefault(); - this.flush(); - }; - PersistedDataManager.prototype.flush = function () { - localStorage.setItem(PersistedDataManager.LOCAL_STORAGE_KEY, JSON.stringify(this.data)); - }; - PersistedDataManager.LOCAL_STORAGE_KEY = "HTML5_QRCODE_DATA"; - return PersistedDataManager; -}()); -export { PersistedDataManager }; -//# sourceMappingURL=storage.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/storage.js.map b/node_modules/html5-qrcode/esm/storage.js.map deleted file mode 100644 index c4571a8..0000000 --- a/node_modules/html5-qrcode/esm/storage.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/storage.ts"],"names":[],"mappings":"AAeA;IAAA;IAOA,CAAC;IANU,kCAAa,GAApB;QACI,OAAO;YACH,aAAa,EAAE,KAAK;YACpB,gBAAgB,EAAE,IAAI;SACzB,CAAC;IACN,CAAC;IACL,2BAAC;AAAD,CAAC,AAPD,IAOC;AAED;IAKI;QAHQ,SAAI,GAAkB,oBAAoB,CAAC,aAAa,EAAE,CAAC;QAI/D,IAAI,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;QACxE,IAAI,CAAC,IAAI,EAAE;YACP,IAAI,CAAC,KAAK,EAAE,CAAC;SAChB;aAAM;YACH,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SAChC;IACL,CAAC;IAEM,mDAAoB,GAA3B;QACI,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;IACnC,CAAC;IAEM,kDAAmB,GAA1B;QACI,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC;IACtC,CAAC;IAEM,+CAAgB,GAAvB,UAAwB,aAAsB;QAC1C,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACxC,IAAI,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;IAEM,kDAAmB,GAA1B,UAA2B,gBAAwB;QAC/C,IAAI,CAAC,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;IAEM,oDAAqB,GAA5B;QACI,IAAI,CAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAClC,IAAI,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;IAEM,oCAAK,GAAZ;QACI,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC,aAAa,EAAE,CAAC;QACjD,IAAI,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;IAEO,oCAAK,GAAb;QACI,YAAY,CAAC,OAAO,CAChB,oBAAoB,CAAC,iBAAiB,EACtC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACnC,CAAC;IA3Cc,sCAAiB,GAAW,mBAAmB,CAAC;IA4CnE,2BAAC;CAAA,AA/CD,IA+CC;SA/CY,oBAAoB"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/strings.d.ts b/node_modules/html5-qrcode/esm/strings.d.ts deleted file mode 100644 index bb99f90..0000000 --- a/node_modules/html5-qrcode/esm/strings.d.ts +++ /dev/null @@ -1,45 +0,0 @@ -export declare class Html5QrcodeStrings { - static codeParseError(exception: any): string; - static errorGettingUserMedia(error: any): string; - static onlyDeviceSupportedError(): string; - static cameraStreamingNotSupported(): string; - static unableToQuerySupportedDevices(): string; - static insecureContextCameraQueryError(): string; - static scannerPaused(): string; -} -export declare class Html5QrcodeScannerStrings { - static scanningStatus(): string; - static idleStatus(): string; - static errorStatus(): string; - static permissionStatus(): string; - static noCameraFoundErrorStatus(): string; - static lastMatch(decodedText: string): string; - static codeScannerTitle(): string; - static cameraPermissionTitle(): string; - static cameraPermissionRequesting(): string; - static noCameraFound(): string; - static scanButtonStopScanningText(): string; - static scanButtonStartScanningText(): string; - static torchOnButton(): string; - static torchOffButton(): string; - static torchOnFailedMessage(): string; - static torchOffFailedMessage(): string; - static scanButtonScanningStarting(): string; - static textIfCameraScanSelected(): string; - static textIfFileScanSelected(): string; - static selectCamera(): string; - static fileSelectionChooseImage(): string; - static fileSelectionChooseAnother(): string; - static fileSelectionNoImageSelected(): string; - static anonymousCameraPrefix(): string; - static dragAndDropMessage(): string; - static dragAndDropMessageOnlyImages(): string; - static zoom(): string; - static loadingImage(): string; - static cameraScanAltText(): string; - static fileScanAltText(): string; -} -export declare class LibraryInfoStrings { - static poweredBy(): string; - static reportIssues(): string; -} diff --git a/node_modules/html5-qrcode/esm/strings.js b/node_modules/html5-qrcode/esm/strings.js deleted file mode 100644 index 6840a7f..0000000 --- a/node_modules/html5-qrcode/esm/strings.js +++ /dev/null @@ -1,139 +0,0 @@ -var Html5QrcodeStrings = (function () { - function Html5QrcodeStrings() { - } - Html5QrcodeStrings.codeParseError = function (exception) { - return "QR code parse error, error = ".concat(exception); - }; - Html5QrcodeStrings.errorGettingUserMedia = function (error) { - return "Error getting userMedia, error = ".concat(error); - }; - Html5QrcodeStrings.onlyDeviceSupportedError = function () { - return "The device doesn't support navigator.mediaDevices , only " - + "supported cameraIdOrConfig in this case is deviceId parameter " - + "(string)."; - }; - Html5QrcodeStrings.cameraStreamingNotSupported = function () { - return "Camera streaming not supported by the browser."; - }; - Html5QrcodeStrings.unableToQuerySupportedDevices = function () { - return "Unable to query supported devices, unknown error."; - }; - Html5QrcodeStrings.insecureContextCameraQueryError = function () { - return "Camera access is only supported in secure context like https " - + "or localhost."; - }; - Html5QrcodeStrings.scannerPaused = function () { - return "Scanner paused"; - }; - return Html5QrcodeStrings; -}()); -export { Html5QrcodeStrings }; -var Html5QrcodeScannerStrings = (function () { - function Html5QrcodeScannerStrings() { - } - Html5QrcodeScannerStrings.scanningStatus = function () { - return "Scanning"; - }; - Html5QrcodeScannerStrings.idleStatus = function () { - return "Idle"; - }; - Html5QrcodeScannerStrings.errorStatus = function () { - return "Error"; - }; - Html5QrcodeScannerStrings.permissionStatus = function () { - return "Permission"; - }; - Html5QrcodeScannerStrings.noCameraFoundErrorStatus = function () { - return "No Cameras"; - }; - Html5QrcodeScannerStrings.lastMatch = function (decodedText) { - return "Last Match: ".concat(decodedText); - }; - Html5QrcodeScannerStrings.codeScannerTitle = function () { - return "Code Scanner"; - }; - Html5QrcodeScannerStrings.cameraPermissionTitle = function () { - return "Request Camera Permissions"; - }; - Html5QrcodeScannerStrings.cameraPermissionRequesting = function () { - return "Requesting camera permissions..."; - }; - Html5QrcodeScannerStrings.noCameraFound = function () { - return "No camera found"; - }; - Html5QrcodeScannerStrings.scanButtonStopScanningText = function () { - return "Stop Scanning"; - }; - Html5QrcodeScannerStrings.scanButtonStartScanningText = function () { - return "Start Scanning"; - }; - Html5QrcodeScannerStrings.torchOnButton = function () { - return "Switch On Torch"; - }; - Html5QrcodeScannerStrings.torchOffButton = function () { - return "Switch Off Torch"; - }; - Html5QrcodeScannerStrings.torchOnFailedMessage = function () { - return "Failed to turn on torch"; - }; - Html5QrcodeScannerStrings.torchOffFailedMessage = function () { - return "Failed to turn off torch"; - }; - Html5QrcodeScannerStrings.scanButtonScanningStarting = function () { - return "Launching Camera..."; - }; - Html5QrcodeScannerStrings.textIfCameraScanSelected = function () { - return "Scan an Image File"; - }; - Html5QrcodeScannerStrings.textIfFileScanSelected = function () { - return "Scan using camera directly"; - }; - Html5QrcodeScannerStrings.selectCamera = function () { - return "Select Camera"; - }; - Html5QrcodeScannerStrings.fileSelectionChooseImage = function () { - return "Choose Image"; - }; - Html5QrcodeScannerStrings.fileSelectionChooseAnother = function () { - return "Choose Another"; - }; - Html5QrcodeScannerStrings.fileSelectionNoImageSelected = function () { - return "No image choosen"; - }; - Html5QrcodeScannerStrings.anonymousCameraPrefix = function () { - return "Anonymous Camera"; - }; - Html5QrcodeScannerStrings.dragAndDropMessage = function () { - return "Or drop an image to scan"; - }; - Html5QrcodeScannerStrings.dragAndDropMessageOnlyImages = function () { - return "Or drop an image to scan (other files not supported)"; - }; - Html5QrcodeScannerStrings.zoom = function () { - return "zoom"; - }; - Html5QrcodeScannerStrings.loadingImage = function () { - return "Loading image..."; - }; - Html5QrcodeScannerStrings.cameraScanAltText = function () { - return "Camera based scan"; - }; - Html5QrcodeScannerStrings.fileScanAltText = function () { - return "Fule based scan"; - }; - return Html5QrcodeScannerStrings; -}()); -export { Html5QrcodeScannerStrings }; -var LibraryInfoStrings = (function () { - function LibraryInfoStrings() { - } - LibraryInfoStrings.poweredBy = function () { - return "Powered by "; - }; - LibraryInfoStrings.reportIssues = function () { - return "Report issues"; - }; - return LibraryInfoStrings; -}()); -export { LibraryInfoStrings }; -//# sourceMappingURL=strings.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/strings.js.map b/node_modules/html5-qrcode/esm/strings.js.map deleted file mode 100644 index 05f81c5..0000000 --- a/node_modules/html5-qrcode/esm/strings.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"strings.js","sourceRoot":"","sources":["../../src/strings.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/ui.d.ts b/node_modules/html5-qrcode/esm/ui.d.ts deleted file mode 100644 index 5f03fe9..0000000 --- a/node_modules/html5-qrcode/esm/ui.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -export declare class LibraryInfoContainer { - private infoDiv; - private infoIcon; - constructor(); - renderInto(parent: HTMLElement): void; -} diff --git a/node_modules/html5-qrcode/esm/ui.js b/node_modules/html5-qrcode/esm/ui.js deleted file mode 100644 index 663072b..0000000 --- a/node_modules/html5-qrcode/esm/ui.js +++ /dev/null @@ -1,115 +0,0 @@ -import { ASSET_CLOSE_ICON_16PX, ASSET_INFO_ICON_16PX } from "./image-assets"; -import { LibraryInfoStrings } from "./strings"; -var LibraryInfoDiv = (function () { - function LibraryInfoDiv() { - this.infoDiv = document.createElement("div"); - } - LibraryInfoDiv.prototype.renderInto = function (parent) { - this.infoDiv.style.position = "absolute"; - this.infoDiv.style.top = "10px"; - this.infoDiv.style.right = "10px"; - this.infoDiv.style.zIndex = "2"; - this.infoDiv.style.display = "none"; - this.infoDiv.style.padding = "5pt"; - this.infoDiv.style.border = "1px solid #171717"; - this.infoDiv.style.fontSize = "10pt"; - this.infoDiv.style.background = "rgb(0 0 0 / 69%)"; - this.infoDiv.style.borderRadius = "5px"; - this.infoDiv.style.textAlign = "center"; - this.infoDiv.style.fontWeight = "400"; - this.infoDiv.style.color = "white"; - this.infoDiv.innerText = LibraryInfoStrings.poweredBy(); - var projectLink = document.createElement("a"); - projectLink.innerText = "ScanApp"; - projectLink.href = "https://scanapp.org"; - projectLink.target = "new"; - projectLink.style.color = "white"; - this.infoDiv.appendChild(projectLink); - var breakElemFirst = document.createElement("br"); - var breakElemSecond = document.createElement("br"); - this.infoDiv.appendChild(breakElemFirst); - this.infoDiv.appendChild(breakElemSecond); - var reportIssueLink = document.createElement("a"); - reportIssueLink.innerText = LibraryInfoStrings.reportIssues(); - reportIssueLink.href = "https://github.com/mebjas/html5-qrcode/issues"; - reportIssueLink.target = "new"; - reportIssueLink.style.color = "white"; - this.infoDiv.appendChild(reportIssueLink); - parent.appendChild(this.infoDiv); - }; - LibraryInfoDiv.prototype.show = function () { - this.infoDiv.style.display = "block"; - }; - LibraryInfoDiv.prototype.hide = function () { - this.infoDiv.style.display = "none"; - }; - return LibraryInfoDiv; -}()); -var LibraryInfoIcon = (function () { - function LibraryInfoIcon(onTapIn, onTapOut) { - this.isShowingInfoIcon = true; - this.onTapIn = onTapIn; - this.onTapOut = onTapOut; - this.infoIcon = document.createElement("img"); - } - LibraryInfoIcon.prototype.renderInto = function (parent) { - var _this = this; - this.infoIcon.alt = "Info icon"; - this.infoIcon.src = ASSET_INFO_ICON_16PX; - this.infoIcon.style.position = "absolute"; - this.infoIcon.style.top = "4px"; - this.infoIcon.style.right = "4px"; - this.infoIcon.style.opacity = "0.6"; - this.infoIcon.style.cursor = "pointer"; - this.infoIcon.style.zIndex = "2"; - this.infoIcon.style.width = "16px"; - this.infoIcon.style.height = "16px"; - this.infoIcon.onmouseover = function (_) { return _this.onHoverIn(); }; - this.infoIcon.onmouseout = function (_) { return _this.onHoverOut(); }; - this.infoIcon.onclick = function (_) { return _this.onClick(); }; - parent.appendChild(this.infoIcon); - }; - LibraryInfoIcon.prototype.onHoverIn = function () { - if (this.isShowingInfoIcon) { - this.infoIcon.style.opacity = "1"; - } - }; - LibraryInfoIcon.prototype.onHoverOut = function () { - if (this.isShowingInfoIcon) { - this.infoIcon.style.opacity = "0.6"; - } - }; - LibraryInfoIcon.prototype.onClick = function () { - if (this.isShowingInfoIcon) { - this.isShowingInfoIcon = false; - this.onTapIn(); - this.infoIcon.src = ASSET_CLOSE_ICON_16PX; - this.infoIcon.style.opacity = "1"; - } - else { - this.isShowingInfoIcon = true; - this.onTapOut(); - this.infoIcon.src = ASSET_INFO_ICON_16PX; - this.infoIcon.style.opacity = "0.6"; - } - }; - return LibraryInfoIcon; -}()); -var LibraryInfoContainer = (function () { - function LibraryInfoContainer() { - var _this = this; - this.infoDiv = new LibraryInfoDiv(); - this.infoIcon = new LibraryInfoIcon(function () { - _this.infoDiv.show(); - }, function () { - _this.infoDiv.hide(); - }); - } - LibraryInfoContainer.prototype.renderInto = function (parent) { - this.infoDiv.renderInto(parent); - this.infoIcon.renderInto(parent); - }; - return LibraryInfoContainer; -}()); -export { LibraryInfoContainer }; -//# sourceMappingURL=ui.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/ui.js.map b/node_modules/html5-qrcode/esm/ui.js.map deleted file mode 100644 index 9a5f977..0000000 --- a/node_modules/html5-qrcode/esm/ui.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/ui.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/ui/scanner/base.d.ts b/node_modules/html5-qrcode/esm/ui/scanner/base.d.ts deleted file mode 100644 index 1f6ba9c..0000000 --- a/node_modules/html5-qrcode/esm/ui/scanner/base.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -export declare class PublicUiElementIdAndClasses { - static ALL_ELEMENT_CLASS: string; - static CAMERA_PERMISSION_BUTTON_ID: string; - static CAMERA_START_BUTTON_ID: string; - static CAMERA_STOP_BUTTON_ID: string; - static TORCH_BUTTON_ID: string; - static CAMERA_SELECTION_SELECT_ID: string; - static FILE_SELECTION_BUTTON_ID: string; - static ZOOM_SLIDER_ID: string; - static SCAN_TYPE_CHANGE_ANCHOR_ID: string; - static TORCH_BUTTON_CLASS_TORCH_ON: string; - static TORCH_BUTTON_CLASS_TORCH_OFF: string; -} -export declare class BaseUiElementFactory { - static createElement(elementType: string, elementId: string): Type; -} diff --git a/node_modules/html5-qrcode/esm/ui/scanner/base.js b/node_modules/html5-qrcode/esm/ui/scanner/base.js deleted file mode 100644 index ed15484..0000000 --- a/node_modules/html5-qrcode/esm/ui/scanner/base.js +++ /dev/null @@ -1,33 +0,0 @@ -var PublicUiElementIdAndClasses = (function () { - function PublicUiElementIdAndClasses() { - } - PublicUiElementIdAndClasses.ALL_ELEMENT_CLASS = "html5-qrcode-element"; - PublicUiElementIdAndClasses.CAMERA_PERMISSION_BUTTON_ID = "html5-qrcode-button-camera-permission"; - PublicUiElementIdAndClasses.CAMERA_START_BUTTON_ID = "html5-qrcode-button-camera-start"; - PublicUiElementIdAndClasses.CAMERA_STOP_BUTTON_ID = "html5-qrcode-button-camera-stop"; - PublicUiElementIdAndClasses.TORCH_BUTTON_ID = "html5-qrcode-button-torch"; - PublicUiElementIdAndClasses.CAMERA_SELECTION_SELECT_ID = "html5-qrcode-select-camera"; - PublicUiElementIdAndClasses.FILE_SELECTION_BUTTON_ID = "html5-qrcode-button-file-selection"; - PublicUiElementIdAndClasses.ZOOM_SLIDER_ID = "html5-qrcode-input-range-zoom"; - PublicUiElementIdAndClasses.SCAN_TYPE_CHANGE_ANCHOR_ID = "html5-qrcode-anchor-scan-type-change"; - PublicUiElementIdAndClasses.TORCH_BUTTON_CLASS_TORCH_ON = "html5-qrcode-button-torch-on"; - PublicUiElementIdAndClasses.TORCH_BUTTON_CLASS_TORCH_OFF = "html5-qrcode-button-torch-off"; - return PublicUiElementIdAndClasses; -}()); -export { PublicUiElementIdAndClasses }; -var BaseUiElementFactory = (function () { - function BaseUiElementFactory() { - } - BaseUiElementFactory.createElement = function (elementType, elementId) { - var element = (document.createElement(elementType)); - element.id = elementId; - element.classList.add(PublicUiElementIdAndClasses.ALL_ELEMENT_CLASS); - if (elementType === "button") { - element.setAttribute("type", "button"); - } - return element; - }; - return BaseUiElementFactory; -}()); -export { BaseUiElementFactory }; -//# sourceMappingURL=base.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/ui/scanner/base.js.map b/node_modules/html5-qrcode/esm/ui/scanner/base.js.map deleted file mode 100644 index ab784a0..0000000 --- a/node_modules/html5-qrcode/esm/ui/scanner/base.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../src/ui/scanner/base.ts"],"names":[],"mappings":"AAcA;IAAA;IA4CA,CAAC;IAxCU,6CAAiB,GAAG,sBAAsB,CAAC;IAG3C,uDAA2B,GAAG,uCAAuC,CAAC;IAGtE,kDAAsB,GAAG,kCAAkC,CAAC;IAG5D,iDAAqB,GAAG,iCAAiC,CAAC;IAG1D,2CAAe,GAAG,2BAA2B,CAAC;IAG9C,sDAA0B,GAAG,4BAA4B,CAAC;IAG1D,oDAAwB,GAAG,oCAAoC,CAAC;IAGhE,0CAAc,GAAG,+BAA+B,CAAC;IAMjD,sDAA0B,GAAG,sCAAsC,CAAC;IAOpE,uDAA2B,GAAG,8BAA8B,CAAC;IAG7D,wDAA4B,GAAG,+BAA+B,CAAC;IAG1E,kCAAC;CAAA,AA5CD,IA4CC;SA5CY,2BAA2B;AAiDxC;IAAA;IAiBA,CAAC;IAXiB,kCAAa,GAA3B,UACI,WAAmB,EAAE,SAAiB;QAEtC,IAAI,OAAO,GAAe,CAAC,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC;QACvB,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,2BAA2B,CAAC,iBAAiB,CAAC,CAAC;QACrE,IAAI,WAAW,KAAK,QAAQ,EAAE;YAC1B,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;SAC1C;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IACL,2BAAC;AAAD,CAAC,AAjBD,IAiBC"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/ui/scanner/camera-selection-ui.d.ts b/node_modules/html5-qrcode/esm/ui/scanner/camera-selection-ui.d.ts deleted file mode 100644 index 2090ed5..0000000 --- a/node_modules/html5-qrcode/esm/ui/scanner/camera-selection-ui.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { CameraDevice } from "../../camera/core"; -export declare class CameraSelectionUi { - private readonly selectElement; - private readonly options; - private readonly cameras; - private constructor(); - private render; - disable(): void; - isDisabled(): boolean; - enable(): void; - getValue(): string; - hasValue(value: string): boolean; - setValue(value: string): void; - hasSingleItem(): boolean; - numCameras(): number; - static create(parentElement: HTMLElement, cameras: Array): CameraSelectionUi; -} diff --git a/node_modules/html5-qrcode/esm/ui/scanner/camera-selection-ui.js b/node_modules/html5-qrcode/esm/ui/scanner/camera-selection-ui.js deleted file mode 100644 index d5d422d..0000000 --- a/node_modules/html5-qrcode/esm/ui/scanner/camera-selection-ui.js +++ /dev/null @@ -1,86 +0,0 @@ -import { BaseUiElementFactory, PublicUiElementIdAndClasses } from "./base"; -import { Html5QrcodeScannerStrings } from "../../strings"; -var CameraSelectionUi = (function () { - function CameraSelectionUi(cameras) { - this.selectElement = BaseUiElementFactory - .createElement("select", PublicUiElementIdAndClasses.CAMERA_SELECTION_SELECT_ID); - this.cameras = cameras; - this.options = []; - } - CameraSelectionUi.prototype.render = function (parentElement) { - var cameraSelectionContainer = document.createElement("span"); - cameraSelectionContainer.style.marginRight = "10px"; - var numCameras = this.cameras.length; - if (numCameras === 0) { - throw new Error("No cameras found"); - } - if (numCameras === 1) { - cameraSelectionContainer.style.display = "none"; - } - else { - var selectCameraString = Html5QrcodeScannerStrings.selectCamera(); - cameraSelectionContainer.innerText - = "".concat(selectCameraString, " (").concat(this.cameras.length, ") "); - } - var anonymousCameraId = 1; - for (var _i = 0, _a = this.cameras; _i < _a.length; _i++) { - var camera = _a[_i]; - var value = camera.id; - var name_1 = camera.label == null ? value : camera.label; - if (!name_1 || name_1 === "") { - name_1 = [ - Html5QrcodeScannerStrings.anonymousCameraPrefix(), - anonymousCameraId++ - ].join(" "); - } - var option = document.createElement("option"); - option.value = value; - option.innerText = name_1; - this.options.push(option); - this.selectElement.appendChild(option); - } - cameraSelectionContainer.appendChild(this.selectElement); - parentElement.appendChild(cameraSelectionContainer); - }; - CameraSelectionUi.prototype.disable = function () { - this.selectElement.disabled = true; - }; - CameraSelectionUi.prototype.isDisabled = function () { - return this.selectElement.disabled === true; - }; - CameraSelectionUi.prototype.enable = function () { - this.selectElement.disabled = false; - }; - CameraSelectionUi.prototype.getValue = function () { - return this.selectElement.value; - }; - CameraSelectionUi.prototype.hasValue = function (value) { - for (var _i = 0, _a = this.options; _i < _a.length; _i++) { - var option = _a[_i]; - if (option.value === value) { - return true; - } - } - return false; - }; - CameraSelectionUi.prototype.setValue = function (value) { - if (!this.hasValue(value)) { - throw new Error("".concat(value, " is not present in the camera list.")); - } - this.selectElement.value = value; - }; - CameraSelectionUi.prototype.hasSingleItem = function () { - return this.cameras.length === 1; - }; - CameraSelectionUi.prototype.numCameras = function () { - return this.cameras.length; - }; - CameraSelectionUi.create = function (parentElement, cameras) { - var cameraSelectUi = new CameraSelectionUi(cameras); - cameraSelectUi.render(parentElement); - return cameraSelectUi; - }; - return CameraSelectionUi; -}()); -export { CameraSelectionUi }; -//# sourceMappingURL=camera-selection-ui.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/ui/scanner/camera-selection-ui.js.map b/node_modules/html5-qrcode/esm/ui/scanner/camera-selection-ui.js.map deleted file mode 100644 index abda560..0000000 --- a/node_modules/html5-qrcode/esm/ui/scanner/camera-selection-ui.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"camera-selection-ui.js","sourceRoot":"","sources":["../../../../src/ui/scanner/camera-selection-ui.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/ui/scanner/camera-zoom-ui.d.ts b/node_modules/html5-qrcode/esm/ui/scanner/camera-zoom-ui.d.ts deleted file mode 100644 index 215bb3f..0000000 --- a/node_modules/html5-qrcode/esm/ui/scanner/camera-zoom-ui.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -export type OnCameraZoomValueChangeCallback = (zoomValue: number) => void; -export declare class CameraZoomUi { - private zoomElementContainer; - private rangeInput; - private rangeText; - private onChangeCallback; - private constructor(); - private render; - private onValueChange; - setValues(minValue: number, maxValue: number, defaultValue: number, step: number): void; - show(): void; - hide(): void; - setOnCameraZoomValueChangeCallback(onChangeCallback: OnCameraZoomValueChangeCallback): void; - removeOnCameraZoomValueChangeCallback(): void; - static create(parentElement: HTMLElement, renderOnCreate: boolean): CameraZoomUi; -} diff --git a/node_modules/html5-qrcode/esm/ui/scanner/camera-zoom-ui.js b/node_modules/html5-qrcode/esm/ui/scanner/camera-zoom-ui.js deleted file mode 100644 index b80c171..0000000 --- a/node_modules/html5-qrcode/esm/ui/scanner/camera-zoom-ui.js +++ /dev/null @@ -1,70 +0,0 @@ -import { BaseUiElementFactory, PublicUiElementIdAndClasses } from "./base"; -import { Html5QrcodeScannerStrings } from "../../strings"; -var CameraZoomUi = (function () { - function CameraZoomUi() { - this.onChangeCallback = null; - this.zoomElementContainer = document.createElement("div"); - this.rangeInput = BaseUiElementFactory.createElement("input", PublicUiElementIdAndClasses.ZOOM_SLIDER_ID); - this.rangeInput.type = "range"; - this.rangeText = document.createElement("span"); - this.rangeInput.min = "1"; - this.rangeInput.max = "5"; - this.rangeInput.value = "1"; - this.rangeInput.step = "0.1"; - } - CameraZoomUi.prototype.render = function (parentElement, renderOnCreate) { - this.zoomElementContainer.style.display - = renderOnCreate ? "block" : "none"; - this.zoomElementContainer.style.padding = "5px 10px"; - this.zoomElementContainer.style.textAlign = "center"; - parentElement.appendChild(this.zoomElementContainer); - this.rangeInput.style.display = "inline-block"; - this.rangeInput.style.width = "50%"; - this.rangeInput.style.height = "5px"; - this.rangeInput.style.background = "#d3d3d3"; - this.rangeInput.style.outline = "none"; - this.rangeInput.style.opacity = "0.7"; - var zoomString = Html5QrcodeScannerStrings.zoom(); - this.rangeText.innerText = "".concat(this.rangeInput.value, "x ").concat(zoomString); - this.rangeText.style.marginRight = "10px"; - var $this = this; - this.rangeInput.addEventListener("input", function () { return $this.onValueChange(); }); - this.rangeInput.addEventListener("change", function () { return $this.onValueChange(); }); - this.zoomElementContainer.appendChild(this.rangeInput); - this.zoomElementContainer.appendChild(this.rangeText); - }; - CameraZoomUi.prototype.onValueChange = function () { - var zoomString = Html5QrcodeScannerStrings.zoom(); - this.rangeText.innerText = "".concat(this.rangeInput.value, "x ").concat(zoomString); - if (this.onChangeCallback) { - this.onChangeCallback(parseFloat(this.rangeInput.value)); - } - }; - CameraZoomUi.prototype.setValues = function (minValue, maxValue, defaultValue, step) { - this.rangeInput.min = minValue.toString(); - this.rangeInput.max = maxValue.toString(); - this.rangeInput.step = step.toString(); - this.rangeInput.value = defaultValue.toString(); - this.onValueChange(); - }; - CameraZoomUi.prototype.show = function () { - this.zoomElementContainer.style.display = "block"; - }; - CameraZoomUi.prototype.hide = function () { - this.zoomElementContainer.style.display = "none"; - }; - CameraZoomUi.prototype.setOnCameraZoomValueChangeCallback = function (onChangeCallback) { - this.onChangeCallback = onChangeCallback; - }; - CameraZoomUi.prototype.removeOnCameraZoomValueChangeCallback = function () { - this.onChangeCallback = null; - }; - CameraZoomUi.create = function (parentElement, renderOnCreate) { - var cameraZoomUi = new CameraZoomUi(); - cameraZoomUi.render(parentElement, renderOnCreate); - return cameraZoomUi; - }; - return CameraZoomUi; -}()); -export { CameraZoomUi }; -//# sourceMappingURL=camera-zoom-ui.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/ui/scanner/camera-zoom-ui.js.map b/node_modules/html5-qrcode/esm/ui/scanner/camera-zoom-ui.js.map deleted file mode 100644 index 0aafbb0..0000000 --- a/node_modules/html5-qrcode/esm/ui/scanner/camera-zoom-ui.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"camera-zoom-ui.js","sourceRoot":"","sources":["../../../../src/ui/scanner/camera-zoom-ui.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/ui/scanner/file-selection-ui.d.ts b/node_modules/html5-qrcode/esm/ui/scanner/file-selection-ui.d.ts deleted file mode 100644 index 768f5ed..0000000 --- a/node_modules/html5-qrcode/esm/ui/scanner/file-selection-ui.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -export type OnFileSelected = (file: File) => void; -export declare class FileSelectionUi { - private readonly fileBasedScanRegion; - private readonly fileScanInput; - private readonly fileSelectionButton; - private constructor(); - hide(): void; - show(): void; - isShowing(): boolean; - resetValue(): void; - private createFileBasedScanRegion; - private fileBasedScanRegionDefaultBorder; - private fileBasedScanRegionActiveBorder; - private createDragAndDropMessage; - private setImageNameToButton; - private setInitialValueToButton; - private getFileScanInputId; - static create(parentElement: HTMLDivElement, showOnRender: boolean, onFileSelected: OnFileSelected): FileSelectionUi; -} diff --git a/node_modules/html5-qrcode/esm/ui/scanner/file-selection-ui.js b/node_modules/html5-qrcode/esm/ui/scanner/file-selection-ui.js deleted file mode 100644 index 5ebeade..0000000 --- a/node_modules/html5-qrcode/esm/ui/scanner/file-selection-ui.js +++ /dev/null @@ -1,167 +0,0 @@ -import { Html5QrcodeScannerStrings } from "../../strings"; -import { BaseUiElementFactory, PublicUiElementIdAndClasses } from "./base"; -var FileSelectionUi = (function () { - function FileSelectionUi(parentElement, showOnRender, onFileSelected) { - this.fileBasedScanRegion = this.createFileBasedScanRegion(); - this.fileBasedScanRegion.style.display - = showOnRender ? "block" : "none"; - parentElement.appendChild(this.fileBasedScanRegion); - var fileScanLabel = document.createElement("label"); - fileScanLabel.setAttribute("for", this.getFileScanInputId()); - fileScanLabel.style.display = "inline-block"; - this.fileBasedScanRegion.appendChild(fileScanLabel); - this.fileSelectionButton - = BaseUiElementFactory.createElement("button", PublicUiElementIdAndClasses.FILE_SELECTION_BUTTON_ID); - this.setInitialValueToButton(); - this.fileSelectionButton.addEventListener("click", function (_) { - fileScanLabel.click(); - }); - fileScanLabel.append(this.fileSelectionButton); - this.fileScanInput - = BaseUiElementFactory.createElement("input", this.getFileScanInputId()); - this.fileScanInput.type = "file"; - this.fileScanInput.accept = "image/*"; - this.fileScanInput.style.display = "none"; - fileScanLabel.appendChild(this.fileScanInput); - var $this = this; - this.fileScanInput.addEventListener("change", function (e) { - if (e == null || e.target == null) { - return; - } - var target = e.target; - if (target.files && target.files.length === 0) { - return; - } - var fileList = target.files; - var file = fileList[0]; - var fileName = file.name; - $this.setImageNameToButton(fileName); - onFileSelected(file); - }); - var dragAndDropMessage = this.createDragAndDropMessage(); - this.fileBasedScanRegion.appendChild(dragAndDropMessage); - this.fileBasedScanRegion.addEventListener("dragenter", function (event) { - $this.fileBasedScanRegion.style.border - = $this.fileBasedScanRegionActiveBorder(); - event.stopPropagation(); - event.preventDefault(); - }); - this.fileBasedScanRegion.addEventListener("dragleave", function (event) { - $this.fileBasedScanRegion.style.border - = $this.fileBasedScanRegionDefaultBorder(); - event.stopPropagation(); - event.preventDefault(); - }); - this.fileBasedScanRegion.addEventListener("dragover", function (event) { - $this.fileBasedScanRegion.style.border - = $this.fileBasedScanRegionActiveBorder(); - event.stopPropagation(); - event.preventDefault(); - }); - this.fileBasedScanRegion.addEventListener("drop", function (event) { - event.stopPropagation(); - event.preventDefault(); - $this.fileBasedScanRegion.style.border - = $this.fileBasedScanRegionDefaultBorder(); - var dataTransfer = event.dataTransfer; - if (dataTransfer) { - var files = dataTransfer.files; - if (!files || files.length === 0) { - return; - } - var isAnyFileImage = false; - for (var i = 0; i < files.length; ++i) { - var file = files.item(i); - if (!file) { - continue; - } - var imageType = /image.*/; - if (!file.type.match(imageType)) { - continue; - } - isAnyFileImage = true; - var fileName = file.name; - $this.setImageNameToButton(fileName); - onFileSelected(file); - dragAndDropMessage.innerText - = Html5QrcodeScannerStrings.dragAndDropMessage(); - break; - } - if (!isAnyFileImage) { - dragAndDropMessage.innerText - = Html5QrcodeScannerStrings - .dragAndDropMessageOnlyImages(); - } - } - }); - } - FileSelectionUi.prototype.hide = function () { - this.fileBasedScanRegion.style.display = "none"; - this.fileScanInput.disabled = true; - }; - FileSelectionUi.prototype.show = function () { - this.fileBasedScanRegion.style.display = "block"; - this.fileScanInput.disabled = false; - }; - FileSelectionUi.prototype.isShowing = function () { - return this.fileBasedScanRegion.style.display === "block"; - }; - FileSelectionUi.prototype.resetValue = function () { - this.fileScanInput.value = ""; - this.setInitialValueToButton(); - }; - FileSelectionUi.prototype.createFileBasedScanRegion = function () { - var fileBasedScanRegion = document.createElement("div"); - fileBasedScanRegion.style.textAlign = "center"; - fileBasedScanRegion.style.margin = "auto"; - fileBasedScanRegion.style.width = "80%"; - fileBasedScanRegion.style.maxWidth = "600px"; - fileBasedScanRegion.style.border - = this.fileBasedScanRegionDefaultBorder(); - fileBasedScanRegion.style.padding = "10px"; - fileBasedScanRegion.style.marginBottom = "10px"; - return fileBasedScanRegion; - }; - FileSelectionUi.prototype.fileBasedScanRegionDefaultBorder = function () { - return "6px dashed #ebebeb"; - }; - FileSelectionUi.prototype.fileBasedScanRegionActiveBorder = function () { - return "6px dashed rgb(153 151 151)"; - }; - FileSelectionUi.prototype.createDragAndDropMessage = function () { - var dragAndDropMessage = document.createElement("div"); - dragAndDropMessage.innerText - = Html5QrcodeScannerStrings.dragAndDropMessage(); - dragAndDropMessage.style.fontWeight = "400"; - return dragAndDropMessage; - }; - FileSelectionUi.prototype.setImageNameToButton = function (imageFileName) { - var MAX_CHARS = 20; - if (imageFileName.length > MAX_CHARS) { - var start8Chars = imageFileName.substring(0, 8); - var length_1 = imageFileName.length; - var last8Chars = imageFileName.substring(length_1 - 8, length_1); - imageFileName = "".concat(start8Chars, "....").concat(last8Chars); - } - var newText = Html5QrcodeScannerStrings.fileSelectionChooseAnother() - + " - " - + imageFileName; - this.fileSelectionButton.innerText = newText; - }; - FileSelectionUi.prototype.setInitialValueToButton = function () { - var initialText = Html5QrcodeScannerStrings.fileSelectionChooseImage() - + " - " - + Html5QrcodeScannerStrings.fileSelectionNoImageSelected(); - this.fileSelectionButton.innerText = initialText; - }; - FileSelectionUi.prototype.getFileScanInputId = function () { - return "html5-qrcode-private-filescan-input"; - }; - FileSelectionUi.create = function (parentElement, showOnRender, onFileSelected) { - var button = new FileSelectionUi(parentElement, showOnRender, onFileSelected); - return button; - }; - return FileSelectionUi; -}()); -export { FileSelectionUi }; -//# sourceMappingURL=file-selection-ui.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/ui/scanner/file-selection-ui.js.map b/node_modules/html5-qrcode/esm/ui/scanner/file-selection-ui.js.map deleted file mode 100644 index 12f28de..0000000 --- a/node_modules/html5-qrcode/esm/ui/scanner/file-selection-ui.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"file-selection-ui.js","sourceRoot":"","sources":["../../../../src/ui/scanner/file-selection-ui.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/ui/scanner/scan-type-selector.d.ts b/node_modules/html5-qrcode/esm/ui/scanner/scan-type-selector.d.ts deleted file mode 100644 index 2f0e134..0000000 --- a/node_modules/html5-qrcode/esm/ui/scanner/scan-type-selector.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Html5QrcodeScanType } from "../../core"; -export declare class ScanTypeSelector { - private supportedScanTypes; - constructor(supportedScanTypes?: Array | []); - getDefaultScanType(): Html5QrcodeScanType; - hasMoreThanOneScanType(): boolean; - isCameraScanRequired(): boolean; - static isCameraScanType(scanType: Html5QrcodeScanType): boolean; - static isFileScanType(scanType: Html5QrcodeScanType): boolean; - private validateAndReturnScanTypes; -} diff --git a/node_modules/html5-qrcode/esm/ui/scanner/scan-type-selector.js b/node_modules/html5-qrcode/esm/ui/scanner/scan-type-selector.js deleted file mode 100644 index 9b145b7..0000000 --- a/node_modules/html5-qrcode/esm/ui/scanner/scan-type-selector.js +++ /dev/null @@ -1,48 +0,0 @@ -import { Html5QrcodeScanType, Html5QrcodeConstants } from "../../core"; -var ScanTypeSelector = (function () { - function ScanTypeSelector(supportedScanTypes) { - this.supportedScanTypes = this.validateAndReturnScanTypes(supportedScanTypes); - } - ScanTypeSelector.prototype.getDefaultScanType = function () { - return this.supportedScanTypes[0]; - }; - ScanTypeSelector.prototype.hasMoreThanOneScanType = function () { - return this.supportedScanTypes.length > 1; - }; - ScanTypeSelector.prototype.isCameraScanRequired = function () { - for (var _i = 0, _a = this.supportedScanTypes; _i < _a.length; _i++) { - var scanType = _a[_i]; - if (ScanTypeSelector.isCameraScanType(scanType)) { - return true; - } - } - return false; - }; - ScanTypeSelector.isCameraScanType = function (scanType) { - return scanType === Html5QrcodeScanType.SCAN_TYPE_CAMERA; - }; - ScanTypeSelector.isFileScanType = function (scanType) { - return scanType === Html5QrcodeScanType.SCAN_TYPE_FILE; - }; - ScanTypeSelector.prototype.validateAndReturnScanTypes = function (supportedScanTypes) { - if (!supportedScanTypes || supportedScanTypes.length === 0) { - return Html5QrcodeConstants.DEFAULT_SUPPORTED_SCAN_TYPE; - } - var maxExpectedValues = Html5QrcodeConstants.DEFAULT_SUPPORTED_SCAN_TYPE.length; - if (supportedScanTypes.length > maxExpectedValues) { - throw "Max ".concat(maxExpectedValues, " values expected for ") - + "supportedScanTypes"; - } - for (var _i = 0, supportedScanTypes_1 = supportedScanTypes; _i < supportedScanTypes_1.length; _i++) { - var scanType = supportedScanTypes_1[_i]; - if (!Html5QrcodeConstants.DEFAULT_SUPPORTED_SCAN_TYPE - .includes(scanType)) { - throw "Unsupported scan type ".concat(scanType); - } - } - return supportedScanTypes; - }; - return ScanTypeSelector; -}()); -export { ScanTypeSelector }; -//# sourceMappingURL=scan-type-selector.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/ui/scanner/scan-type-selector.js.map b/node_modules/html5-qrcode/esm/ui/scanner/scan-type-selector.js.map deleted file mode 100644 index dfde556..0000000 --- a/node_modules/html5-qrcode/esm/ui/scanner/scan-type-selector.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"scan-type-selector.js","sourceRoot":"","sources":["../../../../src/ui/scanner/scan-type-selector.ts"],"names":[],"mappings":"AAUA,OAAO,EACH,mBAAmB,EACnB,oBAAoB,EACvB,MAAM,YAAY,CAAC;AAGpB;IAGI,0BAAY,kBAAoD;QAC5D,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,0BAA0B,CACrD,kBAAkB,CAAC,CAAC;IAC5B,CAAC;IAMM,6CAAkB,GAAzB;QACI,OAAO,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;IAMM,iDAAsB,GAA7B;QACI,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9C,CAAC;IAGM,+CAAoB,GAA3B;QACI,KAAuB,UAAuB,EAAvB,KAAA,IAAI,CAAC,kBAAkB,EAAvB,cAAuB,EAAvB,IAAuB,EAAE;YAA3C,IAAM,QAAQ,SAAA;YACf,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE;gBAC7C,OAAO,IAAI,CAAC;aACf;SACJ;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAGa,iCAAgB,GAA9B,UAA+B,QAA6B;QACxD,OAAO,QAAQ,KAAK,mBAAmB,CAAC,gBAAgB,CAAC;IAC7D,CAAC;IAGa,+BAAc,GAA5B,UAA6B,QAA6B;QACtD,OAAO,QAAQ,KAAK,mBAAmB,CAAC,cAAc,CAAC;IAC3D,CAAC;IAQO,qDAA0B,GAAlC,UACI,kBAA8C;QAG9C,IAAI,CAAC,kBAAkB,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE;YACxD,OAAO,oBAAoB,CAAC,2BAA2B,CAAC;SAC3D;QAGD,IAAI,iBAAiB,GACf,oBAAoB,CAAC,2BAA2B,CAAC,MAAM,CAAC;QAC9D,IAAI,kBAAkB,CAAC,MAAM,GAAG,iBAAiB,EAAE;YAC/C,MAAM,cAAO,iBAAiB,0BAAuB;kBAC/C,oBAAoB,CAAC;SAC9B;QAGD,KAAuB,UAAkB,EAAlB,yCAAkB,EAAlB,gCAAkB,EAAlB,IAAkB,EAAE;YAAtC,IAAM,QAAQ,2BAAA;YACf,IAAI,CAAC,oBAAoB,CAAC,2BAA2B;iBAC5C,QAAQ,CAAC,QAAQ,CAAC,EAAE;gBACzB,MAAM,gCAAyB,QAAQ,CAAE,CAAC;aAC7C;SACJ;QAED,OAAO,kBAAkB,CAAC;IAC9B,CAAC;IAEL,uBAAC;AAAD,CAAC,AA7ED,IA6EC"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/ui/scanner/torch-button.d.ts b/node_modules/html5-qrcode/esm/ui/scanner/torch-button.d.ts deleted file mode 100644 index a862a10..0000000 --- a/node_modules/html5-qrcode/esm/ui/scanner/torch-button.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { BooleanCameraCapability } from "../../camera/core"; -export type OnTorchActionFailureCallback = (failureMessage: string) => void; -interface TorchButtonController { - disable(): void; - enable(): void; - setText(text: string): void; -} -export interface TorchButtonOptions { - display: string; - marginLeft: string; -} -export declare class TorchButton implements TorchButtonController { - private readonly torchButton; - private readonly onTorchActionFailureCallback; - private torchController; - private constructor(); - private render; - updateTorchCapability(torchCapability: BooleanCameraCapability): void; - getTorchButton(): HTMLButtonElement; - hide(): void; - show(): void; - disable(): void; - enable(): void; - setText(text: string): void; - reset(): void; - static create(parentElement: HTMLElement, torchCapability: BooleanCameraCapability, torchButtonOptions: TorchButtonOptions, onTorchActionFailureCallback: OnTorchActionFailureCallback): TorchButton; -} -export {}; diff --git a/node_modules/html5-qrcode/esm/ui/scanner/torch-button.js b/node_modules/html5-qrcode/esm/ui/scanner/torch-button.js deleted file mode 100644 index 5b31efb..0000000 --- a/node_modules/html5-qrcode/esm/ui/scanner/torch-button.js +++ /dev/null @@ -1,168 +0,0 @@ -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (g && (g = 0, op[0] && (_ = 0)), _) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -import { Html5QrcodeScannerStrings } from "../../strings"; -import { BaseUiElementFactory, PublicUiElementIdAndClasses } from "./base"; -var TorchController = (function () { - function TorchController(torchCapability, buttonController, onTorchActionFailureCallback) { - this.isTorchOn = false; - this.torchCapability = torchCapability; - this.buttonController = buttonController; - this.onTorchActionFailureCallback = onTorchActionFailureCallback; - } - TorchController.prototype.isTorchEnabled = function () { - return this.isTorchOn; - }; - TorchController.prototype.flipState = function () { - return __awaiter(this, void 0, void 0, function () { - var isTorchOnExpected, error_1; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - this.buttonController.disable(); - isTorchOnExpected = !this.isTorchOn; - _a.label = 1; - case 1: - _a.trys.push([1, 3, , 4]); - return [4, this.torchCapability.apply(isTorchOnExpected)]; - case 2: - _a.sent(); - this.updateUiBasedOnLatestSettings(this.torchCapability.value(), isTorchOnExpected); - return [3, 4]; - case 3: - error_1 = _a.sent(); - this.propagateFailure(isTorchOnExpected, error_1); - this.buttonController.enable(); - return [3, 4]; - case 4: return [2]; - } - }); - }); - }; - TorchController.prototype.updateUiBasedOnLatestSettings = function (isTorchOn, isTorchOnExpected) { - if (isTorchOn === isTorchOnExpected) { - this.buttonController.setText(isTorchOnExpected - ? Html5QrcodeScannerStrings.torchOffButton() - : Html5QrcodeScannerStrings.torchOnButton()); - this.isTorchOn = isTorchOnExpected; - } - else { - this.propagateFailure(isTorchOnExpected); - } - this.buttonController.enable(); - }; - TorchController.prototype.propagateFailure = function (isTorchOnExpected, error) { - var errorMessage = isTorchOnExpected - ? Html5QrcodeScannerStrings.torchOnFailedMessage() - : Html5QrcodeScannerStrings.torchOffFailedMessage(); - if (error) { - errorMessage += "; Error = " + error; - } - this.onTorchActionFailureCallback(errorMessage); - }; - TorchController.prototype.reset = function () { - this.isTorchOn = false; - }; - return TorchController; -}()); -var TorchButton = (function () { - function TorchButton(torchCapability, onTorchActionFailureCallback) { - this.onTorchActionFailureCallback = onTorchActionFailureCallback; - this.torchButton - = BaseUiElementFactory.createElement("button", PublicUiElementIdAndClasses.TORCH_BUTTON_ID); - this.torchController = new TorchController(torchCapability, this, onTorchActionFailureCallback); - } - TorchButton.prototype.render = function (parentElement, torchButtonOptions) { - var _this = this; - this.torchButton.innerText - = Html5QrcodeScannerStrings.torchOnButton(); - this.torchButton.style.display = torchButtonOptions.display; - this.torchButton.style.marginLeft = torchButtonOptions.marginLeft; - var $this = this; - this.torchButton.addEventListener("click", function (_) { return __awaiter(_this, void 0, void 0, function () { - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4, $this.torchController.flipState()]; - case 1: - _a.sent(); - if ($this.torchController.isTorchEnabled()) { - $this.torchButton.classList.remove(PublicUiElementIdAndClasses.TORCH_BUTTON_CLASS_TORCH_OFF); - $this.torchButton.classList.add(PublicUiElementIdAndClasses.TORCH_BUTTON_CLASS_TORCH_ON); - } - else { - $this.torchButton.classList.remove(PublicUiElementIdAndClasses.TORCH_BUTTON_CLASS_TORCH_ON); - $this.torchButton.classList.add(PublicUiElementIdAndClasses.TORCH_BUTTON_CLASS_TORCH_OFF); - } - return [2]; - } - }); - }); }); - parentElement.appendChild(this.torchButton); - }; - TorchButton.prototype.updateTorchCapability = function (torchCapability) { - this.torchController = new TorchController(torchCapability, this, this.onTorchActionFailureCallback); - }; - TorchButton.prototype.getTorchButton = function () { - return this.torchButton; - }; - TorchButton.prototype.hide = function () { - this.torchButton.style.display = "none"; - }; - TorchButton.prototype.show = function () { - this.torchButton.style.display = "inline-block"; - }; - TorchButton.prototype.disable = function () { - this.torchButton.disabled = true; - }; - TorchButton.prototype.enable = function () { - this.torchButton.disabled = false; - }; - TorchButton.prototype.setText = function (text) { - this.torchButton.innerText = text; - }; - TorchButton.prototype.reset = function () { - this.torchButton.innerText = Html5QrcodeScannerStrings.torchOnButton(); - this.torchController.reset(); - }; - TorchButton.create = function (parentElement, torchCapability, torchButtonOptions, onTorchActionFailureCallback) { - var button = new TorchButton(torchCapability, onTorchActionFailureCallback); - button.render(parentElement, torchButtonOptions); - return button; - }; - return TorchButton; -}()); -export { TorchButton }; -//# sourceMappingURL=torch-button.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/ui/scanner/torch-button.js.map b/node_modules/html5-qrcode/esm/ui/scanner/torch-button.js.map deleted file mode 100644 index 1f9b395..0000000 --- a/node_modules/html5-qrcode/esm/ui/scanner/torch-button.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"torch-button.js","sourceRoot":"","sources":["../../../../src/ui/scanner/torch-button.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/utils.d.ts b/node_modules/html5-qrcode/esm/utils.d.ts deleted file mode 100644 index 1b060ed..0000000 --- a/node_modules/html5-qrcode/esm/utils.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { Logger } from "./core"; -export declare class VideoConstraintsUtil { - static isMediaStreamConstraintsValid(videoConstraints: MediaTrackConstraints, logger: Logger): boolean; -} diff --git a/node_modules/html5-qrcode/esm/utils.js b/node_modules/html5-qrcode/esm/utils.js deleted file mode 100644 index 93531f8..0000000 --- a/node_modules/html5-qrcode/esm/utils.js +++ /dev/null @@ -1,35 +0,0 @@ -var VideoConstraintsUtil = (function () { - function VideoConstraintsUtil() { - } - VideoConstraintsUtil.isMediaStreamConstraintsValid = function (videoConstraints, logger) { - if (typeof videoConstraints !== "object") { - var typeofVideoConstraints = typeof videoConstraints; - logger.logError("videoConstraints should be of type object, the " - + "object passed is of type ".concat(typeofVideoConstraints, "."), true); - return false; - } - var bannedKeys = [ - "autoGainControl", - "channelCount", - "echoCancellation", - "latency", - "noiseSuppression", - "sampleRate", - "sampleSize", - "volume" - ]; - var bannedkeysSet = new Set(bannedKeys); - var keysInVideoConstraints = Object.keys(videoConstraints); - for (var _i = 0, keysInVideoConstraints_1 = keysInVideoConstraints; _i < keysInVideoConstraints_1.length; _i++) { - var key = keysInVideoConstraints_1[_i]; - if (bannedkeysSet.has(key)) { - logger.logError("".concat(key, " is not supported videoConstaints."), true); - return false; - } - } - return true; - }; - return VideoConstraintsUtil; -}()); -export { VideoConstraintsUtil }; -//# sourceMappingURL=utils.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/utils.js.map b/node_modules/html5-qrcode/esm/utils.js.map deleted file mode 100644 index 3bec475..0000000 --- a/node_modules/html5-qrcode/esm/utils.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAeA;IAAA;IAqCA,CAAC;IApCiB,kDAA6B,GAA3C,UACI,gBAAuC,EACvC,MAAc;QACd,IAAI,OAAO,gBAAgB,KAAK,QAAQ,EAAE;YACtC,IAAM,sBAAsB,GAAG,OAAO,gBAAgB,CAAC;YACvD,MAAM,CAAC,QAAQ,CACX,iDAAiD;kBAC3C,mCAA4B,sBAAsB,MAAG,EACvC,IAAI,CAAC,CAAC;YAC9B,OAAO,KAAK,CAAC;SAChB;QAGD,IAAM,UAAU,GAAG;YACf,iBAAiB;YACjB,cAAc;YACd,kBAAkB;YAClB,SAAS;YACT,kBAAkB;YAClB,YAAY;YACZ,YAAY;YACZ,QAAQ;SACX,CAAC;QACF,IAAM,aAAa,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAM,sBAAsB,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7D,KAAkB,UAAsB,EAAtB,iDAAsB,EAAtB,oCAAsB,EAAtB,IAAsB,EAAE;YAArC,IAAM,GAAG,+BAAA;YACV,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;gBACxB,MAAM,CAAC,QAAQ,CACX,UAAG,GAAG,uCAAoC,EACtB,IAAI,CAAC,CAAC;gBAC9B,OAAO,KAAK,CAAC;aAChB;SACJ;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IACL,2BAAC;AAAD,CAAC,AArCD,IAqCC"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/zxing-html5-qrcode-decoder.d.ts b/node_modules/html5-qrcode/esm/zxing-html5-qrcode-decoder.d.ts deleted file mode 100644 index 411d377..0000000 --- a/node_modules/html5-qrcode/esm/zxing-html5-qrcode-decoder.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { QrcodeResult, Html5QrcodeSupportedFormats, Logger, QrcodeDecoderAsync } from "./core"; -export declare class ZXingHtml5QrcodeDecoder implements QrcodeDecoderAsync { - private readonly formatMap; - private readonly reverseFormatMap; - private hints; - private verbose; - private logger; - constructor(requestedFormats: Array, verbose: boolean, logger: Logger); - decodeAsync(canvas: HTMLCanvasElement): Promise; - private decode; - private createReverseFormatMap; - private toHtml5QrcodeSupportedFormats; - private createZXingFormats; - private createDebugData; -} diff --git a/node_modules/html5-qrcode/esm/zxing-html5-qrcode-decoder.js b/node_modules/html5-qrcode/esm/zxing-html5-qrcode-decoder.js deleted file mode 100644 index a117c82..0000000 --- a/node_modules/html5-qrcode/esm/zxing-html5-qrcode-decoder.js +++ /dev/null @@ -1,106 +0,0 @@ -import * as ZXing from "../third_party/zxing-js.umd"; -import { QrcodeResultFormat, Html5QrcodeSupportedFormats } from "./core"; -var ZXingHtml5QrcodeDecoder = (function () { - function ZXingHtml5QrcodeDecoder(requestedFormats, verbose, logger) { - this.formatMap = new Map([ - [Html5QrcodeSupportedFormats.QR_CODE, ZXing.BarcodeFormat.QR_CODE], - [Html5QrcodeSupportedFormats.AZTEC, ZXing.BarcodeFormat.AZTEC], - [Html5QrcodeSupportedFormats.CODABAR, ZXing.BarcodeFormat.CODABAR], - [Html5QrcodeSupportedFormats.CODE_39, ZXing.BarcodeFormat.CODE_39], - [Html5QrcodeSupportedFormats.CODE_93, ZXing.BarcodeFormat.CODE_93], - [ - Html5QrcodeSupportedFormats.CODE_128, - ZXing.BarcodeFormat.CODE_128 - ], - [ - Html5QrcodeSupportedFormats.DATA_MATRIX, - ZXing.BarcodeFormat.DATA_MATRIX - ], - [ - Html5QrcodeSupportedFormats.MAXICODE, - ZXing.BarcodeFormat.MAXICODE - ], - [Html5QrcodeSupportedFormats.ITF, ZXing.BarcodeFormat.ITF], - [Html5QrcodeSupportedFormats.EAN_13, ZXing.BarcodeFormat.EAN_13], - [Html5QrcodeSupportedFormats.EAN_8, ZXing.BarcodeFormat.EAN_8], - [Html5QrcodeSupportedFormats.PDF_417, ZXing.BarcodeFormat.PDF_417], - [Html5QrcodeSupportedFormats.RSS_14, ZXing.BarcodeFormat.RSS_14], - [ - Html5QrcodeSupportedFormats.RSS_EXPANDED, - ZXing.BarcodeFormat.RSS_EXPANDED - ], - [Html5QrcodeSupportedFormats.UPC_A, ZXing.BarcodeFormat.UPC_A], - [Html5QrcodeSupportedFormats.UPC_E, ZXing.BarcodeFormat.UPC_E], - [ - Html5QrcodeSupportedFormats.UPC_EAN_EXTENSION, - ZXing.BarcodeFormat.UPC_EAN_EXTENSION - ] - ]); - this.reverseFormatMap = this.createReverseFormatMap(); - if (!ZXing) { - throw "Use html5qrcode.min.js without edit, ZXing not found."; - } - this.verbose = verbose; - this.logger = logger; - var formats = this.createZXingFormats(requestedFormats); - var hints = new Map(); - hints.set(ZXing.DecodeHintType.POSSIBLE_FORMATS, formats); - hints.set(ZXing.DecodeHintType.TRY_HARDER, false); - this.hints = hints; - } - ZXingHtml5QrcodeDecoder.prototype.decodeAsync = function (canvas) { - var _this = this; - return new Promise(function (resolve, reject) { - try { - resolve(_this.decode(canvas)); - } - catch (error) { - reject(error); - } - }); - }; - ZXingHtml5QrcodeDecoder.prototype.decode = function (canvas) { - var zxingDecoder = new ZXing.MultiFormatReader(this.verbose, this.hints); - var luminanceSource = new ZXing.HTMLCanvasElementLuminanceSource(canvas); - var binaryBitmap = new ZXing.BinaryBitmap(new ZXing.HybridBinarizer(luminanceSource)); - var result = zxingDecoder.decode(binaryBitmap); - return { - text: result.text, - format: QrcodeResultFormat.create(this.toHtml5QrcodeSupportedFormats(result.format)), - debugData: this.createDebugData() - }; - }; - ZXingHtml5QrcodeDecoder.prototype.createReverseFormatMap = function () { - var result = new Map(); - this.formatMap.forEach(function (value, key, _) { - result.set(value, key); - }); - return result; - }; - ZXingHtml5QrcodeDecoder.prototype.toHtml5QrcodeSupportedFormats = function (zxingFormat) { - if (!this.reverseFormatMap.has(zxingFormat)) { - throw "reverseFormatMap doesn't have ".concat(zxingFormat); - } - return this.reverseFormatMap.get(zxingFormat); - }; - ZXingHtml5QrcodeDecoder.prototype.createZXingFormats = function (requestedFormats) { - var zxingFormats = []; - for (var _i = 0, requestedFormats_1 = requestedFormats; _i < requestedFormats_1.length; _i++) { - var requestedFormat = requestedFormats_1[_i]; - if (this.formatMap.has(requestedFormat)) { - zxingFormats.push(this.formatMap.get(requestedFormat)); - } - else { - this.logger.logError("".concat(requestedFormat, " is not supported by") - + "ZXingHtml5QrcodeShim"); - } - } - return zxingFormats; - }; - ZXingHtml5QrcodeDecoder.prototype.createDebugData = function () { - return { decoderName: "zxing-js" }; - }; - return ZXingHtml5QrcodeDecoder; -}()); -export { ZXingHtml5QrcodeDecoder }; -//# sourceMappingURL=zxing-html5-qrcode-decoder.js.map \ No newline at end of file diff --git a/node_modules/html5-qrcode/esm/zxing-html5-qrcode-decoder.js.map b/node_modules/html5-qrcode/esm/zxing-html5-qrcode-decoder.js.map deleted file mode 100644 index 7b991dc..0000000 --- a/node_modules/html5-qrcode/esm/zxing-html5-qrcode-decoder.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"zxing-html5-qrcode-decoder.js","sourceRoot":"","sources":["../../src/zxing-html5-qrcode-decoder.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/html5-qrcode/experimental-features.d.ts b/node_modules/html5-qrcode/experimental-features.d.ts deleted file mode 100644 index 0413abe..0000000 --- a/node_modules/html5-qrcode/experimental-features.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface ExperimentalFeaturesConfig { - useBarCodeDetectorIfSupported?: boolean | undefined; -} diff --git a/node_modules/html5-qrcode/html5-qrcode-scanner.d.ts b/node_modules/html5-qrcode/html5-qrcode-scanner.d.ts deleted file mode 100644 index 417175b..0000000 --- a/node_modules/html5-qrcode/html5-qrcode-scanner.d.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { Html5QrcodeScanType, QrcodeSuccessCallback, QrcodeErrorCallback } from "./core"; -import { Html5QrcodeConfigs, Html5QrcodeCameraScanConfig } from "./html5-qrcode"; -import { Html5QrcodeScannerState } from "./state-manager"; -export interface Html5QrcodeScannerConfig extends Html5QrcodeCameraScanConfig, Html5QrcodeConfigs { - rememberLastUsedCamera?: boolean | undefined; - supportedScanTypes?: Array | []; - showTorchButtonIfSupported?: boolean | undefined; - showZoomSliderIfSupported?: boolean | undefined; - defaultZoomValueIfSupported?: number | undefined; -} -export declare class Html5QrcodeScanner { - private elementId; - private config; - private verbose; - private currentScanType; - private sectionSwapAllowed; - private persistedDataManager; - private scanTypeSelector; - private logger; - private html5Qrcode; - private qrCodeSuccessCallback; - private qrCodeErrorCallback; - private lastMatchFound; - private cameraScanImage; - private fileScanImage; - private fileSelectionUi; - constructor(elementId: string, config: Html5QrcodeScannerConfig | undefined, verbose: boolean | undefined); - render(qrCodeSuccessCallback: QrcodeSuccessCallback, qrCodeErrorCallback: QrcodeErrorCallback | undefined): void; - pause(shouldPauseVideo?: boolean): void; - resume(): void; - getState(): Html5QrcodeScannerState; - clear(): Promise; - getRunningTrackCapabilities(): MediaTrackCapabilities; - getRunningTrackSettings(): MediaTrackSettings; - applyVideoConstraints(videoConstaints: MediaTrackConstraints): Promise; - private getHtml5QrcodeOrFail; - private createConfig; - private createBasicLayout; - private resetBasicLayout; - private setupInitialDashboard; - private createHeader; - private createSection; - private createCameraListUi; - private createPermissionButton; - private createPermissionsUi; - private createSectionControlPanel; - private renderFileScanUi; - private renderCameraSelection; - private createSectionSwap; - private startCameraScanIfPermissionExistsOnSwap; - private resetHeaderMessage; - private setHeaderMessage; - private showHideScanTypeSwapLink; - private insertCameraScanImageToScanRegion; - private insertFileScanImageToScanRegion; - private clearScanRegion; - private getDashboardSectionId; - private getDashboardSectionCameraScanRegionId; - private getDashboardSectionSwapLinkId; - private getScanRegionId; - private getDashboardId; - private getHeaderMessageContainerId; - private getCameraPermissionButtonId; - private getCameraScanRegion; - private getDashboardSectionSwapLink; - private getHeaderMessageDiv; -} diff --git a/node_modules/html5-qrcode/html5-qrcode.d.ts b/node_modules/html5-qrcode/html5-qrcode.d.ts deleted file mode 100644 index 0e57693..0000000 --- a/node_modules/html5-qrcode/html5-qrcode.d.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { QrcodeErrorCallback, QrcodeSuccessCallback, Html5QrcodeSupportedFormats, Html5QrcodeResult, QrDimensions, QrDimensionFunction } from "./core"; -import { CameraDevice, CameraCapabilities } from "./camera/core"; -import { ExperimentalFeaturesConfig } from "./experimental-features"; -import { Html5QrcodeScannerState } from "./state-manager"; -export interface Html5QrcodeConfigs { - formatsToSupport?: Array | undefined; - useBarCodeDetectorIfSupported?: boolean | undefined; - experimentalFeatures?: ExperimentalFeaturesConfig | undefined; -} -export interface Html5QrcodeFullConfig extends Html5QrcodeConfigs { - verbose: boolean | undefined; -} -export interface Html5QrcodeCameraScanConfig { - fps: number | undefined; - qrbox?: number | QrDimensions | QrDimensionFunction | undefined; - aspectRatio?: number | undefined; - disableFlip?: boolean | undefined; - videoConstraints?: MediaTrackConstraints | undefined; -} -export declare class Html5Qrcode { - private readonly logger; - private readonly elementId; - private readonly verbose; - private readonly qrcode; - private shouldScan; - private element; - private canvasElement; - private scannerPausedUiElement; - private hasBorderShaders; - private borderShaders; - private qrMatch; - private renderedCamera; - private foreverScanTimeout; - private qrRegion; - private context; - private lastScanImageFile; - private stateManagerProxy; - isScanning: boolean; - constructor(elementId: string, configOrVerbosityFlag?: boolean | Html5QrcodeFullConfig | undefined); - start(cameraIdOrConfig: string | MediaTrackConstraints, configuration: Html5QrcodeCameraScanConfig | undefined, qrCodeSuccessCallback: QrcodeSuccessCallback | undefined, qrCodeErrorCallback: QrcodeErrorCallback | undefined): Promise; - pause(shouldPauseVideo?: boolean): void; - resume(): void; - getState(): Html5QrcodeScannerState; - stop(): Promise; - scanFile(imageFile: File, showImage?: boolean): Promise; - scanFileV2(imageFile: File, showImage?: boolean): Promise; - clear(): void; - static getCameras(): Promise>; - getRunningTrackCapabilities(): MediaTrackCapabilities; - getRunningTrackSettings(): MediaTrackSettings; - getRunningTrackCameraCapabilities(): CameraCapabilities; - applyVideoConstraints(videoConstaints: MediaTrackConstraints): Promise; - private getRenderedCameraOrFail; - private getSupportedFormats; - private getUseBarCodeDetectorIfSupported; - private validateQrboxSize; - private validateQrboxConfig; - private toQrdimensions; - private setupUi; - private createScannerPausedUiElement; - private scanContext; - private foreverScan; - private createVideoConstraints; - private computeCanvasDrawConfig; - private clearElement; - private possiblyUpdateShaders; - private possiblyCloseLastScanImageFile; - private createCanvasElement; - private getShadedRegionBounds; - private possiblyInsertShadingElement; - private insertShaderBorders; - private showPausedState; - private hidePausedState; - private getTimeoutFps; -} diff --git a/node_modules/html5-qrcode/html5-qrcode.min.js b/node_modules/html5-qrcode/html5-qrcode.min.js deleted file mode 100644 index 18db263..0000000 --- a/node_modules/html5-qrcode/html5-qrcode.min.js +++ /dev/null @@ -1 +0,0 @@ -var __Html5QrcodeLibrary__;(()=>{var t={449:function(t,e,r){!function(t){"use strict";function e(t){return null==t}var n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])};var i,o=function(t){function e(e){var r,n,i,o=this.constructor,s=t.call(this,e)||this;return Object.defineProperty(s,"name",{value:o.name,enumerable:!1}),r=s,n=o.prototype,(i=Object.setPrototypeOf)?i(r,n):r.__proto__=n,function(t,e){void 0===e&&(e=t.constructor);var r=Error.captureStackTrace;r&&r(t,e)}(s),s}return function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}(e,t),e}(Error);class s extends o{constructor(t=undefined){super(t),this.message=t}getKind(){return this.constructor.kind}}s.kind="Exception";class a extends s{}a.kind="ArgumentException";class c extends s{}c.kind="IllegalArgumentException";class l{constructor(t){if(this.binarizer=t,null===t)throw new c("Binarizer must be non-null.")}getWidth(){return this.binarizer.getWidth()}getHeight(){return this.binarizer.getHeight()}getBlackRow(t,e){return this.binarizer.getBlackRow(t,e)}getBlackMatrix(){return null!==this.matrix&&void 0!==this.matrix||(this.matrix=this.binarizer.getBlackMatrix()),this.matrix}isCropSupported(){return this.binarizer.getLuminanceSource().isCropSupported()}crop(t,e,r,n){const i=this.binarizer.getLuminanceSource().crop(t,e,r,n);return new l(this.binarizer.createBinarizer(i))}isRotateSupported(){return this.binarizer.getLuminanceSource().isRotateSupported()}rotateCounterClockwise(){const t=this.binarizer.getLuminanceSource().rotateCounterClockwise();return new l(this.binarizer.createBinarizer(t))}rotateCounterClockwise45(){const t=this.binarizer.getLuminanceSource().rotateCounterClockwise45();return new l(this.binarizer.createBinarizer(t))}toString(){try{return this.getBlackMatrix().toString()}catch(t){return""}}}class h extends s{static getChecksumInstance(){return new h}}h.kind="ChecksumException";class u{constructor(t){this.source=t}getLuminanceSource(){return this.source}getWidth(){return this.source.getWidth()}getHeight(){return this.source.getHeight()}}class d{static arraycopy(t,e,r,n,i){for(;i--;)r[n++]=t[e++]}static currentTimeMillis(){return Date.now()}}class f extends s{}f.kind="IndexOutOfBoundsException";class g extends f{constructor(t=undefined,e=undefined){super(e),this.index=t,this.message=e}}g.kind="ArrayIndexOutOfBoundsException";class w{static fill(t,e){for(let r=0,n=t.length;rr)throw new c("fromIndex("+e+") > toIndex("+r+")");if(e<0)throw new g(e);if(r>t)throw new g(r)}static asList(...t){return t}static create(t,e,r){return Array.from({length:t}).map((t=>Array.from({length:e}).fill(r)))}static createInt32Array(t,e,r){return Array.from({length:t}).map((t=>Int32Array.from({length:e}).fill(r)))}static equals(t,e){if(!t)return!1;if(!e)return!1;if(!t.length)return!1;if(!e.length)return!1;if(t.length!==e.length)return!1;for(let r=0,n=t.length;r>1,s=r(e,t[o]);if(s>0)n=o+1;else{if(!(s<0))return o;i=o-1}}return-n-1}static numberComparator(t,e){return t-e}}class m{static numberOfTrailingZeros(t){let e;if(0===t)return 32;let r=31;return e=t<<16,0!==e&&(r-=16,t=e),e=t<<8,0!==e&&(r-=8,t=e),e=t<<4,0!==e&&(r-=4,t=e),e=t<<2,0!==e&&(r-=2,t=e),r-(t<<1>>>31)}static numberOfLeadingZeros(t){if(0===t)return 32;let e=1;return t>>>16==0&&(e+=16,t<<=16),t>>>24==0&&(e+=8,t<<=8),t>>>28==0&&(e+=4,t<<=4),t>>>30==0&&(e+=2,t<<=2),e-=t>>>31,e}static toHexString(t){return t.toString(16)}static toBinaryString(t){return String(parseInt(String(t),2))}static bitCount(t){return t=(t=(858993459&(t-=t>>>1&1431655765))+(t>>>2&858993459))+(t>>>4)&252645135,63&(t+=t>>>8)+(t>>>16)}static truncDivision(t,e){return Math.trunc(t/e)}static parseInt(t,e=undefined){return parseInt(t,e)}}m.MIN_VALUE_32_BITS=-2147483648,m.MAX_VALUE=Number.MAX_SAFE_INTEGER;class p{constructor(t,e){void 0===t?(this.size=0,this.bits=new Int32Array(1)):(this.size=t,this.bits=null==e?p.makeArray(t):e)}getSize(){return this.size}getSizeInBytes(){return Math.floor((this.size+7)/8)}ensureCapacity(t){if(t>32*this.bits.length){const e=p.makeArray(t);d.arraycopy(this.bits,0,e,0,this.bits.length),this.bits=e}}get(t){return 0!=(this.bits[Math.floor(t/32)]&1<<(31&t))}set(t){this.bits[Math.floor(t/32)]|=1<<(31&t)}flip(t){this.bits[Math.floor(t/32)]^=1<<(31&t)}getNextSet(t){const e=this.size;if(t>=e)return e;const r=this.bits;let n=Math.floor(t/32),i=r[n];i&=~((1<<(31&t))-1);const o=r.length;for(;0===i;){if(++n===o)return e;i=r[n]}const s=32*n+m.numberOfTrailingZeros(i);return s>e?e:s}getNextUnset(t){const e=this.size;if(t>=e)return e;const r=this.bits;let n=Math.floor(t/32),i=~r[n];i&=~((1<<(31&t))-1);const o=r.length;for(;0===i;){if(++n===o)return e;i=~r[n]}const s=32*n+m.numberOfTrailingZeros(i);return s>e?e:s}setBulk(t,e){this.bits[Math.floor(t/32)]=e}setRange(t,e){if(ethis.size)throw new c;if(e===t)return;e--;const r=Math.floor(t/32),n=Math.floor(e/32),i=this.bits;for(let o=r;o<=n;o++){const s=(2<<(or?0:31&t));i[o]|=s}}clear(){const t=this.bits.length,e=this.bits;for(let r=0;rthis.size)throw new c;if(e===t)return!0;e--;const n=Math.floor(t/32),i=Math.floor(e/32),o=this.bits;for(let s=n;s<=i;s++){const a=(2<<(sn?0:31&t))&4294967295;if((o[s]&a)!==(r?a:0))return!1}return!0}appendBit(t){this.ensureCapacity(this.size+1),t&&(this.bits[Math.floor(this.size/32)]|=1<<(31&this.size)),this.size++}appendBits(t,e){if(e<0||e>32)throw new c("Num bits must be between 0 and 32");this.ensureCapacity(this.size+e);for(let r=e;r>0;r--)this.appendBit(1==(t>>r-1&1))}appendBitArray(t){const e=t.size;this.ensureCapacity(this.size+e);for(let r=0;r>1&1431655765|(1431655765&r)<<1,r=r>>2&858993459|(858993459&r)<<2,r=r>>4&252645135|(252645135&r)<<4,r=r>>8&16711935|(16711935&r)<<8,r=r>>16&65535|(65535&r)<<16,t[e-i]=r}if(this.size!==32*r){const e=32*r-this.size;let n=t[0]>>>e;for(let i=1;i>>e}t[r-1]=n}this.bits=t}static makeArray(t){return new Int32Array(Math.floor((t+31)/32))}equals(t){if(!(t instanceof p))return!1;const e=t;return this.size===e.size&&w.equals(this.bits,e.bits)}hashCode(){return 31*this.size+w.hashCode(this.bits)}toString(){let t="";for(let e=0,r=this.size;e=900)throw new E("incorect value");const e=I.VALUES_TO_ECI.get(t);if(void 0===e)throw new E("incorect value");return e}static getCharacterSetECIByName(t){const e=I.NAME_TO_ECI.get(t);if(void 0===e)throw new E("incorect value");return e}equals(t){if(!(t instanceof I))return!1;const e=t;return this.getName()===e.getName()}}I.VALUE_IDENTIFIER_TO_ECI=new Map,I.VALUES_TO_ECI=new Map,I.NAME_TO_ECI=new Map,I.Cp437=new I(A.Cp437,Int32Array.from([0,2]),"Cp437"),I.ISO8859_1=new I(A.ISO8859_1,Int32Array.from([1,3]),"ISO-8859-1","ISO88591","ISO8859_1"),I.ISO8859_2=new I(A.ISO8859_2,4,"ISO-8859-2","ISO88592","ISO8859_2"),I.ISO8859_3=new I(A.ISO8859_3,5,"ISO-8859-3","ISO88593","ISO8859_3"),I.ISO8859_4=new I(A.ISO8859_4,6,"ISO-8859-4","ISO88594","ISO8859_4"),I.ISO8859_5=new I(A.ISO8859_5,7,"ISO-8859-5","ISO88595","ISO8859_5"),I.ISO8859_6=new I(A.ISO8859_6,8,"ISO-8859-6","ISO88596","ISO8859_6"),I.ISO8859_7=new I(A.ISO8859_7,9,"ISO-8859-7","ISO88597","ISO8859_7"),I.ISO8859_8=new I(A.ISO8859_8,10,"ISO-8859-8","ISO88598","ISO8859_8"),I.ISO8859_9=new I(A.ISO8859_9,11,"ISO-8859-9","ISO88599","ISO8859_9"),I.ISO8859_10=new I(A.ISO8859_10,12,"ISO-8859-10","ISO885910","ISO8859_10"),I.ISO8859_11=new I(A.ISO8859_11,13,"ISO-8859-11","ISO885911","ISO8859_11"),I.ISO8859_13=new I(A.ISO8859_13,15,"ISO-8859-13","ISO885913","ISO8859_13"),I.ISO8859_14=new I(A.ISO8859_14,16,"ISO-8859-14","ISO885914","ISO8859_14"),I.ISO8859_15=new I(A.ISO8859_15,17,"ISO-8859-15","ISO885915","ISO8859_15"),I.ISO8859_16=new I(A.ISO8859_16,18,"ISO-8859-16","ISO885916","ISO8859_16"),I.SJIS=new I(A.SJIS,20,"SJIS","Shift_JIS"),I.Cp1250=new I(A.Cp1250,21,"Cp1250","windows-1250"),I.Cp1251=new I(A.Cp1251,22,"Cp1251","windows-1251"),I.Cp1252=new I(A.Cp1252,23,"Cp1252","windows-1252"),I.Cp1256=new I(A.Cp1256,24,"Cp1256","windows-1256"),I.UnicodeBigUnmarked=new I(A.UnicodeBigUnmarked,25,"UnicodeBigUnmarked","UTF-16BE","UnicodeBig"),I.UTF8=new I(A.UTF8,26,"UTF8","UTF-8"),I.ASCII=new I(A.ASCII,Int32Array.from([27,170]),"ASCII","US-ASCII"),I.Big5=new I(A.Big5,28,"Big5"),I.GB18030=new I(A.GB18030,29,"GB18030","GB2312","EUC_CN","GBK"),I.EUC_KR=new I(A.EUC_KR,30,"EUC_KR","EUC-KR");class S extends s{}S.kind="UnsupportedOperationException";class _{static decode(t,e){const r=this.encodingName(e);return this.customDecoder?this.customDecoder(t,r):"undefined"==typeof TextDecoder||this.shouldDecodeOnFallback(r)?this.decodeFallback(t,r):new TextDecoder(r).decode(t)}static shouldDecodeOnFallback(t){return!_.isBrowser()&&"ISO-8859-1"===t}static encode(t,e){const r=this.encodingName(e);return this.customEncoder?this.customEncoder(t,r):"undefined"==typeof TextEncoder?this.encodeFallback(t):(new TextEncoder).encode(t)}static isBrowser(){return"undefined"!=typeof window&&"[object Window]"==={}.toString.call(window)}static encodingName(t){return"string"==typeof t?t:t.getName()}static encodingCharacterSet(t){return t instanceof I?t:I.getCharacterSetECIByName(t)}static decodeFallback(t,e){const r=this.encodingCharacterSet(e);if(_.isDecodeFallbackSupported(r)){let e="";for(let r=0,n=t.length;r3&&239===t[0]&&187===t[1]&&191===t[2];for(let e=0;e0?0==(128&r)?o=!1:s--:0!=(128&r)&&(0==(64&r)?o=!1:(s++,0==(32&r)?a++:(s++,0==(16&r)?c++:(s++,0==(8&r)?l++:o=!1))))),n&&(r>127&&r<160?n=!1:r>159&&(r<192||215===r||247===r)&&m++),i&&(h>0?r<64||127===r||r>252?i=!1:h--:128===r||160===r||r>239?i=!1:r>160&&r<224?(u++,f=0,d++,d>g&&(g=d)):r>127?(h++,d=0,f++,f>w&&(w=f)):(d=0,f=0))}return o&&s>0&&(o=!1),i&&h>0&&(i=!1),o&&(p||a+c+l>0)?T.UTF8:i&&(T.ASSUME_SHIFT_JIS||g>=3||w>=3)?T.SHIFT_JIS:n&&i?2===g&&2===u||10*m>=r?T.SHIFT_JIS:T.ISO88591:n?T.ISO88591:i?T.SHIFT_JIS:o?T.UTF8:T.PLATFORM_DEFAULT_ENCODING}static format(t,...e){let r=-1;return t.replace(/%(-)?(0?[0-9]+)?([.][0-9]+)?([#][0-9]+)?([scfpexd%])/g,(function(t,n,i,o,s,a){if("%%"===t)return"%";if(void 0===e[++r])return;t=o?parseInt(o.substr(1)):void 0;let c,l=s?parseInt(s.substr(1)):void 0;switch(a){case"s":c=e[r];break;case"c":c=e[r][0];break;case"f":c=parseFloat(e[r]).toFixed(t);break;case"p":c=parseFloat(e[r]).toPrecision(t);break;case"e":c=parseFloat(e[r]).toExponential(t);break;case"x":c=parseInt(e[r]).toString(l||16);break;case"d":c=parseFloat(parseInt(e[r],l||10).toPrecision(t)).toFixed(0)}c="object"==typeof c?JSON.stringify(c):(+c).toString(l);let h=parseInt(i),u=i&&i[0]+""=="0"?"0":" ";for(;c.lengtho){if(-1===s)s=i-o;else if(i-o!==s)throw new c("row lengths do not match");o=i,a++}l++}else if(t.substring(l,l+e.length)===e)l+=e.length,n[i]=!0,i++;else{if(t.substring(l,l+r.length)!==r)throw new c("illegal character encountered: "+t.substring(l));l+=r.length,n[i]=!1,i++}if(i>o){if(-1===s)s=i-o;else if(i-o!==s)throw new c("row lengths do not match");a++}const h=new N(s,a);for(let t=0;t>>(31&t)&1)}set(t,e){const r=e*this.rowSize+Math.floor(t/32);this.bits[r]|=1<<(31&t)&4294967295}unset(t,e){const r=e*this.rowSize+Math.floor(t/32);this.bits[r]&=~(1<<(31&t)&4294967295)}flip(t,e){const r=e*this.rowSize+Math.floor(t/32);this.bits[r]^=1<<(31&t)&4294967295}xor(t){if(this.width!==t.getWidth()||this.height!==t.getHeight()||this.rowSize!==t.getRowSize())throw new c("input matrix dimensions do not match");const e=new p(Math.floor(this.width/32)+1),r=this.rowSize,n=this.bits;for(let i=0,o=this.height;ithis.height||i>this.width)throw new c("The region must fit inside the matrix");const s=this.rowSize,a=this.bits;for(let r=e;ra&&(a=t),32*es){let t=31;for(;c>>>t==0;)t--;32*e+t>s&&(s=32*e+t)}}}return s=0&&0===e[r];)r--;if(r<0)return null;const n=Math.floor(r/t);let i=32*Math.floor(r%t);const o=e[r];let s=31;for(;o>>>s==0;)s--;return i+=s,Int32Array.from([i,n])}getWidth(){return this.width}getHeight(){return this.height}getRowSize(){return this.rowSize}equals(t){if(!(t instanceof N))return!1;const e=t;return this.width===e.width&&this.height===e.height&&this.rowSize===e.rowSize&&w.equals(this.bits,e.bits)}hashCode(){let t=this.width;return t=31*t+this.width,t=31*t+this.height,t=31*t+this.rowSize,t=31*t+w.hashCode(this.bits),t}toString(t="X ",e=" ",r="\n"){return this.buildToString(t,e,r)}buildToString(t,e,r){let n=new y;for(let i=0,o=this.height;i>M.LUMINANCE_SHIFT]++;const s=M.estimateBlackPoint(o);if(n<3)for(let t=0;t>M.LUMINANCE_SHIFT]++}const o=M.estimateBlackPoint(i),s=t.getMatrix();for(let t=0;ti&&(n=o,i=t[o]),t[o]>r&&(r=t[o]);let o=0,s=0;for(let r=0;rs&&(o=r,s=i)}if(n>o){const t=n;n=o,o=t}if(o-n<=e/16)throw new D;let a=o-1,c=-1;for(let e=o-1;e>n;e--){const i=e-n,s=i*i*(o-e)*(r-t[e]);s>c&&(a=e,c=s)}return a<=R.MINIMUM_DIMENSION&&r>=R.MINIMUM_DIMENSION){const n=t.getMatrix();let i=e>>R.BLOCK_SIZE_POWER;0!=(e&R.BLOCK_SIZE_MASK)&&i++;let o=r>>R.BLOCK_SIZE_POWER;0!=(r&R.BLOCK_SIZE_MASK)&&o++;const s=R.calculateBlackPoints(n,i,o,e,r),a=new N(e,r);R.calculateThresholdForBlock(n,i,o,e,r,s,a),this.matrix=a}else this.matrix=super.getBlackMatrix();return this.matrix}createBinarizer(t){return new R(t)}static calculateThresholdForBlock(t,e,r,n,i,o,s){const a=i-R.BLOCK_SIZE,c=n-R.BLOCK_SIZE;for(let i=0;ia&&(l=a);const h=R.cap(i,2,r-3);for(let r=0;rc&&(i=c);const a=R.cap(r,2,e-3);let u=0;for(let t=-2;t<=2;t++){const e=o[h+t];u+=e[a-2]+e[a-1]+e[a]+e[a+1]+e[a+2]}const d=u/25;R.thresholdBlock(t,i,l,d,n,s)}}}static cap(t,e,r){return tr?r:t}static thresholdBlock(t,e,r,n,i,o){for(let s=0,a=r*i+e;so&&(r=o);for(let o=0;os&&(e=s);let c=0,l=255,h=0;for(let i=0,o=r*n+e;ih&&(h=r)}if(h-l>R.MIN_DYNAMIC_RANGE)for(i++,o+=n;i>2*R.BLOCK_SIZE_POWER;if(h-l<=R.MIN_DYNAMIC_RANGE&&(u=l/2,i>0&&o>0)){const t=(a[i-1][o]+2*a[i][o-1]+a[i-1][o-1])/4;l>10,n[r]=i}return n}getRow(t,e){if(t<0||t>=this.getHeight())throw new c("Requested row is outside the image: "+t);const r=this.getWidth(),n=t*r;return null===e?e=this.buffer.slice(n,n+r):(e.lengthnew L(t.deviceId,t.label)))}))}findDeviceById(t){return v(this,void 0,void 0,(function*(){const e=yield this.listVideoInputDevices();return e?e.find((e=>e.deviceId===t)):null}))}decodeFromInputVideoDevice(t,e){return v(this,void 0,void 0,(function*(){return yield this.decodeOnceFromVideoDevice(t,e)}))}decodeOnceFromVideoDevice(t,e){return v(this,void 0,void 0,(function*(){let r;this.reset(),r=t?{deviceId:{exact:t}}:{facingMode:"environment"};const n={video:r};return yield this.decodeOnceFromConstraints(n,e)}))}decodeOnceFromConstraints(t,e){return v(this,void 0,void 0,(function*(){const r=yield navigator.mediaDevices.getUserMedia(t);return yield this.decodeOnceFromStream(r,e)}))}decodeOnceFromStream(t,e){return v(this,void 0,void 0,(function*(){this.reset();const r=yield this.attachStreamToVideo(t,e);return yield this.decodeOnce(r)}))}decodeFromInputVideoDeviceContinuously(t,e,r){return v(this,void 0,void 0,(function*(){return yield this.decodeFromVideoDevice(t,e,r)}))}decodeFromVideoDevice(t,e,r){return v(this,void 0,void 0,(function*(){let n;n=t?{deviceId:{exact:t}}:{facingMode:"environment"};const i={video:n};return yield this.decodeFromConstraints(i,e,r)}))}decodeFromConstraints(t,e,r){return v(this,void 0,void 0,(function*(){const n=yield navigator.mediaDevices.getUserMedia(t);return yield this.decodeFromStream(n,e,r)}))}decodeFromStream(t,e,r){return v(this,void 0,void 0,(function*(){this.reset();const n=yield this.attachStreamToVideo(t,e);return yield this.decodeContinuously(n,r)}))}stopAsyncDecode(){this._stopAsyncDecode=!0}stopContinuousDecode(){this._stopContinuousDecode=!0}attachStreamToVideo(t,e){return v(this,void 0,void 0,(function*(){const r=this.prepareVideoElement(e);return this.addVideoSource(r,t),this.videoElement=r,this.stream=t,yield this.playVideoOnLoadAsync(r),r}))}playVideoOnLoadAsync(t){return new Promise(((e,r)=>this.playVideoOnLoad(t,(()=>e()))))}playVideoOnLoad(t,e){this.videoEndedListener=()=>this.stopStreams(),this.videoCanPlayListener=()=>this.tryPlayVideo(t),t.addEventListener("ended",this.videoEndedListener),t.addEventListener("canplay",this.videoCanPlayListener),t.addEventListener("playing",e),this.tryPlayVideo(t)}isVideoPlaying(t){return t.currentTime>0&&!t.paused&&!t.ended&&t.readyState>2}tryPlayVideo(t){return v(this,void 0,void 0,(function*(){if(this.isVideoPlaying(t))console.warn("Trying to play video that is already playing.");else try{yield t.play()}catch(t){console.warn("It was not possible to play the video.")}}))}getMediaElement(t,e){const r=document.getElementById(t);if(!r)throw new a(`element with id '${t}' not found`);if(r.nodeName.toLowerCase()!==e.toLowerCase())throw new a(`element with id '${t}' must be an ${e} element`);return r}decodeFromImage(t,e){if(!t&&!e)throw new a("either imageElement with a src set or an url must be provided");return e&&!t?this.decodeFromImageUrl(e):this.decodeFromImageElement(t)}decodeFromVideo(t,e){if(!t&&!e)throw new a("Either an element with a src set or an URL must be provided");return e&&!t?this.decodeFromVideoUrl(e):this.decodeFromVideoElement(t)}decodeFromVideoContinuously(t,e,r){if(void 0===t&&void 0===e)throw new a("Either an element with a src set or an URL must be provided");return e&&!t?this.decodeFromVideoUrlContinuously(e,r):this.decodeFromVideoElementContinuously(t,r)}decodeFromImageElement(t){if(!t)throw new a("An image element must be provided.");this.reset();const e=this.prepareImageElement(t);let r;return this.imageElement=e,r=this.isImageLoaded(e)?this.decodeOnce(e,!1,!0):this._decodeOnLoadImage(e),r}decodeFromVideoElement(t){const e=this._decodeFromVideoElementSetup(t);return this._decodeOnLoadVideo(e)}decodeFromVideoElementContinuously(t,e){const r=this._decodeFromVideoElementSetup(t);return this._decodeOnLoadVideoContinuously(r,e)}_decodeFromVideoElementSetup(t){if(!t)throw new a("A video element must be provided.");this.reset();const e=this.prepareVideoElement(t);return this.videoElement=e,e}decodeFromImageUrl(t){if(!t)throw new a("An URL must be provided.");this.reset();const e=this.prepareImageElement();this.imageElement=e;const r=this._decodeOnLoadImage(e);return e.src=t,r}decodeFromVideoUrl(t){if(!t)throw new a("An URL must be provided.");this.reset();const e=this.prepareVideoElement(),r=this.decodeFromVideoElement(e);return e.src=t,r}decodeFromVideoUrlContinuously(t,e){if(!t)throw new a("An URL must be provided.");this.reset();const r=this.prepareVideoElement(),n=this.decodeFromVideoElementContinuously(r,e);return r.src=t,n}_decodeOnLoadImage(t){return new Promise(((e,r)=>{this.imageLoadedListener=()=>this.decodeOnce(t,!1,!0).then(e,r),t.addEventListener("load",this.imageLoadedListener)}))}_decodeOnLoadVideo(t){return v(this,void 0,void 0,(function*(){return yield this.playVideoOnLoadAsync(t),yield this.decodeOnce(t)}))}_decodeOnLoadVideoContinuously(t,e){return v(this,void 0,void 0,(function*(){yield this.playVideoOnLoadAsync(t),this.decodeContinuously(t,e)}))}isImageLoaded(t){return!!t.complete&&0!==t.naturalWidth}prepareImageElement(t){let e;return void 0===t&&(e=document.createElement("img"),e.width=200,e.height=200),"string"==typeof t&&(e=this.getMediaElement(t,"img")),t instanceof HTMLImageElement&&(e=t),e}prepareVideoElement(t){let e;return t||"undefined"==typeof document||(e=document.createElement("video"),e.width=200,e.height=200),"string"==typeof t&&(e=this.getMediaElement(t,"video")),t instanceof HTMLVideoElement&&(e=t),e.setAttribute("autoplay","true"),e.setAttribute("muted","true"),e.setAttribute("playsinline","true"),e}decodeOnce(t,e=!0,r=!0){this._stopAsyncDecode=!1;const n=(i,o)=>{if(this._stopAsyncDecode)return o(new D("Video stream has ended before any code could be detected.")),void(this._stopAsyncDecode=void 0);try{i(this.decode(t))}catch(t){if(e&&t instanceof D||(t instanceof h||t instanceof E)&&r)return setTimeout(n,this._timeBetweenDecodingAttempts,i,o);o(t)}};return new Promise(((t,e)=>n(t,e)))}decodeContinuously(t,e){this._stopContinuousDecode=!1;const r=()=>{if(this._stopContinuousDecode)this._stopContinuousDecode=void 0;else try{const n=this.decode(t);e(n,null),setTimeout(r,this.timeBetweenScansMillis)}catch(t){e(null,t),(t instanceof h||t instanceof E||t instanceof D)&&setTimeout(r,this._timeBetweenDecodingAttempts)}};r()}decode(t){const e=this.createBinaryBitmap(t);return this.decodeBitmap(e)}_isHTMLVideoElement(t){return 0!==t.videoWidth}drawFrameOnCanvas(t,e,r){e||(e={sx:0,sy:0,sWidth:t.videoWidth,sHeight:t.videoHeight,dx:0,dy:0,dWidth:t.videoWidth,dHeight:t.videoHeight}),r||(r=this.captureCanvasContext),r.drawImage(t,e.sx,e.sy,e.sWidth,e.sHeight,e.dx,e.dy,e.dWidth,e.dHeight)}drawImageOnCanvas(t,e,r=this.captureCanvasContext){e||(e={sx:0,sy:0,sWidth:t.naturalWidth,sHeight:t.naturalHeight,dx:0,dy:0,dWidth:t.naturalWidth,dHeight:t.naturalHeight}),r||(r=this.captureCanvasContext),r.drawImage(t,e.sx,e.sy,e.sWidth,e.sHeight,e.dx,e.dy,e.dWidth,e.dHeight)}createBinaryBitmap(t){this.getCaptureCanvasContext(t),this._isHTMLVideoElement(t)?this.drawFrameOnCanvas(t):this.drawImageOnCanvas(t);const e=this.getCaptureCanvas(t),r=new B(e),n=new R(r);return new l(n)}getCaptureCanvasContext(t){if(!this.captureCanvasContext){const e=this.getCaptureCanvas(t).getContext("2d");this.captureCanvasContext=e}return this.captureCanvasContext}getCaptureCanvas(t){if(!this.captureCanvas){const e=this.createCaptureCanvas(t);this.captureCanvas=e}return this.captureCanvas}decodeBitmap(t){return this.reader.decode(t,this._hints)}createCaptureCanvas(t){if("undefined"==typeof document)return this._destroyCaptureCanvas(),null;const e=document.createElement("canvas");let r,n;return void 0!==t&&(t instanceof HTMLVideoElement?(r=t.videoWidth,n=t.videoHeight):t instanceof HTMLImageElement&&(r=t.naturalWidth||t.width,n=t.naturalHeight||t.height)),e.style.width=r+"px",e.style.height=n+"px",e.width=r,e.height=n,e}stopStreams(){this.stream&&(this.stream.getVideoTracks().forEach((t=>t.stop())),this.stream=void 0),!1===this._stopAsyncDecode&&this.stopAsyncDecode(),!1===this._stopContinuousDecode&&this.stopContinuousDecode()}reset(){this.stopStreams(),this._destroyVideoElement(),this._destroyImageElement(),this._destroyCaptureCanvas()}_destroyVideoElement(){this.videoElement&&(void 0!==this.videoEndedListener&&this.videoElement.removeEventListener("ended",this.videoEndedListener),void 0!==this.videoPlayingEventListener&&this.videoElement.removeEventListener("playing",this.videoPlayingEventListener),void 0!==this.videoCanPlayListener&&this.videoElement.removeEventListener("loadedmetadata",this.videoCanPlayListener),this.cleanVideoSource(this.videoElement),this.videoElement=void 0)}_destroyImageElement(){this.imageElement&&(void 0!==this.imageLoadedListener&&this.imageElement.removeEventListener("load",this.imageLoadedListener),this.imageElement.src=void 0,this.imageElement.removeAttribute("src"),this.imageElement=void 0)}_destroyCaptureCanvas(){this.captureCanvasContext=void 0,this.captureCanvas=void 0}addVideoSource(t,e){try{t.srcObject=e}catch(r){t.src=URL.createObjectURL(e)}}cleanVideoSource(t){try{t.srcObject=null}catch(e){t.src=""}this.videoElement.removeAttribute("src")}}class x{constructor(t,e,r=(null==e?0:8*e.length),n,i,o=d.currentTimeMillis()){this.text=t,this.rawBytes=e,this.numBits=r,this.resultPoints=n,this.format=i,this.timestamp=o,this.text=t,this.rawBytes=e,this.numBits=null==r?null==e?0:8*e.length:r,this.resultPoints=n,this.format=i,this.resultMetadata=null,this.timestamp=null==o?d.currentTimeMillis():o}getText(){return this.text}getRawBytes(){return this.rawBytes}getNumBits(){return this.numBits}getResultPoints(){return this.resultPoints}getBarcodeFormat(){return this.format}getResultMetadata(){return this.resultMetadata}putMetadata(t,e){null===this.resultMetadata&&(this.resultMetadata=new Map),this.resultMetadata.set(t,e)}putAllMetadata(t){null!==t&&(null===this.resultMetadata?this.resultMetadata=t:this.resultMetadata=new Map(t))}addResultPoints(t){const e=this.resultPoints;if(null===e)this.resultPoints=t;else if(null!==t&&t.length>0){const r=new Array(e.length+t.length);d.arraycopy(e,0,r,0,e.length),d.arraycopy(t,0,r,e.length,t.length),this.resultPoints=r}}getTimestamp(){return this.timestamp}toString(){return this.text}}!function(t){t[t.AZTEC=0]="AZTEC",t[t.CODABAR=1]="CODABAR",t[t.CODE_39=2]="CODE_39",t[t.CODE_93=3]="CODE_93",t[t.CODE_128=4]="CODE_128",t[t.DATA_MATRIX=5]="DATA_MATRIX",t[t.EAN_8=6]="EAN_8",t[t.EAN_13=7]="EAN_13",t[t.ITF=8]="ITF",t[t.MAXICODE=9]="MAXICODE",t[t.PDF_417=10]="PDF_417",t[t.QR_CODE=11]="QR_CODE",t[t.RSS_14=12]="RSS_14",t[t.RSS_EXPANDED=13]="RSS_EXPANDED",t[t.UPC_A=14]="UPC_A",t[t.UPC_E=15]="UPC_E",t[t.UPC_EAN_EXTENSION=16]="UPC_EAN_EXTENSION"}(P||(P={}));var k,U=P;!function(t){t[t.OTHER=0]="OTHER",t[t.ORIENTATION=1]="ORIENTATION",t[t.BYTE_SEGMENTS=2]="BYTE_SEGMENTS",t[t.ERROR_CORRECTION_LEVEL=3]="ERROR_CORRECTION_LEVEL",t[t.ISSUE_NUMBER=4]="ISSUE_NUMBER",t[t.SUGGESTED_PRICE=5]="SUGGESTED_PRICE",t[t.POSSIBLE_COUNTRY=6]="POSSIBLE_COUNTRY",t[t.UPC_EAN_EXTENSION=7]="UPC_EAN_EXTENSION",t[t.PDF417_EXTRA_METADATA=8]="PDF417_EXTRA_METADATA",t[t.STRUCTURED_APPEND_SEQUENCE=9]="STRUCTURED_APPEND_SEQUENCE",t[t.STRUCTURED_APPEND_PARITY=10]="STRUCTURED_APPEND_PARITY"}(k||(k={}));var H,V,z,G,Y,X,W=k;class j{constructor(t,e,r,n,i=-1,o=-1){this.rawBytes=t,this.text=e,this.byteSegments=r,this.ecLevel=n,this.structuredAppendSequenceNumber=i,this.structuredAppendParity=o,this.numBits=null==t?0:8*t.length}getRawBytes(){return this.rawBytes}getNumBits(){return this.numBits}setNumBits(t){this.numBits=t}getText(){return this.text}getByteSegments(){return this.byteSegments}getECLevel(){return this.ecLevel}getErrorsCorrected(){return this.errorsCorrected}setErrorsCorrected(t){this.errorsCorrected=t}getErasures(){return this.erasures}setErasures(t){this.erasures=t}getOther(){return this.other}setOther(t){this.other=t}hasStructuredAppend(){return this.structuredAppendParity>=0&&this.structuredAppendSequenceNumber>=0}getStructuredAppendParity(){return this.structuredAppendParity}getStructuredAppendSequenceNumber(){return this.structuredAppendSequenceNumber}}class Z{exp(t){return this.expTable[t]}log(t){if(0===t)throw new c;return this.logTable[t]}static addOrSubtract(t,e){return t^e}}class Q{constructor(t,e){if(0===e.length)throw new c;this.field=t;const r=e.length;if(r>1&&0===e[0]){let t=1;for(;tr.length){const t=e;e=r,r=t}let n=new Int32Array(r.length);const i=r.length-e.length;d.arraycopy(r,0,n,0,i);for(let t=i;t=t.getDegree()&&!n.isZero();){const i=n.getDegree()-t.getDegree(),s=e.multiply(n.getCoefficient(n.getDegree()),o),a=t.multiplyByMonomial(i,s),c=e.buildMonomial(i,s);r=r.addOrSubtract(c),n=n.addOrSubtract(a)}return[r,n]}toString(){let t="";for(let e=this.getDegree();e>=0;e--){let r=this.getCoefficient(e);if(0!==r){if(r<0?(t+=" - ",r=-r):t.length>0&&(t+=" + "),0===e||1!==r){const e=this.field.log(r);0===e?t+="1":1===e?t+="a":(t+="a^",t+=e)}0!==e&&(1===e?t+="x":(t+="x^",t+=e))}}return t}}class K extends s{}K.kind="ArithmeticException";class q extends Z{constructor(t,e,r){super(),this.primitive=t,this.size=e,this.generatorBase=r;const n=new Int32Array(e);let i=1;for(let r=0;r=e&&(i^=t,i&=e-1);this.expTable=n;const o=new Int32Array(e);for(let t=0;t=(r/2|0);){let t=i,e=s;if(i=o,s=a,i.isZero())throw new J("r_{i-1} was zero");o=t;let r=n.getZero();const c=i.getCoefficient(i.getDegree()),l=n.inverse(c);for(;o.getDegree()>=i.getDegree()&&!o.isZero();){const t=o.getDegree()-i.getDegree(),e=n.multiply(o.getCoefficient(o.getDegree()),l);r=r.addOrSubtract(n.buildMonomial(t,e)),o=o.addOrSubtract(i.multiplyByMonomial(t,e))}if(a=r.multiply(s).addOrSubtract(e),o.getDegree()>=i.getDegree())throw new $("Division algorithm failed to reduce polynomial?")}const c=a.getCoefficient(0);if(0===c)throw new J("sigmaTilde(0) was zero");const l=n.inverse(c);return[a.multiplyScalar(l),o.multiplyScalar(l)]}findErrorLocations(t){const e=t.getDegree();if(1===e)return Int32Array.from([t.getCoefficient(1)]);const r=new Int32Array(e);let n=0;const i=this.field;for(let o=1;o1,h,h+r-1),h+=r-1;else for(let t=r-1;t>=0;--t)l[h++]=0!=(e&1<=8?et.readCode(t,e,8):et.readCode(t,e,r)<<8-r}static convertBoolArrayToByteArray(t){let e=new Uint8Array((t.length+7)/8);for(let r=0;r","?","[","]","{","}","CTRL_UL"],et.DIGIT_TABLE=["CTRL_PS"," ","0","1","2","3","4","5","6","7","8","9",",",".","CTRL_UL","CTRL_US"];class rt{constructor(){}static round(t){return NaN===t?0:t<=Number.MIN_SAFE_INTEGER?Number.MIN_SAFE_INTEGER:t>=Number.MAX_SAFE_INTEGER?Number.MAX_SAFE_INTEGER:t+(t<0?-.5:.5)|0}static distance(t,e,r,n){const i=t-r,o=e-n;return Math.sqrt(i*i+o*o)}static sum(t){let e=0;for(let r=0,n=t.length;r!==n;r++)e+=t[r];return e}}class nt{static floatToIntBits(t){return t}}nt.MAX_VALUE=Number.MAX_SAFE_INTEGER;class it{constructor(t,e){this.x=t,this.y=e}getX(){return this.x}getY(){return this.y}equals(t){if(t instanceof it){const e=t;return this.x===e.x&&this.y===e.y}return!1}hashCode(){return 31*nt.floatToIntBits(this.x)+nt.floatToIntBits(this.y)}toString(){return"("+this.x+","+this.y+")"}static orderBestPatterns(t){const e=this.distance(t[0],t[1]),r=this.distance(t[1],t[2]),n=this.distance(t[0],t[2]);let i,o,s;if(r>=e&&r>=n?(o=t[0],i=t[1],s=t[2]):n>=r&&n>=e?(o=t[1],i=t[0],s=t[2]):(o=t[2],i=t[0],s=t[1]),this.crossProductZ(i,o,s)<0){const t=i;i=s,s=t}t[0]=i,t[1]=o,t[2]=s}static distance(t,e){return rt.distance(t.x,t.y,e.x,e.y)}static crossProductZ(t,e,r){const n=e.x,i=e.y;return(r.x-n)*(t.y-i)-(r.y-i)*(t.x-n)}}class ot{constructor(t,e){this.bits=t,this.points=e}getBits(){return this.bits}getPoints(){return this.points}}class st extends ot{constructor(t,e,r,n,i){super(t,e),this.compact=r,this.nbDatablocks=n,this.nbLayers=i}getNbLayers(){return this.nbLayers}getNbDatablocks(){return this.nbDatablocks}isCompact(){return this.compact}}class at{constructor(t,e,r,n){this.image=t,this.height=t.getHeight(),this.width=t.getWidth(),null==e&&(e=at.INIT_SIZE),null==r&&(r=t.getWidth()/2|0),null==n&&(n=t.getHeight()/2|0);const i=e/2|0;if(this.leftInit=r-i,this.rightInit=r+i,this.upInit=n-i,this.downInit=n+i,this.upInit<0||this.leftInit<0||this.downInit>=this.height||this.rightInit>=this.width)throw new D}detect(){let t=this.leftInit,e=this.rightInit,r=this.upInit,n=this.downInit,i=!1,o=!0,s=!1,a=!1,c=!1,l=!1,h=!1;const u=this.width,d=this.height;for(;o;){o=!1;let f=!0;for(;(f||!a)&&e=u){i=!0;break}let g=!0;for(;(g||!c)&&n=d){i=!0;break}let w=!0;for(;(w||!l)&&t>=0;)w=this.containsBlackPoint(r,n,t,!1),w?(t--,o=!0,l=!0):l||t--;if(t<0){i=!0;break}let m=!0;for(;(m||!h)&&r>=0;)m=this.containsBlackPoint(t,e,r,!0),m?(r--,o=!0,h=!0):h||r--;if(r<0){i=!0;break}o&&(s=!0)}if(!i&&s){const i=e-t;let o=null;for(let e=1;null===o&&er||s<-1||s>n)throw new D;i=!1,-1===o?(e[t]=0,i=!0):o===r&&(e[t]=r-1,i=!0),-1===s?(e[t+1]=0,i=!0):s===n&&(e[t+1]=n-1,i=!0)}i=!0;for(let t=e.length-2;t>=0&&i;t-=2){const o=Math.floor(e[t]),s=Math.floor(e[t+1]);if(o<-1||o>r||s<-1||s>n)throw new D;i=!1,-1===o?(e[t]=0,i=!0):o===r&&(e[t]=r-1,i=!0),-1===s?(e[t+1]=0,i=!0):s===n&&(e[t+1]=n-1,i=!0)}}}class lt{constructor(t,e,r,n,i,o,s,a,c){this.a11=t,this.a21=e,this.a31=r,this.a12=n,this.a22=i,this.a32=o,this.a13=s,this.a23=a,this.a33=c}static quadrilateralToQuadrilateral(t,e,r,n,i,o,s,a,c,l,h,u,d,f,g,w){const m=lt.quadrilateralToSquare(t,e,r,n,i,o,s,a);return lt.squareToQuadrilateral(c,l,h,u,d,f,g,w).times(m)}transformPoints(t){const e=t.length,r=this.a11,n=this.a12,i=this.a13,o=this.a21,s=this.a22,a=this.a23,c=this.a31,l=this.a32,h=this.a33;for(let u=0;u>1&127):(n<<=10,n+=(e>>2&992)+(e>>1&31))}let i=this.getCorrectedParameterData(n,this.compact);this.compact?(this.nbLayers=1+(i>>6),this.nbDataBlocks=1+(63&i)):(this.nbLayers=1+(i>>11),this.nbDataBlocks=1+(2047&i))}getRotation(t,e){let r=0;t.forEach(((t,n,i)=>{r=(t>>e-2<<1)+(1&t)+(r<<3)})),r=((1&r)<<11)+(r>>1);for(let t=0;t<4;t++)if(m.bitCount(r^this.EXPECTED_CORNER_BITS[t])<=2)return t;throw new D}getCorrectedParameterData(t,e){let r,n;e?(r=7,n=2):(r=10,n=4);let i=r-n,o=new Int32Array(r);for(let e=r-1;e>=0;--e)o[e]=15&t,t>>=4;try{new tt(q.AZTEC_PARAM).decode(o,i)}catch(t){throw new D}let s=0;for(let t=0;t2){let r=this.distancePoint(c,t)*this.nbCenterLayers/(this.distancePoint(i,e)*(this.nbCenterLayers+2));if(r<.75||r>1.25||!this.isWhiteOrBlackRectangle(t,s,a,c))break}e=t,r=s,n=a,i=c,o=!o}if(5!==this.nbCenterLayers&&7!==this.nbCenterLayers)throw new D;this.compact=5===this.nbCenterLayers;let s=new it(e.getX()+.5,e.getY()-.5),a=new it(r.getX()+.5,r.getY()+.5),c=new it(n.getX()-.5,n.getY()+.5),l=new it(i.getX()-.5,i.getY()-.5);return this.expandSquare([s,a,c,l],2*this.nbCenterLayers-3,2*this.nbCenterLayers)}getMatrixCenter(){let t,e,r,n;try{let i=new at(this.image).detect();t=i[0],e=i[1],r=i[2],n=i[3]}catch(i){let o=this.image.getWidth()/2,s=this.image.getHeight()/2;t=this.getFirstDifferent(new dt(o+7,s-7),!1,1,-1).toResultPoint(),e=this.getFirstDifferent(new dt(o+7,s+7),!1,1,1).toResultPoint(),r=this.getFirstDifferent(new dt(o-7,s+7),!1,-1,1).toResultPoint(),n=this.getFirstDifferent(new dt(o-7,s-7),!1,-1,-1).toResultPoint()}let i=rt.round((t.getX()+n.getX()+e.getX()+r.getX())/4),o=rt.round((t.getY()+n.getY()+e.getY()+r.getY())/4);try{let s=new at(this.image,15,i,o).detect();t=s[0],e=s[1],r=s[2],n=s[3]}catch(s){t=this.getFirstDifferent(new dt(i+7,o-7),!1,1,-1).toResultPoint(),e=this.getFirstDifferent(new dt(i+7,o+7),!1,1,1).toResultPoint(),r=this.getFirstDifferent(new dt(i-7,o+7),!1,-1,1).toResultPoint(),n=this.getFirstDifferent(new dt(i-7,o-7),!1,-1,-1).toResultPoint()}return i=rt.round((t.getX()+n.getX()+e.getX()+r.getX())/4),o=rt.round((t.getY()+n.getY()+e.getY()+r.getY())/4),new dt(i,o)}getMatrixCornerPoints(t){return this.expandSquare(t,2*this.nbCenterLayers,this.getDimension())}sampleGrid(t,e,r,n,i){let o=ut.getInstance(),s=this.getDimension(),a=s/2-this.nbCenterLayers,c=s/2+this.nbCenterLayers;return o.sampleGrid(t,s,s,a,a,c,a,c,c,a,c,e.getX(),e.getY(),r.getX(),r.getY(),n.getX(),n.getY(),i.getX(),i.getY())}sampleLine(t,e,r){let n=0,i=this.distanceResultPoint(t,e),o=i/r,s=t.getX(),a=t.getY(),c=o*(e.getX()-t.getX())/i,l=o*(e.getY()-t.getY())/i;for(let t=0;t.1&&h<.9?0:h<=.1===c?1:-1}getFirstDifferent(t,e,r,n){let i=t.getX()+r,o=t.getY()+n;for(;this.isValid(i,o)&&this.image.get(i,o)===e;)i+=r,o+=n;for(i-=r,o-=n;this.isValid(i,o)&&this.image.get(i,o)===e;)i+=r;for(i-=r;this.isValid(i,o)&&this.image.get(i,o)===e;)o+=n;return o-=n,new dt(i,o)}expandSquare(t,e,r){let n=r/(2*e),i=t[0].getX()-t[2].getX(),o=t[0].getY()-t[2].getY(),s=(t[0].getX()+t[2].getX())/2,a=(t[0].getY()+t[2].getY())/2,c=new it(s+n*i,a+n*o),l=new it(s-n*i,a-n*o);return i=t[1].getX()-t[3].getX(),o=t[1].getY()-t[3].getY(),s=(t[1].getX()+t[3].getX())/2,a=(t[1].getY()+t[3].getY())/2,[c,new it(s+n*i,a+n*o),l,new it(s-n*i,a-n*o)]}isValid(t,e){return t>=0&&t0&&e{r.foundPossibleResultPoint(t)}))}}reset(){}}class wt{decode(t,e){try{return this.doDecode(t,e)}catch(r){if(e&&!0===e.get(C.TRY_HARDER)&&t.isRotateSupported()){const r=t.rotateCounterClockwise(),n=this.doDecode(r,e),i=n.getResultMetadata();let o=270;null!==i&&!0===i.get(W.ORIENTATION)&&(o+=i.get(W.ORIENTATION)%360),n.putMetadata(W.ORIENTATION,o);const s=n.getResultPoints();if(null!==s){const t=r.getHeight();for(let e=0;e>(o?8:5));let a;a=o?n:15;const c=Math.trunc(n/2);for(let o=0;o=n)break;try{i=t.getBlackRow(l,i)}catch(t){continue}for(let t=0;t<2;t++){if(1===t&&(i.reverse(),e&&!0===e.get(C.NEED_RESULT_POINT_CALLBACK))){const t=new Map;e.forEach(((e,r)=>t.set(r,e))),t.delete(C.NEED_RESULT_POINT_CALLBACK),e=t}try{const n=this.decodeRow(l,i,e);if(1===t){n.putMetadata(W.ORIENTATION,180);const t=n.getResultPoints();null!==t&&(t[0]=new it(r-t[0].getX()-1,t[0].getY()),t[1]=new it(r-t[1].getX()-1,t[1].getY()))}return n}catch(t){}}}throw new D}static recordPattern(t,e,r){const n=r.length;for(let t=0;t=i)throw new D;let o=!t.get(e),s=0,a=e;for(;a0&&n>=0;)t.get(--e)!==i&&(n--,i=!i);if(n>=0)throw new D;wt.recordPattern(t,e+1,r)}static patternMatchVariance(t,e,r){const n=t.length;let i=0,o=0;for(let r=0;ro?n-o:o-n;if(c>r)return Number.POSITIVE_INFINITY;a+=c}return a/i}}class mt extends wt{static findStartPattern(t){const e=t.getSize(),r=t.getNextSet(0);let n=0,i=Int32Array.from([0,0,0,0,0,0]),o=r,s=!1;for(let a=r;a=0&&t.isRange(Math.max(0,o-(a-o)/2),o,!1))return Int32Array.from([o,a,r]);o+=i[0]+i[1],i=i.slice(2,i.length-1),i[n-1]=0,i[n]=0,n--}else n++;i[n]=1,s=!s}throw new D}static decodeCode(t,e,r){wt.recordPattern(t,r,e);let n=mt.MAX_AVG_VARIANCE,i=-1;for(let t=0;t=0)return i;throw new D}decodeRow(t,e,r){const n=r&&!0===r.get(C.ASSUME_GS1),i=mt.findStartPattern(e),o=i[2];let s=0;const a=new Uint8Array(20);let c;switch(a[s++]=o,o){case mt.CODE_START_A:c=mt.CODE_CODE_A;break;case mt.CODE_START_B:c=mt.CODE_CODE_B;break;case mt.CODE_START_C:c=mt.CODE_CODE_C;break;default:throw new E}let l=!1,u=!1,d="",f=i[0],g=i[1];const w=Int32Array.from([0,0,0,0,0,0]);let m=0,p=0,A=o,I=0,S=!0,_=!1,T=!1;for(;!l;){const t=u;switch(u=!1,m=p,p=mt.decodeCode(e,w,g),a[s++]=p,p!==mt.CODE_STOP&&(S=!0),p!==mt.CODE_STOP&&(I++,A+=I*p),f=g,g+=w.reduce(((t,e)=>t+e),0),p){case mt.CODE_START_A:case mt.CODE_START_B:case mt.CODE_START_C:throw new E}switch(c){case mt.CODE_CODE_A:if(p<64)d+=T===_?String.fromCharCode(" ".charCodeAt(0)+p):String.fromCharCode(" ".charCodeAt(0)+p+128),T=!1;else if(p<96)d+=T===_?String.fromCharCode(p-64):String.fromCharCode(p+64),T=!1;else switch(p!==mt.CODE_STOP&&(S=!1),p){case mt.CODE_FNC_1:n&&(0===d.length?d+="]C1":d+=String.fromCharCode(29));break;case mt.CODE_FNC_2:case mt.CODE_FNC_3:break;case mt.CODE_FNC_4_A:!_&&T?(_=!0,T=!1):_&&T?(_=!1,T=!1):T=!0;break;case mt.CODE_SHIFT:u=!0,c=mt.CODE_CODE_B;break;case mt.CODE_CODE_B:c=mt.CODE_CODE_B;break;case mt.CODE_CODE_C:c=mt.CODE_CODE_C;break;case mt.CODE_STOP:l=!0}break;case mt.CODE_CODE_B:if(p<96)d+=T===_?String.fromCharCode(" ".charCodeAt(0)+p):String.fromCharCode(" ".charCodeAt(0)+p+128),T=!1;else switch(p!==mt.CODE_STOP&&(S=!1),p){case mt.CODE_FNC_1:n&&(0===d.length?d+="]C1":d+=String.fromCharCode(29));break;case mt.CODE_FNC_2:case mt.CODE_FNC_3:break;case mt.CODE_FNC_4_B:!_&&T?(_=!0,T=!1):_&&T?(_=!1,T=!1):T=!0;break;case mt.CODE_SHIFT:u=!0,c=mt.CODE_CODE_A;break;case mt.CODE_CODE_A:c=mt.CODE_CODE_A;break;case mt.CODE_CODE_C:c=mt.CODE_CODE_C;break;case mt.CODE_STOP:l=!0}break;case mt.CODE_CODE_C:if(p<100)p<10&&(d+="0"),d+=p;else switch(p!==mt.CODE_STOP&&(S=!1),p){case mt.CODE_FNC_1:n&&(0===d.length?d+="]C1":d+=String.fromCharCode(29));break;case mt.CODE_CODE_A:c=mt.CODE_CODE_A;break;case mt.CODE_CODE_B:c=mt.CODE_CODE_B;break;case mt.CODE_STOP:l=!0}}t&&(c=c===mt.CODE_CODE_A?mt.CODE_CODE_B:mt.CODE_CODE_A)}const y=g-f;if(g=e.getNextUnset(g),!e.isRange(g,Math.min(e.getSize(),g+(g-f)/2),!1))throw new D;if(A-=I*m,A%103!==m)throw new h;const N=d.length;if(0===N)throw new D;N>0&&S&&(d=c===mt.CODE_CODE_C?d.substring(0,N-2):d.substring(0,N-1));const M=(i[1]+i[0])/2,R=f+y/2,O=a.length,b=new Uint8Array(O);for(let t=0;tn&&(i=e);n=i,e=0;let o=0,s=0;for(let i=0;in&&(s|=1<0;i++){let r=t[i];if(r>n&&(e--,2*r>=o))return-1}return s}}while(e>3);return-1}static patternToChar(t){for(let e=0;e="A"&&i<="Z"))throw new E;o=String.fromCharCode(i.charCodeAt(0)+32);break;case"$":if(!(i>="A"&&i<="Z"))throw new E;o=String.fromCharCode(i.charCodeAt(0)-64);break;case"%":if(i>="A"&&i<="E")o=String.fromCharCode(i.charCodeAt(0)-38);else if(i>="F"&&i<="J")o=String.fromCharCode(i.charCodeAt(0)-11);else if(i>="K"&&i<="O")o=String.fromCharCode(i.charCodeAt(0)+16);else if(i>="P"&&i<="T")o=String.fromCharCode(i.charCodeAt(0)+43);else if("U"===i)o="\0";else if("V"===i)o="@";else if("W"===i)o="`";else{if("X"!==i&&"Y"!==i&&"Z"!==i)throw new E;o=""}break;case"/":if(i>="A"&&i<="O")o=String.fromCharCode(i.charCodeAt(0)-32);else{if("Z"!==i)throw new E;o=":"}}r+=o,n++}else r+=e}return r}}pt.ALPHABET_STRING="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%",pt.CHARACTER_ENCODINGS=[52,289,97,352,49,304,112,37,292,100,265,73,328,25,280,88,13,268,76,28,259,67,322,19,274,82,7,262,70,22,385,193,448,145,400,208,133,388,196,168,162,138,42],pt.ASTERISK_ENCODING=148;class At extends wt{constructor(){super(...arguments),this.narrowLineWidth=-1}decodeRow(t,e,r){let n=this.decodeStart(e),i=this.decodeEnd(e),o=new y;At.decodeMiddle(e,n[1],i[0],o);let s=o.toString(),a=null;null!=r&&(a=r.get(C.ALLOWED_LENGTHS)),null==a&&(a=At.DEFAULT_ALLOWED_LENGTHS);let c=s.length,l=!1,h=0;for(let t of a){if(c===t){l=!0;break}t>h&&(h=t)}if(!l&&c>h&&(l=!0),!l)throw new E;const u=[new it(n[1],t),new it(i[0],t)];return new x(s,null,0,u,U.ITF,(new Date).getTime())}static decodeMiddle(t,e,r,n){let i=new Int32Array(10),o=new Int32Array(5),s=new Int32Array(5);for(i.fill(0),o.fill(0),s.fill(0);e0&&n>=0&&!t.get(n);n--)r--;if(0!==r)throw new D}static skipWhiteSpace(t){const e=t.getSize(),r=t.getNextSet(0);if(r===e)throw new D;return r}decodeEnd(t){t.reverse();try{let e,r=At.skipWhiteSpace(t);try{e=At.findGuardPattern(t,r,At.END_PATTERN_REVERSED[0])}catch(n){n instanceof D&&(e=At.findGuardPattern(t,r,At.END_PATTERN_REVERSED[1]))}this.validateQuietZone(t,e[0]);let n=e[0];return e[0]=t.getSize()-e[1],e[1]=t.getSize()-n,e}finally{t.reverse()}}static findGuardPattern(t,e,r){let n=r.length,i=new Int32Array(n),o=t.getSize(),s=!1,a=0,c=e;i.fill(0);for(let l=e;l=0)return r%10;throw new D}}At.PATTERNS=[Int32Array.from([1,1,2,2,1]),Int32Array.from([2,1,1,1,2]),Int32Array.from([1,2,1,1,2]),Int32Array.from([2,2,1,1,1]),Int32Array.from([1,1,2,1,2]),Int32Array.from([2,1,2,1,1]),Int32Array.from([1,2,2,1,1]),Int32Array.from([1,1,1,2,2]),Int32Array.from([2,1,1,2,1]),Int32Array.from([1,2,1,2,1]),Int32Array.from([1,1,3,3,1]),Int32Array.from([3,1,1,1,3]),Int32Array.from([1,3,1,1,3]),Int32Array.from([3,3,1,1,1]),Int32Array.from([1,1,3,1,3]),Int32Array.from([3,1,3,1,1]),Int32Array.from([1,3,3,1,1]),Int32Array.from([1,1,1,3,3]),Int32Array.from([3,1,1,3,1]),Int32Array.from([1,3,1,3,1])],At.MAX_AVG_VARIANCE=.38,At.MAX_INDIVIDUAL_VARIANCE=.5,At.DEFAULT_ALLOWED_LENGTHS=[6,8,10,12,14],At.START_PATTERN=Int32Array.from([1,1,1,1]),At.END_PATTERN_REVERSED=[Int32Array.from([1,1,2]),Int32Array.from([1,1,3])];class Ct extends wt{constructor(){super(...arguments),this.decodeRowStringBuffer=""}static findStartGuardPattern(t){let e,r=!1,n=0,i=Int32Array.from([0,0,0]);for(;!r;){i=Int32Array.from([0,0,0]),e=Ct.findGuardPattern(t,n,!1,this.START_END_PATTERN,i);let o=e[0];n=e[1];let s=o-(n-o);s>=0&&(r=t.isRange(s,o,!1))}return e}static checkChecksum(t){return Ct.checkStandardUPCEANChecksum(t)}static checkStandardUPCEANChecksum(t){let e=t.length;if(0===e)return!1;let r=parseInt(t.charAt(e-1),10);return Ct.getStandardUPCEANChecksum(t.substring(0,e-1))===r}static getStandardUPCEANChecksum(t){let e=t.length,r=0;for(let n=e-1;n>=0;n-=2){let e=t.charAt(n).charCodeAt(0)-"0".charCodeAt(0);if(e<0||e>9)throw new E;r+=e}r*=3;for(let n=e-2;n>=0;n-=2){let e=t.charAt(n).charCodeAt(0)-"0".charCodeAt(0);if(e<0||e>9)throw new E;r+=e}return(1e3-r)%10}static decodeEnd(t,e){return Ct.findGuardPattern(t,e,!1,Ct.START_END_PATTERN,new Int32Array(Ct.START_END_PATTERN.length).fill(0))}static findGuardPatternWithoutCounters(t,e,r,n){return this.findGuardPattern(t,e,r,n,new Int32Array(n.length))}static findGuardPattern(t,e,r,n,i){let o=t.getSize(),s=0,a=e=r?t.getNextUnset(e):t.getNextSet(e),c=n.length,l=r;for(let r=e;r=0)return o;throw new D}}Ct.MAX_AVG_VARIANCE=.48,Ct.MAX_INDIVIDUAL_VARIANCE=.7,Ct.START_END_PATTERN=Int32Array.from([1,1,1]),Ct.MIDDLE_PATTERN=Int32Array.from([1,1,1,1,1]),Ct.END_PATTERN=Int32Array.from([1,1,1,1,1,1]),Ct.L_PATTERNS=[Int32Array.from([3,2,1,1]),Int32Array.from([2,2,2,1]),Int32Array.from([2,1,2,2]),Int32Array.from([1,4,1,1]),Int32Array.from([1,1,3,2]),Int32Array.from([1,2,3,1]),Int32Array.from([1,1,1,4]),Int32Array.from([1,3,1,2]),Int32Array.from([1,2,1,3]),Int32Array.from([3,1,1,2])];class Et{constructor(){this.CHECK_DIGIT_ENCODINGS=[24,20,18,17,12,6,3,10,9,5],this.decodeMiddleCounters=Int32Array.from([0,0,0,0]),this.decodeRowStringBuffer=""}decodeRow(t,e,r){let n=this.decodeRowStringBuffer,i=this.decodeMiddle(e,r,n),o=n.toString(),s=Et.parseExtensionString(o),a=[new it((r[0]+r[1])/2,t),new it(i,t)],c=new x(o,null,0,a,U.UPC_EAN_EXTENSION,(new Date).getTime());return null!=s&&c.putAllMetadata(s),c}decodeMiddle(t,e,r){let n=this.decodeMiddleCounters;n[0]=0,n[1]=0,n[2]=0,n[3]=0;let i=t.getSize(),o=e[1],s=0;for(let e=0;e<5&&o=10&&(s|=1<<4-e),4!==e&&(o=t.getNextSet(o),o=t.getNextUnset(o))}if(5!==r.length)throw new D;let a=this.determineCheckDigit(s);if(Et.extensionChecksum(r.toString())!==a)throw new D;return o}static extensionChecksum(t){let e=t.length,r=0;for(let n=e-2;n>=0;n-=2)r+=t.charAt(n).charCodeAt(0)-"0".charCodeAt(0);r*=3;for(let n=e-1;n>=0;n-=2)r+=t.charAt(n).charCodeAt(0)-"0".charCodeAt(0);return r*=3,r%10}determineCheckDigit(t){for(let e=0;e<10;e++)if(t===this.CHECK_DIGIT_ENCODINGS[e])return e;throw new D}static parseExtensionString(t){if(5!==t.length)return null;let e=Et.parseExtension5String(t);return null==e?null:new Map([[W.SUGGESTED_PRICE,e]])}static parseExtension5String(t){let e;switch(t.charAt(0)){case"0":e="£";break;case"5":e="$";break;case"9":switch(t){case"90000":return null;case"99991":return"0.00";case"99990":return"Used"}e="";break;default:e=""}let r=parseInt(t.substring(1)),n=r%100;return e+(r/100).toString()+"."+(n<10?"0"+n:n.toString())}}class It{constructor(){this.decodeMiddleCounters=Int32Array.from([0,0,0,0]),this.decodeRowStringBuffer=""}decodeRow(t,e,r){let n=this.decodeRowStringBuffer,i=this.decodeMiddle(e,r,n),o=n.toString(),s=It.parseExtensionString(o),a=[new it((r[0]+r[1])/2,t),new it(i,t)],c=new x(o,null,0,a,U.UPC_EAN_EXTENSION,(new Date).getTime());return null!=s&&c.putAllMetadata(s),c}decodeMiddle(t,e,r){let n=this.decodeMiddleCounters;n[0]=0,n[1]=0,n[2]=0,n[3]=0;let i=t.getSize(),o=e[1],s=0;for(let e=0;e<2&&o=10&&(s|=1<<1-e),1!==e&&(o=t.getNextSet(o),o=t.getNextUnset(o))}if(2!==r.length)throw new D;if(parseInt(r.toString())%4!==s)throw new D;return o}static parseExtensionString(t){return 2!==t.length?null:new Map([[W.ISSUE_NUMBER,parseInt(t)]])}}class St{static decodeRow(t,e,r){let n=Ct.findGuardPattern(e,r,!1,this.EXTENSION_START_PATTERN,new Int32Array(this.EXTENSION_START_PATTERN.length).fill(0));try{return(new Et).decodeRow(t,e,n)}catch(r){return(new It).decodeRow(t,e,n)}}}St.EXTENSION_START_PATTERN=Int32Array.from([1,1,2]);class _t extends Ct{constructor(){super(),this.decodeRowStringBuffer="",_t.L_AND_G_PATTERNS=_t.L_PATTERNS.map((t=>Int32Array.from(t)));for(let t=10;t<20;t++){let e=_t.L_PATTERNS[t-10],r=new Int32Array(e.length);for(let t=0;t=e.getSize()||!e.isRange(l,u,!1))throw new D;let d=a.toString();if(d.length<8)throw new E;if(!_t.checkChecksum(d))throw new h;let f=(n[1]+n[0])/2,g=(c[1]+c[0])/2,w=this.getBarcodeFormat(),m=[new it(f,t),new it(g,t)],p=new x(d,null,0,m,w,(new Date).getTime()),A=0;try{let r=St.decodeRow(t,e,c[1]);p.putMetadata(W.UPC_EAN_EXTENSION,r.getText()),p.putAllMetadata(r.getResultMetadata()),p.addResultPoints(r.getResultPoints()),A=r.getText().length}catch(t){}let I=null==r?null:r.get(C.ALLOWED_EAN_EXTENSIONS);if(null!=I){let t=!1;for(let e in I)if(A.toString()===e){t=!0;break}if(!t)throw new D}return p}decodeEnd(t,e){return _t.findGuardPattern(t,e,!1,_t.START_END_PATTERN,new Int32Array(_t.START_END_PATTERN.length).fill(0))}static checkChecksum(t){return _t.checkStandardUPCEANChecksum(t)}static checkStandardUPCEANChecksum(t){let e=t.length;if(0===e)return!1;let r=parseInt(t.charAt(e-1),10);return _t.getStandardUPCEANChecksum(t.substring(0,e-1))===r}static getStandardUPCEANChecksum(t){let e=t.length,r=0;for(let n=e-1;n>=0;n-=2){let e=t.charAt(n).charCodeAt(0)-"0".charCodeAt(0);if(e<0||e>9)throw new E;r+=e}r*=3;for(let n=e-2;n>=0;n-=2){let e=t.charAt(n).charCodeAt(0)-"0".charCodeAt(0);if(e<0||e>9)throw new E;r+=e}return(1e3-r)%10}}class Tt extends _t{constructor(){super(),this.decodeMiddleCounters=Int32Array.from([0,0,0,0])}decodeMiddle(t,e,r){let n=this.decodeMiddleCounters;n[0]=0,n[1]=0,n[2]=0,n[3]=0;let i=t.getSize(),o=e[1],s=0;for(let e=0;e<6&&o=10&&(s|=1<<5-e)}r=Tt.determineFirstDigit(r,s),o=_t.findGuardPattern(t,o,!0,_t.MIDDLE_PATTERN,new Int32Array(_t.MIDDLE_PATTERN.length).fill(0))[1];for(let e=0;e<6&&ot));n[0]=0,n[1]=0,n[2]=0,n[3]=0;const i=t.getSize();let o=e[1],s=0;for(let e=0;e<6&&o=10&&(s|=1<<5-e)}return{rowOffset:o,resultString:Dt.determineNumSysAndCheckDigit(r,s)}}decodeEnd(t,e){return Dt.findGuardPatternWithoutCounters(t,e,!0,Dt.MIDDLE_END_PATTERN)}checkChecksum(t){return _t.checkChecksum(Dt.convertUPCEtoUPCA(t))}static determineNumSysAndCheckDigit(t,e){for(let r=0;r<=1;r++)for(let n=0;n<10;n++)if(e===this.NUMSYS_AND_CHECK_DIGIT_PATTERNS[r][n])return String.fromCharCode("0".charCodeAt(0)+r)+t+String.fromCharCode("0".charCodeAt(0)+n);throw D.getNotFoundInstance()}getBarcodeFormat(){return U.UPC_E}static convertUPCEtoUPCA(t){const e=t.slice(1,7).split("").map((t=>t.charCodeAt(0))),r=new y;r.append(t.charAt(0));let n=e[5];switch(n){case 0:case 1:case 2:r.appendChars(e,0,2),r.append(n),r.append("0000"),r.appendChars(e,2,3);break;case 3:r.appendChars(e,0,3),r.append("00000"),r.appendChars(e,3,2);break;case 4:r.appendChars(e,0,4),r.append("00000"),r.append(e[4]);break;default:r.appendChars(e,0,5),r.append("0000"),r.append(n)}return t.length>=8&&r.append(t.charAt(7)),r.toString()}}Dt.MIDDLE_END_PATTERN=Int32Array.from([1,1,1,1,1,1]),Dt.NUMSYS_AND_CHECK_DIGIT_PATTERNS=[Int32Array.from([56,52,50,49,44,38,35,42,41,37]),Int32Array.from([7,11,13,14,19,25,28,21,22,26])];class Mt extends wt{constructor(t){super();let r=null==t?null:t.get(C.POSSIBLE_FORMATS),n=[];e(r)?(n.push(new Tt),n.push(new Nt),n.push(new yt),n.push(new Dt)):(r.indexOf(U.EAN_13)>-1&&n.push(new Tt),r.indexOf(U.UPC_A)>-1&&n.push(new Nt),r.indexOf(U.EAN_8)>-1&&n.push(new yt),r.indexOf(U.UPC_E)>-1&&n.push(new Dt)),this.readers=n}decodeRow(t,e,r){for(let n of this.readers)try{const i=n.decodeRow(t,e,r),o=i.getBarcodeFormat()===U.EAN_13&&"0"===i.getText().charAt(0),s=null==r?null:r.get(C.POSSIBLE_FORMATS),a=null==s||s.includes(U.UPC_A);if(o&&a){const t=i.getRawBytes(),e=new x(i.getText().substring(1),t,t?t.length:null,i.getResultPoints(),U.UPC_A);return e.putAllMetadata(i.getResultMetadata()),e}return i}catch(t){}throw new D}reset(){for(let t of this.readers)t.reset()}}class Rt extends wt{constructor(){super(),this.decodeFinderCounters=new Int32Array(4),this.dataCharacterCounters=new Int32Array(8),this.oddRoundingErrors=new Array(4),this.evenRoundingErrors=new Array(4),this.oddCounts=new Array(this.dataCharacterCounters.length/2),this.evenCounts=new Array(this.dataCharacterCounters.length/2)}getDecodeFinderCounters(){return this.decodeFinderCounters}getDataCharacterCounters(){return this.dataCharacterCounters}getOddRoundingErrors(){return this.oddRoundingErrors}getEvenRoundingErrors(){return this.evenRoundingErrors}getOddCounts(){return this.oddCounts}getEvenCounts(){return this.evenCounts}parseFinderValue(t,e){for(let r=0;rn&&(n=e[i],r=i);t[r]++}static decrement(t,e){let r=0,n=e[0];for(let i=1;i=Rt.MIN_FINDER_PATTERN_RATIO&&r<=Rt.MAX_FINDER_PATTERN_RATIO){let e=Number.MAX_SAFE_INTEGER,r=Number.MIN_SAFE_INTEGER;for(let n of t)n>r&&(r=n),n=s-a-1&&(t-=Bt.combins(n-c-(s-a),s-a-2)),s-a-1>1){let r=0;for(let t=n-c-(s-a-2);t>e;t--)r+=Bt.combins(n-c-t-1,s-a-3);t-=r*(s-1-a)}else n-c>e&&t--;i+=t}n-=c}return i}static combins(t,e){let r,n;t-e>e?(n=e,r=t-e):(n=t-e,r=e);let i=1,o=1;for(let e=t;e>r;e--)i*=e,o<=n&&(i/=o,o++);for(;o<=n;)i/=o,o++;return i}}class Lt{static buildBitArray(t){let e=2*t.length-1;null==t[t.length-1].getRightChar()&&(e-=1);let r=new p(12*e),n=0,i=t[0].getRightChar().getValue();for(let t=11;t>=0;--t)0!=(i&1<=0;--t)0!=(o&1<=0;--e)0!=(t&1<10||r<0||r>10)throw new E;this.firstDigit=e,this.secondDigit=r}getFirstDigit(){return this.firstDigit}getSecondDigit(){return this.secondDigit}getValue(){return 10*this.firstDigit+this.secondDigit}isFirstDigitFNC1(){return this.firstDigit===kt.FNC1}isSecondDigitFNC1(){return this.secondDigit===kt.FNC1}isAnyFNC1(){return this.firstDigit===kt.FNC1||this.secondDigit===kt.FNC1}}kt.FNC1=10;class Ut{constructor(){}static parseFieldsInGeneralPurpose(t){if(!t)return null;if(t.length<2)throw new D;let e=t.substring(0,2);for(let r of Ut.TWO_DIGIT_DATA_LENGTH)if(r[0]===e)return r[1]===Ut.VARIABLE_LENGTH?Ut.processVariableAI(2,r[2],t):Ut.processFixedAI(2,r[1],t);if(t.length<3)throw new D;let r=t.substring(0,3);for(let e of Ut.THREE_DIGIT_DATA_LENGTH)if(e[0]===r)return e[1]===Ut.VARIABLE_LENGTH?Ut.processVariableAI(3,e[2],t):Ut.processFixedAI(3,e[1],t);for(let e of Ut.THREE_DIGIT_PLUS_DIGIT_DATA_LENGTH)if(e[0]===r)return e[1]===Ut.VARIABLE_LENGTH?Ut.processVariableAI(4,e[2],t):Ut.processFixedAI(4,e[1],t);if(t.length<4)throw new D;let n=t.substring(0,4);for(let e of Ut.FOUR_DIGIT_DATA_LENGTH)if(e[0]===n)return e[1]===Ut.VARIABLE_LENGTH?Ut.processVariableAI(4,e[2],t):Ut.processFixedAI(4,e[1],t);throw new D}static processFixedAI(t,e,r){if(r.lengththis.information.getSize())return t+4<=this.information.getSize();for(let e=t;ethis.information.getSize()){let e=this.extractNumericValueFromBitArray(t,4);return new kt(this.information.getSize(),0===e?kt.FNC1:e-1,kt.FNC1)}let e=this.extractNumericValueFromBitArray(t,7);return new kt(t+7,(e-8)/11,(e-8)%11)}extractNumericValueFromBitArray(t,e){return Ht.extractNumericValueFromBitArray(this.information,t,e)}static extractNumericValueFromBitArray(t,e,r){let n=0;for(let i=0;ithis.information.getSize())return!1;let e=this.extractNumericValueFromBitArray(t,5);if(e>=5&&e<16)return!0;if(t+7>this.information.getSize())return!1;let r=this.extractNumericValueFromBitArray(t,7);if(r>=64&&r<116)return!0;if(t+8>this.information.getSize())return!1;let n=this.extractNumericValueFromBitArray(t,8);return n>=232&&n<253}decodeIsoIec646(t){let e=this.extractNumericValueFromBitArray(t,5);if(15===e)return new Ft(t+5,Ft.FNC1);if(e>=5&&e<15)return new Ft(t+5,"0"+(e-5));let r,n=this.extractNumericValueFromBitArray(t,7);if(n>=64&&n<90)return new Ft(t+7,""+(n+1));if(n>=90&&n<116)return new Ft(t+7,""+(n+7));switch(this.extractNumericValueFromBitArray(t,8)){case 232:r="!";break;case 233:r='"';break;case 234:r="%";break;case 235:r="&";break;case 236:r="'";break;case 237:r="(";break;case 238:r=")";break;case 239:r="*";break;case 240:r="+";break;case 241:r=",";break;case 242:r="-";break;case 243:r=".";break;case 244:r="/";break;case 245:r=":";break;case 246:r=";";break;case 247:r="<";break;case 248:r="=";break;case 249:r=">";break;case 250:r="?";break;case 251:r="_";break;case 252:r=" ";break;default:throw new E}return new Ft(t+8,r)}isStillAlpha(t){if(t+5>this.information.getSize())return!1;let e=this.extractNumericValueFromBitArray(t,5);if(e>=5&&e<16)return!0;if(t+6>this.information.getSize())return!1;let r=this.extractNumericValueFromBitArray(t,6);return r>=16&&r<63}decodeAlphanumeric(t){let e=this.extractNumericValueFromBitArray(t,5);if(15===e)return new Ft(t+5,Ft.FNC1);if(e>=5&&e<15)return new Ft(t+5,"0"+(e-5));let r,n=this.extractNumericValueFromBitArray(t,6);if(n>=32&&n<58)return new Ft(t+6,""+(n+33));switch(n){case 58:r="*";break;case 59:r=",";break;case 60:r="-";break;case 61:r=".";break;case 62:r="/";break;default:throw new $("Decoding invalid alphanumeric value: "+n)}return new Ft(t+6,r)}isAlphaTo646ToAlphaLatch(t){if(t+1>this.information.getSize())return!1;for(let e=0;e<5&&e+tthis.information.getSize())return!1;for(let e=t;ethis.information.getSize())return!1;for(let e=0;e<4&&e+t{e.forEach((e=>{t.getLeftChar().getValue()===e.getLeftChar().getValue()&&t.getRightChar().getValue()===e.getRightChar().getValue()&&t.getFinderPatter().getValue()===e.getFinderPatter().getValue()&&(r=!0)}))})),r}}class ee extends Rt{constructor(t){super(...arguments),this.pairs=new Array(ee.MAX_PAIRS),this.rows=new Array,this.startEnd=[2],this.verbose=!0===t}decodeRow(t,e,r){this.pairs.length=0,this.startFromEven=!1;try{return ee.constructResult(this.decodeRow2pairs(t,e))}catch(t){this.verbose&&console.log(t)}return this.pairs.length=0,this.startFromEven=!0,ee.constructResult(this.decodeRow2pairs(t,e))}reset(){this.pairs.length=0,this.rows.length=0}decodeRow2pairs(t,e){let r,n=!1;for(;!n;)try{this.pairs.push(this.retrieveNextPair(e,this.pairs,t))}catch(t){if(t instanceof D){if(!this.pairs.length)throw new D;n=!0}}if(this.checkChecksum())return this.pairs;if(r=!!this.rows.length,this.storeRow(t,!1),r){let t=this.checkRowsBoolean(!1);if(null!=t)return t;if(t=this.checkRowsBoolean(!0),null!=t)return t}throw new D}checkRowsBoolean(t){if(this.rows.length>25)return this.rows.length=0,null;this.pairs.length=0,t&&(this.rows=this.rows.reverse());let e=null;try{e=this.checkRows(new Array,0)}catch(t){this.verbose&&console.log(t)}return t&&(this.rows=this.rows.reverse()),e}checkRows(t,e){for(let r=e;re.length)continue;let r=!0;for(let n=0;nt){i=e.isEquivalent(this.pairs);break}n=e.isEquivalent(this.pairs),r++}i||n||ee.isPartialRow(this.pairs,this.rows)||(this.rows.push(r,new te(this.pairs,t,e)),this.removePartialRows(this.pairs,this.rows))}removePartialRows(t,e){for(let r of e)if(r.getPairs().length!==t.length)for(let e of r.getPairs())for(let r of t)if($t.equals(e,r))break}static isPartialRow(t,e){for(let r of e){let e=!0;for(let n of t){let t=!1;for(let e of r.getPairs())if(n.equals(e)){t=!0;break}if(!t){e=!1;break}}if(e)return!0}return!1}getRows(){return this.rows}static constructResult(t){let e=Jt(Lt.buildBitArray(t)).parseInformation(),r=t[0].getFinderPattern().getResultPoints(),n=t[t.length-1].getFinderPattern().getResultPoints(),i=[r[0],r[1],n[0],n[1]];return new x(e,null,null,i,U.RSS_EXPANDED,null)}checkChecksum(){let t=this.pairs.get(0),e=t.getLeftChar(),r=t.getRightChar();if(null==r)return!1;let n=r.getChecksumPortion(),i=2;for(let t=1;t=0?r:this.isEmptyPair(e)?0:e[e.length-1].getFinderPattern().getStartEnd()[1];let s=e.length%2!=0;this.startFromEven&&(s=!s);let a=!1;for(;i=0&&!t.get(e);)e--;e++,n=this.startEnd[0]-e,i=e,o=this.startEnd[1]}else i=this.startEnd[0],o=t.getNextUnset(this.startEnd[1]+1),n=o-this.startEnd[1];let s,a=this.getDecodeFinderCounters();d.arraycopy(a,0,a,1,a.length-1),a[0]=n;try{s=this.parseFinderValue(a,ee.FINDER_PATTERNS)}catch(t){return null}return new bt(s,[i,o],i,o,e)}decodeDataCharacter(t,e,r,n){let i=this.getDataCharacterCounters();for(let t=0;t.3)throw new D;let a=this.getOddCounts(),c=this.getEvenCounts(),l=this.getOddRoundingErrors(),h=this.getEvenRoundingErrors();for(let t=0;t8){if(e>8.7)throw new D;r=8}let n=t/2;0==(1&t)?(a[n]=r,l[n]=e-r):(c[n]=r,h[n]=e-r)}this.adjustOddEvenCounts(17);let u=4*e.getValue()+(r?0:2)+(n?0:1)-1,d=0,f=0;for(let t=a.length-1;t>=0;t--){if(ee.isNotA1left(e,r,n)){let e=ee.WEIGHTS[u][2*t];f+=a[t]*e}d+=a[t]}let g=0;for(let t=c.length-1;t>=0;t--)if(ee.isNotA1left(e,r,n)){let e=ee.WEIGHTS[u][2*t+1];g+=c[t]*e}let w=f+g;if(0!=(1&d)||d>13||d<4)throw new D;let m=(13-d)/2,p=ee.SYMBOL_WIDEST[m],A=9-p,C=Bt.getRSSvalue(a,p,!0),E=Bt.getRSSvalue(c,A,!1),I=ee.EVEN_TOTAL_SUBSET[m],S=ee.GSUM[m];return new Ot(C*I+E+S,w)}static isNotA1left(t,e,r){return!(0==t.getValue()&&e&&r)}adjustOddEvenCounts(t){let e=rt.sum(new Int32Array(this.getOddCounts())),r=rt.sum(new Int32Array(this.getEvenCounts())),n=!1,i=!1;e>13?i=!0:e<4&&(n=!0);let o=!1,s=!1;r>13?s=!0:r<4&&(o=!0);let a=e+r-t,c=1==(1&e),l=0==(1&r);if(1==a)if(c){if(l)throw new D;i=!0}else{if(!l)throw new D;s=!0}else if(-1==a)if(c){if(l)throw new D;n=!0}else{if(!l)throw new D;o=!0}else{if(0!=a)throw new D;if(c){if(!l)throw new D;e1)for(let e of this.possibleRightPairs)if(e.getCount()>1&&ne.checkChecksum(t,e))return ne.constructResult(t,e);throw new D}static addOrTally(t,e){if(null==e)return;let r=!1;for(let n of t)if(n.getValue()===e.getValue()){n.incrementCount(),r=!0;break}r||t.push(e)}reset(){this.possibleLeftPairs.length=0,this.possibleRightPairs.length=0}static constructResult(t,e){let r=4537077*t.getValue()+e.getValue(),n=new String(r).toString(),i=new y;for(let t=13-n.length;t>0;t--)i.append("0");i.append(n);let o=0;for(let t=0;t<13;t++){let e=i.charAt(t).charCodeAt(0)-"0".charCodeAt(0);o+=0==(1&t)?3*e:e}o=10-o%10,10===o&&(o=0),i.append(o.toString());let s=t.getFinderPattern().getResultPoints(),a=e.getFinderPattern().getResultPoints();return new x(i.toString(),null,0,[s[0],s[1],a[0],a[1]],U.RSS_14,(new Date).getTime())}static checkChecksum(t,e){let r=(t.getChecksumPortion()+16*e.getChecksumPortion())%79,n=9*t.getFinderPattern().getValue()+e.getFinderPattern().getValue();return n>72&&n--,n>8&&n--,r===n}decodePair(t,e,r,n){try{let i=this.findFinderPattern(t,e),o=this.parseFoundFinderPattern(t,r,e,i),s=null==n?null:n.get(C.NEED_RESULT_POINT_CALLBACK);if(null!=s){let n=(i[0]+i[1])/2;e&&(n=t.getSize()-1-n),s.foundPossibleResultPoint(new it(n,r))}let a=this.decodeDataCharacter(t,o,!0),c=this.decodeDataCharacter(t,o,!1);return new re(1597*a.getValue()+c.getValue(),a.getChecksumPortion()+4*c.getChecksumPortion(),o)}catch(t){return null}}decodeDataCharacter(t,e,r){let n=this.getDataCharacterCounters();for(let t=0;t8&&(r=8);let i=Math.floor(t/2);0==(1&t)?(s[i]=r,c[i]=e-r):(a[i]=r,l[i]=e-r)}this.adjustOddEvenCounts(r,i);let h=0,u=0;for(let t=s.length-1;t>=0;t--)u*=9,u+=s[t],h+=s[t];let d=0,f=0;for(let t=a.length-1;t>=0;t--)d*=9,d+=a[t],f+=a[t];let g=u+3*d;if(r){if(0!=(1&h)||h>12||h<4)throw new D;let t=(12-h)/2,e=ne.OUTSIDE_ODD_WIDEST[t],r=9-e,n=Bt.getRSSvalue(s,e,!1),i=Bt.getRSSvalue(a,r,!0),o=ne.OUTSIDE_EVEN_TOTAL_SUBSET[t],c=ne.OUTSIDE_GSUM[t];return new Ot(n*o+i+c,g)}{if(0!=(1&f)||f>10||f<4)throw new D;let t=(10-f)/2,e=ne.INSIDE_ODD_WIDEST[t],r=9-e,n=Bt.getRSSvalue(s,e,!0),i=Bt.getRSSvalue(a,r,!1),o=ne.INSIDE_ODD_TOTAL_SUBSET[t],c=ne.INSIDE_GSUM[t];return new Ot(i*o+n+c,g)}}findFinderPattern(t,e){let r=this.getDecodeFinderCounters();r[0]=0,r[1]=0,r[2]=0,r[3]=0;let n=t.getSize(),i=!1,o=0;for(;o=0&&i!==t.get(o);)o--;o++;const s=n[0]-o,a=this.getDecodeFinderCounters(),c=new Int32Array(a.length);d.arraycopy(a,0,c,1,a.length-1),c[0]=s;const l=this.parseFinderValue(c,ne.FINDER_PATTERNS);let h=o,u=n[1];return r&&(h=t.getSize()-1-h,u=t.getSize()-1-u),new bt(l,[o,n[1]],h,u,e)}adjustOddEvenCounts(t,e){let r=rt.sum(new Int32Array(this.getOddCounts())),n=rt.sum(new Int32Array(this.getEvenCounts())),i=!1,o=!1,s=!1,a=!1;t?(r>12?o=!0:r<4&&(i=!0),n>12?a=!0:n<4&&(s=!0)):(r>11?o=!0:r<5&&(i=!0),n>10?a=!0:n<4&&(s=!0));let c=r+n-e,l=(1&r)==(t?1:0),h=1==(1&n);if(1===c)if(l){if(h)throw new D;o=!0}else{if(!h)throw new D;a=!0}else if(-1===c)if(l){if(h)throw new D;i=!0}else{if(!h)throw new D;s=!0}else{if(0!==c)throw new D;if(l){if(!h)throw new D;rt.reset()))}}class oe{constructor(t,e,r){this.ecCodewords=t,this.ecBlocks=[e],r&&this.ecBlocks.push(r)}getECCodewords(){return this.ecCodewords}getECBlocks(){return this.ecBlocks}}class se{constructor(t,e){this.count=t,this.dataCodewords=e}getCount(){return this.count}getDataCodewords(){return this.dataCodewords}}class ae{constructor(t,e,r,n,i,o){this.versionNumber=t,this.symbolSizeRows=e,this.symbolSizeColumns=r,this.dataRegionSizeRows=n,this.dataRegionSizeColumns=i,this.ecBlocks=o;let s=0;const a=o.getECCodewords(),c=o.getECBlocks();for(let t of c)s+=t.getCount()*(t.getDataCodewords()+a);this.totalCodewords=s}getVersionNumber(){return this.versionNumber}getSymbolSizeRows(){return this.symbolSizeRows}getSymbolSizeColumns(){return this.symbolSizeColumns}getDataRegionSizeRows(){return this.dataRegionSizeRows}getDataRegionSizeColumns(){return this.dataRegionSizeColumns}getTotalCodewords(){return this.totalCodewords}getECBlocks(){return this.ecBlocks}static getVersionForDimensions(t,e){if(0!=(1&t)||0!=(1&e))throw new E;for(let r of ae.VERSIONS)if(r.symbolSizeRows===t&&r.symbolSizeColumns===e)return r;throw new E}toString(){return""+this.versionNumber}static buildVersions(){return[new ae(1,10,10,8,8,new oe(5,new se(1,3))),new ae(2,12,12,10,10,new oe(7,new se(1,5))),new ae(3,14,14,12,12,new oe(10,new se(1,8))),new ae(4,16,16,14,14,new oe(12,new se(1,12))),new ae(5,18,18,16,16,new oe(14,new se(1,18))),new ae(6,20,20,18,18,new oe(18,new se(1,22))),new ae(7,22,22,20,20,new oe(20,new se(1,30))),new ae(8,24,24,22,22,new oe(24,new se(1,36))),new ae(9,26,26,24,24,new oe(28,new se(1,44))),new ae(10,32,32,14,14,new oe(36,new se(1,62))),new ae(11,36,36,16,16,new oe(42,new se(1,86))),new ae(12,40,40,18,18,new oe(48,new se(1,114))),new ae(13,44,44,20,20,new oe(56,new se(1,144))),new ae(14,48,48,22,22,new oe(68,new se(1,174))),new ae(15,52,52,24,24,new oe(42,new se(2,102))),new ae(16,64,64,14,14,new oe(56,new se(2,140))),new ae(17,72,72,16,16,new oe(36,new se(4,92))),new ae(18,80,80,18,18,new oe(48,new se(4,114))),new ae(19,88,88,20,20,new oe(56,new se(4,144))),new ae(20,96,96,22,22,new oe(68,new se(4,174))),new ae(21,104,104,24,24,new oe(56,new se(6,136))),new ae(22,120,120,18,18,new oe(68,new se(6,175))),new ae(23,132,132,20,20,new oe(62,new se(8,163))),new ae(24,144,144,22,22,new oe(62,new se(8,156),new se(2,155))),new ae(25,8,18,6,16,new oe(7,new se(1,5))),new ae(26,8,32,6,14,new oe(11,new se(1,10))),new ae(27,12,26,10,24,new oe(14,new se(1,16))),new ae(28,12,36,10,16,new oe(18,new se(1,22))),new ae(29,16,36,14,16,new oe(24,new se(1,32))),new ae(30,16,48,14,22,new oe(28,new se(1,49)))]}}ae.VERSIONS=ae.buildVersions();class ce{constructor(t){const e=t.getHeight();if(e<8||e>144||0!=(1&e))throw new E;this.version=ce.readVersion(t),this.mappingBitMatrix=this.extractDataRegion(t),this.readMappingMatrix=new N(this.mappingBitMatrix.getWidth(),this.mappingBitMatrix.getHeight())}getVersion(){return this.version}static readVersion(t){const e=t.getHeight(),r=t.getWidth();return ae.getVersionForDimensions(e,r)}readCodewords(){const t=new Int8Array(this.version.getTotalCodewords());let e=0,r=4,n=0;const i=this.mappingBitMatrix.getHeight(),o=this.mappingBitMatrix.getWidth();let s=!1,a=!1,c=!1,l=!1;do{if(r!==i||0!==n||s)if(r!==i-2||0!==n||0==(3&o)||a)if(r!==i+4||2!==n||0!=(7&o)||c)if(r!==i-2||0!==n||4!=(7&o)||l){do{r=0&&!this.readMappingMatrix.get(n,r)&&(t[e++]=255&this.readUtah(r,n,i,o)),r-=2,n+=2}while(r>=0&&n=0&&n=0);r+=3,n+=1}else t[e++]=255&this.readCorner4(i,o),r-=2,n+=2,l=!0;else t[e++]=255&this.readCorner3(i,o),r-=2,n+=2,c=!0;else t[e++]=255&this.readCorner2(i,o),r-=2,n+=2,a=!0;else t[e++]=255&this.readCorner1(i,o),r-=2,n+=2,s=!0}while(r7?e-1:e;o[n].codewords[i]=t[h++]}if(h!==t.length)throw new c;return o}getNumDataCodewords(){return this.numDataCodewords}getCodewords(){return this.codewords}}class he{constructor(t){this.bytes=t,this.byteOffset=0,this.bitOffset=0}getBitOffset(){return this.bitOffset}getByteOffset(){return this.byteOffset}readBits(t){if(t<1||t>32||t>this.available())throw new c(""+t);let e=0,r=this.bitOffset,n=this.byteOffset;const i=this.bytes;if(r>0){const o=8-r,s=t>8-s<>a,t-=s,r+=s,8===r&&(r=0,n++)}if(t>0){for(;t>=8;)e=e<<8|255&i[n],n++,t-=8;if(t>0){const o=8-t,s=255>>o<>o,r+=t}}return this.bitOffset=r,this.byteOffset=n,e}available(){return 8*(this.bytes.length-this.byteOffset)-this.bitOffset}}!function(t){t[t.PAD_ENCODE=0]="PAD_ENCODE",t[t.ASCII_ENCODE=1]="ASCII_ENCODE",t[t.C40_ENCODE=2]="C40_ENCODE",t[t.TEXT_ENCODE=3]="TEXT_ENCODE",t[t.ANSIX12_ENCODE=4]="ANSIX12_ENCODE",t[t.EDIFACT_ENCODE=5]="EDIFACT_ENCODE",t[t.BASE256_ENCODE=6]="BASE256_ENCODE"}(V||(V={}));class ue{static decode(t){const e=new he(t),r=new y,n=new y,i=new Array;let o=V.ASCII_ENCODE;do{if(o===V.ASCII_ENCODE)o=this.decodeAsciiSegment(e,r,n);else{switch(o){case V.C40_ENCODE:this.decodeC40Segment(e,r);break;case V.TEXT_ENCODE:this.decodeTextSegment(e,r);break;case V.ANSIX12_ENCODE:this.decodeAnsiX12Segment(e,r);break;case V.EDIFACT_ENCODE:this.decodeEdifactSegment(e,r);break;case V.BASE256_ENCODE:this.decodeBase256Segment(e,r,i);break;default:throw new E}o=V.ASCII_ENCODE}}while(o!==V.PAD_ENCODE&&e.available()>0);return n.length()>0&&r.append(n.toString()),new j(t,r.toString(),0===i.length?null:i,null)}static decodeAsciiSegment(t,e,r){let n=!1;do{let i=t.readBits(8);if(0===i)throw new E;if(i<=128)return n&&(i+=128),e.append(String.fromCharCode(i-1)),V.ASCII_ENCODE;if(129===i)return V.PAD_ENCODE;if(i<=229){const t=i-130;t<10&&e.append("0"),e.append(""+t)}else switch(i){case 230:return V.C40_ENCODE;case 231:return V.BASE256_ENCODE;case 232:e.append(String.fromCharCode(29));break;case 233:case 234:case 241:break;case 235:n=!0;break;case 236:e.append("[)>05"),r.insert(0,"");break;case 237:e.append("[)>06"),r.insert(0,"");break;case 238:return V.ANSIX12_ENCODE;case 239:return V.TEXT_ENCODE;case 240:return V.EDIFACT_ENCODE;default:if(254!==i||0!==t.available())throw new E}}while(t.available()>0);return V.ASCII_ENCODE}static decodeC40Segment(t,e){let r=!1;const n=[];let i=0;do{if(8===t.available())return;const o=t.readBits(8);if(254===o)return;this.parseTwoBytes(o,t.readBits(8),n);for(let t=0;t<3;t++){const o=n[t];switch(i){case 0:if(o<3)i=o+1;else{if(!(o0)}static decodeTextSegment(t,e){let r=!1,n=[],i=0;do{if(8===t.available())return;const o=t.readBits(8);if(254===o)return;this.parseTwoBytes(o,t.readBits(8),n);for(let t=0;t<3;t++){const o=n[t];switch(i){case 0:if(o<3)i=o+1;else{if(!(o0)}static decodeAnsiX12Segment(t,e){const r=[];do{if(8===t.available())return;const n=t.readBits(8);if(254===n)return;this.parseTwoBytes(n,t.readBits(8),r);for(let t=0;t<3;t++){const n=r[t];switch(n){case 0:e.append("\r");break;case 1:e.append("*");break;case 2:e.append(">");break;case 3:e.append(" ");break;default:if(n<14)e.append(String.fromCharCode(n+44));else{if(!(n<40))throw new E;e.append(String.fromCharCode(n+51))}}}}while(t.available()>0)}static parseTwoBytes(t,e,r){let n=(t<<8)+e-1,i=Math.floor(n/1600);r[0]=i,n-=1600*i,i=Math.floor(n/40),r[1]=i,r[2]=n-40*i}static decodeEdifactSegment(t,e){do{if(t.available()<=16)return;for(let r=0;r<4;r++){let r=t.readBits(6);if(31===r){const e=8-t.getBitOffset();return void(8!==e&&t.readBits(e))}0==(32&r)&&(r|=64),e.append(String.fromCharCode(r))}}while(t.available()>0)}static decodeBase256Segment(t,e,r){let n=1+t.getByteOffset();const i=this.unrandomize255State(t.readBits(8),n++);let o;if(o=0===i?t.available()/8|0:i<250?i:250*(i-249)+this.unrandomize255State(t.readBits(8),n++),o<0)throw new E;const s=new Uint8Array(o);for(let e=0;e=0?r:r+256}}ue.C40_BASIC_SET_CHARS=["*","*","*"," ","0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"],ue.C40_SHIFT2_SET_CHARS=["!",'"',"#","$","%","&","'","(",")","*","+",",","-",".","/",":",";","<","=",">","?","@","[","\\","]","^","_"],ue.TEXT_BASIC_SET_CHARS=["*","*","*"," ","0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"],ue.TEXT_SHIFT2_SET_CHARS=ue.C40_SHIFT2_SET_CHARS,ue.TEXT_SHIFT3_SET_CHARS=["`","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","{","|","}","~",String.fromCharCode(127)];class de{constructor(){this.rsDecoder=new tt(q.DATA_MATRIX_FIELD_256)}decode(t){const e=new ce(t),r=e.getVersion(),n=e.readCodewords(),i=le.getDataBlocks(n,r);let o=0;for(let t of i)o+=t.getNumDataCodewords();const s=new Uint8Array(o),a=i.length;for(let t=0;ts&&(l=s,h[0]=e,h[1]=r,h[2]=n,h[3]=i),l>a&&(l=a,h[0]=r,h[1]=n,h[2]=i,h[3]=e),l>c&&(h[0]=n,h[1]=i,h[2]=e,h[3]=r),h}detectSolid2(t){let e=t[0],r=t[1],n=t[2],i=t[3],o=this.transitionsBetween(e,i),s=fe.shiftPoint(r,n,4*(o+1)),a=fe.shiftPoint(n,r,4*(o+1));return this.transitionsBetween(s,e)this.transitionsBetween(a,h)+this.transitionsBetween(c,h)?l:h:l:this.isValid(h)?h:null}shiftToModuleCenter(t){let e=t[0],r=t[1],n=t[2],i=t[3],o=this.transitionsBetween(e,i)+1,s=this.transitionsBetween(n,i)+1,a=fe.shiftPoint(e,r,4*s),c=fe.shiftPoint(n,r,4*o);o=this.transitionsBetween(a,i)+1,s=this.transitionsBetween(c,i)+1,1==(1&o)&&(o+=1),1==(1&s)&&(s+=1);let l,h,u=(e.getX()+r.getX()+n.getX()+i.getX())/4,d=(e.getY()+r.getY()+n.getY()+i.getY())/4;return e=fe.moveAway(e,u,d),r=fe.moveAway(r,u,d),n=fe.moveAway(n,u,d),i=fe.moveAway(i,u,d),a=fe.shiftPoint(e,r,4*s),a=fe.shiftPoint(a,i,4*o),l=fe.shiftPoint(r,e,4*s),l=fe.shiftPoint(l,n,4*o),c=fe.shiftPoint(n,i,4*s),c=fe.shiftPoint(c,r,4*o),h=fe.shiftPoint(i,n,4*s),h=fe.shiftPoint(h,e,4*o),[a,l,c,h]}isValid(t){return t.getX()>=0&&t.getX()0&&t.getY()Math.abs(i-r);if(s){let t=r;r=n,n=t,t=i,i=o,o=t}let a=Math.abs(i-r),c=Math.abs(o-n),l=-a/2,h=n0){if(e===o)break;e+=h,l-=a}}return d}}class ge{constructor(){this.decoder=new de}decode(t,e=null){let r,n;if(null!=e&&e.has(C.PURE_BARCODE)){const e=ge.extractPureBits(t.getBlackMatrix());r=this.decoder.decode(e),n=ge.NO_POINTS}else{const e=new fe(t.getBlackMatrix()).detect();r=this.decoder.decode(e.getBits()),n=e.getPoints()}const i=r.getRawBytes(),o=new x(r.getText(),i,8*i.length,n,U.DATA_MATRIX,d.currentTimeMillis()),s=r.getByteSegments();null!=s&&o.putMetadata(W.BYTE_SEGMENTS,s);const a=r.getECLevel();return null!=a&&o.putMetadata(W.ERROR_CORRECTION_LEVEL,a),o}reset(){}static extractPureBits(t){const e=t.getTopLeftOnBit(),r=t.getBottomRightOnBit();if(null==e||null==r)throw new D;const n=this.moduleSize(e,t);let i=e[1];const o=r[1];let s=e[0];const a=(r[0]-s+1)/n,c=(o-i+1)/n;if(a<=0||c<=0)throw new D;const l=n/2;i+=l,s+=l;const h=new N(a,c);for(let e=0;e=we.FOR_BITS.size)throw new c;return we.FOR_BITS.get(t)}}we.FOR_BITS=new Map,we.FOR_VALUE=new Map,we.L=new we(z.L,"L",1),we.M=new we(z.M,"M",0),we.Q=new we(z.Q,"Q",3),we.H=new we(z.H,"H",2);class me{constructor(t){this.errorCorrectionLevel=we.forBits(t>>3&3),this.dataMask=7&t}static numBitsDiffering(t,e){return m.bitCount(t^e)}static decodeFormatInformation(t,e){const r=me.doDecodeFormatInformation(t,e);return null!==r?r:me.doDecodeFormatInformation(t^me.FORMAT_INFO_MASK_QR,e^me.FORMAT_INFO_MASK_QR)}static doDecodeFormatInformation(t,e){let r=Number.MAX_SAFE_INTEGER,n=0;for(const i of me.FORMAT_INFO_DECODE_LOOKUP){const o=i[0];if(o===t||o===e)return new me(i[1]);let s=me.numBitsDiffering(t,o);s40)throw new c;return Ce.VERSIONS[t-1]}static decodeVersionInformation(t){let e=Number.MAX_SAFE_INTEGER,r=0;for(let n=0;n6&&(e.setRegion(t-11,0,3,6),e.setRegion(0,t-11,6,3)),e}toString(){return""+this.versionNumber}}Ce.VERSION_DECODE_INFO=Int32Array.from([31892,34236,39577,42195,48118,51042,55367,58893,63784,68472,70749,76311,79154,84390,87683,92361,96236,102084,102881,110507,110734,117786,119615,126325,127568,133589,136944,141498,145311,150283,152622,158308,161089,167017]),Ce.VERSIONS=[new Ce(1,new Int32Array(0),new pe(7,new Ae(1,19)),new pe(10,new Ae(1,16)),new pe(13,new Ae(1,13)),new pe(17,new Ae(1,9))),new Ce(2,Int32Array.from([6,18]),new pe(10,new Ae(1,34)),new pe(16,new Ae(1,28)),new pe(22,new Ae(1,22)),new pe(28,new Ae(1,16))),new Ce(3,Int32Array.from([6,22]),new pe(15,new Ae(1,55)),new pe(26,new Ae(1,44)),new pe(18,new Ae(2,17)),new pe(22,new Ae(2,13))),new Ce(4,Int32Array.from([6,26]),new pe(20,new Ae(1,80)),new pe(18,new Ae(2,32)),new pe(26,new Ae(2,24)),new pe(16,new Ae(4,9))),new Ce(5,Int32Array.from([6,30]),new pe(26,new Ae(1,108)),new pe(24,new Ae(2,43)),new pe(18,new Ae(2,15),new Ae(2,16)),new pe(22,new Ae(2,11),new Ae(2,12))),new Ce(6,Int32Array.from([6,34]),new pe(18,new Ae(2,68)),new pe(16,new Ae(4,27)),new pe(24,new Ae(4,19)),new pe(28,new Ae(4,15))),new Ce(7,Int32Array.from([6,22,38]),new pe(20,new Ae(2,78)),new pe(18,new Ae(4,31)),new pe(18,new Ae(2,14),new Ae(4,15)),new pe(26,new Ae(4,13),new Ae(1,14))),new Ce(8,Int32Array.from([6,24,42]),new pe(24,new Ae(2,97)),new pe(22,new Ae(2,38),new Ae(2,39)),new pe(22,new Ae(4,18),new Ae(2,19)),new pe(26,new Ae(4,14),new Ae(2,15))),new Ce(9,Int32Array.from([6,26,46]),new pe(30,new Ae(2,116)),new pe(22,new Ae(3,36),new Ae(2,37)),new pe(20,new Ae(4,16),new Ae(4,17)),new pe(24,new Ae(4,12),new Ae(4,13))),new Ce(10,Int32Array.from([6,28,50]),new pe(18,new Ae(2,68),new Ae(2,69)),new pe(26,new Ae(4,43),new Ae(1,44)),new pe(24,new Ae(6,19),new Ae(2,20)),new pe(28,new Ae(6,15),new Ae(2,16))),new Ce(11,Int32Array.from([6,30,54]),new pe(20,new Ae(4,81)),new pe(30,new Ae(1,50),new Ae(4,51)),new pe(28,new Ae(4,22),new Ae(4,23)),new pe(24,new Ae(3,12),new Ae(8,13))),new Ce(12,Int32Array.from([6,32,58]),new pe(24,new Ae(2,92),new Ae(2,93)),new pe(22,new Ae(6,36),new Ae(2,37)),new pe(26,new Ae(4,20),new Ae(6,21)),new pe(28,new Ae(7,14),new Ae(4,15))),new Ce(13,Int32Array.from([6,34,62]),new pe(26,new Ae(4,107)),new pe(22,new Ae(8,37),new Ae(1,38)),new pe(24,new Ae(8,20),new Ae(4,21)),new pe(22,new Ae(12,11),new Ae(4,12))),new Ce(14,Int32Array.from([6,26,46,66]),new pe(30,new Ae(3,115),new Ae(1,116)),new pe(24,new Ae(4,40),new Ae(5,41)),new pe(20,new Ae(11,16),new Ae(5,17)),new pe(24,new Ae(11,12),new Ae(5,13))),new Ce(15,Int32Array.from([6,26,48,70]),new pe(22,new Ae(5,87),new Ae(1,88)),new pe(24,new Ae(5,41),new Ae(5,42)),new pe(30,new Ae(5,24),new Ae(7,25)),new pe(24,new Ae(11,12),new Ae(7,13))),new Ce(16,Int32Array.from([6,26,50,74]),new pe(24,new Ae(5,98),new Ae(1,99)),new pe(28,new Ae(7,45),new Ae(3,46)),new pe(24,new Ae(15,19),new Ae(2,20)),new pe(30,new Ae(3,15),new Ae(13,16))),new Ce(17,Int32Array.from([6,30,54,78]),new pe(28,new Ae(1,107),new Ae(5,108)),new pe(28,new Ae(10,46),new Ae(1,47)),new pe(28,new Ae(1,22),new Ae(15,23)),new pe(28,new Ae(2,14),new Ae(17,15))),new Ce(18,Int32Array.from([6,30,56,82]),new pe(30,new Ae(5,120),new Ae(1,121)),new pe(26,new Ae(9,43),new Ae(4,44)),new pe(28,new Ae(17,22),new Ae(1,23)),new pe(28,new Ae(2,14),new Ae(19,15))),new Ce(19,Int32Array.from([6,30,58,86]),new pe(28,new Ae(3,113),new Ae(4,114)),new pe(26,new Ae(3,44),new Ae(11,45)),new pe(26,new Ae(17,21),new Ae(4,22)),new pe(26,new Ae(9,13),new Ae(16,14))),new Ce(20,Int32Array.from([6,34,62,90]),new pe(28,new Ae(3,107),new Ae(5,108)),new pe(26,new Ae(3,41),new Ae(13,42)),new pe(30,new Ae(15,24),new Ae(5,25)),new pe(28,new Ae(15,15),new Ae(10,16))),new Ce(21,Int32Array.from([6,28,50,72,94]),new pe(28,new Ae(4,116),new Ae(4,117)),new pe(26,new Ae(17,42)),new pe(28,new Ae(17,22),new Ae(6,23)),new pe(30,new Ae(19,16),new Ae(6,17))),new Ce(22,Int32Array.from([6,26,50,74,98]),new pe(28,new Ae(2,111),new Ae(7,112)),new pe(28,new Ae(17,46)),new pe(30,new Ae(7,24),new Ae(16,25)),new pe(24,new Ae(34,13))),new Ce(23,Int32Array.from([6,30,54,78,102]),new pe(30,new Ae(4,121),new Ae(5,122)),new pe(28,new Ae(4,47),new Ae(14,48)),new pe(30,new Ae(11,24),new Ae(14,25)),new pe(30,new Ae(16,15),new Ae(14,16))),new Ce(24,Int32Array.from([6,28,54,80,106]),new pe(30,new Ae(6,117),new Ae(4,118)),new pe(28,new Ae(6,45),new Ae(14,46)),new pe(30,new Ae(11,24),new Ae(16,25)),new pe(30,new Ae(30,16),new Ae(2,17))),new Ce(25,Int32Array.from([6,32,58,84,110]),new pe(26,new Ae(8,106),new Ae(4,107)),new pe(28,new Ae(8,47),new Ae(13,48)),new pe(30,new Ae(7,24),new Ae(22,25)),new pe(30,new Ae(22,15),new Ae(13,16))),new Ce(26,Int32Array.from([6,30,58,86,114]),new pe(28,new Ae(10,114),new Ae(2,115)),new pe(28,new Ae(19,46),new Ae(4,47)),new pe(28,new Ae(28,22),new Ae(6,23)),new pe(30,new Ae(33,16),new Ae(4,17))),new Ce(27,Int32Array.from([6,34,62,90,118]),new pe(30,new Ae(8,122),new Ae(4,123)),new pe(28,new Ae(22,45),new Ae(3,46)),new pe(30,new Ae(8,23),new Ae(26,24)),new pe(30,new Ae(12,15),new Ae(28,16))),new Ce(28,Int32Array.from([6,26,50,74,98,122]),new pe(30,new Ae(3,117),new Ae(10,118)),new pe(28,new Ae(3,45),new Ae(23,46)),new pe(30,new Ae(4,24),new Ae(31,25)),new pe(30,new Ae(11,15),new Ae(31,16))),new Ce(29,Int32Array.from([6,30,54,78,102,126]),new pe(30,new Ae(7,116),new Ae(7,117)),new pe(28,new Ae(21,45),new Ae(7,46)),new pe(30,new Ae(1,23),new Ae(37,24)),new pe(30,new Ae(19,15),new Ae(26,16))),new Ce(30,Int32Array.from([6,26,52,78,104,130]),new pe(30,new Ae(5,115),new Ae(10,116)),new pe(28,new Ae(19,47),new Ae(10,48)),new pe(30,new Ae(15,24),new Ae(25,25)),new pe(30,new Ae(23,15),new Ae(25,16))),new Ce(31,Int32Array.from([6,30,56,82,108,134]),new pe(30,new Ae(13,115),new Ae(3,116)),new pe(28,new Ae(2,46),new Ae(29,47)),new pe(30,new Ae(42,24),new Ae(1,25)),new pe(30,new Ae(23,15),new Ae(28,16))),new Ce(32,Int32Array.from([6,34,60,86,112,138]),new pe(30,new Ae(17,115)),new pe(28,new Ae(10,46),new Ae(23,47)),new pe(30,new Ae(10,24),new Ae(35,25)),new pe(30,new Ae(19,15),new Ae(35,16))),new Ce(33,Int32Array.from([6,30,58,86,114,142]),new pe(30,new Ae(17,115),new Ae(1,116)),new pe(28,new Ae(14,46),new Ae(21,47)),new pe(30,new Ae(29,24),new Ae(19,25)),new pe(30,new Ae(11,15),new Ae(46,16))),new Ce(34,Int32Array.from([6,34,62,90,118,146]),new pe(30,new Ae(13,115),new Ae(6,116)),new pe(28,new Ae(14,46),new Ae(23,47)),new pe(30,new Ae(44,24),new Ae(7,25)),new pe(30,new Ae(59,16),new Ae(1,17))),new Ce(35,Int32Array.from([6,30,54,78,102,126,150]),new pe(30,new Ae(12,121),new Ae(7,122)),new pe(28,new Ae(12,47),new Ae(26,48)),new pe(30,new Ae(39,24),new Ae(14,25)),new pe(30,new Ae(22,15),new Ae(41,16))),new Ce(36,Int32Array.from([6,24,50,76,102,128,154]),new pe(30,new Ae(6,121),new Ae(14,122)),new pe(28,new Ae(6,47),new Ae(34,48)),new pe(30,new Ae(46,24),new Ae(10,25)),new pe(30,new Ae(2,15),new Ae(64,16))),new Ce(37,Int32Array.from([6,28,54,80,106,132,158]),new pe(30,new Ae(17,122),new Ae(4,123)),new pe(28,new Ae(29,46),new Ae(14,47)),new pe(30,new Ae(49,24),new Ae(10,25)),new pe(30,new Ae(24,15),new Ae(46,16))),new Ce(38,Int32Array.from([6,32,58,84,110,136,162]),new pe(30,new Ae(4,122),new Ae(18,123)),new pe(28,new Ae(13,46),new Ae(32,47)),new pe(30,new Ae(48,24),new Ae(14,25)),new pe(30,new Ae(42,15),new Ae(32,16))),new Ce(39,Int32Array.from([6,26,54,82,110,138,166]),new pe(30,new Ae(20,117),new Ae(4,118)),new pe(28,new Ae(40,47),new Ae(7,48)),new pe(30,new Ae(43,24),new Ae(22,25)),new pe(30,new Ae(10,15),new Ae(67,16))),new Ce(40,Int32Array.from([6,30,58,86,114,142,170]),new pe(30,new Ae(19,118),new Ae(6,119)),new pe(28,new Ae(18,47),new Ae(31,48)),new pe(30,new Ae(34,24),new Ae(34,25)),new pe(30,new Ae(20,15),new Ae(61,16)))],function(t){t[t.DATA_MASK_000=0]="DATA_MASK_000",t[t.DATA_MASK_001=1]="DATA_MASK_001",t[t.DATA_MASK_010=2]="DATA_MASK_010",t[t.DATA_MASK_011=3]="DATA_MASK_011",t[t.DATA_MASK_100=4]="DATA_MASK_100",t[t.DATA_MASK_101=5]="DATA_MASK_101",t[t.DATA_MASK_110=6]="DATA_MASK_110",t[t.DATA_MASK_111=7]="DATA_MASK_111"}(G||(G={}));class Ee{constructor(t,e){this.value=t,this.isMasked=e}unmaskBitMatrix(t,e){for(let r=0;r0==(t+e&1)))],[G.DATA_MASK_001,new Ee(G.DATA_MASK_001,((t,e)=>0==(1&t)))],[G.DATA_MASK_010,new Ee(G.DATA_MASK_010,((t,e)=>e%3==0))],[G.DATA_MASK_011,new Ee(G.DATA_MASK_011,((t,e)=>(t+e)%3==0))],[G.DATA_MASK_100,new Ee(G.DATA_MASK_100,((t,e)=>0==(Math.floor(t/2)+Math.floor(e/3)&1)))],[G.DATA_MASK_101,new Ee(G.DATA_MASK_101,((t,e)=>t*e%6==0))],[G.DATA_MASK_110,new Ee(G.DATA_MASK_110,((t,e)=>t*e%6<3))],[G.DATA_MASK_111,new Ee(G.DATA_MASK_111,((t,e)=>0==(t+e+t*e%3&1)))]]);class Ie{constructor(t){const e=t.getHeight();if(e<21||1!=(3&e))throw new E;this.bitMatrix=t}readFormatInformation(){if(null!==this.parsedFormatInfo&&void 0!==this.parsedFormatInfo)return this.parsedFormatInfo;let t=0;for(let e=0;e<6;e++)t=this.copyBit(e,8,t);t=this.copyBit(7,8,t),t=this.copyBit(8,8,t),t=this.copyBit(8,7,t);for(let e=5;e>=0;e--)t=this.copyBit(8,e,t);const e=this.bitMatrix.getHeight();let r=0;const n=e-7;for(let t=e-1;t>=n;t--)r=this.copyBit(8,t,r);for(let t=e-8;t=0;e--)for(let i=t-9;i>=n;i--)r=this.copyBit(i,e,r);let i=Ce.decodeVersionInformation(r);if(null!==i&&i.getDimensionForVersion()===t)return this.parsedVersion=i,i;r=0;for(let e=5;e>=0;e--)for(let i=t-9;i>=n;i--)r=this.copyBit(e,i,r);if(i=Ce.decodeVersionInformation(r),null!==i&&i.getDimensionForVersion()===t)return this.parsedVersion=i,i;throw new E}copyBit(t,e,r){return(this.isMirror?this.bitMatrix.get(e,t):this.bitMatrix.get(t,e))?r<<1|1:r<<1}readCodewords(){const t=this.readFormatInformation(),e=this.readVersion(),r=Ee.values.get(t.getDataMask()),n=this.bitMatrix.getHeight();r.unmaskBitMatrix(this.bitMatrix,n);const i=e.buildFunctionPattern();let o=!0;const s=new Uint8Array(e.getTotalCodewords());let a=0,c=0,l=0;for(let t=n-1;t>0;t-=2){6===t&&t--;for(let e=0;e=0&&s[h].codewords.length!==l;)h--;h++;const u=l-n.getECCodewordsPerBlock();let d=0;for(let e=0;et.available())throw new E;const n=new Uint8Array(2*r);let i=0;for(;r>0;){const e=t.readBits(13);let o=e/96<<8&4294967295|e%96;o+=o<959?41377:42657,n[i]=o>>8&255,n[i+1]=255&o,i+=2,r--}try{e.append(_.decode(n,T.GB2312))}catch(t){throw new E(t)}}static decodeKanjiSegment(t,e,r){if(13*r>t.available())throw new E;const n=new Uint8Array(2*r);let i=0;for(;r>0;){const e=t.readBits(13);let o=e/192<<8&4294967295|e%192;o+=o<7936?33088:49472,n[i]=o>>8,n[i+1]=o,i+=2,r--}try{e.append(_.decode(n,T.SHIFT_JIS))}catch(t){throw new E(t)}}static decodeByteSegment(t,e,r,n,i,o){if(8*r>t.available())throw new E;const s=new Uint8Array(r);for(let e=0;e=Te.ALPHANUMERIC_CHARS.length)throw new E;return Te.ALPHANUMERIC_CHARS[t]}static decodeAlphanumericSegment(t,e,r,n){const i=e.length();for(;r>1;){if(t.available()<11)throw new E;const n=t.readBits(11);e.append(Te.toAlphaNumericChar(Math.floor(n/45))),e.append(Te.toAlphaNumericChar(n%45)),r-=2}if(1===r){if(t.available()<6)throw new E;e.append(Te.toAlphaNumericChar(t.readBits(6)))}if(n)for(let t=i;t=3;){if(t.available()<10)throw new E;const n=t.readBits(10);if(n>=1e3)throw new E;e.append(Te.toAlphaNumericChar(Math.floor(n/100))),e.append(Te.toAlphaNumericChar(Math.floor(n/10)%10)),e.append(Te.toAlphaNumericChar(n%10)),r-=3}if(2===r){if(t.available()<7)throw new E;const r=t.readBits(7);if(r>=100)throw new E;e.append(Te.toAlphaNumericChar(Math.floor(r/10))),e.append(Te.toAlphaNumericChar(r%10))}else if(1===r){if(t.available()<4)throw new E;const r=t.readBits(4);if(r>=10)throw new E;e.append(Te.toAlphaNumericChar(r))}}static parseECIValue(t){const e=t.readBits(8);if(0==(128&e))return 127&e;if(128==(192&e))return(63&e)<<8&4294967295|t.readBits(8);if(192==(224&e))return(31&e)<<16&4294967295|t.readBits(16);throw new E}}Te.ALPHANUMERIC_CHARS="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:",Te.GB2312_SUBSET=1;class ye{constructor(t){this.mirrored=t}isMirrored(){return this.mirrored}applyMirroredCorrection(t){if(!this.mirrored||null===t||t.length<3)return;const e=t[0];t[0]=t[2],t[2]=e}}class Ne{constructor(){this.rsDecoder=new tt(q.QR_CODE_FIELD_256)}decodeBooleanArray(t,e){return this.decodeBitMatrix(N.parseFromBooleanArray(t),e)}decodeBitMatrix(t,e){const r=new Ie(t);let n=null;try{return this.decodeBitMatrixParser(r,e)}catch(t){n=t}try{r.remask(),r.setMirror(!0),r.readVersion(),r.readFormatInformation(),r.mirror();const t=this.decodeBitMatrixParser(r,e);return t.setOther(new ye(!0)),t}catch(t){if(null!==n)throw n;throw t}}decodeBitMatrixParser(t,e){const r=t.readVersion(),n=t.readFormatInformation().getErrorCorrectionLevel(),i=t.readCodewords(),o=Se.getDataBlocks(i,r,n);let s=0;for(const t of o)s+=t.getNumDataCodewords();const a=new Uint8Array(s);let c=0;for(const t of o){const e=t.getCodewords(),r=t.getNumDataCodewords();this.correctErrors(e,r);for(let t=0;t=r)return!1;return!0}crossCheckVertical(t,e,r,n){const i=this.image,o=i.getHeight(),s=this.crossCheckStateCount;s[0]=0,s[1]=0,s[2]=0;let a=t;for(;a>=0&&i.get(e,a)&&s[1]<=r;)s[1]++,a--;if(a<0||s[1]>r)return NaN;for(;a>=0&&!i.get(e,a)&&s[0]<=r;)s[0]++,a--;if(s[0]>r)return NaN;for(a=t+1;ar)return NaN;for(;ar)return NaN;const c=s[0]+s[1]+s[2];return 5*Math.abs(c-n)>=2*n?NaN:this.foundPatternCross(s)?Me.centerFromEnd(s,a):NaN}handlePossibleCenter(t,e,r){const n=t[0]+t[1]+t[2],i=Me.centerFromEnd(t,r),o=this.crossCheckVertical(e,i,2*t[1],n);if(!isNaN(o)){const e=(t[0]+t[1]+t[2])/3;for(const t of this.possibleCenters)if(t.aboutEquals(e,o,i))return t.combineEstimate(o,i,e);const r=new De(i,o,e);this.possibleCenters.push(r),null!==this.resultPointCallback&&void 0!==this.resultPointCallback&&this.resultPointCallback.foundPossibleResultPoint(r)}return null}}class Re extends it{constructor(t,e,r,n){super(t,e),this.estimatedModuleSize=r,this.count=n,void 0===n&&(this.count=1)}getEstimatedModuleSize(){return this.estimatedModuleSize}getCount(){return this.count}aboutEquals(t,e,r){if(Math.abs(e-this.getY())<=t&&Math.abs(r-this.getX())<=t){const e=Math.abs(t-this.estimatedModuleSize);return e<=1||e<=this.estimatedModuleSize}return!1}combineEstimate(t,e,r){const n=this.count+1,i=(this.count*this.getX()+e)/n,o=(this.count*this.getY()+t)/n,s=(this.count*this.estimatedModuleSize+r)/n;return new Re(i,o,s,n)}}class Oe{constructor(t){this.bottomLeft=t[0],this.topLeft=t[1],this.topRight=t[2]}getBottomLeft(){return this.bottomLeft}getTopLeft(){return this.topLeft}getTopRight(){return this.topRight}}class be{constructor(t,e){this.image=t,this.resultPointCallback=e,this.possibleCenters=[],this.crossCheckStateCount=new Int32Array(5),this.resultPointCallback=e}getImage(){return this.image}getPossibleCenters(){return this.possibleCenters}find(t){const e=null!=t&&void 0!==t.get(C.TRY_HARDER),r=null!=t&&void 0!==t.get(C.PURE_BARCODE),n=this.image,i=n.getHeight(),o=n.getWidth();let s=Math.floor(3*i/(4*be.MAX_MODULES));(sc[2]&&(t+=e-c[2]-s,i=o-1)}e=0,c[0]=0,c[1]=0,c[2]=0,c[3]=0,c[4]=0}else c[0]=c[2],c[1]=c[3],c[2]=c[4],c[3]=1,c[4]=0,e=3;else c[++e]++;else c[e]++;be.foundPatternCross(c)&&!0===this.handlePossibleCenter(c,t,o,r)&&(s=c[0],this.hasSkipped&&(a=this.haveMultiplyConfirmedCenters()))}const l=this.selectBestPatterns();return it.orderBestPatterns(l),new Oe(l)}static centerFromEnd(t,e){return e-t[4]-t[3]-t[2]/2}static foundPatternCross(t){let e=0;for(let r=0;r<5;r++){const n=t[r];if(0===n)return!1;e+=n}if(e<7)return!1;const r=e/7,n=r/2;return Math.abs(r-t[0])=o&&e>=o&&s.get(e-o,t-o);)i[2]++,o++;if(t=o&&e>=o&&!s.get(e-o,t-o)&&i[1]<=r;)i[1]++,o++;if(tr)return!1;for(;t>=o&&e>=o&&s.get(e-o,t-o)&&i[0]<=r;)i[0]++,o++;if(i[0]>r)return!1;const a=s.getHeight(),c=s.getWidth();for(o=1;t+o=a||e+o>=c)return!1;for(;t+o=a||e+o>=c||i[3]>=r)return!1;for(;t+o=r)return!1;const l=i[0]+i[1]+i[2]+i[3]+i[4];return Math.abs(l-n)<2*n&&be.foundPatternCross(i)}crossCheckVertical(t,e,r,n){const i=this.image,o=i.getHeight(),s=this.getCrossCheckStateCount();let a=t;for(;a>=0&&i.get(e,a);)s[2]++,a--;if(a<0)return NaN;for(;a>=0&&!i.get(e,a)&&s[1]<=r;)s[1]++,a--;if(a<0||s[1]>r)return NaN;for(;a>=0&&i.get(e,a)&&s[0]<=r;)s[0]++,a--;if(s[0]>r)return NaN;for(a=t+1;a=r)return NaN;for(;a=r)return NaN;const c=s[0]+s[1]+s[2]+s[3]+s[4];return 5*Math.abs(c-n)>=2*n?NaN:be.foundPatternCross(s)?be.centerFromEnd(s,a):NaN}crossCheckHorizontal(t,e,r,n){const i=this.image,o=i.getWidth(),s=this.getCrossCheckStateCount();let a=t;for(;a>=0&&i.get(a,e);)s[2]++,a--;if(a<0)return NaN;for(;a>=0&&!i.get(a,e)&&s[1]<=r;)s[1]++,a--;if(a<0||s[1]>r)return NaN;for(;a>=0&&i.get(a,e)&&s[0]<=r;)s[0]++,a--;if(s[0]>r)return NaN;for(a=t+1;a=r)return NaN;for(;a=r)return NaN;const c=s[0]+s[1]+s[2]+s[3]+s[4];return 5*Math.abs(c-n)>=n?NaN:be.foundPatternCross(s)?be.centerFromEnd(s,a):NaN}handlePossibleCenter(t,e,r,n){const i=t[0]+t[1]+t[2]+t[3]+t[4];let o=be.centerFromEnd(t,r),s=this.crossCheckVertical(e,Math.floor(o),t[2],i);if(!isNaN(s)&&(o=this.crossCheckHorizontal(Math.floor(o),Math.floor(s),t[2],i),!isNaN(o)&&(!n||this.crossCheckDiagonal(Math.floor(s),Math.floor(o),t[2],i)))){const t=i/7;let e=!1;const r=this.possibleCenters;for(let n=0,i=r.length;n=be.CENTER_QUORUM){if(null!=t)return this.hasSkipped=!0,Math.floor((Math.abs(t.getX()-e.getX())-Math.abs(t.getY()-e.getY()))/2);t=e}return 0}haveMultiplyConfirmedCenters(){let t=0,e=0;const r=this.possibleCenters.length;for(const r of this.possibleCenters)r.getCount()>=be.CENTER_QUORUM&&(t++,e+=r.getEstimatedModuleSize());if(t<3)return!1;const n=e/r;let i=0;for(const t of this.possibleCenters)i+=Math.abs(t.getEstimatedModuleSize()-n);return i<=.05*e}selectBestPatterns(){const t=this.possibleCenters.length;if(t<3)throw new D;const e=this.possibleCenters;let r;if(t>3){let n=0,i=0;for(const t of this.possibleCenters){const e=t.getEstimatedModuleSize();n+=e,i+=e*e}r=n/t;let o=Math.sqrt(i/t-r*r);e.sort(((t,e)=>{const n=Math.abs(e.getEstimatedModuleSize()-r),i=Math.abs(t.getEstimatedModuleSize()-r);return ni?1:0}));const s=Math.max(.2*r,o);for(let t=0;t3;t++){const n=e[t];Math.abs(n.getEstimatedModuleSize()-r)>s&&(e.splice(t,1),t--)}}if(e.length>3){let t=0;for(const r of e)t+=r.getEstimatedModuleSize();r=t/e.length,e.sort(((t,e)=>{if(e.getCount()===t.getCount()){const n=Math.abs(e.getEstimatedModuleSize()-r),i=Math.abs(t.getEstimatedModuleSize()-r);return ni?-1:0}return e.getCount()-t.getCount()})),e.splice(3)}return[e[0],e[1],e[2]]}}be.CENTER_QUORUM=2,be.MIN_SKIP=3,be.MAX_MODULES=57;class Be{constructor(t){this.image=t}getImage(){return this.image}getResultPointCallback(){return this.resultPointCallback}detect(t){this.resultPointCallback=null==t?null:t.get(C.NEED_RESULT_POINT_CALLBACK);const e=new be(this.image,this.resultPointCallback).find(t);return this.processFinderPatternInfo(e)}processFinderPatternInfo(t){const e=t.getTopLeft(),r=t.getTopRight(),n=t.getBottomLeft(),i=this.calculateModuleSize(e,r,n);if(i<1)throw new D("No pattern found in proccess finder.");const o=Be.computeDimension(e,r,n,i),s=Ce.getProvisionalVersionForDimension(o),a=s.getDimensionForVersion()-7;let c=null;if(s.getAlignmentPatternCenters().length>0){const t=r.getX()-e.getX()+n.getX(),o=r.getY()-e.getY()+n.getY(),s=1-3/a,l=Math.floor(e.getX()+s*(t-e.getX())),h=Math.floor(e.getY()+s*(o-e.getY()));for(let t=4;t<=16;t<<=1)try{c=this.findAlignmentInRegion(i,l,h,t);break}catch(t){if(!(t instanceof D))throw t}}const l=Be.createTransform(e,r,n,c,o),h=Be.sampleGrid(this.image,l,o);let u;return u=null===c?[n,e,r]:[n,e,r,c],new ot(h,u)}static createTransform(t,e,r,n,i){const o=i-3.5;let s,a,c,l;return null!==n?(s=n.getX(),a=n.getY(),c=o-3,l=c):(s=e.getX()-t.getX()+r.getX(),a=e.getY()-t.getY()+r.getY(),c=o,l=o),lt.quadrilateralToQuadrilateral(3.5,3.5,o,3.5,c,l,3.5,o,t.getX(),t.getY(),e.getX(),e.getY(),s,a,r.getX(),r.getY())}static sampleGrid(t,e,r){return ut.getInstance().sampleGridWithTransform(t,r,r,e)}static computeDimension(t,e,r,n){const i=rt.round(it.distance(t,e)/n),o=rt.round(it.distance(t,r)/n);let s=Math.floor((i+o)/2)+7;switch(3&s){case 0:s++;break;case 2:s--;break;case 3:throw new D("Dimensions could be not found.")}return s}calculateModuleSize(t,e,r){return(this.calculateModuleSizeOneWay(t,e)+this.calculateModuleSizeOneWay(t,r))/2}calculateModuleSizeOneWay(t,e){const r=this.sizeOfBlackWhiteBlackRunBothWays(Math.floor(t.getX()),Math.floor(t.getY()),Math.floor(e.getX()),Math.floor(e.getY())),n=this.sizeOfBlackWhiteBlackRunBothWays(Math.floor(e.getX()),Math.floor(e.getY()),Math.floor(t.getX()),Math.floor(t.getY()));return isNaN(r)?n/7:isNaN(n)?r/7:(r+n)/14}sizeOfBlackWhiteBlackRunBothWays(t,e,r,n){let i=this.sizeOfBlackWhiteBlackRun(t,e,r,n),o=1,s=t-(r-t);s<0?(o=t/(t-s),s=0):s>=this.image.getWidth()&&(o=(this.image.getWidth()-1-t)/(s-t),s=this.image.getWidth()-1);let a=Math.floor(e-(n-e)*o);return o=1,a<0?(o=e/(e-a),a=0):a>=this.image.getHeight()&&(o=(this.image.getHeight()-1-e)/(a-e),a=this.image.getHeight()-1),s=Math.floor(t+(s-t)*o),i+=this.sizeOfBlackWhiteBlackRun(t,e,s,a),i-1}sizeOfBlackWhiteBlackRun(t,e,r,n){const i=Math.abs(n-e)>Math.abs(r-t);if(i){let i=t;t=e,e=i,i=r,r=n,n=i}const o=Math.abs(r-t),s=Math.abs(n-e);let a=-o/2;const c=t0){if(d===n)break;d+=l,a-=o}}return 2===h?rt.distance(r+c,n,t,e):NaN}findAlignmentInRegion(t,e,r,n){const i=Math.floor(n*t),o=Math.max(0,e-i),s=Math.min(this.image.getWidth()-1,e+i);if(s-o<3*t)throw new D("Alignment top exceeds estimated module size.");const a=Math.max(0,r-i),c=Math.min(this.image.getHeight()-1,r+i);if(c-a<3*t)throw new D("Alignment bottom exceeds estimated module size.");return new Me(this.image,o,a,s-o,c-a,t,this.resultPointCallback).find()}}class Le{constructor(){this.decoder=new Ne}getDecoder(){return this.decoder}decode(t,e){let r,n;if(null!=e&&void 0!==e.get(C.PURE_BARCODE)){const i=Le.extractPureBits(t.getBlackMatrix());r=this.decoder.decodeBitMatrix(i,e),n=Le.NO_POINTS}else{const i=new Be(t.getBlackMatrix()).detect(e);r=this.decoder.decodeBitMatrix(i.getBits(),e),n=i.getPoints()}r.getOther()instanceof ye&&r.getOther().applyMirroredCorrection(n);const i=new x(r.getText(),r.getRawBytes(),void 0,n,U.QR_CODE,void 0),o=r.getByteSegments();null!==o&&i.putMetadata(W.BYTE_SEGMENTS,o);const s=r.getECLevel();return null!==s&&i.putMetadata(W.ERROR_CORRECTION_LEVEL,s),r.hasStructuredAppend()&&(i.putMetadata(W.STRUCTURED_APPEND_SEQUENCE,r.getStructuredAppendSequenceNumber()),i.putMetadata(W.STRUCTURED_APPEND_PARITY,r.getStructuredAppendParity())),i}reset(){}static extractPureBits(t){const e=t.getTopLeftOnBit(),r=t.getBottomRightOnBit();if(null===e||null===r)throw new D;const n=this.moduleSize(e,t);let i=e[1],o=r[1],s=e[0],a=r[0];if(s>=a||i>=o)throw new D;if(o-i!=a-s&&(a=s+(o-i),a>=t.getWidth()))throw new D;const c=Math.round((a-s+1)/n),l=Math.round((o-i+1)/n);if(c<=0||l<=0)throw new D;if(l!==c)throw new D;const h=Math.floor(n/2);i+=h,s+=h;const u=s+Math.floor((c-1)*n)-a;if(u>0){if(u>h)throw new D;s-=u}const d=i+Math.floor((l-1)*n)-o;if(d>0){if(d>h)throw new D;i-=d}const f=new N(c,l);for(let e=0;e0;){const s=Fe.findGuardPattern(t,i,--n,r,!1,o,c);if(null==s){n++;break}e=s}s[0]=new it(e[0],n),s[1]=new it(e[1],n),a=!0;break}}let l=n+1;if(a){let n=0,i=Int32Array.from([Math.trunc(s[0].getX()),Math.trunc(s[1].getX())]);for(;lFe.SKIPPED_ROW_COUNT_MAX)break;n++}}l-=n+1,s[2]=new it(i[0],l),s[3]=new it(i[1],l)}return l-n0&&c++o?n-o:o-n;if(c>r)return 1/0;a+=c}return a/i}}Fe.INDEXES_START_PATTERN=Int32Array.from([0,4,1,5]),Fe.INDEXES_STOP_PATTERN=Int32Array.from([6,2,7,3]),Fe.MAX_AVG_VARIANCE=.42,Fe.MAX_INDIVIDUAL_VARIANCE=.8,Fe.START_PATTERN=Int32Array.from([8,1,1,1,1,1,1,3]),Fe.STOP_PATTERN=Int32Array.from([7,1,1,3,1,1,1,2,1]),Fe.MAX_PIXEL_DRIFT=3,Fe.MAX_PATTERN_DRIFT=5,Fe.SKIPPED_ROW_COUNT_MAX=25,Fe.ROW_STEP=5,Fe.BARCODE_MIN_HEIGHT=10;class xe{constructor(t,e){if(0===e.length)throw new c;this.field=t;let r=e.length;if(r>1&&0===e[0]){let t=1;for(;tr.length){let t=e;e=r,r=t}let n=new Int32Array(r.length),i=r.length-e.length;d.arraycopy(r,0,n,0,i);for(let t=i;t=0;e--){let r=this.getCoefficient(e);0!==r&&(r<0?(t.append(" - "),r=-r):t.length()>0&&t.append(" + "),0!==e&&1===r||t.append(r),0!==e&&(1===e?t.append("x"):(t.append("x^"),t.append(e))))}return t.toString()}}class ke{add(t,e){return(t+e)%this.modulus}subtract(t,e){return(this.modulus+t-e)%this.modulus}exp(t){return this.expTable[t]}log(t){if(0===t)throw new c;return this.logTable[t]}inverse(t){if(0===t)throw new K;return this.expTable[this.modulus-this.logTable[t]-1]}multiply(t,e){return 0===t||0===e?0:this.expTable[(this.logTable[t]+this.logTable[e])%(this.modulus-1)]}getSize(){return this.modulus}equals(t){return t===this}}class Ue extends ke{constructor(t,e){super(),this.modulus=t,this.expTable=new Int32Array(t),this.logTable=new Int32Array(t);let r=1;for(let n=0;n0;t--){let r=n.evaluateAt(this.field.exp(t));i[e-t]=r,0!==r&&(o=!0)}if(!o)return 0;let s=this.field.getOne();if(null!=r)for(const e of r){let r=this.field.exp(t.length-1-e),n=new xe(this.field,new Int32Array([this.field.subtract(0,r),1]));s=s.multiply(n)}let a=new xe(this.field,i),c=this.runEuclideanAlgorithm(this.field.buildMonomial(e,1),a,e),l=c[0],u=c[1],d=this.findErrorLocations(l),f=this.findErrorMagnitudes(u,l,d);for(let e=0;e=Math.round(r/2);){let t=n,e=o;if(n=i,o=s,n.isZero())throw h.getChecksumInstance();i=t;let r=this.field.getZero(),a=n.getCoefficient(n.getDegree()),c=this.field.inverse(a);for(;i.getDegree()>=n.getDegree()&&!i.isZero();){let t=i.getDegree()-n.getDegree(),e=this.field.multiply(i.getCoefficient(i.getDegree()),c);r=r.add(this.field.buildMonomial(t,e)),i=i.subtract(n.multiplyByMonomial(t,e))}s=r.multiply(o).subtract(e).negative()}let a=s.getCoefficient(0);if(0===a)throw h.getChecksumInstance();let c=this.field.inverse(a);return[s.multiply(c),i.multiply(c)]}findErrorLocations(t){let e=t.getDegree(),r=new Int32Array(e),n=0;for(let i=1;i0){let e=r?this.topLeft:this.topRight,i=Math.trunc(e.getY()-t);i<0&&(i=0);let s=new it(e.getX(),i);r?n=s:o=s}if(e>0){let t=r?this.bottomLeft:this.bottomRight,n=Math.trunc(t.getY()+e);n>=this.image.getHeight()&&(n=this.image.getHeight()-1);let o=new it(t.getX(),n);r?i=o:s=o}return new Ve(this.image,n,i,o,s)}getMinX(){return this.minX}getMaxX(){return this.maxX}getMinY(){return this.minY}getMaxY(){return this.maxY}getTopLeft(){return this.topLeft}getTopRight(){return this.topRight}getBottomLeft(){return this.bottomLeft}getBottomRight(){return this.bottomRight}}class ze{constructor(t,e,r,n){this.columnCount=t,this.errorCorrectionLevel=n,this.rowCountUpperPart=e,this.rowCountLowerPart=r,this.rowCount=e+r}getColumnCount(){return this.columnCount}getErrorCorrectionLevel(){return this.errorCorrectionLevel}getRowCount(){return this.rowCount}getRowCountUpperPart(){return this.rowCountUpperPart}getRowCountLowerPart(){return this.rowCountLowerPart}}class Ge{constructor(){this.buffer=""}static form(t,e){let r=-1;return t.replace(/%(-)?(0?[0-9]+)?([.][0-9]+)?([#][0-9]+)?([scfpexd%])/g,(function(t,n,i,o,s,a){if("%%"===t)return"%";if(void 0===e[++r])return;t=o?parseInt(o.substr(1)):void 0;let c,l=s?parseInt(s.substr(1)):void 0;switch(a){case"s":c=e[r];break;case"c":c=e[r][0];break;case"f":c=parseFloat(e[r]).toFixed(t);break;case"p":c=parseFloat(e[r]).toPrecision(t);break;case"e":c=parseFloat(e[r]).toExponential(t);break;case"x":c=parseInt(e[r]).toString(l||16);break;case"d":c=parseFloat(parseInt(e[r],l||10).toPrecision(t)).toFixed(0)}c="object"==typeof c?JSON.stringify(c):(+c).toString(l);let h=parseInt(i),u=i&&i[0]+""=="0"?"0":" ";for(;c.length=0&&(e=this.codewords[n],null!=e))return e;if(n=this.imageRowToCodewordIndex(t)+r,nr,getValue:()=>n};i.getValue()>t?(t=i.getValue(),e=[],e.push(i.getKey())):i.getValue()===t&&e.push(i.getKey())}return Pe.toIntArray(e)}getConfidence(t){return this.values.get(t)}}class We extends Ye{constructor(t,e){super(t),this._isLeft=e}setRowNumbers(){for(let t of this.getCodewords())null!=t&&t.setRowNumberAsRowIndicatorColumn()}adjustCompleteIndicatorColumnRowNumbers(t){let e=this.getCodewords();this.setRowNumbers(),this.removeIncorrectCodewords(e,t);let r=this.getBoundingBox(),n=this._isLeft?r.getTopLeft():r.getTopRight(),i=this._isLeft?r.getBottomLeft():r.getBottomRight(),o=this.imageRowToCodewordIndex(Math.trunc(n.getY())),s=this.imageRowToCodewordIndex(Math.trunc(i.getY())),a=-1,c=1,l=0;for(let r=o;r=t.getRowCount()||i>r)e[r]=null;else{let t;t=c>2?(c-2)*i:i;let o=t>=r;for(let n=1;n<=t&&!o;n++)o=null!=e[r-n];o?e[r]=null:(a=n.getRowNumber(),l=1)}}}getRowHeights(){let t=this.getBarcodeMetadata();if(null==t)return null;this.adjustIncompleteIndicatorColumnRowNumbers(t);let e=new Int32Array(t.getRowCount());for(let t of this.getCodewords())if(null!=t){let r=t.getRowNumber();if(r>=e.length)continue;e[r]++}return e}adjustIncompleteIndicatorColumnRowNumbers(t){let e=this.getBoundingBox(),r=this._isLeft?e.getTopLeft():e.getTopRight(),n=this._isLeft?e.getBottomLeft():e.getBottomRight(),i=this.imageRowToCodewordIndex(Math.trunc(r.getY())),o=this.imageRowToCodewordIndex(Math.trunc(n.getY())),s=this.getCodewords(),a=-1;for(let e=i;e=t.getRowCount()?s[e]=null:a=r.getRowNumber())}}getBarcodeMetadata(){let t=this.getCodewords(),e=new Xe,r=new Xe,n=new Xe,i=new Xe;for(let o of t){if(null==o)continue;o.setRowNumberAsRowIndicatorColumn();let t=o.getValue()%30,s=o.getRowNumber();switch(this._isLeft||(s+=2),s%3){case 0:r.setValue(3*t+1);break;case 1:i.setValue(t/3),n.setValue(t%3);break;case 2:e.setValue(t+1)}}if(0===e.getValue().length||0===r.getValue().length||0===n.getValue().length||0===i.getValue().length||e.getValue()[0]<1||r.getValue()[0]+n.getValue()[0]Pe.MAX_ROWS_IN_BARCODE)return null;let o=new ze(e.getValue()[0],r.getValue()[0],n.getValue()[0],i.getValue()[0]);return this.removeIncorrectCodewords(t,o),o}removeIncorrectCodewords(t,e){for(let r=0;re.getRowCount())t[r]=null;else switch(this._isLeft||(o+=2),o%3){case 0:3*i+1!==e.getRowCountUpperPart()&&(t[r]=null);break;case 1:Math.trunc(i/3)===e.getErrorCorrectionLevel()&&i%3===e.getRowCountLowerPart()||(t[r]=null);break;case 2:i+1!==e.getColumnCount()&&(t[r]=null)}}}isLeft(){return this._isLeft}toString(){return"IsLeft: "+this._isLeft+"\n"+super.toString()}}class je{constructor(t,e){this.ADJUST_ROW_NUMBER_SKIP=2,this.barcodeMetadata=t,this.barcodeColumnCount=t.getColumnCount(),this.boundingBox=e,this.detectionResultColumns=new Array(this.barcodeColumnCount+2)}getDetectionResultColumns(){this.adjustIndicatorColumnRowNumbers(this.detectionResultColumns[0]),this.adjustIndicatorColumnRowNumbers(this.detectionResultColumns[this.barcodeColumnCount+1]);let t,e=Pe.MAX_CODEWORDS_IN_BARCODE;do{t=e,e=this.adjustRowNumbersAndGetCount()}while(e>0&&e0&&i0&&(s[0]=r[e-1],s[4]=i[e-1],s[5]=o[e-1]),e>1&&(s[8]=r[e-2],s[10]=i[e-2],s[11]=o[e-2]),e>=1;r=1&e,Qe.RATIOS_TABLE[t]||(Qe.RATIOS_TABLE[t]=new Array(Pe.BARS_IN_MODULE)),Qe.RATIOS_TABLE[t][Pe.BARS_IN_MODULE-n-1]=Math.fround(i/Pe.MODULES_IN_CODEWORD)}}this.bSymbolTableReady=!0}static getDecodedValue(t){let e=Qe.getDecodedCodewordValue(Qe.sampleBitCounts(t));return-1!==e?e:Qe.getClosestDecodedValue(t)}static sampleBitCounts(t){let e=rt.sum(t),r=new Int32Array(Pe.BARS_IN_MODULE),n=0,i=0;for(let o=0;o1)for(let n=0;n=n)break}enew Array(Pe.BARS_IN_MODULE)));class Ke{constructor(){this.segmentCount=-1,this.fileSize=-1,this.timestamp=-1,this.checksum=-1}getSegmentIndex(){return this.segmentIndex}setSegmentIndex(t){this.segmentIndex=t}getFileId(){return this.fileId}setFileId(t){this.fileId=t}getOptionalData(){return this.optionalData}setOptionalData(t){this.optionalData=t}isLastSegment(){return this.lastSegment}setLastSegment(t){this.lastSegment=t}getSegmentCount(){return this.segmentCount}setSegmentCount(t){this.segmentCount=t}getSender(){return this.sender||null}setSender(t){this.sender=t}getAddressee(){return this.addressee||null}setAddressee(t){this.addressee=t}getFileName(){return this.fileName}setFileName(t){this.fileName=t}getFileSize(){return this.fileSize}setFileSize(t){this.fileSize=t}getChecksum(){return this.checksum}setChecksum(t){this.checksum=t}getTimestamp(){return this.timestamp}setTimestamp(t){this.timestamp=t}}class qe{static parseLong(t,e=undefined){return parseInt(t,e)}}class Je extends s{}Je.kind="NullPointerException";class $e{writeBytes(t){this.writeBytesOffset(t,0,t.length)}writeBytesOffset(t,e,r){if(null==t)throw new Je;if(e<0||e>t.length||r<0||e+r>t.length||e+r<0)throw new f;if(0!==r)for(let n=0;n0&&this.grow(t)}grow(t){let e=this.buf.length<<1;if(e-t<0&&(e=t),e<0){if(t<0)throw new tr;e=m.MAX_VALUE}this.buf=w.copyOfUint8Array(this.buf,e)}write(t){this.ensureCapacity(this.count+1),this.buf[this.count]=t,this.count+=1}writeBytesOffset(t,e,r){if(e<0||e>t.length||r<0||e+r-t.length>0)throw new f;this.ensureCapacity(this.count+r),d.arraycopy(t,e,this.buf,this.count,r),this.count+=r}writeTo(t){t.writeBytesOffset(this.buf,0,this.count)}reset(){this.count=0}toByteArray(){return w.copyOfUint8Array(this.buf,this.count)}size(){return this.count}toString(t){return t?"string"==typeof t?this.toString_string(t):this.toString_number(t):this.toString_void()}toString_void(){return new String(this.buf).toString()}toString_string(t){return new String(this.buf).toString()}toString_number(t){return new String(this.buf).toString()}close(){}}function rr(){if("undefined"!=typeof window)return window.BigInt||null;if(void 0!==r.g)return r.g.BigInt||null;if("undefined"!=typeof self)return self.BigInt||null;throw new Error("Can't search globals for BigInt!")}let nr;function ir(t){if(void 0===nr&&(nr=rr()),null===nr)throw new Error("BigInt is not supported!");return nr(t)}!function(t){t[t.ALPHA=0]="ALPHA",t[t.LOWER=1]="LOWER",t[t.MIXED=2]="MIXED",t[t.PUNCT=3]="PUNCT",t[t.ALPHA_SHIFT=4]="ALPHA_SHIFT",t[t.PUNCT_SHIFT=5]="PUNCT_SHIFT"}(X||(X={}));class or{static decode(t,e){let r=new y(""),n=I.ISO8859_1;r.enableDecoding(n);let i=1,o=t[i++],s=new Ke;for(;it[0])throw E.getFormatInstance();let n=new Int32Array(or.NUMBER_OF_SEQUENCE_CODEWORDS);for(let r=0;r0){for(let t=0;t<6;++t)o.write(Number(ir(a)>>ir(8*(5-t))));a=0,s=0}}n===e[0]&&r0){for(let t=0;t<6;++t)o.write(Number(ir(a)>>ir(8*(5-t))));a=0,s=0}}}return i.append(_.decode(o.toByteArray(),r)),n}static numericCompaction(t,e,r){let n=0,i=!1,o=new Int32Array(or.MAX_NUMERIC_CODEWORDS);for(;e0&&(r.append(or.decodeBase900toBase10(o,n)),n=0)}return e}static decodeBase900toBase10(t,e){let r=ir(0);for(let n=0;n@[\\]_`~!\r\t,:\n-.$/\"|*()?{}'",or.MIXED_CHARS="0123456789&\r\t,:#-.$/+%*=^",or.EXP900=rr()?function(){let t=[];t[0]=ir(1);let e=ir(900);t[1]=e;for(let r=2;r<16;r++)t[r]=t[r-1]*e;return t}():[],or.NUMBER_OF_SEQUENCE_CODEWORDS=2;class sr{constructor(){}static decode(t,e,r,n,i,o,s){let a,c=new Ve(t,e,r,n,i),l=null,h=null;for(let r=!0;;r=!1){if(null!=e&&(l=sr.getRowIndicatorColumn(t,c,e,!0,o,s)),null!=n&&(h=sr.getRowIndicatorColumn(t,c,n,!1,o,s)),a=sr.merge(l,h),null==a)throw D.getNotFoundInstance();let i=a.getBoundingBox();if(!r||null==i||!(i.getMinY()c.getMaxY()))break;c=i}a.setBoundingBox(c);let u=a.getBarcodeColumnCount()+1;a.setDetectionResultColumn(0,l),a.setDetectionResultColumn(u,h);let d=null!=l;for(let e=1;e<=u;e++){let r,n=d?e:u-e;if(void 0!==a.getDetectionResultColumn(n))continue;r=0===n||n===u?new We(c,0===n):new Ye(c),a.setDetectionResultColumn(n,r);let i=-1,l=i;for(let e=c.getMinY();e<=c.getMaxY();e++){if(i=sr.getStartColumn(a,n,e,d),i<0||i>c.getMaxX()){if(-1===l)continue;i=l}let h=sr.detectCodeword(t,c.getMinX(),c.getMaxX(),d,i,e,o,s);null!=h&&(r.setCodeword(e,h),l=i,o=Math.min(o,h.getWidth()),s=Math.max(s,h.getWidth()))}}return sr.createDecoderResult(a)}static merge(t,e){if(null==t&&null==e)return null;let r=sr.getBarcodeMetadata(t,e);if(null==r)return null;let n=Ve.merge(sr.adjustBoundingBox(t),sr.adjustBoundingBox(e));return new je(r,n)}static adjustBoundingBox(t){if(null==t)return null;let e=t.getRowHeights();if(null==e)return null;let r=sr.getMax(e),n=0;for(let t of e)if(n+=r-t,t>0)break;let i=t.getCodewords();for(let t=0;n>0&&null==i[t];t++)n--;let o=0;for(let t=e.length-1;t>=0&&(o+=r-e[t],!(e[t]>0));t--);for(let t=i.length-1;o>0&&null==i[t];t--)o--;return t.getBoundingBox().addMissingRows(n,o,t.isLeft())}static getMax(t){let e=-1;for(let r of t)e=Math.max(e,r);return e}static getBarcodeMetadata(t,e){let r,n;return null==t||null==(r=t.getBarcodeMetadata())?null==e?null:e.getBarcodeMetadata():null==e||null==(n=e.getBarcodeMetadata())?r:r.getColumnCount()!==n.getColumnCount()&&r.getErrorCorrectionLevel()!==n.getErrorCorrectionLevel()&&r.getRowCount()!==n.getRowCount()?null:r}static getRowIndicatorColumn(t,e,r,n,i,o){let s=new We(e,n);for(let a=0;a<2;a++){let c=0===a?1:-1,l=Math.trunc(Math.trunc(r.getX()));for(let a=Math.trunc(Math.trunc(r.getY()));a<=e.getMaxY()&&a>=e.getMinY();a+=c){let e=sr.detectCodeword(t,0,t.getWidth(),n,l,a,i,o);null!=e&&(s.setCodeword(a,e),l=n?e.getStartX():e.getEndX())}}return s}static adjustCodewordCount(t,e){let r=e[0][1],n=r.getValue(),i=t.getBarcodeColumnCount()*t.getBarcodeRowCount()-sr.getNumberOfECCodeWords(t.getBarcodeECLevel());if(0===n.length){if(i<1||i>Pe.MAX_CODEWORDS_IN_BARCODE)throw D.getNotFoundInstance();r.setValue(i)}else n[0]!==i&&r.setValue(i)}static createDecoderResult(t){let e=sr.createBarcodeMatrix(t);sr.adjustCodewordCount(t,e);let r=new Array,n=new Int32Array(t.getBarcodeRowCount()*t.getBarcodeColumnCount()),i=[],o=new Array;for(let s=0;s0;){for(let t=0;tnew Array(t.getBarcodeColumnCount()+2)));for(let t=0;t=0){if(n>=e.length)continue;e[n][r].setValue(t.getValue())}}r++}return e}static isValidBarcodeColumn(t,e){return e>=0&&e<=t.getBarcodeColumnCount()+1}static getStartColumn(t,e,r,n){let i=n?1:-1,o=null;if(sr.isValidBarcodeColumn(t,e-i)&&(o=t.getDetectionResultColumn(e-i).getCodeword(r)),null!=o)return n?o.getEndX():o.getStartX();if(o=t.getDetectionResultColumn(e).getCodewordNearby(r),null!=o)return n?o.getStartX():o.getEndX();if(sr.isValidBarcodeColumn(t,e-i)&&(o=t.getDetectionResultColumn(e-i).getCodewordNearby(r)),null!=o)return n?o.getEndX():o.getStartX();let s=0;for(;sr.isValidBarcodeColumn(t,e-i);){e-=i;for(let r of t.getDetectionResultColumn(e).getCodewords())if(null!=r)return(n?r.getEndX():r.getStartX())+i*s*(r.getEndX()-r.getStartX());s++}return n?t.getBoundingBox().getMinX():t.getBoundingBox().getMaxX()}static detectCodeword(t,e,r,n,i,o,s,a){i=sr.adjustCodewordStartColumn(t,e,r,n,i,o);let c,l=sr.getModuleBitCount(t,e,r,n,i,o);if(null==l)return null;let h=rt.sum(l);if(n)c=i+h;else{for(let t=0;t=e)&&c=e:ssr.CODEWORD_SKEW_SIZE)return i;s+=a}a=-a,n=!n}return s}static checkCodewordSkew(t,e,r){return e-sr.CODEWORD_SKEW_SIZE<=t&&t<=r+sr.CODEWORD_SKEW_SIZE}static decodeCodewords(t,e,r){if(0===t.length)throw E.getFormatInstance();let n=1<r/2+sr.MAX_ERRORS||r<0||r>sr.MAX_EC_CODEWORDS)throw h.getChecksumInstance();return sr.errorCorrection.decode(t,r,e)}static verifyCodewordCount(t,e){if(t.length<4)throw E.getFormatInstance();let r=t[0];if(r>t.length)throw E.getFormatInstance();if(0===r){if(!(e>=1;return e}static getCodewordBucketNumber(t){return t instanceof Int32Array?this.getCodewordBucketNumber_Int32Array(t):this.getCodewordBucketNumber_number(t)}static getCodewordBucketNumber_number(t){return sr.getCodewordBucketNumber(sr.getBitCountForCodeword(t))}static getCodewordBucketNumber_Int32Array(t){return(t[0]-t[2]+t[4]-t[6]+9)%9}static toString(t){let e=new Ge;for(let r=0;rt))}static getMaxWidth(t,e){return null==t||null==e?0:Math.trunc(Math.abs(t.getX()-e.getX()))}static getMinWidth(t,e){return null==t||null==e?m.MAX_VALUE:Math.trunc(Math.abs(t.getX()-e.getX()))}static getMaxCodewordWidth(t){return Math.floor(Math.max(Math.max(ar.getMaxWidth(t[0],t[4]),ar.getMaxWidth(t[6],t[2])*Pe.MODULES_IN_CODEWORD/Pe.MODULES_IN_STOP_PATTERN),Math.max(ar.getMaxWidth(t[1],t[5]),ar.getMaxWidth(t[7],t[3])*Pe.MODULES_IN_CODEWORD/Pe.MODULES_IN_STOP_PATTERN)))}static getMinCodewordWidth(t){return Math.floor(Math.min(Math.min(ar.getMinWidth(t[0],t[4]),ar.getMinWidth(t[6],t[2])*Pe.MODULES_IN_CODEWORD/Pe.MODULES_IN_STOP_PATTERN),Math.min(ar.getMinWidth(t[1],t[5]),ar.getMinWidth(t[7],t[3])*Pe.MODULES_IN_CODEWORD/Pe.MODULES_IN_STOP_PATTERN)))}reset(){}}class cr extends s{}cr.kind="ReaderException";class lr{constructor(t,e){this.verbose=!0===t,e&&this.setHints(e)}decode(t,e){return e&&this.setHints(e),this.decodeInternal(t)}decodeWithState(t){return null!==this.readers&&void 0!==this.readers||this.setHints(null),this.decodeInternal(t)}setHints(t){this.hints=t;const r=!e(t)&&!0===t.get(C.TRY_HARDER),n=e(t)?null:t.get(C.POSSIBLE_FORMATS),i=new Array;if(!e(n)){const e=n.some((t=>t===U.UPC_A||t===U.UPC_E||t===U.EAN_13||t===U.EAN_8||t===U.CODABAR||t===U.CODE_39||t===U.CODE_93||t===U.CODE_128||t===U.ITF||t===U.RSS_14||t===U.RSS_EXPANDED));e&&!r&&i.push(new ie(t,this.verbose)),n.includes(U.QR_CODE)&&i.push(new Le),n.includes(U.DATA_MATRIX)&&i.push(new ge),n.includes(U.AZTEC)&&i.push(new gt),n.includes(U.PDF_417)&&i.push(new ar),e&&r&&i.push(new ie(t,this.verbose))}0===i.length&&(r||i.push(new ie(t,this.verbose)),i.push(new Le),i.push(new ge),i.push(new gt),i.push(new ar),r&&i.push(new ie(t,this.verbose))),this.readers=i}reset(){if(null!==this.readers)for(const t of this.readers)t.reset()}decodeInternal(t){if(null===this.readers)throw new cr("No readers where selected, nothing can be read.");for(const e of this.readers)try{return e.decode(t,this.hints)}catch(t){if(t instanceof cr)continue}throw new D("No MultiFormat Readers were able to detect the code.")}}var hr;!function(t){t[t.ERROR_CORRECTION=0]="ERROR_CORRECTION",t[t.CHARACTER_SET=1]="CHARACTER_SET",t[t.DATA_MATRIX_SHAPE=2]="DATA_MATRIX_SHAPE",t[t.MIN_SIZE=3]="MIN_SIZE",t[t.MAX_SIZE=4]="MAX_SIZE",t[t.MARGIN=5]="MARGIN",t[t.PDF417_COMPACT=6]="PDF417_COMPACT",t[t.PDF417_COMPACTION=7]="PDF417_COMPACTION",t[t.PDF417_DIMENSIONS=8]="PDF417_DIMENSIONS",t[t.AZTEC_LAYERS=9]="AZTEC_LAYERS",t[t.QR_VERSION=10]="QR_VERSION"}(hr||(hr={}));var ur=hr;class dr{constructor(t){this.field=t,this.cachedGenerators=[],this.cachedGenerators.push(new Q(t,Int32Array.from([1])))}buildGenerator(t){const e=this.cachedGenerators;if(t>=e.length){let r=e[e.length-1];const n=this.field;for(let i=e.length;i<=t;i++){const t=r.multiply(new Q(n,Int32Array.from([1,n.exp(i-1+n.getGeneratorBase())])));e.push(t),r=t}}return e[t]}encode(t,e){if(0===e)throw new c("No error correction bytes");const r=t.length-e;if(r<=0)throw new c("No data bytes provided");const n=this.buildGenerator(e),i=new Int32Array(r);d.arraycopy(t,0,i,0,r);let o=new Q(this.field,i);o=o.multiplyByMonomial(e,1);const s=o.divide(n)[1].getCoefficients(),a=e-s.length;for(let e=0;e=5&&(r+=fr.N1+(n-5)),n=1,s=i)}n>=5&&(r+=fr.N1+(n-5))}return r}}fr.N1=3,fr.N2=3,fr.N3=40,fr.N4=10;class gr{constructor(t,e){this.width=t,this.height=e;const r=new Array(e);for(let n=0;n!==e;n++)r[n]=new Uint8Array(t);this.bytes=r}getHeight(){return this.height}getWidth(){return this.width}get(t,e){return this.bytes[e][t]}getArray(){return this.bytes}setNumber(t,e,r){this.bytes[e][t]=r}setBoolean(t,e,r){this.bytes[e][t]=r?1:0}clear(t){for(const e of this.bytes)w.fill(e,t)}equals(t){if(!(t instanceof gr))return!1;const e=t;if(this.width!==e.width)return!1;if(this.height!==e.height)return!1;for(let t=0,r=this.height;t>\n"),t.toString()}setMode(t){this.mode=t}setECLevel(t){this.ecLevel=t}setVersion(t){this.version=t}setMaskPattern(t){this.maskPattern=t}setMatrix(t){this.matrix=t}static isValidMaskPattern(t){return t>=0&&t0;){for(6===o&&(o-=1);s>=0&&s=r;)t^=e<=0)for(let t=0;t!==r;t++){const r=n[t];r>=0&&pr.isEmpty(e.get(r,i))&&pr.embedPositionAdjustmentPattern(r-2,i-2,e)}}}}pr.POSITION_DETECTION_PATTERN=Array.from([Int32Array.from([1,1,1,1,1,1,1]),Int32Array.from([1,0,0,0,0,0,1]),Int32Array.from([1,0,1,1,1,0,1]),Int32Array.from([1,0,1,1,1,0,1]),Int32Array.from([1,0,1,1,1,0,1]),Int32Array.from([1,0,0,0,0,0,1]),Int32Array.from([1,1,1,1,1,1,1])]),pr.POSITION_ADJUSTMENT_PATTERN=Array.from([Int32Array.from([1,1,1,1,1]),Int32Array.from([1,0,0,0,1]),Int32Array.from([1,0,1,0,1]),Int32Array.from([1,0,0,0,1]),Int32Array.from([1,1,1,1,1])]),pr.POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE=Array.from([Int32Array.from([-1,-1,-1,-1,-1,-1,-1]),Int32Array.from([6,18,-1,-1,-1,-1,-1]),Int32Array.from([6,22,-1,-1,-1,-1,-1]),Int32Array.from([6,26,-1,-1,-1,-1,-1]),Int32Array.from([6,30,-1,-1,-1,-1,-1]),Int32Array.from([6,34,-1,-1,-1,-1,-1]),Int32Array.from([6,22,38,-1,-1,-1,-1]),Int32Array.from([6,24,42,-1,-1,-1,-1]),Int32Array.from([6,26,46,-1,-1,-1,-1]),Int32Array.from([6,28,50,-1,-1,-1,-1]),Int32Array.from([6,30,54,-1,-1,-1,-1]),Int32Array.from([6,32,58,-1,-1,-1,-1]),Int32Array.from([6,34,62,-1,-1,-1,-1]),Int32Array.from([6,26,46,66,-1,-1,-1]),Int32Array.from([6,26,48,70,-1,-1,-1]),Int32Array.from([6,26,50,74,-1,-1,-1]),Int32Array.from([6,30,54,78,-1,-1,-1]),Int32Array.from([6,30,56,82,-1,-1,-1]),Int32Array.from([6,30,58,86,-1,-1,-1]),Int32Array.from([6,34,62,90,-1,-1,-1]),Int32Array.from([6,28,50,72,94,-1,-1]),Int32Array.from([6,26,50,74,98,-1,-1]),Int32Array.from([6,30,54,78,102,-1,-1]),Int32Array.from([6,28,54,80,106,-1,-1]),Int32Array.from([6,32,58,84,110,-1,-1]),Int32Array.from([6,30,58,86,114,-1,-1]),Int32Array.from([6,34,62,90,118,-1,-1]),Int32Array.from([6,26,50,74,98,122,-1]),Int32Array.from([6,30,54,78,102,126,-1]),Int32Array.from([6,26,52,78,104,130,-1]),Int32Array.from([6,30,56,82,108,134,-1]),Int32Array.from([6,34,60,86,112,138,-1]),Int32Array.from([6,30,58,86,114,142,-1]),Int32Array.from([6,34,62,90,118,146,-1]),Int32Array.from([6,30,54,78,102,126,150]),Int32Array.from([6,24,50,76,102,128,154]),Int32Array.from([6,28,54,80,106,132,158]),Int32Array.from([6,32,58,84,110,136,162]),Int32Array.from([6,26,54,82,110,138,166]),Int32Array.from([6,30,58,86,114,142,170])]),pr.TYPE_INFO_COORDINATES=Array.from([Int32Array.from([8,0]),Int32Array.from([8,1]),Int32Array.from([8,2]),Int32Array.from([8,3]),Int32Array.from([8,4]),Int32Array.from([8,5]),Int32Array.from([8,7]),Int32Array.from([8,8]),Int32Array.from([7,8]),Int32Array.from([5,8]),Int32Array.from([4,8]),Int32Array.from([3,8]),Int32Array.from([2,8]),Int32Array.from([1,8]),Int32Array.from([0,8])]),pr.VERSION_INFO_POLY=7973,pr.TYPE_INFO_POLY=1335,pr.TYPE_INFO_MASK_PATTERN=21522;class Ar{constructor(t,e){this.dataBytes=t,this.errorCorrectionBytes=e}getDataBytes(){return this.dataBytes}getErrorCorrectionBytes(){return this.errorCorrectionBytes}}class Cr{constructor(){}static calculateMaskPenalty(t){return fr.applyMaskPenaltyRule1(t)+fr.applyMaskPenaltyRule2(t)+fr.applyMaskPenaltyRule3(t)+fr.applyMaskPenaltyRule4(t)}static encode(t,e,r=null){let n=Cr.DEFAULT_BYTE_MODE_ENCODING;const i=null!==r&&void 0!==r.get(ur.CHARACTER_SET);i&&(n=r.get(ur.CHARACTER_SET).toString());const o=this.chooseMode(t,n),s=new p;if(o===_e.BYTE&&(i||Cr.DEFAULT_BYTE_MODE_ENCODING!==n)){const t=I.getCharacterSetECIByName(n);void 0!==t&&this.appendECI(t,s)}this.appendModeInfo(o,s);const a=new p;let c;if(this.appendBytes(t,o,a,n),null!==r&&void 0!==r.get(ur.QR_VERSION)){const t=Number.parseInt(r.get(ur.QR_VERSION).toString(),10);c=Ce.getVersionForNumber(t);const n=this.calculateBitsNeeded(o,s,a,c);if(!this.willFit(n,c,e))throw new mr("Data too big for requested version")}else c=this.recommendVersion(e,o,s,a);const l=new p;l.appendBitArray(s);const h=o===_e.BYTE?a.getSizeInBytes():t.length;this.appendLengthInfo(h,c,o,l),l.appendBitArray(a);const u=c.getECBlocksForLevel(e),d=c.getTotalCodewords()-u.getTotalECCodewords();this.terminateBits(d,l);const f=this.interleaveWithECBytes(l,c.getTotalCodewords(),d,u.getNumBlocks()),g=new wr;g.setECLevel(e),g.setMode(o),g.setVersion(c);const w=c.getDimensionForVersion(),m=new gr(w,w),A=this.chooseMaskPattern(f,e,c,m);return g.setMaskPattern(A),pr.buildMatrix(f,e,c,A,m),g.setMatrix(m),g}static recommendVersion(t,e,r,n){const i=this.calculateBitsNeeded(e,r,n,Ce.getVersionForNumber(1)),o=this.chooseVersion(i,t),s=this.calculateBitsNeeded(e,r,n,o);return this.chooseVersion(s,t)}static calculateBitsNeeded(t,e,r,n){return e.getSize()+t.getCharacterCountBits(n)+r.getSize()}static getAlphanumericCode(t){return t159)&&(r<224||r>235))return!1}return!0}static chooseMaskPattern(t,e,r,n){let i=Number.MAX_SAFE_INTEGER,o=-1;for(let s=0;s=(t+7)/8}static terminateBits(t,e){const r=8*t;if(e.getSize()>r)throw new mr("data bits cannot fit in the QR Code"+e.getSize()+" > "+r);for(let t=0;t<4&&e.getSize()0)for(let t=n;t<8;t++)e.appendBit(!1);const i=t-e.getSizeInBytes();for(let t=0;t=r)throw new mr("Block ID too large");const s=t%r,a=r-s,c=Math.floor(t/r),l=c+1,h=Math.floor(e/r),u=h+1,d=c-h,f=l-u;if(d!==f)throw new mr("EC bytes mismatch");if(r!==a+s)throw new mr("RS blocks mismatch");if(t!==(h+d)*a+(u+f)*s)throw new mr("Total bytes mismatch");n=1<=0&&e<=9}static appendNumericBytes(t,e){const r=t.length;let n=0;for(;n=33088&&n<=40956?i=n-33088:n>=57408&&n<=60351&&(i=n-49472),-1===i)throw new mr("Invalid byte sequence");const o=192*(i>>8)+(255&i);e.appendBits(o,13)}}static appendECI(t,e){e.appendBits(_e.ECI.getBits(),4),e.appendBits(t.getValue(),8)}}Cr.ALPHANUMERIC_TABLE=Int32Array.from([-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,36,-1,-1,-1,37,38,-1,-1,-1,-1,39,40,-1,41,42,43,0,1,2,3,4,5,6,7,8,9,44,-1,-1,-1,-1,-1,-1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,-1,-1,-1,-1,-1]),Cr.DEFAULT_BYTE_MODE_ENCODING=I.UTF8.getName();class Er{write(t,e,r,n=null){if(0===t.length)throw new c("Found empty contents");if(e<0||r<0)throw new c("Requested dimensions are too small: "+e+"x"+r);let i=we.L,o=Er.QUIET_ZONE_SIZE;null!==n&&(void 0!==n.get(ur.ERROR_CORRECTION)&&(i=we.fromString(n.get(ur.ERROR_CORRECTION).toString())),void 0!==n.get(ur.MARGIN)&&(o=Number.parseInt(n.get(ur.MARGIN).toString(),10)));const s=Cr.encode(t,i,n);return this.renderResult(s,e,r,o)}writeToDom(t,e,r,n,i=null){"string"==typeof t&&(t=document.querySelector(t));const o=this.write(e,r,n,i);t&&t.appendChild(o)}renderResult(t,e,r,n){const i=t.getMatrix();if(null===i)throw new $;const o=i.getWidth(),s=i.getHeight(),a=o+2*n,c=s+2*n,l=Math.max(e,a),h=Math.max(r,c),u=Math.min(Math.floor(l/a),Math.floor(h/c)),d=Math.floor((l-o*u)/2),f=Math.floor((h-s*u)/2),g=this.createSVGElement(l,h);for(let t=0,e=f;te||i+s>r)throw new c("Crop rectangle does not fit within image data.");a&&this.reverseHorizontal(o,s)}getRow(t,e){if(t<0||t>=this.getHeight())throw new c("Requested row is outside the image: "+t);const r=this.getWidth();(null==e||e.length>16&255,o=r>>7&510,s=255&r;i[e]=(n+o+s)/4&255}this.luminances=i}else this.luminances=t;if(void 0===n&&(this.dataWidth=e),void 0===i&&(this.dataHeight=r),void 0===o&&(this.left=0),void 0===s&&(this.top=0),this.left+e>this.dataWidth||this.top+r>this.dataHeight)throw new c("Crop rectangle does not fit within image data.")}getRow(t,e){if(t<0||t>=this.getHeight())throw new c("Requested row is outside the image: "+t);const r=this.getWidth();(null==e||e.length"}}class Or extends Rr{constructor(t,e,r){super(t,0,0),this.binaryShiftStart=e,this.binaryShiftByteCount=r}appendTo(t,e){for(let r=0;r62?t.appendBits(this.binaryShiftByteCount-31,16):0===r?t.appendBits(Math.min(this.binaryShiftByteCount,31),5):t.appendBits(this.binaryShiftByteCount-31,5)),t.appendBits(e[this.binaryShiftStart+r],8)}addBinaryShift(t,e){return new Or(this,t,e)}toString(){return"<"+this.binaryShiftStart+"::"+(this.binaryShiftStart+this.binaryShiftByteCount-1)+">"}}function br(t,e,r){return new Rr(t,e,r)}const Br=["UPPER","LOWER","DIGIT","MIXED","PUNCT"],Lr=0,Pr=1,vr=2,Fr=3,xr=4,kr=new Rr(null,0,0),Ur=[Int32Array.from([0,327708,327710,327709,656318]),Int32Array.from([590318,0,327710,327709,656318]),Int32Array.from([262158,590300,0,590301,932798]),Int32Array.from([327709,327708,656318,0,327710]),Int32Array.from([327711,656380,656382,656381,0])];const Hr=function(t){for(let e of t)w.fill(e,-1);return t[Lr][xr]=0,t[Pr][xr]=0,t[Pr][Lr]=28,t[Fr][xr]=0,t[vr][xr]=0,t[vr][Lr]=15,t}(w.createInt32Array(6,6));class Vr{constructor(t,e,r,n){this.token=t,this.mode=e,this.binaryShiftByteCount=r,this.bitCount=n}getMode(){return this.mode}getToken(){return this.token}getBinaryShiftByteCount(){return this.binaryShiftByteCount}getBitCount(){return this.bitCount}latchAndAppend(t,e){let r=this.bitCount,n=this.token;if(t!==this.mode){let e=Ur[this.mode][t];n=br(n,65535&e,e>>16),r+=e>>16}let i=t===vr?4:5;return n=br(n,e,i),new Vr(n,t,0,r+i)}shiftAndAppend(t,e){let r=this.token,n=this.mode===vr?4:5;return r=br(r,Hr[this.mode][t],n),r=br(r,e,5),new Vr(r,this.mode,0,this.bitCount+n+5)}addBinaryShiftChar(t){let e=this.token,r=this.mode,n=this.bitCount;if(this.mode===xr||this.mode===vr){let t=Ur[r][Lr];e=br(e,65535&t,t>>16),n+=t>>16,r=Lr}let i=0===this.binaryShiftByteCount||31===this.binaryShiftByteCount?18:62===this.binaryShiftByteCount?9:8,o=new Vr(e,r,this.binaryShiftByteCount+1,n+i);return 2078===o.binaryShiftByteCount&&(o=o.endBinaryShift(t+1)),o}endBinaryShift(t){if(0===this.binaryShiftByteCount)return this;let e=this.token;return e=function(t,e,r){return new Or(t,e,r)}(e,t-this.binaryShiftByteCount,this.binaryShiftByteCount),new Vr(e,this.mode,0,this.bitCount)}isBetterThanOrEqualTo(t){let e=this.bitCount+(Ur[this.mode][t.mode]>>16);return this.binaryShiftByteCountt.binaryShiftByteCount&&t.binaryShiftByteCount>0&&(e+=10),e<=t.bitCount}toBitArray(t){let e=[];for(let r=this.endBinaryShift(t.length).token;null!==r;r=r.getPrevious())e.unshift(r);let r=new p;for(const n of e)n.appendTo(r,t);return r}toString(){return T.format("%s bits=%d bytes=%d",Br[this.mode],this.bitCount,this.binaryShiftByteCount)}static calculateBinaryShiftCost(t){return t.binaryShiftByteCount>62?21:t.binaryShiftByteCount>31?20:t.binaryShiftByteCount>0?10:0}}Vr.INITIAL_STATE=new Vr(kr,Lr,0,0);const zr=function(t){const e=T.getCharCode(" "),r=T.getCharCode("."),n=T.getCharCode(",");t[Lr][e]=1;const i=T.getCharCode("Z"),o=T.getCharCode("A");for(let e=o;e<=i;e++)t[Lr][e]=e-o+2;t[Pr][e]=1;const s=T.getCharCode("z"),a=T.getCharCode("a");for(let e=a;e<=s;e++)t[Pr][e]=e-a+2;t[vr][e]=1;const c=T.getCharCode("9"),l=T.getCharCode("0");for(let e=l;e<=c;e++)t[vr][e]=e-l+2;t[vr][n]=12,t[vr][r]=13;const h=["\0"," ","","","","","","","","\b","\t","\n","\v","\f","\r","","","","","","@","\\","^","_","`","|","~",""];for(let e=0;e","?","[","]","{","}"];for(let e=0;e0&&(t[xr][T.getCharCode(u[e])]=e);return t}(w.createInt32Array(5,256));class Gr{constructor(t){this.text=t}encode(){const t=T.getCharCode(" "),e=T.getCharCode("\n");let r=Dr.singletonList(Vr.INITIAL_STATE);for(let n=0;n0?(r=Gr.updateStateListForPair(r,n,i),n++):r=this.updateStateListForChar(r,n)}return Dr.min(r,((t,e)=>t.getBitCount()-e.getBitCount())).toBitArray(this.text)}updateStateListForChar(t,e){const r=[];for(let n of t)this.updateStateForChar(n,e,r);return Gr.simplifyStates(r)}updateStateForChar(t,e,r){let n=255&this.text[e],i=zr[t.getMode()][n]>0,o=null;for(let s=0;s<=xr;s++){let a=zr[s][n];if(a>0){if(null==o&&(o=t.endBinaryShift(e)),!i||s===t.getMode()||s===vr){const t=o.latchAndAppend(s,a);r.push(t)}if(!i&&Hr[t.getMode()][s]>=0){const t=o.shiftAndAppend(s,a);r.push(t)}}}if(t.getBinaryShiftByteCount()>0||0===zr[t.getMode()][n]){let n=t.addBinaryShiftChar(e);r.push(n)}}static updateStateListForPair(t,e,r){const n=[];for(let i of t)this.updateStateForPair(i,e,r,n);return this.simplifyStates(n)}static updateStateForPair(t,e,r,n){let i=t.endBinaryShift(e);if(n.push(i.latchAndAppend(xr,r)),t.getMode()!==xr&&n.push(i.shiftAndAppend(xr,r)),3===r||4===r){let t=i.latchAndAppend(vr,16-r).latchAndAppend(vr,1);n.push(t)}if(t.getBinaryShiftByteCount()>0){let r=t.addBinaryShiftChar(e).addBinaryShiftChar(e+1);n.push(r)}}static simplifyStates(t){let e=[];for(const r of t){let t=!0;for(const n of e){if(n.isBetterThanOrEqualTo(r)){t=!1;break}r.isBetterThanOrEqualTo(n)&&(e=e.filter((t=>t!==n)))}t&&e.push(r)}return e}}class Yr{constructor(){}static encodeBytes(t){return Yr.encode(t,Yr.DEFAULT_EC_PERCENT,Yr.DEFAULT_AZTEC_LAYERS)}static encode(t,e,r){let n,i,o,s,a,l=new Gr(t).encode(),h=m.truncDivision(l.getSize()*e,100)+11,u=l.getSize()+h;if(r!==Yr.DEFAULT_AZTEC_LAYERS){if(n=r<0,i=Math.abs(r),i>(n?Yr.MAX_NB_BITS_COMPACT:Yr.MAX_NB_BITS))throw new c(T.format("Illegal value %s for layers",r));o=Yr.totalBitsInLayer(i,n),s=Yr.WORD_SIZE[i];let t=o-o%s;if(a=Yr.stuffBits(l,s),a.getSize()+h>t)throw new c("Data to large for user specified layer");if(n&&a.getSize()>64*s)throw new c("Data to large for user specified layer")}else{s=0,a=null;for(let t=0;;t++){if(t>Yr.MAX_NB_BITS)throw new c("Data too large for an Aztec code");if(n=t<=3,i=n?t+1:t,o=Yr.totalBitsInLayer(i,n),u>o)continue;null!=a&&s===Yr.WORD_SIZE[i]||(s=Yr.WORD_SIZE[i],a=Yr.stuffBits(l,s));let e=o-o%s;if(!(n&&a.getSize()>64*s)&&a.getSize()+h<=e)break}}let d,f=Yr.generateCheckWords(a,o,s),g=a.getSize()/s,w=Yr.generateModeMessage(n,i,g),p=(n?11:14)+4*i,A=new Int32Array(p);if(n){d=p;for(let t=0;t=n||t.get(o+r))&&(s|=1<{for(var n in e)r.o(e,n)&&!r.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),r.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var n={};(()=>{"use strict";var t;r.r(n),r.d(n,{Html5Qrcode:()=>W,Html5QrcodeScanType:()=>i,Html5QrcodeScanner:()=>ft,Html5QrcodeScannerState:()=>w,Html5QrcodeSupportedFormats:()=>t}),function(t){t[t.QR_CODE=0]="QR_CODE",t[t.AZTEC=1]="AZTEC",t[t.CODABAR=2]="CODABAR",t[t.CODE_39=3]="CODE_39",t[t.CODE_93=4]="CODE_93",t[t.CODE_128=5]="CODE_128",t[t.DATA_MATRIX=6]="DATA_MATRIX",t[t.MAXICODE=7]="MAXICODE",t[t.ITF=8]="ITF",t[t.EAN_13=9]="EAN_13",t[t.EAN_8=10]="EAN_8",t[t.PDF_417=11]="PDF_417",t[t.RSS_14=12]="RSS_14",t[t.RSS_EXPANDED=13]="RSS_EXPANDED",t[t.UPC_A=14]="UPC_A",t[t.UPC_E=15]="UPC_E",t[t.UPC_EAN_EXTENSION=16]="UPC_EAN_EXTENSION"}(t||(t={}));var e,i,o=new Map([[t.QR_CODE,"QR_CODE"],[t.AZTEC,"AZTEC"],[t.CODABAR,"CODABAR"],[t.CODE_39,"CODE_39"],[t.CODE_93,"CODE_93"],[t.CODE_128,"CODE_128"],[t.DATA_MATRIX,"DATA_MATRIX"],[t.MAXICODE,"MAXICODE"],[t.ITF,"ITF"],[t.EAN_13,"EAN_13"],[t.EAN_8,"EAN_8"],[t.PDF_417,"PDF_417"],[t.RSS_14,"RSS_14"],[t.RSS_EXPANDED,"RSS_EXPANDED"],[t.UPC_A,"UPC_A"],[t.UPC_E,"UPC_E"],[t.UPC_EAN_EXTENSION,"UPC_EAN_EXTENSION"]]);function s(e){return Object.values(t).includes(e)}!function(t){t[t.UNKNOWN=0]="UNKNOWN",t[t.URL=1]="URL"}(e||(e={})),function(t){t[t.SCAN_TYPE_CAMERA=0]="SCAN_TYPE_CAMERA",t[t.SCAN_TYPE_FILE=1]="SCAN_TYPE_FILE"}(i||(i={}));var a,c=function(){function t(){}return t.GITHUB_PROJECT_URL="https://github.com/mebjas/html5-qrcode",t.SCAN_DEFAULT_FPS=2,t.DEFAULT_DISABLE_FLIP=!1,t.DEFAULT_REMEMBER_LAST_CAMERA_USED=!0,t.DEFAULT_SUPPORTED_SCAN_TYPE=[i.SCAN_TYPE_CAMERA,i.SCAN_TYPE_FILE],t}(),l=function(){function t(t,e){this.format=t,this.formatName=e}return t.prototype.toString=function(){return this.formatName},t.create=function(e){if(!o.has(e))throw"".concat(e," not in html5QrcodeSupportedFormatsTextMap");return new t(e,o.get(e))},t}(),h=function(){function t(){}return t.createFromText=function(t){return{decodedText:t,result:{text:t}}},t.createFromQrcodeResult=function(t){return{decodedText:t.text,result:t}},t}();!function(t){t[t.UNKWOWN_ERROR=0]="UNKWOWN_ERROR",t[t.IMPLEMENTATION_ERROR=1]="IMPLEMENTATION_ERROR",t[t.NO_CODE_FOUND_ERROR=2]="NO_CODE_FOUND_ERROR"}(a||(a={}));var u=function(){function t(){}return t.createFrom=function(t){return{errorMessage:t,type:a.UNKWOWN_ERROR}},t}(),d=function(){function t(t){this.verbose=t}return t.prototype.log=function(t){this.verbose&&console.log(t)},t.prototype.warn=function(t){this.verbose&&console.warn(t)},t.prototype.logError=function(t,e){(this.verbose||!0===e)&&console.error(t)},t.prototype.logErrors=function(t){if(0===t.length)throw"Logger#logError called without arguments";this.verbose&&console.error(t)},t}();function f(t){return null==t}var g,w,m=function(){function t(){}return t.codeParseError=function(t){return"QR code parse error, error = ".concat(t)},t.errorGettingUserMedia=function(t){return"Error getting userMedia, error = ".concat(t)},t.onlyDeviceSupportedError=function(){return"The device doesn't support navigator.mediaDevices , only supported cameraIdOrConfig in this case is deviceId parameter (string)."},t.cameraStreamingNotSupported=function(){return"Camera streaming not supported by the browser."},t.unableToQuerySupportedDevices=function(){return"Unable to query supported devices, unknown error."},t.insecureContextCameraQueryError=function(){return"Camera access is only supported in secure context like https or localhost."},t.scannerPaused=function(){return"Scanner paused"},t}(),p=function(){function t(){}return t.scanningStatus=function(){return"Scanning"},t.idleStatus=function(){return"Idle"},t.errorStatus=function(){return"Error"},t.permissionStatus=function(){return"Permission"},t.noCameraFoundErrorStatus=function(){return"No Cameras"},t.lastMatch=function(t){return"Last Match: ".concat(t)},t.codeScannerTitle=function(){return"Code Scanner"},t.cameraPermissionTitle=function(){return"Request Camera Permissions"},t.cameraPermissionRequesting=function(){return"Requesting camera permissions..."},t.noCameraFound=function(){return"No camera found"},t.scanButtonStopScanningText=function(){return"Stop Scanning"},t.scanButtonStartScanningText=function(){return"Start Scanning"},t.torchOnButton=function(){return"Switch On Torch"},t.torchOffButton=function(){return"Switch Off Torch"},t.torchOnFailedMessage=function(){return"Failed to turn on torch"},t.torchOffFailedMessage=function(){return"Failed to turn off torch"},t.scanButtonScanningStarting=function(){return"Launching Camera..."},t.textIfCameraScanSelected=function(){return"Scan an Image File"},t.textIfFileScanSelected=function(){return"Scan using camera directly"},t.selectCamera=function(){return"Select Camera"},t.fileSelectionChooseImage=function(){return"Choose Image"},t.fileSelectionChooseAnother=function(){return"Choose Another"},t.fileSelectionNoImageSelected=function(){return"No image choosen"},t.anonymousCameraPrefix=function(){return"Anonymous Camera"},t.dragAndDropMessage=function(){return"Or drop an image to scan"},t.dragAndDropMessageOnlyImages=function(){return"Or drop an image to scan (other files not supported)"},t.zoom=function(){return"zoom"},t.loadingImage=function(){return"Loading image..."},t.cameraScanAltText=function(){return"Camera based scan"},t.fileScanAltText=function(){return"Fule based scan"},t}(),A=function(){function t(){}return t.poweredBy=function(){return"Powered by "},t.reportIssues=function(){return"Report issues"},t}(),C=function(){function t(){}return t.isMediaStreamConstraintsValid=function(t,e){if("object"!=typeof t){var r=typeof t;return e.logError("videoConstraints should be of type object, the "+"object passed is of type ".concat(r,"."),!0),!1}for(var n=new Set(["autoGainControl","channelCount","echoCancellation","latency","noiseSuppression","sampleRate","sampleSize","volume"]),i=0,o=Object.keys(t);i0&&i[i.length-1])||6!==a[0]&&2!==a[0])){s=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]r&&(r=s,e=o)}if(!e)throw"No largest barcode found";return e},e.prototype.createBarcodeDetectorFormats=function(t){for(var e=[],r=0,n=t;r0&&i[i.length-1])||6!==a[0]&&2!==a[0])){s=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]0&&i[i.length-1])||6!==a[0]&&2!==a[0])){s=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]=n&&(t.isClosed=!0,t.parentElement.removeChild(t.surface),e())}))}))},t.prototype.getCapabilities=function(){return new B(this.getFirstTrackOrFail())},t}(),P=function(){function t(t){this.mediaStream=t}return t.prototype.render=function(t,e,r){return D(this,void 0,void 0,(function(){return M(this,(function(n){return[2,L.create(t,this.mediaStream,e,r)]}))}))},t.create=function(e){return D(this,void 0,void 0,(function(){var r;return M(this,(function(n){switch(n.label){case 0:if(!navigator.mediaDevices)throw"navigator.mediaDevices not supported";return r={audio:!1,video:e},[4,navigator.mediaDevices.getUserMedia(r)];case 1:return[2,new t(n.sent())]}}))}))},t}(),v=function(t,e,r,n){return new(r||(r=Promise))((function(i,o){function s(t){try{c(n.next(t))}catch(t){o(t)}}function a(t){try{c(n.throw(t))}catch(t){o(t)}}function c(t){var e;t.done?i(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(s,a)}c((n=n.apply(t,e||[])).next())}))},F=function(t,e){var r,n,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(a){return function(c){return function(a){if(r)throw new TypeError("Generator is already executing.");for(;o&&(o=0,a[0]&&(s=0)),s;)try{if(r=1,n&&(i=2&a[0]?n.return:a[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,a[1])).done)return i;switch(n=0,i&&(a=[2&a[0],i.value]),a[0]){case 0:case 1:i=a;break;case 4:return s.label++,{value:a[1],done:!1};case 5:s.label++,n=a[1],a=[0];continue;case 7:a=s.ops.pop(),s.trys.pop();continue;default:if(!((i=(i=s.trys).length>0&&i[i.length-1])||6!==a[0]&&2!==a[0])){s=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]0&&i[i.length-1])||6!==a[0]&&2!==a[0])){s=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]t&&(this.logger.warn("`qrbox.width` or `qrbox` is larger than the width of the root element. The width will be truncated to the width of root element."),i=t),i)},e.prototype.validateQrboxConfig=function(t){if("number"!=typeof t&&"function"!=typeof t&&(void 0===t.width||void 0===t.height))throw"Invalid instance of QrDimensions passed for 'config.qrbox'. Both 'width' and 'height' should be set."},e.prototype.toQrdimensions=function(t,e,r){if("number"==typeof r)return{width:r,height:r};if("function"==typeof r)try{return r(t,e)}catch(t){throw new Error("qrbox config was passed as a function but it failed with unknown error"+t)}return r},e.prototype.setupUi=function(t,e,r){r.isShadedBoxEnabled()&&this.validateQrboxSize(t,e,r);var n=f(r.qrbox)?{width:t,height:e}:r.qrbox;this.validateQrboxConfig(n);var i=this.toQrdimensions(t,e,n);i.height>e&&this.logger.warn("[Html5Qrcode] config.qrbox has height that isgreater than the height of the video stream. Shading will be ignored");var o=r.isShadedBoxEnabled()&&i.height<=e,s={x:0,y:0,width:t,height:e},a=o?this.getShadedRegionBounds(t,e,i):s,c=this.createCanvasElement(a.width,a.height),l=c.getContext("2d",{willReadFrequently:!0});l.canvas.width=a.width,l.canvas.height=a.height,this.element.append(c),o&&this.possiblyInsertShadingElement(this.element,t,e,i),this.createScannerPausedUiElement(this.element),this.qrRegion=a,this.context=l,this.canvasElement=c},e.prototype.createScannerPausedUiElement=function(t){var e=document.createElement("div");e.innerText=m.scannerPaused(),e.style.display="none",e.style.position="absolute",e.style.top="0px",e.style.zIndex="1",e.style.background="rgba(9, 9, 9, 0.46)",e.style.color="#FFECEC",e.style.textAlign="center",e.style.width="100%",t.appendChild(e),this.scannerPausedUiElement=e},e.prototype.scanContext=function(t,e){var r=this;return this.stateManagerProxy.isPaused()?Promise.resolve(!1):this.qrcode.decodeAsync(this.canvasElement).then((function(e){return t(e.text,h.createFromQrcodeResult(e)),r.possiblyUpdateShaders(!0),!0})).catch((function(t){r.possiblyUpdateShaders(!1);var n=m.codeParseError(t);return e(n,u.createFrom(n)),!1}))},e.prototype.foreverScan=function(t,e,r){var n=this;if(this.shouldScan&&this.renderedCamera){var i=this.renderedCamera.getSurface(),o=i.videoWidth/i.clientWidth,s=i.videoHeight/i.clientHeight;if(!this.qrRegion)throw"qrRegion undefined when localMediaStream is ready.";var a=this.qrRegion.width*o,c=this.qrRegion.height*s,l=this.qrRegion.x*o,h=this.qrRegion.y*s;this.context.drawImage(i,l,h,a,c,0,0,this.qrRegion.width,this.qrRegion.height);var u=function(){n.foreverScanTimeout=setTimeout((function(){n.foreverScan(t,e,r)}),n.getTimeoutFps(t.fps))};this.scanContext(e,r).then((function(i){i||!0===t.disableFlip?u():(n.context.translate(n.context.canvas.width,0),n.context.scale(-1,1),n.scanContext(e,r).finally((function(){u()})))})).catch((function(t){n.logger.logError("Error happend while scanning context",t),u()}))}},e.prototype.createVideoConstraints=function(t){if("string"==typeof t)return{deviceId:{exact:t}};if("object"==typeof t){var e="facingMode",r="deviceId",n={user:!0,environment:!0},i="exact",o=function(t){if(t in n)return!0;throw"config has invalid 'facingMode' value = "+"'".concat(t,"'")},s=Object.keys(t);if(1!==s.length)throw"'cameraIdOrConfig' object should have exactly 1 key,"+" if passed as an object, found ".concat(s.length," keys");var a=Object.keys(t)[0];if(a!==e&&a!==r)throw"Only '".concat(e,"' and '").concat(r,"' ")+" are supported for 'cameraIdOrConfig'";if(a!==e){var c=t.deviceId;if("string"==typeof c)return{deviceId:c};if("object"==typeof c){if(i in c)return{deviceId:{exact:c["".concat(i)]}};throw"'deviceId' should be string or object with"+" ".concat(i," as key.")}throw"Invalid type of 'deviceId' = ".concat(typeof c)}var l=t.facingMode;if("string"==typeof l){if(o(l))return{facingMode:l}}else{if("object"!=typeof l)throw"Invalid type of 'facingMode' = ".concat(typeof l);if(!(i in l))throw"'facingMode' should be string or object with"+" ".concat(i," as key.");if(o(l["".concat(i)]))return{facingMode:{exact:l["".concat(i)]}}}}throw"Invalid type of 'cameraIdOrConfig' = ".concat(typeof t)},e.prototype.computeCanvasDrawConfig=function(t,e,r,n){if(t<=r&&e<=n)return{x:(r-t)/2,y:(n-e)/2,width:t,height:e};var i=t,o=e;return t>r&&(e*=r/t,t=r),e>n&&(t*=n/e,e=n),this.logger.log("Image downsampled from "+"".concat(i,"X").concat(o)+" to ".concat(t,"X").concat(e,".")),this.computeCanvasDrawConfig(t,e,r,n)},e.prototype.clearElement=function(){if(this.stateManagerProxy.isScanning())throw"Cannot clear while scan is ongoing, close it first.";var t=document.getElementById(this.elementId);t&&(t.innerHTML="")},e.prototype.possiblyUpdateShaders=function(t){this.qrMatch!==t&&(this.hasBorderShaders&&this.borderShaders&&this.borderShaders.length&&this.borderShaders.forEach((function(e){e.style.backgroundColor=t?Y.BORDER_SHADER_MATCH_COLOR:Y.BORDER_SHADER_DEFAULT_COLOR})),this.qrMatch=t)},e.prototype.possiblyCloseLastScanImageFile=function(){this.lastScanImageFile&&(URL.revokeObjectURL(this.lastScanImageFile),this.lastScanImageFile=null)},e.prototype.createCanvasElement=function(t,e,r){var n=t,i=e,o=document.createElement("canvas");return o.style.width="".concat(n,"px"),o.style.height="".concat(i,"px"),o.style.display="none",o.id=f(r)?"qr-canvas":r,o},e.prototype.getShadedRegionBounds=function(t,e,r){if(r.width>t||r.height>e)throw"'config.qrbox' dimensions should not be greater than the dimensions of the root HTML element.";return{x:(t-r.width)/2,y:(e-r.height)/2,width:r.width,height:r.height}},e.prototype.possiblyInsertShadingElement=function(t,e,r,n){if(!(e-n.width<1||r-n.height<1)){var i=document.createElement("div");i.style.position="absolute";var o=(e-n.width)/2,s=(r-n.height)/2;if(i.style.borderLeft="".concat(o,"px solid rgba(0, 0, 0, 0.48)"),i.style.borderRight="".concat(o,"px solid rgba(0, 0, 0, 0.48)"),i.style.borderTop="".concat(s,"px solid rgba(0, 0, 0, 0.48)"),i.style.borderBottom="".concat(s,"px solid rgba(0, 0, 0, 0.48)"),i.style.boxSizing="border-box",i.style.top="0px",i.style.bottom="0px",i.style.left="0px",i.style.right="0px",i.id="".concat(Y.SHADED_REGION_ELEMENT_ID),e-n.width<11||r-n.height<11)this.hasBorderShaders=!1;else{this.insertShaderBorders(i,40,5,-5,null,0,!0),this.insertShaderBorders(i,40,5,-5,null,0,!1),this.insertShaderBorders(i,40,5,null,-5,0,!0),this.insertShaderBorders(i,40,5,null,-5,0,!1),this.insertShaderBorders(i,5,45,-5,null,-5,!0),this.insertShaderBorders(i,5,45,null,-5,-5,!0),this.insertShaderBorders(i,5,45,-5,null,-5,!1),this.insertShaderBorders(i,5,45,null,-5,-5,!1),this.hasBorderShaders=!0}t.append(i)}},e.prototype.insertShaderBorders=function(t,e,r,n,i,o,s){var a=document.createElement("div");a.style.position="absolute",a.style.backgroundColor=Y.BORDER_SHADER_DEFAULT_COLOR,a.style.width="".concat(e,"px"),a.style.height="".concat(r,"px"),null!==n&&(a.style.top="".concat(n,"px")),null!==i&&(a.style.bottom="".concat(i,"px")),s?a.style.left="".concat(o,"px"):a.style.right="".concat(o,"px"),this.borderShaders||(this.borderShaders=[]),this.borderShaders.push(a),t.appendChild(a)},e.prototype.showPausedState=function(){if(!this.scannerPausedUiElement)throw"[internal error] scanner paused UI element not found";this.scannerPausedUiElement.style.display="block"},e.prototype.hidePausedState=function(){if(!this.scannerPausedUiElement)throw"[internal error] scanner paused UI element not found";this.scannerPausedUiElement.style.display="none"},e.prototype.getTimeoutFps=function(t){return 1e3/t},e}(),j="data:image/svg+xml;base64,",Z=j+"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzNzEuNjQzIDM3MS42NDMiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDM3MS42NDMgMzcxLjY0MyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBhdGggZD0iTTEwNS4wODQgMzguMjcxaDE2My43Njh2MjBIMTA1LjA4NHoiLz48cGF0aCBkPSJNMzExLjU5NiAxOTAuMTg5Yy03LjQ0MS05LjM0Ny0xOC40MDMtMTYuMjA2LTMyLjc0My0yMC41MjJWMzBjMC0xNi41NDItMTMuNDU4LTMwLTMwLTMwSDEyNS4wODRjLTE2LjU0MiAwLTMwIDEzLjQ1OC0zMCAzMHYxMjAuMTQzaC04LjI5NmMtMTYuNTQyIDAtMzAgMTMuNDU4LTMwIDMwdjEuMzMzYTI5LjgwNCAyOS44MDQgMCAwIDAgNC42MDMgMTUuOTM5Yy03LjM0IDUuNDc0LTEyLjEwMyAxNC4yMjEtMTIuMTAzIDI0LjA2MXYxLjMzM2MwIDkuODQgNC43NjMgMTguNTg3IDEyLjEwMyAyNC4wNjJhMjkuODEgMjkuODEgMCAwIDAtNC42MDMgMTUuOTM4djEuMzMzYzAgMTYuNTQyIDEzLjQ1OCAzMCAzMCAzMGg4LjMyNGMuNDI3IDExLjYzMSA3LjUwMyAyMS41ODcgMTcuNTM0IDI2LjE3Ny45MzEgMTAuNTAzIDQuMDg0IDMwLjE4NyAxNC43NjggNDUuNTM3YTkuOTg4IDkuOTg4IDAgMCAwIDguMjE2IDQuMjg4IDkuOTU4IDkuOTU4IDAgMCAwIDUuNzA0LTEuNzkzYzQuNTMzLTMuMTU1IDUuNjUtOS4zODggMi40OTUtMTMuOTIxLTYuNzk4LTkuNzY3LTkuNjAyLTIyLjYwOC0xMC43Ni0zMS40aDgyLjY4NWMuMjcyLjQxNC41NDUuODE4LjgxNSAxLjIxIDMuMTQyIDQuNTQxIDkuMzcyIDUuNjc5IDEzLjkxMyAyLjUzNCA0LjU0Mi0zLjE0MiA1LjY3Ny05LjM3MSAyLjUzNS0xMy45MTMtMTEuOTE5LTE3LjIyOS04Ljc4Ny0zNS44ODQgOS41ODEtNTcuMDEyIDMuMDY3LTIuNjUyIDEyLjMwNy0xMS43MzIgMTEuMjE3LTI0LjAzMy0uODI4LTkuMzQzLTcuMTA5LTE3LjE5NC0xOC42NjktMjMuMzM3YTkuODU3IDkuODU3IDAgMCAwLTEuMDYxLS40ODZjLS40NjYtLjE4Mi0xMS40MDMtNC41NzktOS43NDEtMTUuNzA2IDEuMDA3LTYuNzM3IDE0Ljc2OC04LjI3MyAyMy43NjYtNy42NjYgMjMuMTU2IDEuNTY5IDM5LjY5OCA3LjgwMyA0Ny44MzYgMTguMDI2IDUuNzUyIDcuMjI1IDcuNjA3IDE2LjYyMyA1LjY3MyAyOC43MzMtLjQxMyAyLjU4NS0uODI0IDUuMjQxLTEuMjQ1IDcuOTU5LTUuNzU2IDM3LjE5NC0xMi45MTkgODMuNDgzLTQ5Ljg3IDExNC42NjEtNC4yMjEgMy41NjEtNC43NTYgOS44Ny0xLjE5NCAxNC4wOTJhOS45OCA5Ljk4IDAgMCAwIDcuNjQ4IDMuNTUxIDkuOTU1IDkuOTU1IDAgMCAwIDYuNDQ0LTIuMzU4YzQyLjY3Mi0zNi4wMDUgNTAuODAyLTg4LjUzMyA1Ni43MzctMTI2Ljg4OC40MTUtMi42ODQuODIxLTUuMzA5IDEuMjI5LTcuODYzIDIuODM0LTE3LjcyMS0uNDU1LTMyLjY0MS05Ljc3Mi00NC4zNDV6bS0yMzIuMzA4IDQyLjYyYy01LjUxNCAwLTEwLTQuNDg2LTEwLTEwdi0xLjMzM2MwLTUuNTE0IDQuNDg2LTEwIDEwLTEwaDE1djIxLjMzM2gtMTV6bS0yLjUtNTIuNjY2YzAtNS41MTQgNC40ODYtMTAgMTAtMTBoNy41djIxLjMzM2gtNy41Yy01LjUxNCAwLTEwLTQuNDg2LTEwLTEwdi0xLjMzM3ptMTcuNSA5My45OTloLTcuNWMtNS41MTQgMC0xMC00LjQ4Ni0xMC0xMHYtMS4zMzNjMC01LjUxNCA0LjQ4Ni0xMCAxMC0xMGg3LjV2MjEuMzMzem0zMC43OTYgMjguODg3Yy01LjUxNCAwLTEwLTQuNDg2LTEwLTEwdi04LjI3MWg5MS40NTdjLS44NTEgNi42NjgtLjQzNyAxMi43ODcuNzMxIDE4LjI3MWgtODIuMTg4em03OS40ODItMTEzLjY5OGMtMy4xMjQgMjAuOTA2IDEyLjQyNyAzMy4xODQgMjEuNjI1IDM3LjA0IDUuNDQxIDIuOTY4IDcuNTUxIDUuNjQ3IDcuNzAxIDcuMTg4LjIxIDIuMTUtMi41NTMgNS42ODQtNC40NzcgNy4yNTEtLjQ4Mi4zNzgtLjkyOS44LTEuMzM1IDEuMjYxLTYuOTg3IDcuOTM2LTExLjk4MiAxNS41Mi0xNS40MzIgMjIuNjg4aC05Ny41NjRWMzBjMC01LjUxNCA0LjQ4Ni0xMCAxMC0xMGgxMjMuNzY5YzUuNTE0IDAgMTAgNC40ODYgMTAgMTB2MTM1LjU3OWMtMy4wMzItLjM4MS02LjE1LS42OTQtOS4zODktLjkxNC0yNS4xNTktMS42OTQtNDIuMzcgNy43NDgtNDQuODk4IDI0LjY2NnoiLz48cGF0aCBkPSJNMTc5LjEyOSA4My4xNjdoLTI0LjA2YTUgNSAwIDAgMC01IDV2MjQuMDYxYTUgNSAwIDAgMCA1IDVoMjQuMDZhNSA1IDAgMCAwIDUtNVY4OC4xNjdhNSA1IDAgMCAwLTUtNXpNMTcyLjYyOSAxNDIuODZoLTEyLjU2VjEzMC44YTUgNSAwIDEgMC0xMCAwdjE3LjA2MWE1IDUgMCAwIDAgNSA1aDE3LjU2YTUgNSAwIDEgMCAwLTEwLjAwMXpNMjE2LjU2OCA4My4xNjdoLTI0LjA2YTUgNSAwIDAgMC01IDV2MjQuMDYxYTUgNSAwIDAgMCA1IDVoMjQuMDZhNSA1IDAgMCAwIDUtNVY4OC4xNjdhNSA1IDAgMCAwLTUtNXptLTUgMjQuMDYxaC0xNC4wNlY5My4xNjdoMTQuMDZ2MTQuMDYxek0yMTEuNjY5IDEyNS45MzZIMTk3LjQxYTUgNSAwIDAgMC01IDV2MTQuMjU3YTUgNSAwIDAgMCA1IDVoMTQuMjU5YTUgNSAwIDAgMCA1LTV2LTE0LjI1N2E1IDUgMCAwIDAtNS01eiIvPjwvc3ZnPg==",Q=j+"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1OS4wMTggNTkuMDE4IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1OS4wMTggNTkuMDE4IiB4bWw6c3BhY2U9InByZXNlcnZlIj48cGF0aCBkPSJtNTguNzQxIDU0LjgwOS01Ljk2OS02LjI0NGExMC43NCAxMC43NCAwIDAgMCAyLjgyLTcuMjVjMC01Ljk1My00Ljg0My0xMC43OTYtMTAuNzk2LTEwLjc5NlMzNCAzNS4zNjEgMzQgNDEuMzE0IDM4Ljg0MyA1Mi4xMSA0NC43OTYgNTIuMTFjMi40NDEgMCA0LjY4OC0uODI0IDYuNDk5LTIuMTk2bDYuMDAxIDYuMjc3YS45OTguOTk4IDAgMCAwIDEuNDE0LjAzMiAxIDEgMCAwIDAgLjAzMS0xLjQxNHpNMzYgNDEuMzE0YzAtNC44NSAzLjk0Ni04Ljc5NiA4Ljc5Ni04Ljc5NnM4Ljc5NiAzLjk0NiA4Ljc5NiA4Ljc5Ni0zLjk0NiA4Ljc5Ni04Ljc5NiA4Ljc5NlMzNiA0Ni4xNjQgMzYgNDEuMzE0ek0xMC40MzEgMTYuMDg4YzAgMy4wNyAyLjQ5OCA1LjU2OCA1LjU2OSA1LjU2OHM1LjU2OS0yLjQ5OCA1LjU2OS01LjU2OGMwLTMuMDcxLTIuNDk4LTUuNTY5LTUuNTY5LTUuNTY5cy01LjU2OSAyLjQ5OC01LjU2OSA1LjU2OXptOS4xMzggMGMwIDEuOTY4LTEuNjAyIDMuNTY4LTMuNTY5IDMuNTY4cy0zLjU2OS0xLjYwMS0zLjU2OS0zLjU2OCAxLjYwMi0zLjU2OSAzLjU2OS0zLjU2OSAzLjU2OSAxLjYwMSAzLjU2OSAzLjU2OXoiLz48cGF0aCBkPSJtMzAuODgyIDI4Ljk4NyA5LjE4LTEwLjA1NCAxMS4yNjIgMTAuMzIzYTEgMSAwIDAgMCAxLjM1MS0xLjQ3NWwtMTItMTFhMSAxIDAgMCAwLTEuNDE0LjA2M2wtOS43OTQgMTAuNzI3LTQuNzQzLTQuNzQzYTEuMDAzIDEuMDAzIDAgMCAwLTEuMzY4LS4wNDRMNi4zMzkgMzcuNzY4YTEgMSAwIDEgMCAxLjMyMiAxLjUwMWwxNi4zMTMtMTQuMzYyIDcuMzE5IDcuMzE4YS45OTkuOTk5IDAgMSAwIDEuNDE0LTEuNDE0bC0xLjgyNS0xLjgyNHoiLz48cGF0aCBkPSJNMzAgNDYuNTE4SDJ2LTQyaDU0djI4YTEgMSAwIDEgMCAyIDB2LTI5YTEgMSAwIDAgMC0xLTFIMWExIDEgMCAwIDAtMSAxdjQ0YTEgMSAwIDAgMCAxIDFoMjlhMSAxIDAgMSAwIDAtMnoiLz48L3N2Zz4=",K=j+"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NjAgNDYwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA0NjAgNDYwIiB4bWw6c3BhY2U9InByZXNlcnZlIj48cGF0aCBkPSJNMjMwIDBDMTAyLjk3NSAwIDAgMTAyLjk3NSAwIDIzMHMxMDIuOTc1IDIzMCAyMzAgMjMwIDIzMC0xMDIuOTc0IDIzMC0yMzBTMzU3LjAyNSAwIDIzMCAwem0zOC4zMzMgMzc3LjM2YzAgOC42NzYtNy4wMzQgMTUuNzEtMTUuNzEgMTUuNzFoLTQzLjEwMWMtOC42NzYgMC0xNS43MS03LjAzNC0xNS43MS0xNS43MVYyMDIuNDc3YzAtOC42NzYgNy4wMzMtMTUuNzEgMTUuNzEtMTUuNzFoNDMuMTAxYzguNjc2IDAgMTUuNzEgNy4wMzMgMTUuNzEgMTUuNzFWMzc3LjM2ek0yMzAgMTU3Yy0yMS41MzkgMC0zOS0xNy40NjEtMzktMzlzMTcuNDYxLTM5IDM5LTM5IDM5IDE3LjQ2MSAzOSAzOS0xNy40NjEgMzktMzkgMzl6Ii8+PC9zdmc+",q=function(){function t(){}return t.createDefault=function(){return{hasPermission:!1,lastUsedCameraId:null}},t}(),J=function(){function t(){this.data=q.createDefault();var e=localStorage.getItem(t.LOCAL_STORAGE_KEY);e?this.data=JSON.parse(e):this.reset()}return t.prototype.hasCameraPermissions=function(){return this.data.hasPermission},t.prototype.getLastUsedCameraId=function(){return this.data.lastUsedCameraId},t.prototype.setHasPermission=function(t){this.data.hasPermission=t,this.flush()},t.prototype.setLastUsedCameraId=function(t){this.data.lastUsedCameraId=t,this.flush()},t.prototype.resetLastUsedCameraId=function(){this.data.lastUsedCameraId=null,this.flush()},t.prototype.reset=function(){this.data=q.createDefault(),this.flush()},t.prototype.flush=function(){localStorage.setItem(t.LOCAL_STORAGE_KEY,JSON.stringify(this.data))},t.LOCAL_STORAGE_KEY="HTML5_QRCODE_DATA",t}(),$=function(){function t(){this.infoDiv=document.createElement("div")}return t.prototype.renderInto=function(t){this.infoDiv.style.position="absolute",this.infoDiv.style.top="10px",this.infoDiv.style.right="10px",this.infoDiv.style.zIndex="2",this.infoDiv.style.display="none",this.infoDiv.style.padding="5pt",this.infoDiv.style.border="1px solid #171717",this.infoDiv.style.fontSize="10pt",this.infoDiv.style.background="rgb(0 0 0 / 69%)",this.infoDiv.style.borderRadius="5px",this.infoDiv.style.textAlign="center",this.infoDiv.style.fontWeight="400",this.infoDiv.style.color="white",this.infoDiv.innerText=A.poweredBy();var e=document.createElement("a");e.innerText="ScanApp",e.href="https://scanapp.org",e.target="new",e.style.color="white",this.infoDiv.appendChild(e);var r=document.createElement("br"),n=document.createElement("br");this.infoDiv.appendChild(r),this.infoDiv.appendChild(n);var i=document.createElement("a");i.innerText=A.reportIssues(),i.href="https://github.com/mebjas/html5-qrcode/issues",i.target="new",i.style.color="white",this.infoDiv.appendChild(i),t.appendChild(this.infoDiv)},t.prototype.show=function(){this.infoDiv.style.display="block"},t.prototype.hide=function(){this.infoDiv.style.display="none"},t}(),tt=function(){function t(t,e){this.isShowingInfoIcon=!0,this.onTapIn=t,this.onTapOut=e,this.infoIcon=document.createElement("img")}return t.prototype.renderInto=function(t){var e=this;this.infoIcon.alt="Info icon",this.infoIcon.src=K,this.infoIcon.style.position="absolute",this.infoIcon.style.top="4px",this.infoIcon.style.right="4px",this.infoIcon.style.opacity="0.6",this.infoIcon.style.cursor="pointer",this.infoIcon.style.zIndex="2",this.infoIcon.style.width="16px",this.infoIcon.style.height="16px",this.infoIcon.onmouseover=function(t){return e.onHoverIn()},this.infoIcon.onmouseout=function(t){return e.onHoverOut()},this.infoIcon.onclick=function(t){return e.onClick()},t.appendChild(this.infoIcon)},t.prototype.onHoverIn=function(){this.isShowingInfoIcon&&(this.infoIcon.style.opacity="1")},t.prototype.onHoverOut=function(){this.isShowingInfoIcon&&(this.infoIcon.style.opacity="0.6")},t.prototype.onClick=function(){this.isShowingInfoIcon?(this.isShowingInfoIcon=!1,this.onTapIn(),this.infoIcon.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAQgAAAEIBarqQRAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAE1SURBVDiNfdI7S0NBEAXgLya1otFgpbYSbISAgpXYi6CmiH9KCAiChaVga6OiWPgfRDQ+0itaGVNosXtluWwcuMzePfM4M3sq8lbHBubwg1dc4m1E/J/N4ghDPOIsfk/4xiEao5KX0McFljN4C9d4QTPXuY99jP3DsIoDPGM6BY5i5yI5R7O4q+ImFkJY2DCh3cAH2klyB+9J1xUMMAG7eCh1a+Mr+k48b5diXrFVwwLuS+BJ9MfR7+G0FHOHhTHhnXNWS87VDF4pcnfQK4Ep7XScNLmPTZgURNKKYENYWDpzW1BhscS1WHS8CDgURFJQrWcoF3c13KKbgg1BYQfy8xZWEzTTw1QZbAoKu8FqJnktdu5hcVSHmchiILzzuaDQvjBzV2m8yohCE1jHfPx/xhU+y4G/D75ELlRJsSYAAAAASUVORK5CYII=",this.infoIcon.style.opacity="1"):(this.isShowingInfoIcon=!0,this.onTapOut(),this.infoIcon.src=K,this.infoIcon.style.opacity="0.6")},t}(),et=function(){function t(){var t=this;this.infoDiv=new $,this.infoIcon=new tt((function(){t.infoDiv.show()}),(function(){t.infoDiv.hide()}))}return t.prototype.renderInto=function(t){this.infoDiv.renderInto(t),this.infoIcon.renderInto(t)},t}(),rt=function(){function t(){}return t.hasPermissions=function(){return t=this,e=void 0,n=function(){var t,e,r,n;return function(t,e){var r,n,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(a){return function(c){return function(a){if(r)throw new TypeError("Generator is already executing.");for(;o&&(o=0,a[0]&&(s=0)),s;)try{if(r=1,n&&(i=2&a[0]?n.return:a[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,a[1])).done)return i;switch(n=0,i&&(a=[2&a[0],i.value]),a[0]){case 0:case 1:i=a;break;case 4:return s.label++,{value:a[1],done:!1};case 5:s.label++,n=a[1],a=[0];continue;case 7:a=s.ops.pop(),s.trys.pop();continue;default:if(!((i=(i=s.trys).length>0&&i[i.length-1])||6!==a[0]&&2!==a[0])){s=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]1},t.prototype.isCameraScanRequired=function(){for(var e=0,r=this.supportedScanTypes;ee)throw"Max ".concat(e," values expected for ")+"supportedScanTypes";for(var r=0,n=t;r0&&i[i.length-1])||6!==a[0]&&2!==a[0])){s=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]20){var e=t.substring(0,8),r=t.length,n=t.substring(r-8,r);t="".concat(e,"....").concat(n)}var i=p.fileSelectionChooseAnother()+" - "+t;this.fileSelectionButton.innerText=i},t.prototype.setInitialValueToButton=function(){var t=p.fileSelectionChooseImage()+" - "+p.fileSelectionNoImageSelected();this.fileSelectionButton.innerText=t},t.prototype.getFileScanInputId=function(){return"html5-qrcode-private-filescan-input"},t.create=function(e,r,n){return new t(e,r,n)},t}(),ut=function(){function t(t){this.selectElement=ot.createElement("select",it.CAMERA_SELECTION_SELECT_ID),this.cameras=t,this.options=[]}return t.prototype.render=function(t){var e=document.createElement("span");e.style.marginRight="10px";var r=this.cameras.length;if(0===r)throw new Error("No cameras found");if(1===r)e.style.display="none";else{var n=p.selectCamera();e.innerText="".concat(n," (").concat(this.cameras.length,") ")}for(var i=1,o=0,s=this.cameras;o0?(t.removeChild(e),n.renderCameraSelection(r)):(n.setHeaderMessage(p.noCameraFound(),U.STATUS_WARNING),i())})).catch((function(t){n.persistedDataManager.setHasPermission(!1),r?r.disabled=!1:i(),n.setHeaderMessage(t,U.STATUS_WARNING),n.showHideScanTypeSwapLink(!0)}))},t.prototype.createPermissionButton=function(t,e){var r=this,n=ot.createElement("button",this.getCameraPermissionButtonId());n.innerText=p.cameraPermissionTitle(),n.addEventListener("click",(function(){n.disabled=!0,r.createCameraListUi(t,e,n)})),e.appendChild(n)},t.prototype.createPermissionsUi=function(t,e){var r=this;nt.isCameraScanType(this.currentScanType)&&this.persistedDataManager.hasCameraPermissions()?rt.hasPermissions().then((function(n){n?r.createCameraListUi(t,e):(r.persistedDataManager.setHasPermission(!1),r.createPermissionButton(t,e))})).catch((function(n){r.persistedDataManager.setHasPermission(!1),r.createPermissionButton(t,e)})):this.createPermissionButton(t,e)},t.prototype.createSectionControlPanel=function(){var t=document.getElementById(this.getDashboardSectionId()),e=document.createElement("div");t.appendChild(e);var r=document.createElement("div");r.id=this.getDashboardSectionCameraScanRegionId(),r.style.display=nt.isCameraScanType(this.currentScanType)?"block":"none",e.appendChild(r);var n=document.createElement("div");n.style.textAlign="center",r.appendChild(n),this.scanTypeSelector.isCameraScanRequired()&&this.createPermissionsUi(r,n),this.renderFileScanUi(e)},t.prototype.renderFileScanUi=function(t){var e=nt.isFileScanType(this.currentScanType),r=this;this.fileSelectionUi=ht.create(t,e,(function(t){if(!r.html5Qrcode)throw"html5Qrcode not defined";nt.isFileScanType(r.currentScanType)&&(r.setHeaderMessage(p.loadingImage()),r.html5Qrcode.scanFileV2(t,!0).then((function(t){r.resetHeaderMessage(),r.qrCodeSuccessCallback(t.decodedText,t)})).catch((function(t){r.setHeaderMessage(t,U.STATUS_WARNING),r.qrCodeErrorCallback(t,u.createFrom(t))})))}))},t.prototype.renderCameraSelection=function(t){var e=this,r=this,n=document.getElementById(this.getDashboardSectionCameraScanRegionId());n.style.textAlign="center";var i=dt.create(n,!1),o=ut.create(n,t),s=document.createElement("span"),a=ot.createElement("button",it.CAMERA_START_BUTTON_ID);a.innerText=p.scanButtonStartScanningText(),s.appendChild(a);var c,l=ot.createElement("button",it.CAMERA_STOP_BUTTON_ID);l.innerText=p.scanButtonStopScanningText(),l.style.display="none",l.disabled=!0,s.appendChild(l),n.appendChild(s);var h=function(t){t||(a.style.display="none"),a.innerText=p.scanButtonStartScanningText(),a.style.opacity="1",a.disabled=!1,t&&(a.style.display="inline-block")};if(a.addEventListener("click",(function(t){a.innerText=p.scanButtonScanningStarting(),o.disable(),a.disabled=!0,a.style.opacity="0.5",e.scanTypeSelector.hasMoreThanOneScanType()&&r.showHideScanTypeSwapLink(!1),r.resetHeaderMessage();var n,u=o.getValue();r.persistedDataManager.setLastUsedCameraId(u),r.html5Qrcode.start(u,(n=r.config,{fps:n.fps,qrbox:n.qrbox,aspectRatio:n.aspectRatio,disableFlip:n.disableFlip,videoConstraints:n.videoConstraints}),r.qrCodeSuccessCallback,r.qrCodeErrorCallback).then((function(t){l.disabled=!1,l.style.display="inline-block",h(!1);var n=r.html5Qrcode.getRunningTrackCameraCapabilities();!0===e.config.showTorchButtonIfSupported&&function(t){t.torchFeature().isSupported()?(c?c.updateTorchCapability(t.torchFeature()):c=lt.create(s,t.torchFeature(),{display:"none",marginLeft:"5px"},(function(t){r.setHeaderMessage(t,U.STATUS_WARNING)})),c.show()):c&&c.hide()}(n),!0===e.config.showZoomSliderIfSupported&&function(t){var r=t.zoomFeature();if(r.isSupported()){i.setOnCameraZoomValueChangeCallback((function(t){r.apply(t)}));var n,o,s,a=1;e.config.defaultZoomValueIfSupported&&(a=e.config.defaultZoomValueIfSupported),n=a,o=r.min(),a=n>(s=r.max())?s:n",e.appendChild(t.cameraScanImage)},this.cameraScanImage.width=64,this.cameraScanImage.style.opacity="0.8",this.cameraScanImage.src=Z,this.cameraScanImage.alt=p.cameraScanAltText()},t.prototype.insertFileScanImageToScanRegion=function(){var t=this,e=document.getElementById(this.getScanRegionId());if(this.fileScanImage)return e.innerHTML="
    ",void e.appendChild(this.fileScanImage);this.fileScanImage=new Image,this.fileScanImage.onload=function(r){e.innerHTML="
    ",e.appendChild(t.fileScanImage)},this.fileScanImage.width=64,this.fileScanImage.style.opacity="0.8",this.fileScanImage.src=Q,this.fileScanImage.alt=p.fileScanAltText()},t.prototype.clearScanRegion=function(){document.getElementById(this.getScanRegionId()).innerHTML=""},t.prototype.getDashboardSectionId=function(){return"".concat(this.elementId,"__dashboard_section")},t.prototype.getDashboardSectionCameraScanRegionId=function(){return"".concat(this.elementId,"__dashboard_section_csr")},t.prototype.getDashboardSectionSwapLinkId=function(){return it.SCAN_TYPE_CHANGE_ANCHOR_ID},t.prototype.getScanRegionId=function(){return"".concat(this.elementId,"__scan_region")},t.prototype.getDashboardId=function(){return"".concat(this.elementId,"__dashboard")},t.prototype.getHeaderMessageContainerId=function(){return"".concat(this.elementId,"__header_message")},t.prototype.getCameraPermissionButtonId=function(){return it.CAMERA_PERMISSION_BUTTON_ID},t.prototype.getCameraScanRegion=function(){return document.getElementById(this.getDashboardSectionCameraScanRegionId())},t.prototype.getDashboardSectionSwapLink=function(){return document.getElementById(this.getDashboardSectionSwapLinkId())},t.prototype.getHeaderMessageDiv=function(){return document.getElementById(this.getHeaderMessageContainerId())},t}()})(),__Html5QrcodeLibrary__=n})();if (window) { if (!Html5QrcodeScanner) { var Html5QrcodeScanner = window.__Html5QrcodeLibrary__.Html5QrcodeScanner; } if (!Html5Qrcode) { var Html5Qrcode = window.__Html5QrcodeLibrary__.Html5Qrcode; } if (!Html5QrcodeSupportedFormats) { var Html5QrcodeSupportedFormats = window.__Html5QrcodeLibrary__.Html5QrcodeSupportedFormats } if (!Html5QrcodeScannerState) { var Html5QrcodeScannerState = window.__Html5QrcodeLibrary__.Html5QrcodeScannerState; } if (!Html5QrcodeScanType) { var Html5QrcodeScanType = window.__Html5QrcodeLibrary__.Html5QrcodeScanType; }} \ No newline at end of file diff --git a/node_modules/html5-qrcode/image-assets.d.ts b/node_modules/html5-qrcode/image-assets.d.ts deleted file mode 100644 index 59387ac..0000000 --- a/node_modules/html5-qrcode/image-assets.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export declare const ASSET_CAMERA_SCAN: string; -export declare const ASSET_FILE_SCAN: string; -export declare const ASSET_INFO_ICON_16PX: string; -export declare const ASSET_CLOSE_ICON_16PX: string; diff --git a/node_modules/html5-qrcode/index.d.ts b/node_modules/html5-qrcode/index.d.ts deleted file mode 100644 index d6b90c6..0000000 --- a/node_modules/html5-qrcode/index.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { Html5Qrcode, Html5QrcodeFullConfig, Html5QrcodeCameraScanConfig } from "./html5-qrcode"; -export { Html5QrcodeScanner } from "./html5-qrcode-scanner"; -export { Html5QrcodeSupportedFormats, Html5QrcodeResult, QrcodeSuccessCallback, QrcodeErrorCallback } from "./core"; -export { Html5QrcodeScannerState } from "./state-manager"; -export { Html5QrcodeScanType } from "./core"; -export { CameraCapabilities, CameraDevice } from "./camera/core"; diff --git a/node_modules/html5-qrcode/native-bar-code-detector.d.ts b/node_modules/html5-qrcode/native-bar-code-detector.d.ts deleted file mode 100644 index 85ef95e..0000000 --- a/node_modules/html5-qrcode/native-bar-code-detector.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { QrcodeResult, Html5QrcodeSupportedFormats, QrcodeDecoderAsync, Logger } from "./core"; -export declare class BarcodeDetectorDelegate implements QrcodeDecoderAsync { - private readonly formatMap; - private readonly reverseFormatMap; - private verbose; - private logger; - private detector; - static isSupported(): boolean; - constructor(requestedFormats: Array, verbose: boolean, logger: Logger); - decodeAsync(canvas: HTMLCanvasElement): Promise; - private selectLargestBarcode; - private createBarcodeDetectorFormats; - private toHtml5QrcodeSupportedFormats; - private createReverseFormatMap; - private createDebugData; -} diff --git a/node_modules/html5-qrcode/package.json b/node_modules/html5-qrcode/package.json deleted file mode 100644 index bc7616a..0000000 --- a/node_modules/html5-qrcode/package.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "name": "html5-qrcode", - "version": "2.3.8", - "description": "A cross platform HTML5 QR Code & bar code scanner", - "main": "./cjs/index.js", - "module": "./esm/index.js", - "typings": "./esm/index.d.ts", - "esnext": "./es2015/index.js", - "unpkg": "./html5-qrcode.min.js", - "scripts": { - "build-windows": "npm run build:es2015 && npm run build:esm && npm run build:esnext && npm run build:cjs && npm run build:umd_windows && npm run build:typing && npm run build:copy_windows", - "test": "npm run-script test:build && npm run-script test:run", - "test_windows": "npm run-script test:build && npm run-script test:run_windows", - "test:build": "tsc --build tsconfig.test.json", - "test:run_windows": ".\\scripts\\test-run.bat", - "test:run": "./scripts/test-run.sh", - "lint-md": "remark .", - "clean": "rm -Rf ./lib/* ./build/* ./meta/bundlesize/* ./meta/coverage/* ./.rpt2_cache ./dist/* ./src/*.d.ts", - "prebuild": "npm run clean", - "postbuild": "cp -R ./third_party ./dist/third_party", - "build": "npm run build:es2015 && npm run build:esm && npm run build:esnext && npm run build:cjs && npm run build:umd && npm run build:typing && npm run build:copy", - "build:es2015": "tsc --build tsconfig.lib-es2015.json", - "build:esm": "tsc --build tsconfig.lib-esm.json", - "build:esnext": "tsc --build tsconfig.lib-esm.json", - "build:cjs": "tsc --build tsconfig.lib-cjs.json", - "build:typing": "tsc --emitDeclarationOnly --outDir ./dist", - "build:umd": "./scripts/build-webpack.sh", - "build:umd_windows": ".\\scripts\\build-webpack.bat", - "build:copy": "cp README.md dist && cp package.json dist && cp LICENSE dist && cp -R src dist/src", - "build:copy_windows": "copy README.md dist && copy package.json dist && copy LICENSE dist", - "internal_release": "npm run build && cp dist/html5-qrcode.min.js minified/html5-qrcode.min.js", - "release": "npm run build && cp dist/html5-qrcode.min.js minified/html5-qrcode.min.js && cd dist && npm publish", - "release_windows": "npm run build && cp dist\\html5-qrcode.min.js minified\\html5-qrcode.min.js && cd dist && npm publish", - "doc_gen": "npx typedoc --excludePrivate src/index.ts" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/mebjas/html5-qrcode.git" - }, - "keywords": [ - "html5", - "qrcode", - "html", - "camera", - "scanner", - "barcode", - "barcode 1d", - "barcode 2d" - ], - "author": "minhazav@gmail.com", - "license": "Apache-2.0", - "bugs": { - "url": "https://github.com/mebjas/html5-qrcode/issues" - }, - "homepage": "https://github.com/mebjas/html5-qrcode#readme", - "devDependencies": { - "@babel/cli": "^7.10.5", - "@babel/core": "^7.11.4", - "@babel/plugin-proposal-class-properties": "^7.10.4", - "@babel/preset-env": "^7.11.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "babel-minify": "^0.5.1", - "chai": "^4.3.4", - "docusaurus-plugin-typedoc": "^0.18.0", - "expose-loader": "^2.0.0", - "jsdom": "20.0.2", - "jsdom-global": "3.0.2", - "mocha": "^9.1.3", - "mocha-lcov-reporter": "^1.3.0", - "promise-polyfill": "^8.1.3", - "remark-cli": "^9.0.0", - "remark-preset-lint-recommended": "^5.0.0", - "rewire": "^5.0.0", - "ts-loader": "^9.1.2", - "ts-node": "^10.4.0", - "tsconfig-paths": "^3.12.0", - "typedoc": "^0.23.28", - "typedoc-plugin-markdown": "^3.14.0", - "typescript": "^4.3.2", - "typings": "^2.1.1", - "webpack": "^5.37.0", - "webpack-cli": "^4.7.0" - }, - "remarkConfig": { - "plugins": [ - "remark-preset-lint-recommended" - ] - }, - "publishConfig": { - "access": "public" - } -} diff --git a/node_modules/html5-qrcode/src/camera/core-impl.d.ts b/node_modules/html5-qrcode/src/camera/core-impl.d.ts deleted file mode 100644 index ffc8a05..0000000 --- a/node_modules/html5-qrcode/src/camera/core-impl.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Camera, CameraRenderingOptions, RenderedCamera, RenderingCallbacks } from "./core"; -export declare class CameraImpl implements Camera { - private readonly mediaStream; - private constructor(); - render(parentElement: HTMLElement, options: CameraRenderingOptions, callbacks: RenderingCallbacks): Promise; - static create(videoConstraints: MediaTrackConstraints): Promise; -} diff --git a/node_modules/html5-qrcode/src/camera/core-impl.ts b/node_modules/html5-qrcode/src/camera/core-impl.ts deleted file mode 100644 index ad29ec4..0000000 --- a/node_modules/html5-qrcode/src/camera/core-impl.ts +++ /dev/null @@ -1,340 +0,0 @@ -/** - * @fileoverview - * Core camera library implementations. - * - * @author mebjas - */ - -import { - Camera, - CameraCapabilities, - CameraCapability, - RangeCameraCapability, - CameraRenderingOptions, - RenderedCamera, - RenderingCallbacks, - BooleanCameraCapability -} from "./core"; - -/** Interface for a range value. */ -interface RangeValue { - min: number; - max: number; - step: number; -} - -/** Abstract camera capability class. */ -abstract class AbstractCameraCapability implements CameraCapability { - protected readonly name: string; - protected readonly track: MediaStreamTrack; - - constructor(name: string, track: MediaStreamTrack) { - this.name = name; - this.track = track; - } - - public isSupported(): boolean { - // TODO(minhazav): Figure out fallback for getCapabilities() - // in firefox. - // https://developer.mozilla.org/en-US/docs/Web/API/Media_Capture_and_Streams_API/Constraints - if (!this.track.getCapabilities) { - return false; - } - return this.name in this.track.getCapabilities(); - } - - public apply(value: T): Promise { - let constraint: any = {}; - constraint[this.name] = value; - let constraints = { advanced: [ constraint ] }; - return this.track.applyConstraints(constraints); - } - - public value(): T | null { - let settings: any = this.track.getSettings(); - if (this.name in settings) { - let settingValue = settings[this.name]; - return settingValue; - } - - return null; - } -} - -abstract class AbstractRangeCameraCapability extends AbstractCameraCapability { - constructor(name: string, track: MediaStreamTrack) { - super(name, track); - } - - public min(): number { - return this.getCapabilities().min; - } - - public max(): number { - return this.getCapabilities().max; - } - - public step(): number { - return this.getCapabilities().step; - } - - public apply(value: number): Promise { - let constraint: any = {}; - constraint[this.name] = value; - let constraints = {advanced: [ constraint ]}; - return this.track.applyConstraints(constraints); - } - - private getCapabilities(): RangeValue { - this.failIfNotSupported(); - let capabilities: any = this.track.getCapabilities(); - let capability: any = capabilities[this.name]; - return { - min: capability.min, - max: capability.max, - step: capability.step, - }; - } - - private failIfNotSupported() { - if (!this.isSupported()) { - throw new Error(`${this.name} capability not supported`); - } - } -} - -/** Zoom feature. */ -class ZoomFeatureImpl extends AbstractRangeCameraCapability { - constructor(track: MediaStreamTrack) { - super("zoom", track); - } -} - -/** Torch feature. */ -class TorchFeatureImpl extends AbstractCameraCapability { - constructor(track: MediaStreamTrack) { - super("torch", track); - } -} - -/** Implementation of {@link CameraCapabilities}. */ -class CameraCapabilitiesImpl implements CameraCapabilities { - private readonly track: MediaStreamTrack; - - constructor(track: MediaStreamTrack) { - this.track = track; - } - - zoomFeature(): RangeCameraCapability { - return new ZoomFeatureImpl(this.track); - } - - torchFeature(): BooleanCameraCapability { - return new TorchFeatureImpl(this.track); - } -} - -/** Implementation of {@link RenderedCamera}. */ -class RenderedCameraImpl implements RenderedCamera { - - private readonly parentElement: HTMLElement; - private readonly mediaStream: MediaStream; - private readonly surface: HTMLVideoElement; - private readonly callbacks: RenderingCallbacks; - - private isClosed: boolean = false; - - private constructor( - parentElement: HTMLElement, - mediaStream: MediaStream, - callbacks: RenderingCallbacks) { - this.parentElement = parentElement; - this.mediaStream = mediaStream; - this.callbacks = callbacks; - - this.surface = this.createVideoElement(this.parentElement.clientWidth); - - // Setup - parentElement.append(this.surface); - } - - private createVideoElement(width: number): HTMLVideoElement { - const videoElement = document.createElement("video"); - videoElement.style.width = `${width}px`; - videoElement.style.display = "block"; - videoElement.muted = true; - videoElement.setAttribute("muted", "true"); - (videoElement).playsInline = true; - return videoElement; - } - - private setupSurface() { - this.surface.onabort = () => { - throw "RenderedCameraImpl video surface onabort() called"; - }; - - this.surface.onerror = () => { - throw "RenderedCameraImpl video surface onerror() called"; - }; - - let onVideoStart = () => { - const videoWidth = this.surface.clientWidth; - const videoHeight = this.surface.clientHeight; - this.callbacks.onRenderSurfaceReady(videoWidth, videoHeight); - this.surface.removeEventListener("playing", onVideoStart); - }; - - this.surface.addEventListener("playing", onVideoStart); - this.surface.srcObject = this.mediaStream; - this.surface.play(); - } - - static async create( - parentElement: HTMLElement, - mediaStream: MediaStream, - options: CameraRenderingOptions, - callbacks: RenderingCallbacks) - : Promise { - let renderedCamera = new RenderedCameraImpl( - parentElement, mediaStream, callbacks); - if (options.aspectRatio) { - let aspectRatioConstraint = { - aspectRatio: options.aspectRatio! - }; - await renderedCamera.getFirstTrackOrFail().applyConstraints( - aspectRatioConstraint); - } - - renderedCamera.setupSurface(); - return renderedCamera; - } - - private failIfClosed() { - if (this.isClosed) { - throw "The RenderedCamera has already been closed."; - } - } - - private getFirstTrackOrFail(): MediaStreamTrack { - this.failIfClosed(); - - if (this.mediaStream.getVideoTracks().length === 0) { - throw "No video tracks found"; - } - - return this.mediaStream.getVideoTracks()[0]; - } - - //#region Public APIs. - public pause(): void { - this.failIfClosed(); - this.surface.pause(); - } - - public resume(onResumeCallback: () => void): void { - this.failIfClosed(); - let $this = this; - - const onVideoResume = () => { - // Transition after 200ms to avoid the previous canvas frame being - // re-scanned. - setTimeout(onResumeCallback, 200); - $this.surface.removeEventListener("playing", onVideoResume); - }; - - this.surface.addEventListener("playing", onVideoResume); - this.surface.play(); - } - - public isPaused(): boolean { - this.failIfClosed(); - return this.surface.paused; - } - - public getSurface(): HTMLVideoElement { - this.failIfClosed(); - return this.surface; - } - - public getRunningTrackCapabilities(): MediaTrackCapabilities { - return this.getFirstTrackOrFail().getCapabilities(); - } - - public getRunningTrackSettings(): MediaTrackSettings { - return this.getFirstTrackOrFail().getSettings(); - } - - public async applyVideoConstraints(constraints: MediaTrackConstraints) - : Promise { - if ("aspectRatio" in constraints) { - throw "Changing 'aspectRatio' in run-time is not yet supported."; - } - - return this.getFirstTrackOrFail().applyConstraints(constraints); - } - - public close(): Promise { - if (this.isClosed) { - // Already closed. - return Promise.resolve(); - } - - let $this = this; - return new Promise((resolve, _) => { - let tracks = $this.mediaStream.getVideoTracks(); - const tracksToClose = tracks.length; - var tracksClosed = 0; - $this.mediaStream.getVideoTracks().forEach((videoTrack) => { - $this.mediaStream.removeTrack(videoTrack); - videoTrack.stop(); - ++tracksClosed; - - if (tracksClosed >= tracksToClose) { - $this.isClosed = true; - $this.parentElement.removeChild($this.surface); - resolve(); - } - }); - - - }); - } - - getCapabilities(): CameraCapabilities { - return new CameraCapabilitiesImpl(this.getFirstTrackOrFail()); - } - //#endregion -} - -/** Default implementation of {@link Camera} interface. */ -export class CameraImpl implements Camera { - private readonly mediaStream: MediaStream; - - private constructor(mediaStream: MediaStream) { - this.mediaStream = mediaStream; - } - - async render( - parentElement: HTMLElement, - options: CameraRenderingOptions, - callbacks: RenderingCallbacks) - : Promise { - return RenderedCameraImpl.create( - parentElement, this.mediaStream, options, callbacks); - } - - static async create(videoConstraints: MediaTrackConstraints) - : Promise { - if (!navigator.mediaDevices) { - throw "navigator.mediaDevices not supported"; - } - let constraints: MediaStreamConstraints = { - audio: false, - video: videoConstraints - }; - - let mediaStream = await navigator.mediaDevices.getUserMedia( - constraints); - return new CameraImpl(mediaStream); - } -} diff --git a/node_modules/html5-qrcode/src/camera/core.d.ts b/node_modules/html5-qrcode/src/camera/core.d.ts deleted file mode 100644 index 52e27b5..0000000 --- a/node_modules/html5-qrcode/src/camera/core.d.ts +++ /dev/null @@ -1,41 +0,0 @@ -export interface CameraDevice { - id: string; - label: string; -} -export interface CameraCapability { - isSupported(): boolean; - apply(value: T): Promise; - value(): T | null; -} -export interface RangeCameraCapability extends CameraCapability { - min(): number; - max(): number; - step(): number; -} -export interface BooleanCameraCapability extends CameraCapability { -} -export interface CameraCapabilities { - zoomFeature(): RangeCameraCapability; - torchFeature(): BooleanCameraCapability; -} -export type OnRenderSurfaceReady = (viewfinderWidth: number, viewfinderHeight: number) => void; -export interface RenderingCallbacks { - onRenderSurfaceReady: OnRenderSurfaceReady; -} -export interface RenderedCamera { - getSurface(): HTMLVideoElement; - pause(): void; - resume(onResumeCallback: () => void): void; - isPaused(): boolean; - close(): Promise; - getRunningTrackCapabilities(): MediaTrackCapabilities; - getRunningTrackSettings(): MediaTrackSettings; - applyVideoConstraints(constraints: MediaTrackConstraints): Promise; - getCapabilities(): CameraCapabilities; -} -export interface CameraRenderingOptions { - aspectRatio?: number; -} -export interface Camera { - render(parentElement: HTMLElement, options: CameraRenderingOptions, callbacks: RenderingCallbacks): Promise; -} diff --git a/node_modules/html5-qrcode/src/camera/core.ts b/node_modules/html5-qrcode/src/camera/core.ts deleted file mode 100644 index f3137cf..0000000 --- a/node_modules/html5-qrcode/src/camera/core.ts +++ /dev/null @@ -1,180 +0,0 @@ -/** - * @module - * Core Camera interfaces. - * - * @author mebjas - */ - -/** Camera device interface. */ -export interface CameraDevice { - id: string; - label: string; -} - -//#region Features -/** Generic capability of camera. */ -export interface CameraCapability { - /** Returns {@code true} if the capability is supported by the camera. */ - isSupported(): boolean; - - /** Apply the {@code value} to camera for this capability. */ - apply(value: T): Promise; - - /** Returns current value of this capability. */ - value(): T | null; -} - -/** Capability of the camera that has range. */ -export interface RangeCameraCapability extends CameraCapability { - /** Min value allowed for this capability. */ - min(): number; - - /** Max value allowed for this capability. */ - max(): number; - - /** Steps allowed for this capability. */ - step(): number; -} - -/** Capability of camera that is boolean in nature. */ -export interface BooleanCameraCapability extends CameraCapability {} - -/** Class exposing different capabilities of camera. */ -export interface CameraCapabilities { - - /** Zoom capability of the camera. */ - zoomFeature(): RangeCameraCapability; - - /** Torch capability of the camera. */ - torchFeature(): BooleanCameraCapability; -} - -//#endregion - -/** Type for callback called when camera surface is ready. */ -export type OnRenderSurfaceReady - = (viewfinderWidth: number, viewfinderHeight: number) => void; - -/** Callbacks around camera rendering. */ -export interface RenderingCallbacks { - onRenderSurfaceReady: OnRenderSurfaceReady; -} - -/** - * Interface for a rendered camera that is actively showing feed on a surface. - */ -export interface RenderedCamera { - /** - * Returns the video surface. - * - * @throws error if method is called when scanner is not in scanning state. - */ - getSurface(): HTMLVideoElement; - - /** - * Pauses the camera feed. - * - * @throws error if method is called when scanner is not in scanning state. - */ - pause(): void; - - /** - * Resumes the camera feed, if it's in paused state. - * - * @param onResumeCallback callback that is called when camera resumes. - * - * @throws error if {@link RenderedCamera} instance is already closed. - */ - resume(onResumeCallback: () => void): void; - - /** - * Returns {@code true} if the instance is paused. - * - * @throws error if {@link RenderedCamera} instance is already closed. - */ - isPaused(): boolean; - - /** - * Closes the instance. - * - *

    The instance cannot be used after closing. - */ - close(): Promise; - - // --------------------------------------------------------------------------- - // Direct Camera Access APIs. - // - // The APIs below are in flavour similar to what Javascript exposes. - // --------------------------------------------------------------------------- - - /** - * Returns the capabilities of the running camera stream. - * - * Read more: https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack/getConstraints - * - * @returns the capabilities of a running video track. - * @throws error if {@link RenderedCamera} instance is already closed. - */ - getRunningTrackCapabilities(): MediaTrackCapabilities; - - /** - * Returns the object containing the current values of each constrainable - * property of the running video track. - * - * Read more: https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack/getSettings - * - * @returns the supported settings of the running video track. - * @throws error if {@link RenderedCamera} instance is already closed. - */ - getRunningTrackSettings(): MediaTrackSettings; - - /** - * Apply a video constraints on running video track from camera. - * - * Important: Changing aspectRatio while scanner is running is not supported - * with this API. - * - * @param {MediaTrackConstraints} specifies a variety of video or camera - * controls as defined in - * https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints - * @returns a Promise which succeeds if the passed constraints are applied, - * fails otherwise. - * @throws error if {@link RenderedCamera} instance is already closed. - */ - applyVideoConstraints(constraints: MediaTrackConstraints): Promise; - - /** - * Returns all capabilities of the camera. - */ - getCapabilities(): CameraCapabilities; -} - -/** Options for rendering camera feed. */ -export interface CameraRenderingOptions { - /** - * Aspect ratio to setup the surface with. - * - *

    Setting this value doesn't guarantee the exact value to be applied. - */ - aspectRatio?: number; -} - -/** Interface for the camera. */ -export interface Camera { - - /** - * Renders camera to {@link HTMLVideoElement} as a child of - * {@code parentElement}. - * - * @params parentElement Parent HtmlElement to render camera feed into - * @params options rendering options - * @params callbacks callbacks associated with rendering - * - * @returns the {@link RenderedCamera} instance. - */ - render( - parentElement: HTMLElement, - options: CameraRenderingOptions, - callbacks: RenderingCallbacks) - : Promise; -} diff --git a/node_modules/html5-qrcode/src/camera/factories.d.ts b/node_modules/html5-qrcode/src/camera/factories.d.ts deleted file mode 100644 index df98f8f..0000000 --- a/node_modules/html5-qrcode/src/camera/factories.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Camera } from "./core"; -export declare class CameraFactory { - static failIfNotSupported(): Promise; - private constructor(); - create(videoConstraints: MediaTrackConstraints): Promise; -} diff --git a/node_modules/html5-qrcode/src/camera/factories.ts b/node_modules/html5-qrcode/src/camera/factories.ts deleted file mode 100644 index 48dda46..0000000 --- a/node_modules/html5-qrcode/src/camera/factories.ts +++ /dev/null @@ -1,33 +0,0 @@ -/** - * @fileoverview - * Set of factory implementations around Camera. - * - * @author mebjas - */ - -import { Camera } from "./core"; -import { CameraImpl } from "./core-impl"; - -/** Factory class for creating Camera. */ -export class CameraFactory { - - /** - * Returns {@link CameraFactory} if {@link navigator.mediaDevices} is - * supported else fails. - */ - public static async failIfNotSupported(): Promise { - if (!navigator.mediaDevices) { - throw "navigator.mediaDevices not supported"; - } - - return new CameraFactory(); - } - - private constructor() { /* No Op. */ } - - /** Creates camera instance based on constraints. */ - public async create(videoConstraints: MediaTrackConstraints) - : Promise { - return CameraImpl.create(videoConstraints); - } -} diff --git a/node_modules/html5-qrcode/src/camera/permissions.d.ts b/node_modules/html5-qrcode/src/camera/permissions.d.ts deleted file mode 100644 index 4209c55..0000000 --- a/node_modules/html5-qrcode/src/camera/permissions.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export declare class CameraPermissions { - static hasPermissions(): Promise; -} diff --git a/node_modules/html5-qrcode/src/camera/permissions.ts b/node_modules/html5-qrcode/src/camera/permissions.ts deleted file mode 100644 index 2f032ba..0000000 --- a/node_modules/html5-qrcode/src/camera/permissions.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** - * @fileoverview - * Libraries associated with Camera Permissions. - * - * @author mebjas - */ - -/** - * Permission management around Camera in javascript. - * - * TODO(mebjas): Migrate camera specific code / logic to this class / library. - */ - export class CameraPermissions { - - /** - * Returns {@code true} if the web page already has access to user camera - * permissions. - */ - public static async hasPermissions(): Promise { - // TODO(mebjas): Use Permissions Query API, once support is widespread. - // https://developer.mozilla.org/en-US/docs/Web/API/Permissions/query - - let devices = await navigator.mediaDevices.enumerateDevices(); - for (const device of devices) { - // Hacky way to check if camera permissions are granted. Device - // labels are only set in case user has granted permissions. - if(device.kind === "videoinput" && device.label) { - return true; - } - } - - return false; - } -} diff --git a/node_modules/html5-qrcode/src/camera/retriever.d.ts b/node_modules/html5-qrcode/src/camera/retriever.d.ts deleted file mode 100644 index 0baac12..0000000 --- a/node_modules/html5-qrcode/src/camera/retriever.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { CameraDevice } from "./core"; -export declare class CameraRetriever { - static retrieve(): Promise>; - private static rejectWithError; - private static isHttpsOrLocalhost; - private static getCamerasFromMediaDevices; - private static getCamerasFromMediaStreamTrack; -} diff --git a/node_modules/html5-qrcode/src/camera/retriever.ts b/node_modules/html5-qrcode/src/camera/retriever.ts deleted file mode 100644 index 227cae8..0000000 --- a/node_modules/html5-qrcode/src/camera/retriever.ts +++ /dev/null @@ -1,93 +0,0 @@ -/** - * @fileoverview - * Libraries associated with retrieving cameras. - * - * @author mebjas - */ - -import { CameraDevice } from "./core"; -import { Html5QrcodeStrings } from "../strings"; - -/** Class for retrieving cameras on the device. */ -export class CameraRetriever { - - /** Returns list of {@link CameraDevice} supported by the device. */ - public static retrieve(): Promise> { - if (navigator.mediaDevices) { - return CameraRetriever.getCamerasFromMediaDevices(); - } - - // Using deprecated api to support really old browsers. - var mst = MediaStreamTrack; - if (MediaStreamTrack && mst.getSources) { - return CameraRetriever.getCamerasFromMediaStreamTrack(); - } - - return CameraRetriever.rejectWithError(); - } - - private static rejectWithError(): Promise> { - // This can potentially happen if the page is loaded without SSL. - let errorMessage = Html5QrcodeStrings.unableToQuerySupportedDevices(); - if (!CameraRetriever.isHttpsOrLocalhost()) { - errorMessage = Html5QrcodeStrings.insecureContextCameraQueryError(); - } - return Promise.reject(errorMessage); - } - - private static isHttpsOrLocalhost(): boolean { - if (location.protocol === "https:") { - return true; - } - const host = location.host.split(":")[0]; - return host === "127.0.0.1" || host === "localhost"; - } - - private static async getCamerasFromMediaDevices(): Promise> { - // Hacky approach to close any active stream if they are active. - const closeActiveStreams = (stream: MediaStream) => { - const tracks = stream.getVideoTracks(); - for (const track of tracks) { - track.enabled = false; - track.stop(); - stream.removeTrack(track); - } - }; - // This should trigger the permission flow if required. - let mediaStream = await navigator.mediaDevices.getUserMedia( - { audio: false, video: true }); - let devices = await navigator.mediaDevices.enumerateDevices(); - let results: Array = []; - for (const device of devices) { - if (device.kind === "videoinput") { - results.push({ - id: device.deviceId, - label: device.label - }); - } - } - closeActiveStreams(mediaStream); - return results; - } - - private static getCamerasFromMediaStreamTrack() - : Promise> { - return new Promise((resolve, _) => { - const callback = (sourceInfos: Array) => { - const results: Array = []; - for (const sourceInfo of sourceInfos) { - if (sourceInfo.kind === "video") { - results.push({ - id: sourceInfo.id, - label: sourceInfo.label - }); - } - } - resolve(results); - } - - var mst = MediaStreamTrack; - mst.getSources(callback); - }); - } -} diff --git a/node_modules/html5-qrcode/src/code-decoder.d.ts b/node_modules/html5-qrcode/src/code-decoder.d.ts deleted file mode 100644 index 13d5426..0000000 --- a/node_modules/html5-qrcode/src/code-decoder.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { QrcodeResult, Html5QrcodeSupportedFormats, Logger, RobustQrcodeDecoderAsync } from "./core"; -export declare class Html5QrcodeShim implements RobustQrcodeDecoderAsync { - private verbose; - private primaryDecoder; - private secondaryDecoder; - private readonly EXECUTIONS_TO_REPORT_PERFORMANCE; - private executions; - private executionResults; - private wasPrimaryDecoderUsedInLastDecode; - constructor(requestedFormats: Array, useBarCodeDetectorIfSupported: boolean, verbose: boolean, logger: Logger); - decodeAsync(canvas: HTMLCanvasElement): Promise; - decodeRobustlyAsync(canvas: HTMLCanvasElement): Promise; - private getDecoder; - private possiblyLogPerformance; - possiblyFlushPerformanceReport(): void; -} diff --git a/node_modules/html5-qrcode/src/code-decoder.ts b/node_modules/html5-qrcode/src/code-decoder.ts deleted file mode 100644 index f2a034b..0000000 --- a/node_modules/html5-qrcode/src/code-decoder.ts +++ /dev/null @@ -1,127 +0,0 @@ -/** - * @fileoverview - * Shim layer for providing the decoding library. - * - * @author mebjas - * - * The word "QR Code" is registered trademark of DENSO WAVE INCORPORATED - * http://www.denso-wave.com/qrcode/faqpatent-e.html - */ - -import { - QrcodeResult, - Html5QrcodeSupportedFormats, - Logger, - QrcodeDecoderAsync, - RobustQrcodeDecoderAsync, -} from "./core"; - -import { ZXingHtml5QrcodeDecoder } from "./zxing-html5-qrcode-decoder"; -import { BarcodeDetectorDelegate } from "./native-bar-code-detector"; - -/** - * Shim layer for {@interface QrcodeDecoder}. - * - * Currently uses {@class ZXingHtml5QrcodeDecoder}, can be replace with another library. - */ -export class Html5QrcodeShim implements RobustQrcodeDecoderAsync { - - private verbose: boolean; - private primaryDecoder: QrcodeDecoderAsync; - private secondaryDecoder: QrcodeDecoderAsync | undefined; - - private readonly EXECUTIONS_TO_REPORT_PERFORMANCE = 100; - private executions: number = 0; - private executionResults: Array = []; - private wasPrimaryDecoderUsedInLastDecode = false; - - public constructor( - requestedFormats: Array, - useBarCodeDetectorIfSupported: boolean, - verbose: boolean, - logger: Logger) { - this.verbose = verbose; - - // Use BarcodeDetector library if enabled by config and is supported. - if (useBarCodeDetectorIfSupported - && BarcodeDetectorDelegate.isSupported()) { - this.primaryDecoder = new BarcodeDetectorDelegate( - requestedFormats, verbose, logger); - // If 'BarcodeDetector' is supported, the library will alternate - // between 'BarcodeDetector' and 'zxing-js' to compensate for - // quality gaps between the two. - this.secondaryDecoder = new ZXingHtml5QrcodeDecoder( - requestedFormats, verbose, logger); - } else { - this.primaryDecoder = new ZXingHtml5QrcodeDecoder( - requestedFormats, verbose, logger); - } - } - - async decodeAsync(canvas: HTMLCanvasElement): Promise { - let startTime = performance.now(); - try { - return await this.getDecoder().decodeAsync(canvas); - } finally { - this.possiblyLogPerformance(startTime); - } - } - - async decodeRobustlyAsync(canvas: HTMLCanvasElement) - : Promise { - let startTime = performance.now(); - try { - return await this.primaryDecoder.decodeAsync(canvas); - } catch(error) { - if (this.secondaryDecoder) { - // Try fallback. - return this.secondaryDecoder.decodeAsync(canvas); - } - throw error; - } finally { - this.possiblyLogPerformance(startTime); - } - } - - private getDecoder(): QrcodeDecoderAsync { - if (!this.secondaryDecoder) { - return this.primaryDecoder; - } - - if (this.wasPrimaryDecoderUsedInLastDecode === false) { - this.wasPrimaryDecoderUsedInLastDecode = true; - return this.primaryDecoder; - } - this.wasPrimaryDecoderUsedInLastDecode = false; - return this.secondaryDecoder; - } - - private possiblyLogPerformance(startTime: number) { - if (!this.verbose) { - return; - } - let executionTime = performance.now() - startTime; - this.executionResults.push(executionTime); - this.executions++; - this.possiblyFlushPerformanceReport(); - } - - // Dumps mean decoding latency to console for last - // EXECUTIONS_TO_REPORT_PERFORMANCE runs. - // TODO(mebjas): Can we automate instrumentation runs? - possiblyFlushPerformanceReport() { - if (this.executions < this.EXECUTIONS_TO_REPORT_PERFORMANCE) { - return; - } - - let sum:number = 0; - for (let executionTime of this.executionResults) { - sum += executionTime; - } - let mean = sum / this.executionResults.length; - // eslint-disable-next-line no-console - console.log(`${mean} ms for ${this.executionResults.length} last runs.`); - this.executions = 0; - this.executionResults = []; - } -} diff --git a/node_modules/html5-qrcode/src/core.d.ts b/node_modules/html5-qrcode/src/core.d.ts deleted file mode 100644 index 0d0206d..0000000 --- a/node_modules/html5-qrcode/src/core.d.ts +++ /dev/null @@ -1,105 +0,0 @@ -export declare enum Html5QrcodeSupportedFormats { - QR_CODE = 0, - AZTEC = 1, - CODABAR = 2, - CODE_39 = 3, - CODE_93 = 4, - CODE_128 = 5, - DATA_MATRIX = 6, - MAXICODE = 7, - ITF = 8, - EAN_13 = 9, - EAN_8 = 10, - PDF_417 = 11, - RSS_14 = 12, - RSS_EXPANDED = 13, - UPC_A = 14, - UPC_E = 15, - UPC_EAN_EXTENSION = 16 -} -export declare enum DecodedTextType { - UNKNOWN = 0, - URL = 1 -} -export declare function isValidHtml5QrcodeSupportedFormats(format: any): boolean; -export declare enum Html5QrcodeScanType { - SCAN_TYPE_CAMERA = 0, - SCAN_TYPE_FILE = 1 -} -export declare class Html5QrcodeConstants { - static GITHUB_PROJECT_URL: string; - static SCAN_DEFAULT_FPS: number; - static DEFAULT_DISABLE_FLIP: boolean; - static DEFAULT_REMEMBER_LAST_CAMERA_USED: boolean; - static DEFAULT_SUPPORTED_SCAN_TYPE: Html5QrcodeScanType[]; -} -export interface QrDimensions { - width: number; - height: number; -} -export type QrDimensionFunction = (viewfinderWidth: number, viewfinderHeight: number) => QrDimensions; -export interface QrBounds extends QrDimensions { - x: number; - y: number; -} -export declare class QrcodeResultFormat { - readonly format: Html5QrcodeSupportedFormats; - readonly formatName: string; - private constructor(); - toString(): string; - static create(format: Html5QrcodeSupportedFormats): QrcodeResultFormat; -} -export interface QrcodeResultDebugData { - decoderName?: string; -} -export interface QrcodeResult { - text: string; - format?: QrcodeResultFormat; - bounds?: QrBounds; - decodedTextType?: DecodedTextType; - debugData?: QrcodeResultDebugData; -} -export interface Html5QrcodeResult { - decodedText: string; - result: QrcodeResult; -} -export declare class Html5QrcodeResultFactory { - static createFromText(decodedText: string): Html5QrcodeResult; - static createFromQrcodeResult(qrcodeResult: QrcodeResult): Html5QrcodeResult; -} -export declare enum Html5QrcodeErrorTypes { - UNKWOWN_ERROR = 0, - IMPLEMENTATION_ERROR = 1, - NO_CODE_FOUND_ERROR = 2 -} -export interface Html5QrcodeError { - errorMessage: string; - type: Html5QrcodeErrorTypes; -} -export declare class Html5QrcodeErrorFactory { - static createFrom(error: any): Html5QrcodeError; -} -export type QrcodeSuccessCallback = (decodedText: string, result: Html5QrcodeResult) => void; -export type QrcodeErrorCallback = (errorMessage: string, error: Html5QrcodeError) => void; -export interface QrcodeDecoderAsync { - decodeAsync(canvas: HTMLCanvasElement): Promise; -} -export interface RobustQrcodeDecoderAsync extends QrcodeDecoderAsync { - decodeRobustlyAsync(canvas: HTMLCanvasElement): Promise; -} -export interface Logger { - log(message: string): void; - warn(message: string): void; - logError(message: string, isExperimental?: boolean): void; - logErrors(errors: Array): void; -} -export declare class BaseLoggger implements Logger { - private verbose; - constructor(verbose: boolean); - log(message: string): void; - warn(message: string): void; - logError(message: string, isExperimental?: boolean): void; - logErrors(errors: Array): void; -} -export declare function isNullOrUndefined(obj?: any): boolean; -export declare function clip(value: number, minValue: number, maxValue: number): number; diff --git a/node_modules/html5-qrcode/src/core.ts b/node_modules/html5-qrcode/src/core.ts deleted file mode 100644 index 8d3d965..0000000 --- a/node_modules/html5-qrcode/src/core.ts +++ /dev/null @@ -1,353 +0,0 @@ -/** - * @fileoverview - * Core libraries, interfaces, enums shared across {@class Html5Qrcode} & {@class Html5QrcodeScanner} - * - * @author mebjas - * - * The word "QR Code" is registered trademark of DENSO WAVE INCORPORATED - * http://www.denso-wave.com/qrcode/faqpatent-e.html - */ - -/** - * Code formats supported by this library. - */ -export enum Html5QrcodeSupportedFormats { - QR_CODE = 0, - AZTEC, - CODABAR, - CODE_39, - CODE_93, - CODE_128, - DATA_MATRIX, - MAXICODE, - ITF, - EAN_13, - EAN_8, - PDF_417, - RSS_14, - RSS_EXPANDED, - UPC_A, - UPC_E, - UPC_EAN_EXTENSION, -} - -/** {@code Html5QrcodeSupportedFormats} to friendly name map. */ -const html5QrcodeSupportedFormatsTextMap - : Map = new Map( - [ - [ Html5QrcodeSupportedFormats.QR_CODE, "QR_CODE" ], - [ Html5QrcodeSupportedFormats.AZTEC, "AZTEC" ], - [ Html5QrcodeSupportedFormats.CODABAR, "CODABAR" ], - [ Html5QrcodeSupportedFormats.CODE_39, "CODE_39" ], - [ Html5QrcodeSupportedFormats.CODE_93, "CODE_93" ], - [ Html5QrcodeSupportedFormats.CODE_128, "CODE_128" ], - [ Html5QrcodeSupportedFormats.DATA_MATRIX, "DATA_MATRIX" ], - [ Html5QrcodeSupportedFormats.MAXICODE, "MAXICODE" ], - [ Html5QrcodeSupportedFormats.ITF, "ITF" ], - [ Html5QrcodeSupportedFormats.EAN_13, "EAN_13" ], - [ Html5QrcodeSupportedFormats.EAN_8, "EAN_8" ], - [ Html5QrcodeSupportedFormats.PDF_417, "PDF_417" ], - [ Html5QrcodeSupportedFormats.RSS_14, "RSS_14" ], - [ Html5QrcodeSupportedFormats.RSS_EXPANDED, "RSS_EXPANDED" ], - [ Html5QrcodeSupportedFormats.UPC_A, "UPC_A" ], - [ Html5QrcodeSupportedFormats.UPC_E, "UPC_E" ], - [ Html5QrcodeSupportedFormats.UPC_EAN_EXTENSION, "UPC_EAN_EXTENSION" ] - ] -); - -/** - * Indicates the type of decoded text. - * - * Note: this is very experimental in nature at the moment. - */ -export enum DecodedTextType { - UNKNOWN = 0, - URL, -} - -/** Returns true if the passed object instance is a valid format. */ -export function isValidHtml5QrcodeSupportedFormats(format: any): boolean { - return Object.values(Html5QrcodeSupportedFormats).includes(format); -} - -/** - * Types of scans supported by the library - */ -export enum Html5QrcodeScanType { - SCAN_TYPE_CAMERA = 0, // Camera based scanner. - SCAN_TYPE_FILE = 1 // File based scanner. -} - -/** - * Constants used in QR code library. - */ -export class Html5QrcodeConstants { - static GITHUB_PROJECT_URL: string - = "https://github.com/mebjas/html5-qrcode"; - static SCAN_DEFAULT_FPS = 2; - static DEFAULT_DISABLE_FLIP = false; - static DEFAULT_REMEMBER_LAST_CAMERA_USED = true; - static DEFAULT_SUPPORTED_SCAN_TYPE = [ - Html5QrcodeScanType.SCAN_TYPE_CAMERA, - Html5QrcodeScanType.SCAN_TYPE_FILE]; -} - -/** Defines dimension for QR Code Scanner. */ -export interface QrDimensions { - width: number; - height: number; -} - -/** - * A function that takes in the width and height of the video stream - * and returns QrDimensions. - * - * Viewfinder refers to the video showing camera stream. - */ -export type QrDimensionFunction = - (viewfinderWidth: number, viewfinderHeight: number) => QrDimensions; - -/** - * Defines bounds of detected QR code w.r.t the scan region. - */ -export interface QrBounds extends QrDimensions { - x: number; - y: number; -} - -/** Format of detected code. */ -export class QrcodeResultFormat { - public readonly format: Html5QrcodeSupportedFormats; - public readonly formatName: string; - - private constructor( - format: Html5QrcodeSupportedFormats, - formatName: string) { - this.format = format; - this.formatName = formatName; - } - - public toString(): string { - return this.formatName; - } - - public static create(format: Html5QrcodeSupportedFormats) { - if (!html5QrcodeSupportedFormatsTextMap.has(format)) { - throw `${format} not in html5QrcodeSupportedFormatsTextMap`; - } - return new QrcodeResultFormat( - format, html5QrcodeSupportedFormatsTextMap.get(format)!); - } -} - -/** Data class for QR code result used for debugging. */ -export interface QrcodeResultDebugData { - - /** Name of the decoder that was used for decoding. */ - decoderName?: string; -} - -/** - * Detailed scan result. - */ -export interface QrcodeResult { - /** Decoded text. */ - text: string; - - /** Format that was successfully scanned. */ - format?: QrcodeResultFormat, - - /** - * The bounds of the decoded QR code or bar code in the whole stream of - * image. - * - * Note: this is experimental, and not fully supported. - */ - bounds?: QrBounds; - - /** - * If the decoded text from the QR code or bar code is of a known type like - * url or upi id or email id. - * - * Note: this is experimental, and not fully supported. - */ - decodedTextType?: DecodedTextType; - - /** Data class for QR code result used for debugging. */ - debugData?: QrcodeResultDebugData; -} - -/** - * QrCode result object. - */ -export interface Html5QrcodeResult { - decodedText: string; - result: QrcodeResult; -} - -/** - * Static factory for creating {@interface Html5QrcodeResult} instance. - */ -export class Html5QrcodeResultFactory { - static createFromText(decodedText: string): Html5QrcodeResult { - let qrcodeResult = { - text: decodedText - }; - - return { - decodedText: decodedText, - result: qrcodeResult - }; - } - - static createFromQrcodeResult(qrcodeResult: QrcodeResult) - : Html5QrcodeResult { - return { - decodedText: qrcodeResult.text, - result: qrcodeResult - }; - } -} - -/** - * Different kind of errors that can lead to scanning error. - */ -export enum Html5QrcodeErrorTypes { - UNKWOWN_ERROR = 0, - IMPLEMENTATION_ERROR = 1, - NO_CODE_FOUND_ERROR = 2 -} - -/** - * Interface for scan error response. - */ -export interface Html5QrcodeError { - errorMessage: string; - type: Html5QrcodeErrorTypes; -} - -/** - * Static factory for creating {@interface Html5QrcodeError} instance. - */ -export class Html5QrcodeErrorFactory { - static createFrom(error: any): Html5QrcodeError { - return { - errorMessage: error, - type: Html5QrcodeErrorTypes.UNKWOWN_ERROR - }; - } -} - -/** - * Type for a callback for a successful code scan. - */ -export type QrcodeSuccessCallback - = (decodedText: string, result: Html5QrcodeResult) => void; - -/** - * Type for a callback for failure during code scan. - */ -export type QrcodeErrorCallback - = (errorMessage: string, error: Html5QrcodeError) => void; - -/** Code decoder interface. */ -export interface QrcodeDecoderAsync { - /** - * Decodes content of the canvas to find a valid QR code or bar code. - * - * @param canvas a valid html5 canvas element. - */ - decodeAsync(canvas: HTMLCanvasElement): Promise; -} - -/** - * Code robust decoder interface. - * - *

    A robust decoder may sacrifice latency of scanning for scanning quality. - * Ideal for file scan kind of operation. - */ -export interface RobustQrcodeDecoderAsync extends QrcodeDecoderAsync { - /** - * Decodes content of the canvas to find a valid QR code or bar code. - * - *

    The method implementation will run the decoder more robustly at the - * expense of latency. - * - * @param canvas a valid html5 canvas element. - */ - decodeRobustlyAsync(canvas: HTMLCanvasElement): Promise; -} - -/** Interface for logger. */ -export interface Logger { - log(message: string): void; - warn(message: string): void; - logError(message: string, isExperimental?: boolean): void; - logErrors(errors: Array): void; -} - -/** - * Base logger implementation based on browser console. - * - * This can be replaced by a custom implementation of logger. - * - */ -export class BaseLoggger implements Logger { - - private verbose: boolean; - - public constructor(verbose: boolean) { - this.verbose = verbose; - } - - public log(message: string): void { - if (this.verbose) { - // eslint-disable-next-line no-console - console.log(message); - } - } - - public warn(message: string): void { - if (this.verbose) { - // eslint-disable-next-line no-console - console.warn(message); - } - } - - public logError(message: string, isExperimental?: boolean) - : void { - if (this.verbose || isExperimental === true) { - // eslint-disable-next-line no-console - console.error(message); - } - } - - public logErrors(errors: Array): void { - if (errors.length === 0) { - throw "Logger#logError called without arguments"; - } - if (this.verbose) { - // eslint-disable-next-line no-console - console.error(errors); - } - } -} - -//#region global functions -/** Returns true if the {@param obj} is null or undefined. */ -export function isNullOrUndefined(obj?: any) { - return (typeof obj === "undefined") || obj === null; -} - -/** Clips the {@code value} between {@code minValue} and {@code maxValue}. */ -export function clip(value: number, minValue: number, maxValue: number) { - if (value > maxValue) { - return maxValue; - } - if (value < minValue) { - return minValue; - } - - return value; -} -//#endregion diff --git a/node_modules/html5-qrcode/src/experimental-features.d.ts b/node_modules/html5-qrcode/src/experimental-features.d.ts deleted file mode 100644 index 0413abe..0000000 --- a/node_modules/html5-qrcode/src/experimental-features.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface ExperimentalFeaturesConfig { - useBarCodeDetectorIfSupported?: boolean | undefined; -} diff --git a/node_modules/html5-qrcode/src/experimental-features.ts b/node_modules/html5-qrcode/src/experimental-features.ts deleted file mode 100644 index 70f6c28..0000000 --- a/node_modules/html5-qrcode/src/experimental-features.ts +++ /dev/null @@ -1,44 +0,0 @@ -/** - * @fileoverview - * Core library for experimental features. - * - * @author mebjas - * - * Experimental features are those which have limited browser compatibility and - * hidden from official documentations. These features are not recommended by - * the author to be used in production unless explictly tested. - * - * Subset of the features are expected to upgrade to official feature list from - * time to time. - * - * The word "QR Code" is registered trademark of DENSO WAVE INCORPORATED - * http://www.denso-wave.com/qrcode/faqpatent-e.html - */ - - -/** - * Configuration for enabling or disabling experimental features in the library. - * - * These features will eventually upgrade as fully supported features in the - * library. - */ -export interface ExperimentalFeaturesConfig { - /** - * {@class BarcodeDetector} is being implemented by browsers at the moment. - * It has very limited browser support but as it gets available it could - * enable faster native code scanning experience. - * - * Set this flag to true, to enable using {@class BarcodeDetector} if - * supported. This is false by default. - * - * @deprecated This configuration has graduated to - * {@code Html5QrcodeCameraScanConfig} you can set it there directly. All - * documentation and future improvements shall be added to that one. This - * config will still work for backwards compatibility. - * - * Documentations: - * - https://developer.mozilla.org/en-US/docs/Web/API/BarcodeDetector - * - https://web.dev/shape-detection/#barcodedetector - */ - useBarCodeDetectorIfSupported?: boolean | undefined; -} diff --git a/node_modules/html5-qrcode/src/html5-qrcode-scanner.d.ts b/node_modules/html5-qrcode/src/html5-qrcode-scanner.d.ts deleted file mode 100644 index 417175b..0000000 --- a/node_modules/html5-qrcode/src/html5-qrcode-scanner.d.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { Html5QrcodeScanType, QrcodeSuccessCallback, QrcodeErrorCallback } from "./core"; -import { Html5QrcodeConfigs, Html5QrcodeCameraScanConfig } from "./html5-qrcode"; -import { Html5QrcodeScannerState } from "./state-manager"; -export interface Html5QrcodeScannerConfig extends Html5QrcodeCameraScanConfig, Html5QrcodeConfigs { - rememberLastUsedCamera?: boolean | undefined; - supportedScanTypes?: Array | []; - showTorchButtonIfSupported?: boolean | undefined; - showZoomSliderIfSupported?: boolean | undefined; - defaultZoomValueIfSupported?: number | undefined; -} -export declare class Html5QrcodeScanner { - private elementId; - private config; - private verbose; - private currentScanType; - private sectionSwapAllowed; - private persistedDataManager; - private scanTypeSelector; - private logger; - private html5Qrcode; - private qrCodeSuccessCallback; - private qrCodeErrorCallback; - private lastMatchFound; - private cameraScanImage; - private fileScanImage; - private fileSelectionUi; - constructor(elementId: string, config: Html5QrcodeScannerConfig | undefined, verbose: boolean | undefined); - render(qrCodeSuccessCallback: QrcodeSuccessCallback, qrCodeErrorCallback: QrcodeErrorCallback | undefined): void; - pause(shouldPauseVideo?: boolean): void; - resume(): void; - getState(): Html5QrcodeScannerState; - clear(): Promise; - getRunningTrackCapabilities(): MediaTrackCapabilities; - getRunningTrackSettings(): MediaTrackSettings; - applyVideoConstraints(videoConstaints: MediaTrackConstraints): Promise; - private getHtml5QrcodeOrFail; - private createConfig; - private createBasicLayout; - private resetBasicLayout; - private setupInitialDashboard; - private createHeader; - private createSection; - private createCameraListUi; - private createPermissionButton; - private createPermissionsUi; - private createSectionControlPanel; - private renderFileScanUi; - private renderCameraSelection; - private createSectionSwap; - private startCameraScanIfPermissionExistsOnSwap; - private resetHeaderMessage; - private setHeaderMessage; - private showHideScanTypeSwapLink; - private insertCameraScanImageToScanRegion; - private insertFileScanImageToScanRegion; - private clearScanRegion; - private getDashboardSectionId; - private getDashboardSectionCameraScanRegionId; - private getDashboardSectionSwapLinkId; - private getScanRegionId; - private getDashboardId; - private getHeaderMessageContainerId; - private getCameraPermissionButtonId; - private getCameraScanRegion; - private getDashboardSectionSwapLink; - private getHeaderMessageDiv; -} diff --git a/node_modules/html5-qrcode/src/html5-qrcode-scanner.ts b/node_modules/html5-qrcode/src/html5-qrcode-scanner.ts deleted file mode 100644 index 028262f..0000000 --- a/node_modules/html5-qrcode/src/html5-qrcode-scanner.ts +++ /dev/null @@ -1,1137 +0,0 @@ -/** - * @module - * Complete Scanner build on top of {@link Html5Qrcode}. - * - Decode QR Code using web cam or smartphone camera - * - * @author mebjas - * - * The word "QR Code" is registered trademark of DENSO WAVE INCORPORATED - * http://www.denso-wave.com/qrcode/faqpatent-e.html - */ -import { - Html5QrcodeConstants, - Html5QrcodeScanType, - QrcodeSuccessCallback, - QrcodeErrorCallback, - Html5QrcodeResult, - Html5QrcodeError, - Html5QrcodeErrorFactory, - BaseLoggger, - Logger, - isNullOrUndefined, - clip, -} from "./core"; - -import { CameraCapabilities } from "./camera/core"; - -import { CameraDevice } from "./camera/core"; - -import { - Html5Qrcode, - Html5QrcodeConfigs, - Html5QrcodeCameraScanConfig, - Html5QrcodeFullConfig, -} from "./html5-qrcode"; - -import { - Html5QrcodeScannerStrings, -} from "./strings"; - -import { - ASSET_FILE_SCAN, - ASSET_CAMERA_SCAN, -} from "./image-assets"; - -import { - PersistedDataManager -} from "./storage"; - -import { - LibraryInfoContainer -} from "./ui"; - -import { - CameraPermissions -} from "./camera/permissions"; - -import { Html5QrcodeScannerState } from "./state-manager"; - -import { ScanTypeSelector } from "./ui/scanner/scan-type-selector"; - -import { TorchButton } from "./ui/scanner/torch-button"; - -import { - FileSelectionUi, - OnFileSelected -} from "./ui/scanner/file-selection-ui"; - -import { - BaseUiElementFactory, - PublicUiElementIdAndClasses -} from "./ui/scanner/base"; - -import { CameraSelectionUi } from "./ui/scanner/camera-selection-ui"; -import { CameraZoomUi } from "./ui/scanner/camera-zoom-ui"; - -/** - * Different states of QR Code Scanner. - */ -enum Html5QrcodeScannerStatus { - STATUS_DEFAULT = 0, - STATUS_SUCCESS = 1, - STATUS_WARNING = 2, - STATUS_REQUESTING_PERMISSION = 3, -} - -/** - * Interface for controlling different aspects of {@class Html5QrcodeScanner}. - */ -export interface Html5QrcodeScannerConfig - extends Html5QrcodeCameraScanConfig, Html5QrcodeConfigs { - - /** - * If `true` the library will remember if the camera permissions - * were previously granted and what camera was last used. If the permissions - * is already granted for "camera", QR code scanning will automatically - * start for previously used camera. - * - * Note: default value is `true`. - */ - rememberLastUsedCamera?: boolean | undefined; - - /** - * Sets the desired scan types to be supported in the scanner. - * - * - Not setting a value will follow the default order supported by - * library. - * - First value would be used as the default value. Example: - * - [SCAN_TYPE_CAMERA, SCAN_TYPE_FILE]: Camera will be default type, - * user can switch to file based scan. - * - [SCAN_TYPE_FILE, SCAN_TYPE_CAMERA]: File based scan will be default - * type, user can switch to camera based scan. - * - Setting only value will disable option to switch to other. Example: - * - [SCAN_TYPE_CAMERA] - Only camera based scan supported. - * - [SCAN_TYPE_FILE] - Only file based scan supported. - * - Setting wrong values or multiple values will fail. - */ - supportedScanTypes?: Array | []; - - /** - * If `true` the rendered UI will have button to turn flash on or off - * based on device + browser support. - * - * Note: default value is `false`. - */ - showTorchButtonIfSupported?: boolean | undefined; - - /** - * If `true` the rendered UI will have slider to zoom camera based on - * device + browser support. - * - * Note: default value is `false`. - * - * TODO(minhazav): Document this API, currently hidden. - */ - showZoomSliderIfSupported?: boolean | undefined; - - /** - * Default zoom value if supported. - * - * Note: default value is 1x. - * - * TODO(minhazav): Document this API, currently hidden. - */ - defaultZoomValueIfSupported?: number | undefined; -} - -function toHtml5QrcodeCameraScanConfig(config: Html5QrcodeScannerConfig) - : Html5QrcodeCameraScanConfig { - return { - fps: config.fps, - qrbox: config.qrbox, - aspectRatio: config.aspectRatio, - disableFlip: config.disableFlip, - videoConstraints: config.videoConstraints - }; -} - -function toHtml5QrcodeFullConfig( - config: Html5QrcodeConfigs, verbose: boolean | undefined) - : Html5QrcodeFullConfig { - return { - formatsToSupport: config.formatsToSupport, - useBarCodeDetectorIfSupported: config.useBarCodeDetectorIfSupported, - experimentalFeatures: config.experimentalFeatures, - verbose: verbose - }; -} - -/** - * End to end web based QR and Barcode Scanner. - * - * Use this class for setting up QR scanner in your web application with - * few lines of codes. - * - * - Supports camera as well as file based scanning. - * - Depending on device supports camera selection, zoom and torch features. - * - Supports different kind of 2D and 1D codes {@link Html5QrcodeSupportedFormats}. - */ -export class Html5QrcodeScanner { - - //#region private fields - private elementId: string; - private config: Html5QrcodeScannerConfig; - private verbose: boolean; - private currentScanType: Html5QrcodeScanType; - private sectionSwapAllowed: boolean; - private persistedDataManager: PersistedDataManager; - private scanTypeSelector: ScanTypeSelector; - private logger: Logger; - - // Initally null fields. - private html5Qrcode: Html5Qrcode | undefined; - private qrCodeSuccessCallback: QrcodeSuccessCallback | undefined; - private qrCodeErrorCallback: QrcodeErrorCallback | undefined; - private lastMatchFound: string | null = null; - private cameraScanImage: HTMLImageElement | null = null; - private fileScanImage: HTMLImageElement | null = null; - private fileSelectionUi: FileSelectionUi | null = null; - //#endregion - - /** - * Creates instance of this class. - * - * @param elementId Id of the HTML element. - * @param config Extra configurations to tune the code scanner. - * @param verbose - If true, all logs would be printed to console. - */ - public constructor( - elementId: string, - config: Html5QrcodeScannerConfig | undefined, - verbose: boolean | undefined) { - this.elementId = elementId; - this.config = this.createConfig(config); - this.verbose = verbose === true; - - if (!document.getElementById(elementId)) { - throw `HTML Element with id=${elementId} not found`; - } - - this.scanTypeSelector = new ScanTypeSelector( - this.config.supportedScanTypes); - this.currentScanType = this.scanTypeSelector.getDefaultScanType(); - - this.sectionSwapAllowed = true; - this.logger = new BaseLoggger(this.verbose); - - this.persistedDataManager = new PersistedDataManager(); - if (config!.rememberLastUsedCamera !== true) { - this.persistedDataManager.reset(); - } - } - - /** - * Renders the User Interface. - * - * @param qrCodeSuccessCallback Callback called when an instance of a QR - * code or any other supported bar code is found. - * @param qrCodeErrorCallback optional, callback called in cases where no - * instance of QR code or any other supported bar code is found. - */ - public render( - qrCodeSuccessCallback: QrcodeSuccessCallback, - qrCodeErrorCallback: QrcodeErrorCallback | undefined) { - this.lastMatchFound = null; - - // Add wrapper to success callback. - this.qrCodeSuccessCallback - = (decodedText: string, result: Html5QrcodeResult) => { - if (qrCodeSuccessCallback) { - qrCodeSuccessCallback(decodedText, result); - } else { - if (this.lastMatchFound === decodedText) { - return; - } - - this.lastMatchFound = decodedText; - this.setHeaderMessage( - Html5QrcodeScannerStrings.lastMatch(decodedText), - Html5QrcodeScannerStatus.STATUS_SUCCESS); - } - }; - - // Add wrapper to failure callback - this.qrCodeErrorCallback = - (errorMessage: string, error: Html5QrcodeError) => { - if (qrCodeErrorCallback) { - qrCodeErrorCallback(errorMessage, error); - } - }; - - const container = document.getElementById(this.elementId); - if (!container) { - throw `HTML Element with id=${this.elementId} not found`; - } - container.innerHTML = ""; - this.createBasicLayout(container!); - this.html5Qrcode = new Html5Qrcode( - this.getScanRegionId(), - toHtml5QrcodeFullConfig(this.config, this.verbose)); - } - - //#region State related public APIs - /** - * Pauses the ongoing scan. - * - * Notes: - * - Should only be called if camera scan is ongoing. - * - * @param shouldPauseVideo (Optional, default = false) If `true` - * the video will be paused. - * - * @throws error if method is called when scanner is not in scanning state. - */ - public pause(shouldPauseVideo?: boolean) { - if (isNullOrUndefined(shouldPauseVideo) || shouldPauseVideo !== true) { - shouldPauseVideo = false; - } - - this.getHtml5QrcodeOrFail().pause(shouldPauseVideo); - } - - /** - * Resumes the paused scan. - * - * If the video was previously paused by setting `shouldPauseVideo` - * to `true` in {@link Html5QrcodeScanner#pause(shouldPauseVideo)}, - * calling this method will resume the video. - * - * Notes: - * - Should only be called if camera scan is ongoing. - * - With this caller will start getting results in success and error - * callbacks. - * - * @throws error if method is called when scanner is not in paused state. - */ - public resume() { - this.getHtml5QrcodeOrFail().resume(); - } - - /** - * Gets state of the camera scan. - * - * @returns state of type {@link Html5QrcodeScannerState}. - */ - public getState(): Html5QrcodeScannerState { - return this.getHtml5QrcodeOrFail().getState(); - } - - /** - * Removes the QR Code scanner UI. - * - * @returns Promise which succeeds if the cleanup is complete successfully, - * fails otherwise. - */ - public clear(): Promise { - const emptyHtmlContainer = () => { - const mainContainer = document.getElementById(this.elementId); - if (mainContainer) { - mainContainer.innerHTML = ""; - this.resetBasicLayout(mainContainer); - } - } - - if (this.html5Qrcode) { - return new Promise((resolve, reject) => { - if (!this.html5Qrcode) { - resolve(); - return; - } - if (this.html5Qrcode.isScanning) { - this.html5Qrcode.stop().then((_) => { - if (!this.html5Qrcode) { - resolve(); - return; - } - - this.html5Qrcode.clear(); - emptyHtmlContainer(); - resolve(); - }).catch((error) => { - if (this.verbose) { - this.logger.logError( - "Unable to stop qrcode scanner", error); - } - reject(error); - }); - } else { - // Assuming file based scan was ongoing. - this.html5Qrcode.clear(); - emptyHtmlContainer(); - resolve(); - } - }); - } - - return Promise.resolve(); - } - //#endregion - - //#region Beta APIs to modify running stream state. - /** - * Returns the capabilities of the running video track. - * - * Read more: https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack/getConstraints - * - * Note: Should only be called if {@link Html5QrcodeScanner#getState()} - * returns {@link Html5QrcodeScannerState#SCANNING} or - * {@link Html5QrcodeScannerState#PAUSED}. - * - * @returns the capabilities of a running video track. - * @throws error if the scanning is not in running state. - */ - public getRunningTrackCapabilities(): MediaTrackCapabilities { - return this.getHtml5QrcodeOrFail().getRunningTrackCapabilities(); - } - - /** - * Returns the object containing the current values of each constrainable - * property of the running video track. - * - * Read more: https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack/getSettings - * - * Note: Should only be called if {@link Html5QrcodeScanner#getState()} - * returns {@link Html5QrcodeScannerState#SCANNING} or - * {@link Html5QrcodeScannerState#PAUSED}. - * - * @returns the supported settings of the running video track. - * @throws error if the scanning is not in running state. - */ - public getRunningTrackSettings(): MediaTrackSettings { - return this.getHtml5QrcodeOrFail().getRunningTrackSettings(); - } - - /** - * Apply a video constraints on running video track from camera. - * - * Note: Should only be called if {@link Html5QrcodeScanner#getState()} - * returns {@link Html5QrcodeScannerState#SCANNING} or - * {@link Html5QrcodeScannerState#PAUSED}. - * - * @param {MediaTrackConstraints} specifies a variety of video or camera - * controls as defined in - * https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints - * @returns a Promise which succeeds if the passed constraints are applied, - * fails otherwise. - * @throws error if the scanning is not in running state. - */ - public applyVideoConstraints(videoConstaints: MediaTrackConstraints) - : Promise { - return this.getHtml5QrcodeOrFail().applyVideoConstraints(videoConstaints); - } - //#endregion - - //#region Private methods - private getHtml5QrcodeOrFail() { - if (!this.html5Qrcode) { - throw "Code scanner not initialized."; - } - return this.html5Qrcode!; - } - - private createConfig(config: Html5QrcodeScannerConfig | undefined) - : Html5QrcodeScannerConfig { - if (config) { - if (!config.fps) { - config.fps = Html5QrcodeConstants.SCAN_DEFAULT_FPS; - } - - if (config.rememberLastUsedCamera !== ( - !Html5QrcodeConstants.DEFAULT_REMEMBER_LAST_CAMERA_USED)) { - config.rememberLastUsedCamera - = Html5QrcodeConstants.DEFAULT_REMEMBER_LAST_CAMERA_USED; - } - - if (!config.supportedScanTypes) { - config.supportedScanTypes - = Html5QrcodeConstants.DEFAULT_SUPPORTED_SCAN_TYPE; - } - - return config; - } - - return { - fps: Html5QrcodeConstants.SCAN_DEFAULT_FPS, - rememberLastUsedCamera: - Html5QrcodeConstants.DEFAULT_REMEMBER_LAST_CAMERA_USED, - supportedScanTypes: - Html5QrcodeConstants.DEFAULT_SUPPORTED_SCAN_TYPE - }; - } - - private createBasicLayout(parent: HTMLElement) { - parent.style.position = "relative"; - parent.style.padding = "0px"; - parent.style.border = "1px solid silver"; - this.createHeader(parent); - - const qrCodeScanRegion = document.createElement("div"); - const scanRegionId = this.getScanRegionId(); - qrCodeScanRegion.id = scanRegionId; - qrCodeScanRegion.style.width = "100%"; - qrCodeScanRegion.style.minHeight = "100px"; - qrCodeScanRegion.style.textAlign = "center"; - parent.appendChild(qrCodeScanRegion); - if (ScanTypeSelector.isCameraScanType(this.currentScanType)) { - this.insertCameraScanImageToScanRegion(); - } else { - this.insertFileScanImageToScanRegion(); - } - - const qrCodeDashboard = document.createElement("div"); - const dashboardId = this.getDashboardId(); - qrCodeDashboard.id = dashboardId; - qrCodeDashboard.style.width = "100%"; - parent.appendChild(qrCodeDashboard); - - this.setupInitialDashboard(qrCodeDashboard); - } - - private resetBasicLayout(mainContainer: HTMLElement) { - mainContainer.style.border = "none"; - } - - private setupInitialDashboard(dashboard: HTMLElement) { - this.createSection(dashboard); - this.createSectionControlPanel(); - if (this.scanTypeSelector.hasMoreThanOneScanType()) { - this.createSectionSwap(); - } - } - - private createHeader(dashboard: HTMLElement) { - const header = document.createElement("div"); - header.style.textAlign = "left"; - header.style.margin = "0px"; - dashboard.appendChild(header); - - let libraryInfo = new LibraryInfoContainer(); - libraryInfo.renderInto(header); - - const headerMessageContainer = document.createElement("div"); - headerMessageContainer.id = this.getHeaderMessageContainerId(); - headerMessageContainer.style.display = "none"; - headerMessageContainer.style.textAlign = "center"; - headerMessageContainer.style.fontSize = "14px"; - headerMessageContainer.style.padding = "2px 10px"; - headerMessageContainer.style.margin = "4px"; - headerMessageContainer.style.borderTop = "1px solid #f6f6f6"; - header.appendChild(headerMessageContainer); - } - - private createSection(dashboard: HTMLElement) { - const section = document.createElement("div"); - section.id = this.getDashboardSectionId(); - section.style.width = "100%"; - section.style.padding = "10px 0px 10px 0px"; - section.style.textAlign = "left"; - dashboard.appendChild(section); - } - - private createCameraListUi( - scpCameraScanRegion: HTMLDivElement, - requestPermissionContainer: HTMLDivElement, - requestPermissionButton?: HTMLButtonElement) { - const $this = this; - $this.showHideScanTypeSwapLink(false); - $this.setHeaderMessage( - Html5QrcodeScannerStrings.cameraPermissionRequesting()); - - const createPermissionButtonIfNotExists = () => { - if (!requestPermissionButton) { - $this.createPermissionButton( - scpCameraScanRegion, requestPermissionContainer); - } - } - - Html5Qrcode.getCameras().then((cameras) => { - // By this point the user has granted camera permissions. - $this.persistedDataManager.setHasPermission( - /* hasPermission */ true); - $this.showHideScanTypeSwapLink(true); - $this.resetHeaderMessage(); - if (cameras && cameras.length > 0) { - scpCameraScanRegion.removeChild(requestPermissionContainer); - $this.renderCameraSelection(cameras); - } else { - $this.setHeaderMessage( - Html5QrcodeScannerStrings.noCameraFound(), - Html5QrcodeScannerStatus.STATUS_WARNING); - createPermissionButtonIfNotExists(); - } - }).catch((error) => { - $this.persistedDataManager.setHasPermission( - /* hasPermission */ false); - - if (requestPermissionButton) { - requestPermissionButton.disabled = false; - } else { - // Case when the permission button generation was skipped - // likely due to persistedDataManager indicated permissions - // exists. - // This should ideally never happen, but if it so happened that - // the camera retrieval failed, we want to create button this - // time. - createPermissionButtonIfNotExists(); - } - $this.setHeaderMessage( - error, Html5QrcodeScannerStatus.STATUS_WARNING); - $this.showHideScanTypeSwapLink(true); - }); - } - - private createPermissionButton( - scpCameraScanRegion: HTMLDivElement, - requestPermissionContainer: HTMLDivElement) { - const $this = this; - const requestPermissionButton = BaseUiElementFactory - .createElement( - "button", this.getCameraPermissionButtonId()); - requestPermissionButton.innerText - = Html5QrcodeScannerStrings.cameraPermissionTitle(); - - requestPermissionButton.addEventListener("click", function () { - requestPermissionButton.disabled = true; - $this.createCameraListUi( - scpCameraScanRegion, - requestPermissionContainer, - requestPermissionButton); - }); - requestPermissionContainer.appendChild(requestPermissionButton); - } - - private createPermissionsUi( - scpCameraScanRegion: HTMLDivElement, - requestPermissionContainer: HTMLDivElement) { - const $this = this; - - // Only render last selected camera by default if the default scant type - // is camera. - if (ScanTypeSelector.isCameraScanType(this.currentScanType) - && this.persistedDataManager.hasCameraPermissions()) { - CameraPermissions.hasPermissions().then( - (hasPermissions: boolean) => { - if (hasPermissions) { - $this.createCameraListUi( - scpCameraScanRegion, requestPermissionContainer); - } else { - $this.persistedDataManager.setHasPermission( - /* hasPermission */ false); - $this.createPermissionButton( - scpCameraScanRegion, requestPermissionContainer); - } - }).catch((_: any) => { - $this.persistedDataManager.setHasPermission( - /* hasPermission */ false); - $this.createPermissionButton( - scpCameraScanRegion, requestPermissionContainer); - }); - return; - } - - this.createPermissionButton( - scpCameraScanRegion, requestPermissionContainer); - } - - private createSectionControlPanel() { - const section = document.getElementById(this.getDashboardSectionId())!; - const sectionControlPanel = document.createElement("div"); - section.appendChild(sectionControlPanel); - const scpCameraScanRegion = document.createElement("div"); - scpCameraScanRegion.id = this.getDashboardSectionCameraScanRegionId(); - scpCameraScanRegion.style.display - = ScanTypeSelector.isCameraScanType(this.currentScanType) - ? "block" : "none"; - sectionControlPanel.appendChild(scpCameraScanRegion); - - // Web browsers require the users to grant explicit permissions before - // giving camera access. We need to render a button to request user - // permission. - // Assuming when the object is created permission is needed. - const requestPermissionContainer = document.createElement("div"); - requestPermissionContainer.style.textAlign = "center"; - scpCameraScanRegion.appendChild(requestPermissionContainer); - - // TODO(minhazav): If default scan type is file, the permission or - // camera access shouldn't start unless user explicitly switches to - // camera based scan. @priority: high. - - if (this.scanTypeSelector.isCameraScanRequired()) { - this.createPermissionsUi( - scpCameraScanRegion, requestPermissionContainer); - } - - this.renderFileScanUi(sectionControlPanel); - } - - private renderFileScanUi(parent: HTMLDivElement) { - let showOnRender = ScanTypeSelector.isFileScanType( - this.currentScanType); - const $this = this; - let onFileSelected: OnFileSelected = (file: File) => { - if (!$this.html5Qrcode) { - throw "html5Qrcode not defined"; - } - - if (!ScanTypeSelector.isFileScanType($this.currentScanType)) { - return; - } - - $this.setHeaderMessage(Html5QrcodeScannerStrings.loadingImage()); - $this.html5Qrcode.scanFileV2(file, /* showImage= */ true) - .then((html5qrcodeResult: Html5QrcodeResult) => { - $this.resetHeaderMessage(); - $this.qrCodeSuccessCallback!( - html5qrcodeResult.decodedText, - html5qrcodeResult); - }) - .catch((error) => { - $this.setHeaderMessage( - error, Html5QrcodeScannerStatus.STATUS_WARNING); - $this.qrCodeErrorCallback!( - error, Html5QrcodeErrorFactory.createFrom(error)); - }); - }; - - this.fileSelectionUi = FileSelectionUi.create( - parent, showOnRender, onFileSelected); - } - - private renderCameraSelection(cameras: Array) { - const $this = this; - const scpCameraScanRegion = document.getElementById( - this.getDashboardSectionCameraScanRegionId())!; - scpCameraScanRegion.style.textAlign = "center"; - - // Hide by default. - let cameraZoomUi: CameraZoomUi = CameraZoomUi.create( - scpCameraScanRegion, /* renderOnCreate= */ false); - const renderCameraZoomUiIfSupported - = (cameraCapabilities: CameraCapabilities) => { - let zoomCapability = cameraCapabilities.zoomFeature(); - if (!zoomCapability.isSupported()) { - return; - } - - // Supported. - cameraZoomUi.setOnCameraZoomValueChangeCallback((zoomValue) => { - zoomCapability.apply(zoomValue); - }); - let defaultZoom = 1; - if (this.config.defaultZoomValueIfSupported) { - defaultZoom = this.config.defaultZoomValueIfSupported; - } - defaultZoom = clip( - defaultZoom, zoomCapability.min(), zoomCapability.max()); - cameraZoomUi.setValues( - zoomCapability.min(), - zoomCapability.max(), - defaultZoom, - zoomCapability.step(), - ); - cameraZoomUi.show(); - }; - - let cameraSelectUi: CameraSelectionUi = CameraSelectionUi.create( - scpCameraScanRegion, cameras); - - // Camera Action Buttons. - const cameraActionContainer = document.createElement("span"); - const cameraActionStartButton - = BaseUiElementFactory.createElement( - "button", PublicUiElementIdAndClasses.CAMERA_START_BUTTON_ID); - cameraActionStartButton.innerText - = Html5QrcodeScannerStrings.scanButtonStartScanningText(); - cameraActionContainer.appendChild(cameraActionStartButton); - - const cameraActionStopButton - = BaseUiElementFactory.createElement( - "button", PublicUiElementIdAndClasses.CAMERA_STOP_BUTTON_ID); - cameraActionStopButton.innerText - = Html5QrcodeScannerStrings.scanButtonStopScanningText(); - cameraActionStopButton.style.display = "none"; - cameraActionStopButton.disabled = true; - cameraActionContainer.appendChild(cameraActionStopButton); - - // Optional torch button support. - let torchButton: TorchButton; - const createAndShowTorchButtonIfSupported - = (cameraCapabilities: CameraCapabilities) => { - if (!cameraCapabilities.torchFeature().isSupported()) { - // Torch not supported, ignore. - if (torchButton) { - torchButton.hide(); - } - return; - } - - if (!torchButton) { - torchButton = TorchButton.create( - cameraActionContainer, - cameraCapabilities.torchFeature(), - { display: "none", marginLeft: "5px" }, - // Callback in case of torch action failure. - (errorMessage) => { - $this.setHeaderMessage( - errorMessage, - Html5QrcodeScannerStatus.STATUS_WARNING); - } - ); - } else { - torchButton.updateTorchCapability( - cameraCapabilities.torchFeature()); - } - torchButton.show(); - }; - - scpCameraScanRegion.appendChild(cameraActionContainer); - - const resetCameraActionStartButton = (shouldShow: boolean) => { - if (!shouldShow) { - cameraActionStartButton.style.display = "none"; - } - cameraActionStartButton.innerText - = Html5QrcodeScannerStrings - .scanButtonStartScanningText(); - cameraActionStartButton.style.opacity = "1"; - cameraActionStartButton.disabled = false; - if (shouldShow) { - cameraActionStartButton.style.display = "inline-block"; - } - }; - - cameraActionStartButton.addEventListener("click", (_) => { - // Update the UI. - cameraActionStartButton.innerText - = Html5QrcodeScannerStrings.scanButtonScanningStarting(); - cameraSelectUi.disable(); - cameraActionStartButton.disabled = true; - cameraActionStartButton.style.opacity = "0.5"; - // Swap link is available only when both scan types are required. - if (this.scanTypeSelector.hasMoreThanOneScanType()) { - $this.showHideScanTypeSwapLink(false); - } - $this.resetHeaderMessage(); - - // Attempt starting the camera. - const cameraId = cameraSelectUi.getValue(); - $this.persistedDataManager.setLastUsedCameraId(cameraId); - - $this.html5Qrcode!.start( - cameraId, - toHtml5QrcodeCameraScanConfig($this.config), - $this.qrCodeSuccessCallback!, - $this.qrCodeErrorCallback!) - .then((_) => { - cameraActionStopButton.disabled = false; - cameraActionStopButton.style.display = "inline-block"; - resetCameraActionStartButton(/* shouldShow= */ false); - - const cameraCapabilities - = $this.html5Qrcode!.getRunningTrackCameraCapabilities(); - - // Show torch button if needed. - if (this.config.showTorchButtonIfSupported === true) { - createAndShowTorchButtonIfSupported(cameraCapabilities); - } - // Show zoom slider if needed. - if (this.config.showZoomSliderIfSupported === true) { - renderCameraZoomUiIfSupported(cameraCapabilities); - } - }) - .catch((error) => { - $this.showHideScanTypeSwapLink(true); - cameraSelectUi.enable(); - resetCameraActionStartButton(/* shouldShow= */ true); - $this.setHeaderMessage( - error, Html5QrcodeScannerStatus.STATUS_WARNING); - }); - }); - - if (cameraSelectUi.hasSingleItem()) { - // If there is only one camera, start scanning directly. - cameraActionStartButton.click(); - } - - cameraActionStopButton.addEventListener("click", (_) => { - if (!$this.html5Qrcode) { - throw "html5Qrcode not defined"; - } - cameraActionStopButton.disabled = true; - $this.html5Qrcode.stop() - .then((_) => { - // Swap link is required if more than one scan types are - // required. - if(this.scanTypeSelector.hasMoreThanOneScanType()) { - $this.showHideScanTypeSwapLink(true); - } - - cameraSelectUi.enable(); - cameraActionStartButton.disabled = false; - cameraActionStopButton.style.display = "none"; - cameraActionStartButton.style.display = "inline-block"; - // Reset torch state. - if (torchButton) { - torchButton.reset(); - torchButton.hide(); - } - cameraZoomUi.removeOnCameraZoomValueChangeCallback(); - cameraZoomUi.hide(); - $this.insertCameraScanImageToScanRegion(); - }).catch((error) => { - cameraActionStopButton.disabled = false; - $this.setHeaderMessage( - error, Html5QrcodeScannerStatus.STATUS_WARNING); - }); - }); - - if ($this.persistedDataManager.getLastUsedCameraId()) { - const cameraId = $this.persistedDataManager.getLastUsedCameraId()!; - if (cameraSelectUi.hasValue(cameraId)) { - cameraSelectUi.setValue(cameraId); - cameraActionStartButton.click(); - } else { - $this.persistedDataManager.resetLastUsedCameraId(); - } - } - } - - private createSectionSwap() { - const $this = this; - const TEXT_IF_CAMERA_SCAN_SELECTED - = Html5QrcodeScannerStrings.textIfCameraScanSelected(); - const TEXT_IF_FILE_SCAN_SELECTED - = Html5QrcodeScannerStrings.textIfFileScanSelected(); - - // TODO(minhaz): Export this as an UI element. - const section = document.getElementById(this.getDashboardSectionId())!; - const switchContainer = document.createElement("div"); - switchContainer.style.textAlign = "center"; - const switchScanTypeLink - = BaseUiElementFactory.createElement( - "span", this.getDashboardSectionSwapLinkId()); - switchScanTypeLink.style.textDecoration = "underline"; - switchScanTypeLink.style.cursor = "pointer"; - switchScanTypeLink.innerText - = ScanTypeSelector.isCameraScanType(this.currentScanType) - ? TEXT_IF_CAMERA_SCAN_SELECTED : TEXT_IF_FILE_SCAN_SELECTED; - switchScanTypeLink.addEventListener("click", function () { - // TODO(minhazav): Abstract this to a different library. - if (!$this.sectionSwapAllowed) { - if ($this.verbose) { - $this.logger.logError( - "Section swap called when not allowed"); - } - return; - } - - // Cleanup states - $this.resetHeaderMessage(); - $this.fileSelectionUi!.resetValue(); - $this.sectionSwapAllowed = false; - - if (ScanTypeSelector.isCameraScanType($this.currentScanType)) { - // Swap to file based scanning. - $this.clearScanRegion(); - $this.getCameraScanRegion().style.display = "none"; - $this.fileSelectionUi!.show(); - switchScanTypeLink.innerText = TEXT_IF_FILE_SCAN_SELECTED; - $this.currentScanType = Html5QrcodeScanType.SCAN_TYPE_FILE; - $this.insertFileScanImageToScanRegion(); - } else { - // Swap to camera based scanning. - $this.clearScanRegion(); - $this.getCameraScanRegion().style.display = "block"; - $this.fileSelectionUi!.hide(); - switchScanTypeLink.innerText = TEXT_IF_CAMERA_SCAN_SELECTED; - $this.currentScanType = Html5QrcodeScanType.SCAN_TYPE_CAMERA; - $this.insertCameraScanImageToScanRegion(); - - $this.startCameraScanIfPermissionExistsOnSwap(); - } - - $this.sectionSwapAllowed = true; - }); - switchContainer.appendChild(switchScanTypeLink); - section.appendChild(switchContainer); - } - - // Start camera scanning automatically when swapping to camera based scan - // if set in config and has permission. - private startCameraScanIfPermissionExistsOnSwap() { - const $this = this; - if (this.persistedDataManager.hasCameraPermissions()) { - CameraPermissions.hasPermissions().then( - (hasPermissions: boolean) => { - if (hasPermissions) { - // Start feed. - // Assuming at this point the permission button exists. - let permissionButton = document.getElementById( - $this.getCameraPermissionButtonId()); - if (!permissionButton) { - this.logger.logError( - "Permission button not found, fail;"); - throw "Permission button not found"; - } - permissionButton.click(); - } else { - $this.persistedDataManager.setHasPermission( - /* hasPermission */ false); - } - }).catch((_: any) => { - $this.persistedDataManager.setHasPermission( - /* hasPermission */ false); - }); - return; - } - } - - private resetHeaderMessage() { - const messageDiv = document.getElementById( - this.getHeaderMessageContainerId())!; - messageDiv.style.display = "none"; - } - - private setHeaderMessage( - messageText: string, scannerStatus?: Html5QrcodeScannerStatus) { - if (!scannerStatus) { - scannerStatus = Html5QrcodeScannerStatus.STATUS_DEFAULT; - } - - const messageDiv = this.getHeaderMessageDiv(); - messageDiv.innerText = messageText; - messageDiv.style.display = "block"; - - switch (scannerStatus) { - case Html5QrcodeScannerStatus.STATUS_SUCCESS: - messageDiv.style.background = "rgba(106, 175, 80, 0.26)"; - messageDiv.style.color = "#477735"; - break; - case Html5QrcodeScannerStatus.STATUS_WARNING: - messageDiv.style.background = "rgba(203, 36, 49, 0.14)"; - messageDiv.style.color = "#cb2431"; - break; - case Html5QrcodeScannerStatus.STATUS_DEFAULT: - default: - messageDiv.style.background = "rgba(0, 0, 0, 0)"; - messageDiv.style.color = "rgb(17, 17, 17)"; - break; - } - } - - private showHideScanTypeSwapLink(shouldDisplay?: boolean) { - if (this.scanTypeSelector.hasMoreThanOneScanType()) { - if (shouldDisplay !== true) { - shouldDisplay = false; - } - - this.sectionSwapAllowed = shouldDisplay; - this.getDashboardSectionSwapLink().style.display - = shouldDisplay ? "inline-block" : "none"; - } - } - - private insertCameraScanImageToScanRegion() { - const $this = this; - const qrCodeScanRegion = document.getElementById( - this.getScanRegionId())!; - - if (this.cameraScanImage) { - qrCodeScanRegion.innerHTML = "
    "; - qrCodeScanRegion.appendChild(this.cameraScanImage); - return; - } - - this.cameraScanImage = new Image; - this.cameraScanImage.onload = (_) => { - qrCodeScanRegion.innerHTML = "
    "; - qrCodeScanRegion.appendChild($this.cameraScanImage!); - } - this.cameraScanImage.width = 64; - this.cameraScanImage.style.opacity = "0.8"; - this.cameraScanImage.src = ASSET_CAMERA_SCAN; - this.cameraScanImage.alt = Html5QrcodeScannerStrings.cameraScanAltText(); - } - - private insertFileScanImageToScanRegion() { - const $this = this; - const qrCodeScanRegion = document.getElementById( - this.getScanRegionId())!; - - if (this.fileScanImage) { - qrCodeScanRegion.innerHTML = "
    "; - qrCodeScanRegion.appendChild(this.fileScanImage); - return; - } - - this.fileScanImage = new Image; - this.fileScanImage.onload = (_) => { - qrCodeScanRegion.innerHTML = "
    "; - qrCodeScanRegion.appendChild($this.fileScanImage!); - } - this.fileScanImage.width = 64; - this.fileScanImage.style.opacity = "0.8"; - this.fileScanImage.src = ASSET_FILE_SCAN; - this.fileScanImage.alt = Html5QrcodeScannerStrings.fileScanAltText(); - } - - private clearScanRegion() { - const qrCodeScanRegion = document.getElementById( - this.getScanRegionId())!; - qrCodeScanRegion.innerHTML = ""; - } - - //#region state getters - private getDashboardSectionId(): string { - return `${this.elementId}__dashboard_section`; - } - - private getDashboardSectionCameraScanRegionId(): string { - return `${this.elementId}__dashboard_section_csr`; - } - - private getDashboardSectionSwapLinkId(): string { - return PublicUiElementIdAndClasses.SCAN_TYPE_CHANGE_ANCHOR_ID; - } - - private getScanRegionId(): string { - return `${this.elementId}__scan_region`; - } - - private getDashboardId(): string { - return `${this.elementId}__dashboard`; - } - - private getHeaderMessageContainerId(): string { - return `${this.elementId}__header_message`; - } - - private getCameraPermissionButtonId(): string { - return PublicUiElementIdAndClasses.CAMERA_PERMISSION_BUTTON_ID; - } - - private getCameraScanRegion(): HTMLElement { - return document.getElementById( - this.getDashboardSectionCameraScanRegionId())!; - } - - private getDashboardSectionSwapLink(): HTMLElement { - return document.getElementById(this.getDashboardSectionSwapLinkId())!; - } - - private getHeaderMessageDiv(): HTMLElement { - return document.getElementById(this.getHeaderMessageContainerId())!; - } - //#endregion - //#endregion -} diff --git a/node_modules/html5-qrcode/src/html5-qrcode.d.ts b/node_modules/html5-qrcode/src/html5-qrcode.d.ts deleted file mode 100644 index 0e57693..0000000 --- a/node_modules/html5-qrcode/src/html5-qrcode.d.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { QrcodeErrorCallback, QrcodeSuccessCallback, Html5QrcodeSupportedFormats, Html5QrcodeResult, QrDimensions, QrDimensionFunction } from "./core"; -import { CameraDevice, CameraCapabilities } from "./camera/core"; -import { ExperimentalFeaturesConfig } from "./experimental-features"; -import { Html5QrcodeScannerState } from "./state-manager"; -export interface Html5QrcodeConfigs { - formatsToSupport?: Array | undefined; - useBarCodeDetectorIfSupported?: boolean | undefined; - experimentalFeatures?: ExperimentalFeaturesConfig | undefined; -} -export interface Html5QrcodeFullConfig extends Html5QrcodeConfigs { - verbose: boolean | undefined; -} -export interface Html5QrcodeCameraScanConfig { - fps: number | undefined; - qrbox?: number | QrDimensions | QrDimensionFunction | undefined; - aspectRatio?: number | undefined; - disableFlip?: boolean | undefined; - videoConstraints?: MediaTrackConstraints | undefined; -} -export declare class Html5Qrcode { - private readonly logger; - private readonly elementId; - private readonly verbose; - private readonly qrcode; - private shouldScan; - private element; - private canvasElement; - private scannerPausedUiElement; - private hasBorderShaders; - private borderShaders; - private qrMatch; - private renderedCamera; - private foreverScanTimeout; - private qrRegion; - private context; - private lastScanImageFile; - private stateManagerProxy; - isScanning: boolean; - constructor(elementId: string, configOrVerbosityFlag?: boolean | Html5QrcodeFullConfig | undefined); - start(cameraIdOrConfig: string | MediaTrackConstraints, configuration: Html5QrcodeCameraScanConfig | undefined, qrCodeSuccessCallback: QrcodeSuccessCallback | undefined, qrCodeErrorCallback: QrcodeErrorCallback | undefined): Promise; - pause(shouldPauseVideo?: boolean): void; - resume(): void; - getState(): Html5QrcodeScannerState; - stop(): Promise; - scanFile(imageFile: File, showImage?: boolean): Promise; - scanFileV2(imageFile: File, showImage?: boolean): Promise; - clear(): void; - static getCameras(): Promise>; - getRunningTrackCapabilities(): MediaTrackCapabilities; - getRunningTrackSettings(): MediaTrackSettings; - getRunningTrackCameraCapabilities(): CameraCapabilities; - applyVideoConstraints(videoConstaints: MediaTrackConstraints): Promise; - private getRenderedCameraOrFail; - private getSupportedFormats; - private getUseBarCodeDetectorIfSupported; - private validateQrboxSize; - private validateQrboxConfig; - private toQrdimensions; - private setupUi; - private createScannerPausedUiElement; - private scanContext; - private foreverScan; - private createVideoConstraints; - private computeCanvasDrawConfig; - private clearElement; - private possiblyUpdateShaders; - private possiblyCloseLastScanImageFile; - private createCanvasElement; - private getShadedRegionBounds; - private possiblyInsertShadingElement; - private insertShaderBorders; - private showPausedState; - private hidePausedState; - private getTimeoutFps; -} diff --git a/node_modules/html5-qrcode/src/html5-qrcode.ts b/node_modules/html5-qrcode/src/html5-qrcode.ts deleted file mode 100644 index b3fcbda..0000000 --- a/node_modules/html5-qrcode/src/html5-qrcode.ts +++ /dev/null @@ -1,1595 +0,0 @@ -/** - * @module - * HTML5 QR code & barcode scanning library. - * - Decode QR Code. - * - Decode different kinds of barcodes. - * - Decode using web cam, smart phone camera or using images on local file - * system. - * - * @author mebjas - * - * The word "QR Code" is registered trademark of DENSO WAVE INCORPORATED - * http://www.denso-wave.com/qrcode/faqpatent-e.html - */ - -import { - QrcodeErrorCallback, - QrcodeSuccessCallback, - Logger, - BaseLoggger, - Html5QrcodeResultFactory, - Html5QrcodeErrorFactory, - Html5QrcodeSupportedFormats, - RobustQrcodeDecoderAsync, - isValidHtml5QrcodeSupportedFormats, - Html5QrcodeConstants, - Html5QrcodeResult, - isNullOrUndefined, - QrDimensions, - QrDimensionFunction -} from "./core"; -import { Html5QrcodeStrings } from "./strings"; -import { VideoConstraintsUtil } from "./utils"; -import { Html5QrcodeShim } from "./code-decoder"; -import { CameraFactory } from "./camera/factories"; -import { - CameraDevice, - CameraCapabilities, - CameraRenderingOptions, - RenderedCamera, - RenderingCallbacks -} from "./camera/core"; -import { CameraRetriever } from "./camera/retriever"; -import { ExperimentalFeaturesConfig } from "./experimental-features"; -import { - StateManagerProxy, - StateManagerFactory, - StateManagerTransaction, - Html5QrcodeScannerState -} from "./state-manager"; - -class Constants extends Html5QrcodeConstants { - //#region static constants - static DEFAULT_WIDTH = 300; - static DEFAULT_WIDTH_OFFSET = 2; - static FILE_SCAN_MIN_HEIGHT = 300; - static FILE_SCAN_HIDDEN_CANVAS_PADDING = 100; - static MIN_QR_BOX_SIZE = 50; - static SHADED_LEFT = 1; - static SHADED_RIGHT = 2; - static SHADED_TOP = 3; - static SHADED_BOTTOM = 4; - static SHADED_REGION_ELEMENT_ID = "qr-shaded-region"; - static VERBOSE = false; - static BORDER_SHADER_DEFAULT_COLOR = "#ffffff"; - static BORDER_SHADER_MATCH_COLOR = "rgb(90, 193, 56)"; - //#endregion -} - -/** - * Interface for configuring {@link Html5Qrcode} class instance. - */ -export interface Html5QrcodeConfigs { - /** - * Array of formats to support of type {@link Html5QrcodeSupportedFormats}. - * - * All invalid values would be ignored. If null or underfined all supported - * formats will be used for scanning. Unless you want to limit the scan to - * only certain formats or want to improve performance, you should not set - * this value. - */ - formatsToSupport?: Array | undefined; - - /** - * {@link BarcodeDetector} is being implemented by browsers at the moment. - * It has very limited browser support but as it gets available it could - * enable faster native code scanning experience. - * - * Set this flag to true, to enable using {@link BarcodeDetector} if - * supported. This is true by default. - * - * Documentations: - * - https://developer.mozilla.org/en-US/docs/Web/API/BarcodeDetector - * - https://web.dev/shape-detection/#barcodedetector - */ - useBarCodeDetectorIfSupported?: boolean | undefined; - - /** - * Config for experimental features. - * - * Everything is false by default. - */ - experimentalFeatures?: ExperimentalFeaturesConfig | undefined; -} - -/** - * Interface for full configuration of {@link Html5Qrcode}. - * - * Notes: Ideally we don't need to have two interfaces for this purpose, but - * since the public APIs before version 2.0.8 allowed passing a boolean verbose - * flag to constructor we need to allow users to pass Html5QrcodeFullConfig or - * boolean flag to be backward compatible. - * In future versions these two interfaces can be merged. - */ -export interface Html5QrcodeFullConfig extends Html5QrcodeConfigs { - /** - * If true, all logs would be printed to console. False by default. - */ - verbose: boolean | undefined; -} - -/** - * Configuration type for scanning QR code with camera. - */ -export interface Html5QrcodeCameraScanConfig { - /** - * Optional, Expected framerate of qr code scanning. example `{ fps: 2 }` means the - * scanning would be done every `500 ms`. - */ - fps: number | undefined; - - /** - * Optional, edge size, dimension or calculator function for QR scanning - * box, the value or computed value should be smaller than the width and - * height of the full region. - * - * This would make the scanner look like this: - * ---------------------- - * |********************| - * |******,,,,,,,,,*****| <--- shaded region - * |******| |*****| <--- non shaded region would be - * |******| |*****| used for QR code scanning. - * |******|_______|*****| - * |********************| - * |********************| - * ---------------------- - * - * Instance of {@link QrDimensions} can be passed to construct a non - * square rendering of scanner box. You can also pass in a function of type - * {@link QrDimensionFunction} that takes in the width and height of the - * video stream and return QR box size of type {@link QrDimensions}. - * - * If this value is not set, no shaded QR box will be rendered and the - * scanner will scan the entire area of video stream. - */ - qrbox?: number | QrDimensions | QrDimensionFunction | undefined; - - /** - * Optional, Desired aspect ratio for the video feed. Ideal aspect ratios - * are 4:3 or 16:9. Passing very wrong aspect ratio could lead to video feed - * not showing up. - */ - aspectRatio?: number | undefined; - - /** - * Optional, if `true` flipped QR Code won't be scanned. Only use this - * if you are sure the camera cannot give mirrored feed if you are facing - * performance constraints. - */ - disableFlip?: boolean | undefined; - - /** - * Optional, @beta(this config is not well supported yet). - * - * Important: When passed this will override other parameters like - * 'cameraIdOrConfig' or configurations like 'aspectRatio'. - * 'videoConstraints' should be of type {@link MediaTrackConstraints} as - * defined in - * https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints - * and is used to specify a variety of video or camera controls like: - * aspectRatio, facingMode, frameRate, etc. - */ - videoConstraints?: MediaTrackConstraints | undefined; -} - -/** - * Internal implementation of {@link Html5QrcodeConfig} with util & factory - * methods. - * - * @hidden - */ -class InternalHtml5QrcodeConfig implements Html5QrcodeCameraScanConfig { - - public readonly fps: number; - public readonly disableFlip: boolean; - public readonly qrbox: number | QrDimensions | QrDimensionFunction | undefined; - public readonly aspectRatio: number | undefined; - public readonly videoConstraints: MediaTrackConstraints | undefined; - - private logger: Logger; - - private constructor( - config: Html5QrcodeCameraScanConfig | undefined, - logger: Logger) { - this.logger = logger; - - this.fps = Constants.SCAN_DEFAULT_FPS; - if (!config) { - this.disableFlip = Constants.DEFAULT_DISABLE_FLIP; - } else { - if (config.fps) { - this.fps = config.fps; - } - this.disableFlip = config.disableFlip === true; - this.qrbox = config.qrbox; - this.aspectRatio = config.aspectRatio; - this.videoConstraints = config.videoConstraints; - } - } - - public isMediaStreamConstraintsValid(): boolean { - if (!this.videoConstraints) { - this.logger.logError( - "Empty videoConstraints", /* experimental= */ true); - return false; - } - - return VideoConstraintsUtil.isMediaStreamConstraintsValid( - this.videoConstraints, this.logger); - } - - public isShadedBoxEnabled(): boolean { - return !isNullOrUndefined(this.qrbox); - } - - /** - * Create instance of {@link Html5QrcodeCameraScanConfig}. - * - * Create configuration by merging default and input settings. - */ - static create(config: Html5QrcodeCameraScanConfig | undefined, logger: Logger) - : InternalHtml5QrcodeConfig { - return new InternalHtml5QrcodeConfig(config, logger); - } -} - -/** @hidden */ -interface QrcodeRegionBounds { - x: number, - y: number, - width: number, - height: number -} - -/** - * Low level APIs for building web based QR and Barcode Scanner. - * - * Supports APIs for camera as well as file based scanning. - * - * Depending of the configuration, the class will help render code - * scanning UI on the provided parent HTML container. - */ -export class Html5Qrcode { - - //#region Private fields. - private readonly logger: Logger; - private readonly elementId: string; - private readonly verbose: boolean; - private readonly qrcode: RobustQrcodeDecoderAsync; - - private shouldScan: boolean; - - // Nullable elements - // TODO(mebjas): Reduce the state-fulness of this mammoth class, by splitting - // into independent classes for better separation of concerns and reducing - // error prone nature of a large stateful class. - private element: HTMLElement | null = null; - private canvasElement: HTMLCanvasElement | null = null; - private scannerPausedUiElement: HTMLDivElement | null = null; - private hasBorderShaders: boolean | null = null; - private borderShaders: Array | null = null; - private qrMatch: boolean | null = null; - private renderedCamera: RenderedCamera | null = null; - - private foreverScanTimeout: any; - private qrRegion: QrcodeRegionBounds | null = null; - private context: CanvasRenderingContext2D | null = null; - private lastScanImageFile: string | null = null; - //#endregion - - private stateManagerProxy: StateManagerProxy; - - // TODO(mebjas): deprecate this. - /** @hidden */ - public isScanning: boolean = false; - - /** - * Initialize the code scanner. - * - * @param elementId Id of the HTML element. - * @param configOrVerbosityFlag optional, config object of type {@link - * Html5QrcodeFullConfig} or a boolean verbosity flag (to maintain backward - * compatibility). If nothing is passed, default values would be used. - * If a boolean value is used, it'll be used to set verbosity. Pass a - * config value to configure the Html5Qrcode scanner as per needs. - * - * Use of `configOrVerbosityFlag` as a boolean value is being - * deprecated since version 2.0.7. - * - * TODO(mebjas): Deprecate the verbosity boolean flag completely. - */ - public constructor(elementId: string, - configOrVerbosityFlag?: boolean | Html5QrcodeFullConfig | undefined) { - if (!document.getElementById(elementId)) { - throw `HTML Element with id=${elementId} not found`; - } - - this.elementId = elementId; - this.verbose = false; - - let experimentalFeatureConfig : ExperimentalFeaturesConfig | undefined; - let configObject: Html5QrcodeFullConfig | undefined; - if (typeof configOrVerbosityFlag == "boolean") { - this.verbose = configOrVerbosityFlag === true; - } else if (configOrVerbosityFlag) { - configObject = configOrVerbosityFlag; - this.verbose = configObject.verbose === true; - experimentalFeatureConfig = configObject.experimentalFeatures; - } - - this.logger = new BaseLoggger(this.verbose); - this.qrcode = new Html5QrcodeShim( - this.getSupportedFormats(configOrVerbosityFlag), - this.getUseBarCodeDetectorIfSupported(configObject), - this.verbose, - this.logger); - - this.foreverScanTimeout; - this.shouldScan = true; - this.stateManagerProxy = StateManagerFactory.create(); - } - - //#region start() - /** - * Start scanning QR codes or bar codes for a given camera. - * - * @param cameraIdOrConfig Identifier of the camera, it can either be the - * camera id retrieved from {@link Html5Qrcode#getCameras()} method or - * object with facing mode constraint. - * @param configuration Extra configurations to tune the code scanner. - * @param qrCodeSuccessCallback Callback called when an instance of a QR - * code or any other supported bar code is found. - * @param qrCodeErrorCallback Callback called in cases where no instance of - * QR code or any other supported bar code is found. - * - * @returns Promise for starting the scan. The Promise can fail if the user - * doesn't grant permission or some API is not supported by the browser. - */ - public start( - cameraIdOrConfig: string | MediaTrackConstraints, - configuration: Html5QrcodeCameraScanConfig | undefined, - qrCodeSuccessCallback: QrcodeSuccessCallback | undefined, - qrCodeErrorCallback: QrcodeErrorCallback | undefined, - ): Promise { - - // Code will be consumed as javascript. - if (!cameraIdOrConfig) { - throw "cameraIdOrConfig is required"; - } - - if (!qrCodeSuccessCallback - || typeof qrCodeSuccessCallback != "function") { - throw "qrCodeSuccessCallback is required and should be a function."; - } - - let qrCodeErrorCallbackInternal: QrcodeErrorCallback; - if (qrCodeErrorCallback) { - qrCodeErrorCallbackInternal = qrCodeErrorCallback; - } else { - qrCodeErrorCallbackInternal - = this.verbose ? this.logger.log : () => {}; - } - - const internalConfig = InternalHtml5QrcodeConfig.create( - configuration, this.logger); - this.clearElement(); - - // Check if videoConstraints is passed and valid - let videoConstraintsAvailableAndValid = false; - if (internalConfig.videoConstraints) { - if (!internalConfig.isMediaStreamConstraintsValid()) { - this.logger.logError( - "'videoConstraints' is not valid 'MediaStreamConstraints, " - + "it will be ignored.'", - /* experimental= */ true); - } else { - videoConstraintsAvailableAndValid = true; - } - } - const areVideoConstraintsEnabled = videoConstraintsAvailableAndValid; - - // qr shaded box - const element = document.getElementById(this.elementId)!; - const rootElementWidth = element.clientWidth - ? element.clientWidth : Constants.DEFAULT_WIDTH; - element.style.position = "relative"; - - this.shouldScan = true; - this.element = element; - - const $this = this; - const toScanningStateChangeTransaction: StateManagerTransaction - = this.stateManagerProxy.startTransition( - Html5QrcodeScannerState.SCANNING); - return new Promise((resolve, reject) => { - const videoConstraints = areVideoConstraintsEnabled - ? internalConfig.videoConstraints - : $this.createVideoConstraints(cameraIdOrConfig); - if (!videoConstraints) { - toScanningStateChangeTransaction.cancel(); - reject("videoConstraints should be defined"); - return; - } - - let cameraRenderingOptions: CameraRenderingOptions = {}; - if (!areVideoConstraintsEnabled || internalConfig.aspectRatio) { - cameraRenderingOptions.aspectRatio = internalConfig.aspectRatio; - } - - let renderingCallbacks: RenderingCallbacks = { - onRenderSurfaceReady: (viewfinderWidth, viewfinderHeight) => { - $this.setupUi( - viewfinderWidth, viewfinderHeight, internalConfig); - - $this.isScanning = true; - $this.foreverScan( - internalConfig, - qrCodeSuccessCallback, - qrCodeErrorCallbackInternal!); - } - }; - - - // TODO(minhazav): Flatten this flow. - CameraFactory.failIfNotSupported().then((factory) => { - factory.create(videoConstraints).then((camera) => { - return camera.render( - this.element!, cameraRenderingOptions, renderingCallbacks) - .then((renderedCamera) => { - $this.renderedCamera = renderedCamera; - toScanningStateChangeTransaction.execute(); - resolve(/* Void */ null); - }) - .catch((error) => { - toScanningStateChangeTransaction.cancel(); - reject(error); - }); - }).catch((error) => { - toScanningStateChangeTransaction.cancel(); - reject(Html5QrcodeStrings.errorGettingUserMedia(error)); - }); - }).catch((_) => { - toScanningStateChangeTransaction.cancel(); - reject(Html5QrcodeStrings.cameraStreamingNotSupported()); - }); - }); - } - //#endregion - - //#region Other state related public APIs - /** - * Pauses the ongoing scan. - * - * @param shouldPauseVideo (Optional, default = false) If true the - * video will be paused. - * - * @throws error if method is called when scanner is not in scanning state. - */ - public pause(shouldPauseVideo?: boolean) { - if (!this.stateManagerProxy.isStrictlyScanning()) { - throw "Cannot pause, scanner is not scanning."; - } - this.stateManagerProxy.directTransition(Html5QrcodeScannerState.PAUSED); - this.showPausedState(); - - if (isNullOrUndefined(shouldPauseVideo) || shouldPauseVideo !== true) { - shouldPauseVideo = false; - } - - if (shouldPauseVideo && this.renderedCamera) { - this.renderedCamera.pause(); - } - } - - /** - * Resumes the paused scan. - * - * If the video was previously paused by setting `shouldPauseVideo`` - * to `true` in {@link Html5Qrcode#pause(shouldPauseVideo)}, calling - * this method will resume the video. - * - * Note: with this caller will start getting results in success and error - * callbacks. - * - * @throws error if method is called when scanner is not in paused state. - */ - public resume() { - if (!this.stateManagerProxy.isPaused()) { - throw "Cannot result, scanner is not paused."; - } - - if (!this.renderedCamera) { - throw "renderedCamera doesn't exist while trying resume()"; - } - - const $this = this; - const transitionToScanning = () => { - $this.stateManagerProxy.directTransition( - Html5QrcodeScannerState.SCANNING); - $this.hidePausedState(); - } - - if (!this.renderedCamera.isPaused()) { - transitionToScanning(); - return; - } - this.renderedCamera.resume(() => { - // Transition state, when the video playback has resumed. - transitionToScanning(); - }); - } - - /** - * Gets state of the camera scan. - * - * @returns state of type {@link ScannerState}. - */ - public getState(): Html5QrcodeScannerState { - return this.stateManagerProxy.getState(); - } - - /** - * Stops streaming QR Code video and scanning. - * - * @returns Promise for safely closing the video stream. - */ - public stop(): Promise { - if (!this.stateManagerProxy.isScanning()) { - throw "Cannot stop, scanner is not running or paused."; - } - - const toStoppedStateTransaction: StateManagerTransaction - = this.stateManagerProxy.startTransition( - Html5QrcodeScannerState.NOT_STARTED); - - this.shouldScan = false; - if (this.foreverScanTimeout) { - clearTimeout(this.foreverScanTimeout); - } - - // Removes the shaded region if exists. - const removeQrRegion = () => { - if (!this.element) { - return; - } - let childElement = document.getElementById(Constants.SHADED_REGION_ELEMENT_ID); - if (childElement) { - this.element.removeChild(childElement); - } - }; - - let $this = this; - return this.renderedCamera!.close().then(() => { - $this.renderedCamera = null; - - if ($this.element) { - $this.element.removeChild($this.canvasElement!); - $this.canvasElement = null; - } - - removeQrRegion(); - if ($this.qrRegion) { - $this.qrRegion = null; - } - if ($this.context) { - $this.context = null; - } - - toStoppedStateTransaction.execute(); - $this.hidePausedState(); - $this.isScanning = false; - return Promise.resolve(); - }); - } - //#endregion - - //#region File scan related public APIs - /** - * Scans an Image File for QR Code. - * - * This feature is mutually exclusive to camera-based scanning, you should - * call stop() if the camera-based scanning was ongoing. - * - * @param imageFile a local file with Image content. - * @param showImage if true the Image will be rendered on given - * element. - * - * @returns Promise with decoded QR code string on success and error message - * on failure. Failure could happen due to different reasons: - * 1. QR Code decode failed because enough patterns not found in image. - * 2. Input file was not image or unable to load the image or other image - * load errors. - */ - public scanFile( - imageFile: File, /* default=true */ showImage?: boolean): Promise { - return this.scanFileV2(imageFile, showImage) - .then((html5qrcodeResult) => html5qrcodeResult.decodedText); - } - - /** - * Scans an Image File for QR Code & returns {@link Html5QrcodeResult}. - * - * This feature is mutually exclusive to camera-based scanning, you should - * call stop() if the camera-based scanning was ongoing. - * - * @param imageFile a local file with Image content. - * @param showImage if true the Image will be rendered on given - * element. - * - * @returns Promise which resolves with result of type - * {@link Html5QrcodeResult}. - * - * @beta This is a WIP method, it's available as a public method but not - * documented. - * TODO(mebjas): Replace scanFile with ScanFileV2 - */ - public scanFileV2(imageFile: File, /* default=true */ showImage?: boolean) - : Promise { - if (!imageFile || !(imageFile instanceof File)) { - throw "imageFile argument is mandatory and should be instance " - + "of File. Use 'event.target.files[0]'."; - } - - if (isNullOrUndefined(showImage)) { - showImage = true; - } - - if (!this.stateManagerProxy.canScanFile()) { - throw "Cannot start file scan - ongoing camera scan"; - } - - return new Promise((resolve, reject) => { - this.possiblyCloseLastScanImageFile(); - this.clearElement(); - this.lastScanImageFile = URL.createObjectURL(imageFile); - - const inputImage = new Image; - inputImage.onload = () => { - const imageWidth = inputImage.width; - const imageHeight = inputImage.height; - const element = document.getElementById(this.elementId)!; - const containerWidth = element.clientWidth - ? element.clientWidth : Constants.DEFAULT_WIDTH; - // No default height anymore. - const containerHeight = Math.max( - element.clientHeight ? element.clientHeight : imageHeight, - Constants.FILE_SCAN_MIN_HEIGHT); - - const config = this.computeCanvasDrawConfig( - imageWidth, imageHeight, containerWidth, containerHeight); - if (showImage) { - const visibleCanvas = this.createCanvasElement( - containerWidth, containerHeight, "qr-canvas-visible"); - visibleCanvas.style.display = "inline-block"; - element.appendChild(visibleCanvas); - const context = visibleCanvas.getContext("2d"); - if (!context) { - throw "Unable to get 2d context from canvas"; - } - context.canvas.width = containerWidth; - context.canvas.height = containerHeight; - // More reference - // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage - context.drawImage( - inputImage, - /* sx= */ 0, - /* sy= */ 0, - /* sWidth= */ imageWidth, - /* sHeight= */ imageHeight, - /* dx= */ config.x, - /* dy= */ config.y, - /* dWidth= */ config.width, - /* dHeight= */ config.height); - } - - // Hidden canvas should be at-least as big as the image. - // This could get really troublesome for large images like 12MP - // images or 48MP images captured on phone. - let padding = Constants.FILE_SCAN_HIDDEN_CANVAS_PADDING; - let hiddenImageWidth = Math.max(inputImage.width, config.width); - let hiddenImageHeight = Math.max(inputImage.height, config.height); - - let hiddenCanvasWidth = hiddenImageWidth + 2 * padding; - let hiddenCanvasHeight = hiddenImageHeight + 2 * padding; - - // Try harder for file scan. - // TODO(minhazav): Fallback to mirroring, 90 degree rotation and - // color inversion. - const hiddenCanvas = this.createCanvasElement( - hiddenCanvasWidth, hiddenCanvasHeight); - element.appendChild(hiddenCanvas); - const context = hiddenCanvas.getContext("2d"); - if (!context) { - throw "Unable to get 2d context from canvas"; - } - - context.canvas.width = hiddenCanvasWidth; - context.canvas.height = hiddenCanvasHeight; - context.drawImage( - inputImage, - /* sx= */ 0, - /* sy= */ 0, - /* sWidth= */ imageWidth, - /* sHeight= */ imageHeight, - /* dx= */ padding, - /* dy= */ padding, - /* dWidth= */ hiddenImageWidth, - /* dHeight= */ hiddenImageHeight); - try { - this.qrcode.decodeRobustlyAsync(hiddenCanvas) - .then((result) => { - resolve( - Html5QrcodeResultFactory.createFromQrcodeResult( - result)); - }) - .catch(reject); - } catch (exception) { - reject(`QR code parse error, error = ${exception}`); - } - }; - - inputImage.onerror = reject; - inputImage.onabort = reject; - inputImage.onstalled = reject; - inputImage.onsuspend = reject; - inputImage.src = URL.createObjectURL(imageFile); - }); - } - //#endregion - - /** - * Clears the existing canvas. - * - * Note: in case of ongoing web cam based scan, it needs to be explicitly - * closed before calling this method, else it will throw exception. - */ - public clear(): void { - this.clearElement(); - } - - /** - * Returns list of {@link CameraDevice} supported by the device. - * - * @returns array of camera devices on success. - */ - public static getCameras(): Promise> { - return CameraRetriever.retrieve(); - } - - /** - * Returns the capabilities of the running video track. - * - * Read more: https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack/getConstraints - * - * Important: - * 1. Must be called only if the camera based scanning is in progress. - * - * @returns capabilities of the running camera. - * @throws error if the scanning is not in running state. - */ - public getRunningTrackCapabilities(): MediaTrackCapabilities { - return this.getRenderedCameraOrFail().getRunningTrackCapabilities(); - } - - /** - * Returns the object containing the current values of each constrainable - * property of the running video track. - * - * Read more: https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack/getSettings - * - * Important: - * 1. Must be called only if the camera based scanning is in progress. - * - * @returns settings of the running media track. - * - * @throws error if the scanning is not in running state. - */ - public getRunningTrackSettings(): MediaTrackSettings { - return this.getRenderedCameraOrFail().getRunningTrackSettings(); - } - - /** - * Returns {@link CameraCapabilities} of the running video track. - * - * TODO(minhazav): Document this API, currently hidden. - * - * @returns capabilities of the running camera. - * @throws error if the scanning is not in running state. - */ - public getRunningTrackCameraCapabilities(): CameraCapabilities { - return this.getRenderedCameraOrFail().getCapabilities(); - } - - /** - * Apply a video constraints on running video track from camera. - * - * Important: - * 1. Must be called only if the camera based scanning is in progress. - * 2. Changing aspectRatio while scanner is running is not yet supported. - * - * @param {MediaTrackConstraints} specifies a variety of video or camera - * controls as defined in - * https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints - * @returns a Promise which succeeds if the passed constraints are applied, - * fails otherwise. - * @throws error if the scanning is not in running state. - */ - public applyVideoConstraints(videoConstaints: MediaTrackConstraints) - : Promise { - if (!videoConstaints) { - throw "videoConstaints is required argument."; - } else if (!VideoConstraintsUtil.isMediaStreamConstraintsValid( - videoConstaints, this.logger)) { - throw "invalid videoConstaints passed, check logs for more details"; - } - - return this.getRenderedCameraOrFail().applyVideoConstraints( - videoConstaints); - } - - //#region Private methods. - private getRenderedCameraOrFail() { - if (this.renderedCamera == null) { - throw "Scanning is not in running state, call this API only when" - + " QR code scanning using camera is in running state."; - } - return this.renderedCamera!; - } - - /** - * Construct list of supported formats and returns based on input args. - * `configOrVerbosityFlag` optional, config object of type {@link - * Html5QrcodeFullConfig} or a boolean verbosity flag (to maintain backward - * compatibility). If nothing is passed, default values would be used. - * If a boolean value is used, it'll be used to set verbosity. Pass a - * config value to configure the Html5Qrcode scanner as per needs. - * - * Use of `configOrVerbosityFlag` as a boolean value is being - * deprecated since version 2.0.7. - * - * TODO(mebjas): Deprecate the verbosity boolean flag completely. - */ - private getSupportedFormats( - configOrVerbosityFlag: boolean | Html5QrcodeFullConfig | undefined) - : Array { - const allFormats: Array = [ - Html5QrcodeSupportedFormats.QR_CODE, - Html5QrcodeSupportedFormats.AZTEC, - Html5QrcodeSupportedFormats.CODABAR, - Html5QrcodeSupportedFormats.CODE_39, - Html5QrcodeSupportedFormats.CODE_93, - Html5QrcodeSupportedFormats.CODE_128, - Html5QrcodeSupportedFormats.DATA_MATRIX, - Html5QrcodeSupportedFormats.MAXICODE, - Html5QrcodeSupportedFormats.ITF, - Html5QrcodeSupportedFormats.EAN_13, - Html5QrcodeSupportedFormats.EAN_8, - Html5QrcodeSupportedFormats.PDF_417, - Html5QrcodeSupportedFormats.RSS_14, - Html5QrcodeSupportedFormats.RSS_EXPANDED, - Html5QrcodeSupportedFormats.UPC_A, - Html5QrcodeSupportedFormats.UPC_E, - Html5QrcodeSupportedFormats.UPC_EAN_EXTENSION, - ]; - - if (!configOrVerbosityFlag - || typeof configOrVerbosityFlag == "boolean") { - return allFormats; - } - - if (!configOrVerbosityFlag.formatsToSupport) { - return allFormats; - } - - if (!Array.isArray(configOrVerbosityFlag.formatsToSupport)) { - throw "configOrVerbosityFlag.formatsToSupport should be undefined " - + "or an array."; - } - - if (configOrVerbosityFlag.formatsToSupport.length === 0) { - throw "Atleast 1 formatsToSupport is needed."; - } - - const supportedFormats: Array = []; - for (const format of configOrVerbosityFlag.formatsToSupport) { - if (isValidHtml5QrcodeSupportedFormats(format)) { - supportedFormats.push(format); - } else { - this.logger.warn( - `Invalid format: ${format} passed in config, ignoring.`); - } - } - - if (supportedFormats.length === 0) { - throw "None of formatsToSupport match supported values."; - } - return supportedFormats; - - } - - /** - * Returns `true` if `useBarCodeDetectorIfSupported` is - * enabled in the config. - */ - /*eslint complexity: ["error", 10]*/ - private getUseBarCodeDetectorIfSupported( - config: Html5QrcodeConfigs | undefined) : boolean { - // Default value is true. - if (isNullOrUndefined(config)) { - return true; - } - - if (!isNullOrUndefined(config!.useBarCodeDetectorIfSupported)) { - // Default value is false. - return config!.useBarCodeDetectorIfSupported !== false; - } - - if (isNullOrUndefined(config!.experimentalFeatures)) { - return true; - } - - let experimentalFeatures = config!.experimentalFeatures!; - if (isNullOrUndefined( - experimentalFeatures.useBarCodeDetectorIfSupported)) { - return true; - } - - return experimentalFeatures.useBarCodeDetectorIfSupported !== false; - } - - /** - * Validates if the passed config for qrbox is correct. - */ - private validateQrboxSize( - viewfinderWidth: number, - viewfinderHeight: number, - internalConfig: InternalHtml5QrcodeConfig) { - const qrboxSize = internalConfig.qrbox!; - this.validateQrboxConfig(qrboxSize); - let qrDimensions = this.toQrdimensions( - viewfinderWidth, viewfinderHeight, qrboxSize); - - const validateMinSize = (size: number) => { - if (size < Constants.MIN_QR_BOX_SIZE) { - throw "minimum size of 'config.qrbox' dimension value is" - + ` ${Constants.MIN_QR_BOX_SIZE}px.`; - } - }; - - /** - * The 'config.qrbox.width' shall be overriden if it's larger than the - * width of the root element. - * - * Based on the verbosity settings, this will be logged to the logger. - * - * @param configWidth the width of qrbox set by users in the config. - */ - const correctWidthBasedOnRootElementSize = (configWidth: number) => { - if (configWidth > viewfinderWidth) { - this.logger.warn("`qrbox.width` or `qrbox` is larger than the" - + " width of the root element. The width will be truncated" - + " to the width of root element."); - configWidth = viewfinderWidth; - } - return configWidth; - }; - - validateMinSize(qrDimensions.width); - validateMinSize(qrDimensions.height); - qrDimensions.width = correctWidthBasedOnRootElementSize( - qrDimensions.width); - // Note: In this case if the height of the qrboxSize turns out to be - // greater than the height of the root element (which should later be - // based on the aspect ratio of the camera stream), it would be silently - // ignored with a warning. - } - - /** - * Validates if the `qrboxSize` is a valid value. - * - * It's expected to be either a number or of type {@link QrDimensions}. - */ - private validateQrboxConfig( - qrboxSize: number | QrDimensions | QrDimensionFunction) { - if (typeof qrboxSize === "number") { - return; - } - - if (typeof qrboxSize === "function") { - // This is a valid format. - return; - } - - // Alternatively, the config is expected to be of type QrDimensions. - if (qrboxSize.width === undefined || qrboxSize.height === undefined) { - throw "Invalid instance of QrDimensions passed for " - + "'config.qrbox'. Both 'width' and 'height' should be set."; - } - } - - /** - * Possibly converts `qrboxSize` to an object of type - * {@link QrDimensions}. - */ - private toQrdimensions( - viewfinderWidth: number, - viewfinderHeight: number, - qrboxSize: number | QrDimensions | QrDimensionFunction): QrDimensions { - if (typeof qrboxSize === "number") { - return { width: qrboxSize, height: qrboxSize}; - } else if (typeof qrboxSize === "function") { - try { - return qrboxSize(viewfinderWidth, viewfinderHeight); - } catch (error) { - throw new Error( - "qrbox config was passed as a function but it failed with " - + "unknown error" + error); - } - } - return qrboxSize; - } - - //#region Documented private methods for camera based scanner. - /** - * Setups the UI elements, changes the state of this class. - * - * @param viewfinderWidth derived width of viewfinder. - * @param viewfinderHeight derived height of viewfinder. - */ - private setupUi( - viewfinderWidth: number, - viewfinderHeight: number, - internalConfig: InternalHtml5QrcodeConfig): void { - // Validate before insertion - if (internalConfig.isShadedBoxEnabled()) { - this.validateQrboxSize( - viewfinderWidth, viewfinderHeight, internalConfig); - } - - // If `qrbox` size is not set, it will default to the dimensions of the - // viewfinder. - const qrboxSize = isNullOrUndefined(internalConfig.qrbox) ? - {width: viewfinderWidth, height: viewfinderHeight}: internalConfig.qrbox!; - - this.validateQrboxConfig(qrboxSize); - let qrDimensions = this.toQrdimensions(viewfinderWidth, viewfinderHeight, qrboxSize); - if (qrDimensions.height > viewfinderHeight) { - this.logger.warn("[Html5Qrcode] config.qrbox has height that is" - + "greater than the height of the video stream. Shading will be" - + " ignored"); - } - - const shouldShadingBeApplied - = internalConfig.isShadedBoxEnabled() - && qrDimensions.height <= viewfinderHeight; - const defaultQrRegion: QrcodeRegionBounds = { - x: 0, - y: 0, - width: viewfinderWidth, - height: viewfinderHeight - }; - - const qrRegion = shouldShadingBeApplied - ? this.getShadedRegionBounds(viewfinderWidth, viewfinderHeight, qrDimensions) - : defaultQrRegion; - - const canvasElement = this.createCanvasElement( - qrRegion.width, qrRegion.height); - // Tell user agent that this canvas will be read frequently. - // More info: - // https://html.spec.whatwg.org/multipage/canvas.html#concept-canvas-will-read-frequently - const contextAttributes: any = { willReadFrequently: true }; - // Casting canvas to any, as Microsoft's interface definition hasn't - // caught up with latest definition for 'CanvasRenderingContext2DSettings'. - const context: CanvasRenderingContext2D - = (canvasElement).getContext("2d", contextAttributes)!; - context.canvas.width = qrRegion.width; - context.canvas.height = qrRegion.height; - - // Insert the canvas - this.element!.append(canvasElement); - if (shouldShadingBeApplied) { - this.possiblyInsertShadingElement( - this.element!, viewfinderWidth, viewfinderHeight, qrDimensions); - } - - this.createScannerPausedUiElement(this.element!); - - // Update local states - this.qrRegion = qrRegion; - this.context = context; - this.canvasElement = canvasElement; - } - - // TODO(mebjas): Convert this to a standard message viewer. - private createScannerPausedUiElement(rootElement: HTMLElement) { - const scannerPausedUiElement = document.createElement("div"); - scannerPausedUiElement.innerText = Html5QrcodeStrings.scannerPaused(); - scannerPausedUiElement.style.display = "none"; - scannerPausedUiElement.style.position = "absolute"; - scannerPausedUiElement.style.top = "0px"; - scannerPausedUiElement.style.zIndex = "1"; - scannerPausedUiElement.style.background = "rgba(9, 9, 9, 0.46)"; - scannerPausedUiElement.style.color = "#FFECEC"; - scannerPausedUiElement.style.textAlign = "center"; - scannerPausedUiElement.style.width = "100%"; - rootElement.appendChild(scannerPausedUiElement); - this.scannerPausedUiElement = scannerPausedUiElement; - } - - /** - * Scans current context using the qrcode library. - * - *

    This method call would result in callback being triggered by the - * qrcode library. This method also handles the border coloring. - * - * @returns true if scan match is found, false otherwise. - */ - private scanContext( - qrCodeSuccessCallback: QrcodeSuccessCallback, - qrCodeErrorCallback: QrcodeErrorCallback - ): Promise { - if (this.stateManagerProxy.isPaused()) { - return Promise.resolve(false); - } - - return this.qrcode.decodeAsync(this.canvasElement!) - .then((result) => { - qrCodeSuccessCallback( - result.text, - Html5QrcodeResultFactory.createFromQrcodeResult( - result)); - this.possiblyUpdateShaders(/* qrMatch= */ true); - return true; - }).catch((error) => { - this.possiblyUpdateShaders(/* qrMatch= */ false); - let errorMessage = Html5QrcodeStrings.codeParseError(error); - qrCodeErrorCallback( - errorMessage, Html5QrcodeErrorFactory.createFrom(errorMessage)); - return false; - }); - } - - /** - * Forever scanning method. - */ - private foreverScan( - internalConfig: InternalHtml5QrcodeConfig, - qrCodeSuccessCallback: QrcodeSuccessCallback, - qrCodeErrorCallback: QrcodeErrorCallback) { - if (!this.shouldScan) { - // Stop scanning. - return; - } - - if (!this.renderedCamera) { - return; - } - // There is difference in size of rendered video and one that is - // considered by the canvas. Need to account for scaling factor. - const videoElement = this.renderedCamera!.getSurface(); - const widthRatio - = videoElement.videoWidth / videoElement.clientWidth; - const heightRatio - = videoElement.videoHeight / videoElement.clientHeight; - - if (!this.qrRegion) { - throw "qrRegion undefined when localMediaStream is ready."; - } - const sWidthOffset = this.qrRegion.width * widthRatio; - const sHeightOffset = this.qrRegion.height * heightRatio; - const sxOffset = this.qrRegion.x * widthRatio; - const syOffset = this.qrRegion.y * heightRatio; - - // Only decode the relevant area, ignore the shaded area, - // More reference: - // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage - this.context!.drawImage( - videoElement, - /* sx= */ sxOffset, - /* sy= */ syOffset, - /* sWidth= */ sWidthOffset, - /* sHeight= */ sHeightOffset, - /* dx= */ 0, - /* dy= */ 0, - /* dWidth= */ this.qrRegion.width, - /* dHeight= */ this.qrRegion.height); - - const triggerNextScan = () => { - this.foreverScanTimeout = setTimeout(() => { - this.foreverScan( - internalConfig, qrCodeSuccessCallback, qrCodeErrorCallback); - }, this.getTimeoutFps(internalConfig.fps)); - }; - - // Try scanning normal frame and in case of failure, scan - // the inverted context if not explictly disabled. - // TODO(mebjas): Move this logic to decoding library. - this.scanContext(qrCodeSuccessCallback, qrCodeErrorCallback) - .then((isSuccessfull) => { - // Previous scan failed and disableFlip is off. - if (!isSuccessfull && internalConfig.disableFlip !== true) { - this.context!.translate(this.context!.canvas.width, 0); - this.context!.scale(-1, 1); - this.scanContext(qrCodeSuccessCallback, qrCodeErrorCallback) - .finally(() => { - triggerNextScan(); - }); - } else { - triggerNextScan(); - } - }).catch((error) => { - this.logger.logError( - "Error happend while scanning context", error); - triggerNextScan(); - }); - } - - private createVideoConstraints( - cameraIdOrConfig: string | MediaTrackConstraints) - : MediaTrackConstraints | undefined { - if (typeof cameraIdOrConfig == "string") { - // If it's a string it should be camera device Id. - return { deviceId: { exact: cameraIdOrConfig } }; - } else if (typeof cameraIdOrConfig == "object") { - const facingModeKey = "facingMode"; - const deviceIdKey = "deviceId"; - const allowedFacingModeValues - = { "user" : true, "environment" : true}; - const exactKey = "exact"; - const isValidFacingModeValue = (value: string) => { - if (value in allowedFacingModeValues) { - // Valid config - return true; - } else { - // Invalid config - throw "config has invalid 'facingMode' value = " - + `'${value}'`; - } - }; - - const keys = Object.keys(cameraIdOrConfig); - if (keys.length !== 1) { - throw "'cameraIdOrConfig' object should have exactly 1 key," - + ` if passed as an object, found ${keys.length} keys`; - } - - const key:string = Object.keys(cameraIdOrConfig)[0]; - if (key !== facingModeKey && key !== deviceIdKey) { - throw `Only '${facingModeKey}' and '${deviceIdKey}' ` - + " are supported for 'cameraIdOrConfig'"; - } - - if (key === facingModeKey) { - /** - * Supported scenarios: - * - { facingMode: "user" } - * - { facingMode: "environment" } - * - { facingMode: { exact: "environment" } } - * - { facingMode: { exact: "user" } } - */ - const facingMode: any = cameraIdOrConfig.facingMode; - if (typeof facingMode == "string") { - if (isValidFacingModeValue(facingMode)) { - return { facingMode: facingMode }; - } - } else if (typeof facingMode == "object") { - if (exactKey in facingMode) { - if (isValidFacingModeValue(facingMode[`${exactKey}`])) { - return { - facingMode: { - exact: facingMode[`${exactKey}`] - } - }; - } - } else { - throw "'facingMode' should be string or object with" - + ` ${exactKey} as key.`; - } - } else { - const type = (typeof facingMode); - throw `Invalid type of 'facingMode' = ${type}`; - } - } else { - /** - * key == deviceIdKey; Supported scenarios: - * - { deviceId: { exact: "a76afe74e95e3.....38627b3bde" } - * - { deviceId: "a76afe74e95e3....065c9cd89438627b3bde" } - */ - const deviceId: any = cameraIdOrConfig.deviceId; - if (typeof deviceId == "string") { - return { deviceId: deviceId }; - } else if (typeof deviceId == "object") { - if (exactKey in deviceId) { - return { - deviceId : { exact: deviceId[`${exactKey}`] } - }; - } else { - throw "'deviceId' should be string or object with" - + ` ${exactKey} as key.`; - } - } else { - const type = (typeof deviceId); - throw `Invalid type of 'deviceId' = ${type}`; - } - } - } - - - // invalid type - const type = (typeof cameraIdOrConfig); - throw `Invalid type of 'cameraIdOrConfig' = ${type}`; - } - //#endregion - - //#region Documented private methods for file based scanner. - private computeCanvasDrawConfig( - imageWidth: number, - imageHeight: number, - containerWidth: number, - containerHeight: number): QrcodeRegionBounds { - - if (imageWidth <= containerWidth - && imageHeight <= containerHeight) { - // no downsampling needed. - const xoffset = (containerWidth - imageWidth) / 2; - const yoffset = (containerHeight - imageHeight) / 2; - return { - x: xoffset, - y: yoffset, - width: imageWidth, - height: imageHeight - }; - } else { - const formerImageWidth = imageWidth; - const formerImageHeight = imageHeight; - if (imageWidth > containerWidth) { - imageHeight = (containerWidth / imageWidth) * imageHeight; - imageWidth = containerWidth; - } - - if (imageHeight > containerHeight) { - imageWidth = (containerHeight / imageHeight) * imageWidth; - imageHeight = containerHeight; - } - - this.logger.log( - "Image downsampled from " - + `${formerImageWidth}X${formerImageHeight}` - + ` to ${imageWidth}X${imageHeight}.`); - - return this.computeCanvasDrawConfig( - imageWidth, imageHeight, containerWidth, containerHeight); - } - } - //#endregion - - private clearElement(): void { - if (this.stateManagerProxy.isScanning()) { - throw "Cannot clear while scan is ongoing, close it first."; - } - const element = document.getElementById(this.elementId); - if (element) { - element.innerHTML = ""; - } - } - - private possiblyUpdateShaders(qrMatch: boolean) { - if (this.qrMatch === qrMatch) { - return; - } - - if (this.hasBorderShaders - && this.borderShaders - && this.borderShaders.length) { - this.borderShaders.forEach((shader) => { - shader.style.backgroundColor = qrMatch - ? Constants.BORDER_SHADER_MATCH_COLOR - : Constants.BORDER_SHADER_DEFAULT_COLOR; - }); - } - this.qrMatch = qrMatch; - } - - private possiblyCloseLastScanImageFile() { - if (this.lastScanImageFile) { - URL.revokeObjectURL(this.lastScanImageFile); - this.lastScanImageFile = null; - } - } - - private createCanvasElement( - width: number, height: number, customId?: string): HTMLCanvasElement { - const canvasWidth = width; - const canvasHeight = height; - const canvasElement = document.createElement("canvas"); - canvasElement.style.width = `${canvasWidth}px`; - canvasElement.style.height = `${canvasHeight}px`; - canvasElement.style.display = "none"; - canvasElement.id = isNullOrUndefined(customId) - ? "qr-canvas" : customId!; - return canvasElement; - } - - private getShadedRegionBounds( - width: number, height: number, qrboxSize: QrDimensions) - : QrcodeRegionBounds { - if (qrboxSize.width > width || qrboxSize.height > height) { - throw "'config.qrbox' dimensions should not be greater than the " - + "dimensions of the root HTML element."; - } - - return { - x: (width - qrboxSize.width) / 2, - y: (height - qrboxSize.height) / 2, - width: qrboxSize.width, - height: qrboxSize.height - }; - } - - private possiblyInsertShadingElement( - element: HTMLElement, - width: number, - height: number, - qrboxSize: QrDimensions) { - if ((width - qrboxSize.width) < 1 || (height - qrboxSize.height) < 1) { - return; - } - const shadingElement = document.createElement("div"); - shadingElement.style.position = "absolute"; - - const rightLeftBorderSize = (width - qrboxSize.width) / 2; - const topBottomBorderSize = (height - qrboxSize.height) / 2; - - shadingElement.style.borderLeft - = `${rightLeftBorderSize}px solid rgba(0, 0, 0, 0.48)`; - shadingElement.style.borderRight - = `${rightLeftBorderSize}px solid rgba(0, 0, 0, 0.48)`; - shadingElement.style.borderTop - = `${topBottomBorderSize}px solid rgba(0, 0, 0, 0.48)`; - shadingElement.style.borderBottom - = `${topBottomBorderSize}px solid rgba(0, 0, 0, 0.48)`; - shadingElement.style.boxSizing = "border-box"; - shadingElement.style.top = "0px"; - shadingElement.style.bottom = "0px"; - shadingElement.style.left = "0px"; - shadingElement.style.right = "0px"; - shadingElement.id = `${Constants.SHADED_REGION_ELEMENT_ID}`; - - // Check if div is too small for shadows. As there are two 5px width - // borders the needs to have a size above 10px. - if ((width - qrboxSize.width) < 11 - || (height - qrboxSize.height) < 11) { - this.hasBorderShaders = false; - } else { - const smallSize = 5; - const largeSize = 40; - this.insertShaderBorders( - shadingElement, - /* width= */ largeSize, - /* height= */ smallSize, - /* top= */ -smallSize, - /* bottom= */ null, - /* side= */ 0, - /* isLeft= */ true); - this.insertShaderBorders( - shadingElement, - /* width= */ largeSize, - /* height= */ smallSize, - /* top= */ -smallSize, - /* bottom= */ null, - /* side= */ 0, - /* isLeft= */ false); - this.insertShaderBorders( - shadingElement, - /* width= */ largeSize, - /* height= */ smallSize, - /* top= */ null, - /* bottom= */ -smallSize, - /* side= */ 0, - /* isLeft= */ true); - this.insertShaderBorders( - shadingElement, - /* width= */ largeSize, - /* height= */ smallSize, - /* top= */ null, - /* bottom= */ -smallSize, - /* side= */ 0, - /* isLeft= */ false); - this.insertShaderBorders( - shadingElement, - /* width= */ smallSize, - /* height= */ largeSize + smallSize, - /* top= */ -smallSize, - /* bottom= */ null, - /* side= */ -smallSize, - /* isLeft= */ true); - this.insertShaderBorders( - shadingElement, - /* width= */ smallSize, - /* height= */ largeSize + smallSize, - /* top= */ null, - /* bottom= */ -smallSize, - /* side= */ -smallSize, - /* isLeft= */ true); - this.insertShaderBorders( - shadingElement, - /* width= */ smallSize, - /* height= */ largeSize + smallSize, - /* top= */ -smallSize, - /* bottom= */ null, - /* side= */ -smallSize, - /* isLeft= */ false); - this.insertShaderBorders( - shadingElement, - /* width= */ smallSize, - /* height= */ largeSize + smallSize, - /* top= */ null, - /* bottom= */ -smallSize, - /* side= */ -smallSize, - /* isLeft= */ false); - this.hasBorderShaders = true; - } - element.append(shadingElement); - } - - private insertShaderBorders( - shaderElem: HTMLDivElement, - width: number, - height: number, - top: number | null, - bottom: number | null, - side: number, - isLeft: boolean) { - const elem = document.createElement("div"); - elem.style.position = "absolute"; - elem.style.backgroundColor = Constants.BORDER_SHADER_DEFAULT_COLOR; - elem.style.width = `${width}px`; - elem.style.height = `${height}px`; - if (top !== null) { - elem.style.top = `${top}px`; - } - if (bottom !== null) { - elem.style.bottom = `${bottom}px`; - } - if (isLeft) { - elem.style.left = `${side}px`; - } else { - elem.style.right = `${side}px`; - } - if (!this.borderShaders) { - this.borderShaders = []; - } - this.borderShaders.push(elem); - shaderElem.appendChild(elem); - } - - private showPausedState() { - if (!this.scannerPausedUiElement) { - throw "[internal error] scanner paused UI element not found"; - } - this.scannerPausedUiElement.style.display = "block"; - } - - private hidePausedState() { - if (!this.scannerPausedUiElement) { - throw "[internal error] scanner paused UI element not found"; - } - this.scannerPausedUiElement.style.display = "none"; - } - - private getTimeoutFps(fps: number) { - return 1000 / fps; - } - //#endregion -} diff --git a/node_modules/html5-qrcode/src/image-assets.d.ts b/node_modules/html5-qrcode/src/image-assets.d.ts deleted file mode 100644 index 59387ac..0000000 --- a/node_modules/html5-qrcode/src/image-assets.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export declare const ASSET_CAMERA_SCAN: string; -export declare const ASSET_FILE_SCAN: string; -export declare const ASSET_INFO_ICON_16PX: string; -export declare const ASSET_CLOSE_ICON_16PX: string; diff --git a/node_modules/html5-qrcode/src/image-assets.ts b/node_modules/html5-qrcode/src/image-assets.ts deleted file mode 100644 index a27a673..0000000 --- a/node_modules/html5-qrcode/src/image-assets.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * @fileoverview - Exports base64 assets for gif images. - * - * @author mebjas - * - * The word "QR Code" is registered trademark of DENSO WAVE INCORPORATED - * http://www.denso-wave.com/qrcode/faqpatent-e.html - */ - -const SVG_XML_PREFIX = "data:image/svg+xml;base64,"; - -export const ASSET_CAMERA_SCAN: string = SVG_XML_PREFIX + "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzNzEuNjQzIDM3MS42NDMiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDM3MS42NDMgMzcxLjY0MyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBhdGggZD0iTTEwNS4wODQgMzguMjcxaDE2My43Njh2MjBIMTA1LjA4NHoiLz48cGF0aCBkPSJNMzExLjU5NiAxOTAuMTg5Yy03LjQ0MS05LjM0Ny0xOC40MDMtMTYuMjA2LTMyLjc0My0yMC41MjJWMzBjMC0xNi41NDItMTMuNDU4LTMwLTMwLTMwSDEyNS4wODRjLTE2LjU0MiAwLTMwIDEzLjQ1OC0zMCAzMHYxMjAuMTQzaC04LjI5NmMtMTYuNTQyIDAtMzAgMTMuNDU4LTMwIDMwdjEuMzMzYTI5LjgwNCAyOS44MDQgMCAwIDAgNC42MDMgMTUuOTM5Yy03LjM0IDUuNDc0LTEyLjEwMyAxNC4yMjEtMTIuMTAzIDI0LjA2MXYxLjMzM2MwIDkuODQgNC43NjMgMTguNTg3IDEyLjEwMyAyNC4wNjJhMjkuODEgMjkuODEgMCAwIDAtNC42MDMgMTUuOTM4djEuMzMzYzAgMTYuNTQyIDEzLjQ1OCAzMCAzMCAzMGg4LjMyNGMuNDI3IDExLjYzMSA3LjUwMyAyMS41ODcgMTcuNTM0IDI2LjE3Ny45MzEgMTAuNTAzIDQuMDg0IDMwLjE4NyAxNC43NjggNDUuNTM3YTkuOTg4IDkuOTg4IDAgMCAwIDguMjE2IDQuMjg4IDkuOTU4IDkuOTU4IDAgMCAwIDUuNzA0LTEuNzkzYzQuNTMzLTMuMTU1IDUuNjUtOS4zODggMi40OTUtMTMuOTIxLTYuNzk4LTkuNzY3LTkuNjAyLTIyLjYwOC0xMC43Ni0zMS40aDgyLjY4NWMuMjcyLjQxNC41NDUuODE4LjgxNSAxLjIxIDMuMTQyIDQuNTQxIDkuMzcyIDUuNjc5IDEzLjkxMyAyLjUzNCA0LjU0Mi0zLjE0MiA1LjY3Ny05LjM3MSAyLjUzNS0xMy45MTMtMTEuOTE5LTE3LjIyOS04Ljc4Ny0zNS44ODQgOS41ODEtNTcuMDEyIDMuMDY3LTIuNjUyIDEyLjMwNy0xMS43MzIgMTEuMjE3LTI0LjAzMy0uODI4LTkuMzQzLTcuMTA5LTE3LjE5NC0xOC42NjktMjMuMzM3YTkuODU3IDkuODU3IDAgMCAwLTEuMDYxLS40ODZjLS40NjYtLjE4Mi0xMS40MDMtNC41NzktOS43NDEtMTUuNzA2IDEuMDA3LTYuNzM3IDE0Ljc2OC04LjI3MyAyMy43NjYtNy42NjYgMjMuMTU2IDEuNTY5IDM5LjY5OCA3LjgwMyA0Ny44MzYgMTguMDI2IDUuNzUyIDcuMjI1IDcuNjA3IDE2LjYyMyA1LjY3MyAyOC43MzMtLjQxMyAyLjU4NS0uODI0IDUuMjQxLTEuMjQ1IDcuOTU5LTUuNzU2IDM3LjE5NC0xMi45MTkgODMuNDgzLTQ5Ljg3IDExNC42NjEtNC4yMjEgMy41NjEtNC43NTYgOS44Ny0xLjE5NCAxNC4wOTJhOS45OCA5Ljk4IDAgMCAwIDcuNjQ4IDMuNTUxIDkuOTU1IDkuOTU1IDAgMCAwIDYuNDQ0LTIuMzU4YzQyLjY3Mi0zNi4wMDUgNTAuODAyLTg4LjUzMyA1Ni43MzctMTI2Ljg4OC40MTUtMi42ODQuODIxLTUuMzA5IDEuMjI5LTcuODYzIDIuODM0LTE3LjcyMS0uNDU1LTMyLjY0MS05Ljc3Mi00NC4zNDV6bS0yMzIuMzA4IDQyLjYyYy01LjUxNCAwLTEwLTQuNDg2LTEwLTEwdi0xLjMzM2MwLTUuNTE0IDQuNDg2LTEwIDEwLTEwaDE1djIxLjMzM2gtMTV6bS0yLjUtNTIuNjY2YzAtNS41MTQgNC40ODYtMTAgMTAtMTBoNy41djIxLjMzM2gtNy41Yy01LjUxNCAwLTEwLTQuNDg2LTEwLTEwdi0xLjMzM3ptMTcuNSA5My45OTloLTcuNWMtNS41MTQgMC0xMC00LjQ4Ni0xMC0xMHYtMS4zMzNjMC01LjUxNCA0LjQ4Ni0xMCAxMC0xMGg3LjV2MjEuMzMzem0zMC43OTYgMjguODg3Yy01LjUxNCAwLTEwLTQuNDg2LTEwLTEwdi04LjI3MWg5MS40NTdjLS44NTEgNi42NjgtLjQzNyAxMi43ODcuNzMxIDE4LjI3MWgtODIuMTg4em03OS40ODItMTEzLjY5OGMtMy4xMjQgMjAuOTA2IDEyLjQyNyAzMy4xODQgMjEuNjI1IDM3LjA0IDUuNDQxIDIuOTY4IDcuNTUxIDUuNjQ3IDcuNzAxIDcuMTg4LjIxIDIuMTUtMi41NTMgNS42ODQtNC40NzcgNy4yNTEtLjQ4Mi4zNzgtLjkyOS44LTEuMzM1IDEuMjYxLTYuOTg3IDcuOTM2LTExLjk4MiAxNS41Mi0xNS40MzIgMjIuNjg4aC05Ny41NjRWMzBjMC01LjUxNCA0LjQ4Ni0xMCAxMC0xMGgxMjMuNzY5YzUuNTE0IDAgMTAgNC40ODYgMTAgMTB2MTM1LjU3OWMtMy4wMzItLjM4MS02LjE1LS42OTQtOS4zODktLjkxNC0yNS4xNTktMS42OTQtNDIuMzcgNy43NDgtNDQuODk4IDI0LjY2NnoiLz48cGF0aCBkPSJNMTc5LjEyOSA4My4xNjdoLTI0LjA2YTUgNSAwIDAgMC01IDV2MjQuMDYxYTUgNSAwIDAgMCA1IDVoMjQuMDZhNSA1IDAgMCAwIDUtNVY4OC4xNjdhNSA1IDAgMCAwLTUtNXpNMTcyLjYyOSAxNDIuODZoLTEyLjU2VjEzMC44YTUgNSAwIDEgMC0xMCAwdjE3LjA2MWE1IDUgMCAwIDAgNSA1aDE3LjU2YTUgNSAwIDEgMCAwLTEwLjAwMXpNMjE2LjU2OCA4My4xNjdoLTI0LjA2YTUgNSAwIDAgMC01IDV2MjQuMDYxYTUgNSAwIDAgMCA1IDVoMjQuMDZhNSA1IDAgMCAwIDUtNVY4OC4xNjdhNSA1IDAgMCAwLTUtNXptLTUgMjQuMDYxaC0xNC4wNlY5My4xNjdoMTQuMDZ2MTQuMDYxek0yMTEuNjY5IDEyNS45MzZIMTk3LjQxYTUgNSAwIDAgMC01IDV2MTQuMjU3YTUgNSAwIDAgMCA1IDVoMTQuMjU5YTUgNSAwIDAgMCA1LTV2LTE0LjI1N2E1IDUgMCAwIDAtNS01eiIvPjwvc3ZnPg=="; - -export const ASSET_FILE_SCAN: string = SVG_XML_PREFIX + "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1OS4wMTggNTkuMDE4IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1OS4wMTggNTkuMDE4IiB4bWw6c3BhY2U9InByZXNlcnZlIj48cGF0aCBkPSJtNTguNzQxIDU0LjgwOS01Ljk2OS02LjI0NGExMC43NCAxMC43NCAwIDAgMCAyLjgyLTcuMjVjMC01Ljk1My00Ljg0My0xMC43OTYtMTAuNzk2LTEwLjc5NlMzNCAzNS4zNjEgMzQgNDEuMzE0IDM4Ljg0MyA1Mi4xMSA0NC43OTYgNTIuMTFjMi40NDEgMCA0LjY4OC0uODI0IDYuNDk5LTIuMTk2bDYuMDAxIDYuMjc3YS45OTguOTk4IDAgMCAwIDEuNDE0LjAzMiAxIDEgMCAwIDAgLjAzMS0xLjQxNHpNMzYgNDEuMzE0YzAtNC44NSAzLjk0Ni04Ljc5NiA4Ljc5Ni04Ljc5NnM4Ljc5NiAzLjk0NiA4Ljc5NiA4Ljc5Ni0zLjk0NiA4Ljc5Ni04Ljc5NiA4Ljc5NlMzNiA0Ni4xNjQgMzYgNDEuMzE0ek0xMC40MzEgMTYuMDg4YzAgMy4wNyAyLjQ5OCA1LjU2OCA1LjU2OSA1LjU2OHM1LjU2OS0yLjQ5OCA1LjU2OS01LjU2OGMwLTMuMDcxLTIuNDk4LTUuNTY5LTUuNTY5LTUuNTY5cy01LjU2OSAyLjQ5OC01LjU2OSA1LjU2OXptOS4xMzggMGMwIDEuOTY4LTEuNjAyIDMuNTY4LTMuNTY5IDMuNTY4cy0zLjU2OS0xLjYwMS0zLjU2OS0zLjU2OCAxLjYwMi0zLjU2OSAzLjU2OS0zLjU2OSAzLjU2OSAxLjYwMSAzLjU2OSAzLjU2OXoiLz48cGF0aCBkPSJtMzAuODgyIDI4Ljk4NyA5LjE4LTEwLjA1NCAxMS4yNjIgMTAuMzIzYTEgMSAwIDAgMCAxLjM1MS0xLjQ3NWwtMTItMTFhMSAxIDAgMCAwLTEuNDE0LjA2M2wtOS43OTQgMTAuNzI3LTQuNzQzLTQuNzQzYTEuMDAzIDEuMDAzIDAgMCAwLTEuMzY4LS4wNDRMNi4zMzkgMzcuNzY4YTEgMSAwIDEgMCAxLjMyMiAxLjUwMWwxNi4zMTMtMTQuMzYyIDcuMzE5IDcuMzE4YS45OTkuOTk5IDAgMSAwIDEuNDE0LTEuNDE0bC0xLjgyNS0xLjgyNHoiLz48cGF0aCBkPSJNMzAgNDYuNTE4SDJ2LTQyaDU0djI4YTEgMSAwIDEgMCAyIDB2LTI5YTEgMSAwIDAgMC0xLTFIMWExIDEgMCAwIDAtMSAxdjQ0YTEgMSAwIDAgMCAxIDFoMjlhMSAxIDAgMSAwIDAtMnoiLz48L3N2Zz4="; - -export const ASSET_INFO_ICON_16PX : string = SVG_XML_PREFIX + "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NjAgNDYwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA0NjAgNDYwIiB4bWw6c3BhY2U9InByZXNlcnZlIj48cGF0aCBkPSJNMjMwIDBDMTAyLjk3NSAwIDAgMTAyLjk3NSAwIDIzMHMxMDIuOTc1IDIzMCAyMzAgMjMwIDIzMC0xMDIuOTc0IDIzMC0yMzBTMzU3LjAyNSAwIDIzMCAwem0zOC4zMzMgMzc3LjM2YzAgOC42NzYtNy4wMzQgMTUuNzEtMTUuNzEgMTUuNzFoLTQzLjEwMWMtOC42NzYgMC0xNS43MS03LjAzNC0xNS43MS0xNS43MVYyMDIuNDc3YzAtOC42NzYgNy4wMzMtMTUuNzEgMTUuNzEtMTUuNzFoNDMuMTAxYzguNjc2IDAgMTUuNzEgNy4wMzMgMTUuNzEgMTUuNzFWMzc3LjM2ek0yMzAgMTU3Yy0yMS41MzkgMC0zOS0xNy40NjEtMzktMzlzMTcuNDYxLTM5IDM5LTM5IDM5IDE3LjQ2MSAzOSAzOS0xNy40NjEgMzktMzkgMzl6Ii8+PC9zdmc+"; - -export const ASSET_CLOSE_ICON_16PX : string = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAQgAAAEIBarqQRAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAE1SURBVDiNfdI7S0NBEAXgLya1otFgpbYSbISAgpXYi6CmiH9KCAiChaVga6OiWPgfRDQ+0itaGVNosXtluWwcuMzePfM4M3sq8lbHBubwg1dc4m1E/J/N4ghDPOIsfk/4xiEao5KX0McFljN4C9d4QTPXuY99jP3DsIoDPGM6BY5i5yI5R7O4q+ImFkJY2DCh3cAH2klyB+9J1xUMMAG7eCh1a+Mr+k48b5diXrFVwwLuS+BJ9MfR7+G0FHOHhTHhnXNWS87VDF4pcnfQK4Ep7XScNLmPTZgURNKKYENYWDpzW1BhscS1WHS8CDgURFJQrWcoF3c13KKbgg1BYQfy8xZWEzTTw1QZbAoKu8FqJnktdu5hcVSHmchiILzzuaDQvjBzV2m8yohCE1jHfPx/xhU+y4G/D75ELlRJsSYAAAAASUVORK5CYII="; diff --git a/node_modules/html5-qrcode/src/index.d.ts b/node_modules/html5-qrcode/src/index.d.ts deleted file mode 100644 index d6b90c6..0000000 --- a/node_modules/html5-qrcode/src/index.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { Html5Qrcode, Html5QrcodeFullConfig, Html5QrcodeCameraScanConfig } from "./html5-qrcode"; -export { Html5QrcodeScanner } from "./html5-qrcode-scanner"; -export { Html5QrcodeSupportedFormats, Html5QrcodeResult, QrcodeSuccessCallback, QrcodeErrorCallback } from "./core"; -export { Html5QrcodeScannerState } from "./state-manager"; -export { Html5QrcodeScanType } from "./core"; -export { CameraCapabilities, CameraDevice } from "./camera/core"; diff --git a/node_modules/html5-qrcode/src/index.ts b/node_modules/html5-qrcode/src/index.ts deleted file mode 100644 index b985426..0000000 --- a/node_modules/html5-qrcode/src/index.ts +++ /dev/null @@ -1,32 +0,0 @@ -/** - * @fileoverview - Global export file. - * HTML5 QR code & barcode scanning library. - * - Decode QR Code. - * - Decode different kinds of barcodes. - * - Decode using web cam, smart phone camera or using images on local file - * system. - * - * @author mebjas - * - * The word "QR Code" is registered trademark of DENSO WAVE INCORPORATED - * http://www.denso-wave.com/qrcode/faqpatent-e.html - */ - -export { - Html5Qrcode, - Html5QrcodeFullConfig, - Html5QrcodeCameraScanConfig -} from "./html5-qrcode"; -export { Html5QrcodeScanner } from "./html5-qrcode-scanner"; -export { - Html5QrcodeSupportedFormats, - Html5QrcodeResult, - QrcodeSuccessCallback, - QrcodeErrorCallback -} from "./core"; -export { Html5QrcodeScannerState } from "./state-manager"; -export { Html5QrcodeScanType } from "./core"; -export { - CameraCapabilities, - CameraDevice -} from "./camera/core"; diff --git a/node_modules/html5-qrcode/src/native-bar-code-detector.d.ts b/node_modules/html5-qrcode/src/native-bar-code-detector.d.ts deleted file mode 100644 index 85ef95e..0000000 --- a/node_modules/html5-qrcode/src/native-bar-code-detector.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { QrcodeResult, Html5QrcodeSupportedFormats, QrcodeDecoderAsync, Logger } from "./core"; -export declare class BarcodeDetectorDelegate implements QrcodeDecoderAsync { - private readonly formatMap; - private readonly reverseFormatMap; - private verbose; - private logger; - private detector; - static isSupported(): boolean; - constructor(requestedFormats: Array, verbose: boolean, logger: Logger); - decodeAsync(canvas: HTMLCanvasElement): Promise; - private selectLargestBarcode; - private createBarcodeDetectorFormats; - private toHtml5QrcodeSupportedFormats; - private createReverseFormatMap; - private createDebugData; -} diff --git a/node_modules/html5-qrcode/src/native-bar-code-detector.ts b/node_modules/html5-qrcode/src/native-bar-code-detector.ts deleted file mode 100644 index d9004d2..0000000 --- a/node_modules/html5-qrcode/src/native-bar-code-detector.ts +++ /dev/null @@ -1,204 +0,0 @@ -/** - * @fileoverview - * {@interface QrcodeDecoder} wrapper around experimental BarcodeDetector API. - * - * @author mebjas - * - * Read more about the experimental feature here: - * https://developer.mozilla.org/en-US/docs/Web/API/BarcodeDetector - * - * The word "QR Code" is registered trademark of DENSO WAVE INCORPORATED - * http://www.denso-wave.com/qrcode/faqpatent-e.html - */ - -import { - QrcodeResult, - QrcodeResultDebugData, - QrcodeResultFormat, - Html5QrcodeSupportedFormats, - QrcodeDecoderAsync, - Logger -} from "./core"; - -declare const BarcodeDetector: any; - -/** Config for BarcodeDetector API. */ -interface BarcodeDetectorConfig { - formats: Array; -} - -/** - * Interface for BarcodeDetector result. - * - * Forked from - * https://developer.mozilla.org/en-US/docs/Web/API/BarcodeDetector#methods - */ -interface BarcodeDetectorResult { - /** - * A DOMRectReadOnly, which returns the dimensions of a rectangle - * representing the extent of a detected barcode, aligned with the image. - */ - boundingBox: DOMRectReadOnly; - - /** - * The x and y co-ordinates of the four corner points of the detected - * barcode relative to the image, starting with the top left and working - * clockwise. This may not be square due to perspective distortions within - * the image. - */ - cornerPoints: any; - - /** - * The detected barcode format. - */ - format: string; - - /** - * A String decoded from the barcode data. - */ - rawValue: string; -} - -/** - * ZXing based Code decoder. - */ - export class BarcodeDetectorDelegate implements QrcodeDecoderAsync { - - // All formats defined here - // https://developer.mozilla.org/en-US/docs/Web/API/Barcode_Detection_API#supported_barcode_formats - private readonly formatMap: Map - = new Map([ - [ Html5QrcodeSupportedFormats.QR_CODE, "qr_code" ], - [ Html5QrcodeSupportedFormats.AZTEC, "aztec" ], - [ Html5QrcodeSupportedFormats.CODABAR, "codabar" ], - [ Html5QrcodeSupportedFormats.CODE_39, "code_39" ], - [ Html5QrcodeSupportedFormats.CODE_93, "code_93" ], - [ Html5QrcodeSupportedFormats.CODE_128, "code_128" ], - [ Html5QrcodeSupportedFormats.DATA_MATRIX, "data_matrix" ], - [ Html5QrcodeSupportedFormats.ITF, "itf" ], - [ Html5QrcodeSupportedFormats.EAN_13, "ean_13" ], - [ Html5QrcodeSupportedFormats.EAN_8, "ean_8" ], - [ Html5QrcodeSupportedFormats.PDF_417, "pdf417" ], - [ Html5QrcodeSupportedFormats.UPC_A, "upc_a" ], - [ Html5QrcodeSupportedFormats.UPC_E, "upc_e" ] - ]); - private readonly reverseFormatMap: Map - = this.createReverseFormatMap(); - - private verbose: boolean; - private logger: Logger; - private detector: any; - - /** - * Returns true if this API is supported by the browser. - * - * TODO(mebjas): Add checks like this - * https://web.dev/shape-detection/#featuredetection - * TODO(mebjas): Check for format supported by the BarcodeDetector using - * getSupportedFormats() API. - * @returns - */ - public static isSupported(): boolean { - if (!("BarcodeDetector" in window)) { - return false; - } - const dummyDetector = new BarcodeDetector({formats: [ "qr_code" ]}); - return typeof dummyDetector !== "undefined"; - } - - public constructor( - requestedFormats: Array, - verbose: boolean, - logger: Logger) { - if (!BarcodeDetectorDelegate.isSupported()) { - throw "Use html5qrcode.min.js without edit, Use " - + "BarcodeDetectorDelegate only if it isSupported();"; - } - this.verbose = verbose; - this.logger = logger; - - // create new detector - const formats = this.createBarcodeDetectorFormats(requestedFormats); - this.detector = new BarcodeDetector(formats); - - // check compatibility - if (!this.detector) { - throw "BarcodeDetector detector not supported"; - } - } - - async decodeAsync(canvas: HTMLCanvasElement): Promise { - const barcodes: Array - = await this.detector.detect(canvas); - if (!barcodes || barcodes.length === 0) { - throw "No barcode or QR code detected."; - } - - // TODO(mebjas): Today BarcodeDetector library seems to be returning - // mutliple barcodes if supported. But the documentation around it is - // not the best. As of now, we are returning just the largest code - // found. In future it'd be desriable to return mutli codes if supported - // and found. - let largestBarcode = this.selectLargestBarcode(barcodes); - return { - text: largestBarcode.rawValue, - format: QrcodeResultFormat.create( - this.toHtml5QrcodeSupportedFormats(largestBarcode.format)), - debugData: this.createDebugData() - }; - } - - private selectLargestBarcode(barcodes: Array) - : BarcodeDetectorResult { - let largestBarcode: BarcodeDetectorResult | null = null; - let maxArea = 0; - for (let barcode of barcodes) { - let area = barcode.boundingBox.width * barcode.boundingBox.height; - if (area > maxArea) { - maxArea = area; - largestBarcode = barcode; - } - } - if (!largestBarcode) { - throw "No largest barcode found"; - } - return largestBarcode!; - } - - private createBarcodeDetectorFormats( - requestedFormats: Array): - BarcodeDetectorConfig { - let formats: Array = []; - for (const requestedFormat of requestedFormats) { - if (this.formatMap.has(requestedFormat)) { - formats.push( - this.formatMap.get(requestedFormat)!); - } else { - this.logger.warn(`${requestedFormat} is not supported by` - + "BarcodeDetectorDelegate"); - } - } - return { formats: formats }; - } - - private toHtml5QrcodeSupportedFormats(barcodeDetectorFormat: string) - : Html5QrcodeSupportedFormats { - if (!this.reverseFormatMap.has(barcodeDetectorFormat)) { - throw `reverseFormatMap doesn't have ${barcodeDetectorFormat}`; - } - return this.reverseFormatMap.get(barcodeDetectorFormat)!; - } - - private createReverseFormatMap(): Map { - let result = new Map(); - this.formatMap.forEach( - (value: string, key: Html5QrcodeSupportedFormats, _) => { - result.set(value, key); - }); - return result; - } - - private createDebugData(): QrcodeResultDebugData { - return { decoderName: "BarcodeDetector" }; - } -} diff --git a/node_modules/html5-qrcode/src/state-manager.d.ts b/node_modules/html5-qrcode/src/state-manager.d.ts deleted file mode 100644 index 1c740bb..0000000 --- a/node_modules/html5-qrcode/src/state-manager.d.ts +++ /dev/null @@ -1,29 +0,0 @@ -export declare enum Html5QrcodeScannerState { - UNKNOWN = 0, - NOT_STARTED = 1, - SCANNING = 2, - PAUSED = 3 -} -export interface StateManagerTransaction { - execute(): void; - cancel(): void; -} -export interface StateManager { - startTransition(newState: Html5QrcodeScannerState): StateManagerTransaction; - directTransition(newState: Html5QrcodeScannerState): void; - getState(): Html5QrcodeScannerState; -} -export declare class StateManagerProxy { - private stateManager; - constructor(stateManager: StateManager); - startTransition(newState: Html5QrcodeScannerState): StateManagerTransaction; - directTransition(newState: Html5QrcodeScannerState): void; - getState(): Html5QrcodeScannerState; - canScanFile(): boolean; - isScanning(): boolean; - isStrictlyScanning(): boolean; - isPaused(): boolean; -} -export declare class StateManagerFactory { - static create(): StateManagerProxy; -} diff --git a/node_modules/html5-qrcode/src/state-manager.ts b/node_modules/html5-qrcode/src/state-manager.ts deleted file mode 100644 index cf9d71d..0000000 --- a/node_modules/html5-qrcode/src/state-manager.ts +++ /dev/null @@ -1,193 +0,0 @@ -/** - * @fileoverview - * State handler. - * - * @author mebjas - */ - -/** Different states of scanner */ -export enum Html5QrcodeScannerState { - // Invalid internal state, do not set to this state. - UNKNOWN = 0, - // Indicates the scanning is not running or user is using file based - // scanning. - NOT_STARTED = 1, - // Camera scan is running. - SCANNING, - // Camera scan is paused but camera is running. - PAUSED, -} - -/** Transaction for state transition. */ -export interface StateManagerTransaction { - /** - * Executes the current transaction. - */ - execute(): void; - - /** - * Cancels the current transaction. - */ - cancel(): void; -} - -/** Manager class for states. */ -export interface StateManager { - /** - * Start a transition to a new state. No other transitions will be allowed - * till this one is executed. - * - * @param newState new state to transition to. - * - * @returns transaction of type {@interface StateManagerTransaction}. - * - * @throws error if the new state is not a valid transition from current - * state. - */ - startTransition(newState: Html5QrcodeScannerState): StateManagerTransaction; - - /** - * Directly execute a transition. - * - * @param newState new state to transition to. - * - * @throws error if the new state is not a valid transition from current - * state. - */ - directTransition(newState: Html5QrcodeScannerState): void; - - /** - * Get current state. - */ - getState(): Html5QrcodeScannerState; -} - -/** - * Implementation of {@interface StateManager} and - * {@interface StateManagerTransaction}. - */ -class StateManagerImpl implements StateManager, StateManagerTransaction { - - private state: Html5QrcodeScannerState = Html5QrcodeScannerState.NOT_STARTED; - - private onGoingTransactionNewState: Html5QrcodeScannerState - = Html5QrcodeScannerState.UNKNOWN; - - public directTransition(newState: Html5QrcodeScannerState) { - this.failIfTransitionOngoing(); - this.validateTransition(newState); - this.state = newState; - } - - public startTransition(newState: Html5QrcodeScannerState): StateManagerTransaction { - this.failIfTransitionOngoing(); - this.validateTransition(newState); - - this.onGoingTransactionNewState = newState; - return this; - } - - public execute() { - if (this.onGoingTransactionNewState - === Html5QrcodeScannerState.UNKNOWN) { - throw "Transaction is already cancelled, cannot execute()."; - } - - const tempNewState = this.onGoingTransactionNewState; - this.onGoingTransactionNewState = Html5QrcodeScannerState.UNKNOWN; - this.directTransition(tempNewState); - } - - public cancel() { - if (this.onGoingTransactionNewState - === Html5QrcodeScannerState.UNKNOWN) { - throw "Transaction is already cancelled, cannot cancel()."; - } - - this.onGoingTransactionNewState = Html5QrcodeScannerState.UNKNOWN; - } - - public getState(): Html5QrcodeScannerState { - return this.state; - } - - //#region private methods - private failIfTransitionOngoing() { - if (this.onGoingTransactionNewState - !== Html5QrcodeScannerState.UNKNOWN) { - throw "Cannot transition to a new state, already under transition"; - } - } - - private validateTransition(newState: Html5QrcodeScannerState) { - switch(this.state) { - case Html5QrcodeScannerState.UNKNOWN: - throw "Transition from unknown is not allowed"; - case Html5QrcodeScannerState.NOT_STARTED: - this.failIfNewStateIs(newState, [Html5QrcodeScannerState.PAUSED]); - break; - case Html5QrcodeScannerState.SCANNING: - // Both state transitions legal from here. - break; - case Html5QrcodeScannerState.PAUSED: - // Both state transitions legal from here. - break; - } - } - - private failIfNewStateIs( - newState: Html5QrcodeScannerState, - disallowedStatesToTransition: Array) { - for (const disallowedState of disallowedStatesToTransition) { - if (newState === disallowedState) { - throw `Cannot transition from ${this.state} to ${newState}`; - } - } - } - //#endregion -} - -export class StateManagerProxy { - private stateManager: StateManager; - - constructor(stateManager: StateManager) { - this.stateManager = stateManager; - } - - startTransition(newState: Html5QrcodeScannerState): StateManagerTransaction { - return this.stateManager.startTransition(newState); - } - - directTransition(newState: Html5QrcodeScannerState) { - this.stateManager.directTransition(newState); - } - - getState(): Html5QrcodeScannerState { - return this.stateManager.getState(); - } - - canScanFile(): boolean { - return this.stateManager.getState() === Html5QrcodeScannerState.NOT_STARTED; - } - - isScanning(): boolean { - return this.stateManager.getState() !== Html5QrcodeScannerState.NOT_STARTED; - } - - isStrictlyScanning(): boolean { - return this.stateManager.getState() === Html5QrcodeScannerState.SCANNING; - } - - isPaused(): boolean { - return this.stateManager.getState() === Html5QrcodeScannerState.PAUSED; - } -} - -/** - * Factory for creating instance of {@class StateManagerProxy}. - */ - export class StateManagerFactory { - public static create(): StateManagerProxy { - return new StateManagerProxy(new StateManagerImpl()); - } -} diff --git a/node_modules/html5-qrcode/src/storage.d.ts b/node_modules/html5-qrcode/src/storage.d.ts deleted file mode 100644 index cae73a3..0000000 --- a/node_modules/html5-qrcode/src/storage.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -export declare class PersistedDataManager { - private data; - private static LOCAL_STORAGE_KEY; - constructor(); - hasCameraPermissions(): boolean; - getLastUsedCameraId(): string | null; - setHasPermission(hasPermission: boolean): void; - setLastUsedCameraId(lastUsedCameraId: string): void; - resetLastUsedCameraId(): void; - reset(): void; - private flush; -} diff --git a/node_modules/html5-qrcode/src/storage.ts b/node_modules/html5-qrcode/src/storage.ts deleted file mode 100644 index 409cef9..0000000 --- a/node_modules/html5-qrcode/src/storage.ts +++ /dev/null @@ -1,72 +0,0 @@ -/** - * @fileoverview - * Core storage related APIs. - * - * @author mebjas - * - * The word "QR Code" is registered trademark of DENSO WAVE INCORPORATED - * http://www.denso-wave.com/qrcode/faqpatent-e.html - */ - -interface PersistedData { - hasPermission: boolean; - lastUsedCameraId: string | null; -} - -class PersistedDataFactory { - static createDefault(): PersistedData { - return { - hasPermission: false, - lastUsedCameraId: null - }; - } -} - -export class PersistedDataManager { - - private data: PersistedData = PersistedDataFactory.createDefault(); - private static LOCAL_STORAGE_KEY: string = "HTML5_QRCODE_DATA"; - - constructor() { - let data = localStorage.getItem(PersistedDataManager.LOCAL_STORAGE_KEY); - if (!data) { - this.reset(); - } else { - this.data = JSON.parse(data); - } - } - - public hasCameraPermissions(): boolean { - return this.data.hasPermission; - } - - public getLastUsedCameraId(): string | null { - return this.data.lastUsedCameraId; - } - - public setHasPermission(hasPermission: boolean) { - this.data.hasPermission = hasPermission; - this.flush(); - } - - public setLastUsedCameraId(lastUsedCameraId: string) { - this.data.lastUsedCameraId = lastUsedCameraId; - this.flush(); - } - - public resetLastUsedCameraId() { - this.data.lastUsedCameraId = null; - this.flush(); - } - - public reset() { - this.data = PersistedDataFactory.createDefault(); - this.flush(); - } - - private flush(): void { - localStorage.setItem( - PersistedDataManager.LOCAL_STORAGE_KEY, - JSON.stringify(this.data)); - } -} diff --git a/node_modules/html5-qrcode/src/strings.d.ts b/node_modules/html5-qrcode/src/strings.d.ts deleted file mode 100644 index bb99f90..0000000 --- a/node_modules/html5-qrcode/src/strings.d.ts +++ /dev/null @@ -1,45 +0,0 @@ -export declare class Html5QrcodeStrings { - static codeParseError(exception: any): string; - static errorGettingUserMedia(error: any): string; - static onlyDeviceSupportedError(): string; - static cameraStreamingNotSupported(): string; - static unableToQuerySupportedDevices(): string; - static insecureContextCameraQueryError(): string; - static scannerPaused(): string; -} -export declare class Html5QrcodeScannerStrings { - static scanningStatus(): string; - static idleStatus(): string; - static errorStatus(): string; - static permissionStatus(): string; - static noCameraFoundErrorStatus(): string; - static lastMatch(decodedText: string): string; - static codeScannerTitle(): string; - static cameraPermissionTitle(): string; - static cameraPermissionRequesting(): string; - static noCameraFound(): string; - static scanButtonStopScanningText(): string; - static scanButtonStartScanningText(): string; - static torchOnButton(): string; - static torchOffButton(): string; - static torchOnFailedMessage(): string; - static torchOffFailedMessage(): string; - static scanButtonScanningStarting(): string; - static textIfCameraScanSelected(): string; - static textIfFileScanSelected(): string; - static selectCamera(): string; - static fileSelectionChooseImage(): string; - static fileSelectionChooseAnother(): string; - static fileSelectionNoImageSelected(): string; - static anonymousCameraPrefix(): string; - static dragAndDropMessage(): string; - static dragAndDropMessageOnlyImages(): string; - static zoom(): string; - static loadingImage(): string; - static cameraScanAltText(): string; - static fileScanAltText(): string; -} -export declare class LibraryInfoStrings { - static poweredBy(): string; - static reportIssues(): string; -} diff --git a/node_modules/html5-qrcode/src/strings.ts b/node_modules/html5-qrcode/src/strings.ts deleted file mode 100644 index 3f701c1..0000000 --- a/node_modules/html5-qrcode/src/strings.ts +++ /dev/null @@ -1,200 +0,0 @@ -/** - * @fileoverview - * Strings used by {@class Html5Qrcode} & {@class Html5QrcodeScanner} - * - * @author mebjas - * - * The word "QR Code" is registered trademark of DENSO WAVE INCORPORATED - * http://www.denso-wave.com/qrcode/faqpatent-e.html - */ - -/** - * Strings used in {@class Html5Qrcode}. - * - * TODO(mebjas): Support internalization. - */ -export class Html5QrcodeStrings { - - public static codeParseError(exception: any): string { - return `QR code parse error, error = ${exception}`; - } - - public static errorGettingUserMedia(error: any): string { - return `Error getting userMedia, error = ${error}`; - } - - public static onlyDeviceSupportedError(): string { - return "The device doesn't support navigator.mediaDevices , only " - + "supported cameraIdOrConfig in this case is deviceId parameter " - + "(string)."; - } - - public static cameraStreamingNotSupported(): string { - return "Camera streaming not supported by the browser."; - } - - public static unableToQuerySupportedDevices(): string { - return "Unable to query supported devices, unknown error."; - } - - public static insecureContextCameraQueryError(): string { - return "Camera access is only supported in secure context like https " - + "or localhost."; - } - - public static scannerPaused(): string { - return "Scanner paused"; - } -} - -/** - * Strings used in {@class Html5QrcodeScanner}. - * - * TODO(mebjas): Support internalization. - */ -export class Html5QrcodeScannerStrings { - - public static scanningStatus(): string { - return "Scanning"; - } - - public static idleStatus(): string { - return "Idle"; - } - - public static errorStatus(): string { - return "Error"; - } - - public static permissionStatus(): string { - return "Permission"; - } - - public static noCameraFoundErrorStatus(): string { - return "No Cameras"; - } - - public static lastMatch(decodedText: string): string { - return `Last Match: ${decodedText}`; - } - - public static codeScannerTitle(): string { - return "Code Scanner"; - } - - public static cameraPermissionTitle(): string { - return "Request Camera Permissions"; - } - - public static cameraPermissionRequesting(): string { - return "Requesting camera permissions..."; - } - - public static noCameraFound(): string { - return "No camera found"; - } - - public static scanButtonStopScanningText(): string { - return "Stop Scanning"; - } - - public static scanButtonStartScanningText(): string { - return "Start Scanning"; - } - - public static torchOnButton(): string { - return "Switch On Torch"; - } - - public static torchOffButton(): string { - return "Switch Off Torch"; - } - - public static torchOnFailedMessage(): string { - return "Failed to turn on torch"; - } - - public static torchOffFailedMessage(): string { - return "Failed to turn off torch"; - } - - public static scanButtonScanningStarting(): string { - return "Launching Camera..."; - } - - /** - * Text to show when camera scan is selected. - * - * This will be used to switch to file based scanning. - */ - public static textIfCameraScanSelected(): string { - return "Scan an Image File"; - } - - /** - * Text to show when file based scan is selected. - * - * This will be used to switch to camera based scanning. - */ - public static textIfFileScanSelected(): string { - return "Scan using camera directly"; - } - - public static selectCamera(): string { - return "Select Camera"; - } - - public static fileSelectionChooseImage(): string { - return "Choose Image"; - } - - public static fileSelectionChooseAnother(): string { - return "Choose Another"; - } - - public static fileSelectionNoImageSelected(): string { - return "No image choosen"; - } - - /** Prefix to be given to anonymous cameras. */ - public static anonymousCameraPrefix(): string { - return "Anonymous Camera"; - } - - public static dragAndDropMessage(): string { - return "Or drop an image to scan"; - } - - public static dragAndDropMessageOnlyImages(): string { - return "Or drop an image to scan (other files not supported)"; - } - - /** Value for zoom. */ - public static zoom(): string { - return "zoom"; - } - - public static loadingImage(): string { - return "Loading image..."; - } - - public static cameraScanAltText(): string { - return "Camera based scan"; - } - - public static fileScanAltText(): string { - return "Fule based scan"; - } -} - -/** Strings used in {@class LibraryInfoDiv} */ -export class LibraryInfoStrings { - - public static poweredBy(): string { - return "Powered by "; - } - - public static reportIssues(): string { - return "Report issues"; - } -} diff --git a/node_modules/html5-qrcode/src/ui.d.ts b/node_modules/html5-qrcode/src/ui.d.ts deleted file mode 100644 index 5f03fe9..0000000 --- a/node_modules/html5-qrcode/src/ui.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -export declare class LibraryInfoContainer { - private infoDiv; - private infoIcon; - constructor(); - renderInto(parent: HTMLElement): void; -} diff --git a/node_modules/html5-qrcode/src/ui.ts b/node_modules/html5-qrcode/src/ui.ts deleted file mode 100644 index ee331d5..0000000 --- a/node_modules/html5-qrcode/src/ui.ts +++ /dev/null @@ -1,152 +0,0 @@ -/** - * @fileoverview - * All structured UI classes. - * - * TODO(mebjas): Migrate all UI components to modular UI classes so they are - * easy to improve. - * TODO(mebjas): Add tests for all UI components. - * @author mebjas - */ - -import { ASSET_CLOSE_ICON_16PX, ASSET_INFO_ICON_16PX } from "./image-assets"; - -import { LibraryInfoStrings } from "./strings"; - -type OnClickListener0 = () => void; - -//#region Info Icon + Div - -class LibraryInfoDiv { - private infoDiv: HTMLDivElement; - - constructor() { - this.infoDiv = document.createElement("div"); - } - - public renderInto(parent: HTMLElement) { - this.infoDiv.style.position = "absolute"; - this.infoDiv.style.top = "10px"; - this.infoDiv.style.right = "10px"; - this.infoDiv.style.zIndex = "2"; - this.infoDiv.style.display = "none"; - this.infoDiv.style.padding = "5pt"; - this.infoDiv.style.border = "1px solid #171717"; - this.infoDiv.style.fontSize = "10pt"; - this.infoDiv.style.background = "rgb(0 0 0 / 69%)"; - this.infoDiv.style.borderRadius = "5px"; - this.infoDiv.style.textAlign = "center"; - this.infoDiv.style.fontWeight = "400"; - this.infoDiv.style.color = "white"; - - this.infoDiv.innerText = LibraryInfoStrings.poweredBy(); - const projectLink = document.createElement("a"); - projectLink.innerText = "ScanApp"; - projectLink.href = "https://scanapp.org"; - projectLink.target = "new"; - projectLink.style.color = "white"; - this.infoDiv.appendChild(projectLink); - - const breakElemFirst = document.createElement("br"); - const breakElemSecond = document.createElement("br"); - this.infoDiv.appendChild(breakElemFirst); - this.infoDiv.appendChild(breakElemSecond); - - const reportIssueLink = document.createElement("a"); - reportIssueLink.innerText = LibraryInfoStrings.reportIssues(); - reportIssueLink.href = "https://github.com/mebjas/html5-qrcode/issues"; - reportIssueLink.target = "new"; - reportIssueLink.style.color = "white"; - this.infoDiv.appendChild(reportIssueLink); - - parent.appendChild(this.infoDiv); - } - - public show() { - this.infoDiv.style.display = "block"; - } - - public hide() { - this.infoDiv.style.display = "none"; - } -} - -class LibraryInfoIcon { - - private infoIcon: HTMLImageElement; - private onTapIn: OnClickListener0; - private onTapOut: OnClickListener0; - private isShowingInfoIcon: boolean = true; - - constructor(onTapIn: OnClickListener0, onTapOut: OnClickListener0) { - this.onTapIn = onTapIn; - this.onTapOut = onTapOut; - - this.infoIcon = document.createElement("img"); - } - - public renderInto(parent: HTMLElement) { - this.infoIcon.alt = "Info icon"; - this.infoIcon.src = ASSET_INFO_ICON_16PX; - this.infoIcon.style.position = "absolute"; - this.infoIcon.style.top = "4px"; - this.infoIcon.style.right = "4px"; - this.infoIcon.style.opacity = "0.6"; - this.infoIcon.style.cursor = "pointer"; - this.infoIcon.style.zIndex = "2"; - this.infoIcon.style.width = "16px"; - this.infoIcon.style.height = "16px"; - - this.infoIcon.onmouseover = (_) => this.onHoverIn(); - this.infoIcon.onmouseout = (_) => this.onHoverOut(); - this.infoIcon.onclick = (_) => this.onClick(); - - parent.appendChild(this.infoIcon); - } - - private onHoverIn() { - if (this.isShowingInfoIcon) { - this.infoIcon.style.opacity = "1"; - } - } - - private onHoverOut() { - if (this.isShowingInfoIcon) { - this.infoIcon.style.opacity = "0.6"; - } - } - - private onClick() { - if (this.isShowingInfoIcon) { - this.isShowingInfoIcon = false; - this.onTapIn(); - this.infoIcon.src = ASSET_CLOSE_ICON_16PX; - this.infoIcon.style.opacity = "1"; - } else { - this.isShowingInfoIcon = true; - this.onTapOut(); - this.infoIcon.src = ASSET_INFO_ICON_16PX; - this.infoIcon.style.opacity = "0.6"; - } - } -} - -export class LibraryInfoContainer { - - private infoDiv: LibraryInfoDiv; - private infoIcon: LibraryInfoIcon; - - constructor() { - this.infoDiv = new LibraryInfoDiv(); - this.infoIcon = new LibraryInfoIcon(() => { - this.infoDiv.show(); - }, () => { - this.infoDiv.hide(); - }); - } - - public renderInto(parent: HTMLElement) { - this.infoDiv.renderInto(parent); - this.infoIcon.renderInto(parent); - } -} -//#endregion diff --git a/node_modules/html5-qrcode/src/ui/scanner/base.d.ts b/node_modules/html5-qrcode/src/ui/scanner/base.d.ts deleted file mode 100644 index 1f6ba9c..0000000 --- a/node_modules/html5-qrcode/src/ui/scanner/base.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -export declare class PublicUiElementIdAndClasses { - static ALL_ELEMENT_CLASS: string; - static CAMERA_PERMISSION_BUTTON_ID: string; - static CAMERA_START_BUTTON_ID: string; - static CAMERA_STOP_BUTTON_ID: string; - static TORCH_BUTTON_ID: string; - static CAMERA_SELECTION_SELECT_ID: string; - static FILE_SELECTION_BUTTON_ID: string; - static ZOOM_SLIDER_ID: string; - static SCAN_TYPE_CHANGE_ANCHOR_ID: string; - static TORCH_BUTTON_CLASS_TORCH_ON: string; - static TORCH_BUTTON_CLASS_TORCH_OFF: string; -} -export declare class BaseUiElementFactory { - static createElement(elementType: string, elementId: string): Type; -} diff --git a/node_modules/html5-qrcode/src/ui/scanner/base.ts b/node_modules/html5-qrcode/src/ui/scanner/base.ts deleted file mode 100644 index 0c328ca..0000000 --- a/node_modules/html5-qrcode/src/ui/scanner/base.ts +++ /dev/null @@ -1,81 +0,0 @@ -/** - * @fileoverview - * Contains base classes for different UI elements used in the scanner. - * - * @author mebjas - * - * The word "QR Code" is registered trademark of DENSO WAVE INCORPORATED - * http://www.denso-wave.com/qrcode/faqpatent-e.html - */ - -/** - * Id and classes of UI elements, for developers to configure the theme of - * end to end scanner using css. - */ -export class PublicUiElementIdAndClasses { - //#region Public list of element IDs for major UI elements. - - /** Class name added to all major UI elements used in scanner. */ - static ALL_ELEMENT_CLASS = "html5-qrcode-element"; - - /** Id of the camera permission button. */ - static CAMERA_PERMISSION_BUTTON_ID = "html5-qrcode-button-camera-permission"; - - /** Id of the camera start button. */ - static CAMERA_START_BUTTON_ID = "html5-qrcode-button-camera-start"; - - /** Id of the camera stop button. */ - static CAMERA_STOP_BUTTON_ID = "html5-qrcode-button-camera-stop"; - - /** Id of the torch button. */ - static TORCH_BUTTON_ID = "html5-qrcode-button-torch"; - - /** Id of the select element used for camera selection. */ - static CAMERA_SELECTION_SELECT_ID = "html5-qrcode-select-camera"; - - /** Id of the button used for file selection. */ - static FILE_SELECTION_BUTTON_ID = "html5-qrcode-button-file-selection"; - - /** Id of the range input for zoom. */ - static ZOOM_SLIDER_ID = "html5-qrcode-input-range-zoom"; - - /** - * Id of the anchor {@code } element used for swapping between file scan - * and camera scan. - */ - static SCAN_TYPE_CHANGE_ANCHOR_ID = "html5-qrcode-anchor-scan-type-change"; - - //#endregion - - //#region List of classes for specific use-cases. - - /** Torch button class when torch is ON. */ - static TORCH_BUTTON_CLASS_TORCH_ON = "html5-qrcode-button-torch-on"; - - /** Torch button class when torch is OFF. */ - static TORCH_BUTTON_CLASS_TORCH_OFF = "html5-qrcode-button-torch-off"; - - //#endregion -} - -/** - * Factory class for creating different base UI elements used by the scanner. - */ -export class BaseUiElementFactory { - /** - * Creates {@link HTMLElement} of given {@param elementType}. - * - * @param elementType Type of element to create, example - */ - public static createElement( - elementType: string, elementId: string): Type { - - let element: Type = (document.createElement(elementType)); - element.id = elementId; - element.classList.add(PublicUiElementIdAndClasses.ALL_ELEMENT_CLASS); - if (elementType === "button") { - element.setAttribute("type", "button"); - } - return element; - } -} diff --git a/node_modules/html5-qrcode/src/ui/scanner/camera-selection-ui.d.ts b/node_modules/html5-qrcode/src/ui/scanner/camera-selection-ui.d.ts deleted file mode 100644 index 2090ed5..0000000 --- a/node_modules/html5-qrcode/src/ui/scanner/camera-selection-ui.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { CameraDevice } from "../../camera/core"; -export declare class CameraSelectionUi { - private readonly selectElement; - private readonly options; - private readonly cameras; - private constructor(); - private render; - disable(): void; - isDisabled(): boolean; - enable(): void; - getValue(): string; - hasValue(value: string): boolean; - setValue(value: string): void; - hasSingleItem(): boolean; - numCameras(): number; - static create(parentElement: HTMLElement, cameras: Array): CameraSelectionUi; -} diff --git a/node_modules/html5-qrcode/src/ui/scanner/camera-selection-ui.ts b/node_modules/html5-qrcode/src/ui/scanner/camera-selection-ui.ts deleted file mode 100644 index cda2b9b..0000000 --- a/node_modules/html5-qrcode/src/ui/scanner/camera-selection-ui.ts +++ /dev/null @@ -1,129 +0,0 @@ -/** - * @fileoverview - * File for camera selection UI. - * - * @author mebjas - * - * The word "QR Code" is registered trademark of DENSO WAVE INCORPORATED - * http://www.denso-wave.com/qrcode/faqpatent-e.html - */ - -import { CameraDevice } from "../../camera/core"; -import { - BaseUiElementFactory, - PublicUiElementIdAndClasses -} from "./base"; -import { - Html5QrcodeScannerStrings -} from "../../strings"; - -/** Class for rendering and handling camera selection UI. */ -export class CameraSelectionUi { - - private readonly selectElement: HTMLSelectElement; - private readonly options: Array; - private readonly cameras: Array; - - private constructor(cameras: Array) { - this.selectElement = BaseUiElementFactory - .createElement( - "select", - PublicUiElementIdAndClasses.CAMERA_SELECTION_SELECT_ID); - this.cameras = cameras; - this.options = []; - } - - /*eslint complexity: ["error", 10]*/ - private render( - parentElement: HTMLElement) { - const cameraSelectionContainer = document.createElement("span"); - cameraSelectionContainer.style.marginRight = "10px"; - const numCameras = this.cameras.length; - if (numCameras === 0) { - throw new Error("No cameras found"); - } - if (numCameras === 1) { - // If only one camera is found, don't show camera selection. - cameraSelectionContainer.style.display = "none"; - } else { - // Otherwise, show the number of cameras found as well. - const selectCameraString = Html5QrcodeScannerStrings.selectCamera(); - cameraSelectionContainer.innerText - = `${selectCameraString} (${this.cameras.length}) `; - } - - let anonymousCameraId = 1; - - for (const camera of this.cameras) { - const value = camera.id; - let name = camera.label == null ? value : camera.label; - // If no name is returned by the browser, replace it with custom - // camera label with a count. - if (!name || name === "") { - name = [ - Html5QrcodeScannerStrings.anonymousCameraPrefix(), - anonymousCameraId++ - ].join(" "); - } - - const option = document.createElement("option"); - option.value = value; - option.innerText = name; - this.options.push(option); - this.selectElement.appendChild(option); - } - cameraSelectionContainer.appendChild(this.selectElement); - parentElement.appendChild(cameraSelectionContainer); - } - - //#region Public APIs - public disable() { - this.selectElement.disabled = true; - } - - public isDisabled() { - return this.selectElement.disabled === true; - } - - public enable() { - this.selectElement.disabled = false; - } - - public getValue(): string { - return this.selectElement.value; - } - - public hasValue(value: string): boolean { - for (const option of this.options) { - if (option.value === value) { - return true; - } - } - return false; - } - - public setValue(value: string) { - if (!this.hasValue(value)) { - throw new Error(`${value} is not present in the camera list.`); - } - this.selectElement.value = value; - } - - public hasSingleItem() { - return this.cameras.length === 1; - } - - public numCameras() { - return this.cameras.length; - } - //#endregion - - /** Creates instance of {@link CameraSelectionUi} and renders it. */ - public static create( - parentElement: HTMLElement, - cameras: Array): CameraSelectionUi { - let cameraSelectUi = new CameraSelectionUi(cameras); - cameraSelectUi.render(parentElement); - return cameraSelectUi; - } -} diff --git a/node_modules/html5-qrcode/src/ui/scanner/camera-zoom-ui.d.ts b/node_modules/html5-qrcode/src/ui/scanner/camera-zoom-ui.d.ts deleted file mode 100644 index 215bb3f..0000000 --- a/node_modules/html5-qrcode/src/ui/scanner/camera-zoom-ui.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -export type OnCameraZoomValueChangeCallback = (zoomValue: number) => void; -export declare class CameraZoomUi { - private zoomElementContainer; - private rangeInput; - private rangeText; - private onChangeCallback; - private constructor(); - private render; - private onValueChange; - setValues(minValue: number, maxValue: number, defaultValue: number, step: number): void; - show(): void; - hide(): void; - setOnCameraZoomValueChangeCallback(onChangeCallback: OnCameraZoomValueChangeCallback): void; - removeOnCameraZoomValueChangeCallback(): void; - static create(parentElement: HTMLElement, renderOnCreate: boolean): CameraZoomUi; -} diff --git a/node_modules/html5-qrcode/src/ui/scanner/camera-zoom-ui.ts b/node_modules/html5-qrcode/src/ui/scanner/camera-zoom-ui.ts deleted file mode 100644 index c49eecc..0000000 --- a/node_modules/html5-qrcode/src/ui/scanner/camera-zoom-ui.ts +++ /dev/null @@ -1,126 +0,0 @@ -/** - * @fileoverview - * File for camera zooming UI. - * - * @author mebjas - * - * The word "QR Code" is registered trademark of DENSO WAVE INCORPORATED - * http://www.denso-wave.com/qrcode/faqpatent-e.html - */ - - import { - BaseUiElementFactory, - PublicUiElementIdAndClasses -} from "./base"; - -import { Html5QrcodeScannerStrings } from "../../strings"; - -/** Callback when zoom value changes with the slider UI. */ -export type OnCameraZoomValueChangeCallback = (zoomValue: number) => void; - -/** Class for creating and managing zoom slider UI. */ -export class CameraZoomUi { - - private zoomElementContainer: HTMLDivElement; - private rangeInput: HTMLInputElement; - private rangeText: HTMLSpanElement; - - private onChangeCallback: OnCameraZoomValueChangeCallback | null = null; - - private constructor() { - this.zoomElementContainer = document.createElement("div"); - this.rangeInput = BaseUiElementFactory.createElement( - "input", PublicUiElementIdAndClasses.ZOOM_SLIDER_ID); - this.rangeInput.type = "range"; - - this.rangeText = document.createElement("span"); - - // default values. - this.rangeInput.min = "1"; - this.rangeInput.max = "5"; - this.rangeInput.value = "1"; - this.rangeInput.step = "0.1"; - } - - private render( - parentElement: HTMLElement, - renderOnCreate: boolean) { - // Style for the range slider. - this.zoomElementContainer.style.display - = renderOnCreate ? "block" : "none"; - this.zoomElementContainer.style.padding = "5px 10px"; - this.zoomElementContainer.style.textAlign = "center"; - parentElement.appendChild(this.zoomElementContainer); - - this.rangeInput.style.display = "inline-block"; - this.rangeInput.style.width = "50%"; - this.rangeInput.style.height = "5px"; - this.rangeInput.style.background = "#d3d3d3"; - this.rangeInput.style.outline = "none"; - this.rangeInput.style.opacity = "0.7"; - - let zoomString = Html5QrcodeScannerStrings.zoom(); - this.rangeText.innerText = `${this.rangeInput.value}x ${zoomString}`; - this.rangeText.style.marginRight = "10px"; - - // Bind values. - let $this = this; - this.rangeInput.addEventListener("input", () => $this.onValueChange()); - this.rangeInput.addEventListener("change", () => $this.onValueChange()); - - this.zoomElementContainer.appendChild(this.rangeInput); - this.zoomElementContainer.appendChild(this.rangeText); - } - - private onValueChange() { - let zoomString = Html5QrcodeScannerStrings.zoom(); - this.rangeText.innerText = `${this.rangeInput.value}x ${zoomString}`; - if (this.onChangeCallback) { - this.onChangeCallback(parseFloat(this.rangeInput.value)); - } - } - - //#region Public APIs - public setValues( - minValue: number, - maxValue: number, - defaultValue: number, - step: number) { - this.rangeInput.min = minValue.toString(); - this.rangeInput.max = maxValue.toString(); - this.rangeInput.step = step.toString(); - this.rangeInput.value = defaultValue.toString(); - - this.onValueChange(); - } - - public show() { - this.zoomElementContainer.style.display = "block"; - } - - public hide() { - this.zoomElementContainer.style.display = "none"; - } - - public setOnCameraZoomValueChangeCallback( - onChangeCallback: OnCameraZoomValueChangeCallback) { - this.onChangeCallback = onChangeCallback; - } - - public removeOnCameraZoomValueChangeCallback() { - this.onChangeCallback = null; - } - //#endregion - - /** - * Creates and renders the zoom slider if {@code renderOnCreate} is - * {@code true}. - */ - public static create( - parentElement: HTMLElement, - renderOnCreate: boolean): CameraZoomUi { - let cameraZoomUi = new CameraZoomUi(); - cameraZoomUi.render(parentElement, renderOnCreate); - return cameraZoomUi; - } -} diff --git a/node_modules/html5-qrcode/src/ui/scanner/file-selection-ui.d.ts b/node_modules/html5-qrcode/src/ui/scanner/file-selection-ui.d.ts deleted file mode 100644 index 768f5ed..0000000 --- a/node_modules/html5-qrcode/src/ui/scanner/file-selection-ui.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -export type OnFileSelected = (file: File) => void; -export declare class FileSelectionUi { - private readonly fileBasedScanRegion; - private readonly fileScanInput; - private readonly fileSelectionButton; - private constructor(); - hide(): void; - show(): void; - isShowing(): boolean; - resetValue(): void; - private createFileBasedScanRegion; - private fileBasedScanRegionDefaultBorder; - private fileBasedScanRegionActiveBorder; - private createDragAndDropMessage; - private setImageNameToButton; - private setInitialValueToButton; - private getFileScanInputId; - static create(parentElement: HTMLDivElement, showOnRender: boolean, onFileSelected: OnFileSelected): FileSelectionUi; -} diff --git a/node_modules/html5-qrcode/src/ui/scanner/file-selection-ui.ts b/node_modules/html5-qrcode/src/ui/scanner/file-selection-ui.ts deleted file mode 100644 index ebf68f7..0000000 --- a/node_modules/html5-qrcode/src/ui/scanner/file-selection-ui.ts +++ /dev/null @@ -1,263 +0,0 @@ -/** - * @fileoverview - * File for file selection UI handling. - * - * @author mebjas - * - * The word "QR Code" is registered trademark of DENSO WAVE INCORPORATED - * http://www.denso-wave.com/qrcode/faqpatent-e.html - */ - -import {Html5QrcodeScannerStrings} from "../../strings"; -import { - BaseUiElementFactory, - PublicUiElementIdAndClasses -} from "./base"; - -/** - * Interface for callback when a file is selected by user using the button. - */ -export type OnFileSelected = (file: File) => void; - -/** UI class for file selection handling. */ -export class FileSelectionUi { - - private readonly fileBasedScanRegion: HTMLDivElement; - private readonly fileScanInput: HTMLInputElement; - private readonly fileSelectionButton: HTMLButtonElement; - - /** Creates object and renders. */ - private constructor( - parentElement: HTMLDivElement, - showOnRender: boolean, - onFileSelected: OnFileSelected) { - this.fileBasedScanRegion = this.createFileBasedScanRegion(); - this.fileBasedScanRegion.style.display - = showOnRender ? "block" : "none"; - parentElement.appendChild(this.fileBasedScanRegion); - - let fileScanLabel = document.createElement("label"); - fileScanLabel.setAttribute("for", this.getFileScanInputId()); - fileScanLabel.style.display = "inline-block"; - - this.fileBasedScanRegion.appendChild(fileScanLabel); - - this.fileSelectionButton - = BaseUiElementFactory.createElement( - "button", - PublicUiElementIdAndClasses.FILE_SELECTION_BUTTON_ID); - this.setInitialValueToButton(); - - // Bind click events with the label element. - this.fileSelectionButton.addEventListener("click", (_) => { - fileScanLabel.click(); - }); - fileScanLabel.append(this.fileSelectionButton); - - this.fileScanInput - = BaseUiElementFactory.createElement( - "input", this.getFileScanInputId()); - this.fileScanInput.type = "file"; - this.fileScanInput.accept = "image/*"; - this.fileScanInput.style.display = "none"; - fileScanLabel.appendChild(this.fileScanInput); - - let $this = this; - /*eslint complexity: ["error", 5]*/ - this.fileScanInput.addEventListener("change", (e: Event) => { - if (e == null || e.target == null) { - return; - } - let target: HTMLInputElement = e.target as HTMLInputElement; - if (target.files && target.files.length === 0) { - return; - } - let fileList: FileList = target.files!; - const file: File = fileList[0]; - let fileName = file.name; - $this.setImageNameToButton(fileName); - - onFileSelected(file); - }); - - // Render drag and drop label - let dragAndDropMessage = this.createDragAndDropMessage(); - this.fileBasedScanRegion.appendChild(dragAndDropMessage); - - this.fileBasedScanRegion.addEventListener("dragenter", function(event) { - $this.fileBasedScanRegion.style.border - = $this.fileBasedScanRegionActiveBorder(); - - event.stopPropagation(); - event.preventDefault(); - }); - - this.fileBasedScanRegion.addEventListener("dragleave", function(event) { - $this.fileBasedScanRegion.style.border - = $this.fileBasedScanRegionDefaultBorder(); - - event.stopPropagation(); - event.preventDefault(); - }); - - this.fileBasedScanRegion.addEventListener("dragover", function(event) { - $this.fileBasedScanRegion.style.border - = $this.fileBasedScanRegionActiveBorder(); - - event.stopPropagation(); - event.preventDefault(); - }); - - /*eslint complexity: ["error", 10]*/ - this.fileBasedScanRegion.addEventListener("drop", function(event) { - event.stopPropagation(); - event.preventDefault(); - - $this.fileBasedScanRegion.style.border - = $this.fileBasedScanRegionDefaultBorder(); - - var dataTransfer = event.dataTransfer; - if (dataTransfer) { - let files = dataTransfer.files; - if (!files || files.length === 0) { - return; - } - let isAnyFileImage = false; - for (let i = 0; i < files.length; ++i) { - let file = files.item(i); - if (!file) { - continue; - } - let imageType = /image.*/; - - // Only process images. - if (!file.type.match(imageType)) { - continue; - } - - isAnyFileImage = true; - let fileName = file.name; - $this.setImageNameToButton(fileName); - - onFileSelected(file); - dragAndDropMessage.innerText - = Html5QrcodeScannerStrings.dragAndDropMessage(); - break; - } - - // None of the files were images. - if (!isAnyFileImage) { - dragAndDropMessage.innerText - = Html5QrcodeScannerStrings - .dragAndDropMessageOnlyImages(); - } - } - - }); - } - - //#region Public APIs. - /** Hide the file selection UI. */ - public hide() { - this.fileBasedScanRegion.style.display = "none"; - this.fileScanInput.disabled = true; - } - - /** Show the file selection UI. */ - public show() { - this.fileBasedScanRegion.style.display = "block"; - this.fileScanInput.disabled = false; - } - - /** Returns {@code true} if UI container is displayed. */ - public isShowing(): boolean { - return this.fileBasedScanRegion.style.display === "block"; - } - - /** Reset the file selection value */ - public resetValue() { - this.fileScanInput.value = ""; - this.setInitialValueToButton(); - } - //#endregion - - //#region private APIs - private createFileBasedScanRegion(): HTMLDivElement { - let fileBasedScanRegion = document.createElement("div"); - fileBasedScanRegion.style.textAlign = "center"; - fileBasedScanRegion.style.margin = "auto"; - fileBasedScanRegion.style.width = "80%"; - fileBasedScanRegion.style.maxWidth = "600px"; - fileBasedScanRegion.style.border - = this.fileBasedScanRegionDefaultBorder(); - fileBasedScanRegion.style.padding = "10px"; - fileBasedScanRegion.style.marginBottom = "10px"; - return fileBasedScanRegion; - } - - private fileBasedScanRegionDefaultBorder() { - return "6px dashed #ebebeb"; - } - - /** Border when a file is being dragged over the file scan region. */ - private fileBasedScanRegionActiveBorder() { - return "6px dashed rgb(153 151 151)"; - } - - private createDragAndDropMessage(): HTMLDivElement { - let dragAndDropMessage = document.createElement("div"); - dragAndDropMessage.innerText - = Html5QrcodeScannerStrings.dragAndDropMessage(); - dragAndDropMessage.style.fontWeight = "400"; - return dragAndDropMessage; - } - - private setImageNameToButton(imageFileName: string) { - const MAX_CHARS = 20; - if (imageFileName.length > MAX_CHARS) { - // Strip first 8 - // Strip last 8 - // Add 4 dots - let start8Chars = imageFileName.substring(0, 8); - let length = imageFileName.length; - let last8Chars = imageFileName.substring(length - 8, length); - imageFileName = `${start8Chars}....${last8Chars}`; - } - - let newText = Html5QrcodeScannerStrings.fileSelectionChooseAnother() - + " - " - + imageFileName; - this.fileSelectionButton.innerText = newText; - } - - private setInitialValueToButton() { - let initialText = Html5QrcodeScannerStrings.fileSelectionChooseImage() - + " - " - + Html5QrcodeScannerStrings.fileSelectionNoImageSelected(); - this.fileSelectionButton.innerText = initialText; - } - - private getFileScanInputId(): string { - return "html5-qrcode-private-filescan-input"; - } - //#endregion - - /** - * Creates a file selection UI and renders. - * - * @param parentElement parent div element to render the UI to. - * @param showOnRender if {@code true}, the UI will be shown upon render - * else hidden. - * @param onFileSelected callback to be called when file selection changes. - * - * @returns Instance of {@code FileSelectionUi}. - */ - public static create( - parentElement: HTMLDivElement, - showOnRender: boolean, - onFileSelected: OnFileSelected): FileSelectionUi { - let button = new FileSelectionUi( - parentElement, showOnRender, onFileSelected); - return button; - } -} diff --git a/node_modules/html5-qrcode/src/ui/scanner/scan-type-selector.d.ts b/node_modules/html5-qrcode/src/ui/scanner/scan-type-selector.d.ts deleted file mode 100644 index 2f0e134..0000000 --- a/node_modules/html5-qrcode/src/ui/scanner/scan-type-selector.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Html5QrcodeScanType } from "../../core"; -export declare class ScanTypeSelector { - private supportedScanTypes; - constructor(supportedScanTypes?: Array | []); - getDefaultScanType(): Html5QrcodeScanType; - hasMoreThanOneScanType(): boolean; - isCameraScanRequired(): boolean; - static isCameraScanType(scanType: Html5QrcodeScanType): boolean; - static isFileScanType(scanType: Html5QrcodeScanType): boolean; - private validateAndReturnScanTypes; -} diff --git a/node_modules/html5-qrcode/src/ui/scanner/scan-type-selector.ts b/node_modules/html5-qrcode/src/ui/scanner/scan-type-selector.ts deleted file mode 100644 index d822e16..0000000 --- a/node_modules/html5-qrcode/src/ui/scanner/scan-type-selector.ts +++ /dev/null @@ -1,94 +0,0 @@ -/** - * @fileoverview - * Util class to help with scan type selection in scanner class. - * - * @author mebjas - * - * The word "QR Code" is registered trademark of DENSO WAVE INCORPORATED - * http://www.denso-wave.com/qrcode/faqpatent-e.html - */ - -import { - Html5QrcodeScanType, - Html5QrcodeConstants -} from "../../core"; - -/** Util class to help with scan type selection in scanner class. */ -export class ScanTypeSelector { - private supportedScanTypes: Array; - - constructor(supportedScanTypes?: Array | []) { - this.supportedScanTypes = this.validateAndReturnScanTypes( - supportedScanTypes); - } - - /** - * Returns the default {@link Html5QrcodeScanType} scanner UI should be - * created with. - */ - public getDefaultScanType(): Html5QrcodeScanType { - return this.supportedScanTypes[0]; - } - - /** - * Returns {@code true} if more than one {@link Html5QrcodeScanType} are - * set. - */ - public hasMoreThanOneScanType(): boolean { - return this.supportedScanTypes.length > 1; - } - - /** Returns {@code true} if camera scan is required at all. */ - public isCameraScanRequired(): boolean { - for (const scanType of this.supportedScanTypes) { - if (ScanTypeSelector.isCameraScanType(scanType)) { - return true; - } - } - return false; - } - - /** Returns {@code true} is {@code scanType} is camera based. */ - public static isCameraScanType(scanType: Html5QrcodeScanType): boolean { - return scanType === Html5QrcodeScanType.SCAN_TYPE_CAMERA; - } - - /** Returns {@code true} is {@code scanType} is file based. */ - public static isFileScanType(scanType: Html5QrcodeScanType): boolean { - return scanType === Html5QrcodeScanType.SCAN_TYPE_FILE; - } - - //#region Private methods. - /** - * Validates the input {@code supportedScanTypes}. - * - * Fails early if the config values is incorrectly set. - */ - private validateAndReturnScanTypes( - supportedScanTypes?:Array): - Array { - // If not set, use the default values and order. - if (!supportedScanTypes || supportedScanTypes.length === 0) { - return Html5QrcodeConstants.DEFAULT_SUPPORTED_SCAN_TYPE; - } - - // Fail if more than expected number of values exist. - let maxExpectedValues - = Html5QrcodeConstants.DEFAULT_SUPPORTED_SCAN_TYPE.length; - if (supportedScanTypes.length > maxExpectedValues) { - throw `Max ${maxExpectedValues} values expected for ` - + "supportedScanTypes"; - } - - // Fail if any of the scan types are not supported. - for (const scanType of supportedScanTypes) { - if (!Html5QrcodeConstants.DEFAULT_SUPPORTED_SCAN_TYPE - .includes(scanType)) { - throw `Unsupported scan type ${scanType}`; - } - } - - return supportedScanTypes; - } - //#endregion -} diff --git a/node_modules/html5-qrcode/src/ui/scanner/torch-button.d.ts b/node_modules/html5-qrcode/src/ui/scanner/torch-button.d.ts deleted file mode 100644 index a862a10..0000000 --- a/node_modules/html5-qrcode/src/ui/scanner/torch-button.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { BooleanCameraCapability } from "../../camera/core"; -export type OnTorchActionFailureCallback = (failureMessage: string) => void; -interface TorchButtonController { - disable(): void; - enable(): void; - setText(text: string): void; -} -export interface TorchButtonOptions { - display: string; - marginLeft: string; -} -export declare class TorchButton implements TorchButtonController { - private readonly torchButton; - private readonly onTorchActionFailureCallback; - private torchController; - private constructor(); - private render; - updateTorchCapability(torchCapability: BooleanCameraCapability): void; - getTorchButton(): HTMLButtonElement; - hide(): void; - show(): void; - disable(): void; - enable(): void; - setText(text: string): void; - reset(): void; - static create(parentElement: HTMLElement, torchCapability: BooleanCameraCapability, torchButtonOptions: TorchButtonOptions, onTorchActionFailureCallback: OnTorchActionFailureCallback): TorchButton; -} -export {}; diff --git a/node_modules/html5-qrcode/src/ui/scanner/torch-button.ts b/node_modules/html5-qrcode/src/ui/scanner/torch-button.ts deleted file mode 100644 index f39cbe7..0000000 --- a/node_modules/html5-qrcode/src/ui/scanner/torch-button.ts +++ /dev/null @@ -1,227 +0,0 @@ -/** - * @fileoverview - * File for torch related UI components and handling. - * - * @author mebjas - * - * The word "QR Code" is registered trademark of DENSO WAVE INCORPORATED - * http://www.denso-wave.com/qrcode/faqpatent-e.html - */ - -import { BooleanCameraCapability } from "../../camera/core"; -import { Html5QrcodeScannerStrings } from "../../strings"; -import { - BaseUiElementFactory, - PublicUiElementIdAndClasses -} from "./base"; - -/** - * Interface for callback that will be called in case of torch action failures. - */ -export type OnTorchActionFailureCallback = (failureMessage: string) => void; - -/** Interface for controlling torch button. */ -interface TorchButtonController { - disable(): void; - enable(): void; - setText(text: string): void; -} - -/** Controller class for handling torch / flash. */ -class TorchController { - private readonly torchCapability: BooleanCameraCapability; - private readonly buttonController: TorchButtonController; - private readonly onTorchActionFailureCallback: OnTorchActionFailureCallback; - - // Mutable states. - private isTorchOn: boolean = false; - - constructor( - torchCapability: BooleanCameraCapability, - buttonController: TorchButtonController, - onTorchActionFailureCallback: OnTorchActionFailureCallback) { - this.torchCapability = torchCapability; - this.buttonController = buttonController; - this.onTorchActionFailureCallback = onTorchActionFailureCallback; - } - - /** Returns {@code true} if torch is enabled. */ - public isTorchEnabled(): boolean { - return this.isTorchOn; - } - - /** - * Flips the state of the torch. - * - *

    Turns torch On if current state is Off and vice-versa. - *

    Modifies the UI state accordingly. - * - * @returns Promise that finishes when the async action is done. - */ - public async flipState(): Promise { - this.buttonController.disable(); - let isTorchOnExpected = !this.isTorchOn; - try { - await this.torchCapability.apply(isTorchOnExpected); - this.updateUiBasedOnLatestSettings( - this.torchCapability.value()!, isTorchOnExpected); - } catch (error) { - this.propagateFailure(isTorchOnExpected, error); - this.buttonController.enable(); - } - } - - private updateUiBasedOnLatestSettings( - isTorchOn: boolean, - isTorchOnExpected: boolean) { - if (isTorchOn === isTorchOnExpected) { - // Action succeeded, flip the state. - this.buttonController.setText(isTorchOnExpected - ? Html5QrcodeScannerStrings.torchOffButton() - : Html5QrcodeScannerStrings.torchOnButton()); - this.isTorchOn = isTorchOnExpected; - } else { - // Torch didn't get set as expected. - // Show warning. - this.propagateFailure(isTorchOnExpected); - } - this.buttonController.enable(); - } - - private propagateFailure( - isTorchOnExpected: boolean, error?: any) { - let errorMessage = isTorchOnExpected - ? Html5QrcodeScannerStrings.torchOnFailedMessage() - : Html5QrcodeScannerStrings.torchOffFailedMessage(); - if (error) { - errorMessage += "; Error = " + error; - } - this.onTorchActionFailureCallback(errorMessage); - } - - /** - * Resets the state. - * - *

    Note: Doesn't turn off the torch implicitly. - */ - public reset() { - this.isTorchOn = false; - } -} - -/** Options for creating torch button. */ -export interface TorchButtonOptions { - display: string; - marginLeft: string; -} - -/** Helper class for creating Torch UI component. */ -export class TorchButton implements TorchButtonController { - private readonly torchButton: HTMLButtonElement; - private readonly onTorchActionFailureCallback: OnTorchActionFailureCallback; - - private torchController: TorchController; - - private constructor( - torchCapability: BooleanCameraCapability, - onTorchActionFailureCallback: OnTorchActionFailureCallback) { - this.onTorchActionFailureCallback = onTorchActionFailureCallback; - this.torchButton - = BaseUiElementFactory.createElement( - "button", PublicUiElementIdAndClasses.TORCH_BUTTON_ID); - - this.torchController = new TorchController( - torchCapability, - /* buttonController= */ this, - onTorchActionFailureCallback); - } - - private render( - parentElement: HTMLElement, torchButtonOptions: TorchButtonOptions) { - this.torchButton.innerText - = Html5QrcodeScannerStrings.torchOnButton(); - this.torchButton.style.display = torchButtonOptions.display; - this.torchButton.style.marginLeft = torchButtonOptions.marginLeft; - - let $this = this; - this.torchButton.addEventListener("click", async (_) => { - await $this.torchController.flipState(); - if ($this.torchController.isTorchEnabled()) { - $this.torchButton.classList.remove( - PublicUiElementIdAndClasses.TORCH_BUTTON_CLASS_TORCH_OFF); - $this.torchButton.classList.add( - PublicUiElementIdAndClasses.TORCH_BUTTON_CLASS_TORCH_ON); - } else { - $this.torchButton.classList.remove( - PublicUiElementIdAndClasses.TORCH_BUTTON_CLASS_TORCH_ON); - $this.torchButton.classList.add( - PublicUiElementIdAndClasses.TORCH_BUTTON_CLASS_TORCH_OFF); - } - }); - - parentElement.appendChild(this.torchButton); - } - - public updateTorchCapability(torchCapability: BooleanCameraCapability) { - this.torchController = new TorchController( - torchCapability, - /* buttonController= */ this, - this.onTorchActionFailureCallback); - } - - /** Returns the torch button. */ - public getTorchButton(): HTMLButtonElement { - return this.torchButton; - } - - public hide() { - this.torchButton.style.display = "none"; - } - - public show() { - this.torchButton.style.display = "inline-block"; - } - - disable(): void { - this.torchButton.disabled = true; - } - - enable(): void { - this.torchButton.disabled = false; - } - - setText(text: string): void { - this.torchButton.innerText = text; - } - - /** - * Resets the state. - * - *

    Note: Doesn't turn off the torch implicitly. - */ - public reset() { - this.torchButton.innerText = Html5QrcodeScannerStrings.torchOnButton(); - this.torchController.reset(); - } - - /** - * Factory method for creating torch button. - * - * @param parentElement parent HTML element to render torch button into - * @param torchCapability torch capability of the camera - * @param torchButtonOptions options for creating torch - * @param onTorchActionFailureCallback callback to be called in case of - * torch action failure. - */ - public static create( - parentElement: HTMLElement, - torchCapability: BooleanCameraCapability, - torchButtonOptions: TorchButtonOptions, - onTorchActionFailureCallback: OnTorchActionFailureCallback) - : TorchButton { - let button = new TorchButton( - torchCapability, onTorchActionFailureCallback); - button.render(parentElement, torchButtonOptions); - return button; - } -} diff --git a/node_modules/html5-qrcode/src/utils.d.ts b/node_modules/html5-qrcode/src/utils.d.ts deleted file mode 100644 index 1b060ed..0000000 --- a/node_modules/html5-qrcode/src/utils.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { Logger } from "./core"; -export declare class VideoConstraintsUtil { - static isMediaStreamConstraintsValid(videoConstraints: MediaTrackConstraints, logger: Logger): boolean; -} diff --git a/node_modules/html5-qrcode/src/utils.ts b/node_modules/html5-qrcode/src/utils.ts deleted file mode 100644 index a0e81f5..0000000 --- a/node_modules/html5-qrcode/src/utils.ts +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @fileoverview - * Utils used by {@class Html5Qrcode} & {@class Html5QrcodeScanner} - * - * @author mebjas - * - * The word "QR Code" is registered trademark of DENSO WAVE INCORPORATED - * http://www.denso-wave.com/qrcode/faqpatent-e.html - */ - -import { Logger } from "./core"; - -/** - * Utils around {@interface MediaTrackConstraints} for video. - */ -export class VideoConstraintsUtil { - public static isMediaStreamConstraintsValid( - videoConstraints: MediaTrackConstraints, - logger: Logger): boolean { - if (typeof videoConstraints !== "object") { - const typeofVideoConstraints = typeof videoConstraints; - logger.logError( - "videoConstraints should be of type object, the " - + `object passed is of type ${typeofVideoConstraints}.`, - /* experimental= */ true); - return false; - } - // TODO(mebjas): Make this validity check more sophisticuated - // Following keys are audio controls, audio controls are not supported. - const bannedKeys = [ - "autoGainControl", - "channelCount", - "echoCancellation", - "latency", - "noiseSuppression", - "sampleRate", - "sampleSize", - "volume" - ]; - const bannedkeysSet = new Set(bannedKeys); - const keysInVideoConstraints = Object.keys(videoConstraints); - for (const key of keysInVideoConstraints) { - if (bannedkeysSet.has(key)) { - logger.logError( - `${key} is not supported videoConstaints.`, - /* experimental= */ true); - return false; - } - } - - return true; - } -} diff --git a/node_modules/html5-qrcode/src/zxing-html5-qrcode-decoder.d.ts b/node_modules/html5-qrcode/src/zxing-html5-qrcode-decoder.d.ts deleted file mode 100644 index 411d377..0000000 --- a/node_modules/html5-qrcode/src/zxing-html5-qrcode-decoder.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { QrcodeResult, Html5QrcodeSupportedFormats, Logger, QrcodeDecoderAsync } from "./core"; -export declare class ZXingHtml5QrcodeDecoder implements QrcodeDecoderAsync { - private readonly formatMap; - private readonly reverseFormatMap; - private hints; - private verbose; - private logger; - constructor(requestedFormats: Array, verbose: boolean, logger: Logger); - decodeAsync(canvas: HTMLCanvasElement): Promise; - private decode; - private createReverseFormatMap; - private toHtml5QrcodeSupportedFormats; - private createZXingFormats; - private createDebugData; -} diff --git a/node_modules/html5-qrcode/src/zxing-html5-qrcode-decoder.ts b/node_modules/html5-qrcode/src/zxing-html5-qrcode-decoder.ts deleted file mode 100644 index a021d5d..0000000 --- a/node_modules/html5-qrcode/src/zxing-html5-qrcode-decoder.ts +++ /dev/null @@ -1,155 +0,0 @@ -/** - * @fileoverview - * {@interface QrcodeDecoder} wrapper around ZXing library. - * - * @author mebjas - * - * ZXing library forked from https://github.com/zxing-js/library. - * - * The word "QR Code" is registered trademark of DENSO WAVE INCORPORATED - * http://www.denso-wave.com/qrcode/faqpatent-e.html - */ - -import * as ZXing from "../third_party/zxing-js.umd"; - -import { - QrcodeResult, - QrcodeResultDebugData, - QrcodeResultFormat, - Html5QrcodeSupportedFormats, - Logger, - QrcodeDecoderAsync -} from "./core"; - -/** - * ZXing based Code decoder. - */ -export class ZXingHtml5QrcodeDecoder implements QrcodeDecoderAsync { - - private readonly formatMap: Map - = new Map([ - [Html5QrcodeSupportedFormats.QR_CODE, ZXing.BarcodeFormat.QR_CODE ], - [Html5QrcodeSupportedFormats.AZTEC, ZXing.BarcodeFormat.AZTEC ], - [Html5QrcodeSupportedFormats.CODABAR, ZXing.BarcodeFormat.CODABAR ], - [Html5QrcodeSupportedFormats.CODE_39, ZXing.BarcodeFormat.CODE_39 ], - [Html5QrcodeSupportedFormats.CODE_93, ZXing.BarcodeFormat.CODE_93 ], - [ - Html5QrcodeSupportedFormats.CODE_128, - ZXing.BarcodeFormat.CODE_128 ], - [ - Html5QrcodeSupportedFormats.DATA_MATRIX, - ZXing.BarcodeFormat.DATA_MATRIX ], - [ - Html5QrcodeSupportedFormats.MAXICODE, - ZXing.BarcodeFormat.MAXICODE ], - [Html5QrcodeSupportedFormats.ITF, ZXing.BarcodeFormat.ITF ], - [Html5QrcodeSupportedFormats.EAN_13, ZXing.BarcodeFormat.EAN_13 ], - [Html5QrcodeSupportedFormats.EAN_8, ZXing.BarcodeFormat.EAN_8 ], - [Html5QrcodeSupportedFormats.PDF_417, ZXing.BarcodeFormat.PDF_417 ], - [Html5QrcodeSupportedFormats.RSS_14, ZXing.BarcodeFormat.RSS_14 ], - [ - Html5QrcodeSupportedFormats.RSS_EXPANDED, - ZXing.BarcodeFormat.RSS_EXPANDED ], - [Html5QrcodeSupportedFormats.UPC_A, ZXing.BarcodeFormat.UPC_A ], - [Html5QrcodeSupportedFormats.UPC_E, ZXing.BarcodeFormat.UPC_E ], - [ - Html5QrcodeSupportedFormats.UPC_EAN_EXTENSION, - ZXing.BarcodeFormat.UPC_EAN_EXTENSION ] - ]); - private readonly reverseFormatMap: Map - = this.createReverseFormatMap(); - - private hints: Map; - private verbose: boolean; - private logger: Logger; - - public constructor( - requestedFormats: Array, - verbose: boolean, - logger: Logger) { - if (!ZXing) { - throw "Use html5qrcode.min.js without edit, ZXing not found."; - } - this.verbose = verbose; - this.logger = logger; - - const formats = this.createZXingFormats(requestedFormats); - const hints = new Map(); - hints.set(ZXing.DecodeHintType.POSSIBLE_FORMATS, formats); - // TODO(minhazav): Make this configurable by developers. - hints.set(ZXing.DecodeHintType.TRY_HARDER, false); - this.hints = hints; - } - - - decodeAsync(canvas: HTMLCanvasElement): Promise { - return new Promise((resolve, reject) => { - try { - resolve(this.decode(canvas)); - } catch (error) { - reject(error); - } - }); - } - - private decode(canvas: HTMLCanvasElement): QrcodeResult { - // Note: Earlier we used to instantiate the zxingDecoder once as state - // of this class and use it for each scans. There seems to be some - // stateful bug in ZXing library around RSS_14 likely due to - // https://github.com/zxing-js/library/issues/211. - // Recreating a new instance per scan doesn't lead to performance issues - // and temporarily mitigates this issue. - // TODO(mebjas): Properly fix this issue in ZXing library. - const zxingDecoder = new ZXing.MultiFormatReader( - this.verbose, this.hints); - const luminanceSource - = new ZXing.HTMLCanvasElementLuminanceSource(canvas); - const binaryBitmap - = new ZXing.BinaryBitmap( - new ZXing.HybridBinarizer(luminanceSource)); - let result = zxingDecoder.decode(binaryBitmap); - return { - text: result.text, - format: QrcodeResultFormat.create( - this.toHtml5QrcodeSupportedFormats(result.format)), - debugData: this.createDebugData() - }; - } - - private createReverseFormatMap(): Map { - let result = new Map(); - this.formatMap.forEach( - (value: any, key: Html5QrcodeSupportedFormats, _) => { - result.set(value, key); - }); - return result; - } - - private toHtml5QrcodeSupportedFormats(zxingFormat: any) - : Html5QrcodeSupportedFormats { - if (!this.reverseFormatMap.has(zxingFormat)) { - throw `reverseFormatMap doesn't have ${zxingFormat}`; - } - return this.reverseFormatMap.get(zxingFormat)!; - } - - private createZXingFormats( - requestedFormats: Array): - Array { - let zxingFormats = []; - for (const requestedFormat of requestedFormats) { - if (this.formatMap.has(requestedFormat)) { - zxingFormats.push( - this.formatMap.get(requestedFormat)); - } else { - this.logger.logError(`${requestedFormat} is not supported by` - + "ZXingHtml5QrcodeShim"); - } - } - return zxingFormats; - } - - private createDebugData(): QrcodeResultDebugData { - return { decoderName: "zxing-js" }; - } -} diff --git a/node_modules/html5-qrcode/state-manager.d.ts b/node_modules/html5-qrcode/state-manager.d.ts deleted file mode 100644 index 1c740bb..0000000 --- a/node_modules/html5-qrcode/state-manager.d.ts +++ /dev/null @@ -1,29 +0,0 @@ -export declare enum Html5QrcodeScannerState { - UNKNOWN = 0, - NOT_STARTED = 1, - SCANNING = 2, - PAUSED = 3 -} -export interface StateManagerTransaction { - execute(): void; - cancel(): void; -} -export interface StateManager { - startTransition(newState: Html5QrcodeScannerState): StateManagerTransaction; - directTransition(newState: Html5QrcodeScannerState): void; - getState(): Html5QrcodeScannerState; -} -export declare class StateManagerProxy { - private stateManager; - constructor(stateManager: StateManager); - startTransition(newState: Html5QrcodeScannerState): StateManagerTransaction; - directTransition(newState: Html5QrcodeScannerState): void; - getState(): Html5QrcodeScannerState; - canScanFile(): boolean; - isScanning(): boolean; - isStrictlyScanning(): boolean; - isPaused(): boolean; -} -export declare class StateManagerFactory { - static create(): StateManagerProxy; -} diff --git a/node_modules/html5-qrcode/storage.d.ts b/node_modules/html5-qrcode/storage.d.ts deleted file mode 100644 index cae73a3..0000000 --- a/node_modules/html5-qrcode/storage.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -export declare class PersistedDataManager { - private data; - private static LOCAL_STORAGE_KEY; - constructor(); - hasCameraPermissions(): boolean; - getLastUsedCameraId(): string | null; - setHasPermission(hasPermission: boolean): void; - setLastUsedCameraId(lastUsedCameraId: string): void; - resetLastUsedCameraId(): void; - reset(): void; - private flush; -} diff --git a/node_modules/html5-qrcode/strings.d.ts b/node_modules/html5-qrcode/strings.d.ts deleted file mode 100644 index bb99f90..0000000 --- a/node_modules/html5-qrcode/strings.d.ts +++ /dev/null @@ -1,45 +0,0 @@ -export declare class Html5QrcodeStrings { - static codeParseError(exception: any): string; - static errorGettingUserMedia(error: any): string; - static onlyDeviceSupportedError(): string; - static cameraStreamingNotSupported(): string; - static unableToQuerySupportedDevices(): string; - static insecureContextCameraQueryError(): string; - static scannerPaused(): string; -} -export declare class Html5QrcodeScannerStrings { - static scanningStatus(): string; - static idleStatus(): string; - static errorStatus(): string; - static permissionStatus(): string; - static noCameraFoundErrorStatus(): string; - static lastMatch(decodedText: string): string; - static codeScannerTitle(): string; - static cameraPermissionTitle(): string; - static cameraPermissionRequesting(): string; - static noCameraFound(): string; - static scanButtonStopScanningText(): string; - static scanButtonStartScanningText(): string; - static torchOnButton(): string; - static torchOffButton(): string; - static torchOnFailedMessage(): string; - static torchOffFailedMessage(): string; - static scanButtonScanningStarting(): string; - static textIfCameraScanSelected(): string; - static textIfFileScanSelected(): string; - static selectCamera(): string; - static fileSelectionChooseImage(): string; - static fileSelectionChooseAnother(): string; - static fileSelectionNoImageSelected(): string; - static anonymousCameraPrefix(): string; - static dragAndDropMessage(): string; - static dragAndDropMessageOnlyImages(): string; - static zoom(): string; - static loadingImage(): string; - static cameraScanAltText(): string; - static fileScanAltText(): string; -} -export declare class LibraryInfoStrings { - static poweredBy(): string; - static reportIssues(): string; -} diff --git a/node_modules/html5-qrcode/third_party/zxing-js.umd.d.ts b/node_modules/html5-qrcode/third_party/zxing-js.umd.d.ts deleted file mode 100644 index 63520f7..0000000 --- a/node_modules/html5-qrcode/third_party/zxing-js.umd.d.ts +++ /dev/null @@ -1,43 +0,0 @@ -import * as ZXing from "./zxing-js.umd"; - -declare class HTMLCanvasElementLuminanceSource { - constructor(canvas: HTMLCanvasElement); -} - -declare class HybridBinarizer { - constructor(luminanceSource: HTMLCanvasElementLuminanceSource); -} - -declare class BinaryBitmap { - constructor(binarizer: HybridBinarizer); -} - -declare class MultiFormatReader { - constructor(verbosity: boolean, b: any); - decode(binaryBitmap: BinaryBitmap): any; -} - -export declare enum DecodeHintType { - POSSIBLE_FORMATS = 2, - TRY_HARDER = 3 -} - -export declare enum BarcodeFormat { - AZTEC = 0, - CODABAR = 1, - CODE_39 = 2, - CODE_93 = 3, - CODE_128 = 4, - DATA_MATRIX = 5, - EAN_8 = 6, - EAN_13 = 7, - ITF = 8, - MAXICODE = 9, - PDF_417 = 10, - QR_CODE = 11, - RSS_14 = 12, - RSS_EXPANDED = 13, - UPC_A = 14, - UPC_E = 15, - UPC_EAN_EXTENSION = 16 -} diff --git a/node_modules/html5-qrcode/third_party/zxing-js.umd.js b/node_modules/html5-qrcode/third_party/zxing-js.umd.js deleted file mode 100644 index 6cb3d6f..0000000 --- a/node_modules/html5-qrcode/third_party/zxing-js.umd.js +++ /dev/null @@ -1,23870 +0,0 @@ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : - typeof define === 'function' && define.amd ? define(['exports'], factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.ZXing = {})); -}(this, (function (exports) { 'use strict'; - - function isNullOrUndefined(obj) { - return obj === null || obj === undefined; - } - - /* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /* global Reflect, Promise */ - - var extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - - function __extends(d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - } - - function fixProto(target, prototype) { - var setPrototypeOf = Object.setPrototypeOf; - setPrototypeOf ? setPrototypeOf(target, prototype) : (target.__proto__ = prototype); - } - - function fixStack(target, fn) { - if (fn === void 0) { - fn = target.constructor; - } - var captureStackTrace = Error.captureStackTrace; - captureStackTrace && captureStackTrace(target, fn); - } - - var CustomError = (function (_super) { - __extends(CustomError, _super); - function CustomError(message) { - var _newTarget = this.constructor; - var _this = _super.call(this, message) || this; - Object.defineProperty(_this, 'name', { - value: _newTarget.name, - enumerable: false - }); - fixProto(_this, _newTarget.prototype); - fixStack(_this); - return _this; - } - - return CustomError; - })(Error); - - /** - * Custom Error class of type Exception. - */ - class Exception extends CustomError { - /** - * Allows Exception to be constructed directly - * with some message and prototype definition. - */ - constructor(message = undefined) { - super(message); - this.message = message; - } - getKind() { - const ex = this.constructor; - return ex.kind; - } - } - /** - * It's typed as string so it can be extended and overriden. - */ - Exception.kind = 'Exception'; - - /** - * Custom Error class of type Exception. - */ - class ArgumentException extends Exception { - } - ArgumentException.kind = 'ArgumentException'; - - /** - * Custom Error class of type Exception. - */ - class IllegalArgumentException extends Exception { - } - IllegalArgumentException.kind = 'IllegalArgumentException'; - - /* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - class BinaryBitmap { - constructor(binarizer) { - this.binarizer = binarizer; - if (binarizer === null) { - throw new IllegalArgumentException('Binarizer must be non-null.'); - } - } - /** - * @return The width of the bitmap. - */ - getWidth() { - return this.binarizer.getWidth(); - } - /** - * @return The height of the bitmap. - */ - getHeight() { - return this.binarizer.getHeight(); - } - /** - * Converts one row of luminance data to 1 bit data. May actually do the conversion, or return - * cached data. Callers should assume this method is expensive and call it as seldom as possible. - * This method is intended for decoding 1D barcodes and may choose to apply sharpening. - * - * @param y The row to fetch, which must be in [0, bitmap height) - * @param row An optional preallocated array. If null or too small, it will be ignored. - * If used, the Binarizer will call BitArray.clear(). Always use the returned object. - * @return The array of bits for this row (true means black). - * @throws NotFoundException if row can't be binarized - */ - getBlackRow(y /*int*/, row) { - return this.binarizer.getBlackRow(y, row); - } - /** - * Converts a 2D array of luminance data to 1 bit. As above, assume this method is expensive - * and do not call it repeatedly. This method is intended for decoding 2D barcodes and may or - * may not apply sharpening. Therefore, a row from this matrix may not be identical to one - * fetched using getBlackRow(), so don't mix and match between them. - * - * @return The 2D array of bits for the image (true means black). - * @throws NotFoundException if image can't be binarized to make a matrix - */ - getBlackMatrix() { - // The matrix is created on demand the first time it is requested, then cached. There are two - // reasons for this: - // 1. This work will never be done if the caller only installs 1D Reader objects, or if a - // 1D Reader finds a barcode before the 2D Readers run. - // 2. This work will only be done once even if the caller installs multiple 2D Readers. - if (this.matrix === null || this.matrix === undefined) { - this.matrix = this.binarizer.getBlackMatrix(); - } - return this.matrix; - } - /** - * @return Whether this bitmap can be cropped. - */ - isCropSupported() { - return this.binarizer.getLuminanceSource().isCropSupported(); - } - /** - * Returns a new object with cropped image data. Implementations may keep a reference to the - * original data rather than a copy. Only callable if isCropSupported() is true. - * - * @param left The left coordinate, which must be in [0,getWidth()) - * @param top The top coordinate, which must be in [0,getHeight()) - * @param width The width of the rectangle to crop. - * @param height The height of the rectangle to crop. - * @return A cropped version of this object. - */ - crop(left /*int*/, top /*int*/, width /*int*/, height /*int*/) { - const newSource = this.binarizer.getLuminanceSource().crop(left, top, width, height); - return new BinaryBitmap(this.binarizer.createBinarizer(newSource)); - } - /** - * @return Whether this bitmap supports counter-clockwise rotation. - */ - isRotateSupported() { - return this.binarizer.getLuminanceSource().isRotateSupported(); - } - /** - * Returns a new object with rotated image data by 90 degrees counterclockwise. - * Only callable if {@link #isRotateSupported()} is true. - * - * @return A rotated version of this object. - */ - rotateCounterClockwise() { - const newSource = this.binarizer.getLuminanceSource().rotateCounterClockwise(); - return new BinaryBitmap(this.binarizer.createBinarizer(newSource)); - } - /** - * Returns a new object with rotated image data by 45 degrees counterclockwise. - * Only callable if {@link #isRotateSupported()} is true. - * - * @return A rotated version of this object. - */ - rotateCounterClockwise45() { - const newSource = this.binarizer.getLuminanceSource().rotateCounterClockwise45(); - return new BinaryBitmap(this.binarizer.createBinarizer(newSource)); - } - /*@Override*/ - toString() { - try { - return this.getBlackMatrix().toString(); - } - catch (e /*: NotFoundException*/) { - return ''; - } - } - } - - /** - * Custom Error class of type Exception. - */ - class ChecksumException extends Exception { - static getChecksumInstance() { - return new ChecksumException(); - } - } - ChecksumException.kind = 'ChecksumException'; - - /* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * This class hierarchy provides a set of methods to convert luminance data to 1 bit data. - * It allows the algorithm to vary polymorphically, for example allowing a very expensive - * thresholding technique for servers and a fast one for mobile. It also permits the implementation - * to vary, e.g. a JNI version for Android and a Java fallback version for other platforms. - * - * @author dswitkin@google.com (Daniel Switkin) - */ - class Binarizer { - constructor(source) { - this.source = source; - } - getLuminanceSource() { - return this.source; - } - getWidth() { - return this.source.getWidth(); - } - getHeight() { - return this.source.getHeight(); - } - } - - class System { - // public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) - /** - * Makes a copy of a array. - */ - static arraycopy(src, srcPos, dest, destPos, length) { - // TODO: better use split or set? - while (length--) { - dest[destPos++] = src[srcPos++]; - } - } - /** - * Returns the current time in milliseconds. - */ - static currentTimeMillis() { - return Date.now(); - } - } - - /** - * Custom Error class of type Exception. - */ - class IndexOutOfBoundsException extends Exception { - } - IndexOutOfBoundsException.kind = 'IndexOutOfBoundsException'; - - /** - * Custom Error class of type Exception. - */ - class ArrayIndexOutOfBoundsException extends IndexOutOfBoundsException { - constructor(index = undefined, message = undefined) { - super(message); - this.index = index; - this.message = message; - } - } - ArrayIndexOutOfBoundsException.kind = 'ArrayIndexOutOfBoundsException'; - - class Arrays { - /** - * Assigns the specified int value to each element of the specified array - * of ints. - * - * @param a the array to be filled - * @param val the value to be stored in all elements of the array - */ - static fill(a, val) { - for (let i = 0, len = a.length; i < len; i++) - a[i] = val; - } - /** - * Assigns the specified int value to each element of the specified - * range of the specified array of ints. The range to be filled - * extends from index {@code fromIndex}, inclusive, to index - * {@code toIndex}, exclusive. (If {@code fromIndex==toIndex}, the - * range to be filled is empty.) - * - * @param a the array to be filled - * @param fromIndex the index of the first element (inclusive) to be - * filled with the specified value - * @param toIndex the index of the last element (exclusive) to be - * filled with the specified value - * @param val the value to be stored in all elements of the array - * @throws IllegalArgumentException if {@code fromIndex > toIndex} - * @throws ArrayIndexOutOfBoundsException if {@code fromIndex < 0} or - * {@code toIndex > a.length} - */ - static fillWithin(a, fromIndex, toIndex, val) { - Arrays.rangeCheck(a.length, fromIndex, toIndex); - for (let i = fromIndex; i < toIndex; i++) - a[i] = val; - } - /** - * Checks that {@code fromIndex} and {@code toIndex} are in - * the range and throws an exception if they aren't. - */ - static rangeCheck(arrayLength, fromIndex, toIndex) { - if (fromIndex > toIndex) { - throw new IllegalArgumentException('fromIndex(' + fromIndex + ') > toIndex(' + toIndex + ')'); - } - if (fromIndex < 0) { - throw new ArrayIndexOutOfBoundsException(fromIndex); - } - if (toIndex > arrayLength) { - throw new ArrayIndexOutOfBoundsException(toIndex); - } - } - static asList(...args) { - return args; - } - static create(rows, cols, value) { - let arr = Array.from({ length: rows }); - return arr.map(x => Array.from({ length: cols }).fill(value)); - } - static createInt32Array(rows, cols, value) { - let arr = Array.from({ length: rows }); - return arr.map(x => Int32Array.from({ length: cols }).fill(value)); - } - static equals(first, second) { - if (!first) { - return false; - } - if (!second) { - return false; - } - if (!first.length) { - return false; - } - if (!second.length) { - return false; - } - if (first.length !== second.length) { - return false; - } - for (let i = 0, length = first.length; i < length; i++) { - if (first[i] !== second[i]) { - return false; - } - } - return true; - } - static hashCode(a) { - if (a === null) { - return 0; - } - let result = 1; - for (const element of a) { - result = 31 * result + element; - } - return result; - } - static fillUint8Array(a, value) { - for (let i = 0; i !== a.length; i++) { - a[i] = value; - } - } - static copyOf(original, newLength) { - return original.slice(0, newLength); - } - static copyOfUint8Array(original, newLength) { - if (original.length <= newLength) { - const newArray = new Uint8Array(newLength); - newArray.set(original); - return newArray; - } - return original.slice(0, newLength); - } - static copyOfRange(original, from, to) { - const newLength = to - from; - const copy = new Int32Array(newLength); - System.arraycopy(original, from, copy, 0, newLength); - return copy; - } - /* - * Returns the index of of the element in a sorted array or (-n-1) where n is the insertion point - * for the new element. - * Parameters: - * ar - A sorted array - * el - An element to search for - * comparator - A comparator function. The function takes two arguments: (a, b) and returns: - * a negative number if a is less than b; - * 0 if a is equal to b; - * a positive number of a is greater than b. - * The array may contain duplicate elements. If there are more than one equal elements in the array, - * the returned value can be the index of any one of the equal elements. - * - * http://jsfiddle.net/aryzhov/pkfst550/ - */ - static binarySearch(ar, el, comparator) { - if (undefined === comparator) { - comparator = Arrays.numberComparator; - } - let m = 0; - let n = ar.length - 1; - while (m <= n) { - const k = (n + m) >> 1; - const cmp = comparator(el, ar[k]); - if (cmp > 0) { - m = k + 1; - } - else if (cmp < 0) { - n = k - 1; - } - else { - return k; - } - } - return -m - 1; - } - static numberComparator(a, b) { - return a - b; - } - } - - /** - * Ponyfill for Java's Integer class. - */ - class Integer { - static numberOfTrailingZeros(i) { - let y; - if (i === 0) - return 32; - let n = 31; - y = i << 16; - if (y !== 0) { - n -= 16; - i = y; - } - y = i << 8; - if (y !== 0) { - n -= 8; - i = y; - } - y = i << 4; - if (y !== 0) { - n -= 4; - i = y; - } - y = i << 2; - if (y !== 0) { - n -= 2; - i = y; - } - return n - ((i << 1) >>> 31); - } - static numberOfLeadingZeros(i) { - // HD, Figure 5-6 - if (i === 0) { - return 32; - } - let n = 1; - if (i >>> 16 === 0) { - n += 16; - i <<= 16; - } - if (i >>> 24 === 0) { - n += 8; - i <<= 8; - } - if (i >>> 28 === 0) { - n += 4; - i <<= 4; - } - if (i >>> 30 === 0) { - n += 2; - i <<= 2; - } - n -= i >>> 31; - return n; - } - static toHexString(i) { - return i.toString(16); - } - static toBinaryString(intNumber) { - return String(parseInt(String(intNumber), 2)); - } - // Returns the number of one-bits in the two's complement binary representation of the specified int value. This function is sometimes referred to as the population count. - // Returns: - // the number of one-bits in the two's complement binary representation of the specified int value. - static bitCount(i) { - // HD, Figure 5-2 - i = i - ((i >>> 1) & 0x55555555); - i = (i & 0x33333333) + ((i >>> 2) & 0x33333333); - i = (i + (i >>> 4)) & 0x0f0f0f0f; - i = i + (i >>> 8); - i = i + (i >>> 16); - return i & 0x3f; - } - static truncDivision(dividend, divisor) { - return Math.trunc(dividend / divisor); - } - /** - * Converts A string to an integer. - * @param s A string to convert into a number. - * @param radix A value between 2 and 36 that specifies the base of the number in numString. If this argument is not supplied, strings with a prefix of '0x' are considered hexadecimal. All other strings are considered decimal. - */ - static parseInt(num, radix = undefined) { - return parseInt(num, radix); - } - } - Integer.MIN_VALUE_32_BITS = -2147483648; - Integer.MAX_VALUE = Number.MAX_SAFE_INTEGER; - - /** - *

    A simple, fast array of bits, represented compactly by an array of ints internally.

    - * - * @author Sean Owen - */ - class BitArray /*implements Cloneable*/ { - // For testing only - constructor(size /*int*/, bits) { - if (undefined === size) { - this.size = 0; - this.bits = new Int32Array(1); - } - else { - this.size = size; - if (undefined === bits || null === bits) { - this.bits = BitArray.makeArray(size); - } - else { - this.bits = bits; - } - } - } - getSize() { - return this.size; - } - getSizeInBytes() { - return Math.floor((this.size + 7) / 8); - } - ensureCapacity(size /*int*/) { - if (size > this.bits.length * 32) { - const newBits = BitArray.makeArray(size); - System.arraycopy(this.bits, 0, newBits, 0, this.bits.length); - this.bits = newBits; - } - } - /** - * @param i bit to get - * @return true iff bit i is set - */ - get(i /*int*/) { - return (this.bits[Math.floor(i / 32)] & (1 << (i & 0x1F))) !== 0; - } - /** - * Sets bit i. - * - * @param i bit to set - */ - set(i /*int*/) { - this.bits[Math.floor(i / 32)] |= 1 << (i & 0x1F); - } - /** - * Flips bit i. - * - * @param i bit to set - */ - flip(i /*int*/) { - this.bits[Math.floor(i / 32)] ^= 1 << (i & 0x1F); - } - /** - * @param from first bit to check - * @return index of first bit that is set, starting from the given index, or size if none are set - * at or beyond this given index - * @see #getNextUnset(int) - */ - getNextSet(from /*int*/) { - const size = this.size; - if (from >= size) { - return size; - } - const bits = this.bits; - let bitsOffset = Math.floor(from / 32); - let currentBits = bits[bitsOffset]; - // mask off lesser bits first - currentBits &= ~((1 << (from & 0x1F)) - 1); - const length = bits.length; - while (currentBits === 0) { - if (++bitsOffset === length) { - return size; - } - currentBits = bits[bitsOffset]; - } - const result = (bitsOffset * 32) + Integer.numberOfTrailingZeros(currentBits); - return result > size ? size : result; - } - /** - * @param from index to start looking for unset bit - * @return index of next unset bit, or {@code size} if none are unset until the end - * @see #getNextSet(int) - */ - getNextUnset(from /*int*/) { - const size = this.size; - if (from >= size) { - return size; - } - const bits = this.bits; - let bitsOffset = Math.floor(from / 32); - let currentBits = ~bits[bitsOffset]; - // mask off lesser bits first - currentBits &= ~((1 << (from & 0x1F)) - 1); - const length = bits.length; - while (currentBits === 0) { - if (++bitsOffset === length) { - return size; - } - currentBits = ~bits[bitsOffset]; - } - const result = (bitsOffset * 32) + Integer.numberOfTrailingZeros(currentBits); - return result > size ? size : result; - } - /** - * Sets a block of 32 bits, starting at bit i. - * - * @param i first bit to set - * @param newBits the new value of the next 32 bits. Note again that the least-significant bit - * corresponds to bit i, the next-least-significant to i+1, and so on. - */ - setBulk(i /*int*/, newBits /*int*/) { - this.bits[Math.floor(i / 32)] = newBits; - } - /** - * Sets a range of bits. - * - * @param start start of range, inclusive. - * @param end end of range, exclusive - */ - setRange(start /*int*/, end /*int*/) { - if (end < start || start < 0 || end > this.size) { - throw new IllegalArgumentException(); - } - if (end === start) { - return; - } - end--; // will be easier to treat this as the last actually set bit -- inclusive - const firstInt = Math.floor(start / 32); - const lastInt = Math.floor(end / 32); - const bits = this.bits; - for (let i = firstInt; i <= lastInt; i++) { - const firstBit = i > firstInt ? 0 : start & 0x1F; - const lastBit = i < lastInt ? 31 : end & 0x1F; - // Ones from firstBit to lastBit, inclusive - const mask = (2 << lastBit) - (1 << firstBit); - bits[i] |= mask; - } - } - /** - * Clears all bits (sets to false). - */ - clear() { - const max = this.bits.length; - const bits = this.bits; - for (let i = 0; i < max; i++) { - bits[i] = 0; - } - } - /** - * Efficient method to check if a range of bits is set, or not set. - * - * @param start start of range, inclusive. - * @param end end of range, exclusive - * @param value if true, checks that bits in range are set, otherwise checks that they are not set - * - * @return true iff all bits are set or not set in range, according to value argument - * @throws IllegalArgumentException if end is less than start or the range is not contained in the array - */ - isRange(start /*int*/, end /*int*/, value) { - if (end < start || start < 0 || end > this.size) { - throw new IllegalArgumentException(); - } - if (end === start) { - return true; // empty range matches - } - end--; // will be easier to treat this as the last actually set bit -- inclusive - const firstInt = Math.floor(start / 32); - const lastInt = Math.floor(end / 32); - const bits = this.bits; - for (let i = firstInt; i <= lastInt; i++) { - const firstBit = i > firstInt ? 0 : start & 0x1F; - const lastBit = i < lastInt ? 31 : end & 0x1F; - // Ones from firstBit to lastBit, inclusive - const mask = (2 << lastBit) - (1 << firstBit) & 0xFFFFFFFF; - // TYPESCRIPTPORT: & 0xFFFFFFFF added to discard anything after 32 bits, as ES has 53 bits - // Return false if we're looking for 1s and the masked bits[i] isn't all 1s (is: that, - // equals the mask, or we're looking for 0s and the masked portion is not all 0s - if ((bits[i] & mask) !== (value ? mask : 0)) { - return false; - } - } - return true; - } - appendBit(bit) { - this.ensureCapacity(this.size + 1); - if (bit) { - this.bits[Math.floor(this.size / 32)] |= 1 << (this.size & 0x1F); - } - this.size++; - } - /** - * Appends the least-significant bits, from value, in order from most-significant to - * least-significant. For example, appending 6 bits from 0x000001E will append the bits - * 0, 1, 1, 1, 1, 0 in that order. - * - * @param value {@code int} containing bits to append - * @param numBits bits from value to append - */ - appendBits(value /*int*/, numBits /*int*/) { - if (numBits < 0 || numBits > 32) { - throw new IllegalArgumentException('Num bits must be between 0 and 32'); - } - this.ensureCapacity(this.size + numBits); - // const appendBit = this.appendBit; - for (let numBitsLeft = numBits; numBitsLeft > 0; numBitsLeft--) { - this.appendBit(((value >> (numBitsLeft - 1)) & 0x01) === 1); - } - } - appendBitArray(other) { - const otherSize = other.size; - this.ensureCapacity(this.size + otherSize); - // const appendBit = this.appendBit; - for (let i = 0; i < otherSize; i++) { - this.appendBit(other.get(i)); - } - } - xor(other) { - if (this.size !== other.size) { - throw new IllegalArgumentException('Sizes don\'t match'); - } - const bits = this.bits; - for (let i = 0, length = bits.length; i < length; i++) { - // The last int could be incomplete (i.e. not have 32 bits in - // it) but there is no problem since 0 XOR 0 == 0. - bits[i] ^= other.bits[i]; - } - } - /** - * - * @param bitOffset first bit to start writing - * @param array array to write into. Bytes are written most-significant byte first. This is the opposite - * of the internal representation, which is exposed by {@link #getBitArray()} - * @param offset position in array to start writing - * @param numBytes how many bytes to write - */ - toBytes(bitOffset /*int*/, array, offset /*int*/, numBytes /*int*/) { - for (let i = 0; i < numBytes; i++) { - let theByte = 0; - for (let j = 0; j < 8; j++) { - if (this.get(bitOffset)) { - theByte |= 1 << (7 - j); - } - bitOffset++; - } - array[offset + i] = /*(byte)*/ theByte; - } - } - /** - * @return underlying array of ints. The first element holds the first 32 bits, and the least - * significant bit is bit 0. - */ - getBitArray() { - return this.bits; - } - /** - * Reverses all bits in the array. - */ - reverse() { - const newBits = new Int32Array(this.bits.length); - // reverse all int's first - const len = Math.floor((this.size - 1) / 32); - const oldBitsLen = len + 1; - const bits = this.bits; - for (let i = 0; i < oldBitsLen; i++) { - let x = bits[i]; - x = ((x >> 1) & 0x55555555) | ((x & 0x55555555) << 1); - x = ((x >> 2) & 0x33333333) | ((x & 0x33333333) << 2); - x = ((x >> 4) & 0x0f0f0f0f) | ((x & 0x0f0f0f0f) << 4); - x = ((x >> 8) & 0x00ff00ff) | ((x & 0x00ff00ff) << 8); - x = ((x >> 16) & 0x0000ffff) | ((x & 0x0000ffff) << 16); - newBits[len - i] = /*(int)*/ x; - } - // now correct the int's if the bit size isn't a multiple of 32 - if (this.size !== oldBitsLen * 32) { - const leftOffset = oldBitsLen * 32 - this.size; - let currentInt = newBits[0] >>> leftOffset; - for (let i = 1; i < oldBitsLen; i++) { - const nextInt = newBits[i]; - currentInt |= nextInt << (32 - leftOffset); - newBits[i - 1] = currentInt; - currentInt = nextInt >>> leftOffset; - } - newBits[oldBitsLen - 1] = currentInt; - } - this.bits = newBits; - } - static makeArray(size /*int*/) { - return new Int32Array(Math.floor((size + 31) / 32)); - } - /*@Override*/ - equals(o) { - if (!(o instanceof BitArray)) { - return false; - } - const other = o; - return this.size === other.size && Arrays.equals(this.bits, other.bits); - } - /*@Override*/ - hashCode() { - return 31 * this.size + Arrays.hashCode(this.bits); - } - /*@Override*/ - toString() { - let result = ''; - for (let i = 0, size = this.size; i < size; i++) { - if ((i & 0x07) === 0) { - result += ' '; - } - result += this.get(i) ? 'X' : '.'; - } - return result; - } - /*@Override*/ - clone() { - return new BitArray(this.size, this.bits.slice()); - } - } - - /* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /*namespace com.google.zxing {*/ - /** - * Encapsulates a type of hint that a caller may pass to a barcode reader to help it - * more quickly or accurately decode it. It is up to implementations to decide what, - * if anything, to do with the information that is supplied. - * - * @author Sean Owen - * @author dswitkin@google.com (Daniel Switkin) - * @see Reader#decode(BinaryBitmap,java.util.Map) - */ - var DecodeHintType; - (function (DecodeHintType) { - /** - * Unspecified, application-specific hint. Maps to an unspecified {@link Object}. - */ - DecodeHintType[DecodeHintType["OTHER"] = 0] = "OTHER"; /*(Object.class)*/ - /** - * Image is a pure monochrome image of a barcode. Doesn't matter what it maps to; - * use {@link Boolean#TRUE}. - */ - DecodeHintType[DecodeHintType["PURE_BARCODE"] = 1] = "PURE_BARCODE"; /*(Void.class)*/ - /** - * Image is known to be of one of a few possible formats. - * Maps to a {@link List} of {@link BarcodeFormat}s. - */ - DecodeHintType[DecodeHintType["POSSIBLE_FORMATS"] = 2] = "POSSIBLE_FORMATS"; /*(List.class)*/ - /** - * Spend more time to try to find a barcode; optimize for accuracy, not speed. - * Doesn't matter what it maps to; use {@link Boolean#TRUE}. - */ - DecodeHintType[DecodeHintType["TRY_HARDER"] = 3] = "TRY_HARDER"; /*(Void.class)*/ - /** - * Specifies what character encoding to use when decoding, where applicable (type String) - */ - DecodeHintType[DecodeHintType["CHARACTER_SET"] = 4] = "CHARACTER_SET"; /*(String.class)*/ - /** - * Allowed lengths of encoded data -- reject anything else. Maps to an {@code Int32Array}. - */ - DecodeHintType[DecodeHintType["ALLOWED_LENGTHS"] = 5] = "ALLOWED_LENGTHS"; /*(Int32Array.class)*/ - /** - * Assume Code 39 codes employ a check digit. Doesn't matter what it maps to; - * use {@link Boolean#TRUE}. - */ - DecodeHintType[DecodeHintType["ASSUME_CODE_39_CHECK_DIGIT"] = 6] = "ASSUME_CODE_39_CHECK_DIGIT"; /*(Void.class)*/ - /** - * Assume the barcode is being processed as a GS1 barcode, and modify behavior as needed. - * For example this affects FNC1 handling for Code 128 (aka GS1-128). Doesn't matter what it maps to; - * use {@link Boolean#TRUE}. - */ - DecodeHintType[DecodeHintType["ASSUME_GS1"] = 7] = "ASSUME_GS1"; /*(Void.class)*/ - /** - * If true, return the start and end digits in a Codabar barcode instead of stripping them. They - * are alpha, whereas the rest are numeric. By default, they are stripped, but this causes them - * to not be. Doesn't matter what it maps to; use {@link Boolean#TRUE}. - */ - DecodeHintType[DecodeHintType["RETURN_CODABAR_START_END"] = 8] = "RETURN_CODABAR_START_END"; /*(Void.class)*/ - /** - * The caller needs to be notified via callback when a possible {@link ResultPoint} - * is found. Maps to a {@link ResultPointCallback}. - */ - DecodeHintType[DecodeHintType["NEED_RESULT_POINT_CALLBACK"] = 9] = "NEED_RESULT_POINT_CALLBACK"; /*(ResultPointCallback.class)*/ - /** - * Allowed extension lengths for EAN or UPC barcodes. Other formats will ignore this. - * Maps to an {@code Int32Array} of the allowed extension lengths, for example [2], [5], or [2, 5]. - * If it is optional to have an extension, do not set this hint. If this is set, - * and a UPC or EAN barcode is found but an extension is not, then no result will be returned - * at all. - */ - DecodeHintType[DecodeHintType["ALLOWED_EAN_EXTENSIONS"] = 10] = "ALLOWED_EAN_EXTENSIONS"; /*(Int32Array.class)*/ - // End of enumeration values. - /** - * Data type the hint is expecting. - * Among the possible values the {@link Void} stands out as being used for - * hints that do not expect a value to be supplied (flag hints). Such hints - * will possibly have their value ignored, or replaced by a - * {@link Boolean#TRUE}. Hint suppliers should probably use - * {@link Boolean#TRUE} as directed by the actual hint documentation. - */ - // private valueType: Class - // DecodeHintType(valueType: Class) { - // this.valueType = valueType - // } - // public getValueType(): Class { - // return valueType - // } - })(DecodeHintType || (DecodeHintType = {})); - var DecodeHintType$1 = DecodeHintType; - - /** - * Custom Error class of type Exception. - */ - class FormatException extends Exception { - static getFormatInstance() { - return new FormatException(); - } - } - FormatException.kind = 'FormatException'; - - /*import java.util.HashMap;*/ - /*import java.util.Map;*/ - var CharacterSetValueIdentifiers; - (function (CharacterSetValueIdentifiers) { - CharacterSetValueIdentifiers[CharacterSetValueIdentifiers["Cp437"] = 0] = "Cp437"; - CharacterSetValueIdentifiers[CharacterSetValueIdentifiers["ISO8859_1"] = 1] = "ISO8859_1"; - CharacterSetValueIdentifiers[CharacterSetValueIdentifiers["ISO8859_2"] = 2] = "ISO8859_2"; - CharacterSetValueIdentifiers[CharacterSetValueIdentifiers["ISO8859_3"] = 3] = "ISO8859_3"; - CharacterSetValueIdentifiers[CharacterSetValueIdentifiers["ISO8859_4"] = 4] = "ISO8859_4"; - CharacterSetValueIdentifiers[CharacterSetValueIdentifiers["ISO8859_5"] = 5] = "ISO8859_5"; - CharacterSetValueIdentifiers[CharacterSetValueIdentifiers["ISO8859_6"] = 6] = "ISO8859_6"; - CharacterSetValueIdentifiers[CharacterSetValueIdentifiers["ISO8859_7"] = 7] = "ISO8859_7"; - CharacterSetValueIdentifiers[CharacterSetValueIdentifiers["ISO8859_8"] = 8] = "ISO8859_8"; - CharacterSetValueIdentifiers[CharacterSetValueIdentifiers["ISO8859_9"] = 9] = "ISO8859_9"; - CharacterSetValueIdentifiers[CharacterSetValueIdentifiers["ISO8859_10"] = 10] = "ISO8859_10"; - CharacterSetValueIdentifiers[CharacterSetValueIdentifiers["ISO8859_11"] = 11] = "ISO8859_11"; - CharacterSetValueIdentifiers[CharacterSetValueIdentifiers["ISO8859_13"] = 12] = "ISO8859_13"; - CharacterSetValueIdentifiers[CharacterSetValueIdentifiers["ISO8859_14"] = 13] = "ISO8859_14"; - CharacterSetValueIdentifiers[CharacterSetValueIdentifiers["ISO8859_15"] = 14] = "ISO8859_15"; - CharacterSetValueIdentifiers[CharacterSetValueIdentifiers["ISO8859_16"] = 15] = "ISO8859_16"; - CharacterSetValueIdentifiers[CharacterSetValueIdentifiers["SJIS"] = 16] = "SJIS"; - CharacterSetValueIdentifiers[CharacterSetValueIdentifiers["Cp1250"] = 17] = "Cp1250"; - CharacterSetValueIdentifiers[CharacterSetValueIdentifiers["Cp1251"] = 18] = "Cp1251"; - CharacterSetValueIdentifiers[CharacterSetValueIdentifiers["Cp1252"] = 19] = "Cp1252"; - CharacterSetValueIdentifiers[CharacterSetValueIdentifiers["Cp1256"] = 20] = "Cp1256"; - CharacterSetValueIdentifiers[CharacterSetValueIdentifiers["UnicodeBigUnmarked"] = 21] = "UnicodeBigUnmarked"; - CharacterSetValueIdentifiers[CharacterSetValueIdentifiers["UTF8"] = 22] = "UTF8"; - CharacterSetValueIdentifiers[CharacterSetValueIdentifiers["ASCII"] = 23] = "ASCII"; - CharacterSetValueIdentifiers[CharacterSetValueIdentifiers["Big5"] = 24] = "Big5"; - CharacterSetValueIdentifiers[CharacterSetValueIdentifiers["GB18030"] = 25] = "GB18030"; - CharacterSetValueIdentifiers[CharacterSetValueIdentifiers["EUC_KR"] = 26] = "EUC_KR"; - })(CharacterSetValueIdentifiers || (CharacterSetValueIdentifiers = {})); - /** - * Encapsulates a Character Set ECI, according to "Extended Channel Interpretations" 5.3.1.1 - * of ISO 18004. - * - * @author Sean Owen - */ - class CharacterSetECI { - constructor(valueIdentifier, valuesParam, name, ...otherEncodingNames) { - this.valueIdentifier = valueIdentifier; - this.name = name; - if (typeof valuesParam === 'number') { - this.values = Int32Array.from([valuesParam]); - } - else { - this.values = valuesParam; - } - this.otherEncodingNames = otherEncodingNames; - CharacterSetECI.VALUE_IDENTIFIER_TO_ECI.set(valueIdentifier, this); - CharacterSetECI.NAME_TO_ECI.set(name, this); - const values = this.values; - for (let i = 0, length = values.length; i !== length; i++) { - const v = values[i]; - CharacterSetECI.VALUES_TO_ECI.set(v, this); - } - for (const otherName of otherEncodingNames) { - CharacterSetECI.NAME_TO_ECI.set(otherName, this); - } - } - // CharacterSetECI(value: number /*int*/) { - // this(new Int32Array {value}) - // } - // CharacterSetECI(value: number /*int*/, String... otherEncodingNames) { - // this.values = new Int32Array {value} - // this.otherEncodingNames = otherEncodingNames - // } - // CharacterSetECI(values: Int32Array, String... otherEncodingNames) { - // this.values = values - // this.otherEncodingNames = otherEncodingNames - // } - getValueIdentifier() { - return this.valueIdentifier; - } - getName() { - return this.name; - } - getValue() { - return this.values[0]; - } - /** - * @param value character set ECI value - * @return {@code CharacterSetECI} representing ECI of given value, or null if it is legal but - * unsupported - * @throws FormatException if ECI value is invalid - */ - static getCharacterSetECIByValue(value /*int*/) { - if (value < 0 || value >= 900) { - throw new FormatException('incorect value'); - } - const characterSet = CharacterSetECI.VALUES_TO_ECI.get(value); - if (undefined === characterSet) { - throw new FormatException('incorect value'); - } - return characterSet; - } - /** - * @param name character set ECI encoding name - * @return CharacterSetECI representing ECI for character encoding, or null if it is legal - * but unsupported - */ - static getCharacterSetECIByName(name) { - const characterSet = CharacterSetECI.NAME_TO_ECI.get(name); - if (undefined === characterSet) { - throw new FormatException('incorect value'); - } - return characterSet; - } - equals(o) { - if (!(o instanceof CharacterSetECI)) { - return false; - } - const other = o; - return this.getName() === other.getName(); - } - } - CharacterSetECI.VALUE_IDENTIFIER_TO_ECI = new Map(); - CharacterSetECI.VALUES_TO_ECI = new Map(); - CharacterSetECI.NAME_TO_ECI = new Map(); - // Enum name is a Java encoding valid for java.lang and java.io - // TYPESCRIPTPORT: changed the main label for ISO as the TextEncoder did not recognized them in the form from java - // (eg ISO8859_1 must be ISO88591 or ISO8859-1 or ISO-8859-1) - // later on: well, except 16 wich does not work with ISO885916 so used ISO-8859-1 form for default - CharacterSetECI.Cp437 = new CharacterSetECI(CharacterSetValueIdentifiers.Cp437, Int32Array.from([0, 2]), 'Cp437'); - CharacterSetECI.ISO8859_1 = new CharacterSetECI(CharacterSetValueIdentifiers.ISO8859_1, Int32Array.from([1, 3]), 'ISO-8859-1', 'ISO88591', 'ISO8859_1'); - CharacterSetECI.ISO8859_2 = new CharacterSetECI(CharacterSetValueIdentifiers.ISO8859_2, 4, 'ISO-8859-2', 'ISO88592', 'ISO8859_2'); - CharacterSetECI.ISO8859_3 = new CharacterSetECI(CharacterSetValueIdentifiers.ISO8859_3, 5, 'ISO-8859-3', 'ISO88593', 'ISO8859_3'); - CharacterSetECI.ISO8859_4 = new CharacterSetECI(CharacterSetValueIdentifiers.ISO8859_4, 6, 'ISO-8859-4', 'ISO88594', 'ISO8859_4'); - CharacterSetECI.ISO8859_5 = new CharacterSetECI(CharacterSetValueIdentifiers.ISO8859_5, 7, 'ISO-8859-5', 'ISO88595', 'ISO8859_5'); - CharacterSetECI.ISO8859_6 = new CharacterSetECI(CharacterSetValueIdentifiers.ISO8859_6, 8, 'ISO-8859-6', 'ISO88596', 'ISO8859_6'); - CharacterSetECI.ISO8859_7 = new CharacterSetECI(CharacterSetValueIdentifiers.ISO8859_7, 9, 'ISO-8859-7', 'ISO88597', 'ISO8859_7'); - CharacterSetECI.ISO8859_8 = new CharacterSetECI(CharacterSetValueIdentifiers.ISO8859_8, 10, 'ISO-8859-8', 'ISO88598', 'ISO8859_8'); - CharacterSetECI.ISO8859_9 = new CharacterSetECI(CharacterSetValueIdentifiers.ISO8859_9, 11, 'ISO-8859-9', 'ISO88599', 'ISO8859_9'); - CharacterSetECI.ISO8859_10 = new CharacterSetECI(CharacterSetValueIdentifiers.ISO8859_10, 12, 'ISO-8859-10', 'ISO885910', 'ISO8859_10'); - CharacterSetECI.ISO8859_11 = new CharacterSetECI(CharacterSetValueIdentifiers.ISO8859_11, 13, 'ISO-8859-11', 'ISO885911', 'ISO8859_11'); - CharacterSetECI.ISO8859_13 = new CharacterSetECI(CharacterSetValueIdentifiers.ISO8859_13, 15, 'ISO-8859-13', 'ISO885913', 'ISO8859_13'); - CharacterSetECI.ISO8859_14 = new CharacterSetECI(CharacterSetValueIdentifiers.ISO8859_14, 16, 'ISO-8859-14', 'ISO885914', 'ISO8859_14'); - CharacterSetECI.ISO8859_15 = new CharacterSetECI(CharacterSetValueIdentifiers.ISO8859_15, 17, 'ISO-8859-15', 'ISO885915', 'ISO8859_15'); - CharacterSetECI.ISO8859_16 = new CharacterSetECI(CharacterSetValueIdentifiers.ISO8859_16, 18, 'ISO-8859-16', 'ISO885916', 'ISO8859_16'); - CharacterSetECI.SJIS = new CharacterSetECI(CharacterSetValueIdentifiers.SJIS, 20, 'SJIS', 'Shift_JIS'); - CharacterSetECI.Cp1250 = new CharacterSetECI(CharacterSetValueIdentifiers.Cp1250, 21, 'Cp1250', 'windows-1250'); - CharacterSetECI.Cp1251 = new CharacterSetECI(CharacterSetValueIdentifiers.Cp1251, 22, 'Cp1251', 'windows-1251'); - CharacterSetECI.Cp1252 = new CharacterSetECI(CharacterSetValueIdentifiers.Cp1252, 23, 'Cp1252', 'windows-1252'); - CharacterSetECI.Cp1256 = new CharacterSetECI(CharacterSetValueIdentifiers.Cp1256, 24, 'Cp1256', 'windows-1256'); - CharacterSetECI.UnicodeBigUnmarked = new CharacterSetECI(CharacterSetValueIdentifiers.UnicodeBigUnmarked, 25, 'UnicodeBigUnmarked', 'UTF-16BE', 'UnicodeBig'); - CharacterSetECI.UTF8 = new CharacterSetECI(CharacterSetValueIdentifiers.UTF8, 26, 'UTF8', 'UTF-8'); - CharacterSetECI.ASCII = new CharacterSetECI(CharacterSetValueIdentifiers.ASCII, Int32Array.from([27, 170]), 'ASCII', 'US-ASCII'); - CharacterSetECI.Big5 = new CharacterSetECI(CharacterSetValueIdentifiers.Big5, 28, 'Big5'); - CharacterSetECI.GB18030 = new CharacterSetECI(CharacterSetValueIdentifiers.GB18030, 29, 'GB18030', 'GB2312', 'EUC_CN', 'GBK'); - CharacterSetECI.EUC_KR = new CharacterSetECI(CharacterSetValueIdentifiers.EUC_KR, 30, 'EUC_KR', 'EUC-KR'); - - /** - * Custom Error class of type Exception. - */ - class UnsupportedOperationException extends Exception { - } - UnsupportedOperationException.kind = 'UnsupportedOperationException'; - - /** - * Responsible for en/decoding strings. - */ - class StringEncoding { - /** - * Decodes some Uint8Array to a string format. - */ - static decode(bytes, encoding) { - const encodingName = this.encodingName(encoding); - if (this.customDecoder) { - return this.customDecoder(bytes, encodingName); - } - // Increases browser support. - if (typeof TextDecoder === 'undefined' || this.shouldDecodeOnFallback(encodingName)) { - return this.decodeFallback(bytes, encodingName); - } - return new TextDecoder(encodingName).decode(bytes); - } - /** - * Checks if the decoding method should use the fallback for decoding - * once Node TextDecoder doesn't support all encoding formats. - * - * @param encodingName - */ - static shouldDecodeOnFallback(encodingName) { - return !StringEncoding.isBrowser() && encodingName === 'ISO-8859-1'; - } - /** - * Encodes some string into a Uint8Array. - */ - static encode(s, encoding) { - const encodingName = this.encodingName(encoding); - if (this.customEncoder) { - return this.customEncoder(s, encodingName); - } - // Increases browser support. - if (typeof TextEncoder === 'undefined') { - return this.encodeFallback(s); - } - // TextEncoder only encodes to UTF8 by default as specified by encoding.spec.whatwg.org - return new TextEncoder().encode(s); - } - static isBrowser() { - return (typeof window !== 'undefined' && {}.toString.call(window) === '[object Window]'); - } - /** - * Returns the string value from some encoding character set. - */ - static encodingName(encoding) { - return typeof encoding === 'string' - ? encoding - : encoding.getName(); - } - /** - * Returns character set from some encoding character set. - */ - static encodingCharacterSet(encoding) { - if (encoding instanceof CharacterSetECI) { - return encoding; - } - return CharacterSetECI.getCharacterSetECIByName(encoding); - } - /** - * Runs a fallback for the native decoding funcion. - */ - static decodeFallback(bytes, encoding) { - const characterSet = this.encodingCharacterSet(encoding); - if (StringEncoding.isDecodeFallbackSupported(characterSet)) { - let s = ''; - for (let i = 0, length = bytes.length; i < length; i++) { - let h = bytes[i].toString(16); - if (h.length < 2) { - h = '0' + h; - } - s += '%' + h; - } - return decodeURIComponent(s); - } - if (characterSet.equals(CharacterSetECI.UnicodeBigUnmarked)) { - return String.fromCharCode.apply(null, new Uint16Array(bytes.buffer)); - } - throw new UnsupportedOperationException(`Encoding ${this.encodingName(encoding)} not supported by fallback.`); - } - static isDecodeFallbackSupported(characterSet) { - return characterSet.equals(CharacterSetECI.UTF8) || - characterSet.equals(CharacterSetECI.ISO8859_1) || - characterSet.equals(CharacterSetECI.ASCII); - } - /** - * Runs a fallback for the native encoding funcion. - * - * @see https://stackoverflow.com/a/17192845/4367683 - */ - static encodeFallback(s) { - const encodedURIstring = btoa(unescape(encodeURIComponent(s))); - const charList = encodedURIstring.split(''); - const uintArray = []; - for (let i = 0; i < charList.length; i++) { - uintArray.push(charList[i].charCodeAt(0)); - } - return new Uint8Array(uintArray); - } - } - - /* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * Common string-related functions. - * - * @author Sean Owen - * @author Alex Dupre - */ - class StringUtils { - // SHIFT_JIS.equalsIgnoreCase(PLATFORM_DEFAULT_ENCODING) || - // EUC_JP.equalsIgnoreCase(PLATFORM_DEFAULT_ENCODING); - static castAsNonUtf8Char(code, encoding = null) { - // ISO 8859-1 is the Java default as UTF-8 is JavaScripts - // you can see this method as a Java version of String.fromCharCode - const e = encoding ? encoding.getName() : this.ISO88591; - // use passed format (fromCharCode will return UTF8 encoding) - return StringEncoding.decode(new Uint8Array([code]), e); - } - /** - * @param bytes bytes encoding a string, whose encoding should be guessed - * @param hints decode hints if applicable - * @return name of guessed encoding; at the moment will only guess one of: - * {@link #SHIFT_JIS}, {@link #UTF8}, {@link #ISO88591}, or the platform - * default encoding if none of these can possibly be correct - */ - static guessEncoding(bytes, hints) { - if (hints !== null && hints !== undefined && undefined !== hints.get(DecodeHintType$1.CHARACTER_SET)) { - return hints.get(DecodeHintType$1.CHARACTER_SET).toString(); - } - // For now, merely tries to distinguish ISO-8859-1, UTF-8 and Shift_JIS, - // which should be by far the most common encodings. - const length = bytes.length; - let canBeISO88591 = true; - let canBeShiftJIS = true; - let canBeUTF8 = true; - let utf8BytesLeft = 0; - // int utf8LowChars = 0 - let utf2BytesChars = 0; - let utf3BytesChars = 0; - let utf4BytesChars = 0; - let sjisBytesLeft = 0; - // int sjisLowChars = 0 - let sjisKatakanaChars = 0; - // int sjisDoubleBytesChars = 0 - let sjisCurKatakanaWordLength = 0; - let sjisCurDoubleBytesWordLength = 0; - let sjisMaxKatakanaWordLength = 0; - let sjisMaxDoubleBytesWordLength = 0; - // int isoLowChars = 0 - // int isoHighChars = 0 - let isoHighOther = 0; - const utf8bom = bytes.length > 3 && - bytes[0] === /*(byte) */ 0xEF && - bytes[1] === /*(byte) */ 0xBB && - bytes[2] === /*(byte) */ 0xBF; - for (let i = 0; i < length && (canBeISO88591 || canBeShiftJIS || canBeUTF8); i++) { - const value = bytes[i] & 0xFF; - // UTF-8 stuff - if (canBeUTF8) { - if (utf8BytesLeft > 0) { - if ((value & 0x80) === 0) { - canBeUTF8 = false; - } - else { - utf8BytesLeft--; - } - } - else if ((value & 0x80) !== 0) { - if ((value & 0x40) === 0) { - canBeUTF8 = false; - } - else { - utf8BytesLeft++; - if ((value & 0x20) === 0) { - utf2BytesChars++; - } - else { - utf8BytesLeft++; - if ((value & 0x10) === 0) { - utf3BytesChars++; - } - else { - utf8BytesLeft++; - if ((value & 0x08) === 0) { - utf4BytesChars++; - } - else { - canBeUTF8 = false; - } - } - } - } - } // else { - // utf8LowChars++ - // } - } - // ISO-8859-1 stuff - if (canBeISO88591) { - if (value > 0x7F && value < 0xA0) { - canBeISO88591 = false; - } - else if (value > 0x9F) { - if (value < 0xC0 || value === 0xD7 || value === 0xF7) { - isoHighOther++; - } // else { - // isoHighChars++ - // } - } // else { - // isoLowChars++ - // } - } - // Shift_JIS stuff - if (canBeShiftJIS) { - if (sjisBytesLeft > 0) { - if (value < 0x40 || value === 0x7F || value > 0xFC) { - canBeShiftJIS = false; - } - else { - sjisBytesLeft--; - } - } - else if (value === 0x80 || value === 0xA0 || value > 0xEF) { - canBeShiftJIS = false; - } - else if (value > 0xA0 && value < 0xE0) { - sjisKatakanaChars++; - sjisCurDoubleBytesWordLength = 0; - sjisCurKatakanaWordLength++; - if (sjisCurKatakanaWordLength > sjisMaxKatakanaWordLength) { - sjisMaxKatakanaWordLength = sjisCurKatakanaWordLength; - } - } - else if (value > 0x7F) { - sjisBytesLeft++; - // sjisDoubleBytesChars++ - sjisCurKatakanaWordLength = 0; - sjisCurDoubleBytesWordLength++; - if (sjisCurDoubleBytesWordLength > sjisMaxDoubleBytesWordLength) { - sjisMaxDoubleBytesWordLength = sjisCurDoubleBytesWordLength; - } - } - else { - // sjisLowChars++ - sjisCurKatakanaWordLength = 0; - sjisCurDoubleBytesWordLength = 0; - } - } - } - if (canBeUTF8 && utf8BytesLeft > 0) { - canBeUTF8 = false; - } - if (canBeShiftJIS && sjisBytesLeft > 0) { - canBeShiftJIS = false; - } - // Easy -- if there is BOM or at least 1 valid not-single byte character (and no evidence it can't be UTF-8), done - if (canBeUTF8 && (utf8bom || utf2BytesChars + utf3BytesChars + utf4BytesChars > 0)) { - return StringUtils.UTF8; - } - // Easy -- if assuming Shift_JIS or at least 3 valid consecutive not-ascii characters (and no evidence it can't be), done - if (canBeShiftJIS && (StringUtils.ASSUME_SHIFT_JIS || sjisMaxKatakanaWordLength >= 3 || sjisMaxDoubleBytesWordLength >= 3)) { - return StringUtils.SHIFT_JIS; - } - // Distinguishing Shift_JIS and ISO-8859-1 can be a little tough for short words. The crude heuristic is: - // - If we saw - // - only two consecutive katakana chars in the whole text, or - // - at least 10% of bytes that could be "upper" not-alphanumeric Latin1, - // - then we conclude Shift_JIS, else ISO-8859-1 - if (canBeISO88591 && canBeShiftJIS) { - return (sjisMaxKatakanaWordLength === 2 && sjisKatakanaChars === 2) || isoHighOther * 10 >= length - ? StringUtils.SHIFT_JIS : StringUtils.ISO88591; - } - // Otherwise, try in order ISO-8859-1, Shift JIS, UTF-8 and fall back to default platform encoding - if (canBeISO88591) { - return StringUtils.ISO88591; - } - if (canBeShiftJIS) { - return StringUtils.SHIFT_JIS; - } - if (canBeUTF8) { - return StringUtils.UTF8; - } - // Otherwise, we take a wild guess with platform encoding - return StringUtils.PLATFORM_DEFAULT_ENCODING; - } - /** - * - * @see https://stackoverflow.com/a/13439711/4367683 - * - * @param append The new string to append. - * @param args Argumets values to be formated. - */ - static format(append, ...args) { - let i = -1; - function callback(exp, p0, p1, p2, p3, p4) { - if (exp === '%%') - return '%'; - if (args[++i] === undefined) - return undefined; - exp = p2 ? parseInt(p2.substr(1)) : undefined; - let base = p3 ? parseInt(p3.substr(1)) : undefined; - let val; - switch (p4) { - case 's': - val = args[i]; - break; - case 'c': - val = args[i][0]; - break; - case 'f': - val = parseFloat(args[i]).toFixed(exp); - break; - case 'p': - val = parseFloat(args[i]).toPrecision(exp); - break; - case 'e': - val = parseFloat(args[i]).toExponential(exp); - break; - case 'x': - val = parseInt(args[i]).toString(base ? base : 16); - break; - case 'd': - val = parseFloat(parseInt(args[i], base ? base : 10).toPrecision(exp)).toFixed(0); - break; - } - val = typeof val === 'object' ? JSON.stringify(val) : (+val).toString(base); - let size = parseInt(p1); /* padding size */ - let ch = p1 && (p1[0] + '') === '0' ? '0' : ' '; /* isnull? */ - while (val.length < size) - val = p0 !== undefined ? val + ch : ch + val; /* isminus? */ - return val; - } - let regex = /%(-)?(0?[0-9]+)?([.][0-9]+)?([#][0-9]+)?([scfpexd%])/g; - return append.replace(regex, callback); - } - /** - * - */ - static getBytes(str, encoding) { - return StringEncoding.encode(str, encoding); - } - /** - * Returns the charcode at the specified index or at index zero. - */ - static getCharCode(str, index = 0) { - return str.charCodeAt(index); - } - /** - * Returns char for given charcode - */ - static getCharAt(charCode) { - return String.fromCharCode(charCode); - } - } - StringUtils.SHIFT_JIS = CharacterSetECI.SJIS.getName(); // "SJIS" - StringUtils.GB2312 = 'GB2312'; - StringUtils.ISO88591 = CharacterSetECI.ISO8859_1.getName(); // "ISO8859_1" - StringUtils.EUC_JP = 'EUC_JP'; - StringUtils.UTF8 = CharacterSetECI.UTF8.getName(); // "UTF8" - StringUtils.PLATFORM_DEFAULT_ENCODING = StringUtils.UTF8; // "UTF8"//Charset.defaultCharset().name() - StringUtils.ASSUME_SHIFT_JIS = false; - - class StringBuilder { - constructor(value = '') { - this.value = value; - } - enableDecoding(encoding) { - this.encoding = encoding; - return this; - } - append(s) { - if (typeof s === 'string') { - this.value += s.toString(); - } - else if (this.encoding) { - // use passed format (fromCharCode will return UTF8 encoding) - this.value += StringUtils.castAsNonUtf8Char(s, this.encoding); - } - else { - // correctly converts from UTF-8, but not other encodings - this.value += String.fromCharCode(s); - } - return this; - } - appendChars(str, offset, len) { - for (let i = offset; offset < offset + len; i++) { - this.append(str[i]); - } - return this; - } - length() { - return this.value.length; - } - charAt(n) { - return this.value.charAt(n); - } - deleteCharAt(n) { - this.value = this.value.substr(0, n) + this.value.substring(n + 1); - } - setCharAt(n, c) { - this.value = this.value.substr(0, n) + c + this.value.substr(n + 1); - } - substring(start, end) { - return this.value.substring(start, end); - } - /** - * @note helper method for RSS Expanded - */ - setLengthToZero() { - this.value = ''; - } - toString() { - return this.value; - } - insert(n, c) { - this.value = this.value.substr(0, n) + c + this.value.substr(n + c.length); - } - } - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - *

    Represents a 2D matrix of bits. In function arguments below, and throughout the common - * module, x is the column position, and y is the row position. The ordering is always x, y. - * The origin is at the top-left.

    - * - *

    Internally the bits are represented in a 1-D array of 32-bit ints. However, each row begins - * with a new int. This is done intentionally so that we can copy out a row into a BitArray very - * efficiently.

    - * - *

    The ordering of bits is row-major. Within each int, the least significant bits are used first, - * meaning they represent lower x values. This is compatible with BitArray's implementation.

    - * - * @author Sean Owen - * @author dswitkin@google.com (Daniel Switkin) - */ - class BitMatrix /*implements Cloneable*/ { - /** - * Creates an empty square {@link BitMatrix}. - * - * @param dimension height and width - */ - // public constructor(dimension: number /*int*/) { - // this(dimension, dimension) - // } - /** - * Creates an empty {@link BitMatrix}. - * - * @param width bit matrix width - * @param height bit matrix height - */ - // public constructor(width: number /*int*/, height: number /*int*/) { - // if (width < 1 || height < 1) { - // throw new IllegalArgumentException("Both dimensions must be greater than 0") - // } - // this.width = width - // this.height = height - // this.rowSize = (width + 31) / 32 - // bits = new int[rowSize * height]; - // } - constructor(width /*int*/, height /*int*/, rowSize /*int*/, bits) { - this.width = width; - this.height = height; - this.rowSize = rowSize; - this.bits = bits; - if (undefined === height || null === height) { - height = width; - } - this.height = height; - if (width < 1 || height < 1) { - throw new IllegalArgumentException('Both dimensions must be greater than 0'); - } - if (undefined === rowSize || null === rowSize) { - rowSize = Math.floor((width + 31) / 32); - } - this.rowSize = rowSize; - if (undefined === bits || null === bits) { - this.bits = new Int32Array(this.rowSize * this.height); - } - } - /** - * Interprets a 2D array of booleans as a {@link BitMatrix}, where "true" means an "on" bit. - * - * @function parse - * @param image bits of the image, as a row-major 2D array. Elements are arrays representing rows - * @return {@link BitMatrix} representation of image - */ - static parseFromBooleanArray(image) { - const height = image.length; - const width = image[0].length; - const bits = new BitMatrix(width, height); - for (let i = 0; i < height; i++) { - const imageI = image[i]; - for (let j = 0; j < width; j++) { - if (imageI[j]) { - bits.set(j, i); - } - } - } - return bits; - } - /** - * - * @function parse - * @param stringRepresentation - * @param setString - * @param unsetString - */ - static parseFromString(stringRepresentation, setString, unsetString) { - if (stringRepresentation === null) { - throw new IllegalArgumentException('stringRepresentation cannot be null'); - } - const bits = new Array(stringRepresentation.length); - let bitsPos = 0; - let rowStartPos = 0; - let rowLength = -1; - let nRows = 0; - let pos = 0; - while (pos < stringRepresentation.length) { - if (stringRepresentation.charAt(pos) === '\n' || - stringRepresentation.charAt(pos) === '\r') { - if (bitsPos > rowStartPos) { - if (rowLength === -1) { - rowLength = bitsPos - rowStartPos; - } - else if (bitsPos - rowStartPos !== rowLength) { - throw new IllegalArgumentException('row lengths do not match'); - } - rowStartPos = bitsPos; - nRows++; - } - pos++; - } - else if (stringRepresentation.substring(pos, pos + setString.length) === setString) { - pos += setString.length; - bits[bitsPos] = true; - bitsPos++; - } - else if (stringRepresentation.substring(pos, pos + unsetString.length) === unsetString) { - pos += unsetString.length; - bits[bitsPos] = false; - bitsPos++; - } - else { - throw new IllegalArgumentException('illegal character encountered: ' + stringRepresentation.substring(pos)); - } - } - // no EOL at end? - if (bitsPos > rowStartPos) { - if (rowLength === -1) { - rowLength = bitsPos - rowStartPos; - } - else if (bitsPos - rowStartPos !== rowLength) { - throw new IllegalArgumentException('row lengths do not match'); - } - nRows++; - } - const matrix = new BitMatrix(rowLength, nRows); - for (let i = 0; i < bitsPos; i++) { - if (bits[i]) { - matrix.set(Math.floor(i % rowLength), Math.floor(i / rowLength)); - } - } - return matrix; - } - /** - *

    Gets the requested bit, where true means black.

    - * - * @param x The horizontal component (i.e. which column) - * @param y The vertical component (i.e. which row) - * @return value of given bit in matrix - */ - get(x /*int*/, y /*int*/) { - const offset = y * this.rowSize + Math.floor(x / 32); - return ((this.bits[offset] >>> (x & 0x1f)) & 1) !== 0; - } - /** - *

    Sets the given bit to true.

    - * - * @param x The horizontal component (i.e. which column) - * @param y The vertical component (i.e. which row) - */ - set(x /*int*/, y /*int*/) { - const offset = y * this.rowSize + Math.floor(x / 32); - this.bits[offset] |= (1 << (x & 0x1f)) & 0xFFFFFFFF; - } - unset(x /*int*/, y /*int*/) { - const offset = y * this.rowSize + Math.floor(x / 32); - this.bits[offset] &= ~((1 << (x & 0x1f)) & 0xFFFFFFFF); - } - /** - *

    Flips the given bit.

    - * - * @param x The horizontal component (i.e. which column) - * @param y The vertical component (i.e. which row) - */ - flip(x /*int*/, y /*int*/) { - const offset = y * this.rowSize + Math.floor(x / 32); - this.bits[offset] ^= ((1 << (x & 0x1f)) & 0xFFFFFFFF); - } - /** - * Exclusive-or (XOR): Flip the bit in this {@code BitMatrix} if the corresponding - * mask bit is set. - * - * @param mask XOR mask - */ - xor(mask) { - if (this.width !== mask.getWidth() || this.height !== mask.getHeight() - || this.rowSize !== mask.getRowSize()) { - throw new IllegalArgumentException('input matrix dimensions do not match'); - } - const rowArray = new BitArray(Math.floor(this.width / 32) + 1); - const rowSize = this.rowSize; - const bits = this.bits; - for (let y = 0, height = this.height; y < height; y++) { - const offset = y * rowSize; - const row = mask.getRow(y, rowArray).getBitArray(); - for (let x = 0; x < rowSize; x++) { - bits[offset + x] ^= row[x]; - } - } - } - /** - * Clears all bits (sets to false). - */ - clear() { - const bits = this.bits; - const max = bits.length; - for (let i = 0; i < max; i++) { - bits[i] = 0; - } - } - /** - *

    Sets a square region of the bit matrix to true.

    - * - * @param left The horizontal position to begin at (inclusive) - * @param top The vertical position to begin at (inclusive) - * @param width The width of the region - * @param height The height of the region - */ - setRegion(left /*int*/, top /*int*/, width /*int*/, height /*int*/) { - if (top < 0 || left < 0) { - throw new IllegalArgumentException('Left and top must be nonnegative'); - } - if (height < 1 || width < 1) { - throw new IllegalArgumentException('Height and width must be at least 1'); - } - const right = left + width; - const bottom = top + height; - if (bottom > this.height || right > this.width) { - throw new IllegalArgumentException('The region must fit inside the matrix'); - } - const rowSize = this.rowSize; - const bits = this.bits; - for (let y = top; y < bottom; y++) { - const offset = y * rowSize; - for (let x = left; x < right; x++) { - bits[offset + Math.floor(x / 32)] |= ((1 << (x & 0x1f)) & 0xFFFFFFFF); - } - } - } - /** - * A fast method to retrieve one row of data from the matrix as a BitArray. - * - * @param y The row to retrieve - * @param row An optional caller-allocated BitArray, will be allocated if null or too small - * @return The resulting BitArray - this reference should always be used even when passing - * your own row - */ - getRow(y /*int*/, row) { - if (row === null || row === undefined || row.getSize() < this.width) { - row = new BitArray(this.width); - } - else { - row.clear(); - } - const rowSize = this.rowSize; - const bits = this.bits; - const offset = y * rowSize; - for (let x = 0; x < rowSize; x++) { - row.setBulk(x * 32, bits[offset + x]); - } - return row; - } - /** - * @param y row to set - * @param row {@link BitArray} to copy from - */ - setRow(y /*int*/, row) { - System.arraycopy(row.getBitArray(), 0, this.bits, y * this.rowSize, this.rowSize); - } - /** - * Modifies this {@code BitMatrix} to represent the same but rotated 180 degrees - */ - rotate180() { - const width = this.getWidth(); - const height = this.getHeight(); - let topRow = new BitArray(width); - let bottomRow = new BitArray(width); - for (let i = 0, length = Math.floor((height + 1) / 2); i < length; i++) { - topRow = this.getRow(i, topRow); - bottomRow = this.getRow(height - 1 - i, bottomRow); - topRow.reverse(); - bottomRow.reverse(); - this.setRow(i, bottomRow); - this.setRow(height - 1 - i, topRow); - } - } - /** - * This is useful in detecting the enclosing rectangle of a 'pure' barcode. - * - * @return {@code left,top,width,height} enclosing rectangle of all 1 bits, or null if it is all white - */ - getEnclosingRectangle() { - const width = this.width; - const height = this.height; - const rowSize = this.rowSize; - const bits = this.bits; - let left = width; - let top = height; - let right = -1; - let bottom = -1; - for (let y = 0; y < height; y++) { - for (let x32 = 0; x32 < rowSize; x32++) { - const theBits = bits[y * rowSize + x32]; - if (theBits !== 0) { - if (y < top) { - top = y; - } - if (y > bottom) { - bottom = y; - } - if (x32 * 32 < left) { - let bit = 0; - while (((theBits << (31 - bit)) & 0xFFFFFFFF) === 0) { - bit++; - } - if ((x32 * 32 + bit) < left) { - left = x32 * 32 + bit; - } - } - if (x32 * 32 + 31 > right) { - let bit = 31; - while ((theBits >>> bit) === 0) { - bit--; - } - if ((x32 * 32 + bit) > right) { - right = x32 * 32 + bit; - } - } - } - } - } - if (right < left || bottom < top) { - return null; - } - return Int32Array.from([left, top, right - left + 1, bottom - top + 1]); - } - /** - * This is useful in detecting a corner of a 'pure' barcode. - * - * @return {@code x,y} coordinate of top-left-most 1 bit, or null if it is all white - */ - getTopLeftOnBit() { - const rowSize = this.rowSize; - const bits = this.bits; - let bitsOffset = 0; - while (bitsOffset < bits.length && bits[bitsOffset] === 0) { - bitsOffset++; - } - if (bitsOffset === bits.length) { - return null; - } - const y = bitsOffset / rowSize; - let x = (bitsOffset % rowSize) * 32; - const theBits = bits[bitsOffset]; - let bit = 0; - while (((theBits << (31 - bit)) & 0xFFFFFFFF) === 0) { - bit++; - } - x += bit; - return Int32Array.from([x, y]); - } - getBottomRightOnBit() { - const rowSize = this.rowSize; - const bits = this.bits; - let bitsOffset = bits.length - 1; - while (bitsOffset >= 0 && bits[bitsOffset] === 0) { - bitsOffset--; - } - if (bitsOffset < 0) { - return null; - } - const y = Math.floor(bitsOffset / rowSize); - let x = Math.floor(bitsOffset % rowSize) * 32; - const theBits = bits[bitsOffset]; - let bit = 31; - while ((theBits >>> bit) === 0) { - bit--; - } - x += bit; - return Int32Array.from([x, y]); - } - /** - * @return The width of the matrix - */ - getWidth() { - return this.width; - } - /** - * @return The height of the matrix - */ - getHeight() { - return this.height; - } - /** - * @return The row size of the matrix - */ - getRowSize() { - return this.rowSize; - } - /*@Override*/ - equals(o) { - if (!(o instanceof BitMatrix)) { - return false; - } - const other = o; - return this.width === other.width && this.height === other.height && this.rowSize === other.rowSize && - Arrays.equals(this.bits, other.bits); - } - /*@Override*/ - hashCode() { - let hash = this.width; - hash = 31 * hash + this.width; - hash = 31 * hash + this.height; - hash = 31 * hash + this.rowSize; - hash = 31 * hash + Arrays.hashCode(this.bits); - return hash; - } - /** - * @return string representation using "X" for set and " " for unset bits - */ - /*@Override*/ - // public toString(): string { - // return toString(": "X, " ") - // } - /** - * @param setString representation of a set bit - * @param unsetString representation of an unset bit - * @return string representation of entire matrix utilizing given strings - */ - // public toString(setString: string = "X ", unsetString: string = " "): string { - // return this.buildToString(setString, unsetString, "\n") - // } - /** - * @param setString representation of a set bit - * @param unsetString representation of an unset bit - * @param lineSeparator newline character in string representation - * @return string representation of entire matrix utilizing given strings and line separator - * @deprecated call {@link #toString(String,String)} only, which uses \n line separator always - */ - // @Deprecated - toString(setString = 'X ', unsetString = ' ', lineSeparator = '\n') { - return this.buildToString(setString, unsetString, lineSeparator); - } - buildToString(setString, unsetString, lineSeparator) { - let result = new StringBuilder(); - // result.append(lineSeparator); - for (let y = 0, height = this.height; y < height; y++) { - for (let x = 0, width = this.width; x < width; x++) { - result.append(this.get(x, y) ? setString : unsetString); - } - result.append(lineSeparator); - } - return result.toString(); - } - /*@Override*/ - clone() { - return new BitMatrix(this.width, this.height, this.rowSize, this.bits.slice()); - } - } - - /** - * Custom Error class of type Exception. - */ - class NotFoundException extends Exception { - static getNotFoundInstance() { - return new NotFoundException(); - } - } - NotFoundException.kind = 'NotFoundException'; - - /* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * This Binarizer implementation uses the old ZXing global histogram approach. It is suitable - * for low-end mobile devices which don't have enough CPU or memory to use a local thresholding - * algorithm. However, because it picks a global black point, it cannot handle difficult shadows - * and gradients. - * - * Faster mobile devices and all desktop applications should probably use HybridBinarizer instead. - * - * @author dswitkin@google.com (Daniel Switkin) - * @author Sean Owen - */ - class GlobalHistogramBinarizer extends Binarizer { - constructor(source) { - super(source); - this.luminances = GlobalHistogramBinarizer.EMPTY; - this.buckets = new Int32Array(GlobalHistogramBinarizer.LUMINANCE_BUCKETS); - } - // Applies simple sharpening to the row data to improve performance of the 1D Readers. - /*@Override*/ - getBlackRow(y /*int*/, row) { - const source = this.getLuminanceSource(); - const width = source.getWidth(); - if (row === undefined || row === null || row.getSize() < width) { - row = new BitArray(width); - } - else { - row.clear(); - } - this.initArrays(width); - const localLuminances = source.getRow(y, this.luminances); - const localBuckets = this.buckets; - for (let x = 0; x < width; x++) { - localBuckets[(localLuminances[x] & 0xff) >> GlobalHistogramBinarizer.LUMINANCE_SHIFT]++; - } - const blackPoint = GlobalHistogramBinarizer.estimateBlackPoint(localBuckets); - if (width < 3) { - // Special case for very small images - for (let x = 0; x < width; x++) { - if ((localLuminances[x] & 0xff) < blackPoint) { - row.set(x); - } - } - } - else { - let left = localLuminances[0] & 0xff; - let center = localLuminances[1] & 0xff; - for (let x = 1; x < width - 1; x++) { - const right = localLuminances[x + 1] & 0xff; - // A simple -1 4 -1 box filter with a weight of 2. - if (((center * 4) - left - right) / 2 < blackPoint) { - row.set(x); - } - left = center; - center = right; - } - } - return row; - } - // Does not sharpen the data, as this call is intended to only be used by 2D Readers. - /*@Override*/ - getBlackMatrix() { - const source = this.getLuminanceSource(); - const width = source.getWidth(); - const height = source.getHeight(); - const matrix = new BitMatrix(width, height); - // Quickly calculates the histogram by sampling four rows from the image. This proved to be - // more robust on the blackbox tests than sampling a diagonal as we used to do. - this.initArrays(width); - const localBuckets = this.buckets; - for (let y = 1; y < 5; y++) { - const row = Math.floor((height * y) / 5); - const localLuminances = source.getRow(row, this.luminances); - const right = Math.floor((width * 4) / 5); - for (let x = Math.floor(width / 5); x < right; x++) { - const pixel = localLuminances[x] & 0xff; - localBuckets[pixel >> GlobalHistogramBinarizer.LUMINANCE_SHIFT]++; - } - } - const blackPoint = GlobalHistogramBinarizer.estimateBlackPoint(localBuckets); - // We delay reading the entire image luminance until the black point estimation succeeds. - // Although we end up reading four rows twice, it is consistent with our motto of - // "fail quickly" which is necessary for continuous scanning. - const localLuminances = source.getMatrix(); - for (let y = 0; y < height; y++) { - const offset = y * width; - for (let x = 0; x < width; x++) { - const pixel = localLuminances[offset + x] & 0xff; - if (pixel < blackPoint) { - matrix.set(x, y); - } - } - } - return matrix; - } - /*@Override*/ - createBinarizer(source) { - return new GlobalHistogramBinarizer(source); - } - initArrays(luminanceSize /*int*/) { - if (this.luminances.length < luminanceSize) { - this.luminances = new Uint8ClampedArray(luminanceSize); - } - const buckets = this.buckets; - for (let x = 0; x < GlobalHistogramBinarizer.LUMINANCE_BUCKETS; x++) { - buckets[x] = 0; - } - } - static estimateBlackPoint(buckets) { - // Find the tallest peak in the histogram. - const numBuckets = buckets.length; - let maxBucketCount = 0; - let firstPeak = 0; - let firstPeakSize = 0; - for (let x = 0; x < numBuckets; x++) { - if (buckets[x] > firstPeakSize) { - firstPeak = x; - firstPeakSize = buckets[x]; - } - if (buckets[x] > maxBucketCount) { - maxBucketCount = buckets[x]; - } - } - // Find the second-tallest peak which is somewhat far from the tallest peak. - let secondPeak = 0; - let secondPeakScore = 0; - for (let x = 0; x < numBuckets; x++) { - const distanceToBiggest = x - firstPeak; - // Encourage more distant second peaks by multiplying by square of distance. - const score = buckets[x] * distanceToBiggest * distanceToBiggest; - if (score > secondPeakScore) { - secondPeak = x; - secondPeakScore = score; - } - } - // Make sure firstPeak corresponds to the black peak. - if (firstPeak > secondPeak) { - const temp = firstPeak; - firstPeak = secondPeak; - secondPeak = temp; - } - // If there is too little contrast in the image to pick a meaningful black point, throw rather - // than waste time trying to decode the image, and risk false positives. - if (secondPeak - firstPeak <= numBuckets / 16) { - throw new NotFoundException(); - } - // Find a valley between them that is low and closer to the white peak. - let bestValley = secondPeak - 1; - let bestValleyScore = -1; - for (let x = secondPeak - 1; x > firstPeak; x--) { - const fromFirst = x - firstPeak; - const score = fromFirst * fromFirst * (secondPeak - x) * (maxBucketCount - buckets[x]); - if (score > bestValleyScore) { - bestValley = x; - bestValleyScore = score; - } - } - return bestValley << GlobalHistogramBinarizer.LUMINANCE_SHIFT; - } - } - GlobalHistogramBinarizer.LUMINANCE_BITS = 5; - GlobalHistogramBinarizer.LUMINANCE_SHIFT = 8 - GlobalHistogramBinarizer.LUMINANCE_BITS; - GlobalHistogramBinarizer.LUMINANCE_BUCKETS = 1 << GlobalHistogramBinarizer.LUMINANCE_BITS; - GlobalHistogramBinarizer.EMPTY = Uint8ClampedArray.from([0]); - - /* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * This class implements a local thresholding algorithm, which while slower than the - * GlobalHistogramBinarizer, is fairly efficient for what it does. It is designed for - * high frequency images of barcodes with black data on white backgrounds. For this application, - * it does a much better job than a global blackpoint with severe shadows and gradients. - * However it tends to produce artifacts on lower frequency images and is therefore not - * a good general purpose binarizer for uses outside ZXing. - * - * This class extends GlobalHistogramBinarizer, using the older histogram approach for 1D readers, - * and the newer local approach for 2D readers. 1D decoding using a per-row histogram is already - * inherently local, and only fails for horizontal gradients. We can revisit that problem later, - * but for now it was not a win to use local blocks for 1D. - * - * This Binarizer is the default for the unit tests and the recommended class for library users. - * - * @author dswitkin@google.com (Daniel Switkin) - */ - class HybridBinarizer extends GlobalHistogramBinarizer { - constructor(source) { - super(source); - this.matrix = null; - } - /** - * Calculates the final BitMatrix once for all requests. This could be called once from the - * constructor instead, but there are some advantages to doing it lazily, such as making - * profiling easier, and not doing heavy lifting when callers don't expect it. - */ - /*@Override*/ - getBlackMatrix() { - if (this.matrix !== null) { - return this.matrix; - } - const source = this.getLuminanceSource(); - const width = source.getWidth(); - const height = source.getHeight(); - if (width >= HybridBinarizer.MINIMUM_DIMENSION && height >= HybridBinarizer.MINIMUM_DIMENSION) { - const luminances = source.getMatrix(); - let subWidth = width >> HybridBinarizer.BLOCK_SIZE_POWER; - if ((width & HybridBinarizer.BLOCK_SIZE_MASK) !== 0) { - subWidth++; - } - let subHeight = height >> HybridBinarizer.BLOCK_SIZE_POWER; - if ((height & HybridBinarizer.BLOCK_SIZE_MASK) !== 0) { - subHeight++; - } - const blackPoints = HybridBinarizer.calculateBlackPoints(luminances, subWidth, subHeight, width, height); - const newMatrix = new BitMatrix(width, height); - HybridBinarizer.calculateThresholdForBlock(luminances, subWidth, subHeight, width, height, blackPoints, newMatrix); - this.matrix = newMatrix; - } - else { - // If the image is too small, fall back to the global histogram approach. - this.matrix = super.getBlackMatrix(); - } - return this.matrix; - } - /*@Override*/ - createBinarizer(source) { - return new HybridBinarizer(source); - } - /** - * For each block in the image, calculate the average black point using a 5x5 grid - * of the blocks around it. Also handles the corner cases (fractional blocks are computed based - * on the last pixels in the row/column which are also used in the previous block). - */ - static calculateThresholdForBlock(luminances, subWidth /*int*/, subHeight /*int*/, width /*int*/, height /*int*/, blackPoints, matrix) { - const maxYOffset = height - HybridBinarizer.BLOCK_SIZE; - const maxXOffset = width - HybridBinarizer.BLOCK_SIZE; - for (let y = 0; y < subHeight; y++) { - let yoffset = y << HybridBinarizer.BLOCK_SIZE_POWER; - if (yoffset > maxYOffset) { - yoffset = maxYOffset; - } - const top = HybridBinarizer.cap(y, 2, subHeight - 3); - for (let x = 0; x < subWidth; x++) { - let xoffset = x << HybridBinarizer.BLOCK_SIZE_POWER; - if (xoffset > maxXOffset) { - xoffset = maxXOffset; - } - const left = HybridBinarizer.cap(x, 2, subWidth - 3); - let sum = 0; - for (let z = -2; z <= 2; z++) { - const blackRow = blackPoints[top + z]; - sum += blackRow[left - 2] + blackRow[left - 1] + blackRow[left] + blackRow[left + 1] + blackRow[left + 2]; - } - const average = sum / 25; - HybridBinarizer.thresholdBlock(luminances, xoffset, yoffset, average, width, matrix); - } - } - } - static cap(value /*int*/, min /*int*/, max /*int*/) { - return value < min ? min : value > max ? max : value; - } - /** - * Applies a single threshold to a block of pixels. - */ - static thresholdBlock(luminances, xoffset /*int*/, yoffset /*int*/, threshold /*int*/, stride /*int*/, matrix) { - for (let y = 0, offset = yoffset * stride + xoffset; y < HybridBinarizer.BLOCK_SIZE; y++, offset += stride) { - for (let x = 0; x < HybridBinarizer.BLOCK_SIZE; x++) { - // Comparison needs to be <= so that black == 0 pixels are black even if the threshold is 0. - if ((luminances[offset + x] & 0xFF) <= threshold) { - matrix.set(xoffset + x, yoffset + y); - } - } - } - } - /** - * Calculates a single black point for each block of pixels and saves it away. - * See the following thread for a discussion of this algorithm: - * http://groups.google.com/group/zxing/browse_thread/thread/d06efa2c35a7ddc0 - */ - static calculateBlackPoints(luminances, subWidth /*int*/, subHeight /*int*/, width /*int*/, height /*int*/) { - const maxYOffset = height - HybridBinarizer.BLOCK_SIZE; - const maxXOffset = width - HybridBinarizer.BLOCK_SIZE; - // tslint:disable-next-line:whitespace - const blackPoints = new Array(subHeight); // subWidth - for (let y = 0; y < subHeight; y++) { - blackPoints[y] = new Int32Array(subWidth); - let yoffset = y << HybridBinarizer.BLOCK_SIZE_POWER; - if (yoffset > maxYOffset) { - yoffset = maxYOffset; - } - for (let x = 0; x < subWidth; x++) { - let xoffset = x << HybridBinarizer.BLOCK_SIZE_POWER; - if (xoffset > maxXOffset) { - xoffset = maxXOffset; - } - let sum = 0; - let min = 0xFF; - let max = 0; - for (let yy = 0, offset = yoffset * width + xoffset; yy < HybridBinarizer.BLOCK_SIZE; yy++, offset += width) { - for (let xx = 0; xx < HybridBinarizer.BLOCK_SIZE; xx++) { - const pixel = luminances[offset + xx] & 0xFF; - sum += pixel; - // still looking for good contrast - if (pixel < min) { - min = pixel; - } - if (pixel > max) { - max = pixel; - } - } - // short-circuit min/max tests once dynamic range is met - if (max - min > HybridBinarizer.MIN_DYNAMIC_RANGE) { - // finish the rest of the rows quickly - for (yy++, offset += width; yy < HybridBinarizer.BLOCK_SIZE; yy++, offset += width) { - for (let xx = 0; xx < HybridBinarizer.BLOCK_SIZE; xx++) { - sum += luminances[offset + xx] & 0xFF; - } - } - } - } - // The default estimate is the average of the values in the block. - let average = sum >> (HybridBinarizer.BLOCK_SIZE_POWER * 2); - if (max - min <= HybridBinarizer.MIN_DYNAMIC_RANGE) { - // If variation within the block is low, assume this is a block with only light or only - // dark pixels. In that case we do not want to use the average, as it would divide this - // low contrast area into black and white pixels, essentially creating data out of noise. - // - // The default assumption is that the block is light/background. Since no estimate for - // the level of dark pixels exists locally, use half the min for the block. - average = min / 2; - if (y > 0 && x > 0) { - // Correct the "white background" assumption for blocks that have neighbors by comparing - // the pixels in this block to the previously calculated black points. This is based on - // the fact that dark barcode symbology is always surrounded by some amount of light - // background for which reasonable black point estimates were made. The bp estimated at - // the boundaries is used for the interior. - // The (min < bp) is arbitrary but works better than other heuristics that were tried. - const averageNeighborBlackPoint = (blackPoints[y - 1][x] + (2 * blackPoints[y][x - 1]) + blackPoints[y - 1][x - 1]) / 4; - if (min < averageNeighborBlackPoint) { - average = averageNeighborBlackPoint; - } - } - } - blackPoints[y][x] = average; - } - } - return blackPoints; - } - } - // This class uses 5x5 blocks to compute local luminance, where each block is 8x8 pixels. - // So this is the smallest dimension in each axis we can accept. - HybridBinarizer.BLOCK_SIZE_POWER = 3; - HybridBinarizer.BLOCK_SIZE = 1 << HybridBinarizer.BLOCK_SIZE_POWER; // ...0100...00 - HybridBinarizer.BLOCK_SIZE_MASK = HybridBinarizer.BLOCK_SIZE - 1; // ...0011...11 - HybridBinarizer.MINIMUM_DIMENSION = HybridBinarizer.BLOCK_SIZE * 5; - HybridBinarizer.MIN_DYNAMIC_RANGE = 24; - - /* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /*namespace com.google.zxing {*/ - /** - * The purpose of this class hierarchy is to abstract different bitmap implementations across - * platforms into a standard interface for requesting greyscale luminance values. The interface - * only provides immutable methods; therefore crop and rotation create copies. This is to ensure - * that one Reader does not modify the original luminance source and leave it in an unknown state - * for other Readers in the chain. - * - * @author dswitkin@google.com (Daniel Switkin) - */ - class LuminanceSource { - constructor(width /*int*/, height /*int*/) { - this.width = width; - this.height = height; - } - /** - * @return The width of the bitmap. - */ - getWidth() { - return this.width; - } - /** - * @return The height of the bitmap. - */ - getHeight() { - return this.height; - } - /** - * @return Whether this subclass supports cropping. - */ - isCropSupported() { - return false; - } - /** - * Returns a new object with cropped image data. Implementations may keep a reference to the - * original data rather than a copy. Only callable if isCropSupported() is true. - * - * @param left The left coordinate, which must be in [0,getWidth()) - * @param top The top coordinate, which must be in [0,getHeight()) - * @param width The width of the rectangle to crop. - * @param height The height of the rectangle to crop. - * @return A cropped version of this object. - */ - crop(left /*int*/, top /*int*/, width /*int*/, height /*int*/) { - throw new UnsupportedOperationException('This luminance source does not support cropping.'); - } - /** - * @return Whether this subclass supports counter-clockwise rotation. - */ - isRotateSupported() { - return false; - } - /** - * Returns a new object with rotated image data by 90 degrees counterclockwise. - * Only callable if {@link #isRotateSupported()} is true. - * - * @return A rotated version of this object. - */ - rotateCounterClockwise() { - throw new UnsupportedOperationException('This luminance source does not support rotation by 90 degrees.'); - } - /** - * Returns a new object with rotated image data by 45 degrees counterclockwise. - * Only callable if {@link #isRotateSupported()} is true. - * - * @return A rotated version of this object. - */ - rotateCounterClockwise45() { - throw new UnsupportedOperationException('This luminance source does not support rotation by 45 degrees.'); - } - /*@Override*/ - toString() { - const row = new Uint8ClampedArray(this.width); - let result = new StringBuilder(); - for (let y = 0; y < this.height; y++) { - const sourceRow = this.getRow(y, row); - for (let x = 0; x < this.width; x++) { - const luminance = sourceRow[x] & 0xFF; - let c; - if (luminance < 0x40) { - c = '#'; - } - else if (luminance < 0x80) { - c = '+'; - } - else if (luminance < 0xC0) { - c = '.'; - } - else { - c = ' '; - } - result.append(c); - } - result.append('\n'); - } - return result.toString(); - } - } - - /* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /*namespace com.google.zxing {*/ - /** - * A wrapper implementation of {@link LuminanceSource} which inverts the luminances it returns -- black becomes - * white and vice versa, and each value becomes (255-value). - * - * @author Sean Owen - */ - class InvertedLuminanceSource extends LuminanceSource { - constructor(delegate) { - super(delegate.getWidth(), delegate.getHeight()); - this.delegate = delegate; - } - /*@Override*/ - getRow(y /*int*/, row) { - const sourceRow = this.delegate.getRow(y, row); - const width = this.getWidth(); - for (let i = 0; i < width; i++) { - sourceRow[i] = /*(byte)*/ (255 - (sourceRow[i] & 0xFF)); - } - return sourceRow; - } - /*@Override*/ - getMatrix() { - const matrix = this.delegate.getMatrix(); - const length = this.getWidth() * this.getHeight(); - const invertedMatrix = new Uint8ClampedArray(length); - for (let i = 0; i < length; i++) { - invertedMatrix[i] = /*(byte)*/ (255 - (matrix[i] & 0xFF)); - } - return invertedMatrix; - } - /*@Override*/ - isCropSupported() { - return this.delegate.isCropSupported(); - } - /*@Override*/ - crop(left /*int*/, top /*int*/, width /*int*/, height /*int*/) { - return new InvertedLuminanceSource(this.delegate.crop(left, top, width, height)); - } - /*@Override*/ - isRotateSupported() { - return this.delegate.isRotateSupported(); - } - /** - * @return original delegate {@link LuminanceSource} since invert undoes itself - */ - /*@Override*/ - invert() { - return this.delegate; - } - /*@Override*/ - rotateCounterClockwise() { - return new InvertedLuminanceSource(this.delegate.rotateCounterClockwise()); - } - /*@Override*/ - rotateCounterClockwise45() { - return new InvertedLuminanceSource(this.delegate.rotateCounterClockwise45()); - } - } - - /** - * @deprecated Moving to @zxing/browser - */ - class HTMLCanvasElementLuminanceSource extends LuminanceSource { - constructor(canvas) { - super(canvas.width, canvas.height); - this.canvas = canvas; - this.tempCanvasElement = null; - this.buffer = HTMLCanvasElementLuminanceSource.makeBufferFromCanvasImageData(canvas); - } - static makeBufferFromCanvasImageData(canvas) { - const imageData = canvas.getContext('2d').getImageData(0, 0, canvas.width, canvas.height); - return HTMLCanvasElementLuminanceSource.toGrayscaleBuffer(imageData.data, canvas.width, canvas.height); - } - static toGrayscaleBuffer(imageBuffer, width, height) { - const grayscaleBuffer = new Uint8ClampedArray(width * height); - for (let i = 0, j = 0, length = imageBuffer.length; i < length; i += 4, j++) { - let gray; - const alpha = imageBuffer[i + 3]; - // The color of fully-transparent pixels is irrelevant. They are often, technically, fully-transparent - // black (0 alpha, and then 0 RGB). They are often used, of course as the "white" area in a - // barcode image. Force any such pixel to be white: - if (alpha === 0) { - gray = 0xFF; - } - else { - const pixelR = imageBuffer[i]; - const pixelG = imageBuffer[i + 1]; - const pixelB = imageBuffer[i + 2]; - // .299R + 0.587G + 0.114B (YUV/YIQ for PAL and NTSC), - // (306*R) >> 10 is approximately equal to R*0.299, and so on. - // 0x200 >> 10 is 0.5, it implements rounding. - gray = (306 * pixelR + - 601 * pixelG + - 117 * pixelB + - 0x200) >> 10; - } - grayscaleBuffer[j] = gray; - } - return grayscaleBuffer; - } - getRow(y /*int*/, row) { - if (y < 0 || y >= this.getHeight()) { - throw new IllegalArgumentException('Requested row is outside the image: ' + y); - } - const width = this.getWidth(); - const start = y * width; - if (row === null) { - row = this.buffer.slice(start, start + width); - } - else { - if (row.length < width) { - row = new Uint8ClampedArray(width); - } - // The underlying raster of image consists of bytes with the luminance values - // TODO: can avoid set/slice? - row.set(this.buffer.slice(start, start + width)); - } - return row; - } - getMatrix() { - return this.buffer; - } - isCropSupported() { - return true; - } - crop(left /*int*/, top /*int*/, width /*int*/, height /*int*/) { - super.crop(left, top, width, height); - return this; - } - /** - * This is always true, since the image is a gray-scale image. - * - * @return true - */ - isRotateSupported() { - return true; - } - rotateCounterClockwise() { - this.rotate(-90); - return this; - } - rotateCounterClockwise45() { - this.rotate(-45); - return this; - } - getTempCanvasElement() { - if (null === this.tempCanvasElement) { - const tempCanvasElement = this.canvas.ownerDocument.createElement('canvas'); - tempCanvasElement.width = this.canvas.width; - tempCanvasElement.height = this.canvas.height; - this.tempCanvasElement = tempCanvasElement; - } - return this.tempCanvasElement; - } - rotate(angle) { - const tempCanvasElement = this.getTempCanvasElement(); - const tempContext = tempCanvasElement.getContext('2d'); - const angleRadians = angle * HTMLCanvasElementLuminanceSource.DEGREE_TO_RADIANS; - // Calculate and set new dimensions for temp canvas - const width = this.canvas.width; - const height = this.canvas.height; - const newWidth = Math.ceil(Math.abs(Math.cos(angleRadians)) * width + Math.abs(Math.sin(angleRadians)) * height); - const newHeight = Math.ceil(Math.abs(Math.sin(angleRadians)) * width + Math.abs(Math.cos(angleRadians)) * height); - tempCanvasElement.width = newWidth; - tempCanvasElement.height = newHeight; - // Draw at center of temp canvas to prevent clipping of image data - tempContext.translate(newWidth / 2, newHeight / 2); - tempContext.rotate(angleRadians); - tempContext.drawImage(this.canvas, width / -2, height / -2); - this.buffer = HTMLCanvasElementLuminanceSource.makeBufferFromCanvasImageData(tempCanvasElement); - return this; - } - invert() { - return new InvertedLuminanceSource(this); - } - } - HTMLCanvasElementLuminanceSource.DEGREE_TO_RADIANS = Math.PI / 180; - - /** - * @deprecated Moving to @zxing/browser - * - * Video input device metadata containing the id and label of the device if available. - */ - class VideoInputDevice { - /** - * Creates an instance of VideoInputDevice. - * - * @param {string} deviceId the video input device id - * @param {string} label the label of the device if available - */ - constructor(deviceId, label, groupId) { - this.deviceId = deviceId; - this.label = label; - /** @inheritdoc */ - this.kind = 'videoinput'; - this.groupId = groupId || undefined; - } - /** @inheritdoc */ - toJSON() { - return { - kind: this.kind, - groupId: this.groupId, - deviceId: this.deviceId, - label: this.label, - }; - } - } - - var __awaiter = ((globalThis || global || self || window || undefined) && (globalThis || global || self || window || undefined).__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - /** - * @deprecated Moving to @zxing/browser - * - * Base class for browser code reader. - */ - class BrowserCodeReader { - /** - * Creates an instance of BrowserCodeReader. - * @param {Reader} reader The reader instance to decode the barcode - * @param {number} [timeBetweenScansMillis=500] the time delay between subsequent successful decode tries - * - * @memberOf BrowserCodeReader - */ - constructor(reader, timeBetweenScansMillis = 500, _hints) { - this.reader = reader; - this.timeBetweenScansMillis = timeBetweenScansMillis; - this._hints = _hints; - /** - * This will break the loop. - */ - this._stopContinuousDecode = false; - /** - * This will break the loop. - */ - this._stopAsyncDecode = false; - /** - * Delay time between decode attempts made by the scanner. - */ - this._timeBetweenDecodingAttempts = 0; - } - /** - * If navigator is present. - */ - get hasNavigator() { - return typeof navigator !== 'undefined'; - } - /** - * If mediaDevices under navigator is supported. - */ - get isMediaDevicesSuported() { - return this.hasNavigator && !!navigator.mediaDevices; - } - /** - * If enumerateDevices under navigator is supported. - */ - get canEnumerateDevices() { - return !!(this.isMediaDevicesSuported && navigator.mediaDevices.enumerateDevices); - } - /** Time between two decoding tries in milli seconds. */ - get timeBetweenDecodingAttempts() { - return this._timeBetweenDecodingAttempts; - } - /** - * Change the time span the decoder waits between two decoding tries. - * - * @param {number} millis Time between two decoding tries in milli seconds. - */ - set timeBetweenDecodingAttempts(millis) { - this._timeBetweenDecodingAttempts = millis < 0 ? 0 : millis; - } - /** - * Sets the hints. - */ - set hints(hints) { - this._hints = hints || null; - } - /** - * Sets the hints. - */ - get hints() { - return this._hints; - } - /** - * Lists all the available video input devices. - */ - listVideoInputDevices() { - return __awaiter(this, void 0, void 0, function* () { - if (!this.hasNavigator) { - throw new Error('Can\'t enumerate devices, navigator is not present.'); - } - if (!this.canEnumerateDevices) { - throw new Error('Can\'t enumerate devices, method not supported.'); - } - const devices = yield navigator.mediaDevices.enumerateDevices(); - const videoDevices = []; - for (const device of devices) { - const kind = device.kind === 'video' ? 'videoinput' : device.kind; - if (kind !== 'videoinput') { - continue; - } - const deviceId = device.deviceId || device.id; - const label = device.label || `Video device ${videoDevices.length + 1}`; - const groupId = device.groupId; - const videoDevice = { deviceId, label, kind, groupId }; - videoDevices.push(videoDevice); - } - return videoDevices; - }); - } - /** - * Obtain the list of available devices with type 'videoinput'. - * - * @returns {Promise} an array of available video input devices - * - * @memberOf BrowserCodeReader - * - * @deprecated Use `listVideoInputDevices` instead. - */ - getVideoInputDevices() { - return __awaiter(this, void 0, void 0, function* () { - const devices = yield this.listVideoInputDevices(); - return devices.map(d => new VideoInputDevice(d.deviceId, d.label)); - }); - } - /** - * Let's you find a device using it's Id. - */ - findDeviceById(deviceId) { - return __awaiter(this, void 0, void 0, function* () { - const devices = yield this.listVideoInputDevices(); - if (!devices) { - return null; - } - return devices.find(x => x.deviceId === deviceId); - }); - } - /** - * Decodes the barcode from the device specified by deviceId while showing the video in the specified video element. - * - * @param deviceId the id of one of the devices obtained after calling getVideoInputDevices. Can be undefined, in this case it will decode from one of the available devices, preffering the main camera (environment facing) if available. - * @param video the video element in page where to show the video while decoding. Can be either an element id or directly an HTMLVideoElement. Can be undefined, in which case no video will be shown. - * @returns The decoding result. - * - * @memberOf BrowserCodeReader - * - * @deprecated Use `decodeOnceFromVideoDevice` instead. - */ - decodeFromInputVideoDevice(deviceId, videoSource) { - return __awaiter(this, void 0, void 0, function* () { - return yield this.decodeOnceFromVideoDevice(deviceId, videoSource); - }); - } - /** - * In one attempt, tries to decode the barcode from the device specified by deviceId while showing the video in the specified video element. - * - * @param deviceId the id of one of the devices obtained after calling getVideoInputDevices. Can be undefined, in this case it will decode from one of the available devices, preffering the main camera (environment facing) if available. - * @param video the video element in page where to show the video while decoding. Can be either an element id or directly an HTMLVideoElement. Can be undefined, in which case no video will be shown. - * @returns The decoding result. - * - * @memberOf BrowserCodeReader - */ - decodeOnceFromVideoDevice(deviceId, videoSource) { - return __awaiter(this, void 0, void 0, function* () { - this.reset(); - let videoConstraints; - if (!deviceId) { - videoConstraints = { facingMode: 'environment' }; - } - else { - videoConstraints = { deviceId: { exact: deviceId } }; - } - const constraints = { video: videoConstraints }; - return yield this.decodeOnceFromConstraints(constraints, videoSource); - }); - } - /** - * In one attempt, tries to decode the barcode from a stream obtained from the given constraints while showing the video in the specified video element. - * - * @param constraints the media stream constraints to get s valid media stream to decode from - * @param video the video element in page where to show the video while decoding. Can be either an element id or directly an HTMLVideoElement. Can be undefined, in which case no video will be shown. - * @returns The decoding result. - * - * @memberOf BrowserCodeReader - */ - decodeOnceFromConstraints(constraints, videoSource) { - return __awaiter(this, void 0, void 0, function* () { - const stream = yield navigator.mediaDevices.getUserMedia(constraints); - return yield this.decodeOnceFromStream(stream, videoSource); - }); - } - /** - * In one attempt, tries to decode the barcode from a stream obtained from the given constraints while showing the video in the specified video element. - * - * @param {MediaStream} [constraints] the media stream constraints to get s valid media stream to decode from - * @param {string|HTMLVideoElement} [video] the video element in page where to show the video while decoding. Can be either an element id or directly an HTMLVideoElement. Can be undefined, in which case no video will be shown. - * @returns {Promise} The decoding result. - * - * @memberOf BrowserCodeReader - */ - decodeOnceFromStream(stream, videoSource) { - return __awaiter(this, void 0, void 0, function* () { - this.reset(); - const video = yield this.attachStreamToVideo(stream, videoSource); - const result = yield this.decodeOnce(video); - return result; - }); - } - /** - * Continuously decodes the barcode from the device specified by device while showing the video in the specified video element. - * - * @param {string|null} [deviceId] the id of one of the devices obtained after calling getVideoInputDevices. Can be undefined, in this case it will decode from one of the available devices, preffering the main camera (environment facing) if available. - * @param {string|HTMLVideoElement|null} [video] the video element in page where to show the video while decoding. Can be either an element id or directly an HTMLVideoElement. Can be undefined, in which case no video will be shown. - * @returns {Promise} - * - * @memberOf BrowserCodeReader - * - * @deprecated Use `decodeFromVideoDevice` instead. - */ - decodeFromInputVideoDeviceContinuously(deviceId, videoSource, callbackFn) { - return __awaiter(this, void 0, void 0, function* () { - return yield this.decodeFromVideoDevice(deviceId, videoSource, callbackFn); - }); - } - /** - * Continuously tries to decode the barcode from the device specified by device while showing the video in the specified video element. - * - * @param {string|null} [deviceId] the id of one of the devices obtained after calling getVideoInputDevices. Can be undefined, in this case it will decode from one of the available devices, preffering the main camera (environment facing) if available. - * @param {string|HTMLVideoElement|null} [video] the video element in page where to show the video while decoding. Can be either an element id or directly an HTMLVideoElement. Can be undefined, in which case no video will be shown. - * @returns {Promise} - * - * @memberOf BrowserCodeReader - */ - decodeFromVideoDevice(deviceId, videoSource, callbackFn) { - return __awaiter(this, void 0, void 0, function* () { - let videoConstraints; - if (!deviceId) { - videoConstraints = { facingMode: 'environment' }; - } - else { - videoConstraints = { deviceId: { exact: deviceId } }; - } - const constraints = { video: videoConstraints }; - return yield this.decodeFromConstraints(constraints, videoSource, callbackFn); - }); - } - /** - * Continuously tries to decode the barcode from a stream obtained from the given constraints while showing the video in the specified video element. - * - * @param {MediaStream} [constraints] the media stream constraints to get s valid media stream to decode from - * @param {string|HTMLVideoElement} [video] the video element in page where to show the video while decoding. Can be either an element id or directly an HTMLVideoElement. Can be undefined, in which case no video will be shown. - * @returns {Promise} The decoding result. - * - * @memberOf BrowserCodeReader - */ - decodeFromConstraints(constraints, videoSource, callbackFn) { - return __awaiter(this, void 0, void 0, function* () { - const stream = yield navigator.mediaDevices.getUserMedia(constraints); - return yield this.decodeFromStream(stream, videoSource, callbackFn); - }); - } - /** - * In one attempt, tries to decode the barcode from a stream obtained from the given constraints while showing the video in the specified video element. - * - * @param {MediaStream} [constraints] the media stream constraints to get s valid media stream to decode from - * @param {string|HTMLVideoElement} [video] the video element in page where to show the video while decoding. Can be either an element id or directly an HTMLVideoElement. Can be undefined, in which case no video will be shown. - * @returns {Promise} The decoding result. - * - * @memberOf BrowserCodeReader - */ - decodeFromStream(stream, videoSource, callbackFn) { - return __awaiter(this, void 0, void 0, function* () { - this.reset(); - const video = yield this.attachStreamToVideo(stream, videoSource); - return yield this.decodeContinuously(video, callbackFn); - }); - } - /** - * Breaks the decoding loop. - */ - stopAsyncDecode() { - this._stopAsyncDecode = true; - } - /** - * Breaks the decoding loop. - */ - stopContinuousDecode() { - this._stopContinuousDecode = true; - } - /** - * Sets the new stream and request a new decoding-with-delay. - * - * @param stream The stream to be shown in the video element. - * @param decodeFn A callback for the decode method. - */ - attachStreamToVideo(stream, videoSource) { - return __awaiter(this, void 0, void 0, function* () { - const videoElement = this.prepareVideoElement(videoSource); - this.addVideoSource(videoElement, stream); - this.videoElement = videoElement; - this.stream = stream; - yield this.playVideoOnLoadAsync(videoElement); - return videoElement; - }); - } - /** - * - * @param videoElement - */ - playVideoOnLoadAsync(videoElement) { - return new Promise((resolve, reject) => this.playVideoOnLoad(videoElement, () => resolve())); - } - /** - * Binds listeners and callbacks to the videoElement. - * - * @param element - * @param callbackFn - */ - playVideoOnLoad(element, callbackFn) { - this.videoEndedListener = () => this.stopStreams(); - this.videoCanPlayListener = () => this.tryPlayVideo(element); - element.addEventListener('ended', this.videoEndedListener); - element.addEventListener('canplay', this.videoCanPlayListener); - element.addEventListener('playing', callbackFn); - // if canplay was already fired, we won't know when to play, so just give it a try - this.tryPlayVideo(element); - } - /** - * Checks if the given video element is currently playing. - */ - isVideoPlaying(video) { - return video.currentTime > 0 && !video.paused && !video.ended && video.readyState > 2; - } - /** - * Just tries to play the video and logs any errors. - * The play call is only made is the video is not already playing. - */ - tryPlayVideo(videoElement) { - return __awaiter(this, void 0, void 0, function* () { - if (this.isVideoPlaying(videoElement)) { - console.warn('Trying to play video that is already playing.'); - return; - } - try { - yield videoElement.play(); - } - catch (_a) { - console.warn('It was not possible to play the video.'); - } - }); - } - /** - * Searches and validates a media element. - */ - getMediaElement(mediaElementId, type) { - const mediaElement = document.getElementById(mediaElementId); - if (!mediaElement) { - throw new ArgumentException(`element with id '${mediaElementId}' not found`); - } - if (mediaElement.nodeName.toLowerCase() !== type.toLowerCase()) { - throw new ArgumentException(`element with id '${mediaElementId}' must be an ${type} element`); - } - return mediaElement; - } - /** - * Decodes the barcode from an image. - * - * @param {(string|HTMLImageElement)} [source] The image element that can be either an element id or the element itself. Can be undefined in which case the decoding will be done from the imageUrl parameter. - * @param {string} [url] - * @returns {Promise} The decoding result. - * - * @memberOf BrowserCodeReader - */ - decodeFromImage(source, url) { - if (!source && !url) { - throw new ArgumentException('either imageElement with a src set or an url must be provided'); - } - if (url && !source) { - return this.decodeFromImageUrl(url); - } - return this.decodeFromImageElement(source); - } - /** - * Decodes the barcode from a video. - * - * @param {(string|HTMLImageElement)} [source] The image element that can be either an element id or the element itself. Can be undefined in which case the decoding will be done from the imageUrl parameter. - * @param {string} [url] - * @returns {Promise} The decoding result. - * - * @memberOf BrowserCodeReader - */ - decodeFromVideo(source, url) { - if (!source && !url) { - throw new ArgumentException('Either an element with a src set or an URL must be provided'); - } - if (url && !source) { - return this.decodeFromVideoUrl(url); - } - return this.decodeFromVideoElement(source); - } - /** - * Decodes continuously the barcode from a video. - * - * @param {(string|HTMLImageElement)} [source] The image element that can be either an element id or the element itself. Can be undefined in which case the decoding will be done from the imageUrl parameter. - * @param {string} [url] - * @returns {Promise} The decoding result. - * - * @memberOf BrowserCodeReader - * - * @experimental - */ - decodeFromVideoContinuously(source, url, callbackFn) { - if (undefined === source && undefined === url) { - throw new ArgumentException('Either an element with a src set or an URL must be provided'); - } - if (url && !source) { - return this.decodeFromVideoUrlContinuously(url, callbackFn); - } - return this.decodeFromVideoElementContinuously(source, callbackFn); - } - /** - * Decodes something from an image HTML element. - */ - decodeFromImageElement(source) { - if (!source) { - throw new ArgumentException('An image element must be provided.'); - } - this.reset(); - const element = this.prepareImageElement(source); - this.imageElement = element; - let task; - if (this.isImageLoaded(element)) { - task = this.decodeOnce(element, false, true); - } - else { - task = this._decodeOnLoadImage(element); - } - return task; - } - /** - * Decodes something from an image HTML element. - */ - decodeFromVideoElement(source) { - const element = this._decodeFromVideoElementSetup(source); - return this._decodeOnLoadVideo(element); - } - /** - * Decodes something from an image HTML element. - */ - decodeFromVideoElementContinuously(source, callbackFn) { - const element = this._decodeFromVideoElementSetup(source); - return this._decodeOnLoadVideoContinuously(element, callbackFn); - } - /** - * Sets up the video source so it can be decoded when loaded. - * - * @param source The video source element. - */ - _decodeFromVideoElementSetup(source) { - if (!source) { - throw new ArgumentException('A video element must be provided.'); - } - this.reset(); - const element = this.prepareVideoElement(source); - // defines the video element before starts decoding - this.videoElement = element; - return element; - } - /** - * Decodes an image from a URL. - */ - decodeFromImageUrl(url) { - if (!url) { - throw new ArgumentException('An URL must be provided.'); - } - this.reset(); - const element = this.prepareImageElement(); - this.imageElement = element; - const decodeTask = this._decodeOnLoadImage(element); - element.src = url; - return decodeTask; - } - /** - * Decodes an image from a URL. - */ - decodeFromVideoUrl(url) { - if (!url) { - throw new ArgumentException('An URL must be provided.'); - } - this.reset(); - // creates a new element - const element = this.prepareVideoElement(); - const decodeTask = this.decodeFromVideoElement(element); - element.src = url; - return decodeTask; - } - /** - * Decodes an image from a URL. - * - * @experimental - */ - decodeFromVideoUrlContinuously(url, callbackFn) { - if (!url) { - throw new ArgumentException('An URL must be provided.'); - } - this.reset(); - // creates a new element - const element = this.prepareVideoElement(); - const decodeTask = this.decodeFromVideoElementContinuously(element, callbackFn); - element.src = url; - return decodeTask; - } - _decodeOnLoadImage(element) { - return new Promise((resolve, reject) => { - this.imageLoadedListener = () => this.decodeOnce(element, false, true).then(resolve, reject); - element.addEventListener('load', this.imageLoadedListener); - }); - } - _decodeOnLoadVideo(videoElement) { - return __awaiter(this, void 0, void 0, function* () { - // plays the video - yield this.playVideoOnLoadAsync(videoElement); - // starts decoding after played the video - return yield this.decodeOnce(videoElement); - }); - } - _decodeOnLoadVideoContinuously(videoElement, callbackFn) { - return __awaiter(this, void 0, void 0, function* () { - // plays the video - yield this.playVideoOnLoadAsync(videoElement); - // starts decoding after played the video - this.decodeContinuously(videoElement, callbackFn); - }); - } - isImageLoaded(img) { - // During the onload event, IE correctly identifies any images that - // weren’t downloaded as not complete. Others should too. Gecko-based - // browsers act like NS4 in that they report this incorrectly. - if (!img.complete) { - return false; - } - // However, they do have two very useful properties: naturalWidth and - // naturalHeight. These give the true size of the image. If it failed - // to load, either of these should be zero. - if (img.naturalWidth === 0) { - return false; - } - // No other way of checking: assume it’s ok. - return true; - } - prepareImageElement(imageSource) { - let imageElement; - if (typeof imageSource === 'undefined') { - imageElement = document.createElement('img'); - imageElement.width = 200; - imageElement.height = 200; - } - if (typeof imageSource === 'string') { - imageElement = this.getMediaElement(imageSource, 'img'); - } - if (imageSource instanceof HTMLImageElement) { - imageElement = imageSource; - } - return imageElement; - } - /** - * Sets a HTMLVideoElement for scanning or creates a new one. - * - * @param videoSource The HTMLVideoElement to be set. - */ - prepareVideoElement(videoSource) { - let videoElement; - if (!videoSource && typeof document !== 'undefined') { - videoElement = document.createElement('video'); - videoElement.width = 200; - videoElement.height = 200; - } - if (typeof videoSource === 'string') { - videoElement = this.getMediaElement(videoSource, 'video'); - } - if (videoSource instanceof HTMLVideoElement) { - videoElement = videoSource; - } - // Needed for iOS 11 - videoElement.setAttribute('autoplay', 'true'); - videoElement.setAttribute('muted', 'true'); - videoElement.setAttribute('playsinline', 'true'); - return videoElement; - } - /** - * Tries to decode from the video input until it finds some value. - */ - decodeOnce(element, retryIfNotFound = true, retryIfChecksumOrFormatError = true) { - this._stopAsyncDecode = false; - const loop = (resolve, reject) => { - if (this._stopAsyncDecode) { - reject(new NotFoundException('Video stream has ended before any code could be detected.')); - this._stopAsyncDecode = undefined; - return; - } - try { - const result = this.decode(element); - resolve(result); - } - catch (e) { - const ifNotFound = retryIfNotFound && e instanceof NotFoundException; - const isChecksumOrFormatError = e instanceof ChecksumException || e instanceof FormatException; - const ifChecksumOrFormat = isChecksumOrFormatError && retryIfChecksumOrFormatError; - if (ifNotFound || ifChecksumOrFormat) { - // trying again - return setTimeout(loop, this._timeBetweenDecodingAttempts, resolve, reject); - } - reject(e); - } - }; - return new Promise((resolve, reject) => loop(resolve, reject)); - } - /** - * Continuously decodes from video input. - */ - decodeContinuously(element, callbackFn) { - this._stopContinuousDecode = false; - const loop = () => { - if (this._stopContinuousDecode) { - this._stopContinuousDecode = undefined; - return; - } - try { - const result = this.decode(element); - callbackFn(result, null); - setTimeout(loop, this.timeBetweenScansMillis); - } - catch (e) { - callbackFn(null, e); - const isChecksumOrFormatError = e instanceof ChecksumException || e instanceof FormatException; - const isNotFound = e instanceof NotFoundException; - if (isChecksumOrFormatError || isNotFound) { - // trying again - setTimeout(loop, this._timeBetweenDecodingAttempts); - } - } - }; - loop(); - } - /** - * Gets the BinaryBitmap for ya! (and decodes it) - */ - decode(element) { - // get binary bitmap for decode function - const binaryBitmap = this.createBinaryBitmap(element); - return this.decodeBitmap(binaryBitmap); - } - /** - * Returns true if media element is indeed a {@link HtmlVideoElement}. - */ - _isHTMLVideoElement(mediaElement) { - const potentialVideo = mediaElement; - return potentialVideo.videoWidth !== 0; - } - /** - * Overwriting this allows you to manipulate the next frame in anyway - * you want before decode. - */ - drawFrameOnCanvas( - srcElement, dimensions, canvasElementContext) { - if (!dimensions) { - dimensions = { - sx: 0, - sy: 0, - sWidth: srcElement.videoWidth, - sHeight: srcElement.videoHeight, - dx: 0, - dy: 0, - dWidth: srcElement.videoWidth, - dHeight: srcElement.videoHeight}; - } - if (!canvasElementContext) { - canvasElementContext = this.captureCanvasContext; - } - canvasElementContext.drawImage( - srcElement, - dimensions.sx, - dimensions.sy, - dimensions.sWidth, - dimensions.sHeight, - dimensions.dx, - dimensions.dy, - dimensions.dWidth, - dimensions.dHeight); - } - /** - * Ovewriting this allows you to manipulate the snapshot image in anyway - * you want before decode. - */ - drawImageOnCanvas( - srcElement, - dimensions, - canvasElementContext = this.captureCanvasContext) { - if (!dimensions) { - dimensions = { - sx: 0, - sy: 0, - sWidth: srcElement.naturalWidth, - sHeight: srcElement.naturalHeight, - dx: 0, - dy: 0, - dWidth: srcElement.naturalWidth, - dHeight: srcElement.naturalHeight - }; - } - if (!canvasElementContext) { - canvasElementContext = this.captureCanvasContext; - } - canvasElementContext.drawImage( - srcElement, - dimensions.sx, - dimensions.sy, - dimensions.sWidth, - dimensions.sHeight, - dimensions.dx, - dimensions.dy, - dimensions.dWidth, - dimensions.dHeight); - } - /** - * Creates a binaryBitmap based in some image source. - * - * @param mediaElement HTML element containing drawable image source. - */ - createBinaryBitmap(mediaElement) { - const ctx = this.getCaptureCanvasContext(mediaElement); - if (this._isHTMLVideoElement(mediaElement)) { - this.drawFrameOnCanvas(mediaElement); - } else { - this.drawImageOnCanvas(mediaElement); - } - const canvas = this.getCaptureCanvas(mediaElement); - const luminanceSource = new HTMLCanvasElementLuminanceSource(canvas); - const hybridBinarizer = new HybridBinarizer(luminanceSource); - - return new BinaryBitmap(hybridBinarizer); - } - - getCaptureCanvasContext(mediaElement) { - if (!this.captureCanvasContext) { - const elem = this.getCaptureCanvas(mediaElement); - const ctx = elem.getContext('2d'); - this.captureCanvasContext = ctx; - } - return this.captureCanvasContext; - } - getCaptureCanvas(mediaElement) { - if (!this.captureCanvas) { - const elem = this.createCaptureCanvas(mediaElement); - this.captureCanvas = elem; - } - return this.captureCanvas; - } - /** - * Call the encapsulated readers decode - */ - decodeBitmap(binaryBitmap) { - return this.reader.decode(binaryBitmap, this._hints); - } - /** - * 🖌 Prepares the canvas for capture and scan frames. - */ - createCaptureCanvas(mediaElement) { - if (typeof document === 'undefined') { - this._destroyCaptureCanvas(); - return null; - } - const canvasElement = document.createElement('canvas'); - let width; - let height; - if (typeof mediaElement !== 'undefined') { - if (mediaElement instanceof HTMLVideoElement) { - width = mediaElement.videoWidth; - height = mediaElement.videoHeight; - } - else if (mediaElement instanceof HTMLImageElement) { - width = mediaElement.naturalWidth || mediaElement.width; - height = mediaElement.naturalHeight || mediaElement.height; - } - } - canvasElement.style.width = width + 'px'; - canvasElement.style.height = height + 'px'; - canvasElement.width = width; - canvasElement.height = height; - return canvasElement; - } - /** - * Stops the continuous scan and cleans the stream. - */ - stopStreams() { - if (this.stream) { - this.stream.getVideoTracks().forEach(t => t.stop()); - this.stream = undefined; - } - if (this._stopAsyncDecode === false) { - this.stopAsyncDecode(); - } - if (this._stopContinuousDecode === false) { - this.stopContinuousDecode(); - } - } - /** - * Resets the code reader to the initial state. Cancels any ongoing barcode scanning from video or camera. - * - * @memberOf BrowserCodeReader - */ - reset() { - // stops the camera, preview and scan 🔴 - this.stopStreams(); - // clean and forget about HTML elements - this._destroyVideoElement(); - this._destroyImageElement(); - this._destroyCaptureCanvas(); - } - _destroyVideoElement() { - if (!this.videoElement) { - return; - } - // first gives freedon to the element 🕊 - if (typeof this.videoEndedListener !== 'undefined') { - this.videoElement.removeEventListener('ended', this.videoEndedListener); - } - if (typeof this.videoPlayingEventListener !== 'undefined') { - this.videoElement.removeEventListener('playing', this.videoPlayingEventListener); - } - if (typeof this.videoCanPlayListener !== 'undefined') { - this.videoElement.removeEventListener('loadedmetadata', this.videoCanPlayListener); - } - // then forgets about that element 😢 - this.cleanVideoSource(this.videoElement); - this.videoElement = undefined; - } - _destroyImageElement() { - if (!this.imageElement) { - return; - } - // first gives freedon to the element 🕊 - if (undefined !== this.imageLoadedListener) { - this.imageElement.removeEventListener('load', this.imageLoadedListener); - } - // then forget about that element 😢 - this.imageElement.src = undefined; - this.imageElement.removeAttribute('src'); - this.imageElement = undefined; - } - /** - * Cleans canvas references 🖌 - */ - _destroyCaptureCanvas() { - // then forget about that element 😢 - this.captureCanvasContext = undefined; - this.captureCanvas = undefined; - } - /** - * Defines what the videoElement src will be. - * - * @param videoElement - * @param stream - */ - addVideoSource(videoElement, stream) { - // Older browsers may not have `srcObject` - try { - // @note Throws Exception if interrupted by a new loaded request - videoElement.srcObject = stream; - } - catch (err) { - // @note Avoid using this in new browsers, as it is going away. - videoElement.src = URL.createObjectURL(stream); - } - } - /** - * Unbinds a HTML video src property. - * - * @param videoElement - */ - cleanVideoSource(videoElement) { - try { - videoElement.srcObject = null; - } - catch (err) { - videoElement.src = ''; - } - this.videoElement.removeAttribute('src'); - } - } - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - *

    Encapsulates the result of decoding a barcode within an image.

    - * - * @author Sean Owen - */ - class Result { - // public constructor(private text: string, - // Uint8Array rawBytes, - // ResultPoconst resultPoints: Int32Array, - // BarcodeFormat format) { - // this(text, rawBytes, resultPoints, format, System.currentTimeMillis()) - // } - // public constructor(text: string, - // Uint8Array rawBytes, - // ResultPoconst resultPoints: Int32Array, - // BarcodeFormat format, - // long timestamp) { - // this(text, rawBytes, rawBytes == null ? 0 : 8 * rawBytes.length, - // resultPoints, format, timestamp) - // } - constructor(text, rawBytes, numBits = rawBytes == null ? 0 : 8 * rawBytes.length, resultPoints, format, timestamp = System.currentTimeMillis()) { - this.text = text; - this.rawBytes = rawBytes; - this.numBits = numBits; - this.resultPoints = resultPoints; - this.format = format; - this.timestamp = timestamp; - this.text = text; - this.rawBytes = rawBytes; - if (undefined === numBits || null === numBits) { - this.numBits = (rawBytes === null || rawBytes === undefined) ? 0 : 8 * rawBytes.length; - } - else { - this.numBits = numBits; - } - this.resultPoints = resultPoints; - this.format = format; - this.resultMetadata = null; - if (undefined === timestamp || null === timestamp) { - this.timestamp = System.currentTimeMillis(); - } - else { - this.timestamp = timestamp; - } - } - /** - * @return raw text encoded by the barcode - */ - getText() { - return this.text; - } - /** - * @return raw bytes encoded by the barcode, if applicable, otherwise {@code null} - */ - getRawBytes() { - return this.rawBytes; - } - /** - * @return how many bits of {@link #getRawBytes()} are valid; typically 8 times its length - * @since 3.3.0 - */ - getNumBits() { - return this.numBits; - } - /** - * @return points related to the barcode in the image. These are typically points - * identifying finder patterns or the corners of the barcode. The exact meaning is - * specific to the type of barcode that was decoded. - */ - getResultPoints() { - return this.resultPoints; - } - /** - * @return {@link BarcodeFormat} representing the format of the barcode that was decoded - */ - getBarcodeFormat() { - return this.format; - } - /** - * @return {@link Map} mapping {@link ResultMetadataType} keys to values. May be - * {@code null}. This contains optional metadata about what was detected about the barcode, - * like orientation. - */ - getResultMetadata() { - return this.resultMetadata; - } - putMetadata(type, value) { - if (this.resultMetadata === null) { - this.resultMetadata = new Map(); - } - this.resultMetadata.set(type, value); - } - putAllMetadata(metadata) { - if (metadata !== null) { - if (this.resultMetadata === null) { - this.resultMetadata = metadata; - } - else { - this.resultMetadata = new Map(metadata); - } - } - } - addResultPoints(newPoints) { - const oldPoints = this.resultPoints; - if (oldPoints === null) { - this.resultPoints = newPoints; - } - else if (newPoints !== null && newPoints.length > 0) { - const allPoints = new Array(oldPoints.length + newPoints.length); - System.arraycopy(oldPoints, 0, allPoints, 0, oldPoints.length); - System.arraycopy(newPoints, 0, allPoints, oldPoints.length, newPoints.length); - this.resultPoints = allPoints; - } - } - getTimestamp() { - return this.timestamp; - } - /*@Override*/ - toString() { - return this.text; - } - } - - /* - * Direct port to TypeScript of ZXing by Adrian Toșcă - */ - /* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /*namespace com.google.zxing {*/ - /** - * Enumerates barcode formats known to this package. Please keep alphabetized. - * - * @author Sean Owen - */ - var BarcodeFormat; - (function (BarcodeFormat) { - /** Aztec 2D barcode format. */ - BarcodeFormat[BarcodeFormat["AZTEC"] = 0] = "AZTEC"; - /** CODABAR 1D format. */ - BarcodeFormat[BarcodeFormat["CODABAR"] = 1] = "CODABAR"; - /** Code 39 1D format. */ - BarcodeFormat[BarcodeFormat["CODE_39"] = 2] = "CODE_39"; - /** Code 93 1D format. */ - BarcodeFormat[BarcodeFormat["CODE_93"] = 3] = "CODE_93"; - /** Code 128 1D format. */ - BarcodeFormat[BarcodeFormat["CODE_128"] = 4] = "CODE_128"; - /** Data Matrix 2D barcode format. */ - BarcodeFormat[BarcodeFormat["DATA_MATRIX"] = 5] = "DATA_MATRIX"; - /** EAN-8 1D format. */ - BarcodeFormat[BarcodeFormat["EAN_8"] = 6] = "EAN_8"; - /** EAN-13 1D format. */ - BarcodeFormat[BarcodeFormat["EAN_13"] = 7] = "EAN_13"; - /** ITF (Interleaved Two of Five) 1D format. */ - BarcodeFormat[BarcodeFormat["ITF"] = 8] = "ITF"; - /** MaxiCode 2D barcode format. */ - BarcodeFormat[BarcodeFormat["MAXICODE"] = 9] = "MAXICODE"; - /** PDF417 format. */ - BarcodeFormat[BarcodeFormat["PDF_417"] = 10] = "PDF_417"; - /** QR Code 2D barcode format. */ - BarcodeFormat[BarcodeFormat["QR_CODE"] = 11] = "QR_CODE"; - /** RSS 14 */ - BarcodeFormat[BarcodeFormat["RSS_14"] = 12] = "RSS_14"; - /** RSS EXPANDED */ - BarcodeFormat[BarcodeFormat["RSS_EXPANDED"] = 13] = "RSS_EXPANDED"; - /** UPC-A 1D format. */ - BarcodeFormat[BarcodeFormat["UPC_A"] = 14] = "UPC_A"; - /** UPC-E 1D format. */ - BarcodeFormat[BarcodeFormat["UPC_E"] = 15] = "UPC_E"; - /** UPC/EAN extension format. Not a stand-alone format. */ - BarcodeFormat[BarcodeFormat["UPC_EAN_EXTENSION"] = 16] = "UPC_EAN_EXTENSION"; - })(BarcodeFormat || (BarcodeFormat = {})); - var BarcodeFormat$1 = BarcodeFormat; - - /*namespace com.google.zxing {*/ - /** - * Represents some type of metadata about the result of the decoding that the decoder - * wishes to communicate back to the caller. - * - * @author Sean Owen - */ - var ResultMetadataType; - (function (ResultMetadataType) { - /** - * Unspecified, application-specific metadata. Maps to an unspecified {@link Object}. - */ - ResultMetadataType[ResultMetadataType["OTHER"] = 0] = "OTHER"; - /** - * Denotes the likely approximate orientation of the barcode in the image. This value - * is given as degrees rotated clockwise from the normal, upright orientation. - * For example a 1D barcode which was found by reading top-to-bottom would be - * said to have orientation "90". This key maps to an {@link Integer} whose - * value is in the range [0,360). - */ - ResultMetadataType[ResultMetadataType["ORIENTATION"] = 1] = "ORIENTATION"; - /** - *

    2D barcode formats typically encode text, but allow for a sort of 'byte mode' - * which is sometimes used to encode binary data. While {@link Result} makes available - * the complete raw bytes in the barcode for these formats, it does not offer the bytes - * from the byte segments alone.

    - * - *

    This maps to a {@link java.util.List} of byte arrays corresponding to the - * raw bytes in the byte segments in the barcode, in order.

    - */ - ResultMetadataType[ResultMetadataType["BYTE_SEGMENTS"] = 2] = "BYTE_SEGMENTS"; - /** - * Error correction level used, if applicable. The value type depends on the - * format, but is typically a String. - */ - ResultMetadataType[ResultMetadataType["ERROR_CORRECTION_LEVEL"] = 3] = "ERROR_CORRECTION_LEVEL"; - /** - * For some periodicals, indicates the issue number as an {@link Integer}. - */ - ResultMetadataType[ResultMetadataType["ISSUE_NUMBER"] = 4] = "ISSUE_NUMBER"; - /** - * For some products, indicates the suggested retail price in the barcode as a - * formatted {@link String}. - */ - ResultMetadataType[ResultMetadataType["SUGGESTED_PRICE"] = 5] = "SUGGESTED_PRICE"; - /** - * For some products, the possible country of manufacture as a {@link String} denoting the - * ISO country code. Some map to multiple possible countries, like "US/CA". - */ - ResultMetadataType[ResultMetadataType["POSSIBLE_COUNTRY"] = 6] = "POSSIBLE_COUNTRY"; - /** - * For some products, the extension text - */ - ResultMetadataType[ResultMetadataType["UPC_EAN_EXTENSION"] = 7] = "UPC_EAN_EXTENSION"; - /** - * PDF417-specific metadata - */ - ResultMetadataType[ResultMetadataType["PDF417_EXTRA_METADATA"] = 8] = "PDF417_EXTRA_METADATA"; - /** - * If the code format supports structured append and the current scanned code is part of one then the - * sequence number is given with it. - */ - ResultMetadataType[ResultMetadataType["STRUCTURED_APPEND_SEQUENCE"] = 9] = "STRUCTURED_APPEND_SEQUENCE"; - /** - * If the code format supports structured append and the current scanned code is part of one then the - * parity is given with it. - */ - ResultMetadataType[ResultMetadataType["STRUCTURED_APPEND_PARITY"] = 10] = "STRUCTURED_APPEND_PARITY"; - })(ResultMetadataType || (ResultMetadataType = {})); - var ResultMetadataType$1 = ResultMetadataType; - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /*namespace com.google.zxing.common {*/ - /*import java.util.List;*/ - /** - *

    Encapsulates the result of decoding a matrix of bits. This typically - * applies to 2D barcode formats. For now it contains the raw bytes obtained, - * as well as a String interpretation of those bytes, if applicable.

    - * - * @author Sean Owen - */ - class DecoderResult { - // public constructor(rawBytes: Uint8Array, - // text: string, - // List byteSegments, - // String ecLevel) { - // this(rawBytes, text, byteSegments, ecLevel, -1, -1) - // } - constructor(rawBytes, text, byteSegments, ecLevel, structuredAppendSequenceNumber = -1, structuredAppendParity = -1) { - this.rawBytes = rawBytes; - this.text = text; - this.byteSegments = byteSegments; - this.ecLevel = ecLevel; - this.structuredAppendSequenceNumber = structuredAppendSequenceNumber; - this.structuredAppendParity = structuredAppendParity; - this.numBits = (rawBytes === undefined || rawBytes === null) ? 0 : 8 * rawBytes.length; - } - /** - * @return raw bytes representing the result, or {@code null} if not applicable - */ - getRawBytes() { - return this.rawBytes; - } - /** - * @return how many bits of {@link #getRawBytes()} are valid; typically 8 times its length - * @since 3.3.0 - */ - getNumBits() { - return this.numBits; - } - /** - * @param numBits overrides the number of bits that are valid in {@link #getRawBytes()} - * @since 3.3.0 - */ - setNumBits(numBits /*int*/) { - this.numBits = numBits; - } - /** - * @return text representation of the result - */ - getText() { - return this.text; - } - /** - * @return list of byte segments in the result, or {@code null} if not applicable - */ - getByteSegments() { - return this.byteSegments; - } - /** - * @return name of error correction level used, or {@code null} if not applicable - */ - getECLevel() { - return this.ecLevel; - } - /** - * @return number of errors corrected, or {@code null} if not applicable - */ - getErrorsCorrected() { - return this.errorsCorrected; - } - setErrorsCorrected(errorsCorrected /*Integer*/) { - this.errorsCorrected = errorsCorrected; - } - /** - * @return number of erasures corrected, or {@code null} if not applicable - */ - getErasures() { - return this.erasures; - } - setErasures(erasures /*Integer*/) { - this.erasures = erasures; - } - /** - * @return arbitrary additional metadata - */ - getOther() { - return this.other; - } - setOther(other) { - this.other = other; - } - hasStructuredAppend() { - return this.structuredAppendParity >= 0 && this.structuredAppendSequenceNumber >= 0; - } - getStructuredAppendParity() { - return this.structuredAppendParity; - } - getStructuredAppendSequenceNumber() { - return this.structuredAppendSequenceNumber; - } - } - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - *

    This class contains utility methods for performing mathematical operations over - * the Galois Fields. Operations use a given primitive polynomial in calculations.

    - * - *

    Throughout this package, elements of the GF are represented as an {@code int} - * for convenience and speed (but at the cost of memory). - *

    - * - * @author Sean Owen - * @author David Olivier - */ - class AbstractGenericGF { - /** - * @return 2 to the power of a in GF(size) - */ - exp(a) { - return this.expTable[a]; - } - /** - * @return base 2 log of a in GF(size) - */ - log(a /*int*/) { - if (a === 0) { - throw new IllegalArgumentException(); - } - return this.logTable[a]; - } - /** - * Implements both addition and subtraction -- they are the same in GF(size). - * - * @return sum/difference of a and b - */ - static addOrSubtract(a /*int*/, b /*int*/) { - return a ^ b; - } - } - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - *

    Represents a polynomial whose coefficients are elements of a GF. - * Instances of this class are immutable.

    - * - *

    Much credit is due to William Rucklidge since portions of this code are an indirect - * port of his C++ Reed-Solomon implementation.

    - * - * @author Sean Owen - */ - class GenericGFPoly { - /** - * @param field the {@link GenericGF} instance representing the field to use - * to perform computations - * @param coefficients coefficients as ints representing elements of GF(size), arranged - * from most significant (highest-power term) coefficient to least significant - * @throws IllegalArgumentException if argument is null or empty, - * or if leading coefficient is 0 and this is not a - * constant polynomial (that is, it is not the monomial "0") - */ - constructor(field, coefficients) { - if (coefficients.length === 0) { - throw new IllegalArgumentException(); - } - this.field = field; - const coefficientsLength = coefficients.length; - if (coefficientsLength > 1 && coefficients[0] === 0) { - // Leading term must be non-zero for anything except the constant polynomial "0" - let firstNonZero = 1; - while (firstNonZero < coefficientsLength && coefficients[firstNonZero] === 0) { - firstNonZero++; - } - if (firstNonZero === coefficientsLength) { - this.coefficients = Int32Array.from([0]); - } - else { - this.coefficients = new Int32Array(coefficientsLength - firstNonZero); - System.arraycopy(coefficients, firstNonZero, this.coefficients, 0, this.coefficients.length); - } - } - else { - this.coefficients = coefficients; - } - } - getCoefficients() { - return this.coefficients; - } - /** - * @return degree of this polynomial - */ - getDegree() { - return this.coefficients.length - 1; - } - /** - * @return true iff this polynomial is the monomial "0" - */ - isZero() { - return this.coefficients[0] === 0; - } - /** - * @return coefficient of x^degree term in this polynomial - */ - getCoefficient(degree /*int*/) { - return this.coefficients[this.coefficients.length - 1 - degree]; - } - /** - * @return evaluation of this polynomial at a given point - */ - evaluateAt(a /*int*/) { - if (a === 0) { - // Just return the x^0 coefficient - return this.getCoefficient(0); - } - const coefficients = this.coefficients; - let result; - if (a === 1) { - // Just the sum of the coefficients - result = 0; - for (let i = 0, length = coefficients.length; i !== length; i++) { - const coefficient = coefficients[i]; - result = AbstractGenericGF.addOrSubtract(result, coefficient); - } - return result; - } - result = coefficients[0]; - const size = coefficients.length; - const field = this.field; - for (let i = 1; i < size; i++) { - result = AbstractGenericGF.addOrSubtract(field.multiply(a, result), coefficients[i]); - } - return result; - } - addOrSubtract(other) { - if (!this.field.equals(other.field)) { - throw new IllegalArgumentException('GenericGFPolys do not have same GenericGF field'); - } - if (this.isZero()) { - return other; - } - if (other.isZero()) { - return this; - } - let smallerCoefficients = this.coefficients; - let largerCoefficients = other.coefficients; - if (smallerCoefficients.length > largerCoefficients.length) { - const temp = smallerCoefficients; - smallerCoefficients = largerCoefficients; - largerCoefficients = temp; - } - let sumDiff = new Int32Array(largerCoefficients.length); - const lengthDiff = largerCoefficients.length - smallerCoefficients.length; - // Copy high-order terms only found in higher-degree polynomial's coefficients - System.arraycopy(largerCoefficients, 0, sumDiff, 0, lengthDiff); - for (let i = lengthDiff; i < largerCoefficients.length; i++) { - sumDiff[i] = AbstractGenericGF.addOrSubtract(smallerCoefficients[i - lengthDiff], largerCoefficients[i]); - } - return new GenericGFPoly(this.field, sumDiff); - } - multiply(other) { - if (!this.field.equals(other.field)) { - throw new IllegalArgumentException('GenericGFPolys do not have same GenericGF field'); - } - if (this.isZero() || other.isZero()) { - return this.field.getZero(); - } - const aCoefficients = this.coefficients; - const aLength = aCoefficients.length; - const bCoefficients = other.coefficients; - const bLength = bCoefficients.length; - const product = new Int32Array(aLength + bLength - 1); - const field = this.field; - for (let i = 0; i < aLength; i++) { - const aCoeff = aCoefficients[i]; - for (let j = 0; j < bLength; j++) { - product[i + j] = AbstractGenericGF.addOrSubtract(product[i + j], field.multiply(aCoeff, bCoefficients[j])); - } - } - return new GenericGFPoly(field, product); - } - multiplyScalar(scalar /*int*/) { - if (scalar === 0) { - return this.field.getZero(); - } - if (scalar === 1) { - return this; - } - const size = this.coefficients.length; - const field = this.field; - const product = new Int32Array(size); - const coefficients = this.coefficients; - for (let i = 0; i < size; i++) { - product[i] = field.multiply(coefficients[i], scalar); - } - return new GenericGFPoly(field, product); - } - multiplyByMonomial(degree /*int*/, coefficient /*int*/) { - if (degree < 0) { - throw new IllegalArgumentException(); - } - if (coefficient === 0) { - return this.field.getZero(); - } - const coefficients = this.coefficients; - const size = coefficients.length; - const product = new Int32Array(size + degree); - const field = this.field; - for (let i = 0; i < size; i++) { - product[i] = field.multiply(coefficients[i], coefficient); - } - return new GenericGFPoly(field, product); - } - divide(other) { - if (!this.field.equals(other.field)) { - throw new IllegalArgumentException('GenericGFPolys do not have same GenericGF field'); - } - if (other.isZero()) { - throw new IllegalArgumentException('Divide by 0'); - } - const field = this.field; - let quotient = field.getZero(); - let remainder = this; - const denominatorLeadingTerm = other.getCoefficient(other.getDegree()); - const inverseDenominatorLeadingTerm = field.inverse(denominatorLeadingTerm); - while (remainder.getDegree() >= other.getDegree() && !remainder.isZero()) { - const degreeDifference = remainder.getDegree() - other.getDegree(); - const scale = field.multiply(remainder.getCoefficient(remainder.getDegree()), inverseDenominatorLeadingTerm); - const term = other.multiplyByMonomial(degreeDifference, scale); - const iterationQuotient = field.buildMonomial(degreeDifference, scale); - quotient = quotient.addOrSubtract(iterationQuotient); - remainder = remainder.addOrSubtract(term); - } - return [quotient, remainder]; - } - /*@Override*/ - toString() { - let result = ''; - for (let degree = this.getDegree(); degree >= 0; degree--) { - let coefficient = this.getCoefficient(degree); - if (coefficient !== 0) { - if (coefficient < 0) { - result += ' - '; - coefficient = -coefficient; - } - else { - if (result.length > 0) { - result += ' + '; - } - } - if (degree === 0 || coefficient !== 1) { - const alphaPower = this.field.log(coefficient); - if (alphaPower === 0) { - result += '1'; - } - else if (alphaPower === 1) { - result += 'a'; - } - else { - result += 'a^'; - result += alphaPower; - } - } - if (degree !== 0) { - if (degree === 1) { - result += 'x'; - } - else { - result += 'x^'; - result += degree; - } - } - } - } - return result; - } - } - - /** - * Custom Error class of type Exception. - */ - class ArithmeticException extends Exception { - } - ArithmeticException.kind = 'ArithmeticException'; - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - *

    This class contains utility methods for performing mathematical operations over - * the Galois Fields. Operations use a given primitive polynomial in calculations.

    - * - *

    Throughout this package, elements of the GF are represented as an {@code int} - * for convenience and speed (but at the cost of memory). - *

    - * - * @author Sean Owen - * @author David Olivier - */ - class GenericGF extends AbstractGenericGF { - /** - * Create a representation of GF(size) using the given primitive polynomial. - * - * @param primitive irreducible polynomial whose coefficients are represented by - * the bits of an int, where the least-significant bit represents the constant - * coefficient - * @param size the size of the field - * @param b the factor b in the generator polynomial can be 0- or 1-based - * (g(x) = (x+a^b)(x+a^(b+1))...(x+a^(b+2t-1))). - * In most cases it should be 1, but for QR code it is 0. - */ - constructor(primitive /*int*/, size /*int*/, generatorBase /*int*/) { - super(); - this.primitive = primitive; - this.size = size; - this.generatorBase = generatorBase; - const expTable = new Int32Array(size); - let x = 1; - for (let i = 0; i < size; i++) { - expTable[i] = x; - x *= 2; // we're assuming the generator alpha is 2 - if (x >= size) { - x ^= primitive; - x &= size - 1; - } - } - this.expTable = expTable; - const logTable = new Int32Array(size); - for (let i = 0; i < size - 1; i++) { - logTable[expTable[i]] = i; - } - this.logTable = logTable; - // logTable[0] == 0 but this should never be used - this.zero = new GenericGFPoly(this, Int32Array.from([0])); - this.one = new GenericGFPoly(this, Int32Array.from([1])); - } - getZero() { - return this.zero; - } - getOne() { - return this.one; - } - /** - * @return the monomial representing coefficient * x^degree - */ - buildMonomial(degree /*int*/, coefficient /*int*/) { - if (degree < 0) { - throw new IllegalArgumentException(); - } - if (coefficient === 0) { - return this.zero; - } - const coefficients = new Int32Array(degree + 1); - coefficients[0] = coefficient; - return new GenericGFPoly(this, coefficients); - } - /** - * @return multiplicative inverse of a - */ - inverse(a /*int*/) { - if (a === 0) { - throw new ArithmeticException(); - } - return this.expTable[this.size - this.logTable[a] - 1]; - } - /** - * @return product of a and b in GF(size) - */ - multiply(a /*int*/, b /*int*/) { - if (a === 0 || b === 0) { - return 0; - } - return this.expTable[(this.logTable[a] + this.logTable[b]) % (this.size - 1)]; - } - getSize() { - return this.size; - } - getGeneratorBase() { - return this.generatorBase; - } - /*@Override*/ - toString() { - return ('GF(0x' + Integer.toHexString(this.primitive) + ',' + this.size + ')'); - } - equals(o) { - return o === this; - } - } - GenericGF.AZTEC_DATA_12 = new GenericGF(0x1069, 4096, 1); // x^12 + x^6 + x^5 + x^3 + 1 - GenericGF.AZTEC_DATA_10 = new GenericGF(0x409, 1024, 1); // x^10 + x^3 + 1 - GenericGF.AZTEC_DATA_6 = new GenericGF(0x43, 64, 1); // x^6 + x + 1 - GenericGF.AZTEC_PARAM = new GenericGF(0x13, 16, 1); // x^4 + x + 1 - GenericGF.QR_CODE_FIELD_256 = new GenericGF(0x011d, 256, 0); // x^8 + x^4 + x^3 + x^2 + 1 - GenericGF.DATA_MATRIX_FIELD_256 = new GenericGF(0x012d, 256, 1); // x^8 + x^5 + x^3 + x^2 + 1 - GenericGF.AZTEC_DATA_8 = GenericGF.DATA_MATRIX_FIELD_256; - GenericGF.MAXICODE_FIELD_64 = GenericGF.AZTEC_DATA_6; - - /** - * Custom Error class of type Exception. - */ - class ReedSolomonException extends Exception { - } - ReedSolomonException.kind = 'ReedSolomonException'; - - /** - * Custom Error class of type Exception. - */ - class IllegalStateException extends Exception { - } - IllegalStateException.kind = 'IllegalStateException'; - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - *

    Implements Reed-Solomon decoding, as the name implies.

    - * - *

    The algorithm will not be explained here, but the following references were helpful - * in creating this implementation:

    - * - *
    - * - *

    Much credit is due to William Rucklidge since portions of this code are an indirect - * port of his C++ Reed-Solomon implementation.

    - * - * @author Sean Owen - * @author William Rucklidge - * @author sanfordsquires - */ - class ReedSolomonDecoder { - constructor(field) { - this.field = field; - } - /** - *

    Decodes given set of received codewords, which include both data and error-correction - * codewords. Really, this means it uses Reed-Solomon to detect and correct errors, in-place, - * in the input.

    - * - * @param received data and error-correction codewords - * @param twoS number of error-correction codewords available - * @throws ReedSolomonException if decoding fails for any reason - */ - decode(received, twoS /*int*/) { - const field = this.field; - const poly = new GenericGFPoly(field, received); - const syndromeCoefficients = new Int32Array(twoS); - let noError = true; - for (let i = 0; i < twoS; i++) { - const evalResult = poly.evaluateAt(field.exp(i + field.getGeneratorBase())); - syndromeCoefficients[syndromeCoefficients.length - 1 - i] = evalResult; - if (evalResult !== 0) { - noError = false; - } - } - if (noError) { - return; - } - const syndrome = new GenericGFPoly(field, syndromeCoefficients); - const sigmaOmega = this.runEuclideanAlgorithm(field.buildMonomial(twoS, 1), syndrome, twoS); - const sigma = sigmaOmega[0]; - const omega = sigmaOmega[1]; - const errorLocations = this.findErrorLocations(sigma); - const errorMagnitudes = this.findErrorMagnitudes(omega, errorLocations); - for (let i = 0; i < errorLocations.length; i++) { - const position = received.length - 1 - field.log(errorLocations[i]); - if (position < 0) { - throw new ReedSolomonException('Bad error location'); - } - received[position] = GenericGF.addOrSubtract(received[position], errorMagnitudes[i]); - } - } - runEuclideanAlgorithm(a, b, R /*int*/) { - // Assume a's degree is >= b's - if (a.getDegree() < b.getDegree()) { - const temp = a; - a = b; - b = temp; - } - const field = this.field; - let rLast = a; - let r = b; - let tLast = field.getZero(); - let t = field.getOne(); - // Run Euclidean algorithm until r's degree is less than R/2 - while (r.getDegree() >= (R / 2 | 0)) { - let rLastLast = rLast; - let tLastLast = tLast; - rLast = r; - tLast = t; - // Divide rLastLast by rLast, with quotient in q and remainder in r - if (rLast.isZero()) { - // Oops, Euclidean algorithm already terminated? - throw new ReedSolomonException('r_{i-1} was zero'); - } - r = rLastLast; - let q = field.getZero(); - const denominatorLeadingTerm = rLast.getCoefficient(rLast.getDegree()); - const dltInverse = field.inverse(denominatorLeadingTerm); - while (r.getDegree() >= rLast.getDegree() && !r.isZero()) { - const degreeDiff = r.getDegree() - rLast.getDegree(); - const scale = field.multiply(r.getCoefficient(r.getDegree()), dltInverse); - q = q.addOrSubtract(field.buildMonomial(degreeDiff, scale)); - r = r.addOrSubtract(rLast.multiplyByMonomial(degreeDiff, scale)); - } - t = q.multiply(tLast).addOrSubtract(tLastLast); - if (r.getDegree() >= rLast.getDegree()) { - throw new IllegalStateException('Division algorithm failed to reduce polynomial?'); - } - } - const sigmaTildeAtZero = t.getCoefficient(0); - if (sigmaTildeAtZero === 0) { - throw new ReedSolomonException('sigmaTilde(0) was zero'); - } - const inverse = field.inverse(sigmaTildeAtZero); - const sigma = t.multiplyScalar(inverse); - const omega = r.multiplyScalar(inverse); - return [sigma, omega]; - } - findErrorLocations(errorLocator) { - // This is a direct application of Chien's search - const numErrors = errorLocator.getDegree(); - if (numErrors === 1) { // shortcut - return Int32Array.from([errorLocator.getCoefficient(1)]); - } - const result = new Int32Array(numErrors); - let e = 0; - const field = this.field; - for (let i = 1; i < field.getSize() && e < numErrors; i++) { - if (errorLocator.evaluateAt(i) === 0) { - result[e] = field.inverse(i); - e++; - } - } - if (e !== numErrors) { - throw new ReedSolomonException('Error locator degree does not match number of roots'); - } - return result; - } - findErrorMagnitudes(errorEvaluator, errorLocations) { - // This is directly applying Forney's Formula - const s = errorLocations.length; - const result = new Int32Array(s); - const field = this.field; - for (let i = 0; i < s; i++) { - const xiInverse = field.inverse(errorLocations[i]); - let denominator = 1; - for (let j = 0; j < s; j++) { - if (i !== j) { - // denominator = field.multiply(denominator, - // GenericGF.addOrSubtract(1, field.multiply(errorLocations[j], xiInverse))) - // Above should work but fails on some Apple and Linux JDKs due to a Hotspot bug. - // Below is a funny-looking workaround from Steven Parkes - const term = field.multiply(errorLocations[j], xiInverse); - const termPlus1 = (term & 0x1) === 0 ? term | 1 : term & ~1; - denominator = field.multiply(denominator, termPlus1); - } - } - result[i] = field.multiply(errorEvaluator.evaluateAt(xiInverse), field.inverse(denominator)); - if (field.getGeneratorBase() !== 0) { - result[i] = field.multiply(result[i], xiInverse); - } - } - return result; - } - } - - /* - * Copyright 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - // import java.util.Arrays; - var Table; - (function (Table) { - Table[Table["UPPER"] = 0] = "UPPER"; - Table[Table["LOWER"] = 1] = "LOWER"; - Table[Table["MIXED"] = 2] = "MIXED"; - Table[Table["DIGIT"] = 3] = "DIGIT"; - Table[Table["PUNCT"] = 4] = "PUNCT"; - Table[Table["BINARY"] = 5] = "BINARY"; - })(Table || (Table = {})); - /** - *

    The main class which implements Aztec Code decoding -- as opposed to locating and extracting - * the Aztec Code from an image.

    - * - * @author David Olivier - */ - class Decoder { - decode(detectorResult) { - this.ddata = detectorResult; - let matrix = detectorResult.getBits(); - let rawbits = this.extractBits(matrix); - let correctedBits = this.correctBits(rawbits); - let rawBytes = Decoder.convertBoolArrayToByteArray(correctedBits); - let result = Decoder.getEncodedData(correctedBits); - let decoderResult = new DecoderResult(rawBytes, result, null, null); - decoderResult.setNumBits(correctedBits.length); - return decoderResult; - } - // This method is used for testing the high-level encoder - static highLevelDecode(correctedBits) { - return this.getEncodedData(correctedBits); - } - /** - * Gets the string encoded in the aztec code bits - * - * @return the decoded string - */ - static getEncodedData(correctedBits) { - let endIndex = correctedBits.length; - let latchTable = Table.UPPER; // table most recently latched to - let shiftTable = Table.UPPER; // table to use for the next read - let result = ''; - let index = 0; - while (index < endIndex) { - if (shiftTable === Table.BINARY) { - if (endIndex - index < 5) { - break; - } - let length = Decoder.readCode(correctedBits, index, 5); - index += 5; - if (length === 0) { - if (endIndex - index < 11) { - break; - } - length = Decoder.readCode(correctedBits, index, 11) + 31; - index += 11; - } - for (let charCount = 0; charCount < length; charCount++) { - if (endIndex - index < 8) { - index = endIndex; // Force outer loop to exit - break; - } - const code = Decoder.readCode(correctedBits, index, 8); - result += /*(char)*/ StringUtils.castAsNonUtf8Char(code); - index += 8; - } - // Go back to whatever mode we had been in - shiftTable = latchTable; - } - else { - let size = shiftTable === Table.DIGIT ? 4 : 5; - if (endIndex - index < size) { - break; - } - let code = Decoder.readCode(correctedBits, index, size); - index += size; - let str = Decoder.getCharacter(shiftTable, code); - if (str.startsWith('CTRL_')) { - // Table changes - // ISO/IEC 24778:2008 prescribes ending a shift sequence in the mode from which it was invoked. - // That's including when that mode is a shift. - // Our test case dlusbs.png for issue #642 exercises that. - latchTable = shiftTable; // Latch the current mode, so as to return to Upper after U/S B/S - shiftTable = Decoder.getTable(str.charAt(5)); - if (str.charAt(6) === 'L') { - latchTable = shiftTable; - } - } - else { - result += str; - // Go back to whatever mode we had been in - shiftTable = latchTable; - } - } - } - return result; - } - /** - * gets the table corresponding to the char passed - */ - static getTable(t) { - switch (t) { - case 'L': - return Table.LOWER; - case 'P': - return Table.PUNCT; - case 'M': - return Table.MIXED; - case 'D': - return Table.DIGIT; - case 'B': - return Table.BINARY; - case 'U': - default: - return Table.UPPER; - } - } - /** - * Gets the character (or string) corresponding to the passed code in the given table - * - * @param table the table used - * @param code the code of the character - */ - static getCharacter(table, code) { - switch (table) { - case Table.UPPER: - return Decoder.UPPER_TABLE[code]; - case Table.LOWER: - return Decoder.LOWER_TABLE[code]; - case Table.MIXED: - return Decoder.MIXED_TABLE[code]; - case Table.PUNCT: - return Decoder.PUNCT_TABLE[code]; - case Table.DIGIT: - return Decoder.DIGIT_TABLE[code]; - default: - // Should not reach here. - throw new IllegalStateException('Bad table'); - } - } - /** - *

    Performs RS error correction on an array of bits.

    - * - * @return the corrected array - * @throws FormatException if the input contains too many errors - */ - correctBits(rawbits) { - let gf; - let codewordSize; - if (this.ddata.getNbLayers() <= 2) { - codewordSize = 6; - gf = GenericGF.AZTEC_DATA_6; - } - else if (this.ddata.getNbLayers() <= 8) { - codewordSize = 8; - gf = GenericGF.AZTEC_DATA_8; - } - else if (this.ddata.getNbLayers() <= 22) { - codewordSize = 10; - gf = GenericGF.AZTEC_DATA_10; - } - else { - codewordSize = 12; - gf = GenericGF.AZTEC_DATA_12; - } - let numDataCodewords = this.ddata.getNbDatablocks(); - let numCodewords = rawbits.length / codewordSize; - if (numCodewords < numDataCodewords) { - throw new FormatException(); - } - let offset = rawbits.length % codewordSize; - let dataWords = new Int32Array(numCodewords); - for (let i = 0; i < numCodewords; i++, offset += codewordSize) { - dataWords[i] = Decoder.readCode(rawbits, offset, codewordSize); - } - try { - let rsDecoder = new ReedSolomonDecoder(gf); - rsDecoder.decode(dataWords, numCodewords - numDataCodewords); - } - catch (ex) { - throw new FormatException(ex); - } - // Now perform the unstuffing operation. - // First, count how many bits are going to be thrown out as stuffing - let mask = (1 << codewordSize) - 1; - let stuffedBits = 0; - for (let i = 0; i < numDataCodewords; i++) { - let dataWord = dataWords[i]; - if (dataWord === 0 || dataWord === mask) { - throw new FormatException(); - } - else if (dataWord === 1 || dataWord === mask - 1) { - stuffedBits++; - } - } - // Now, actually unpack the bits and remove the stuffing - let correctedBits = new Array(numDataCodewords * codewordSize - stuffedBits); - let index = 0; - for (let i = 0; i < numDataCodewords; i++) { - let dataWord = dataWords[i]; - if (dataWord === 1 || dataWord === mask - 1) { - // next codewordSize-1 bits are all zeros or all ones - correctedBits.fill(dataWord > 1, index, index + codewordSize - 1); - // Arrays.fill(correctedBits, index, index + codewordSize - 1, dataWord > 1); - index += codewordSize - 1; - } - else { - for (let bit = codewordSize - 1; bit >= 0; --bit) { - correctedBits[index++] = (dataWord & (1 << bit)) !== 0; - } - } - } - return correctedBits; - } - /** - * Gets the array of bits from an Aztec Code matrix - * - * @return the array of bits - */ - extractBits(matrix) { - let compact = this.ddata.isCompact(); - let layers = this.ddata.getNbLayers(); - let baseMatrixSize = (compact ? 11 : 14) + layers * 4; // not including alignment lines - let alignmentMap = new Int32Array(baseMatrixSize); - let rawbits = new Array(this.totalBitsInLayer(layers, compact)); - if (compact) { - for (let i = 0; i < alignmentMap.length; i++) { - alignmentMap[i] = i; - } - } - else { - let matrixSize = baseMatrixSize + 1 + 2 * Integer.truncDivision((Integer.truncDivision(baseMatrixSize, 2) - 1), 15); - let origCenter = baseMatrixSize / 2; - let center = Integer.truncDivision(matrixSize, 2); - for (let i = 0; i < origCenter; i++) { - let newOffset = i + Integer.truncDivision(i, 15); - alignmentMap[origCenter - i - 1] = center - newOffset - 1; - alignmentMap[origCenter + i] = center + newOffset + 1; - } - } - for (let i = 0, rowOffset = 0; i < layers; i++) { - let rowSize = (layers - i) * 4 + (compact ? 9 : 12); - // The top-left most point of this layer is (not including alignment lines) - let low = i * 2; - // The bottom-right most point of this layer is (not including alignment lines) - let high = baseMatrixSize - 1 - low; - // We pull bits from the two 2 x rowSize columns and two rowSize x 2 rows - for (let j = 0; j < rowSize; j++) { - let columnOffset = j * 2; - for (let k = 0; k < 2; k++) { - // left column - rawbits[rowOffset + columnOffset + k] = - matrix.get(alignmentMap[low + k], alignmentMap[low + j]); - // bottom row - rawbits[rowOffset + 2 * rowSize + columnOffset + k] = - matrix.get(alignmentMap[low + j], alignmentMap[high - k]); - // right column - rawbits[rowOffset + 4 * rowSize + columnOffset + k] = - matrix.get(alignmentMap[high - k], alignmentMap[high - j]); - // top row - rawbits[rowOffset + 6 * rowSize + columnOffset + k] = - matrix.get(alignmentMap[high - j], alignmentMap[low + k]); - } - } - rowOffset += rowSize * 8; - } - return rawbits; - } - /** - * Reads a code of given length and at given index in an array of bits - */ - static readCode(rawbits, startIndex, length) { - let res = 0; - for (let i = startIndex; i < startIndex + length; i++) { - res <<= 1; - if (rawbits[i]) { - res |= 0x01; - } - } - return res; - } - /** - * Reads a code of length 8 in an array of bits, padding with zeros - */ - static readByte(rawbits, startIndex) { - let n = rawbits.length - startIndex; - if (n >= 8) { - return Decoder.readCode(rawbits, startIndex, 8); - } - return Decoder.readCode(rawbits, startIndex, n) << (8 - n); - } - /** - * Packs a bit array into bytes, most significant bit first - */ - static convertBoolArrayToByteArray(boolArr) { - let byteArr = new Uint8Array((boolArr.length + 7) / 8); - for (let i = 0; i < byteArr.length; i++) { - byteArr[i] = Decoder.readByte(boolArr, 8 * i); - } - return byteArr; - } - totalBitsInLayer(layers, compact) { - return ((compact ? 88 : 112) + 16 * layers) * layers; - } - } - Decoder.UPPER_TABLE = [ - 'CTRL_PS', ' ', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', - 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'CTRL_LL', 'CTRL_ML', 'CTRL_DL', 'CTRL_BS' - ]; - Decoder.LOWER_TABLE = [ - 'CTRL_PS', ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', - 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'CTRL_US', 'CTRL_ML', 'CTRL_DL', 'CTRL_BS' - ]; - Decoder.MIXED_TABLE = [ - // Module parse failed: Octal literal in strict mode (50:29) - // so number string were scaped - 'CTRL_PS', ' ', '\\1', '\\2', '\\3', '\\4', '\\5', '\\6', '\\7', '\b', '\t', '\n', - '\\13', '\f', '\r', '\\33', '\\34', '\\35', '\\36', '\\37', '@', '\\', '^', '_', - '`', '|', '~', '\\177', 'CTRL_LL', 'CTRL_UL', 'CTRL_PL', 'CTRL_BS' - ]; - Decoder.PUNCT_TABLE = [ - '', '\r', '\r\n', '. ', ', ', ': ', '!', '"', '#', '$', '%', '&', '\'', '(', ')', - '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', '[', ']', '{', '}', 'CTRL_UL' - ]; - Decoder.DIGIT_TABLE = [ - 'CTRL_PS', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ',', '.', 'CTRL_UL', 'CTRL_US' - ]; - - /* - * Copyright 2012 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /*namespace com.google.zxing.common.detector {*/ - /** - * General math-related and numeric utility functions. - */ - class MathUtils { - constructor() { } - /** - * Ends up being a bit faster than {@link Math#round(float)}. This merely rounds its - * argument to the nearest int, where x.5 rounds up to x+1. Semantics of this shortcut - * differ slightly from {@link Math#round(float)} in that half rounds down for negative - * values. -2.5 rounds to -3, not -2. For purposes here it makes no difference. - * - * @param d real value to round - * @return nearest {@code int} - */ - static round(d /*float*/) { - if (NaN === d) - return 0; - if (d <= Number.MIN_SAFE_INTEGER) - return Number.MIN_SAFE_INTEGER; - if (d >= Number.MAX_SAFE_INTEGER) - return Number.MAX_SAFE_INTEGER; - return /*(int) */ (d + (d < 0.0 ? -0.5 : 0.5)) | 0; - } - // TYPESCRIPTPORT: maybe remove round method and call directly Math.round, it looks like it doesn't make sense for js - /** - * @param aX point A x coordinate - * @param aY point A y coordinate - * @param bX point B x coordinate - * @param bY point B y coordinate - * @return Euclidean distance between points A and B - */ - static distance(aX /*float|int*/, aY /*float|int*/, bX /*float|int*/, bY /*float|int*/) { - const xDiff = aX - bX; - const yDiff = aY - bY; - return /*(float) */ Math.sqrt(xDiff * xDiff + yDiff * yDiff); - } - /** - * @param aX point A x coordinate - * @param aY point A y coordinate - * @param bX point B x coordinate - * @param bY point B y coordinate - * @return Euclidean distance between points A and B - */ - // public static distance(aX: number /*int*/, aY: number /*int*/, bX: number /*int*/, bY: number /*int*/): float { - // const xDiff = aX - bX - // const yDiff = aY - bY - // return (float) Math.sqrt(xDiff * xDiff + yDiff * yDiff); - // } - /** - * @param array values to sum - * @return sum of values in array - */ - static sum(array) { - let count = 0; - for (let i = 0, length = array.length; i !== length; i++) { - const a = array[i]; - count += a; - } - return count; - } - } - - /** - * Ponyfill for Java's Float class. - */ - class Float { - /** - * SincTS has no difference between int and float, there's all numbers, - * this is used only to polyfill Java code. - */ - static floatToIntBits(f) { - return f; - } - } - /** - * The float max value in JS is the number max value. - */ - Float.MAX_VALUE = Number.MAX_SAFE_INTEGER; - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - *

    Encapsulates a point of interest in an image containing a barcode. Typically, this - * would be the location of a finder pattern or the corner of the barcode, for example.

    - * - * @author Sean Owen - */ - class ResultPoint { - constructor(x, y) { - this.x = x; - this.y = y; - } - getX() { - return this.x; - } - getY() { - return this.y; - } - /*@Override*/ - equals(other) { - if (other instanceof ResultPoint) { - const otherPoint = other; - return this.x === otherPoint.x && this.y === otherPoint.y; - } - return false; - } - /*@Override*/ - hashCode() { - return 31 * Float.floatToIntBits(this.x) + Float.floatToIntBits(this.y); - } - /*@Override*/ - toString() { - return '(' + this.x + ',' + this.y + ')'; - } - /** - * Orders an array of three ResultPoints in an order [A,B,C] such that AB is less than AC - * and BC is less than AC, and the angle between BC and BA is less than 180 degrees. - * - * @param patterns array of three {@code ResultPoint} to order - */ - static orderBestPatterns(patterns) { - // Find distances between pattern centers - const zeroOneDistance = this.distance(patterns[0], patterns[1]); - const oneTwoDistance = this.distance(patterns[1], patterns[2]); - const zeroTwoDistance = this.distance(patterns[0], patterns[2]); - let pointA; - let pointB; - let pointC; - // Assume one closest to other two is B; A and C will just be guesses at first - if (oneTwoDistance >= zeroOneDistance && oneTwoDistance >= zeroTwoDistance) { - pointB = patterns[0]; - pointA = patterns[1]; - pointC = patterns[2]; - } - else if (zeroTwoDistance >= oneTwoDistance && zeroTwoDistance >= zeroOneDistance) { - pointB = patterns[1]; - pointA = patterns[0]; - pointC = patterns[2]; - } - else { - pointB = patterns[2]; - pointA = patterns[0]; - pointC = patterns[1]; - } - // Use cross product to figure out whether A and C are correct or flipped. - // This asks whether BC x BA has a positive z component, which is the arrangement - // we want for A, B, C. If it's negative, then we've got it flipped around and - // should swap A and C. - if (this.crossProductZ(pointA, pointB, pointC) < 0.0) { - const temp = pointA; - pointA = pointC; - pointC = temp; - } - patterns[0] = pointA; - patterns[1] = pointB; - patterns[2] = pointC; - } - /** - * @param pattern1 first pattern - * @param pattern2 second pattern - * @return distance between two points - */ - static distance(pattern1, pattern2) { - return MathUtils.distance(pattern1.x, pattern1.y, pattern2.x, pattern2.y); - } - /** - * Returns the z component of the cross product between vectors BC and BA. - */ - static crossProductZ(pointA, pointB, pointC) { - const bX = pointB.x; - const bY = pointB.y; - return ((pointC.x - bX) * (pointA.y - bY)) - ((pointC.y - bY) * (pointA.x - bX)); - } - } - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - *

    Encapsulates the result of detecting a barcode in an image. This includes the raw - * matrix of black/white pixels corresponding to the barcode, and possibly points of interest - * in the image, like the location of finder patterns or corners of the barcode in the image.

    - * - * @author Sean Owen - */ - class DetectorResult { - constructor(bits, points) { - this.bits = bits; - this.points = points; - } - getBits() { - return this.bits; - } - getPoints() { - return this.points; - } - } - - /* - * Copyright 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - *

    Extends {@link DetectorResult} with more information specific to the Aztec format, - * like the number of layers and whether it's compact.

    - * - * @author Sean Owen - */ - class AztecDetectorResult extends DetectorResult { - constructor(bits, points, compact, nbDatablocks, nbLayers) { - super(bits, points); - this.compact = compact; - this.nbDatablocks = nbDatablocks; - this.nbLayers = nbLayers; - } - getNbLayers() { - return this.nbLayers; - } - getNbDatablocks() { - return this.nbDatablocks; - } - isCompact() { - return this.compact; - } - } - - /* - * Copyright 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - *

    - * Detects a candidate barcode-like rectangular region within an image. It - * starts around the center of the image, increases the size of the candidate - * region until it finds a white rectangular region. By keeping track of the - * last black points it encountered, it determines the corners of the barcode. - *

    - * - * @author David Olivier - */ - class WhiteRectangleDetector { - // public constructor(private image: BitMatrix) /*throws NotFoundException*/ { - // this(image, INIT_SIZE, image.getWidth() / 2, image.getHeight() / 2) - // } - /** - * @param image barcode image to find a rectangle in - * @param initSize initial size of search area around center - * @param x x position of search center - * @param y y position of search center - * @throws NotFoundException if image is too small to accommodate {@code initSize} - */ - constructor(image, initSize /*int*/, x /*int*/, y /*int*/) { - this.image = image; - this.height = image.getHeight(); - this.width = image.getWidth(); - if (undefined === initSize || null === initSize) { - initSize = WhiteRectangleDetector.INIT_SIZE; - } - if (undefined === x || null === x) { - x = image.getWidth() / 2 | 0; - } - if (undefined === y || null === y) { - y = image.getHeight() / 2 | 0; - } - const halfsize = initSize / 2 | 0; - this.leftInit = x - halfsize; - this.rightInit = x + halfsize; - this.upInit = y - halfsize; - this.downInit = y + halfsize; - if (this.upInit < 0 || this.leftInit < 0 || this.downInit >= this.height || this.rightInit >= this.width) { - throw new NotFoundException(); - } - } - /** - *

    - * Detects a candidate barcode-like rectangular region within an image. It - * starts around the center of the image, increases the size of the candidate - * region until it finds a white rectangular region. - *

    - * - * @return {@link ResultPoint}[] describing the corners of the rectangular - * region. The first and last points are opposed on the diagonal, as - * are the second and third. The first point will be the topmost - * point and the last, the bottommost. The second point will be - * leftmost and the third, the rightmost - * @throws NotFoundException if no Data Matrix Code can be found - */ - detect() { - let left = this.leftInit; - let right = this.rightInit; - let up = this.upInit; - let down = this.downInit; - let sizeExceeded = false; - let aBlackPointFoundOnBorder = true; - let atLeastOneBlackPointFoundOnBorder = false; - let atLeastOneBlackPointFoundOnRight = false; - let atLeastOneBlackPointFoundOnBottom = false; - let atLeastOneBlackPointFoundOnLeft = false; - let atLeastOneBlackPointFoundOnTop = false; - const width = this.width; - const height = this.height; - while (aBlackPointFoundOnBorder) { - aBlackPointFoundOnBorder = false; - // ..... - // . | - // ..... - let rightBorderNotWhite = true; - while ((rightBorderNotWhite || !atLeastOneBlackPointFoundOnRight) && right < width) { - rightBorderNotWhite = this.containsBlackPoint(up, down, right, false); - if (rightBorderNotWhite) { - right++; - aBlackPointFoundOnBorder = true; - atLeastOneBlackPointFoundOnRight = true; - } - else if (!atLeastOneBlackPointFoundOnRight) { - right++; - } - } - if (right >= width) { - sizeExceeded = true; - break; - } - // ..... - // . . - // .___. - let bottomBorderNotWhite = true; - while ((bottomBorderNotWhite || !atLeastOneBlackPointFoundOnBottom) && down < height) { - bottomBorderNotWhite = this.containsBlackPoint(left, right, down, true); - if (bottomBorderNotWhite) { - down++; - aBlackPointFoundOnBorder = true; - atLeastOneBlackPointFoundOnBottom = true; - } - else if (!atLeastOneBlackPointFoundOnBottom) { - down++; - } - } - if (down >= height) { - sizeExceeded = true; - break; - } - // ..... - // | . - // ..... - let leftBorderNotWhite = true; - while ((leftBorderNotWhite || !atLeastOneBlackPointFoundOnLeft) && left >= 0) { - leftBorderNotWhite = this.containsBlackPoint(up, down, left, false); - if (leftBorderNotWhite) { - left--; - aBlackPointFoundOnBorder = true; - atLeastOneBlackPointFoundOnLeft = true; - } - else if (!atLeastOneBlackPointFoundOnLeft) { - left--; - } - } - if (left < 0) { - sizeExceeded = true; - break; - } - // .___. - // . . - // ..... - let topBorderNotWhite = true; - while ((topBorderNotWhite || !atLeastOneBlackPointFoundOnTop) && up >= 0) { - topBorderNotWhite = this.containsBlackPoint(left, right, up, true); - if (topBorderNotWhite) { - up--; - aBlackPointFoundOnBorder = true; - atLeastOneBlackPointFoundOnTop = true; - } - else if (!atLeastOneBlackPointFoundOnTop) { - up--; - } - } - if (up < 0) { - sizeExceeded = true; - break; - } - if (aBlackPointFoundOnBorder) { - atLeastOneBlackPointFoundOnBorder = true; - } - } - if (!sizeExceeded && atLeastOneBlackPointFoundOnBorder) { - const maxSize = right - left; - let z = null; - for (let i = 1; z === null && i < maxSize; i++) { - z = this.getBlackPointOnSegment(left, down - i, left + i, down); - } - if (z == null) { - throw new NotFoundException(); - } - let t = null; - // go down right - for (let i = 1; t === null && i < maxSize; i++) { - t = this.getBlackPointOnSegment(left, up + i, left + i, up); - } - if (t == null) { - throw new NotFoundException(); - } - let x = null; - // go down left - for (let i = 1; x === null && i < maxSize; i++) { - x = this.getBlackPointOnSegment(right, up + i, right - i, up); - } - if (x == null) { - throw new NotFoundException(); - } - let y = null; - // go up left - for (let i = 1; y === null && i < maxSize; i++) { - y = this.getBlackPointOnSegment(right, down - i, right - i, down); - } - if (y == null) { - throw new NotFoundException(); - } - return this.centerEdges(y, z, x, t); - } - else { - throw new NotFoundException(); - } - } - getBlackPointOnSegment(aX /*float*/, aY /*float*/, bX /*float*/, bY /*float*/) { - const dist = MathUtils.round(MathUtils.distance(aX, aY, bX, bY)); - const xStep = (bX - aX) / dist; - const yStep = (bY - aY) / dist; - const image = this.image; - for (let i = 0; i < dist; i++) { - const x = MathUtils.round(aX + i * xStep); - const y = MathUtils.round(aY + i * yStep); - if (image.get(x, y)) { - return new ResultPoint(x, y); - } - } - return null; - } - /** - * recenters the points of a constant distance towards the center - * - * @param y bottom most point - * @param z left most point - * @param x right most point - * @param t top most point - * @return {@link ResultPoint}[] describing the corners of the rectangular - * region. The first and last points are opposed on the diagonal, as - * are the second and third. The first point will be the topmost - * point and the last, the bottommost. The second point will be - * leftmost and the third, the rightmost - */ - centerEdges(y, z, x, t) { - // - // t t - // z x - // x OR z - // y y - // - const yi = y.getX(); - const yj = y.getY(); - const zi = z.getX(); - const zj = z.getY(); - const xi = x.getX(); - const xj = x.getY(); - const ti = t.getX(); - const tj = t.getY(); - const CORR = WhiteRectangleDetector.CORR; - if (yi < this.width / 2.0) { - return [ - new ResultPoint(ti - CORR, tj + CORR), - new ResultPoint(zi + CORR, zj + CORR), - new ResultPoint(xi - CORR, xj - CORR), - new ResultPoint(yi + CORR, yj - CORR) - ]; - } - else { - return [ - new ResultPoint(ti + CORR, tj + CORR), - new ResultPoint(zi + CORR, zj - CORR), - new ResultPoint(xi - CORR, xj + CORR), - new ResultPoint(yi - CORR, yj - CORR) - ]; - } - } - /** - * Determines whether a segment contains a black point - * - * @param a min value of the scanned coordinate - * @param b max value of the scanned coordinate - * @param fixed value of fixed coordinate - * @param horizontal set to true if scan must be horizontal, false if vertical - * @return true if a black point has been found, else false. - */ - containsBlackPoint(a /*int*/, b /*int*/, fixed /*int*/, horizontal) { - const image = this.image; - if (horizontal) { - for (let x = a; x <= b; x++) { - if (image.get(x, fixed)) { - return true; - } - } - } - else { - for (let y = a; y <= b; y++) { - if (image.get(fixed, y)) { - return true; - } - } - } - return false; - } - } - WhiteRectangleDetector.INIT_SIZE = 10; - WhiteRectangleDetector.CORR = 1; - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * Implementations of this class can, given locations of finder patterns for a QR code in an - * image, sample the right points in the image to reconstruct the QR code, accounting for - * perspective distortion. It is abstracted since it is relatively expensive and should be allowed - * to take advantage of platform-specific optimized implementations, like Sun's Java Advanced - * Imaging library, but which may not be available in other environments such as J2ME, and vice - * versa. - * - * The implementation used can be controlled by calling {@link #setGridSampler(GridSampler)} - * with an instance of a class which implements this interface. - * - * @author Sean Owen - */ - class GridSampler { - /** - *

    Checks a set of points that have been transformed to sample points on an image against - * the image's dimensions to see if the point are even within the image.

    - * - *

    This method will actually "nudge" the endpoints back onto the image if they are found to be - * barely (less than 1 pixel) off the image. This accounts for imperfect detection of finder - * patterns in an image where the QR Code runs all the way to the image border.

    - * - *

    For efficiency, the method will check points from either end of the line until one is found - * to be within the image. Because the set of points are assumed to be linear, this is valid.

    - * - * @param image image into which the points should map - * @param points actual points in x1,y1,...,xn,yn form - * @throws NotFoundException if an endpoint is lies outside the image boundaries - */ - static checkAndNudgePoints(image, points) { - const width = image.getWidth(); - const height = image.getHeight(); - // Check and nudge points from start until we see some that are OK: - let nudged = true; - for (let offset = 0; offset < points.length && nudged; offset += 2) { - const x = Math.floor(points[offset]); - const y = Math.floor(points[offset + 1]); - if (x < -1 || x > width || y < -1 || y > height) { - throw new NotFoundException(); - } - nudged = false; - if (x === -1) { - points[offset] = 0.0; - nudged = true; - } - else if (x === width) { - points[offset] = width - 1; - nudged = true; - } - if (y === -1) { - points[offset + 1] = 0.0; - nudged = true; - } - else if (y === height) { - points[offset + 1] = height - 1; - nudged = true; - } - } - // Check and nudge points from end: - nudged = true; - for (let offset = points.length - 2; offset >= 0 && nudged; offset -= 2) { - const x = Math.floor(points[offset]); - const y = Math.floor(points[offset + 1]); - if (x < -1 || x > width || y < -1 || y > height) { - throw new NotFoundException(); - } - nudged = false; - if (x === -1) { - points[offset] = 0.0; - nudged = true; - } - else if (x === width) { - points[offset] = width - 1; - nudged = true; - } - if (y === -1) { - points[offset + 1] = 0.0; - nudged = true; - } - else if (y === height) { - points[offset + 1] = height - 1; - nudged = true; - } - } - } - } - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /*namespace com.google.zxing.common {*/ - /** - *

    This class implements a perspective transform in two dimensions. Given four source and four - * destination points, it will compute the transformation implied between them. The code is based - * directly upon section 3.4.2 of George Wolberg's "Digital Image Warping"; see pages 54-56.

    - * - * @author Sean Owen - */ - class PerspectiveTransform { - constructor(a11 /*float*/, a21 /*float*/, a31 /*float*/, a12 /*float*/, a22 /*float*/, a32 /*float*/, a13 /*float*/, a23 /*float*/, a33 /*float*/) { - this.a11 = a11; - this.a21 = a21; - this.a31 = a31; - this.a12 = a12; - this.a22 = a22; - this.a32 = a32; - this.a13 = a13; - this.a23 = a23; - this.a33 = a33; - } - static quadrilateralToQuadrilateral(x0 /*float*/, y0 /*float*/, x1 /*float*/, y1 /*float*/, x2 /*float*/, y2 /*float*/, x3 /*float*/, y3 /*float*/, x0p /*float*/, y0p /*float*/, x1p /*float*/, y1p /*float*/, x2p /*float*/, y2p /*float*/, x3p /*float*/, y3p /*float*/) { - const qToS = PerspectiveTransform.quadrilateralToSquare(x0, y0, x1, y1, x2, y2, x3, y3); - const sToQ = PerspectiveTransform.squareToQuadrilateral(x0p, y0p, x1p, y1p, x2p, y2p, x3p, y3p); - return sToQ.times(qToS); - } - transformPoints(points) { - const max = points.length; - const a11 = this.a11; - const a12 = this.a12; - const a13 = this.a13; - const a21 = this.a21; - const a22 = this.a22; - const a23 = this.a23; - const a31 = this.a31; - const a32 = this.a32; - const a33 = this.a33; - for (let i = 0; i < max; i += 2) { - const x = points[i]; - const y = points[i + 1]; - const denominator = a13 * x + a23 * y + a33; - points[i] = (a11 * x + a21 * y + a31) / denominator; - points[i + 1] = (a12 * x + a22 * y + a32) / denominator; - } - } - transformPointsWithValues(xValues, yValues) { - const a11 = this.a11; - const a12 = this.a12; - const a13 = this.a13; - const a21 = this.a21; - const a22 = this.a22; - const a23 = this.a23; - const a31 = this.a31; - const a32 = this.a32; - const a33 = this.a33; - const n = xValues.length; - for (let i = 0; i < n; i++) { - const x = xValues[i]; - const y = yValues[i]; - const denominator = a13 * x + a23 * y + a33; - xValues[i] = (a11 * x + a21 * y + a31) / denominator; - yValues[i] = (a12 * x + a22 * y + a32) / denominator; - } - } - static squareToQuadrilateral(x0 /*float*/, y0 /*float*/, x1 /*float*/, y1 /*float*/, x2 /*float*/, y2 /*float*/, x3 /*float*/, y3 /*float*/) { - const dx3 = x0 - x1 + x2 - x3; - const dy3 = y0 - y1 + y2 - y3; - if (dx3 === 0.0 && dy3 === 0.0) { - // Affine - return new PerspectiveTransform(x1 - x0, x2 - x1, x0, y1 - y0, y2 - y1, y0, 0.0, 0.0, 1.0); - } - else { - const dx1 = x1 - x2; - const dx2 = x3 - x2; - const dy1 = y1 - y2; - const dy2 = y3 - y2; - const denominator = dx1 * dy2 - dx2 * dy1; - const a13 = (dx3 * dy2 - dx2 * dy3) / denominator; - const a23 = (dx1 * dy3 - dx3 * dy1) / denominator; - return new PerspectiveTransform(x1 - x0 + a13 * x1, x3 - x0 + a23 * x3, x0, y1 - y0 + a13 * y1, y3 - y0 + a23 * y3, y0, a13, a23, 1.0); - } - } - static quadrilateralToSquare(x0 /*float*/, y0 /*float*/, x1 /*float*/, y1 /*float*/, x2 /*float*/, y2 /*float*/, x3 /*float*/, y3 /*float*/) { - // Here, the adjoint serves as the inverse: - return PerspectiveTransform.squareToQuadrilateral(x0, y0, x1, y1, x2, y2, x3, y3).buildAdjoint(); - } - buildAdjoint() { - // Adjoint is the transpose of the cofactor matrix: - return new PerspectiveTransform(this.a22 * this.a33 - this.a23 * this.a32, this.a23 * this.a31 - this.a21 * this.a33, this.a21 * this.a32 - this.a22 * this.a31, this.a13 * this.a32 - this.a12 * this.a33, this.a11 * this.a33 - this.a13 * this.a31, this.a12 * this.a31 - this.a11 * this.a32, this.a12 * this.a23 - this.a13 * this.a22, this.a13 * this.a21 - this.a11 * this.a23, this.a11 * this.a22 - this.a12 * this.a21); - } - times(other) { - return new PerspectiveTransform(this.a11 * other.a11 + this.a21 * other.a12 + this.a31 * other.a13, this.a11 * other.a21 + this.a21 * other.a22 + this.a31 * other.a23, this.a11 * other.a31 + this.a21 * other.a32 + this.a31 * other.a33, this.a12 * other.a11 + this.a22 * other.a12 + this.a32 * other.a13, this.a12 * other.a21 + this.a22 * other.a22 + this.a32 * other.a23, this.a12 * other.a31 + this.a22 * other.a32 + this.a32 * other.a33, this.a13 * other.a11 + this.a23 * other.a12 + this.a33 * other.a13, this.a13 * other.a21 + this.a23 * other.a22 + this.a33 * other.a23, this.a13 * other.a31 + this.a23 * other.a32 + this.a33 * other.a33); - } - } - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * @author Sean Owen - */ - class DefaultGridSampler extends GridSampler { - /*@Override*/ - sampleGrid(image, dimensionX /*int*/, dimensionY /*int*/, p1ToX /*float*/, p1ToY /*float*/, p2ToX /*float*/, p2ToY /*float*/, p3ToX /*float*/, p3ToY /*float*/, p4ToX /*float*/, p4ToY /*float*/, p1FromX /*float*/, p1FromY /*float*/, p2FromX /*float*/, p2FromY /*float*/, p3FromX /*float*/, p3FromY /*float*/, p4FromX /*float*/, p4FromY /*float*/) { - const transform = PerspectiveTransform.quadrilateralToQuadrilateral(p1ToX, p1ToY, p2ToX, p2ToY, p3ToX, p3ToY, p4ToX, p4ToY, p1FromX, p1FromY, p2FromX, p2FromY, p3FromX, p3FromY, p4FromX, p4FromY); - return this.sampleGridWithTransform(image, dimensionX, dimensionY, transform); - } - /*@Override*/ - sampleGridWithTransform(image, dimensionX /*int*/, dimensionY /*int*/, transform) { - if (dimensionX <= 0 || dimensionY <= 0) { - throw new NotFoundException(); - } - const bits = new BitMatrix(dimensionX, dimensionY); - const points = new Float32Array(2 * dimensionX); - for (let y = 0; y < dimensionY; y++) { - const max = points.length; - const iValue = y + 0.5; - for (let x = 0; x < max; x += 2) { - points[x] = (x / 2) + 0.5; - points[x + 1] = iValue; - } - transform.transformPoints(points); - // Quick check to see if points transformed to something inside the image - // sufficient to check the endpoints - GridSampler.checkAndNudgePoints(image, points); - try { - for (let x = 0; x < max; x += 2) { - if (image.get(Math.floor(points[x]), Math.floor(points[x + 1]))) { - // Black(-ish) pixel - bits.set(x / 2, y); - } - } - } - catch (aioobe /*: ArrayIndexOutOfBoundsException*/) { - // This feels wrong, but, sometimes if the finder patterns are misidentified, the resulting - // transform gets "twisted" such that it maps a straight line of points to a set of points - // whose endpoints are in bounds, but others are not. There is probably some mathematical - // way to detect this about the transformation that I don't know yet. - // This results in an ugly runtime exception despite our clever checks above -- can't have - // that. We could check each point's coordinates but that feels duplicative. We settle for - // catching and wrapping ArrayIndexOutOfBoundsException. - throw new NotFoundException(); - } - } - return bits; - } - } - - class GridSamplerInstance { - /** - * Sets the implementation of GridSampler used by the library. One global - * instance is stored, which may sound problematic. But, the implementation provided - * ought to be appropriate for the entire platform, and all uses of this library - * in the whole lifetime of the JVM. For instance, an Android activity can swap in - * an implementation that takes advantage of native platform libraries. - * - * @param newGridSampler The platform-specific object to install. - */ - static setGridSampler(newGridSampler) { - GridSamplerInstance.gridSampler = newGridSampler; - } - /** - * @return the current implementation of GridSampler - */ - static getInstance() { - return GridSamplerInstance.gridSampler; - } - } - GridSamplerInstance.gridSampler = new DefaultGridSampler(); - - /* - * Copyright 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - class Point { - constructor(x, y) { - this.x = x; - this.y = y; - } - toResultPoint() { - return new ResultPoint(this.getX(), this.getY()); - } - getX() { - return this.x; - } - getY() { - return this.y; - } - } - /** - * Encapsulates logic that can detect an Aztec Code in an image, even if the Aztec Code - * is rotated or skewed, or partially obscured. - * - * @author David Olivier - * @author Frank Yellin - */ - class Detector { - constructor(image) { - this.EXPECTED_CORNER_BITS = new Int32Array([ - 0xee0, - 0x1dc, - 0x83b, - 0x707, - ]); - this.image = image; - } - detect() { - return this.detectMirror(false); - } - /** - * Detects an Aztec Code in an image. - * - * @param isMirror if true, image is a mirror-image of original - * @return {@link AztecDetectorResult} encapsulating results of detecting an Aztec Code - * @throws NotFoundException if no Aztec Code can be found - */ - detectMirror(isMirror) { - // 1. Get the center of the aztec matrix - let pCenter = this.getMatrixCenter(); - // 2. Get the center points of the four diagonal points just outside the bull's eye - // [topRight, bottomRight, bottomLeft, topLeft] - let bullsEyeCorners = this.getBullsEyeCorners(pCenter); - if (isMirror) { - let temp = bullsEyeCorners[0]; - bullsEyeCorners[0] = bullsEyeCorners[2]; - bullsEyeCorners[2] = temp; - } - // 3. Get the size of the matrix and other parameters from the bull's eye - this.extractParameters(bullsEyeCorners); - // 4. Sample the grid - let bits = this.sampleGrid(this.image, bullsEyeCorners[this.shift % 4], bullsEyeCorners[(this.shift + 1) % 4], bullsEyeCorners[(this.shift + 2) % 4], bullsEyeCorners[(this.shift + 3) % 4]); - // 5. Get the corners of the matrix. - let corners = this.getMatrixCornerPoints(bullsEyeCorners); - return new AztecDetectorResult(bits, corners, this.compact, this.nbDataBlocks, this.nbLayers); - } - /** - * Extracts the number of data layers and data blocks from the layer around the bull's eye. - * - * @param bullsEyeCorners the array of bull's eye corners - * @throws NotFoundException in case of too many errors or invalid parameters - */ - extractParameters(bullsEyeCorners) { - if (!this.isValidPoint(bullsEyeCorners[0]) || !this.isValidPoint(bullsEyeCorners[1]) || - !this.isValidPoint(bullsEyeCorners[2]) || !this.isValidPoint(bullsEyeCorners[3])) { - throw new NotFoundException(); - } - let length = 2 * this.nbCenterLayers; - // Get the bits around the bull's eye - let sides = new Int32Array([ - this.sampleLine(bullsEyeCorners[0], bullsEyeCorners[1], length), - this.sampleLine(bullsEyeCorners[1], bullsEyeCorners[2], length), - this.sampleLine(bullsEyeCorners[2], bullsEyeCorners[3], length), - this.sampleLine(bullsEyeCorners[3], bullsEyeCorners[0], length) // Top - ]); - // bullsEyeCorners[shift] is the corner of the bulls'eye that has three - // orientation marks. - // sides[shift] is the row/column that goes from the corner with three - // orientation marks to the corner with two. - this.shift = this.getRotation(sides, length); - // Flatten the parameter bits into a single 28- or 40-bit long - let parameterData = 0; - for (let i = 0; i < 4; i++) { - let side = sides[(this.shift + i) % 4]; - if (this.compact) { - // Each side of the form ..XXXXXXX. where Xs are parameter data - parameterData <<= 7; - parameterData += (side >> 1) & 0x7F; - } - else { - // Each side of the form ..XXXXX.XXXXX. where Xs are parameter data - parameterData <<= 10; - parameterData += ((side >> 2) & (0x1f << 5)) + ((side >> 1) & 0x1F); - } - } - // Corrects parameter data using RS. Returns just the data portion - // without the error correction. - let correctedData = this.getCorrectedParameterData(parameterData, this.compact); - if (this.compact) { - // 8 bits: 2 bits layers and 6 bits data blocks - this.nbLayers = (correctedData >> 6) + 1; - this.nbDataBlocks = (correctedData & 0x3F) + 1; - } - else { - // 16 bits: 5 bits layers and 11 bits data blocks - this.nbLayers = (correctedData >> 11) + 1; - this.nbDataBlocks = (correctedData & 0x7FF) + 1; - } - } - getRotation(sides, length) { - // In a normal pattern, we expect to See - // ** .* D A - // * * - // - // . * - // .. .. C B - // - // Grab the 3 bits from each of the sides the form the locator pattern and concatenate - // into a 12-bit integer. Start with the bit at A - let cornerBits = 0; - sides.forEach((side, idx, arr) => { - // XX......X where X's are orientation marks - let t = ((side >> (length - 2)) << 1) + (side & 1); - cornerBits = (cornerBits << 3) + t; - }); - // for (var side in sides) { - // // XX......X where X's are orientation marks - // var t = ((side >> (length - 2)) << 1) + (side & 1); - // cornerBits = (cornerBits << 3) + t; - // } - // Mov the bottom bit to the top, so that the three bits of the locator pattern at A are - // together. cornerBits is now: - // 3 orientation bits at A || 3 orientation bits at B || ... || 3 orientation bits at D - cornerBits = ((cornerBits & 1) << 11) + (cornerBits >> 1); - // The result shift indicates which element of BullsEyeCorners[] goes into the top-left - // corner. Since the four rotation values have a Hamming distance of 8, we - // can easily tolerate two errors. - for (let shift = 0; shift < 4; shift++) { - if (Integer.bitCount(cornerBits ^ this.EXPECTED_CORNER_BITS[shift]) <= 2) { - return shift; - } - } - throw new NotFoundException(); - } - /** - * Corrects the parameter bits using Reed-Solomon algorithm. - * - * @param parameterData parameter bits - * @param compact true if this is a compact Aztec code - * @throws NotFoundException if the array contains too many errors - */ - getCorrectedParameterData(parameterData, compact) { - let numCodewords; - let numDataCodewords; - if (compact) { - numCodewords = 7; - numDataCodewords = 2; - } - else { - numCodewords = 10; - numDataCodewords = 4; - } - let numECCodewords = numCodewords - numDataCodewords; - let parameterWords = new Int32Array(numCodewords); - for (let i = numCodewords - 1; i >= 0; --i) { - parameterWords[i] = parameterData & 0xF; - parameterData >>= 4; - } - try { - let rsDecoder = new ReedSolomonDecoder(GenericGF.AZTEC_PARAM); - rsDecoder.decode(parameterWords, numECCodewords); - } - catch (ignored) { - throw new NotFoundException(); - } - // Toss the error correction. Just return the data as an integer - let result = 0; - for (let i = 0; i < numDataCodewords; i++) { - result = (result << 4) + parameterWords[i]; - } - return result; - } - /** - * Finds the corners of a bull-eye centered on the passed point. - * This returns the centers of the diagonal points just outside the bull's eye - * Returns [topRight, bottomRight, bottomLeft, topLeft] - * - * @param pCenter Center point - * @return The corners of the bull-eye - * @throws NotFoundException If no valid bull-eye can be found - */ - getBullsEyeCorners(pCenter) { - let pina = pCenter; - let pinb = pCenter; - let pinc = pCenter; - let pind = pCenter; - let color = true; - for (this.nbCenterLayers = 1; this.nbCenterLayers < 9; this.nbCenterLayers++) { - let pouta = this.getFirstDifferent(pina, color, 1, -1); - let poutb = this.getFirstDifferent(pinb, color, 1, 1); - let poutc = this.getFirstDifferent(pinc, color, -1, 1); - let poutd = this.getFirstDifferent(pind, color, -1, -1); - // d a - // - // c b - if (this.nbCenterLayers > 2) { - let q = (this.distancePoint(poutd, pouta) * this.nbCenterLayers) / (this.distancePoint(pind, pina) * (this.nbCenterLayers + 2)); - if (q < 0.75 || q > 1.25 || !this.isWhiteOrBlackRectangle(pouta, poutb, poutc, poutd)) { - break; - } - } - pina = pouta; - pinb = poutb; - pinc = poutc; - pind = poutd; - color = !color; - } - if (this.nbCenterLayers !== 5 && this.nbCenterLayers !== 7) { - throw new NotFoundException(); - } - this.compact = this.nbCenterLayers === 5; - // Expand the square by .5 pixel in each direction so that we're on the border - // between the white square and the black square - let pinax = new ResultPoint(pina.getX() + 0.5, pina.getY() - 0.5); - let pinbx = new ResultPoint(pinb.getX() + 0.5, pinb.getY() + 0.5); - let pincx = new ResultPoint(pinc.getX() - 0.5, pinc.getY() + 0.5); - let pindx = new ResultPoint(pind.getX() - 0.5, pind.getY() - 0.5); - // Expand the square so that its corners are the centers of the points - // just outside the bull's eye. - return this.expandSquare([pinax, pinbx, pincx, pindx], 2 * this.nbCenterLayers - 3, 2 * this.nbCenterLayers); - } - /** - * Finds a candidate center point of an Aztec code from an image - * - * @return the center point - */ - getMatrixCenter() { - let pointA; - let pointB; - let pointC; - let pointD; - // Get a white rectangle that can be the border of the matrix in center bull's eye or - try { - let cornerPoints = new WhiteRectangleDetector(this.image).detect(); - pointA = cornerPoints[0]; - pointB = cornerPoints[1]; - pointC = cornerPoints[2]; - pointD = cornerPoints[3]; - } - catch (e) { - // This exception can be in case the initial rectangle is white - // In that case, surely in the bull's eye, we try to expand the rectangle. - let cx = this.image.getWidth() / 2; - let cy = this.image.getHeight() / 2; - pointA = this.getFirstDifferent(new Point(cx + 7, cy - 7), false, 1, -1).toResultPoint(); - pointB = this.getFirstDifferent(new Point(cx + 7, cy + 7), false, 1, 1).toResultPoint(); - pointC = this.getFirstDifferent(new Point(cx - 7, cy + 7), false, -1, 1).toResultPoint(); - pointD = this.getFirstDifferent(new Point(cx - 7, cy - 7), false, -1, -1).toResultPoint(); - } - // Compute the center of the rectangle - let cx = MathUtils.round((pointA.getX() + pointD.getX() + pointB.getX() + pointC.getX()) / 4.0); - let cy = MathUtils.round((pointA.getY() + pointD.getY() + pointB.getY() + pointC.getY()) / 4.0); - // Redetermine the white rectangle starting from previously computed center. - // This will ensure that we end up with a white rectangle in center bull's eye - // in order to compute a more accurate center. - try { - let cornerPoints = new WhiteRectangleDetector(this.image, 15, cx, cy).detect(); - pointA = cornerPoints[0]; - pointB = cornerPoints[1]; - pointC = cornerPoints[2]; - pointD = cornerPoints[3]; - } - catch (e) { - // This exception can be in case the initial rectangle is white - // In that case we try to expand the rectangle. - pointA = this.getFirstDifferent(new Point(cx + 7, cy - 7), false, 1, -1).toResultPoint(); - pointB = this.getFirstDifferent(new Point(cx + 7, cy + 7), false, 1, 1).toResultPoint(); - pointC = this.getFirstDifferent(new Point(cx - 7, cy + 7), false, -1, 1).toResultPoint(); - pointD = this.getFirstDifferent(new Point(cx - 7, cy - 7), false, -1, -1).toResultPoint(); - } - // Recompute the center of the rectangle - cx = MathUtils.round((pointA.getX() + pointD.getX() + pointB.getX() + pointC.getX()) / 4.0); - cy = MathUtils.round((pointA.getY() + pointD.getY() + pointB.getY() + pointC.getY()) / 4.0); - return new Point(cx, cy); - } - /** - * Gets the Aztec code corners from the bull's eye corners and the parameters. - * - * @param bullsEyeCorners the array of bull's eye corners - * @return the array of aztec code corners - */ - getMatrixCornerPoints(bullsEyeCorners) { - return this.expandSquare(bullsEyeCorners, 2 * this.nbCenterLayers, this.getDimension()); - } - /** - * Creates a BitMatrix by sampling the provided image. - * topLeft, topRight, bottomRight, and bottomLeft are the centers of the squares on the - * diagonal just outside the bull's eye. - */ - sampleGrid(image, topLeft, topRight, bottomRight, bottomLeft) { - let sampler = GridSamplerInstance.getInstance(); - let dimension = this.getDimension(); - let low = dimension / 2 - this.nbCenterLayers; - let high = dimension / 2 + this.nbCenterLayers; - return sampler.sampleGrid(image, dimension, dimension, low, low, // topleft - high, low, // topright - high, high, // bottomright - low, high, // bottomleft - topLeft.getX(), topLeft.getY(), topRight.getX(), topRight.getY(), bottomRight.getX(), bottomRight.getY(), bottomLeft.getX(), bottomLeft.getY()); - } - /** - * Samples a line. - * - * @param p1 start point (inclusive) - * @param p2 end point (exclusive) - * @param size number of bits - * @return the array of bits as an int (first bit is high-order bit of result) - */ - sampleLine(p1, p2, size) { - let result = 0; - let d = this.distanceResultPoint(p1, p2); - let moduleSize = d / size; - let px = p1.getX(); - let py = p1.getY(); - let dx = moduleSize * (p2.getX() - p1.getX()) / d; - let dy = moduleSize * (p2.getY() - p1.getY()) / d; - for (let i = 0; i < size; i++) { - if (this.image.get(MathUtils.round(px + i * dx), MathUtils.round(py + i * dy))) { - result |= 1 << (size - i - 1); - } - } - return result; - } - /** - * @return true if the border of the rectangle passed in parameter is compound of white points only - * or black points only - */ - isWhiteOrBlackRectangle(p1, p2, p3, p4) { - let corr = 3; - p1 = new Point(p1.getX() - corr, p1.getY() + corr); - p2 = new Point(p2.getX() - corr, p2.getY() - corr); - p3 = new Point(p3.getX() + corr, p3.getY() - corr); - p4 = new Point(p4.getX() + corr, p4.getY() + corr); - let cInit = this.getColor(p4, p1); - if (cInit === 0) { - return false; - } - let c = this.getColor(p1, p2); - if (c !== cInit) { - return false; - } - c = this.getColor(p2, p3); - if (c !== cInit) { - return false; - } - c = this.getColor(p3, p4); - return c === cInit; - } - /** - * Gets the color of a segment - * - * @return 1 if segment more than 90% black, -1 if segment is more than 90% white, 0 else - */ - getColor(p1, p2) { - let d = this.distancePoint(p1, p2); - let dx = (p2.getX() - p1.getX()) / d; - let dy = (p2.getY() - p1.getY()) / d; - let error = 0; - let px = p1.getX(); - let py = p1.getY(); - let colorModel = this.image.get(p1.getX(), p1.getY()); - let iMax = Math.ceil(d); - for (let i = 0; i < iMax; i++) { - px += dx; - py += dy; - if (this.image.get(MathUtils.round(px), MathUtils.round(py)) !== colorModel) { - error++; - } - } - let errRatio = error / d; - if (errRatio > 0.1 && errRatio < 0.9) { - return 0; - } - return (errRatio <= 0.1) === colorModel ? 1 : -1; - } - /** - * Gets the coordinate of the first point with a different color in the given direction - */ - getFirstDifferent(init, color, dx, dy) { - let x = init.getX() + dx; - let y = init.getY() + dy; - while (this.isValid(x, y) && this.image.get(x, y) === color) { - x += dx; - y += dy; - } - x -= dx; - y -= dy; - while (this.isValid(x, y) && this.image.get(x, y) === color) { - x += dx; - } - x -= dx; - while (this.isValid(x, y) && this.image.get(x, y) === color) { - y += dy; - } - y -= dy; - return new Point(x, y); - } - /** - * Expand the square represented by the corner points by pushing out equally in all directions - * - * @param cornerPoints the corners of the square, which has the bull's eye at its center - * @param oldSide the original length of the side of the square in the target bit matrix - * @param newSide the new length of the size of the square in the target bit matrix - * @return the corners of the expanded square - */ - expandSquare(cornerPoints, oldSide, newSide) { - let ratio = newSide / (2.0 * oldSide); - let dx = cornerPoints[0].getX() - cornerPoints[2].getX(); - let dy = cornerPoints[0].getY() - cornerPoints[2].getY(); - let centerx = (cornerPoints[0].getX() + cornerPoints[2].getX()) / 2.0; - let centery = (cornerPoints[0].getY() + cornerPoints[2].getY()) / 2.0; - let result0 = new ResultPoint(centerx + ratio * dx, centery + ratio * dy); - let result2 = new ResultPoint(centerx - ratio * dx, centery - ratio * dy); - dx = cornerPoints[1].getX() - cornerPoints[3].getX(); - dy = cornerPoints[1].getY() - cornerPoints[3].getY(); - centerx = (cornerPoints[1].getX() + cornerPoints[3].getX()) / 2.0; - centery = (cornerPoints[1].getY() + cornerPoints[3].getY()) / 2.0; - let result1 = new ResultPoint(centerx + ratio * dx, centery + ratio * dy); - let result3 = new ResultPoint(centerx - ratio * dx, centery - ratio * dy); - let results = [result0, result1, result2, result3]; - return results; - } - isValid(x, y) { - return x >= 0 && x < this.image.getWidth() && y > 0 && y < this.image.getHeight(); - } - isValidPoint(point) { - let x = MathUtils.round(point.getX()); - let y = MathUtils.round(point.getY()); - return this.isValid(x, y); - } - distancePoint(a, b) { - return MathUtils.distance(a.getX(), a.getY(), b.getX(), b.getY()); - } - distanceResultPoint(a, b) { - return MathUtils.distance(a.getX(), a.getY(), b.getX(), b.getY()); - } - getDimension() { - if (this.compact) { - return 4 * this.nbLayers + 11; - } - if (this.nbLayers <= 4) { - return 4 * this.nbLayers + 15; - } - return 4 * this.nbLayers + 2 * (Integer.truncDivision((this.nbLayers - 4), 8) + 1) + 15; - } - } - - /* - * Copyright 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - // import java.util.List; - // import java.util.Map; - /** - * This implementation can detect and decode Aztec codes in an image. - * - * @author David Olivier - */ - class AztecReader { - /** - * Locates and decodes a Data Matrix code in an image. - * - * @return a String representing the content encoded by the Data Matrix code - * @throws NotFoundException if a Data Matrix code cannot be found - * @throws FormatException if a Data Matrix code cannot be decoded - */ - decode(image, hints = null) { - let exception = null; - let detector = new Detector(image.getBlackMatrix()); - let points = null; - let decoderResult = null; - try { - let detectorResult = detector.detectMirror(false); - points = detectorResult.getPoints(); - this.reportFoundResultPoints(hints, points); - decoderResult = new Decoder().decode(detectorResult); - } - catch (e) { - exception = e; - } - if (decoderResult == null) { - try { - let detectorResult = detector.detectMirror(true); - points = detectorResult.getPoints(); - this.reportFoundResultPoints(hints, points); - decoderResult = new Decoder().decode(detectorResult); - } - catch (e) { - if (exception != null) { - throw exception; - } - throw e; - } - } - let result = new Result(decoderResult.getText(), decoderResult.getRawBytes(), decoderResult.getNumBits(), points, BarcodeFormat$1.AZTEC, System.currentTimeMillis()); - let byteSegments = decoderResult.getByteSegments(); - if (byteSegments != null) { - result.putMetadata(ResultMetadataType$1.BYTE_SEGMENTS, byteSegments); - } - let ecLevel = decoderResult.getECLevel(); - if (ecLevel != null) { - result.putMetadata(ResultMetadataType$1.ERROR_CORRECTION_LEVEL, ecLevel); - } - return result; - } - reportFoundResultPoints(hints, points) { - if (hints != null) { - let rpcb = hints.get(DecodeHintType$1.NEED_RESULT_POINT_CALLBACK); - if (rpcb != null) { - points.forEach((point, idx, arr) => { - rpcb.foundPossibleResultPoint(point); - }); - } - } - } - // @Override - reset() { - // do nothing - } - } - - /** - * Aztec Code reader to use from browser. - * - * @class BrowserAztecCodeReader - * @extends {BrowserCodeReader} - */ - class BrowserAztecCodeReader extends BrowserCodeReader { - /** - * Creates an instance of BrowserAztecCodeReader. - * @param {number} [timeBetweenScansMillis=500] the time delay between subsequent decode tries - * - * @memberOf BrowserAztecCodeReader - */ - constructor(timeBetweenScansMillis = 500) { - super(new AztecReader(), timeBetweenScansMillis); - } - } - - /** - * Encapsulates functionality and implementation that is common to all families - * of one-dimensional barcodes. - * - * @author dswitkin@google.com (Daniel Switkin) - * @author Sean Owen - */ - class OneDReader { - /* - @Override - public Result decode(BinaryBitmap image) throws NotFoundException, FormatException { - return decode(image, null); - } - */ - // Note that we don't try rotation without the try harder flag, even if rotation was supported. - // @Override - decode(image, hints) { - try { - return this.doDecode(image, hints); - } - catch (nfe) { - const tryHarder = hints && (hints.get(DecodeHintType$1.TRY_HARDER) === true); - if (tryHarder && image.isRotateSupported()) { - const rotatedImage = image.rotateCounterClockwise(); - const result = this.doDecode(rotatedImage, hints); - // Record that we found it rotated 90 degrees CCW / 270 degrees CW - const metadata = result.getResultMetadata(); - let orientation = 270; - if (metadata !== null && (metadata.get(ResultMetadataType$1.ORIENTATION) === true)) { - // But if we found it reversed in doDecode(), add in that result here: - orientation = (orientation + metadata.get(ResultMetadataType$1.ORIENTATION) % 360); - } - result.putMetadata(ResultMetadataType$1.ORIENTATION, orientation); - // Update result points - const points = result.getResultPoints(); - if (points !== null) { - const height = rotatedImage.getHeight(); - for (let i = 0; i < points.length; i++) { - points[i] = new ResultPoint(height - points[i].getY() - 1, points[i].getX()); - } - } - return result; - } - else { - throw new NotFoundException(); - } - } - } - // @Override - reset() { - // do nothing - } - /** - * We're going to examine rows from the middle outward, searching alternately above and below the - * middle, and farther out each time. rowStep is the number of rows between each successive - * attempt above and below the middle. So we'd scan row middle, then middle - rowStep, then - * middle + rowStep, then middle - (2 * rowStep), etc. - * rowStep is bigger as the image is taller, but is always at least 1. We've somewhat arbitrarily - * decided that moving up and down by about 1/16 of the image is pretty good; we try more of the - * image if "trying harder". - * - * @param image The image to decode - * @param hints Any hints that were requested - * @return The contents of the decoded barcode - * @throws NotFoundException Any spontaneous errors which occur - */ - doDecode(image, hints) { - const width = image.getWidth(); - const height = image.getHeight(); - let row = new BitArray(width); - const tryHarder = hints && (hints.get(DecodeHintType$1.TRY_HARDER) === true); - const rowStep = Math.max(1, height >> (tryHarder ? 8 : 5)); - let maxLines; - if (tryHarder) { - maxLines = height; // Look at the whole image, not just the center - } - else { - maxLines = 15; // 15 rows spaced 1/32 apart is roughly the middle half of the image - } - const middle = Math.trunc(height / 2); - for (let x = 0; x < maxLines; x++) { - // Scanning from the middle out. Determine which row we're looking at next: - const rowStepsAboveOrBelow = Math.trunc((x + 1) / 2); - const isAbove = (x & 0x01) === 0; // i.e. is x even? - const rowNumber = middle + rowStep * (isAbove ? rowStepsAboveOrBelow : -rowStepsAboveOrBelow); - if (rowNumber < 0 || rowNumber >= height) { - // Oops, if we run off the top or bottom, stop - break; - } - // Estimate black point for this row and load it: - try { - row = image.getBlackRow(rowNumber, row); - } - catch (ignored) { - continue; - } - // While we have the image data in a BitArray, it's fairly cheap to reverse it in place to - // handle decoding upside down barcodes. - for (let attempt = 0; attempt < 2; attempt++) { - if (attempt === 1) { // trying again? - row.reverse(); // reverse the row and continue - // This means we will only ever draw result points *once* in the life of this method - // since we want to avoid drawing the wrong points after flipping the row, and, - // don't want to clutter with noise from every single row scan -- just the scans - // that start on the center line. - if (hints && (hints.get(DecodeHintType$1.NEED_RESULT_POINT_CALLBACK) === true)) { - const newHints = new Map(); - hints.forEach((hint, key) => newHints.set(key, hint)); - newHints.delete(DecodeHintType$1.NEED_RESULT_POINT_CALLBACK); - hints = newHints; - } - } - try { - // Look for a barcode - const result = this.decodeRow(rowNumber, row, hints); - // We found our barcode - if (attempt === 1) { - // But it was upside down, so note that - result.putMetadata(ResultMetadataType$1.ORIENTATION, 180); - // And remember to flip the result points horizontally. - const points = result.getResultPoints(); - if (points !== null) { - points[0] = new ResultPoint(width - points[0].getX() - 1, points[0].getY()); - points[1] = new ResultPoint(width - points[1].getX() - 1, points[1].getY()); - } - } - return result; - } - catch (re) { - // continue -- just couldn't decode this row - } - } - } - throw new NotFoundException(); - } - /** - * Records the size of successive runs of white and black pixels in a row, starting at a given point. - * The values are recorded in the given array, and the number of runs recorded is equal to the size - * of the array. If the row starts on a white pixel at the given start point, then the first count - * recorded is the run of white pixels starting from that point; likewise it is the count of a run - * of black pixels if the row begin on a black pixels at that point. - * - * @param row row to count from - * @param start offset into row to start at - * @param counters array into which to record counts - * @throws NotFoundException if counters cannot be filled entirely from row before running out - * of pixels - */ - static recordPattern(row, start, counters) { - const numCounters = counters.length; - for (let index = 0; index < numCounters; index++) - counters[index] = 0; - const end = row.getSize(); - if (start >= end) { - throw new NotFoundException(); - } - let isWhite = !row.get(start); - let counterPosition = 0; - let i = start; - while (i < end) { - if (row.get(i) !== isWhite) { - counters[counterPosition]++; - } - else { - if (++counterPosition === numCounters) { - break; - } - else { - counters[counterPosition] = 1; - isWhite = !isWhite; - } - } - i++; - } - // If we read fully the last section of pixels and filled up our counters -- or filled - // the last counter but ran off the side of the image, OK. Otherwise, a problem. - if (!(counterPosition === numCounters || (counterPosition === numCounters - 1 && i === end))) { - throw new NotFoundException(); - } - } - static recordPatternInReverse(row, start, counters) { - // This could be more efficient I guess - let numTransitionsLeft = counters.length; - let last = row.get(start); - while (start > 0 && numTransitionsLeft >= 0) { - if (row.get(--start) !== last) { - numTransitionsLeft--; - last = !last; - } - } - if (numTransitionsLeft >= 0) { - throw new NotFoundException(); - } - OneDReader.recordPattern(row, start + 1, counters); - } - /** - * Determines how closely a set of observed counts of runs of black/white values matches a given - * target pattern. This is reported as the ratio of the total variance from the expected pattern - * proportions across all pattern elements, to the length of the pattern. - * - * @param counters observed counters - * @param pattern expected pattern - * @param maxIndividualVariance The most any counter can differ before we give up - * @return ratio of total variance between counters and pattern compared to total pattern size - */ - static patternMatchVariance(counters, pattern, maxIndividualVariance) { - const numCounters = counters.length; - let total = 0; - let patternLength = 0; - for (let i = 0; i < numCounters; i++) { - total += counters[i]; - patternLength += pattern[i]; - } - if (total < patternLength) { - // If we don't even have one pixel per unit of bar width, assume this is too small - // to reliably match, so fail: - return Number.POSITIVE_INFINITY; - } - const unitBarWidth = total / patternLength; - maxIndividualVariance *= unitBarWidth; - let totalVariance = 0.0; - for (let x = 0; x < numCounters; x++) { - const counter = counters[x]; - const scaledPattern = pattern[x] * unitBarWidth; - const variance = counter > scaledPattern ? counter - scaledPattern : scaledPattern - counter; - if (variance > maxIndividualVariance) { - return Number.POSITIVE_INFINITY; - } - totalVariance += variance; - } - return totalVariance / total; - } - } - - /** - *

    Decodes Code 128 barcodes.

    - * - * @author Sean Owen - */ - class Code128Reader extends OneDReader { - static findStartPattern(row) { - const width = row.getSize(); - const rowOffset = row.getNextSet(0); - let counterPosition = 0; - let counters = Int32Array.from([0, 0, 0, 0, 0, 0]); - let patternStart = rowOffset; - let isWhite = false; - const patternLength = 6; - for (let i = rowOffset; i < width; i++) { - if (row.get(i) !== isWhite) { - counters[counterPosition]++; - } - else { - if (counterPosition === (patternLength - 1)) { - let bestVariance = Code128Reader.MAX_AVG_VARIANCE; - let bestMatch = -1; - for (let startCode = Code128Reader.CODE_START_A; startCode <= Code128Reader.CODE_START_C; startCode++) { - const variance = OneDReader.patternMatchVariance(counters, Code128Reader.CODE_PATTERNS[startCode], Code128Reader.MAX_INDIVIDUAL_VARIANCE); - if (variance < bestVariance) { - bestVariance = variance; - bestMatch = startCode; - } - } - // Look for whitespace before start pattern, >= 50% of width of start pattern - if (bestMatch >= 0 && - row.isRange(Math.max(0, patternStart - (i - patternStart) / 2), patternStart, false)) { - return Int32Array.from([patternStart, i, bestMatch]); - } - patternStart += counters[0] + counters[1]; - counters = counters.slice(2, counters.length - 1); - counters[counterPosition - 1] = 0; - counters[counterPosition] = 0; - counterPosition--; - } - else { - counterPosition++; - } - counters[counterPosition] = 1; - isWhite = !isWhite; - } - } - throw new NotFoundException(); - } - static decodeCode(row, counters, rowOffset) { - OneDReader.recordPattern(row, rowOffset, counters); - let bestVariance = Code128Reader.MAX_AVG_VARIANCE; // worst variance we'll accept - let bestMatch = -1; - for (let d = 0; d < Code128Reader.CODE_PATTERNS.length; d++) { - const pattern = Code128Reader.CODE_PATTERNS[d]; - const variance = this.patternMatchVariance(counters, pattern, Code128Reader.MAX_INDIVIDUAL_VARIANCE); - if (variance < bestVariance) { - bestVariance = variance; - bestMatch = d; - } - } - // TODO We're overlooking the fact that the STOP pattern has 7 values, not 6. - if (bestMatch >= 0) { - return bestMatch; - } - else { - throw new NotFoundException(); - } - } - decodeRow(rowNumber, row, hints) { - const convertFNC1 = hints && (hints.get(DecodeHintType$1.ASSUME_GS1) === true); - const startPatternInfo = Code128Reader.findStartPattern(row); - const startCode = startPatternInfo[2]; - let currentRawCodesIndex = 0; - const rawCodes = new Uint8Array(20); - rawCodes[currentRawCodesIndex++] = startCode; - let codeSet; - switch (startCode) { - case Code128Reader.CODE_START_A: - codeSet = Code128Reader.CODE_CODE_A; - break; - case Code128Reader.CODE_START_B: - codeSet = Code128Reader.CODE_CODE_B; - break; - case Code128Reader.CODE_START_C: - codeSet = Code128Reader.CODE_CODE_C; - break; - default: - throw new FormatException(); - } - let done = false; - let isNextShifted = false; - let result = ''; - let lastStart = startPatternInfo[0]; - let nextStart = startPatternInfo[1]; - const counters = Int32Array.from([0, 0, 0, 0, 0, 0]); - let lastCode = 0; - let code = 0; - let checksumTotal = startCode; - let multiplier = 0; - let lastCharacterWasPrintable = true; - let upperMode = false; - let shiftUpperMode = false; - while (!done) { - const unshift = isNextShifted; - isNextShifted = false; - // Save off last code - lastCode = code; - // Decode another code from image - code = Code128Reader.decodeCode(row, counters, nextStart); - rawCodes[currentRawCodesIndex++] = code; - // Remember whether the last code was printable or not (excluding CODE_STOP) - if (code !== Code128Reader.CODE_STOP) { - lastCharacterWasPrintable = true; - } - // Add to checksum computation (if not CODE_STOP of course) - if (code !== Code128Reader.CODE_STOP) { - multiplier++; - checksumTotal += multiplier * code; - } - // Advance to where the next code will to start - lastStart = nextStart; - nextStart += counters.reduce((previous, current) => previous + current, 0); - // Take care of illegal start codes - switch (code) { - case Code128Reader.CODE_START_A: - case Code128Reader.CODE_START_B: - case Code128Reader.CODE_START_C: - throw new FormatException(); - } - switch (codeSet) { - case Code128Reader.CODE_CODE_A: - if (code < 64) { - if (shiftUpperMode === upperMode) { - result += String.fromCharCode((' '.charCodeAt(0) + code)); - } - else { - result += String.fromCharCode((' '.charCodeAt(0) + code + 128)); - } - shiftUpperMode = false; - } - else if (code < 96) { - if (shiftUpperMode === upperMode) { - result += String.fromCharCode((code - 64)); - } - else { - result += String.fromCharCode((code + 64)); - } - shiftUpperMode = false; - } - else { - // Don't let CODE_STOP, which always appears, affect whether whether we think the last - // code was printable or not. - if (code !== Code128Reader.CODE_STOP) { - lastCharacterWasPrintable = false; - } - switch (code) { - case Code128Reader.CODE_FNC_1: - if (convertFNC1) { - if (result.length === 0) { - // GS1 specification 5.4.3.7. and 5.4.6.4. If the first char after the start code - // is FNC1 then this is GS1-128. We add the symbology identifier. - result += ']C1'; - } - else { - // GS1 specification 5.4.7.5. Every subsequent FNC1 is returned as ASCII 29 (GS) - result += String.fromCharCode(29); - } - } - break; - case Code128Reader.CODE_FNC_2: - case Code128Reader.CODE_FNC_3: - // do nothing? - break; - case Code128Reader.CODE_FNC_4_A: - if (!upperMode && shiftUpperMode) { - upperMode = true; - shiftUpperMode = false; - } - else if (upperMode && shiftUpperMode) { - upperMode = false; - shiftUpperMode = false; - } - else { - shiftUpperMode = true; - } - break; - case Code128Reader.CODE_SHIFT: - isNextShifted = true; - codeSet = Code128Reader.CODE_CODE_B; - break; - case Code128Reader.CODE_CODE_B: - codeSet = Code128Reader.CODE_CODE_B; - break; - case Code128Reader.CODE_CODE_C: - codeSet = Code128Reader.CODE_CODE_C; - break; - case Code128Reader.CODE_STOP: - done = true; - break; - } - } - break; - case Code128Reader.CODE_CODE_B: - if (code < 96) { - if (shiftUpperMode === upperMode) { - result += String.fromCharCode((' '.charCodeAt(0) + code)); - } - else { - result += String.fromCharCode((' '.charCodeAt(0) + code + 128)); - } - shiftUpperMode = false; - } - else { - if (code !== Code128Reader.CODE_STOP) { - lastCharacterWasPrintable = false; - } - switch (code) { - case Code128Reader.CODE_FNC_1: - if (convertFNC1) { - if (result.length === 0) { - // GS1 specification 5.4.3.7. and 5.4.6.4. If the first char after the start code - // is FNC1 then this is GS1-128. We add the symbology identifier. - result += ']C1'; - } - else { - // GS1 specification 5.4.7.5. Every subsequent FNC1 is returned as ASCII 29 (GS) - result += String.fromCharCode(29); - } - } - break; - case Code128Reader.CODE_FNC_2: - case Code128Reader.CODE_FNC_3: - // do nothing? - break; - case Code128Reader.CODE_FNC_4_B: - if (!upperMode && shiftUpperMode) { - upperMode = true; - shiftUpperMode = false; - } - else if (upperMode && shiftUpperMode) { - upperMode = false; - shiftUpperMode = false; - } - else { - shiftUpperMode = true; - } - break; - case Code128Reader.CODE_SHIFT: - isNextShifted = true; - codeSet = Code128Reader.CODE_CODE_A; - break; - case Code128Reader.CODE_CODE_A: - codeSet = Code128Reader.CODE_CODE_A; - break; - case Code128Reader.CODE_CODE_C: - codeSet = Code128Reader.CODE_CODE_C; - break; - case Code128Reader.CODE_STOP: - done = true; - break; - } - } - break; - case Code128Reader.CODE_CODE_C: - if (code < 100) { - if (code < 10) { - result += '0'; - } - result += code; - } - else { - if (code !== Code128Reader.CODE_STOP) { - lastCharacterWasPrintable = false; - } - switch (code) { - case Code128Reader.CODE_FNC_1: - if (convertFNC1) { - if (result.length === 0) { - // GS1 specification 5.4.3.7. and 5.4.6.4. If the first char after the start code - // is FNC1 then this is GS1-128. We add the symbology identifier. - result += ']C1'; - } - else { - // GS1 specification 5.4.7.5. Every subsequent FNC1 is returned as ASCII 29 (GS) - result += String.fromCharCode(29); - } - } - break; - case Code128Reader.CODE_CODE_A: - codeSet = Code128Reader.CODE_CODE_A; - break; - case Code128Reader.CODE_CODE_B: - codeSet = Code128Reader.CODE_CODE_B; - break; - case Code128Reader.CODE_STOP: - done = true; - break; - } - } - break; - } - // Unshift back to another code set if we were shifted - if (unshift) { - codeSet = codeSet === Code128Reader.CODE_CODE_A ? Code128Reader.CODE_CODE_B : Code128Reader.CODE_CODE_A; - } - } - const lastPatternSize = nextStart - lastStart; - // Check for ample whitespace following pattern, but, to do this we first need to remember that - // we fudged decoding CODE_STOP since it actually has 7 bars, not 6. There is a black bar left - // to read off. Would be slightly better to properly read. Here we just skip it: - nextStart = row.getNextUnset(nextStart); - if (!row.isRange(nextStart, Math.min(row.getSize(), nextStart + (nextStart - lastStart) / 2), false)) { - throw new NotFoundException(); - } - // Pull out from sum the value of the penultimate check code - checksumTotal -= multiplier * lastCode; - // lastCode is the checksum then: - if (checksumTotal % 103 !== lastCode) { - throw new ChecksumException(); - } - // Need to pull out the check digits from string - const resultLength = result.length; - if (resultLength === 0) { - // false positive - throw new NotFoundException(); - } - // Only bother if the result had at least one character, and if the checksum digit happened to - // be a printable character. If it was just interpreted as a control code, nothing to remove. - if (resultLength > 0 && lastCharacterWasPrintable) { - if (codeSet === Code128Reader.CODE_CODE_C) { - result = result.substring(0, resultLength - 2); - } - else { - result = result.substring(0, resultLength - 1); - } - } - const left = (startPatternInfo[1] + startPatternInfo[0]) / 2.0; - const right = lastStart + lastPatternSize / 2.0; - const rawCodesSize = rawCodes.length; - const rawBytes = new Uint8Array(rawCodesSize); - for (let i = 0; i < rawCodesSize; i++) { - rawBytes[i] = rawCodes[i]; - } - const points = [new ResultPoint(left, rowNumber), new ResultPoint(right, rowNumber)]; - return new Result(result, rawBytes, 0, points, BarcodeFormat$1.CODE_128, new Date().getTime()); - } - } - Code128Reader.CODE_PATTERNS = [ - Int32Array.from([2, 1, 2, 2, 2, 2]), - Int32Array.from([2, 2, 2, 1, 2, 2]), - Int32Array.from([2, 2, 2, 2, 2, 1]), - Int32Array.from([1, 2, 1, 2, 2, 3]), - Int32Array.from([1, 2, 1, 3, 2, 2]), - Int32Array.from([1, 3, 1, 2, 2, 2]), - Int32Array.from([1, 2, 2, 2, 1, 3]), - Int32Array.from([1, 2, 2, 3, 1, 2]), - Int32Array.from([1, 3, 2, 2, 1, 2]), - Int32Array.from([2, 2, 1, 2, 1, 3]), - Int32Array.from([2, 2, 1, 3, 1, 2]), - Int32Array.from([2, 3, 1, 2, 1, 2]), - Int32Array.from([1, 1, 2, 2, 3, 2]), - Int32Array.from([1, 2, 2, 1, 3, 2]), - Int32Array.from([1, 2, 2, 2, 3, 1]), - Int32Array.from([1, 1, 3, 2, 2, 2]), - Int32Array.from([1, 2, 3, 1, 2, 2]), - Int32Array.from([1, 2, 3, 2, 2, 1]), - Int32Array.from([2, 2, 3, 2, 1, 1]), - Int32Array.from([2, 2, 1, 1, 3, 2]), - Int32Array.from([2, 2, 1, 2, 3, 1]), - Int32Array.from([2, 1, 3, 2, 1, 2]), - Int32Array.from([2, 2, 3, 1, 1, 2]), - Int32Array.from([3, 1, 2, 1, 3, 1]), - Int32Array.from([3, 1, 1, 2, 2, 2]), - Int32Array.from([3, 2, 1, 1, 2, 2]), - Int32Array.from([3, 2, 1, 2, 2, 1]), - Int32Array.from([3, 1, 2, 2, 1, 2]), - Int32Array.from([3, 2, 2, 1, 1, 2]), - Int32Array.from([3, 2, 2, 2, 1, 1]), - Int32Array.from([2, 1, 2, 1, 2, 3]), - Int32Array.from([2, 1, 2, 3, 2, 1]), - Int32Array.from([2, 3, 2, 1, 2, 1]), - Int32Array.from([1, 1, 1, 3, 2, 3]), - Int32Array.from([1, 3, 1, 1, 2, 3]), - Int32Array.from([1, 3, 1, 3, 2, 1]), - Int32Array.from([1, 1, 2, 3, 1, 3]), - Int32Array.from([1, 3, 2, 1, 1, 3]), - Int32Array.from([1, 3, 2, 3, 1, 1]), - Int32Array.from([2, 1, 1, 3, 1, 3]), - Int32Array.from([2, 3, 1, 1, 1, 3]), - Int32Array.from([2, 3, 1, 3, 1, 1]), - Int32Array.from([1, 1, 2, 1, 3, 3]), - Int32Array.from([1, 1, 2, 3, 3, 1]), - Int32Array.from([1, 3, 2, 1, 3, 1]), - Int32Array.from([1, 1, 3, 1, 2, 3]), - Int32Array.from([1, 1, 3, 3, 2, 1]), - Int32Array.from([1, 3, 3, 1, 2, 1]), - Int32Array.from([3, 1, 3, 1, 2, 1]), - Int32Array.from([2, 1, 1, 3, 3, 1]), - Int32Array.from([2, 3, 1, 1, 3, 1]), - Int32Array.from([2, 1, 3, 1, 1, 3]), - Int32Array.from([2, 1, 3, 3, 1, 1]), - Int32Array.from([2, 1, 3, 1, 3, 1]), - Int32Array.from([3, 1, 1, 1, 2, 3]), - Int32Array.from([3, 1, 1, 3, 2, 1]), - Int32Array.from([3, 3, 1, 1, 2, 1]), - Int32Array.from([3, 1, 2, 1, 1, 3]), - Int32Array.from([3, 1, 2, 3, 1, 1]), - Int32Array.from([3, 3, 2, 1, 1, 1]), - Int32Array.from([3, 1, 4, 1, 1, 1]), - Int32Array.from([2, 2, 1, 4, 1, 1]), - Int32Array.from([4, 3, 1, 1, 1, 1]), - Int32Array.from([1, 1, 1, 2, 2, 4]), - Int32Array.from([1, 1, 1, 4, 2, 2]), - Int32Array.from([1, 2, 1, 1, 2, 4]), - Int32Array.from([1, 2, 1, 4, 2, 1]), - Int32Array.from([1, 4, 1, 1, 2, 2]), - Int32Array.from([1, 4, 1, 2, 2, 1]), - Int32Array.from([1, 1, 2, 2, 1, 4]), - Int32Array.from([1, 1, 2, 4, 1, 2]), - Int32Array.from([1, 2, 2, 1, 1, 4]), - Int32Array.from([1, 2, 2, 4, 1, 1]), - Int32Array.from([1, 4, 2, 1, 1, 2]), - Int32Array.from([1, 4, 2, 2, 1, 1]), - Int32Array.from([2, 4, 1, 2, 1, 1]), - Int32Array.from([2, 2, 1, 1, 1, 4]), - Int32Array.from([4, 1, 3, 1, 1, 1]), - Int32Array.from([2, 4, 1, 1, 1, 2]), - Int32Array.from([1, 3, 4, 1, 1, 1]), - Int32Array.from([1, 1, 1, 2, 4, 2]), - Int32Array.from([1, 2, 1, 1, 4, 2]), - Int32Array.from([1, 2, 1, 2, 4, 1]), - Int32Array.from([1, 1, 4, 2, 1, 2]), - Int32Array.from([1, 2, 4, 1, 1, 2]), - Int32Array.from([1, 2, 4, 2, 1, 1]), - Int32Array.from([4, 1, 1, 2, 1, 2]), - Int32Array.from([4, 2, 1, 1, 1, 2]), - Int32Array.from([4, 2, 1, 2, 1, 1]), - Int32Array.from([2, 1, 2, 1, 4, 1]), - Int32Array.from([2, 1, 4, 1, 2, 1]), - Int32Array.from([4, 1, 2, 1, 2, 1]), - Int32Array.from([1, 1, 1, 1, 4, 3]), - Int32Array.from([1, 1, 1, 3, 4, 1]), - Int32Array.from([1, 3, 1, 1, 4, 1]), - Int32Array.from([1, 1, 4, 1, 1, 3]), - Int32Array.from([1, 1, 4, 3, 1, 1]), - Int32Array.from([4, 1, 1, 1, 1, 3]), - Int32Array.from([4, 1, 1, 3, 1, 1]), - Int32Array.from([1, 1, 3, 1, 4, 1]), - Int32Array.from([1, 1, 4, 1, 3, 1]), - Int32Array.from([3, 1, 1, 1, 4, 1]), - Int32Array.from([4, 1, 1, 1, 3, 1]), - Int32Array.from([2, 1, 1, 4, 1, 2]), - Int32Array.from([2, 1, 1, 2, 1, 4]), - Int32Array.from([2, 1, 1, 2, 3, 2]), - Int32Array.from([2, 3, 3, 1, 1, 1, 2]), - ]; - Code128Reader.MAX_AVG_VARIANCE = 0.25; - Code128Reader.MAX_INDIVIDUAL_VARIANCE = 0.7; - Code128Reader.CODE_SHIFT = 98; - Code128Reader.CODE_CODE_C = 99; - Code128Reader.CODE_CODE_B = 100; - Code128Reader.CODE_CODE_A = 101; - Code128Reader.CODE_FNC_1 = 102; - Code128Reader.CODE_FNC_2 = 97; - Code128Reader.CODE_FNC_3 = 96; - Code128Reader.CODE_FNC_4_A = 101; - Code128Reader.CODE_FNC_4_B = 100; - Code128Reader.CODE_START_A = 103; - Code128Reader.CODE_START_B = 104; - Code128Reader.CODE_START_C = 105; - Code128Reader.CODE_STOP = 106; - - /** - *

    Decodes Code 39 barcodes. Supports "Full ASCII Code 39" if USE_CODE_39_EXTENDED_MODE is set.

    - * - * @author Sean Owen - * @see Code93Reader - */ - class Code39Reader extends OneDReader { - /** - * Creates a reader that assumes all encoded data is data, and does not treat the final - * character as a check digit. It will not decoded "extended Code 39" sequences. - */ - // public Code39Reader() { - // this(false); - // } - /** - * Creates a reader that can be configured to check the last character as a check digit. - * It will not decoded "extended Code 39" sequences. - * - * @param usingCheckDigit if true, treat the last data character as a check digit, not - * data, and verify that the checksum passes. - */ - // public Code39Reader(boolean usingCheckDigit) { - // this(usingCheckDigit, false); - // } - /** - * Creates a reader that can be configured to check the last character as a check digit, - * or optionally attempt to decode "extended Code 39" sequences that are used to encode - * the full ASCII character set. - * - * @param usingCheckDigit if true, treat the last data character as a check digit, not - * data, and verify that the checksum passes. - * @param extendedMode if true, will attempt to decode extended Code 39 sequences in the - * text. - */ - constructor(usingCheckDigit = false, extendedMode = false) { - super(); - this.usingCheckDigit = usingCheckDigit; - this.extendedMode = extendedMode; - this.decodeRowResult = ''; - this.counters = new Int32Array(9); - } - decodeRow(rowNumber, row, hints) { - let theCounters = this.counters; - theCounters.fill(0); - this.decodeRowResult = ''; - let start = Code39Reader.findAsteriskPattern(row, theCounters); - // Read off white space - let nextStart = row.getNextSet(start[1]); - let end = row.getSize(); - let decodedChar; - let lastStart; - do { - Code39Reader.recordPattern(row, nextStart, theCounters); - let pattern = Code39Reader.toNarrowWidePattern(theCounters); - if (pattern < 0) { - throw new NotFoundException(); - } - decodedChar = Code39Reader.patternToChar(pattern); - this.decodeRowResult += decodedChar; - lastStart = nextStart; - for (let counter of theCounters) { - nextStart += counter; - } - // Read off white space - nextStart = row.getNextSet(nextStart); - } while (decodedChar !== '*'); - this.decodeRowResult = this.decodeRowResult.substring(0, this.decodeRowResult.length - 1); // remove asterisk - // Look for whitespace after pattern: - let lastPatternSize = 0; - for (let counter of theCounters) { - lastPatternSize += counter; - } - let whiteSpaceAfterEnd = nextStart - lastStart - lastPatternSize; - // If 50% of last pattern size, following last pattern, is not whitespace, fail - // (but if it's whitespace to the very end of the image, that's OK) - if (nextStart !== end && (whiteSpaceAfterEnd * 2) < lastPatternSize) { - throw new NotFoundException(); - } - if (this.usingCheckDigit) { - let max = this.decodeRowResult.length - 1; - let total = 0; - for (let i = 0; i < max; i++) { - total += Code39Reader.ALPHABET_STRING.indexOf(this.decodeRowResult.charAt(i)); - } - if (this.decodeRowResult.charAt(max) !== Code39Reader.ALPHABET_STRING.charAt(total % 43)) { - throw new ChecksumException(); - } - this.decodeRowResult = this.decodeRowResult.substring(0, max); - } - if (this.decodeRowResult.length === 0) { - // false positive - throw new NotFoundException(); - } - let resultString; - if (this.extendedMode) { - resultString = Code39Reader.decodeExtended(this.decodeRowResult); - } - else { - resultString = this.decodeRowResult; - } - let left = (start[1] + start[0]) / 2.0; - let right = lastStart + lastPatternSize / 2.0; - return new Result(resultString, null, 0, [new ResultPoint(left, rowNumber), new ResultPoint(right, rowNumber)], BarcodeFormat$1.CODE_39, new Date().getTime()); - } - static findAsteriskPattern(row, counters) { - let width = row.getSize(); - let rowOffset = row.getNextSet(0); - let counterPosition = 0; - let patternStart = rowOffset; - let isWhite = false; - let patternLength = counters.length; - for (let i = rowOffset; i < width; i++) { - if (row.get(i) !== isWhite) { - counters[counterPosition]++; - } - else { - if (counterPosition === patternLength - 1) { - // Look for whitespace before start pattern, >= 50% of width of start pattern - if (this.toNarrowWidePattern(counters) === Code39Reader.ASTERISK_ENCODING && - row.isRange(Math.max(0, patternStart - Math.floor((i - patternStart) / 2)), patternStart, false)) { - return [patternStart, i]; - } - patternStart += counters[0] + counters[1]; - counters.copyWithin(0, 2, 2 + counterPosition - 1); - counters[counterPosition - 1] = 0; - counters[counterPosition] = 0; - counterPosition--; - } - else { - counterPosition++; - } - counters[counterPosition] = 1; - isWhite = !isWhite; - } - } - throw new NotFoundException(); - } - // For efficiency, returns -1 on failure. Not throwing here saved as many as 700 exceptions - // per image when using some of our blackbox images. - static toNarrowWidePattern(counters) { - let numCounters = counters.length; - let maxNarrowCounter = 0; - let wideCounters; - do { - let minCounter = 0x7fffffff; - for (let counter of counters) { - if (counter < minCounter && counter > maxNarrowCounter) { - minCounter = counter; - } - } - maxNarrowCounter = minCounter; - wideCounters = 0; - let totalWideCountersWidth = 0; - let pattern = 0; - for (let i = 0; i < numCounters; i++) { - let counter = counters[i]; - if (counter > maxNarrowCounter) { - pattern |= 1 << (numCounters - 1 - i); - wideCounters++; - totalWideCountersWidth += counter; - } - } - if (wideCounters === 3) { - // Found 3 wide counters, but are they close enough in width? - // We can perform a cheap, conservative check to see if any individual - // counter is more than 1.5 times the average: - for (let i = 0; i < numCounters && wideCounters > 0; i++) { - let counter = counters[i]; - if (counter > maxNarrowCounter) { - wideCounters--; - // totalWideCountersWidth = 3 * average, so this checks if counter >= 3/2 * average - if ((counter * 2) >= totalWideCountersWidth) { - return -1; - } - } - } - return pattern; - } - } while (wideCounters > 3); - return -1; - } - static patternToChar(pattern) { - for (let i = 0; i < Code39Reader.CHARACTER_ENCODINGS.length; i++) { - if (Code39Reader.CHARACTER_ENCODINGS[i] === pattern) { - return Code39Reader.ALPHABET_STRING.charAt(i); - } - } - if (pattern === Code39Reader.ASTERISK_ENCODING) { - return '*'; - } - throw new NotFoundException(); - } - static decodeExtended(encoded) { - let length = encoded.length; - let decoded = ''; - for (let i = 0; i < length; i++) { - let c = encoded.charAt(i); - if (c === '+' || c === '$' || c === '%' || c === '/') { - let next = encoded.charAt(i + 1); - let decodedChar = '\0'; - switch (c) { - case '+': - // +A to +Z map to a to z - if (next >= 'A' && next <= 'Z') { - decodedChar = String.fromCharCode(next.charCodeAt(0) + 32); - } - else { - throw new FormatException(); - } - break; - case '$': - // $A to $Z map to control codes SH to SB - if (next >= 'A' && next <= 'Z') { - decodedChar = String.fromCharCode(next.charCodeAt(0) - 64); - } - else { - throw new FormatException(); - } - break; - case '%': - // %A to %E map to control codes ESC to US - if (next >= 'A' && next <= 'E') { - decodedChar = String.fromCharCode(next.charCodeAt(0) - 38); - } - else if (next >= 'F' && next <= 'J') { - decodedChar = String.fromCharCode(next.charCodeAt(0) - 11); - } - else if (next >= 'K' && next <= 'O') { - decodedChar = String.fromCharCode(next.charCodeAt(0) + 16); - } - else if (next >= 'P' && next <= 'T') { - decodedChar = String.fromCharCode(next.charCodeAt(0) + 43); - } - else if (next === 'U') { - decodedChar = '\0'; - } - else if (next === 'V') { - decodedChar = '@'; - } - else if (next === 'W') { - decodedChar = '`'; - } - else if (next === 'X' || next === 'Y' || next === 'Z') { - decodedChar = '\x7f'; - } - else { - throw new FormatException(); - } - break; - case '/': - // /A to /O map to ! to , and /Z maps to : - if (next >= 'A' && next <= 'O') { - decodedChar = String.fromCharCode(next.charCodeAt(0) - 32); - } - else if (next === 'Z') { - decodedChar = ':'; - } - else { - throw new FormatException(); - } - break; - } - decoded += decodedChar; - // bump up i again since we read two characters - i++; - } - else { - decoded += c; - } - } - return decoded; - } - } - Code39Reader.ALPHABET_STRING = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%'; - /** - * These represent the encodings of characters, as patterns of wide and narrow bars. - * The 9 least-significant bits of each int correspond to the pattern of wide and narrow, - * with 1s representing "wide" and 0s representing narrow. - */ - Code39Reader.CHARACTER_ENCODINGS = [ - 0x034, 0x121, 0x061, 0x160, 0x031, 0x130, 0x070, 0x025, 0x124, 0x064, - 0x109, 0x049, 0x148, 0x019, 0x118, 0x058, 0x00D, 0x10C, 0x04C, 0x01C, - 0x103, 0x043, 0x142, 0x013, 0x112, 0x052, 0x007, 0x106, 0x046, 0x016, - 0x181, 0x0C1, 0x1C0, 0x091, 0x190, 0x0D0, 0x085, 0x184, 0x0C4, 0x0A8, - 0x0A2, 0x08A, 0x02A // /-% - ]; - Code39Reader.ASTERISK_ENCODING = 0x094; - - /** - *

    Decodes ITF barcodes.

    - * - * @author Tjieco - */ - class ITFReader extends OneDReader { - constructor() { - // private static W = 3; // Pixel width of a 3x wide line - // private static w = 2; // Pixel width of a 2x wide line - // private static N = 1; // Pixed width of a narrow line - super(...arguments); - // Stores the actual narrow line width of the image being decoded. - this.narrowLineWidth = -1; - } - // See ITFWriter.PATTERNS - /* - - /!** - * Patterns of Wide / Narrow lines to indicate each digit - *!/ - */ - decodeRow(rowNumber, row, hints) { - // Find out where the Middle section (payload) starts & ends - let startRange = this.decodeStart(row); - let endRange = this.decodeEnd(row); - let result = new StringBuilder(); - ITFReader.decodeMiddle(row, startRange[1], endRange[0], result); - let resultString = result.toString(); - let allowedLengths = null; - if (hints != null) { - allowedLengths = hints.get(DecodeHintType$1.ALLOWED_LENGTHS); - } - if (allowedLengths == null) { - allowedLengths = ITFReader.DEFAULT_ALLOWED_LENGTHS; - } - // To avoid false positives with 2D barcodes (and other patterns), make - // an assumption that the decoded string must be a 'standard' length if it's short - let length = resultString.length; - let lengthOK = false; - let maxAllowedLength = 0; - for (let value of allowedLengths) { - if (length === value) { - lengthOK = true; - break; - } - if (value > maxAllowedLength) { - maxAllowedLength = value; - } - } - if (!lengthOK && length > maxAllowedLength) { - lengthOK = true; - } - if (!lengthOK) { - throw new FormatException(); - } - const points = [new ResultPoint(startRange[1], rowNumber), new ResultPoint(endRange[0], rowNumber)]; - let resultReturn = new Result(resultString, null, // no natural byte representation for these barcodes - 0, points, BarcodeFormat$1.ITF, new Date().getTime()); - return resultReturn; - } - /* - /!** - * @param row row of black/white values to search - * @param payloadStart offset of start pattern - * @param resultString {@link StringBuilder} to append decoded chars to - * @throws NotFoundException if decoding could not complete successfully - *!/*/ - static decodeMiddle(row, payloadStart, payloadEnd, resultString) { - // Digits are interleaved in pairs - 5 black lines for one digit, and the - // 5 - // interleaved white lines for the second digit. - // Therefore, need to scan 10 lines and then - // split these into two arrays - let counterDigitPair = new Int32Array(10); // 10 - let counterBlack = new Int32Array(5); // 5 - let counterWhite = new Int32Array(5); // 5 - counterDigitPair.fill(0); - counterBlack.fill(0); - counterWhite.fill(0); - while (payloadStart < payloadEnd) { - // Get 10 runs of black/white. - OneDReader.recordPattern(row, payloadStart, counterDigitPair); - // Split them into each array - for (let k = 0; k < 5; k++) { - let twoK = 2 * k; - counterBlack[k] = counterDigitPair[twoK]; - counterWhite[k] = counterDigitPair[twoK + 1]; - } - let bestMatch = ITFReader.decodeDigit(counterBlack); - resultString.append(bestMatch.toString()); - bestMatch = this.decodeDigit(counterWhite); - resultString.append(bestMatch.toString()); - counterDigitPair.forEach(function (counterDigit) { - payloadStart += counterDigit; - }); - } - } - /*/!** - * Identify where the start of the middle / payload section starts. - * - * @param row row of black/white values to search - * @return Array, containing index of start of 'start block' and end of - * 'start block' - *!/*/ - decodeStart(row) { - let endStart = ITFReader.skipWhiteSpace(row); - let startPattern = ITFReader.findGuardPattern(row, endStart, ITFReader.START_PATTERN); - // Determine the width of a narrow line in pixels. We can do this by - // getting the width of the start pattern and dividing by 4 because its - // made up of 4 narrow lines. - this.narrowLineWidth = (startPattern[1] - startPattern[0]) / 4; - this.validateQuietZone(row, startPattern[0]); - return startPattern; - } - /*/!** - * The start & end patterns must be pre/post fixed by a quiet zone. This - * zone must be at least 10 times the width of a narrow line. Scan back until - * we either get to the start of the barcode or match the necessary number of - * quiet zone pixels. - * - * Note: Its assumed the row is reversed when using this method to find - * quiet zone after the end pattern. - * - * ref: http://www.barcode-1.net/i25code.html - * - * @param row bit array representing the scanned barcode. - * @param startPattern index into row of the start or end pattern. - * @throws NotFoundException if the quiet zone cannot be found - *!/*/ - validateQuietZone(row, startPattern) { - let quietCount = this.narrowLineWidth * 10; // expect to find this many pixels of quiet zone - // if there are not so many pixel at all let's try as many as possible - quietCount = quietCount < startPattern ? quietCount : startPattern; - for (let i = startPattern - 1; quietCount > 0 && i >= 0; i--) { - if (row.get(i)) { - break; - } - quietCount--; - } - if (quietCount !== 0) { - // Unable to find the necessary number of quiet zone pixels. - throw new NotFoundException(); - } - } - /* - /!** - * Skip all whitespace until we get to the first black line. - * - * @param row row of black/white values to search - * @return index of the first black line. - * @throws NotFoundException Throws exception if no black lines are found in the row - *!/*/ - static skipWhiteSpace(row) { - const width = row.getSize(); - const endStart = row.getNextSet(0); - if (endStart === width) { - throw new NotFoundException(); - } - return endStart; - } - /*/!** - * Identify where the end of the middle / payload section ends. - * - * @param row row of black/white values to search - * @return Array, containing index of start of 'end block' and end of 'end - * block' - *!/*/ - decodeEnd(row) { - // For convenience, reverse the row and then - // search from 'the start' for the end block - row.reverse(); - try { - let endStart = ITFReader.skipWhiteSpace(row); - let endPattern; - try { - endPattern = ITFReader.findGuardPattern(row, endStart, ITFReader.END_PATTERN_REVERSED[0]); - } - catch (error) { - if (error instanceof NotFoundException) { - endPattern = ITFReader.findGuardPattern(row, endStart, ITFReader.END_PATTERN_REVERSED[1]); - } - } - // The start & end patterns must be pre/post fixed by a quiet zone. This - // zone must be at least 10 times the width of a narrow line. - // ref: http://www.barcode-1.net/i25code.html - this.validateQuietZone(row, endPattern[0]); - // Now recalculate the indices of where the 'endblock' starts & stops to - // accommodate - // the reversed nature of the search - let temp = endPattern[0]; - endPattern[0] = row.getSize() - endPattern[1]; - endPattern[1] = row.getSize() - temp; - return endPattern; - } - finally { - // Put the row back the right way. - row.reverse(); - } - } - /* - /!** - * @param row row of black/white values to search - * @param rowOffset position to start search - * @param pattern pattern of counts of number of black and white pixels that are - * being searched for as a pattern - * @return start/end horizontal offset of guard pattern, as an array of two - * ints - * @throws NotFoundException if pattern is not found - *!/*/ - static findGuardPattern(row, rowOffset, pattern) { - let patternLength = pattern.length; - let counters = new Int32Array(patternLength); - let width = row.getSize(); - let isWhite = false; - let counterPosition = 0; - let patternStart = rowOffset; - counters.fill(0); - for (let x = rowOffset; x < width; x++) { - if (row.get(x) !== isWhite) { - counters[counterPosition]++; - } - else { - if (counterPosition === patternLength - 1) { - if (OneDReader.patternMatchVariance(counters, pattern, ITFReader.MAX_INDIVIDUAL_VARIANCE) < ITFReader.MAX_AVG_VARIANCE) { - return [patternStart, x]; - } - patternStart += counters[0] + counters[1]; - System.arraycopy(counters, 2, counters, 0, counterPosition - 1); - counters[counterPosition - 1] = 0; - counters[counterPosition] = 0; - counterPosition--; - } - else { - counterPosition++; - } - counters[counterPosition] = 1; - isWhite = !isWhite; - } - } - throw new NotFoundException(); - } - /*/!** - * Attempts to decode a sequence of ITF black/white lines into single - * digit. - * - * @param counters the counts of runs of observed black/white/black/... values - * @return The decoded digit - * @throws NotFoundException if digit cannot be decoded - *!/*/ - static decodeDigit(counters) { - let bestVariance = ITFReader.MAX_AVG_VARIANCE; // worst variance we'll accept - let bestMatch = -1; - let max = ITFReader.PATTERNS.length; - for (let i = 0; i < max; i++) { - let pattern = ITFReader.PATTERNS[i]; - let variance = OneDReader.patternMatchVariance(counters, pattern, ITFReader.MAX_INDIVIDUAL_VARIANCE); - if (variance < bestVariance) { - bestVariance = variance; - bestMatch = i; - } - else if (variance === bestVariance) { - // if we find a second 'best match' with the same variance, we can not reliably report to have a suitable match - bestMatch = -1; - } - } - if (bestMatch >= 0) { - return bestMatch % 10; - } - else { - throw new NotFoundException(); - } - } - } - ITFReader.PATTERNS = [ - Int32Array.from([1, 1, 2, 2, 1]), - Int32Array.from([2, 1, 1, 1, 2]), - Int32Array.from([1, 2, 1, 1, 2]), - Int32Array.from([2, 2, 1, 1, 1]), - Int32Array.from([1, 1, 2, 1, 2]), - Int32Array.from([2, 1, 2, 1, 1]), - Int32Array.from([1, 2, 2, 1, 1]), - Int32Array.from([1, 1, 1, 2, 2]), - Int32Array.from([2, 1, 1, 2, 1]), - Int32Array.from([1, 2, 1, 2, 1]), - Int32Array.from([1, 1, 3, 3, 1]), - Int32Array.from([3, 1, 1, 1, 3]), - Int32Array.from([1, 3, 1, 1, 3]), - Int32Array.from([3, 3, 1, 1, 1]), - Int32Array.from([1, 1, 3, 1, 3]), - Int32Array.from([3, 1, 3, 1, 1]), - Int32Array.from([1, 3, 3, 1, 1]), - Int32Array.from([1, 1, 1, 3, 3]), - Int32Array.from([3, 1, 1, 3, 1]), - Int32Array.from([1, 3, 1, 3, 1]) // 9 - ]; - ITFReader.MAX_AVG_VARIANCE = 0.38; - ITFReader.MAX_INDIVIDUAL_VARIANCE = 0.5; - /* /!** Valid ITF lengths. Anything longer than the largest value is also allowed. *!/*/ - ITFReader.DEFAULT_ALLOWED_LENGTHS = [6, 8, 10, 12, 14]; - /*/!** - * Start/end guard pattern. - * - * Note: The end pattern is reversed because the row is reversed before - * searching for the END_PATTERN - *!/*/ - ITFReader.START_PATTERN = Int32Array.from([1, 1, 1, 1]); - ITFReader.END_PATTERN_REVERSED = [ - Int32Array.from([1, 1, 2]), - Int32Array.from([1, 1, 3]) // 3x - ]; - - /** - *

    Encapsulates functionality and implementation that is common to UPC and EAN families - * of one-dimensional barcodes.

    - * - * @author dswitkin@google.com (Daniel Switkin) - * @author Sean Owen - * @author alasdair@google.com (Alasdair Mackintosh) - */ - class AbstractUPCEANReader extends OneDReader { - constructor() { - super(...arguments); - this.decodeRowStringBuffer = ''; - } - - static findStartGuardPattern(row) { - let foundStart = false; - let startRange; - let nextStart = 0; - let counters = Int32Array.from([0, 0, 0]); - while (!foundStart) { - counters = Int32Array.from([0, 0, 0]); - startRange = AbstractUPCEANReader.findGuardPattern(row, nextStart, false, this.START_END_PATTERN, counters); - let start = startRange[0]; - nextStart = startRange[1]; - let quietStart = start - (nextStart - start); - if (quietStart >= 0) { - foundStart = row.isRange(quietStart, start, false); - } - } - return startRange; - } - static checkChecksum(s) { - return AbstractUPCEANReader.checkStandardUPCEANChecksum(s); - } - static checkStandardUPCEANChecksum(s) { - let length = s.length; - if (length === 0) - return false; - let check = parseInt(s.charAt(length - 1), 10); - return AbstractUPCEANReader.getStandardUPCEANChecksum(s.substring(0, length - 1)) === check; - } - static getStandardUPCEANChecksum(s) { - let length = s.length; - let sum = 0; - for (let i = length - 1; i >= 0; i -= 2) { - let digit = s.charAt(i).charCodeAt(0) - '0'.charCodeAt(0); - if (digit < 0 || digit > 9) { - throw new FormatException(); - } - sum += digit; - } - sum *= 3; - for (let i = length - 2; i >= 0; i -= 2) { - let digit = s.charAt(i).charCodeAt(0) - '0'.charCodeAt(0); - if (digit < 0 || digit > 9) { - throw new FormatException(); - } - sum += digit; - } - return (1000 - sum) % 10; - } - static decodeEnd(row, endStart) { - return AbstractUPCEANReader.findGuardPattern(row, endStart, false, AbstractUPCEANReader.START_END_PATTERN, new Int32Array(AbstractUPCEANReader.START_END_PATTERN.length).fill(0)); - } - /** - * @throws NotFoundException - */ - static findGuardPatternWithoutCounters(row, rowOffset, whiteFirst, pattern) { - return this.findGuardPattern(row, rowOffset, whiteFirst, pattern, new Int32Array(pattern.length)); - } - /** - * @param row row of black/white values to search - * @param rowOffset position to start search - * @param whiteFirst if true, indicates that the pattern specifies white/black/white/... - * pixel counts, otherwise, it is interpreted as black/white/black/... - * @param pattern pattern of counts of number of black and white pixels that are being - * searched for as a pattern - * @param counters array of counters, as long as pattern, to re-use - * @return start/end horizontal offset of guard pattern, as an array of two ints - * @throws NotFoundException if pattern is not found - */ - static findGuardPattern(row, rowOffset, whiteFirst, pattern, counters) { - let width = row.getSize(); - rowOffset = whiteFirst ? row.getNextUnset(rowOffset) : row.getNextSet(rowOffset); - let counterPosition = 0; - let patternStart = rowOffset; - let patternLength = pattern.length; - let isWhite = whiteFirst; - for (let x = rowOffset; x < width; x++) { - if (row.get(x) !== isWhite) { - counters[counterPosition]++; - } - else { - if (counterPosition === patternLength - 1) { - if (OneDReader.patternMatchVariance(counters, pattern, AbstractUPCEANReader.MAX_INDIVIDUAL_VARIANCE) < AbstractUPCEANReader.MAX_AVG_VARIANCE) { - return Int32Array.from([patternStart, x]); - } - patternStart += counters[0] + counters[1]; - let slice = counters.slice(2, counters.length - 1); - for (let i = 0; i < counterPosition - 1; i++) { - counters[i] = slice[i]; - } - counters[counterPosition - 1] = 0; - counters[counterPosition] = 0; - counterPosition--; - } - else { - counterPosition++; - } - counters[counterPosition] = 1; - isWhite = !isWhite; - } - } - throw new NotFoundException(); - } - static decodeDigit(row, counters, rowOffset, patterns) { - this.recordPattern(row, rowOffset, counters); - let bestVariance = this.MAX_AVG_VARIANCE; - let bestMatch = -1; - let max = patterns.length; - for (let i = 0; i < max; i++) { - let pattern = patterns[i]; - let variance = OneDReader.patternMatchVariance(counters, pattern, AbstractUPCEANReader.MAX_INDIVIDUAL_VARIANCE); - if (variance < bestVariance) { - bestVariance = variance; - bestMatch = i; - } - } - if (bestMatch >= 0) { - return bestMatch; - } - else { - throw new NotFoundException(); - } - } - } - // These two values are critical for determining how permissive the decoding will be. - // We've arrived at these values through a lot of trial and error. Setting them any higher - // lets false positives creep in quickly. - AbstractUPCEANReader.MAX_AVG_VARIANCE = 0.48; - AbstractUPCEANReader.MAX_INDIVIDUAL_VARIANCE = 0.7; - /** - * Start/end guard pattern. - */ - AbstractUPCEANReader.START_END_PATTERN = Int32Array.from([1, 1, 1]); - /** - * Pattern marking the middle of a UPC/EAN pattern, separating the two halves. - */ - AbstractUPCEANReader.MIDDLE_PATTERN = Int32Array.from([1, 1, 1, 1, 1]); - /** - * end guard pattern. - */ - AbstractUPCEANReader.END_PATTERN = Int32Array.from([1, 1, 1, 1, 1, 1]); - /** - * "Odd", or "L" patterns used to encode UPC/EAN digits. - */ - AbstractUPCEANReader.L_PATTERNS = [ - Int32Array.from([3, 2, 1, 1]), - Int32Array.from([2, 2, 2, 1]), - Int32Array.from([2, 1, 2, 2]), - Int32Array.from([1, 4, 1, 1]), - Int32Array.from([1, 1, 3, 2]), - Int32Array.from([1, 2, 3, 1]), - Int32Array.from([1, 1, 1, 4]), - Int32Array.from([1, 3, 1, 2]), - Int32Array.from([1, 2, 1, 3]), - Int32Array.from([3, 1, 1, 2]), - ]; - - /** - * @see UPCEANExtension2Support - */ - class UPCEANExtension5Support { - constructor() { - this.CHECK_DIGIT_ENCODINGS = [0x18, 0x14, 0x12, 0x11, 0x0C, 0x06, 0x03, 0x0A, 0x09, 0x05]; - this.decodeMiddleCounters = Int32Array.from([0, 0, 0, 0]); - this.decodeRowStringBuffer = ''; - } - decodeRow(rowNumber, row, extensionStartRange) { - let result = this.decodeRowStringBuffer; - let end = this.decodeMiddle(row, extensionStartRange, result); - let resultString = result.toString(); - let extensionData = UPCEANExtension5Support.parseExtensionString(resultString); - let resultPoints = [ - new ResultPoint((extensionStartRange[0] + extensionStartRange[1]) / 2.0, rowNumber), - new ResultPoint(end, rowNumber) - ]; - let extensionResult = new Result(resultString, null, 0, resultPoints, BarcodeFormat$1.UPC_EAN_EXTENSION, new Date().getTime()); - if (extensionData != null) { - extensionResult.putAllMetadata(extensionData); - } - return extensionResult; - } - decodeMiddle(row, startRange, resultString) { - let counters = this.decodeMiddleCounters; - counters[0] = 0; - counters[1] = 0; - counters[2] = 0; - counters[3] = 0; - let end = row.getSize(); - let rowOffset = startRange[1]; - let lgPatternFound = 0; - for (let x = 0; x < 5 && rowOffset < end; x++) { - let bestMatch = AbstractUPCEANReader.decodeDigit( - row, - counters, - rowOffset, - AbstractUPCEANReader.L_AND_G_PATTERNS); - resultString += String.fromCharCode(('0'.charCodeAt(0) + bestMatch % 10)); - for (let counter of counters) { - rowOffset += counter; - } - if (bestMatch >= 10) { - lgPatternFound |= 1 << (4 - x); - } - if (x !== 4) { - // Read off separator if not last - rowOffset = row.getNextSet(rowOffset); - rowOffset = row.getNextUnset(rowOffset); - } - } - if (resultString.length !== 5) { - throw new NotFoundException(); - } - let checkDigit = this.determineCheckDigit(lgPatternFound); - if (UPCEANExtension5Support.extensionChecksum(resultString.toString()) !== checkDigit) { - throw new NotFoundException(); - } - return rowOffset; - } - static extensionChecksum(s) { - let length = s.length; - let sum = 0; - for (let i = length - 2; i >= 0; i -= 2) { - sum += s.charAt(i).charCodeAt(0) - '0'.charCodeAt(0); - } - sum *= 3; - for (let i = length - 1; i >= 0; i -= 2) { - sum += s.charAt(i).charCodeAt(0) - '0'.charCodeAt(0); - } - sum *= 3; - return sum % 10; - } - determineCheckDigit(lgPatternFound) { - for (let d = 0; d < 10; d++) { - if (lgPatternFound === this.CHECK_DIGIT_ENCODINGS[d]) { - return d; - } - } - throw new NotFoundException(); - } - static parseExtensionString(raw) { - if (raw.length !== 5) { - return null; - } - let value = UPCEANExtension5Support.parseExtension5String(raw); - if (value == null) { - return null; - } - return new Map([[ResultMetadataType$1.SUGGESTED_PRICE, value]]); - } - static parseExtension5String(raw) { - let currency; - switch (raw.charAt(0)) { - case '0': - currency = '£'; - break; - case '5': - currency = '$'; - break; - case '9': - // Reference: http://www.jollytech.com - switch (raw) { - case '90000': - // No suggested retail price - return null; - case '99991': - // Complementary - return '0.00'; - case '99990': - return 'Used'; - } - // Otherwise... unknown currency? - currency = ''; - break; - default: - currency = ''; - break; - } - let rawAmount = parseInt(raw.substring(1)); - let unitsString = (rawAmount / 100).toString(); - let hundredths = rawAmount % 100; - let hundredthsString = hundredths < 10 ? '0' + hundredths : hundredths.toString(); // fixme - return currency + unitsString + '.' + hundredthsString; - } - } - - /** - * @see UPCEANExtension5Support - */ - class UPCEANExtension2Support { - constructor() { - this.decodeMiddleCounters = Int32Array.from([0, 0, 0, 0]); - this.decodeRowStringBuffer = ''; - } - decodeRow(rowNumber, row, extensionStartRange) { - let result = this.decodeRowStringBuffer; - let end = this.decodeMiddle(row, extensionStartRange, result); - let resultString = result.toString(); - let extensionData = UPCEANExtension2Support.parseExtensionString(resultString); - let resultPoints = [ - new ResultPoint((extensionStartRange[0] + extensionStartRange[1]) / 2.0, rowNumber), - new ResultPoint(end, rowNumber) - ]; - let extensionResult = new Result(resultString, null, 0, resultPoints, BarcodeFormat$1.UPC_EAN_EXTENSION, new Date().getTime()); - if (extensionData != null) { - extensionResult.putAllMetadata(extensionData); - } - return extensionResult; - } - decodeMiddle(row, startRange, resultString) { - let counters = this.decodeMiddleCounters; - counters[0] = 0; - counters[1] = 0; - counters[2] = 0; - counters[3] = 0; - let end = row.getSize(); - let rowOffset = startRange[1]; - let checkParity = 0; - for (let x = 0; x < 2 && rowOffset < end; x++) { - let bestMatch = AbstractUPCEANReader.decodeDigit(row, counters, rowOffset, AbstractUPCEANReader.L_AND_G_PATTERNS); - resultString += String.fromCharCode(('0'.charCodeAt(0) + bestMatch % 10)); - for (let counter of counters) { - rowOffset += counter; - } - if (bestMatch >= 10) { - checkParity |= 1 << (1 - x); - } - if (x !== 1) { - // Read off separator if not last - rowOffset = row.getNextSet(rowOffset); - rowOffset = row.getNextUnset(rowOffset); - } - } - if (resultString.length !== 2) { - throw new NotFoundException(); - } - if (parseInt(resultString.toString()) % 4 !== checkParity) { - throw new NotFoundException(); - } - return rowOffset; - } - static parseExtensionString(raw) { - if (raw.length !== 2) { - return null; - } - return new Map([[ResultMetadataType$1.ISSUE_NUMBER, parseInt(raw)]]); - } - } - - class UPCEANExtensionSupport { - static decodeRow(rowNumber, row, rowOffset) { - let extensionStartRange = AbstractUPCEANReader.findGuardPattern( - row, - rowOffset, - false, - this.EXTENSION_START_PATTERN, - new Int32Array(this.EXTENSION_START_PATTERN.length).fill(0)); - try { - // return null; - let fiveSupport = new UPCEANExtension5Support(); - return fiveSupport.decodeRow(rowNumber, row, extensionStartRange); - } - catch (err) { - // return null; - let twoSupport = new UPCEANExtension2Support(); - return twoSupport.decodeRow(rowNumber, row, extensionStartRange); - } - } - } - UPCEANExtensionSupport.EXTENSION_START_PATTERN = Int32Array.from([1, 1, 2]); - - /** - *

    Encapsulates functionality and implementation that is common to UPC and EAN families - * of one-dimensional barcodes.

    - * - * @author dswitkin@google.com (Daniel Switkin) - * @author Sean Owen - * @author alasdair@google.com (Alasdair Mackintosh) - */ - class UPCEANReader extends AbstractUPCEANReader { - constructor() { - super(); - this.decodeRowStringBuffer = ''; - UPCEANReader.L_AND_G_PATTERNS = UPCEANReader.L_PATTERNS.map(arr => Int32Array.from(arr)); - for (let i = 10; i < 20; i++) { - let widths = UPCEANReader.L_PATTERNS[i - 10]; - let reversedWidths = new Int32Array(widths.length); - for (let j = 0; j < widths.length; j++) { - reversedWidths[j] = widths[widths.length - j - 1]; - } - UPCEANReader.L_AND_G_PATTERNS[i] = reversedWidths; - } - } - decodeRow(rowNumber, row, hints) { - let startGuardRange = UPCEANReader.findStartGuardPattern(row); - let resultPointCallback = hints == null ? null : hints.get(DecodeHintType$1.NEED_RESULT_POINT_CALLBACK); - if (resultPointCallback != null) { - const resultPoint = new ResultPoint((startGuardRange[0] + startGuardRange[1]) / 2.0, rowNumber); - resultPointCallback.foundPossibleResultPoint(resultPoint); - } - let budello = this.decodeMiddle(row, startGuardRange, this.decodeRowStringBuffer); - let endStart = budello.rowOffset; - let result = budello.resultString; - if (resultPointCallback != null) { - const resultPoint = new ResultPoint(endStart, rowNumber); - resultPointCallback.foundPossibleResultPoint(resultPoint); - } - let endRange = this.decodeEnd(row, endStart); - if (resultPointCallback != null) { - const resultPoint = new ResultPoint((endRange[0] + endRange[1]) / 2.0, rowNumber); - resultPointCallback.foundPossibleResultPoint(resultPoint); - } - // Make sure there is a quiet zone at least as big as the end pattern after the barcode. The - // spec might want more whitespace, but in practice this is the maximum we can count on. - let end = endRange[1]; - let quietEnd = end + (end - endRange[0]); - if (quietEnd >= row.getSize() || !row.isRange(end, quietEnd, false)) { - throw new NotFoundException(); - } - let resultString = result.toString(); - // UPC/EAN should never be less than 8 chars anyway - if (resultString.length < 8) { - throw new FormatException(); - } - if (!UPCEANReader.checkChecksum(resultString)) { - throw new ChecksumException(); - } - let left = (startGuardRange[1] + startGuardRange[0]) / 2.0; - let right = (endRange[1] + endRange[0]) / 2.0; - let format = this.getBarcodeFormat(); - let resultPoint = [new ResultPoint(left, rowNumber), new ResultPoint(right, rowNumber)]; - let decodeResult = new Result(resultString, null, 0, resultPoint, format, new Date().getTime()); - let extensionLength = 0; - try { - let extensionResult = UPCEANExtensionSupport.decodeRow(rowNumber, row, endRange[1]); - decodeResult.putMetadata(ResultMetadataType$1.UPC_EAN_EXTENSION, extensionResult.getText()); - decodeResult.putAllMetadata(extensionResult.getResultMetadata()); - decodeResult.addResultPoints(extensionResult.getResultPoints()); - extensionLength = extensionResult.getText().length; - } - catch (ignoreError) {} - let allowedExtensions = hints == null ? null : hints.get(DecodeHintType$1.ALLOWED_EAN_EXTENSIONS); - if (allowedExtensions != null) { - let valid = false; - for (let length in allowedExtensions) { - if (extensionLength.toString() === length) { // check me - valid = true; - break; - } - } - if (!valid) { - throw new NotFoundException(); - } - } - return decodeResult; - } - decodeEnd(row, endStart) { - return UPCEANReader.findGuardPattern( - row, endStart, false, UPCEANReader.START_END_PATTERN, - new Int32Array(UPCEANReader.START_END_PATTERN.length).fill(0)); - } - static checkChecksum(s) { - return UPCEANReader.checkStandardUPCEANChecksum(s); - } - static checkStandardUPCEANChecksum(s) { - let length = s.length; - if (length === 0) - return false; - let check = parseInt(s.charAt(length - 1), 10); - return UPCEANReader.getStandardUPCEANChecksum(s.substring(0, length - 1)) === check; - } - static getStandardUPCEANChecksum(s) { - let length = s.length; - let sum = 0; - for (let i = length - 1; i >= 0; i -= 2) { - let digit = s.charAt(i).charCodeAt(0) - '0'.charCodeAt(0); - if (digit < 0 || digit > 9) { - throw new FormatException(); - } - sum += digit; - } - sum *= 3; - for (let i = length - 2; i >= 0; i -= 2) { - let digit = s.charAt(i).charCodeAt(0) - '0'.charCodeAt(0); - if (digit < 0 || digit > 9) { - throw new FormatException(); - } - sum += digit; - } - return (1000 - sum) % 10; - } - } - - /** - *

    Implements decoding of the EAN-13 format.

    - * - * @author dswitkin@google.com (Daniel Switkin) - * @author Sean Owen - * @author alasdair@google.com (Alasdair Mackintosh) - */ - class EAN13Reader extends UPCEANReader { - constructor() { - super(); - this.decodeMiddleCounters = Int32Array.from([0, 0, 0, 0]); - } - decodeMiddle(row, startRange, resultString) { - let counters = this.decodeMiddleCounters; - counters[0] = 0; - counters[1] = 0; - counters[2] = 0; - counters[3] = 0; - let end = row.getSize(); - let rowOffset = startRange[1]; - let lgPatternFound = 0; - for (let x = 0; x < 6 && rowOffset < end; x++) { - let bestMatch = UPCEANReader.decodeDigit(row, counters, rowOffset, UPCEANReader.L_AND_G_PATTERNS); - resultString += String.fromCharCode(('0'.charCodeAt(0) + bestMatch % 10)); - for (let counter of counters) { - rowOffset += counter; - } - if (bestMatch >= 10) { - lgPatternFound |= 1 << (5 - x); - } - } - resultString = EAN13Reader.determineFirstDigit(resultString, lgPatternFound); - let middleRange = UPCEANReader.findGuardPattern( - row, - rowOffset, - true, - UPCEANReader.MIDDLE_PATTERN, - new Int32Array(UPCEANReader.MIDDLE_PATTERN.length).fill(0)); - rowOffset = middleRange[1]; - for (let x = 0; x < 6 && rowOffset < end; x++) { - let bestMatch = UPCEANReader.decodeDigit(row, counters, rowOffset, UPCEANReader.L_PATTERNS); - resultString += String.fromCharCode(('0'.charCodeAt(0) + bestMatch)); - for (let counter of counters) { - rowOffset += counter; - } - } - return { rowOffset, resultString }; - } - getBarcodeFormat() { - return BarcodeFormat$1.EAN_13; - } - static determineFirstDigit(resultString, lgPatternFound) { - for (let d = 0; d < 10; d++) { - if (lgPatternFound === this.FIRST_DIGIT_ENCODINGS[d]) { - resultString = String.fromCharCode(('0'.charCodeAt(0) + d)) + resultString; - return resultString; - } - } - throw new NotFoundException(); - } - } - EAN13Reader.FIRST_DIGIT_ENCODINGS = [0x00, 0x0B, 0x0D, 0xE, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A]; - - /** - *

    Implements decoding of the EAN-8 format.

    - * - * @author Sean Owen - */ - class EAN8Reader extends UPCEANReader { - constructor() { - super(); - this.decodeMiddleCounters = Int32Array.from([0, 0, 0, 0]); - } - decodeMiddle(row, startRange, resultString) { - const counters = this.decodeMiddleCounters; - counters[0] = 0; - counters[1] = 0; - counters[2] = 0; - counters[3] = 0; - let end = row.getSize(); - let rowOffset = startRange[1]; - for (let x = 0; x < 4 && rowOffset < end; x++) { - let bestMatch = UPCEANReader.decodeDigit(row, counters, rowOffset, UPCEANReader.L_PATTERNS); - resultString += String.fromCharCode(('0'.charCodeAt(0) + bestMatch)); - for (let counter of counters) { - rowOffset += counter; - } - } - let middleRange = UPCEANReader.findGuardPattern(row, rowOffset, true, UPCEANReader.MIDDLE_PATTERN, new Int32Array(UPCEANReader.MIDDLE_PATTERN.length).fill(0)); - rowOffset = middleRange[1]; - for (let x = 0; x < 4 && rowOffset < end; x++) { - let bestMatch = UPCEANReader.decodeDigit(row, counters, rowOffset, UPCEANReader.L_PATTERNS); - resultString += String.fromCharCode(('0'.charCodeAt(0) + bestMatch)); - for (let counter of counters) { - rowOffset += counter; - } - } - return { rowOffset, resultString }; - } - getBarcodeFormat() { - return BarcodeFormat$1.EAN_8; - } - } - - /** - * Encapsulates functionality and implementation that is common to all families - * of one-dimensional barcodes. - * - * @author dswitkin@google.com (Daniel Switkin) - * @author Sean Owen - * @author sam2332 (Sam Rudloff) - * - * @source https://github.com/zxing/zxing/blob/3c96923276dd5785d58eb970b6ba3f80d36a9505/core/src/main/java/com/google/zxing/oned/UPCAReader.java - * - * @experimental - */ - class UPCAReader extends UPCEANReader { - constructor() { - super(...arguments); - this.ean13Reader = new EAN13Reader(); - } - // @Override - getBarcodeFormat() { - return BarcodeFormat$1.UPC_A; - } - // Note that we don't try rotation without the try harder flag, even if rotation was supported. - // @Override - decode(image, hints) { - return this.maybeReturnResult(this.ean13Reader.decode(image)); - } - // @Override - decodeRow(rowNumber, row, hints) { - return this.maybeReturnResult(this.ean13Reader.decodeRow(rowNumber, row, hints)); - } - // @Override - decodeMiddle(row, startRange, resultString) { - return this.ean13Reader.decodeMiddle(row, startRange, resultString); - } - maybeReturnResult(result) { - let text = result.getText(); - if (text.charAt(0) === '0') { - let upcaResult = new Result(text.substring(1), null, null, result.getResultPoints(), BarcodeFormat$1.UPC_A); - if (result.getResultMetadata() != null) { - upcaResult.putAllMetadata(result.getResultMetadata()); - } - return upcaResult; - } - else { - throw new NotFoundException(); - } - } - reset() { - this.ean13Reader.reset(); - } - } - - /** - *

    Implements decoding of the UPC-E format.

    - *

    This is a great reference for - * UPC-E information.

    - * - * @author Sean Owen - * - * @source https://github.com/zxing/zxing/blob/3c96923276dd5785d58eb970b6ba3f80d36a9505/core/src/main/java/com/google/zxing/oned/UPCEReader.java - * - * @experimental - */ - /* final */ class UPCEReader extends UPCEANReader { - constructor() { - super(); - this.decodeMiddleCounters = new Int32Array(4); - } - /** - * @throws NotFoundException - */ - // @Override - decodeMiddle(row, startRange, result) { - const counters = this.decodeMiddleCounters.map(x => x); - counters[0] = 0; - counters[1] = 0; - counters[2] = 0; - counters[3] = 0; - const end = row.getSize(); - let rowOffset = startRange[1]; - let lgPatternFound = 0; - for (let x = 0; x < 6 && rowOffset < end; x++) { - const bestMatch = UPCEReader.decodeDigit( - row, counters, rowOffset, UPCEReader.L_AND_G_PATTERNS); - result += String.fromCharCode(('0'.charCodeAt(0) + (bestMatch % 10))); - for (let counter of counters) { - rowOffset += counter; - } - if (bestMatch >= 10) { - lgPatternFound |= (1 << (5 - x)); - } - } - let resultString = UPCEReader.determineNumSysAndCheckDigit( - result, lgPatternFound); - return {rowOffset, resultString}; - } - /** - * @throws NotFoundException - */ - // @Override - decodeEnd(row, endStart) { - return UPCEReader.findGuardPatternWithoutCounters( - row, endStart, true, UPCEReader.MIDDLE_END_PATTERN); - } - /** - * @throws FormatException - */ - // @Override - checkChecksum(s) { - return UPCEANReader.checkChecksum(UPCEReader.convertUPCEtoUPCA(s)); - } - /** - * @throws NotFoundException - */ - static determineNumSysAndCheckDigit(resultString, lgPatternFound) { - for (let numSys = 0; numSys <= 1; numSys++) { - for (let d = 0; d < 10; d++) { - if (lgPatternFound === this.NUMSYS_AND_CHECK_DIGIT_PATTERNS[numSys][d]) { - let prefix = String.fromCharCode('0'.charCodeAt(0) + numSys); - let suffix = String.fromCharCode('0'.charCodeAt(0) + d); - return prefix + resultString + suffix; - } - } - } - throw NotFoundException.getNotFoundInstance(); - } - // @Override - getBarcodeFormat() { - return BarcodeFormat$1.UPC_E; - } - /** - * Expands a UPC-E value back into its full, equivalent UPC-A code value. - * - * @param upce UPC-E code as string of digits - * @return equivalent UPC-A code as string of digits - */ - static convertUPCEtoUPCA(upce) { - // the following line is equivalent to upce.getChars(1, 7, upceChars, 0); - const upceChars = upce.slice(1, 7).split('').map(x => x.charCodeAt(0)); - const result = new StringBuilder( /*12*/); - result.append(upce.charAt(0)); - let lastChar = upceChars[5]; - switch (lastChar) { - case 0: - case 1: - case 2: - result.appendChars(upceChars, 0, 2); - result.append(lastChar); - result.append('0000'); - result.appendChars(upceChars, 2, 3); - break; - case 3: - result.appendChars(upceChars, 0, 3); - result.append('00000'); - result.appendChars(upceChars, 3, 2); - break; - case 4: - result.appendChars(upceChars, 0, 4); - result.append('00000'); - result.append(upceChars[4]); - break; - default: - result.appendChars(upceChars, 0, 5); - result.append('0000'); - result.append(lastChar); - break; - } - // Only append check digit in conversion if supplied - if (upce.length >= 8) { - result.append(upce.charAt(7)); - } - return result.toString(); - } - } - /** - * The pattern that marks the middle, and end, of a UPC-E pattern. - * There is no "second half" to a UPC-E barcode. - */ - UPCEReader.MIDDLE_END_PATTERN = Int32Array.from([1, 1, 1, 1, 1, 1]); - // For an UPC-E barcode, the final digit is represented by the parities used - // to encode the middle six digits, according to the table below. - // - // Parity of next 6 digits - // Digit 0 1 2 3 4 5 - // 0 Even Even Even Odd Odd Odd - // 1 Even Even Odd Even Odd Odd - // 2 Even Even Odd Odd Even Odd - // 3 Even Even Odd Odd Odd Even - // 4 Even Odd Even Even Odd Odd - // 5 Even Odd Odd Even Even Odd - // 6 Even Odd Odd Odd Even Even - // 7 Even Odd Even Odd Even Odd - // 8 Even Odd Even Odd Odd Even - // 9 Even Odd Odd Even Odd Even - // - // The encoding is represented by the following array, which is a bit pattern - // using Odd = 0 and Even = 1. For example, 5 is represented by: - // - // Odd Even Even Odd Odd Even - // in binary: - // 0 1 1 0 0 1 == 0x19 - // - /** - * See {@link #L_AND_G_PATTERNS}; these values similarly represent patterns of - * even-odd parity encodings of digits that imply both the number system (0 or 1) - * used, and the check digit. - */ - UPCEReader.NUMSYS_AND_CHECK_DIGIT_PATTERNS = [ - Int32Array.from([0x38, 0x34, 0x32, 0x31, 0x2C, 0x26, 0x23, 0x2A, 0x29, 0x25]), - Int32Array.from([0x07, 0x0B, 0x0D, 0x0E, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A]), - ]; - - /** - *

    A reader that can read all available UPC/EAN formats. If a caller wants to try to - * read all such formats, it is most efficient to use this implementation rather than invoke - * individual readers.

    - * - * @author Sean Owen - */ - class MultiFormatUPCEANReader extends OneDReader { - constructor(hints) { - super(); - let possibleFormats = hints == null ? null : hints.get(DecodeHintType$1.POSSIBLE_FORMATS); - let readers = []; - if (!isNullOrUndefined(possibleFormats)) { - if (possibleFormats.indexOf(BarcodeFormat$1.EAN_13) > -1) { - readers.push(new EAN13Reader()); - } - if (possibleFormats.indexOf(BarcodeFormat$1.UPC_A) > -1) { - readers.push(new UPCAReader()); - } - if (possibleFormats.indexOf(BarcodeFormat$1.EAN_8) > -1) { - readers.push(new EAN8Reader()); - } - if (possibleFormats.indexOf(BarcodeFormat$1.UPC_E) > -1) { - readers.push(new UPCEReader()); - } - } else { - // No hints provided. - readers.push(new EAN13Reader()); - readers.push(new UPCAReader()); - readers.push(new EAN8Reader()); - readers.push(new UPCEReader()); - } - this.readers = readers; - } - decodeRow(rowNumber, row, hints) { - for (let reader of this.readers) { - try { - // const result: Result = reader.decodeRow(rowNumber, row, startGuardPattern, hints); - const result = reader.decodeRow(rowNumber, row, hints); - // Special case: a 12-digit code encoded in UPC-A is identical to a "0" - // followed by those 12 digits encoded as EAN-13. Each will recognize such a code, - // UPC-A as a 12-digit string and EAN-13 as a 13-digit string starting with "0". - // Individually these are correct and their readers will both read such a code - // and correctly call it EAN-13, or UPC-A, respectively. - // - // In this case, if we've been looking for both types, we'd like to call it - // a UPC-A code. But for efficiency we only run the EAN-13 decoder to also read - // UPC-A. So we special case it here, and convert an EAN-13 result to a UPC-A - // result if appropriate. - // - // But, don't return UPC-A if UPC-A was not a requested format! - const ean13MayBeUPCA = result.getBarcodeFormat() === BarcodeFormat$1.EAN_13 && - result.getText().charAt(0) === '0'; - // @SuppressWarnings("unchecked") - const possibleFormats = hints == null ? null : hints.get(DecodeHintType$1.POSSIBLE_FORMATS); - const canReturnUPCA = possibleFormats == null || possibleFormats.includes(BarcodeFormat$1.UPC_A); - if (ean13MayBeUPCA && canReturnUPCA) { - const rawBytes = result.getRawBytes(); - // Transfer the metadata across - const resultUPCA = new Result( - result.getText().substring(1), - rawBytes, - (rawBytes ? rawBytes.length : null), - result.getResultPoints(), - BarcodeFormat$1.UPC_A); - resultUPCA.putAllMetadata(result.getResultMetadata()); - return resultUPCA; - } - return result; - } - catch (err) { - // continue; - } - } - throw new NotFoundException(); - } - reset() { - for (let reader of this.readers) { - reader.reset(); - } - } - } - - // import Integer from '../../util/Integer'; - // import Float from '../../util/Float'; - class AbstractRSSReader extends OneDReader { - constructor() { - super(); - this.decodeFinderCounters = new Int32Array(4); - this.dataCharacterCounters = new Int32Array(8); - this.oddRoundingErrors = new Array(4); - this.evenRoundingErrors = new Array(4); - this.oddCounts = new Array(this.dataCharacterCounters.length / 2); - this.evenCounts = new Array(this.dataCharacterCounters.length / 2); - } - getDecodeFinderCounters() { - return this.decodeFinderCounters; - } - getDataCharacterCounters() { - return this.dataCharacterCounters; - } - getOddRoundingErrors() { - return this.oddRoundingErrors; - } - getEvenRoundingErrors() { - return this.evenRoundingErrors; - } - getOddCounts() { - return this.oddCounts; - } - getEvenCounts() { - return this.evenCounts; - } - parseFinderValue(counters, finderPatterns) { - for (let value = 0; value < finderPatterns.length; value++) { - if (OneDReader.patternMatchVariance(counters, finderPatterns[value], AbstractRSSReader.MAX_INDIVIDUAL_VARIANCE) < AbstractRSSReader.MAX_AVG_VARIANCE) { - return value; - } - } - throw new NotFoundException(); - } - /** - * @param array values to sum - * @return sum of values - * @deprecated call {@link MathUtils#sum(int[])} - */ - static count(array) { - return MathUtils.sum(new Int32Array(array)); - } - static increment(array, errors) { - let index = 0; - let biggestError = errors[0]; - for (let i = 1; i < array.length; i++) { - if (errors[i] > biggestError) { - biggestError = errors[i]; - index = i; - } - } - array[index]++; - } - static decrement(array, errors) { - let index = 0; - let biggestError = errors[0]; - for (let i = 1; i < array.length; i++) { - if (errors[i] < biggestError) { - biggestError = errors[i]; - index = i; - } - } - array[index]--; - } - static isFinderPattern(counters) { - let firstTwoSum = counters[0] + counters[1]; - let sum = firstTwoSum + counters[2] + counters[3]; - let ratio = firstTwoSum / sum; - if (ratio >= AbstractRSSReader.MIN_FINDER_PATTERN_RATIO && ratio <= AbstractRSSReader.MAX_FINDER_PATTERN_RATIO) { - // passes ratio test in spec, but see if the counts are unreasonable - let minCounter = Number.MAX_SAFE_INTEGER; - let maxCounter = Number.MIN_SAFE_INTEGER; - for (let counter of counters) { - if (counter > maxCounter) { - maxCounter = counter; - } - if (counter < minCounter) { - minCounter = counter; - } - } - return maxCounter < 10 * minCounter; - } - return false; - } - } - AbstractRSSReader.MAX_AVG_VARIANCE = 0.2; - AbstractRSSReader.MAX_INDIVIDUAL_VARIANCE = 0.45; - AbstractRSSReader.MIN_FINDER_PATTERN_RATIO = 9.5 / 12.0; - AbstractRSSReader.MAX_FINDER_PATTERN_RATIO = 12.5 / 14.0; - - class DataCharacter { - constructor(value, checksumPortion) { - this.value = value; - this.checksumPortion = checksumPortion; - } - getValue() { - return this.value; - } - getChecksumPortion() { - return this.checksumPortion; - } - toString() { - return this.value + '(' + this.checksumPortion + ')'; - } - equals(o) { - if (!(o instanceof DataCharacter)) { - return false; - } - const that = o; - return this.value === that.value && this.checksumPortion === that.checksumPortion; - } - hashCode() { - return this.value ^ this.checksumPortion; - } - } - - class FinderPattern { - constructor(value, startEnd, start, end, rowNumber) { - this.value = value; - this.startEnd = startEnd; - this.value = value; - this.startEnd = startEnd; - this.resultPoints = new Array(); - this.resultPoints.push(new ResultPoint(start, rowNumber)); - this.resultPoints.push(new ResultPoint(end, rowNumber)); - } - getValue() { - return this.value; - } - getStartEnd() { - return this.startEnd; - } - getResultPoints() { - return this.resultPoints; - } - equals(o) { - if (!(o instanceof FinderPattern)) { - return false; - } - const that = o; - return this.value === that.value; - } - hashCode() { - return this.value; - } - } - - /** - * RSS util functions. - */ - class RSSUtils { - constructor() { } - static getRSSvalue(widths, maxWidth, noNarrow) { - let n = 0; - for (let width of widths) { - n += width; - } - let val = 0; - let narrowMask = 0; - let elements = widths.length; - for (let bar = 0; bar < elements - 1; bar++) { - let elmWidth; - for (elmWidth = 1, narrowMask |= 1 << bar; elmWidth < widths[bar]; elmWidth++, narrowMask &= ~(1 << bar)) { - let subVal = RSSUtils.combins(n - elmWidth - 1, elements - bar - 2); - if (noNarrow && (narrowMask === 0) && (n - elmWidth - (elements - bar - 1) >= elements - bar - 1)) { - subVal -= RSSUtils.combins(n - elmWidth - (elements - bar), elements - bar - 2); - } - if (elements - bar - 1 > 1) { - let lessVal = 0; - for (let mxwElement = n - elmWidth - (elements - bar - 2); mxwElement > maxWidth; mxwElement--) { - lessVal += RSSUtils.combins(n - elmWidth - mxwElement - 1, elements - bar - 3); - } - subVal -= lessVal * (elements - 1 - bar); - } - else if (n - elmWidth > maxWidth) { - subVal--; - } - val += subVal; - } - n -= elmWidth; - } - return val; - } - static combins(n, r) { - let maxDenom; - let minDenom; - if (n - r > r) { - minDenom = r; - maxDenom = n - r; - } - else { - minDenom = n - r; - maxDenom = r; - } - let val = 1; - let j = 1; - for (let i = n; i > maxDenom; i--) { - val *= i; - if (j <= minDenom) { - val /= j; - j++; - } - } - while ((j <= minDenom)) { - val /= j; - j++; - } - return val; - } - } - - class BitArrayBuilder { - static buildBitArray(pairs) { - let charNumber = (pairs.length * 2) - 1; - if (pairs[pairs.length - 1].getRightChar() == null) { - charNumber -= 1; - } - let size = 12 * charNumber; - let binary = new BitArray(size); - let accPos = 0; - let firstPair = pairs[0]; - let firstValue = firstPair.getRightChar().getValue(); - for (let i = 11; i >= 0; --i) { - if ((firstValue & (1 << i)) != 0) { - binary.set(accPos); - } - accPos++; - } - for (let i = 1; i < pairs.length; ++i) { - let currentPair = pairs[i]; - let leftValue = currentPair.getLeftChar().getValue(); - for (let j = 11; j >= 0; --j) { - if ((leftValue & (1 << j)) != 0) { - binary.set(accPos); - } - accPos++; - } - if (currentPair.getRightChar() != null) { - let rightValue = currentPair.getRightChar().getValue(); - for (let j = 11; j >= 0; --j) { - if ((rightValue & (1 << j)) != 0) { - binary.set(accPos); - } - accPos++; - } - } - } - return binary; - } - } - - class BlockParsedResult { - constructor(finished, decodedInformation) { - if (decodedInformation) { - this.decodedInformation = null; - } - else { - this.finished = finished; - this.decodedInformation = decodedInformation; - } - } - getDecodedInformation() { - return this.decodedInformation; - } - isFinished() { - return this.finished; - } - } - - class DecodedObject { - constructor(newPosition) { - this.newPosition = newPosition; - } - getNewPosition() { - return this.newPosition; - } - } - - class DecodedChar extends DecodedObject { - constructor(newPosition, value) { - super(newPosition); - this.value = value; - } - getValue() { - return this.value; - } - isFNC1() { - return this.value === DecodedChar.FNC1; - } - } - DecodedChar.FNC1 = '$'; - - class DecodedInformation extends DecodedObject { - constructor(newPosition, newString, remainingValue) { - super(newPosition); - if (remainingValue) { - this.remaining = true; - this.remainingValue = this.remainingValue; - } - else { - this.remaining = false; - this.remainingValue = 0; - } - this.newString = newString; - } - getNewString() { - return this.newString; - } - isRemaining() { - return this.remaining; - } - getRemainingValue() { - return this.remainingValue; - } - } - - class DecodedNumeric extends DecodedObject { - constructor(newPosition, firstDigit, secondDigit) { - super(newPosition); - if (firstDigit < 0 || firstDigit > 10 || secondDigit < 0 || secondDigit > 10) { - throw new FormatException(); - } - this.firstDigit = firstDigit; - this.secondDigit = secondDigit; - } - getFirstDigit() { - return this.firstDigit; - } - getSecondDigit() { - return this.secondDigit; - } - getValue() { - return this.firstDigit * 10 + this.secondDigit; - } - isFirstDigitFNC1() { - return this.firstDigit === DecodedNumeric.FNC1; - } - isSecondDigitFNC1() { - return this.secondDigit === DecodedNumeric.FNC1; - } - isAnyFNC1() { - return this.firstDigit === DecodedNumeric.FNC1 || this.secondDigit === DecodedNumeric.FNC1; - } - } - DecodedNumeric.FNC1 = 10; - - class FieldParser { - constructor() { - } - static parseFieldsInGeneralPurpose(rawInformation) { - if (!rawInformation) { - return null; - } - // Processing 2-digit AIs - if (rawInformation.length < 2) { - throw new NotFoundException(); - } - let firstTwoDigits = rawInformation.substring(0, 2); - for (let dataLength of FieldParser.TWO_DIGIT_DATA_LENGTH) { - if (dataLength[0] === firstTwoDigits) { - if (dataLength[1] === FieldParser.VARIABLE_LENGTH) { - return FieldParser.processVariableAI(2, dataLength[2], rawInformation); - } - return FieldParser.processFixedAI(2, dataLength[1], rawInformation); - } - } - if (rawInformation.length < 3) { - throw new NotFoundException(); - } - let firstThreeDigits = rawInformation.substring(0, 3); - for (let dataLength of FieldParser.THREE_DIGIT_DATA_LENGTH) { - if (dataLength[0] === firstThreeDigits) { - if (dataLength[1] === FieldParser.VARIABLE_LENGTH) { - return FieldParser.processVariableAI(3, dataLength[2], rawInformation); - } - return FieldParser.processFixedAI(3, dataLength[1], rawInformation); - } - } - for (let dataLength of FieldParser.THREE_DIGIT_PLUS_DIGIT_DATA_LENGTH) { - if (dataLength[0] === firstThreeDigits) { - if (dataLength[1] === FieldParser.VARIABLE_LENGTH) { - return FieldParser.processVariableAI(4, dataLength[2], rawInformation); - } - return FieldParser.processFixedAI(4, dataLength[1], rawInformation); - } - } - if (rawInformation.length < 4) { - throw new NotFoundException(); - } - let firstFourDigits = rawInformation.substring(0, 4); - for (let dataLength of FieldParser.FOUR_DIGIT_DATA_LENGTH) { - if (dataLength[0] === firstFourDigits) { - if (dataLength[1] === FieldParser.VARIABLE_LENGTH) { - return FieldParser.processVariableAI(4, dataLength[2], rawInformation); - } - return FieldParser.processFixedAI(4, dataLength[1], rawInformation); - } - } - throw new NotFoundException(); - } - static processFixedAI(aiSize, fieldSize, rawInformation) { - if (rawInformation.length < aiSize) { - throw new NotFoundException(); - } - let ai = rawInformation.substring(0, aiSize); - if (rawInformation.length < aiSize + fieldSize) { - throw new NotFoundException(); - } - let field = rawInformation.substring(aiSize, aiSize + fieldSize); - let remaining = rawInformation.substring(aiSize + fieldSize); - let result = '(' + ai + ')' + field; - let parsedAI = FieldParser.parseFieldsInGeneralPurpose(remaining); - return parsedAI == null ? result : result + parsedAI; - } - static processVariableAI(aiSize, variableFieldSize, rawInformation) { - let ai = rawInformation.substring(0, aiSize); - let maxSize; - if (rawInformation.length < aiSize + variableFieldSize) { - maxSize = rawInformation.length; - } - else { - maxSize = aiSize + variableFieldSize; - } - let field = rawInformation.substring(aiSize, maxSize); - let remaining = rawInformation.substring(maxSize); - let result = '(' + ai + ')' + field; - let parsedAI = FieldParser.parseFieldsInGeneralPurpose(remaining); - return parsedAI == null ? result : result + parsedAI; - } - } - FieldParser.VARIABLE_LENGTH = []; - FieldParser.TWO_DIGIT_DATA_LENGTH = [ - ['00', 18], - ['01', 14], - ['02', 14], - ['10', FieldParser.VARIABLE_LENGTH, 20], - ['11', 6], - ['12', 6], - ['13', 6], - ['15', 6], - ['17', 6], - ['20', 2], - ['21', FieldParser.VARIABLE_LENGTH, 20], - ['22', FieldParser.VARIABLE_LENGTH, 29], - ['30', FieldParser.VARIABLE_LENGTH, 8], - ['37', FieldParser.VARIABLE_LENGTH, 8], - // internal company codes - ['90', FieldParser.VARIABLE_LENGTH, 30], - ['91', FieldParser.VARIABLE_LENGTH, 30], - ['92', FieldParser.VARIABLE_LENGTH, 30], - ['93', FieldParser.VARIABLE_LENGTH, 30], - ['94', FieldParser.VARIABLE_LENGTH, 30], - ['95', FieldParser.VARIABLE_LENGTH, 30], - ['96', FieldParser.VARIABLE_LENGTH, 30], - ['97', FieldParser.VARIABLE_LENGTH, 3], - ['98', FieldParser.VARIABLE_LENGTH, 30], - ['99', FieldParser.VARIABLE_LENGTH, 30], - ]; - FieldParser.THREE_DIGIT_DATA_LENGTH = [ - // Same format as above - ['240', FieldParser.VARIABLE_LENGTH, 30], - ['241', FieldParser.VARIABLE_LENGTH, 30], - ['242', FieldParser.VARIABLE_LENGTH, 6], - ['250', FieldParser.VARIABLE_LENGTH, 30], - ['251', FieldParser.VARIABLE_LENGTH, 30], - ['253', FieldParser.VARIABLE_LENGTH, 17], - ['254', FieldParser.VARIABLE_LENGTH, 20], - ['400', FieldParser.VARIABLE_LENGTH, 30], - ['401', FieldParser.VARIABLE_LENGTH, 30], - ['402', 17], - ['403', FieldParser.VARIABLE_LENGTH, 30], - ['410', 13], - ['411', 13], - ['412', 13], - ['413', 13], - ['414', 13], - ['420', FieldParser.VARIABLE_LENGTH, 20], - ['421', FieldParser.VARIABLE_LENGTH, 15], - ['422', 3], - ['423', FieldParser.VARIABLE_LENGTH, 15], - ['424', 3], - ['425', 3], - ['426', 3], - ]; - FieldParser.THREE_DIGIT_PLUS_DIGIT_DATA_LENGTH = [ - // Same format as above - ['310', 6], - ['311', 6], - ['312', 6], - ['313', 6], - ['314', 6], - ['315', 6], - ['316', 6], - ['320', 6], - ['321', 6], - ['322', 6], - ['323', 6], - ['324', 6], - ['325', 6], - ['326', 6], - ['327', 6], - ['328', 6], - ['329', 6], - ['330', 6], - ['331', 6], - ['332', 6], - ['333', 6], - ['334', 6], - ['335', 6], - ['336', 6], - ['340', 6], - ['341', 6], - ['342', 6], - ['343', 6], - ['344', 6], - ['345', 6], - ['346', 6], - ['347', 6], - ['348', 6], - ['349', 6], - ['350', 6], - ['351', 6], - ['352', 6], - ['353', 6], - ['354', 6], - ['355', 6], - ['356', 6], - ['357', 6], - ['360', 6], - ['361', 6], - ['362', 6], - ['363', 6], - ['364', 6], - ['365', 6], - ['366', 6], - ['367', 6], - ['368', 6], - ['369', 6], - ['390', FieldParser.VARIABLE_LENGTH, 15], - ['391', FieldParser.VARIABLE_LENGTH, 18], - ['392', FieldParser.VARIABLE_LENGTH, 15], - ['393', FieldParser.VARIABLE_LENGTH, 18], - ['703', FieldParser.VARIABLE_LENGTH, 30], - ]; - FieldParser.FOUR_DIGIT_DATA_LENGTH = [ - // Same format as above - ['7001', 13], - ['7002', FieldParser.VARIABLE_LENGTH, 30], - ['7003', 10], - ['8001', 14], - ['8002', FieldParser.VARIABLE_LENGTH, 20], - ['8003', FieldParser.VARIABLE_LENGTH, 30], - ['8004', FieldParser.VARIABLE_LENGTH, 30], - ['8005', 6], - ['8006', 18], - ['8007', FieldParser.VARIABLE_LENGTH, 30], - ['8008', FieldParser.VARIABLE_LENGTH, 12], - ['8018', 18], - ['8020', FieldParser.VARIABLE_LENGTH, 25], - ['8100', 6], - ['8101', 10], - ['8102', 2], - ['8110', FieldParser.VARIABLE_LENGTH, 70], - ['8200', FieldParser.VARIABLE_LENGTH, 70], - ]; - - class GeneralAppIdDecoder { - constructor(information) { - this.buffer = new StringBuilder(); - this.information = information; - } - decodeAllCodes(buff, initialPosition) { - let currentPosition = initialPosition; - let remaining = null; - do { - let info = this.decodeGeneralPurposeField(currentPosition, remaining); - let parsedFields = FieldParser.parseFieldsInGeneralPurpose(info.getNewString()); - if (parsedFields != null) { - buff.append(parsedFields); - } - if (info.isRemaining()) { - remaining = '' + info.getRemainingValue(); - } - else { - remaining = null; - } - if (currentPosition === info.getNewPosition()) { // No step forward! - break; - } - currentPosition = info.getNewPosition(); - } while (true); - return buff.toString(); - } - isStillNumeric(pos) { - // It's numeric if it still has 7 positions - // and one of the first 4 bits is "1". - if (pos + 7 > this.information.getSize()) { - return pos + 4 <= this.information.getSize(); - } - for (let i = pos; i < pos + 3; ++i) { - if (this.information.get(i)) { - return true; - } - } - return this.information.get(pos + 3); - } - decodeNumeric(pos) { - if (pos + 7 > this.information.getSize()) { - let numeric = this.extractNumericValueFromBitArray(pos, 4); - if (numeric === 0) { - return new DecodedNumeric(this.information.getSize(), DecodedNumeric.FNC1, DecodedNumeric.FNC1); - } - return new DecodedNumeric(this.information.getSize(), numeric - 1, DecodedNumeric.FNC1); - } - let numeric = this.extractNumericValueFromBitArray(pos, 7); - let digit1 = (numeric - 8) / 11; - let digit2 = (numeric - 8) % 11; - return new DecodedNumeric(pos + 7, digit1, digit2); - } - extractNumericValueFromBitArray(pos, bits) { - return GeneralAppIdDecoder.extractNumericValueFromBitArray(this.information, pos, bits); - } - static extractNumericValueFromBitArray(information, pos, bits) { - let value = 0; - for (let i = 0; i < bits; ++i) { - if (information.get(pos + i)) { - value |= 1 << (bits - i - 1); - } - } - return value; - } - decodeGeneralPurposeField(pos, remaining) { - // this.buffer.setLength(0); - this.buffer.setLengthToZero(); - if (remaining != null) { - this.buffer.append(remaining); - } - this.current.setPosition(pos); - let lastDecoded = this.parseBlocks(); - if (lastDecoded != null && lastDecoded.isRemaining()) { - return new DecodedInformation(this.current.getPosition(), this.buffer.toString(), lastDecoded.getRemainingValue()); - } - return new DecodedInformation(this.current.getPosition(), this.buffer.toString()); - } - parseBlocks() { - let isFinished; - let result; - do { - let initialPosition = this.current.getPosition(); - if (this.current.isAlpha()) { - result = this.parseAlphaBlock(); - isFinished = result.isFinished(); - } - else if (this.current.isIsoIec646()) { - result = this.parseIsoIec646Block(); - isFinished = result.isFinished(); - } - else { // it must be numeric - result = this.parseNumericBlock(); - isFinished = result.isFinished(); - } - let positionChanged = initialPosition !== this.current.getPosition(); - if (!positionChanged && !isFinished) { - break; - } - } while (!isFinished); - return result.getDecodedInformation(); - } - parseNumericBlock() { - while (this.isStillNumeric(this.current.getPosition())) { - let numeric = this.decodeNumeric(this.current.getPosition()); - this.current.setPosition(numeric.getNewPosition()); - if (numeric.isFirstDigitFNC1()) { - let information; - if (numeric.isSecondDigitFNC1()) { - information = new DecodedInformation(this.current.getPosition(), this.buffer.toString()); - } - else { - information = new DecodedInformation(this.current.getPosition(), this.buffer.toString(), numeric.getSecondDigit()); - } - return new BlockParsedResult(true, information); - } - this.buffer.append(numeric.getFirstDigit()); - if (numeric.isSecondDigitFNC1()) { - let information = new DecodedInformation(this.current.getPosition(), this.buffer.toString()); - return new BlockParsedResult(true, information); - } - this.buffer.append(numeric.getSecondDigit()); - } - if (this.isNumericToAlphaNumericLatch(this.current.getPosition())) { - this.current.setAlpha(); - this.current.incrementPosition(4); - } - return new BlockParsedResult(false); - } - parseIsoIec646Block() { - while (this.isStillIsoIec646(this.current.getPosition())) { - let iso = this.decodeIsoIec646(this.current.getPosition()); - this.current.setPosition(iso.getNewPosition()); - if (iso.isFNC1()) { - let information = new DecodedInformation(this.current.getPosition(), this.buffer.toString()); - return new BlockParsedResult(true, information); - } - this.buffer.append(iso.getValue()); - } - if (this.isAlphaOr646ToNumericLatch(this.current.getPosition())) { - this.current.incrementPosition(3); - this.current.setNumeric(); - } - else if (this.isAlphaTo646ToAlphaLatch(this.current.getPosition())) { - if (this.current.getPosition() + 5 < this.information.getSize()) { - this.current.incrementPosition(5); - } - else { - this.current.setPosition(this.information.getSize()); - } - this.current.setAlpha(); - } - return new BlockParsedResult(false); - } - parseAlphaBlock() { - while (this.isStillAlpha(this.current.getPosition())) { - let alpha = this.decodeAlphanumeric(this.current.getPosition()); - this.current.setPosition(alpha.getNewPosition()); - if (alpha.isFNC1()) { - let information = new DecodedInformation(this.current.getPosition(), this.buffer.toString()); - return new BlockParsedResult(true, information); // end of the char block - } - this.buffer.append(alpha.getValue()); - } - if (this.isAlphaOr646ToNumericLatch(this.current.getPosition())) { - this.current.incrementPosition(3); - this.current.setNumeric(); - } - else if (this.isAlphaTo646ToAlphaLatch(this.current.getPosition())) { - if (this.current.getPosition() + 5 < this.information.getSize()) { - this.current.incrementPosition(5); - } - else { - this.current.setPosition(this.information.getSize()); - } - this.current.setIsoIec646(); - } - return new BlockParsedResult(false); - } - isStillIsoIec646(pos) { - if (pos + 5 > this.information.getSize()) { - return false; - } - let fiveBitValue = this.extractNumericValueFromBitArray(pos, 5); - if (fiveBitValue >= 5 && fiveBitValue < 16) { - return true; - } - if (pos + 7 > this.information.getSize()) { - return false; - } - let sevenBitValue = this.extractNumericValueFromBitArray(pos, 7); - if (sevenBitValue >= 64 && sevenBitValue < 116) { - return true; - } - if (pos + 8 > this.information.getSize()) { - return false; - } - let eightBitValue = this.extractNumericValueFromBitArray(pos, 8); - return eightBitValue >= 232 && eightBitValue < 253; - } - decodeIsoIec646(pos) { - let fiveBitValue = this.extractNumericValueFromBitArray(pos, 5); - if (fiveBitValue === 15) { - return new DecodedChar(pos + 5, DecodedChar.FNC1); - } - if (fiveBitValue >= 5 && fiveBitValue < 15) { - return new DecodedChar(pos + 5, ('0' + (fiveBitValue - 5))); - } - let sevenBitValue = this.extractNumericValueFromBitArray(pos, 7); - if (sevenBitValue >= 64 && sevenBitValue < 90) { - return new DecodedChar(pos + 7, ('' + (sevenBitValue + 1))); - } - if (sevenBitValue >= 90 && sevenBitValue < 116) { - return new DecodedChar(pos + 7, ('' + (sevenBitValue + 7))); - } - let eightBitValue = this.extractNumericValueFromBitArray(pos, 8); - let c; - switch (eightBitValue) { - case 232: - c = '!'; - break; - case 233: - c = '"'; - break; - case 234: - c = '%'; - break; - case 235: - c = '&'; - break; - case 236: - c = '\''; - break; - case 237: - c = '('; - break; - case 238: - c = ')'; - break; - case 239: - c = '*'; - break; - case 240: - c = '+'; - break; - case 241: - c = ','; - break; - case 242: - c = '-'; - break; - case 243: - c = '.'; - break; - case 244: - c = '/'; - break; - case 245: - c = ':'; - break; - case 246: - c = ';'; - break; - case 247: - c = '<'; - break; - case 248: - c = '='; - break; - case 249: - c = '>'; - break; - case 250: - c = '?'; - break; - case 251: - c = '_'; - break; - case 252: - c = ' '; - break; - default: - throw new FormatException(); - } - return new DecodedChar(pos + 8, c); - } - isStillAlpha(pos) { - if (pos + 5 > this.information.getSize()) { - return false; - } - // We now check if it's a valid 5-bit value (0..9 and FNC1) - let fiveBitValue = this.extractNumericValueFromBitArray(pos, 5); - if (fiveBitValue >= 5 && fiveBitValue < 16) { - return true; - } - if (pos + 6 > this.information.getSize()) { - return false; - } - let sixBitValue = this.extractNumericValueFromBitArray(pos, 6); - return sixBitValue >= 16 && sixBitValue < 63; // 63 not included - } - decodeAlphanumeric(pos) { - let fiveBitValue = this.extractNumericValueFromBitArray(pos, 5); - if (fiveBitValue === 15) { - return new DecodedChar(pos + 5, DecodedChar.FNC1); - } - if (fiveBitValue >= 5 && fiveBitValue < 15) { - return new DecodedChar(pos + 5, ('0' + (fiveBitValue - 5))); - } - let sixBitValue = this.extractNumericValueFromBitArray(pos, 6); - if (sixBitValue >= 32 && sixBitValue < 58) { - return new DecodedChar(pos + 6, ('' + (sixBitValue + 33))); - } - let c; - switch (sixBitValue) { - case 58: - c = '*'; - break; - case 59: - c = ','; - break; - case 60: - c = '-'; - break; - case 61: - c = '.'; - break; - case 62: - c = '/'; - break; - default: - throw new IllegalStateException('Decoding invalid alphanumeric value: ' + sixBitValue); - } - return new DecodedChar(pos + 6, c); - } - isAlphaTo646ToAlphaLatch(pos) { - if (pos + 1 > this.information.getSize()) { - return false; - } - for (let i = 0; i < 5 && i + pos < this.information.getSize(); ++i) { - if (i === 2) { - if (!this.information.get(pos + 2)) { - return false; - } - } - else if (this.information.get(pos + i)) { - return false; - } - } - return true; - } - isAlphaOr646ToNumericLatch(pos) { - // Next is alphanumeric if there are 3 positions and they are all zeros - if (pos + 3 > this.information.getSize()) { - return false; - } - for (let i = pos; i < pos + 3; ++i) { - if (this.information.get(i)) { - return false; - } - } - return true; - } - isNumericToAlphaNumericLatch(pos) { - // Next is alphanumeric if there are 4 positions and they are all zeros, or - // if there is a subset of this just before the end of the symbol - if (pos + 1 > this.information.getSize()) { - return false; - } - for (let i = 0; i < 4 && i + pos < this.information.getSize(); ++i) { - if (this.information.get(pos + i)) { - return false; - } - } - return true; - } - } - - class AbstractExpandedDecoder { - constructor(information) { - this.information = information; - this.generalDecoder = new GeneralAppIdDecoder(information); - } - getInformation() { - return this.information; - } - getGeneralDecoder() { - return this.generalDecoder; - } - } - - class AI01decoder extends AbstractExpandedDecoder { - constructor(information) { - super(information); - } - encodeCompressedGtin(buf, currentPos) { - buf.append('(01)'); - let initialPosition = buf.length(); - buf.append('9'); - this.encodeCompressedGtinWithoutAI(buf, currentPos, initialPosition); - } - encodeCompressedGtinWithoutAI(buf, currentPos, initialBufferPosition) { - for (let i = 0; i < 4; ++i) { - let currentBlock = this.getGeneralDecoder().extractNumericValueFromBitArray(currentPos + 10 * i, 10); - if (currentBlock / 100 === 0) { - buf.append('0'); - } - if (currentBlock / 10 === 0) { - buf.append('0'); - } - buf.append(currentBlock); - } - AI01decoder.appendCheckDigit(buf, initialBufferPosition); - } - static appendCheckDigit(buf, currentPos) { - let checkDigit = 0; - for (let i = 0; i < 13; i++) { - // let digit = buf.charAt(i + currentPos) - '0'; - // To be checked - let digit = buf.charAt(i + currentPos).charCodeAt(0) - '0'.charCodeAt(0); - checkDigit += (i & 0x01) === 0 ? 3 * digit : digit; - } - checkDigit = 10 - (checkDigit % 10); - if (checkDigit === 10) { - checkDigit = 0; - } - buf.append(checkDigit); - } - } - AI01decoder.GTIN_SIZE = 40; - - class AI01AndOtherAIs extends AI01decoder { - // the second one is the encodation method, and the other two are for the variable length - constructor(information) { - super(information); - } - parseInformation() { - let buff = new StringBuilder(); - buff.append('(01)'); - let initialGtinPosition = buff.length(); - let firstGtinDigit = this.getGeneralDecoder().extractNumericValueFromBitArray(AI01AndOtherAIs.HEADER_SIZE, 4); - buff.append(firstGtinDigit); - this.encodeCompressedGtinWithoutAI(buff, AI01AndOtherAIs.HEADER_SIZE + 4, initialGtinPosition); - return this.getGeneralDecoder().decodeAllCodes(buff, AI01AndOtherAIs.HEADER_SIZE + 44); - } - } - AI01AndOtherAIs.HEADER_SIZE = 1 + 1 + 2; // first bit encodes the linkage flag, - - class AnyAIDecoder extends AbstractExpandedDecoder { - constructor(information) { - super(information); - } - parseInformation() { - let buf = new StringBuilder(); - return this.getGeneralDecoder().decodeAllCodes(buf, AnyAIDecoder.HEADER_SIZE); - } - } - AnyAIDecoder.HEADER_SIZE = 2 + 1 + 2; - - class AI01weightDecoder extends AI01decoder { - constructor(information) { - super(information); - } - encodeCompressedWeight(buf, currentPos, weightSize) { - let originalWeightNumeric = this.getGeneralDecoder().extractNumericValueFromBitArray(currentPos, weightSize); - this.addWeightCode(buf, originalWeightNumeric); - let weightNumeric = this.checkWeight(originalWeightNumeric); - let currentDivisor = 100000; - for (let i = 0; i < 5; ++i) { - if (weightNumeric / currentDivisor === 0) { - buf.append('0'); - } - currentDivisor /= 10; - } - buf.append(weightNumeric); - } - } - - class AI013x0xDecoder extends AI01weightDecoder { - constructor(information) { - super(information); - } - parseInformation() { - if (this.getInformation().getSize() != AI013x0xDecoder.HEADER_SIZE + AI01weightDecoder.GTIN_SIZE + AI013x0xDecoder.WEIGHT_SIZE) { - throw new NotFoundException(); - } - let buf = new StringBuilder(); - this.encodeCompressedGtin(buf, AI013x0xDecoder.HEADER_SIZE); - this.encodeCompressedWeight(buf, AI013x0xDecoder.HEADER_SIZE + AI01weightDecoder.GTIN_SIZE, AI013x0xDecoder.WEIGHT_SIZE); - return buf.toString(); - } - } - AI013x0xDecoder.HEADER_SIZE = 4 + 1; - AI013x0xDecoder.WEIGHT_SIZE = 15; - - class AI013103decoder extends AI013x0xDecoder { - constructor(information) { - super(information); - } - addWeightCode(buf, weight) { - buf.append('(3103)'); - } - checkWeight(weight) { - return weight; - } - } - - class AI01320xDecoder extends AI013x0xDecoder { - constructor(information) { - super(information); - } - addWeightCode(buf, weight) { - if (weight < 10000) { - buf.append('(3202)'); - } - else { - buf.append('(3203)'); - } - } - checkWeight(weight) { - if (weight < 10000) { - return weight; - } - return weight - 10000; - } - } - - class AI01392xDecoder extends AI01decoder { - constructor(information) { - super(information); - } - parseInformation() { - if (this.getInformation().getSize() < AI01392xDecoder.HEADER_SIZE + AI01decoder.GTIN_SIZE) { - throw new NotFoundException(); - } - let buf = new StringBuilder(); - this.encodeCompressedGtin(buf, AI01392xDecoder.HEADER_SIZE); - let lastAIdigit = this.getGeneralDecoder().extractNumericValueFromBitArray(AI01392xDecoder.HEADER_SIZE + AI01decoder.GTIN_SIZE, AI01392xDecoder.LAST_DIGIT_SIZE); - buf.append('(392'); - buf.append(lastAIdigit); - buf.append(')'); - let decodedInformation = this.getGeneralDecoder().decodeGeneralPurposeField(AI01392xDecoder.HEADER_SIZE + AI01decoder.GTIN_SIZE + AI01392xDecoder.LAST_DIGIT_SIZE, null); - buf.append(decodedInformation.getNewString()); - return buf.toString(); - } - } - AI01392xDecoder.HEADER_SIZE = 5 + 1 + 2; - AI01392xDecoder.LAST_DIGIT_SIZE = 2; - - class AI01393xDecoder extends AI01decoder { - constructor(information) { - super(information); - } - parseInformation() { - if (this.getInformation().getSize() < AI01393xDecoder.HEADER_SIZE + AI01decoder.GTIN_SIZE) { - throw new NotFoundException(); - } - let buf = new StringBuilder(); - this.encodeCompressedGtin(buf, AI01393xDecoder.HEADER_SIZE); - let lastAIdigit = this.getGeneralDecoder().extractNumericValueFromBitArray(AI01393xDecoder.HEADER_SIZE + AI01decoder.GTIN_SIZE, AI01393xDecoder.LAST_DIGIT_SIZE); - buf.append('(393'); - buf.append(lastAIdigit); - buf.append(')'); - let firstThreeDigits = this.getGeneralDecoder().extractNumericValueFromBitArray(AI01393xDecoder.HEADER_SIZE + AI01decoder.GTIN_SIZE + AI01393xDecoder.LAST_DIGIT_SIZE, AI01393xDecoder.FIRST_THREE_DIGITS_SIZE); - if (firstThreeDigits / 100 == 0) { - buf.append('0'); - } - if (firstThreeDigits / 10 == 0) { - buf.append('0'); - } - buf.append(firstThreeDigits); - let generalInformation = this.getGeneralDecoder().decodeGeneralPurposeField(AI01393xDecoder.HEADER_SIZE + AI01decoder.GTIN_SIZE + AI01393xDecoder.LAST_DIGIT_SIZE + AI01393xDecoder.FIRST_THREE_DIGITS_SIZE, null); - buf.append(generalInformation.getNewString()); - return buf.toString(); - } - } - AI01393xDecoder.HEADER_SIZE = 5 + 1 + 2; - AI01393xDecoder.LAST_DIGIT_SIZE = 2; - AI01393xDecoder.FIRST_THREE_DIGITS_SIZE = 10; - - class AI013x0x1xDecoder extends AI01weightDecoder { - constructor(information, firstAIdigits, dateCode) { - super(information); - this.dateCode = dateCode; - this.firstAIdigits = firstAIdigits; - } - parseInformation() { - if (this.getInformation().getSize() != AI013x0x1xDecoder.HEADER_SIZE + AI013x0x1xDecoder.GTIN_SIZE + AI013x0x1xDecoder.WEIGHT_SIZE + AI013x0x1xDecoder.DATE_SIZE) { - throw new NotFoundException(); - } - let buf = new StringBuilder(); - this.encodeCompressedGtin(buf, AI013x0x1xDecoder.HEADER_SIZE); - this.encodeCompressedWeight(buf, AI013x0x1xDecoder.HEADER_SIZE + AI013x0x1xDecoder.GTIN_SIZE, AI013x0x1xDecoder.WEIGHT_SIZE); - this.encodeCompressedDate(buf, AI013x0x1xDecoder.HEADER_SIZE + AI013x0x1xDecoder.GTIN_SIZE + AI013x0x1xDecoder.WEIGHT_SIZE); - return buf.toString(); - } - encodeCompressedDate(buf, currentPos) { - let numericDate = this.getGeneralDecoder().extractNumericValueFromBitArray(currentPos, AI013x0x1xDecoder.DATE_SIZE); - if (numericDate == 38400) { - return; - } - buf.append('('); - buf.append(this.dateCode); - buf.append(')'); - let day = numericDate % 32; - numericDate /= 32; - let month = numericDate % 12 + 1; - numericDate /= 12; - let year = numericDate; - if (year / 10 == 0) { - buf.append('0'); - } - buf.append(year); - if (month / 10 == 0) { - buf.append('0'); - } - buf.append(month); - if (day / 10 == 0) { - buf.append('0'); - } - buf.append(day); - } - addWeightCode(buf, weight) { - buf.append('('); - buf.append(this.firstAIdigits); - buf.append(weight / 100000); - buf.append(')'); - } - checkWeight(weight) { - return weight % 100000; - } - } - AI013x0x1xDecoder.HEADER_SIZE = 7 + 1; - AI013x0x1xDecoder.WEIGHT_SIZE = 20; - AI013x0x1xDecoder.DATE_SIZE = 16; - - function createDecoder(information) { - try { - if (information.get(1)) { - return new AI01AndOtherAIs(information); - } - if (!information.get(2)) { - return new AnyAIDecoder(information); - } - let fourBitEncodationMethod = GeneralAppIdDecoder.extractNumericValueFromBitArray(information, 1, 4); - switch (fourBitEncodationMethod) { - case 4: return new AI013103decoder(information); - case 5: return new AI01320xDecoder(information); - } - let fiveBitEncodationMethod = GeneralAppIdDecoder.extractNumericValueFromBitArray(information, 1, 5); - switch (fiveBitEncodationMethod) { - case 12: return new AI01392xDecoder(information); - case 13: return new AI01393xDecoder(information); - } - let sevenBitEncodationMethod = GeneralAppIdDecoder.extractNumericValueFromBitArray(information, 1, 7); - switch (sevenBitEncodationMethod) { - case 56: return new AI013x0x1xDecoder(information, '310', '11'); - case 57: return new AI013x0x1xDecoder(information, '320', '11'); - case 58: return new AI013x0x1xDecoder(information, '310', '13'); - case 59: return new AI013x0x1xDecoder(information, '320', '13'); - case 60: return new AI013x0x1xDecoder(information, '310', '15'); - case 61: return new AI013x0x1xDecoder(information, '320', '15'); - case 62: return new AI013x0x1xDecoder(information, '310', '17'); - case 63: return new AI013x0x1xDecoder(information, '320', '17'); - } - } - catch (e) { - console.log(e); - throw new IllegalStateException('unknown decoder: ' + information); - } - } - - class ExpandedPair { - constructor(leftChar, rightChar, finderPatter, mayBeLast) { - this.leftchar = leftChar; - this.rightchar = rightChar; - this.finderpattern = finderPatter; - this.maybeLast = mayBeLast; - } - mayBeLast() { - return this.maybeLast; - } - getLeftChar() { - return this.leftchar; - } - getRightChar() { - return this.rightchar; - } - getFinderPattern() { - return this.finderpattern; - } - mustBeLast() { - return this.rightchar == null; - } - toString() { - return '[ ' + this.leftchar + ', ' + this.rightchar + ' : ' + (this.finderpattern == null ? 'null' : this.finderpattern.getValue()) + ' ]'; - } - static equals(o1, o2) { - if (!(o1 instanceof ExpandedPair)) { - return false; - } - return ExpandedPair.equalsOrNull(o1.leftchar, o2.leftchar) && - ExpandedPair.equalsOrNull(o1.rightchar, o2.rightchar) && - ExpandedPair.equalsOrNull(o1.finderpattern, o2.finderpattern); - } - static equalsOrNull(o1, o2) { - return o1 === null ? o2 === null : ExpandedPair.equals(o1, o2); - } - hashCode() { - // return ExpandedPair.hashNotNull(leftChar) ^ hashNotNull(rightChar) ^ hashNotNull(finderPattern); - let value = this.leftchar.getValue() ^ this.rightchar.getValue() ^ this.finderpattern.getValue(); - return value; - } - } - - class ExpandedRow { - constructor(pairs, rowNumber, wasReversed) { - this.pairs = pairs; - this.rowNumber = rowNumber; - this.wasReversed = wasReversed; - } - getPairs() { - return this.pairs; - } - getRowNumber() { - return this.rowNumber; - } - isReversed() { - return this.wasReversed; - } - // check implementation - isEquivalent(otherPairs) { - return this.checkEqualitity(this, otherPairs); - } - // @Override - toString() { - return '{ ' + this.pairs + ' }'; - } - /** - * Two rows are equal if they contain the same pairs in the same order. - */ - // @Override - // check implementation - equals(o1, o2) { - if (!(o1 instanceof ExpandedRow)) { - return false; - } - return this.checkEqualitity(o1, o2) && o1.wasReversed === o2.wasReversed; - } - checkEqualitity(pair1, pair2) { - if (!pair1 || !pair2) - return; - let result; - pair1.forEach((e1, i) => { - pair2.forEach(e2 => { - if (e1.getLeftChar().getValue() === e2.getLeftChar().getValue() && e1.getRightChar().getValue() === e2.getRightChar().getValue() && e1.getFinderPatter().getValue() === e2.getFinderPatter().getValue()) { - result = true; - } - }); - }); - return result; - } - } - - // import java.util.ArrayList; - // import java.util.Iterator; - // import java.util.List; - // import java.util.Map; - // import java.util.Collections; - class RSSExpandedReader extends AbstractRSSReader { - constructor(verbose) { - super(...arguments); - this.pairs = new Array(RSSExpandedReader.MAX_PAIRS); - this.rows = new Array(); - this.startEnd = [2]; - this.verbose = (verbose === true); - } - decodeRow(rowNumber, row, hints) { - // Rows can start with even pattern in case in prev rows there where odd number of patters. - // So lets try twice - // this.pairs.clear(); - this.pairs.length = 0; - this.startFromEven = false; - try { - return RSSExpandedReader.constructResult(this.decodeRow2pairs(rowNumber, row)); - } - catch (e) { - // OK - if (this.verbose) { - console.log(e); - } - } - this.pairs.length = 0; - this.startFromEven = true; - return RSSExpandedReader.constructResult(this.decodeRow2pairs(rowNumber, row)); - } - reset() { - this.pairs.length = 0; - this.rows.length = 0; - } - // Not private for testing - decodeRow2pairs(rowNumber, row) { - let done = false; - while (!done) { - try { - this.pairs.push(this.retrieveNextPair(row, this.pairs, rowNumber)); - } - catch (error) { - if (error instanceof NotFoundException) { - if (!this.pairs.length) { - throw new NotFoundException(); - } - // exit this loop when retrieveNextPair() fails and throws - done = true; - } - } - } - // TODO: verify sequence of finder patterns as in checkPairSequence() - if (this.checkChecksum()) { - return this.pairs; - } - let tryStackedDecode; - if (this.rows.length) { - tryStackedDecode = true; - } - else { - tryStackedDecode = false; - } - // let tryStackedDecode = !this.rows.isEmpty(); - this.storeRow(rowNumber, false); // TODO: deal with reversed rows - if (tryStackedDecode) { - // When the image is 180-rotated, then rows are sorted in wrong direction. - // Try twice with both the directions. - let ps = this.checkRowsBoolean(false); - if (ps != null) { - return ps; - } - ps = this.checkRowsBoolean(true); - if (ps != null) { - return ps; - } - } - throw new NotFoundException(); - } - // Need to Verify - checkRowsBoolean(reverse) { - // Limit number of rows we are checking - // We use recursive algorithm with pure complexity and don't want it to take forever - // Stacked barcode can have up to 11 rows, so 25 seems reasonable enough - if (this.rows.length > 25) { - this.rows.length = 0; // We will never have a chance to get result, so clear it - return null; - } - this.pairs.length = 0; - if (reverse) { - this.rows = this.rows.reverse(); - // Collections.reverse(this.rows); - } - let ps = null; - try { - ps = this.checkRows(new Array(), 0); - } - catch (e) { - // OK - if (this.verbose) { - console.log(e); - } - } - if (reverse) { - this.rows = this.rows.reverse(); - // Collections.reverse(this.rows); - } - return ps; - } - // Try to construct a valid rows sequence - // Recursion is used to implement backtracking - checkRows(collectedRows, currentRow) { - for (let i = currentRow; i < this.rows.length; i++) { - let row = this.rows[i]; - this.pairs.length = 0; - for (let collectedRow of collectedRows) { - this.pairs.push(collectedRow.getPairs()); - } - this.pairs.push(row.getPairs()); - if (!RSSExpandedReader.isValidSequence(this.pairs)) { - continue; - } - if (this.checkChecksum()) { - return this.pairs; - } - let rs = new Array(collectedRows); - rs.push(row); - try { - // Recursion: try to add more rows - return this.checkRows(rs, i + 1); - } - catch (e) { - // We failed, try the next candidate - if (this.verbose) { - console.log(e); - } - } - } - throw new NotFoundException(); - } - // Whether the pairs form a valid find pattern sequence, - // either complete or a prefix - static isValidSequence(pairs) { - for (let sequence of RSSExpandedReader.FINDER_PATTERN_SEQUENCES) { - if (pairs.length > sequence.length) { - continue; - } - let stop = true; - for (let j = 0; j < pairs.length; j++) { - if (pairs[j].getFinderPattern().getValue() != sequence[j]) { - stop = false; - break; - } - } - if (stop) { - return true; - } - } - return false; - } - storeRow(rowNumber, wasReversed) { - // Discard if duplicate above or below; otherwise insert in order by row number. - let insertPos = 0; - let prevIsSame = false; - let nextIsSame = false; - while (insertPos < this.rows.length) { - let erow = this.rows[insertPos]; - if (erow.getRowNumber() > rowNumber) { - nextIsSame = erow.isEquivalent(this.pairs); - break; - } - prevIsSame = erow.isEquivalent(this.pairs); - insertPos++; - } - if (nextIsSame || prevIsSame) { - return; - } - // When the row was partially decoded (e.g. 2 pairs found instead of 3), - // it will prevent us from detecting the barcode. - // Try to merge partial rows - // Check whether the row is part of an allready detected row - if (RSSExpandedReader.isPartialRow(this.pairs, this.rows)) { - return; - } - this.rows.push(insertPos, new ExpandedRow(this.pairs, rowNumber, wasReversed)); - this.removePartialRows(this.pairs, this.rows); - } - // Remove all the rows that contains only specified pairs - removePartialRows(pairs, rows) { - // for (Iterator iterator = rows.iterator(); iterator.hasNext();) { - // ExpandedRow r = iterator.next(); - // if (r.getPairs().size() == pairs.size()) { - // continue; - // } - // boolean allFound = true; - // for (ExpandedPair p : r.getPairs()) { - // boolean found = false; - // for (ExpandedPair pp : pairs) { - // if (p.equals(pp)) { - // found = true; - // break; - // } - // } - // if (!found) { - // allFound = false; - // break; - // } - // } - // if (allFound) { - // // 'pairs' contains all the pairs from the row 'r' - // iterator.remove(); - // } - // } - for (let row of rows) { - if (row.getPairs().length === pairs.length) { - continue; - } - for (let p of row.getPairs()) { - for (let pp of pairs) { - if (ExpandedPair.equals(p, pp)) { - break; - } - } - } - } - } - // Returns true when one of the rows already contains all the pairs - static isPartialRow(pairs, rows) { - for (let r of rows) { - let allFound = true; - for (let p of pairs) { - let found = false; - for (let pp of r.getPairs()) { - if (p.equals(pp)) { - found = true; - break; - } - } - if (!found) { - allFound = false; - break; - } - } - if (allFound) { - // the row 'r' contain all the pairs from 'pairs' - return true; - } - } - return false; - } - // Only used for unit testing - getRows() { - return this.rows; - } - // Not private for unit testing - static constructResult(pairs) { - let binary = BitArrayBuilder.buildBitArray(pairs); - let decoder = createDecoder(binary); - let resultingString = decoder.parseInformation(); - let firstPoints = pairs[0].getFinderPattern().getResultPoints(); - let lastPoints = pairs[pairs.length - 1].getFinderPattern().getResultPoints(); - let points = [firstPoints[0], firstPoints[1], lastPoints[0], lastPoints[1]]; - return new Result(resultingString, null, null, points, BarcodeFormat$1.RSS_EXPANDED, null); - } - checkChecksum() { - let firstPair = this.pairs.get(0); - let checkCharacter = firstPair.getLeftChar(); - let firstCharacter = firstPair.getRightChar(); - if (firstCharacter == null) { - return false; - } - let checksum = firstCharacter.getChecksumPortion(); - let s = 2; - for (let i = 1; i < this.pairs.size(); ++i) { - let currentPair = this.pairs.get(i); - checksum += currentPair.getLeftChar().getChecksumPortion(); - s++; - let currentRightChar = currentPair.getRightChar(); - if (currentRightChar != null) { - checksum += currentRightChar.getChecksumPortion(); - s++; - } - } - checksum %= 211; - let checkCharacterValue = 211 * (s - 4) + checksum; - return checkCharacterValue == checkCharacter.getValue(); - } - static getNextSecondBar(row, initialPos) { - let currentPos; - if (row.get(initialPos)) { - currentPos = row.getNextUnset(initialPos); - currentPos = row.getNextSet(currentPos); - } - else { - currentPos = row.getNextSet(initialPos); - currentPos = row.getNextUnset(currentPos); - } - return currentPos; - } - // not private for testing - retrieveNextPair(row, previousPairs, rowNumber) { - let isOddPattern = previousPairs.length % 2 == 0; - if (this.startFromEven) { - isOddPattern = !isOddPattern; - } - let pattern; - let keepFinding = true; - let forcedOffset = -1; - do { - this.findNextPair(row, previousPairs, forcedOffset); - pattern = this.parseFoundFinderPattern(row, rowNumber, isOddPattern); - if (pattern == null) { - forcedOffset = RSSExpandedReader.getNextSecondBar(row, this.startEnd[0]); - } - else { - keepFinding = false; - } - } while (keepFinding); - // When stacked symbol is split over multiple rows, there's no way to guess if this pair can be last or not. - // boolean mayBeLast = checkPairSequence(previousPairs, pattern); - let leftChar = this.decodeDataCharacter(row, pattern, isOddPattern, true); - if (!this.isEmptyPair(previousPairs) && previousPairs[previousPairs.length - 1].mustBeLast()) { - throw new NotFoundException(); - } - let rightChar; - try { - rightChar = this.decodeDataCharacter(row, pattern, isOddPattern, false); - } - catch (e) { - rightChar = null; - if (this.verbose) { - console.log(e); - } - } - return new ExpandedPair(leftChar, rightChar, pattern, true); - } - isEmptyPair(pairs) { - if (pairs.length === 0) { - return true; - } - return false; - } - findNextPair(row, previousPairs, forcedOffset) { - let counters = this.getDecodeFinderCounters(); - counters[0] = 0; - counters[1] = 0; - counters[2] = 0; - counters[3] = 0; - let width = row.getSize(); - let rowOffset; - if (forcedOffset >= 0) { - rowOffset = forcedOffset; - } - else if (this.isEmptyPair(previousPairs)) { - rowOffset = 0; - } - else { - let lastPair = previousPairs[previousPairs.length - 1]; - rowOffset = lastPair.getFinderPattern().getStartEnd()[1]; - } - let searchingEvenPair = previousPairs.length % 2 != 0; - if (this.startFromEven) { - searchingEvenPair = !searchingEvenPair; - } - let isWhite = false; - while (rowOffset < width) { - isWhite = !row.get(rowOffset); - if (!isWhite) { - break; - } - rowOffset++; - } - let counterPosition = 0; - let patternStart = rowOffset; - for (let x = rowOffset; x < width; x++) { - if (row.get(x) != isWhite) { - counters[counterPosition]++; - } - else { - if (counterPosition == 3) { - if (searchingEvenPair) { - RSSExpandedReader.reverseCounters(counters); - } - if (RSSExpandedReader.isFinderPattern(counters)) { - this.startEnd[0] = patternStart; - this.startEnd[1] = x; - return; - } - if (searchingEvenPair) { - RSSExpandedReader.reverseCounters(counters); - } - patternStart += counters[0] + counters[1]; - counters[0] = counters[2]; - counters[1] = counters[3]; - counters[2] = 0; - counters[3] = 0; - counterPosition--; - } - else { - counterPosition++; - } - counters[counterPosition] = 1; - isWhite = !isWhite; - } - } - throw new NotFoundException(); - } - static reverseCounters(counters) { - let length = counters.length; - for (let i = 0; i < length / 2; ++i) { - let tmp = counters[i]; - counters[i] = counters[length - i - 1]; - counters[length - i - 1] = tmp; - } - } - parseFoundFinderPattern(row, rowNumber, oddPattern) { - // Actually we found elements 2-5. - let firstCounter; - let start; - let end; - if (oddPattern) { - // If pattern number is odd, we need to locate element 1 *before* the current block. - let firstElementStart = this.startEnd[0] - 1; - // Locate element 1 - while (firstElementStart >= 0 && !row.get(firstElementStart)) { - firstElementStart--; - } - firstElementStart++; - firstCounter = this.startEnd[0] - firstElementStart; - start = firstElementStart; - end = this.startEnd[1]; - } - else { - // If pattern number is even, the pattern is reversed, so we need to locate element 1 *after* the current block. - start = this.startEnd[0]; - end = row.getNextUnset(this.startEnd[1] + 1); - firstCounter = end - this.startEnd[1]; - } - // Make 'counters' hold 1-4 - let counters = this.getDecodeFinderCounters(); - System.arraycopy(counters, 0, counters, 1, counters.length - 1); - counters[0] = firstCounter; - let value; - try { - value = this.parseFinderValue(counters, RSSExpandedReader.FINDER_PATTERNS); - } - catch (e) { - return null; - } - // return new FinderPattern(value, new int[] { start, end }, start, end, rowNumber}); - return new FinderPattern(value, [start, end], start, end, rowNumber); - } - decodeDataCharacter(row, pattern, isOddPattern, leftChar) { - let counters = this.getDataCharacterCounters(); - for (let x = 0; x < counters.length; x++) { - counters[x] = 0; - } - if (leftChar) { - RSSExpandedReader.recordPatternInReverse(row, pattern.getStartEnd()[0], counters); - } - else { - RSSExpandedReader.recordPattern(row, pattern.getStartEnd()[1], counters); - // reverse it - for (let i = 0, j = counters.length - 1; i < j; i++, j--) { - let temp = counters[i]; - counters[i] = counters[j]; - counters[j] = temp; - } - } // counters[] has the pixels of the module - let numModules = 17; // left and right data characters have all the same length - let elementWidth = MathUtils.sum(new Int32Array(counters)) / numModules; - // Sanity check: element width for pattern and the character should match - let expectedElementWidth = (pattern.getStartEnd()[1] - pattern.getStartEnd()[0]) / 15.0; - if (Math.abs(elementWidth - expectedElementWidth) / expectedElementWidth > 0.3) { - throw new NotFoundException(); - } - let oddCounts = this.getOddCounts(); - let evenCounts = this.getEvenCounts(); - let oddRoundingErrors = this.getOddRoundingErrors(); - let evenRoundingErrors = this.getEvenRoundingErrors(); - for (let i = 0; i < counters.length; i++) { - let value = 1.0 * counters[i] / elementWidth; - let count = value + 0.5; // Round - if (count < 1) { - if (value < 0.3) { - throw new NotFoundException(); - } - count = 1; - } - else if (count > 8) { - if (value > 8.7) { - throw new NotFoundException(); - } - count = 8; - } - let offset = i / 2; - if ((i & 0x01) == 0) { - oddCounts[offset] = count; - oddRoundingErrors[offset] = value - count; - } - else { - evenCounts[offset] = count; - evenRoundingErrors[offset] = value - count; - } - } - this.adjustOddEvenCounts(numModules); - let weightRowNumber = 4 * pattern.getValue() + (isOddPattern ? 0 : 2) + (leftChar ? 0 : 1) - 1; - let oddSum = 0; - let oddChecksumPortion = 0; - for (let i = oddCounts.length - 1; i >= 0; i--) { - if (RSSExpandedReader.isNotA1left(pattern, isOddPattern, leftChar)) { - let weight = RSSExpandedReader.WEIGHTS[weightRowNumber][2 * i]; - oddChecksumPortion += oddCounts[i] * weight; - } - oddSum += oddCounts[i]; - } - let evenChecksumPortion = 0; - // int evenSum = 0; - for (let i = evenCounts.length - 1; i >= 0; i--) { - if (RSSExpandedReader.isNotA1left(pattern, isOddPattern, leftChar)) { - let weight = RSSExpandedReader.WEIGHTS[weightRowNumber][2 * i + 1]; - evenChecksumPortion += evenCounts[i] * weight; - } - // evenSum += evenCounts[i]; - } - let checksumPortion = oddChecksumPortion + evenChecksumPortion; - if ((oddSum & 0x01) != 0 || oddSum > 13 || oddSum < 4) { - throw new NotFoundException(); - } - let group = (13 - oddSum) / 2; - let oddWidest = RSSExpandedReader.SYMBOL_WIDEST[group]; - let evenWidest = 9 - oddWidest; - let vOdd = RSSUtils.getRSSvalue(oddCounts, oddWidest, true); - let vEven = RSSUtils.getRSSvalue(evenCounts, evenWidest, false); - let tEven = RSSExpandedReader.EVEN_TOTAL_SUBSET[group]; - let gSum = RSSExpandedReader.GSUM[group]; - let value = vOdd * tEven + vEven + gSum; - return new DataCharacter(value, checksumPortion); - } - static isNotA1left(pattern, isOddPattern, leftChar) { - // A1: pattern.getValue is 0 (A), and it's an oddPattern, and it is a left char - return !(pattern.getValue() == 0 && isOddPattern && leftChar); - } - adjustOddEvenCounts(numModules) { - let oddSum = MathUtils.sum(new Int32Array(this.getOddCounts())); - let evenSum = MathUtils.sum(new Int32Array(this.getEvenCounts())); - let incrementOdd = false; - let decrementOdd = false; - if (oddSum > 13) { - decrementOdd = true; - } - else if (oddSum < 4) { - incrementOdd = true; - } - let incrementEven = false; - let decrementEven = false; - if (evenSum > 13) { - decrementEven = true; - } - else if (evenSum < 4) { - incrementEven = true; - } - let mismatch = oddSum + evenSum - numModules; - let oddParityBad = (oddSum & 0x01) == 1; - let evenParityBad = (evenSum & 0x01) == 0; - if (mismatch == 1) { - if (oddParityBad) { - if (evenParityBad) { - throw new NotFoundException(); - } - decrementOdd = true; - } - else { - if (!evenParityBad) { - throw new NotFoundException(); - } - decrementEven = true; - } - } - else if (mismatch == -1) { - if (oddParityBad) { - if (evenParityBad) { - throw new NotFoundException(); - } - incrementOdd = true; - } - else { - if (!evenParityBad) { - throw new NotFoundException(); - } - incrementEven = true; - } - } - else if (mismatch == 0) { - if (oddParityBad) { - if (!evenParityBad) { - throw new NotFoundException(); - } - // Both bad - if (oddSum < evenSum) { - incrementOdd = true; - decrementEven = true; - } - else { - decrementOdd = true; - incrementEven = true; - } - } - else { - if (evenParityBad) { - throw new NotFoundException(); - } - // Nothing to do! - } - } - else { - throw new NotFoundException(); - } - if (incrementOdd) { - if (decrementOdd) { - throw new NotFoundException(); - } - RSSExpandedReader.increment(this.getOddCounts(), this.getOddRoundingErrors()); - } - if (decrementOdd) { - RSSExpandedReader.decrement(this.getOddCounts(), this.getOddRoundingErrors()); - } - if (incrementEven) { - if (decrementEven) { - throw new NotFoundException(); - } - RSSExpandedReader.increment(this.getEvenCounts(), this.getOddRoundingErrors()); - } - if (decrementEven) { - RSSExpandedReader.decrement(this.getEvenCounts(), this.getEvenRoundingErrors()); - } - } - } - RSSExpandedReader.SYMBOL_WIDEST = [7, 5, 4, 3, 1]; - RSSExpandedReader.EVEN_TOTAL_SUBSET = [4, 20, 52, 104, 204]; - RSSExpandedReader.GSUM = [0, 348, 1388, 2948, 3988]; - RSSExpandedReader.FINDER_PATTERNS = [ - Int32Array.from([1, 8, 4, 1]), - Int32Array.from([3, 6, 4, 1]), - Int32Array.from([3, 4, 6, 1]), - Int32Array.from([3, 2, 8, 1]), - Int32Array.from([2, 6, 5, 1]), - Int32Array.from([2, 2, 9, 1]) // F - ]; - RSSExpandedReader.WEIGHTS = [ - [1, 3, 9, 27, 81, 32, 96, 77], - [20, 60, 180, 118, 143, 7, 21, 63], - [189, 145, 13, 39, 117, 140, 209, 205], - [193, 157, 49, 147, 19, 57, 171, 91], - [62, 186, 136, 197, 169, 85, 44, 132], - [185, 133, 188, 142, 4, 12, 36, 108], - [113, 128, 173, 97, 80, 29, 87, 50], - [150, 28, 84, 41, 123, 158, 52, 156], - [46, 138, 203, 187, 139, 206, 196, 166], - [76, 17, 51, 153, 37, 111, 122, 155], - [43, 129, 176, 106, 107, 110, 119, 146], - [16, 48, 144, 10, 30, 90, 59, 177], - [109, 116, 137, 200, 178, 112, 125, 164], - [70, 210, 208, 202, 184, 130, 179, 115], - [134, 191, 151, 31, 93, 68, 204, 190], - [148, 22, 66, 198, 172, 94, 71, 2], - [6, 18, 54, 162, 64, 192, 154, 40], - [120, 149, 25, 75, 14, 42, 126, 167], - [79, 26, 78, 23, 69, 207, 199, 175], - [103, 98, 83, 38, 114, 131, 182, 124], - [161, 61, 183, 127, 170, 88, 53, 159], - [55, 165, 73, 8, 24, 72, 5, 15], - [45, 135, 194, 160, 58, 174, 100, 89] - ]; - RSSExpandedReader.FINDER_PAT_A = 0; - RSSExpandedReader.FINDER_PAT_B = 1; - RSSExpandedReader.FINDER_PAT_C = 2; - RSSExpandedReader.FINDER_PAT_D = 3; - RSSExpandedReader.FINDER_PAT_E = 4; - RSSExpandedReader.FINDER_PAT_F = 5; - RSSExpandedReader.FINDER_PATTERN_SEQUENCES = [ - [RSSExpandedReader.FINDER_PAT_A, RSSExpandedReader.FINDER_PAT_A], - [RSSExpandedReader.FINDER_PAT_A, RSSExpandedReader.FINDER_PAT_B, RSSExpandedReader.FINDER_PAT_B], - [RSSExpandedReader.FINDER_PAT_A, RSSExpandedReader.FINDER_PAT_C, RSSExpandedReader.FINDER_PAT_B, RSSExpandedReader.FINDER_PAT_D], - [RSSExpandedReader.FINDER_PAT_A, RSSExpandedReader.FINDER_PAT_E, RSSExpandedReader.FINDER_PAT_B, RSSExpandedReader.FINDER_PAT_D, RSSExpandedReader.FINDER_PAT_C], - [RSSExpandedReader.FINDER_PAT_A, RSSExpandedReader.FINDER_PAT_E, RSSExpandedReader.FINDER_PAT_B, RSSExpandedReader.FINDER_PAT_D, RSSExpandedReader.FINDER_PAT_D, RSSExpandedReader.FINDER_PAT_F], - [RSSExpandedReader.FINDER_PAT_A, RSSExpandedReader.FINDER_PAT_E, RSSExpandedReader.FINDER_PAT_B, RSSExpandedReader.FINDER_PAT_D, RSSExpandedReader.FINDER_PAT_E, RSSExpandedReader.FINDER_PAT_F, RSSExpandedReader.FINDER_PAT_F], - [RSSExpandedReader.FINDER_PAT_A, RSSExpandedReader.FINDER_PAT_A, RSSExpandedReader.FINDER_PAT_B, RSSExpandedReader.FINDER_PAT_B, RSSExpandedReader.FINDER_PAT_C, RSSExpandedReader.FINDER_PAT_C, RSSExpandedReader.FINDER_PAT_D, RSSExpandedReader.FINDER_PAT_D], - [RSSExpandedReader.FINDER_PAT_A, RSSExpandedReader.FINDER_PAT_A, RSSExpandedReader.FINDER_PAT_B, RSSExpandedReader.FINDER_PAT_B, RSSExpandedReader.FINDER_PAT_C, RSSExpandedReader.FINDER_PAT_C, RSSExpandedReader.FINDER_PAT_D, RSSExpandedReader.FINDER_PAT_E, RSSExpandedReader.FINDER_PAT_E], - [RSSExpandedReader.FINDER_PAT_A, RSSExpandedReader.FINDER_PAT_A, RSSExpandedReader.FINDER_PAT_B, RSSExpandedReader.FINDER_PAT_B, RSSExpandedReader.FINDER_PAT_C, RSSExpandedReader.FINDER_PAT_C, RSSExpandedReader.FINDER_PAT_D, RSSExpandedReader.FINDER_PAT_E, RSSExpandedReader.FINDER_PAT_F, RSSExpandedReader.FINDER_PAT_F], - [RSSExpandedReader.FINDER_PAT_A, RSSExpandedReader.FINDER_PAT_A, RSSExpandedReader.FINDER_PAT_B, RSSExpandedReader.FINDER_PAT_B, RSSExpandedReader.FINDER_PAT_C, RSSExpandedReader.FINDER_PAT_D, RSSExpandedReader.FINDER_PAT_D, RSSExpandedReader.FINDER_PAT_E, RSSExpandedReader.FINDER_PAT_E, RSSExpandedReader.FINDER_PAT_F, RSSExpandedReader.FINDER_PAT_F], - ]; - RSSExpandedReader.MAX_PAIRS = 11; - - class Pair extends DataCharacter { - constructor(value, checksumPortion, finderPattern) { - super(value, checksumPortion); - this.count = 0; - this.finderPattern = finderPattern; - } - getFinderPattern() { - return this.finderPattern; - } - getCount() { - return this.count; - } - incrementCount() { - this.count++; - } - } - - class RSS14Reader extends AbstractRSSReader { - constructor() { - super(...arguments); - this.possibleLeftPairs = []; - this.possibleRightPairs = []; - } - decodeRow(rowNumber, row, hints) { - const leftPair = this.decodePair(row, false, rowNumber, hints); - RSS14Reader.addOrTally(this.possibleLeftPairs, leftPair); - row.reverse(); - let rightPair = this.decodePair(row, true, rowNumber, hints); - RSS14Reader.addOrTally(this.possibleRightPairs, rightPair); - row.reverse(); - for (let left of this.possibleLeftPairs) { - if (left.getCount() > 1) { - for (let right of this.possibleRightPairs) { - if (right.getCount() > 1 && RSS14Reader.checkChecksum(left, right)) { - return RSS14Reader.constructResult(left, right); - } - } - } - } - throw new NotFoundException(); - } - static addOrTally(possiblePairs, pair) { - if (pair == null) { - return; - } - let found = false; - for (let other of possiblePairs) { - if (other.getValue() === pair.getValue()) { - other.incrementCount(); - found = true; - break; - } - } - if (!found) { - possiblePairs.push(pair); - } - } - reset() { - this.possibleLeftPairs.length = 0; - this.possibleRightPairs.length = 0; - } - static constructResult(leftPair, rightPair) { - let symbolValue = 4537077 * leftPair.getValue() + rightPair.getValue(); - let text = new String(symbolValue).toString(); - let buffer = new StringBuilder(); - for (let i = 13 - text.length; i > 0; i--) { - buffer.append('0'); - } - buffer.append(text); - let checkDigit = 0; - for (let i = 0; i < 13; i++) { - let digit = buffer.charAt(i).charCodeAt(0) - '0'.charCodeAt(0); - checkDigit += ((i & 0x01) === 0) ? 3 * digit : digit; - } - checkDigit = 10 - (checkDigit % 10); - if (checkDigit === 10) { - checkDigit = 0; - } - buffer.append(checkDigit.toString()); - let leftPoints = leftPair.getFinderPattern().getResultPoints(); - let rightPoints = rightPair.getFinderPattern().getResultPoints(); - return new Result(buffer.toString(), null, 0, [leftPoints[0], leftPoints[1], rightPoints[0], rightPoints[1]], BarcodeFormat$1.RSS_14, new Date().getTime()); - } - static checkChecksum(leftPair, rightPair) { - let checkValue = (leftPair.getChecksumPortion() + 16 * rightPair.getChecksumPortion()) % 79; - let targetCheckValue = 9 * leftPair.getFinderPattern().getValue() + rightPair.getFinderPattern().getValue(); - if (targetCheckValue > 72) { - targetCheckValue--; - } - if (targetCheckValue > 8) { - targetCheckValue--; - } - return checkValue === targetCheckValue; - } - decodePair(row, right, rowNumber, hints) { - try { - let startEnd = this.findFinderPattern(row, right); - let pattern = this.parseFoundFinderPattern(row, rowNumber, right, startEnd); - let resultPointCallback = hints == null ? null : hints.get(DecodeHintType$1.NEED_RESULT_POINT_CALLBACK); - if (resultPointCallback != null) { - let center = (startEnd[0] + startEnd[1]) / 2.0; - if (right) { - // row is actually reversed - center = row.getSize() - 1 - center; - } - resultPointCallback.foundPossibleResultPoint(new ResultPoint(center, rowNumber)); - } - let outside = this.decodeDataCharacter(row, pattern, true); - let inside = this.decodeDataCharacter(row, pattern, false); - return new Pair(1597 * outside.getValue() + inside.getValue(), outside.getChecksumPortion() + 4 * inside.getChecksumPortion(), pattern); - } - catch (err) { - return null; - } - } - decodeDataCharacter(row, pattern, outsideChar) { - let counters = this.getDataCharacterCounters(); - for (let x = 0; x < counters.length; x++) { - counters[x] = 0; - } - if (outsideChar) { - OneDReader.recordPatternInReverse(row, pattern.getStartEnd()[0], counters); - } - else { - OneDReader.recordPattern(row, pattern.getStartEnd()[1] + 1, counters); - // reverse it - for (let i = 0, j = counters.length - 1; i < j; i++, j--) { - let temp = counters[i]; - counters[i] = counters[j]; - counters[j] = temp; - } - } - let numModules = outsideChar ? 16 : 15; - let elementWidth = MathUtils.sum(new Int32Array(counters)) / numModules; - let oddCounts = this.getOddCounts(); - let evenCounts = this.getEvenCounts(); - let oddRoundingErrors = this.getOddRoundingErrors(); - let evenRoundingErrors = this.getEvenRoundingErrors(); - for (let i = 0; i < counters.length; i++) { - let value = counters[i] / elementWidth; - let count = Math.floor(value + 0.5); - if (count < 1) { - count = 1; - } - else if (count > 8) { - count = 8; - } - let offset = Math.floor(i / 2); - if ((i & 0x01) === 0) { - oddCounts[offset] = count; - oddRoundingErrors[offset] = value - count; - } - else { - evenCounts[offset] = count; - evenRoundingErrors[offset] = value - count; - } - } - this.adjustOddEvenCounts(outsideChar, numModules); - let oddSum = 0; - let oddChecksumPortion = 0; - for (let i = oddCounts.length - 1; i >= 0; i--) { - oddChecksumPortion *= 9; - oddChecksumPortion += oddCounts[i]; - oddSum += oddCounts[i]; - } - let evenChecksumPortion = 0; - let evenSum = 0; - for (let i = evenCounts.length - 1; i >= 0; i--) { - evenChecksumPortion *= 9; - evenChecksumPortion += evenCounts[i]; - evenSum += evenCounts[i]; - } - let checksumPortion = oddChecksumPortion + 3 * evenChecksumPortion; - if (outsideChar) { - if ((oddSum & 0x01) !== 0 || oddSum > 12 || oddSum < 4) { - throw new NotFoundException(); - } - let group = (12 - oddSum) / 2; - let oddWidest = RSS14Reader.OUTSIDE_ODD_WIDEST[group]; - let evenWidest = 9 - oddWidest; - let vOdd = RSSUtils.getRSSvalue(oddCounts, oddWidest, false); - let vEven = RSSUtils.getRSSvalue(evenCounts, evenWidest, true); - let tEven = RSS14Reader.OUTSIDE_EVEN_TOTAL_SUBSET[group]; - let gSum = RSS14Reader.OUTSIDE_GSUM[group]; - return new DataCharacter(vOdd * tEven + vEven + gSum, checksumPortion); - } - else { - if ((evenSum & 0x01) !== 0 || evenSum > 10 || evenSum < 4) { - throw new NotFoundException(); - } - let group = (10 - evenSum) / 2; - let oddWidest = RSS14Reader.INSIDE_ODD_WIDEST[group]; - let evenWidest = 9 - oddWidest; - let vOdd = RSSUtils.getRSSvalue(oddCounts, oddWidest, true); - let vEven = RSSUtils.getRSSvalue(evenCounts, evenWidest, false); - let tOdd = RSS14Reader.INSIDE_ODD_TOTAL_SUBSET[group]; - let gSum = RSS14Reader.INSIDE_GSUM[group]; - return new DataCharacter(vEven * tOdd + vOdd + gSum, checksumPortion); - } - } - findFinderPattern(row, rightFinderPattern) { - let counters = this.getDecodeFinderCounters(); - counters[0] = 0; - counters[1] = 0; - counters[2] = 0; - counters[3] = 0; - let width = row.getSize(); - let isWhite = false; - let rowOffset = 0; - while (rowOffset < width) { - isWhite = !row.get(rowOffset); - if (rightFinderPattern === isWhite) { - // Will encounter white first when searching for right finder pattern - break; - } - rowOffset++; - } - let counterPosition = 0; - let patternStart = rowOffset; - for (let x = rowOffset; x < width; x++) { - if (row.get(x) !== isWhite) { - counters[counterPosition]++; - } - else { - if (counterPosition === 3) { - if (AbstractRSSReader.isFinderPattern(counters)) { - return [patternStart, x]; - } - patternStart += counters[0] + counters[1]; - counters[0] = counters[2]; - counters[1] = counters[3]; - counters[2] = 0; - counters[3] = 0; - counterPosition--; - } - else { - counterPosition++; - } - counters[counterPosition] = 1; - isWhite = !isWhite; - } - } - throw new NotFoundException(); - } - parseFoundFinderPattern(row, rowNumber, right, startEnd) { - // Actually we found elements 2-5 - let firstIsBlack = row.get(startEnd[0]); - let firstElementStart = startEnd[0] - 1; - // Locate element 1 - while (firstElementStart >= 0 && firstIsBlack !== row.get(firstElementStart)) { - firstElementStart--; - } - firstElementStart++; - const firstCounter = startEnd[0] - firstElementStart; - // Make 'counters' hold 1-4 - const counters = this.getDecodeFinderCounters(); - const copy = new Int32Array(counters.length); - System.arraycopy(counters, 0, copy, 1, counters.length - 1); - copy[0] = firstCounter; - const value = this.parseFinderValue(copy, RSS14Reader.FINDER_PATTERNS); - let start = firstElementStart; - let end = startEnd[1]; - if (right) { - // row is actually reversed - start = row.getSize() - 1 - start; - end = row.getSize() - 1 - end; - } - return new FinderPattern(value, [firstElementStart, startEnd[1]], start, end, rowNumber); - } - adjustOddEvenCounts(outsideChar, numModules) { - let oddSum = MathUtils.sum(new Int32Array(this.getOddCounts())); - let evenSum = MathUtils.sum(new Int32Array(this.getEvenCounts())); - let incrementOdd = false; - let decrementOdd = false; - let incrementEven = false; - let decrementEven = false; - if (outsideChar) { - if (oddSum > 12) { - decrementOdd = true; - } - else if (oddSum < 4) { - incrementOdd = true; - } - if (evenSum > 12) { - decrementEven = true; - } - else if (evenSum < 4) { - incrementEven = true; - } - } - else { - if (oddSum > 11) { - decrementOdd = true; - } - else if (oddSum < 5) { - incrementOdd = true; - } - if (evenSum > 10) { - decrementEven = true; - } - else if (evenSum < 4) { - incrementEven = true; - } - } - let mismatch = oddSum + evenSum - numModules; - let oddParityBad = (oddSum & 0x01) === (outsideChar ? 1 : 0); - let evenParityBad = (evenSum & 0x01) === 1; - if (mismatch === 1) { - if (oddParityBad) { - if (evenParityBad) { - throw new NotFoundException(); - } - decrementOdd = true; - } - else { - if (!evenParityBad) { - throw new NotFoundException(); - } - decrementEven = true; - } - } - else if (mismatch === -1) { - if (oddParityBad) { - if (evenParityBad) { - throw new NotFoundException(); - } - incrementOdd = true; - } - else { - if (!evenParityBad) { - throw new NotFoundException(); - } - incrementEven = true; - } - } - else if (mismatch === 0) { - if (oddParityBad) { - if (!evenParityBad) { - throw new NotFoundException(); - } - // Both bad - if (oddSum < evenSum) { - incrementOdd = true; - decrementEven = true; - } - else { - decrementOdd = true; - incrementEven = true; - } - } - else { - if (evenParityBad) { - throw new NotFoundException(); - } - // Nothing to do! - } - } - else { - throw new NotFoundException(); - } - if (incrementOdd) { - if (decrementOdd) { - throw new NotFoundException(); - } - AbstractRSSReader.increment(this.getOddCounts(), this.getOddRoundingErrors()); - } - if (decrementOdd) { - AbstractRSSReader.decrement(this.getOddCounts(), this.getOddRoundingErrors()); - } - if (incrementEven) { - if (decrementEven) { - throw new NotFoundException(); - } - AbstractRSSReader.increment(this.getEvenCounts(), this.getOddRoundingErrors()); - } - if (decrementEven) { - AbstractRSSReader.decrement(this.getEvenCounts(), this.getEvenRoundingErrors()); - } - } - } - RSS14Reader.OUTSIDE_EVEN_TOTAL_SUBSET = [1, 10, 34, 70, 126]; - RSS14Reader.INSIDE_ODD_TOTAL_SUBSET = [4, 20, 48, 81]; - RSS14Reader.OUTSIDE_GSUM = [0, 161, 961, 2015, 2715]; - RSS14Reader.INSIDE_GSUM = [0, 336, 1036, 1516]; - RSS14Reader.OUTSIDE_ODD_WIDEST = [8, 6, 4, 3, 1]; - RSS14Reader.INSIDE_ODD_WIDEST = [2, 4, 6, 8]; - RSS14Reader.FINDER_PATTERNS = [ - Int32Array.from([3, 8, 2, 1]), - Int32Array.from([3, 5, 5, 1]), - Int32Array.from([3, 3, 7, 1]), - Int32Array.from([3, 1, 9, 1]), - Int32Array.from([2, 7, 4, 1]), - Int32Array.from([2, 5, 6, 1]), - Int32Array.from([2, 3, 8, 1]), - Int32Array.from([1, 5, 7, 1]), - Int32Array.from([1, 3, 9, 1]), - ]; - - /** - * @author Daniel Switkin - * @author Sean Owen - */ - class MultiFormatOneDReader extends OneDReader { - constructor(hints, verbose) { - super(); - this.readers = []; - this.verbose = (verbose === true); - const possibleFormats = !hints ? null : hints.get(DecodeHintType$1.POSSIBLE_FORMATS); - const useCode39CheckDigit = hints && hints.get(DecodeHintType$1.ASSUME_CODE_39_CHECK_DIGIT) !== undefined; - if (possibleFormats) { - if (possibleFormats.includes(BarcodeFormat$1.EAN_13) || - possibleFormats.includes(BarcodeFormat$1.UPC_A) || - possibleFormats.includes(BarcodeFormat$1.EAN_8) || - possibleFormats.includes(BarcodeFormat$1.UPC_E)) { - this.readers.push(new MultiFormatUPCEANReader(hints)); - } - if (possibleFormats.includes(BarcodeFormat$1.CODE_39)) { - this.readers.push(new Code39Reader(useCode39CheckDigit)); - } - // if (possibleFormats.includes(BarcodeFormat.CODE_93)) { - // this.readers.push(new Code93Reader()); - // } - if (possibleFormats.includes(BarcodeFormat$1.CODE_128)) { - this.readers.push(new Code128Reader()); - } - if (possibleFormats.includes(BarcodeFormat$1.ITF)) { - this.readers.push(new ITFReader()); - } - // if (possibleFormats.includes(BarcodeFormat.CODABAR)) { - // this.readers.push(new CodaBarReader()); - // } - if (possibleFormats.includes(BarcodeFormat$1.RSS_14)) { - this.readers.push(new RSS14Reader()); - } - if (possibleFormats.includes(BarcodeFormat$1.RSS_EXPANDED)) { - this.readers.push(new RSSExpandedReader(this.verbose)); - } - } else { - // Case when no hints were provided -> add all. - this.readers.push(new MultiFormatUPCEANReader(hints)); - this.readers.push(new Code39Reader()); - // this.readers.push(new CodaBarReader()); - // this.readers.push(new Code93Reader()); - this.readers.push(new MultiFormatUPCEANReader(hints)); - this.readers.push(new Code128Reader()); - this.readers.push(new ITFReader()); - this.readers.push(new RSS14Reader()); - this.readers.push(new RSSExpandedReader(this.verbose)); - } - } - // @Override - decodeRow(rowNumber, row, hints) { - for (let i = 0; i < this.readers.length; i++) { - try { - return this.readers[i].decodeRow(rowNumber, row, hints); - } - catch (re) { - // continue - } - } - throw new NotFoundException(); - } - // @Override - reset() { - this.readers.forEach(reader => reader.reset()); - } - } - - /** - * @deprecated Moving to @zxing/browser - * - * Barcode reader reader to use from browser. - */ - class BrowserBarcodeReader extends BrowserCodeReader { - /** - * Creates an instance of BrowserBarcodeReader. - * @param {number} [timeBetweenScansMillis=500] the time delay between subsequent decode tries - * @param {Map} hints - */ - constructor(timeBetweenScansMillis = 500, hints) { - super(new MultiFormatOneDReader(hints), timeBetweenScansMillis, hints); - } - } - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - *

    Encapsulates a set of error-correction blocks in one symbol version. Most versions will - * use blocks of differing sizes within one version, so, this encapsulates the parameters for - * each set of blocks. It also holds the number of error-correction codewords per block since it - * will be the same across all blocks within one version.

    - */ - class ECBlocks { - constructor(ecCodewords, ecBlocks1, ecBlocks2) { - this.ecCodewords = ecCodewords; - this.ecBlocks = [ecBlocks1]; - ecBlocks2 && this.ecBlocks.push(ecBlocks2); - } - getECCodewords() { - return this.ecCodewords; - } - getECBlocks() { - return this.ecBlocks; - } - } - /** - *

    Encapsulates the parameters for one error-correction block in one symbol version. - * This includes the number of data codewords, and the number of times a block with these - * parameters is used consecutively in the Data Matrix code version's format.

    - */ - class ECB { - constructor(count, dataCodewords) { - this.count = count; - this.dataCodewords = dataCodewords; - } - getCount() { - return this.count; - } - getDataCodewords() { - return this.dataCodewords; - } - } - /** - * The Version object encapsulates attributes about a particular - * size Data Matrix Code. - * - * @author bbrown@google.com (Brian Brown) - */ - class Version { - constructor(versionNumber, symbolSizeRows, symbolSizeColumns, dataRegionSizeRows, dataRegionSizeColumns, ecBlocks) { - this.versionNumber = versionNumber; - this.symbolSizeRows = symbolSizeRows; - this.symbolSizeColumns = symbolSizeColumns; - this.dataRegionSizeRows = dataRegionSizeRows; - this.dataRegionSizeColumns = dataRegionSizeColumns; - this.ecBlocks = ecBlocks; - // Calculate the total number of codewords - let total = 0; - const ecCodewords = ecBlocks.getECCodewords(); - const ecbArray = ecBlocks.getECBlocks(); - for (let ecBlock of ecbArray) { - total += ecBlock.getCount() * (ecBlock.getDataCodewords() + ecCodewords); - } - this.totalCodewords = total; - } - getVersionNumber() { - return this.versionNumber; - } - getSymbolSizeRows() { - return this.symbolSizeRows; - } - getSymbolSizeColumns() { - return this.symbolSizeColumns; - } - getDataRegionSizeRows() { - return this.dataRegionSizeRows; - } - getDataRegionSizeColumns() { - return this.dataRegionSizeColumns; - } - getTotalCodewords() { - return this.totalCodewords; - } - getECBlocks() { - return this.ecBlocks; - } - /** - *

    Deduces version information from Data Matrix dimensions.

    - * - * @param numRows Number of rows in modules - * @param numColumns Number of columns in modules - * @return Version for a Data Matrix Code of those dimensions - * @throws FormatException if dimensions do correspond to a valid Data Matrix size - */ - static getVersionForDimensions(numRows, numColumns) { - if ((numRows & 0x01) !== 0 || (numColumns & 0x01) !== 0) { - throw new FormatException(); - } - for (let version of Version.VERSIONS) { - if (version.symbolSizeRows === numRows && version.symbolSizeColumns === numColumns) { - return version; - } - } - throw new FormatException(); - } - // @Override - toString() { - return '' + this.versionNumber; - } - /** - * See ISO 16022:2006 5.5.1 Table 7 - */ - static buildVersions() { - return [ - new Version(1, 10, 10, 8, 8, new ECBlocks(5, new ECB(1, 3))), - new Version(2, 12, 12, 10, 10, new ECBlocks(7, new ECB(1, 5))), - new Version(3, 14, 14, 12, 12, new ECBlocks(10, new ECB(1, 8))), - new Version(4, 16, 16, 14, 14, new ECBlocks(12, new ECB(1, 12))), - new Version(5, 18, 18, 16, 16, new ECBlocks(14, new ECB(1, 18))), - new Version(6, 20, 20, 18, 18, new ECBlocks(18, new ECB(1, 22))), - new Version(7, 22, 22, 20, 20, new ECBlocks(20, new ECB(1, 30))), - new Version(8, 24, 24, 22, 22, new ECBlocks(24, new ECB(1, 36))), - new Version(9, 26, 26, 24, 24, new ECBlocks(28, new ECB(1, 44))), - new Version(10, 32, 32, 14, 14, new ECBlocks(36, new ECB(1, 62))), - new Version(11, 36, 36, 16, 16, new ECBlocks(42, new ECB(1, 86))), - new Version(12, 40, 40, 18, 18, new ECBlocks(48, new ECB(1, 114))), - new Version(13, 44, 44, 20, 20, new ECBlocks(56, new ECB(1, 144))), - new Version(14, 48, 48, 22, 22, new ECBlocks(68, new ECB(1, 174))), - new Version(15, 52, 52, 24, 24, new ECBlocks(42, new ECB(2, 102))), - new Version(16, 64, 64, 14, 14, new ECBlocks(56, new ECB(2, 140))), - new Version(17, 72, 72, 16, 16, new ECBlocks(36, new ECB(4, 92))), - new Version(18, 80, 80, 18, 18, new ECBlocks(48, new ECB(4, 114))), - new Version(19, 88, 88, 20, 20, new ECBlocks(56, new ECB(4, 144))), - new Version(20, 96, 96, 22, 22, new ECBlocks(68, new ECB(4, 174))), - new Version(21, 104, 104, 24, 24, new ECBlocks(56, new ECB(6, 136))), - new Version(22, 120, 120, 18, 18, new ECBlocks(68, new ECB(6, 175))), - new Version(23, 132, 132, 20, 20, new ECBlocks(62, new ECB(8, 163))), - new Version(24, 144, 144, 22, 22, new ECBlocks(62, new ECB(8, 156), new ECB(2, 155))), - new Version(25, 8, 18, 6, 16, new ECBlocks(7, new ECB(1, 5))), - new Version(26, 8, 32, 6, 14, new ECBlocks(11, new ECB(1, 10))), - new Version(27, 12, 26, 10, 24, new ECBlocks(14, new ECB(1, 16))), - new Version(28, 12, 36, 10, 16, new ECBlocks(18, new ECB(1, 22))), - new Version(29, 16, 36, 14, 16, new ECBlocks(24, new ECB(1, 32))), - new Version(30, 16, 48, 14, 22, new ECBlocks(28, new ECB(1, 49))) - ]; - } - } - Version.VERSIONS = Version.buildVersions(); - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * @author bbrown@google.com (Brian Brown) - */ - class BitMatrixParser { - /** - * @param bitMatrix {@link BitMatrix} to parse - * @throws FormatException if dimension is < 8 or > 144 or not 0 mod 2 - */ - constructor(bitMatrix) { - const dimension = bitMatrix.getHeight(); - if (dimension < 8 || dimension > 144 || (dimension & 0x01) !== 0) { - throw new FormatException(); - } - this.version = BitMatrixParser.readVersion(bitMatrix); - this.mappingBitMatrix = this.extractDataRegion(bitMatrix); - this.readMappingMatrix = new BitMatrix(this.mappingBitMatrix.getWidth(), this.mappingBitMatrix.getHeight()); - } - getVersion() { - return this.version; - } - /** - *

    Creates the version object based on the dimension of the original bit matrix from - * the datamatrix code.

    - * - *

    See ISO 16022:2006 Table 7 - ECC 200 symbol attributes

    - * - * @param bitMatrix Original {@link BitMatrix} including alignment patterns - * @return {@link Version} encapsulating the Data Matrix Code's "version" - * @throws FormatException if the dimensions of the mapping matrix are not valid - * Data Matrix dimensions. - */ - static readVersion(bitMatrix) { - const numRows = bitMatrix.getHeight(); - const numColumns = bitMatrix.getWidth(); - return Version.getVersionForDimensions(numRows, numColumns); - } - /** - *

    Reads the bits in the {@link BitMatrix} representing the mapping matrix (No alignment patterns) - * in the correct order in order to reconstitute the codewords bytes contained within the - * Data Matrix Code.

    - * - * @return bytes encoded within the Data Matrix Code - * @throws FormatException if the exact number of bytes expected is not read - */ - readCodewords() { - const result = new Int8Array(this.version.getTotalCodewords()); - let resultOffset = 0; - let row = 4; - let column = 0; - const numRows = this.mappingBitMatrix.getHeight(); - const numColumns = this.mappingBitMatrix.getWidth(); - let corner1Read = false; - let corner2Read = false; - let corner3Read = false; - let corner4Read = false; - // Read all of the codewords - do { - // Check the four corner cases - if ((row === numRows) && (column === 0) && !corner1Read) { - result[resultOffset++] = this.readCorner1(numRows, numColumns) & 0xff; - row -= 2; - column += 2; - corner1Read = true; - } - else if ((row === numRows - 2) && (column === 0) && ((numColumns & 0x03) !== 0) && !corner2Read) { - result[resultOffset++] = this.readCorner2(numRows, numColumns) & 0xff; - row -= 2; - column += 2; - corner2Read = true; - } - else if ((row === numRows + 4) && (column === 2) && ((numColumns & 0x07) === 0) && !corner3Read) { - result[resultOffset++] = this.readCorner3(numRows, numColumns) & 0xff; - row -= 2; - column += 2; - corner3Read = true; - } - else if ((row === numRows - 2) && (column === 0) && ((numColumns & 0x07) === 4) && !corner4Read) { - result[resultOffset++] = this.readCorner4(numRows, numColumns) & 0xff; - row -= 2; - column += 2; - corner4Read = true; - } - else { - // Sweep upward diagonally to the right - do { - if ((row < numRows) && (column >= 0) && !this.readMappingMatrix.get(column, row)) { - result[resultOffset++] = this.readUtah(row, column, numRows, numColumns) & 0xff; - } - row -= 2; - column += 2; - } while ((row >= 0) && (column < numColumns)); - row += 1; - column += 3; - // Sweep downward diagonally to the left - do { - if ((row >= 0) && (column < numColumns) && !this.readMappingMatrix.get(column, row)) { - result[resultOffset++] = this.readUtah(row, column, numRows, numColumns) & 0xff; - } - row += 2; - column -= 2; - } while ((row < numRows) && (column >= 0)); - row += 3; - column += 1; - } - } while ((row < numRows) || (column < numColumns)); - if (resultOffset !== this.version.getTotalCodewords()) { - throw new FormatException(); - } - return result; - } - /** - *

    Reads a bit of the mapping matrix accounting for boundary wrapping.

    - * - * @param row Row to read in the mapping matrix - * @param column Column to read in the mapping matrix - * @param numRows Number of rows in the mapping matrix - * @param numColumns Number of columns in the mapping matrix - * @return value of the given bit in the mapping matrix - */ - readModule(row, column, numRows, numColumns) { - // Adjust the row and column indices based on boundary wrapping - if (row < 0) { - row += numRows; - column += 4 - ((numRows + 4) & 0x07); - } - if (column < 0) { - column += numColumns; - row += 4 - ((numColumns + 4) & 0x07); - } - this.readMappingMatrix.set(column, row); - return this.mappingBitMatrix.get(column, row); - } - /** - *

    Reads the 8 bits of the standard Utah-shaped pattern.

    - * - *

    See ISO 16022:2006, 5.8.1 Figure 6

    - * - * @param row Current row in the mapping matrix, anchored at the 8th bit (LSB) of the pattern - * @param column Current column in the mapping matrix, anchored at the 8th bit (LSB) of the pattern - * @param numRows Number of rows in the mapping matrix - * @param numColumns Number of columns in the mapping matrix - * @return byte from the utah shape - */ - readUtah(row, column, numRows, numColumns) { - let currentByte = 0; - if (this.readModule(row - 2, column - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(row - 2, column - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(row - 1, column - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(row - 1, column - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(row - 1, column, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(row, column - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(row, column - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(row, column, numRows, numColumns)) { - currentByte |= 1; - } - return currentByte; - } - /** - *

    Reads the 8 bits of the special corner condition 1.

    - * - *

    See ISO 16022:2006, Figure F.3

    - * - * @param numRows Number of rows in the mapping matrix - * @param numColumns Number of columns in the mapping matrix - * @return byte from the Corner condition 1 - */ - readCorner1(numRows, numColumns) { - let currentByte = 0; - if (this.readModule(numRows - 1, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(numRows - 1, 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(numRows - 1, 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(0, numColumns - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(0, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(1, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(2, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(3, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - return currentByte; - } - /** - *

    Reads the 8 bits of the special corner condition 2.

    - * - *

    See ISO 16022:2006, Figure F.4

    - * - * @param numRows Number of rows in the mapping matrix - * @param numColumns Number of columns in the mapping matrix - * @return byte from the Corner condition 2 - */ - readCorner2(numRows, numColumns) { - let currentByte = 0; - if (this.readModule(numRows - 3, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(numRows - 2, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(numRows - 1, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(0, numColumns - 4, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(0, numColumns - 3, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(0, numColumns - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(0, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(1, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - return currentByte; - } - /** - *

    Reads the 8 bits of the special corner condition 3.

    - * - *

    See ISO 16022:2006, Figure F.5

    - * - * @param numRows Number of rows in the mapping matrix - * @param numColumns Number of columns in the mapping matrix - * @return byte from the Corner condition 3 - */ - readCorner3(numRows, numColumns) { - let currentByte = 0; - if (this.readModule(numRows - 1, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(numRows - 1, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(0, numColumns - 3, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(0, numColumns - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(0, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(1, numColumns - 3, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(1, numColumns - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(1, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - return currentByte; - } - /** - *

    Reads the 8 bits of the special corner condition 4.

    - * - *

    See ISO 16022:2006, Figure F.6

    - * - * @param numRows Number of rows in the mapping matrix - * @param numColumns Number of columns in the mapping matrix - * @return byte from the Corner condition 4 - */ - readCorner4(numRows, numColumns) { - let currentByte = 0; - if (this.readModule(numRows - 3, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(numRows - 2, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(numRows - 1, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(0, numColumns - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(0, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(1, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(2, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (this.readModule(3, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - return currentByte; - } - /** - *

    Extracts the data region from a {@link BitMatrix} that contains - * alignment patterns.

    - * - * @param bitMatrix Original {@link BitMatrix} with alignment patterns - * @return BitMatrix that has the alignment patterns removed - */ - extractDataRegion(bitMatrix) { - const symbolSizeRows = this.version.getSymbolSizeRows(); - const symbolSizeColumns = this.version.getSymbolSizeColumns(); - if (bitMatrix.getHeight() !== symbolSizeRows) { - throw new IllegalArgumentException('Dimension of bitMatrix must match the version size'); - } - const dataRegionSizeRows = this.version.getDataRegionSizeRows(); - const dataRegionSizeColumns = this.version.getDataRegionSizeColumns(); - const numDataRegionsRow = symbolSizeRows / dataRegionSizeRows | 0; - const numDataRegionsColumn = symbolSizeColumns / dataRegionSizeColumns | 0; - const sizeDataRegionRow = numDataRegionsRow * dataRegionSizeRows; - const sizeDataRegionColumn = numDataRegionsColumn * dataRegionSizeColumns; - const bitMatrixWithoutAlignment = new BitMatrix(sizeDataRegionColumn, sizeDataRegionRow); - for (let dataRegionRow = 0; dataRegionRow < numDataRegionsRow; ++dataRegionRow) { - const dataRegionRowOffset = dataRegionRow * dataRegionSizeRows; - for (let dataRegionColumn = 0; dataRegionColumn < numDataRegionsColumn; ++dataRegionColumn) { - const dataRegionColumnOffset = dataRegionColumn * dataRegionSizeColumns; - for (let i = 0; i < dataRegionSizeRows; ++i) { - const readRowOffset = dataRegionRow * (dataRegionSizeRows + 2) + 1 + i; - const writeRowOffset = dataRegionRowOffset + i; - for (let j = 0; j < dataRegionSizeColumns; ++j) { - const readColumnOffset = dataRegionColumn * (dataRegionSizeColumns + 2) + 1 + j; - if (bitMatrix.get(readColumnOffset, readRowOffset)) { - const writeColumnOffset = dataRegionColumnOffset + j; - bitMatrixWithoutAlignment.set(writeColumnOffset, writeRowOffset); - } - } - } - } - } - return bitMatrixWithoutAlignment; - } - } - - /** - *

    Encapsulates a block of data within a Data Matrix Code. Data Matrix Codes may split their data into - * multiple blocks, each of which is a unit of data and error-correction codewords. Each - * is represented by an instance of this class.

    - * - * @author bbrown@google.com (Brian Brown) - */ - class DataBlock { - constructor(numDataCodewords, codewords) { - this.numDataCodewords = numDataCodewords; - this.codewords = codewords; - } - /** - *

    When Data Matrix Codes use multiple data blocks, they actually interleave the bytes of each of them. - * That is, the first byte of data block 1 to n is written, then the second bytes, and so on. This - * method will separate the data into original blocks.

    - * - * @param rawCodewords bytes as read directly from the Data Matrix Code - * @param version version of the Data Matrix Code - * @return DataBlocks containing original bytes, "de-interleaved" from representation in the - * Data Matrix Code - */ - static getDataBlocks(rawCodewords, version) { - // Figure out the number and size of data blocks used by this version - const ecBlocks = version.getECBlocks(); - // First count the total number of data blocks - let totalBlocks = 0; - const ecBlockArray = ecBlocks.getECBlocks(); - for (let ecBlock of ecBlockArray) { - totalBlocks += ecBlock.getCount(); - } - // Now establish DataBlocks of the appropriate size and number of data codewords - const result = new Array(totalBlocks); - let numResultBlocks = 0; - for (let ecBlock of ecBlockArray) { - for (let i = 0; i < ecBlock.getCount(); i++) { - const numDataCodewords = ecBlock.getDataCodewords(); - const numBlockCodewords = ecBlocks.getECCodewords() + numDataCodewords; - result[numResultBlocks++] = new DataBlock(numDataCodewords, new Uint8Array(numBlockCodewords)); - } - } - // All blocks have the same amount of data, except that the last n - // (where n may be 0) have 1 less byte. Figure out where these start. - // TODO(bbrown): There is only one case where there is a difference for Data Matrix for size 144 - const longerBlocksTotalCodewords = result[0].codewords.length; - // int shorterBlocksTotalCodewords = longerBlocksTotalCodewords - 1; - const longerBlocksNumDataCodewords = longerBlocksTotalCodewords - ecBlocks.getECCodewords(); - const shorterBlocksNumDataCodewords = longerBlocksNumDataCodewords - 1; - // The last elements of result may be 1 element shorter for 144 matrix - // first fill out as many elements as all of them have minus 1 - let rawCodewordsOffset = 0; - for (let i = 0; i < shorterBlocksNumDataCodewords; i++) { - for (let j = 0; j < numResultBlocks; j++) { - result[j].codewords[i] = rawCodewords[rawCodewordsOffset++]; - } - } - // Fill out the last data block in the longer ones - const specialVersion = version.getVersionNumber() === 24; - const numLongerBlocks = specialVersion ? 8 : numResultBlocks; - for (let j = 0; j < numLongerBlocks; j++) { - result[j].codewords[longerBlocksNumDataCodewords - 1] = rawCodewords[rawCodewordsOffset++]; - } - // Now add in error correction blocks - const max = result[0].codewords.length; - for (let i = longerBlocksNumDataCodewords; i < max; i++) { - for (let j = 0; j < numResultBlocks; j++) { - const jOffset = specialVersion ? (j + 8) % numResultBlocks : j; - const iOffset = specialVersion && jOffset > 7 ? i - 1 : i; - result[jOffset].codewords[iOffset] = rawCodewords[rawCodewordsOffset++]; - } - } - if (rawCodewordsOffset !== rawCodewords.length) { - throw new IllegalArgumentException(); - } - return result; - } - getNumDataCodewords() { - return this.numDataCodewords; - } - getCodewords() { - return this.codewords; - } - } - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - *

    This provides an easy abstraction to read bits at a time from a sequence of bytes, where the - * number of bits read is not often a multiple of 8.

    - * - *

    This class is thread-safe but not reentrant -- unless the caller modifies the bytes array - * it passed in, in which case all bets are off.

    - * - * @author Sean Owen - */ - class BitSource { - /** - * @param bytes bytes from which this will read bits. Bits will be read from the first byte first. - * Bits are read within a byte from most-significant to least-significant bit. - */ - constructor(bytes) { - this.bytes = bytes; - this.byteOffset = 0; - this.bitOffset = 0; - } - /** - * @return index of next bit in current byte which would be read by the next call to {@link #readBits(int)}. - */ - getBitOffset() { - return this.bitOffset; - } - /** - * @return index of next byte in input byte array which would be read by the next call to {@link #readBits(int)}. - */ - getByteOffset() { - return this.byteOffset; - } - /** - * @param numBits number of bits to read - * @return int representing the bits read. The bits will appear as the least-significant - * bits of the int - * @throws IllegalArgumentException if numBits isn't in [1,32] or more than is available - */ - readBits(numBits /*int*/) { - if (numBits < 1 || numBits > 32 || numBits > this.available()) { - throw new IllegalArgumentException('' + numBits); - } - let result = 0; - let bitOffset = this.bitOffset; - let byteOffset = this.byteOffset; - const bytes = this.bytes; - // First, read remainder from current byte - if (bitOffset > 0) { - const bitsLeft = 8 - bitOffset; - const toRead = numBits < bitsLeft ? numBits : bitsLeft; - const bitsToNotRead = bitsLeft - toRead; - const mask = (0xFF >> (8 - toRead)) << bitsToNotRead; - result = (bytes[byteOffset] & mask) >> bitsToNotRead; - numBits -= toRead; - bitOffset += toRead; - if (bitOffset === 8) { - bitOffset = 0; - byteOffset++; - } - } - // Next read whole bytes - if (numBits > 0) { - while (numBits >= 8) { - result = (result << 8) | (bytes[byteOffset] & 0xFF); - byteOffset++; - numBits -= 8; - } - // Finally read a partial byte - if (numBits > 0) { - const bitsToNotRead = 8 - numBits; - const mask = (0xFF >> bitsToNotRead) << bitsToNotRead; - result = (result << numBits) | ((bytes[byteOffset] & mask) >> bitsToNotRead); - bitOffset += numBits; - } - } - this.bitOffset = bitOffset; - this.byteOffset = byteOffset; - return result; - } - /** - * @return number of bits that can be read successfully - */ - available() { - return 8 * (this.bytes.length - this.byteOffset) - this.bitOffset; - } - } - - var Mode; - (function (Mode) { - Mode[Mode["PAD_ENCODE"] = 0] = "PAD_ENCODE"; - Mode[Mode["ASCII_ENCODE"] = 1] = "ASCII_ENCODE"; - Mode[Mode["C40_ENCODE"] = 2] = "C40_ENCODE"; - Mode[Mode["TEXT_ENCODE"] = 3] = "TEXT_ENCODE"; - Mode[Mode["ANSIX12_ENCODE"] = 4] = "ANSIX12_ENCODE"; - Mode[Mode["EDIFACT_ENCODE"] = 5] = "EDIFACT_ENCODE"; - Mode[Mode["BASE256_ENCODE"] = 6] = "BASE256_ENCODE"; - })(Mode || (Mode = {})); - /** - *

    Data Matrix Codes can encode text as bits in one of several modes, and can use multiple modes - * in one Data Matrix Code. This class decodes the bits back into text.

    - * - *

    See ISO 16022:2006, 5.2.1 - 5.2.9.2

    - * - * @author bbrown@google.com (Brian Brown) - * @author Sean Owen - */ - class DecodedBitStreamParser { - static decode(bytes) { - const bits = new BitSource(bytes); - const result = new StringBuilder(); - const resultTrailer = new StringBuilder(); - const byteSegments = new Array(); - let mode = Mode.ASCII_ENCODE; - do { - if (mode === Mode.ASCII_ENCODE) { - mode = this.decodeAsciiSegment(bits, result, resultTrailer); - } - else { - switch (mode) { - case Mode.C40_ENCODE: - this.decodeC40Segment(bits, result); - break; - case Mode.TEXT_ENCODE: - this.decodeTextSegment(bits, result); - break; - case Mode.ANSIX12_ENCODE: - this.decodeAnsiX12Segment(bits, result); - break; - case Mode.EDIFACT_ENCODE: - this.decodeEdifactSegment(bits, result); - break; - case Mode.BASE256_ENCODE: - this.decodeBase256Segment(bits, result, byteSegments); - break; - default: - throw new FormatException(); - } - mode = Mode.ASCII_ENCODE; - } - } while (mode !== Mode.PAD_ENCODE && bits.available() > 0); - if (resultTrailer.length() > 0) { - result.append(resultTrailer.toString()); - } - return new DecoderResult(bytes, result.toString(), byteSegments.length === 0 ? null : byteSegments, null); - } - /** - * See ISO 16022:2006, 5.2.3 and Annex C, Table C.2 - */ - static decodeAsciiSegment(bits, result, resultTrailer) { - let upperShift = false; - do { - let oneByte = bits.readBits(8); - if (oneByte === 0) { - throw new FormatException(); - } - else if (oneByte <= 128) { // ASCII data (ASCII value + 1) - if (upperShift) { - oneByte += 128; - // upperShift = false; - } - result.append(String.fromCharCode(oneByte - 1)); - return Mode.ASCII_ENCODE; - } - else if (oneByte === 129) { // Pad - return Mode.PAD_ENCODE; - } - else if (oneByte <= 229) { // 2-digit data 00-99 (Numeric Value + 130) - const value = oneByte - 130; - if (value < 10) { // pad with '0' for single digit values - result.append('0'); - } - result.append('' + value); - } - else { - switch (oneByte) { - case 230: // Latch to C40 encodation - return Mode.C40_ENCODE; - case 231: // Latch to Base 256 encodation - return Mode.BASE256_ENCODE; - case 232: // FNC1 - result.append(String.fromCharCode(29)); // translate as ASCII 29 - break; - case 233: // Structured Append - case 234: // Reader Programming - // Ignore these symbols for now - // throw ReaderException.getInstance(); - break; - case 235: // Upper Shift (shift to Extended ASCII) - upperShift = true; - break; - case 236: // 05 Macro - result.append('[)>\u001E05\u001D'); - resultTrailer.insert(0, '\u001E\u0004'); - break; - case 237: // 06 Macro - result.append('[)>\u001E06\u001D'); - resultTrailer.insert(0, '\u001E\u0004'); - break; - case 238: // Latch to ANSI X12 encodation - return Mode.ANSIX12_ENCODE; - case 239: // Latch to Text encodation - return Mode.TEXT_ENCODE; - case 240: // Latch to EDIFACT encodation - return Mode.EDIFACT_ENCODE; - case 241: // ECI Character - // TODO(bbrown): I think we need to support ECI - // throw ReaderException.getInstance(); - // Ignore this symbol for now - break; - default: - // Not to be used in ASCII encodation - // but work around encoders that end with 254, latch back to ASCII - if (oneByte !== 254 || bits.available() !== 0) { - throw new FormatException(); - } - break; - } - } - } while (bits.available() > 0); - return Mode.ASCII_ENCODE; - } - /** - * See ISO 16022:2006, 5.2.5 and Annex C, Table C.1 - */ - static decodeC40Segment(bits, result) { - // Three C40 values are encoded in a 16-bit value as - // (1600 * C1) + (40 * C2) + C3 + 1 - // TODO(bbrown): The Upper Shift with C40 doesn't work in the 4 value scenario all the time - let upperShift = false; - const cValues = []; - let shift = 0; - do { - // If there is only one byte left then it will be encoded as ASCII - if (bits.available() === 8) { - return; - } - const firstByte = bits.readBits(8); - if (firstByte === 254) { // Unlatch codeword - return; - } - this.parseTwoBytes(firstByte, bits.readBits(8), cValues); - for (let i = 0; i < 3; i++) { - const cValue = cValues[i]; - switch (shift) { - case 0: - if (cValue < 3) { - shift = cValue + 1; - } - else if (cValue < this.C40_BASIC_SET_CHARS.length) { - const c40char = this.C40_BASIC_SET_CHARS[cValue]; - if (upperShift) { - result.append(String.fromCharCode(c40char.charCodeAt(0) + 128)); - upperShift = false; - } - else { - result.append(c40char); - } - } - else { - throw new FormatException(); - } - break; - case 1: - if (upperShift) { - result.append(String.fromCharCode(cValue + 128)); - upperShift = false; - } - else { - result.append(String.fromCharCode(cValue)); - } - shift = 0; - break; - case 2: - if (cValue < this.C40_SHIFT2_SET_CHARS.length) { - const c40char = this.C40_SHIFT2_SET_CHARS[cValue]; - if (upperShift) { - result.append(String.fromCharCode(c40char.charCodeAt(0) + 128)); - upperShift = false; - } - else { - result.append(c40char); - } - } - else { - switch (cValue) { - case 27: // FNC1 - result.append(String.fromCharCode(29)); // translate as ASCII 29 - break; - case 30: // Upper Shift - upperShift = true; - break; - default: - throw new FormatException(); - } - } - shift = 0; - break; - case 3: - if (upperShift) { - result.append(String.fromCharCode(cValue + 224)); - upperShift = false; - } - else { - result.append(String.fromCharCode(cValue + 96)); - } - shift = 0; - break; - default: - throw new FormatException(); - } - } - } while (bits.available() > 0); - } - /** - * See ISO 16022:2006, 5.2.6 and Annex C, Table C.2 - */ - static decodeTextSegment(bits, result) { - // Three Text values are encoded in a 16-bit value as - // (1600 * C1) + (40 * C2) + C3 + 1 - // TODO(bbrown): The Upper Shift with Text doesn't work in the 4 value scenario all the time - let upperShift = false; - let cValues = []; - let shift = 0; - do { - // If there is only one byte left then it will be encoded as ASCII - if (bits.available() === 8) { - return; - } - const firstByte = bits.readBits(8); - if (firstByte === 254) { // Unlatch codeword - return; - } - this.parseTwoBytes(firstByte, bits.readBits(8), cValues); - for (let i = 0; i < 3; i++) { - const cValue = cValues[i]; - switch (shift) { - case 0: - if (cValue < 3) { - shift = cValue + 1; - } - else if (cValue < this.TEXT_BASIC_SET_CHARS.length) { - const textChar = this.TEXT_BASIC_SET_CHARS[cValue]; - if (upperShift) { - result.append(String.fromCharCode(textChar.charCodeAt(0) + 128)); - upperShift = false; - } - else { - result.append(textChar); - } - } - else { - throw new FormatException(); - } - break; - case 1: - if (upperShift) { - result.append(String.fromCharCode(cValue + 128)); - upperShift = false; - } - else { - result.append(String.fromCharCode(cValue)); - } - shift = 0; - break; - case 2: - // Shift 2 for Text is the same encoding as C40 - if (cValue < this.TEXT_SHIFT2_SET_CHARS.length) { - const textChar = this.TEXT_SHIFT2_SET_CHARS[cValue]; - if (upperShift) { - result.append(String.fromCharCode(textChar.charCodeAt(0) + 128)); - upperShift = false; - } - else { - result.append(textChar); - } - } - else { - switch (cValue) { - case 27: // FNC1 - result.append(String.fromCharCode(29)); // translate as ASCII 29 - break; - case 30: // Upper Shift - upperShift = true; - break; - default: - throw new FormatException(); - } - } - shift = 0; - break; - case 3: - if (cValue < this.TEXT_SHIFT3_SET_CHARS.length) { - const textChar = this.TEXT_SHIFT3_SET_CHARS[cValue]; - if (upperShift) { - result.append(String.fromCharCode(textChar.charCodeAt(0) + 128)); - upperShift = false; - } - else { - result.append(textChar); - } - shift = 0; - } - else { - throw new FormatException(); - } - break; - default: - throw new FormatException(); - } - } - } while (bits.available() > 0); - } - /** - * See ISO 16022:2006, 5.2.7 - */ - static decodeAnsiX12Segment(bits, result) { - // Three ANSI X12 values are encoded in a 16-bit value as - // (1600 * C1) + (40 * C2) + C3 + 1 - const cValues = []; - do { - // If there is only one byte left then it will be encoded as ASCII - if (bits.available() === 8) { - return; - } - const firstByte = bits.readBits(8); - if (firstByte === 254) { // Unlatch codeword - return; - } - this.parseTwoBytes(firstByte, bits.readBits(8), cValues); - for (let i = 0; i < 3; i++) { - const cValue = cValues[i]; - switch (cValue) { - case 0: // X12 segment terminator - result.append('\r'); - break; - case 1: // X12 segment separator * - result.append('*'); - break; - case 2: // X12 sub-element separator > - result.append('>'); - break; - case 3: // space - result.append(' '); - break; - default: - if (cValue < 14) { // 0 - 9 - result.append(String.fromCharCode(cValue + 44)); - } - else if (cValue < 40) { // A - Z - result.append(String.fromCharCode(cValue + 51)); - } - else { - throw new FormatException(); - } - break; - } - } - } while (bits.available() > 0); - } - static parseTwoBytes(firstByte, secondByte, result) { - let fullBitValue = (firstByte << 8) + secondByte - 1; - let temp = Math.floor(fullBitValue / 1600); - result[0] = temp; - fullBitValue -= temp * 1600; - temp = Math.floor(fullBitValue / 40); - result[1] = temp; - result[2] = fullBitValue - temp * 40; - } - /** - * See ISO 16022:2006, 5.2.8 and Annex C Table C.3 - */ - static decodeEdifactSegment(bits, result) { - do { - // If there is only two or less bytes left then it will be encoded as ASCII - if (bits.available() <= 16) { - return; - } - for (let i = 0; i < 4; i++) { - let edifactValue = bits.readBits(6); - // Check for the unlatch character - if (edifactValue === 0x1F) { // 011111 - // Read rest of byte, which should be 0, and stop - const bitsLeft = 8 - bits.getBitOffset(); - if (bitsLeft !== 8) { - bits.readBits(bitsLeft); - } - return; - } - if ((edifactValue & 0x20) === 0) { // no 1 in the leading (6th) bit - edifactValue |= 0x40; // Add a leading 01 to the 6 bit binary value - } - result.append(String.fromCharCode(edifactValue)); - } - } while (bits.available() > 0); - } - /** - * See ISO 16022:2006, 5.2.9 and Annex B, B.2 - */ - static decodeBase256Segment(bits, result, byteSegments) { - // Figure out how long the Base 256 Segment is. - let codewordPosition = 1 + bits.getByteOffset(); // position is 1-indexed - const d1 = this.unrandomize255State(bits.readBits(8), codewordPosition++); - let count; - if (d1 === 0) { // Read the remainder of the symbol - count = bits.available() / 8 | 0; - } - else if (d1 < 250) { - count = d1; - } - else { - count = 250 * (d1 - 249) + this.unrandomize255State(bits.readBits(8), codewordPosition++); - } - // We're seeing NegativeArraySizeException errors from users. - if (count < 0) { - throw new FormatException(); - } - const bytes = new Uint8Array(count); - for (let i = 0; i < count; i++) { - // Have seen this particular error in the wild, such as at - // http://www.bcgen.com/demo/IDAutomationStreamingDataMatrix.aspx?MODE=3&D=Fred&PFMT=3&PT=F&X=0.3&O=0&LM=0.2 - if (bits.available() < 8) { - throw new FormatException(); - } - bytes[i] = this.unrandomize255State(bits.readBits(8), codewordPosition++); - } - byteSegments.push(bytes); - try { - result.append(StringEncoding.decode(bytes, StringUtils.ISO88591)); - } - catch (uee) { - throw new IllegalStateException('Platform does not support required encoding: ' + uee.message); - } - } - /** - * See ISO 16022:2006, Annex B, B.2 - */ - static unrandomize255State(randomizedBase256Codeword, base256CodewordPosition) { - const pseudoRandomNumber = ((149 * base256CodewordPosition) % 255) + 1; - const tempVariable = randomizedBase256Codeword - pseudoRandomNumber; - return tempVariable >= 0 ? tempVariable : tempVariable + 256; - } - } - /** - * See ISO 16022:2006, Annex C Table C.1 - * The C40 Basic Character Set (*'s used for placeholders for the shift values) - */ - DecodedBitStreamParser.C40_BASIC_SET_CHARS = [ - '*', '*', '*', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', - 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' - ]; - DecodedBitStreamParser.C40_SHIFT2_SET_CHARS = [ - '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', - '/', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_' - ]; - /** - * See ISO 16022:2006, Annex C Table C.2 - * The Text Basic Character Set (*'s used for placeholders for the shift values) - */ - DecodedBitStreamParser.TEXT_BASIC_SET_CHARS = [ - '*', '*', '*', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', - 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' - ]; - // Shift 2 for Text is the same encoding as C40 - DecodedBitStreamParser.TEXT_SHIFT2_SET_CHARS = DecodedBitStreamParser.C40_SHIFT2_SET_CHARS; - DecodedBitStreamParser.TEXT_SHIFT3_SET_CHARS = [ - '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', - 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '{', '|', '}', '~', String.fromCharCode(127) - ]; - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - *

    The main class which implements Data Matrix Code decoding -- as opposed to locating and extracting - * the Data Matrix Code from an image.

    - * - * @author bbrown@google.com (Brian Brown) - */ - class Decoder$1 { - constructor() { - this.rsDecoder = new ReedSolomonDecoder(GenericGF.DATA_MATRIX_FIELD_256); - } - /** - *

    Decodes a Data Matrix Code represented as a {@link BitMatrix}. A 1 or "true" is taken - * to mean a black module.

    - * - * @param bits booleans representing white/black Data Matrix Code modules - * @return text and bytes encoded within the Data Matrix Code - * @throws FormatException if the Data Matrix Code cannot be decoded - * @throws ChecksumException if error correction fails - */ - decode(bits) { - // Construct a parser and read version, error-correction level - const parser = new BitMatrixParser(bits); - const version = parser.getVersion(); - // Read codewords - const codewords = parser.readCodewords(); - // Separate into data blocks - const dataBlocks = DataBlock.getDataBlocks(codewords, version); - // Count total number of data bytes - let totalBytes = 0; - for (let db of dataBlocks) { - totalBytes += db.getNumDataCodewords(); - } - const resultBytes = new Uint8Array(totalBytes); - const dataBlocksCount = dataBlocks.length; - // Error-correct and copy data blocks together into a stream of bytes - for (let j = 0; j < dataBlocksCount; j++) { - const dataBlock = dataBlocks[j]; - const codewordBytes = dataBlock.getCodewords(); - const numDataCodewords = dataBlock.getNumDataCodewords(); - this.correctErrors(codewordBytes, numDataCodewords); - for (let i = 0; i < numDataCodewords; i++) { - // De-interlace data blocks. - resultBytes[i * dataBlocksCount + j] = codewordBytes[i]; - } - } - // Decode the contents of that stream of bytes - return DecodedBitStreamParser.decode(resultBytes); - } - /** - *

    Given data and error-correction codewords received, possibly corrupted by errors, attempts to - * correct the errors in-place using Reed-Solomon error correction.

    - * - * @param codewordBytes data and error correction codewords - * @param numDataCodewords number of codewords that are data bytes - * @throws ChecksumException if error correction fails - */ - correctErrors(codewordBytes, numDataCodewords) { - // const numCodewords = codewordBytes.length; - // First read into an array of ints - const codewordsInts = new Int32Array(codewordBytes); - // for (let i = 0; i < numCodewords; i++) { - // codewordsInts[i] = codewordBytes[i] & 0xFF; - // } - try { - this.rsDecoder.decode(codewordsInts, codewordBytes.length - numDataCodewords); - } - catch (ignored /* ReedSolomonException */) { - throw new ChecksumException(); - } - // Copy back into array of bytes -- only need to worry about the bytes that were data - // We don't care about errors in the error-correction codewords - for (let i = 0; i < numDataCodewords; i++) { - codewordBytes[i] = codewordsInts[i]; - } - } - } - - /** - *

    Encapsulates logic that can detect a Data Matrix Code in an image, even if the Data Matrix Code - * is rotated or skewed, or partially obscured.

    - * - * @author Sean Owen - */ - class Detector$1 { - constructor(image) { - this.image = image; - this.rectangleDetector = new WhiteRectangleDetector(this.image); - } - /** - *

    Detects a Data Matrix Code in an image.

    - * - * @return {@link DetectorResult} encapsulating results of detecting a Data Matrix Code - * @throws NotFoundException if no Data Matrix Code can be found - */ - detect() { - const cornerPoints = this.rectangleDetector.detect(); - let points = this.detectSolid1(cornerPoints); - points = this.detectSolid2(points); - points[3] = this.correctTopRight(points); - if (!points[3]) { - throw new NotFoundException(); - } - points = this.shiftToModuleCenter(points); - const topLeft = points[0]; - const bottomLeft = points[1]; - const bottomRight = points[2]; - const topRight = points[3]; - let dimensionTop = this.transitionsBetween(topLeft, topRight) + 1; - let dimensionRight = this.transitionsBetween(bottomRight, topRight) + 1; - if ((dimensionTop & 0x01) === 1) { - dimensionTop += 1; - } - if ((dimensionRight & 0x01) === 1) { - dimensionRight += 1; - } - if (4 * dimensionTop < 7 * dimensionRight && 4 * dimensionRight < 7 * dimensionTop) { - // The matrix is square - dimensionTop = dimensionRight = Math.max(dimensionTop, dimensionRight); - } - let bits = Detector$1.sampleGrid(this.image, topLeft, bottomLeft, bottomRight, topRight, dimensionTop, dimensionRight); - return new DetectorResult(bits, [topLeft, bottomLeft, bottomRight, topRight]); - } - static shiftPoint(point, to, div) { - let x = (to.getX() - point.getX()) / (div + 1); - let y = (to.getY() - point.getY()) / (div + 1); - return new ResultPoint(point.getX() + x, point.getY() + y); - } - static moveAway(point, fromX, fromY) { - let x = point.getX(); - let y = point.getY(); - if (x < fromX) { - x -= 1; - } - else { - x += 1; - } - if (y < fromY) { - y -= 1; - } - else { - y += 1; - } - return new ResultPoint(x, y); - } - /** - * Detect a solid side which has minimum transition. - */ - detectSolid1(cornerPoints) { - // 0 2 - // 1 3 - let pointA = cornerPoints[0]; - let pointB = cornerPoints[1]; - let pointC = cornerPoints[3]; - let pointD = cornerPoints[2]; - let trAB = this.transitionsBetween(pointA, pointB); - let trBC = this.transitionsBetween(pointB, pointC); - let trCD = this.transitionsBetween(pointC, pointD); - let trDA = this.transitionsBetween(pointD, pointA); - // 0..3 - // : : - // 1--2 - let min = trAB; - let points = [pointD, pointA, pointB, pointC]; - if (min > trBC) { - min = trBC; - points[0] = pointA; - points[1] = pointB; - points[2] = pointC; - points[3] = pointD; - } - if (min > trCD) { - min = trCD; - points[0] = pointB; - points[1] = pointC; - points[2] = pointD; - points[3] = pointA; - } - if (min > trDA) { - points[0] = pointC; - points[1] = pointD; - points[2] = pointA; - points[3] = pointB; - } - return points; - } - /** - * Detect a second solid side next to first solid side. - */ - detectSolid2(points) { - // A..D - // : : - // B--C - let pointA = points[0]; - let pointB = points[1]; - let pointC = points[2]; - let pointD = points[3]; - // Transition detection on the edge is not stable. - // To safely detect, shift the points to the module center. - let tr = this.transitionsBetween(pointA, pointD); - let pointBs = Detector$1.shiftPoint(pointB, pointC, (tr + 1) * 4); - let pointCs = Detector$1.shiftPoint(pointC, pointB, (tr + 1) * 4); - let trBA = this.transitionsBetween(pointBs, pointA); - let trCD = this.transitionsBetween(pointCs, pointD); - // 0..3 - // | : - // 1--2 - if (trBA < trCD) { - // solid sides: A-B-C - points[0] = pointA; - points[1] = pointB; - points[2] = pointC; - points[3] = pointD; - } - else { - // solid sides: B-C-D - points[0] = pointB; - points[1] = pointC; - points[2] = pointD; - points[3] = pointA; - } - return points; - } - /** - * Calculates the corner position of the white top right module. - */ - correctTopRight(points) { - // A..D - // | : - // B--C - let pointA = points[0]; - let pointB = points[1]; - let pointC = points[2]; - let pointD = points[3]; - // shift points for safe transition detection. - let trTop = this.transitionsBetween(pointA, pointD); - let trRight = this.transitionsBetween(pointB, pointD); - let pointAs = Detector$1.shiftPoint(pointA, pointB, (trRight + 1) * 4); - let pointCs = Detector$1.shiftPoint(pointC, pointB, (trTop + 1) * 4); - trTop = this.transitionsBetween(pointAs, pointD); - trRight = this.transitionsBetween(pointCs, pointD); - let candidate1 = new ResultPoint(pointD.getX() + (pointC.getX() - pointB.getX()) / (trTop + 1), pointD.getY() + (pointC.getY() - pointB.getY()) / (trTop + 1)); - let candidate2 = new ResultPoint(pointD.getX() + (pointA.getX() - pointB.getX()) / (trRight + 1), pointD.getY() + (pointA.getY() - pointB.getY()) / (trRight + 1)); - if (!this.isValid(candidate1)) { - if (this.isValid(candidate2)) { - return candidate2; - } - return null; - } - if (!this.isValid(candidate2)) { - return candidate1; - } - let sumc1 = this.transitionsBetween(pointAs, candidate1) + this.transitionsBetween(pointCs, candidate1); - let sumc2 = this.transitionsBetween(pointAs, candidate2) + this.transitionsBetween(pointCs, candidate2); - if (sumc1 > sumc2) { - return candidate1; - } - else { - return candidate2; - } - } - /** - * Shift the edge points to the module center. - */ - shiftToModuleCenter(points) { - // A..D - // | : - // B--C - let pointA = points[0]; - let pointB = points[1]; - let pointC = points[2]; - let pointD = points[3]; - // calculate pseudo dimensions - let dimH = this.transitionsBetween(pointA, pointD) + 1; - let dimV = this.transitionsBetween(pointC, pointD) + 1; - // shift points for safe dimension detection - let pointAs = Detector$1.shiftPoint(pointA, pointB, dimV * 4); - let pointCs = Detector$1.shiftPoint(pointC, pointB, dimH * 4); - // calculate more precise dimensions - dimH = this.transitionsBetween(pointAs, pointD) + 1; - dimV = this.transitionsBetween(pointCs, pointD) + 1; - if ((dimH & 0x01) === 1) { - dimH += 1; - } - if ((dimV & 0x01) === 1) { - dimV += 1; - } - // WhiteRectangleDetector returns points inside of the rectangle. - // I want points on the edges. - let centerX = (pointA.getX() + pointB.getX() + pointC.getX() + pointD.getX()) / 4; - let centerY = (pointA.getY() + pointB.getY() + pointC.getY() + pointD.getY()) / 4; - pointA = Detector$1.moveAway(pointA, centerX, centerY); - pointB = Detector$1.moveAway(pointB, centerX, centerY); - pointC = Detector$1.moveAway(pointC, centerX, centerY); - pointD = Detector$1.moveAway(pointD, centerX, centerY); - let pointBs; - let pointDs; - // shift points to the center of each modules - pointAs = Detector$1.shiftPoint(pointA, pointB, dimV * 4); - pointAs = Detector$1.shiftPoint(pointAs, pointD, dimH * 4); - pointBs = Detector$1.shiftPoint(pointB, pointA, dimV * 4); - pointBs = Detector$1.shiftPoint(pointBs, pointC, dimH * 4); - pointCs = Detector$1.shiftPoint(pointC, pointD, dimV * 4); - pointCs = Detector$1.shiftPoint(pointCs, pointB, dimH * 4); - pointDs = Detector$1.shiftPoint(pointD, pointC, dimV * 4); - pointDs = Detector$1.shiftPoint(pointDs, pointA, dimH * 4); - return [pointAs, pointBs, pointCs, pointDs]; - } - isValid(p) { - return p.getX() >= 0 && p.getX() < this.image.getWidth() && p.getY() > 0 && p.getY() < this.image.getHeight(); - } - static sampleGrid(image, topLeft, bottomLeft, bottomRight, topRight, dimensionX, dimensionY) { - const sampler = GridSamplerInstance.getInstance(); - return sampler.sampleGrid(image, dimensionX, dimensionY, 0.5, 0.5, dimensionX - 0.5, 0.5, dimensionX - 0.5, dimensionY - 0.5, 0.5, dimensionY - 0.5, topLeft.getX(), topLeft.getY(), topRight.getX(), topRight.getY(), bottomRight.getX(), bottomRight.getY(), bottomLeft.getX(), bottomLeft.getY()); - } - /** - * Counts the number of black/white transitions between two points, using something like Bresenham's algorithm. - */ - transitionsBetween(from, to) { - // See QR Code Detector, sizeOfBlackWhiteBlackRun() - let fromX = Math.trunc(from.getX()); - let fromY = Math.trunc(from.getY()); - let toX = Math.trunc(to.getX()); - let toY = Math.trunc(to.getY()); - let steep = Math.abs(toY - fromY) > Math.abs(toX - fromX); - if (steep) { - let temp = fromX; - fromX = fromY; - fromY = temp; - temp = toX; - toX = toY; - toY = temp; - } - let dx = Math.abs(toX - fromX); - let dy = Math.abs(toY - fromY); - let error = -dx / 2; - let ystep = fromY < toY ? 1 : -1; - let xstep = fromX < toX ? 1 : -1; - let transitions = 0; - let inBlack = this.image.get(steep ? fromY : fromX, steep ? fromX : fromY); - for (let x = fromX, y = fromY; x !== toX; x += xstep) { - let isBlack = this.image.get(steep ? y : x, steep ? x : y); - if (isBlack !== inBlack) { - transitions++; - inBlack = isBlack; - } - error += dy; - if (error > 0) { - if (y === toY) { - break; - } - y += ystep; - error -= dx; - } - } - return transitions; - } - } - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * This implementation can detect and decode Data Matrix codes in an image. - * - * @author bbrown@google.com (Brian Brown) - */ - class DataMatrixReader { - constructor() { - this.decoder = new Decoder$1(); - } - /** - * Locates and decodes a Data Matrix code in an image. - * - * @return a String representing the content encoded by the Data Matrix code - * @throws NotFoundException if a Data Matrix code cannot be found - * @throws FormatException if a Data Matrix code cannot be decoded - * @throws ChecksumException if error correction fails - */ - // @Override - // public Result decode(BinaryBitmap image) throws NotFoundException, ChecksumException, FormatException { - // return decode(image, null); - // } - // @Override - decode(image, hints = null) { - let decoderResult; - let points; - if (hints != null && hints.has(DecodeHintType$1.PURE_BARCODE)) { - const bits = DataMatrixReader.extractPureBits(image.getBlackMatrix()); - decoderResult = this.decoder.decode(bits); - points = DataMatrixReader.NO_POINTS; - } - else { - const detectorResult = new Detector$1(image.getBlackMatrix()).detect(); - decoderResult = this.decoder.decode(detectorResult.getBits()); - points = detectorResult.getPoints(); - } - const rawBytes = decoderResult.getRawBytes(); - const result = new Result(decoderResult.getText(), rawBytes, 8 * rawBytes.length, points, BarcodeFormat$1.DATA_MATRIX, System.currentTimeMillis()); - const byteSegments = decoderResult.getByteSegments(); - if (byteSegments != null) { - result.putMetadata(ResultMetadataType$1.BYTE_SEGMENTS, byteSegments); - } - const ecLevel = decoderResult.getECLevel(); - if (ecLevel != null) { - result.putMetadata(ResultMetadataType$1.ERROR_CORRECTION_LEVEL, ecLevel); - } - return result; - } - // @Override - reset() { - // do nothing - } - /** - * This method detects a code in a "pure" image -- that is, pure monochrome image - * which contains only an unrotated, unskewed, image of a code, with some white border - * around it. This is a specialized method that works exceptionally fast in this special - * case. - * - * @see com.google.zxing.qrcode.QRCodeReader#extractPureBits(BitMatrix) - */ - static extractPureBits(image) { - const leftTopBlack = image.getTopLeftOnBit(); - const rightBottomBlack = image.getBottomRightOnBit(); - if (leftTopBlack == null || rightBottomBlack == null) { - throw new NotFoundException(); - } - const moduleSize = this.moduleSize(leftTopBlack, image); - let top = leftTopBlack[1]; - const bottom = rightBottomBlack[1]; - let left = leftTopBlack[0]; - const right = rightBottomBlack[0]; - const matrixWidth = (right - left + 1) / moduleSize; - const matrixHeight = (bottom - top + 1) / moduleSize; - if (matrixWidth <= 0 || matrixHeight <= 0) { - throw new NotFoundException(); - } - // Push in the "border" by half the module width so that we start - // sampling in the middle of the module. Just in case the image is a - // little off, this will help recover. - const nudge = moduleSize / 2; - top += nudge; - left += nudge; - // Now just read off the bits - const bits = new BitMatrix(matrixWidth, matrixHeight); - for (let y = 0; y < matrixHeight; y++) { - const iOffset = top + y * moduleSize; - for (let x = 0; x < matrixWidth; x++) { - if (image.get(left + x * moduleSize, iOffset)) { - bits.set(x, y); - } - } - } - return bits; - } - static moduleSize(leftTopBlack, image) { - const width = image.getWidth(); - let x = leftTopBlack[0]; - const y = leftTopBlack[1]; - while (x < width && image.get(x, y)) { - x++; - } - if (x === width) { - throw new NotFoundException(); - } - const moduleSize = x - leftTopBlack[0]; - if (moduleSize === 0) { - throw new NotFoundException(); - } - return moduleSize; - } - } - DataMatrixReader.NO_POINTS = []; - - /** - * @deprecated Moving to @zxing/browser - * - * QR Code reader to use from browser. - */ - class BrowserDatamatrixCodeReader extends BrowserCodeReader { - /** - * Creates an instance of BrowserQRCodeReader. - * @param {number} [timeBetweenScansMillis=500] the time delay between subsequent decode tries - */ - constructor(timeBetweenScansMillis = 500) { - super(new DataMatrixReader(), timeBetweenScansMillis); - } - } - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - var ErrorCorrectionLevelValues; - (function (ErrorCorrectionLevelValues) { - ErrorCorrectionLevelValues[ErrorCorrectionLevelValues["L"] = 0] = "L"; - ErrorCorrectionLevelValues[ErrorCorrectionLevelValues["M"] = 1] = "M"; - ErrorCorrectionLevelValues[ErrorCorrectionLevelValues["Q"] = 2] = "Q"; - ErrorCorrectionLevelValues[ErrorCorrectionLevelValues["H"] = 3] = "H"; - })(ErrorCorrectionLevelValues || (ErrorCorrectionLevelValues = {})); - /** - *

    See ISO 18004:2006, 6.5.1. This enum encapsulates the four error correction levels - * defined by the QR code standard.

    - * - * @author Sean Owen - */ - class ErrorCorrectionLevel { - constructor(value, stringValue, bits /*int*/) { - this.value = value; - this.stringValue = stringValue; - this.bits = bits; - ErrorCorrectionLevel.FOR_BITS.set(bits, this); - ErrorCorrectionLevel.FOR_VALUE.set(value, this); - } - getValue() { - return this.value; - } - getBits() { - return this.bits; - } - static fromString(s) { - switch (s) { - case 'L': return ErrorCorrectionLevel.L; - case 'M': return ErrorCorrectionLevel.M; - case 'Q': return ErrorCorrectionLevel.Q; - case 'H': return ErrorCorrectionLevel.H; - default: throw new ArgumentException(s + 'not available'); - } - } - toString() { - return this.stringValue; - } - equals(o) { - if (!(o instanceof ErrorCorrectionLevel)) { - return false; - } - const other = o; - return this.value === other.value; - } - /** - * @param bits int containing the two bits encoding a QR Code's error correction level - * @return ErrorCorrectionLevel representing the encoded error correction level - */ - static forBits(bits /*int*/) { - if (bits < 0 || bits >= ErrorCorrectionLevel.FOR_BITS.size) { - throw new IllegalArgumentException(); - } - return ErrorCorrectionLevel.FOR_BITS.get(bits); - } - } - ErrorCorrectionLevel.FOR_BITS = new Map(); - ErrorCorrectionLevel.FOR_VALUE = new Map(); - /** L = ~7% correction */ - ErrorCorrectionLevel.L = new ErrorCorrectionLevel(ErrorCorrectionLevelValues.L, 'L', 0x01); - /** M = ~15% correction */ - ErrorCorrectionLevel.M = new ErrorCorrectionLevel(ErrorCorrectionLevelValues.M, 'M', 0x00); - /** Q = ~25% correction */ - ErrorCorrectionLevel.Q = new ErrorCorrectionLevel(ErrorCorrectionLevelValues.Q, 'Q', 0x03); - /** H = ~30% correction */ - ErrorCorrectionLevel.H = new ErrorCorrectionLevel(ErrorCorrectionLevelValues.H, 'H', 0x02); - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - *

    Encapsulates a QR Code's format information, including the data mask used and - * error correction level.

    - * - * @author Sean Owen - * @see DataMask - * @see ErrorCorrectionLevel - */ - class FormatInformation { - constructor(formatInfo /*int*/) { - // Bits 3,4 - this.errorCorrectionLevel = ErrorCorrectionLevel.forBits((formatInfo >> 3) & 0x03); - // Bottom 3 bits - this.dataMask = /*(byte) */ (formatInfo & 0x07); - } - static numBitsDiffering(a /*int*/, b /*int*/) { - return Integer.bitCount(a ^ b); - } - /** - * @param maskedFormatInfo1 format info indicator, with mask still applied - * @param maskedFormatInfo2 second copy of same info; both are checked at the same time - * to establish best match - * @return information about the format it specifies, or {@code null} - * if doesn't seem to match any known pattern - */ - static decodeFormatInformation(maskedFormatInfo1 /*int*/, maskedFormatInfo2 /*int*/) { - const formatInfo = FormatInformation.doDecodeFormatInformation(maskedFormatInfo1, maskedFormatInfo2); - if (formatInfo !== null) { - return formatInfo; - } - // Should return null, but, some QR codes apparently - // do not mask this info. Try again by actually masking the pattern - // first - return FormatInformation.doDecodeFormatInformation(maskedFormatInfo1 ^ FormatInformation.FORMAT_INFO_MASK_QR, maskedFormatInfo2 ^ FormatInformation.FORMAT_INFO_MASK_QR); - } - static doDecodeFormatInformation(maskedFormatInfo1 /*int*/, maskedFormatInfo2 /*int*/) { - // Find the int in FORMAT_INFO_DECODE_LOOKUP with fewest bits differing - let bestDifference = Number.MAX_SAFE_INTEGER; - let bestFormatInfo = 0; - for (const decodeInfo of FormatInformation.FORMAT_INFO_DECODE_LOOKUP) { - const targetInfo = decodeInfo[0]; - if (targetInfo === maskedFormatInfo1 || targetInfo === maskedFormatInfo2) { - // Found an exact match - return new FormatInformation(decodeInfo[1]); - } - let bitsDifference = FormatInformation.numBitsDiffering(maskedFormatInfo1, targetInfo); - if (bitsDifference < bestDifference) { - bestFormatInfo = decodeInfo[1]; - bestDifference = bitsDifference; - } - if (maskedFormatInfo1 !== maskedFormatInfo2) { - // also try the other option - bitsDifference = FormatInformation.numBitsDiffering(maskedFormatInfo2, targetInfo); - if (bitsDifference < bestDifference) { - bestFormatInfo = decodeInfo[1]; - bestDifference = bitsDifference; - } - } - } - // Hamming distance of the 32 masked codes is 7, by construction, so <= 3 bits - // differing means we found a match - if (bestDifference <= 3) { - return new FormatInformation(bestFormatInfo); - } - return null; - } - getErrorCorrectionLevel() { - return this.errorCorrectionLevel; - } - getDataMask() { - return this.dataMask; - } - /*@Override*/ - hashCode() { - return (this.errorCorrectionLevel.getBits() << 3) | this.dataMask; - } - /*@Override*/ - equals(o) { - if (!(o instanceof FormatInformation)) { - return false; - } - const other = o; - return this.errorCorrectionLevel === other.errorCorrectionLevel && - this.dataMask === other.dataMask; - } - } - FormatInformation.FORMAT_INFO_MASK_QR = 0x5412; - /** - * See ISO 18004:2006, Annex C, Table C.1 - */ - FormatInformation.FORMAT_INFO_DECODE_LOOKUP = [ - Int32Array.from([0x5412, 0x00]), - Int32Array.from([0x5125, 0x01]), - Int32Array.from([0x5E7C, 0x02]), - Int32Array.from([0x5B4B, 0x03]), - Int32Array.from([0x45F9, 0x04]), - Int32Array.from([0x40CE, 0x05]), - Int32Array.from([0x4F97, 0x06]), - Int32Array.from([0x4AA0, 0x07]), - Int32Array.from([0x77C4, 0x08]), - Int32Array.from([0x72F3, 0x09]), - Int32Array.from([0x7DAA, 0x0A]), - Int32Array.from([0x789D, 0x0B]), - Int32Array.from([0x662F, 0x0C]), - Int32Array.from([0x6318, 0x0D]), - Int32Array.from([0x6C41, 0x0E]), - Int32Array.from([0x6976, 0x0F]), - Int32Array.from([0x1689, 0x10]), - Int32Array.from([0x13BE, 0x11]), - Int32Array.from([0x1CE7, 0x12]), - Int32Array.from([0x19D0, 0x13]), - Int32Array.from([0x0762, 0x14]), - Int32Array.from([0x0255, 0x15]), - Int32Array.from([0x0D0C, 0x16]), - Int32Array.from([0x083B, 0x17]), - Int32Array.from([0x355F, 0x18]), - Int32Array.from([0x3068, 0x19]), - Int32Array.from([0x3F31, 0x1A]), - Int32Array.from([0x3A06, 0x1B]), - Int32Array.from([0x24B4, 0x1C]), - Int32Array.from([0x2183, 0x1D]), - Int32Array.from([0x2EDA, 0x1E]), - Int32Array.from([0x2BED, 0x1F]), - ]; - - /** - *

    Encapsulates a set of error-correction blocks in one symbol version. Most versions will - * use blocks of differing sizes within one version, so, this encapsulates the parameters for - * each set of blocks. It also holds the number of error-correction codewords per block since it - * will be the same across all blocks within one version.

    - */ - class ECBlocks$1 { - constructor(ecCodewordsPerBlock /*int*/, ...ecBlocks) { - this.ecCodewordsPerBlock = ecCodewordsPerBlock; - this.ecBlocks = ecBlocks; - } - getECCodewordsPerBlock() { - return this.ecCodewordsPerBlock; - } - getNumBlocks() { - let total = 0; - const ecBlocks = this.ecBlocks; - for (const ecBlock of ecBlocks) { - total += ecBlock.getCount(); - } - return total; - } - getTotalECCodewords() { - return this.ecCodewordsPerBlock * this.getNumBlocks(); - } - getECBlocks() { - return this.ecBlocks; - } - } - - /** - *

    Encapsulates the parameters for one error-correction block in one symbol version. - * This includes the number of data codewords, and the number of times a block with these - * parameters is used consecutively in the QR code version's format.

    - */ - class ECB$1 { - constructor(count /*int*/, dataCodewords /*int*/) { - this.count = count; - this.dataCodewords = dataCodewords; - } - getCount() { - return this.count; - } - getDataCodewords() { - return this.dataCodewords; - } - } - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * See ISO 18004:2006 Annex D - * - * @author Sean Owen - */ - class Version$1 { - constructor(versionNumber /*int*/, alignmentPatternCenters, ...ecBlocks) { - this.versionNumber = versionNumber; - this.alignmentPatternCenters = alignmentPatternCenters; - this.ecBlocks = ecBlocks; - let total = 0; - const ecCodewords = ecBlocks[0].getECCodewordsPerBlock(); - const ecbArray = ecBlocks[0].getECBlocks(); - for (const ecBlock of ecbArray) { - total += ecBlock.getCount() * (ecBlock.getDataCodewords() + ecCodewords); - } - this.totalCodewords = total; - } - getVersionNumber() { - return this.versionNumber; - } - getAlignmentPatternCenters() { - return this.alignmentPatternCenters; - } - getTotalCodewords() { - return this.totalCodewords; - } - getDimensionForVersion() { - return 17 + 4 * this.versionNumber; - } - getECBlocksForLevel(ecLevel) { - return this.ecBlocks[ecLevel.getValue()]; - // TYPESCRIPTPORT: original was using ordinal, and using the order of levels as defined in ErrorCorrectionLevel enum (LMQH) - // I will use the direct value from ErrorCorrectionLevelValues enum which in typescript goes to a number - } - /** - *

    Deduces version information purely from QR Code dimensions.

    - * - * @param dimension dimension in modules - * @return Version for a QR Code of that dimension - * @throws FormatException if dimension is not 1 mod 4 - */ - static getProvisionalVersionForDimension(dimension /*int*/) { - if (dimension % 4 !== 1) { - throw new FormatException(); - } - try { - return this.getVersionForNumber((dimension - 17) / 4); - } - catch (ignored /*: IllegalArgumentException*/) { - throw new FormatException(); - } - } - static getVersionForNumber(versionNumber /*int*/) { - if (versionNumber < 1 || versionNumber > 40) { - throw new IllegalArgumentException(); - } - return Version$1.VERSIONS[versionNumber - 1]; - } - static decodeVersionInformation(versionBits /*int*/) { - let bestDifference = Number.MAX_SAFE_INTEGER; - let bestVersion = 0; - for (let i = 0; i < Version$1.VERSION_DECODE_INFO.length; i++) { - const targetVersion = Version$1.VERSION_DECODE_INFO[i]; - // Do the version info bits match exactly? done. - if (targetVersion === versionBits) { - return Version$1.getVersionForNumber(i + 7); - } - // Otherwise see if this is the closest to a real version info bit string - // we have seen so far - const bitsDifference = FormatInformation.numBitsDiffering(versionBits, targetVersion); - if (bitsDifference < bestDifference) { - bestVersion = i + 7; - bestDifference = bitsDifference; - } - } - // We can tolerate up to 3 bits of error since no two version info codewords will - // differ in less than 8 bits. - if (bestDifference <= 3) { - return Version$1.getVersionForNumber(bestVersion); - } - // If we didn't find a close enough match, fail - return null; - } - /** - * See ISO 18004:2006 Annex E - */ - buildFunctionPattern() { - const dimension = this.getDimensionForVersion(); - const bitMatrix = new BitMatrix(dimension); - // Top left finder pattern + separator + format - bitMatrix.setRegion(0, 0, 9, 9); - // Top right finder pattern + separator + format - bitMatrix.setRegion(dimension - 8, 0, 8, 9); - // Bottom left finder pattern + separator + format - bitMatrix.setRegion(0, dimension - 8, 9, 8); - // Alignment patterns - const max = this.alignmentPatternCenters.length; - for (let x = 0; x < max; x++) { - const i = this.alignmentPatternCenters[x] - 2; - for (let y = 0; y < max; y++) { - if ((x === 0 && (y === 0 || y === max - 1)) || (x === max - 1 && y === 0)) { - // No alignment patterns near the three finder patterns - continue; - } - bitMatrix.setRegion(this.alignmentPatternCenters[y] - 2, i, 5, 5); - } - } - // Vertical timing pattern - bitMatrix.setRegion(6, 9, 1, dimension - 17); - // Horizontal timing pattern - bitMatrix.setRegion(9, 6, dimension - 17, 1); - if (this.versionNumber > 6) { - // Version info, top right - bitMatrix.setRegion(dimension - 11, 0, 3, 6); - // Version info, bottom left - bitMatrix.setRegion(0, dimension - 11, 6, 3); - } - return bitMatrix; - } - /*@Override*/ - toString() { - return '' + this.versionNumber; - } - } - /** - * See ISO 18004:2006 Annex D. - * Element i represents the raw version bits that specify version i + 7 - */ - Version$1.VERSION_DECODE_INFO = Int32Array.from([ - 0x07C94, 0x085BC, 0x09A99, 0x0A4D3, 0x0BBF6, - 0x0C762, 0x0D847, 0x0E60D, 0x0F928, 0x10B78, - 0x1145D, 0x12A17, 0x13532, 0x149A6, 0x15683, - 0x168C9, 0x177EC, 0x18EC4, 0x191E1, 0x1AFAB, - 0x1B08E, 0x1CC1A, 0x1D33F, 0x1ED75, 0x1F250, - 0x209D5, 0x216F0, 0x228BA, 0x2379F, 0x24B0B, - 0x2542E, 0x26A64, 0x27541, 0x28C69 - ]); - /** - * See ISO 18004:2006 6.5.1 Table 9 - */ - Version$1.VERSIONS = [ - new Version$1(1, new Int32Array(0), new ECBlocks$1(7, new ECB$1(1, 19)), new ECBlocks$1(10, new ECB$1(1, 16)), new ECBlocks$1(13, new ECB$1(1, 13)), new ECBlocks$1(17, new ECB$1(1, 9))), - new Version$1(2, Int32Array.from([6, 18]), new ECBlocks$1(10, new ECB$1(1, 34)), new ECBlocks$1(16, new ECB$1(1, 28)), new ECBlocks$1(22, new ECB$1(1, 22)), new ECBlocks$1(28, new ECB$1(1, 16))), - new Version$1(3, Int32Array.from([6, 22]), new ECBlocks$1(15, new ECB$1(1, 55)), new ECBlocks$1(26, new ECB$1(1, 44)), new ECBlocks$1(18, new ECB$1(2, 17)), new ECBlocks$1(22, new ECB$1(2, 13))), - new Version$1(4, Int32Array.from([6, 26]), new ECBlocks$1(20, new ECB$1(1, 80)), new ECBlocks$1(18, new ECB$1(2, 32)), new ECBlocks$1(26, new ECB$1(2, 24)), new ECBlocks$1(16, new ECB$1(4, 9))), - new Version$1(5, Int32Array.from([6, 30]), new ECBlocks$1(26, new ECB$1(1, 108)), new ECBlocks$1(24, new ECB$1(2, 43)), new ECBlocks$1(18, new ECB$1(2, 15), new ECB$1(2, 16)), new ECBlocks$1(22, new ECB$1(2, 11), new ECB$1(2, 12))), - new Version$1(6, Int32Array.from([6, 34]), new ECBlocks$1(18, new ECB$1(2, 68)), new ECBlocks$1(16, new ECB$1(4, 27)), new ECBlocks$1(24, new ECB$1(4, 19)), new ECBlocks$1(28, new ECB$1(4, 15))), - new Version$1(7, Int32Array.from([6, 22, 38]), new ECBlocks$1(20, new ECB$1(2, 78)), new ECBlocks$1(18, new ECB$1(4, 31)), new ECBlocks$1(18, new ECB$1(2, 14), new ECB$1(4, 15)), new ECBlocks$1(26, new ECB$1(4, 13), new ECB$1(1, 14))), - new Version$1(8, Int32Array.from([6, 24, 42]), new ECBlocks$1(24, new ECB$1(2, 97)), new ECBlocks$1(22, new ECB$1(2, 38), new ECB$1(2, 39)), new ECBlocks$1(22, new ECB$1(4, 18), new ECB$1(2, 19)), new ECBlocks$1(26, new ECB$1(4, 14), new ECB$1(2, 15))), - new Version$1(9, Int32Array.from([6, 26, 46]), new ECBlocks$1(30, new ECB$1(2, 116)), new ECBlocks$1(22, new ECB$1(3, 36), new ECB$1(2, 37)), new ECBlocks$1(20, new ECB$1(4, 16), new ECB$1(4, 17)), new ECBlocks$1(24, new ECB$1(4, 12), new ECB$1(4, 13))), - new Version$1(10, Int32Array.from([6, 28, 50]), new ECBlocks$1(18, new ECB$1(2, 68), new ECB$1(2, 69)), new ECBlocks$1(26, new ECB$1(4, 43), new ECB$1(1, 44)), new ECBlocks$1(24, new ECB$1(6, 19), new ECB$1(2, 20)), new ECBlocks$1(28, new ECB$1(6, 15), new ECB$1(2, 16))), - new Version$1(11, Int32Array.from([6, 30, 54]), new ECBlocks$1(20, new ECB$1(4, 81)), new ECBlocks$1(30, new ECB$1(1, 50), new ECB$1(4, 51)), new ECBlocks$1(28, new ECB$1(4, 22), new ECB$1(4, 23)), new ECBlocks$1(24, new ECB$1(3, 12), new ECB$1(8, 13))), - new Version$1(12, Int32Array.from([6, 32, 58]), new ECBlocks$1(24, new ECB$1(2, 92), new ECB$1(2, 93)), new ECBlocks$1(22, new ECB$1(6, 36), new ECB$1(2, 37)), new ECBlocks$1(26, new ECB$1(4, 20), new ECB$1(6, 21)), new ECBlocks$1(28, new ECB$1(7, 14), new ECB$1(4, 15))), - new Version$1(13, Int32Array.from([6, 34, 62]), new ECBlocks$1(26, new ECB$1(4, 107)), new ECBlocks$1(22, new ECB$1(8, 37), new ECB$1(1, 38)), new ECBlocks$1(24, new ECB$1(8, 20), new ECB$1(4, 21)), new ECBlocks$1(22, new ECB$1(12, 11), new ECB$1(4, 12))), - new Version$1(14, Int32Array.from([6, 26, 46, 66]), new ECBlocks$1(30, new ECB$1(3, 115), new ECB$1(1, 116)), new ECBlocks$1(24, new ECB$1(4, 40), new ECB$1(5, 41)), new ECBlocks$1(20, new ECB$1(11, 16), new ECB$1(5, 17)), new ECBlocks$1(24, new ECB$1(11, 12), new ECB$1(5, 13))), - new Version$1(15, Int32Array.from([6, 26, 48, 70]), new ECBlocks$1(22, new ECB$1(5, 87), new ECB$1(1, 88)), new ECBlocks$1(24, new ECB$1(5, 41), new ECB$1(5, 42)), new ECBlocks$1(30, new ECB$1(5, 24), new ECB$1(7, 25)), new ECBlocks$1(24, new ECB$1(11, 12), new ECB$1(7, 13))), - new Version$1(16, Int32Array.from([6, 26, 50, 74]), new ECBlocks$1(24, new ECB$1(5, 98), new ECB$1(1, 99)), new ECBlocks$1(28, new ECB$1(7, 45), new ECB$1(3, 46)), new ECBlocks$1(24, new ECB$1(15, 19), new ECB$1(2, 20)), new ECBlocks$1(30, new ECB$1(3, 15), new ECB$1(13, 16))), - new Version$1(17, Int32Array.from([6, 30, 54, 78]), new ECBlocks$1(28, new ECB$1(1, 107), new ECB$1(5, 108)), new ECBlocks$1(28, new ECB$1(10, 46), new ECB$1(1, 47)), new ECBlocks$1(28, new ECB$1(1, 22), new ECB$1(15, 23)), new ECBlocks$1(28, new ECB$1(2, 14), new ECB$1(17, 15))), - new Version$1(18, Int32Array.from([6, 30, 56, 82]), new ECBlocks$1(30, new ECB$1(5, 120), new ECB$1(1, 121)), new ECBlocks$1(26, new ECB$1(9, 43), new ECB$1(4, 44)), new ECBlocks$1(28, new ECB$1(17, 22), new ECB$1(1, 23)), new ECBlocks$1(28, new ECB$1(2, 14), new ECB$1(19, 15))), - new Version$1(19, Int32Array.from([6, 30, 58, 86]), new ECBlocks$1(28, new ECB$1(3, 113), new ECB$1(4, 114)), new ECBlocks$1(26, new ECB$1(3, 44), new ECB$1(11, 45)), new ECBlocks$1(26, new ECB$1(17, 21), new ECB$1(4, 22)), new ECBlocks$1(26, new ECB$1(9, 13), new ECB$1(16, 14))), - new Version$1(20, Int32Array.from([6, 34, 62, 90]), new ECBlocks$1(28, new ECB$1(3, 107), new ECB$1(5, 108)), new ECBlocks$1(26, new ECB$1(3, 41), new ECB$1(13, 42)), new ECBlocks$1(30, new ECB$1(15, 24), new ECB$1(5, 25)), new ECBlocks$1(28, new ECB$1(15, 15), new ECB$1(10, 16))), - new Version$1(21, Int32Array.from([6, 28, 50, 72, 94]), new ECBlocks$1(28, new ECB$1(4, 116), new ECB$1(4, 117)), new ECBlocks$1(26, new ECB$1(17, 42)), new ECBlocks$1(28, new ECB$1(17, 22), new ECB$1(6, 23)), new ECBlocks$1(30, new ECB$1(19, 16), new ECB$1(6, 17))), - new Version$1(22, Int32Array.from([6, 26, 50, 74, 98]), new ECBlocks$1(28, new ECB$1(2, 111), new ECB$1(7, 112)), new ECBlocks$1(28, new ECB$1(17, 46)), new ECBlocks$1(30, new ECB$1(7, 24), new ECB$1(16, 25)), new ECBlocks$1(24, new ECB$1(34, 13))), - new Version$1(23, Int32Array.from([6, 30, 54, 78, 102]), new ECBlocks$1(30, new ECB$1(4, 121), new ECB$1(5, 122)), new ECBlocks$1(28, new ECB$1(4, 47), new ECB$1(14, 48)), new ECBlocks$1(30, new ECB$1(11, 24), new ECB$1(14, 25)), new ECBlocks$1(30, new ECB$1(16, 15), new ECB$1(14, 16))), - new Version$1(24, Int32Array.from([6, 28, 54, 80, 106]), new ECBlocks$1(30, new ECB$1(6, 117), new ECB$1(4, 118)), new ECBlocks$1(28, new ECB$1(6, 45), new ECB$1(14, 46)), new ECBlocks$1(30, new ECB$1(11, 24), new ECB$1(16, 25)), new ECBlocks$1(30, new ECB$1(30, 16), new ECB$1(2, 17))), - new Version$1(25, Int32Array.from([6, 32, 58, 84, 110]), new ECBlocks$1(26, new ECB$1(8, 106), new ECB$1(4, 107)), new ECBlocks$1(28, new ECB$1(8, 47), new ECB$1(13, 48)), new ECBlocks$1(30, new ECB$1(7, 24), new ECB$1(22, 25)), new ECBlocks$1(30, new ECB$1(22, 15), new ECB$1(13, 16))), - new Version$1(26, Int32Array.from([6, 30, 58, 86, 114]), new ECBlocks$1(28, new ECB$1(10, 114), new ECB$1(2, 115)), new ECBlocks$1(28, new ECB$1(19, 46), new ECB$1(4, 47)), new ECBlocks$1(28, new ECB$1(28, 22), new ECB$1(6, 23)), new ECBlocks$1(30, new ECB$1(33, 16), new ECB$1(4, 17))), - new Version$1(27, Int32Array.from([6, 34, 62, 90, 118]), new ECBlocks$1(30, new ECB$1(8, 122), new ECB$1(4, 123)), new ECBlocks$1(28, new ECB$1(22, 45), new ECB$1(3, 46)), new ECBlocks$1(30, new ECB$1(8, 23), new ECB$1(26, 24)), new ECBlocks$1(30, new ECB$1(12, 15), new ECB$1(28, 16))), - new Version$1(28, Int32Array.from([6, 26, 50, 74, 98, 122]), new ECBlocks$1(30, new ECB$1(3, 117), new ECB$1(10, 118)), new ECBlocks$1(28, new ECB$1(3, 45), new ECB$1(23, 46)), new ECBlocks$1(30, new ECB$1(4, 24), new ECB$1(31, 25)), new ECBlocks$1(30, new ECB$1(11, 15), new ECB$1(31, 16))), - new Version$1(29, Int32Array.from([6, 30, 54, 78, 102, 126]), new ECBlocks$1(30, new ECB$1(7, 116), new ECB$1(7, 117)), new ECBlocks$1(28, new ECB$1(21, 45), new ECB$1(7, 46)), new ECBlocks$1(30, new ECB$1(1, 23), new ECB$1(37, 24)), new ECBlocks$1(30, new ECB$1(19, 15), new ECB$1(26, 16))), - new Version$1(30, Int32Array.from([6, 26, 52, 78, 104, 130]), new ECBlocks$1(30, new ECB$1(5, 115), new ECB$1(10, 116)), new ECBlocks$1(28, new ECB$1(19, 47), new ECB$1(10, 48)), new ECBlocks$1(30, new ECB$1(15, 24), new ECB$1(25, 25)), new ECBlocks$1(30, new ECB$1(23, 15), new ECB$1(25, 16))), - new Version$1(31, Int32Array.from([6, 30, 56, 82, 108, 134]), new ECBlocks$1(30, new ECB$1(13, 115), new ECB$1(3, 116)), new ECBlocks$1(28, new ECB$1(2, 46), new ECB$1(29, 47)), new ECBlocks$1(30, new ECB$1(42, 24), new ECB$1(1, 25)), new ECBlocks$1(30, new ECB$1(23, 15), new ECB$1(28, 16))), - new Version$1(32, Int32Array.from([6, 34, 60, 86, 112, 138]), new ECBlocks$1(30, new ECB$1(17, 115)), new ECBlocks$1(28, new ECB$1(10, 46), new ECB$1(23, 47)), new ECBlocks$1(30, new ECB$1(10, 24), new ECB$1(35, 25)), new ECBlocks$1(30, new ECB$1(19, 15), new ECB$1(35, 16))), - new Version$1(33, Int32Array.from([6, 30, 58, 86, 114, 142]), new ECBlocks$1(30, new ECB$1(17, 115), new ECB$1(1, 116)), new ECBlocks$1(28, new ECB$1(14, 46), new ECB$1(21, 47)), new ECBlocks$1(30, new ECB$1(29, 24), new ECB$1(19, 25)), new ECBlocks$1(30, new ECB$1(11, 15), new ECB$1(46, 16))), - new Version$1(34, Int32Array.from([6, 34, 62, 90, 118, 146]), new ECBlocks$1(30, new ECB$1(13, 115), new ECB$1(6, 116)), new ECBlocks$1(28, new ECB$1(14, 46), new ECB$1(23, 47)), new ECBlocks$1(30, new ECB$1(44, 24), new ECB$1(7, 25)), new ECBlocks$1(30, new ECB$1(59, 16), new ECB$1(1, 17))), - new Version$1(35, Int32Array.from([6, 30, 54, 78, 102, 126, 150]), new ECBlocks$1(30, new ECB$1(12, 121), new ECB$1(7, 122)), new ECBlocks$1(28, new ECB$1(12, 47), new ECB$1(26, 48)), new ECBlocks$1(30, new ECB$1(39, 24), new ECB$1(14, 25)), new ECBlocks$1(30, new ECB$1(22, 15), new ECB$1(41, 16))), - new Version$1(36, Int32Array.from([6, 24, 50, 76, 102, 128, 154]), new ECBlocks$1(30, new ECB$1(6, 121), new ECB$1(14, 122)), new ECBlocks$1(28, new ECB$1(6, 47), new ECB$1(34, 48)), new ECBlocks$1(30, new ECB$1(46, 24), new ECB$1(10, 25)), new ECBlocks$1(30, new ECB$1(2, 15), new ECB$1(64, 16))), - new Version$1(37, Int32Array.from([6, 28, 54, 80, 106, 132, 158]), new ECBlocks$1(30, new ECB$1(17, 122), new ECB$1(4, 123)), new ECBlocks$1(28, new ECB$1(29, 46), new ECB$1(14, 47)), new ECBlocks$1(30, new ECB$1(49, 24), new ECB$1(10, 25)), new ECBlocks$1(30, new ECB$1(24, 15), new ECB$1(46, 16))), - new Version$1(38, Int32Array.from([6, 32, 58, 84, 110, 136, 162]), new ECBlocks$1(30, new ECB$1(4, 122), new ECB$1(18, 123)), new ECBlocks$1(28, new ECB$1(13, 46), new ECB$1(32, 47)), new ECBlocks$1(30, new ECB$1(48, 24), new ECB$1(14, 25)), new ECBlocks$1(30, new ECB$1(42, 15), new ECB$1(32, 16))), - new Version$1(39, Int32Array.from([6, 26, 54, 82, 110, 138, 166]), new ECBlocks$1(30, new ECB$1(20, 117), new ECB$1(4, 118)), new ECBlocks$1(28, new ECB$1(40, 47), new ECB$1(7, 48)), new ECBlocks$1(30, new ECB$1(43, 24), new ECB$1(22, 25)), new ECBlocks$1(30, new ECB$1(10, 15), new ECB$1(67, 16))), - new Version$1(40, Int32Array.from([6, 30, 58, 86, 114, 142, 170]), new ECBlocks$1(30, new ECB$1(19, 118), new ECB$1(6, 119)), new ECBlocks$1(28, new ECB$1(18, 47), new ECB$1(31, 48)), new ECBlocks$1(30, new ECB$1(34, 24), new ECB$1(34, 25)), new ECBlocks$1(30, new ECB$1(20, 15), new ECB$1(61, 16))) - ]; - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - var DataMaskValues; - (function (DataMaskValues) { - DataMaskValues[DataMaskValues["DATA_MASK_000"] = 0] = "DATA_MASK_000"; - DataMaskValues[DataMaskValues["DATA_MASK_001"] = 1] = "DATA_MASK_001"; - DataMaskValues[DataMaskValues["DATA_MASK_010"] = 2] = "DATA_MASK_010"; - DataMaskValues[DataMaskValues["DATA_MASK_011"] = 3] = "DATA_MASK_011"; - DataMaskValues[DataMaskValues["DATA_MASK_100"] = 4] = "DATA_MASK_100"; - DataMaskValues[DataMaskValues["DATA_MASK_101"] = 5] = "DATA_MASK_101"; - DataMaskValues[DataMaskValues["DATA_MASK_110"] = 6] = "DATA_MASK_110"; - DataMaskValues[DataMaskValues["DATA_MASK_111"] = 7] = "DATA_MASK_111"; - })(DataMaskValues || (DataMaskValues = {})); - /** - *

    Encapsulates data masks for the data bits in a QR code, per ISO 18004:2006 6.8. Implementations - * of this class can un-mask a raw BitMatrix. For simplicity, they will unmask the entire BitMatrix, - * including areas used for finder patterns, timing patterns, etc. These areas should be unused - * after the point they are unmasked anyway.

    - * - *

    Note that the diagram in section 6.8.1 is misleading since it indicates that i is column position - * and j is row position. In fact, as the text says, i is row position and j is column position.

    - * - * @author Sean Owen - */ - class DataMask { - // See ISO 18004:2006 6.8.1 - constructor(value, isMasked) { - this.value = value; - this.isMasked = isMasked; - } - // End of enum constants. - /** - *

    Implementations of this method reverse the data masking process applied to a QR Code and - * make its bits ready to read.

    - * - * @param bits representation of QR Code bits - * @param dimension dimension of QR Code, represented by bits, being unmasked - */ - unmaskBitMatrix(bits, dimension /*int*/) { - for (let i = 0; i < dimension; i++) { - for (let j = 0; j < dimension; j++) { - if (this.isMasked(i, j)) { - bits.flip(j, i); - } - } - } - } - } - DataMask.values = new Map([ - /** - * 000: mask bits for which (x + y) mod 2 == 0 - */ - [DataMaskValues.DATA_MASK_000, new DataMask(DataMaskValues.DATA_MASK_000, (i /*int*/, j /*int*/) => { return ((i + j) & 0x01) === 0; })], - /** - * 001: mask bits for which x mod 2 == 0 - */ - [DataMaskValues.DATA_MASK_001, new DataMask(DataMaskValues.DATA_MASK_001, (i /*int*/, j /*int*/) => { return (i & 0x01) === 0; })], - /** - * 010: mask bits for which y mod 3 == 0 - */ - [DataMaskValues.DATA_MASK_010, new DataMask(DataMaskValues.DATA_MASK_010, (i /*int*/, j /*int*/) => { return j % 3 === 0; })], - /** - * 011: mask bits for which (x + y) mod 3 == 0 - */ - [DataMaskValues.DATA_MASK_011, new DataMask(DataMaskValues.DATA_MASK_011, (i /*int*/, j /*int*/) => { return (i + j) % 3 === 0; })], - /** - * 100: mask bits for which (x/2 + y/3) mod 2 == 0 - */ - [DataMaskValues.DATA_MASK_100, new DataMask(DataMaskValues.DATA_MASK_100, (i /*int*/, j /*int*/) => { return ((Math.floor(i / 2) + Math.floor(j / 3)) & 0x01) === 0; })], - /** - * 101: mask bits for which xy mod 2 + xy mod 3 == 0 - * equivalently, such that xy mod 6 == 0 - */ - [DataMaskValues.DATA_MASK_101, new DataMask(DataMaskValues.DATA_MASK_101, (i /*int*/, j /*int*/) => { return (i * j) % 6 === 0; })], - /** - * 110: mask bits for which (xy mod 2 + xy mod 3) mod 2 == 0 - * equivalently, such that xy mod 6 < 3 - */ - [DataMaskValues.DATA_MASK_110, new DataMask(DataMaskValues.DATA_MASK_110, (i /*int*/, j /*int*/) => { return ((i * j) % 6) < 3; })], - /** - * 111: mask bits for which ((x+y)mod 2 + xy mod 3) mod 2 == 0 - * equivalently, such that (x + y + xy mod 3) mod 2 == 0 - */ - [DataMaskValues.DATA_MASK_111, new DataMask(DataMaskValues.DATA_MASK_111, (i /*int*/, j /*int*/) => { return ((i + j + ((i * j) % 3)) & 0x01) === 0; })], - ]); - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * @author Sean Owen - */ - class BitMatrixParser$1 { - /** - * @param bitMatrix {@link BitMatrix} to parse - * @throws FormatException if dimension is not >= 21 and 1 mod 4 - */ - constructor(bitMatrix) { - const dimension = bitMatrix.getHeight(); - if (dimension < 21 || (dimension & 0x03) !== 1) { - throw new FormatException(); - } - this.bitMatrix = bitMatrix; - } - /** - *

    Reads format information from one of its two locations within the QR Code.

    - * - * @return {@link FormatInformation} encapsulating the QR Code's format info - * @throws FormatException if both format information locations cannot be parsed as - * the valid encoding of format information - */ - readFormatInformation() { - if (this.parsedFormatInfo !== null && this.parsedFormatInfo !== undefined) { - return this.parsedFormatInfo; - } - // Read top-left format info bits - let formatInfoBits1 = 0; - for (let i = 0; i < 6; i++) { - formatInfoBits1 = this.copyBit(i, 8, formatInfoBits1); - } - // .. and skip a bit in the timing pattern ... - formatInfoBits1 = this.copyBit(7, 8, formatInfoBits1); - formatInfoBits1 = this.copyBit(8, 8, formatInfoBits1); - formatInfoBits1 = this.copyBit(8, 7, formatInfoBits1); - // .. and skip a bit in the timing pattern ... - for (let j = 5; j >= 0; j--) { - formatInfoBits1 = this.copyBit(8, j, formatInfoBits1); - } - // Read the top-right/bottom-left pattern too - const dimension = this.bitMatrix.getHeight(); - let formatInfoBits2 = 0; - const jMin = dimension - 7; - for (let j = dimension - 1; j >= jMin; j--) { - formatInfoBits2 = this.copyBit(8, j, formatInfoBits2); - } - for (let i = dimension - 8; i < dimension; i++) { - formatInfoBits2 = this.copyBit(i, 8, formatInfoBits2); - } - this.parsedFormatInfo = FormatInformation.decodeFormatInformation(formatInfoBits1, formatInfoBits2); - if (this.parsedFormatInfo !== null) { - return this.parsedFormatInfo; - } - throw new FormatException(); - } - /** - *

    Reads version information from one of its two locations within the QR Code.

    - * - * @return {@link Version} encapsulating the QR Code's version - * @throws FormatException if both version information locations cannot be parsed as - * the valid encoding of version information - */ - readVersion() { - if (this.parsedVersion !== null && this.parsedVersion !== undefined) { - return this.parsedVersion; - } - const dimension = this.bitMatrix.getHeight(); - const provisionalVersion = Math.floor((dimension - 17) / 4); - if (provisionalVersion <= 6) { - return Version$1.getVersionForNumber(provisionalVersion); - } - // Read top-right version info: 3 wide by 6 tall - let versionBits = 0; - const ijMin = dimension - 11; - for (let j = 5; j >= 0; j--) { - for (let i = dimension - 9; i >= ijMin; i--) { - versionBits = this.copyBit(i, j, versionBits); - } - } - let theParsedVersion = Version$1.decodeVersionInformation(versionBits); - if (theParsedVersion !== null && theParsedVersion.getDimensionForVersion() === dimension) { - this.parsedVersion = theParsedVersion; - return theParsedVersion; - } - // Hmm, failed. Try bottom left: 6 wide by 3 tall - versionBits = 0; - for (let i = 5; i >= 0; i--) { - for (let j = dimension - 9; j >= ijMin; j--) { - versionBits = this.copyBit(i, j, versionBits); - } - } - theParsedVersion = Version$1.decodeVersionInformation(versionBits); - if (theParsedVersion !== null && theParsedVersion.getDimensionForVersion() === dimension) { - this.parsedVersion = theParsedVersion; - return theParsedVersion; - } - throw new FormatException(); - } - copyBit(i /*int*/, j /*int*/, versionBits /*int*/) { - const bit = this.isMirror ? this.bitMatrix.get(j, i) : this.bitMatrix.get(i, j); - return bit ? (versionBits << 1) | 0x1 : versionBits << 1; - } - /** - *

    Reads the bits in the {@link BitMatrix} representing the finder pattern in the - * correct order in order to reconstruct the codewords bytes contained within the - * QR Code.

    - * - * @return bytes encoded within the QR Code - * @throws FormatException if the exact number of bytes expected is not read - */ - readCodewords() { - const formatInfo = this.readFormatInformation(); - const version = this.readVersion(); - // Get the data mask for the format used in this QR Code. This will exclude - // some bits from reading as we wind through the bit matrix. - const dataMask = DataMask.values.get(formatInfo.getDataMask()); - const dimension = this.bitMatrix.getHeight(); - dataMask.unmaskBitMatrix(this.bitMatrix, dimension); - const functionPattern = version.buildFunctionPattern(); - let readingUp = true; - const result = new Uint8Array(version.getTotalCodewords()); - let resultOffset = 0; - let currentByte = 0; - let bitsRead = 0; - // Read columns in pairs, from right to left - for (let j = dimension - 1; j > 0; j -= 2) { - if (j === 6) { - // Skip whole column with vertical alignment pattern - // saves time and makes the other code proceed more cleanly - j--; - } - // Read alternatingly from bottom to top then top to bottom - for (let count = 0; count < dimension; count++) { - const i = readingUp ? dimension - 1 - count : count; - for (let col = 0; col < 2; col++) { - // Ignore bits covered by the function pattern - if (!functionPattern.get(j - col, i)) { - // Read a bit - bitsRead++; - currentByte <<= 1; - if (this.bitMatrix.get(j - col, i)) { - currentByte |= 1; - } - // If we've made a whole byte, save it off - if (bitsRead === 8) { - result[resultOffset++] = /*(byte) */ currentByte; - bitsRead = 0; - currentByte = 0; - } - } - } - } - readingUp = !readingUp; // readingUp ^= true; // readingUp = !readingUp; // switch directions - } - if (resultOffset !== version.getTotalCodewords()) { - throw new FormatException(); - } - return result; - } - /** - * Revert the mask removal done while reading the code words. The bit matrix should revert to its original state. - */ - remask() { - if (this.parsedFormatInfo === null) { - return; // We have no format information, and have no data mask - } - const dataMask = DataMask.values[this.parsedFormatInfo.getDataMask()]; - const dimension = this.bitMatrix.getHeight(); - dataMask.unmaskBitMatrix(this.bitMatrix, dimension); - } - /** - * Prepare the parser for a mirrored operation. - * This flag has effect only on the {@link #readFormatInformation()} and the - * {@link #readVersion()}. Before proceeding with {@link #readCodewords()} the - * {@link #mirror()} method should be called. - * - * @param mirror Whether to read version and format information mirrored. - */ - setMirror(isMirror) { - this.parsedVersion = null; - this.parsedFormatInfo = null; - this.isMirror = isMirror; - } - /** Mirror the bit matrix in order to attempt a second reading. */ - mirror() { - const bitMatrix = this.bitMatrix; - for (let x = 0, width = bitMatrix.getWidth(); x < width; x++) { - for (let y = x + 1, height = bitMatrix.getHeight(); y < height; y++) { - if (bitMatrix.get(x, y) !== bitMatrix.get(y, x)) { - bitMatrix.flip(y, x); - bitMatrix.flip(x, y); - } - } - } - } - } - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - *

    Encapsulates a block of data within a QR Code. QR Codes may split their data into - * multiple blocks, each of which is a unit of data and error-correction codewords. Each - * is represented by an instance of this class.

    - * - * @author Sean Owen - */ - class DataBlock$1 { - constructor(numDataCodewords /*int*/, codewords) { - this.numDataCodewords = numDataCodewords; - this.codewords = codewords; - } - /** - *

    When QR Codes use multiple data blocks, they are actually interleaved. - * That is, the first byte of data block 1 to n is written, then the second bytes, and so on. This - * method will separate the data into original blocks.

    - * - * @param rawCodewords bytes as read directly from the QR Code - * @param version version of the QR Code - * @param ecLevel error-correction level of the QR Code - * @return DataBlocks containing original bytes, "de-interleaved" from representation in the - * QR Code - */ - static getDataBlocks(rawCodewords, version, ecLevel) { - if (rawCodewords.length !== version.getTotalCodewords()) { - throw new IllegalArgumentException(); - } - // Figure out the number and size of data blocks used by this version and - // error correction level - const ecBlocks = version.getECBlocksForLevel(ecLevel); - // First count the total number of data blocks - let totalBlocks = 0; - const ecBlockArray = ecBlocks.getECBlocks(); - for (const ecBlock of ecBlockArray) { - totalBlocks += ecBlock.getCount(); - } - // Now establish DataBlocks of the appropriate size and number of data codewords - const result = new Array(totalBlocks); - let numResultBlocks = 0; - for (const ecBlock of ecBlockArray) { - for (let i = 0; i < ecBlock.getCount(); i++) { - const numDataCodewords = ecBlock.getDataCodewords(); - const numBlockCodewords = ecBlocks.getECCodewordsPerBlock() + numDataCodewords; - result[numResultBlocks++] = new DataBlock$1(numDataCodewords, new Uint8Array(numBlockCodewords)); - } - } - // All blocks have the same amount of data, except that the last n - // (where n may be 0) have 1 more byte. Figure out where these start. - const shorterBlocksTotalCodewords = result[0].codewords.length; - let longerBlocksStartAt = result.length - 1; - // TYPESCRIPTPORT: check length is correct here - while (longerBlocksStartAt >= 0) { - const numCodewords = result[longerBlocksStartAt].codewords.length; - if (numCodewords === shorterBlocksTotalCodewords) { - break; - } - longerBlocksStartAt--; - } - longerBlocksStartAt++; - const shorterBlocksNumDataCodewords = shorterBlocksTotalCodewords - ecBlocks.getECCodewordsPerBlock(); - // The last elements of result may be 1 element longer - // first fill out as many elements as all of them have - let rawCodewordsOffset = 0; - for (let i = 0; i < shorterBlocksNumDataCodewords; i++) { - for (let j = 0; j < numResultBlocks; j++) { - result[j].codewords[i] = rawCodewords[rawCodewordsOffset++]; - } - } - // Fill out the last data block in the longer ones - for (let j = longerBlocksStartAt; j < numResultBlocks; j++) { - result[j].codewords[shorterBlocksNumDataCodewords] = rawCodewords[rawCodewordsOffset++]; - } - // Now add in error correction blocks - const max = result[0].codewords.length; - for (let i = shorterBlocksNumDataCodewords; i < max; i++) { - for (let j = 0; j < numResultBlocks; j++) { - const iOffset = j < longerBlocksStartAt ? i : i + 1; - result[j].codewords[iOffset] = rawCodewords[rawCodewordsOffset++]; - } - } - return result; - } - getNumDataCodewords() { - return this.numDataCodewords; - } - getCodewords() { - return this.codewords; - } - } - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - var ModeValues; - (function (ModeValues) { - ModeValues[ModeValues["TERMINATOR"] = 0] = "TERMINATOR"; - ModeValues[ModeValues["NUMERIC"] = 1] = "NUMERIC"; - ModeValues[ModeValues["ALPHANUMERIC"] = 2] = "ALPHANUMERIC"; - ModeValues[ModeValues["STRUCTURED_APPEND"] = 3] = "STRUCTURED_APPEND"; - ModeValues[ModeValues["BYTE"] = 4] = "BYTE"; - ModeValues[ModeValues["ECI"] = 5] = "ECI"; - ModeValues[ModeValues["KANJI"] = 6] = "KANJI"; - ModeValues[ModeValues["FNC1_FIRST_POSITION"] = 7] = "FNC1_FIRST_POSITION"; - ModeValues[ModeValues["FNC1_SECOND_POSITION"] = 8] = "FNC1_SECOND_POSITION"; - /** See GBT 18284-2000; "Hanzi" is a transliteration of this mode name. */ - ModeValues[ModeValues["HANZI"] = 9] = "HANZI"; - })(ModeValues || (ModeValues = {})); - /** - *

    See ISO 18004:2006, 6.4.1, Tables 2 and 3. This enum encapsulates the various modes in which - * data can be encoded to bits in the QR code standard.

    - * - * @author Sean Owen - */ - class Mode$1 { - constructor(value, stringValue, characterCountBitsForVersions, bits /*int*/) { - this.value = value; - this.stringValue = stringValue; - this.characterCountBitsForVersions = characterCountBitsForVersions; - this.bits = bits; - Mode$1.FOR_BITS.set(bits, this); - Mode$1.FOR_VALUE.set(value, this); - } - /** - * @param bits four bits encoding a QR Code data mode - * @return Mode encoded by these bits - * @throws IllegalArgumentException if bits do not correspond to a known mode - */ - static forBits(bits /*int*/) { - const mode = Mode$1.FOR_BITS.get(bits); - if (undefined === mode) { - throw new IllegalArgumentException(); - } - return mode; - } - /** - * @param version version in question - * @return number of bits used, in this QR Code symbol {@link Version}, to encode the - * count of characters that will follow encoded in this Mode - */ - getCharacterCountBits(version) { - const versionNumber = version.getVersionNumber(); - let offset; - if (versionNumber <= 9) { - offset = 0; - } - else if (versionNumber <= 26) { - offset = 1; - } - else { - offset = 2; - } - return this.characterCountBitsForVersions[offset]; - } - getValue() { - return this.value; - } - getBits() { - return this.bits; - } - equals(o) { - if (!(o instanceof Mode$1)) { - return false; - } - const other = o; - return this.value === other.value; - } - toString() { - return this.stringValue; - } - } - Mode$1.FOR_BITS = new Map(); - Mode$1.FOR_VALUE = new Map(); - Mode$1.TERMINATOR = new Mode$1(ModeValues.TERMINATOR, 'TERMINATOR', Int32Array.from([0, 0, 0]), 0x00); // Not really a mode... - Mode$1.NUMERIC = new Mode$1(ModeValues.NUMERIC, 'NUMERIC', Int32Array.from([10, 12, 14]), 0x01); - Mode$1.ALPHANUMERIC = new Mode$1(ModeValues.ALPHANUMERIC, 'ALPHANUMERIC', Int32Array.from([9, 11, 13]), 0x02); - Mode$1.STRUCTURED_APPEND = new Mode$1(ModeValues.STRUCTURED_APPEND, 'STRUCTURED_APPEND', Int32Array.from([0, 0, 0]), 0x03); // Not supported - Mode$1.BYTE = new Mode$1(ModeValues.BYTE, 'BYTE', Int32Array.from([8, 16, 16]), 0x04); - Mode$1.ECI = new Mode$1(ModeValues.ECI, 'ECI', Int32Array.from([0, 0, 0]), 0x07); // character counts don't apply - Mode$1.KANJI = new Mode$1(ModeValues.KANJI, 'KANJI', Int32Array.from([8, 10, 12]), 0x08); - Mode$1.FNC1_FIRST_POSITION = new Mode$1(ModeValues.FNC1_FIRST_POSITION, 'FNC1_FIRST_POSITION', Int32Array.from([0, 0, 0]), 0x05); - Mode$1.FNC1_SECOND_POSITION = new Mode$1(ModeValues.FNC1_SECOND_POSITION, 'FNC1_SECOND_POSITION', Int32Array.from([0, 0, 0]), 0x09); - /** See GBT 18284-2000; "Hanzi" is a transliteration of this mode name. */ - Mode$1.HANZI = new Mode$1(ModeValues.HANZI, 'HANZI', Int32Array.from([8, 10, 12]), 0x0D); - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /*import java.io.UnsupportedEncodingException;*/ - /*import java.util.ArrayList;*/ - /*import java.util.Collection;*/ - /*import java.util.List;*/ - /*import java.util.Map;*/ - /** - *

    QR Codes can encode text as bits in one of several modes, and can use multiple modes - * in one QR Code. This class decodes the bits back into text.

    - * - *

    See ISO 18004:2006, 6.4.3 - 6.4.7

    - * - * @author Sean Owen - */ - class DecodedBitStreamParser$1 { - static decode(bytes, version, ecLevel, hints) { - const bits = new BitSource(bytes); - let result = new StringBuilder(); - const byteSegments = new Array(); // 1 - // TYPESCRIPTPORT: I do not use constructor with size 1 as in original Java means capacity and the array length is checked below - let symbolSequence = -1; - let parityData = -1; - try { - let currentCharacterSetECI = null; - let fc1InEffect = false; - let mode; - do { - // While still another segment to read... - if (bits.available() < 4) { - // OK, assume we're done. Really, a TERMINATOR mode should have been recorded here - mode = Mode$1.TERMINATOR; - } - else { - const modeBits = bits.readBits(4); - mode = Mode$1.forBits(modeBits); // mode is encoded by 4 bits - } - switch (mode) { - case Mode$1.TERMINATOR: - break; - case Mode$1.FNC1_FIRST_POSITION: - case Mode$1.FNC1_SECOND_POSITION: - // We do little with FNC1 except alter the parsed result a bit according to the spec - fc1InEffect = true; - break; - case Mode$1.STRUCTURED_APPEND: - if (bits.available() < 16) { - throw new FormatException(); - } - // sequence number and parity is added later to the result metadata - // Read next 8 bits (symbol sequence #) and 8 bits (data: parity), then continue - symbolSequence = bits.readBits(8); - parityData = bits.readBits(8); - break; - case Mode$1.ECI: - // Count doesn't apply to ECI - const value = DecodedBitStreamParser$1.parseECIValue(bits); - currentCharacterSetECI = CharacterSetECI.getCharacterSetECIByValue(value); - if (currentCharacterSetECI === null) { - throw new FormatException(); - } - break; - case Mode$1.HANZI: - // First handle Hanzi mode which does not start with character count - // Chinese mode contains a sub set indicator right after mode indicator - const subset = bits.readBits(4); - const countHanzi = bits.readBits(mode.getCharacterCountBits(version)); - if (subset === DecodedBitStreamParser$1.GB2312_SUBSET) { - DecodedBitStreamParser$1.decodeHanziSegment(bits, result, countHanzi); - } - break; - default: - // "Normal" QR code modes: - // How many characters will follow, encoded in this mode? - const count = bits.readBits(mode.getCharacterCountBits(version)); - switch (mode) { - case Mode$1.NUMERIC: - DecodedBitStreamParser$1.decodeNumericSegment(bits, result, count); - break; - case Mode$1.ALPHANUMERIC: - DecodedBitStreamParser$1.decodeAlphanumericSegment(bits, result, count, fc1InEffect); - break; - case Mode$1.BYTE: - DecodedBitStreamParser$1.decodeByteSegment(bits, result, count, currentCharacterSetECI, byteSegments, hints); - break; - case Mode$1.KANJI: - DecodedBitStreamParser$1.decodeKanjiSegment(bits, result, count); - break; - default: - throw new FormatException(); - } - break; - } - } while (mode !== Mode$1.TERMINATOR); - } - catch (iae /*: IllegalArgumentException*/) { - // from readBits() calls - throw new FormatException(); - } - return new DecoderResult(bytes, result.toString(), byteSegments.length === 0 ? null : byteSegments, ecLevel === null ? null : ecLevel.toString(), symbolSequence, parityData); - } - /** - * See specification GBT 18284-2000 - */ - static decodeHanziSegment(bits, result, count /*int*/) { - // Don't crash trying to read more bits than we have available. - if (count * 13 > bits.available()) { - throw new FormatException(); - } - // Each character will require 2 bytes. Read the characters as 2-byte pairs - // and decode as GB2312 afterwards - const buffer = new Uint8Array(2 * count); - let offset = 0; - while (count > 0) { - // Each 13 bits encodes a 2-byte character - const twoBytes = bits.readBits(13); - let assembledTwoBytes = (((twoBytes / 0x060) << 8) & 0xFFFFFFFF) | (twoBytes % 0x060); - if (assembledTwoBytes < 0x003BF) { - // In the 0xA1A1 to 0xAAFE range - assembledTwoBytes += 0x0A1A1; - } - else { - // In the 0xB0A1 to 0xFAFE range - assembledTwoBytes += 0x0A6A1; - } - buffer[offset] = /*(byte) */ ((assembledTwoBytes >> 8) & 0xFF); - buffer[offset + 1] = /*(byte) */ (assembledTwoBytes & 0xFF); - offset += 2; - count--; - } - try { - result.append(StringEncoding.decode(buffer, StringUtils.GB2312)); - // TYPESCRIPTPORT: TODO: implement GB2312 decode. StringView from MDN could be a starting point - } - catch (ignored /*: UnsupportedEncodingException*/) { - throw new FormatException(ignored); - } - } - static decodeKanjiSegment(bits, result, count /*int*/) { - // Don't crash trying to read more bits than we have available. - if (count * 13 > bits.available()) { - throw new FormatException(); - } - // Each character will require 2 bytes. Read the characters as 2-byte pairs - // and decode as Shift_JIS afterwards - const buffer = new Uint8Array(2 * count); - let offset = 0; - while (count > 0) { - // Each 13 bits encodes a 2-byte character - const twoBytes = bits.readBits(13); - let assembledTwoBytes = (((twoBytes / 0x0C0) << 8) & 0xFFFFFFFF) | (twoBytes % 0x0C0); - if (assembledTwoBytes < 0x01F00) { - // In the 0x8140 to 0x9FFC range - assembledTwoBytes += 0x08140; - } - else { - // In the 0xE040 to 0xEBBF range - assembledTwoBytes += 0x0C140; - } - buffer[offset] = /*(byte) */ (assembledTwoBytes >> 8); - buffer[offset + 1] = /*(byte) */ assembledTwoBytes; - offset += 2; - count--; - } - // Shift_JIS may not be supported in some environments: - try { - result.append(StringEncoding.decode(buffer, StringUtils.SHIFT_JIS)); - // TYPESCRIPTPORT: TODO: implement SHIFT_JIS decode. StringView from MDN could be a starting point - } - catch (ignored /*: UnsupportedEncodingException*/) { - throw new FormatException(ignored); - } - } - static decodeByteSegment(bits, result, count /*int*/, currentCharacterSetECI, byteSegments, hints) { - // Don't crash trying to read more bits than we have available. - if (8 * count > bits.available()) { - throw new FormatException(); - } - const readBytes = new Uint8Array(count); - for (let i = 0; i < count; i++) { - readBytes[i] = /*(byte) */ bits.readBits(8); - } - let encoding; - if (currentCharacterSetECI === null) { - // The spec isn't clear on this mode; see - // section 6.4.5: t does not say which encoding to assuming - // upon decoding. I have seen ISO-8859-1 used as well as - // Shift_JIS -- without anything like an ECI designator to - // give a hint. - encoding = StringUtils.guessEncoding(readBytes, hints); - } - else { - encoding = currentCharacterSetECI.getName(); - } - try { - result.append(StringEncoding.decode(readBytes, encoding)); - } - catch (ignored /*: UnsupportedEncodingException*/) { - throw new FormatException(ignored); - } - byteSegments.push(readBytes); - } - static toAlphaNumericChar(value /*int*/) { - if (value >= DecodedBitStreamParser$1.ALPHANUMERIC_CHARS.length) { - throw new FormatException(); - } - return DecodedBitStreamParser$1.ALPHANUMERIC_CHARS[value]; - } - static decodeAlphanumericSegment(bits, result, count /*int*/, fc1InEffect) { - // Read two characters at a time - const start = result.length(); - while (count > 1) { - if (bits.available() < 11) { - throw new FormatException(); - } - const nextTwoCharsBits = bits.readBits(11); - result.append(DecodedBitStreamParser$1.toAlphaNumericChar(Math.floor(nextTwoCharsBits / 45))); - result.append(DecodedBitStreamParser$1.toAlphaNumericChar(nextTwoCharsBits % 45)); - count -= 2; - } - if (count === 1) { - // special case: one character left - if (bits.available() < 6) { - throw new FormatException(); - } - result.append(DecodedBitStreamParser$1.toAlphaNumericChar(bits.readBits(6))); - } - // See section 6.4.8.1, 6.4.8.2 - if (fc1InEffect) { - // We need to massage the result a bit if in an FNC1 mode: - for (let i = start; i < result.length(); i++) { - if (result.charAt(i) === '%') { - if (i < result.length() - 1 && result.charAt(i + 1) === '%') { - // %% is rendered as % - result.deleteCharAt(i + 1); - } - else { - // In alpha mode, % should be converted to FNC1 separator 0x1D - result.setCharAt(i, String.fromCharCode(0x1D)); - } - } - } - } - } - static decodeNumericSegment(bits, result, count /*int*/) { - // Read three digits at a time - while (count >= 3) { - // Each 10 bits encodes three digits - if (bits.available() < 10) { - throw new FormatException(); - } - const threeDigitsBits = bits.readBits(10); - if (threeDigitsBits >= 1000) { - throw new FormatException(); - } - result.append(DecodedBitStreamParser$1.toAlphaNumericChar(Math.floor(threeDigitsBits / 100))); - result.append(DecodedBitStreamParser$1.toAlphaNumericChar(Math.floor(threeDigitsBits / 10) % 10)); - result.append(DecodedBitStreamParser$1.toAlphaNumericChar(threeDigitsBits % 10)); - count -= 3; - } - if (count === 2) { - // Two digits left over to read, encoded in 7 bits - if (bits.available() < 7) { - throw new FormatException(); - } - const twoDigitsBits = bits.readBits(7); - if (twoDigitsBits >= 100) { - throw new FormatException(); - } - result.append(DecodedBitStreamParser$1.toAlphaNumericChar(Math.floor(twoDigitsBits / 10))); - result.append(DecodedBitStreamParser$1.toAlphaNumericChar(twoDigitsBits % 10)); - } - else if (count === 1) { - // One digit left over to read - if (bits.available() < 4) { - throw new FormatException(); - } - const digitBits = bits.readBits(4); - if (digitBits >= 10) { - throw new FormatException(); - } - result.append(DecodedBitStreamParser$1.toAlphaNumericChar(digitBits)); - } - } - static parseECIValue(bits) { - const firstByte = bits.readBits(8); - if ((firstByte & 0x80) === 0) { - // just one byte - return firstByte & 0x7F; - } - if ((firstByte & 0xC0) === 0x80) { - // two bytes - const secondByte = bits.readBits(8); - return (((firstByte & 0x3F) << 8) & 0xFFFFFFFF) | secondByte; - } - if ((firstByte & 0xE0) === 0xC0) { - // three bytes - const secondThirdBytes = bits.readBits(16); - return (((firstByte & 0x1F) << 16) & 0xFFFFFFFF) | secondThirdBytes; - } - throw new FormatException(); - } - } - /** - * See ISO 18004:2006, 6.4.4 Table 5 - */ - DecodedBitStreamParser$1.ALPHANUMERIC_CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:'; - DecodedBitStreamParser$1.GB2312_SUBSET = 1; - // function Uint8ArrayToString(a: Uint8Array): string { - // const CHUNK_SZ = 0x8000; - // const c = new StringBuilder(); - // for (let i = 0, length = a.length; i < length; i += CHUNK_SZ) { - // c.append(String.fromCharCode.apply(null, a.subarray(i, i + CHUNK_SZ))); - // } - // return c.toString(); - // } - - /* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * Meta-data container for QR Code decoding. Instances of this class may be used to convey information back to the - * decoding caller. Callers are expected to process this. - * - * @see com.google.zxing.common.DecoderResult#getOther() - */ - class QRCodeDecoderMetaData { - constructor(mirrored) { - this.mirrored = mirrored; - } - /** - * @return true if the QR Code was mirrored. - */ - isMirrored() { - return this.mirrored; - } - /** - * Apply the result points' order correction due to mirroring. - * - * @param points Array of points to apply mirror correction to. - */ - applyMirroredCorrection(points) { - if (!this.mirrored || points === null || points.length < 3) { - return; - } - const bottomLeft = points[0]; - points[0] = points[2]; - points[2] = bottomLeft; - // No need to 'fix' top-left and alignment pattern. - } - } - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /*import java.util.Map;*/ - /** - *

    The main class which implements QR Code decoding -- as opposed to locating and extracting - * the QR Code from an image.

    - * - * @author Sean Owen - */ - class Decoder$2 { - constructor() { - this.rsDecoder = new ReedSolomonDecoder(GenericGF.QR_CODE_FIELD_256); - } - // public decode(image: boolean[][]): DecoderResult /*throws ChecksumException, FormatException*/ { - // return decode(image, null) - // } - /** - *

    Convenience method that can decode a QR Code represented as a 2D array of booleans. - * "true" is taken to mean a black module.

    - * - * @param image booleans representing white/black QR Code modules - * @param hints decoding hints that should be used to influence decoding - * @return text and bytes encoded within the QR Code - * @throws FormatException if the QR Code cannot be decoded - * @throws ChecksumException if error correction fails - */ - decodeBooleanArray(image, hints) { - return this.decodeBitMatrix(BitMatrix.parseFromBooleanArray(image), hints); - } - // public decodeBitMatrix(bits: BitMatrix): DecoderResult /*throws ChecksumException, FormatException*/ { - // return decode(bits, null) - // } - /** - *

    Decodes a QR Code represented as a {@link BitMatrix}. A 1 or "true" is taken to mean a black module.

    - * - * @param bits booleans representing white/black QR Code modules - * @param hints decoding hints that should be used to influence decoding - * @return text and bytes encoded within the QR Code - * @throws FormatException if the QR Code cannot be decoded - * @throws ChecksumException if error correction fails - */ - decodeBitMatrix(bits, hints) { - // Construct a parser and read version, error-correction level - const parser = new BitMatrixParser$1(bits); - let ex = null; - try { - return this.decodeBitMatrixParser(parser, hints); - } - catch (e /*: FormatException, ChecksumException*/) { - ex = e; - } - try { - // Revert the bit matrix - parser.remask(); - // Will be attempting a mirrored reading of the version and format info. - parser.setMirror(true); - // Preemptively read the version. - parser.readVersion(); - // Preemptively read the format information. - parser.readFormatInformation(); - /* - * Since we're here, this means we have successfully detected some kind - * of version and format information when mirrored. This is a good sign, - * that the QR code may be mirrored, and we should try once more with a - * mirrored content. - */ - // Prepare for a mirrored reading. - parser.mirror(); - const result = this.decodeBitMatrixParser(parser, hints); - // Success! Notify the caller that the code was mirrored. - result.setOther(new QRCodeDecoderMetaData(true)); - return result; - } - catch (e /*FormatException | ChecksumException*/) { - // Throw the exception from the original reading - if (ex !== null) { - throw ex; - } - throw e; - } - } - decodeBitMatrixParser(parser, hints) { - const version = parser.readVersion(); - const ecLevel = parser.readFormatInformation().getErrorCorrectionLevel(); - // Read codewords - const codewords = parser.readCodewords(); - // Separate into data blocks - const dataBlocks = DataBlock$1.getDataBlocks(codewords, version, ecLevel); - // Count total number of data bytes - let totalBytes = 0; - for (const dataBlock of dataBlocks) { - totalBytes += dataBlock.getNumDataCodewords(); - } - const resultBytes = new Uint8Array(totalBytes); - let resultOffset = 0; - // Error-correct and copy data blocks together into a stream of bytes - for (const dataBlock of dataBlocks) { - const codewordBytes = dataBlock.getCodewords(); - const numDataCodewords = dataBlock.getNumDataCodewords(); - this.correctErrors(codewordBytes, numDataCodewords); - for (let i = 0; i < numDataCodewords; i++) { - resultBytes[resultOffset++] = codewordBytes[i]; - } - } - // Decode the contents of that stream of bytes - return DecodedBitStreamParser$1.decode(resultBytes, version, ecLevel, hints); - } - /** - *

    Given data and error-correction codewords received, possibly corrupted by errors, attempts to - * correct the errors in-place using Reed-Solomon error correction.

    - * - * @param codewordBytes data and error correction codewords - * @param numDataCodewords number of codewords that are data bytes - * @throws ChecksumException if error correction fails - */ - correctErrors(codewordBytes, numDataCodewords /*int*/) { - // const numCodewords = codewordBytes.length; - // First read into an array of ints - const codewordsInts = new Int32Array(codewordBytes); - // TYPESCRIPTPORT: not realy necessary to transform to ints? could redesign everything to work with unsigned bytes? - // const codewordsInts = new Int32Array(numCodewords) - // for (let i = 0; i < numCodewords; i++) { - // codewordsInts[i] = codewordBytes[i] & 0xFF - // } - try { - this.rsDecoder.decode(codewordsInts, codewordBytes.length - numDataCodewords); - } - catch (ignored /*: ReedSolomonException*/) { - throw new ChecksumException(); - } - // Copy back into array of bytes -- only need to worry about the bytes that were data - // We don't care about errors in the error-correction codewords - for (let i = 0; i < numDataCodewords; i++) { - codewordBytes[i] = /*(byte) */ codewordsInts[i]; - } - } - } - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - *

    Encapsulates an alignment pattern, which are the smaller square patterns found in - * all but the simplest QR Codes.

    - * - * @author Sean Owen - */ - class AlignmentPattern extends ResultPoint { - constructor(posX /*float*/, posY /*float*/, estimatedModuleSize /*float*/) { - super(posX, posY); - this.estimatedModuleSize = estimatedModuleSize; - } - /** - *

    Determines if this alignment pattern "about equals" an alignment pattern at the stated - * position and size -- meaning, it is at nearly the same center with nearly the same size.

    - */ - aboutEquals(moduleSize /*float*/, i /*float*/, j /*float*/) { - if (Math.abs(i - this.getY()) <= moduleSize && Math.abs(j - this.getX()) <= moduleSize) { - const moduleSizeDiff = Math.abs(moduleSize - this.estimatedModuleSize); - return moduleSizeDiff <= 1.0 || moduleSizeDiff <= this.estimatedModuleSize; - } - return false; - } - /** - * Combines this object's current estimate of a finder pattern position and module size - * with a new estimate. It returns a new {@code FinderPattern} containing an average of the two. - */ - combineEstimate(i /*float*/, j /*float*/, newModuleSize /*float*/) { - const combinedX = (this.getX() + j) / 2.0; - const combinedY = (this.getY() + i) / 2.0; - const combinedModuleSize = (this.estimatedModuleSize + newModuleSize) / 2.0; - return new AlignmentPattern(combinedX, combinedY, combinedModuleSize); - } - } - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /*import java.util.ArrayList;*/ - /*import java.util.List;*/ - /** - *

    This class attempts to find alignment patterns in a QR Code. Alignment patterns look like finder - * patterns but are smaller and appear at regular intervals throughout the image.

    - * - *

    At the moment this only looks for the bottom-right alignment pattern.

    - * - *

    This is mostly a simplified copy of {@link FinderPatternFinder}. It is copied, - * pasted and stripped down here for maximum performance but does unfortunately duplicate - * some code.

    - * - *

    This class is thread-safe but not reentrant. Each thread must allocate its own object.

    - * - * @author Sean Owen - */ - class AlignmentPatternFinder { - /** - *

    Creates a finder that will look in a portion of the whole image.

    - * - * @param image image to search - * @param startX left column from which to start searching - * @param startY top row from which to start searching - * @param width width of region to search - * @param height height of region to search - * @param moduleSize estimated module size so far - */ - constructor(image, startX /*int*/, startY /*int*/, width /*int*/, height /*int*/, moduleSize /*float*/, resultPointCallback) { - this.image = image; - this.startX = startX; - this.startY = startY; - this.width = width; - this.height = height; - this.moduleSize = moduleSize; - this.resultPointCallback = resultPointCallback; - this.possibleCenters = []; // new Array(5)) - // TYPESCRIPTPORT: array initialization without size as the length is checked below - this.crossCheckStateCount = new Int32Array(3); - } - /** - *

    This method attempts to find the bottom-right alignment pattern in the image. It is a bit messy since - * it's pretty performance-critical and so is written to be fast foremost.

    - * - * @return {@link AlignmentPattern} if found - * @throws NotFoundException if not found - */ - find() { - const startX = this.startX; - const height = this.height; - const width = this.width; - const maxJ = startX + width; - const middleI = this.startY + (height / 2); - // We are looking for black/white/black modules in 1:1:1 ratio - // this tracks the number of black/white/black modules seen so far - const stateCount = new Int32Array(3); - const image = this.image; - for (let iGen = 0; iGen < height; iGen++) { - // Search from middle outwards - const i = middleI + ((iGen & 0x01) === 0 ? Math.floor((iGen + 1) / 2) : -Math.floor((iGen + 1) / 2)); - stateCount[0] = 0; - stateCount[1] = 0; - stateCount[2] = 0; - let j = startX; - // Burn off leading white pixels before anything else; if we start in the middle of - // a white run, it doesn't make sense to count its length, since we don't know if the - // white run continued to the left of the start point - while (j < maxJ && !image.get(j, i)) { - j++; - } - let currentState = 0; - while (j < maxJ) { - if (image.get(j, i)) { - // Black pixel - if (currentState === 1) { // Counting black pixels - stateCount[1]++; - } - else { // Counting white pixels - if (currentState === 2) { // A winner? - if (this.foundPatternCross(stateCount)) { // Yes - const confirmed = this.handlePossibleCenter(stateCount, i, j); - if (confirmed !== null) { - return confirmed; - } - } - stateCount[0] = stateCount[2]; - stateCount[1] = 1; - stateCount[2] = 0; - currentState = 1; - } - else { - stateCount[++currentState]++; - } - } - } - else { // White pixel - if (currentState === 1) { // Counting black pixels - currentState++; - } - stateCount[currentState]++; - } - j++; - } - if (this.foundPatternCross(stateCount)) { - const confirmed = this.handlePossibleCenter(stateCount, i, maxJ); - if (confirmed !== null) { - return confirmed; - } - } - } - // Hmm, nothing we saw was observed and confirmed twice. If we had - // any guess at all, return it. - if (this.possibleCenters.length !== 0) { - return this.possibleCenters[0]; - } - throw new NotFoundException(); - } - /** - * Given a count of black/white/black pixels just seen and an end position, - * figures the location of the center of this black/white/black run. - */ - static centerFromEnd(stateCount, end /*int*/) { - return (end - stateCount[2]) - stateCount[1] / 2.0; - } - /** - * @param stateCount count of black/white/black pixels just read - * @return true iff the proportions of the counts is close enough to the 1/1/1 ratios - * used by alignment patterns to be considered a match - */ - foundPatternCross(stateCount) { - const moduleSize = this.moduleSize; - const maxVariance = moduleSize / 2.0; - for (let i = 0; i < 3; i++) { - if (Math.abs(moduleSize - stateCount[i]) >= maxVariance) { - return false; - } - } - return true; - } - /** - *

    After a horizontal scan finds a potential alignment pattern, this method - * "cross-checks" by scanning down vertically through the center of the possible - * alignment pattern to see if the same proportion is detected.

    - * - * @param startI row where an alignment pattern was detected - * @param centerJ center of the section that appears to cross an alignment pattern - * @param maxCount maximum reasonable number of modules that should be - * observed in any reading state, based on the results of the horizontal scan - * @return vertical center of alignment pattern, or {@link Float#NaN} if not found - */ - crossCheckVertical(startI /*int*/, centerJ /*int*/, maxCount /*int*/, originalStateCountTotal /*int*/) { - const image = this.image; - const maxI = image.getHeight(); - const stateCount = this.crossCheckStateCount; - stateCount[0] = 0; - stateCount[1] = 0; - stateCount[2] = 0; - // Start counting up from center - let i = startI; - while (i >= 0 && image.get(centerJ, i) && stateCount[1] <= maxCount) { - stateCount[1]++; - i--; - } - // If already too many modules in this state or ran off the edge: - if (i < 0 || stateCount[1] > maxCount) { - return NaN; - } - while (i >= 0 && !image.get(centerJ, i) && stateCount[0] <= maxCount) { - stateCount[0]++; - i--; - } - if (stateCount[0] > maxCount) { - return NaN; - } - // Now also count down from center - i = startI + 1; - while (i < maxI && image.get(centerJ, i) && stateCount[1] <= maxCount) { - stateCount[1]++; - i++; - } - if (i === maxI || stateCount[1] > maxCount) { - return NaN; - } - while (i < maxI && !image.get(centerJ, i) && stateCount[2] <= maxCount) { - stateCount[2]++; - i++; - } - if (stateCount[2] > maxCount) { - return NaN; - } - const stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2]; - if (5 * Math.abs(stateCountTotal - originalStateCountTotal) >= 2 * originalStateCountTotal) { - return NaN; - } - return this.foundPatternCross(stateCount) ? AlignmentPatternFinder.centerFromEnd(stateCount, i) : NaN; - } - /** - *

    This is called when a horizontal scan finds a possible alignment pattern. It will - * cross check with a vertical scan, and if successful, will see if this pattern had been - * found on a previous horizontal scan. If so, we consider it confirmed and conclude we have - * found the alignment pattern.

    - * - * @param stateCount reading state module counts from horizontal scan - * @param i row where alignment pattern may be found - * @param j end of possible alignment pattern in row - * @return {@link AlignmentPattern} if we have found the same pattern twice, or null if not - */ - handlePossibleCenter(stateCount, i /*int*/, j /*int*/) { - const stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2]; - const centerJ = AlignmentPatternFinder.centerFromEnd(stateCount, j); - const centerI = this.crossCheckVertical(i, /*(int) */ centerJ, 2 * stateCount[1], stateCountTotal); - if (!isNaN(centerI)) { - const estimatedModuleSize = (stateCount[0] + stateCount[1] + stateCount[2]) / 3.0; - for (const center of this.possibleCenters) { - // Look for about the same center and module size: - if (center.aboutEquals(estimatedModuleSize, centerI, centerJ)) { - return center.combineEstimate(centerI, centerJ, estimatedModuleSize); - } - } - // Hadn't found this before; save it - const point = new AlignmentPattern(centerJ, centerI, estimatedModuleSize); - this.possibleCenters.push(point); - if (this.resultPointCallback !== null && this.resultPointCallback !== undefined) { - this.resultPointCallback.foundPossibleResultPoint(point); - } - } - return null; - } - } - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - *

    Encapsulates a finder pattern, which are the three square patterns found in - * the corners of QR Codes. It also encapsulates a count of similar finder patterns, - * as a convenience to the finder's bookkeeping.

    - * - * @author Sean Owen - */ - class FinderPattern$1 extends ResultPoint { - // FinderPattern(posX: number/*float*/, posY: number/*float*/, estimatedModuleSize: number/*float*/) { - // this(posX, posY, estimatedModuleSize, 1) - // } - constructor(posX /*float*/, posY /*float*/, estimatedModuleSize /*float*/, count /*int*/) { - super(posX, posY); - this.estimatedModuleSize = estimatedModuleSize; - this.count = count; - if (undefined === count) { - this.count = 1; - } - } - getEstimatedModuleSize() { - return this.estimatedModuleSize; - } - getCount() { - return this.count; - } - /* - void incrementCount() { - this.count++ - } - */ - /** - *

    Determines if this finder pattern "about equals" a finder pattern at the stated - * position and size -- meaning, it is at nearly the same center with nearly the same size.

    - */ - aboutEquals(moduleSize /*float*/, i /*float*/, j /*float*/) { - if (Math.abs(i - this.getY()) <= moduleSize && Math.abs(j - this.getX()) <= moduleSize) { - const moduleSizeDiff = Math.abs(moduleSize - this.estimatedModuleSize); - return moduleSizeDiff <= 1.0 || moduleSizeDiff <= this.estimatedModuleSize; - } - return false; - } - /** - * Combines this object's current estimate of a finder pattern position and module size - * with a new estimate. It returns a new {@code FinderPattern} containing a weighted average - * based on count. - */ - combineEstimate(i /*float*/, j /*float*/, newModuleSize /*float*/) { - const combinedCount = this.count + 1; - const combinedX = (this.count * this.getX() + j) / combinedCount; - const combinedY = (this.count * this.getY() + i) / combinedCount; - const combinedModuleSize = (this.count * this.estimatedModuleSize + newModuleSize) / combinedCount; - return new FinderPattern$1(combinedX, combinedY, combinedModuleSize, combinedCount); - } - } - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - *

    Encapsulates information about finder patterns in an image, including the location of - * the three finder patterns, and their estimated module size.

    - * - * @author Sean Owen - */ - class FinderPatternInfo { - constructor(patternCenters) { - this.bottomLeft = patternCenters[0]; - this.topLeft = patternCenters[1]; - this.topRight = patternCenters[2]; - } - getBottomLeft() { - return this.bottomLeft; - } - getTopLeft() { - return this.topLeft; - } - getTopRight() { - return this.topRight; - } - } - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /*import java.io.Serializable;*/ - /*import java.util.ArrayList;*/ - /*import java.util.Collections;*/ - /*import java.util.Comparator;*/ - /*import java.util.List;*/ - /*import java.util.Map;*/ - /** - *

    This class attempts to find finder patterns in a QR Code. Finder patterns are the square - * markers at three corners of a QR Code.

    - * - *

    This class is thread-safe but not reentrant. Each thread must allocate its own object. - * - * @author Sean Owen - */ - class FinderPatternFinder { - /** - *

    Creates a finder that will search the image for three finder patterns.

    - * - * @param image image to search - */ - // public constructor(image: BitMatrix) { - // this(image, null) - // } - constructor(image, resultPointCallback) { - this.image = image; - this.resultPointCallback = resultPointCallback; - this.possibleCenters = []; - this.crossCheckStateCount = new Int32Array(5); - this.resultPointCallback = resultPointCallback; - } - getImage() { - return this.image; - } - getPossibleCenters() { - return this.possibleCenters; - } - find(hints) { - const tryHarder = (hints !== null && hints !== undefined) && undefined !== hints.get(DecodeHintType$1.TRY_HARDER); - const pureBarcode = (hints !== null && hints !== undefined) && undefined !== hints.get(DecodeHintType$1.PURE_BARCODE); - const image = this.image; - const maxI = image.getHeight(); - const maxJ = image.getWidth(); - // We are looking for black/white/black/white/black modules in - // 1:1:3:1:1 ratio; this tracks the number of such modules seen so far - // Let's assume that the maximum version QR Code we support takes up 1/4 the height of the - // image, and then account for the center being 3 modules in size. This gives the smallest - // number of pixels the center could be, so skip this often. When trying harder, look for all - // QR versions regardless of how dense they are. - let iSkip = Math.floor((3 * maxI) / (4 * FinderPatternFinder.MAX_MODULES)); - if (iSkip < FinderPatternFinder.MIN_SKIP || tryHarder) { - iSkip = FinderPatternFinder.MIN_SKIP; - } - let done = false; - const stateCount = new Int32Array(5); - for (let i = iSkip - 1; i < maxI && !done; i += iSkip) { - // Get a row of black/white values - stateCount[0] = 0; - stateCount[1] = 0; - stateCount[2] = 0; - stateCount[3] = 0; - stateCount[4] = 0; - let currentState = 0; - for (let j = 0; j < maxJ; j++) { - if (image.get(j, i)) { - // Black pixel - if ((currentState & 1) === 1) { // Counting white pixels - currentState++; - } - stateCount[currentState]++; - } - else { // White pixel - if ((currentState & 1) === 0) { // Counting black pixels - if (currentState === 4) { // A winner? - if (FinderPatternFinder.foundPatternCross(stateCount)) { // Yes - const confirmed = this.handlePossibleCenter(stateCount, i, j, pureBarcode); - if (confirmed === true) { - // Start examining every other line. Checking each line turned out to be too - // expensive and didn't improve performance. - iSkip = 2; - if (this.hasSkipped === true) { - done = this.haveMultiplyConfirmedCenters(); - } - else { - const rowSkip = this.findRowSkip(); - if (rowSkip > stateCount[2]) { - // Skip rows between row of lower confirmed center - // and top of presumed third confirmed center - // but back up a bit to get a full chance of detecting - // it, entire width of center of finder pattern - // Skip by rowSkip, but back off by stateCount[2] (size of last center - // of pattern we saw) to be conservative, and also back off by iSkip which - // is about to be re-added - i += rowSkip - stateCount[2] - iSkip; - j = maxJ - 1; - } - } - } - else { - stateCount[0] = stateCount[2]; - stateCount[1] = stateCount[3]; - stateCount[2] = stateCount[4]; - stateCount[3] = 1; - stateCount[4] = 0; - currentState = 3; - continue; - } - // Clear state to start looking again - currentState = 0; - stateCount[0] = 0; - stateCount[1] = 0; - stateCount[2] = 0; - stateCount[3] = 0; - stateCount[4] = 0; - } - else { // No, shift counts back by two - stateCount[0] = stateCount[2]; - stateCount[1] = stateCount[3]; - stateCount[2] = stateCount[4]; - stateCount[3] = 1; - stateCount[4] = 0; - currentState = 3; - } - } - else { - stateCount[++currentState]++; - } - } - else { // Counting white pixels - stateCount[currentState]++; - } - } - } - if (FinderPatternFinder.foundPatternCross(stateCount)) { - const confirmed = this.handlePossibleCenter(stateCount, i, maxJ, pureBarcode); - if (confirmed === true) { - iSkip = stateCount[0]; - if (this.hasSkipped) { - // Found a third one - done = this.haveMultiplyConfirmedCenters(); - } - } - } - } - const patternInfo = this.selectBestPatterns(); - ResultPoint.orderBestPatterns(patternInfo); - return new FinderPatternInfo(patternInfo); - } - /** - * Given a count of black/white/black/white/black pixels just seen and an end position, - * figures the location of the center of this run. - */ - static centerFromEnd(stateCount, end /*int*/) { - return (end - stateCount[4] - stateCount[3]) - stateCount[2] / 2.0; - } - /** - * @param stateCount count of black/white/black/white/black pixels just read - * @return true iff the proportions of the counts is close enough to the 1/1/3/1/1 ratios - * used by finder patterns to be considered a match - */ - static foundPatternCross(stateCount) { - let totalModuleSize = 0; - for (let i = 0; i < 5; i++) { - const count = stateCount[i]; - if (count === 0) { - return false; - } - totalModuleSize += count; - } - if (totalModuleSize < 7) { - return false; - } - const moduleSize = totalModuleSize / 7.0; - const maxVariance = moduleSize / 2.0; - // Allow less than 50% variance from 1-1-3-1-1 proportions - return Math.abs(moduleSize - stateCount[0]) < maxVariance && - Math.abs(moduleSize - stateCount[1]) < maxVariance && - Math.abs(3.0 * moduleSize - stateCount[2]) < 3 * maxVariance && - Math.abs(moduleSize - stateCount[3]) < maxVariance && - Math.abs(moduleSize - stateCount[4]) < maxVariance; - } - getCrossCheckStateCount() { - const crossCheckStateCount = this.crossCheckStateCount; - crossCheckStateCount[0] = 0; - crossCheckStateCount[1] = 0; - crossCheckStateCount[2] = 0; - crossCheckStateCount[3] = 0; - crossCheckStateCount[4] = 0; - return crossCheckStateCount; - } - /** - * After a vertical and horizontal scan finds a potential finder pattern, this method - * "cross-cross-cross-checks" by scanning down diagonally through the center of the possible - * finder pattern to see if the same proportion is detected. - * - * @param startI row where a finder pattern was detected - * @param centerJ center of the section that appears to cross a finder pattern - * @param maxCount maximum reasonable number of modules that should be - * observed in any reading state, based on the results of the horizontal scan - * @param originalStateCountTotal The original state count total. - * @return true if proportions are withing expected limits - */ - crossCheckDiagonal(startI /*int*/, centerJ /*int*/, maxCount /*int*/, originalStateCountTotal /*int*/) { - const stateCount = this.getCrossCheckStateCount(); - // Start counting up, left from center finding black center mass - let i = 0; - const image = this.image; - while (startI >= i && centerJ >= i && image.get(centerJ - i, startI - i)) { - stateCount[2]++; - i++; - } - if (startI < i || centerJ < i) { - return false; - } - // Continue up, left finding white space - while (startI >= i && centerJ >= i && !image.get(centerJ - i, startI - i) && - stateCount[1] <= maxCount) { - stateCount[1]++; - i++; - } - // If already too many modules in this state or ran off the edge: - if (startI < i || centerJ < i || stateCount[1] > maxCount) { - return false; - } - // Continue up, left finding black border - while (startI >= i && centerJ >= i && image.get(centerJ - i, startI - i) && - stateCount[0] <= maxCount) { - stateCount[0]++; - i++; - } - if (stateCount[0] > maxCount) { - return false; - } - const maxI = image.getHeight(); - const maxJ = image.getWidth(); - // Now also count down, right from center - i = 1; - while (startI + i < maxI && centerJ + i < maxJ && image.get(centerJ + i, startI + i)) { - stateCount[2]++; - i++; - } - // Ran off the edge? - if (startI + i >= maxI || centerJ + i >= maxJ) { - return false; - } - while (startI + i < maxI && centerJ + i < maxJ && !image.get(centerJ + i, startI + i) && - stateCount[3] < maxCount) { - stateCount[3]++; - i++; - } - if (startI + i >= maxI || centerJ + i >= maxJ || stateCount[3] >= maxCount) { - return false; - } - while (startI + i < maxI && centerJ + i < maxJ && image.get(centerJ + i, startI + i) && - stateCount[4] < maxCount) { - stateCount[4]++; - i++; - } - if (stateCount[4] >= maxCount) { - return false; - } - // If we found a finder-pattern-like section, but its size is more than 100% different than - // the original, assume it's a false positive - const stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] + stateCount[4]; - return Math.abs(stateCountTotal - originalStateCountTotal) < 2 * originalStateCountTotal && - FinderPatternFinder.foundPatternCross(stateCount); - } - /** - *

    After a horizontal scan finds a potential finder pattern, this method - * "cross-checks" by scanning down vertically through the center of the possible - * finder pattern to see if the same proportion is detected.

    - * - * @param startI row where a finder pattern was detected - * @param centerJ center of the section that appears to cross a finder pattern - * @param maxCount maximum reasonable number of modules that should be - * observed in any reading state, based on the results of the horizontal scan - * @return vertical center of finder pattern, or {@link Float#NaN} if not found - */ - crossCheckVertical(startI /*int*/, centerJ /*int*/, maxCount /*int*/, originalStateCountTotal /*int*/) { - const image = this.image; - const maxI = image.getHeight(); - const stateCount = this.getCrossCheckStateCount(); - // Start counting up from center - let i = startI; - while (i >= 0 && image.get(centerJ, i)) { - stateCount[2]++; - i--; - } - if (i < 0) { - return NaN; - } - while (i >= 0 && !image.get(centerJ, i) && stateCount[1] <= maxCount) { - stateCount[1]++; - i--; - } - // If already too many modules in this state or ran off the edge: - if (i < 0 || stateCount[1] > maxCount) { - return NaN; - } - while (i >= 0 && image.get(centerJ, i) && stateCount[0] <= maxCount) { - stateCount[0]++; - i--; - } - if (stateCount[0] > maxCount) { - return NaN; - } - // Now also count down from center - i = startI + 1; - while (i < maxI && image.get(centerJ, i)) { - stateCount[2]++; - i++; - } - if (i === maxI) { - return NaN; - } - while (i < maxI && !image.get(centerJ, i) && stateCount[3] < maxCount) { - stateCount[3]++; - i++; - } - if (i === maxI || stateCount[3] >= maxCount) { - return NaN; - } - while (i < maxI && image.get(centerJ, i) && stateCount[4] < maxCount) { - stateCount[4]++; - i++; - } - if (stateCount[4] >= maxCount) { - return NaN; - } - // If we found a finder-pattern-like section, but its size is more than 40% different than - // the original, assume it's a false positive - const stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] + - stateCount[4]; - if (5 * Math.abs(stateCountTotal - originalStateCountTotal) >= 2 * originalStateCountTotal) { - return NaN; - } - return FinderPatternFinder.foundPatternCross(stateCount) ? FinderPatternFinder.centerFromEnd(stateCount, i) : NaN; - } - /** - *

    Like {@link #crossCheckVertical(int, int, int, int)}, and in fact is basically identical, - * except it reads horizontally instead of vertically. This is used to cross-cross - * check a vertical cross check and locate the real center of the alignment pattern.

    - */ - crossCheckHorizontal(startJ /*int*/, centerI /*int*/, maxCount /*int*/, originalStateCountTotal /*int*/) { - const image = this.image; - const maxJ = image.getWidth(); - const stateCount = this.getCrossCheckStateCount(); - let j = startJ; - while (j >= 0 && image.get(j, centerI)) { - stateCount[2]++; - j--; - } - if (j < 0) { - return NaN; - } - while (j >= 0 && !image.get(j, centerI) && stateCount[1] <= maxCount) { - stateCount[1]++; - j--; - } - if (j < 0 || stateCount[1] > maxCount) { - return NaN; - } - while (j >= 0 && image.get(j, centerI) && stateCount[0] <= maxCount) { - stateCount[0]++; - j--; - } - if (stateCount[0] > maxCount) { - return NaN; - } - j = startJ + 1; - while (j < maxJ && image.get(j, centerI)) { - stateCount[2]++; - j++; - } - if (j === maxJ) { - return NaN; - } - while (j < maxJ && !image.get(j, centerI) && stateCount[3] < maxCount) { - stateCount[3]++; - j++; - } - if (j === maxJ || stateCount[3] >= maxCount) { - return NaN; - } - while (j < maxJ && image.get(j, centerI) && stateCount[4] < maxCount) { - stateCount[4]++; - j++; - } - if (stateCount[4] >= maxCount) { - return NaN; - } - // If we found a finder-pattern-like section, but its size is significantly different than - // the original, assume it's a false positive - const stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] + - stateCount[4]; - if (5 * Math.abs(stateCountTotal - originalStateCountTotal) >= originalStateCountTotal) { - return NaN; - } - return FinderPatternFinder.foundPatternCross(stateCount) ? FinderPatternFinder.centerFromEnd(stateCount, j) : NaN; - } - /** - *

    This is called when a horizontal scan finds a possible alignment pattern. It will - * cross check with a vertical scan, and if successful, will, ah, cross-cross-check - * with another horizontal scan. This is needed primarily to locate the real horizontal - * center of the pattern in cases of extreme skew. - * And then we cross-cross-cross check with another diagonal scan.

    - * - *

    If that succeeds the finder pattern location is added to a list that tracks - * the number of times each location has been nearly-matched as a finder pattern. - * Each additional find is more evidence that the location is in fact a finder - * pattern center - * - * @param stateCount reading state module counts from horizontal scan - * @param i row where finder pattern may be found - * @param j end of possible finder pattern in row - * @param pureBarcode true if in "pure barcode" mode - * @return true if a finder pattern candidate was found this time - */ - handlePossibleCenter(stateCount, i /*int*/, j /*int*/, pureBarcode) { - const stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] + - stateCount[4]; - let centerJ = FinderPatternFinder.centerFromEnd(stateCount, j); - let centerI = this.crossCheckVertical(i, /*(int) */ Math.floor(centerJ), stateCount[2], stateCountTotal); - if (!isNaN(centerI)) { - // Re-cross check - centerJ = this.crossCheckHorizontal(/*(int) */ Math.floor(centerJ), /*(int) */ Math.floor(centerI), stateCount[2], stateCountTotal); - if (!isNaN(centerJ) && - (!pureBarcode || this.crossCheckDiagonal(/*(int) */ Math.floor(centerI), /*(int) */ Math.floor(centerJ), stateCount[2], stateCountTotal))) { - const estimatedModuleSize = stateCountTotal / 7.0; - let found = false; - const possibleCenters = this.possibleCenters; - for (let index = 0, length = possibleCenters.length; index < length; index++) { - const center = possibleCenters[index]; - // Look for about the same center and module size: - if (center.aboutEquals(estimatedModuleSize, centerI, centerJ)) { - possibleCenters[index] = center.combineEstimate(centerI, centerJ, estimatedModuleSize); - found = true; - break; - } - } - if (!found) { - const point = new FinderPattern$1(centerJ, centerI, estimatedModuleSize); - possibleCenters.push(point); - if (this.resultPointCallback !== null && this.resultPointCallback !== undefined) { - this.resultPointCallback.foundPossibleResultPoint(point); - } - } - return true; - } - } - return false; - } - /** - * @return number of rows we could safely skip during scanning, based on the first - * two finder patterns that have been located. In some cases their position will - * allow us to infer that the third pattern must lie below a certain point farther - * down in the image. - */ - findRowSkip() { - const max = this.possibleCenters.length; - if (max <= 1) { - return 0; - } - let firstConfirmedCenter = null; - for (const center of this.possibleCenters) { - if (center.getCount() >= FinderPatternFinder.CENTER_QUORUM) { - if (firstConfirmedCenter == null) { - firstConfirmedCenter = center; - } - else { - // We have two confirmed centers - // How far down can we skip before resuming looking for the next - // pattern? In the worst case, only the difference between the - // difference in the x / y coordinates of the two centers. - // This is the case where you find top left last. - this.hasSkipped = true; - return /*(int) */ Math.floor((Math.abs(firstConfirmedCenter.getX() - center.getX()) - - Math.abs(firstConfirmedCenter.getY() - center.getY())) / 2); - } - } - } - return 0; - } - /** - * @return true iff we have found at least 3 finder patterns that have been detected - * at least {@link #CENTER_QUORUM} times each, and, the estimated module size of the - * candidates is "pretty similar" - */ - haveMultiplyConfirmedCenters() { - let confirmedCount = 0; - let totalModuleSize = 0.0; - const max = this.possibleCenters.length; - for (const pattern of this.possibleCenters) { - if (pattern.getCount() >= FinderPatternFinder.CENTER_QUORUM) { - confirmedCount++; - totalModuleSize += pattern.getEstimatedModuleSize(); - } - } - if (confirmedCount < 3) { - return false; - } - // OK, we have at least 3 confirmed centers, but, it's possible that one is a "false positive" - // and that we need to keep looking. We detect this by asking if the estimated module sizes - // vary too much. We arbitrarily say that when the total deviation from average exceeds - // 5% of the total module size estimates, it's too much. - const average = totalModuleSize / max; - let totalDeviation = 0.0; - for (const pattern of this.possibleCenters) { - totalDeviation += Math.abs(pattern.getEstimatedModuleSize() - average); - } - return totalDeviation <= 0.05 * totalModuleSize; - } - /** - * @return the 3 best {@link FinderPattern}s from our list of candidates. The "best" are - * those that have been detected at least {@link #CENTER_QUORUM} times, and whose module - * size differs from the average among those patterns the least - * @throws NotFoundException if 3 such finder patterns do not exist - */ - selectBestPatterns() { - const startSize = this.possibleCenters.length; - if (startSize < 3) { - // Couldn't find enough finder patterns - throw new NotFoundException(); - } - const possibleCenters = this.possibleCenters; - let average; - // Filter outlier possibilities whose module size is too different - if (startSize > 3) { - // But we can only afford to do so if we have at least 4 possibilities to choose from - let totalModuleSize = 0.0; - let square = 0.0; - for (const center of this.possibleCenters) { - const size = center.getEstimatedModuleSize(); - totalModuleSize += size; - square += size * size; - } - average = totalModuleSize / startSize; - let stdDev = Math.sqrt(square / startSize - average * average); - possibleCenters.sort( - /** - *

    Orders by furthest from average

    - */ - // FurthestFromAverageComparator implements Comparator - (center1, center2) => { - const dA = Math.abs(center2.getEstimatedModuleSize() - average); - const dB = Math.abs(center1.getEstimatedModuleSize() - average); - return dA < dB ? -1 : dA > dB ? 1 : 0; - }); - const limit = Math.max(0.2 * average, stdDev); - for (let i = 0; i < possibleCenters.length && possibleCenters.length > 3; i++) { - const pattern = possibleCenters[i]; - if (Math.abs(pattern.getEstimatedModuleSize() - average) > limit) { - possibleCenters.splice(i, 1); - i--; - } - } - } - if (possibleCenters.length > 3) { - // Throw away all but those first size candidate points we found. - let totalModuleSize = 0.0; - for (const possibleCenter of possibleCenters) { - totalModuleSize += possibleCenter.getEstimatedModuleSize(); - } - average = totalModuleSize / possibleCenters.length; - possibleCenters.sort( - /** - *

    Orders by {@link FinderPattern#getCount()}, descending.

    - */ - // CenterComparator implements Comparator - (center1, center2) => { - if (center2.getCount() === center1.getCount()) { - const dA = Math.abs(center2.getEstimatedModuleSize() - average); - const dB = Math.abs(center1.getEstimatedModuleSize() - average); - return dA < dB ? 1 : dA > dB ? -1 : 0; - } - else { - return center2.getCount() - center1.getCount(); - } - }); - possibleCenters.splice(3); // this is not realy necessary as we only return first 3 anyway - } - return [ - possibleCenters[0], - possibleCenters[1], - possibleCenters[2] - ]; - } - } - FinderPatternFinder.CENTER_QUORUM = 2; - FinderPatternFinder.MIN_SKIP = 3; // 1 pixel/module times 3 modules/center - FinderPatternFinder.MAX_MODULES = 57; // support up to version 10 for mobile clients - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /*import java.util.Map;*/ - /** - *

    Encapsulates logic that can detect a QR Code in an image, even if the QR Code - * is rotated or skewed, or partially obscured.

    - * - * @author Sean Owen - */ - class Detector$2 { - constructor(image) { - this.image = image; - } - getImage() { - return this.image; - } - getResultPointCallback() { - return this.resultPointCallback; - } - /** - *

    Detects a QR Code in an image.

    - * - * @return {@link DetectorResult} encapsulating results of detecting a QR Code - * @throws NotFoundException if QR Code cannot be found - * @throws FormatException if a QR Code cannot be decoded - */ - // public detect(): DetectorResult /*throws NotFoundException, FormatException*/ { - // return detect(null) - // } - /** - *

    Detects a QR Code in an image.

    - * - * @param hints optional hints to detector - * @return {@link DetectorResult} encapsulating results of detecting a QR Code - * @throws NotFoundException if QR Code cannot be found - * @throws FormatException if a QR Code cannot be decoded - */ - detect(hints) { - this.resultPointCallback = (hints === null || hints === undefined) ? null : - /*(ResultPointCallback) */ hints.get(DecodeHintType$1.NEED_RESULT_POINT_CALLBACK); - const finder = new FinderPatternFinder(this.image, this.resultPointCallback); - const info = finder.find(hints); - return this.processFinderPatternInfo(info); - } - processFinderPatternInfo(info) { - const topLeft = info.getTopLeft(); - const topRight = info.getTopRight(); - const bottomLeft = info.getBottomLeft(); - const moduleSize = this.calculateModuleSize(topLeft, topRight, bottomLeft); - if (moduleSize < 1.0) { - throw new NotFoundException('No pattern found in proccess finder.'); - } - const dimension = Detector$2.computeDimension(topLeft, topRight, bottomLeft, moduleSize); - const provisionalVersion = Version$1.getProvisionalVersionForDimension(dimension); - const modulesBetweenFPCenters = provisionalVersion.getDimensionForVersion() - 7; - let alignmentPattern = null; - // Anything above version 1 has an alignment pattern - if (provisionalVersion.getAlignmentPatternCenters().length > 0) { - // Guess where a "bottom right" finder pattern would have been - const bottomRightX = topRight.getX() - topLeft.getX() + bottomLeft.getX(); - const bottomRightY = topRight.getY() - topLeft.getY() + bottomLeft.getY(); - // Estimate that alignment pattern is closer by 3 modules - // from "bottom right" to known top left location - const correctionToTopLeft = 1.0 - 3.0 / modulesBetweenFPCenters; - const estAlignmentX = /*(int) */ Math.floor(topLeft.getX() + correctionToTopLeft * (bottomRightX - topLeft.getX())); - const estAlignmentY = /*(int) */ Math.floor(topLeft.getY() + correctionToTopLeft * (bottomRightY - topLeft.getY())); - // Kind of arbitrary -- expand search radius before giving up - for (let i = 4; i <= 16; i <<= 1) { - try { - alignmentPattern = this.findAlignmentInRegion(moduleSize, estAlignmentX, estAlignmentY, i); - break; - } - catch (re /*NotFoundException*/) { - if (!(re instanceof NotFoundException)) { - throw re; - } - // try next round - } - } - // If we didn't find alignment pattern... well try anyway without it - } - const transform = Detector$2.createTransform(topLeft, topRight, bottomLeft, alignmentPattern, dimension); - const bits = Detector$2.sampleGrid(this.image, transform, dimension); - let points; - if (alignmentPattern === null) { - points = [bottomLeft, topLeft, topRight]; - } - else { - points = [bottomLeft, topLeft, topRight, alignmentPattern]; - } - return new DetectorResult(bits, points); - } - static createTransform(topLeft, topRight, bottomLeft, alignmentPattern, dimension /*int*/) { - const dimMinusThree = dimension - 3.5; - let bottomRightX; /*float*/ - let bottomRightY; /*float*/ - let sourceBottomRightX; /*float*/ - let sourceBottomRightY; /*float*/ - if (alignmentPattern !== null) { - bottomRightX = alignmentPattern.getX(); - bottomRightY = alignmentPattern.getY(); - sourceBottomRightX = dimMinusThree - 3.0; - sourceBottomRightY = sourceBottomRightX; - } - else { - // Don't have an alignment pattern, just make up the bottom-right point - bottomRightX = (topRight.getX() - topLeft.getX()) + bottomLeft.getX(); - bottomRightY = (topRight.getY() - topLeft.getY()) + bottomLeft.getY(); - sourceBottomRightX = dimMinusThree; - sourceBottomRightY = dimMinusThree; - } - return PerspectiveTransform.quadrilateralToQuadrilateral(3.5, 3.5, dimMinusThree, 3.5, sourceBottomRightX, sourceBottomRightY, 3.5, dimMinusThree, topLeft.getX(), topLeft.getY(), topRight.getX(), topRight.getY(), bottomRightX, bottomRightY, bottomLeft.getX(), bottomLeft.getY()); - } - static sampleGrid(image, transform, dimension /*int*/) { - const sampler = GridSamplerInstance.getInstance(); - return sampler.sampleGridWithTransform(image, dimension, dimension, transform); - } - /** - *

    Computes the dimension (number of modules on a size) of the QR Code based on the position - * of the finder patterns and estimated module size.

    - */ - static computeDimension(topLeft, topRight, bottomLeft, moduleSize /*float*/) { - const tltrCentersDimension = MathUtils.round(ResultPoint.distance(topLeft, topRight) / moduleSize); - const tlblCentersDimension = MathUtils.round(ResultPoint.distance(topLeft, bottomLeft) / moduleSize); - let dimension = Math.floor((tltrCentersDimension + tlblCentersDimension) / 2) + 7; - switch (dimension & 0x03) { // mod 4 - case 0: - dimension++; - break; - // 1? do nothing - case 2: - dimension--; - break; - case 3: - throw new NotFoundException('Dimensions could be not found.'); - } - return dimension; - } - /** - *

    Computes an average estimated module size based on estimated derived from the positions - * of the three finder patterns.

    - * - * @param topLeft detected top-left finder pattern center - * @param topRight detected top-right finder pattern center - * @param bottomLeft detected bottom-left finder pattern center - * @return estimated module size - */ - calculateModuleSize(topLeft, topRight, bottomLeft) { - // Take the average - return (this.calculateModuleSizeOneWay(topLeft, topRight) + - this.calculateModuleSizeOneWay(topLeft, bottomLeft)) / 2.0; - } - /** - *

    Estimates module size based on two finder patterns -- it uses - * {@link #sizeOfBlackWhiteBlackRunBothWays(int, int, int, int)} to figure the - * width of each, measuring along the axis between their centers.

    - */ - calculateModuleSizeOneWay(pattern, otherPattern) { - const moduleSizeEst1 = this.sizeOfBlackWhiteBlackRunBothWays(/*(int) */ Math.floor(pattern.getX()), - /*(int) */ Math.floor(pattern.getY()), - /*(int) */ Math.floor(otherPattern.getX()), - /*(int) */ Math.floor(otherPattern.getY())); - const moduleSizeEst2 = this.sizeOfBlackWhiteBlackRunBothWays(/*(int) */ Math.floor(otherPattern.getX()), - /*(int) */ Math.floor(otherPattern.getY()), - /*(int) */ Math.floor(pattern.getX()), - /*(int) */ Math.floor(pattern.getY())); - if (isNaN(moduleSizeEst1)) { - return moduleSizeEst2 / 7.0; - } - if (isNaN(moduleSizeEst2)) { - return moduleSizeEst1 / 7.0; - } - // Average them, and divide by 7 since we've counted the width of 3 black modules, - // and 1 white and 1 black module on either side. Ergo, divide sum by 14. - return (moduleSizeEst1 + moduleSizeEst2) / 14.0; - } - /** - * See {@link #sizeOfBlackWhiteBlackRun(int, int, int, int)}; computes the total width of - * a finder pattern by looking for a black-white-black run from the center in the direction - * of another point (another finder pattern center), and in the opposite direction too. - */ - sizeOfBlackWhiteBlackRunBothWays(fromX /*int*/, fromY /*int*/, toX /*int*/, toY /*int*/) { - let result = this.sizeOfBlackWhiteBlackRun(fromX, fromY, toX, toY); - // Now count other way -- don't run off image though of course - let scale = 1.0; - let otherToX = fromX - (toX - fromX); - if (otherToX < 0) { - scale = fromX / /*(float) */ (fromX - otherToX); - otherToX = 0; - } - else if (otherToX >= this.image.getWidth()) { - scale = (this.image.getWidth() - 1 - fromX) / /*(float) */ (otherToX - fromX); - otherToX = this.image.getWidth() - 1; - } - let otherToY = /*(int) */ Math.floor(fromY - (toY - fromY) * scale); - scale = 1.0; - if (otherToY < 0) { - scale = fromY / /*(float) */ (fromY - otherToY); - otherToY = 0; - } - else if (otherToY >= this.image.getHeight()) { - scale = (this.image.getHeight() - 1 - fromY) / /*(float) */ (otherToY - fromY); - otherToY = this.image.getHeight() - 1; - } - otherToX = /*(int) */ Math.floor(fromX + (otherToX - fromX) * scale); - result += this.sizeOfBlackWhiteBlackRun(fromX, fromY, otherToX, otherToY); - // Middle pixel is double-counted this way; subtract 1 - return result - 1.0; - } - /** - *

    This method traces a line from a point in the image, in the direction towards another point. - * It begins in a black region, and keeps going until it finds white, then black, then white again. - * It reports the distance from the start to this point.

    - * - *

    This is used when figuring out how wide a finder pattern is, when the finder pattern - * may be skewed or rotated.

    - */ - sizeOfBlackWhiteBlackRun(fromX /*int*/, fromY /*int*/, toX /*int*/, toY /*int*/) { - // Mild variant of Bresenham's algorithm - // see http://en.wikipedia.org/wiki/Bresenham's_line_algorithm - const steep = Math.abs(toY - fromY) > Math.abs(toX - fromX); - if (steep) { - let temp = fromX; - fromX = fromY; - fromY = temp; - temp = toX; - toX = toY; - toY = temp; - } - const dx = Math.abs(toX - fromX); - const dy = Math.abs(toY - fromY); - let error = -dx / 2; - const xstep = fromX < toX ? 1 : -1; - const ystep = fromY < toY ? 1 : -1; - // In black pixels, looking for white, first or second time. - let state = 0; - // Loop up until x == toX, but not beyond - const xLimit = toX + xstep; - for (let x = fromX, y = fromY; x !== xLimit; x += xstep) { - const realX = steep ? y : x; - const realY = steep ? x : y; - // Does current pixel mean we have moved white to black or vice versa? - // Scanning black in state 0,2 and white in state 1, so if we find the wrong - // color, advance to next state or end if we are in state 2 already - if ((state === 1) === this.image.get(realX, realY)) { - if (state === 2) { - return MathUtils.distance(x, y, fromX, fromY); - } - state++; - } - error += dy; - if (error > 0) { - if (y === toY) { - break; - } - y += ystep; - error -= dx; - } - } - // Found black-white-black; give the benefit of the doubt that the next pixel outside the image - // is "white" so this last point at (toX+xStep,toY) is the right ending. This is really a - // small approximation; (toX+xStep,toY+yStep) might be really correct. Ignore this. - if (state === 2) { - return MathUtils.distance(toX + xstep, toY, fromX, fromY); - } - // else we didn't find even black-white-black; no estimate is really possible - return NaN; - } - /** - *

    Attempts to locate an alignment pattern in a limited region of the image, which is - * guessed to contain it. This method uses {@link AlignmentPattern}.

    - * - * @param overallEstModuleSize estimated module size so far - * @param estAlignmentX x coordinate of center of area probably containing alignment pattern - * @param estAlignmentY y coordinate of above - * @param allowanceFactor number of pixels in all directions to search from the center - * @return {@link AlignmentPattern} if found, or null otherwise - * @throws NotFoundException if an unexpected error occurs during detection - */ - findAlignmentInRegion(overallEstModuleSize /*float*/, estAlignmentX /*int*/, estAlignmentY /*int*/, allowanceFactor /*float*/) { - // Look for an alignment pattern (3 modules in size) around where it - // should be - const allowance = /*(int) */ Math.floor(allowanceFactor * overallEstModuleSize); - const alignmentAreaLeftX = Math.max(0, estAlignmentX - allowance); - const alignmentAreaRightX = Math.min(this.image.getWidth() - 1, estAlignmentX + allowance); - if (alignmentAreaRightX - alignmentAreaLeftX < overallEstModuleSize * 3) { - throw new NotFoundException('Alignment top exceeds estimated module size.'); - } - const alignmentAreaTopY = Math.max(0, estAlignmentY - allowance); - const alignmentAreaBottomY = Math.min(this.image.getHeight() - 1, estAlignmentY + allowance); - if (alignmentAreaBottomY - alignmentAreaTopY < overallEstModuleSize * 3) { - throw new NotFoundException('Alignment bottom exceeds estimated module size.'); - } - const alignmentFinder = new AlignmentPatternFinder(this.image, alignmentAreaLeftX, alignmentAreaTopY, alignmentAreaRightX - alignmentAreaLeftX, alignmentAreaBottomY - alignmentAreaTopY, overallEstModuleSize, this.resultPointCallback); - return alignmentFinder.find(); - } - } - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /*import java.util.List;*/ - /*import java.util.Map;*/ - /** - * This implementation can detect and decode QR Codes in an image. - * - * @author Sean Owen - */ - class QRCodeReader { - constructor() { - this.decoder = new Decoder$2(); - } - getDecoder() { - return this.decoder; - } - /** - * Locates and decodes a QR code in an image. - * - * @return a representing: string the content encoded by the QR code - * @throws NotFoundException if a QR code cannot be found - * @throws FormatException if a QR code cannot be decoded - * @throws ChecksumException if error correction fails - */ - /*@Override*/ - // public decode(image: BinaryBitmap): Result /*throws NotFoundException, ChecksumException, FormatException */ { - // return this.decode(image, null) - // } - /*@Override*/ - decode(image, hints) { - let decoderResult; - let points; - if (hints !== undefined && hints !== null && undefined !== hints.get(DecodeHintType$1.PURE_BARCODE)) { - const bits = QRCodeReader.extractPureBits(image.getBlackMatrix()); - decoderResult = this.decoder.decodeBitMatrix(bits, hints); - points = QRCodeReader.NO_POINTS; - } - else { - const detectorResult = new Detector$2(image.getBlackMatrix()).detect(hints); - decoderResult = this.decoder.decodeBitMatrix(detectorResult.getBits(), hints); - points = detectorResult.getPoints(); - } - // If the code was mirrored: swap the bottom-left and the top-right points. - if (decoderResult.getOther() instanceof QRCodeDecoderMetaData) { - decoderResult.getOther().applyMirroredCorrection(points); - } - const result = new Result(decoderResult.getText(), decoderResult.getRawBytes(), undefined, points, BarcodeFormat$1.QR_CODE, undefined); - const byteSegments = decoderResult.getByteSegments(); - if (byteSegments !== null) { - result.putMetadata(ResultMetadataType$1.BYTE_SEGMENTS, byteSegments); - } - const ecLevel = decoderResult.getECLevel(); - if (ecLevel !== null) { - result.putMetadata(ResultMetadataType$1.ERROR_CORRECTION_LEVEL, ecLevel); - } - if (decoderResult.hasStructuredAppend()) { - result.putMetadata(ResultMetadataType$1.STRUCTURED_APPEND_SEQUENCE, decoderResult.getStructuredAppendSequenceNumber()); - result.putMetadata(ResultMetadataType$1.STRUCTURED_APPEND_PARITY, decoderResult.getStructuredAppendParity()); - } - return result; - } - /*@Override*/ - reset() { - // do nothing - } - /** - * This method detects a code in a "pure" image -- that is, pure monochrome image - * which contains only an unrotated, unskewed, image of a code, with some white border - * around it. This is a specialized method that works exceptionally fast in this special - * case. - * - * @see com.google.zxing.datamatrix.DataMatrixReader#extractPureBits(BitMatrix) - */ - static extractPureBits(image) { - const leftTopBlack = image.getTopLeftOnBit(); - const rightBottomBlack = image.getBottomRightOnBit(); - if (leftTopBlack === null || rightBottomBlack === null) { - throw new NotFoundException(); - } - const moduleSize = this.moduleSize(leftTopBlack, image); - let top = leftTopBlack[1]; - let bottom = rightBottomBlack[1]; - let left = leftTopBlack[0]; - let right = rightBottomBlack[0]; - // Sanity check! - if (left >= right || top >= bottom) { - throw new NotFoundException(); - } - if (bottom - top !== right - left) { - // Special case, where bottom-right module wasn't black so we found something else in the last row - // Assume it's a square, so use height as the width - right = left + (bottom - top); - if (right >= image.getWidth()) { - // Abort if that would not make sense -- off image - throw new NotFoundException(); - } - } - const matrixWidth = Math.round((right - left + 1) / moduleSize); - const matrixHeight = Math.round((bottom - top + 1) / moduleSize); - if (matrixWidth <= 0 || matrixHeight <= 0) { - throw new NotFoundException(); - } - if (matrixHeight !== matrixWidth) { - // Only possibly decode square regions - throw new NotFoundException(); - } - // Push in the "border" by half the module width so that we start - // sampling in the middle of the module. Just in case the image is a - // little off, this will help recover. - const nudge = /*(int) */ Math.floor(moduleSize / 2.0); - top += nudge; - left += nudge; - // But careful that this does not sample off the edge - // "right" is the farthest-right valid pixel location -- right+1 is not necessarily - // This is positive by how much the inner x loop below would be too large - const nudgedTooFarRight = left + /*(int) */ Math.floor((matrixWidth - 1) * moduleSize) - right; - if (nudgedTooFarRight > 0) { - if (nudgedTooFarRight > nudge) { - // Neither way fits; abort - throw new NotFoundException(); - } - left -= nudgedTooFarRight; - } - // See logic above - const nudgedTooFarDown = top + /*(int) */ Math.floor((matrixHeight - 1) * moduleSize) - bottom; - if (nudgedTooFarDown > 0) { - if (nudgedTooFarDown > nudge) { - // Neither way fits; abort - throw new NotFoundException(); - } - top -= nudgedTooFarDown; - } - // Now just read off the bits - const bits = new BitMatrix(matrixWidth, matrixHeight); - for (let y = 0; y < matrixHeight; y++) { - const iOffset = top + /*(int) */ Math.floor(y * moduleSize); - for (let x = 0; x < matrixWidth; x++) { - if (image.get(left + /*(int) */ Math.floor(x * moduleSize), iOffset)) { - bits.set(x, y); - } - } - } - return bits; - } - static moduleSize(leftTopBlack, image) { - const height = image.getHeight(); - const width = image.getWidth(); - let x = leftTopBlack[0]; - let y = leftTopBlack[1]; - let inBlack = true; - let transitions = 0; - while (x < width && y < height) { - if (inBlack !== image.get(x, y)) { - if (++transitions === 5) { - break; - } - inBlack = !inBlack; - } - x++; - y++; - } - if (x === width || y === height) { - throw new NotFoundException(); - } - return (x - leftTopBlack[0]) / 7.0; - } - } - QRCodeReader.NO_POINTS = new Array(); - - /* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * @author SITA Lab (kevin.osullivan@sita.aero) - * @author Guenther Grau - */ - /*public final*/ class PDF417Common { - PDF417Common() { - } - /** - * @param moduleBitCount values to sum - * @return sum of values - * @deprecated call {@link MathUtils#sum(int[])} - */ - // @Deprecated - static getBitCountSum(moduleBitCount) { - return MathUtils.sum(moduleBitCount); - } - static toIntArray(list) { - if (list == null || !list.length) { - return PDF417Common.EMPTY_INT_ARRAY; - } - const result = new Int32Array(list.length); - let i = 0; - for (const integer of list) { - result[i++] = integer; - } - return result; - } - /** - * @param symbol encoded symbol to translate to a codeword - * @return the codeword corresponding to the symbol. - */ - static getCodeword(symbol /*int*/) { - const i = Arrays.binarySearch(PDF417Common.SYMBOL_TABLE, symbol & 0x3FFFF); - if (i < 0) { - return -1; - } - return (PDF417Common.CODEWORD_TABLE[i] - 1) % PDF417Common.NUMBER_OF_CODEWORDS; - } - } - PDF417Common.NUMBER_OF_CODEWORDS = 929; - // Maximum Codewords (Data + Error). - PDF417Common.MAX_CODEWORDS_IN_BARCODE = PDF417Common.NUMBER_OF_CODEWORDS - 1; - PDF417Common.MIN_ROWS_IN_BARCODE = 3; - PDF417Common.MAX_ROWS_IN_BARCODE = 90; - // One left row indication column + max 30 data columns + one right row indicator column - // public static /*final*/ MAX_CODEWORDS_IN_ROW: /*int*/ number = 32; - PDF417Common.MODULES_IN_CODEWORD = 17; - PDF417Common.MODULES_IN_STOP_PATTERN = 18; - PDF417Common.BARS_IN_MODULE = 8; - PDF417Common.EMPTY_INT_ARRAY = new Int32Array([]); - /** - * The sorted table of all possible symbols. Extracted from the PDF417 - * specification. The index of a symbol in this table corresponds to the - * index into the codeword table. - */ - PDF417Common.SYMBOL_TABLE = Int32Array.from([ - 0x1025e, 0x1027a, 0x1029e, 0x102bc, 0x102f2, 0x102f4, 0x1032e, 0x1034e, 0x1035c, 0x10396, 0x103a6, 0x103ac, - 0x10422, 0x10428, 0x10436, 0x10442, 0x10444, 0x10448, 0x10450, 0x1045e, 0x10466, 0x1046c, 0x1047a, 0x10482, - 0x1049e, 0x104a0, 0x104bc, 0x104c6, 0x104d8, 0x104ee, 0x104f2, 0x104f4, 0x10504, 0x10508, 0x10510, 0x1051e, - 0x10520, 0x1053c, 0x10540, 0x10578, 0x10586, 0x1058c, 0x10598, 0x105b0, 0x105be, 0x105ce, 0x105dc, 0x105e2, - 0x105e4, 0x105e8, 0x105f6, 0x1062e, 0x1064e, 0x1065c, 0x1068e, 0x1069c, 0x106b8, 0x106de, 0x106fa, 0x10716, - 0x10726, 0x1072c, 0x10746, 0x1074c, 0x10758, 0x1076e, 0x10792, 0x10794, 0x107a2, 0x107a4, 0x107a8, 0x107b6, - 0x10822, 0x10828, 0x10842, 0x10848, 0x10850, 0x1085e, 0x10866, 0x1086c, 0x1087a, 0x10882, 0x10884, 0x10890, - 0x1089e, 0x108a0, 0x108bc, 0x108c6, 0x108cc, 0x108d8, 0x108ee, 0x108f2, 0x108f4, 0x10902, 0x10908, 0x1091e, - 0x10920, 0x1093c, 0x10940, 0x10978, 0x10986, 0x10998, 0x109b0, 0x109be, 0x109ce, 0x109dc, 0x109e2, 0x109e4, - 0x109e8, 0x109f6, 0x10a08, 0x10a10, 0x10a1e, 0x10a20, 0x10a3c, 0x10a40, 0x10a78, 0x10af0, 0x10b06, 0x10b0c, - 0x10b18, 0x10b30, 0x10b3e, 0x10b60, 0x10b7c, 0x10b8e, 0x10b9c, 0x10bb8, 0x10bc2, 0x10bc4, 0x10bc8, 0x10bd0, - 0x10bde, 0x10be6, 0x10bec, 0x10c2e, 0x10c4e, 0x10c5c, 0x10c62, 0x10c64, 0x10c68, 0x10c76, 0x10c8e, 0x10c9c, - 0x10cb8, 0x10cc2, 0x10cc4, 0x10cc8, 0x10cd0, 0x10cde, 0x10ce6, 0x10cec, 0x10cfa, 0x10d0e, 0x10d1c, 0x10d38, - 0x10d70, 0x10d7e, 0x10d82, 0x10d84, 0x10d88, 0x10d90, 0x10d9e, 0x10da0, 0x10dbc, 0x10dc6, 0x10dcc, 0x10dd8, - 0x10dee, 0x10df2, 0x10df4, 0x10e16, 0x10e26, 0x10e2c, 0x10e46, 0x10e58, 0x10e6e, 0x10e86, 0x10e8c, 0x10e98, - 0x10eb0, 0x10ebe, 0x10ece, 0x10edc, 0x10f0a, 0x10f12, 0x10f14, 0x10f22, 0x10f28, 0x10f36, 0x10f42, 0x10f44, - 0x10f48, 0x10f50, 0x10f5e, 0x10f66, 0x10f6c, 0x10fb2, 0x10fb4, 0x11022, 0x11028, 0x11042, 0x11048, 0x11050, - 0x1105e, 0x1107a, 0x11082, 0x11084, 0x11090, 0x1109e, 0x110a0, 0x110bc, 0x110c6, 0x110cc, 0x110d8, 0x110ee, - 0x110f2, 0x110f4, 0x11102, 0x1111e, 0x11120, 0x1113c, 0x11140, 0x11178, 0x11186, 0x11198, 0x111b0, 0x111be, - 0x111ce, 0x111dc, 0x111e2, 0x111e4, 0x111e8, 0x111f6, 0x11208, 0x1121e, 0x11220, 0x11278, 0x112f0, 0x1130c, - 0x11330, 0x1133e, 0x11360, 0x1137c, 0x1138e, 0x1139c, 0x113b8, 0x113c2, 0x113c8, 0x113d0, 0x113de, 0x113e6, - 0x113ec, 0x11408, 0x11410, 0x1141e, 0x11420, 0x1143c, 0x11440, 0x11478, 0x114f0, 0x115e0, 0x1160c, 0x11618, - 0x11630, 0x1163e, 0x11660, 0x1167c, 0x116c0, 0x116f8, 0x1171c, 0x11738, 0x11770, 0x1177e, 0x11782, 0x11784, - 0x11788, 0x11790, 0x1179e, 0x117a0, 0x117bc, 0x117c6, 0x117cc, 0x117d8, 0x117ee, 0x1182e, 0x11834, 0x1184e, - 0x1185c, 0x11862, 0x11864, 0x11868, 0x11876, 0x1188e, 0x1189c, 0x118b8, 0x118c2, 0x118c8, 0x118d0, 0x118de, - 0x118e6, 0x118ec, 0x118fa, 0x1190e, 0x1191c, 0x11938, 0x11970, 0x1197e, 0x11982, 0x11984, 0x11990, 0x1199e, - 0x119a0, 0x119bc, 0x119c6, 0x119cc, 0x119d8, 0x119ee, 0x119f2, 0x119f4, 0x11a0e, 0x11a1c, 0x11a38, 0x11a70, - 0x11a7e, 0x11ae0, 0x11afc, 0x11b08, 0x11b10, 0x11b1e, 0x11b20, 0x11b3c, 0x11b40, 0x11b78, 0x11b8c, 0x11b98, - 0x11bb0, 0x11bbe, 0x11bce, 0x11bdc, 0x11be2, 0x11be4, 0x11be8, 0x11bf6, 0x11c16, 0x11c26, 0x11c2c, 0x11c46, - 0x11c4c, 0x11c58, 0x11c6e, 0x11c86, 0x11c98, 0x11cb0, 0x11cbe, 0x11cce, 0x11cdc, 0x11ce2, 0x11ce4, 0x11ce8, - 0x11cf6, 0x11d06, 0x11d0c, 0x11d18, 0x11d30, 0x11d3e, 0x11d60, 0x11d7c, 0x11d8e, 0x11d9c, 0x11db8, 0x11dc4, - 0x11dc8, 0x11dd0, 0x11dde, 0x11de6, 0x11dec, 0x11dfa, 0x11e0a, 0x11e12, 0x11e14, 0x11e22, 0x11e24, 0x11e28, - 0x11e36, 0x11e42, 0x11e44, 0x11e50, 0x11e5e, 0x11e66, 0x11e6c, 0x11e82, 0x11e84, 0x11e88, 0x11e90, 0x11e9e, - 0x11ea0, 0x11ebc, 0x11ec6, 0x11ecc, 0x11ed8, 0x11eee, 0x11f1a, 0x11f2e, 0x11f32, 0x11f34, 0x11f4e, 0x11f5c, - 0x11f62, 0x11f64, 0x11f68, 0x11f76, 0x12048, 0x1205e, 0x12082, 0x12084, 0x12090, 0x1209e, 0x120a0, 0x120bc, - 0x120d8, 0x120f2, 0x120f4, 0x12108, 0x1211e, 0x12120, 0x1213c, 0x12140, 0x12178, 0x12186, 0x12198, 0x121b0, - 0x121be, 0x121e2, 0x121e4, 0x121e8, 0x121f6, 0x12204, 0x12210, 0x1221e, 0x12220, 0x12278, 0x122f0, 0x12306, - 0x1230c, 0x12330, 0x1233e, 0x12360, 0x1237c, 0x1238e, 0x1239c, 0x123b8, 0x123c2, 0x123c8, 0x123d0, 0x123e6, - 0x123ec, 0x1241e, 0x12420, 0x1243c, 0x124f0, 0x125e0, 0x12618, 0x1263e, 0x12660, 0x1267c, 0x126c0, 0x126f8, - 0x12738, 0x12770, 0x1277e, 0x12782, 0x12784, 0x12790, 0x1279e, 0x127a0, 0x127bc, 0x127c6, 0x127cc, 0x127d8, - 0x127ee, 0x12820, 0x1283c, 0x12840, 0x12878, 0x128f0, 0x129e0, 0x12bc0, 0x12c18, 0x12c30, 0x12c3e, 0x12c60, - 0x12c7c, 0x12cc0, 0x12cf8, 0x12df0, 0x12e1c, 0x12e38, 0x12e70, 0x12e7e, 0x12ee0, 0x12efc, 0x12f04, 0x12f08, - 0x12f10, 0x12f20, 0x12f3c, 0x12f40, 0x12f78, 0x12f86, 0x12f8c, 0x12f98, 0x12fb0, 0x12fbe, 0x12fce, 0x12fdc, - 0x1302e, 0x1304e, 0x1305c, 0x13062, 0x13068, 0x1308e, 0x1309c, 0x130b8, 0x130c2, 0x130c8, 0x130d0, 0x130de, - 0x130ec, 0x130fa, 0x1310e, 0x13138, 0x13170, 0x1317e, 0x13182, 0x13184, 0x13190, 0x1319e, 0x131a0, 0x131bc, - 0x131c6, 0x131cc, 0x131d8, 0x131f2, 0x131f4, 0x1320e, 0x1321c, 0x13270, 0x1327e, 0x132e0, 0x132fc, 0x13308, - 0x1331e, 0x13320, 0x1333c, 0x13340, 0x13378, 0x13386, 0x13398, 0x133b0, 0x133be, 0x133ce, 0x133dc, 0x133e2, - 0x133e4, 0x133e8, 0x133f6, 0x1340e, 0x1341c, 0x13438, 0x13470, 0x1347e, 0x134e0, 0x134fc, 0x135c0, 0x135f8, - 0x13608, 0x13610, 0x1361e, 0x13620, 0x1363c, 0x13640, 0x13678, 0x136f0, 0x1370c, 0x13718, 0x13730, 0x1373e, - 0x13760, 0x1377c, 0x1379c, 0x137b8, 0x137c2, 0x137c4, 0x137c8, 0x137d0, 0x137de, 0x137e6, 0x137ec, 0x13816, - 0x13826, 0x1382c, 0x13846, 0x1384c, 0x13858, 0x1386e, 0x13874, 0x13886, 0x13898, 0x138b0, 0x138be, 0x138ce, - 0x138dc, 0x138e2, 0x138e4, 0x138e8, 0x13906, 0x1390c, 0x13930, 0x1393e, 0x13960, 0x1397c, 0x1398e, 0x1399c, - 0x139b8, 0x139c8, 0x139d0, 0x139de, 0x139e6, 0x139ec, 0x139fa, 0x13a06, 0x13a0c, 0x13a18, 0x13a30, 0x13a3e, - 0x13a60, 0x13a7c, 0x13ac0, 0x13af8, 0x13b0e, 0x13b1c, 0x13b38, 0x13b70, 0x13b7e, 0x13b88, 0x13b90, 0x13b9e, - 0x13ba0, 0x13bbc, 0x13bcc, 0x13bd8, 0x13bee, 0x13bf2, 0x13bf4, 0x13c12, 0x13c14, 0x13c22, 0x13c24, 0x13c28, - 0x13c36, 0x13c42, 0x13c48, 0x13c50, 0x13c5e, 0x13c66, 0x13c6c, 0x13c82, 0x13c84, 0x13c90, 0x13c9e, 0x13ca0, - 0x13cbc, 0x13cc6, 0x13ccc, 0x13cd8, 0x13cee, 0x13d02, 0x13d04, 0x13d08, 0x13d10, 0x13d1e, 0x13d20, 0x13d3c, - 0x13d40, 0x13d78, 0x13d86, 0x13d8c, 0x13d98, 0x13db0, 0x13dbe, 0x13dce, 0x13ddc, 0x13de4, 0x13de8, 0x13df6, - 0x13e1a, 0x13e2e, 0x13e32, 0x13e34, 0x13e4e, 0x13e5c, 0x13e62, 0x13e64, 0x13e68, 0x13e76, 0x13e8e, 0x13e9c, - 0x13eb8, 0x13ec2, 0x13ec4, 0x13ec8, 0x13ed0, 0x13ede, 0x13ee6, 0x13eec, 0x13f26, 0x13f2c, 0x13f3a, 0x13f46, - 0x13f4c, 0x13f58, 0x13f6e, 0x13f72, 0x13f74, 0x14082, 0x1409e, 0x140a0, 0x140bc, 0x14104, 0x14108, 0x14110, - 0x1411e, 0x14120, 0x1413c, 0x14140, 0x14178, 0x1418c, 0x14198, 0x141b0, 0x141be, 0x141e2, 0x141e4, 0x141e8, - 0x14208, 0x14210, 0x1421e, 0x14220, 0x1423c, 0x14240, 0x14278, 0x142f0, 0x14306, 0x1430c, 0x14318, 0x14330, - 0x1433e, 0x14360, 0x1437c, 0x1438e, 0x143c2, 0x143c4, 0x143c8, 0x143d0, 0x143e6, 0x143ec, 0x14408, 0x14410, - 0x1441e, 0x14420, 0x1443c, 0x14440, 0x14478, 0x144f0, 0x145e0, 0x1460c, 0x14618, 0x14630, 0x1463e, 0x14660, - 0x1467c, 0x146c0, 0x146f8, 0x1471c, 0x14738, 0x14770, 0x1477e, 0x14782, 0x14784, 0x14788, 0x14790, 0x147a0, - 0x147bc, 0x147c6, 0x147cc, 0x147d8, 0x147ee, 0x14810, 0x14820, 0x1483c, 0x14840, 0x14878, 0x148f0, 0x149e0, - 0x14bc0, 0x14c30, 0x14c3e, 0x14c60, 0x14c7c, 0x14cc0, 0x14cf8, 0x14df0, 0x14e38, 0x14e70, 0x14e7e, 0x14ee0, - 0x14efc, 0x14f04, 0x14f08, 0x14f10, 0x14f1e, 0x14f20, 0x14f3c, 0x14f40, 0x14f78, 0x14f86, 0x14f8c, 0x14f98, - 0x14fb0, 0x14fce, 0x14fdc, 0x15020, 0x15040, 0x15078, 0x150f0, 0x151e0, 0x153c0, 0x15860, 0x1587c, 0x158c0, - 0x158f8, 0x159f0, 0x15be0, 0x15c70, 0x15c7e, 0x15ce0, 0x15cfc, 0x15dc0, 0x15df8, 0x15e08, 0x15e10, 0x15e20, - 0x15e40, 0x15e78, 0x15ef0, 0x15f0c, 0x15f18, 0x15f30, 0x15f60, 0x15f7c, 0x15f8e, 0x15f9c, 0x15fb8, 0x1604e, - 0x1605c, 0x1608e, 0x1609c, 0x160b8, 0x160c2, 0x160c4, 0x160c8, 0x160de, 0x1610e, 0x1611c, 0x16138, 0x16170, - 0x1617e, 0x16184, 0x16188, 0x16190, 0x1619e, 0x161a0, 0x161bc, 0x161c6, 0x161cc, 0x161d8, 0x161f2, 0x161f4, - 0x1620e, 0x1621c, 0x16238, 0x16270, 0x1627e, 0x162e0, 0x162fc, 0x16304, 0x16308, 0x16310, 0x1631e, 0x16320, - 0x1633c, 0x16340, 0x16378, 0x16386, 0x1638c, 0x16398, 0x163b0, 0x163be, 0x163ce, 0x163dc, 0x163e2, 0x163e4, - 0x163e8, 0x163f6, 0x1640e, 0x1641c, 0x16438, 0x16470, 0x1647e, 0x164e0, 0x164fc, 0x165c0, 0x165f8, 0x16610, - 0x1661e, 0x16620, 0x1663c, 0x16640, 0x16678, 0x166f0, 0x16718, 0x16730, 0x1673e, 0x16760, 0x1677c, 0x1678e, - 0x1679c, 0x167b8, 0x167c2, 0x167c4, 0x167c8, 0x167d0, 0x167de, 0x167e6, 0x167ec, 0x1681c, 0x16838, 0x16870, - 0x168e0, 0x168fc, 0x169c0, 0x169f8, 0x16bf0, 0x16c10, 0x16c1e, 0x16c20, 0x16c3c, 0x16c40, 0x16c78, 0x16cf0, - 0x16de0, 0x16e18, 0x16e30, 0x16e3e, 0x16e60, 0x16e7c, 0x16ec0, 0x16ef8, 0x16f1c, 0x16f38, 0x16f70, 0x16f7e, - 0x16f84, 0x16f88, 0x16f90, 0x16f9e, 0x16fa0, 0x16fbc, 0x16fc6, 0x16fcc, 0x16fd8, 0x17026, 0x1702c, 0x17046, - 0x1704c, 0x17058, 0x1706e, 0x17086, 0x1708c, 0x17098, 0x170b0, 0x170be, 0x170ce, 0x170dc, 0x170e8, 0x17106, - 0x1710c, 0x17118, 0x17130, 0x1713e, 0x17160, 0x1717c, 0x1718e, 0x1719c, 0x171b8, 0x171c2, 0x171c4, 0x171c8, - 0x171d0, 0x171de, 0x171e6, 0x171ec, 0x171fa, 0x17206, 0x1720c, 0x17218, 0x17230, 0x1723e, 0x17260, 0x1727c, - 0x172c0, 0x172f8, 0x1730e, 0x1731c, 0x17338, 0x17370, 0x1737e, 0x17388, 0x17390, 0x1739e, 0x173a0, 0x173bc, - 0x173cc, 0x173d8, 0x173ee, 0x173f2, 0x173f4, 0x1740c, 0x17418, 0x17430, 0x1743e, 0x17460, 0x1747c, 0x174c0, - 0x174f8, 0x175f0, 0x1760e, 0x1761c, 0x17638, 0x17670, 0x1767e, 0x176e0, 0x176fc, 0x17708, 0x17710, 0x1771e, - 0x17720, 0x1773c, 0x17740, 0x17778, 0x17798, 0x177b0, 0x177be, 0x177dc, 0x177e2, 0x177e4, 0x177e8, 0x17822, - 0x17824, 0x17828, 0x17836, 0x17842, 0x17844, 0x17848, 0x17850, 0x1785e, 0x17866, 0x1786c, 0x17882, 0x17884, - 0x17888, 0x17890, 0x1789e, 0x178a0, 0x178bc, 0x178c6, 0x178cc, 0x178d8, 0x178ee, 0x178f2, 0x178f4, 0x17902, - 0x17904, 0x17908, 0x17910, 0x1791e, 0x17920, 0x1793c, 0x17940, 0x17978, 0x17986, 0x1798c, 0x17998, 0x179b0, - 0x179be, 0x179ce, 0x179dc, 0x179e2, 0x179e4, 0x179e8, 0x179f6, 0x17a04, 0x17a08, 0x17a10, 0x17a1e, 0x17a20, - 0x17a3c, 0x17a40, 0x17a78, 0x17af0, 0x17b06, 0x17b0c, 0x17b18, 0x17b30, 0x17b3e, 0x17b60, 0x17b7c, 0x17b8e, - 0x17b9c, 0x17bb8, 0x17bc4, 0x17bc8, 0x17bd0, 0x17bde, 0x17be6, 0x17bec, 0x17c2e, 0x17c32, 0x17c34, 0x17c4e, - 0x17c5c, 0x17c62, 0x17c64, 0x17c68, 0x17c76, 0x17c8e, 0x17c9c, 0x17cb8, 0x17cc2, 0x17cc4, 0x17cc8, 0x17cd0, - 0x17cde, 0x17ce6, 0x17cec, 0x17d0e, 0x17d1c, 0x17d38, 0x17d70, 0x17d82, 0x17d84, 0x17d88, 0x17d90, 0x17d9e, - 0x17da0, 0x17dbc, 0x17dc6, 0x17dcc, 0x17dd8, 0x17dee, 0x17e26, 0x17e2c, 0x17e3a, 0x17e46, 0x17e4c, 0x17e58, - 0x17e6e, 0x17e72, 0x17e74, 0x17e86, 0x17e8c, 0x17e98, 0x17eb0, 0x17ece, 0x17edc, 0x17ee2, 0x17ee4, 0x17ee8, - 0x17ef6, 0x1813a, 0x18172, 0x18174, 0x18216, 0x18226, 0x1823a, 0x1824c, 0x18258, 0x1826e, 0x18272, 0x18274, - 0x18298, 0x182be, 0x182e2, 0x182e4, 0x182e8, 0x182f6, 0x1835e, 0x1837a, 0x183ae, 0x183d6, 0x18416, 0x18426, - 0x1842c, 0x1843a, 0x18446, 0x18458, 0x1846e, 0x18472, 0x18474, 0x18486, 0x184b0, 0x184be, 0x184ce, 0x184dc, - 0x184e2, 0x184e4, 0x184e8, 0x184f6, 0x18506, 0x1850c, 0x18518, 0x18530, 0x1853e, 0x18560, 0x1857c, 0x1858e, - 0x1859c, 0x185b8, 0x185c2, 0x185c4, 0x185c8, 0x185d0, 0x185de, 0x185e6, 0x185ec, 0x185fa, 0x18612, 0x18614, - 0x18622, 0x18628, 0x18636, 0x18642, 0x18650, 0x1865e, 0x1867a, 0x18682, 0x18684, 0x18688, 0x18690, 0x1869e, - 0x186a0, 0x186bc, 0x186c6, 0x186cc, 0x186d8, 0x186ee, 0x186f2, 0x186f4, 0x1872e, 0x1874e, 0x1875c, 0x18796, - 0x187a6, 0x187ac, 0x187d2, 0x187d4, 0x18826, 0x1882c, 0x1883a, 0x18846, 0x1884c, 0x18858, 0x1886e, 0x18872, - 0x18874, 0x18886, 0x18898, 0x188b0, 0x188be, 0x188ce, 0x188dc, 0x188e2, 0x188e4, 0x188e8, 0x188f6, 0x1890c, - 0x18930, 0x1893e, 0x18960, 0x1897c, 0x1898e, 0x189b8, 0x189c2, 0x189c8, 0x189d0, 0x189de, 0x189e6, 0x189ec, - 0x189fa, 0x18a18, 0x18a30, 0x18a3e, 0x18a60, 0x18a7c, 0x18ac0, 0x18af8, 0x18b1c, 0x18b38, 0x18b70, 0x18b7e, - 0x18b82, 0x18b84, 0x18b88, 0x18b90, 0x18b9e, 0x18ba0, 0x18bbc, 0x18bc6, 0x18bcc, 0x18bd8, 0x18bee, 0x18bf2, - 0x18bf4, 0x18c22, 0x18c24, 0x18c28, 0x18c36, 0x18c42, 0x18c48, 0x18c50, 0x18c5e, 0x18c66, 0x18c7a, 0x18c82, - 0x18c84, 0x18c90, 0x18c9e, 0x18ca0, 0x18cbc, 0x18ccc, 0x18cf2, 0x18cf4, 0x18d04, 0x18d08, 0x18d10, 0x18d1e, - 0x18d20, 0x18d3c, 0x18d40, 0x18d78, 0x18d86, 0x18d98, 0x18dce, 0x18de2, 0x18de4, 0x18de8, 0x18e2e, 0x18e32, - 0x18e34, 0x18e4e, 0x18e5c, 0x18e62, 0x18e64, 0x18e68, 0x18e8e, 0x18e9c, 0x18eb8, 0x18ec2, 0x18ec4, 0x18ec8, - 0x18ed0, 0x18efa, 0x18f16, 0x18f26, 0x18f2c, 0x18f46, 0x18f4c, 0x18f58, 0x18f6e, 0x18f8a, 0x18f92, 0x18f94, - 0x18fa2, 0x18fa4, 0x18fa8, 0x18fb6, 0x1902c, 0x1903a, 0x19046, 0x1904c, 0x19058, 0x19072, 0x19074, 0x19086, - 0x19098, 0x190b0, 0x190be, 0x190ce, 0x190dc, 0x190e2, 0x190e8, 0x190f6, 0x19106, 0x1910c, 0x19130, 0x1913e, - 0x19160, 0x1917c, 0x1918e, 0x1919c, 0x191b8, 0x191c2, 0x191c8, 0x191d0, 0x191de, 0x191e6, 0x191ec, 0x191fa, - 0x19218, 0x1923e, 0x19260, 0x1927c, 0x192c0, 0x192f8, 0x19338, 0x19370, 0x1937e, 0x19382, 0x19384, 0x19390, - 0x1939e, 0x193a0, 0x193bc, 0x193c6, 0x193cc, 0x193d8, 0x193ee, 0x193f2, 0x193f4, 0x19430, 0x1943e, 0x19460, - 0x1947c, 0x194c0, 0x194f8, 0x195f0, 0x19638, 0x19670, 0x1967e, 0x196e0, 0x196fc, 0x19702, 0x19704, 0x19708, - 0x19710, 0x19720, 0x1973c, 0x19740, 0x19778, 0x19786, 0x1978c, 0x19798, 0x197b0, 0x197be, 0x197ce, 0x197dc, - 0x197e2, 0x197e4, 0x197e8, 0x19822, 0x19824, 0x19842, 0x19848, 0x19850, 0x1985e, 0x19866, 0x1987a, 0x19882, - 0x19884, 0x19890, 0x1989e, 0x198a0, 0x198bc, 0x198cc, 0x198f2, 0x198f4, 0x19902, 0x19908, 0x1991e, 0x19920, - 0x1993c, 0x19940, 0x19978, 0x19986, 0x19998, 0x199ce, 0x199e2, 0x199e4, 0x199e8, 0x19a08, 0x19a10, 0x19a1e, - 0x19a20, 0x19a3c, 0x19a40, 0x19a78, 0x19af0, 0x19b18, 0x19b3e, 0x19b60, 0x19b9c, 0x19bc2, 0x19bc4, 0x19bc8, - 0x19bd0, 0x19be6, 0x19c2e, 0x19c34, 0x19c4e, 0x19c5c, 0x19c62, 0x19c64, 0x19c68, 0x19c8e, 0x19c9c, 0x19cb8, - 0x19cc2, 0x19cc8, 0x19cd0, 0x19ce6, 0x19cfa, 0x19d0e, 0x19d1c, 0x19d38, 0x19d70, 0x19d7e, 0x19d82, 0x19d84, - 0x19d88, 0x19d90, 0x19da0, 0x19dcc, 0x19df2, 0x19df4, 0x19e16, 0x19e26, 0x19e2c, 0x19e46, 0x19e4c, 0x19e58, - 0x19e74, 0x19e86, 0x19e8c, 0x19e98, 0x19eb0, 0x19ebe, 0x19ece, 0x19ee2, 0x19ee4, 0x19ee8, 0x19f0a, 0x19f12, - 0x19f14, 0x19f22, 0x19f24, 0x19f28, 0x19f42, 0x19f44, 0x19f48, 0x19f50, 0x19f5e, 0x19f6c, 0x19f9a, 0x19fae, - 0x19fb2, 0x19fb4, 0x1a046, 0x1a04c, 0x1a072, 0x1a074, 0x1a086, 0x1a08c, 0x1a098, 0x1a0b0, 0x1a0be, 0x1a0e2, - 0x1a0e4, 0x1a0e8, 0x1a0f6, 0x1a106, 0x1a10c, 0x1a118, 0x1a130, 0x1a13e, 0x1a160, 0x1a17c, 0x1a18e, 0x1a19c, - 0x1a1b8, 0x1a1c2, 0x1a1c4, 0x1a1c8, 0x1a1d0, 0x1a1de, 0x1a1e6, 0x1a1ec, 0x1a218, 0x1a230, 0x1a23e, 0x1a260, - 0x1a27c, 0x1a2c0, 0x1a2f8, 0x1a31c, 0x1a338, 0x1a370, 0x1a37e, 0x1a382, 0x1a384, 0x1a388, 0x1a390, 0x1a39e, - 0x1a3a0, 0x1a3bc, 0x1a3c6, 0x1a3cc, 0x1a3d8, 0x1a3ee, 0x1a3f2, 0x1a3f4, 0x1a418, 0x1a430, 0x1a43e, 0x1a460, - 0x1a47c, 0x1a4c0, 0x1a4f8, 0x1a5f0, 0x1a61c, 0x1a638, 0x1a670, 0x1a67e, 0x1a6e0, 0x1a6fc, 0x1a702, 0x1a704, - 0x1a708, 0x1a710, 0x1a71e, 0x1a720, 0x1a73c, 0x1a740, 0x1a778, 0x1a786, 0x1a78c, 0x1a798, 0x1a7b0, 0x1a7be, - 0x1a7ce, 0x1a7dc, 0x1a7e2, 0x1a7e4, 0x1a7e8, 0x1a830, 0x1a860, 0x1a87c, 0x1a8c0, 0x1a8f8, 0x1a9f0, 0x1abe0, - 0x1ac70, 0x1ac7e, 0x1ace0, 0x1acfc, 0x1adc0, 0x1adf8, 0x1ae04, 0x1ae08, 0x1ae10, 0x1ae20, 0x1ae3c, 0x1ae40, - 0x1ae78, 0x1aef0, 0x1af06, 0x1af0c, 0x1af18, 0x1af30, 0x1af3e, 0x1af60, 0x1af7c, 0x1af8e, 0x1af9c, 0x1afb8, - 0x1afc4, 0x1afc8, 0x1afd0, 0x1afde, 0x1b042, 0x1b05e, 0x1b07a, 0x1b082, 0x1b084, 0x1b088, 0x1b090, 0x1b09e, - 0x1b0a0, 0x1b0bc, 0x1b0cc, 0x1b0f2, 0x1b0f4, 0x1b102, 0x1b104, 0x1b108, 0x1b110, 0x1b11e, 0x1b120, 0x1b13c, - 0x1b140, 0x1b178, 0x1b186, 0x1b198, 0x1b1ce, 0x1b1e2, 0x1b1e4, 0x1b1e8, 0x1b204, 0x1b208, 0x1b210, 0x1b21e, - 0x1b220, 0x1b23c, 0x1b240, 0x1b278, 0x1b2f0, 0x1b30c, 0x1b33e, 0x1b360, 0x1b39c, 0x1b3c2, 0x1b3c4, 0x1b3c8, - 0x1b3d0, 0x1b3e6, 0x1b410, 0x1b41e, 0x1b420, 0x1b43c, 0x1b440, 0x1b478, 0x1b4f0, 0x1b5e0, 0x1b618, 0x1b660, - 0x1b67c, 0x1b6c0, 0x1b738, 0x1b782, 0x1b784, 0x1b788, 0x1b790, 0x1b79e, 0x1b7a0, 0x1b7cc, 0x1b82e, 0x1b84e, - 0x1b85c, 0x1b88e, 0x1b89c, 0x1b8b8, 0x1b8c2, 0x1b8c4, 0x1b8c8, 0x1b8d0, 0x1b8e6, 0x1b8fa, 0x1b90e, 0x1b91c, - 0x1b938, 0x1b970, 0x1b97e, 0x1b982, 0x1b984, 0x1b988, 0x1b990, 0x1b99e, 0x1b9a0, 0x1b9cc, 0x1b9f2, 0x1b9f4, - 0x1ba0e, 0x1ba1c, 0x1ba38, 0x1ba70, 0x1ba7e, 0x1bae0, 0x1bafc, 0x1bb08, 0x1bb10, 0x1bb20, 0x1bb3c, 0x1bb40, - 0x1bb98, 0x1bbce, 0x1bbe2, 0x1bbe4, 0x1bbe8, 0x1bc16, 0x1bc26, 0x1bc2c, 0x1bc46, 0x1bc4c, 0x1bc58, 0x1bc72, - 0x1bc74, 0x1bc86, 0x1bc8c, 0x1bc98, 0x1bcb0, 0x1bcbe, 0x1bcce, 0x1bce2, 0x1bce4, 0x1bce8, 0x1bd06, 0x1bd0c, - 0x1bd18, 0x1bd30, 0x1bd3e, 0x1bd60, 0x1bd7c, 0x1bd9c, 0x1bdc2, 0x1bdc4, 0x1bdc8, 0x1bdd0, 0x1bde6, 0x1bdfa, - 0x1be12, 0x1be14, 0x1be22, 0x1be24, 0x1be28, 0x1be42, 0x1be44, 0x1be48, 0x1be50, 0x1be5e, 0x1be66, 0x1be82, - 0x1be84, 0x1be88, 0x1be90, 0x1be9e, 0x1bea0, 0x1bebc, 0x1becc, 0x1bef4, 0x1bf1a, 0x1bf2e, 0x1bf32, 0x1bf34, - 0x1bf4e, 0x1bf5c, 0x1bf62, 0x1bf64, 0x1bf68, 0x1c09a, 0x1c0b2, 0x1c0b4, 0x1c11a, 0x1c132, 0x1c134, 0x1c162, - 0x1c164, 0x1c168, 0x1c176, 0x1c1ba, 0x1c21a, 0x1c232, 0x1c234, 0x1c24e, 0x1c25c, 0x1c262, 0x1c264, 0x1c268, - 0x1c276, 0x1c28e, 0x1c2c2, 0x1c2c4, 0x1c2c8, 0x1c2d0, 0x1c2de, 0x1c2e6, 0x1c2ec, 0x1c2fa, 0x1c316, 0x1c326, - 0x1c33a, 0x1c346, 0x1c34c, 0x1c372, 0x1c374, 0x1c41a, 0x1c42e, 0x1c432, 0x1c434, 0x1c44e, 0x1c45c, 0x1c462, - 0x1c464, 0x1c468, 0x1c476, 0x1c48e, 0x1c49c, 0x1c4b8, 0x1c4c2, 0x1c4c8, 0x1c4d0, 0x1c4de, 0x1c4e6, 0x1c4ec, - 0x1c4fa, 0x1c51c, 0x1c538, 0x1c570, 0x1c57e, 0x1c582, 0x1c584, 0x1c588, 0x1c590, 0x1c59e, 0x1c5a0, 0x1c5bc, - 0x1c5c6, 0x1c5cc, 0x1c5d8, 0x1c5ee, 0x1c5f2, 0x1c5f4, 0x1c616, 0x1c626, 0x1c62c, 0x1c63a, 0x1c646, 0x1c64c, - 0x1c658, 0x1c66e, 0x1c672, 0x1c674, 0x1c686, 0x1c68c, 0x1c698, 0x1c6b0, 0x1c6be, 0x1c6ce, 0x1c6dc, 0x1c6e2, - 0x1c6e4, 0x1c6e8, 0x1c712, 0x1c714, 0x1c722, 0x1c728, 0x1c736, 0x1c742, 0x1c744, 0x1c748, 0x1c750, 0x1c75e, - 0x1c766, 0x1c76c, 0x1c77a, 0x1c7ae, 0x1c7d6, 0x1c7ea, 0x1c81a, 0x1c82e, 0x1c832, 0x1c834, 0x1c84e, 0x1c85c, - 0x1c862, 0x1c864, 0x1c868, 0x1c876, 0x1c88e, 0x1c89c, 0x1c8b8, 0x1c8c2, 0x1c8c8, 0x1c8d0, 0x1c8de, 0x1c8e6, - 0x1c8ec, 0x1c8fa, 0x1c90e, 0x1c938, 0x1c970, 0x1c97e, 0x1c982, 0x1c984, 0x1c990, 0x1c99e, 0x1c9a0, 0x1c9bc, - 0x1c9c6, 0x1c9cc, 0x1c9d8, 0x1c9ee, 0x1c9f2, 0x1c9f4, 0x1ca38, 0x1ca70, 0x1ca7e, 0x1cae0, 0x1cafc, 0x1cb02, - 0x1cb04, 0x1cb08, 0x1cb10, 0x1cb20, 0x1cb3c, 0x1cb40, 0x1cb78, 0x1cb86, 0x1cb8c, 0x1cb98, 0x1cbb0, 0x1cbbe, - 0x1cbce, 0x1cbdc, 0x1cbe2, 0x1cbe4, 0x1cbe8, 0x1cbf6, 0x1cc16, 0x1cc26, 0x1cc2c, 0x1cc3a, 0x1cc46, 0x1cc58, - 0x1cc72, 0x1cc74, 0x1cc86, 0x1ccb0, 0x1ccbe, 0x1ccce, 0x1cce2, 0x1cce4, 0x1cce8, 0x1cd06, 0x1cd0c, 0x1cd18, - 0x1cd30, 0x1cd3e, 0x1cd60, 0x1cd7c, 0x1cd9c, 0x1cdc2, 0x1cdc4, 0x1cdc8, 0x1cdd0, 0x1cdde, 0x1cde6, 0x1cdfa, - 0x1ce22, 0x1ce28, 0x1ce42, 0x1ce50, 0x1ce5e, 0x1ce66, 0x1ce7a, 0x1ce82, 0x1ce84, 0x1ce88, 0x1ce90, 0x1ce9e, - 0x1cea0, 0x1cebc, 0x1cecc, 0x1cef2, 0x1cef4, 0x1cf2e, 0x1cf32, 0x1cf34, 0x1cf4e, 0x1cf5c, 0x1cf62, 0x1cf64, - 0x1cf68, 0x1cf96, 0x1cfa6, 0x1cfac, 0x1cfca, 0x1cfd2, 0x1cfd4, 0x1d02e, 0x1d032, 0x1d034, 0x1d04e, 0x1d05c, - 0x1d062, 0x1d064, 0x1d068, 0x1d076, 0x1d08e, 0x1d09c, 0x1d0b8, 0x1d0c2, 0x1d0c4, 0x1d0c8, 0x1d0d0, 0x1d0de, - 0x1d0e6, 0x1d0ec, 0x1d0fa, 0x1d11c, 0x1d138, 0x1d170, 0x1d17e, 0x1d182, 0x1d184, 0x1d188, 0x1d190, 0x1d19e, - 0x1d1a0, 0x1d1bc, 0x1d1c6, 0x1d1cc, 0x1d1d8, 0x1d1ee, 0x1d1f2, 0x1d1f4, 0x1d21c, 0x1d238, 0x1d270, 0x1d27e, - 0x1d2e0, 0x1d2fc, 0x1d302, 0x1d304, 0x1d308, 0x1d310, 0x1d31e, 0x1d320, 0x1d33c, 0x1d340, 0x1d378, 0x1d386, - 0x1d38c, 0x1d398, 0x1d3b0, 0x1d3be, 0x1d3ce, 0x1d3dc, 0x1d3e2, 0x1d3e4, 0x1d3e8, 0x1d3f6, 0x1d470, 0x1d47e, - 0x1d4e0, 0x1d4fc, 0x1d5c0, 0x1d5f8, 0x1d604, 0x1d608, 0x1d610, 0x1d620, 0x1d640, 0x1d678, 0x1d6f0, 0x1d706, - 0x1d70c, 0x1d718, 0x1d730, 0x1d73e, 0x1d760, 0x1d77c, 0x1d78e, 0x1d79c, 0x1d7b8, 0x1d7c2, 0x1d7c4, 0x1d7c8, - 0x1d7d0, 0x1d7de, 0x1d7e6, 0x1d7ec, 0x1d826, 0x1d82c, 0x1d83a, 0x1d846, 0x1d84c, 0x1d858, 0x1d872, 0x1d874, - 0x1d886, 0x1d88c, 0x1d898, 0x1d8b0, 0x1d8be, 0x1d8ce, 0x1d8e2, 0x1d8e4, 0x1d8e8, 0x1d8f6, 0x1d90c, 0x1d918, - 0x1d930, 0x1d93e, 0x1d960, 0x1d97c, 0x1d99c, 0x1d9c2, 0x1d9c4, 0x1d9c8, 0x1d9d0, 0x1d9e6, 0x1d9fa, 0x1da0c, - 0x1da18, 0x1da30, 0x1da3e, 0x1da60, 0x1da7c, 0x1dac0, 0x1daf8, 0x1db38, 0x1db82, 0x1db84, 0x1db88, 0x1db90, - 0x1db9e, 0x1dba0, 0x1dbcc, 0x1dbf2, 0x1dbf4, 0x1dc22, 0x1dc42, 0x1dc44, 0x1dc48, 0x1dc50, 0x1dc5e, 0x1dc66, - 0x1dc7a, 0x1dc82, 0x1dc84, 0x1dc88, 0x1dc90, 0x1dc9e, 0x1dca0, 0x1dcbc, 0x1dccc, 0x1dcf2, 0x1dcf4, 0x1dd04, - 0x1dd08, 0x1dd10, 0x1dd1e, 0x1dd20, 0x1dd3c, 0x1dd40, 0x1dd78, 0x1dd86, 0x1dd98, 0x1ddce, 0x1dde2, 0x1dde4, - 0x1dde8, 0x1de2e, 0x1de32, 0x1de34, 0x1de4e, 0x1de5c, 0x1de62, 0x1de64, 0x1de68, 0x1de8e, 0x1de9c, 0x1deb8, - 0x1dec2, 0x1dec4, 0x1dec8, 0x1ded0, 0x1dee6, 0x1defa, 0x1df16, 0x1df26, 0x1df2c, 0x1df46, 0x1df4c, 0x1df58, - 0x1df72, 0x1df74, 0x1df8a, 0x1df92, 0x1df94, 0x1dfa2, 0x1dfa4, 0x1dfa8, 0x1e08a, 0x1e092, 0x1e094, 0x1e0a2, - 0x1e0a4, 0x1e0a8, 0x1e0b6, 0x1e0da, 0x1e10a, 0x1e112, 0x1e114, 0x1e122, 0x1e124, 0x1e128, 0x1e136, 0x1e142, - 0x1e144, 0x1e148, 0x1e150, 0x1e166, 0x1e16c, 0x1e17a, 0x1e19a, 0x1e1b2, 0x1e1b4, 0x1e20a, 0x1e212, 0x1e214, - 0x1e222, 0x1e224, 0x1e228, 0x1e236, 0x1e242, 0x1e248, 0x1e250, 0x1e25e, 0x1e266, 0x1e26c, 0x1e27a, 0x1e282, - 0x1e284, 0x1e288, 0x1e290, 0x1e2a0, 0x1e2bc, 0x1e2c6, 0x1e2cc, 0x1e2d8, 0x1e2ee, 0x1e2f2, 0x1e2f4, 0x1e31a, - 0x1e332, 0x1e334, 0x1e35c, 0x1e362, 0x1e364, 0x1e368, 0x1e3ba, 0x1e40a, 0x1e412, 0x1e414, 0x1e422, 0x1e428, - 0x1e436, 0x1e442, 0x1e448, 0x1e450, 0x1e45e, 0x1e466, 0x1e46c, 0x1e47a, 0x1e482, 0x1e484, 0x1e490, 0x1e49e, - 0x1e4a0, 0x1e4bc, 0x1e4c6, 0x1e4cc, 0x1e4d8, 0x1e4ee, 0x1e4f2, 0x1e4f4, 0x1e502, 0x1e504, 0x1e508, 0x1e510, - 0x1e51e, 0x1e520, 0x1e53c, 0x1e540, 0x1e578, 0x1e586, 0x1e58c, 0x1e598, 0x1e5b0, 0x1e5be, 0x1e5ce, 0x1e5dc, - 0x1e5e2, 0x1e5e4, 0x1e5e8, 0x1e5f6, 0x1e61a, 0x1e62e, 0x1e632, 0x1e634, 0x1e64e, 0x1e65c, 0x1e662, 0x1e668, - 0x1e68e, 0x1e69c, 0x1e6b8, 0x1e6c2, 0x1e6c4, 0x1e6c8, 0x1e6d0, 0x1e6e6, 0x1e6fa, 0x1e716, 0x1e726, 0x1e72c, - 0x1e73a, 0x1e746, 0x1e74c, 0x1e758, 0x1e772, 0x1e774, 0x1e792, 0x1e794, 0x1e7a2, 0x1e7a4, 0x1e7a8, 0x1e7b6, - 0x1e812, 0x1e814, 0x1e822, 0x1e824, 0x1e828, 0x1e836, 0x1e842, 0x1e844, 0x1e848, 0x1e850, 0x1e85e, 0x1e866, - 0x1e86c, 0x1e87a, 0x1e882, 0x1e884, 0x1e888, 0x1e890, 0x1e89e, 0x1e8a0, 0x1e8bc, 0x1e8c6, 0x1e8cc, 0x1e8d8, - 0x1e8ee, 0x1e8f2, 0x1e8f4, 0x1e902, 0x1e904, 0x1e908, 0x1e910, 0x1e920, 0x1e93c, 0x1e940, 0x1e978, 0x1e986, - 0x1e98c, 0x1e998, 0x1e9b0, 0x1e9be, 0x1e9ce, 0x1e9dc, 0x1e9e2, 0x1e9e4, 0x1e9e8, 0x1e9f6, 0x1ea04, 0x1ea08, - 0x1ea10, 0x1ea20, 0x1ea40, 0x1ea78, 0x1eaf0, 0x1eb06, 0x1eb0c, 0x1eb18, 0x1eb30, 0x1eb3e, 0x1eb60, 0x1eb7c, - 0x1eb8e, 0x1eb9c, 0x1ebb8, 0x1ebc2, 0x1ebc4, 0x1ebc8, 0x1ebd0, 0x1ebde, 0x1ebe6, 0x1ebec, 0x1ec1a, 0x1ec2e, - 0x1ec32, 0x1ec34, 0x1ec4e, 0x1ec5c, 0x1ec62, 0x1ec64, 0x1ec68, 0x1ec8e, 0x1ec9c, 0x1ecb8, 0x1ecc2, 0x1ecc4, - 0x1ecc8, 0x1ecd0, 0x1ece6, 0x1ecfa, 0x1ed0e, 0x1ed1c, 0x1ed38, 0x1ed70, 0x1ed7e, 0x1ed82, 0x1ed84, 0x1ed88, - 0x1ed90, 0x1ed9e, 0x1eda0, 0x1edcc, 0x1edf2, 0x1edf4, 0x1ee16, 0x1ee26, 0x1ee2c, 0x1ee3a, 0x1ee46, 0x1ee4c, - 0x1ee58, 0x1ee6e, 0x1ee72, 0x1ee74, 0x1ee86, 0x1ee8c, 0x1ee98, 0x1eeb0, 0x1eebe, 0x1eece, 0x1eedc, 0x1eee2, - 0x1eee4, 0x1eee8, 0x1ef12, 0x1ef22, 0x1ef24, 0x1ef28, 0x1ef36, 0x1ef42, 0x1ef44, 0x1ef48, 0x1ef50, 0x1ef5e, - 0x1ef66, 0x1ef6c, 0x1ef7a, 0x1efae, 0x1efb2, 0x1efb4, 0x1efd6, 0x1f096, 0x1f0a6, 0x1f0ac, 0x1f0ba, 0x1f0ca, - 0x1f0d2, 0x1f0d4, 0x1f116, 0x1f126, 0x1f12c, 0x1f13a, 0x1f146, 0x1f14c, 0x1f158, 0x1f16e, 0x1f172, 0x1f174, - 0x1f18a, 0x1f192, 0x1f194, 0x1f1a2, 0x1f1a4, 0x1f1a8, 0x1f1da, 0x1f216, 0x1f226, 0x1f22c, 0x1f23a, 0x1f246, - 0x1f258, 0x1f26e, 0x1f272, 0x1f274, 0x1f286, 0x1f28c, 0x1f298, 0x1f2b0, 0x1f2be, 0x1f2ce, 0x1f2dc, 0x1f2e2, - 0x1f2e4, 0x1f2e8, 0x1f2f6, 0x1f30a, 0x1f312, 0x1f314, 0x1f322, 0x1f328, 0x1f342, 0x1f344, 0x1f348, 0x1f350, - 0x1f35e, 0x1f366, 0x1f37a, 0x1f39a, 0x1f3ae, 0x1f3b2, 0x1f3b4, 0x1f416, 0x1f426, 0x1f42c, 0x1f43a, 0x1f446, - 0x1f44c, 0x1f458, 0x1f46e, 0x1f472, 0x1f474, 0x1f486, 0x1f48c, 0x1f498, 0x1f4b0, 0x1f4be, 0x1f4ce, 0x1f4dc, - 0x1f4e2, 0x1f4e4, 0x1f4e8, 0x1f4f6, 0x1f506, 0x1f50c, 0x1f518, 0x1f530, 0x1f53e, 0x1f560, 0x1f57c, 0x1f58e, - 0x1f59c, 0x1f5b8, 0x1f5c2, 0x1f5c4, 0x1f5c8, 0x1f5d0, 0x1f5de, 0x1f5e6, 0x1f5ec, 0x1f5fa, 0x1f60a, 0x1f612, - 0x1f614, 0x1f622, 0x1f624, 0x1f628, 0x1f636, 0x1f642, 0x1f644, 0x1f648, 0x1f650, 0x1f65e, 0x1f666, 0x1f67a, - 0x1f682, 0x1f684, 0x1f688, 0x1f690, 0x1f69e, 0x1f6a0, 0x1f6bc, 0x1f6cc, 0x1f6f2, 0x1f6f4, 0x1f71a, 0x1f72e, - 0x1f732, 0x1f734, 0x1f74e, 0x1f75c, 0x1f762, 0x1f764, 0x1f768, 0x1f776, 0x1f796, 0x1f7a6, 0x1f7ac, 0x1f7ba, - 0x1f7d2, 0x1f7d4, 0x1f89a, 0x1f8ae, 0x1f8b2, 0x1f8b4, 0x1f8d6, 0x1f8ea, 0x1f91a, 0x1f92e, 0x1f932, 0x1f934, - 0x1f94e, 0x1f95c, 0x1f962, 0x1f964, 0x1f968, 0x1f976, 0x1f996, 0x1f9a6, 0x1f9ac, 0x1f9ba, 0x1f9ca, 0x1f9d2, - 0x1f9d4, 0x1fa1a, 0x1fa2e, 0x1fa32, 0x1fa34, 0x1fa4e, 0x1fa5c, 0x1fa62, 0x1fa64, 0x1fa68, 0x1fa76, 0x1fa8e, - 0x1fa9c, 0x1fab8, 0x1fac2, 0x1fac4, 0x1fac8, 0x1fad0, 0x1fade, 0x1fae6, 0x1faec, 0x1fb16, 0x1fb26, 0x1fb2c, - 0x1fb3a, 0x1fb46, 0x1fb4c, 0x1fb58, 0x1fb6e, 0x1fb72, 0x1fb74, 0x1fb8a, 0x1fb92, 0x1fb94, 0x1fba2, 0x1fba4, - 0x1fba8, 0x1fbb6, 0x1fbda - ]); - /** - * This table contains to codewords for all symbols. - */ - PDF417Common.CODEWORD_TABLE = Int32Array.from([ - 2627, 1819, 2622, 2621, 1813, 1812, 2729, 2724, 2723, 2779, 2774, 2773, 902, 896, 908, 868, 865, 861, 859, 2511, - 873, 871, 1780, 835, 2493, 825, 2491, 842, 837, 844, 1764, 1762, 811, 810, 809, 2483, 807, 2482, 806, 2480, 815, - 814, 813, 812, 2484, 817, 816, 1745, 1744, 1742, 1746, 2655, 2637, 2635, 2626, 2625, 2623, 2628, 1820, 2752, - 2739, 2737, 2728, 2727, 2725, 2730, 2785, 2783, 2778, 2777, 2775, 2780, 787, 781, 747, 739, 736, 2413, 754, 752, - 1719, 692, 689, 681, 2371, 678, 2369, 700, 697, 694, 703, 1688, 1686, 642, 638, 2343, 631, 2341, 627, 2338, 651, - 646, 643, 2345, 654, 652, 1652, 1650, 1647, 1654, 601, 599, 2322, 596, 2321, 594, 2319, 2317, 611, 610, 608, 606, - 2324, 603, 2323, 615, 614, 612, 1617, 1616, 1614, 1612, 616, 1619, 1618, 2575, 2538, 2536, 905, 901, 898, 909, - 2509, 2507, 2504, 870, 867, 864, 860, 2512, 875, 872, 1781, 2490, 2489, 2487, 2485, 1748, 836, 834, 832, 830, - 2494, 827, 2492, 843, 841, 839, 845, 1765, 1763, 2701, 2676, 2674, 2653, 2648, 2656, 2634, 2633, 2631, 2629, - 1821, 2638, 2636, 2770, 2763, 2761, 2750, 2745, 2753, 2736, 2735, 2733, 2731, 1848, 2740, 2738, 2786, 2784, 591, - 588, 576, 569, 566, 2296, 1590, 537, 534, 526, 2276, 522, 2274, 545, 542, 539, 548, 1572, 1570, 481, 2245, 466, - 2242, 462, 2239, 492, 485, 482, 2249, 496, 494, 1534, 1531, 1528, 1538, 413, 2196, 406, 2191, 2188, 425, 419, - 2202, 415, 2199, 432, 430, 427, 1472, 1467, 1464, 433, 1476, 1474, 368, 367, 2160, 365, 2159, 362, 2157, 2155, - 2152, 378, 377, 375, 2166, 372, 2165, 369, 2162, 383, 381, 379, 2168, 1419, 1418, 1416, 1414, 385, 1411, 384, - 1423, 1422, 1420, 1424, 2461, 802, 2441, 2439, 790, 786, 783, 794, 2409, 2406, 2403, 750, 742, 738, 2414, 756, - 753, 1720, 2367, 2365, 2362, 2359, 1663, 693, 691, 684, 2373, 680, 2370, 702, 699, 696, 704, 1690, 1687, 2337, - 2336, 2334, 2332, 1624, 2329, 1622, 640, 637, 2344, 634, 2342, 630, 2340, 650, 648, 645, 2346, 655, 653, 1653, - 1651, 1649, 1655, 2612, 2597, 2595, 2571, 2568, 2565, 2576, 2534, 2529, 2526, 1787, 2540, 2537, 907, 904, 900, - 910, 2503, 2502, 2500, 2498, 1768, 2495, 1767, 2510, 2508, 2506, 869, 866, 863, 2513, 876, 874, 1782, 2720, 2713, - 2711, 2697, 2694, 2691, 2702, 2672, 2670, 2664, 1828, 2678, 2675, 2647, 2646, 2644, 2642, 1823, 2639, 1822, 2654, - 2652, 2650, 2657, 2771, 1855, 2765, 2762, 1850, 1849, 2751, 2749, 2747, 2754, 353, 2148, 344, 342, 336, 2142, - 332, 2140, 345, 1375, 1373, 306, 2130, 299, 2128, 295, 2125, 319, 314, 311, 2132, 1354, 1352, 1349, 1356, 262, - 257, 2101, 253, 2096, 2093, 274, 273, 267, 2107, 263, 2104, 280, 278, 275, 1316, 1311, 1308, 1320, 1318, 2052, - 202, 2050, 2044, 2040, 219, 2063, 212, 2060, 208, 2055, 224, 221, 2066, 1260, 1258, 1252, 231, 1248, 229, 1266, - 1264, 1261, 1268, 155, 1998, 153, 1996, 1994, 1991, 1988, 165, 164, 2007, 162, 2006, 159, 2003, 2000, 172, 171, - 169, 2012, 166, 2010, 1186, 1184, 1182, 1179, 175, 1176, 173, 1192, 1191, 1189, 1187, 176, 1194, 1193, 2313, - 2307, 2305, 592, 589, 2294, 2292, 2289, 578, 572, 568, 2297, 580, 1591, 2272, 2267, 2264, 1547, 538, 536, 529, - 2278, 525, 2275, 547, 544, 541, 1574, 1571, 2237, 2235, 2229, 1493, 2225, 1489, 478, 2247, 470, 2244, 465, 2241, - 493, 488, 484, 2250, 498, 495, 1536, 1533, 1530, 1539, 2187, 2186, 2184, 2182, 1432, 2179, 1430, 2176, 1427, 414, - 412, 2197, 409, 2195, 405, 2193, 2190, 426, 424, 421, 2203, 418, 2201, 431, 429, 1473, 1471, 1469, 1466, 434, - 1477, 1475, 2478, 2472, 2470, 2459, 2457, 2454, 2462, 803, 2437, 2432, 2429, 1726, 2443, 2440, 792, 789, 785, - 2401, 2399, 2393, 1702, 2389, 1699, 2411, 2408, 2405, 745, 741, 2415, 758, 755, 1721, 2358, 2357, 2355, 2353, - 1661, 2350, 1660, 2347, 1657, 2368, 2366, 2364, 2361, 1666, 690, 687, 2374, 683, 2372, 701, 698, 705, 1691, 1689, - 2619, 2617, 2610, 2608, 2605, 2613, 2593, 2588, 2585, 1803, 2599, 2596, 2563, 2561, 2555, 1797, 2551, 1795, 2573, - 2570, 2567, 2577, 2525, 2524, 2522, 2520, 1786, 2517, 1785, 2514, 1783, 2535, 2533, 2531, 2528, 1788, 2541, 2539, - 906, 903, 911, 2721, 1844, 2715, 2712, 1838, 1836, 2699, 2696, 2693, 2703, 1827, 1826, 1824, 2673, 2671, 2669, - 2666, 1829, 2679, 2677, 1858, 1857, 2772, 1854, 1853, 1851, 1856, 2766, 2764, 143, 1987, 139, 1986, 135, 133, - 131, 1984, 128, 1983, 125, 1981, 138, 137, 136, 1985, 1133, 1132, 1130, 112, 110, 1974, 107, 1973, 104, 1971, - 1969, 122, 121, 119, 117, 1977, 114, 1976, 124, 1115, 1114, 1112, 1110, 1117, 1116, 84, 83, 1953, 81, 1952, 78, - 1950, 1948, 1945, 94, 93, 91, 1959, 88, 1958, 85, 1955, 99, 97, 95, 1961, 1086, 1085, 1083, 1081, 1078, 100, - 1090, 1089, 1087, 1091, 49, 47, 1917, 44, 1915, 1913, 1910, 1907, 59, 1926, 56, 1925, 53, 1922, 1919, 66, 64, - 1931, 61, 1929, 1042, 1040, 1038, 71, 1035, 70, 1032, 68, 1048, 1047, 1045, 1043, 1050, 1049, 12, 10, 1869, 1867, - 1864, 1861, 21, 1880, 19, 1877, 1874, 1871, 28, 1888, 25, 1886, 22, 1883, 982, 980, 977, 974, 32, 30, 991, 989, - 987, 984, 34, 995, 994, 992, 2151, 2150, 2147, 2146, 2144, 356, 355, 354, 2149, 2139, 2138, 2136, 2134, 1359, - 343, 341, 338, 2143, 335, 2141, 348, 347, 346, 1376, 1374, 2124, 2123, 2121, 2119, 1326, 2116, 1324, 310, 308, - 305, 2131, 302, 2129, 298, 2127, 320, 318, 316, 313, 2133, 322, 321, 1355, 1353, 1351, 1357, 2092, 2091, 2089, - 2087, 1276, 2084, 1274, 2081, 1271, 259, 2102, 256, 2100, 252, 2098, 2095, 272, 269, 2108, 266, 2106, 281, 279, - 277, 1317, 1315, 1313, 1310, 282, 1321, 1319, 2039, 2037, 2035, 2032, 1203, 2029, 1200, 1197, 207, 2053, 205, - 2051, 201, 2049, 2046, 2043, 220, 218, 2064, 215, 2062, 211, 2059, 228, 226, 223, 2069, 1259, 1257, 1254, 232, - 1251, 230, 1267, 1265, 1263, 2316, 2315, 2312, 2311, 2309, 2314, 2304, 2303, 2301, 2299, 1593, 2308, 2306, 590, - 2288, 2287, 2285, 2283, 1578, 2280, 1577, 2295, 2293, 2291, 579, 577, 574, 571, 2298, 582, 581, 1592, 2263, 2262, - 2260, 2258, 1545, 2255, 1544, 2252, 1541, 2273, 2271, 2269, 2266, 1550, 535, 532, 2279, 528, 2277, 546, 543, 549, - 1575, 1573, 2224, 2222, 2220, 1486, 2217, 1485, 2214, 1482, 1479, 2238, 2236, 2234, 2231, 1496, 2228, 1492, 480, - 477, 2248, 473, 2246, 469, 2243, 490, 487, 2251, 497, 1537, 1535, 1532, 2477, 2476, 2474, 2479, 2469, 2468, 2466, - 2464, 1730, 2473, 2471, 2453, 2452, 2450, 2448, 1729, 2445, 1728, 2460, 2458, 2456, 2463, 805, 804, 2428, 2427, - 2425, 2423, 1725, 2420, 1724, 2417, 1722, 2438, 2436, 2434, 2431, 1727, 2444, 2442, 793, 791, 788, 795, 2388, - 2386, 2384, 1697, 2381, 1696, 2378, 1694, 1692, 2402, 2400, 2398, 2395, 1703, 2392, 1701, 2412, 2410, 2407, 751, - 748, 744, 2416, 759, 757, 1807, 2620, 2618, 1806, 1805, 2611, 2609, 2607, 2614, 1802, 1801, 1799, 2594, 2592, - 2590, 2587, 1804, 2600, 2598, 1794, 1793, 1791, 1789, 2564, 2562, 2560, 2557, 1798, 2554, 1796, 2574, 2572, 2569, - 2578, 1847, 1846, 2722, 1843, 1842, 1840, 1845, 2716, 2714, 1835, 1834, 1832, 1830, 1839, 1837, 2700, 2698, 2695, - 2704, 1817, 1811, 1810, 897, 862, 1777, 829, 826, 838, 1760, 1758, 808, 2481, 1741, 1740, 1738, 1743, 2624, 1818, - 2726, 2776, 782, 740, 737, 1715, 686, 679, 695, 1682, 1680, 639, 628, 2339, 647, 644, 1645, 1643, 1640, 1648, - 602, 600, 597, 595, 2320, 593, 2318, 609, 607, 604, 1611, 1610, 1608, 1606, 613, 1615, 1613, 2328, 926, 924, 892, - 886, 899, 857, 850, 2505, 1778, 824, 823, 821, 819, 2488, 818, 2486, 833, 831, 828, 840, 1761, 1759, 2649, 2632, - 2630, 2746, 2734, 2732, 2782, 2781, 570, 567, 1587, 531, 527, 523, 540, 1566, 1564, 476, 467, 463, 2240, 486, - 483, 1524, 1521, 1518, 1529, 411, 403, 2192, 399, 2189, 423, 416, 1462, 1457, 1454, 428, 1468, 1465, 2210, 366, - 363, 2158, 360, 2156, 357, 2153, 376, 373, 370, 2163, 1410, 1409, 1407, 1405, 382, 1402, 380, 1417, 1415, 1412, - 1421, 2175, 2174, 777, 774, 771, 784, 732, 725, 722, 2404, 743, 1716, 676, 674, 668, 2363, 665, 2360, 685, 1684, - 1681, 626, 624, 622, 2335, 620, 2333, 617, 2330, 641, 635, 649, 1646, 1644, 1642, 2566, 928, 925, 2530, 2527, - 894, 891, 888, 2501, 2499, 2496, 858, 856, 854, 851, 1779, 2692, 2668, 2665, 2645, 2643, 2640, 2651, 2768, 2759, - 2757, 2744, 2743, 2741, 2748, 352, 1382, 340, 337, 333, 1371, 1369, 307, 300, 296, 2126, 315, 312, 1347, 1342, - 1350, 261, 258, 250, 2097, 246, 2094, 271, 268, 264, 1306, 1301, 1298, 276, 1312, 1309, 2115, 203, 2048, 195, - 2045, 191, 2041, 213, 209, 2056, 1246, 1244, 1238, 225, 1234, 222, 1256, 1253, 1249, 1262, 2080, 2079, 154, 1997, - 150, 1995, 147, 1992, 1989, 163, 160, 2004, 156, 2001, 1175, 1174, 1172, 1170, 1167, 170, 1164, 167, 1185, 1183, - 1180, 1177, 174, 1190, 1188, 2025, 2024, 2022, 587, 586, 564, 559, 556, 2290, 573, 1588, 520, 518, 512, 2268, - 508, 2265, 530, 1568, 1565, 461, 457, 2233, 450, 2230, 446, 2226, 479, 471, 489, 1526, 1523, 1520, 397, 395, - 2185, 392, 2183, 389, 2180, 2177, 410, 2194, 402, 422, 1463, 1461, 1459, 1456, 1470, 2455, 799, 2433, 2430, 779, - 776, 773, 2397, 2394, 2390, 734, 728, 724, 746, 1717, 2356, 2354, 2351, 2348, 1658, 677, 675, 673, 670, 667, 688, - 1685, 1683, 2606, 2589, 2586, 2559, 2556, 2552, 927, 2523, 2521, 2518, 2515, 1784, 2532, 895, 893, 890, 2718, - 2709, 2707, 2689, 2687, 2684, 2663, 2662, 2660, 2658, 1825, 2667, 2769, 1852, 2760, 2758, 142, 141, 1139, 1138, - 134, 132, 129, 126, 1982, 1129, 1128, 1126, 1131, 113, 111, 108, 105, 1972, 101, 1970, 120, 118, 115, 1109, 1108, - 1106, 1104, 123, 1113, 1111, 82, 79, 1951, 75, 1949, 72, 1946, 92, 89, 86, 1956, 1077, 1076, 1074, 1072, 98, - 1069, 96, 1084, 1082, 1079, 1088, 1968, 1967, 48, 45, 1916, 42, 1914, 39, 1911, 1908, 60, 57, 54, 1923, 50, 1920, - 1031, 1030, 1028, 1026, 67, 1023, 65, 1020, 62, 1041, 1039, 1036, 1033, 69, 1046, 1044, 1944, 1943, 1941, 11, 9, - 1868, 7, 1865, 1862, 1859, 20, 1878, 16, 1875, 13, 1872, 970, 968, 966, 963, 29, 960, 26, 23, 983, 981, 978, 975, - 33, 971, 31, 990, 988, 985, 1906, 1904, 1902, 993, 351, 2145, 1383, 331, 330, 328, 326, 2137, 323, 2135, 339, - 1372, 1370, 294, 293, 291, 289, 2122, 286, 2120, 283, 2117, 309, 303, 317, 1348, 1346, 1344, 245, 244, 242, 2090, - 239, 2088, 236, 2085, 2082, 260, 2099, 249, 270, 1307, 1305, 1303, 1300, 1314, 189, 2038, 186, 2036, 183, 2033, - 2030, 2026, 206, 198, 2047, 194, 216, 1247, 1245, 1243, 1240, 227, 1237, 1255, 2310, 2302, 2300, 2286, 2284, - 2281, 565, 563, 561, 558, 575, 1589, 2261, 2259, 2256, 2253, 1542, 521, 519, 517, 514, 2270, 511, 533, 1569, - 1567, 2223, 2221, 2218, 2215, 1483, 2211, 1480, 459, 456, 453, 2232, 449, 474, 491, 1527, 1525, 1522, 2475, 2467, - 2465, 2451, 2449, 2446, 801, 800, 2426, 2424, 2421, 2418, 1723, 2435, 780, 778, 775, 2387, 2385, 2382, 2379, - 1695, 2375, 1693, 2396, 735, 733, 730, 727, 749, 1718, 2616, 2615, 2604, 2603, 2601, 2584, 2583, 2581, 2579, - 1800, 2591, 2550, 2549, 2547, 2545, 1792, 2542, 1790, 2558, 929, 2719, 1841, 2710, 2708, 1833, 1831, 2690, 2688, - 2686, 1815, 1809, 1808, 1774, 1756, 1754, 1737, 1736, 1734, 1739, 1816, 1711, 1676, 1674, 633, 629, 1638, 1636, - 1633, 1641, 598, 1605, 1604, 1602, 1600, 605, 1609, 1607, 2327, 887, 853, 1775, 822, 820, 1757, 1755, 1584, 524, - 1560, 1558, 468, 464, 1514, 1511, 1508, 1519, 408, 404, 400, 1452, 1447, 1444, 417, 1458, 1455, 2208, 364, 361, - 358, 2154, 1401, 1400, 1398, 1396, 374, 1393, 371, 1408, 1406, 1403, 1413, 2173, 2172, 772, 726, 723, 1712, 672, - 669, 666, 682, 1678, 1675, 625, 623, 621, 618, 2331, 636, 632, 1639, 1637, 1635, 920, 918, 884, 880, 889, 849, - 848, 847, 846, 2497, 855, 852, 1776, 2641, 2742, 2787, 1380, 334, 1367, 1365, 301, 297, 1340, 1338, 1335, 1343, - 255, 251, 247, 1296, 1291, 1288, 265, 1302, 1299, 2113, 204, 196, 192, 2042, 1232, 1230, 1224, 214, 1220, 210, - 1242, 1239, 1235, 1250, 2077, 2075, 151, 148, 1993, 144, 1990, 1163, 1162, 1160, 1158, 1155, 161, 1152, 157, - 1173, 1171, 1168, 1165, 168, 1181, 1178, 2021, 2020, 2018, 2023, 585, 560, 557, 1585, 516, 509, 1562, 1559, 458, - 447, 2227, 472, 1516, 1513, 1510, 398, 396, 393, 390, 2181, 386, 2178, 407, 1453, 1451, 1449, 1446, 420, 1460, - 2209, 769, 764, 720, 712, 2391, 729, 1713, 664, 663, 661, 659, 2352, 656, 2349, 671, 1679, 1677, 2553, 922, 919, - 2519, 2516, 885, 883, 881, 2685, 2661, 2659, 2767, 2756, 2755, 140, 1137, 1136, 130, 127, 1125, 1124, 1122, 1127, - 109, 106, 102, 1103, 1102, 1100, 1098, 116, 1107, 1105, 1980, 80, 76, 73, 1947, 1068, 1067, 1065, 1063, 90, 1060, - 87, 1075, 1073, 1070, 1080, 1966, 1965, 46, 43, 40, 1912, 36, 1909, 1019, 1018, 1016, 1014, 58, 1011, 55, 1008, - 51, 1029, 1027, 1024, 1021, 63, 1037, 1034, 1940, 1939, 1937, 1942, 8, 1866, 4, 1863, 1, 1860, 956, 954, 952, - 949, 946, 17, 14, 969, 967, 964, 961, 27, 957, 24, 979, 976, 972, 1901, 1900, 1898, 1896, 986, 1905, 1903, 350, - 349, 1381, 329, 327, 324, 1368, 1366, 292, 290, 287, 284, 2118, 304, 1341, 1339, 1337, 1345, 243, 240, 237, 2086, - 233, 2083, 254, 1297, 1295, 1293, 1290, 1304, 2114, 190, 187, 184, 2034, 180, 2031, 177, 2027, 199, 1233, 1231, - 1229, 1226, 217, 1223, 1241, 2078, 2076, 584, 555, 554, 552, 550, 2282, 562, 1586, 507, 506, 504, 502, 2257, 499, - 2254, 515, 1563, 1561, 445, 443, 441, 2219, 438, 2216, 435, 2212, 460, 454, 475, 1517, 1515, 1512, 2447, 798, - 797, 2422, 2419, 770, 768, 766, 2383, 2380, 2376, 721, 719, 717, 714, 731, 1714, 2602, 2582, 2580, 2548, 2546, - 2543, 923, 921, 2717, 2706, 2705, 2683, 2682, 2680, 1771, 1752, 1750, 1733, 1732, 1731, 1735, 1814, 1707, 1670, - 1668, 1631, 1629, 1626, 1634, 1599, 1598, 1596, 1594, 1603, 1601, 2326, 1772, 1753, 1751, 1581, 1554, 1552, 1504, - 1501, 1498, 1509, 1442, 1437, 1434, 401, 1448, 1445, 2206, 1392, 1391, 1389, 1387, 1384, 359, 1399, 1397, 1394, - 1404, 2171, 2170, 1708, 1672, 1669, 619, 1632, 1630, 1628, 1773, 1378, 1363, 1361, 1333, 1328, 1336, 1286, 1281, - 1278, 248, 1292, 1289, 2111, 1218, 1216, 1210, 197, 1206, 193, 1228, 1225, 1221, 1236, 2073, 2071, 1151, 1150, - 1148, 1146, 152, 1143, 149, 1140, 145, 1161, 1159, 1156, 1153, 158, 1169, 1166, 2017, 2016, 2014, 2019, 1582, - 510, 1556, 1553, 452, 448, 1506, 1500, 394, 391, 387, 1443, 1441, 1439, 1436, 1450, 2207, 765, 716, 713, 1709, - 662, 660, 657, 1673, 1671, 916, 914, 879, 878, 877, 882, 1135, 1134, 1121, 1120, 1118, 1123, 1097, 1096, 1094, - 1092, 103, 1101, 1099, 1979, 1059, 1058, 1056, 1054, 77, 1051, 74, 1066, 1064, 1061, 1071, 1964, 1963, 1007, - 1006, 1004, 1002, 999, 41, 996, 37, 1017, 1015, 1012, 1009, 52, 1025, 1022, 1936, 1935, 1933, 1938, 942, 940, - 938, 935, 932, 5, 2, 955, 953, 950, 947, 18, 943, 15, 965, 962, 958, 1895, 1894, 1892, 1890, 973, 1899, 1897, - 1379, 325, 1364, 1362, 288, 285, 1334, 1332, 1330, 241, 238, 234, 1287, 1285, 1283, 1280, 1294, 2112, 188, 185, - 181, 178, 2028, 1219, 1217, 1215, 1212, 200, 1209, 1227, 2074, 2072, 583, 553, 551, 1583, 505, 503, 500, 513, - 1557, 1555, 444, 442, 439, 436, 2213, 455, 451, 1507, 1505, 1502, 796, 763, 762, 760, 767, 711, 710, 708, 706, - 2377, 718, 715, 1710, 2544, 917, 915, 2681, 1627, 1597, 1595, 2325, 1769, 1749, 1747, 1499, 1438, 1435, 2204, - 1390, 1388, 1385, 1395, 2169, 2167, 1704, 1665, 1662, 1625, 1623, 1620, 1770, 1329, 1282, 1279, 2109, 1214, 1207, - 1222, 2068, 2065, 1149, 1147, 1144, 1141, 146, 1157, 1154, 2013, 2011, 2008, 2015, 1579, 1549, 1546, 1495, 1487, - 1433, 1431, 1428, 1425, 388, 1440, 2205, 1705, 658, 1667, 1664, 1119, 1095, 1093, 1978, 1057, 1055, 1052, 1062, - 1962, 1960, 1005, 1003, 1000, 997, 38, 1013, 1010, 1932, 1930, 1927, 1934, 941, 939, 936, 933, 6, 930, 3, 951, - 948, 944, 1889, 1887, 1884, 1881, 959, 1893, 1891, 35, 1377, 1360, 1358, 1327, 1325, 1322, 1331, 1277, 1275, - 1272, 1269, 235, 1284, 2110, 1205, 1204, 1201, 1198, 182, 1195, 179, 1213, 2070, 2067, 1580, 501, 1551, 1548, - 440, 437, 1497, 1494, 1490, 1503, 761, 709, 707, 1706, 913, 912, 2198, 1386, 2164, 2161, 1621, 1766, 2103, 1208, - 2058, 2054, 1145, 1142, 2005, 2002, 1999, 2009, 1488, 1429, 1426, 2200, 1698, 1659, 1656, 1975, 1053, 1957, 1954, - 1001, 998, 1924, 1921, 1918, 1928, 937, 934, 931, 1879, 1876, 1873, 1870, 945, 1885, 1882, 1323, 1273, 1270, - 2105, 1202, 1199, 1196, 1211, 2061, 2057, 1576, 1543, 1540, 1484, 1481, 1478, 1491, 1700 - ]); - - /* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - // import java.util.List; - /** - * @author Guenther Grau - */ - /*public final*/ class PDF417DetectorResult { - constructor(bits, points) { - this.bits = bits; - this.points = points; - } - getBits() { - return this.bits; - } - getPoints() { - return this.points; - } - } - - /* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - // import java.util.ArrayList; - // import java.util.Arrays; - // import java.util.List; - // import java.util.Map; - /** - *

    Encapsulates logic that can detect a PDF417 Code in an image, even if the - * PDF417 Code is rotated or skewed, or partially obscured.

    - * - * @author SITA Lab (kevin.osullivan@sita.aero) - * @author dswitkin@google.com (Daniel Switkin) - * @author Guenther Grau - */ - /*public*/ /*final*/ class Detector$3 { - /** - *

    Detects a PDF417 Code in an image. Only checks 0 and 180 degree rotations.

    - * - * @param image barcode image to decode - * @param hints optional hints to detector - * @param multiple if true, then the image is searched for multiple codes. If false, then at most one code will - * be found and returned - * @return {@link PDF417DetectorResult} encapsulating results of detecting a PDF417 code - * @throws NotFoundException if no PDF417 Code can be found - */ - static detectMultiple(image, hints, multiple) { - // TODO detection improvement, tryHarder could try several different luminance thresholds/blackpoints or even - // different binarizers - // boolean tryHarder = hints != null && hints.containsKey(DecodeHintType.TRY_HARDER); - let bitMatrix = image.getBlackMatrix(); - let barcodeCoordinates = Detector$3.detect(multiple, bitMatrix); - if (!barcodeCoordinates.length) { - bitMatrix = bitMatrix.clone(); - bitMatrix.rotate180(); - barcodeCoordinates = Detector$3.detect(multiple, bitMatrix); - } - return new PDF417DetectorResult(bitMatrix, barcodeCoordinates); - } - /** - * Detects PDF417 codes in an image. Only checks 0 degree rotation - * @param multiple if true, then the image is searched for multiple codes. If false, then at most one code will - * be found and returned - * @param bitMatrix bit matrix to detect barcodes in - * @return List of ResultPoint arrays containing the coordinates of found barcodes - */ - static detect(multiple, bitMatrix) { - const barcodeCoordinates = new Array(); - let row = 0; - let column = 0; - let foundBarcodeInRow = false; - while (row < bitMatrix.getHeight()) { - const vertices = Detector$3.findVertices(bitMatrix, row, column); - if (vertices[0] == null && vertices[3] == null) { - if (!foundBarcodeInRow) { - // we didn't find any barcode so that's the end of searching - break; - } - // we didn't find a barcode starting at the given column and row. Try again from the first column and slightly - // below the lowest barcode we found so far. - foundBarcodeInRow = false; - column = 0; - for (const barcodeCoordinate of barcodeCoordinates) { - if (barcodeCoordinate[1] != null) { - row = Math.trunc(Math.max(row, barcodeCoordinate[1].getY())); - } - if (barcodeCoordinate[3] != null) { - row = Math.max(row, Math.trunc(barcodeCoordinate[3].getY())); - } - } - row += Detector$3.ROW_STEP; - continue; - } - foundBarcodeInRow = true; - barcodeCoordinates.push(vertices); - if (!multiple) { - break; - } - // if we didn't find a right row indicator column, then continue the search for the next barcode after the - // start pattern of the barcode just found. - if (vertices[2] != null) { - column = Math.trunc(vertices[2].getX()); - row = Math.trunc(vertices[2].getY()); - } - else { - column = Math.trunc(vertices[4].getX()); - row = Math.trunc(vertices[4].getY()); - } - } - return barcodeCoordinates; - } - /** - * Locate the vertices and the codewords area of a black blob using the Start - * and Stop patterns as locators. - * - * @param matrix the scanned barcode image. - * @return an array containing the vertices: - * vertices[0] x, y top left barcode - * vertices[1] x, y bottom left barcode - * vertices[2] x, y top right barcode - * vertices[3] x, y bottom right barcode - * vertices[4] x, y top left codeword area - * vertices[5] x, y bottom left codeword area - * vertices[6] x, y top right codeword area - * vertices[7] x, y bottom right codeword area - */ - static findVertices(matrix, startRow, startColumn) { - const height = matrix.getHeight(); - const width = matrix.getWidth(); - // const result = new ResultPoint[8]; - const result = new Array(8); - Detector$3.copyToResult(result, Detector$3.findRowsWithPattern(matrix, height, width, startRow, startColumn, Detector$3.START_PATTERN), Detector$3.INDEXES_START_PATTERN); - if (result[4] != null) { - startColumn = Math.trunc(result[4].getX()); - startRow = Math.trunc(result[4].getY()); - } - Detector$3.copyToResult(result, Detector$3.findRowsWithPattern(matrix, height, width, startRow, startColumn, Detector$3.STOP_PATTERN), Detector$3.INDEXES_STOP_PATTERN); - return result; - } - static copyToResult(result, tmpResult, destinationIndexes) { - for (let i = 0; i < destinationIndexes.length; i++) { - result[destinationIndexes[i]] = tmpResult[i]; - } - } - static findRowsWithPattern(matrix, height, width, startRow, startColumn, pattern) { - // const result = new ResultPoint[4]; - const result = new Array(4); - let found = false; - const counters = new Int32Array(pattern.length); - for (; startRow < height; startRow += Detector$3.ROW_STEP) { - let loc = Detector$3.findGuardPattern(matrix, startColumn, startRow, width, false, pattern, counters); - if (loc != null) { - while (startRow > 0) { - const previousRowLoc = Detector$3.findGuardPattern(matrix, startColumn, --startRow, width, false, pattern, counters); - if (previousRowLoc != null) { - loc = previousRowLoc; - } - else { - startRow++; - break; - } - } - result[0] = new ResultPoint(loc[0], startRow); - result[1] = new ResultPoint(loc[1], startRow); - found = true; - break; - } - } - let stopRow = startRow + 1; - // Last row of the current symbol that contains pattern - if (found) { - let skippedRowCount = 0; - let previousRowLoc = Int32Array.from([Math.trunc(result[0].getX()), Math.trunc(result[1].getX())]); - for (; stopRow < height; stopRow++) { - const loc = Detector$3.findGuardPattern(matrix, previousRowLoc[0], stopRow, width, false, pattern, counters); - // a found pattern is only considered to belong to the same barcode if the start and end positions - // don't differ too much. Pattern drift should be not bigger than two for consecutive rows. With - // a higher number of skipped rows drift could be larger. To keep it simple for now, we allow a slightly - // larger drift and don't check for skipped rows. - if (loc != null && - Math.abs(previousRowLoc[0] - loc[0]) < Detector$3.MAX_PATTERN_DRIFT && - Math.abs(previousRowLoc[1] - loc[1]) < Detector$3.MAX_PATTERN_DRIFT) { - previousRowLoc = loc; - skippedRowCount = 0; - } - else { - if (skippedRowCount > Detector$3.SKIPPED_ROW_COUNT_MAX) { - break; - } - else { - skippedRowCount++; - } - } - } - stopRow -= skippedRowCount + 1; - result[2] = new ResultPoint(previousRowLoc[0], stopRow); - result[3] = new ResultPoint(previousRowLoc[1], stopRow); - } - if (stopRow - startRow < Detector$3.BARCODE_MIN_HEIGHT) { - Arrays.fill(result, null); - } - return result; - } - /** - * @param matrix row of black/white values to search - * @param column x position to start search - * @param row y position to start search - * @param width the number of pixels to search on this row - * @param pattern pattern of counts of number of black and white pixels that are - * being searched for as a pattern - * @param counters array of counters, as long as pattern, to re-use - * @return start/end horizontal offset of guard pattern, as an array of two ints. - */ - static findGuardPattern(matrix, column, row, width, whiteFirst, pattern, counters) { - Arrays.fillWithin(counters, 0, counters.length, 0); - let patternStart = column; - let pixelDrift = 0; - // if there are black pixels left of the current pixel shift to the left, but only for MAX_PIXEL_DRIFT pixels - while (matrix.get(patternStart, row) && patternStart > 0 && pixelDrift++ < Detector$3.MAX_PIXEL_DRIFT) { - patternStart--; - } - let x = patternStart; - let counterPosition = 0; - let patternLength = pattern.length; - for (let isWhite = whiteFirst; x < width; x++) { - let pixel = matrix.get(x, row); - if (pixel !== isWhite) { - counters[counterPosition]++; - } - else { - if (counterPosition === patternLength - 1) { - if (Detector$3.patternMatchVariance(counters, pattern, Detector$3.MAX_INDIVIDUAL_VARIANCE) < Detector$3.MAX_AVG_VARIANCE) { - return new Int32Array([patternStart, x]); - } - patternStart += counters[0] + counters[1]; - System.arraycopy(counters, 2, counters, 0, counterPosition - 1); - counters[counterPosition - 1] = 0; - counters[counterPosition] = 0; - counterPosition--; - } - else { - counterPosition++; - } - counters[counterPosition] = 1; - isWhite = !isWhite; - } - } - if (counterPosition === patternLength - 1 && - Detector$3.patternMatchVariance(counters, pattern, Detector$3.MAX_INDIVIDUAL_VARIANCE) < Detector$3.MAX_AVG_VARIANCE) { - return new Int32Array([patternStart, x - 1]); - } - return null; - } - /** - * Determines how closely a set of observed counts of runs of black/white - * values matches a given target pattern. This is reported as the ratio of - * the total variance from the expected pattern proportions across all - * pattern elements, to the length of the pattern. - * - * @param counters observed counters - * @param pattern expected pattern - * @param maxIndividualVariance The most any counter can differ before we give up - * @return ratio of total variance between counters and pattern compared to total pattern size - */ - static patternMatchVariance(counters, pattern, maxIndividualVariance) { - let numCounters = counters.length; - let total = 0; - let patternLength = 0; - for (let i = 0; i < numCounters; i++) { - total += counters[i]; - patternLength += pattern[i]; - } - if (total < patternLength) { - // If we don't even have one pixel per unit of bar width, assume this - // is too small to reliably match, so fail: - return /*Float.POSITIVE_INFINITY*/ Infinity; - } - // We're going to fake floating-point math in integers. We just need to use more bits. - // Scale up patternLength so that intermediate values below like scaledCounter will have - // more "significant digits". - let unitBarWidth = total / patternLength; - maxIndividualVariance *= unitBarWidth; - let totalVariance = 0.0; - for (let x = 0; x < numCounters; x++) { - let counter = counters[x]; - let scaledPattern = pattern[x] * unitBarWidth; - let variance = counter > scaledPattern ? counter - scaledPattern : scaledPattern - counter; - if (variance > maxIndividualVariance) { - return /*Float.POSITIVE_INFINITY*/ Infinity; - } - totalVariance += variance; - } - return totalVariance / total; - } - } - Detector$3.INDEXES_START_PATTERN = Int32Array.from([0, 4, 1, 5]); - Detector$3.INDEXES_STOP_PATTERN = Int32Array.from([6, 2, 7, 3]); - Detector$3.MAX_AVG_VARIANCE = 0.42; - Detector$3.MAX_INDIVIDUAL_VARIANCE = 0.8; - // B S B S B S B S Bar/Space pattern - // 11111111 0 1 0 1 0 1 000 - Detector$3.START_PATTERN = Int32Array.from([8, 1, 1, 1, 1, 1, 1, 3]); - // 1111111 0 1 000 1 0 1 00 1 - Detector$3.STOP_PATTERN = Int32Array.from([7, 1, 1, 3, 1, 1, 1, 2, 1]); - Detector$3.MAX_PIXEL_DRIFT = 3; - Detector$3.MAX_PATTERN_DRIFT = 5; - // if we set the value too low, then we don't detect the correct height of the bar if the start patterns are damaged. - // if we set the value too high, then we might detect the start pattern from a neighbor barcode. - Detector$3.SKIPPED_ROW_COUNT_MAX = 25; - // A PDF471 barcode should have at least 3 rows, with each row being >= 3 times the module width. Therefore it should be at least - // 9 pixels tall. To be conservative, we use about half the size to ensure we don't miss it. - Detector$3.ROW_STEP = 5; - Detector$3.BARCODE_MIN_HEIGHT = 10; - - /* - * Copyright 2012 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * @author Sean Owen - * @see com.google.zxing.common.reedsolomon.GenericGFPoly - */ - /*final*/ class ModulusPoly { - constructor(field, coefficients) { - if (coefficients.length === 0) { - throw new IllegalArgumentException(); - } - this.field = field; - let coefficientsLength = /*int*/ coefficients.length; - if (coefficientsLength > 1 && coefficients[0] === 0) { - // Leading term must be non-zero for anything except the constant polynomial "0" - let firstNonZero = /*int*/ 1; - while (firstNonZero < coefficientsLength && coefficients[firstNonZero] === 0) { - firstNonZero++; - } - if (firstNonZero === coefficientsLength) { - this.coefficients = new Int32Array([0]); - } - else { - this.coefficients = new Int32Array(coefficientsLength - firstNonZero); - System.arraycopy(coefficients, firstNonZero, this.coefficients, 0, this.coefficients.length); - } - } - else { - this.coefficients = coefficients; - } - } - getCoefficients() { - return this.coefficients; - } - /** - * @return degree of this polynomial - */ - getDegree() { - return this.coefficients.length - 1; - } - /** - * @return true iff this polynomial is the monomial "0" - */ - isZero() { - return this.coefficients[0] === 0; - } - /** - * @return coefficient of x^degree term in this polynomial - */ - getCoefficient(degree) { - return this.coefficients[this.coefficients.length - 1 - degree]; - } - /** - * @return evaluation of this polynomial at a given point - */ - evaluateAt(a) { - if (a === 0) { - // Just return the x^0 coefficient - return this.getCoefficient(0); - } - if (a === 1) { - // Just the sum of the coefficients - let sum = /*int*/ 0; - for (let coefficient /*int*/ of this.coefficients) { - sum = this.field.add(sum, coefficient); - } - return sum; - } - let result = /*int*/ this.coefficients[0]; - let size = /*int*/ this.coefficients.length; - for (let i /*int*/ = 1; i < size; i++) { - result = this.field.add(this.field.multiply(a, result), this.coefficients[i]); - } - return result; - } - add(other) { - if (!this.field.equals(other.field)) { - throw new IllegalArgumentException('ModulusPolys do not have same ModulusGF field'); - } - if (this.isZero()) { - return other; - } - if (other.isZero()) { - return this; - } - let smallerCoefficients = this.coefficients; - let largerCoefficients = other.coefficients; - if (smallerCoefficients.length > largerCoefficients.length) { - let temp = smallerCoefficients; - smallerCoefficients = largerCoefficients; - largerCoefficients = temp; - } - let sumDiff = new Int32Array(largerCoefficients.length); - let lengthDiff = /*int*/ largerCoefficients.length - smallerCoefficients.length; - // Copy high-order terms only found in higher-degree polynomial's coefficients - System.arraycopy(largerCoefficients, 0, sumDiff, 0, lengthDiff); - for (let i /*int*/ = lengthDiff; i < largerCoefficients.length; i++) { - sumDiff[i] = this.field.add(smallerCoefficients[i - lengthDiff], largerCoefficients[i]); - } - return new ModulusPoly(this.field, sumDiff); - } - subtract(other) { - if (!this.field.equals(other.field)) { - throw new IllegalArgumentException('ModulusPolys do not have same ModulusGF field'); - } - if (other.isZero()) { - return this; - } - return this.add(other.negative()); - } - multiply(other) { - if (other instanceof ModulusPoly) { - return this.multiplyOther(other); - } - return this.multiplyScalar(other); - } - multiplyOther(other) { - if (!this.field.equals(other.field)) { - throw new IllegalArgumentException('ModulusPolys do not have same ModulusGF field'); - } - if (this.isZero() || other.isZero()) { - // return this.field.getZero(); - return new ModulusPoly(this.field, new Int32Array([0])); - } - let aCoefficients = this.coefficients; - let aLength = /*int*/ aCoefficients.length; - let bCoefficients = other.coefficients; - let bLength = /*int*/ bCoefficients.length; - let product = new Int32Array(aLength + bLength - 1); - for (let i /*int*/ = 0; i < aLength; i++) { - let aCoeff = /*int*/ aCoefficients[i]; - for (let j /*int*/ = 0; j < bLength; j++) { - product[i + j] = this.field.add(product[i + j], this.field.multiply(aCoeff, bCoefficients[j])); - } - } - return new ModulusPoly(this.field, product); - } - negative() { - let size = /*int*/ this.coefficients.length; - let negativeCoefficients = new Int32Array(size); - for (let i /*int*/ = 0; i < size; i++) { - negativeCoefficients[i] = this.field.subtract(0, this.coefficients[i]); - } - return new ModulusPoly(this.field, negativeCoefficients); - } - multiplyScalar(scalar) { - if (scalar === 0) { - return new ModulusPoly(this.field, new Int32Array([0])); - } - if (scalar === 1) { - return this; - } - let size = /*int*/ this.coefficients.length; - let product = new Int32Array(size); - for (let i /*int*/ = 0; i < size; i++) { - product[i] = this.field.multiply(this.coefficients[i], scalar); - } - return new ModulusPoly(this.field, product); - } - multiplyByMonomial(degree, coefficient) { - if (degree < 0) { - throw new IllegalArgumentException(); - } - if (coefficient === 0) { - return new ModulusPoly(this.field, new Int32Array([0])); - } - let size = /*int*/ this.coefficients.length; - let product = new Int32Array(size + degree); - for (let i /*int*/ = 0; i < size; i++) { - product[i] = this.field.multiply(this.coefficients[i], coefficient); - } - return new ModulusPoly(this.field, product); - } - /* - ModulusPoly[] divide(other: ModulusPoly) { - if (!field.equals(other.field)) { - throw new IllegalArgumentException("ModulusPolys do not have same ModulusGF field"); - } - if (other.isZero()) { - throw new IllegalArgumentException("Divide by 0"); - } - - let quotient: ModulusPoly = field.getZero(); - let remainder: ModulusPoly = this; - - let denominatorLeadingTerm: /*int/ number = other.getCoefficient(other.getDegree()); - let inverseDenominatorLeadingTerm: /*int/ number = field.inverse(denominatorLeadingTerm); - - while (remainder.getDegree() >= other.getDegree() && !remainder.isZero()) { - let degreeDifference: /*int/ number = remainder.getDegree() - other.getDegree(); - let scale: /*int/ number = field.multiply(remainder.getCoefficient(remainder.getDegree()), inverseDenominatorLeadingTerm); - let term: ModulusPoly = other.multiplyByMonomial(degreeDifference, scale); - let iterationQuotient: ModulusPoly = field.buildMonomial(degreeDifference, scale); - quotient = quotient.add(iterationQuotient); - remainder = remainder.subtract(term); - } - - return new ModulusPoly[] { quotient, remainder }; - } - */ - // @Override - toString() { - let result = new StringBuilder( /*8 * this.getDegree()*/); // dynamic string size in JS - for (let degree /*int*/ = this.getDegree(); degree >= 0; degree--) { - let coefficient = /*int*/ this.getCoefficient(degree); - if (coefficient !== 0) { - if (coefficient < 0) { - result.append(' - '); - coefficient = -coefficient; - } - else { - if (result.length() > 0) { - result.append(' + '); - } - } - if (degree === 0 || coefficient !== 1) { - result.append(coefficient); - } - if (degree !== 0) { - if (degree === 1) { - result.append('x'); - } - else { - result.append('x^'); - result.append(degree); - } - } - } - } - return result.toString(); - } - } - - class ModulusBase { - add(a, b) { - return (a + b) % this.modulus; - } - subtract(a, b) { - return (this.modulus + a - b) % this.modulus; - } - exp(a) { - return this.expTable[a]; - } - log(a) { - if (a === 0) { - throw new IllegalArgumentException(); - } - return this.logTable[a]; - } - inverse(a) { - if (a === 0) { - throw new ArithmeticException(); - } - return this.expTable[this.modulus - this.logTable[a] - 1]; - } - multiply(a, b) { - if (a === 0 || b === 0) { - return 0; - } - return this.expTable[(this.logTable[a] + this.logTable[b]) % (this.modulus - 1)]; - } - getSize() { - return this.modulus; - } - equals(o) { - return o === this; - } - } - - /* - * Copyright 2012 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - *

    A field based on powers of a generator integer, modulo some modulus.

    - * - * @author Sean Owen - * @see com.google.zxing.common.reedsolomon.GenericGF - */ - /*public final*/ class ModulusGF extends ModulusBase { - // private /*final*/ modulus: /*int*/ number; - constructor(modulus, generator) { - super(); - this.modulus = modulus; - this.expTable = new Int32Array(modulus); - this.logTable = new Int32Array(modulus); - let x = /*int*/ 1; - for (let i /*int*/ = 0; i < modulus; i++) { - this.expTable[i] = x; - x = (x * generator) % modulus; - } - for (let i /*int*/ = 0; i < modulus - 1; i++) { - this.logTable[this.expTable[i]] = i; - } - // logTable[0] == 0 but this should never be used - this.zero = new ModulusPoly(this, new Int32Array([0])); - this.one = new ModulusPoly(this, new Int32Array([1])); - } - getZero() { - return this.zero; - } - getOne() { - return this.one; - } - buildMonomial(degree, coefficient) { - if (degree < 0) { - throw new IllegalArgumentException(); - } - if (coefficient === 0) { - return this.zero; - } - let coefficients = new Int32Array(degree + 1); - coefficients[0] = coefficient; - return new ModulusPoly(this, coefficients); - } - } - ModulusGF.PDF417_GF = new ModulusGF(PDF417Common.NUMBER_OF_CODEWORDS, 3); - - /* - * Copyright 2012 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - *

    PDF417 error correction implementation.

    - * - *

    This example - * is quite useful in understanding the algorithm.

    - * - * @author Sean Owen - * @see com.google.zxing.common.reedsolomon.ReedSolomonDecoder - */ - /*public final*/ class ErrorCorrection { - constructor() { - this.field = ModulusGF.PDF417_GF; - } - /** - * @param received received codewords - * @param numECCodewords number of those codewords used for EC - * @param erasures location of erasures - * @return number of errors - * @throws ChecksumException if errors cannot be corrected, maybe because of too many errors - */ - decode(received, numECCodewords, erasures) { - let poly = new ModulusPoly(this.field, received); - let S = new Int32Array(numECCodewords); - let error = false; - for (let i /*int*/ = numECCodewords; i > 0; i--) { - let evaluation = poly.evaluateAt(this.field.exp(i)); - S[numECCodewords - i] = evaluation; - if (evaluation !== 0) { - error = true; - } - } - if (!error) { - return 0; - } - let knownErrors = this.field.getOne(); - if (erasures != null) { - for (const erasure of erasures) { - let b = this.field.exp(received.length - 1 - erasure); - // Add (1 - bx) term: - let term = new ModulusPoly(this.field, new Int32Array([this.field.subtract(0, b), 1])); - knownErrors = knownErrors.multiply(term); - } - } - let syndrome = new ModulusPoly(this.field, S); - // syndrome = syndrome.multiply(knownErrors); - let sigmaOmega = this.runEuclideanAlgorithm(this.field.buildMonomial(numECCodewords, 1), syndrome, numECCodewords); - let sigma = sigmaOmega[0]; - let omega = sigmaOmega[1]; - // sigma = sigma.multiply(knownErrors); - let errorLocations = this.findErrorLocations(sigma); - let errorMagnitudes = this.findErrorMagnitudes(omega, sigma, errorLocations); - for (let i /*int*/ = 0; i < errorLocations.length; i++) { - let position = received.length - 1 - this.field.log(errorLocations[i]); - if (position < 0) { - throw ChecksumException.getChecksumInstance(); - } - received[position] = this.field.subtract(received[position], errorMagnitudes[i]); - } - return errorLocations.length; - } - /** - * - * @param ModulusPoly - * @param a - * @param ModulusPoly - * @param b - * @param int - * @param R - * @throws ChecksumException - */ - runEuclideanAlgorithm(a, b, R) { - // Assume a's degree is >= b's - if (a.getDegree() < b.getDegree()) { - let temp = a; - a = b; - b = temp; - } - let rLast = a; - let r = b; - let tLast = this.field.getZero(); - let t = this.field.getOne(); - // Run Euclidean algorithm until r's degree is less than R/2 - while (r.getDegree() >= Math.round(R / 2)) { - let rLastLast = rLast; - let tLastLast = tLast; - rLast = r; - tLast = t; - // Divide rLastLast by rLast, with quotient in q and remainder in r - if (rLast.isZero()) { - // Oops, Euclidean algorithm already terminated? - throw ChecksumException.getChecksumInstance(); - } - r = rLastLast; - let q = this.field.getZero(); - let denominatorLeadingTerm = rLast.getCoefficient(rLast.getDegree()); - let dltInverse = this.field.inverse(denominatorLeadingTerm); - while (r.getDegree() >= rLast.getDegree() && !r.isZero()) { - let degreeDiff = r.getDegree() - rLast.getDegree(); - let scale = this.field.multiply(r.getCoefficient(r.getDegree()), dltInverse); - q = q.add(this.field.buildMonomial(degreeDiff, scale)); - r = r.subtract(rLast.multiplyByMonomial(degreeDiff, scale)); - } - t = q.multiply(tLast).subtract(tLastLast).negative(); - } - let sigmaTildeAtZero = t.getCoefficient(0); - if (sigmaTildeAtZero === 0) { - throw ChecksumException.getChecksumInstance(); - } - let inverse = this.field.inverse(sigmaTildeAtZero); - let sigma = t.multiply(inverse); - let omega = r.multiply(inverse); - return [sigma, omega]; - } - /** - * - * @param errorLocator - * @throws ChecksumException - */ - findErrorLocations(errorLocator) { - // This is a direct application of Chien's search - let numErrors = errorLocator.getDegree(); - let result = new Int32Array(numErrors); - let e = 0; - for (let i /*int*/ = 1; i < this.field.getSize() && e < numErrors; i++) { - if (errorLocator.evaluateAt(i) === 0) { - result[e] = this.field.inverse(i); - e++; - } - } - if (e !== numErrors) { - throw ChecksumException.getChecksumInstance(); - } - return result; - } - findErrorMagnitudes(errorEvaluator, errorLocator, errorLocations) { - let errorLocatorDegree = errorLocator.getDegree(); - let formalDerivativeCoefficients = new Int32Array(errorLocatorDegree); - for (let i /*int*/ = 1; i <= errorLocatorDegree; i++) { - formalDerivativeCoefficients[errorLocatorDegree - i] = - this.field.multiply(i, errorLocator.getCoefficient(i)); - } - let formalDerivative = new ModulusPoly(this.field, formalDerivativeCoefficients); - // This is directly applying Forney's Formula - let s = errorLocations.length; - let result = new Int32Array(s); - for (let i /*int*/ = 0; i < s; i++) { - let xiInverse = this.field.inverse(errorLocations[i]); - let numerator = this.field.subtract(0, errorEvaluator.evaluateAt(xiInverse)); - let denominator = this.field.inverse(formalDerivative.evaluateAt(xiInverse)); - result[i] = this.field.multiply(numerator, denominator); - } - return result; - } - } - - /* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * @author Guenther Grau - */ - /*final*/ class BoundingBox { - constructor(image, topLeft, bottomLeft, topRight, bottomRight) { - if (image instanceof BoundingBox) { - this.constructor_2(image); - } - else { - this.constructor_1(image, topLeft, bottomLeft, topRight, bottomRight); - } - } - /** - * - * @param image - * @param topLeft - * @param bottomLeft - * @param topRight - * @param bottomRight - * - * @throws NotFoundException - */ - constructor_1(image, topLeft, bottomLeft, topRight, bottomRight) { - const leftUnspecified = topLeft == null || bottomLeft == null; - const rightUnspecified = topRight == null || bottomRight == null; - if (leftUnspecified && rightUnspecified) { - throw new NotFoundException(); - } - if (leftUnspecified) { - topLeft = new ResultPoint(0, topRight.getY()); - bottomLeft = new ResultPoint(0, bottomRight.getY()); - } - else if (rightUnspecified) { - topRight = new ResultPoint(image.getWidth() - 1, topLeft.getY()); - bottomRight = new ResultPoint(image.getWidth() - 1, bottomLeft.getY()); - } - this.image = image; - this.topLeft = topLeft; - this.bottomLeft = bottomLeft; - this.topRight = topRight; - this.bottomRight = bottomRight; - this.minX = Math.trunc(Math.min(topLeft.getX(), bottomLeft.getX())); - this.maxX = Math.trunc(Math.max(topRight.getX(), bottomRight.getX())); - this.minY = Math.trunc(Math.min(topLeft.getY(), topRight.getY())); - this.maxY = Math.trunc(Math.max(bottomLeft.getY(), bottomRight.getY())); - } - constructor_2(boundingBox) { - this.image = boundingBox.image; - this.topLeft = boundingBox.getTopLeft(); - this.bottomLeft = boundingBox.getBottomLeft(); - this.topRight = boundingBox.getTopRight(); - this.bottomRight = boundingBox.getBottomRight(); - this.minX = boundingBox.getMinX(); - this.maxX = boundingBox.getMaxX(); - this.minY = boundingBox.getMinY(); - this.maxY = boundingBox.getMaxY(); - } - /** - * @throws NotFoundException - */ - static merge(leftBox, rightBox) { - if (leftBox == null) { - return rightBox; - } - if (rightBox == null) { - return leftBox; - } - return new BoundingBox(leftBox.image, leftBox.topLeft, leftBox.bottomLeft, rightBox.topRight, rightBox.bottomRight); - } - /** - * @throws NotFoundException - */ - addMissingRows(missingStartRows, missingEndRows, isLeft) { - let newTopLeft = this.topLeft; - let newBottomLeft = this.bottomLeft; - let newTopRight = this.topRight; - let newBottomRight = this.bottomRight; - if (missingStartRows > 0) { - let top = isLeft ? this.topLeft : this.topRight; - let newMinY = Math.trunc(top.getY() - missingStartRows); - if (newMinY < 0) { - newMinY = 0; - } - let newTop = new ResultPoint(top.getX(), newMinY); - if (isLeft) { - newTopLeft = newTop; - } - else { - newTopRight = newTop; - } - } - if (missingEndRows > 0) { - let bottom = isLeft ? this.bottomLeft : this.bottomRight; - let newMaxY = Math.trunc(bottom.getY() + missingEndRows); - if (newMaxY >= this.image.getHeight()) { - newMaxY = this.image.getHeight() - 1; - } - let newBottom = new ResultPoint(bottom.getX(), newMaxY); - if (isLeft) { - newBottomLeft = newBottom; - } - else { - newBottomRight = newBottom; - } - } - return new BoundingBox(this.image, newTopLeft, newBottomLeft, newTopRight, newBottomRight); - } - getMinX() { - return this.minX; - } - getMaxX() { - return this.maxX; - } - getMinY() { - return this.minY; - } - getMaxY() { - return this.maxY; - } - getTopLeft() { - return this.topLeft; - } - getTopRight() { - return this.topRight; - } - getBottomLeft() { - return this.bottomLeft; - } - getBottomRight() { - return this.bottomRight; - } - } - - /* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - // package com.google.zxing.pdf417.decoder; - /** - * @author Guenther Grau - */ - /*final*/ class BarcodeMetadata { - constructor(columnCount, rowCountUpperPart, rowCountLowerPart, errorCorrectionLevel) { - this.columnCount = columnCount; - this.errorCorrectionLevel = errorCorrectionLevel; - this.rowCountUpperPart = rowCountUpperPart; - this.rowCountLowerPart = rowCountLowerPart; - this.rowCount = rowCountUpperPart + rowCountLowerPart; - } - getColumnCount() { - return this.columnCount; - } - getErrorCorrectionLevel() { - return this.errorCorrectionLevel; - } - getRowCount() { - return this.rowCount; - } - getRowCountUpperPart() { - return this.rowCountUpperPart; - } - getRowCountLowerPart() { - return this.rowCountLowerPart; - } - } - - /** - * Java Formatter class polyfill that works in the JS way. - */ - class Formatter { - constructor() { - this.buffer = ''; - } - /** - * - * @see https://stackoverflow.com/a/13439711/4367683 - * - * @param str - * @param arr - */ - static form(str, arr) { - let i = -1; - function callback(exp, p0, p1, p2, p3, p4) { - if (exp === '%%') - return '%'; - if (arr[++i] === undefined) - return undefined; - exp = p2 ? parseInt(p2.substr(1)) : undefined; - let base = p3 ? parseInt(p3.substr(1)) : undefined; - let val; - switch (p4) { - case 's': - val = arr[i]; - break; - case 'c': - val = arr[i][0]; - break; - case 'f': - val = parseFloat(arr[i]).toFixed(exp); - break; - case 'p': - val = parseFloat(arr[i]).toPrecision(exp); - break; - case 'e': - val = parseFloat(arr[i]).toExponential(exp); - break; - case 'x': - val = parseInt(arr[i]).toString(base ? base : 16); - break; - case 'd': - val = parseFloat(parseInt(arr[i], base ? base : 10).toPrecision(exp)).toFixed(0); - break; - } - val = typeof val === 'object' ? JSON.stringify(val) : (+val).toString(base); - let size = parseInt(p1); /* padding size */ - let ch = p1 && (p1[0] + '') === '0' ? '0' : ' '; /* isnull? */ - while (val.length < size) - val = p0 !== undefined ? val + ch : ch + val; /* isminus? */ - return val; - } - let regex = /%(-)?(0?[0-9]+)?([.][0-9]+)?([#][0-9]+)?([scfpexd%])/g; - return str.replace(regex, callback); - } - /** - * - * @param append The new string to append. - * @param args Argumets values to be formated. - */ - format(append, ...args) { - this.buffer += Formatter.form(append, args); - } - /** - * Returns the Formatter string value. - */ - toString() { - return this.buffer; - } - } - - /* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * @author Guenther Grau - */ - class DetectionResultColumn { - constructor(boundingBox) { - this.boundingBox = new BoundingBox(boundingBox); - // this.codewords = new Codeword[boundingBox.getMaxY() - boundingBox.getMinY() + 1]; - this.codewords = new Array(boundingBox.getMaxY() - boundingBox.getMinY() + 1); - } - /*final*/ getCodewordNearby(imageRow) { - let codeword = this.getCodeword(imageRow); - if (codeword != null) { - return codeword; - } - for (let i = 1; i < DetectionResultColumn.MAX_NEARBY_DISTANCE; i++) { - let nearImageRow = this.imageRowToCodewordIndex(imageRow) - i; - if (nearImageRow >= 0) { - codeword = this.codewords[nearImageRow]; - if (codeword != null) { - return codeword; - } - } - nearImageRow = this.imageRowToCodewordIndex(imageRow) + i; - if (nearImageRow < this.codewords.length) { - codeword = this.codewords[nearImageRow]; - if (codeword != null) { - return codeword; - } - } - } - return null; - } - /*final int*/ imageRowToCodewordIndex(imageRow) { - return imageRow - this.boundingBox.getMinY(); - } - /*final void*/ setCodeword(imageRow, codeword) { - this.codewords[this.imageRowToCodewordIndex(imageRow)] = codeword; - } - /*final*/ getCodeword(imageRow) { - return this.codewords[this.imageRowToCodewordIndex(imageRow)]; - } - /*final*/ getBoundingBox() { - return this.boundingBox; - } - /*final*/ getCodewords() { - return this.codewords; - } - // @Override - toString() { - const formatter = new Formatter(); - let row = 0; - for (const codeword of this.codewords) { - if (codeword == null) { - formatter.format('%3d: | %n', row++); - continue; - } - formatter.format('%3d: %3d|%3d%n', row++, codeword.getRowNumber(), codeword.getValue()); - } - return formatter.toString(); - } - } - DetectionResultColumn.MAX_NEARBY_DISTANCE = 5; - - /* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - // import java.util.ArrayList; - // import java.util.Collection; - // import java.util.HashMap; - // import java.util.Map; - // import java.util.Map.Entry; - /** - * @author Guenther Grau - */ - /*final*/ class BarcodeValue { - constructor() { - this.values = new Map(); - } - /** - * Add an occurrence of a value - */ - setValue(value) { - value = Math.trunc(value); - let confidence = this.values.get(value); - if (confidence == null) { - confidence = 0; - } - confidence++; - this.values.set(value, confidence); - } - /** - * Determines the maximum occurrence of a set value and returns all values which were set with this occurrence. - * @return an array of int, containing the values with the highest occurrence, or null, if no value was set - */ - getValue() { - let maxConfidence = -1; - let result = new Array(); - for (const [key, value] of this.values.entries()) { - const entry = { - getKey: () => key, - getValue: () => value, - }; - if (entry.getValue() > maxConfidence) { - maxConfidence = entry.getValue(); - result = []; - result.push(entry.getKey()); - } - else if (entry.getValue() === maxConfidence) { - result.push(entry.getKey()); - } - } - return PDF417Common.toIntArray(result); - } - getConfidence(value) { - return this.values.get(value); - } - } - - /* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * @author Guenther Grau - */ - /*final*/ class DetectionResultRowIndicatorColumn extends DetectionResultColumn { - constructor(boundingBox, isLeft) { - super(boundingBox); - this._isLeft = isLeft; - } - setRowNumbers() { - for (let codeword /*Codeword*/ of this.getCodewords()) { - if (codeword != null) { - codeword.setRowNumberAsRowIndicatorColumn(); - } - } - } - // TODO implement properly - // TODO maybe we should add missing codewords to store the correct row number to make - // finding row numbers for other columns easier - // use row height count to make detection of invalid row numbers more reliable - adjustCompleteIndicatorColumnRowNumbers(barcodeMetadata) { - let codewords = this.getCodewords(); - this.setRowNumbers(); - this.removeIncorrectCodewords(codewords, barcodeMetadata); - let boundingBox = this.getBoundingBox(); - let top = this._isLeft ? boundingBox.getTopLeft() : boundingBox.getTopRight(); - let bottom = this._isLeft ? boundingBox.getBottomLeft() : boundingBox.getBottomRight(); - let firstRow = this.imageRowToCodewordIndex(Math.trunc(top.getY())); - let lastRow = this.imageRowToCodewordIndex(Math.trunc(bottom.getY())); - // We need to be careful using the average row height. Barcode could be skewed so that we have smaller and - // taller rows - // float averageRowHeight = (lastRow - firstRow) / /*(float)*/ barcodeMetadata.getRowCount(); - let barcodeRow = -1; - let maxRowHeight = 1; - let currentRowHeight = 0; - for (let codewordsRow /*int*/ = firstRow; codewordsRow < lastRow; codewordsRow++) { - if (codewords[codewordsRow] == null) { - continue; - } - let codeword = codewords[codewordsRow]; - // float expectedRowNumber = (codewordsRow - firstRow) / averageRowHeight; - // if (Math.abs(codeword.getRowNumber() - expectedRowNumber) > 2) { - // SimpleLog.log(LEVEL.WARNING, - // "Removing codeword, rowNumberSkew too high, codeword[" + codewordsRow + "]: Expected Row: " + - // expectedRowNumber + ", RealRow: " + codeword.getRowNumber() + ", value: " + codeword.getValue()); - // codewords[codewordsRow] = null; - // } - let rowDifference = codeword.getRowNumber() - barcodeRow; - // TODO improve handling with case where first row indicator doesn't start with 0 - if (rowDifference === 0) { - currentRowHeight++; - } - else if (rowDifference === 1) { - maxRowHeight = Math.max(maxRowHeight, currentRowHeight); - currentRowHeight = 1; - barcodeRow = codeword.getRowNumber(); - } - else if (rowDifference < 0 || - codeword.getRowNumber() >= barcodeMetadata.getRowCount() || - rowDifference > codewordsRow) { - codewords[codewordsRow] = null; - } - else { - let checkedRows; - if (maxRowHeight > 2) { - checkedRows = (maxRowHeight - 2) * rowDifference; - } - else { - checkedRows = rowDifference; - } - let closePreviousCodewordFound = checkedRows >= codewordsRow; - for (let i /*int*/ = 1; i <= checkedRows && !closePreviousCodewordFound; i++) { - // there must be (height * rowDifference) number of codewords missing. For now we assume height = 1. - // This should hopefully get rid of most problems already. - closePreviousCodewordFound = codewords[codewordsRow - i] != null; - } - if (closePreviousCodewordFound) { - codewords[codewordsRow] = null; - } - else { - barcodeRow = codeword.getRowNumber(); - currentRowHeight = 1; - } - } - } - // return (int) (averageRowHeight + 0.5); - } - getRowHeights() { - let barcodeMetadata = this.getBarcodeMetadata(); - if (barcodeMetadata == null) { - return null; - } - this.adjustIncompleteIndicatorColumnRowNumbers(barcodeMetadata); - let result = new Int32Array(barcodeMetadata.getRowCount()); - for (let codeword /*Codeword*/ of this.getCodewords()) { - if (codeword != null) { - let rowNumber = codeword.getRowNumber(); - if (rowNumber >= result.length) { - // We have more rows than the barcode metadata allows for, ignore them. - continue; - } - result[rowNumber]++; - } // else throw exception? - } - return result; - } - // TODO maybe we should add missing codewords to store the correct row number to make - // finding row numbers for other columns easier - // use row height count to make detection of invalid row numbers more reliable - adjustIncompleteIndicatorColumnRowNumbers(barcodeMetadata) { - let boundingBox = this.getBoundingBox(); - let top = this._isLeft ? boundingBox.getTopLeft() : boundingBox.getTopRight(); - let bottom = this._isLeft ? boundingBox.getBottomLeft() : boundingBox.getBottomRight(); - let firstRow = this.imageRowToCodewordIndex(Math.trunc(top.getY())); - let lastRow = this.imageRowToCodewordIndex(Math.trunc(bottom.getY())); - // float averageRowHeight = (lastRow - firstRow) / /*(float)*/ barcodeMetadata.getRowCount(); - let codewords = this.getCodewords(); - let barcodeRow = -1; - for (let codewordsRow /*int*/ = firstRow; codewordsRow < lastRow; codewordsRow++) { - if (codewords[codewordsRow] == null) { - continue; - } - let codeword = codewords[codewordsRow]; - codeword.setRowNumberAsRowIndicatorColumn(); - let rowDifference = codeword.getRowNumber() - barcodeRow; - // TODO improve handling with case where first row indicator doesn't start with 0 - if (rowDifference === 0) ; - else if (rowDifference === 1) { - barcodeRow = codeword.getRowNumber(); - } - else if (codeword.getRowNumber() >= barcodeMetadata.getRowCount()) { - codewords[codewordsRow] = null; - } - else { - barcodeRow = codeword.getRowNumber(); - } - } - // return (int) (averageRowHeight + 0.5); - } - getBarcodeMetadata() { - let codewords = this.getCodewords(); - let barcodeColumnCount = new BarcodeValue(); - let barcodeRowCountUpperPart = new BarcodeValue(); - let barcodeRowCountLowerPart = new BarcodeValue(); - let barcodeECLevel = new BarcodeValue(); - for (let codeword /*Codeword*/ of codewords) { - if (codeword == null) { - continue; - } - codeword.setRowNumberAsRowIndicatorColumn(); - let rowIndicatorValue = codeword.getValue() % 30; - let codewordRowNumber = codeword.getRowNumber(); - if (!this._isLeft) { - codewordRowNumber += 2; - } - switch (codewordRowNumber % 3) { - case 0: - barcodeRowCountUpperPart.setValue(rowIndicatorValue * 3 + 1); - break; - case 1: - barcodeECLevel.setValue(rowIndicatorValue / 3); - barcodeRowCountLowerPart.setValue(rowIndicatorValue % 3); - break; - case 2: - barcodeColumnCount.setValue(rowIndicatorValue + 1); - break; - } - } - // Maybe we should check if we have ambiguous values? - if ((barcodeColumnCount.getValue().length === 0) || - (barcodeRowCountUpperPart.getValue().length === 0) || - (barcodeRowCountLowerPart.getValue().length === 0) || - (barcodeECLevel.getValue().length === 0) || - barcodeColumnCount.getValue()[0] < 1 || - barcodeRowCountUpperPart.getValue()[0] + barcodeRowCountLowerPart.getValue()[0] < PDF417Common.MIN_ROWS_IN_BARCODE || - barcodeRowCountUpperPart.getValue()[0] + barcodeRowCountLowerPart.getValue()[0] > PDF417Common.MAX_ROWS_IN_BARCODE) { - return null; - } - let barcodeMetadata = new BarcodeMetadata(barcodeColumnCount.getValue()[0], barcodeRowCountUpperPart.getValue()[0], barcodeRowCountLowerPart.getValue()[0], barcodeECLevel.getValue()[0]); - this.removeIncorrectCodewords(codewords, barcodeMetadata); - return barcodeMetadata; - } - removeIncorrectCodewords(codewords, barcodeMetadata) { - // Remove codewords which do not match the metadata - // TODO Maybe we should keep the incorrect codewords for the start and end positions? - for (let codewordRow /*int*/ = 0; codewordRow < codewords.length; codewordRow++) { - let codeword = codewords[codewordRow]; - if (codewords[codewordRow] == null) { - continue; - } - let rowIndicatorValue = codeword.getValue() % 30; - let codewordRowNumber = codeword.getRowNumber(); - if (codewordRowNumber > barcodeMetadata.getRowCount()) { - codewords[codewordRow] = null; - continue; - } - if (!this._isLeft) { - codewordRowNumber += 2; - } - switch (codewordRowNumber % 3) { - case 0: - if (rowIndicatorValue * 3 + 1 !== barcodeMetadata.getRowCountUpperPart()) { - codewords[codewordRow] = null; - } - break; - case 1: - if (Math.trunc(rowIndicatorValue / 3) !== barcodeMetadata.getErrorCorrectionLevel() || - rowIndicatorValue % 3 !== barcodeMetadata.getRowCountLowerPart()) { - codewords[codewordRow] = null; - } - break; - case 2: - if (rowIndicatorValue + 1 !== barcodeMetadata.getColumnCount()) { - codewords[codewordRow] = null; - } - break; - } - } - } - isLeft() { - return this._isLeft; - } - // @Override - toString() { - return 'IsLeft: ' + this._isLeft + '\n' + super.toString(); - } - } - - /* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * @author Guenther Grau - */ - /*final*/ class DetectionResult { - constructor(barcodeMetadata, boundingBox) { - /*final*/ this.ADJUST_ROW_NUMBER_SKIP = 2; - this.barcodeMetadata = barcodeMetadata; - this.barcodeColumnCount = barcodeMetadata.getColumnCount(); - this.boundingBox = boundingBox; - // this.detectionResultColumns = new DetectionResultColumn[this.barcodeColumnCount + 2]; - this.detectionResultColumns = new Array(this.barcodeColumnCount + 2); - } - getDetectionResultColumns() { - this.adjustIndicatorColumnRowNumbers(this.detectionResultColumns[0]); - this.adjustIndicatorColumnRowNumbers(this.detectionResultColumns[this.barcodeColumnCount + 1]); - let unadjustedCodewordCount = PDF417Common.MAX_CODEWORDS_IN_BARCODE; - let previousUnadjustedCount; - do { - previousUnadjustedCount = unadjustedCodewordCount; - unadjustedCodewordCount = this.adjustRowNumbersAndGetCount(); - } while (unadjustedCodewordCount > 0 && unadjustedCodewordCount < previousUnadjustedCount); - return this.detectionResultColumns; - } - adjustIndicatorColumnRowNumbers(detectionResultColumn) { - if (detectionResultColumn != null) { - detectionResultColumn - .adjustCompleteIndicatorColumnRowNumbers(this.barcodeMetadata); - } - } - // TODO ensure that no detected codewords with unknown row number are left - // we should be able to estimate the row height and use it as a hint for the row number - // we should also fill the rows top to bottom and bottom to top - /** - * @return number of codewords which don't have a valid row number. Note that the count is not accurate as codewords - * will be counted several times. It just serves as an indicator to see when we can stop adjusting row numbers - */ - adjustRowNumbersAndGetCount() { - let unadjustedCount = this.adjustRowNumbersByRow(); - if (unadjustedCount === 0) { - return 0; - } - for (let barcodeColumn /*int*/ = 1; barcodeColumn < this.barcodeColumnCount + 1; barcodeColumn++) { - let codewords = this.detectionResultColumns[barcodeColumn].getCodewords(); - for (let codewordsRow /*int*/ = 0; codewordsRow < codewords.length; codewordsRow++) { - if (codewords[codewordsRow] == null) { - continue; - } - if (!codewords[codewordsRow].hasValidRowNumber()) { - this.adjustRowNumbers(barcodeColumn, codewordsRow, codewords); - } - } - } - return unadjustedCount; - } - adjustRowNumbersByRow() { - this.adjustRowNumbersFromBothRI(); - // TODO we should only do full row adjustments if row numbers of left and right row indicator column match. - // Maybe it's even better to calculated the height (rows: d) and divide it by the number of barcode - // rows. This, together with the LRI and RRI row numbers should allow us to get a good estimate where a row - // number starts and ends. - let unadjustedCount = this.adjustRowNumbersFromLRI(); - return unadjustedCount + this.adjustRowNumbersFromRRI(); - } - adjustRowNumbersFromBothRI() { - if (this.detectionResultColumns[0] == null || this.detectionResultColumns[this.barcodeColumnCount + 1] == null) { - return; - } - let LRIcodewords = this.detectionResultColumns[0].getCodewords(); - let RRIcodewords = this.detectionResultColumns[this.barcodeColumnCount + 1].getCodewords(); - for (let codewordsRow /*int*/ = 0; codewordsRow < LRIcodewords.length; codewordsRow++) { - if (LRIcodewords[codewordsRow] != null && - RRIcodewords[codewordsRow] != null && - LRIcodewords[codewordsRow].getRowNumber() === RRIcodewords[codewordsRow].getRowNumber()) { - for (let barcodeColumn /*int*/ = 1; barcodeColumn <= this.barcodeColumnCount; barcodeColumn++) { - let codeword = this.detectionResultColumns[barcodeColumn].getCodewords()[codewordsRow]; - if (codeword == null) { - continue; - } - codeword.setRowNumber(LRIcodewords[codewordsRow].getRowNumber()); - if (!codeword.hasValidRowNumber()) { - this.detectionResultColumns[barcodeColumn].getCodewords()[codewordsRow] = null; - } - } - } - } - } - adjustRowNumbersFromRRI() { - if (this.detectionResultColumns[this.barcodeColumnCount + 1] == null) { - return 0; - } - let unadjustedCount = 0; - let codewords = this.detectionResultColumns[this.barcodeColumnCount + 1].getCodewords(); - for (let codewordsRow /*int*/ = 0; codewordsRow < codewords.length; codewordsRow++) { - if (codewords[codewordsRow] == null) { - continue; - } - let rowIndicatorRowNumber = codewords[codewordsRow].getRowNumber(); - let invalidRowCounts = 0; - for (let barcodeColumn /*int*/ = this.barcodeColumnCount + 1; barcodeColumn > 0 && invalidRowCounts < this.ADJUST_ROW_NUMBER_SKIP; barcodeColumn--) { - let codeword = this.detectionResultColumns[barcodeColumn].getCodewords()[codewordsRow]; - if (codeword != null) { - invalidRowCounts = DetectionResult.adjustRowNumberIfValid(rowIndicatorRowNumber, invalidRowCounts, codeword); - if (!codeword.hasValidRowNumber()) { - unadjustedCount++; - } - } - } - } - return unadjustedCount; - } - adjustRowNumbersFromLRI() { - if (this.detectionResultColumns[0] == null) { - return 0; - } - let unadjustedCount = 0; - let codewords = this.detectionResultColumns[0].getCodewords(); - for (let codewordsRow /*int*/ = 0; codewordsRow < codewords.length; codewordsRow++) { - if (codewords[codewordsRow] == null) { - continue; - } - let rowIndicatorRowNumber = codewords[codewordsRow].getRowNumber(); - let invalidRowCounts = 0; - for (let barcodeColumn /*int*/ = 1; barcodeColumn < this.barcodeColumnCount + 1 && invalidRowCounts < this.ADJUST_ROW_NUMBER_SKIP; barcodeColumn++) { - let codeword = this.detectionResultColumns[barcodeColumn].getCodewords()[codewordsRow]; - if (codeword != null) { - invalidRowCounts = DetectionResult.adjustRowNumberIfValid(rowIndicatorRowNumber, invalidRowCounts, codeword); - if (!codeword.hasValidRowNumber()) { - unadjustedCount++; - } - } - } - } - return unadjustedCount; - } - static adjustRowNumberIfValid(rowIndicatorRowNumber, invalidRowCounts, codeword) { - if (codeword == null) { - return invalidRowCounts; - } - if (!codeword.hasValidRowNumber()) { - if (codeword.isValidRowNumber(rowIndicatorRowNumber)) { - codeword.setRowNumber(rowIndicatorRowNumber); - invalidRowCounts = 0; - } - else { - ++invalidRowCounts; - } - } - return invalidRowCounts; - } - adjustRowNumbers(barcodeColumn, codewordsRow, codewords) { - if (!this.detectionResultColumns[barcodeColumn - 1]) { - return; - } - let codeword = codewords[codewordsRow]; - let previousColumnCodewords = this.detectionResultColumns[barcodeColumn - 1].getCodewords(); - let nextColumnCodewords = previousColumnCodewords; - if (this.detectionResultColumns[barcodeColumn + 1] != null) { - nextColumnCodewords = this.detectionResultColumns[barcodeColumn + 1].getCodewords(); - } - // let otherCodewords: Codeword[] = new Codeword[14]; - let otherCodewords = new Array(14); - otherCodewords[2] = previousColumnCodewords[codewordsRow]; - otherCodewords[3] = nextColumnCodewords[codewordsRow]; - if (codewordsRow > 0) { - otherCodewords[0] = codewords[codewordsRow - 1]; - otherCodewords[4] = previousColumnCodewords[codewordsRow - 1]; - otherCodewords[5] = nextColumnCodewords[codewordsRow - 1]; - } - if (codewordsRow > 1) { - otherCodewords[8] = codewords[codewordsRow - 2]; - otherCodewords[10] = previousColumnCodewords[codewordsRow - 2]; - otherCodewords[11] = nextColumnCodewords[codewordsRow - 2]; - } - if (codewordsRow < codewords.length - 1) { - otherCodewords[1] = codewords[codewordsRow + 1]; - otherCodewords[6] = previousColumnCodewords[codewordsRow + 1]; - otherCodewords[7] = nextColumnCodewords[codewordsRow + 1]; - } - if (codewordsRow < codewords.length - 2) { - otherCodewords[9] = codewords[codewordsRow + 2]; - otherCodewords[12] = previousColumnCodewords[codewordsRow + 2]; - otherCodewords[13] = nextColumnCodewords[codewordsRow + 2]; - } - for (let otherCodeword of otherCodewords) { - if (DetectionResult.adjustRowNumber(codeword, otherCodeword)) { - return; - } - } - } - /** - * @return true, if row number was adjusted, false otherwise - */ - static adjustRowNumber(codeword, otherCodeword) { - if (otherCodeword == null) { - return false; - } - if (otherCodeword.hasValidRowNumber() && otherCodeword.getBucket() === codeword.getBucket()) { - codeword.setRowNumber(otherCodeword.getRowNumber()); - return true; - } - return false; - } - getBarcodeColumnCount() { - return this.barcodeColumnCount; - } - getBarcodeRowCount() { - return this.barcodeMetadata.getRowCount(); - } - getBarcodeECLevel() { - return this.barcodeMetadata.getErrorCorrectionLevel(); - } - setBoundingBox(boundingBox) { - this.boundingBox = boundingBox; - } - getBoundingBox() { - return this.boundingBox; - } - setDetectionResultColumn(barcodeColumn, detectionResultColumn) { - this.detectionResultColumns[barcodeColumn] = detectionResultColumn; - } - getDetectionResultColumn(barcodeColumn) { - return this.detectionResultColumns[barcodeColumn]; - } - // @Override - toString() { - let rowIndicatorColumn = this.detectionResultColumns[0]; - if (rowIndicatorColumn == null) { - rowIndicatorColumn = this.detectionResultColumns[this.barcodeColumnCount + 1]; - } - // try ( - let formatter = new Formatter(); - // ) { - for (let codewordsRow /*int*/ = 0; codewordsRow < rowIndicatorColumn.getCodewords().length; codewordsRow++) { - formatter.format('CW %3d:', codewordsRow); - for (let barcodeColumn /*int*/ = 0; barcodeColumn < this.barcodeColumnCount + 2; barcodeColumn++) { - if (this.detectionResultColumns[barcodeColumn] == null) { - formatter.format(' | '); - continue; - } - let codeword = this.detectionResultColumns[barcodeColumn].getCodewords()[codewordsRow]; - if (codeword == null) { - formatter.format(' | '); - continue; - } - formatter.format(' %3d|%3d', codeword.getRowNumber(), codeword.getValue()); - } - formatter.format('%n'); - } - return formatter.toString(); - // } - } - } - - /* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - // package com.google.zxing.pdf417.decoder; - /** - * @author Guenther Grau - */ - /*final*/ class Codeword { - constructor(startX, endX, bucket, value) { - this.rowNumber = Codeword.BARCODE_ROW_UNKNOWN; - this.startX = Math.trunc(startX); - this.endX = Math.trunc(endX); - this.bucket = Math.trunc(bucket); - this.value = Math.trunc(value); - } - hasValidRowNumber() { - return this.isValidRowNumber(this.rowNumber); - } - isValidRowNumber(rowNumber) { - return rowNumber !== Codeword.BARCODE_ROW_UNKNOWN && this.bucket === (rowNumber % 3) * 3; - } - setRowNumberAsRowIndicatorColumn() { - this.rowNumber = Math.trunc((Math.trunc(this.value / 30)) * 3 + Math.trunc(this.bucket / 3)); - } - getWidth() { - return this.endX - this.startX; - } - getStartX() { - return this.startX; - } - getEndX() { - return this.endX; - } - getBucket() { - return this.bucket; - } - getValue() { - return this.value; - } - getRowNumber() { - return this.rowNumber; - } - setRowNumber(rowNumber) { - this.rowNumber = rowNumber; - } - // @Override - toString() { - return this.rowNumber + '|' + this.value; - } - } - Codeword.BARCODE_ROW_UNKNOWN = -1; - - /* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * @author Guenther Grau - * @author creatale GmbH (christoph.schulz@creatale.de) - */ - /*final*/ class PDF417CodewordDecoder { - /* @note - * this action have to be performed before first use of class - * - static constructor - * working with 32bit float (based from Java logic) - */ - static initialize() { - // Pre-computes the symbol ratio table. - for ( /*int*/let i = 0; i < PDF417Common.SYMBOL_TABLE.length; i++) { - let currentSymbol = PDF417Common.SYMBOL_TABLE[i]; - let currentBit = currentSymbol & 0x1; - for ( /*int*/let j = 0; j < PDF417Common.BARS_IN_MODULE; j++) { - let size = 0.0; - while ((currentSymbol & 0x1) === currentBit) { - size += 1.0; - currentSymbol >>= 1; - } - currentBit = currentSymbol & 0x1; - if (!PDF417CodewordDecoder.RATIOS_TABLE[i]) { - PDF417CodewordDecoder.RATIOS_TABLE[i] = new Array(PDF417Common.BARS_IN_MODULE); - } - PDF417CodewordDecoder.RATIOS_TABLE[i][PDF417Common.BARS_IN_MODULE - j - 1] = Math.fround(size / PDF417Common.MODULES_IN_CODEWORD); - } - } - this.bSymbolTableReady = true; - } - static getDecodedValue(moduleBitCount) { - let decodedValue = PDF417CodewordDecoder.getDecodedCodewordValue(PDF417CodewordDecoder.sampleBitCounts(moduleBitCount)); - if (decodedValue !== -1) { - return decodedValue; - } - return PDF417CodewordDecoder.getClosestDecodedValue(moduleBitCount); - } - static sampleBitCounts(moduleBitCount) { - let bitCountSum = MathUtils.sum(moduleBitCount); - let result = new Int32Array(PDF417Common.BARS_IN_MODULE); - let bitCountIndex = 0; - let sumPreviousBits = 0; - for ( /*int*/let i = 0; i < PDF417Common.MODULES_IN_CODEWORD; i++) { - let sampleIndex = bitCountSum / (2 * PDF417Common.MODULES_IN_CODEWORD) + - (i * bitCountSum) / PDF417Common.MODULES_IN_CODEWORD; - if (sumPreviousBits + moduleBitCount[bitCountIndex] <= sampleIndex) { - sumPreviousBits += moduleBitCount[bitCountIndex]; - bitCountIndex++; - } - result[bitCountIndex]++; - } - return result; - } - static getDecodedCodewordValue(moduleBitCount) { - let decodedValue = PDF417CodewordDecoder.getBitValue(moduleBitCount); - return PDF417Common.getCodeword(decodedValue) === -1 ? -1 : decodedValue; - } - static getBitValue(moduleBitCount) { - let result = /*long*/ 0; - for (let /*int*/ i = 0; i < moduleBitCount.length; i++) { - for ( /*int*/let bit = 0; bit < moduleBitCount[i]; bit++) { - result = (result << 1) | (i % 2 === 0 ? 1 : 0); - } - } - return Math.trunc(result); - } - // working with 32bit float (as in Java) - static getClosestDecodedValue(moduleBitCount) { - let bitCountSum = MathUtils.sum(moduleBitCount); - let bitCountRatios = new Array(PDF417Common.BARS_IN_MODULE); - if (bitCountSum > 1) { - for (let /*int*/ i = 0; i < bitCountRatios.length; i++) { - bitCountRatios[i] = Math.fround(moduleBitCount[i] / bitCountSum); - } - } - let bestMatchError = Float.MAX_VALUE; - let bestMatch = -1; - if (!this.bSymbolTableReady) { - PDF417CodewordDecoder.initialize(); - } - for ( /*int*/let j = 0; j < PDF417CodewordDecoder.RATIOS_TABLE.length; j++) { - let error = 0.0; - let ratioTableRow = PDF417CodewordDecoder.RATIOS_TABLE[j]; - for ( /*int*/let k = 0; k < PDF417Common.BARS_IN_MODULE; k++) { - let diff = Math.fround(ratioTableRow[k] - bitCountRatios[k]); - error += Math.fround(diff * diff); - if (error >= bestMatchError) { - break; - } - } - if (error < bestMatchError) { - bestMatchError = error; - bestMatch = PDF417Common.SYMBOL_TABLE[j]; - } - } - return bestMatch; - } - } - // flag that the table is ready for use - PDF417CodewordDecoder.bSymbolTableReady = false; - PDF417CodewordDecoder.RATIOS_TABLE = new Array(PDF417Common.SYMBOL_TABLE.length).map(x => x = new Array(PDF417Common.BARS_IN_MODULE)); - - /* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - // package com.google.zxing.pdf417; - /** - * @author Guenther Grau - */ - /*public final*/ class PDF417ResultMetadata { - constructor() { - this.segmentCount = -1; - this.fileSize = -1; - this.timestamp = -1; - this.checksum = -1; - } - /** - * The Segment ID represents the segment of the whole file distributed over different symbols. - * - * @return File segment index - */ - getSegmentIndex() { - return this.segmentIndex; - } - setSegmentIndex(segmentIndex) { - this.segmentIndex = segmentIndex; - } - /** - * Is the same for each related PDF417 symbol - * - * @return File ID - */ - getFileId() { - return this.fileId; - } - setFileId(fileId) { - this.fileId = fileId; - } - /** - * @return always null - * @deprecated use dedicated already parsed fields - */ - // @Deprecated - getOptionalData() { - return this.optionalData; - } - /** - * @param optionalData old optional data format as int array - * @deprecated parse and use new fields - */ - // @Deprecated - setOptionalData(optionalData) { - this.optionalData = optionalData; - } - /** - * @return true if it is the last segment - */ - isLastSegment() { - return this.lastSegment; - } - setLastSegment(lastSegment) { - this.lastSegment = lastSegment; - } - /** - * @return count of segments, -1 if not set - */ - getSegmentCount() { - return this.segmentCount; - } - setSegmentCount(segmentCount /*int*/) { - this.segmentCount = segmentCount; - } - getSender() { - return this.sender || null; - } - setSender(sender) { - this.sender = sender; - } - getAddressee() { - return this.addressee || null; - } - setAddressee(addressee) { - this.addressee = addressee; - } - /** - * Filename of the encoded file - * - * @return filename - */ - getFileName() { - return this.fileName; - } - setFileName(fileName) { - this.fileName = fileName; - } - /** - * filesize in bytes of the encoded file - * - * @return filesize in bytes, -1 if not set - */ - getFileSize() { - return this.fileSize; - } - setFileSize(fileSize /*long*/) { - this.fileSize = fileSize; - } - /** - * 16-bit CRC checksum using CCITT-16 - * - * @return crc checksum, -1 if not set - */ - getChecksum() { - return this.checksum; - } - setChecksum(checksum /*int*/) { - this.checksum = checksum; - } - /** - * unix epock timestamp, elapsed seconds since 1970-01-01 - * - * @return elapsed seconds, -1 if not set - */ - getTimestamp() { - return this.timestamp; - } - setTimestamp(timestamp /*long*/) { - this.timestamp = timestamp; - } - } - - /** - * Ponyfill for Java's Long class. - */ - class Long { - /** - * Parses a string to a number, since JS has no really Int64. - * - * @param num Numeric string. - * @param radix Destination radix. - */ - static parseLong(num, radix = undefined) { - return parseInt(num, radix); - } - } - - /** - * Custom Error class of type Exception. - */ - class NullPointerException extends Exception { - } - NullPointerException.kind = 'NullPointerException'; - - /* - * Copyright (c) 1994, 2004, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - // package java.io; - /** - * This abstract class is the superclass of all classes representing - * an output stream of bytes. An output stream accepts output bytes - * and sends them to some sink. - *

    - * Applications that need to define a subclass of - * OutputStream must always provide at least a method - * that writes one byte of output. - * - * @author Arthur van Hoff - * @see java.io.BufferedOutputStream - * @see java.io.ByteArrayOutputStream - * @see java.io.DataOutputStream - * @see java.io.FilterOutputStream - * @see java.io.InputStream - * @see java.io.OutputStream#write(int) - * @since JDK1.0 - */ - /*public*/ class OutputStream /*implements Closeable, Flushable*/ { - /** - * Writes b.length bytes from the specified byte array - * to this output stream. The general contract for write(b) - * is that it should have exactly the same effect as the call - * write(b, 0, b.length). - * - * @param b the data. - * @exception IOException if an I/O error occurs. - * @see java.io.OutputStream#write(byte[], int, int) - */ - writeBytes(b) { - this.writeBytesOffset(b, 0, b.length); - } - /** - * Writes len bytes from the specified byte array - * starting at offset off to this output stream. - * The general contract for write(b, off, len) is that - * some of the bytes in the array b are written to the - * output stream in order; element b[off] is the first - * byte written and b[off+len-1] is the last byte written - * by this operation. - *

    - * The write method of OutputStream calls - * the write method of one argument on each of the bytes to be - * written out. Subclasses are encouraged to override this method and - * provide a more efficient implementation. - *

    - * If b is null, a - * NullPointerException is thrown. - *

    - * If off is negative, or len is negative, or - * off+len is greater than the length of the array - * b, then an IndexOutOfBoundsException is thrown. - * - * @param b the data. - * @param off the start offset in the data. - * @param len the number of bytes to write. - * @exception IOException if an I/O error occurs. In particular, - * an IOException is thrown if the output - * stream is closed. - */ - writeBytesOffset(b, off, len) { - if (b == null) { - throw new NullPointerException(); - } - else if ((off < 0) || (off > b.length) || (len < 0) || - ((off + len) > b.length) || ((off + len) < 0)) { - throw new IndexOutOfBoundsException(); - } - else if (len === 0) { - return; - } - for (let i = 0; i < len; i++) { - this.write(b[off + i]); - } - } - /** - * Flushes this output stream and forces any buffered output bytes - * to be written out. The general contract of flush is - * that calling it is an indication that, if any bytes previously - * written have been buffered by the implementation of the output - * stream, such bytes should immediately be written to their - * intended destination. - *

    - * If the intended destination of this stream is an abstraction provided by - * the underlying operating system, for example a file, then flushing the - * stream guarantees only that bytes previously written to the stream are - * passed to the operating system for writing; it does not guarantee that - * they are actually written to a physical device such as a disk drive. - *

    - * The flush method of OutputStream does nothing. - * - * @exception IOException if an I/O error occurs. - */ - flush() { - } - /** - * Closes this output stream and releases any system resources - * associated with this stream. The general contract of close - * is that it closes the output stream. A closed stream cannot perform - * output operations and cannot be reopened. - *

    - * The close method of OutputStream does nothing. - * - * @exception IOException if an I/O error occurs. - */ - close() { - } - } - - /** - * Custom Error class of type Exception. - */ - class OutOfMemoryError extends Exception { - } - - /* - * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - /** - * This class implements an output stream in which the data is - * written into a byte array. The buffer automatically grows as data - * is written to it. - * The data can be retrieved using toByteArray() and - * toString(). - *

    - * Closing a ByteArrayOutputStream has no effect. The methods in - * this class can be called after the stream has been closed without - * generating an IOException. - * - * @author Arthur van Hoff - * @since JDK1.0 - */ - /*public*/ class ByteArrayOutputStream extends OutputStream { - /** - * Creates a new byte array output stream. The buffer capacity is - * initially 32 bytes, though its size increases if necessary. - */ - // public constructor() { - // this(32); - // } - /** - * Creates a new byte array output stream, with a buffer capacity of - * the specified size, in bytes. - * - * @param size the initial size. - * @exception IllegalArgumentException if size is negative. - */ - constructor(size = 32) { - super(); - /** - * The number of valid bytes in the buffer. - */ - this.count = 0; - if (size < 0) { - throw new IllegalArgumentException('Negative initial size: ' - + size); - } - this.buf = new Uint8Array(size); - } - /** - * Increases the capacity if necessary to ensure that it can hold - * at least the number of elements specified by the minimum - * capacity argument. - * - * @param minCapacity the desired minimum capacity - * @throws OutOfMemoryError if {@code minCapacity < 0}. This is - * interpreted as a request for the unsatisfiably large capacity - * {@code (long) Integer.MAX_VALUE + (minCapacity - Integer.MAX_VALUE)}. - */ - ensureCapacity(minCapacity) { - // overflow-conscious code - if (minCapacity - this.buf.length > 0) - this.grow(minCapacity); - } - /** - * Increases the capacity to ensure that it can hold at least the - * number of elements specified by the minimum capacity argument. - * - * @param minCapacity the desired minimum capacity - */ - grow(minCapacity) { - // overflow-conscious code - let oldCapacity = this.buf.length; - let newCapacity = oldCapacity << 1; - if (newCapacity - minCapacity < 0) - newCapacity = minCapacity; - if (newCapacity < 0) { - if (minCapacity < 0) // overflow - throw new OutOfMemoryError(); - newCapacity = Integer.MAX_VALUE; - } - this.buf = Arrays.copyOfUint8Array(this.buf, newCapacity); - } - /** - * Writes the specified byte to this byte array output stream. - * - * @param b the byte to be written. - */ - write(b) { - this.ensureCapacity(this.count + 1); - this.buf[this.count] = /*(byte)*/ b; - this.count += 1; - } - /** - * Writes len bytes from the specified byte array - * starting at offset off to this byte array output stream. - * - * @param b the data. - * @param off the start offset in the data. - * @param len the number of bytes to write. - */ - writeBytesOffset(b, off, len) { - if ((off < 0) || (off > b.length) || (len < 0) || - ((off + len) - b.length > 0)) { - throw new IndexOutOfBoundsException(); - } - this.ensureCapacity(this.count + len); - System.arraycopy(b, off, this.buf, this.count, len); - this.count += len; - } - /** - * Writes the complete contents of this byte array output stream to - * the specified output stream argument, as if by calling the output - * stream's write method using out.write(buf, 0, count). - * - * @param out the output stream to which to write the data. - * @exception IOException if an I/O error occurs. - */ - writeTo(out) { - out.writeBytesOffset(this.buf, 0, this.count); - } - /** - * Resets the count field of this byte array output - * stream to zero, so that all currently accumulated output in the - * output stream is discarded. The output stream can be used again, - * reusing the already allocated buffer space. - * - * @see java.io.ByteArrayInputStream#count - */ - reset() { - this.count = 0; - } - /** - * Creates a newly allocated byte array. Its size is the current - * size of this output stream and the valid contents of the buffer - * have been copied into it. - * - * @return the current contents of this output stream, as a byte array. - * @see java.io.ByteArrayOutputStream#size() - */ - toByteArray() { - return Arrays.copyOfUint8Array(this.buf, this.count); - } - /** - * Returns the current size of the buffer. - * - * @return the value of the count field, which is the number - * of valid bytes in this output stream. - * @see java.io.ByteArrayOutputStream#count - */ - size() { - return this.count; - } - toString(param) { - if (!param) { - return this.toString_void(); - } - if (typeof param === 'string') { - return this.toString_string(param); - } - return this.toString_number(param); - } - /** - * Converts the buffer's contents into a string decoding bytes using the - * platform's default character set. The length of the new String - * is a function of the character set, and hence may not be equal to the - * size of the buffer. - * - *

    This method always replaces malformed-input and unmappable-character - * sequences with the default replacement string for the platform's - * default character set. The {@linkplain java.nio.charset.CharsetDecoder} - * class should be used when more control over the decoding process is - * required. - * - * @return String decoded from the buffer's contents. - * @since JDK1.1 - */ - toString_void() { - return new String(this.buf /*, 0, this.count*/).toString(); - } - /** - * Converts the buffer's contents into a string by decoding the bytes using - * the specified {@link java.nio.charset.Charset charsetName}. The length of - * the new String is a function of the charset, and hence may not be - * equal to the length of the byte array. - * - *

    This method always replaces malformed-input and unmappable-character - * sequences with this charset's default replacement string. The {@link - * java.nio.charset.CharsetDecoder} class should be used when more control - * over the decoding process is required. - * - * @param charsetName the name of a supported - * {@linkplain java.nio.charset.Charset charset} - * @return String decoded from the buffer's contents. - * @exception UnsupportedEncodingException - * If the named charset is not supported - * @since JDK1.1 - */ - toString_string(charsetName) { - return new String(this.buf /*, 0, this.count, charsetName*/).toString(); - } - /** - * Creates a newly allocated string. Its size is the current size of - * the output stream and the valid contents of the buffer have been - * copied into it. Each character c in the resulting string is - * constructed from the corresponding element b in the byte - * array such that: - *

    -         *     c == (char)(((hibyte & 0xff) << 8) | (b & 0xff))
    -         * 
    - * - * @deprecated This method does not properly convert bytes into characters. - * As of JDK 1.1, the preferred way to do this is via the - * toString(String enc) method, which takes an encoding-name - * argument, or the toString() method, which uses the - * platform's default character encoding. - * - * @param hibyte the high byte of each resulting Unicode character. - * @return the current contents of the output stream, as a string. - * @see java.io.ByteArrayOutputStream#size() - * @see java.io.ByteArrayOutputStream#toString(String) - * @see java.io.ByteArrayOutputStream#toString() - */ - // @Deprecated - toString_number(hibyte) { - return new String(this.buf /*, hibyte, 0, this.count*/).toString(); - } - /** - * Closing a ByteArrayOutputStream has no effect. The methods in - * this class can be called after the stream has been closed without - * generating an IOException. - *

    - * - * @throws IOException - */ - close() { - } - } - - /* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /*private*/ var Mode$2; - (function (Mode) { - Mode[Mode["ALPHA"] = 0] = "ALPHA"; - Mode[Mode["LOWER"] = 1] = "LOWER"; - Mode[Mode["MIXED"] = 2] = "MIXED"; - Mode[Mode["PUNCT"] = 3] = "PUNCT"; - Mode[Mode["ALPHA_SHIFT"] = 4] = "ALPHA_SHIFT"; - Mode[Mode["PUNCT_SHIFT"] = 5] = "PUNCT_SHIFT"; - })(Mode$2 || (Mode$2 = {})); - /** - * Indirectly access the global BigInt constructor, it - * allows browsers that doesn't support BigInt to run - * the library without breaking due to "undefined BigInt" - * errors. - */ - function getBigIntConstructor() { - if (typeof window !== 'undefined') { - return window['BigInt'] || null; - } - if (typeof global !== 'undefined') { - return global['BigInt'] || null; - } - if (typeof self !== 'undefined') { - return self['BigInt'] || null; - } - throw new Error('Can\'t search globals for BigInt!'); - } - /** - * Used to store the BigInt constructor. - */ - let BigInteger; - /** - * This function creates a bigint value. It allows browsers - * that doesn't support BigInt to run the rest of the library - * by not directly accessing the BigInt constructor. - */ - function createBigInt(num) { - if (typeof BigInteger === 'undefined') { - BigInteger = getBigIntConstructor(); - } - if (BigInteger === null) { - throw new Error('BigInt is not supported!'); - } - return BigInteger(num); - } - function getEXP900() { - // in Java - array with length = 16 - let EXP900 = []; - EXP900[0] = createBigInt(1); - let nineHundred = createBigInt(900); - EXP900[1] = nineHundred; - // in Java - array with length = 16 - for (let i /*int*/ = 2; i < 16; i++) { - EXP900[i] = EXP900[i - 1] * nineHundred; - } - return EXP900; - } - /** - *

    This class contains the methods for decoding the PDF417 codewords.

    - * - * @author SITA Lab (kevin.osullivan@sita.aero) - * @author Guenther Grau - */ - /*final*/ class DecodedBitStreamParser$2 { - // private DecodedBitStreamParser() { - // } - /** - * - * @param codewords - * @param ecLevel - * - * @throws FormatException - */ - static decode(codewords, ecLevel) { - // pass encoding to result (will be used for decode symbols in byte mode) - let result = new StringBuilder(''); - // let encoding: Charset = StandardCharsets.ISO_8859_1; - let encoding = CharacterSetECI.ISO8859_1; - /** - * @note the next command is specific from this TypeScript library - * because TS can't properly cast some values to char and - * convert it to string later correctly due to encoding - * differences from Java version. As reported here: - * https://github.com/zxing-js/library/pull/264/files#r382831593 - */ - result.enableDecoding(encoding); - // Get compaction mode - let codeIndex = 1; - let code = codewords[codeIndex++]; - let resultMetadata = new PDF417ResultMetadata(); - while (codeIndex < codewords[0]) { - switch (code) { - case DecodedBitStreamParser$2.TEXT_COMPACTION_MODE_LATCH: - codeIndex = DecodedBitStreamParser$2.textCompaction(codewords, codeIndex, result); - break; - case DecodedBitStreamParser$2.BYTE_COMPACTION_MODE_LATCH: - case DecodedBitStreamParser$2.BYTE_COMPACTION_MODE_LATCH_6: - codeIndex = DecodedBitStreamParser$2.byteCompaction(code, codewords, encoding, codeIndex, result); - break; - case DecodedBitStreamParser$2.MODE_SHIFT_TO_BYTE_COMPACTION_MODE: - result.append(/*(char)*/ codewords[codeIndex++]); - break; - case DecodedBitStreamParser$2.NUMERIC_COMPACTION_MODE_LATCH: - codeIndex = DecodedBitStreamParser$2.numericCompaction(codewords, codeIndex, result); - break; - case DecodedBitStreamParser$2.ECI_CHARSET: - let charsetECI = CharacterSetECI.getCharacterSetECIByValue(codewords[codeIndex++]); - // encoding = Charset.forName(charsetECI.getName()); - break; - case DecodedBitStreamParser$2.ECI_GENERAL_PURPOSE: - // Can't do anything with generic ECI; skip its 2 characters - codeIndex += 2; - break; - case DecodedBitStreamParser$2.ECI_USER_DEFINED: - // Can't do anything with user ECI; skip its 1 character - codeIndex++; - break; - case DecodedBitStreamParser$2.BEGIN_MACRO_PDF417_CONTROL_BLOCK: - codeIndex = DecodedBitStreamParser$2.decodeMacroBlock(codewords, codeIndex, resultMetadata); - break; - case DecodedBitStreamParser$2.BEGIN_MACRO_PDF417_OPTIONAL_FIELD: - case DecodedBitStreamParser$2.MACRO_PDF417_TERMINATOR: - // Should not see these outside a macro block - throw new FormatException(); - default: - // Default to text compaction. During testing numerous barcodes - // appeared to be missing the starting mode. In these cases defaulting - // to text compaction seems to work. - codeIndex--; - codeIndex = DecodedBitStreamParser$2.textCompaction(codewords, codeIndex, result); - break; - } - if (codeIndex < codewords.length) { - code = codewords[codeIndex++]; - } - else { - throw FormatException.getFormatInstance(); - } - } - if (result.length() === 0) { - throw FormatException.getFormatInstance(); - } - let decoderResult = new DecoderResult(null, result.toString(), null, ecLevel); - decoderResult.setOther(resultMetadata); - return decoderResult; - } - /** - * - * @param int - * @param param1 - * @param codewords - * @param int - * @param codeIndex - * @param PDF417ResultMetadata - * @param resultMetadata - * - * @throws FormatException - */ - // @SuppressWarnings("deprecation") - static decodeMacroBlock(codewords, codeIndex, resultMetadata) { - if (codeIndex + DecodedBitStreamParser$2.NUMBER_OF_SEQUENCE_CODEWORDS > codewords[0]) { - // we must have at least two bytes left for the segment index - throw FormatException.getFormatInstance(); - } - let segmentIndexArray = new Int32Array(DecodedBitStreamParser$2.NUMBER_OF_SEQUENCE_CODEWORDS); - for (let i /*int*/ = 0; i < DecodedBitStreamParser$2.NUMBER_OF_SEQUENCE_CODEWORDS; i++, codeIndex++) { - segmentIndexArray[i] = codewords[codeIndex]; - } - resultMetadata.setSegmentIndex(Integer.parseInt(DecodedBitStreamParser$2.decodeBase900toBase10(segmentIndexArray, DecodedBitStreamParser$2.NUMBER_OF_SEQUENCE_CODEWORDS))); - let fileId = new StringBuilder(); - codeIndex = DecodedBitStreamParser$2.textCompaction(codewords, codeIndex, fileId); - resultMetadata.setFileId(fileId.toString()); - let optionalFieldsStart = -1; - if (codewords[codeIndex] === DecodedBitStreamParser$2.BEGIN_MACRO_PDF417_OPTIONAL_FIELD) { - optionalFieldsStart = codeIndex + 1; - } - while (codeIndex < codewords[0]) { - switch (codewords[codeIndex]) { - case DecodedBitStreamParser$2.BEGIN_MACRO_PDF417_OPTIONAL_FIELD: - codeIndex++; - switch (codewords[codeIndex]) { - case DecodedBitStreamParser$2.MACRO_PDF417_OPTIONAL_FIELD_FILE_NAME: - let fileName = new StringBuilder(); - codeIndex = DecodedBitStreamParser$2.textCompaction(codewords, codeIndex + 1, fileName); - resultMetadata.setFileName(fileName.toString()); - break; - case DecodedBitStreamParser$2.MACRO_PDF417_OPTIONAL_FIELD_SENDER: - let sender = new StringBuilder(); - codeIndex = DecodedBitStreamParser$2.textCompaction(codewords, codeIndex + 1, sender); - resultMetadata.setSender(sender.toString()); - break; - case DecodedBitStreamParser$2.MACRO_PDF417_OPTIONAL_FIELD_ADDRESSEE: - let addressee = new StringBuilder(); - codeIndex = DecodedBitStreamParser$2.textCompaction(codewords, codeIndex + 1, addressee); - resultMetadata.setAddressee(addressee.toString()); - break; - case DecodedBitStreamParser$2.MACRO_PDF417_OPTIONAL_FIELD_SEGMENT_COUNT: - let segmentCount = new StringBuilder(); - codeIndex = DecodedBitStreamParser$2.numericCompaction(codewords, codeIndex + 1, segmentCount); - resultMetadata.setSegmentCount(Integer.parseInt(segmentCount.toString())); - break; - case DecodedBitStreamParser$2.MACRO_PDF417_OPTIONAL_FIELD_TIME_STAMP: - let timestamp = new StringBuilder(); - codeIndex = DecodedBitStreamParser$2.numericCompaction(codewords, codeIndex + 1, timestamp); - resultMetadata.setTimestamp(Long.parseLong(timestamp.toString())); - break; - case DecodedBitStreamParser$2.MACRO_PDF417_OPTIONAL_FIELD_CHECKSUM: - let checksum = new StringBuilder(); - codeIndex = DecodedBitStreamParser$2.numericCompaction(codewords, codeIndex + 1, checksum); - resultMetadata.setChecksum(Integer.parseInt(checksum.toString())); - break; - case DecodedBitStreamParser$2.MACRO_PDF417_OPTIONAL_FIELD_FILE_SIZE: - let fileSize = new StringBuilder(); - codeIndex = DecodedBitStreamParser$2.numericCompaction(codewords, codeIndex + 1, fileSize); - resultMetadata.setFileSize(Long.parseLong(fileSize.toString())); - break; - default: - throw FormatException.getFormatInstance(); - } - break; - case DecodedBitStreamParser$2.MACRO_PDF417_TERMINATOR: - codeIndex++; - resultMetadata.setLastSegment(true); - break; - default: - throw FormatException.getFormatInstance(); - } - } - // copy optional fields to additional options - if (optionalFieldsStart !== -1) { - let optionalFieldsLength = codeIndex - optionalFieldsStart; - if (resultMetadata.isLastSegment()) { - // do not include terminator - optionalFieldsLength--; - } - resultMetadata.setOptionalData(Arrays.copyOfRange(codewords, optionalFieldsStart, optionalFieldsStart + optionalFieldsLength)); - } - return codeIndex; - } - /** - * Text Compaction mode (see 5.4.1.5) permits all printable ASCII characters to be - * encoded, i.e. values 32 - 126 inclusive in accordance with ISO/IEC 646 (IRV), as - * well as selected control characters. - * - * @param codewords The array of codewords (data + error) - * @param codeIndex The current index into the codeword array. - * @param result The decoded data is appended to the result. - * @return The next index into the codeword array. - */ - static textCompaction(codewords, codeIndex, result) { - // 2 character per codeword - let textCompactionData = new Int32Array((codewords[0] - codeIndex) * 2); - // Used to hold the byte compaction value if there is a mode shift - let byteCompactionData = new Int32Array((codewords[0] - codeIndex) * 2); - let index = 0; - let end = false; - while ((codeIndex < codewords[0]) && !end) { - let code = codewords[codeIndex++]; - if (code < DecodedBitStreamParser$2.TEXT_COMPACTION_MODE_LATCH) { - textCompactionData[index] = code / 30; - textCompactionData[index + 1] = code % 30; - index += 2; - } - else { - switch (code) { - case DecodedBitStreamParser$2.TEXT_COMPACTION_MODE_LATCH: - // reinitialize text compaction mode to alpha sub mode - textCompactionData[index++] = DecodedBitStreamParser$2.TEXT_COMPACTION_MODE_LATCH; - break; - case DecodedBitStreamParser$2.BYTE_COMPACTION_MODE_LATCH: - case DecodedBitStreamParser$2.BYTE_COMPACTION_MODE_LATCH_6: - case DecodedBitStreamParser$2.NUMERIC_COMPACTION_MODE_LATCH: - case DecodedBitStreamParser$2.BEGIN_MACRO_PDF417_CONTROL_BLOCK: - case DecodedBitStreamParser$2.BEGIN_MACRO_PDF417_OPTIONAL_FIELD: - case DecodedBitStreamParser$2.MACRO_PDF417_TERMINATOR: - codeIndex--; - end = true; - break; - case DecodedBitStreamParser$2.MODE_SHIFT_TO_BYTE_COMPACTION_MODE: - // The Mode Shift codeword 913 shall cause a temporary - // switch from Text Compaction mode to Byte Compaction mode. - // This switch shall be in effect for only the next codeword, - // after which the mode shall revert to the prevailing sub-mode - // of the Text Compaction mode. Codeword 913 is only available - // in Text Compaction mode; its use is described in 5.4.2.4. - textCompactionData[index] = DecodedBitStreamParser$2.MODE_SHIFT_TO_BYTE_COMPACTION_MODE; - code = codewords[codeIndex++]; - byteCompactionData[index] = code; - index++; - break; - } - } - } - DecodedBitStreamParser$2.decodeTextCompaction(textCompactionData, byteCompactionData, index, result); - return codeIndex; - } - /** - * The Text Compaction mode includes all the printable ASCII characters - * (i.e. values from 32 to 126) and three ASCII control characters: HT or tab - * (9: e), LF or line feed (10: e), and CR or carriage - * return (13: e). The Text Compaction mode also includes various latch - * and shift characters which are used exclusively within the mode. The Text - * Compaction mode encodes up to 2 characters per codeword. The compaction rules - * for converting data into PDF417 codewords are defined in 5.4.2.2. The sub-mode - * switches are defined in 5.4.2.3. - * - * @param textCompactionData The text compaction data. - * @param byteCompactionData The byte compaction data if there - * was a mode shift. - * @param length The size of the text compaction and byte compaction data. - * @param result The decoded data is appended to the result. - */ - static decodeTextCompaction(textCompactionData, byteCompactionData, length, result) { - // Beginning from an initial state of the Alpha sub-mode - // The default compaction mode for PDF417 in effect at the start of each symbol shall always be Text - // Compaction mode Alpha sub-mode (alphabetic: uppercase). A latch codeword from another mode to the Text - // Compaction mode shall always switch to the Text Compaction Alpha sub-mode. - let subMode = Mode$2.ALPHA; - let priorToShiftMode = Mode$2.ALPHA; - let i = 0; - while (i < length) { - let subModeCh = textCompactionData[i]; - let ch = /*char*/ ''; - switch (subMode) { - case Mode$2.ALPHA: - // Alpha (alphabetic: uppercase) - if (subModeCh < 26) { - // Upper case Alpha Character - // Note: 65 = 'A' ASCII -> there is byte code of symbol - ch = /*(char)('A' + subModeCh) */ String.fromCharCode(65 + subModeCh); - } - else { - switch (subModeCh) { - case 26: - ch = ' '; - break; - case DecodedBitStreamParser$2.LL: - subMode = Mode$2.LOWER; - break; - case DecodedBitStreamParser$2.ML: - subMode = Mode$2.MIXED; - break; - case DecodedBitStreamParser$2.PS: - // Shift to punctuation - priorToShiftMode = subMode; - subMode = Mode$2.PUNCT_SHIFT; - break; - case DecodedBitStreamParser$2.MODE_SHIFT_TO_BYTE_COMPACTION_MODE: - result.append(/*(char)*/ byteCompactionData[i]); - break; - case DecodedBitStreamParser$2.TEXT_COMPACTION_MODE_LATCH: - subMode = Mode$2.ALPHA; - break; - } - } - break; - case Mode$2.LOWER: - // Lower (alphabetic: lowercase) - if (subModeCh < 26) { - ch = /*(char)('a' + subModeCh)*/ String.fromCharCode(97 + subModeCh); - } - else { - switch (subModeCh) { - case 26: - ch = ' '; - break; - case DecodedBitStreamParser$2.AS: - // Shift to alpha - priorToShiftMode = subMode; - subMode = Mode$2.ALPHA_SHIFT; - break; - case DecodedBitStreamParser$2.ML: - subMode = Mode$2.MIXED; - break; - case DecodedBitStreamParser$2.PS: - // Shift to punctuation - priorToShiftMode = subMode; - subMode = Mode$2.PUNCT_SHIFT; - break; - case DecodedBitStreamParser$2.MODE_SHIFT_TO_BYTE_COMPACTION_MODE: - // TODO Does this need to use the current character encoding? See other occurrences below - result.append(/*(char)*/ byteCompactionData[i]); - break; - case DecodedBitStreamParser$2.TEXT_COMPACTION_MODE_LATCH: - subMode = Mode$2.ALPHA; - break; - } - } - break; - case Mode$2.MIXED: - // Mixed (punctuation: e) - if (subModeCh < DecodedBitStreamParser$2.PL) { - ch = DecodedBitStreamParser$2.MIXED_CHARS[subModeCh]; - } - else { - switch (subModeCh) { - case DecodedBitStreamParser$2.PL: - subMode = Mode$2.PUNCT; - break; - case 26: - ch = ' '; - break; - case DecodedBitStreamParser$2.LL: - subMode = Mode$2.LOWER; - break; - case DecodedBitStreamParser$2.AL: - subMode = Mode$2.ALPHA; - break; - case DecodedBitStreamParser$2.PS: - // Shift to punctuation - priorToShiftMode = subMode; - subMode = Mode$2.PUNCT_SHIFT; - break; - case DecodedBitStreamParser$2.MODE_SHIFT_TO_BYTE_COMPACTION_MODE: - result.append(/*(char)*/ byteCompactionData[i]); - break; - case DecodedBitStreamParser$2.TEXT_COMPACTION_MODE_LATCH: - subMode = Mode$2.ALPHA; - break; - } - } - break; - case Mode$2.PUNCT: - // Punctuation - if (subModeCh < DecodedBitStreamParser$2.PAL) { - ch = DecodedBitStreamParser$2.PUNCT_CHARS[subModeCh]; - } - else { - switch (subModeCh) { - case DecodedBitStreamParser$2.PAL: - subMode = Mode$2.ALPHA; - break; - case DecodedBitStreamParser$2.MODE_SHIFT_TO_BYTE_COMPACTION_MODE: - result.append(/*(char)*/ byteCompactionData[i]); - break; - case DecodedBitStreamParser$2.TEXT_COMPACTION_MODE_LATCH: - subMode = Mode$2.ALPHA; - break; - } - } - break; - case Mode$2.ALPHA_SHIFT: - // Restore sub-mode - subMode = priorToShiftMode; - if (subModeCh < 26) { - ch = /*(char)('A' + subModeCh)*/ String.fromCharCode(65 + subModeCh); - } - else { - switch (subModeCh) { - case 26: - ch = ' '; - break; - case DecodedBitStreamParser$2.TEXT_COMPACTION_MODE_LATCH: - subMode = Mode$2.ALPHA; - break; - } - } - break; - case Mode$2.PUNCT_SHIFT: - // Restore sub-mode - subMode = priorToShiftMode; - if (subModeCh < DecodedBitStreamParser$2.PAL) { - ch = DecodedBitStreamParser$2.PUNCT_CHARS[subModeCh]; - } - else { - switch (subModeCh) { - case DecodedBitStreamParser$2.PAL: - subMode = Mode$2.ALPHA; - break; - case DecodedBitStreamParser$2.MODE_SHIFT_TO_BYTE_COMPACTION_MODE: - // PS before Shift-to-Byte is used as a padding character, - // see 5.4.2.4 of the specification - result.append(/*(char)*/ byteCompactionData[i]); - break; - case DecodedBitStreamParser$2.TEXT_COMPACTION_MODE_LATCH: - subMode = Mode$2.ALPHA; - break; - } - } - break; - } - // if (ch !== 0) { - if (ch !== '') { - // Append decoded character to result - result.append(ch); - } - i++; - } - } - /** - * Byte Compaction mode (see 5.4.3) permits all 256 possible 8-bit byte values to be encoded. - * This includes all ASCII characters value 0 to 127 inclusive and provides for international - * character set support. - * - * @param mode The byte compaction mode i.e. 901 or 924 - * @param codewords The array of codewords (data + error) - * @param encoding Currently active character encoding - * @param codeIndex The current index into the codeword array. - * @param result The decoded data is appended to the result. - * @return The next index into the codeword array. - */ - static /*int*/ byteCompaction(mode, codewords, encoding, codeIndex, result) { - let decodedBytes = new ByteArrayOutputStream(); - let count = 0; - let value = /*long*/ 0; - let end = false; - switch (mode) { - case DecodedBitStreamParser$2.BYTE_COMPACTION_MODE_LATCH: - // Total number of Byte Compaction characters to be encoded - // is not a multiple of 6 - let byteCompactedCodewords = new Int32Array(6); - let nextCode = codewords[codeIndex++]; - while ((codeIndex < codewords[0]) && !end) { - byteCompactedCodewords[count++] = nextCode; - // Base 900 - value = 900 * value + nextCode; - nextCode = codewords[codeIndex++]; - // perhaps it should be ok to check only nextCode >= TEXT_COMPACTION_MODE_LATCH - switch (nextCode) { - case DecodedBitStreamParser$2.TEXT_COMPACTION_MODE_LATCH: - case DecodedBitStreamParser$2.BYTE_COMPACTION_MODE_LATCH: - case DecodedBitStreamParser$2.NUMERIC_COMPACTION_MODE_LATCH: - case DecodedBitStreamParser$2.BYTE_COMPACTION_MODE_LATCH_6: - case DecodedBitStreamParser$2.BEGIN_MACRO_PDF417_CONTROL_BLOCK: - case DecodedBitStreamParser$2.BEGIN_MACRO_PDF417_OPTIONAL_FIELD: - case DecodedBitStreamParser$2.MACRO_PDF417_TERMINATOR: - codeIndex--; - end = true; - break; - default: - if ((count % 5 === 0) && (count > 0)) { - // Decode every 5 codewords - // Convert to Base 256 - for (let j /*int*/ = 0; j < 6; ++j) { - /* @note - * JavaScript stores numbers as 64 bits floating point numbers, but all bitwise operations are performed on 32 bits binary numbers. - * So the next bitwise operation could not be done with simple numbers - */ - decodedBytes.write(/*(byte)*/ Number(createBigInt(value) >> createBigInt(8 * (5 - j)))); - } - value = 0; - count = 0; - } - break; - } - } - // if the end of all codewords is reached the last codeword needs to be added - if (codeIndex === codewords[0] && nextCode < DecodedBitStreamParser$2.TEXT_COMPACTION_MODE_LATCH) { - byteCompactedCodewords[count++] = nextCode; - } - // If Byte Compaction mode is invoked with codeword 901, - // the last group of codewords is interpreted directly - // as one byte per codeword, without compaction. - for (let i /*int*/ = 0; i < count; i++) { - decodedBytes.write(/*(byte)*/ byteCompactedCodewords[i]); - } - break; - case DecodedBitStreamParser$2.BYTE_COMPACTION_MODE_LATCH_6: - // Total number of Byte Compaction characters to be encoded - // is an integer multiple of 6 - while (codeIndex < codewords[0] && !end) { - let code = codewords[codeIndex++]; - if (code < DecodedBitStreamParser$2.TEXT_COMPACTION_MODE_LATCH) { - count++; - // Base 900 - value = 900 * value + code; - } - else { - switch (code) { - case DecodedBitStreamParser$2.TEXT_COMPACTION_MODE_LATCH: - case DecodedBitStreamParser$2.BYTE_COMPACTION_MODE_LATCH: - case DecodedBitStreamParser$2.NUMERIC_COMPACTION_MODE_LATCH: - case DecodedBitStreamParser$2.BYTE_COMPACTION_MODE_LATCH_6: - case DecodedBitStreamParser$2.BEGIN_MACRO_PDF417_CONTROL_BLOCK: - case DecodedBitStreamParser$2.BEGIN_MACRO_PDF417_OPTIONAL_FIELD: - case DecodedBitStreamParser$2.MACRO_PDF417_TERMINATOR: - codeIndex--; - end = true; - break; - } - } - if ((count % 5 === 0) && (count > 0)) { - // Decode every 5 codewords - // Convert to Base 256 - /* @note - * JavaScript stores numbers as 64 bits floating point numbers, but all bitwise operations are performed on 32 bits binary numbers. - * So the next bitwise operation could not be done with simple numbers - */ - for (let j /*int*/ = 0; j < 6; ++j) { - decodedBytes.write(/*(byte)*/ Number(createBigInt(value) >> createBigInt(8 * (5 - j)))); - } - value = 0; - count = 0; - } - } - break; - } - result.append(StringEncoding.decode(decodedBytes.toByteArray(), encoding)); - return codeIndex; - } - /** - * Numeric Compaction mode (see 5.4.4) permits efficient encoding of numeric data strings. - * - * @param codewords The array of codewords (data + error) - * @param codeIndex The current index into the codeword array. - * @param result The decoded data is appended to the result. - * @return The next index into the codeword array. - * - * @throws FormatException - */ - static numericCompaction(codewords, codeIndex /*int*/, result) { - let count = 0; - let end = false; - let numericCodewords = new Int32Array(DecodedBitStreamParser$2.MAX_NUMERIC_CODEWORDS); - while (codeIndex < codewords[0] && !end) { - let code = codewords[codeIndex++]; - if (codeIndex === codewords[0]) { - end = true; - } - if (code < DecodedBitStreamParser$2.TEXT_COMPACTION_MODE_LATCH) { - numericCodewords[count] = code; - count++; - } - else { - switch (code) { - case DecodedBitStreamParser$2.TEXT_COMPACTION_MODE_LATCH: - case DecodedBitStreamParser$2.BYTE_COMPACTION_MODE_LATCH: - case DecodedBitStreamParser$2.BYTE_COMPACTION_MODE_LATCH_6: - case DecodedBitStreamParser$2.BEGIN_MACRO_PDF417_CONTROL_BLOCK: - case DecodedBitStreamParser$2.BEGIN_MACRO_PDF417_OPTIONAL_FIELD: - case DecodedBitStreamParser$2.MACRO_PDF417_TERMINATOR: - codeIndex--; - end = true; - break; - } - } - if ((count % DecodedBitStreamParser$2.MAX_NUMERIC_CODEWORDS === 0 || code === DecodedBitStreamParser$2.NUMERIC_COMPACTION_MODE_LATCH || end) && count > 0) { - // Re-invoking Numeric Compaction mode (by using codeword 902 - // while in Numeric Compaction mode) serves to terminate the - // current Numeric Compaction mode grouping as described in 5.4.4.2, - // and then to start a new one grouping. - result.append(DecodedBitStreamParser$2.decodeBase900toBase10(numericCodewords, count)); - count = 0; - } - } - return codeIndex; - } - /** - * Convert a list of Numeric Compacted codewords from Base 900 to Base 10. - * - * @param codewords The array of codewords - * @param count The number of codewords - * @return The decoded string representing the Numeric data. - * - * EXAMPLE - * Encode the fifteen digit numeric string 000213298174000 - * Prefix the numeric string with a 1 and set the initial value of - * t = 1 000 213 298 174 000 - * Calculate codeword 0 - * d0 = 1 000 213 298 174 000 mod 900 = 200 - * - * t = 1 000 213 298 174 000 div 900 = 1 111 348 109 082 - * Calculate codeword 1 - * d1 = 1 111 348 109 082 mod 900 = 282 - * - * t = 1 111 348 109 082 div 900 = 1 234 831 232 - * Calculate codeword 2 - * d2 = 1 234 831 232 mod 900 = 632 - * - * t = 1 234 831 232 div 900 = 1 372 034 - * Calculate codeword 3 - * d3 = 1 372 034 mod 900 = 434 - * - * t = 1 372 034 div 900 = 1 524 - * Calculate codeword 4 - * d4 = 1 524 mod 900 = 624 - * - * t = 1 524 div 900 = 1 - * Calculate codeword 5 - * d5 = 1 mod 900 = 1 - * t = 1 div 900 = 0 - * Codeword sequence is: 1, 624, 434, 632, 282, 200 - * - * Decode the above codewords involves - * 1 x 900 power of 5 + 624 x 900 power of 4 + 434 x 900 power of 3 + - * 632 x 900 power of 2 + 282 x 900 power of 1 + 200 x 900 power of 0 = 1000213298174000 - * - * Remove leading 1 => Result is 000213298174000 - * - * @throws FormatException - */ - static decodeBase900toBase10(codewords, count) { - let result = createBigInt(0); - for (let i /*int*/ = 0; i < count; i++) { - result += DecodedBitStreamParser$2.EXP900[count - i - 1] * createBigInt(codewords[i]); - } - let resultString = result.toString(); - if (resultString.charAt(0) !== '1') { - throw new FormatException(); - } - return resultString.substring(1); - } - } - DecodedBitStreamParser$2.TEXT_COMPACTION_MODE_LATCH = 900; - DecodedBitStreamParser$2.BYTE_COMPACTION_MODE_LATCH = 901; - DecodedBitStreamParser$2.NUMERIC_COMPACTION_MODE_LATCH = 902; - DecodedBitStreamParser$2.BYTE_COMPACTION_MODE_LATCH_6 = 924; - DecodedBitStreamParser$2.ECI_USER_DEFINED = 925; - DecodedBitStreamParser$2.ECI_GENERAL_PURPOSE = 926; - DecodedBitStreamParser$2.ECI_CHARSET = 927; - DecodedBitStreamParser$2.BEGIN_MACRO_PDF417_CONTROL_BLOCK = 928; - DecodedBitStreamParser$2.BEGIN_MACRO_PDF417_OPTIONAL_FIELD = 923; - DecodedBitStreamParser$2.MACRO_PDF417_TERMINATOR = 922; - DecodedBitStreamParser$2.MODE_SHIFT_TO_BYTE_COMPACTION_MODE = 913; - DecodedBitStreamParser$2.MAX_NUMERIC_CODEWORDS = 15; - DecodedBitStreamParser$2.MACRO_PDF417_OPTIONAL_FIELD_FILE_NAME = 0; - DecodedBitStreamParser$2.MACRO_PDF417_OPTIONAL_FIELD_SEGMENT_COUNT = 1; - DecodedBitStreamParser$2.MACRO_PDF417_OPTIONAL_FIELD_TIME_STAMP = 2; - DecodedBitStreamParser$2.MACRO_PDF417_OPTIONAL_FIELD_SENDER = 3; - DecodedBitStreamParser$2.MACRO_PDF417_OPTIONAL_FIELD_ADDRESSEE = 4; - DecodedBitStreamParser$2.MACRO_PDF417_OPTIONAL_FIELD_FILE_SIZE = 5; - DecodedBitStreamParser$2.MACRO_PDF417_OPTIONAL_FIELD_CHECKSUM = 6; - DecodedBitStreamParser$2.PL = 25; - DecodedBitStreamParser$2.LL = 27; - DecodedBitStreamParser$2.AS = 27; - DecodedBitStreamParser$2.ML = 28; - DecodedBitStreamParser$2.AL = 28; - DecodedBitStreamParser$2.PS = 29; - DecodedBitStreamParser$2.PAL = 29; - DecodedBitStreamParser$2.PUNCT_CHARS = ';<>@[\\]_`~!\r\t,:\n-.$/"|*()?{}\''; - DecodedBitStreamParser$2.MIXED_CHARS = '0123456789&\r\t,:#-.$/+%*=^'; - /** - * Table containing values for the exponent of 900. - * This is used in the numeric compaction decode algorithm. - */ - DecodedBitStreamParser$2.EXP900 = getBigIntConstructor() ? getEXP900() : []; - DecodedBitStreamParser$2.NUMBER_OF_SEQUENCE_CODEWORDS = 2; - - /* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - // import java.util.ArrayList; - // import java.util.Collection; - // import java.util.Formatter; - // import java.util.List; - /** - * @author Guenther Grau - */ - /*public final*/ class PDF417ScanningDecoder { - constructor() { } - /** - * @TODO don't pass in minCodewordWidth and maxCodewordWidth, pass in barcode columns for start and stop pattern - * - * columns. That way width can be deducted from the pattern column. - * This approach also allows to detect more details about the barcode, e.g. if a bar type (white or black) is wider - * than it should be. This can happen if the scanner used a bad blackpoint. - * - * @param BitMatrix - * @param image - * @param ResultPoint - * @param imageTopLeft - * @param ResultPoint - * @param imageBottomLeft - * @param ResultPoint - * @param imageTopRight - * @param ResultPoint - * @param imageBottomRight - * @param int - * @param minCodewordWidth - * @param int - * @param maxCodewordWidth - * - * @throws NotFoundException - * @throws FormatException - * @throws ChecksumException - */ - static decode(image, imageTopLeft, imageBottomLeft, imageTopRight, imageBottomRight, minCodewordWidth, maxCodewordWidth) { - let boundingBox = new BoundingBox(image, imageTopLeft, imageBottomLeft, imageTopRight, imageBottomRight); - let leftRowIndicatorColumn = null; - let rightRowIndicatorColumn = null; - let detectionResult; - for (let firstPass /*boolean*/ = true;; firstPass = false) { - if (imageTopLeft != null) { - leftRowIndicatorColumn = PDF417ScanningDecoder.getRowIndicatorColumn(image, boundingBox, imageTopLeft, true, minCodewordWidth, maxCodewordWidth); - } - if (imageTopRight != null) { - rightRowIndicatorColumn = PDF417ScanningDecoder.getRowIndicatorColumn(image, boundingBox, imageTopRight, false, minCodewordWidth, maxCodewordWidth); - } - detectionResult = PDF417ScanningDecoder.merge(leftRowIndicatorColumn, rightRowIndicatorColumn); - if (detectionResult == null) { - throw NotFoundException.getNotFoundInstance(); - } - let resultBox = detectionResult.getBoundingBox(); - if (firstPass && resultBox != null && - (resultBox.getMinY() < boundingBox.getMinY() || resultBox.getMaxY() > boundingBox.getMaxY())) { - boundingBox = resultBox; - } - else { - break; - } - } - detectionResult.setBoundingBox(boundingBox); - let maxBarcodeColumn = detectionResult.getBarcodeColumnCount() + 1; - detectionResult.setDetectionResultColumn(0, leftRowIndicatorColumn); - detectionResult.setDetectionResultColumn(maxBarcodeColumn, rightRowIndicatorColumn); - let leftToRight = leftRowIndicatorColumn != null; - for (let barcodeColumnCount /*int*/ = 1; barcodeColumnCount <= maxBarcodeColumn; barcodeColumnCount++) { - let barcodeColumn = leftToRight ? barcodeColumnCount : maxBarcodeColumn - barcodeColumnCount; - if (detectionResult.getDetectionResultColumn(barcodeColumn) !== /* null */ undefined) { - // This will be the case for the opposite row indicator column, which doesn't need to be decoded again. - continue; - } - let detectionResultColumn; - if (barcodeColumn === 0 || barcodeColumn === maxBarcodeColumn) { - detectionResultColumn = new DetectionResultRowIndicatorColumn(boundingBox, barcodeColumn === 0); - } - else { - detectionResultColumn = new DetectionResultColumn(boundingBox); - } - detectionResult.setDetectionResultColumn(barcodeColumn, detectionResultColumn); - let startColumn = -1; - let previousStartColumn = startColumn; - // TODO start at a row for which we know the start position, then detect upwards and downwards from there. - for (let imageRow /*int*/ = boundingBox.getMinY(); imageRow <= boundingBox.getMaxY(); imageRow++) { - startColumn = PDF417ScanningDecoder.getStartColumn(detectionResult, barcodeColumn, imageRow, leftToRight); - if (startColumn < 0 || startColumn > boundingBox.getMaxX()) { - if (previousStartColumn === -1) { - continue; - } - startColumn = previousStartColumn; - } - let codeword = PDF417ScanningDecoder.detectCodeword(image, boundingBox.getMinX(), boundingBox.getMaxX(), leftToRight, startColumn, imageRow, minCodewordWidth, maxCodewordWidth); - if (codeword != null) { - detectionResultColumn.setCodeword(imageRow, codeword); - previousStartColumn = startColumn; - minCodewordWidth = Math.min(minCodewordWidth, codeword.getWidth()); - maxCodewordWidth = Math.max(maxCodewordWidth, codeword.getWidth()); - } - } - } - return PDF417ScanningDecoder.createDecoderResult(detectionResult); - } - /** - * - * @param leftRowIndicatorColumn - * @param rightRowIndicatorColumn - * - * @throws NotFoundException - */ - static merge(leftRowIndicatorColumn, rightRowIndicatorColumn) { - if (leftRowIndicatorColumn == null && rightRowIndicatorColumn == null) { - return null; - } - let barcodeMetadata = PDF417ScanningDecoder.getBarcodeMetadata(leftRowIndicatorColumn, rightRowIndicatorColumn); - if (barcodeMetadata == null) { - return null; - } - let boundingBox = BoundingBox.merge(PDF417ScanningDecoder.adjustBoundingBox(leftRowIndicatorColumn), PDF417ScanningDecoder.adjustBoundingBox(rightRowIndicatorColumn)); - return new DetectionResult(barcodeMetadata, boundingBox); - } - /** - * - * @param rowIndicatorColumn - * - * @throws NotFoundException - */ - static adjustBoundingBox(rowIndicatorColumn) { - if (rowIndicatorColumn == null) { - return null; - } - let rowHeights = rowIndicatorColumn.getRowHeights(); - if (rowHeights == null) { - return null; - } - let maxRowHeight = PDF417ScanningDecoder.getMax(rowHeights); - let missingStartRows = 0; - for (let rowHeight /*int*/ of rowHeights) { - missingStartRows += maxRowHeight - rowHeight; - if (rowHeight > 0) { - break; - } - } - let codewords = rowIndicatorColumn.getCodewords(); - for (let row /*int*/ = 0; missingStartRows > 0 && codewords[row] == null; row++) { - missingStartRows--; - } - let missingEndRows = 0; - for (let row /*int*/ = rowHeights.length - 1; row >= 0; row--) { - missingEndRows += maxRowHeight - rowHeights[row]; - if (rowHeights[row] > 0) { - break; - } - } - for (let row /*int*/ = codewords.length - 1; missingEndRows > 0 && codewords[row] == null; row--) { - missingEndRows--; - } - return rowIndicatorColumn.getBoundingBox().addMissingRows(missingStartRows, missingEndRows, rowIndicatorColumn.isLeft()); - } - static getMax(values) { - let maxValue = -1; - for (let value /*int*/ of values) { - maxValue = Math.max(maxValue, value); - } - return maxValue; - } - static getBarcodeMetadata(leftRowIndicatorColumn, rightRowIndicatorColumn) { - let leftBarcodeMetadata; - if (leftRowIndicatorColumn == null || - (leftBarcodeMetadata = leftRowIndicatorColumn.getBarcodeMetadata()) == null) { - return rightRowIndicatorColumn == null ? null : rightRowIndicatorColumn.getBarcodeMetadata(); - } - let rightBarcodeMetadata; - if (rightRowIndicatorColumn == null || - (rightBarcodeMetadata = rightRowIndicatorColumn.getBarcodeMetadata()) == null) { - return leftBarcodeMetadata; - } - if (leftBarcodeMetadata.getColumnCount() !== rightBarcodeMetadata.getColumnCount() && - leftBarcodeMetadata.getErrorCorrectionLevel() !== rightBarcodeMetadata.getErrorCorrectionLevel() && - leftBarcodeMetadata.getRowCount() !== rightBarcodeMetadata.getRowCount()) { - return null; - } - return leftBarcodeMetadata; - } - static getRowIndicatorColumn(image, boundingBox, startPoint, leftToRight, minCodewordWidth, maxCodewordWidth) { - let rowIndicatorColumn = new DetectionResultRowIndicatorColumn(boundingBox, leftToRight); - for (let i /*int*/ = 0; i < 2; i++) { - let increment = i === 0 ? 1 : -1; - let startColumn = Math.trunc(Math.trunc(startPoint.getX())); - for (let imageRow /*int*/ = Math.trunc(Math.trunc(startPoint.getY())); imageRow <= boundingBox.getMaxY() && - imageRow >= boundingBox.getMinY(); imageRow += increment) { - let codeword = PDF417ScanningDecoder.detectCodeword(image, 0, image.getWidth(), leftToRight, startColumn, imageRow, minCodewordWidth, maxCodewordWidth); - if (codeword != null) { - rowIndicatorColumn.setCodeword(imageRow, codeword); - if (leftToRight) { - startColumn = codeword.getStartX(); - } - else { - startColumn = codeword.getEndX(); - } - } - } - } - return rowIndicatorColumn; - } - /** - * - * @param detectionResult - * @param BarcodeValue - * @param param2 - * @param param3 - * @param barcodeMatrix - * - * @throws NotFoundException - */ - static adjustCodewordCount(detectionResult, barcodeMatrix) { - let barcodeMatrix01 = barcodeMatrix[0][1]; - let numberOfCodewords = barcodeMatrix01.getValue(); - let calculatedNumberOfCodewords = detectionResult.getBarcodeColumnCount() * - detectionResult.getBarcodeRowCount() - - PDF417ScanningDecoder.getNumberOfECCodeWords(detectionResult.getBarcodeECLevel()); - if (numberOfCodewords.length === 0) { - if (calculatedNumberOfCodewords < 1 || calculatedNumberOfCodewords > PDF417Common.MAX_CODEWORDS_IN_BARCODE) { - throw NotFoundException.getNotFoundInstance(); - } - barcodeMatrix01.setValue(calculatedNumberOfCodewords); - } - else if (numberOfCodewords[0] !== calculatedNumberOfCodewords) { - // The calculated one is more reliable as it is derived from the row indicator columns - barcodeMatrix01.setValue(calculatedNumberOfCodewords); - } - } - /** - * - * @param detectionResult - * - * @throws FormatException - * @throws ChecksumException - * @throws NotFoundException - */ - static createDecoderResult(detectionResult) { - let barcodeMatrix = PDF417ScanningDecoder.createBarcodeMatrix(detectionResult); - PDF417ScanningDecoder.adjustCodewordCount(detectionResult, barcodeMatrix); - let erasures /*Collection*/ = new Array(); - let codewords = new Int32Array(detectionResult.getBarcodeRowCount() * detectionResult.getBarcodeColumnCount()); - let ambiguousIndexValuesList = /*List*/ []; - let ambiguousIndexesList = /*Collection*/ new Array(); - for (let row /*int*/ = 0; row < detectionResult.getBarcodeRowCount(); row++) { - for (let column /*int*/ = 0; column < detectionResult.getBarcodeColumnCount(); column++) { - let values = barcodeMatrix[row][column + 1].getValue(); - let codewordIndex = row * detectionResult.getBarcodeColumnCount() + column; - if (values.length === 0) { - erasures.push(codewordIndex); - } - else if (values.length === 1) { - codewords[codewordIndex] = values[0]; - } - else { - ambiguousIndexesList.push(codewordIndex); - ambiguousIndexValuesList.push(values); - } - } - } - let ambiguousIndexValues = new Array(ambiguousIndexValuesList.length); - for (let i /*int*/ = 0; i < ambiguousIndexValues.length; i++) { - ambiguousIndexValues[i] = ambiguousIndexValuesList[i]; - } - return PDF417ScanningDecoder.createDecoderResultFromAmbiguousValues(detectionResult.getBarcodeECLevel(), codewords, PDF417Common.toIntArray(erasures), PDF417Common.toIntArray(ambiguousIndexesList), ambiguousIndexValues); - } - /** - * This method deals with the fact, that the decoding process doesn't always yield a single most likely value. The - * current error correction implementation doesn't deal with erasures very well, so it's better to provide a value - * for these ambiguous codewords instead of treating it as an erasure. The problem is that we don't know which of - * the ambiguous values to choose. We try decode using the first value, and if that fails, we use another of the - * ambiguous values and try to decode again. This usually only happens on very hard to read and decode barcodes, - * so decoding the normal barcodes is not affected by this. - * - * @param erasureArray contains the indexes of erasures - * @param ambiguousIndexes array with the indexes that have more than one most likely value - * @param ambiguousIndexValues two dimensional array that contains the ambiguous values. The first dimension must - * be the same length as the ambiguousIndexes array - * - * @throws FormatException - * @throws ChecksumException - */ - static createDecoderResultFromAmbiguousValues(ecLevel, codewords, erasureArray, ambiguousIndexes, ambiguousIndexValues) { - let ambiguousIndexCount = new Int32Array(ambiguousIndexes.length); - let tries = 100; - while (tries-- > 0) { - for (let i /*int*/ = 0; i < ambiguousIndexCount.length; i++) { - codewords[ambiguousIndexes[i]] = ambiguousIndexValues[i][ambiguousIndexCount[i]]; - } - try { - return PDF417ScanningDecoder.decodeCodewords(codewords, ecLevel, erasureArray); - } - catch (err) { - let ignored = err instanceof ChecksumException; - if (!ignored) { - throw err; - } - } - if (ambiguousIndexCount.length === 0) { - throw ChecksumException.getChecksumInstance(); - } - for (let i /*int*/ = 0; i < ambiguousIndexCount.length; i++) { - if (ambiguousIndexCount[i] < ambiguousIndexValues[i].length - 1) { - ambiguousIndexCount[i]++; - break; - } - else { - ambiguousIndexCount[i] = 0; - if (i === ambiguousIndexCount.length - 1) { - throw ChecksumException.getChecksumInstance(); - } - } - } - } - throw ChecksumException.getChecksumInstance(); - } - static createBarcodeMatrix(detectionResult) { - // let barcodeMatrix: BarcodeValue[][] = - // new BarcodeValue[detectionResult.getBarcodeRowCount()][detectionResult.getBarcodeColumnCount() + 2]; - let barcodeMatrix = Array.from({ length: detectionResult.getBarcodeRowCount() }, () => new Array(detectionResult.getBarcodeColumnCount() + 2)); - for (let row /*int*/ = 0; row < barcodeMatrix.length; row++) { - for (let column /*int*/ = 0; column < barcodeMatrix[row].length; column++) { - barcodeMatrix[row][column] = new BarcodeValue(); - } - } - let column = 0; - for (let detectionResultColumn /*DetectionResultColumn*/ of detectionResult.getDetectionResultColumns()) { - if (detectionResultColumn != null) { - for (let codeword /*Codeword*/ of detectionResultColumn.getCodewords()) { - if (codeword != null) { - let rowNumber = codeword.getRowNumber(); - if (rowNumber >= 0) { - if (rowNumber >= barcodeMatrix.length) { - // We have more rows than the barcode metadata allows for, ignore them. - continue; - } - barcodeMatrix[rowNumber][column].setValue(codeword.getValue()); - } - } - } - } - column++; - } - return barcodeMatrix; - } - static isValidBarcodeColumn(detectionResult, barcodeColumn) { - return barcodeColumn >= 0 && barcodeColumn <= detectionResult.getBarcodeColumnCount() + 1; - } - static getStartColumn(detectionResult, barcodeColumn, imageRow, leftToRight) { - let offset = leftToRight ? 1 : -1; - let codeword = null; - if (PDF417ScanningDecoder.isValidBarcodeColumn(detectionResult, barcodeColumn - offset)) { - codeword = detectionResult.getDetectionResultColumn(barcodeColumn - offset).getCodeword(imageRow); - } - if (codeword != null) { - return leftToRight ? codeword.getEndX() : codeword.getStartX(); - } - codeword = detectionResult.getDetectionResultColumn(barcodeColumn).getCodewordNearby(imageRow); - if (codeword != null) { - return leftToRight ? codeword.getStartX() : codeword.getEndX(); - } - if (PDF417ScanningDecoder.isValidBarcodeColumn(detectionResult, barcodeColumn - offset)) { - codeword = detectionResult.getDetectionResultColumn(barcodeColumn - offset).getCodewordNearby(imageRow); - } - if (codeword != null) { - return leftToRight ? codeword.getEndX() : codeword.getStartX(); - } - let skippedColumns = 0; - while (PDF417ScanningDecoder.isValidBarcodeColumn(detectionResult, barcodeColumn - offset)) { - barcodeColumn -= offset; - for (let previousRowCodeword /*Codeword*/ of detectionResult.getDetectionResultColumn(barcodeColumn).getCodewords()) { - if (previousRowCodeword != null) { - return (leftToRight ? previousRowCodeword.getEndX() : previousRowCodeword.getStartX()) + - offset * - skippedColumns * - (previousRowCodeword.getEndX() - previousRowCodeword.getStartX()); - } - } - skippedColumns++; - } - return leftToRight ? detectionResult.getBoundingBox().getMinX() : detectionResult.getBoundingBox().getMaxX(); - } - static detectCodeword(image, minColumn, maxColumn, leftToRight, startColumn, imageRow, minCodewordWidth, maxCodewordWidth) { - startColumn = PDF417ScanningDecoder.adjustCodewordStartColumn(image, minColumn, maxColumn, leftToRight, startColumn, imageRow); - // we usually know fairly exact now how long a codeword is. We should provide minimum and maximum expected length - // and try to adjust the read pixels, e.g. remove single pixel errors or try to cut off exceeding pixels. - // min and maxCodewordWidth should not be used as they are calculated for the whole barcode an can be inaccurate - // for the current position - let moduleBitCount = PDF417ScanningDecoder.getModuleBitCount(image, minColumn, maxColumn, leftToRight, startColumn, imageRow); - if (moduleBitCount == null) { - return null; - } - let endColumn; - let codewordBitCount = MathUtils.sum(moduleBitCount); - if (leftToRight) { - endColumn = startColumn + codewordBitCount; - } - else { - for (let i /*int*/ = 0; i < moduleBitCount.length / 2; i++) { - let tmpCount = moduleBitCount[i]; - moduleBitCount[i] = moduleBitCount[moduleBitCount.length - 1 - i]; - moduleBitCount[moduleBitCount.length - 1 - i] = tmpCount; - } - endColumn = startColumn; - startColumn = endColumn - codewordBitCount; - } - // TODO implement check for width and correction of black and white bars - // use start (and maybe stop pattern) to determine if black bars are wider than white bars. If so, adjust. - // should probably done only for codewords with a lot more than 17 bits. - // The following fixes 10-1.png, which has wide black bars and small white bars - // for (let i /*int*/ = 0; i < moduleBitCount.length; i++) { - // if (i % 2 === 0) { - // moduleBitCount[i]--; - // } else { - // moduleBitCount[i]++; - // } - // } - // We could also use the width of surrounding codewords for more accurate results, but this seems - // sufficient for now - if (!PDF417ScanningDecoder.checkCodewordSkew(codewordBitCount, minCodewordWidth, maxCodewordWidth)) { - // We could try to use the startX and endX position of the codeword in the same column in the previous row, - // create the bit count from it and normalize it to 8. This would help with single pixel errors. - return null; - } - let decodedValue = PDF417CodewordDecoder.getDecodedValue(moduleBitCount); - let codeword = PDF417Common.getCodeword(decodedValue); - if (codeword === -1) { - return null; - } - return new Codeword(startColumn, endColumn, PDF417ScanningDecoder.getCodewordBucketNumber(decodedValue), codeword); - } - static getModuleBitCount(image, minColumn, maxColumn, leftToRight, startColumn, imageRow) { - let imageColumn = startColumn; - let moduleBitCount = new Int32Array(8); - let moduleNumber = 0; - let increment = leftToRight ? 1 : -1; - let previousPixelValue = leftToRight; - while ((leftToRight ? imageColumn < maxColumn : imageColumn >= minColumn) && - moduleNumber < moduleBitCount.length) { - if (image.get(imageColumn, imageRow) === previousPixelValue) { - moduleBitCount[moduleNumber]++; - imageColumn += increment; - } - else { - moduleNumber++; - previousPixelValue = !previousPixelValue; - } - } - if (moduleNumber === moduleBitCount.length || - ((imageColumn === (leftToRight ? maxColumn : minColumn)) && - moduleNumber === moduleBitCount.length - 1)) { - return moduleBitCount; - } - return null; - } - static getNumberOfECCodeWords(barcodeECLevel) { - return 2 << barcodeECLevel; - } - static adjustCodewordStartColumn(image, minColumn, maxColumn, leftToRight, codewordStartColumn, imageRow) { - let correctedStartColumn = codewordStartColumn; - let increment = leftToRight ? -1 : 1; - // there should be no black pixels before the start column. If there are, then we need to start earlier. - for (let i /*int*/ = 0; i < 2; i++) { - while ((leftToRight ? correctedStartColumn >= minColumn : correctedStartColumn < maxColumn) && - leftToRight === image.get(correctedStartColumn, imageRow)) { - if (Math.abs(codewordStartColumn - correctedStartColumn) > PDF417ScanningDecoder.CODEWORD_SKEW_SIZE) { - return codewordStartColumn; - } - correctedStartColumn += increment; - } - increment = -increment; - leftToRight = !leftToRight; - } - return correctedStartColumn; - } - static checkCodewordSkew(codewordSize, minCodewordWidth, maxCodewordWidth) { - return minCodewordWidth - PDF417ScanningDecoder.CODEWORD_SKEW_SIZE <= codewordSize && - codewordSize <= maxCodewordWidth + PDF417ScanningDecoder.CODEWORD_SKEW_SIZE; - } - /** - * @throws FormatException, - * @throws ChecksumException - */ - static decodeCodewords(codewords, ecLevel, erasures) { - if (codewords.length === 0) { - throw FormatException.getFormatInstance(); - } - let numECCodewords = 1 << (ecLevel + 1); - let correctedErrorsCount = PDF417ScanningDecoder.correctErrors(codewords, erasures, numECCodewords); - PDF417ScanningDecoder.verifyCodewordCount(codewords, numECCodewords); - // Decode the codewords - let decoderResult = DecodedBitStreamParser$2.decode(codewords, '' + ecLevel); - decoderResult.setErrorsCorrected(correctedErrorsCount); - decoderResult.setErasures(erasures.length); - return decoderResult; - } - /** - *

    Given data and error-correction codewords received, possibly corrupted by errors, attempts to - * correct the errors in-place.

    - * - * @param codewords data and error correction codewords - * @param erasures positions of any known erasures - * @param numECCodewords number of error correction codewords that are available in codewords - * @throws ChecksumException if error correction fails - */ - static correctErrors(codewords, erasures, numECCodewords) { - if (erasures != null && - erasures.length > numECCodewords / 2 + PDF417ScanningDecoder.MAX_ERRORS || - numECCodewords < 0 || - numECCodewords > PDF417ScanningDecoder.MAX_EC_CODEWORDS) { - // Too many errors or EC Codewords is corrupted - throw ChecksumException.getChecksumInstance(); - } - return PDF417ScanningDecoder.errorCorrection.decode(codewords, numECCodewords, erasures); - } - /** - * Verify that all is OK with the codeword array. - * @throws FormatException - */ - static verifyCodewordCount(codewords, numECCodewords) { - if (codewords.length < 4) { - // Codeword array size should be at least 4 allowing for - // Count CW, At least one Data CW, Error Correction CW, Error Correction CW - throw FormatException.getFormatInstance(); - } - // The first codeword, the Symbol Length Descriptor, shall always encode the total number of data - // codewords in the symbol, including the Symbol Length Descriptor itself, data codewords and pad - // codewords, but excluding the number of error correction codewords. - let numberOfCodewords = codewords[0]; - if (numberOfCodewords > codewords.length) { - throw FormatException.getFormatInstance(); - } - if (numberOfCodewords === 0) { - // Reset to the length of the array - 8 (Allow for at least level 3 Error Correction (8 Error Codewords) - if (numECCodewords < codewords.length) { - codewords[0] = codewords.length - numECCodewords; - } - else { - throw FormatException.getFormatInstance(); - } - } - } - static getBitCountForCodeword(codeword) { - let result = new Int32Array(8); - let previousValue = 0; - let i = result.length - 1; - while (true) { - if ((codeword & 0x1) !== previousValue) { - previousValue = codeword & 0x1; - i--; - if (i < 0) { - break; - } - } - result[i]++; - codeword >>= 1; - } - return result; - } - static getCodewordBucketNumber(codeword) { - if (codeword instanceof Int32Array) { - return this.getCodewordBucketNumber_Int32Array(codeword); - } - return this.getCodewordBucketNumber_number(codeword); - } - static getCodewordBucketNumber_number(codeword) { - return PDF417ScanningDecoder.getCodewordBucketNumber(PDF417ScanningDecoder.getBitCountForCodeword(codeword)); - } - static getCodewordBucketNumber_Int32Array(moduleBitCount) { - return (moduleBitCount[0] - moduleBitCount[2] + moduleBitCount[4] - moduleBitCount[6] + 9) % 9; - } - static toString(barcodeMatrix) { - let formatter = new Formatter(); - // try (let formatter = new Formatter()) { - for (let row /*int*/ = 0; row < barcodeMatrix.length; row++) { - formatter.format('Row %2d: ', row); - for (let column /*int*/ = 0; column < barcodeMatrix[row].length; column++) { - let barcodeValue = barcodeMatrix[row][column]; - if (barcodeValue.getValue().length === 0) { - formatter.format(' ', null); - } - else { - formatter.format('%4d(%2d)', barcodeValue.getValue()[0], barcodeValue.getConfidence(barcodeValue.getValue()[0])); - } - } - formatter.format('%n'); - } - return formatter.toString(); - // } - } - } - /*final*/ PDF417ScanningDecoder.CODEWORD_SKEW_SIZE = 2; - /*final*/ PDF417ScanningDecoder.MAX_ERRORS = 3; - /*final*/ PDF417ScanningDecoder.MAX_EC_CODEWORDS = 512; - /*final*/ PDF417ScanningDecoder.errorCorrection = new ErrorCorrection(); - - /* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - // import java.util.ArrayList; - // import java.util.List; - // import java.util.Map; - /** - * This implementation can detect and decode PDF417 codes in an image. - * - * @author Guenther Grau - */ - /*public final*/ class PDF417Reader { - // private static /*final Result[]*/ EMPTY_RESULT_ARRAY: Result[] = new Result([0]); - /** - * Locates and decodes a PDF417 code in an image. - * - * @return a String representing the content encoded by the PDF417 code - * @throws NotFoundException if a PDF417 code cannot be found, - * @throws FormatException if a PDF417 cannot be decoded - * @throws ChecksumException - */ - // @Override - decode(image, hints = null) { - let result = PDF417Reader.decode(image, hints, false); - if (result == null || result.length === 0 || result[0] == null) { - throw NotFoundException.getNotFoundInstance(); - } - return result[0]; - } - /** - * - * @param BinaryBitmap - * @param image - * @throws NotFoundException - */ - // @Override - decodeMultiple(image, hints = null) { - try { - return PDF417Reader.decode(image, hints, true); - } - catch (ignored) { - if (ignored instanceof FormatException || ignored instanceof ChecksumException) { - throw NotFoundException.getNotFoundInstance(); - } - throw ignored; - } - } - /** - * - * @param image - * @param hints - * @param multiple - * - * @throws NotFoundException - * @throws FormatExceptionß - * @throws ChecksumException - */ - static decode(image, hints, multiple) { - const results = new Array(); - const detectorResult = Detector$3.detectMultiple(image, hints, multiple); - for (const points of detectorResult.getPoints()) { - const decoderResult = PDF417ScanningDecoder.decode(detectorResult.getBits(), points[4], points[5], points[6], points[7], PDF417Reader.getMinCodewordWidth(points), PDF417Reader.getMaxCodewordWidth(points)); - const result = new Result(decoderResult.getText(), decoderResult.getRawBytes(), undefined, points, BarcodeFormat$1.PDF_417); - result.putMetadata(ResultMetadataType$1.ERROR_CORRECTION_LEVEL, decoderResult.getECLevel()); - const pdf417ResultMetadata = decoderResult.getOther(); - if (pdf417ResultMetadata != null) { - result.putMetadata(ResultMetadataType$1.PDF417_EXTRA_METADATA, pdf417ResultMetadata); - } - results.push(result); - } - return results.map(x => x); - } - static getMaxWidth(p1, p2) { - if (p1 == null || p2 == null) { - return 0; - } - return Math.trunc(Math.abs(p1.getX() - p2.getX())); - } - static getMinWidth(p1, p2) { - if (p1 == null || p2 == null) { - return Integer.MAX_VALUE; - } - return Math.trunc(Math.abs(p1.getX() - p2.getX())); - } - static getMaxCodewordWidth(p) { - return Math.floor(Math.max(Math.max(PDF417Reader.getMaxWidth(p[0], p[4]), PDF417Reader.getMaxWidth(p[6], p[2]) * PDF417Common.MODULES_IN_CODEWORD / - PDF417Common.MODULES_IN_STOP_PATTERN), Math.max(PDF417Reader.getMaxWidth(p[1], p[5]), PDF417Reader.getMaxWidth(p[7], p[3]) * PDF417Common.MODULES_IN_CODEWORD / - PDF417Common.MODULES_IN_STOP_PATTERN))); - } - static getMinCodewordWidth(p) { - return Math.floor(Math.min(Math.min(PDF417Reader.getMinWidth(p[0], p[4]), PDF417Reader.getMinWidth(p[6], p[2]) * PDF417Common.MODULES_IN_CODEWORD / - PDF417Common.MODULES_IN_STOP_PATTERN), Math.min(PDF417Reader.getMinWidth(p[1], p[5]), PDF417Reader.getMinWidth(p[7], p[3]) * PDF417Common.MODULES_IN_CODEWORD / - PDF417Common.MODULES_IN_STOP_PATTERN))); - } - // @Override - reset() { - // nothing needs to be reset - } - } - - /** - * Custom Error class of type Exception. - */ - class ReaderException extends Exception { - } - ReaderException.kind = 'ReaderException'; - - /* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /*namespace com.google.zxing {*/ - /** - * MultiFormatReader is a convenience class and the main entry point into the library for most uses. - * By default it attempts to decode all barcode formats that the library supports. Optionally, you - * can provide a hints object to request different behavior, for example only decoding QR codes. - * - * @author Sean Owen - * @author dswitkin@google.com (Daniel Switkin) - */ - class MultiFormatReader { - /** - * Creates an instance of this class - * - * @param {Boolean} verbose if 'true' logs will be dumped to console, otherwise hidden. - * @param hints The hints to use, clearing the previous state. - */ - constructor(verbose, hints) { - this.verbose = (verbose === true); - if (hints) { - this.setHints(hints); - } - } - /** - * This version of decode honors the intent of Reader.decode(BinaryBitmap) in that it - * passes null as a hint to the decoders. However, that makes it inefficient to call repeatedly. - * Use setHints() followed by decodeWithState() for continuous scan applications. - * - * @param image The pixel data to decode - * @return The contents of the image - * - * @throws NotFoundException Any errors which occurred - */ - /*@Override*/ - // public decode(image: BinaryBitmap): Result { - // setHints(null) - // return decodeInternal(image) - // } - /** - * Decode an image using the hints provided. Does not honor existing state. - * - * @param image The pixel data to decode - * @param hints The hints to use, clearing the previous state. - * @return The contents of the image - * - * @throws NotFoundException Any errors which occurred - */ - /*@Override*/ - decode(image, hints) { - if (hints) { - this.setHints(hints); - } - return this.decodeInternal(image); - } - /** - * Decode an image using the state set up by calling setHints() previously. Continuous scan - * clients will get a large speed increase by using this instead of decode(). - * - * @param image The pixel data to decode - * @return The contents of the image - * - * @throws NotFoundException Any errors which occurred - */ - decodeWithState(image) { - // Make sure to set up the default state so we don't crash - if (this.readers === null || this.readers === undefined) { - this.setHints(null); - } - return this.decodeInternal(image); - } - /** - * This method adds state to the MultiFormatReader. By setting the hints once, subsequent calls - * to decodeWithState(image) can reuse the same set of readers without reallocating memory. This - * is important for performance in continuous scan clients. - * - * @param hints The set of hints to use for subsequent calls to decode(image) - */ - setHints(hints) { - this.hints = hints; - const tryHarder = !isNullOrUndefined(hints) - && hints.get(DecodeHintType$1.TRY_HARDER) === true; - const formats = isNullOrUndefined(hints) ? null : hints.get(DecodeHintType$1.POSSIBLE_FORMATS); - const readers = new Array(); - if (!isNullOrUndefined(formats)) { - const addOneDReader = formats.some(f => { - return ( - f === BarcodeFormat$1.UPC_A || - f === BarcodeFormat$1.UPC_E || - f === BarcodeFormat$1.EAN_13 || - f === BarcodeFormat$1.EAN_8 || - f === BarcodeFormat$1.CODABAR || - f === BarcodeFormat$1.CODE_39 || - f === BarcodeFormat$1.CODE_93 || - f === BarcodeFormat$1.CODE_128 || - f === BarcodeFormat$1.ITF || - f === BarcodeFormat$1.RSS_14 || - f === BarcodeFormat$1.RSS_EXPANDED); - }); - // Put 1D readers upfront in "normal" mode - if (addOneDReader && !tryHarder) { - readers.push(new MultiFormatOneDReader(hints, this.verbose)); - } - if (formats.includes(BarcodeFormat$1.QR_CODE)) { - readers.push(new QRCodeReader()); - } - if (formats.includes(BarcodeFormat$1.DATA_MATRIX)) { - readers.push(new DataMatrixReader()); - } - if (formats.includes(BarcodeFormat$1.AZTEC)) { - readers.push(new AztecReader()); - } - if (formats.includes(BarcodeFormat$1.PDF_417)) { - readers.push(new PDF417Reader()); - } - // if (formats.includes(BarcodeFormat.MAXICODE)) { - // readers.push(new MaxiCodeReader()) - // } - // At end in "try harder" mode - if (addOneDReader && tryHarder) { - readers.push(new MultiFormatOneDReader(hints, this.verbose)); - } - } - if (readers.length === 0) { - if (!tryHarder) { - readers.push(new MultiFormatOneDReader(hints, this.verbose)); - } - readers.push(new QRCodeReader()); - readers.push(new DataMatrixReader()); - readers.push(new AztecReader()); - readers.push(new PDF417Reader()); - // readers.push(new MaxiCodeReader()) - if (tryHarder) { - readers.push(new MultiFormatOneDReader(hints, this.verbose)); - } - } - this.readers = readers; // .toArray(new Reader[readers.size()]) - } - /*@Override*/ - reset() { - if (this.readers !== null) { - for (const reader of this.readers) { - reader.reset(); - } - } - } - /** - * @throws NotFoundException - */ - decodeInternal(image) { - if (this.readers === null) { - throw new ReaderException('No readers where selected, nothing can be read.'); - } - for (const reader of this.readers) { - // Trying to decode with ${reader} reader. - try { - return reader.decode(image, this.hints); - } - catch (ex) { - if (ex instanceof ReaderException) { - continue; - } - // Bad Exception. - } - } - throw new NotFoundException('No MultiFormat Readers were able to detect the code.'); - } - } - - class BrowserMultiFormatReader extends BrowserCodeReader { - constructor(hints = null, timeBetweenScansMillis = 500) { - const reader = new MultiFormatReader(); - reader.setHints(hints); - super(reader, timeBetweenScansMillis); - } - /** - * Overwrite decodeBitmap to call decodeWithState, which will pay - * attention to the hints set in the constructor function - */ - decodeBitmap(binaryBitmap) { - return this.reader.decodeWithState(binaryBitmap); - } - } - - /** - * @deprecated Moving to @zxing/browser - * - * QR Code reader to use from browser. - */ - class BrowserPDF417Reader extends BrowserCodeReader { - /** - * Creates an instance of BrowserPDF417Reader. - * @param {number} [timeBetweenScansMillis=500] the time delay between subsequent decode tries - */ - constructor(timeBetweenScansMillis = 500) { - super(new PDF417Reader(), timeBetweenScansMillis); - } - } - - /** - * @deprecated Moving to @zxing/browser - * - * QR Code reader to use from browser. - */ - class BrowserQRCodeReader extends BrowserCodeReader { - /** - * Creates an instance of BrowserQRCodeReader. - * @param {number} [timeBetweenScansMillis=500] the time delay between subsequent decode tries - */ - constructor(timeBetweenScansMillis = 500) { - super(new QRCodeReader(), timeBetweenScansMillis); - } - } - - /* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /*namespace com.google.zxing {*/ - /** - * These are a set of hints that you may pass to Writers to specify their behavior. - * - * @author dswitkin@google.com (Daniel Switkin) - */ - var EncodeHintType; - (function (EncodeHintType) { - /** - * Specifies what degree of error correction to use, for example in QR Codes. - * Type depends on the encoder. For example for QR codes it's type - * {@link com.google.zxing.qrcode.decoder.ErrorCorrectionLevel ErrorCorrectionLevel}. - * For Aztec it is of type {@link Integer}, representing the minimal percentage of error correction words. - * For PDF417 it is of type {@link Integer}, valid values being 0 to 8. - * In all cases, it can also be a {@link String} representation of the desired value as well. - * Note: an Aztec symbol should have a minimum of 25% EC words. - */ - EncodeHintType[EncodeHintType["ERROR_CORRECTION"] = 0] = "ERROR_CORRECTION"; - /** - * Specifies what character encoding to use where applicable (type {@link String}) - */ - EncodeHintType[EncodeHintType["CHARACTER_SET"] = 1] = "CHARACTER_SET"; - /** - * Specifies the matrix shape for Data Matrix (type {@link com.google.zxing.datamatrix.encoder.SymbolShapeHint}) - */ - EncodeHintType[EncodeHintType["DATA_MATRIX_SHAPE"] = 2] = "DATA_MATRIX_SHAPE"; - /** - * Specifies a minimum barcode size (type {@link Dimension}). Only applicable to Data Matrix now. - * - * @deprecated use width/height params in - * {@link com.google.zxing.datamatrix.DataMatrixWriter#encode(String, BarcodeFormat, int, int)} - */ - /*@Deprecated*/ - EncodeHintType[EncodeHintType["MIN_SIZE"] = 3] = "MIN_SIZE"; - /** - * Specifies a maximum barcode size (type {@link Dimension}). Only applicable to Data Matrix now. - * - * @deprecated without replacement - */ - /*@Deprecated*/ - EncodeHintType[EncodeHintType["MAX_SIZE"] = 4] = "MAX_SIZE"; - /** - * Specifies margin, in pixels, to use when generating the barcode. The meaning can vary - * by format; for example it controls margin before and after the barcode horizontally for - * most 1D formats. (Type {@link Integer}, or {@link String} representation of the integer value). - */ - EncodeHintType[EncodeHintType["MARGIN"] = 5] = "MARGIN"; - /** - * Specifies whether to use compact mode for PDF417 (type {@link Boolean}, or "true" or "false" - * {@link String} value). - */ - EncodeHintType[EncodeHintType["PDF417_COMPACT"] = 6] = "PDF417_COMPACT"; - /** - * Specifies what compaction mode to use for PDF417 (type - * {@link com.google.zxing.pdf417.encoder.Compaction Compaction} or {@link String} value of one of its - * enum values). - */ - EncodeHintType[EncodeHintType["PDF417_COMPACTION"] = 7] = "PDF417_COMPACTION"; - /** - * Specifies the minimum and maximum number of rows and columns for PDF417 (type - * {@link com.google.zxing.pdf417.encoder.Dimensions Dimensions}). - */ - EncodeHintType[EncodeHintType["PDF417_DIMENSIONS"] = 8] = "PDF417_DIMENSIONS"; - /** - * Specifies the required number of layers for an Aztec code. - * A negative number (-1, -2, -3, -4) specifies a compact Aztec code. - * 0 indicates to use the minimum number of layers (the default). - * A positive number (1, 2, .. 32) specifies a normal (non-compact) Aztec code. - * (Type {@link Integer}, or {@link String} representation of the integer value). - */ - EncodeHintType[EncodeHintType["AZTEC_LAYERS"] = 9] = "AZTEC_LAYERS"; - /** - * Specifies the exact version of QR code to be encoded. - * (Type {@link Integer}, or {@link String} representation of the integer value). - */ - EncodeHintType[EncodeHintType["QR_VERSION"] = 10] = "QR_VERSION"; - })(EncodeHintType || (EncodeHintType = {})); - var EncodeHintType$1 = EncodeHintType; - - /** - *

    Implements Reed-Solomon encoding, as the name implies.

    - * - * @author Sean Owen - * @author William Rucklidge - */ - class ReedSolomonEncoder { - /** - * A reed solomon error-correcting encoding constructor is created by - * passing as Galois Field with of size equal to the number of code - * words (symbols) in the alphabet (the number of values in each - * element of arrays that are encoded/decoded). - * @param field A galois field with a number of elements equal to the size - * of the alphabet of symbols to encode. - */ - constructor(field) { - this.field = field; - this.cachedGenerators = []; - this.cachedGenerators.push(new GenericGFPoly(field, Int32Array.from([1]))); - } - buildGenerator(degree /*int*/) { - const cachedGenerators = this.cachedGenerators; - if (degree >= cachedGenerators.length) { - let lastGenerator = cachedGenerators[cachedGenerators.length - 1]; - const field = this.field; - for (let d = cachedGenerators.length; d <= degree; d++) { - const nextGenerator = lastGenerator.multiply(new GenericGFPoly(field, Int32Array.from([1, field.exp(d - 1 + field.getGeneratorBase())]))); - cachedGenerators.push(nextGenerator); - lastGenerator = nextGenerator; - } - } - return cachedGenerators[degree]; - } - /** - *

    Encode a sequence of code words (symbols) using Reed-Solomon to allow decoders - * to detect and correct errors that may have been introduced when the resulting - * data is stored or transmitted.

    - * - * @param toEncode array used for both and output. Caller initializes the array with - * the code words (symbols) to be encoded followed by empty elements allocated to make - * space for error-correction code words in the encoded output. The array contains - * the encdoded output when encode returns. Code words are encoded as numbers from - * 0 to n-1, where n is the number of possible code words (symbols), as determined - * by the size of the Galois Field passed in the constructor of this object. - * @param ecBytes the number of elements reserved in the array (first parameter) - * to store error-correction code words. Thus, the number of code words (symbols) - * to encode in the first parameter is thus toEncode.length - ecBytes. - * Note, the use of "bytes" in the name of this parameter is misleading, as there may - * be more or fewer than 256 symbols being encoded, as determined by the number of - * elements in the Galois Field passed as a constructor to this object. - * @throws IllegalArgumentException thrown in response to validation errros. - */ - encode(toEncode, ecBytes /*int*/) { - if (ecBytes === 0) { - throw new IllegalArgumentException('No error correction bytes'); - } - const dataBytes = toEncode.length - ecBytes; - if (dataBytes <= 0) { - throw new IllegalArgumentException('No data bytes provided'); - } - const generator = this.buildGenerator(ecBytes); - const infoCoefficients = new Int32Array(dataBytes); - System.arraycopy(toEncode, 0, infoCoefficients, 0, dataBytes); - let info = new GenericGFPoly(this.field, infoCoefficients); - info = info.multiplyByMonomial(ecBytes, 1); - const remainder = info.divide(generator)[1]; - const coefficients = remainder.getCoefficients(); - const numZeroCoefficients = ecBytes - coefficients.length; - for (let i = 0; i < numZeroCoefficients; i++) { - toEncode[dataBytes + i] = 0; - } - System.arraycopy(coefficients, 0, toEncode, dataBytes + numZeroCoefficients, coefficients.length); - } - } - - /** - * @author Satoru Takabayashi - * @author Daniel Switkin - * @author Sean Owen - */ - class MaskUtil { - constructor() { - // do nothing - } - /** - * Apply mask penalty rule 1 and return the penalty. Find repetitive cells with the same color and - * give penalty to them. Example: 00000 or 11111. - */ - static applyMaskPenaltyRule1(matrix) { - return MaskUtil.applyMaskPenaltyRule1Internal(matrix, true) + MaskUtil.applyMaskPenaltyRule1Internal(matrix, false); - } - /** - * Apply mask penalty rule 2 and return the penalty. Find 2x2 blocks with the same color and give - * penalty to them. This is actually equivalent to the spec's rule, which is to find MxN blocks and give a - * penalty proportional to (M-1)x(N-1), because this is the number of 2x2 blocks inside such a block. - */ - static applyMaskPenaltyRule2(matrix) { - let penalty = 0; - const array = matrix.getArray(); - const width = matrix.getWidth(); - const height = matrix.getHeight(); - for (let y = 0; y < height - 1; y++) { - const arrayY = array[y]; - for (let x = 0; x < width - 1; x++) { - const value = arrayY[x]; - if (value === arrayY[x + 1] && value === array[y + 1][x] && value === array[y + 1][x + 1]) { - penalty++; - } - } - } - return MaskUtil.N2 * penalty; - } - /** - * Apply mask penalty rule 3 and return the penalty. Find consecutive runs of 1:1:3:1:1:4 - * starting with black, or 4:1:1:3:1:1 starting with white, and give penalty to them. If we - * find patterns like 000010111010000, we give penalty once. - */ - static applyMaskPenaltyRule3(matrix) { - let numPenalties = 0; - const array = matrix.getArray(); - const width = matrix.getWidth(); - const height = matrix.getHeight(); - for (let y = 0; y < height; y++) { - for (let x = 0; x < width; x++) { - const arrayY = array[y]; // We can at least optimize this access - if (x + 6 < width && - arrayY[x] === 1 && - arrayY[x + 1] === 0 && - arrayY[x + 2] === 1 && - arrayY[x + 3] === 1 && - arrayY[x + 4] === 1 && - arrayY[x + 5] === 0 && - arrayY[x + 6] === 1 && - (MaskUtil.isWhiteHorizontal(arrayY, x - 4, x) || MaskUtil.isWhiteHorizontal(arrayY, x + 7, x + 11))) { - numPenalties++; - } - if (y + 6 < height && - array[y][x] === 1 && - array[y + 1][x] === 0 && - array[y + 2][x] === 1 && - array[y + 3][x] === 1 && - array[y + 4][x] === 1 && - array[y + 5][x] === 0 && - array[y + 6][x] === 1 && - (MaskUtil.isWhiteVertical(array, x, y - 4, y) || MaskUtil.isWhiteVertical(array, x, y + 7, y + 11))) { - numPenalties++; - } - } - } - return numPenalties * MaskUtil.N3; - } - static isWhiteHorizontal(rowArray, from /*int*/, to /*int*/) { - from = Math.max(from, 0); - to = Math.min(to, rowArray.length); - for (let i = from; i < to; i++) { - if (rowArray[i] === 1) { - return false; - } - } - return true; - } - static isWhiteVertical(array, col /*int*/, from /*int*/, to /*int*/) { - from = Math.max(from, 0); - to = Math.min(to, array.length); - for (let i = from; i < to; i++) { - if (array[i][col] === 1) { - return false; - } - } - return true; - } - /** - * Apply mask penalty rule 4 and return the penalty. Calculate the ratio of dark cells and give - * penalty if the ratio is far from 50%. It gives 10 penalty for 5% distance. - */ - static applyMaskPenaltyRule4(matrix) { - let numDarkCells = 0; - const array = matrix.getArray(); - const width = matrix.getWidth(); - const height = matrix.getHeight(); - for (let y = 0; y < height; y++) { - const arrayY = array[y]; - for (let x = 0; x < width; x++) { - if (arrayY[x] === 1) { - numDarkCells++; - } - } - } - const numTotalCells = matrix.getHeight() * matrix.getWidth(); - const fivePercentVariances = Math.floor(Math.abs(numDarkCells * 2 - numTotalCells) * 10 / numTotalCells); - return fivePercentVariances * MaskUtil.N4; - } - /** - * Return the mask bit for "getMaskPattern" at "x" and "y". See 8.8 of JISX0510:2004 for mask - * pattern conditions. - */ - static getDataMaskBit(maskPattern /*int*/, x /*int*/, y /*int*/) { - let intermediate; /*int*/ - let temp; /*int*/ - switch (maskPattern) { - case 0: - intermediate = (y + x) & 0x1; - break; - case 1: - intermediate = y & 0x1; - break; - case 2: - intermediate = x % 3; - break; - case 3: - intermediate = (y + x) % 3; - break; - case 4: - intermediate = (Math.floor(y / 2) + Math.floor(x / 3)) & 0x1; - break; - case 5: - temp = y * x; - intermediate = (temp & 0x1) + (temp % 3); - break; - case 6: - temp = y * x; - intermediate = ((temp & 0x1) + (temp % 3)) & 0x1; - break; - case 7: - temp = y * x; - intermediate = ((temp % 3) + ((y + x) & 0x1)) & 0x1; - break; - default: - throw new IllegalArgumentException('Invalid mask pattern: ' + maskPattern); - } - return intermediate === 0; - } - /** - * Helper function for applyMaskPenaltyRule1. We need this for doing this calculation in both - * vertical and horizontal orders respectively. - */ - static applyMaskPenaltyRule1Internal(matrix, isHorizontal) { - let penalty = 0; - const iLimit = isHorizontal ? matrix.getHeight() : matrix.getWidth(); - const jLimit = isHorizontal ? matrix.getWidth() : matrix.getHeight(); - const array = matrix.getArray(); - for (let i = 0; i < iLimit; i++) { - let numSameBitCells = 0; - let prevBit = -1; - for (let j = 0; j < jLimit; j++) { - const bit = isHorizontal ? array[i][j] : array[j][i]; - if (bit === prevBit) { - numSameBitCells++; - } - else { - if (numSameBitCells >= 5) { - penalty += MaskUtil.N1 + (numSameBitCells - 5); - } - numSameBitCells = 1; // Include the cell itself. - prevBit = bit; - } - } - if (numSameBitCells >= 5) { - penalty += MaskUtil.N1 + (numSameBitCells - 5); - } - } - return penalty; - } - } - // Penalty weights from section 6.8.2.1 - MaskUtil.N1 = 3; - MaskUtil.N2 = 3; - MaskUtil.N3 = 40; - MaskUtil.N4 = 10; - - /** - * JAVAPORT: The original code was a 2D array of ints, but since it only ever gets assigned - * -1, 0, and 1, I'm going to use less memory and go with bytes. - * - * @author dswitkin@google.com (Daniel Switkin) - */ - class ByteMatrix { - constructor(width /*int*/, height /*int*/) { - this.width = width; - this.height = height; - const bytes = new Array(height); // [height][width] - for (let i = 0; i !== height; i++) { - bytes[i] = new Uint8Array(width); - } - this.bytes = bytes; - } - getHeight() { - return this.height; - } - getWidth() { - return this.width; - } - get(x /*int*/, y /*int*/) { - return this.bytes[y][x]; - } - /** - * @return an internal representation as bytes, in row-major order. array[y][x] represents point (x,y) - */ - getArray() { - return this.bytes; - } - // TYPESCRIPTPORT: preffer to let two methods instead of override to avoid type comparison inside - setNumber(x /*int*/, y /*int*/, value /*byte|int*/) { - this.bytes[y][x] = value; - } - // public set(x: number /*int*/, y: number /*int*/, value: number /*int*/): void { - // bytes[y][x] = (byte) value - // } - setBoolean(x /*int*/, y /*int*/, value) { - this.bytes[y][x] = /*(byte) */ (value ? 1 : 0); - } - clear(value /*byte*/) { - for (const aByte of this.bytes) { - Arrays.fill(aByte, value); - } - } - equals(o) { - if (!(o instanceof ByteMatrix)) { - return false; - } - const other = o; - if (this.width !== other.width) { - return false; - } - if (this.height !== other.height) { - return false; - } - for (let y = 0, height = this.height; y < height; ++y) { - const bytesY = this.bytes[y]; - const otherBytesY = other.bytes[y]; - for (let x = 0, width = this.width; x < width; ++x) { - if (bytesY[x] !== otherBytesY[x]) { - return false; - } - } - } - return true; - } - /*@Override*/ - toString() { - const result = new StringBuilder(); // (2 * width * height + 2) - for (let y = 0, height = this.height; y < height; ++y) { - const bytesY = this.bytes[y]; - for (let x = 0, width = this.width; x < width; ++x) { - switch (bytesY[x]) { - case 0: - result.append(' 0'); - break; - case 1: - result.append(' 1'); - break; - default: - result.append(' '); - break; - } - } - result.append('\n'); - } - return result.toString(); - } - } - - /** - * @author satorux@google.com (Satoru Takabayashi) - creator - * @author dswitkin@google.com (Daniel Switkin) - ported from C++ - */ - class QRCode { - constructor() { - this.maskPattern = -1; - } - getMode() { - return this.mode; - } - getECLevel() { - return this.ecLevel; - } - getVersion() { - return this.version; - } - getMaskPattern() { - return this.maskPattern; - } - getMatrix() { - return this.matrix; - } - /*@Override*/ - toString() { - const result = new StringBuilder(); // (200) - result.append('<<\n'); - result.append(' mode: '); - result.append(this.mode ? this.mode.toString() : 'null'); - result.append('\n ecLevel: '); - result.append(this.ecLevel ? this.ecLevel.toString() : 'null'); - result.append('\n version: '); - result.append(this.version ? this.version.toString() : 'null'); - result.append('\n maskPattern: '); - result.append(this.maskPattern.toString()); - if (this.matrix) { - result.append('\n matrix:\n'); - result.append(this.matrix.toString()); - } - else { - result.append('\n matrix: null\n'); - } - result.append('>>\n'); - return result.toString(); - } - setMode(value) { - this.mode = value; - } - setECLevel(value) { - this.ecLevel = value; - } - setVersion(version) { - this.version = version; - } - setMaskPattern(value /*int*/) { - this.maskPattern = value; - } - setMatrix(value) { - this.matrix = value; - } - // Check if "mask_pattern" is valid. - static isValidMaskPattern(maskPattern /*int*/) { - return maskPattern >= 0 && maskPattern < QRCode.NUM_MASK_PATTERNS; - } - } - QRCode.NUM_MASK_PATTERNS = 8; - - /** - * Custom Error class of type Exception. - */ - class WriterException extends Exception { - } - WriterException.kind = 'WriterException'; - - /** - * @author satorux@google.com (Satoru Takabayashi) - creator - * @author dswitkin@google.com (Daniel Switkin) - ported from C++ - */ - class MatrixUtil { - constructor() { - // do nothing - } - // Set all cells to -1 (TYPESCRIPTPORT: 255). -1 (TYPESCRIPTPORT: 255) means that the cell is empty (not set yet). - // - // JAVAPORT: We shouldn't need to do this at all. The code should be rewritten to begin encoding - // with the ByteMatrix initialized all to zero. - static clearMatrix(matrix) { - // TYPESCRIPTPORT: we use UintArray se changed here from -1 to 255 - matrix.clear(/*(byte) */ /*-1*/ 255); - } - // Build 2D matrix of QR Code from "dataBits" with "ecLevel", "version" and "getMaskPattern". On - // success, store the result in "matrix" and return true. - static buildMatrix(dataBits, ecLevel, version, maskPattern /*int*/, matrix) { - MatrixUtil.clearMatrix(matrix); - MatrixUtil.embedBasicPatterns(version, matrix); - // Type information appear with any version. - MatrixUtil.embedTypeInfo(ecLevel, maskPattern, matrix); - // Version info appear if version >= 7. - MatrixUtil.maybeEmbedVersionInfo(version, matrix); - // Data should be embedded at end. - MatrixUtil.embedDataBits(dataBits, maskPattern, matrix); - } - // Embed basic patterns. On success, modify the matrix and return true. - // The basic patterns are: - // - Position detection patterns - // - Timing patterns - // - Dark dot at the left bottom corner - // - Position adjustment patterns, if need be - static embedBasicPatterns(version, matrix) { - // Let's get started with embedding big squares at corners. - MatrixUtil.embedPositionDetectionPatternsAndSeparators(matrix); - // Then, embed the dark dot at the left bottom corner. - MatrixUtil.embedDarkDotAtLeftBottomCorner(matrix); - // Position adjustment patterns appear if version >= 2. - MatrixUtil.maybeEmbedPositionAdjustmentPatterns(version, matrix); - // Timing patterns should be embedded after position adj. patterns. - MatrixUtil.embedTimingPatterns(matrix); - } - // Embed type information. On success, modify the matrix. - static embedTypeInfo(ecLevel, maskPattern /*int*/, matrix) { - const typeInfoBits = new BitArray(); - MatrixUtil.makeTypeInfoBits(ecLevel, maskPattern, typeInfoBits); - for (let i = 0, size = typeInfoBits.getSize(); i < size; ++i) { - // Place bits in LSB to MSB order. LSB (least significant bit) is the last value in - // "typeInfoBits". - const bit = typeInfoBits.get(typeInfoBits.getSize() - 1 - i); - // Type info bits at the left top corner. See 8.9 of JISX0510:2004 (p.46). - const coordinates = MatrixUtil.TYPE_INFO_COORDINATES[i]; - const x1 = coordinates[0]; - const y1 = coordinates[1]; - matrix.setBoolean(x1, y1, bit); - if (i < 8) { - // Right top corner. - const x2 = matrix.getWidth() - i - 1; - const y2 = 8; - matrix.setBoolean(x2, y2, bit); - } - else { - // Left bottom corner. - const x2 = 8; - const y2 = matrix.getHeight() - 7 + (i - 8); - matrix.setBoolean(x2, y2, bit); - } - } - } - // Embed version information if need be. On success, modify the matrix and return true. - // See 8.10 of JISX0510:2004 (p.47) for how to embed version information. - static maybeEmbedVersionInfo(version, matrix) { - if (version.getVersionNumber() < 7) { // Version info is necessary if version >= 7. - return; // Don't need version info. - } - const versionInfoBits = new BitArray(); - MatrixUtil.makeVersionInfoBits(version, versionInfoBits); - let bitIndex = 6 * 3 - 1; // It will decrease from 17 to 0. - for (let i = 0; i < 6; ++i) { - for (let j = 0; j < 3; ++j) { - // Place bits in LSB (least significant bit) to MSB order. - const bit = versionInfoBits.get(bitIndex); - bitIndex--; - // Left bottom corner. - matrix.setBoolean(i, matrix.getHeight() - 11 + j, bit); - // Right bottom corner. - matrix.setBoolean(matrix.getHeight() - 11 + j, i, bit); - } - } - } - // Embed "dataBits" using "getMaskPattern". On success, modify the matrix and return true. - // For debugging purposes, it skips masking process if "getMaskPattern" is -1(TYPESCRIPTPORT: 255). - // See 8.7 of JISX0510:2004 (p.38) for how to embed data bits. - static embedDataBits(dataBits, maskPattern /*int*/, matrix) { - let bitIndex = 0; - let direction = -1; - // Start from the right bottom cell. - let x = matrix.getWidth() - 1; - let y = matrix.getHeight() - 1; - while (x > 0) { - // Skip the vertical timing pattern. - if (x === 6) { - x -= 1; - } - while (y >= 0 && y < matrix.getHeight()) { - for (let i = 0; i < 2; ++i) { - const xx = x - i; - // Skip the cell if it's not empty. - if (!MatrixUtil.isEmpty(matrix.get(xx, y))) { - continue; - } - let bit; - if (bitIndex < dataBits.getSize()) { - bit = dataBits.get(bitIndex); - ++bitIndex; - } - else { - // Padding bit. If there is no bit left, we'll fill the left cells with 0, as described - // in 8.4.9 of JISX0510:2004 (p. 24). - bit = false; - } - // Skip masking if mask_pattern is -1 (TYPESCRIPTPORT: 255). - if (maskPattern !== 255 && MaskUtil.getDataMaskBit(maskPattern, xx, y)) { - bit = !bit; - } - matrix.setBoolean(xx, y, bit); - } - y += direction; - } - direction = -direction; // Reverse the direction. - y += direction; - x -= 2; // Move to the left. - } - // All bits should be consumed. - if (bitIndex !== dataBits.getSize()) { - throw new WriterException('Not all bits consumed: ' + bitIndex + '/' + dataBits.getSize()); - } - } - // Return the position of the most significant bit set (one: to) in the "value". The most - // significant bit is position 32. If there is no bit set, return 0. Examples: - // - findMSBSet(0) => 0 - // - findMSBSet(1) => 1 - // - findMSBSet(255) => 8 - static findMSBSet(value /*int*/) { - return 32 - Integer.numberOfLeadingZeros(value); - } - // Calculate BCH (Bose-Chaudhuri-Hocquenghem) code for "value" using polynomial "poly". The BCH - // code is used for encoding type information and version information. - // Example: Calculation of version information of 7. - // f(x) is created from 7. - // - 7 = 000111 in 6 bits - // - f(x) = x^2 + x^1 + x^0 - // g(x) is given by the standard (p. 67) - // - g(x) = x^12 + x^11 + x^10 + x^9 + x^8 + x^5 + x^2 + 1 - // Multiply f(x) by x^(18 - 6) - // - f'(x) = f(x) * x^(18 - 6) - // - f'(x) = x^14 + x^13 + x^12 - // Calculate the remainder of f'(x) / g(x) - // x^2 - // __________________________________________________ - // g(x) )x^14 + x^13 + x^12 - // x^14 + x^13 + x^12 + x^11 + x^10 + x^7 + x^4 + x^2 - // -------------------------------------------------- - // x^11 + x^10 + x^7 + x^4 + x^2 - // - // The remainder is x^11 + x^10 + x^7 + x^4 + x^2 - // Encode it in binary: 110010010100 - // The return value is 0xc94 (1100 1001 0100) - // - // Since all coefficients in the polynomials are 1 or 0, we can do the calculation by bit - // operations. We don't care if coefficients are positive or negative. - static calculateBCHCode(value /*int*/, poly /*int*/) { - if (poly === 0) { - throw new IllegalArgumentException('0 polynomial'); - } - // If poly is "1 1111 0010 0101" (version info poly), msbSetInPoly is 13. We'll subtract 1 - // from 13 to make it 12. - const msbSetInPoly = MatrixUtil.findMSBSet(poly); - value <<= msbSetInPoly - 1; - // Do the division business using exclusive-or operations. - while (MatrixUtil.findMSBSet(value) >= msbSetInPoly) { - value ^= poly << (MatrixUtil.findMSBSet(value) - msbSetInPoly); - } - // Now the "value" is the remainder (i.e. the BCH code) - return value; - } - // Make bit vector of type information. On success, store the result in "bits" and return true. - // Encode error correction level and mask pattern. See 8.9 of - // JISX0510:2004 (p.45) for details. - static makeTypeInfoBits(ecLevel, maskPattern /*int*/, bits) { - if (!QRCode.isValidMaskPattern(maskPattern)) { - throw new WriterException('Invalid mask pattern'); - } - const typeInfo = (ecLevel.getBits() << 3) | maskPattern; - bits.appendBits(typeInfo, 5); - const bchCode = MatrixUtil.calculateBCHCode(typeInfo, MatrixUtil.TYPE_INFO_POLY); - bits.appendBits(bchCode, 10); - const maskBits = new BitArray(); - maskBits.appendBits(MatrixUtil.TYPE_INFO_MASK_PATTERN, 15); - bits.xor(maskBits); - if (bits.getSize() !== 15) { // Just in case. - throw new WriterException('should not happen but we got: ' + bits.getSize()); - } - } - // Make bit vector of version information. On success, store the result in "bits" and return true. - // See 8.10 of JISX0510:2004 (p.45) for details. - static makeVersionInfoBits(version, bits) { - bits.appendBits(version.getVersionNumber(), 6); - const bchCode = MatrixUtil.calculateBCHCode(version.getVersionNumber(), MatrixUtil.VERSION_INFO_POLY); - bits.appendBits(bchCode, 12); - if (bits.getSize() !== 18) { // Just in case. - throw new WriterException('should not happen but we got: ' + bits.getSize()); - } - } - // Check if "value" is empty. - static isEmpty(value /*int*/) { - return value === 255; // -1 - } - static embedTimingPatterns(matrix) { - // -8 is for skipping position detection patterns (7: size), and two horizontal/vertical - // separation patterns (1: size). Thus, 8 = 7 + 1. - for (let i = 8; i < matrix.getWidth() - 8; ++i) { - const bit = (i + 1) % 2; - // Horizontal line. - if (MatrixUtil.isEmpty(matrix.get(i, 6))) { - matrix.setNumber(i, 6, bit); - } - // Vertical line. - if (MatrixUtil.isEmpty(matrix.get(6, i))) { - matrix.setNumber(6, i, bit); - } - } - } - // Embed the lonely dark dot at left bottom corner. JISX0510:2004 (p.46) - static embedDarkDotAtLeftBottomCorner(matrix) { - if (matrix.get(8, matrix.getHeight() - 8) === 0) { - throw new WriterException(); - } - matrix.setNumber(8, matrix.getHeight() - 8, 1); - } - static embedHorizontalSeparationPattern(xStart /*int*/, yStart /*int*/, matrix) { - for (let x = 0; x < 8; ++x) { - if (!MatrixUtil.isEmpty(matrix.get(xStart + x, yStart))) { - throw new WriterException(); - } - matrix.setNumber(xStart + x, yStart, 0); - } - } - static embedVerticalSeparationPattern(xStart /*int*/, yStart /*int*/, matrix) { - for (let y = 0; y < 7; ++y) { - if (!MatrixUtil.isEmpty(matrix.get(xStart, yStart + y))) { - throw new WriterException(); - } - matrix.setNumber(xStart, yStart + y, 0); - } - } - static embedPositionAdjustmentPattern(xStart /*int*/, yStart /*int*/, matrix) { - for (let y = 0; y < 5; ++y) { - const patternY = MatrixUtil.POSITION_ADJUSTMENT_PATTERN[y]; - for (let x = 0; x < 5; ++x) { - matrix.setNumber(xStart + x, yStart + y, patternY[x]); - } - } - } - static embedPositionDetectionPattern(xStart /*int*/, yStart /*int*/, matrix) { - for (let y = 0; y < 7; ++y) { - const patternY = MatrixUtil.POSITION_DETECTION_PATTERN[y]; - for (let x = 0; x < 7; ++x) { - matrix.setNumber(xStart + x, yStart + y, patternY[x]); - } - } - } - // Embed position detection patterns and surrounding vertical/horizontal separators. - static embedPositionDetectionPatternsAndSeparators(matrix) { - // Embed three big squares at corners. - const pdpWidth = MatrixUtil.POSITION_DETECTION_PATTERN[0].length; - // Left top corner. - MatrixUtil.embedPositionDetectionPattern(0, 0, matrix); - // Right top corner. - MatrixUtil.embedPositionDetectionPattern(matrix.getWidth() - pdpWidth, 0, matrix); - // Left bottom corner. - MatrixUtil.embedPositionDetectionPattern(0, matrix.getWidth() - pdpWidth, matrix); - // Embed horizontal separation patterns around the squares. - const hspWidth = 8; - // Left top corner. - MatrixUtil.embedHorizontalSeparationPattern(0, hspWidth - 1, matrix); - // Right top corner. - MatrixUtil.embedHorizontalSeparationPattern(matrix.getWidth() - hspWidth, hspWidth - 1, matrix); - // Left bottom corner. - MatrixUtil.embedHorizontalSeparationPattern(0, matrix.getWidth() - hspWidth, matrix); - // Embed vertical separation patterns around the squares. - const vspSize = 7; - // Left top corner. - MatrixUtil.embedVerticalSeparationPattern(vspSize, 0, matrix); - // Right top corner. - MatrixUtil.embedVerticalSeparationPattern(matrix.getHeight() - vspSize - 1, 0, matrix); - // Left bottom corner. - MatrixUtil.embedVerticalSeparationPattern(vspSize, matrix.getHeight() - vspSize, matrix); - } - // Embed position adjustment patterns if need be. - static maybeEmbedPositionAdjustmentPatterns(version, matrix) { - if (version.getVersionNumber() < 2) { // The patterns appear if version >= 2 - return; - } - const index = version.getVersionNumber() - 1; - const coordinates = MatrixUtil.POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[index]; - for (let i = 0, length = coordinates.length; i !== length; i++) { - const y = coordinates[i]; - if (y >= 0) { - for (let j = 0; j !== length; j++) { - const x = coordinates[j]; - if (x >= 0 && MatrixUtil.isEmpty(matrix.get(x, y))) { - // If the cell is unset, we embed the position adjustment pattern here. - // -2 is necessary since the x/y coordinates point to the center of the pattern, not the - // left top corner. - MatrixUtil.embedPositionAdjustmentPattern(x - 2, y - 2, matrix); - } - } - } - } - } - } - MatrixUtil.POSITION_DETECTION_PATTERN = Array.from([ - Int32Array.from([1, 1, 1, 1, 1, 1, 1]), - Int32Array.from([1, 0, 0, 0, 0, 0, 1]), - Int32Array.from([1, 0, 1, 1, 1, 0, 1]), - Int32Array.from([1, 0, 1, 1, 1, 0, 1]), - Int32Array.from([1, 0, 1, 1, 1, 0, 1]), - Int32Array.from([1, 0, 0, 0, 0, 0, 1]), - Int32Array.from([1, 1, 1, 1, 1, 1, 1]), - ]); - MatrixUtil.POSITION_ADJUSTMENT_PATTERN = Array.from([ - Int32Array.from([1, 1, 1, 1, 1]), - Int32Array.from([1, 0, 0, 0, 1]), - Int32Array.from([1, 0, 1, 0, 1]), - Int32Array.from([1, 0, 0, 0, 1]), - Int32Array.from([1, 1, 1, 1, 1]), - ]); - // From Appendix E. Table 1, JIS0510X:2004 (71: p). The table was double-checked by komatsu. - MatrixUtil.POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE = Array.from([ - Int32Array.from([-1, -1, -1, -1, -1, -1, -1]), - Int32Array.from([6, 18, -1, -1, -1, -1, -1]), - Int32Array.from([6, 22, -1, -1, -1, -1, -1]), - Int32Array.from([6, 26, -1, -1, -1, -1, -1]), - Int32Array.from([6, 30, -1, -1, -1, -1, -1]), - Int32Array.from([6, 34, -1, -1, -1, -1, -1]), - Int32Array.from([6, 22, 38, -1, -1, -1, -1]), - Int32Array.from([6, 24, 42, -1, -1, -1, -1]), - Int32Array.from([6, 26, 46, -1, -1, -1, -1]), - Int32Array.from([6, 28, 50, -1, -1, -1, -1]), - Int32Array.from([6, 30, 54, -1, -1, -1, -1]), - Int32Array.from([6, 32, 58, -1, -1, -1, -1]), - Int32Array.from([6, 34, 62, -1, -1, -1, -1]), - Int32Array.from([6, 26, 46, 66, -1, -1, -1]), - Int32Array.from([6, 26, 48, 70, -1, -1, -1]), - Int32Array.from([6, 26, 50, 74, -1, -1, -1]), - Int32Array.from([6, 30, 54, 78, -1, -1, -1]), - Int32Array.from([6, 30, 56, 82, -1, -1, -1]), - Int32Array.from([6, 30, 58, 86, -1, -1, -1]), - Int32Array.from([6, 34, 62, 90, -1, -1, -1]), - Int32Array.from([6, 28, 50, 72, 94, -1, -1]), - Int32Array.from([6, 26, 50, 74, 98, -1, -1]), - Int32Array.from([6, 30, 54, 78, 102, -1, -1]), - Int32Array.from([6, 28, 54, 80, 106, -1, -1]), - Int32Array.from([6, 32, 58, 84, 110, -1, -1]), - Int32Array.from([6, 30, 58, 86, 114, -1, -1]), - Int32Array.from([6, 34, 62, 90, 118, -1, -1]), - Int32Array.from([6, 26, 50, 74, 98, 122, -1]), - Int32Array.from([6, 30, 54, 78, 102, 126, -1]), - Int32Array.from([6, 26, 52, 78, 104, 130, -1]), - Int32Array.from([6, 30, 56, 82, 108, 134, -1]), - Int32Array.from([6, 34, 60, 86, 112, 138, -1]), - Int32Array.from([6, 30, 58, 86, 114, 142, -1]), - Int32Array.from([6, 34, 62, 90, 118, 146, -1]), - Int32Array.from([6, 30, 54, 78, 102, 126, 150]), - Int32Array.from([6, 24, 50, 76, 102, 128, 154]), - Int32Array.from([6, 28, 54, 80, 106, 132, 158]), - Int32Array.from([6, 32, 58, 84, 110, 136, 162]), - Int32Array.from([6, 26, 54, 82, 110, 138, 166]), - Int32Array.from([6, 30, 58, 86, 114, 142, 170]), - ]); - // Type info cells at the left top corner. - MatrixUtil.TYPE_INFO_COORDINATES = Array.from([ - Int32Array.from([8, 0]), - Int32Array.from([8, 1]), - Int32Array.from([8, 2]), - Int32Array.from([8, 3]), - Int32Array.from([8, 4]), - Int32Array.from([8, 5]), - Int32Array.from([8, 7]), - Int32Array.from([8, 8]), - Int32Array.from([7, 8]), - Int32Array.from([5, 8]), - Int32Array.from([4, 8]), - Int32Array.from([3, 8]), - Int32Array.from([2, 8]), - Int32Array.from([1, 8]), - Int32Array.from([0, 8]), - ]); - // From Appendix D in JISX0510:2004 (p. 67) - MatrixUtil.VERSION_INFO_POLY = 0x1f25; // 1 1111 0010 0101 - // From Appendix C in JISX0510:2004 (p.65). - MatrixUtil.TYPE_INFO_POLY = 0x537; - MatrixUtil.TYPE_INFO_MASK_PATTERN = 0x5412; - - /*namespace com.google.zxing.qrcode.encoder {*/ - class BlockPair { - constructor(dataBytes, errorCorrectionBytes) { - this.dataBytes = dataBytes; - this.errorCorrectionBytes = errorCorrectionBytes; - } - getDataBytes() { - return this.dataBytes; - } - getErrorCorrectionBytes() { - return this.errorCorrectionBytes; - } - } - - /*import java.io.UnsupportedEncodingException;*/ - /*import java.util.ArrayList;*/ - /*import java.util.Collection;*/ - /*import java.util.Map;*/ - /** - * @author satorux@google.com (Satoru Takabayashi) - creator - * @author dswitkin@google.com (Daniel Switkin) - ported from C++ - */ - class Encoder { - // TYPESCRIPTPORT: changed to UTF8, the default for js - constructor() { } - // The mask penalty calculation is complicated. See Table 21 of JISX0510:2004 (p.45) for details. - // Basically it applies four rules and summate all penalties. - static calculateMaskPenalty(matrix) { - return MaskUtil.applyMaskPenaltyRule1(matrix) - + MaskUtil.applyMaskPenaltyRule2(matrix) - + MaskUtil.applyMaskPenaltyRule3(matrix) - + MaskUtil.applyMaskPenaltyRule4(matrix); - } - /** - * @param content text to encode - * @param ecLevel error correction level to use - * @return {@link QRCode} representing the encoded QR code - * @throws WriterException if encoding can't succeed, because of for example invalid content - * or configuration - */ - // public static encode(content: string, ecLevel: ErrorCorrectionLevel): QRCode /*throws WriterException*/ { - // return encode(content, ecLevel, null) - // } - static encode(content, ecLevel, hints = null) { - // Determine what character encoding has been specified by the caller, if any - let encoding = Encoder.DEFAULT_BYTE_MODE_ENCODING; - const hasEncodingHint = hints !== null && undefined !== hints.get(EncodeHintType$1.CHARACTER_SET); - if (hasEncodingHint) { - encoding = hints.get(EncodeHintType$1.CHARACTER_SET).toString(); - } - // Pick an encoding mode appropriate for the content. Note that this will not attempt to use - // multiple modes / segments even if that were more efficient. Twould be nice. - const mode = this.chooseMode(content, encoding); - // This will store the header information, like mode and - // length, as well as "header" segments like an ECI segment. - const headerBits = new BitArray(); - // Append ECI segment if applicable - if (mode === Mode$1.BYTE && (hasEncodingHint || Encoder.DEFAULT_BYTE_MODE_ENCODING !== encoding)) { - const eci = CharacterSetECI.getCharacterSetECIByName(encoding); - if (eci !== undefined) { - this.appendECI(eci, headerBits); - } - } - // (With ECI in place,) Write the mode marker - this.appendModeInfo(mode, headerBits); - // Collect data within the main segment, separately, to count its size if needed. Don't add it to - // main payload yet. - const dataBits = new BitArray(); - this.appendBytes(content, mode, dataBits, encoding); - let version; - if (hints !== null && undefined !== hints.get(EncodeHintType$1.QR_VERSION)) { - const versionNumber = Number.parseInt(hints.get(EncodeHintType$1.QR_VERSION).toString(), 10); - version = Version$1.getVersionForNumber(versionNumber); - const bitsNeeded = this.calculateBitsNeeded(mode, headerBits, dataBits, version); - if (!this.willFit(bitsNeeded, version, ecLevel)) { - throw new WriterException('Data too big for requested version'); - } - } - else { - version = this.recommendVersion(ecLevel, mode, headerBits, dataBits); - } - const headerAndDataBits = new BitArray(); - headerAndDataBits.appendBitArray(headerBits); - // Find "length" of main segment and write it - const numLetters = mode === Mode$1.BYTE ? dataBits.getSizeInBytes() : content.length; - this.appendLengthInfo(numLetters, version, mode, headerAndDataBits); - // Put data together into the overall payload - headerAndDataBits.appendBitArray(dataBits); - const ecBlocks = version.getECBlocksForLevel(ecLevel); - const numDataBytes = version.getTotalCodewords() - ecBlocks.getTotalECCodewords(); - // Terminate the bits properly. - this.terminateBits(numDataBytes, headerAndDataBits); - // Interleave data bits with error correction code. - const finalBits = this.interleaveWithECBytes(headerAndDataBits, version.getTotalCodewords(), numDataBytes, ecBlocks.getNumBlocks()); - const qrCode = new QRCode(); - qrCode.setECLevel(ecLevel); - qrCode.setMode(mode); - qrCode.setVersion(version); - // Choose the mask pattern and set to "qrCode". - const dimension = version.getDimensionForVersion(); - const matrix = new ByteMatrix(dimension, dimension); - const maskPattern = this.chooseMaskPattern(finalBits, ecLevel, version, matrix); - qrCode.setMaskPattern(maskPattern); - // Build the matrix and set it to "qrCode". - MatrixUtil.buildMatrix(finalBits, ecLevel, version, maskPattern, matrix); - qrCode.setMatrix(matrix); - return qrCode; - } - /** - * Decides the smallest version of QR code that will contain all of the provided data. - * - * @throws WriterException if the data cannot fit in any version - */ - static recommendVersion(ecLevel, mode, headerBits, dataBits) { - // Hard part: need to know version to know how many bits length takes. But need to know how many - // bits it takes to know version. First we take a guess at version by assuming version will be - // the minimum, 1: - const provisionalBitsNeeded = this.calculateBitsNeeded(mode, headerBits, dataBits, Version$1.getVersionForNumber(1)); - const provisionalVersion = this.chooseVersion(provisionalBitsNeeded, ecLevel); - // Use that guess to calculate the right version. I am still not sure this works in 100% of cases. - const bitsNeeded = this.calculateBitsNeeded(mode, headerBits, dataBits, provisionalVersion); - return this.chooseVersion(bitsNeeded, ecLevel); - } - static calculateBitsNeeded(mode, headerBits, dataBits, version) { - return headerBits.getSize() + mode.getCharacterCountBits(version) + dataBits.getSize(); - } - /** - * @return the code point of the table used in alphanumeric mode or - * -1 if there is no corresponding code in the table. - */ - static getAlphanumericCode(code /*int*/) { - if (code < Encoder.ALPHANUMERIC_TABLE.length) { - return Encoder.ALPHANUMERIC_TABLE[code]; - } - return -1; - } - // public static chooseMode(content: string): Mode { - // return chooseMode(content, null); - // } - /** - * Choose the best mode by examining the content. Note that 'encoding' is used as a hint; - * if it is Shift_JIS, and the input is only double-byte Kanji, then we return {@link Mode#KANJI}. - */ - static chooseMode(content, encoding = null) { - if (CharacterSetECI.SJIS.getName() === encoding && this.isOnlyDoubleByteKanji(content)) { - // Choose Kanji mode if all input are double-byte characters - return Mode$1.KANJI; - } - let hasNumeric = false; - let hasAlphanumeric = false; - for (let i = 0, length = content.length; i < length; ++i) { - const c = content.charAt(i); - if (Encoder.isDigit(c)) { - hasNumeric = true; - } - else if (this.getAlphanumericCode(c.charCodeAt(0)) !== -1) { - hasAlphanumeric = true; - } - else { - return Mode$1.BYTE; - } - } - if (hasAlphanumeric) { - return Mode$1.ALPHANUMERIC; - } - if (hasNumeric) { - return Mode$1.NUMERIC; - } - return Mode$1.BYTE; - } - static isOnlyDoubleByteKanji(content) { - let bytes; - try { - bytes = StringEncoding.encode(content, CharacterSetECI.SJIS); // content.getBytes("Shift_JIS")) - } - catch (ignored /*: UnsupportedEncodingException*/) { - return false; - } - const length = bytes.length; - if (length % 2 !== 0) { - return false; - } - for (let i = 0; i < length; i += 2) { - const byte1 = bytes[i] & 0xFF; - if ((byte1 < 0x81 || byte1 > 0x9F) && (byte1 < 0xE0 || byte1 > 0xEB)) { - return false; - } - } - return true; - } - static chooseMaskPattern(bits, ecLevel, version, matrix) { - let minPenalty = Number.MAX_SAFE_INTEGER; // Lower penalty is better. - let bestMaskPattern = -1; - // We try all mask patterns to choose the best one. - for (let maskPattern = 0; maskPattern < QRCode.NUM_MASK_PATTERNS; maskPattern++) { - MatrixUtil.buildMatrix(bits, ecLevel, version, maskPattern, matrix); - let penalty = this.calculateMaskPenalty(matrix); - if (penalty < minPenalty) { - minPenalty = penalty; - bestMaskPattern = maskPattern; - } - } - return bestMaskPattern; - } - static chooseVersion(numInputBits /*int*/, ecLevel) { - for (let versionNum = 1; versionNum <= 40; versionNum++) { - const version = Version$1.getVersionForNumber(versionNum); - if (Encoder.willFit(numInputBits, version, ecLevel)) { - return version; - } - } - throw new WriterException('Data too big'); - } - /** - * @return true if the number of input bits will fit in a code with the specified version and - * error correction level. - */ - static willFit(numInputBits /*int*/, version, ecLevel) { - // In the following comments, we use numbers of Version 7-H. - // numBytes = 196 - const numBytes = version.getTotalCodewords(); - // getNumECBytes = 130 - const ecBlocks = version.getECBlocksForLevel(ecLevel); - const numEcBytes = ecBlocks.getTotalECCodewords(); - // getNumDataBytes = 196 - 130 = 66 - const numDataBytes = numBytes - numEcBytes; - const totalInputBytes = (numInputBits + 7) / 8; - return numDataBytes >= totalInputBytes; - } - /** - * Terminate bits as described in 8.4.8 and 8.4.9 of JISX0510:2004 (p.24). - */ - static terminateBits(numDataBytes /*int*/, bits) { - const capacity = numDataBytes * 8; - if (bits.getSize() > capacity) { - throw new WriterException('data bits cannot fit in the QR Code' + bits.getSize() + ' > ' + - capacity); - } - for (let i = 0; i < 4 && bits.getSize() < capacity; ++i) { - bits.appendBit(false); - } - // Append termination bits. See 8.4.8 of JISX0510:2004 (p.24) for details. - // If the last byte isn't 8-bit aligned, we'll add padding bits. - const numBitsInLastByte = bits.getSize() & 0x07; - if (numBitsInLastByte > 0) { - for (let i = numBitsInLastByte; i < 8; i++) { - bits.appendBit(false); - } - } - // If we have more space, we'll fill the space with padding patterns defined in 8.4.9 (p.24). - const numPaddingBytes = numDataBytes - bits.getSizeInBytes(); - for (let i = 0; i < numPaddingBytes; ++i) { - bits.appendBits((i & 0x01) === 0 ? 0xEC : 0x11, 8); - } - if (bits.getSize() !== capacity) { - throw new WriterException('Bits size does not equal capacity'); - } - } - /** - * Get number of data bytes and number of error correction bytes for block id "blockID". Store - * the result in "numDataBytesInBlock", and "numECBytesInBlock". See table 12 in 8.5.1 of - * JISX0510:2004 (p.30) - */ - static getNumDataBytesAndNumECBytesForBlockID(numTotalBytes /*int*/, numDataBytes /*int*/, numRSBlocks /*int*/, blockID /*int*/, numDataBytesInBlock, numECBytesInBlock) { - if (blockID >= numRSBlocks) { - throw new WriterException('Block ID too large'); - } - // numRsBlocksInGroup2 = 196 % 5 = 1 - const numRsBlocksInGroup2 = numTotalBytes % numRSBlocks; - // numRsBlocksInGroup1 = 5 - 1 = 4 - const numRsBlocksInGroup1 = numRSBlocks - numRsBlocksInGroup2; - // numTotalBytesInGroup1 = 196 / 5 = 39 - const numTotalBytesInGroup1 = Math.floor(numTotalBytes / numRSBlocks); - // numTotalBytesInGroup2 = 39 + 1 = 40 - const numTotalBytesInGroup2 = numTotalBytesInGroup1 + 1; - // numDataBytesInGroup1 = 66 / 5 = 13 - const numDataBytesInGroup1 = Math.floor(numDataBytes / numRSBlocks); - // numDataBytesInGroup2 = 13 + 1 = 14 - const numDataBytesInGroup2 = numDataBytesInGroup1 + 1; - // numEcBytesInGroup1 = 39 - 13 = 26 - const numEcBytesInGroup1 = numTotalBytesInGroup1 - numDataBytesInGroup1; - // numEcBytesInGroup2 = 40 - 14 = 26 - const numEcBytesInGroup2 = numTotalBytesInGroup2 - numDataBytesInGroup2; - // Sanity checks. - // 26 = 26 - if (numEcBytesInGroup1 !== numEcBytesInGroup2) { - throw new WriterException('EC bytes mismatch'); - } - // 5 = 4 + 1. - if (numRSBlocks !== numRsBlocksInGroup1 + numRsBlocksInGroup2) { - throw new WriterException('RS blocks mismatch'); - } - // 196 = (13 + 26) * 4 + (14 + 26) * 1 - if (numTotalBytes !== - ((numDataBytesInGroup1 + numEcBytesInGroup1) * - numRsBlocksInGroup1) + - ((numDataBytesInGroup2 + numEcBytesInGroup2) * - numRsBlocksInGroup2)) { - throw new WriterException('Total bytes mismatch'); - } - if (blockID < numRsBlocksInGroup1) { - numDataBytesInBlock[0] = numDataBytesInGroup1; - numECBytesInBlock[0] = numEcBytesInGroup1; - } - else { - numDataBytesInBlock[0] = numDataBytesInGroup2; - numECBytesInBlock[0] = numEcBytesInGroup2; - } - } - /** - * Interleave "bits" with corresponding error correction bytes. On success, store the result in - * "result". The interleave rule is complicated. See 8.6 of JISX0510:2004 (p.37) for details. - */ - static interleaveWithECBytes(bits, numTotalBytes /*int*/, numDataBytes /*int*/, numRSBlocks /*int*/) { - // "bits" must have "getNumDataBytes" bytes of data. - if (bits.getSizeInBytes() !== numDataBytes) { - throw new WriterException('Number of bits and data bytes does not match'); - } - // Step 1. Divide data bytes into blocks and generate error correction bytes for them. We'll - // store the divided data bytes blocks and error correction bytes blocks into "blocks". - let dataBytesOffset = 0; - let maxNumDataBytes = 0; - let maxNumEcBytes = 0; - // Since, we know the number of reedsolmon blocks, we can initialize the vector with the number. - const blocks = new Array(); // new Array(numRSBlocks) - for (let i = 0; i < numRSBlocks; ++i) { - const numDataBytesInBlock = new Int32Array(1); - const numEcBytesInBlock = new Int32Array(1); - Encoder.getNumDataBytesAndNumECBytesForBlockID(numTotalBytes, numDataBytes, numRSBlocks, i, numDataBytesInBlock, numEcBytesInBlock); - const size = numDataBytesInBlock[0]; - const dataBytes = new Uint8Array(size); - bits.toBytes(8 * dataBytesOffset, dataBytes, 0, size); - const ecBytes = Encoder.generateECBytes(dataBytes, numEcBytesInBlock[0]); - blocks.push(new BlockPair(dataBytes, ecBytes)); - maxNumDataBytes = Math.max(maxNumDataBytes, size); - maxNumEcBytes = Math.max(maxNumEcBytes, ecBytes.length); - dataBytesOffset += numDataBytesInBlock[0]; - } - if (numDataBytes !== dataBytesOffset) { - throw new WriterException('Data bytes does not match offset'); - } - const result = new BitArray(); - // First, place data blocks. - for (let i = 0; i < maxNumDataBytes; ++i) { - for (const block of blocks) { - const dataBytes = block.getDataBytes(); - if (i < dataBytes.length) { - result.appendBits(dataBytes[i], 8); - } - } - } - // Then, place error correction blocks. - for (let i = 0; i < maxNumEcBytes; ++i) { - for (const block of blocks) { - const ecBytes = block.getErrorCorrectionBytes(); - if (i < ecBytes.length) { - result.appendBits(ecBytes[i], 8); - } - } - } - if (numTotalBytes !== result.getSizeInBytes()) { // Should be same. - throw new WriterException('Interleaving error: ' + numTotalBytes + ' and ' + - result.getSizeInBytes() + ' differ.'); - } - return result; - } - static generateECBytes(dataBytes, numEcBytesInBlock /*int*/) { - const numDataBytes = dataBytes.length; - const toEncode = new Int32Array(numDataBytes + numEcBytesInBlock); // int[numDataBytes + numEcBytesInBlock] - for (let i = 0; i < numDataBytes; i++) { - toEncode[i] = dataBytes[i] & 0xFF; - } - new ReedSolomonEncoder(GenericGF.QR_CODE_FIELD_256).encode(toEncode, numEcBytesInBlock); - const ecBytes = new Uint8Array(numEcBytesInBlock); - for (let i = 0; i < numEcBytesInBlock; i++) { - ecBytes[i] = /*(byte) */ toEncode[numDataBytes + i]; - } - return ecBytes; - } - /** - * Append mode info. On success, store the result in "bits". - */ - static appendModeInfo(mode, bits) { - bits.appendBits(mode.getBits(), 4); - } - /** - * Append length info. On success, store the result in "bits". - */ - static appendLengthInfo(numLetters /*int*/, version, mode, bits) { - const numBits = mode.getCharacterCountBits(version); - if (numLetters >= (1 << numBits)) { - throw new WriterException(numLetters + ' is bigger than ' + ((1 << numBits) - 1)); - } - bits.appendBits(numLetters, numBits); - } - /** - * Append "bytes" in "mode" mode (encoding) into "bits". On success, store the result in "bits". - */ - static appendBytes(content, mode, bits, encoding) { - switch (mode) { - case Mode$1.NUMERIC: - Encoder.appendNumericBytes(content, bits); - break; - case Mode$1.ALPHANUMERIC: - Encoder.appendAlphanumericBytes(content, bits); - break; - case Mode$1.BYTE: - Encoder.append8BitBytes(content, bits, encoding); - break; - case Mode$1.KANJI: - Encoder.appendKanjiBytes(content, bits); - break; - default: - throw new WriterException('Invalid mode: ' + mode); - } - } - static getDigit(singleCharacter) { - return singleCharacter.charCodeAt(0) - 48; - } - static isDigit(singleCharacter) { - const cn = Encoder.getDigit(singleCharacter); - return cn >= 0 && cn <= 9; - } - static appendNumericBytes(content, bits) { - const length = content.length; - let i = 0; - while (i < length) { - const num1 = Encoder.getDigit(content.charAt(i)); - if (i + 2 < length) { - // Encode three numeric letters in ten bits. - const num2 = Encoder.getDigit(content.charAt(i + 1)); - const num3 = Encoder.getDigit(content.charAt(i + 2)); - bits.appendBits(num1 * 100 + num2 * 10 + num3, 10); - i += 3; - } - else if (i + 1 < length) { - // Encode two numeric letters in seven bits. - const num2 = Encoder.getDigit(content.charAt(i + 1)); - bits.appendBits(num1 * 10 + num2, 7); - i += 2; - } - else { - // Encode one numeric letter in four bits. - bits.appendBits(num1, 4); - i++; - } - } - } - static appendAlphanumericBytes(content, bits) { - const length = content.length; - let i = 0; - while (i < length) { - const code1 = Encoder.getAlphanumericCode(content.charCodeAt(i)); - if (code1 === -1) { - throw new WriterException(); - } - if (i + 1 < length) { - const code2 = Encoder.getAlphanumericCode(content.charCodeAt(i + 1)); - if (code2 === -1) { - throw new WriterException(); - } - // Encode two alphanumeric letters in 11 bits. - bits.appendBits(code1 * 45 + code2, 11); - i += 2; - } - else { - // Encode one alphanumeric letter in six bits. - bits.appendBits(code1, 6); - i++; - } - } - } - static append8BitBytes(content, bits, encoding) { - let bytes; - try { - bytes = StringEncoding.encode(content, encoding); - } - catch (uee /*: UnsupportedEncodingException*/) { - throw new WriterException(uee); - } - for (let i = 0, length = bytes.length; i !== length; i++) { - const b = bytes[i]; - bits.appendBits(b, 8); - } - } - /** - * @throws WriterException - */ - static appendKanjiBytes(content, bits) { - let bytes; - try { - bytes = StringEncoding.encode(content, CharacterSetECI.SJIS); - } - catch (uee /*: UnsupportedEncodingException*/) { - throw new WriterException(uee); - } - const length = bytes.length; - for (let i = 0; i < length; i += 2) { - const byte1 = bytes[i] & 0xFF; - const byte2 = bytes[i + 1] & 0xFF; - const code = ((byte1 << 8) & 0xFFFFFFFF) | byte2; - let subtracted = -1; - if (code >= 0x8140 && code <= 0x9ffc) { - subtracted = code - 0x8140; - } - else if (code >= 0xe040 && code <= 0xebbf) { - subtracted = code - 0xc140; - } - if (subtracted === -1) { - throw new WriterException('Invalid byte sequence'); - } - const encoded = ((subtracted >> 8) * 0xc0) + (subtracted & 0xff); - bits.appendBits(encoded, 13); - } - } - static appendECI(eci, bits) { - bits.appendBits(Mode$1.ECI.getBits(), 4); - // This is correct for values up to 127, which is all we need now. - bits.appendBits(eci.getValue(), 8); - } - } - // The original table is defined in the table 5 of JISX0510:2004 (p.19). - Encoder.ALPHANUMERIC_TABLE = Int32Array.from([ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, - -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, - ]); - Encoder.DEFAULT_BYTE_MODE_ENCODING = CharacterSetECI.UTF8.getName(); // "ISO-8859-1" - - /** - * @deprecated Moving to @zxing/browser - */ - class BrowserQRCodeSvgWriter { - /** - * Writes and renders a QRCode SVG element. - * - * @param contents - * @param width - * @param height - * @param hints - */ - write(contents, width, height, hints = null) { - if (contents.length === 0) { - throw new IllegalArgumentException('Found empty contents'); - } - // if (format != BarcodeFormat.QR_CODE) { - // throw new IllegalArgumentException("Can only encode QR_CODE, but got " + format) - // } - if (width < 0 || height < 0) { - throw new IllegalArgumentException('Requested dimensions are too small: ' + width + 'x' + height); - } - let errorCorrectionLevel = ErrorCorrectionLevel.L; - let quietZone = BrowserQRCodeSvgWriter.QUIET_ZONE_SIZE; - if (hints !== null) { - if (undefined !== hints.get(EncodeHintType$1.ERROR_CORRECTION)) { - errorCorrectionLevel = ErrorCorrectionLevel.fromString(hints.get(EncodeHintType$1.ERROR_CORRECTION).toString()); - } - if (undefined !== hints.get(EncodeHintType$1.MARGIN)) { - quietZone = Number.parseInt(hints.get(EncodeHintType$1.MARGIN).toString(), 10); - } - } - const code = Encoder.encode(contents, errorCorrectionLevel, hints); - return this.renderResult(code, width, height, quietZone); - } - /** - * Renders the result and then appends it to the DOM. - */ - writeToDom(containerElement, contents, width, height, hints = null) { - if (typeof containerElement === 'string') { - containerElement = document.querySelector(containerElement); - } - const svgElement = this.write(contents, width, height, hints); - if (containerElement) - containerElement.appendChild(svgElement); - } - /** - * Note that the input matrix uses 0 == white, 1 == black. - * The output matrix uses 0 == black, 255 == white (i.e. an 8 bit greyscale bitmap). - */ - renderResult(code, width /*int*/, height /*int*/, quietZone /*int*/) { - const input = code.getMatrix(); - if (input === null) { - throw new IllegalStateException(); - } - const inputWidth = input.getWidth(); - const inputHeight = input.getHeight(); - const qrWidth = inputWidth + (quietZone * 2); - const qrHeight = inputHeight + (quietZone * 2); - const outputWidth = Math.max(width, qrWidth); - const outputHeight = Math.max(height, qrHeight); - const multiple = Math.min(Math.floor(outputWidth / qrWidth), Math.floor(outputHeight / qrHeight)); - // Padding includes both the quiet zone and the extra white pixels to accommodate the requested - // dimensions. For example, if input is 25x25 the QR will be 33x33 including the quiet zone. - // If the requested size is 200x160, the multiple will be 4, for a QR of 132x132. These will - // handle all the padding from 100x100 (the actual QR) up to 200x160. - const leftPadding = Math.floor((outputWidth - (inputWidth * multiple)) / 2); - const topPadding = Math.floor((outputHeight - (inputHeight * multiple)) / 2); - const svgElement = this.createSVGElement(outputWidth, outputHeight); - for (let inputY = 0, outputY = topPadding; inputY < inputHeight; inputY++, outputY += multiple) { - // Write the contents of this row of the barcode - for (let inputX = 0, outputX = leftPadding; inputX < inputWidth; inputX++, outputX += multiple) { - if (input.get(inputX, inputY) === 1) { - const svgRectElement = this.createSvgRectElement(outputX, outputY, multiple, multiple); - svgElement.appendChild(svgRectElement); - } - } - } - return svgElement; - } - /** - * Creates a SVG element. - * - * @param w SVG's width attribute - * @param h SVG's height attribute - */ - createSVGElement(w, h) { - const svgElement = document.createElementNS(BrowserQRCodeSvgWriter.SVG_NS, 'svg'); - svgElement.setAttributeNS(null, 'height', w.toString()); - svgElement.setAttributeNS(null, 'width', h.toString()); - return svgElement; - } - /** - * Creates a SVG rect element. - * - * @param x Element's x coordinate - * @param y Element's y coordinate - * @param w Element's width attribute - * @param h Element's height attribute - */ - createSvgRectElement(x, y, w, h) { - const rect = document.createElementNS(BrowserQRCodeSvgWriter.SVG_NS, 'rect'); - rect.setAttributeNS(null, 'x', x.toString()); - rect.setAttributeNS(null, 'y', y.toString()); - rect.setAttributeNS(null, 'height', w.toString()); - rect.setAttributeNS(null, 'width', h.toString()); - rect.setAttributeNS(null, 'fill', '#000000'); - return rect; - } - } - BrowserQRCodeSvgWriter.QUIET_ZONE_SIZE = 4; - /** - * SVG markup NameSpace - */ - BrowserQRCodeSvgWriter.SVG_NS = 'http://www.w3.org/2000/svg'; - - /*import java.util.Map;*/ - /** - * This object renders a QR Code as a BitMatrix 2D array of greyscale values. - * - * @author dswitkin@google.com (Daniel Switkin) - */ - class QRCodeWriter { - /*@Override*/ - // public encode(contents: string, format: BarcodeFormat, width: number /*int*/, height: number /*int*/): BitMatrix - // /*throws WriterException */ { - // return encode(contents, format, width, height, null) - // } - /*@Override*/ - encode(contents, format, width /*int*/, height /*int*/, hints) { - if (contents.length === 0) { - throw new IllegalArgumentException('Found empty contents'); - } - if (format !== BarcodeFormat$1.QR_CODE) { - throw new IllegalArgumentException('Can only encode QR_CODE, but got ' + format); - } - if (width < 0 || height < 0) { - throw new IllegalArgumentException(`Requested dimensions are too small: ${width}x${height}`); - } - let errorCorrectionLevel = ErrorCorrectionLevel.L; - let quietZone = QRCodeWriter.QUIET_ZONE_SIZE; - if (hints !== null) { - if (undefined !== hints.get(EncodeHintType$1.ERROR_CORRECTION)) { - errorCorrectionLevel = ErrorCorrectionLevel.fromString(hints.get(EncodeHintType$1.ERROR_CORRECTION).toString()); - } - if (undefined !== hints.get(EncodeHintType$1.MARGIN)) { - quietZone = Number.parseInt(hints.get(EncodeHintType$1.MARGIN).toString(), 10); - } - } - const code = Encoder.encode(contents, errorCorrectionLevel, hints); - return QRCodeWriter.renderResult(code, width, height, quietZone); - } - // Note that the input matrix uses 0 == white, 1 == black, while the output matrix uses - // 0 == black, 255 == white (i.e. an 8 bit greyscale bitmap). - static renderResult(code, width /*int*/, height /*int*/, quietZone /*int*/) { - const input = code.getMatrix(); - if (input === null) { - throw new IllegalStateException(); - } - const inputWidth = input.getWidth(); - const inputHeight = input.getHeight(); - const qrWidth = inputWidth + (quietZone * 2); - const qrHeight = inputHeight + (quietZone * 2); - const outputWidth = Math.max(width, qrWidth); - const outputHeight = Math.max(height, qrHeight); - const multiple = Math.min(Math.floor(outputWidth / qrWidth), Math.floor(outputHeight / qrHeight)); - // Padding includes both the quiet zone and the extra white pixels to accommodate the requested - // dimensions. For example, if input is 25x25 the QR will be 33x33 including the quiet zone. - // If the requested size is 200x160, the multiple will be 4, for a QR of 132x132. These will - // handle all the padding from 100x100 (the actual QR) up to 200x160. - const leftPadding = Math.floor((outputWidth - (inputWidth * multiple)) / 2); - const topPadding = Math.floor((outputHeight - (inputHeight * multiple)) / 2); - const output = new BitMatrix(outputWidth, outputHeight); - for (let inputY = 0, outputY = topPadding; inputY < inputHeight; inputY++, outputY += multiple) { - // Write the contents of this row of the barcode - for (let inputX = 0, outputX = leftPadding; inputX < inputWidth; inputX++, outputX += multiple) { - if (input.get(inputX, inputY) === 1) { - output.setRegion(outputX, outputY, multiple, multiple); - } - } - } - return output; - } - } - QRCodeWriter.QUIET_ZONE_SIZE = 4; - - /*import java.util.Map;*/ - /** - * This is a factory class which finds the appropriate Writer subclass for the BarcodeFormat - * requested and encodes the barcode with the supplied contents. - * - * @author dswitkin@google.com (Daniel Switkin) - */ - class MultiFormatWriter { - /*@Override*/ - // public encode(contents: string, - // format: BarcodeFormat, - // width: number /*int*/, - // height: number /*int*/): BitMatrix /*throws WriterException */ { - // return encode(contents, format, width, height, null) - // } - /*@Override*/ - encode(contents, format, width /*int*/, height /*int*/, hints) { - let writer; - switch (format) { - // case BarcodeFormat.EAN_8: - // writer = new EAN8Writer() - // break - // case BarcodeFormat.UPC_E: - // writer = new UPCEWriter() - // break - // case BarcodeFormat.EAN_13: - // writer = new EAN13Writer() - // break - // case BarcodeFormat.UPC_A: - // writer = new UPCAWriter() - // break - case BarcodeFormat$1.QR_CODE: - writer = new QRCodeWriter(); - break; - // case BarcodeFormat.CODE_39: - // writer = new Code39Writer() - // break - // case BarcodeFormat.CODE_93: - // writer = new Code93Writer() - // break - // case BarcodeFormat.CODE_128: - // writer = new Code128Writer() - // break - // case BarcodeFormat.ITF: - // writer = new ITFWriter() - // break - // case BarcodeFormat.PDF_417: - // writer = new PDF417Writer() - // break - // case BarcodeFormat.CODABAR: - // writer = new CodaBarWriter() - // break - // case BarcodeFormat.DATA_MATRIX: - // writer = new DataMatrixWriter() - // break - // case BarcodeFormat.AZTEC: - // writer = new AztecWriter() - // break - default: - throw new IllegalArgumentException('No encoder available for format ' + format); - } - return writer.encode(contents, format, width, height, hints); - } - } - - /* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * This object extends LuminanceSource around an array of YUV data returned from the camera driver, - * with the option to crop to a rectangle within the full data. This can be used to exclude - * superfluous pixels around the perimeter and speed up decoding. - * - * It works for any pixel format where the Y channel is planar and appears first, including - * YCbCr_420_SP and YCbCr_422_SP. - * - * @author dswitkin@google.com (Daniel Switkin) - */ - class PlanarYUVLuminanceSource extends LuminanceSource { - constructor(yuvData, dataWidth /*int*/, dataHeight /*int*/, left /*int*/, top /*int*/, width /*int*/, height /*int*/, reverseHorizontal) { - super(width, height); - this.yuvData = yuvData; - this.dataWidth = dataWidth; - this.dataHeight = dataHeight; - this.left = left; - this.top = top; - if (left + width > dataWidth || top + height > dataHeight) { - throw new IllegalArgumentException('Crop rectangle does not fit within image data.'); - } - if (reverseHorizontal) { - this.reverseHorizontal(width, height); - } - } - /*@Override*/ - getRow(y /*int*/, row) { - if (y < 0 || y >= this.getHeight()) { - throw new IllegalArgumentException('Requested row is outside the image: ' + y); - } - const width = this.getWidth(); - if (row === null || row === undefined || row.length < width) { - row = new Uint8ClampedArray(width); - } - const offset = (y + this.top) * this.dataWidth + this.left; - System.arraycopy(this.yuvData, offset, row, 0, width); - return row; - } - /*@Override*/ - getMatrix() { - const width = this.getWidth(); - const height = this.getHeight(); - // If the caller asks for the entire underlying image, save the copy and give them the - // original data. The docs specifically warn that result.length must be ignored. - if (width === this.dataWidth && height === this.dataHeight) { - return this.yuvData; - } - const area = width * height; - const matrix = new Uint8ClampedArray(area); - let inputOffset = this.top * this.dataWidth + this.left; - // If the width matches the full width of the underlying data, perform a single copy. - if (width === this.dataWidth) { - System.arraycopy(this.yuvData, inputOffset, matrix, 0, area); - return matrix; - } - // Otherwise copy one cropped row at a time. - for (let y = 0; y < height; y++) { - const outputOffset = y * width; - System.arraycopy(this.yuvData, inputOffset, matrix, outputOffset, width); - inputOffset += this.dataWidth; - } - return matrix; - } - /*@Override*/ - isCropSupported() { - return true; - } - /*@Override*/ - crop(left /*int*/, top /*int*/, width /*int*/, height /*int*/) { - return new PlanarYUVLuminanceSource(this.yuvData, this.dataWidth, this.dataHeight, this.left + left, this.top + top, width, height, false); - } - renderThumbnail() { - const width = this.getWidth() / PlanarYUVLuminanceSource.THUMBNAIL_SCALE_FACTOR; - const height = this.getHeight() / PlanarYUVLuminanceSource.THUMBNAIL_SCALE_FACTOR; - const pixels = new Int32Array(width * height); - const yuv = this.yuvData; - let inputOffset = this.top * this.dataWidth + this.left; - for (let y = 0; y < height; y++) { - const outputOffset = y * width; - for (let x = 0; x < width; x++) { - const grey = yuv[inputOffset + x * PlanarYUVLuminanceSource.THUMBNAIL_SCALE_FACTOR] & 0xff; - pixels[outputOffset + x] = 0xFF000000 | (grey * 0x00010101); - } - inputOffset += this.dataWidth * PlanarYUVLuminanceSource.THUMBNAIL_SCALE_FACTOR; - } - return pixels; - } - /** - * @return width of image from {@link #renderThumbnail()} - */ - getThumbnailWidth() { - return this.getWidth() / PlanarYUVLuminanceSource.THUMBNAIL_SCALE_FACTOR; - } - /** - * @return height of image from {@link #renderThumbnail()} - */ - getThumbnailHeight() { - return this.getHeight() / PlanarYUVLuminanceSource.THUMBNAIL_SCALE_FACTOR; - } - reverseHorizontal(width /*int*/, height /*int*/) { - const yuvData = this.yuvData; - for (let y = 0, rowStart = this.top * this.dataWidth + this.left; y < height; y++, rowStart += this.dataWidth) { - const middle = rowStart + width / 2; - for (let x1 = rowStart, x2 = rowStart + width - 1; x1 < middle; x1++, x2--) { - const temp = yuvData[x1]; - yuvData[x1] = yuvData[x2]; - yuvData[x2] = temp; - } - } - } - invert() { - return new InvertedLuminanceSource(this); - } - } - PlanarYUVLuminanceSource.THUMBNAIL_SCALE_FACTOR = 2; - - /* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * This class is used to help decode images from files which arrive as RGB data from - * an ARGB pixel array. It does not support rotation. - * - * @author dswitkin@google.com (Daniel Switkin) - * @author Betaminos - */ - class RGBLuminanceSource extends LuminanceSource { - constructor(luminances, width /*int*/, height /*int*/, dataWidth /*int*/, dataHeight /*int*/, left /*int*/, top /*int*/) { - super(width, height); - this.dataWidth = dataWidth; - this.dataHeight = dataHeight; - this.left = left; - this.top = top; - if (luminances.BYTES_PER_ELEMENT === 4) { // Int32Array - const size = width * height; - const luminancesUint8Array = new Uint8ClampedArray(size); - for (let offset = 0; offset < size; offset++) { - const pixel = luminances[offset]; - const r = (pixel >> 16) & 0xff; // red - const g2 = (pixel >> 7) & 0x1fe; // 2 * green - const b = pixel & 0xff; // blue - // Calculate green-favouring average cheaply - luminancesUint8Array[offset] = /*(byte) */ ((r + g2 + b) / 4) & 0xFF; - } - this.luminances = luminancesUint8Array; - } - else { - this.luminances = luminances; - } - if (undefined === dataWidth) { - this.dataWidth = width; - } - if (undefined === dataHeight) { - this.dataHeight = height; - } - if (undefined === left) { - this.left = 0; - } - if (undefined === top) { - this.top = 0; - } - if (this.left + width > this.dataWidth || this.top + height > this.dataHeight) { - throw new IllegalArgumentException('Crop rectangle does not fit within image data.'); - } - } - /*@Override*/ - getRow(y /*int*/, row) { - if (y < 0 || y >= this.getHeight()) { - throw new IllegalArgumentException('Requested row is outside the image: ' + y); - } - const width = this.getWidth(); - if (row === null || row === undefined || row.length < width) { - row = new Uint8ClampedArray(width); - } - const offset = (y + this.top) * this.dataWidth + this.left; - System.arraycopy(this.luminances, offset, row, 0, width); - return row; - } - /*@Override*/ - getMatrix() { - const width = this.getWidth(); - const height = this.getHeight(); - // If the caller asks for the entire underlying image, save the copy and give them the - // original data. The docs specifically warn that result.length must be ignored. - if (width === this.dataWidth && height === this.dataHeight) { - return this.luminances; - } - const area = width * height; - const matrix = new Uint8ClampedArray(area); - let inputOffset = this.top * this.dataWidth + this.left; - // If the width matches the full width of the underlying data, perform a single copy. - if (width === this.dataWidth) { - System.arraycopy(this.luminances, inputOffset, matrix, 0, area); - return matrix; - } - // Otherwise copy one cropped row at a time. - for (let y = 0; y < height; y++) { - const outputOffset = y * width; - System.arraycopy(this.luminances, inputOffset, matrix, outputOffset, width); - inputOffset += this.dataWidth; - } - return matrix; - } - /*@Override*/ - isCropSupported() { - return true; - } - /*@Override*/ - crop(left /*int*/, top /*int*/, width /*int*/, height /*int*/) { - return new RGBLuminanceSource(this.luminances, width, height, this.dataWidth, this.dataHeight, this.left + left, this.top + top); - } - invert() { - return new InvertedLuminanceSource(this); - } - } - - /** - * Just to make a shortcut between Java code and TS code. - */ - class Charset extends CharacterSetECI { - static forName(name) { - return this.getCharacterSetECIByName(name); - } - } - - /** - * Just to make a shortcut between Java code and TS code. - */ - class StandardCharsets { - } - StandardCharsets.ISO_8859_1 = CharacterSetECI.ISO8859_1; - - /* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * Aztec 2D code representation - * - * @author Rustam Abdullaev - */ - /*public final*/ class AztecCode { - /** - * @return {@code true} if compact instead of full mode - */ - isCompact() { - return this.compact; - } - setCompact(compact) { - this.compact = compact; - } - /** - * @return size in pixels (width and height) - */ - getSize() { - return this.size; - } - setSize(size) { - this.size = size; - } - /** - * @return number of levels - */ - getLayers() { - return this.layers; - } - setLayers(layers) { - this.layers = layers; - } - /** - * @return number of data codewords - */ - getCodeWords() { - return this.codeWords; - } - setCodeWords(codeWords) { - this.codeWords = codeWords; - } - /** - * @return the symbol image - */ - getMatrix() { - return this.matrix; - } - setMatrix(matrix) { - this.matrix = matrix; - } - } - - class Collections { - /** - * The singletonList(T) method is used to return an immutable list containing only the specified object. - */ - static singletonList(item) { - return [item]; - } - /** - * The min(Collection, Comparator) method is used to return the minimum element of the given collection, according to the order induced by the specified comparator. - */ - static min(collection, comparator) { - return collection.sort(comparator)[0]; - } - } - - /* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - class Token { - constructor(previous) { - this.previous = previous; - } - getPrevious() { - return this.previous; - } - } - - /* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /*final*/ class SimpleToken extends Token { - constructor(previous, value, bitCount) { - super(previous); - this.value = value; - this.bitCount = bitCount; - } - /** - * @Override - */ - appendTo(bitArray, text) { - bitArray.appendBits(this.value, this.bitCount); - } - add(value, bitCount) { - return new SimpleToken(this, value, bitCount); - } - addBinaryShift(start, byteCount) { - // no-op can't binary shift a simple token - console.warn('addBinaryShift on SimpleToken, this simply returns a copy of this token'); - return new SimpleToken(this, start, byteCount); - } - /** - * @Override - */ - toString() { - let value = this.value & ((1 << this.bitCount) - 1); - value |= 1 << this.bitCount; - return '<' + Integer.toBinaryString(value | (1 << this.bitCount)).substring(1) + '>'; - } - } - - /* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /*final*/ class BinaryShiftToken extends SimpleToken { - constructor(previous, binaryShiftStart, binaryShiftByteCount) { - super(previous, 0, 0); - this.binaryShiftStart = binaryShiftStart; - this.binaryShiftByteCount = binaryShiftByteCount; - } - /** - * @Override - */ - appendTo(bitArray, text) { - for (let i = 0; i < this.binaryShiftByteCount; i++) { - if (i === 0 || (i === 31 && this.binaryShiftByteCount <= 62)) { - // We need a header before the first character, and before - // character 31 when the total byte code is <= 62 - bitArray.appendBits(31, 5); // BINARY_SHIFT - if (this.binaryShiftByteCount > 62) { - bitArray.appendBits(this.binaryShiftByteCount - 31, 16); - } - else if (i === 0) { - // 1 <= binaryShiftByteCode <= 62 - bitArray.appendBits(Math.min(this.binaryShiftByteCount, 31), 5); - } - else { - // 32 <= binaryShiftCount <= 62 and i == 31 - bitArray.appendBits(this.binaryShiftByteCount - 31, 5); - } - } - bitArray.appendBits(text[this.binaryShiftStart + i], 8); - } - } - addBinaryShift(start, byteCount) { - // int bitCount = (byteCount * 8) + (byteCount <= 31 ? 10 : byteCount <= 62 ? 20 : 21); - return new BinaryShiftToken(this, start, byteCount); - } - /** - * @Override - */ - toString() { - return '<' + this.binaryShiftStart + '::' + (this.binaryShiftStart + this.binaryShiftByteCount - 1) + '>'; - } - } - - function addBinaryShift(token, start, byteCount) { - // int bitCount = (byteCount * 8) + (byteCount <= 31 ? 10 : byteCount <= 62 ? 20 : 21); - return new BinaryShiftToken(token, start, byteCount); - } - function add(token, value, bitCount) { - return new SimpleToken(token, value, bitCount); - } - - const /*final*/ MODE_NAMES = [ - 'UPPER', - 'LOWER', - 'DIGIT', - 'MIXED', - 'PUNCT' - ]; - const /*final*/ MODE_UPPER = 0; // 5 bits - const /*final*/ MODE_LOWER = 1; // 5 bits - const /*final*/ MODE_DIGIT = 2; // 4 bits - const /*final*/ MODE_MIXED = 3; // 5 bits - const /*final*/ MODE_PUNCT = 4; // 5 bits - const EMPTY_TOKEN = new SimpleToken(null, 0, 0); - - // The Latch Table shows, for each pair of Modes, the optimal method for - // getting from one mode to another. In the worst possible case, this can - // be up to 14 bits. In the best possible case, we are already there! - // The high half-word of each entry gives the number of bits. - // The low half-word of each entry are the actual bits necessary to change - const LATCH_TABLE = [ - Int32Array.from([ - 0, - (5 << 16) + 28, - (5 << 16) + 30, - (5 << 16) + 29, - (10 << 16) + (29 << 5) + 30 // UPPER -> MIXED -> PUNCT - ]), - Int32Array.from([ - (9 << 16) + (30 << 4) + 14, - 0, - (5 << 16) + 30, - (5 << 16) + 29, - (10 << 16) + (29 << 5) + 30 // LOWER -> MIXED -> PUNCT - ]), - Int32Array.from([ - (4 << 16) + 14, - (9 << 16) + (14 << 5) + 28, - 0, - (9 << 16) + (14 << 5) + 29, - (14 << 16) + (14 << 10) + (29 << 5) + 30 - // DIGIT -> UPPER -> MIXED -> PUNCT - ]), - Int32Array.from([ - (5 << 16) + 29, - (5 << 16) + 28, - (10 << 16) + (29 << 5) + 30, - 0, - (5 << 16) + 30 // MIXED -> PUNCT - ]), - Int32Array.from([ - (5 << 16) + 31, - (10 << 16) + (31 << 5) + 28, - (10 << 16) + (31 << 5) + 30, - (10 << 16) + (31 << 5) + 29, - 0 - ]) - ]; - - function static_SHIFT_TABLE(SHIFT_TABLE) { - for (let table /*Int32Array*/ of SHIFT_TABLE) { - Arrays.fill(table, -1); - } - SHIFT_TABLE[MODE_UPPER][MODE_PUNCT] = 0; - SHIFT_TABLE[MODE_LOWER][MODE_PUNCT] = 0; - SHIFT_TABLE[MODE_LOWER][MODE_UPPER] = 28; - SHIFT_TABLE[MODE_MIXED][MODE_PUNCT] = 0; - SHIFT_TABLE[MODE_DIGIT][MODE_PUNCT] = 0; - SHIFT_TABLE[MODE_DIGIT][MODE_UPPER] = 15; - return SHIFT_TABLE; - } - const /*final*/ SHIFT_TABLE = static_SHIFT_TABLE(Arrays.createInt32Array(6, 6)); // mode shift codes, per table - - /* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * State represents all information about a sequence necessary to generate the current output. - * Note that a state is immutable. - */ - /*final*/ class State { - constructor(token, mode, binaryBytes, bitCount) { - this.token = token; - this.mode = mode; - this.binaryShiftByteCount = binaryBytes; - this.bitCount = bitCount; - // Make sure we match the token - // int binaryShiftBitCount = (binaryShiftByteCount * 8) + - // (binaryShiftByteCount === 0 ? 0 : - // binaryShiftByteCount <= 31 ? 10 : - // binaryShiftByteCount <= 62 ? 20 : 21); - // assert this.bitCount === token.getTotalBitCount() + binaryShiftBitCount; - } - getMode() { - return this.mode; - } - getToken() { - return this.token; - } - getBinaryShiftByteCount() { - return this.binaryShiftByteCount; - } - getBitCount() { - return this.bitCount; - } - // Create a new state representing this state with a latch to a (not - // necessary different) mode, and then a code. - latchAndAppend(mode, value) { - // assert binaryShiftByteCount === 0; - let bitCount = this.bitCount; - let token = this.token; - if (mode !== this.mode) { - let latch = LATCH_TABLE[this.mode][mode]; - token = add(token, latch & 0xffff, latch >> 16); - bitCount += latch >> 16; - } - let latchModeBitCount = mode === MODE_DIGIT ? 4 : 5; - token = add(token, value, latchModeBitCount); - return new State(token, mode, 0, bitCount + latchModeBitCount); - } - // Create a new state representing this state, with a temporary shift - // to a different mode to output a single value. - shiftAndAppend(mode, value) { - // assert binaryShiftByteCount === 0 && this.mode !== mode; - let token = this.token; - let thisModeBitCount = this.mode === MODE_DIGIT ? 4 : 5; - // Shifts exist only to UPPER and PUNCT, both with tokens size 5. - token = add(token, SHIFT_TABLE[this.mode][mode], thisModeBitCount); - token = add(token, value, 5); - return new State(token, this.mode, 0, this.bitCount + thisModeBitCount + 5); - } - // Create a new state representing this state, but an additional character - // output in Binary Shift mode. - addBinaryShiftChar(index) { - let token = this.token; - let mode = this.mode; - let bitCount = this.bitCount; - if (this.mode === MODE_PUNCT || this.mode === MODE_DIGIT) { - // assert binaryShiftByteCount === 0; - let latch = LATCH_TABLE[mode][MODE_UPPER]; - token = add(token, latch & 0xffff, latch >> 16); - bitCount += latch >> 16; - mode = MODE_UPPER; - } - let deltaBitCount = this.binaryShiftByteCount === 0 || this.binaryShiftByteCount === 31 - ? 18 - : this.binaryShiftByteCount === 62 - ? 9 - : 8; - let result = new State(token, mode, this.binaryShiftByteCount + 1, bitCount + deltaBitCount); - if (result.binaryShiftByteCount === 2047 + 31) { - // The string is as long as it's allowed to be. We should end it. - result = result.endBinaryShift(index + 1); - } - return result; - } - // Create the state identical to this one, but we are no longer in - // Binary Shift mode. - endBinaryShift(index) { - if (this.binaryShiftByteCount === 0) { - return this; - } - let token = this.token; - token = addBinaryShift(token, index - this.binaryShiftByteCount, this.binaryShiftByteCount); - // assert token.getTotalBitCount() === this.bitCount; - return new State(token, this.mode, 0, this.bitCount); - } - // Returns true if "this" state is better (equal: or) to be in than "that" - // state under all possible circumstances. - isBetterThanOrEqualTo(other) { - let newModeBitCount = this.bitCount + (LATCH_TABLE[this.mode][other.mode] >> 16); - if (this.binaryShiftByteCount < other.binaryShiftByteCount) { - // add additional B/S encoding cost of other, if any - newModeBitCount += - State.calculateBinaryShiftCost(other) - - State.calculateBinaryShiftCost(this); - } - else if (this.binaryShiftByteCount > other.binaryShiftByteCount && - other.binaryShiftByteCount > 0) { - // maximum possible additional cost (it: h) - newModeBitCount += 10; - } - return newModeBitCount <= other.bitCount; - } - toBitArray(text) { - // Reverse the tokens, so that they are in the order that they should - // be output - let symbols = []; - for (let token = this.endBinaryShift(text.length).token; token !== null; token = token.getPrevious()) { - symbols.unshift(token); - } - let bitArray = new BitArray(); - // Add each token to the result. - for (const symbol of symbols) { - symbol.appendTo(bitArray, text); - } - // assert bitArray.getSize() === this.bitCount; - return bitArray; - } - /** - * @Override - */ - toString() { - return StringUtils.format('%s bits=%d bytes=%d', MODE_NAMES[this.mode], this.bitCount, this.binaryShiftByteCount); - } - static calculateBinaryShiftCost(state) { - if (state.binaryShiftByteCount > 62) { - return 21; // B/S with extended length - } - if (state.binaryShiftByteCount > 31) { - return 20; // two B/S - } - if (state.binaryShiftByteCount > 0) { - return 10; // one B/S - } - return 0; - } - } - State.INITIAL_STATE = new State(EMPTY_TOKEN, MODE_UPPER, 0, 0); - - function static_CHAR_MAP(CHAR_MAP) { - const spaceCharCode = StringUtils.getCharCode(' '); - const pointCharCode = StringUtils.getCharCode('.'); - const commaCharCode = StringUtils.getCharCode(','); - CHAR_MAP[MODE_UPPER][spaceCharCode] = 1; - const zUpperCharCode = StringUtils.getCharCode('Z'); - const aUpperCharCode = StringUtils.getCharCode('A'); - for (let c = aUpperCharCode; c <= zUpperCharCode; c++) { - CHAR_MAP[MODE_UPPER][c] = c - aUpperCharCode + 2; - } - CHAR_MAP[MODE_LOWER][spaceCharCode] = 1; - const zLowerCharCode = StringUtils.getCharCode('z'); - const aLowerCharCode = StringUtils.getCharCode('a'); - for (let c = aLowerCharCode; c <= zLowerCharCode; c++) { - CHAR_MAP[MODE_LOWER][c] = c - aLowerCharCode + 2; - } - CHAR_MAP[MODE_DIGIT][spaceCharCode] = 1; - const nineCharCode = StringUtils.getCharCode('9'); - const zeroCharCode = StringUtils.getCharCode('0'); - for (let c = zeroCharCode; c <= nineCharCode; c++) { - CHAR_MAP[MODE_DIGIT][c] = c - zeroCharCode + 2; - } - CHAR_MAP[MODE_DIGIT][commaCharCode] = 12; - CHAR_MAP[MODE_DIGIT][pointCharCode] = 13; - const mixedTable = [ - '\x00', - ' ', - '\x01', - '\x02', - '\x03', - '\x04', - '\x05', - '\x06', - '\x07', - '\b', - '\t', - '\n', - '\x0b', - '\f', - '\r', - '\x1b', - '\x1c', - '\x1d', - '\x1e', - '\x1f', - '@', - '\\', - '^', - '_', - '`', - '|', - '~', - '\x7f' - ]; - for (let i = 0; i < mixedTable.length; i++) { - CHAR_MAP[MODE_MIXED][StringUtils.getCharCode(mixedTable[i])] = i; - } - const punctTable = [ - '\x00', - '\r', - '\x00', - '\x00', - '\x00', - '\x00', - '!', - '\'', - '#', - '$', - '%', - '&', - '\'', - '(', - ')', - '*', - '+', - ',', - '-', - '.', - '/', - ':', - ';', - '<', - '=', - '>', - '?', - '[', - ']', - '{', - '}' - ]; - for (let i = 0; i < punctTable.length; i++) { - if (StringUtils.getCharCode(punctTable[i]) > 0) { - CHAR_MAP[MODE_PUNCT][StringUtils.getCharCode(punctTable[i])] = i; - } - } - return CHAR_MAP; - } - const CHAR_MAP = static_CHAR_MAP(Arrays.createInt32Array(5, 256)); - - /* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * This produces nearly optimal encodings of text into the first-level of - * encoding used by Aztec code. - * - * It uses a dynamic algorithm. For each prefix of the string, it determines - * a set of encodings that could lead to this prefix. We repeatedly add a - * character and generate a new set of optimal encodings until we have read - * through the entire input. - * - * @author Frank Yellin - * @author Rustam Abdullaev - */ - /*public final*/ class HighLevelEncoder { - constructor(text) { - this.text = text; - } - /** - * @return text represented by this encoder encoded as a {@link BitArray} - */ - encode() { - const spaceCharCode = StringUtils.getCharCode(' '); - const lineBreakCharCode = StringUtils.getCharCode('\n'); - let states = Collections.singletonList(State.INITIAL_STATE); - for (let index = 0; index < this.text.length; index++) { - let pairCode; - let nextChar = index + 1 < this.text.length ? this.text[index + 1] : 0; - switch (this.text[index]) { - case StringUtils.getCharCode('\r'): - pairCode = nextChar === lineBreakCharCode ? 2 : 0; - break; - case StringUtils.getCharCode('.'): - pairCode = nextChar === spaceCharCode ? 3 : 0; - break; - case StringUtils.getCharCode(','): - pairCode = nextChar === spaceCharCode ? 4 : 0; - break; - case StringUtils.getCharCode(':'): - pairCode = nextChar === spaceCharCode ? 5 : 0; - break; - default: - pairCode = 0; - } - if (pairCode > 0) { - // We have one of the four special PUNCT pairs. Treat them specially. - // Get a new set of states for the two new characters. - states = HighLevelEncoder.updateStateListForPair(states, index, pairCode); - index++; - } - else { - // Get a new set of states for the new character. - states = this.updateStateListForChar(states, index); - } - } - // We are left with a set of states. Find the shortest one. - const minState = Collections.min(states, (a, b) => { - return a.getBitCount() - b.getBitCount(); - }); - // Convert it to a bit array, and return. - return minState.toBitArray(this.text); - } - // We update a set of states for a new character by updating each state - // for the new character, merging the results, and then removing the - // non-optimal states. - updateStateListForChar(states, index) { - const result = []; - for (let state /*State*/ of states) { - this.updateStateForChar(state, index, result); - } - return HighLevelEncoder.simplifyStates(result); - } - // Return a set of states that represent the possible ways of updating this - // state for the next character. The resulting set of states are added to - // the "result" list. - updateStateForChar(state, index, result) { - let ch = (this.text[index] & 0xff); - let charInCurrentTable = CHAR_MAP[state.getMode()][ch] > 0; - let stateNoBinary = null; - for (let mode /*int*/ = 0; mode <= MODE_PUNCT; mode++) { - let charInMode = CHAR_MAP[mode][ch]; - if (charInMode > 0) { - if (stateNoBinary == null) { - // Only create stateNoBinary the first time it's required. - stateNoBinary = state.endBinaryShift(index); - } - // Try generating the character by latching to its mode - if (!charInCurrentTable || - mode === state.getMode() || - mode === MODE_DIGIT) { - // If the character is in the current table, we don't want to latch to - // any other mode except possibly digit (which uses only 4 bits). Any - // other latch would be equally successful *after* this character, and - // so wouldn't save any bits. - const latchState = stateNoBinary.latchAndAppend(mode, charInMode); - result.push(latchState); - } - // Try generating the character by switching to its mode. - if (!charInCurrentTable && - SHIFT_TABLE[state.getMode()][mode] >= 0) { - // It never makes sense to temporarily shift to another mode if the - // character exists in the current mode. That can never save bits. - const shiftState = stateNoBinary.shiftAndAppend(mode, charInMode); - result.push(shiftState); - } - } - } - if (state.getBinaryShiftByteCount() > 0 || - CHAR_MAP[state.getMode()][ch] === 0) { - // It's never worthwhile to go into binary shift mode if you're not already - // in binary shift mode, and the character exists in your current mode. - // That can never save bits over just outputting the char in the current mode. - let binaryState = state.addBinaryShiftChar(index); - result.push(binaryState); - } - } - static updateStateListForPair(states, index, pairCode) { - const result = []; - for (let state /*State*/ of states) { - this.updateStateForPair(state, index, pairCode, result); - } - return this.simplifyStates(result); - } - static updateStateForPair(state, index, pairCode, result) { - let stateNoBinary = state.endBinaryShift(index); - // Possibility 1. Latch to C.MODE_PUNCT, and then append this code - result.push(stateNoBinary.latchAndAppend(MODE_PUNCT, pairCode)); - if (state.getMode() !== MODE_PUNCT) { - // Possibility 2. Shift to C.MODE_PUNCT, and then append this code. - // Every state except C.MODE_PUNCT (handled above) can shift - result.push(stateNoBinary.shiftAndAppend(MODE_PUNCT, pairCode)); - } - if (pairCode === 3 || pairCode === 4) { - // both characters are in DIGITS. Sometimes better to just add two digits - let digitState = stateNoBinary - .latchAndAppend(MODE_DIGIT, 16 - pairCode) // period or comma in DIGIT - .latchAndAppend(MODE_DIGIT, 1); // space in DIGIT - result.push(digitState); - } - if (state.getBinaryShiftByteCount() > 0) { - // It only makes sense to do the characters as binary if we're already - // in binary mode. - let binaryState = state - .addBinaryShiftChar(index) - .addBinaryShiftChar(index + 1); - result.push(binaryState); - } - } - static simplifyStates(states) { - let result = []; - for (const newState of states) { - let add = true; - for (const oldState of result) { - if (oldState.isBetterThanOrEqualTo(newState)) { - add = false; - break; - } - if (newState.isBetterThanOrEqualTo(oldState)) { - // iterator.remove(); - result = result.filter(x => x !== oldState); // remove old state - } - } - if (add) { - result.push(newState); - } - } - return result; - } - } - - /* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - // package com.google.zxing.aztec.encoder; - // import com.google.zxing.common.BitArray; - // import com.google.zxing.common.BitMatrix; - // import com.google.zxing.common.reedsolomon.GenericGF; - // import com.google.zxing.common.reedsolomon.ReedSolomonEncoder; - /** - * Generates Aztec 2D barcodes. - * - * @author Rustam Abdullaev - */ - /*public final*/ class Encoder$1 { - constructor() { - } - /** - * Encodes the given binary content as an Aztec symbol - * - * @param data input data string - * @return Aztec symbol matrix with metadata - */ - static encodeBytes(data) { - return Encoder$1.encode(data, Encoder$1.DEFAULT_EC_PERCENT, Encoder$1.DEFAULT_AZTEC_LAYERS); - } - /** - * Encodes the given binary content as an Aztec symbol - * - * @param data input data string - * @param minECCPercent minimal percentage of error check words (According to ISO/IEC 24778:2008, - * a minimum of 23% + 3 words is recommended) - * @param userSpecifiedLayers if non-zero, a user-specified value for the number of layers - * @return Aztec symbol matrix with metadata - */ - static encode(data, minECCPercent, userSpecifiedLayers) { - // High-level encode - let bits = new HighLevelEncoder(data).encode(); - // stuff bits and choose symbol size - let eccBits = Integer.truncDivision((bits.getSize() * minECCPercent), 100) + 11; - let totalSizeBits = bits.getSize() + eccBits; - let compact; - let layers; - let totalBitsInLayer; - let wordSize; - let stuffedBits; - if (userSpecifiedLayers !== Encoder$1.DEFAULT_AZTEC_LAYERS) { - compact = userSpecifiedLayers < 0; - layers = Math.abs(userSpecifiedLayers); - if (layers > (compact ? Encoder$1.MAX_NB_BITS_COMPACT : Encoder$1.MAX_NB_BITS)) { - throw new IllegalArgumentException(StringUtils.format('Illegal value %s for layers', userSpecifiedLayers)); - } - totalBitsInLayer = Encoder$1.totalBitsInLayer(layers, compact); - wordSize = Encoder$1.WORD_SIZE[layers]; - let usableBitsInLayers = totalBitsInLayer - (totalBitsInLayer % wordSize); - stuffedBits = Encoder$1.stuffBits(bits, wordSize); - if (stuffedBits.getSize() + eccBits > usableBitsInLayers) { - throw new IllegalArgumentException('Data to large for user specified layer'); - } - if (compact && stuffedBits.getSize() > wordSize * 64) { - // Compact format only allows 64 data words, though C4 can hold more words than that - throw new IllegalArgumentException('Data to large for user specified layer'); - } - } - else { - wordSize = 0; - stuffedBits = null; - // We look at the possible table sizes in the order Compact1, Compact2, Compact3, - // Compact4, Normal4,... Normal(i) for i < 4 isn't typically used since Compact(i+1) - // is the same size, but has more data. - for (let i /*int*/ = 0;; i++) { - if (i > Encoder$1.MAX_NB_BITS) { - throw new IllegalArgumentException('Data too large for an Aztec code'); - } - compact = i <= 3; - layers = compact ? i + 1 : i; - totalBitsInLayer = Encoder$1.totalBitsInLayer(layers, compact); - if (totalSizeBits > totalBitsInLayer) { - continue; - } - // [Re]stuff the bits if this is the first opportunity, or if the - // wordSize has changed - if (stuffedBits == null || wordSize !== Encoder$1.WORD_SIZE[layers]) { - wordSize = Encoder$1.WORD_SIZE[layers]; - stuffedBits = Encoder$1.stuffBits(bits, wordSize); - } - let usableBitsInLayers = totalBitsInLayer - (totalBitsInLayer % wordSize); - if (compact && stuffedBits.getSize() > wordSize * 64) { - // Compact format only allows 64 data words, though C4 can hold more words than that - continue; - } - if (stuffedBits.getSize() + eccBits <= usableBitsInLayers) { - break; - } - } - } - let messageBits = Encoder$1.generateCheckWords(stuffedBits, totalBitsInLayer, wordSize); - // generate mode message - let messageSizeInWords = stuffedBits.getSize() / wordSize; - let modeMessage = Encoder$1.generateModeMessage(compact, layers, messageSizeInWords); - // allocate symbol - let baseMatrixSize = (compact ? 11 : 14) + layers * 4; // not including alignment lines - let alignmentMap = new Int32Array(baseMatrixSize); - let matrixSize; - if (compact) { - // no alignment marks in compact mode, alignmentMap is a no-op - matrixSize = baseMatrixSize; - for (let i /*int*/ = 0; i < alignmentMap.length; i++) { - alignmentMap[i] = i; - } - } - else { - matrixSize = baseMatrixSize + 1 + 2 * Integer.truncDivision((Integer.truncDivision(baseMatrixSize, 2) - 1), 15); - let origCenter = Integer.truncDivision(baseMatrixSize, 2); - let center = Integer.truncDivision(matrixSize, 2); - for (let i /*int*/ = 0; i < origCenter; i++) { - let newOffset = i + Integer.truncDivision(i, 15); - alignmentMap[origCenter - i - 1] = center - newOffset - 1; - alignmentMap[origCenter + i] = center + newOffset + 1; - } - } - let matrix = new BitMatrix(matrixSize); - // draw data bits - for (let i /*int*/ = 0, rowOffset = 0; i < layers; i++) { - let rowSize = (layers - i) * 4 + (compact ? 9 : 12); - for (let j /*int*/ = 0; j < rowSize; j++) { - let columnOffset = j * 2; - for (let k /*int*/ = 0; k < 2; k++) { - if (messageBits.get(rowOffset + columnOffset + k)) { - matrix.set(alignmentMap[i * 2 + k], alignmentMap[i * 2 + j]); - } - if (messageBits.get(rowOffset + rowSize * 2 + columnOffset + k)) { - matrix.set(alignmentMap[i * 2 + j], alignmentMap[baseMatrixSize - 1 - i * 2 - k]); - } - if (messageBits.get(rowOffset + rowSize * 4 + columnOffset + k)) { - matrix.set(alignmentMap[baseMatrixSize - 1 - i * 2 - k], alignmentMap[baseMatrixSize - 1 - i * 2 - j]); - } - if (messageBits.get(rowOffset + rowSize * 6 + columnOffset + k)) { - matrix.set(alignmentMap[baseMatrixSize - 1 - i * 2 - j], alignmentMap[i * 2 + k]); - } - } - } - rowOffset += rowSize * 8; - } - // draw mode message - Encoder$1.drawModeMessage(matrix, compact, matrixSize, modeMessage); - // draw alignment marks - if (compact) { - Encoder$1.drawBullsEye(matrix, Integer.truncDivision(matrixSize, 2), 5); - } - else { - Encoder$1.drawBullsEye(matrix, Integer.truncDivision(matrixSize, 2), 7); - for (let i /*int*/ = 0, j = 0; i < Integer.truncDivision(baseMatrixSize, 2) - 1; i += 15, j += 16) { - for (let k /*int*/ = Integer.truncDivision(matrixSize, 2) & 1; k < matrixSize; k += 2) { - matrix.set(Integer.truncDivision(matrixSize, 2) - j, k); - matrix.set(Integer.truncDivision(matrixSize, 2) + j, k); - matrix.set(k, Integer.truncDivision(matrixSize, 2) - j); - matrix.set(k, Integer.truncDivision(matrixSize, 2) + j); - } - } - } - let aztec = new AztecCode(); - aztec.setCompact(compact); - aztec.setSize(matrixSize); - aztec.setLayers(layers); - aztec.setCodeWords(messageSizeInWords); - aztec.setMatrix(matrix); - return aztec; - } - static drawBullsEye(matrix, center, size) { - for (let i /*int*/ = 0; i < size; i += 2) { - for (let j /*int*/ = center - i; j <= center + i; j++) { - matrix.set(j, center - i); - matrix.set(j, center + i); - matrix.set(center - i, j); - matrix.set(center + i, j); - } - } - matrix.set(center - size, center - size); - matrix.set(center - size + 1, center - size); - matrix.set(center - size, center - size + 1); - matrix.set(center + size, center - size); - matrix.set(center + size, center - size + 1); - matrix.set(center + size, center + size - 1); - } - static generateModeMessage(compact, layers, messageSizeInWords) { - let modeMessage = new BitArray(); - if (compact) { - modeMessage.appendBits(layers - 1, 2); - modeMessage.appendBits(messageSizeInWords - 1, 6); - modeMessage = Encoder$1.generateCheckWords(modeMessage, 28, 4); - } - else { - modeMessage.appendBits(layers - 1, 5); - modeMessage.appendBits(messageSizeInWords - 1, 11); - modeMessage = Encoder$1.generateCheckWords(modeMessage, 40, 4); - } - return modeMessage; - } - static drawModeMessage(matrix, compact, matrixSize, modeMessage) { - let center = Integer.truncDivision(matrixSize, 2); - if (compact) { - for (let i /*int*/ = 0; i < 7; i++) { - let offset = center - 3 + i; - if (modeMessage.get(i)) { - matrix.set(offset, center - 5); - } - if (modeMessage.get(i + 7)) { - matrix.set(center + 5, offset); - } - if (modeMessage.get(20 - i)) { - matrix.set(offset, center + 5); - } - if (modeMessage.get(27 - i)) { - matrix.set(center - 5, offset); - } - } - } - else { - for (let i /*int*/ = 0; i < 10; i++) { - let offset = center - 5 + i + Integer.truncDivision(i, 5); - if (modeMessage.get(i)) { - matrix.set(offset, center - 7); - } - if (modeMessage.get(i + 10)) { - matrix.set(center + 7, offset); - } - if (modeMessage.get(29 - i)) { - matrix.set(offset, center + 7); - } - if (modeMessage.get(39 - i)) { - matrix.set(center - 7, offset); - } - } - } - } - static generateCheckWords(bitArray, totalBits, wordSize) { - // bitArray is guaranteed to be a multiple of the wordSize, so no padding needed - let messageSizeInWords = bitArray.getSize() / wordSize; - let rs = new ReedSolomonEncoder(Encoder$1.getGF(wordSize)); - let totalWords = Integer.truncDivision(totalBits, wordSize); - let messageWords = Encoder$1.bitsToWords(bitArray, wordSize, totalWords); - rs.encode(messageWords, totalWords - messageSizeInWords); - let startPad = totalBits % wordSize; - let messageBits = new BitArray(); - messageBits.appendBits(0, startPad); - for (const messageWord /*: int*/ of Array.from(messageWords)) { - messageBits.appendBits(messageWord, wordSize); - } - return messageBits; - } - static bitsToWords(stuffedBits, wordSize, totalWords) { - let message = new Int32Array(totalWords); - let i; - let n; - for (i = 0, n = stuffedBits.getSize() / wordSize; i < n; i++) { - let value = 0; - for (let j /*int*/ = 0; j < wordSize; j++) { - value |= stuffedBits.get(i * wordSize + j) ? (1 << wordSize - j - 1) : 0; - } - message[i] = value; - } - return message; - } - static getGF(wordSize) { - switch (wordSize) { - case 4: - return GenericGF.AZTEC_PARAM; - case 6: - return GenericGF.AZTEC_DATA_6; - case 8: - return GenericGF.AZTEC_DATA_8; - case 10: - return GenericGF.AZTEC_DATA_10; - case 12: - return GenericGF.AZTEC_DATA_12; - default: - throw new IllegalArgumentException('Unsupported word size ' + wordSize); - } - } - static stuffBits(bits, wordSize) { - let out = new BitArray(); - let n = bits.getSize(); - let mask = (1 << wordSize) - 2; - for (let i /*int*/ = 0; i < n; i += wordSize) { - let word = 0; - for (let j /*int*/ = 0; j < wordSize; j++) { - if (i + j >= n || bits.get(i + j)) { - word |= 1 << (wordSize - 1 - j); - } - } - if ((word & mask) === mask) { - out.appendBits(word & mask, wordSize); - i--; - } - else if ((word & mask) === 0) { - out.appendBits(word | 1, wordSize); - i--; - } - else { - out.appendBits(word, wordSize); - } - } - return out; - } - static totalBitsInLayer(layers, compact) { - return ((compact ? 88 : 112) + 16 * layers) * layers; - } - } - Encoder$1.DEFAULT_EC_PERCENT = 33; // default minimal percentage of error check words - Encoder$1.DEFAULT_AZTEC_LAYERS = 0; - Encoder$1.MAX_NB_BITS = 32; - Encoder$1.MAX_NB_BITS_COMPACT = 4; - Encoder$1.WORD_SIZE = Int32Array.from([ - 4, 6, 6, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 - ]); - - /* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * Renders an Aztec code as a {@link BitMatrix}. - */ - /*public final*/ class AztecWriter { - // @Override - encode(contents, format, width, height) { - return this.encodeWithHints(contents, format, width, height, null); - } - // @Override - encodeWithHints(contents, format, width, height, hints) { - let charset = StandardCharsets.ISO_8859_1; - let eccPercent = Encoder$1.DEFAULT_EC_PERCENT; - let layers = Encoder$1.DEFAULT_AZTEC_LAYERS; - if (hints != null) { - if (hints.has(EncodeHintType$1.CHARACTER_SET)) { - charset = Charset.forName(hints.get(EncodeHintType$1.CHARACTER_SET).toString()); - } - if (hints.has(EncodeHintType$1.ERROR_CORRECTION)) { - eccPercent = Integer.parseInt(hints.get(EncodeHintType$1.ERROR_CORRECTION).toString()); - } - if (hints.has(EncodeHintType$1.AZTEC_LAYERS)) { - layers = Integer.parseInt(hints.get(EncodeHintType$1.AZTEC_LAYERS).toString()); - } - } - return AztecWriter.encodeLayers(contents, format, width, height, charset, eccPercent, layers); - } - static encodeLayers(contents, format, width, height, charset, eccPercent, layers) { - if (format !== BarcodeFormat$1.AZTEC) { - throw new IllegalArgumentException('Can only encode AZTEC, but got ' + format); - } - let aztec = Encoder$1.encode(StringUtils.getBytes(contents, charset), eccPercent, layers); - return AztecWriter.renderResult(aztec, width, height); - } - static renderResult(code, width, height) { - let input = code.getMatrix(); - if (input == null) { - throw new IllegalStateException(); - } - let inputWidth = input.getWidth(); - let inputHeight = input.getHeight(); - let outputWidth = Math.max(width, inputWidth); - let outputHeight = Math.max(height, inputHeight); - let multiple = Math.min(outputWidth / inputWidth, outputHeight / inputHeight); - let leftPadding = (outputWidth - (inputWidth * multiple)) / 2; - let topPadding = (outputHeight - (inputHeight * multiple)) / 2; - let output = new BitMatrix(outputWidth, outputHeight); - for (let inputY /*int*/ = 0, outputY = topPadding; inputY < inputHeight; inputY++, outputY += multiple) { - // Write the contents of this row of the barcode - for (let inputX /*int*/ = 0, outputX = leftPadding; inputX < inputWidth; inputX++, outputX += multiple) { - if (input.get(inputX, inputY)) { - output.setRegion(outputX, outputY, multiple, multiple); - } - } - } - return output; - } - } - - exports.AbstractExpandedDecoder = AbstractExpandedDecoder; - exports.ArgumentException = ArgumentException; - exports.ArithmeticException = ArithmeticException; - exports.AztecCode = AztecCode; - exports.AztecCodeReader = AztecReader; - exports.AztecCodeWriter = AztecWriter; - exports.AztecDecoder = Decoder; - exports.AztecDetector = Detector; - exports.AztecDetectorResult = AztecDetectorResult; - exports.AztecEncoder = Encoder$1; - exports.AztecHighLevelEncoder = HighLevelEncoder; - exports.AztecPoint = Point; - exports.BarcodeFormat = BarcodeFormat$1; - exports.Binarizer = Binarizer; - exports.BinaryBitmap = BinaryBitmap; - exports.BitArray = BitArray; - exports.BitMatrix = BitMatrix; - exports.BitSource = BitSource; - exports.BrowserAztecCodeReader = BrowserAztecCodeReader; - exports.BrowserBarcodeReader = BrowserBarcodeReader; - exports.BrowserCodeReader = BrowserCodeReader; - exports.BrowserDatamatrixCodeReader = BrowserDatamatrixCodeReader; - exports.BrowserMultiFormatReader = BrowserMultiFormatReader; - exports.BrowserPDF417Reader = BrowserPDF417Reader; - exports.BrowserQRCodeReader = BrowserQRCodeReader; - exports.BrowserQRCodeSvgWriter = BrowserQRCodeSvgWriter; - exports.CharacterSetECI = CharacterSetECI; - exports.ChecksumException = ChecksumException; - exports.Code128Reader = Code128Reader; - exports.Code39Reader = Code39Reader; - exports.DataMatrixDecodedBitStreamParser = DecodedBitStreamParser; - exports.DataMatrixReader = DataMatrixReader; - exports.DecodeHintType = DecodeHintType$1; - exports.DecoderResult = DecoderResult; - exports.DefaultGridSampler = DefaultGridSampler; - exports.DetectorResult = DetectorResult; - exports.EAN13Reader = EAN13Reader; - exports.EncodeHintType = EncodeHintType$1; - exports.Exception = Exception; - exports.FormatException = FormatException; - exports.GenericGF = GenericGF; - exports.GenericGFPoly = GenericGFPoly; - exports.GlobalHistogramBinarizer = GlobalHistogramBinarizer; - exports.GridSampler = GridSampler; - exports.GridSamplerInstance = GridSamplerInstance; - exports.HTMLCanvasElementLuminanceSource = HTMLCanvasElementLuminanceSource; - exports.HybridBinarizer = HybridBinarizer; - exports.ITFReader = ITFReader; - exports.IllegalArgumentException = IllegalArgumentException; - exports.IllegalStateException = IllegalStateException; - exports.InvertedLuminanceSource = InvertedLuminanceSource; - exports.LuminanceSource = LuminanceSource; - exports.MathUtils = MathUtils; - exports.MultiFormatOneDReader = MultiFormatOneDReader; - exports.MultiFormatReader = MultiFormatReader; - exports.MultiFormatWriter = MultiFormatWriter; - exports.NotFoundException = NotFoundException; - exports.OneDReader = OneDReader; - exports.PDF417DecodedBitStreamParser = DecodedBitStreamParser$2; - exports.PDF417DecoderErrorCorrection = ErrorCorrection; - exports.PDF417Reader = PDF417Reader; - exports.PDF417ResultMetadata = PDF417ResultMetadata; - exports.PerspectiveTransform = PerspectiveTransform; - exports.PlanarYUVLuminanceSource = PlanarYUVLuminanceSource; - exports.QRCodeByteMatrix = ByteMatrix; - exports.QRCodeDataMask = DataMask; - exports.QRCodeDecodedBitStreamParser = DecodedBitStreamParser$1; - exports.QRCodeDecoderErrorCorrectionLevel = ErrorCorrectionLevel; - exports.QRCodeDecoderFormatInformation = FormatInformation; - exports.QRCodeEncoder = Encoder; - exports.QRCodeEncoderQRCode = QRCode; - exports.QRCodeMaskUtil = MaskUtil; - exports.QRCodeMatrixUtil = MatrixUtil; - exports.QRCodeMode = Mode$1; - exports.QRCodeReader = QRCodeReader; - exports.QRCodeVersion = Version$1; - exports.QRCodeWriter = QRCodeWriter; - exports.RGBLuminanceSource = RGBLuminanceSource; - exports.RSS14Reader = RSS14Reader; - exports.RSSExpandedReader = RSSExpandedReader; - exports.ReaderException = ReaderException; - exports.ReedSolomonDecoder = ReedSolomonDecoder; - exports.ReedSolomonEncoder = ReedSolomonEncoder; - exports.ReedSolomonException = ReedSolomonException; - exports.Result = Result; - exports.ResultMetadataType = ResultMetadataType$1; - exports.ResultPoint = ResultPoint; - exports.StringUtils = StringUtils; - exports.UnsupportedOperationException = UnsupportedOperationException; - exports.VideoInputDevice = VideoInputDevice; - exports.WhiteRectangleDetector = WhiteRectangleDetector; - exports.WriterException = WriterException; - exports.ZXingArrays = Arrays; - exports.ZXingCharset = Charset; - exports.ZXingInteger = Integer; - exports.ZXingStandardCharsets = StandardCharsets; - exports.ZXingStringBuilder = StringBuilder; - exports.ZXingStringEncoding = StringEncoding; - exports.ZXingSystem = System; - exports.createAbstractExpandedDecoder = createDecoder; - - Object.defineProperty(exports, '__esModule', { value: true }); - -}))); diff --git a/node_modules/html5-qrcode/ui.d.ts b/node_modules/html5-qrcode/ui.d.ts deleted file mode 100644 index 5f03fe9..0000000 --- a/node_modules/html5-qrcode/ui.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -export declare class LibraryInfoContainer { - private infoDiv; - private infoIcon; - constructor(); - renderInto(parent: HTMLElement): void; -} diff --git a/node_modules/html5-qrcode/ui/scanner/base.d.ts b/node_modules/html5-qrcode/ui/scanner/base.d.ts deleted file mode 100644 index 1f6ba9c..0000000 --- a/node_modules/html5-qrcode/ui/scanner/base.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -export declare class PublicUiElementIdAndClasses { - static ALL_ELEMENT_CLASS: string; - static CAMERA_PERMISSION_BUTTON_ID: string; - static CAMERA_START_BUTTON_ID: string; - static CAMERA_STOP_BUTTON_ID: string; - static TORCH_BUTTON_ID: string; - static CAMERA_SELECTION_SELECT_ID: string; - static FILE_SELECTION_BUTTON_ID: string; - static ZOOM_SLIDER_ID: string; - static SCAN_TYPE_CHANGE_ANCHOR_ID: string; - static TORCH_BUTTON_CLASS_TORCH_ON: string; - static TORCH_BUTTON_CLASS_TORCH_OFF: string; -} -export declare class BaseUiElementFactory { - static createElement(elementType: string, elementId: string): Type; -} diff --git a/node_modules/html5-qrcode/ui/scanner/camera-selection-ui.d.ts b/node_modules/html5-qrcode/ui/scanner/camera-selection-ui.d.ts deleted file mode 100644 index 2090ed5..0000000 --- a/node_modules/html5-qrcode/ui/scanner/camera-selection-ui.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { CameraDevice } from "../../camera/core"; -export declare class CameraSelectionUi { - private readonly selectElement; - private readonly options; - private readonly cameras; - private constructor(); - private render; - disable(): void; - isDisabled(): boolean; - enable(): void; - getValue(): string; - hasValue(value: string): boolean; - setValue(value: string): void; - hasSingleItem(): boolean; - numCameras(): number; - static create(parentElement: HTMLElement, cameras: Array): CameraSelectionUi; -} diff --git a/node_modules/html5-qrcode/ui/scanner/camera-zoom-ui.d.ts b/node_modules/html5-qrcode/ui/scanner/camera-zoom-ui.d.ts deleted file mode 100644 index 215bb3f..0000000 --- a/node_modules/html5-qrcode/ui/scanner/camera-zoom-ui.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -export type OnCameraZoomValueChangeCallback = (zoomValue: number) => void; -export declare class CameraZoomUi { - private zoomElementContainer; - private rangeInput; - private rangeText; - private onChangeCallback; - private constructor(); - private render; - private onValueChange; - setValues(minValue: number, maxValue: number, defaultValue: number, step: number): void; - show(): void; - hide(): void; - setOnCameraZoomValueChangeCallback(onChangeCallback: OnCameraZoomValueChangeCallback): void; - removeOnCameraZoomValueChangeCallback(): void; - static create(parentElement: HTMLElement, renderOnCreate: boolean): CameraZoomUi; -} diff --git a/node_modules/html5-qrcode/ui/scanner/file-selection-ui.d.ts b/node_modules/html5-qrcode/ui/scanner/file-selection-ui.d.ts deleted file mode 100644 index 768f5ed..0000000 --- a/node_modules/html5-qrcode/ui/scanner/file-selection-ui.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -export type OnFileSelected = (file: File) => void; -export declare class FileSelectionUi { - private readonly fileBasedScanRegion; - private readonly fileScanInput; - private readonly fileSelectionButton; - private constructor(); - hide(): void; - show(): void; - isShowing(): boolean; - resetValue(): void; - private createFileBasedScanRegion; - private fileBasedScanRegionDefaultBorder; - private fileBasedScanRegionActiveBorder; - private createDragAndDropMessage; - private setImageNameToButton; - private setInitialValueToButton; - private getFileScanInputId; - static create(parentElement: HTMLDivElement, showOnRender: boolean, onFileSelected: OnFileSelected): FileSelectionUi; -} diff --git a/node_modules/html5-qrcode/ui/scanner/scan-type-selector.d.ts b/node_modules/html5-qrcode/ui/scanner/scan-type-selector.d.ts deleted file mode 100644 index 2f0e134..0000000 --- a/node_modules/html5-qrcode/ui/scanner/scan-type-selector.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Html5QrcodeScanType } from "../../core"; -export declare class ScanTypeSelector { - private supportedScanTypes; - constructor(supportedScanTypes?: Array | []); - getDefaultScanType(): Html5QrcodeScanType; - hasMoreThanOneScanType(): boolean; - isCameraScanRequired(): boolean; - static isCameraScanType(scanType: Html5QrcodeScanType): boolean; - static isFileScanType(scanType: Html5QrcodeScanType): boolean; - private validateAndReturnScanTypes; -} diff --git a/node_modules/html5-qrcode/ui/scanner/torch-button.d.ts b/node_modules/html5-qrcode/ui/scanner/torch-button.d.ts deleted file mode 100644 index a862a10..0000000 --- a/node_modules/html5-qrcode/ui/scanner/torch-button.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { BooleanCameraCapability } from "../../camera/core"; -export type OnTorchActionFailureCallback = (failureMessage: string) => void; -interface TorchButtonController { - disable(): void; - enable(): void; - setText(text: string): void; -} -export interface TorchButtonOptions { - display: string; - marginLeft: string; -} -export declare class TorchButton implements TorchButtonController { - private readonly torchButton; - private readonly onTorchActionFailureCallback; - private torchController; - private constructor(); - private render; - updateTorchCapability(torchCapability: BooleanCameraCapability): void; - getTorchButton(): HTMLButtonElement; - hide(): void; - show(): void; - disable(): void; - enable(): void; - setText(text: string): void; - reset(): void; - static create(parentElement: HTMLElement, torchCapability: BooleanCameraCapability, torchButtonOptions: TorchButtonOptions, onTorchActionFailureCallback: OnTorchActionFailureCallback): TorchButton; -} -export {}; diff --git a/node_modules/html5-qrcode/utils.d.ts b/node_modules/html5-qrcode/utils.d.ts deleted file mode 100644 index 1b060ed..0000000 --- a/node_modules/html5-qrcode/utils.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { Logger } from "./core"; -export declare class VideoConstraintsUtil { - static isMediaStreamConstraintsValid(videoConstraints: MediaTrackConstraints, logger: Logger): boolean; -} diff --git a/node_modules/html5-qrcode/zxing-html5-qrcode-decoder.d.ts b/node_modules/html5-qrcode/zxing-html5-qrcode-decoder.d.ts deleted file mode 100644 index 411d377..0000000 --- a/node_modules/html5-qrcode/zxing-html5-qrcode-decoder.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { QrcodeResult, Html5QrcodeSupportedFormats, Logger, QrcodeDecoderAsync } from "./core"; -export declare class ZXingHtml5QrcodeDecoder implements QrcodeDecoderAsync { - private readonly formatMap; - private readonly reverseFormatMap; - private hints; - private verbose; - private logger; - constructor(requestedFormats: Array, verbose: boolean, logger: Logger); - decodeAsync(canvas: HTMLCanvasElement): Promise; - private decode; - private createReverseFormatMap; - private toHtml5QrcodeSupportedFormats; - private createZXingFormats; - private createDebugData; -} diff --git a/node_modules/is-binary-path/index.d.ts b/node_modules/is-binary-path/index.d.ts deleted file mode 100644 index 19dcd43..0000000 --- a/node_modules/is-binary-path/index.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** -Check if a file path is a binary file. - -@example -``` -import isBinaryPath = require('is-binary-path'); - -isBinaryPath('source/unicorn.png'); -//=> true - -isBinaryPath('source/unicorn.txt'); -//=> false -``` -*/ -declare function isBinaryPath(filePath: string): boolean; - -export = isBinaryPath; diff --git a/node_modules/is-binary-path/index.js b/node_modules/is-binary-path/index.js deleted file mode 100644 index ef7548c..0000000 --- a/node_modules/is-binary-path/index.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; -const path = require('path'); -const binaryExtensions = require('binary-extensions'); - -const extensions = new Set(binaryExtensions); - -module.exports = filePath => extensions.has(path.extname(filePath).slice(1).toLowerCase()); diff --git a/node_modules/is-binary-path/license b/node_modules/is-binary-path/license deleted file mode 100644 index 401b1c7..0000000 --- a/node_modules/is-binary-path/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) 2019 Sindre Sorhus (https://sindresorhus.com), Paul Miller (https://paulmillr.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/is-binary-path/package.json b/node_modules/is-binary-path/package.json deleted file mode 100644 index a8d005a..0000000 --- a/node_modules/is-binary-path/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "is-binary-path", - "version": "2.1.0", - "description": "Check if a file path is a binary file", - "license": "MIT", - "repository": "sindresorhus/is-binary-path", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=8" - }, - "scripts": { - "test": "xo && ava && tsd" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "binary", - "extensions", - "extension", - "file", - "path", - "check", - "detect", - "is" - ], - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "devDependencies": { - "ava": "^1.4.1", - "tsd": "^0.7.2", - "xo": "^0.24.0" - } -} diff --git a/node_modules/is-binary-path/readme.md b/node_modules/is-binary-path/readme.md deleted file mode 100644 index b4ab025..0000000 --- a/node_modules/is-binary-path/readme.md +++ /dev/null @@ -1,34 +0,0 @@ -# is-binary-path [![Build Status](https://travis-ci.org/sindresorhus/is-binary-path.svg?branch=master)](https://travis-ci.org/sindresorhus/is-binary-path) - -> Check if a file path is a binary file - - -## Install - -``` -$ npm install is-binary-path -``` - - -## Usage - -```js -const isBinaryPath = require('is-binary-path'); - -isBinaryPath('source/unicorn.png'); -//=> true - -isBinaryPath('source/unicorn.txt'); -//=> false -``` - - -## Related - -- [binary-extensions](https://github.com/sindresorhus/binary-extensions) - List of binary file extensions -- [is-text-path](https://github.com/sindresorhus/is-text-path) - Check if a filepath is a text file - - -## License - -MIT © [Sindre Sorhus](https://sindresorhus.com), [Paul Miller](https://paulmillr.com) diff --git a/node_modules/is-core-module/.eslintrc b/node_modules/is-core-module/.eslintrc deleted file mode 100644 index f2e0726..0000000 --- a/node_modules/is-core-module/.eslintrc +++ /dev/null @@ -1,18 +0,0 @@ -{ - "extends": "@ljharb", - "root": true, - "rules": { - "func-style": 1, - }, - "overrides": [ - { - "files": "test/**", - "rules": { - "global-require": 0, - "max-depth": 0, - "max-lines-per-function": 0, - "no-negated-condition": 0, - }, - }, - ], -} diff --git a/node_modules/is-core-module/.nycrc b/node_modules/is-core-module/.nycrc deleted file mode 100644 index bdd626c..0000000 --- a/node_modules/is-core-module/.nycrc +++ /dev/null @@ -1,9 +0,0 @@ -{ - "all": true, - "check-coverage": false, - "reporter": ["text-summary", "text", "html", "json"], - "exclude": [ - "coverage", - "test" - ] -} diff --git a/node_modules/is-core-module/CHANGELOG.md b/node_modules/is-core-module/CHANGELOG.md deleted file mode 100644 index 0177c82..0000000 --- a/node_modules/is-core-module/CHANGELOG.md +++ /dev/null @@ -1,218 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - -## [v2.16.1](https://github.com/inspect-js/is-core-module/compare/v2.16.0...v2.16.1) - 2024-12-21 - -### Fixed - -- [Fix] `node:sqlite` is available in node ^22.13 [`#17`](https://github.com/inspect-js/is-core-module/issues/17) - -## [v2.16.0](https://github.com/inspect-js/is-core-module/compare/v2.15.1...v2.16.0) - 2024-12-13 - -### Commits - -- [New] add `node:sqlite` [`1ee94d2`](https://github.com/inspect-js/is-core-module/commit/1ee94d20857e22cdb24e9b4bb1a2097f2e03e26f) -- [Dev Deps] update `auto-changelog`, `tape` [`aa84aa3`](https://github.com/inspect-js/is-core-module/commit/aa84aa34face677f14e08ec1c737f0c4bba27260) - -## [v2.15.1](https://github.com/inspect-js/is-core-module/compare/v2.15.0...v2.15.1) - 2024-08-21 - -### Commits - -- [Tests] add `process.getBuiltinModule` tests [`28c7791`](https://github.com/inspect-js/is-core-module/commit/28c7791c196d58c64cfdf638b7e68ed1b62a4da0) -- [Fix] `test/mock_loader` is no longer exposed as of v22.7 [`68b08b0`](https://github.com/inspect-js/is-core-module/commit/68b08b0d7963447dbffa5142e8810dca550383af) -- [Tests] replace `aud` with `npm audit` [`32f8060`](https://github.com/inspect-js/is-core-module/commit/32f806026dac14f9016be4401a643851240c76b9) -- [Dev Deps] update `mock-property` [`f7d3c8f`](https://github.com/inspect-js/is-core-module/commit/f7d3c8f01e922be49621683eb41477c4f50522e1) -- [Dev Deps] add missing peer dep [`eaee885`](https://github.com/inspect-js/is-core-module/commit/eaee885b67238819e9c8ed5bd2098766e1d05331) - -## [v2.15.0](https://github.com/inspect-js/is-core-module/compare/v2.14.0...v2.15.0) - 2024-07-17 - -### Commits - -- [New] add `node:sea` [`2819fb3`](https://github.com/inspect-js/is-core-module/commit/2819fb3eae312fa64643bc5430ebd06ec0f3fb88) - -## [v2.14.0](https://github.com/inspect-js/is-core-module/compare/v2.13.1...v2.14.0) - 2024-06-20 - -### Commits - -- [Dev Deps] update `@ljharb/eslint-config`, `aud`, `mock-property`, `npmignore`, `tape` [`0e43200`](https://github.com/inspect-js/is-core-module/commit/0e432006d97237cc082d41e6a593e87c81068364) -- [meta] add missing `engines.node` [`4ea3af8`](https://github.com/inspect-js/is-core-module/commit/4ea3af88891a1d4f96026f0ec0ef08c67cd1bd24) -- [New] add `test/mock_loader` [`e9fbd29`](https://github.com/inspect-js/is-core-module/commit/e9fbd2951383be070aeffb9ebbf3715237282610) -- [Deps] update `hasown` [`57f1940`](https://github.com/inspect-js/is-core-module/commit/57f1940947b3e368abdf529232d2f17d88909358) - -## [v2.13.1](https://github.com/inspect-js/is-core-module/compare/v2.13.0...v2.13.1) - 2023-10-20 - -### Commits - -- [Refactor] use `hasown` instead of `has` [`0e52096`](https://github.com/inspect-js/is-core-module/commit/0e520968b0a725276b67420ab4b877486b243ae0) -- [Dev Deps] update `mock-property`, `tape` [`8736b35`](https://github.com/inspect-js/is-core-module/commit/8736b35464d0f297b55da2c6b30deee04b8303c5) - -## [v2.13.0](https://github.com/inspect-js/is-core-module/compare/v2.12.1...v2.13.0) - 2023-08-05 - -### Commits - -- [Dev Deps] update `@ljharb/eslint-config`, `aud`, `semver`, `tape` [`c75b263`](https://github.com/inspect-js/is-core-module/commit/c75b263d047cb53430c3970107e5eb64d6cd6c0c) -- [New] `node:test/reporters` and `wasi`/`node:wasi` are in v18.17 [`d76cbf8`](https://github.com/inspect-js/is-core-module/commit/d76cbf8e9b208acfd98913fed5a5f45cb15fe5dc) - -## [v2.12.1](https://github.com/inspect-js/is-core-module/compare/v2.12.0...v2.12.1) - 2023-05-16 - -### Commits - -- [Fix] `test/reporters` now requires the `node:` prefix as of v20.2 [`12183d0`](https://github.com/inspect-js/is-core-module/commit/12183d0d8e4edf56b6ce18a1b3be54bfce10175b) - -## [v2.12.0](https://github.com/inspect-js/is-core-module/compare/v2.11.0...v2.12.0) - 2023-04-10 - -### Commits - -- [actions] update rebase action to use reusable workflow [`c0a7251`](https://github.com/inspect-js/is-core-module/commit/c0a7251f734f3c621932c5fcdfd1bf966b42ca32) -- [Dev Deps] update `@ljharb/eslint-config`, `aud`, `tape` [`9ae8b7f`](https://github.com/inspect-js/is-core-module/commit/9ae8b7fac03c369861d0991b4a2ce8d4848e6a7d) -- [New] `test/reporters` added in v19.9, `wasi` added in v20 [`9d5341a`](https://github.com/inspect-js/is-core-module/commit/9d5341ab32053f25b7fa7db3c0e18461db24a79c) -- [Dev Deps] add missing `in-publish` dep [`5980245`](https://github.com/inspect-js/is-core-module/commit/59802456e9ac919fa748f53be9d8fbf304a197df) - -## [v2.11.0](https://github.com/inspect-js/is-core-module/compare/v2.10.0...v2.11.0) - 2022-10-18 - -### Commits - -- [meta] use `npmignore` to autogenerate an npmignore file [`3360011`](https://github.com/inspect-js/is-core-module/commit/33600118857b46177178072fba2affcdeb009d12) -- [Dev Deps] update `aud`, `tape` [`651c6b0`](https://github.com/inspect-js/is-core-module/commit/651c6b0cc2799d4130866cf43ad333dcade3d26c) -- [New] `inspector/promises` and `node:inspector/promises` is now available in node 19 [`22d332f`](https://github.com/inspect-js/is-core-module/commit/22d332fe22ac050305444e0781ff85af819abcb0) - -## [v2.10.0](https://github.com/inspect-js/is-core-module/compare/v2.9.0...v2.10.0) - 2022-08-03 - -### Commits - -- [New] `node:test` is now available in node ^16.17 [`e8fd36e`](https://github.com/inspect-js/is-core-module/commit/e8fd36e9b86c917775a07cc473b62a3294f459f2) -- [Tests] improve skip message [`c014a4c`](https://github.com/inspect-js/is-core-module/commit/c014a4c0cd6eb15fff573ae4709191775e70cab4) - -## [v2.9.0](https://github.com/inspect-js/is-core-module/compare/v2.8.1...v2.9.0) - 2022-04-19 - -### Commits - -- [New] add `node:test`, in node 18+ [`f853eca`](https://github.com/inspect-js/is-core-module/commit/f853eca801d0a7d4e1dbb670f1b6d9837d9533c5) -- [Tests] use `mock-property` [`03b3644`](https://github.com/inspect-js/is-core-module/commit/03b3644dff4417f4ba5a7d0aa0138f5f6b3e5c46) -- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `tape` [`7c0e2d0`](https://github.com/inspect-js/is-core-module/commit/7c0e2d06ed2a89acf53abe2ab34d703ed5b03455) -- [meta] simplify "exports" [`d6ed201`](https://github.com/inspect-js/is-core-module/commit/d6ed201eba7fbba0e59814a9050fc49a6e9878c8) - -## [v2.8.1](https://github.com/inspect-js/is-core-module/compare/v2.8.0...v2.8.1) - 2022-01-05 - -### Commits - -- [actions] reuse common workflows [`cd2cf9b`](https://github.com/inspect-js/is-core-module/commit/cd2cf9b3b66c8d328f65610efe41e9325db7716d) -- [Fix] update node 0.4 results [`062195d`](https://github.com/inspect-js/is-core-module/commit/062195d89f0876a88b95d378b43f7fcc1205bc5b) -- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `safe-publish-latest`, `tape` [`0790b62`](https://github.com/inspect-js/is-core-module/commit/0790b6222848c6167132f9f73acc3520fa8d1298) -- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape` [`7d139a6`](https://github.com/inspect-js/is-core-module/commit/7d139a6d767709eabf0a0251e074ec1fb230c06e) -- [Tests] run `nyc` in `tests-only`, not `test` [`780e8a0`](https://github.com/inspect-js/is-core-module/commit/780e8a049951c71cf78b1707f0871c48a28bde14) - -## [v2.8.0](https://github.com/inspect-js/is-core-module/compare/v2.7.0...v2.8.0) - 2021-10-14 - -### Commits - -- [actions] update codecov uploader [`0cfe94e`](https://github.com/inspect-js/is-core-module/commit/0cfe94e106a7d005ea03e008c0a21dec13a77904) -- [New] add `readline/promises` to node v17+ [`4f78c30`](https://github.com/inspect-js/is-core-module/commit/4f78c3008b1b58b4db6dc91d99610b1bc859da7e) -- [Tests] node ^14.18 supports `node:` prefixes for CJS [`43e2f17`](https://github.com/inspect-js/is-core-module/commit/43e2f177452cea2f0eaf34f61b5407217bbdb6f4) - -## [v2.7.0](https://github.com/inspect-js/is-core-module/compare/v2.6.0...v2.7.0) - 2021-09-27 - -### Commits - -- [New] node `v14.18` added `node:`-prefixed core modules to `require` [`6d943ab`](https://github.com/inspect-js/is-core-module/commit/6d943abe81382b9bbe344384d80fbfebe1cc0526) -- [Tests] add coverage for Object.prototype pollution [`c6baf5f`](https://github.com/inspect-js/is-core-module/commit/c6baf5f942311a1945c1af41167bb80b84df2af7) -- [Dev Deps] update `@ljharb/eslint-config` [`6717f00`](https://github.com/inspect-js/is-core-module/commit/6717f000d063ea57beb772bded36c2f056ac404c) -- [eslint] fix linter warning [`594c10b`](https://github.com/inspect-js/is-core-module/commit/594c10bb7d39d7eb00925c90924199ff596184b2) -- [meta] add `sideEffects` flag [`c32cfa5`](https://github.com/inspect-js/is-core-module/commit/c32cfa5195632944c4dd4284a142b8476e75be13) - -## [v2.6.0](https://github.com/inspect-js/is-core-module/compare/v2.5.0...v2.6.0) - 2021-08-17 - -### Commits - -- [Dev Deps] update `eslint`, `tape` [`6cc928f`](https://github.com/inspect-js/is-core-module/commit/6cc928f8a4bba66aeeccc4f6beeac736d4bd3081) -- [New] add `stream/consumers` to node `>= 16.7` [`a1a423e`](https://github.com/inspect-js/is-core-module/commit/a1a423e467e4cc27df180234fad5bab45943e67d) -- [Refactor] Remove duplicated `&&` operand [`86faea7`](https://github.com/inspect-js/is-core-module/commit/86faea738213a2433c62d1098488dc9314dca832) -- [Tests] include prereleases [`a4da7a6`](https://github.com/inspect-js/is-core-module/commit/a4da7a6abf7568e2aa4fd98e69452179f1850963) - -## [v2.5.0](https://github.com/inspect-js/is-core-module/compare/v2.4.0...v2.5.0) - 2021-07-12 - -### Commits - -- [Dev Deps] update `auto-changelog`, `eslint` [`6334cc9`](https://github.com/inspect-js/is-core-module/commit/6334cc94f3af7469685bd8f236740991baaf2705) -- [New] add `stream/web` to node v16.5+ [`17ac59b`](https://github.com/inspect-js/is-core-module/commit/17ac59b662d63e220a2e5728625f005c24f177b2) - -## [v2.4.0](https://github.com/inspect-js/is-core-module/compare/v2.3.0...v2.4.0) - 2021-05-09 - -### Commits - -- [readme] add actions and codecov badges [`82b7faa`](https://github.com/inspect-js/is-core-module/commit/82b7faa12b56dbe47fbea67e1a5b9e447027ba40) -- [Dev Deps] update `@ljharb/eslint-config`, `aud` [`8096868`](https://github.com/inspect-js/is-core-module/commit/8096868c024a161ccd4d44110b136763e92eace8) -- [Dev Deps] update `eslint` [`6726824`](https://github.com/inspect-js/is-core-module/commit/67268249b88230018c510f6532a8046d7326346f) -- [New] add `diagnostics_channel` to node `^14.17` [`86c6563`](https://github.com/inspect-js/is-core-module/commit/86c65634201b8ff9b3e48a9a782594579c7f5c3c) -- [meta] fix prepublish script [`697a01e`](https://github.com/inspect-js/is-core-module/commit/697a01e3c9c0be074066520954f30fb28532ec57) - -## [v2.3.0](https://github.com/inspect-js/is-core-module/compare/v2.2.0...v2.3.0) - 2021-04-24 - -### Commits - -- [meta] do not publish github action workflow files [`060d4bb`](https://github.com/inspect-js/is-core-module/commit/060d4bb971a29451c19ff336eb56bee27f9fa95a) -- [New] add support for `node:` prefix, in node 16+ [`7341223`](https://github.com/inspect-js/is-core-module/commit/73412230a769f6e81c05eea50b6520cebf54ed2f) -- [actions] use `node/install` instead of `node/run`; use `codecov` action [`016269a`](https://github.com/inspect-js/is-core-module/commit/016269abae9f6657a5254adfbb813f09a05067f9) -- [patch] remove unneeded `.0` in version ranges [`cb466a6`](https://github.com/inspect-js/is-core-module/commit/cb466a6d89e52b8389e5c12715efcd550c41cea3) -- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `tape` [`c9f9c39`](https://github.com/inspect-js/is-core-module/commit/c9f9c396ace60ef81906f98059c064e6452473ed) -- [actions] update workflows [`3ee4a89`](https://github.com/inspect-js/is-core-module/commit/3ee4a89fd5a02fccd43882d905448ea6a98e9a3c) -- [Dev Deps] update `eslint`, `@ljharb/eslint-config` [`dee4fed`](https://github.com/inspect-js/is-core-module/commit/dee4fed79690c1d43a22f7fa9426abebdc6d727f) -- [Dev Deps] update `eslint`, `@ljharb/eslint-config` [`7d046ba`](https://github.com/inspect-js/is-core-module/commit/7d046ba07ae8c9292e43652694ca808d7b309de8) -- [meta] use `prepublishOnly` script for npm 7+ [`149e677`](https://github.com/inspect-js/is-core-module/commit/149e6771a5ede6d097e71785b467a9c4b4977cc7) -- [readme] remove travis badge [`903b51d`](https://github.com/inspect-js/is-core-module/commit/903b51d6b69b98abeabfbc3695c345b02646f19c) - -## [v2.2.0](https://github.com/inspect-js/is-core-module/compare/v2.1.0...v2.2.0) - 2020-11-26 - -### Commits - -- [Tests] migrate tests to Github Actions [`c919f57`](https://github.com/inspect-js/is-core-module/commit/c919f573c0a92d10a0acad0b650b5aecb033d426) -- [patch] `core.json`: %s/ /\t/g [`db3f685`](https://github.com/inspect-js/is-core-module/commit/db3f68581f53e73cc09cd675955eb1bdd6a5a39b) -- [Tests] run `nyc` on all tests [`b2f925f`](https://github.com/inspect-js/is-core-module/commit/b2f925f8866f210ef441f39fcc8cc42692ab89b1) -- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`; add `safe-publish-latest` [`89f02a2`](https://github.com/inspect-js/is-core-module/commit/89f02a2b4162246dea303a6ee31bb9a550b05c72) -- [New] add `path/posix`, `path/win32`, `util/types` [`77f94f1`](https://github.com/inspect-js/is-core-module/commit/77f94f1e90ffd7c0be2a3f1aa8574ebf7fd981b3) - -## [v2.1.0](https://github.com/inspect-js/is-core-module/compare/v2.0.0...v2.1.0) - 2020-11-04 - -### Commits - -- [Dev Deps] update `eslint` [`5e0034e`](https://github.com/inspect-js/is-core-module/commit/5e0034eae57c09c8f1bd769f502486a00f56c6e4) -- [New] Add `diagnostics_channel` [`c2d83d0`](https://github.com/inspect-js/is-core-module/commit/c2d83d0a0225a1a658945d9bab7036ea347d29ec) - -## [v2.0.0](https://github.com/inspect-js/is-core-module/compare/v1.0.2...v2.0.0) - 2020-09-29 - -### Commits - -- v2 implementation [`865aeb5`](https://github.com/inspect-js/is-core-module/commit/865aeb5ca0e90248a3dfff5d7622e4751fdeb9cd) -- Only apps should have lockfiles [`5a5e660`](https://github.com/inspect-js/is-core-module/commit/5a5e660d568e37eb44e17fb1ebb12a105205fc2b) -- Initial commit for v2 [`5a51524`](https://github.com/inspect-js/is-core-module/commit/5a51524e06f92adece5fbb138c69b7b9748a2348) -- Tests [`116eae4`](https://github.com/inspect-js/is-core-module/commit/116eae4fccd01bc72c1fd3cc4b7561c387afc496) -- [meta] add `auto-changelog` [`c24388b`](https://github.com/inspect-js/is-core-module/commit/c24388bee828d223040519d1f5b226ca35beee63) -- [actions] add "Automatic Rebase" and "require allow edits" actions [`34292db`](https://github.com/inspect-js/is-core-module/commit/34292dbcbadae0868aff03c22dbd8b7b8a11558a) -- [Tests] add `npm run lint` [`4f9eeee`](https://github.com/inspect-js/is-core-module/commit/4f9eeee7ddff10698bbf528620f4dc8d4fa3e697) -- [readme] fix travis badges, https all URLs [`e516a73`](https://github.com/inspect-js/is-core-module/commit/e516a73b0dccce20938c432b1ba512eae8eff9e9) -- [meta] create FUNDING.yml [`1aabebc`](https://github.com/inspect-js/is-core-module/commit/1aabebca98d01f8a04e46bc2e2520fa93cf21ac6) -- [Fix] `domain`: domain landed sometime > v0.7.7 and <= v0.7.12 [`2df7d37`](https://github.com/inspect-js/is-core-module/commit/2df7d37595d41b15eeada732b706b926c2771655) -- [Fix] `sys`: worked in 0.6, not 0.7, and 0.8+ [`a75c134`](https://github.com/inspect-js/is-core-module/commit/a75c134229e1e9441801f6b73f6a52489346eb65) - -## [v1.0.2](https://github.com/inspect-js/is-core-module/compare/v1.0.1...v1.0.2) - 2014-09-28 - -### Commits - -- simpler [`66fe90f`](https://github.com/inspect-js/is-core-module/commit/66fe90f9771581b9adc0c3900baa52c21b5baea2) - -## [v1.0.1](https://github.com/inspect-js/is-core-module/compare/v1.0.0...v1.0.1) - 2014-09-28 - -### Commits - -- remove stupid [`f21f906`](https://github.com/inspect-js/is-core-module/commit/f21f906f882c2bd656a5fc5ed6fbe48ddaffb2ac) -- update readme [`1eff0ec`](https://github.com/inspect-js/is-core-module/commit/1eff0ec69798d1ec65771552d1562911e90a8027) - -## v1.0.0 - 2014-09-28 - -### Commits - -- init [`48e5e76`](https://github.com/inspect-js/is-core-module/commit/48e5e76cac378fddb8c1f7d4055b8dfc943d6b96) diff --git a/node_modules/is-core-module/LICENSE b/node_modules/is-core-module/LICENSE deleted file mode 100644 index 2e50287..0000000 --- a/node_modules/is-core-module/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Dave Justice - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/node_modules/is-core-module/README.md b/node_modules/is-core-module/README.md deleted file mode 100644 index 062d906..0000000 --- a/node_modules/is-core-module/README.md +++ /dev/null @@ -1,40 +0,0 @@ -# is-core-module [![Version Badge][2]][1] - -[![github actions][actions-image]][actions-url] -[![coverage][codecov-image]][codecov-url] -[![dependency status][5]][6] -[![dev dependency status][7]][8] -[![License][license-image]][license-url] -[![Downloads][downloads-image]][downloads-url] - -[![npm badge][11]][1] - -Is this specifier a node.js core module? Optionally provide a node version to check; defaults to the current node version. - -## Example - -```js -var isCore = require('is-core-module'); -var assert = require('assert'); -assert(isCore('fs')); -assert(!isCore('butts')); -``` - -## Tests -Clone the repo, `npm install`, and run `npm test` - -[1]: https://npmjs.org/package/is-core-module -[2]: https://versionbadg.es/inspect-js/is-core-module.svg -[5]: https://david-dm.org/inspect-js/is-core-module.svg -[6]: https://david-dm.org/inspect-js/is-core-module -[7]: https://david-dm.org/inspect-js/is-core-module/dev-status.svg -[8]: https://david-dm.org/inspect-js/is-core-module#info=devDependencies -[11]: https://nodei.co/npm/is-core-module.png?downloads=true&stars=true -[license-image]: https://img.shields.io/npm/l/is-core-module.svg -[license-url]: LICENSE -[downloads-image]: https://img.shields.io/npm/dm/is-core-module.svg -[downloads-url]: https://npm-stat.com/charts.html?package=is-core-module -[codecov-image]: https://codecov.io/gh/inspect-js/is-core-module/branch/main/graphs/badge.svg -[codecov-url]: https://app.codecov.io/gh/inspect-js/is-core-module/ -[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/inspect-js/is-core-module -[actions-url]: https://github.com/inspect-js/is-core-module/actions diff --git a/node_modules/is-core-module/core.json b/node_modules/is-core-module/core.json deleted file mode 100644 index 930ec68..0000000 --- a/node_modules/is-core-module/core.json +++ /dev/null @@ -1,162 +0,0 @@ -{ - "assert": true, - "node:assert": [">= 14.18 && < 15", ">= 16"], - "assert/strict": ">= 15", - "node:assert/strict": ">= 16", - "async_hooks": ">= 8", - "node:async_hooks": [">= 14.18 && < 15", ">= 16"], - "buffer_ieee754": ">= 0.5 && < 0.9.7", - "buffer": true, - "node:buffer": [">= 14.18 && < 15", ">= 16"], - "child_process": true, - "node:child_process": [">= 14.18 && < 15", ">= 16"], - "cluster": ">= 0.5", - "node:cluster": [">= 14.18 && < 15", ">= 16"], - "console": true, - "node:console": [">= 14.18 && < 15", ">= 16"], - "constants": true, - "node:constants": [">= 14.18 && < 15", ">= 16"], - "crypto": true, - "node:crypto": [">= 14.18 && < 15", ">= 16"], - "_debug_agent": ">= 1 && < 8", - "_debugger": "< 8", - "dgram": true, - "node:dgram": [">= 14.18 && < 15", ">= 16"], - "diagnostics_channel": [">= 14.17 && < 15", ">= 15.1"], - "node:diagnostics_channel": [">= 14.18 && < 15", ">= 16"], - "dns": true, - "node:dns": [">= 14.18 && < 15", ">= 16"], - "dns/promises": ">= 15", - "node:dns/promises": ">= 16", - "domain": ">= 0.7.12", - "node:domain": [">= 14.18 && < 15", ">= 16"], - "events": true, - "node:events": [">= 14.18 && < 15", ">= 16"], - "freelist": "< 6", - "fs": true, - "node:fs": [">= 14.18 && < 15", ">= 16"], - "fs/promises": [">= 10 && < 10.1", ">= 14"], - "node:fs/promises": [">= 14.18 && < 15", ">= 16"], - "_http_agent": ">= 0.11.1", - "node:_http_agent": [">= 14.18 && < 15", ">= 16"], - "_http_client": ">= 0.11.1", - "node:_http_client": [">= 14.18 && < 15", ">= 16"], - "_http_common": ">= 0.11.1", - "node:_http_common": [">= 14.18 && < 15", ">= 16"], - "_http_incoming": ">= 0.11.1", - "node:_http_incoming": [">= 14.18 && < 15", ">= 16"], - "_http_outgoing": ">= 0.11.1", - "node:_http_outgoing": [">= 14.18 && < 15", ">= 16"], - "_http_server": ">= 0.11.1", - "node:_http_server": [">= 14.18 && < 15", ">= 16"], - "http": true, - "node:http": [">= 14.18 && < 15", ">= 16"], - "http2": ">= 8.8", - "node:http2": [">= 14.18 && < 15", ">= 16"], - "https": true, - "node:https": [">= 14.18 && < 15", ">= 16"], - "inspector": ">= 8", - "node:inspector": [">= 14.18 && < 15", ">= 16"], - "inspector/promises": [">= 19"], - "node:inspector/promises": [">= 19"], - "_linklist": "< 8", - "module": true, - "node:module": [">= 14.18 && < 15", ">= 16"], - "net": true, - "node:net": [">= 14.18 && < 15", ">= 16"], - "node-inspect/lib/_inspect": ">= 7.6 && < 12", - "node-inspect/lib/internal/inspect_client": ">= 7.6 && < 12", - "node-inspect/lib/internal/inspect_repl": ">= 7.6 && < 12", - "os": true, - "node:os": [">= 14.18 && < 15", ">= 16"], - "path": true, - "node:path": [">= 14.18 && < 15", ">= 16"], - "path/posix": ">= 15.3", - "node:path/posix": ">= 16", - "path/win32": ">= 15.3", - "node:path/win32": ">= 16", - "perf_hooks": ">= 8.5", - "node:perf_hooks": [">= 14.18 && < 15", ">= 16"], - "process": ">= 1", - "node:process": [">= 14.18 && < 15", ">= 16"], - "punycode": ">= 0.5", - "node:punycode": [">= 14.18 && < 15", ">= 16"], - "querystring": true, - "node:querystring": [">= 14.18 && < 15", ">= 16"], - "readline": true, - "node:readline": [">= 14.18 && < 15", ">= 16"], - "readline/promises": ">= 17", - "node:readline/promises": ">= 17", - "repl": true, - "node:repl": [">= 14.18 && < 15", ">= 16"], - "node:sea": [">= 20.12 && < 21", ">= 21.7"], - "smalloc": ">= 0.11.5 && < 3", - "node:sqlite": [">= 22.13 && < 23", ">= 23.4"], - "_stream_duplex": ">= 0.9.4", - "node:_stream_duplex": [">= 14.18 && < 15", ">= 16"], - "_stream_transform": ">= 0.9.4", - "node:_stream_transform": [">= 14.18 && < 15", ">= 16"], - "_stream_wrap": ">= 1.4.1", - "node:_stream_wrap": [">= 14.18 && < 15", ">= 16"], - "_stream_passthrough": ">= 0.9.4", - "node:_stream_passthrough": [">= 14.18 && < 15", ">= 16"], - "_stream_readable": ">= 0.9.4", - "node:_stream_readable": [">= 14.18 && < 15", ">= 16"], - "_stream_writable": ">= 0.9.4", - "node:_stream_writable": [">= 14.18 && < 15", ">= 16"], - "stream": true, - "node:stream": [">= 14.18 && < 15", ">= 16"], - "stream/consumers": ">= 16.7", - "node:stream/consumers": ">= 16.7", - "stream/promises": ">= 15", - "node:stream/promises": ">= 16", - "stream/web": ">= 16.5", - "node:stream/web": ">= 16.5", - "string_decoder": true, - "node:string_decoder": [">= 14.18 && < 15", ">= 16"], - "sys": [">= 0.4 && < 0.7", ">= 0.8"], - "node:sys": [">= 14.18 && < 15", ">= 16"], - "test/reporters": ">= 19.9 && < 20.2", - "node:test/reporters": [">= 18.17 && < 19", ">= 19.9", ">= 20"], - "test/mock_loader": ">= 22.3 && < 22.7", - "node:test/mock_loader": ">= 22.3 && < 22.7", - "node:test": [">= 16.17 && < 17", ">= 18"], - "timers": true, - "node:timers": [">= 14.18 && < 15", ">= 16"], - "timers/promises": ">= 15", - "node:timers/promises": ">= 16", - "_tls_common": ">= 0.11.13", - "node:_tls_common": [">= 14.18 && < 15", ">= 16"], - "_tls_legacy": ">= 0.11.3 && < 10", - "_tls_wrap": ">= 0.11.3", - "node:_tls_wrap": [">= 14.18 && < 15", ">= 16"], - "tls": true, - "node:tls": [">= 14.18 && < 15", ">= 16"], - "trace_events": ">= 10", - "node:trace_events": [">= 14.18 && < 15", ">= 16"], - "tty": true, - "node:tty": [">= 14.18 && < 15", ">= 16"], - "url": true, - "node:url": [">= 14.18 && < 15", ">= 16"], - "util": true, - "node:util": [">= 14.18 && < 15", ">= 16"], - "util/types": ">= 15.3", - "node:util/types": ">= 16", - "v8/tools/arguments": ">= 10 && < 12", - "v8/tools/codemap": [">= 4.4 && < 5", ">= 5.2 && < 12"], - "v8/tools/consarray": [">= 4.4 && < 5", ">= 5.2 && < 12"], - "v8/tools/csvparser": [">= 4.4 && < 5", ">= 5.2 && < 12"], - "v8/tools/logreader": [">= 4.4 && < 5", ">= 5.2 && < 12"], - "v8/tools/profile_view": [">= 4.4 && < 5", ">= 5.2 && < 12"], - "v8/tools/splaytree": [">= 4.4 && < 5", ">= 5.2 && < 12"], - "v8": ">= 1", - "node:v8": [">= 14.18 && < 15", ">= 16"], - "vm": true, - "node:vm": [">= 14.18 && < 15", ">= 16"], - "wasi": [">= 13.4 && < 13.5", ">= 18.17 && < 19", ">= 20"], - "node:wasi": [">= 18.17 && < 19", ">= 20"], - "worker_threads": ">= 11.7", - "node:worker_threads": [">= 14.18 && < 15", ">= 16"], - "zlib": ">= 0.5", - "node:zlib": [">= 14.18 && < 15", ">= 16"] -} diff --git a/node_modules/is-core-module/index.js b/node_modules/is-core-module/index.js deleted file mode 100644 index 423e20c..0000000 --- a/node_modules/is-core-module/index.js +++ /dev/null @@ -1,69 +0,0 @@ -'use strict'; - -var hasOwn = require('hasown'); - -function specifierIncluded(current, specifier) { - var nodeParts = current.split('.'); - var parts = specifier.split(' '); - var op = parts.length > 1 ? parts[0] : '='; - var versionParts = (parts.length > 1 ? parts[1] : parts[0]).split('.'); - - for (var i = 0; i < 3; ++i) { - var cur = parseInt(nodeParts[i] || 0, 10); - var ver = parseInt(versionParts[i] || 0, 10); - if (cur === ver) { - continue; // eslint-disable-line no-restricted-syntax, no-continue - } - if (op === '<') { - return cur < ver; - } - if (op === '>=') { - return cur >= ver; - } - return false; - } - return op === '>='; -} - -function matchesRange(current, range) { - var specifiers = range.split(/ ?&& ?/); - if (specifiers.length === 0) { - return false; - } - for (var i = 0; i < specifiers.length; ++i) { - if (!specifierIncluded(current, specifiers[i])) { - return false; - } - } - return true; -} - -function versionIncluded(nodeVersion, specifierValue) { - if (typeof specifierValue === 'boolean') { - return specifierValue; - } - - var current = typeof nodeVersion === 'undefined' - ? process.versions && process.versions.node - : nodeVersion; - - if (typeof current !== 'string') { - throw new TypeError(typeof nodeVersion === 'undefined' ? 'Unable to determine current node version' : 'If provided, a valid node version is required'); - } - - if (specifierValue && typeof specifierValue === 'object') { - for (var i = 0; i < specifierValue.length; ++i) { - if (matchesRange(current, specifierValue[i])) { - return true; - } - } - return false; - } - return matchesRange(current, specifierValue); -} - -var data = require('./core.json'); - -module.exports = function isCore(x, nodeVersion) { - return hasOwn(data, x) && versionIncluded(nodeVersion, data[x]); -}; diff --git a/node_modules/is-core-module/package.json b/node_modules/is-core-module/package.json deleted file mode 100644 index 2668256..0000000 --- a/node_modules/is-core-module/package.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "name": "is-core-module", - "version": "2.16.1", - "description": "Is this specifier a node.js core module?", - "main": "index.js", - "sideEffects": false, - "exports": { - ".": "./index.js", - "./package.json": "./package.json" - }, - "scripts": { - "prepack": "npmignore --auto --commentLines=autogenerated", - "prepublish": "not-in-publish || npm run prepublishOnly", - "prepublishOnly": "safe-publish-latest", - "lint": "eslint .", - "pretest": "npm run lint", - "tests-only": "nyc tape 'test/**/*.js'", - "test": "npm run tests-only", - "posttest": "npx npm@'>=10.2' audit --production", - "version": "auto-changelog && git add CHANGELOG.md", - "postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\"" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/inspect-js/is-core-module.git" - }, - "keywords": [ - "core", - "modules", - "module", - "npm", - "node", - "dependencies" - ], - "author": "Jordan Harband ", - "funding": { - "url": "https://github.com/sponsors/ljharb" - }, - "license": "MIT", - "bugs": { - "url": "https://github.com/inspect-js/is-core-module/issues" - }, - "homepage": "https://github.com/inspect-js/is-core-module", - "dependencies": { - "hasown": "^2.0.2" - }, - "devDependencies": { - "@ljharb/eslint-config": "^21.1.1", - "auto-changelog": "^2.5.0", - "encoding": "^0.1.13", - "eslint": "=8.8.0", - "in-publish": "^2.0.1", - "mock-property": "^1.1.0", - "npmignore": "^0.3.1", - "nyc": "^10.3.2", - "safe-publish-latest": "^2.0.0", - "semver": "^6.3.1", - "tape": "^5.9.0" - }, - "auto-changelog": { - "output": "CHANGELOG.md", - "template": "keepachangelog", - "unreleased": false, - "commitLimit": false, - "backfillLimit": false, - "hideCredit": true - }, - "publishConfig": { - "ignore": [ - ".github" - ] - }, - "engines": { - "node": ">= 0.4" - } -} diff --git a/node_modules/is-core-module/test/index.js b/node_modules/is-core-module/test/index.js deleted file mode 100644 index 7a81e1c..0000000 --- a/node_modules/is-core-module/test/index.js +++ /dev/null @@ -1,157 +0,0 @@ -'use strict'; - -var test = require('tape'); -var keys = require('object-keys'); -var semver = require('semver'); -var mockProperty = require('mock-property'); - -var isCore = require('../'); -var data = require('../core.json'); - -var supportsNodePrefix = semver.satisfies(process.versions.node, '^14.18 || >= 16', { includePrerelease: true }); - -test('core modules', function (t) { - t.test('isCore()', function (st) { - st.ok(isCore('fs')); - st.ok(isCore('net')); - st.ok(isCore('http')); - - st.ok(!isCore('seq')); - st.ok(!isCore('../')); - - st.ok(!isCore('toString')); - - st.end(); - }); - - t.test('core list', function (st) { - var cores = keys(data); - st.plan(cores.length); - - for (var i = 0; i < cores.length; ++i) { - var mod = cores[i]; - var requireFunc = function () { require(mod); }; // eslint-disable-line no-loop-func - if (isCore(mod)) { - st.doesNotThrow(requireFunc, mod + ' supported; requiring does not throw'); - } else { - st['throws'](requireFunc, mod + ' not supported; requiring throws'); - } - } - - st.end(); - }); - - t.test('core via repl module', { skip: !data.repl }, function (st) { - var libs = require('repl')._builtinLibs; // eslint-disable-line no-underscore-dangle - if (!libs) { - st.skip('repl._builtinLibs does not exist'); - } else { - for (var i = 0; i < libs.length; ++i) { - var mod = libs[i]; - st.ok(data[mod], mod + ' is a core module'); - st.doesNotThrow( - function () { require(mod); }, // eslint-disable-line no-loop-func - 'requiring ' + mod + ' does not throw' - ); - if (mod.slice(0, 5) !== 'node:') { - if (supportsNodePrefix) { - st.doesNotThrow( - function () { require('node:' + mod); }, // eslint-disable-line no-loop-func - 'requiring node:' + mod + ' does not throw' - ); - } else { - st['throws']( - function () { require('node:' + mod); }, // eslint-disable-line no-loop-func - 'requiring node:' + mod + ' throws' - ); - } - } - } - } - st.end(); - }); - - t.test('core via builtinModules list', { skip: !data.module }, function (st) { - var Module = require('module'); - var libs = Module.builtinModules; - if (!libs) { - st.skip('module.builtinModules does not exist'); - } else { - var excludeList = [ - '_debug_agent', - 'v8/tools/tickprocessor-driver', - 'v8/tools/SourceMap', - 'v8/tools/tickprocessor', - 'v8/tools/profile' - ]; - - // see https://github.com/nodejs/node/issues/42785 - if (semver.satisfies(process.version, '>= 18')) { - libs = libs.concat('node:test'); - } - if (semver.satisfies(process.version, '^20.12 || >= 21.7')) { - libs = libs.concat('node:sea'); - } - if (semver.satisfies(process.version, '>= 23.4')) { - libs = libs.concat('node:sqlite'); - } - - for (var i = 0; i < libs.length; ++i) { - var mod = libs[i]; - if (excludeList.indexOf(mod) === -1) { - st.ok(data[mod], mod + ' is a core module'); - - if (Module.isBuiltin) { - st.ok(Module.isBuiltin(mod), 'module.isBuiltin(' + mod + ') is true'); - } - - st.doesNotThrow( - function () { require(mod); }, // eslint-disable-line no-loop-func - 'requiring ' + mod + ' does not throw' - ); - - if (process.getBuiltinModule) { - st.equal( - process.getBuiltinModule(mod), - require(mod), - 'process.getBuiltinModule(' + mod + ') === require(' + mod + ')' - ); - } - - if (mod.slice(0, 5) !== 'node:') { - if (supportsNodePrefix) { - st.doesNotThrow( - function () { require('node:' + mod); }, // eslint-disable-line no-loop-func - 'requiring node:' + mod + ' does not throw' - ); - } else { - st['throws']( - function () { require('node:' + mod); }, // eslint-disable-line no-loop-func - 'requiring node:' + mod + ' throws' - ); - } - } - } - } - } - - st.end(); - }); - - t.test('Object.prototype pollution', function (st) { - var nonKey = 'not a core module'; - st.teardown(mockProperty(Object.prototype, 'fs', { value: false })); - st.teardown(mockProperty(Object.prototype, 'path', { value: '>= 999999999' })); - st.teardown(mockProperty(Object.prototype, 'http', { value: data.http })); - st.teardown(mockProperty(Object.prototype, nonKey, { value: true })); - - st.equal(isCore('fs'), true, 'fs is a core module even if Object.prototype lies'); - st.equal(isCore('path'), true, 'path is a core module even if Object.prototype lies'); - st.equal(isCore('http'), true, 'path is a core module even if Object.prototype matches data'); - st.equal(isCore(nonKey), false, '"' + nonKey + '" is not a core module even if Object.prototype lies'); - - st.end(); - }); - - t.end(); -}); diff --git a/node_modules/is-extglob/LICENSE b/node_modules/is-extglob/LICENSE deleted file mode 100644 index 842218c..0000000 --- a/node_modules/is-extglob/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014-2016, Jon Schlinkert - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/node_modules/is-extglob/README.md b/node_modules/is-extglob/README.md deleted file mode 100644 index 0416af5..0000000 --- a/node_modules/is-extglob/README.md +++ /dev/null @@ -1,107 +0,0 @@ -# is-extglob [![NPM version](https://img.shields.io/npm/v/is-extglob.svg?style=flat)](https://www.npmjs.com/package/is-extglob) [![NPM downloads](https://img.shields.io/npm/dm/is-extglob.svg?style=flat)](https://npmjs.org/package/is-extglob) [![Build Status](https://img.shields.io/travis/jonschlinkert/is-extglob.svg?style=flat)](https://travis-ci.org/jonschlinkert/is-extglob) - -> Returns true if a string has an extglob. - -## Install - -Install with [npm](https://www.npmjs.com/): - -```sh -$ npm install --save is-extglob -``` - -## Usage - -```js -var isExtglob = require('is-extglob'); -``` - -**True** - -```js -isExtglob('?(abc)'); -isExtglob('@(abc)'); -isExtglob('!(abc)'); -isExtglob('*(abc)'); -isExtglob('+(abc)'); -``` - -**False** - -Escaped extglobs: - -```js -isExtglob('\\?(abc)'); -isExtglob('\\@(abc)'); -isExtglob('\\!(abc)'); -isExtglob('\\*(abc)'); -isExtglob('\\+(abc)'); -``` - -Everything else... - -```js -isExtglob('foo.js'); -isExtglob('!foo.js'); -isExtglob('*.js'); -isExtglob('**/abc.js'); -isExtglob('abc/*.js'); -isExtglob('abc/(aaa|bbb).js'); -isExtglob('abc/[a-z].js'); -isExtglob('abc/{a,b}.js'); -isExtglob('abc/?.js'); -isExtglob('abc.js'); -isExtglob('abc/def/ghi.js'); -``` - -## History - -**v2.0** - -Adds support for escaping. Escaped exglobs no longer return true. - -## About - -### Related projects - -* [has-glob](https://www.npmjs.com/package/has-glob): Returns `true` if an array has a glob pattern. | [homepage](https://github.com/jonschlinkert/has-glob "Returns `true` if an array has a glob pattern.") -* [is-glob](https://www.npmjs.com/package/is-glob): Returns `true` if the given string looks like a glob pattern or an extglob pattern… [more](https://github.com/jonschlinkert/is-glob) | [homepage](https://github.com/jonschlinkert/is-glob "Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a bet") -* [micromatch](https://www.npmjs.com/package/micromatch): Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch. | [homepage](https://github.com/jonschlinkert/micromatch "Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch.") - -### Contributing - -Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). - -### Building docs - -_(This document was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme) (a [verb](https://github.com/verbose/verb) generator), please don't edit the readme directly. Any changes to the readme must be made in [.verb.md](.verb.md).)_ - -To generate the readme and API documentation with [verb](https://github.com/verbose/verb): - -```sh -$ npm install -g verb verb-generate-readme && verb -``` - -### Running tests - -Install dev dependencies: - -```sh -$ npm install -d && npm test -``` - -### Author - -**Jon Schlinkert** - -* [github/jonschlinkert](https://github.com/jonschlinkert) -* [twitter/jonschlinkert](http://twitter.com/jonschlinkert) - -### License - -Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert). -Released under the [MIT license](https://github.com/jonschlinkert/is-extglob/blob/master/LICENSE). - -*** - -_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.1.31, on October 12, 2016._ \ No newline at end of file diff --git a/node_modules/is-extglob/index.js b/node_modules/is-extglob/index.js deleted file mode 100644 index c1d986f..0000000 --- a/node_modules/is-extglob/index.js +++ /dev/null @@ -1,20 +0,0 @@ -/*! - * is-extglob - * - * Copyright (c) 2014-2016, Jon Schlinkert. - * Licensed under the MIT License. - */ - -module.exports = function isExtglob(str) { - if (typeof str !== 'string' || str === '') { - return false; - } - - var match; - while ((match = /(\\).|([@?!+*]\(.*\))/g.exec(str))) { - if (match[2]) return true; - str = str.slice(match.index + match[0].length); - } - - return false; -}; diff --git a/node_modules/is-extglob/package.json b/node_modules/is-extglob/package.json deleted file mode 100644 index 7a90836..0000000 --- a/node_modules/is-extglob/package.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "name": "is-extglob", - "description": "Returns true if a string has an extglob.", - "version": "2.1.1", - "homepage": "https://github.com/jonschlinkert/is-extglob", - "author": "Jon Schlinkert (https://github.com/jonschlinkert)", - "repository": "jonschlinkert/is-extglob", - "bugs": { - "url": "https://github.com/jonschlinkert/is-extglob/issues" - }, - "license": "MIT", - "files": [ - "index.js" - ], - "main": "index.js", - "engines": { - "node": ">=0.10.0" - }, - "scripts": { - "test": "mocha" - }, - "devDependencies": { - "gulp-format-md": "^0.1.10", - "mocha": "^3.0.2" - }, - "keywords": [ - "bash", - "braces", - "check", - "exec", - "expression", - "extglob", - "glob", - "globbing", - "globstar", - "is", - "match", - "matches", - "pattern", - "regex", - "regular", - "string", - "test" - ], - "verb": { - "toc": false, - "layout": "default", - "tasks": [ - "readme" - ], - "plugins": [ - "gulp-format-md" - ], - "related": { - "list": [ - "has-glob", - "is-glob", - "micromatch" - ] - }, - "reflinks": [ - "verb", - "verb-generate-readme" - ], - "lint": { - "reflinks": true - } - } -} diff --git a/node_modules/is-fullwidth-code-point/index.d.ts b/node_modules/is-fullwidth-code-point/index.d.ts deleted file mode 100644 index 729d202..0000000 --- a/node_modules/is-fullwidth-code-point/index.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** -Check if the character represented by a given [Unicode code point](https://en.wikipedia.org/wiki/Code_point) is [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms). - -@param codePoint - The [code point](https://en.wikipedia.org/wiki/Code_point) of a character. - -@example -``` -import isFullwidthCodePoint from 'is-fullwidth-code-point'; - -isFullwidthCodePoint('谢'.codePointAt(0)); -//=> true - -isFullwidthCodePoint('a'.codePointAt(0)); -//=> false -``` -*/ -export default function isFullwidthCodePoint(codePoint: number): boolean; diff --git a/node_modules/is-fullwidth-code-point/index.js b/node_modules/is-fullwidth-code-point/index.js deleted file mode 100644 index 671f97f..0000000 --- a/node_modules/is-fullwidth-code-point/index.js +++ /dev/null @@ -1,50 +0,0 @@ -/* eslint-disable yoda */ -'use strict'; - -const isFullwidthCodePoint = codePoint => { - if (Number.isNaN(codePoint)) { - return false; - } - - // Code points are derived from: - // http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt - if ( - codePoint >= 0x1100 && ( - codePoint <= 0x115F || // Hangul Jamo - codePoint === 0x2329 || // LEFT-POINTING ANGLE BRACKET - codePoint === 0x232A || // RIGHT-POINTING ANGLE BRACKET - // CJK Radicals Supplement .. Enclosed CJK Letters and Months - (0x2E80 <= codePoint && codePoint <= 0x3247 && codePoint !== 0x303F) || - // Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A - (0x3250 <= codePoint && codePoint <= 0x4DBF) || - // CJK Unified Ideographs .. Yi Radicals - (0x4E00 <= codePoint && codePoint <= 0xA4C6) || - // Hangul Jamo Extended-A - (0xA960 <= codePoint && codePoint <= 0xA97C) || - // Hangul Syllables - (0xAC00 <= codePoint && codePoint <= 0xD7A3) || - // CJK Compatibility Ideographs - (0xF900 <= codePoint && codePoint <= 0xFAFF) || - // Vertical Forms - (0xFE10 <= codePoint && codePoint <= 0xFE19) || - // CJK Compatibility Forms .. Small Form Variants - (0xFE30 <= codePoint && codePoint <= 0xFE6B) || - // Halfwidth and Fullwidth Forms - (0xFF01 <= codePoint && codePoint <= 0xFF60) || - (0xFFE0 <= codePoint && codePoint <= 0xFFE6) || - // Kana Supplement - (0x1B000 <= codePoint && codePoint <= 0x1B001) || - // Enclosed Ideographic Supplement - (0x1F200 <= codePoint && codePoint <= 0x1F251) || - // CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane - (0x20000 <= codePoint && codePoint <= 0x3FFFD) - ) - ) { - return true; - } - - return false; -}; - -module.exports = isFullwidthCodePoint; -module.exports.default = isFullwidthCodePoint; diff --git a/node_modules/is-fullwidth-code-point/license b/node_modules/is-fullwidth-code-point/license deleted file mode 100644 index e7af2f7..0000000 --- a/node_modules/is-fullwidth-code-point/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/is-fullwidth-code-point/package.json b/node_modules/is-fullwidth-code-point/package.json deleted file mode 100644 index 2137e88..0000000 --- a/node_modules/is-fullwidth-code-point/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "is-fullwidth-code-point", - "version": "3.0.0", - "description": "Check if the character represented by a given Unicode code point is fullwidth", - "license": "MIT", - "repository": "sindresorhus/is-fullwidth-code-point", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=8" - }, - "scripts": { - "test": "xo && ava && tsd-check" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "fullwidth", - "full-width", - "full", - "width", - "unicode", - "character", - "string", - "codepoint", - "code", - "point", - "is", - "detect", - "check" - ], - "devDependencies": { - "ava": "^1.3.1", - "tsd-check": "^0.5.0", - "xo": "^0.24.0" - } -} diff --git a/node_modules/is-fullwidth-code-point/readme.md b/node_modules/is-fullwidth-code-point/readme.md deleted file mode 100644 index 4236bba..0000000 --- a/node_modules/is-fullwidth-code-point/readme.md +++ /dev/null @@ -1,39 +0,0 @@ -# is-fullwidth-code-point [![Build Status](https://travis-ci.org/sindresorhus/is-fullwidth-code-point.svg?branch=master)](https://travis-ci.org/sindresorhus/is-fullwidth-code-point) - -> Check if the character represented by a given [Unicode code point](https://en.wikipedia.org/wiki/Code_point) is [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms) - - -## Install - -``` -$ npm install is-fullwidth-code-point -``` - - -## Usage - -```js -const isFullwidthCodePoint = require('is-fullwidth-code-point'); - -isFullwidthCodePoint('谢'.codePointAt(0)); -//=> true - -isFullwidthCodePoint('a'.codePointAt(0)); -//=> false -``` - - -## API - -### isFullwidthCodePoint(codePoint) - -#### codePoint - -Type: `number` - -The [code point](https://en.wikipedia.org/wiki/Code_point) of a character. - - -## License - -MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/is-glob/LICENSE b/node_modules/is-glob/LICENSE deleted file mode 100644 index 3f2eca1..0000000 --- a/node_modules/is-glob/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014-2017, Jon Schlinkert. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/node_modules/is-glob/README.md b/node_modules/is-glob/README.md deleted file mode 100644 index 740724b..0000000 --- a/node_modules/is-glob/README.md +++ /dev/null @@ -1,206 +0,0 @@ -# is-glob [![NPM version](https://img.shields.io/npm/v/is-glob.svg?style=flat)](https://www.npmjs.com/package/is-glob) [![NPM monthly downloads](https://img.shields.io/npm/dm/is-glob.svg?style=flat)](https://npmjs.org/package/is-glob) [![NPM total downloads](https://img.shields.io/npm/dt/is-glob.svg?style=flat)](https://npmjs.org/package/is-glob) [![Build Status](https://img.shields.io/github/workflow/status/micromatch/is-glob/dev)](https://github.com/micromatch/is-glob/actions) - -> Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a better user experience. - -Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. - -## Install - -Install with [npm](https://www.npmjs.com/): - -```sh -$ npm install --save is-glob -``` - -You might also be interested in [is-valid-glob](https://github.com/jonschlinkert/is-valid-glob) and [has-glob](https://github.com/jonschlinkert/has-glob). - -## Usage - -```js -var isGlob = require('is-glob'); -``` - -### Default behavior - -**True** - -Patterns that have glob characters or regex patterns will return `true`: - -```js -isGlob('!foo.js'); -isGlob('*.js'); -isGlob('**/abc.js'); -isGlob('abc/*.js'); -isGlob('abc/(aaa|bbb).js'); -isGlob('abc/[a-z].js'); -isGlob('abc/{a,b}.js'); -//=> true -``` - -Extglobs - -```js -isGlob('abc/@(a).js'); -isGlob('abc/!(a).js'); -isGlob('abc/+(a).js'); -isGlob('abc/*(a).js'); -isGlob('abc/?(a).js'); -//=> true -``` - -**False** - -Escaped globs or extglobs return `false`: - -```js -isGlob('abc/\\@(a).js'); -isGlob('abc/\\!(a).js'); -isGlob('abc/\\+(a).js'); -isGlob('abc/\\*(a).js'); -isGlob('abc/\\?(a).js'); -isGlob('\\!foo.js'); -isGlob('\\*.js'); -isGlob('\\*\\*/abc.js'); -isGlob('abc/\\*.js'); -isGlob('abc/\\(aaa|bbb).js'); -isGlob('abc/\\[a-z].js'); -isGlob('abc/\\{a,b}.js'); -//=> false -``` - -Patterns that do not have glob patterns return `false`: - -```js -isGlob('abc.js'); -isGlob('abc/def/ghi.js'); -isGlob('foo.js'); -isGlob('abc/@.js'); -isGlob('abc/+.js'); -isGlob('abc/?.js'); -isGlob(); -isGlob(null); -//=> false -``` - -Arrays are also `false` (If you want to check if an array has a glob pattern, use [has-glob](https://github.com/jonschlinkert/has-glob)): - -```js -isGlob(['**/*.js']); -isGlob(['foo.js']); -//=> false -``` - -### Option strict - -When `options.strict === false` the behavior is less strict in determining if a pattern is a glob. Meaning that -some patterns that would return `false` may return `true`. This is done so that matching libraries like [micromatch](https://github.com/micromatch/micromatch) have a chance at determining if the pattern is a glob or not. - -**True** - -Patterns that have glob characters or regex patterns will return `true`: - -```js -isGlob('!foo.js', {strict: false}); -isGlob('*.js', {strict: false}); -isGlob('**/abc.js', {strict: false}); -isGlob('abc/*.js', {strict: false}); -isGlob('abc/(aaa|bbb).js', {strict: false}); -isGlob('abc/[a-z].js', {strict: false}); -isGlob('abc/{a,b}.js', {strict: false}); -//=> true -``` - -Extglobs - -```js -isGlob('abc/@(a).js', {strict: false}); -isGlob('abc/!(a).js', {strict: false}); -isGlob('abc/+(a).js', {strict: false}); -isGlob('abc/*(a).js', {strict: false}); -isGlob('abc/?(a).js', {strict: false}); -//=> true -``` - -**False** - -Escaped globs or extglobs return `false`: - -```js -isGlob('\\!foo.js', {strict: false}); -isGlob('\\*.js', {strict: false}); -isGlob('\\*\\*/abc.js', {strict: false}); -isGlob('abc/\\*.js', {strict: false}); -isGlob('abc/\\(aaa|bbb).js', {strict: false}); -isGlob('abc/\\[a-z].js', {strict: false}); -isGlob('abc/\\{a,b}.js', {strict: false}); -//=> false -``` - -## About - -
    -Contributing - -Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). - -
    - -
    -Running Tests - -Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: - -```sh -$ npm install && npm test -``` - -
    - -
    -Building docs - -_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ - -To generate the readme, run the following command: - -```sh -$ npm install -g verbose/verb#dev verb-generate-readme && verb -``` - -
    - -### Related projects - -You might also be interested in these projects: - -* [assemble](https://www.npmjs.com/package/assemble): Get the rocks out of your socks! Assemble makes you fast at creating web projects… [more](https://github.com/assemble/assemble) | [homepage](https://github.com/assemble/assemble "Get the rocks out of your socks! Assemble makes you fast at creating web projects. Assemble is used by thousands of projects for rapid prototyping, creating themes, scaffolds, boilerplates, e-books, UI components, API documentation, blogs, building websit") -* [base](https://www.npmjs.com/package/base): Framework for rapidly creating high quality, server-side node.js applications, using plugins like building blocks | [homepage](https://github.com/node-base/base "Framework for rapidly creating high quality, server-side node.js applications, using plugins like building blocks") -* [update](https://www.npmjs.com/package/update): Be scalable! Update is a new, open source developer framework and CLI for automating updates… [more](https://github.com/update/update) | [homepage](https://github.com/update/update "Be scalable! Update is a new, open source developer framework and CLI for automating updates of any kind in code projects.") -* [verb](https://www.npmjs.com/package/verb): Documentation generator for GitHub projects. Verb is extremely powerful, easy to use, and is used… [more](https://github.com/verbose/verb) | [homepage](https://github.com/verbose/verb "Documentation generator for GitHub projects. Verb is extremely powerful, easy to use, and is used on hundreds of projects of all sizes to generate everything from API docs to readmes.") - -### Contributors - -| **Commits** | **Contributor** | -| --- | --- | -| 47 | [jonschlinkert](https://github.com/jonschlinkert) | -| 5 | [doowb](https://github.com/doowb) | -| 1 | [phated](https://github.com/phated) | -| 1 | [danhper](https://github.com/danhper) | -| 1 | [paulmillr](https://github.com/paulmillr) | - -### Author - -**Jon Schlinkert** - -* [GitHub Profile](https://github.com/jonschlinkert) -* [Twitter Profile](https://twitter.com/jonschlinkert) -* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) - -### License - -Copyright © 2019, [Jon Schlinkert](https://github.com/jonschlinkert). -Released under the [MIT License](LICENSE). - -*** - -_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on March 27, 2019._ \ No newline at end of file diff --git a/node_modules/is-glob/index.js b/node_modules/is-glob/index.js deleted file mode 100644 index 620f563..0000000 --- a/node_modules/is-glob/index.js +++ /dev/null @@ -1,150 +0,0 @@ -/*! - * is-glob - * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Released under the MIT License. - */ - -var isExtglob = require('is-extglob'); -var chars = { '{': '}', '(': ')', '[': ']'}; -var strictCheck = function(str) { - if (str[0] === '!') { - return true; - } - var index = 0; - var pipeIndex = -2; - var closeSquareIndex = -2; - var closeCurlyIndex = -2; - var closeParenIndex = -2; - var backSlashIndex = -2; - while (index < str.length) { - if (str[index] === '*') { - return true; - } - - if (str[index + 1] === '?' && /[\].+)]/.test(str[index])) { - return true; - } - - if (closeSquareIndex !== -1 && str[index] === '[' && str[index + 1] !== ']') { - if (closeSquareIndex < index) { - closeSquareIndex = str.indexOf(']', index); - } - if (closeSquareIndex > index) { - if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) { - return true; - } - backSlashIndex = str.indexOf('\\', index); - if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) { - return true; - } - } - } - - if (closeCurlyIndex !== -1 && str[index] === '{' && str[index + 1] !== '}') { - closeCurlyIndex = str.indexOf('}', index); - if (closeCurlyIndex > index) { - backSlashIndex = str.indexOf('\\', index); - if (backSlashIndex === -1 || backSlashIndex > closeCurlyIndex) { - return true; - } - } - } - - if (closeParenIndex !== -1 && str[index] === '(' && str[index + 1] === '?' && /[:!=]/.test(str[index + 2]) && str[index + 3] !== ')') { - closeParenIndex = str.indexOf(')', index); - if (closeParenIndex > index) { - backSlashIndex = str.indexOf('\\', index); - if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) { - return true; - } - } - } - - if (pipeIndex !== -1 && str[index] === '(' && str[index + 1] !== '|') { - if (pipeIndex < index) { - pipeIndex = str.indexOf('|', index); - } - if (pipeIndex !== -1 && str[pipeIndex + 1] !== ')') { - closeParenIndex = str.indexOf(')', pipeIndex); - if (closeParenIndex > pipeIndex) { - backSlashIndex = str.indexOf('\\', pipeIndex); - if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) { - return true; - } - } - } - } - - if (str[index] === '\\') { - var open = str[index + 1]; - index += 2; - var close = chars[open]; - - if (close) { - var n = str.indexOf(close, index); - if (n !== -1) { - index = n + 1; - } - } - - if (str[index] === '!') { - return true; - } - } else { - index++; - } - } - return false; -}; - -var relaxedCheck = function(str) { - if (str[0] === '!') { - return true; - } - var index = 0; - while (index < str.length) { - if (/[*?{}()[\]]/.test(str[index])) { - return true; - } - - if (str[index] === '\\') { - var open = str[index + 1]; - index += 2; - var close = chars[open]; - - if (close) { - var n = str.indexOf(close, index); - if (n !== -1) { - index = n + 1; - } - } - - if (str[index] === '!') { - return true; - } - } else { - index++; - } - } - return false; -}; - -module.exports = function isGlob(str, options) { - if (typeof str !== 'string' || str === '') { - return false; - } - - if (isExtglob(str)) { - return true; - } - - var check = strictCheck; - - // optionally relax check - if (options && options.strict === false) { - check = relaxedCheck; - } - - return check(str); -}; diff --git a/node_modules/is-glob/package.json b/node_modules/is-glob/package.json deleted file mode 100644 index 858af03..0000000 --- a/node_modules/is-glob/package.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "name": "is-glob", - "description": "Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a better user experience.", - "version": "4.0.3", - "homepage": "https://github.com/micromatch/is-glob", - "author": "Jon Schlinkert (https://github.com/jonschlinkert)", - "contributors": [ - "Brian Woodward (https://twitter.com/doowb)", - "Daniel Perez (https://tuvistavie.com)", - "Jon Schlinkert (http://twitter.com/jonschlinkert)" - ], - "repository": "micromatch/is-glob", - "bugs": { - "url": "https://github.com/micromatch/is-glob/issues" - }, - "license": "MIT", - "files": [ - "index.js" - ], - "main": "index.js", - "engines": { - "node": ">=0.10.0" - }, - "scripts": { - "test": "mocha && node benchmark.js" - }, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "devDependencies": { - "gulp-format-md": "^0.1.10", - "mocha": "^3.0.2" - }, - "keywords": [ - "bash", - "braces", - "check", - "exec", - "expression", - "extglob", - "glob", - "globbing", - "globstar", - "is", - "match", - "matches", - "pattern", - "regex", - "regular", - "string", - "test" - ], - "verb": { - "layout": "default", - "plugins": [ - "gulp-format-md" - ], - "related": { - "list": [ - "assemble", - "base", - "update", - "verb" - ] - }, - "reflinks": [ - "assemble", - "bach", - "base", - "composer", - "gulp", - "has-glob", - "is-valid-glob", - "micromatch", - "npm", - "scaffold", - "verb", - "vinyl" - ] - } -} diff --git a/node_modules/is-number/LICENSE b/node_modules/is-number/LICENSE deleted file mode 100644 index 9af4a67..0000000 --- a/node_modules/is-number/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014-present, Jon Schlinkert. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/node_modules/is-number/README.md b/node_modules/is-number/README.md deleted file mode 100644 index eb8149e..0000000 --- a/node_modules/is-number/README.md +++ /dev/null @@ -1,187 +0,0 @@ -# is-number [![NPM version](https://img.shields.io/npm/v/is-number.svg?style=flat)](https://www.npmjs.com/package/is-number) [![NPM monthly downloads](https://img.shields.io/npm/dm/is-number.svg?style=flat)](https://npmjs.org/package/is-number) [![NPM total downloads](https://img.shields.io/npm/dt/is-number.svg?style=flat)](https://npmjs.org/package/is-number) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/is-number.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/is-number) - -> Returns true if the value is a finite number. - -Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. - -## Install - -Install with [npm](https://www.npmjs.com/): - -```sh -$ npm install --save is-number -``` - -## Why is this needed? - -In JavaScript, it's not always as straightforward as it should be to reliably check if a value is a number. It's common for devs to use `+`, `-`, or `Number()` to cast a string value to a number (for example, when values are returned from user input, regex matches, parsers, etc). But there are many non-intuitive edge cases that yield unexpected results: - -```js -console.log(+[]); //=> 0 -console.log(+''); //=> 0 -console.log(+' '); //=> 0 -console.log(typeof NaN); //=> 'number' -``` - -This library offers a performant way to smooth out edge cases like these. - -## Usage - -```js -const isNumber = require('is-number'); -``` - -See the [tests](./test.js) for more examples. - -### true - -```js -isNumber(5e3); // true -isNumber(0xff); // true -isNumber(-1.1); // true -isNumber(0); // true -isNumber(1); // true -isNumber(1.1); // true -isNumber(10); // true -isNumber(10.10); // true -isNumber(100); // true -isNumber('-1.1'); // true -isNumber('0'); // true -isNumber('012'); // true -isNumber('0xff'); // true -isNumber('1'); // true -isNumber('1.1'); // true -isNumber('10'); // true -isNumber('10.10'); // true -isNumber('100'); // true -isNumber('5e3'); // true -isNumber(parseInt('012')); // true -isNumber(parseFloat('012')); // true -``` - -### False - -Everything else is false, as you would expect: - -```js -isNumber(Infinity); // false -isNumber(NaN); // false -isNumber(null); // false -isNumber(undefined); // false -isNumber(''); // false -isNumber(' '); // false -isNumber('foo'); // false -isNumber([1]); // false -isNumber([]); // false -isNumber(function () {}); // false -isNumber({}); // false -``` - -## Release history - -### 7.0.0 - -* Refactor. Now uses `.isFinite` if it exists. -* Performance is about the same as v6.0 when the value is a string or number. But it's now 3x-4x faster when the value is not a string or number. - -### 6.0.0 - -* Optimizations, thanks to @benaadams. - -### 5.0.0 - -**Breaking changes** - -* removed support for `instanceof Number` and `instanceof String` - -## Benchmarks - -As with all benchmarks, take these with a grain of salt. See the [benchmarks](./benchmark/index.js) for more detail. - -``` -# all -v7.0 x 413,222 ops/sec ±2.02% (86 runs sampled) -v6.0 x 111,061 ops/sec ±1.29% (85 runs sampled) -parseFloat x 317,596 ops/sec ±1.36% (86 runs sampled) -fastest is 'v7.0' - -# string -v7.0 x 3,054,496 ops/sec ±1.05% (89 runs sampled) -v6.0 x 2,957,781 ops/sec ±0.98% (88 runs sampled) -parseFloat x 3,071,060 ops/sec ±1.13% (88 runs sampled) -fastest is 'parseFloat,v7.0' - -# number -v7.0 x 3,146,895 ops/sec ±0.89% (89 runs sampled) -v6.0 x 3,214,038 ops/sec ±1.07% (89 runs sampled) -parseFloat x 3,077,588 ops/sec ±1.07% (87 runs sampled) -fastest is 'v6.0' -``` - -## About - -
    -Contributing - -Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). - -
    - -
    -Running Tests - -Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: - -```sh -$ npm install && npm test -``` - -
    - -
    -Building docs - -_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ - -To generate the readme, run the following command: - -```sh -$ npm install -g verbose/verb#dev verb-generate-readme && verb -``` - -
    - -### Related projects - -You might also be interested in these projects: - -* [is-plain-object](https://www.npmjs.com/package/is-plain-object): Returns true if an object was created by the `Object` constructor. | [homepage](https://github.com/jonschlinkert/is-plain-object "Returns true if an object was created by the `Object` constructor.") -* [is-primitive](https://www.npmjs.com/package/is-primitive): Returns `true` if the value is a primitive. | [homepage](https://github.com/jonschlinkert/is-primitive "Returns `true` if the value is a primitive. ") -* [isobject](https://www.npmjs.com/package/isobject): Returns true if the value is an object and not an array or null. | [homepage](https://github.com/jonschlinkert/isobject "Returns true if the value is an object and not an array or null.") -* [kind-of](https://www.npmjs.com/package/kind-of): Get the native type of a value. | [homepage](https://github.com/jonschlinkert/kind-of "Get the native type of a value.") - -### Contributors - -| **Commits** | **Contributor** | -| --- | --- | -| 49 | [jonschlinkert](https://github.com/jonschlinkert) | -| 5 | [charlike-old](https://github.com/charlike-old) | -| 1 | [benaadams](https://github.com/benaadams) | -| 1 | [realityking](https://github.com/realityking) | - -### Author - -**Jon Schlinkert** - -* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) -* [GitHub Profile](https://github.com/jonschlinkert) -* [Twitter Profile](https://twitter.com/jonschlinkert) - -### License - -Copyright © 2018, [Jon Schlinkert](https://github.com/jonschlinkert). -Released under the [MIT License](LICENSE). - -*** - -_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on June 15, 2018._ \ No newline at end of file diff --git a/node_modules/is-number/index.js b/node_modules/is-number/index.js deleted file mode 100644 index 27f19b7..0000000 --- a/node_modules/is-number/index.js +++ /dev/null @@ -1,18 +0,0 @@ -/*! - * is-number - * - * Copyright (c) 2014-present, Jon Schlinkert. - * Released under the MIT License. - */ - -'use strict'; - -module.exports = function(num) { - if (typeof num === 'number') { - return num - num === 0; - } - if (typeof num === 'string' && num.trim() !== '') { - return Number.isFinite ? Number.isFinite(+num) : isFinite(+num); - } - return false; -}; diff --git a/node_modules/is-number/package.json b/node_modules/is-number/package.json deleted file mode 100644 index 3715072..0000000 --- a/node_modules/is-number/package.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "name": "is-number", - "description": "Returns true if a number or string value is a finite number. Useful for regex matches, parsing, user input, etc.", - "version": "7.0.0", - "homepage": "https://github.com/jonschlinkert/is-number", - "author": "Jon Schlinkert (https://github.com/jonschlinkert)", - "contributors": [ - "Jon Schlinkert (http://twitter.com/jonschlinkert)", - "Olsten Larck (https://i.am.charlike.online)", - "Rouven Weßling (www.rouvenwessling.de)" - ], - "repository": "jonschlinkert/is-number", - "bugs": { - "url": "https://github.com/jonschlinkert/is-number/issues" - }, - "license": "MIT", - "files": [ - "index.js" - ], - "main": "index.js", - "engines": { - "node": ">=0.12.0" - }, - "scripts": { - "test": "mocha" - }, - "devDependencies": { - "ansi": "^0.3.1", - "benchmark": "^2.1.4", - "gulp-format-md": "^1.0.0", - "mocha": "^3.5.3" - }, - "keywords": [ - "cast", - "check", - "coerce", - "coercion", - "finite", - "integer", - "is", - "isnan", - "is-nan", - "is-num", - "is-number", - "isnumber", - "isfinite", - "istype", - "kind", - "math", - "nan", - "num", - "number", - "numeric", - "parseFloat", - "parseInt", - "test", - "type", - "typeof", - "value" - ], - "verb": { - "toc": false, - "layout": "default", - "tasks": [ - "readme" - ], - "related": { - "list": [ - "is-plain-object", - "is-primitive", - "isobject", - "kind-of" - ] - }, - "plugins": [ - "gulp-format-md" - ], - "lint": { - "reflinks": true - } - } -} diff --git a/node_modules/isexe/.npmignore b/node_modules/isexe/.npmignore deleted file mode 100644 index c1cb757..0000000 --- a/node_modules/isexe/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -.nyc_output/ -coverage/ diff --git a/node_modules/isexe/LICENSE b/node_modules/isexe/LICENSE deleted file mode 100644 index 19129e3..0000000 --- a/node_modules/isexe/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/isexe/README.md b/node_modules/isexe/README.md deleted file mode 100644 index 35769e8..0000000 --- a/node_modules/isexe/README.md +++ /dev/null @@ -1,51 +0,0 @@ -# isexe - -Minimal module to check if a file is executable, and a normal file. - -Uses `fs.stat` and tests against the `PATHEXT` environment variable on -Windows. - -## USAGE - -```javascript -var isexe = require('isexe') -isexe('some-file-name', function (err, isExe) { - if (err) { - console.error('probably file does not exist or something', err) - } else if (isExe) { - console.error('this thing can be run') - } else { - console.error('cannot be run') - } -}) - -// same thing but synchronous, throws errors -var isExe = isexe.sync('some-file-name') - -// treat errors as just "not executable" -isexe('maybe-missing-file', { ignoreErrors: true }, callback) -var isExe = isexe.sync('maybe-missing-file', { ignoreErrors: true }) -``` - -## API - -### `isexe(path, [options], [callback])` - -Check if the path is executable. If no callback provided, and a -global `Promise` object is available, then a Promise will be returned. - -Will raise whatever errors may be raised by `fs.stat`, unless -`options.ignoreErrors` is set to true. - -### `isexe.sync(path, [options])` - -Same as `isexe` but returns the value and throws any errors raised. - -### Options - -* `ignoreErrors` Treat all errors as "no, this is not executable", but - don't raise them. -* `uid` Number to use as the user id -* `gid` Number to use as the group id -* `pathExt` List of path extensions to use instead of `PATHEXT` - environment variable on Windows. diff --git a/node_modules/isexe/index.js b/node_modules/isexe/index.js deleted file mode 100644 index 553fb32..0000000 --- a/node_modules/isexe/index.js +++ /dev/null @@ -1,57 +0,0 @@ -var fs = require('fs') -var core -if (process.platform === 'win32' || global.TESTING_WINDOWS) { - core = require('./windows.js') -} else { - core = require('./mode.js') -} - -module.exports = isexe -isexe.sync = sync - -function isexe (path, options, cb) { - if (typeof options === 'function') { - cb = options - options = {} - } - - if (!cb) { - if (typeof Promise !== 'function') { - throw new TypeError('callback not provided') - } - - return new Promise(function (resolve, reject) { - isexe(path, options || {}, function (er, is) { - if (er) { - reject(er) - } else { - resolve(is) - } - }) - }) - } - - core(path, options || {}, function (er, is) { - // ignore EACCES because that just means we aren't allowed to run it - if (er) { - if (er.code === 'EACCES' || options && options.ignoreErrors) { - er = null - is = false - } - } - cb(er, is) - }) -} - -function sync (path, options) { - // my kingdom for a filtered catch - try { - return core.sync(path, options || {}) - } catch (er) { - if (options && options.ignoreErrors || er.code === 'EACCES') { - return false - } else { - throw er - } - } -} diff --git a/node_modules/isexe/mode.js b/node_modules/isexe/mode.js deleted file mode 100644 index 1995ea4..0000000 --- a/node_modules/isexe/mode.js +++ /dev/null @@ -1,41 +0,0 @@ -module.exports = isexe -isexe.sync = sync - -var fs = require('fs') - -function isexe (path, options, cb) { - fs.stat(path, function (er, stat) { - cb(er, er ? false : checkStat(stat, options)) - }) -} - -function sync (path, options) { - return checkStat(fs.statSync(path), options) -} - -function checkStat (stat, options) { - return stat.isFile() && checkMode(stat, options) -} - -function checkMode (stat, options) { - var mod = stat.mode - var uid = stat.uid - var gid = stat.gid - - var myUid = options.uid !== undefined ? - options.uid : process.getuid && process.getuid() - var myGid = options.gid !== undefined ? - options.gid : process.getgid && process.getgid() - - var u = parseInt('100', 8) - var g = parseInt('010', 8) - var o = parseInt('001', 8) - var ug = u | g - - var ret = (mod & o) || - (mod & g) && gid === myGid || - (mod & u) && uid === myUid || - (mod & ug) && myUid === 0 - - return ret -} diff --git a/node_modules/isexe/package.json b/node_modules/isexe/package.json deleted file mode 100644 index e452689..0000000 --- a/node_modules/isexe/package.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "isexe", - "version": "2.0.0", - "description": "Minimal module to check if a file is executable.", - "main": "index.js", - "directories": { - "test": "test" - }, - "devDependencies": { - "mkdirp": "^0.5.1", - "rimraf": "^2.5.0", - "tap": "^10.3.0" - }, - "scripts": { - "test": "tap test/*.js --100", - "preversion": "npm test", - "postversion": "npm publish", - "postpublish": "git push origin --all; git push origin --tags" - }, - "author": "Isaac Z. Schlueter (http://blog.izs.me/)", - "license": "ISC", - "repository": { - "type": "git", - "url": "git+https://github.com/isaacs/isexe.git" - }, - "keywords": [], - "bugs": { - "url": "https://github.com/isaacs/isexe/issues" - }, - "homepage": "https://github.com/isaacs/isexe#readme" -} diff --git a/node_modules/isexe/test/basic.js b/node_modules/isexe/test/basic.js deleted file mode 100644 index d926df6..0000000 --- a/node_modules/isexe/test/basic.js +++ /dev/null @@ -1,221 +0,0 @@ -var t = require('tap') -var fs = require('fs') -var path = require('path') -var fixture = path.resolve(__dirname, 'fixtures') -var meow = fixture + '/meow.cat' -var mine = fixture + '/mine.cat' -var ours = fixture + '/ours.cat' -var fail = fixture + '/fail.false' -var noent = fixture + '/enoent.exe' -var mkdirp = require('mkdirp') -var rimraf = require('rimraf') - -var isWindows = process.platform === 'win32' -var hasAccess = typeof fs.access === 'function' -var winSkip = isWindows && 'windows' -var accessSkip = !hasAccess && 'no fs.access function' -var hasPromise = typeof Promise === 'function' -var promiseSkip = !hasPromise && 'no global Promise' - -function reset () { - delete require.cache[require.resolve('../')] - return require('../') -} - -t.test('setup fixtures', function (t) { - rimraf.sync(fixture) - mkdirp.sync(fixture) - fs.writeFileSync(meow, '#!/usr/bin/env cat\nmeow\n') - fs.chmodSync(meow, parseInt('0755', 8)) - fs.writeFileSync(fail, '#!/usr/bin/env false\n') - fs.chmodSync(fail, parseInt('0644', 8)) - fs.writeFileSync(mine, '#!/usr/bin/env cat\nmine\n') - fs.chmodSync(mine, parseInt('0744', 8)) - fs.writeFileSync(ours, '#!/usr/bin/env cat\nours\n') - fs.chmodSync(ours, parseInt('0754', 8)) - t.end() -}) - -t.test('promise', { skip: promiseSkip }, function (t) { - var isexe = reset() - t.test('meow async', function (t) { - isexe(meow).then(function (is) { - t.ok(is) - t.end() - }) - }) - t.test('fail async', function (t) { - isexe(fail).then(function (is) { - t.notOk(is) - t.end() - }) - }) - t.test('noent async', function (t) { - isexe(noent).catch(function (er) { - t.ok(er) - t.end() - }) - }) - t.test('noent ignore async', function (t) { - isexe(noent, { ignoreErrors: true }).then(function (is) { - t.notOk(is) - t.end() - }) - }) - t.end() -}) - -t.test('no promise', function (t) { - global.Promise = null - var isexe = reset() - t.throws('try to meow a promise', function () { - isexe(meow) - }) - t.end() -}) - -t.test('access', { skip: accessSkip || winSkip }, function (t) { - runTest(t) -}) - -t.test('mode', { skip: winSkip }, function (t) { - delete fs.access - delete fs.accessSync - var isexe = reset() - t.ok(isexe.sync(ours, { uid: 0, gid: 0 })) - t.ok(isexe.sync(mine, { uid: 0, gid: 0 })) - runTest(t) -}) - -t.test('windows', function (t) { - global.TESTING_WINDOWS = true - var pathExt = '.EXE;.CAT;.CMD;.COM' - t.test('pathExt option', function (t) { - runTest(t, { pathExt: '.EXE;.CAT;.CMD;.COM' }) - }) - t.test('pathExt env', function (t) { - process.env.PATHEXT = pathExt - runTest(t) - }) - t.test('no pathExt', function (t) { - // with a pathExt of '', any filename is fine. - // so the "fail" one would still pass. - runTest(t, { pathExt: '', skipFail: true }) - }) - t.test('pathext with empty entry', function (t) { - // with a pathExt of '', any filename is fine. - // so the "fail" one would still pass. - runTest(t, { pathExt: ';' + pathExt, skipFail: true }) - }) - t.end() -}) - -t.test('cleanup', function (t) { - rimraf.sync(fixture) - t.end() -}) - -function runTest (t, options) { - var isexe = reset() - - var optionsIgnore = Object.create(options || {}) - optionsIgnore.ignoreErrors = true - - if (!options || !options.skipFail) { - t.notOk(isexe.sync(fail, options)) - } - t.notOk(isexe.sync(noent, optionsIgnore)) - if (!options) { - t.ok(isexe.sync(meow)) - } else { - t.ok(isexe.sync(meow, options)) - } - - t.ok(isexe.sync(mine, options)) - t.ok(isexe.sync(ours, options)) - t.throws(function () { - isexe.sync(noent, options) - }) - - t.test('meow async', function (t) { - if (!options) { - isexe(meow, function (er, is) { - if (er) { - throw er - } - t.ok(is) - t.end() - }) - } else { - isexe(meow, options, function (er, is) { - if (er) { - throw er - } - t.ok(is) - t.end() - }) - } - }) - - t.test('mine async', function (t) { - isexe(mine, options, function (er, is) { - if (er) { - throw er - } - t.ok(is) - t.end() - }) - }) - - t.test('ours async', function (t) { - isexe(ours, options, function (er, is) { - if (er) { - throw er - } - t.ok(is) - t.end() - }) - }) - - if (!options || !options.skipFail) { - t.test('fail async', function (t) { - isexe(fail, options, function (er, is) { - if (er) { - throw er - } - t.notOk(is) - t.end() - }) - }) - } - - t.test('noent async', function (t) { - isexe(noent, options, function (er, is) { - t.ok(er) - t.notOk(is) - t.end() - }) - }) - - t.test('noent ignore async', function (t) { - isexe(noent, optionsIgnore, function (er, is) { - if (er) { - throw er - } - t.notOk(is) - t.end() - }) - }) - - t.test('directory is not executable', function (t) { - isexe(__dirname, options, function (er, is) { - if (er) { - throw er - } - t.notOk(is) - t.end() - }) - }) - - t.end() -} diff --git a/node_modules/isexe/windows.js b/node_modules/isexe/windows.js deleted file mode 100644 index 3499673..0000000 --- a/node_modules/isexe/windows.js +++ /dev/null @@ -1,42 +0,0 @@ -module.exports = isexe -isexe.sync = sync - -var fs = require('fs') - -function checkPathExt (path, options) { - var pathext = options.pathExt !== undefined ? - options.pathExt : process.env.PATHEXT - - if (!pathext) { - return true - } - - pathext = pathext.split(';') - if (pathext.indexOf('') !== -1) { - return true - } - for (var i = 0; i < pathext.length; i++) { - var p = pathext[i].toLowerCase() - if (p && path.substr(-p.length).toLowerCase() === p) { - return true - } - } - return false -} - -function checkStat (stat, path, options) { - if (!stat.isSymbolicLink() && !stat.isFile()) { - return false - } - return checkPathExt(path, options) -} - -function isexe (path, options, cb) { - fs.stat(path, function (er, stat) { - cb(er, er ? false : checkStat(stat, path, options)) - }) -} - -function sync (path, options) { - return checkStat(fs.statSync(path), path, options) -} diff --git a/node_modules/jackspeak/LICENSE.md b/node_modules/jackspeak/LICENSE.md deleted file mode 100644 index 8cb5cc6..0000000 --- a/node_modules/jackspeak/LICENSE.md +++ /dev/null @@ -1,55 +0,0 @@ -# Blue Oak Model License - -Version 1.0.0 - -## Purpose - -This license gives everyone as much permission to work with -this software as possible, while protecting contributors -from liability. - -## Acceptance - -In order to receive this license, you must agree to its -rules. The rules of this license are both obligations -under that agreement and conditions to your license. -You must not do anything with this software that triggers -a rule that you cannot or will not follow. - -## Copyright - -Each contributor licenses you to do everything with this -software that would otherwise infringe that contributor's -copyright in it. - -## Notices - -You must ensure that everyone who gets a copy of -any part of this software from you, with or without -changes, also gets the text of this license or a link to -. - -## Excuse - -If anyone notifies you in writing that you have not -complied with [Notices](#notices), you can keep your -license by taking all practical steps to comply within 30 -days after the notice. If you do not do so, your license -ends immediately. - -## Patent - -Each contributor licenses you to do everything with this -software that would otherwise infringe any patent claims -they can license or become able to license. - -## Reliability - -No contributor can revoke this license. - -## No Liability - -**_As far as the law allows, this software comes as is, -without any warranty or condition, and no contributor -will be liable to anyone for any damages related to this -software or this license, under any kind of legal claim._** diff --git a/node_modules/jackspeak/README.md b/node_modules/jackspeak/README.md deleted file mode 100644 index 4ffea4b..0000000 --- a/node_modules/jackspeak/README.md +++ /dev/null @@ -1,357 +0,0 @@ -# jackspeak - -A very strict and proper argument parser. - -Validate string, boolean, and number options, from the command -line and the environment. - -Call the `jack` method with a config object, and then chain -methods off of it. - -At the end, call the `.parse()` method, and you'll get an object -with `positionals` and `values` members. - -Any unrecognized configs or invalid values will throw an error. - -As long as you define configs using object literals, types will -be properly inferred and TypeScript will know what kinds of -things you got. - -If you give it a prefix for environment variables, then defaults -will be read from the environment, and parsed values written back -to it, so you can easily pass configs through to child processes. - -Automatically generates a `usage`/`help` banner by calling the -`.usage()` method. - -Unless otherwise noted, all methods return the object itself. - -## USAGE - -```js -import { jack } from 'jackspeak' -// this works too: -// const { jack } = require('jackspeak') - -const { positionals, values } = jack({ envPrefix: 'FOO' }) - .flag({ - asdf: { description: 'sets the asfd flag', short: 'a', default: true }, - 'no-asdf': { description: 'unsets the asdf flag', short: 'A' }, - foo: { description: 'another boolean', short: 'f' }, - }) - .optList({ - 'ip-addrs': { - description: 'addresses to ip things', - delim: ',', // defaults to '\n' - default: ['127.0.0.1'], - }, - }) - .parse([ - 'some', - 'positional', - '--ip-addrs', - '192.168.0.1', - '--ip-addrs', - '1.1.1.1', - 'args', - '--foo', // sets the foo flag - '-A', // short for --no-asdf, sets asdf flag to false - ]) - -console.log(process.env.FOO_ASDF) // '0' -console.log(process.env.FOO_FOO) // '1' -console.log(values) // { -// 'ip-addrs': ['192.168.0.1', '1.1.1.1'], -// foo: true, -// asdf: false, -// } -console.log(process.env.FOO_IP_ADDRS) // '192.168.0.1,1.1.1.1' -console.log(positionals) // ['some', 'positional', 'args'] -``` - -## `jack(options: JackOptions = {}) => Jack` - -Returns a `Jack` object that can be used to chain and add -field definitions. The other methods (apart from `validate()`, -`parse()`, and `usage()` obviously) return the same Jack object, -updated with the new types, so they can be chained together as -shown in the code examples. - -Options: - -- `allowPositionals` Defaults to true. Set to `false` to not - allow any positional arguments. - -- `envPrefix` Set to a string to write configs to and read - configs from the environment. For example, if set to `MY_APP` - then the `foo-bar` config will default based on the value of - `env.MY_APP_FOO_BAR` and will write back to that when parsed. - - Boolean values are written as `'1'` and `'0'`, and will be - treated as `true` if they're `'1'` or false otherwise. - - Number values are written with their `toString()` - representation. - - Strings are just strings. - - Any value with `multiple: true` will be represented in the - environment split by a delimiter, which defaults to `\n`. - -- `env` The place to read/write environment variables. Defaults - to `process.env`. - -- `usage` A short usage string to print at the top of the help - banner. - -- `stopAtPositional` Boolean, default false. Stop parsing opts - and flags at the first positional argument. This is useful if - you want to pass certain options to subcommands, like some - programs do, so you can stop parsing and pass the positionals - to the subcommand to parse. - -- `stopAtPositionalTest` Conditional `stopAtPositional`. Provide - a function that takes a positional argument string and returns - boolean. If it returns `true`, then parsing will stop. Useful - when _some_ subcommands should parse the rest of the command - line options, and others should not. - -### `Jack.heading(text: string, level?: 1 | 2 | 3 | 4 | 5 | 6)` - -Define a short string heading, used in the `usage()` output. - -Indentation of the heading and subsequent description/config -usage entries (up until the next heading) is set by the heading -level. - -If the first usage item defined is a heading, it is always -treated as level 1, regardless of the argument provided. - -Headings level 1 and 2 will have a line of padding underneath -them. Headings level 3 through 6 will not. - -### `Jack.description(text: string, { pre?: boolean } = {})` - -Define a long string description, used in the `usage()` output. - -If the `pre` option is set to `true`, then whitespace will not be -normalized. However, if any line is too long for the width -allotted, it will still be wrapped. - -## Option Definitions - -Configs are defined by calling the appropriate field definition -method with an object where the keys are the long option name, -and the value defines the config. - -Options: - -- `type` Only needed for the `addFields` method, as the others - set it implicitly. Can be `'string'`, `'boolean'`, or - `'number'`. -- `multiple` Only needed for the `addFields` method, as the - others set it implicitly. Set to `true` to define an array - type. This means that it can be set on the CLI multiple times, - set as an array in the `values` - and it is represented in the environment as a delimited string. -- `short` A one-character shorthand for the option. -- `description` Some words to describe what this option is and - why you'd set it. -- `hint` (Only relevant for non-boolean types) The thing to show - in the usage output, like `--option=` -- `validate` A function that returns false (or throws) if an - option value is invalid. -- `validOptions` An array of strings or numbers that define the - valid values that can be set. This is not allowed on `boolean` - (flag) options. May be used along with a `validate()` method. -- `default` A default value for the field. Note that this may be - overridden by an environment variable, if present. - -### `Jack.flag({ [option: string]: definition, ... })` - -Define one or more boolean fields. - -Boolean options may be set to `false` by using a -`--no-${optionName}` argument, which will be implicitly created -if it's not defined to be something else. - -If a boolean option named `no-${optionName}` with the same -`multiple` setting is in the configuration, then that will be -treated as a negating flag. - -### `Jack.flagList({ [option: string]: definition, ... })` - -Define one or more boolean array fields. - -### `Jack.num({ [option: string]: definition, ... })` - -Define one or more number fields. These will be set in the -environment as a stringified number, and included in the `values` -object as a number. - -### `Jack.numList({ [option: string]: definition, ... })` - -Define one or more number list fields. These will be set in the -environment as a delimited set of stringified numbers, and -included in the `values` as a number array. - -### `Jack.opt({ [option: string]: definition, ... })` - -Define one or more string option fields. - -### `Jack.optList({ [option: string]: definition, ... })` - -Define one or more string list fields. - -### `Jack.addFields({ [option: string]: definition, ... })` - -Define one or more fields of any type. Note that `type` and -`multiple` must be set explicitly on each definition when using -this method. - -## Actions - -Use these methods on a Jack object that's already had its config -fields defined. - -### `Jack.parse(args: string[] = process.argv): { positionals: string[], values: OptionsResults }` - -Parse the arguments list, write to the environment if `envPrefix` -is set, and returned the parsed values and remaining positional -arguments. - -### `Jack.validate(o: any): asserts o is OptionsResults` - -Throws an error if the object provided is not a valid result set, -for the configurations defined thusfar. - -### `Jack.usage(): string` - -Returns the compiled `usage` string, with all option descriptions -and heading/description text, wrapped to the appropriate width -for the terminal. - -### `Jack.setConfigValues(options: OptionsResults, src?: string)` - -Validate the `options` argument, and set the default value for -each field that appears in the options. - -Values provided will be overridden by environment variables or -command line arguments. - -### `Jack.usageMarkdown(): string` - -Returns the compiled `usage` string, with all option descriptions -and heading/description text, but as markdown instead of -formatted for a terminal, for generating HTML documentation for -your CLI. - -## Some Example Code - -Also see [the examples -folder](https://github.com/isaacs/jackspeak/tree/master/examples) - -```js -import { jack } from 'jackspeak' - -const j = jack({ - // Optional - // This will be auto-generated from the descriptions if not supplied - // top level usage line, printed by -h - // will be auto-generated if not specified - usage: 'foo [options] ', -}) - .heading('The best Foo that ever Fooed') - .description( - ` - Executes all the files and interprets their output as - TAP formatted test result data. - - To parse TAP data from stdin, specify "-" as a filename. - `, - ) - - // flags don't take a value, they're boolean on or off, and can be - // turned off by prefixing with `--no-` - // so this adds support for -b to mean --bail, or -B to mean --no-bail - .flag({ - flag: { - // specify a short value if you like. this must be a single char - short: 'f', - // description is optional as well. - description: `Make the flags wave`, - // default value for flags is 'false', unless you change it - default: true, - }, - 'no-flag': { - // you can can always negate a flag with `--no-flag` - // specifying a negate option will let you define a short - // single-char option for negation. - short: 'F', - description: `Do not wave the flags`, - }, - }) - - // Options that take a value are specified with `opt()` - .opt({ - reporter: { - short: 'R', - description: 'the style of report to display', - }, - }) - - // if you want a number, say so, and jackspeak will enforce it - .num({ - jobs: { - short: 'j', - description: 'how many jobs to run in parallel', - default: 1, - }, - }) - - // A list is an option that can be specified multiple times, - // to expand into an array of all the settings. Normal opts - // will just give you the last value specified. - .optList({ - 'node-arg': {}, - }) - - // a flagList is an array of booleans, so `-ddd` is [true, true, true] - // count the `true` values to treat it as a counter. - .flagList({ - debug: { short: 'd' }, - }) - - // opts take a value, and is set to the string in the results - // you can combine multiple short-form flags together, but - // an opt will end the combine chain, posix-style. So, - // -bofilename would be like --bail --output-file=filename - .opt({ - 'output-file': { - short: 'o', - // optional: make it -o in the help output insead of -o - hint: 'file', - description: `Send the raw output to the specified file.`, - }, - }) - -// now we can parse argv like this: -const { values, positionals } = j.parse(process.argv) - -// or decide to show the usage banner -console.log(j.usage()) - -// or validate an object config we got from somewhere else -try { - j.validate(someConfig) -} catch (er) { - console.error('someConfig is not valid!', er) -} -``` - -## Name - -The inspiration for this module is [yargs](http://npm.im/yargs), which -is pirate talk themed. Yargs has all the features, and is infinitely -flexible. "Jackspeak" is the slang of the royal navy. This module -does not have all the features. It is declarative and rigid by design. diff --git a/node_modules/jackspeak/dist/commonjs/index.d.ts b/node_modules/jackspeak/dist/commonjs/index.d.ts deleted file mode 100644 index d28bcc1..0000000 --- a/node_modules/jackspeak/dist/commonjs/index.d.ts +++ /dev/null @@ -1,315 +0,0 @@ -/// -export type ConfigType = 'number' | 'string' | 'boolean'; -/** - * Given a Jack object, get the typeof its ConfigSet - */ -export type Unwrap = J extends Jack ? C : never; -import { inspect, InspectOptions } from 'node:util'; -/** - * Defines the type of value that is valid, given a config definition's - * {@link ConfigType} and boolean multiple setting - */ -export type ValidValue = [ - T, - M -] extends ['number', true] ? number[] : [T, M] extends ['string', true] ? string[] : [T, M] extends ['boolean', true] ? boolean[] : [T, M] extends ['number', false] ? number : [T, M] extends ['string', false] ? string : [T, M] extends ['boolean', false] ? boolean : [T, M] extends ['string', boolean] ? string | string[] : [T, M] extends ['boolean', boolean] ? boolean | boolean[] : [T, M] extends ['number', boolean] ? number | number[] : [T, M] extends [ConfigType, false] ? string | number | boolean : [T, M] extends [ConfigType, true] ? string[] | number[] | boolean[] : string | number | boolean | string[] | number[] | boolean[]; -/** - * The meta information for a config option definition, when the - * type and multiple values can be inferred by the method being used - */ -export type ConfigOptionMeta = { - default?: undefined | (ValidValue & (O extends number[] | string[] ? M extends false ? O[number] : O[number][] : unknown)); - validOptions?: O; - description?: string; - validate?: ((v: unknown) => v is ValidValue) | ((v: unknown) => boolean); - short?: string | undefined; - type?: T; - hint?: T extends 'boolean' ? never : string; - delim?: M extends true ? string : never; -} & (M extends false ? { - multiple?: false | undefined; -} : M extends true ? { - multiple: true; -} : { - multiple?: boolean; -}); -/** - * A set of {@link ConfigOptionMeta} fields, referenced by their longOption - * string values. - */ -export type ConfigMetaSet = { - [longOption: string]: ConfigOptionMeta; -}; -/** - * Infer {@link ConfigSet} fields from a given {@link ConfigMetaSet} - */ -export type ConfigSetFromMetaSet> = { - [longOption in keyof S]: ConfigOptionBase; -}; -/** - * Fields that can be set on a {@link ConfigOptionBase} or - * {@link ConfigOptionMeta} based on whether or not the field is known to be - * multiple. - */ -export type MultiType = M extends true ? { - multiple: true; - delim?: string | undefined; -} : M extends false ? { - multiple?: false | undefined; - delim?: undefined; -} : { - multiple?: boolean | undefined; - delim?: string | undefined; -}; -/** - * A config field definition, in its full representation. - */ -export type ConfigOptionBase = { - type: T; - short?: string | undefined; - default?: ValidValue | undefined; - description?: string; - hint?: T extends 'boolean' ? undefined : string | undefined; - validate?: (v: unknown) => v is ValidValue; - validOptions?: T extends 'boolean' ? undefined : T extends 'string' ? readonly string[] : T extends 'number' ? readonly number[] : readonly number[] | readonly string[]; -} & MultiType; -export declare const isConfigType: (t: string) => t is ConfigType; -export declare const isConfigOption: (o: any, type: T, multi: M) => o is ConfigOptionBase; -/** - * A set of {@link ConfigOptionBase} objects, referenced by their longOption - * string values. - */ -export type ConfigSet = { - [longOption: string]: ConfigOptionBase; -}; -/** - * The 'values' field returned by {@link Jack#parse} - */ -export type OptionsResults = { - [k in keyof T]?: T[k]['validOptions'] extends (readonly string[] | readonly number[]) ? T[k] extends ConfigOptionBase<'string' | 'number', false> ? T[k]['validOptions'][number] : T[k] extends ConfigOptionBase<'string' | 'number', true> ? T[k]['validOptions'][number][] : never : T[k] extends ConfigOptionBase<'string', false> ? string : T[k] extends ConfigOptionBase<'string', true> ? string[] : T[k] extends ConfigOptionBase<'number', false> ? number : T[k] extends ConfigOptionBase<'number', true> ? number[] : T[k] extends ConfigOptionBase<'boolean', false> ? boolean : T[k] extends ConfigOptionBase<'boolean', true> ? boolean[] : never; -}; -/** - * The object retured by {@link Jack#parse} - */ -export type Parsed = { - values: OptionsResults; - positionals: string[]; -}; -/** - * A row used when generating the {@link Jack#usage} string - */ -export interface Row { - left?: string; - text: string; - skipLine?: boolean; - type?: string; -} -/** - * A heading for a section in the usage, created by the jack.heading() - * method. - * - * First heading is always level 1, subsequent headings default to 2. - * - * The level of the nearest heading level sets the indentation of the - * description that follows. - */ -export interface Heading extends Row { - type: 'heading'; - text: string; - left?: ''; - skipLine?: boolean; - level: number; - pre?: boolean; -} -/** - * An arbitrary blob of text describing some stuff, set by the - * jack.description() method. - * - * Indentation determined by level of the nearest header. - */ -export interface Description extends Row { - type: 'description'; - text: string; - left?: ''; - skipLine?: boolean; - pre?: boolean; -} -/** - * A heading or description row used when generating the {@link Jack#usage} - * string - */ -export type TextRow = Heading | Description; -/** - * Either a {@link TextRow} or a reference to a {@link ConfigOptionBase} - */ -export type UsageField = TextRow | { - type: 'config'; - name: string; - value: ConfigOptionBase; -}; -/** - * Options provided to the {@link Jack} constructor - */ -export interface JackOptions { - /** - * Whether to allow positional arguments - * - * @default true - */ - allowPositionals?: boolean; - /** - * Prefix to use when reading/writing the environment variables - * - * If not specified, environment behavior will not be available. - */ - envPrefix?: string; - /** - * Environment object to read/write. Defaults `process.env`. - * No effect if `envPrefix` is not set. - */ - env?: { - [k: string]: string | undefined; - }; - /** - * A short usage string. If not provided, will be generated from the - * options provided, but that can of course be rather verbose if - * there are a lot of options. - */ - usage?: string; - /** - * Stop parsing flags and opts at the first positional argument. - * This is to support cases like `cmd [flags] [options]`, where - * each subcommand may have different options. This effectively treats - * any positional as a `--` argument. Only relevant if `allowPositionals` - * is true. - * - * To do subcommands, set this option, look at the first positional, and - * parse the remaining positionals as appropriate. - * - * @default false - */ - stopAtPositional?: boolean; - /** - * Conditional `stopAtPositional`. If set to a `(string)=>boolean` function, - * will be called with each positional argument encountered. If the function - * returns true, then parsing will stop at that point. - */ - stopAtPositionalTest?: (arg: string) => boolean; -} -/** - * Class returned by the {@link jack} function and all configuration - * definition methods. This is what gets chained together. - */ -export declare class Jack { - #private; - constructor(options?: JackOptions); - /** - * Set the default value (which will still be overridden by env or cli) - * as if from a parsed config file. The optional `source` param, if - * provided, will be included in error messages if a value is invalid or - * unknown. - */ - setConfigValues(values: OptionsResults, source?: string): this; - /** - * Parse a string of arguments, and return the resulting - * `{ values, positionals }` object. - * - * If an {@link JackOptions#envPrefix} is set, then it will read default - * values from the environment, and write the resulting values back - * to the environment as well. - * - * Environment values always take precedence over any other value, except - * an explicit CLI setting. - */ - parse(args?: string[]): Parsed; - loadEnvDefaults(): void; - applyDefaults(p: Parsed): void; - /** - * Only parse the command line arguments passed in. - * Does not strip off the `node script.js` bits, so it must be just the - * arguments you wish to have parsed. - * Does not read from or write to the environment, or set defaults. - */ - parseRaw(args: string[]): Parsed; - /** - * Validate that any arbitrary object is a valid configuration `values` - * object. Useful when loading config files or other sources. - */ - validate(o: unknown): asserts o is Parsed['values']; - writeEnv(p: Parsed): void; - /** - * Add a heading to the usage output banner - */ - heading(text: string, level?: 1 | 2 | 3 | 4 | 5 | 6, { pre }?: { - pre?: boolean; - }): Jack; - /** - * Add a long-form description to the usage output at this position. - */ - description(text: string, { pre }?: { - pre?: boolean; - }): Jack; - /** - * Add one or more number fields. - */ - num>(fields: F): Jack>; - /** - * Add one or more multiple number fields. - */ - numList>(fields: F): Jack>; - /** - * Add one or more string option fields. - */ - opt>(fields: F): Jack>; - /** - * Add one or more multiple string option fields. - */ - optList>(fields: F): Jack>; - /** - * Add one or more flag fields. - */ - flag>(fields: F): Jack>; - /** - * Add one or more multiple flag fields. - */ - flagList>(fields: F): Jack>; - /** - * Generic field definition method. Similar to flag/flagList/number/etc, - * but you must specify the `type` (and optionally `multiple` and `delim`) - * fields on each one, or Jack won't know how to define them. - */ - addFields(fields: F): Jack; - /** - * Return the usage banner for the given configuration - */ - usage(): string; - /** - * Return the usage banner markdown for the given configuration - */ - usageMarkdown(): string; - /** - * Return the configuration options as a plain object - */ - toJSON(): { - [k: string]: { - hint?: string | undefined; - default?: string | number | boolean | string[] | number[] | boolean[] | undefined; - validOptions?: readonly number[] | readonly string[] | undefined; - validate?: ((v: unknown) => v is string | number | boolean | string[] | number[] | boolean[]) | undefined; - description?: string | undefined; - short?: string | undefined; - delim?: string | undefined; - multiple?: boolean | undefined; - type: ConfigType; - }; - }; - /** - * Custom printer for `util.inspect` - */ - [inspect.custom](_: number, options: InspectOptions): string; -} -/** - * Main entry point. Create and return a {@link Jack} object. - */ -export declare const jack: (options?: JackOptions) => Jack<{}>; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/jackspeak/dist/commonjs/index.d.ts.map b/node_modules/jackspeak/dist/commonjs/index.d.ts.map deleted file mode 100644 index faf9ddd..0000000 --- a/node_modules/jackspeak/dist/commonjs/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/jackspeak/dist/commonjs/index.js b/node_modules/jackspeak/dist/commonjs/index.js deleted file mode 100644 index f7fc9cb..0000000 --- a/node_modules/jackspeak/dist/commonjs/index.js +++ /dev/null @@ -1,1010 +0,0 @@ -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.jack = exports.Jack = exports.isConfigOption = exports.isConfigType = void 0; -const node_util_1 = require("node:util"); -const parse_args_js_1 = require("./parse-args.js"); -// it's a tiny API, just cast it inline, it's fine -//@ts-ignore -const cliui_1 = __importDefault(require("@isaacs/cliui")); -const node_path_1 = require("node:path"); -const width = Math.min((process && process.stdout && process.stdout.columns) || 80, 80); -// indentation spaces from heading level -const indent = (n) => (n - 1) * 2; -const toEnvKey = (pref, key) => { - return [pref, key.replace(/[^a-zA-Z0-9]+/g, ' ')] - .join(' ') - .trim() - .toUpperCase() - .replace(/ /g, '_'); -}; -const toEnvVal = (value, delim = '\n') => { - const str = typeof value === 'string' ? value - : typeof value === 'boolean' ? - value ? '1' - : '0' - : typeof value === 'number' ? String(value) - : Array.isArray(value) ? - value.map((v) => toEnvVal(v)).join(delim) - : /* c8 ignore start */ undefined; - if (typeof str !== 'string') { - throw new Error(`could not serialize value to environment: ${JSON.stringify(value)}`); - } - /* c8 ignore stop */ - return str; -}; -const fromEnvVal = (env, type, multiple, delim = '\n') => (multiple ? - env ? env.split(delim).map(v => fromEnvVal(v, type, false)) - : [] - : type === 'string' ? env - : type === 'boolean' ? env === '1' - : +env.trim()); -const isConfigType = (t) => typeof t === 'string' && - (t === 'string' || t === 'number' || t === 'boolean'); -exports.isConfigType = isConfigType; -const undefOrType = (v, t) => v === undefined || typeof v === t; -const undefOrTypeArray = (v, t) => v === undefined || (Array.isArray(v) && v.every(x => typeof x === t)); -const isValidOption = (v, vo) => Array.isArray(v) ? v.every(x => isValidOption(x, vo)) : vo.includes(v); -// print the value type, for error message reporting -const valueType = (v) => typeof v === 'string' ? 'string' - : typeof v === 'boolean' ? 'boolean' - : typeof v === 'number' ? 'number' - : Array.isArray(v) ? - joinTypes([...new Set(v.map(v => valueType(v)))]) + '[]' - : `${v.type}${v.multiple ? '[]' : ''}`; -const joinTypes = (types) => types.length === 1 && typeof types[0] === 'string' ? - types[0] - : `(${types.join('|')})`; -const isValidValue = (v, type, multi) => { - if (multi) { - if (!Array.isArray(v)) - return false; - return !v.some((v) => !isValidValue(v, type, false)); - } - if (Array.isArray(v)) - return false; - return typeof v === type; -}; -const isConfigOption = (o, type, multi) => !!o && - typeof o === 'object' && - (0, exports.isConfigType)(o.type) && - o.type === type && - undefOrType(o.short, 'string') && - undefOrType(o.description, 'string') && - undefOrType(o.hint, 'string') && - undefOrType(o.validate, 'function') && - (o.type === 'boolean' ? - o.validOptions === undefined - : undefOrTypeArray(o.validOptions, o.type)) && - (o.default === undefined || isValidValue(o.default, type, multi)) && - !!o.multiple === multi; -exports.isConfigOption = isConfigOption; -function num(o = {}) { - const { default: def, validate: val, validOptions, ...rest } = o; - if (def !== undefined && !isValidValue(def, 'number', false)) { - throw new TypeError('invalid default value', { - cause: { - found: def, - wanted: 'number', - }, - }); - } - if (!undefOrTypeArray(validOptions, 'number')) { - throw new TypeError('invalid validOptions', { - cause: { - found: validOptions, - wanted: 'number[]', - }, - }); - } - const validate = val ? - val - : undefined; - return { - ...rest, - default: def, - validate, - validOptions, - type: 'number', - multiple: false, - }; -} -function numList(o = {}) { - const { default: def, validate: val, validOptions, ...rest } = o; - if (def !== undefined && !isValidValue(def, 'number', true)) { - throw new TypeError('invalid default value', { - cause: { - found: def, - wanted: 'number[]', - }, - }); - } - if (!undefOrTypeArray(validOptions, 'number')) { - throw new TypeError('invalid validOptions', { - cause: { - found: validOptions, - wanted: 'number[]', - }, - }); - } - const validate = val ? - val - : undefined; - return { - ...rest, - default: def, - validate, - validOptions, - type: 'number', - multiple: true, - }; -} -function opt(o = {}) { - const { default: def, validate: val, validOptions, ...rest } = o; - if (def !== undefined && !isValidValue(def, 'string', false)) { - throw new TypeError('invalid default value', { - cause: { - found: def, - wanted: 'string', - }, - }); - } - if (!undefOrTypeArray(validOptions, 'string')) { - throw new TypeError('invalid validOptions', { - cause: { - found: validOptions, - wanted: 'string[]', - }, - }); - } - const validate = val ? - val - : undefined; - return { - ...rest, - default: def, - validate, - validOptions, - type: 'string', - multiple: false, - }; -} -function optList(o = {}) { - const { default: def, validate: val, validOptions, ...rest } = o; - if (def !== undefined && !isValidValue(def, 'string', true)) { - throw new TypeError('invalid default value', { - cause: { - found: def, - wanted: 'string[]', - }, - }); - } - if (!undefOrTypeArray(validOptions, 'string')) { - throw new TypeError('invalid validOptions', { - cause: { - found: validOptions, - wanted: 'string[]', - }, - }); - } - const validate = val ? - val - : undefined; - return { - ...rest, - default: def, - validate, - validOptions, - type: 'string', - multiple: true, - }; -} -function flag(o = {}) { - const { hint, default: def, validate: val, ...rest } = o; - delete rest.validOptions; - if (def !== undefined && !isValidValue(def, 'boolean', false)) { - throw new TypeError('invalid default value'); - } - const validate = val ? - val - : undefined; - if (hint !== undefined) { - throw new TypeError('cannot provide hint for flag'); - } - return { - ...rest, - default: def, - validate, - type: 'boolean', - multiple: false, - }; -} -function flagList(o = {}) { - const { hint, default: def, validate: val, ...rest } = o; - delete rest.validOptions; - if (def !== undefined && !isValidValue(def, 'boolean', true)) { - throw new TypeError('invalid default value'); - } - const validate = val ? - val - : undefined; - if (hint !== undefined) { - throw new TypeError('cannot provide hint for flag list'); - } - return { - ...rest, - default: def, - validate, - type: 'boolean', - multiple: true, - }; -} -const toParseArgsOptionsConfig = (options) => { - const c = {}; - for (const longOption in options) { - const config = options[longOption]; - /* c8 ignore start */ - if (!config) { - throw new Error('config must be an object: ' + longOption); - } - /* c8 ignore start */ - if ((0, exports.isConfigOption)(config, 'number', true)) { - c[longOption] = { - type: 'string', - multiple: true, - default: config.default?.map(c => String(c)), - }; - } - else if ((0, exports.isConfigOption)(config, 'number', false)) { - c[longOption] = { - type: 'string', - multiple: false, - default: config.default === undefined ? - undefined - : String(config.default), - }; - } - else { - const conf = config; - c[longOption] = { - type: conf.type, - multiple: !!conf.multiple, - default: conf.default, - }; - } - const clo = c[longOption]; - if (typeof config.short === 'string') { - clo.short = config.short; - } - if (config.type === 'boolean' && - !longOption.startsWith('no-') && - !options[`no-${longOption}`]) { - c[`no-${longOption}`] = { - type: 'boolean', - multiple: config.multiple, - }; - } - } - return c; -}; -const isHeading = (r) => r.type === 'heading'; -const isDescription = (r) => r.type === 'description'; -/** - * Class returned by the {@link jack} function and all configuration - * definition methods. This is what gets chained together. - */ -class Jack { - #configSet; - #shorts; - #options; - #fields = []; - #env; - #envPrefix; - #allowPositionals; - #usage; - #usageMarkdown; - constructor(options = {}) { - this.#options = options; - this.#allowPositionals = options.allowPositionals !== false; - this.#env = - this.#options.env === undefined ? process.env : this.#options.env; - this.#envPrefix = options.envPrefix; - // We need to fib a little, because it's always the same object, but it - // starts out as having an empty config set. Then each method that adds - // fields returns `this as Jack` - this.#configSet = Object.create(null); - this.#shorts = Object.create(null); - } - /** - * Set the default value (which will still be overridden by env or cli) - * as if from a parsed config file. The optional `source` param, if - * provided, will be included in error messages if a value is invalid or - * unknown. - */ - setConfigValues(values, source = '') { - try { - this.validate(values); - } - catch (er) { - const e = er; - if (source && e && typeof e === 'object') { - if (e.cause && typeof e.cause === 'object') { - Object.assign(e.cause, { path: source }); - } - else { - e.cause = { path: source }; - } - } - throw e; - } - for (const [field, value] of Object.entries(values)) { - const my = this.#configSet[field]; - // already validated, just for TS's benefit - /* c8 ignore start */ - if (!my) { - throw new Error('unexpected field in config set: ' + field, { - cause: { found: field }, - }); - } - /* c8 ignore stop */ - my.default = value; - } - return this; - } - /** - * Parse a string of arguments, and return the resulting - * `{ values, positionals }` object. - * - * If an {@link JackOptions#envPrefix} is set, then it will read default - * values from the environment, and write the resulting values back - * to the environment as well. - * - * Environment values always take precedence over any other value, except - * an explicit CLI setting. - */ - parse(args = process.argv) { - this.loadEnvDefaults(); - const p = this.parseRaw(args); - this.applyDefaults(p); - this.writeEnv(p); - return p; - } - loadEnvDefaults() { - if (this.#envPrefix) { - for (const [field, my] of Object.entries(this.#configSet)) { - const ek = toEnvKey(this.#envPrefix, field); - const env = this.#env[ek]; - if (env !== undefined) { - my.default = fromEnvVal(env, my.type, !!my.multiple, my.delim); - } - } - } - } - applyDefaults(p) { - for (const [field, c] of Object.entries(this.#configSet)) { - if (c.default !== undefined && !(field in p.values)) { - //@ts-ignore - p.values[field] = c.default; - } - } - } - /** - * Only parse the command line arguments passed in. - * Does not strip off the `node script.js` bits, so it must be just the - * arguments you wish to have parsed. - * Does not read from or write to the environment, or set defaults. - */ - parseRaw(args) { - if (args === process.argv) { - args = args.slice(process._eval !== undefined ? 1 : 2); - } - const options = toParseArgsOptionsConfig(this.#configSet); - const result = (0, parse_args_js_1.parseArgs)({ - args, - options, - // always strict, but using our own logic - strict: false, - allowPositionals: this.#allowPositionals, - tokens: true, - }); - const p = { - values: {}, - positionals: [], - }; - for (const token of result.tokens) { - if (token.kind === 'positional') { - p.positionals.push(token.value); - if (this.#options.stopAtPositional || - this.#options.stopAtPositionalTest?.(token.value)) { - p.positionals.push(...args.slice(token.index + 1)); - break; - } - } - else if (token.kind === 'option') { - let value = undefined; - if (token.name.startsWith('no-')) { - const my = this.#configSet[token.name]; - const pname = token.name.substring('no-'.length); - const pos = this.#configSet[pname]; - if (pos && - pos.type === 'boolean' && - (!my || - (my.type === 'boolean' && !!my.multiple === !!pos.multiple))) { - value = false; - token.name = pname; - } - } - const my = this.#configSet[token.name]; - if (!my) { - throw new Error(`Unknown option '${token.rawName}'. ` + - `To specify a positional argument starting with a '-', ` + - `place it at the end of the command after '--', as in ` + - `'-- ${token.rawName}'`, { - cause: { - found: token.rawName + (token.value ? `=${token.value}` : ''), - }, - }); - } - if (value === undefined) { - if (token.value === undefined) { - if (my.type !== 'boolean') { - throw new Error(`No value provided for ${token.rawName}, expected ${my.type}`, { - cause: { - name: token.rawName, - wanted: valueType(my), - }, - }); - } - value = true; - } - else { - if (my.type === 'boolean') { - throw new Error(`Flag ${token.rawName} does not take a value, received '${token.value}'`, { cause: { found: token } }); - } - if (my.type === 'string') { - value = token.value; - } - else { - value = +token.value; - if (value !== value) { - throw new Error(`Invalid value '${token.value}' provided for ` + - `'${token.rawName}' option, expected number`, { - cause: { - name: token.rawName, - found: token.value, - wanted: 'number', - }, - }); - } - } - } - } - if (my.multiple) { - const pv = p.values; - const tn = pv[token.name] ?? []; - pv[token.name] = tn; - tn.push(value); - } - else { - const pv = p.values; - pv[token.name] = value; - } - } - } - for (const [field, value] of Object.entries(p.values)) { - const valid = this.#configSet[field]?.validate; - const validOptions = this.#configSet[field]?.validOptions; - let cause; - if (validOptions && !isValidOption(value, validOptions)) { - cause = { name: field, found: value, validOptions: validOptions }; - } - if (valid && !valid(value)) { - cause = cause || { name: field, found: value }; - } - if (cause) { - throw new Error(`Invalid value provided for --${field}: ${JSON.stringify(value)}`, { cause }); - } - } - return p; - } - /** - * do not set fields as 'no-foo' if 'foo' exists and both are bools - * just set foo. - */ - #noNoFields(f, val, s = f) { - if (!f.startsWith('no-') || typeof val !== 'boolean') - return; - const yes = f.substring('no-'.length); - // recurse so we get the core config key we care about. - this.#noNoFields(yes, val, s); - if (this.#configSet[yes]?.type === 'boolean') { - throw new Error(`do not set '${s}', instead set '${yes}' as desired.`, { cause: { found: s, wanted: yes } }); - } - } - /** - * Validate that any arbitrary object is a valid configuration `values` - * object. Useful when loading config files or other sources. - */ - validate(o) { - if (!o || typeof o !== 'object') { - throw new Error('Invalid config: not an object', { - cause: { found: o }, - }); - } - const opts = o; - for (const field in o) { - const value = opts[field]; - /* c8 ignore next - for TS */ - if (value === undefined) - continue; - this.#noNoFields(field, value); - const config = this.#configSet[field]; - if (!config) { - throw new Error(`Unknown config option: ${field}`, { - cause: { found: field }, - }); - } - if (!isValidValue(value, config.type, !!config.multiple)) { - throw new Error(`Invalid value ${valueType(value)} for ${field}, expected ${valueType(config)}`, { - cause: { - name: field, - found: value, - wanted: valueType(config), - }, - }); - } - let cause; - if (config.validOptions && - !isValidOption(value, config.validOptions)) { - cause = { - name: field, - found: value, - validOptions: config.validOptions, - }; - } - if (config.validate && !config.validate(value)) { - cause = cause || { name: field, found: value }; - } - if (cause) { - throw new Error(`Invalid config value for ${field}: ${value}`, { - cause, - }); - } - } - } - writeEnv(p) { - if (!this.#env || !this.#envPrefix) - return; - for (const [field, value] of Object.entries(p.values)) { - const my = this.#configSet[field]; - this.#env[toEnvKey(this.#envPrefix, field)] = toEnvVal(value, my?.delim); - } - } - /** - * Add a heading to the usage output banner - */ - heading(text, level, { pre = false } = {}) { - if (level === undefined) { - level = this.#fields.some(r => isHeading(r)) ? 2 : 1; - } - this.#fields.push({ type: 'heading', text, level, pre }); - return this; - } - /** - * Add a long-form description to the usage output at this position. - */ - description(text, { pre } = {}) { - this.#fields.push({ type: 'description', text, pre }); - return this; - } - /** - * Add one or more number fields. - */ - num(fields) { - return this.#addFields(fields, num); - } - /** - * Add one or more multiple number fields. - */ - numList(fields) { - return this.#addFields(fields, numList); - } - /** - * Add one or more string option fields. - */ - opt(fields) { - return this.#addFields(fields, opt); - } - /** - * Add one or more multiple string option fields. - */ - optList(fields) { - return this.#addFields(fields, optList); - } - /** - * Add one or more flag fields. - */ - flag(fields) { - return this.#addFields(fields, flag); - } - /** - * Add one or more multiple flag fields. - */ - flagList(fields) { - return this.#addFields(fields, flagList); - } - /** - * Generic field definition method. Similar to flag/flagList/number/etc, - * but you must specify the `type` (and optionally `multiple` and `delim`) - * fields on each one, or Jack won't know how to define them. - */ - addFields(fields) { - const next = this; - for (const [name, field] of Object.entries(fields)) { - this.#validateName(name, field); - next.#fields.push({ - type: 'config', - name, - value: field, - }); - } - Object.assign(next.#configSet, fields); - return next; - } - #addFields(fields, fn) { - const next = this; - Object.assign(next.#configSet, Object.fromEntries(Object.entries(fields).map(([name, field]) => { - this.#validateName(name, field); - const option = fn(field); - next.#fields.push({ - type: 'config', - name, - value: option, - }); - return [name, option]; - }))); - return next; - } - #validateName(name, field) { - if (!/^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?$/.test(name)) { - throw new TypeError(`Invalid option name: ${name}, ` + - `must be '-' delimited ASCII alphanumeric`); - } - if (this.#configSet[name]) { - throw new TypeError(`Cannot redefine option ${field}`); - } - if (this.#shorts[name]) { - throw new TypeError(`Cannot redefine option ${name}, already ` + - `in use for ${this.#shorts[name]}`); - } - if (field.short) { - if (!/^[a-zA-Z0-9]$/.test(field.short)) { - throw new TypeError(`Invalid ${name} short option: ${field.short}, ` + - 'must be 1 ASCII alphanumeric character'); - } - if (this.#shorts[field.short]) { - throw new TypeError(`Invalid ${name} short option: ${field.short}, ` + - `already in use for ${this.#shorts[field.short]}`); - } - this.#shorts[field.short] = name; - this.#shorts[name] = name; - } - } - /** - * Return the usage banner for the given configuration - */ - usage() { - if (this.#usage) - return this.#usage; - let headingLevel = 1; - const ui = (0, cliui_1.default)({ width }); - const first = this.#fields[0]; - let start = first?.type === 'heading' ? 1 : 0; - if (first?.type === 'heading') { - ui.div({ - padding: [0, 0, 0, 0], - text: normalize(first.text), - }); - } - ui.div({ padding: [0, 0, 0, 0], text: 'Usage:' }); - if (this.#options.usage) { - ui.div({ - text: this.#options.usage, - padding: [0, 0, 0, 2], - }); - } - else { - const cmd = (0, node_path_1.basename)(String(process.argv[1])); - const shortFlags = []; - const shorts = []; - const flags = []; - const opts = []; - for (const [field, config] of Object.entries(this.#configSet)) { - if (config.short) { - if (config.type === 'boolean') - shortFlags.push(config.short); - else - shorts.push([config.short, config.hint || field]); - } - else { - if (config.type === 'boolean') - flags.push(field); - else - opts.push([field, config.hint || field]); - } - } - const sf = shortFlags.length ? ' -' + shortFlags.join('') : ''; - const so = shorts.map(([k, v]) => ` --${k}=<${v}>`).join(''); - const lf = flags.map(k => ` --${k}`).join(''); - const lo = opts.map(([k, v]) => ` --${k}=<${v}>`).join(''); - const usage = `${cmd}${sf}${so}${lf}${lo}`.trim(); - ui.div({ - text: usage, - padding: [0, 0, 0, 2], - }); - } - ui.div({ padding: [0, 0, 0, 0], text: '' }); - const maybeDesc = this.#fields[start]; - if (maybeDesc && isDescription(maybeDesc)) { - const print = normalize(maybeDesc.text, maybeDesc.pre); - start++; - ui.div({ padding: [0, 0, 0, 0], text: print }); - ui.div({ padding: [0, 0, 0, 0], text: '' }); - } - const { rows, maxWidth } = this.#usageRows(start); - // every heading/description after the first gets indented by 2 - // extra spaces. - for (const row of rows) { - if (row.left) { - // If the row is too long, don't wrap it - // Bump the right-hand side down a line to make room - const configIndent = indent(Math.max(headingLevel, 2)); - if (row.left.length > maxWidth - 3) { - ui.div({ text: row.left, padding: [0, 0, 0, configIndent] }); - ui.div({ text: row.text, padding: [0, 0, 0, maxWidth] }); - } - else { - ui.div({ - text: row.left, - padding: [0, 1, 0, configIndent], - width: maxWidth, - }, { padding: [0, 0, 0, 0], text: row.text }); - } - if (row.skipLine) { - ui.div({ padding: [0, 0, 0, 0], text: '' }); - } - } - else { - if (isHeading(row)) { - const { level } = row; - headingLevel = level; - // only h1 and h2 have bottom padding - // h3-h6 do not - const b = level <= 2 ? 1 : 0; - ui.div({ ...row, padding: [0, 0, b, indent(level)] }); - } - else { - ui.div({ ...row, padding: [0, 0, 1, indent(headingLevel + 1)] }); - } - } - } - return (this.#usage = ui.toString()); - } - /** - * Return the usage banner markdown for the given configuration - */ - usageMarkdown() { - if (this.#usageMarkdown) - return this.#usageMarkdown; - const out = []; - let headingLevel = 1; - const first = this.#fields[0]; - let start = first?.type === 'heading' ? 1 : 0; - if (first?.type === 'heading') { - out.push(`# ${normalizeOneLine(first.text)}`); - } - out.push('Usage:'); - if (this.#options.usage) { - out.push(normalizeMarkdown(this.#options.usage, true)); - } - else { - const cmd = (0, node_path_1.basename)(String(process.argv[1])); - const shortFlags = []; - const shorts = []; - const flags = []; - const opts = []; - for (const [field, config] of Object.entries(this.#configSet)) { - if (config.short) { - if (config.type === 'boolean') - shortFlags.push(config.short); - else - shorts.push([config.short, config.hint || field]); - } - else { - if (config.type === 'boolean') - flags.push(field); - else - opts.push([field, config.hint || field]); - } - } - const sf = shortFlags.length ? ' -' + shortFlags.join('') : ''; - const so = shorts.map(([k, v]) => ` --${k}=<${v}>`).join(''); - const lf = flags.map(k => ` --${k}`).join(''); - const lo = opts.map(([k, v]) => ` --${k}=<${v}>`).join(''); - const usage = `${cmd}${sf}${so}${lf}${lo}`.trim(); - out.push(normalizeMarkdown(usage, true)); - } - const maybeDesc = this.#fields[start]; - if (maybeDesc && isDescription(maybeDesc)) { - out.push(normalizeMarkdown(maybeDesc.text, maybeDesc.pre)); - start++; - } - const { rows } = this.#usageRows(start); - // heading level in markdown is number of # ahead of text - for (const row of rows) { - if (row.left) { - out.push('#'.repeat(headingLevel + 1) + - ' ' + - normalizeOneLine(row.left, true)); - if (row.text) - out.push(normalizeMarkdown(row.text)); - } - else if (isHeading(row)) { - const { level } = row; - headingLevel = level; - out.push(`${'#'.repeat(headingLevel)} ${normalizeOneLine(row.text, row.pre)}`); - } - else { - out.push(normalizeMarkdown(row.text, !!row.pre)); - } - } - return (this.#usageMarkdown = out.join('\n\n') + '\n'); - } - #usageRows(start) { - // turn each config type into a row, and figure out the width of the - // left hand indentation for the option descriptions. - let maxMax = Math.max(12, Math.min(26, Math.floor(width / 3))); - let maxWidth = 8; - let prev = undefined; - const rows = []; - for (const field of this.#fields.slice(start)) { - if (field.type !== 'config') { - if (prev?.type === 'config') - prev.skipLine = true; - prev = undefined; - field.text = normalize(field.text, !!field.pre); - rows.push(field); - continue; - } - const { value } = field; - const desc = value.description || ''; - const mult = value.multiple ? 'Can be set multiple times' : ''; - const opts = value.validOptions?.length ? - `Valid options:${value.validOptions.map(v => ` ${JSON.stringify(v)}`)}` - : ''; - const dmDelim = desc.includes('\n') ? '\n\n' : '\n'; - const extra = [opts, mult].join(dmDelim).trim(); - const text = (normalize(desc) + dmDelim + extra).trim(); - const hint = value.hint || - (value.type === 'number' ? 'n' - : value.type === 'string' ? field.name - : undefined); - const short = !value.short ? '' - : value.type === 'boolean' ? `-${value.short} ` - : `-${value.short}<${hint}> `; - const left = value.type === 'boolean' ? - `${short}--${field.name}` - : `${short}--${field.name}=<${hint}>`; - const row = { text, left, type: 'config' }; - if (text.length > width - maxMax) { - row.skipLine = true; - } - if (prev && left.length > maxMax) - prev.skipLine = true; - prev = row; - const len = left.length + 4; - if (len > maxWidth && len < maxMax) { - maxWidth = len; - } - rows.push(row); - } - return { rows, maxWidth }; - } - /** - * Return the configuration options as a plain object - */ - toJSON() { - return Object.fromEntries(Object.entries(this.#configSet).map(([field, def]) => [ - field, - { - type: def.type, - ...(def.multiple ? { multiple: true } : {}), - ...(def.delim ? { delim: def.delim } : {}), - ...(def.short ? { short: def.short } : {}), - ...(def.description ? - { description: normalize(def.description) } - : {}), - ...(def.validate ? { validate: def.validate } : {}), - ...(def.validOptions ? { validOptions: def.validOptions } : {}), - ...(def.default !== undefined ? { default: def.default } : {}), - ...(def.hint ? { hint: def.hint } : {}), - }, - ])); - } - /** - * Custom printer for `util.inspect` - */ - [node_util_1.inspect.custom](_, options) { - return `Jack ${(0, node_util_1.inspect)(this.toJSON(), options)}`; - } -} -exports.Jack = Jack; -// Unwrap and un-indent, so we can wrap description -// strings however makes them look nice in the code. -const normalize = (s, pre = false) => { - if (pre) - // prepend a ZWSP to each line so cliui doesn't strip it. - return s - .split('\n') - .map(l => `\u200b${l}`) - .join('\n'); - return s - .split(/^\s*```\s*$/gm) - .map((s, i) => { - if (i % 2 === 1) { - if (!s.trim()) { - return `\`\`\`\n\`\`\`\n`; - } - // outdent the ``` blocks, but preserve whitespace otherwise. - const split = s.split('\n'); - // throw out the \n at the start and end - split.pop(); - split.shift(); - const si = split.reduce((shortest, l) => { - /* c8 ignore next */ - const ind = l.match(/^\s*/)?.[0] ?? ''; - if (ind.length) - return Math.min(ind.length, shortest); - else - return shortest; - }, Infinity); - /* c8 ignore next */ - const i = isFinite(si) ? si : 0; - return ('\n```\n' + - split.map(s => `\u200b${s.substring(i)}`).join('\n') + - '\n```\n'); - } - return (s - // remove single line breaks, except for lists - .replace(/([^\n])\n[ \t]*([^\n])/g, (_, $1, $2) => !/^[-*]/.test($2) ? `${$1} ${$2}` : `${$1}\n${$2}`) - // normalize mid-line whitespace - .replace(/([^\n])[ \t]+([^\n])/g, '$1 $2') - // two line breaks are enough - .replace(/\n{3,}/g, '\n\n') - // remove any spaces at the start of a line - .replace(/\n[ \t]+/g, '\n') - .trim()); - }) - .join('\n'); -}; -// normalize for markdown printing, remove leading spaces on lines -const normalizeMarkdown = (s, pre = false) => { - const n = normalize(s, pre).replace(/\\/g, '\\\\'); - return pre ? - `\`\`\`\n${n.replace(/\u200b/g, '')}\n\`\`\`` - : n.replace(/\n +/g, '\n').trim(); -}; -const normalizeOneLine = (s, pre = false) => { - const n = normalize(s, pre) - .replace(/[\s\u200b]+/g, ' ') - .trim(); - return pre ? `\`${n}\`` : n; -}; -/** - * Main entry point. Create and return a {@link Jack} object. - */ -const jack = (options = {}) => new Jack(options); -exports.jack = jack; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/jackspeak/dist/commonjs/index.js.map b/node_modules/jackspeak/dist/commonjs/index.js.map deleted file mode 100644 index 4b2d1f6..0000000 --- a/node_modules/jackspeak/dist/commonjs/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["export type ConfigType = 'number' | 'string' | 'boolean'\n\n/**\n * Given a Jack object, get the typeof its ConfigSet\n */\nexport type Unwrap = J extends Jack ? C : never\n\nimport { inspect, InspectOptions, ParseArgsConfig } from 'node:util'\nimport { parseArgs } from './parse-args.js'\n\n// it's a tiny API, just cast it inline, it's fine\n//@ts-ignore\nimport cliui from '@isaacs/cliui'\nimport { basename } from 'node:path'\n\nconst width = Math.min(\n (process && process.stdout && process.stdout.columns) || 80,\n 80,\n)\n\n// indentation spaces from heading level\nconst indent = (n: number) => (n - 1) * 2\n\nconst toEnvKey = (pref: string, key: string): string => {\n return [pref, key.replace(/[^a-zA-Z0-9]+/g, ' ')]\n .join(' ')\n .trim()\n .toUpperCase()\n .replace(/ /g, '_')\n}\n\nconst toEnvVal = (\n value: string | boolean | number | string[] | boolean[] | number[],\n delim: string = '\\n',\n): string => {\n const str =\n typeof value === 'string' ? value\n : typeof value === 'boolean' ?\n value ? '1'\n : '0'\n : typeof value === 'number' ? String(value)\n : Array.isArray(value) ?\n value.map((v: string | number | boolean) => toEnvVal(v)).join(delim)\n : /* c8 ignore start */ undefined\n if (typeof str !== 'string') {\n throw new Error(\n `could not serialize value to environment: ${JSON.stringify(value)}`,\n )\n }\n /* c8 ignore stop */\n return str\n}\n\nconst fromEnvVal = (\n env: string,\n type: T,\n multiple: M,\n delim: string = '\\n',\n): ValidValue =>\n (multiple ?\n env ? env.split(delim).map(v => fromEnvVal(v, type, false))\n : []\n : type === 'string' ? env\n : type === 'boolean' ? env === '1'\n : +env.trim()) as ValidValue\n\n/**\n * Defines the type of value that is valid, given a config definition's\n * {@link ConfigType} and boolean multiple setting\n */\nexport type ValidValue<\n T extends ConfigType = ConfigType,\n M extends boolean = boolean,\n> =\n [T, M] extends ['number', true] ? number[]\n : [T, M] extends ['string', true] ? string[]\n : [T, M] extends ['boolean', true] ? boolean[]\n : [T, M] extends ['number', false] ? number\n : [T, M] extends ['string', false] ? string\n : [T, M] extends ['boolean', false] ? boolean\n : [T, M] extends ['string', boolean] ? string | string[]\n : [T, M] extends ['boolean', boolean] ? boolean | boolean[]\n : [T, M] extends ['number', boolean] ? number | number[]\n : [T, M] extends [ConfigType, false] ? string | number | boolean\n : [T, M] extends [ConfigType, true] ? string[] | number[] | boolean[]\n : string | number | boolean | string[] | number[] | boolean[]\n\n/**\n * The meta information for a config option definition, when the\n * type and multiple values can be inferred by the method being used\n */\nexport type ConfigOptionMeta<\n T extends ConfigType,\n M extends boolean = boolean,\n O extends\n | undefined\n | (T extends 'boolean' ? never\n : T extends 'string' ? readonly string[]\n : T extends 'number' ? readonly number[]\n : readonly number[] | readonly string[]) =\n | undefined\n | (T extends 'boolean' ? never\n : T extends 'string' ? readonly string[]\n : T extends 'number' ? readonly number[]\n : readonly number[] | readonly string[]),\n> = {\n default?:\n | undefined\n | (ValidValue &\n (O extends number[] | string[] ?\n M extends false ?\n O[number]\n : O[number][]\n : unknown))\n validOptions?: O\n description?: string\n validate?:\n | ((v: unknown) => v is ValidValue)\n | ((v: unknown) => boolean)\n short?: string | undefined\n type?: T\n hint?: T extends 'boolean' ? never : string\n delim?: M extends true ? string : never\n} & (M extends false ? { multiple?: false | undefined }\n: M extends true ? { multiple: true }\n: { multiple?: boolean })\n\n/**\n * A set of {@link ConfigOptionMeta} fields, referenced by their longOption\n * string values.\n */\nexport type ConfigMetaSet<\n T extends ConfigType,\n M extends boolean = boolean,\n> = {\n [longOption: string]: ConfigOptionMeta\n}\n\n/**\n * Infer {@link ConfigSet} fields from a given {@link ConfigMetaSet}\n */\nexport type ConfigSetFromMetaSet<\n T extends ConfigType,\n M extends boolean,\n S extends ConfigMetaSet,\n> = {\n [longOption in keyof S]: ConfigOptionBase\n}\n\n/**\n * Fields that can be set on a {@link ConfigOptionBase} or\n * {@link ConfigOptionMeta} based on whether or not the field is known to be\n * multiple.\n */\nexport type MultiType =\n M extends true ?\n {\n multiple: true\n delim?: string | undefined\n }\n : M extends false ?\n {\n multiple?: false | undefined\n delim?: undefined\n }\n : {\n multiple?: boolean | undefined\n delim?: string | undefined\n }\n\n/**\n * A config field definition, in its full representation.\n */\nexport type ConfigOptionBase<\n T extends ConfigType,\n M extends boolean = boolean,\n> = {\n type: T\n short?: string | undefined\n default?: ValidValue | undefined\n description?: string\n hint?: T extends 'boolean' ? undefined : string | undefined\n validate?: (v: unknown) => v is ValidValue\n validOptions?: T extends 'boolean' ? undefined\n : T extends 'string' ? readonly string[]\n : T extends 'number' ? readonly number[]\n : readonly number[] | readonly string[]\n} & MultiType\n\nexport const isConfigType = (t: string): t is ConfigType =>\n typeof t === 'string' &&\n (t === 'string' || t === 'number' || t === 'boolean')\n\nconst undefOrType = (v: unknown, t: string): boolean =>\n v === undefined || typeof v === t\nconst undefOrTypeArray = (v: unknown, t: string): boolean =>\n v === undefined || (Array.isArray(v) && v.every(x => typeof x === t))\n\nconst isValidOption = (v: unknown, vo: readonly unknown[]): boolean =>\n Array.isArray(v) ? v.every(x => isValidOption(x, vo)) : vo.includes(v)\n\n// print the value type, for error message reporting\nconst valueType = (\n v:\n | string\n | number\n | boolean\n | string[]\n | number[]\n | boolean[]\n | { type: ConfigType; multiple?: boolean },\n): string =>\n typeof v === 'string' ? 'string'\n : typeof v === 'boolean' ? 'boolean'\n : typeof v === 'number' ? 'number'\n : Array.isArray(v) ?\n joinTypes([...new Set(v.map(v => valueType(v)))]) + '[]'\n : `${v.type}${v.multiple ? '[]' : ''}`\n\nconst joinTypes = (types: string[]): string =>\n types.length === 1 && typeof types[0] === 'string' ?\n types[0]\n : `(${types.join('|')})`\n\nconst isValidValue = (\n v: unknown,\n type: T,\n multi: M,\n): v is ValidValue => {\n if (multi) {\n if (!Array.isArray(v)) return false\n return !v.some((v: unknown) => !isValidValue(v, type, false))\n }\n if (Array.isArray(v)) return false\n return typeof v === type\n}\n\nexport const isConfigOption = (\n o: any,\n type: T,\n multi: M,\n): o is ConfigOptionBase =>\n !!o &&\n typeof o === 'object' &&\n isConfigType(o.type) &&\n o.type === type &&\n undefOrType(o.short, 'string') &&\n undefOrType(o.description, 'string') &&\n undefOrType(o.hint, 'string') &&\n undefOrType(o.validate, 'function') &&\n (o.type === 'boolean' ?\n o.validOptions === undefined\n : undefOrTypeArray(o.validOptions, o.type)) &&\n (o.default === undefined || isValidValue(o.default, type, multi)) &&\n !!o.multiple === multi\n\n/**\n * A set of {@link ConfigOptionBase} objects, referenced by their longOption\n * string values.\n */\nexport type ConfigSet = {\n [longOption: string]: ConfigOptionBase\n}\n\n/**\n * The 'values' field returned by {@link Jack#parse}\n */\nexport type OptionsResults = {\n [k in keyof T]?: T[k]['validOptions'] extends (\n readonly string[] | readonly number[]\n ) ?\n T[k] extends ConfigOptionBase<'string' | 'number', false> ?\n T[k]['validOptions'][number]\n : T[k] extends ConfigOptionBase<'string' | 'number', true> ?\n T[k]['validOptions'][number][]\n : never\n : T[k] extends ConfigOptionBase<'string', false> ? string\n : T[k] extends ConfigOptionBase<'string', true> ? string[]\n : T[k] extends ConfigOptionBase<'number', false> ? number\n : T[k] extends ConfigOptionBase<'number', true> ? number[]\n : T[k] extends ConfigOptionBase<'boolean', false> ? boolean\n : T[k] extends ConfigOptionBase<'boolean', true> ? boolean[]\n : never\n}\n\n/**\n * The object retured by {@link Jack#parse}\n */\nexport type Parsed = {\n values: OptionsResults\n positionals: string[]\n}\n\nfunction num(\n o: ConfigOptionMeta<'number', false> = {},\n): ConfigOptionBase<'number', false> {\n const { default: def, validate: val, validOptions, ...rest } = o\n if (def !== undefined && !isValidValue(def, 'number', false)) {\n throw new TypeError('invalid default value', {\n cause: {\n found: def,\n wanted: 'number',\n },\n })\n }\n if (!undefOrTypeArray(validOptions, 'number')) {\n throw new TypeError('invalid validOptions', {\n cause: {\n found: validOptions,\n wanted: 'number[]',\n },\n })\n }\n const validate =\n val ?\n (val as (v: unknown) => v is ValidValue<'number', false>)\n : undefined\n return {\n ...rest,\n default: def,\n validate,\n validOptions,\n type: 'number',\n multiple: false,\n }\n}\n\nfunction numList(\n o: ConfigOptionMeta<'number'> = {},\n): ConfigOptionBase<'number', true> {\n const { default: def, validate: val, validOptions, ...rest } = o\n if (def !== undefined && !isValidValue(def, 'number', true)) {\n throw new TypeError('invalid default value', {\n cause: {\n found: def,\n wanted: 'number[]',\n },\n })\n }\n if (!undefOrTypeArray(validOptions, 'number')) {\n throw new TypeError('invalid validOptions', {\n cause: {\n found: validOptions,\n wanted: 'number[]',\n },\n })\n }\n const validate =\n val ?\n (val as (v: unknown) => v is ValidValue<'number', true>)\n : undefined\n return {\n ...rest,\n default: def,\n validate,\n validOptions,\n type: 'number',\n multiple: true,\n }\n}\n\nfunction opt(\n o: ConfigOptionMeta<'string', false> = {},\n): ConfigOptionBase<'string', false> {\n const { default: def, validate: val, validOptions, ...rest } = o\n if (def !== undefined && !isValidValue(def, 'string', false)) {\n throw new TypeError('invalid default value', {\n cause: {\n found: def,\n wanted: 'string',\n },\n })\n }\n if (!undefOrTypeArray(validOptions, 'string')) {\n throw new TypeError('invalid validOptions', {\n cause: {\n found: validOptions,\n wanted: 'string[]',\n },\n })\n }\n const validate =\n val ?\n (val as (v: unknown) => v is ValidValue<'string', false>)\n : undefined\n return {\n ...rest,\n default: def,\n validate,\n validOptions,\n type: 'string',\n multiple: false,\n }\n}\n\nfunction optList(\n o: ConfigOptionMeta<'string'> = {},\n): ConfigOptionBase<'string', true> {\n const { default: def, validate: val, validOptions, ...rest } = o\n if (def !== undefined && !isValidValue(def, 'string', true)) {\n throw new TypeError('invalid default value', {\n cause: {\n found: def,\n wanted: 'string[]',\n },\n })\n }\n if (!undefOrTypeArray(validOptions, 'string')) {\n throw new TypeError('invalid validOptions', {\n cause: {\n found: validOptions,\n wanted: 'string[]',\n },\n })\n }\n const validate =\n val ?\n (val as (v: unknown) => v is ValidValue<'string', true>)\n : undefined\n return {\n ...rest,\n default: def,\n validate,\n validOptions,\n type: 'string',\n multiple: true,\n }\n}\n\nfunction flag(\n o: ConfigOptionMeta<'boolean', false> = {},\n): ConfigOptionBase<'boolean', false> {\n const {\n hint,\n default: def,\n validate: val,\n ...rest\n } = o as ConfigOptionMeta<'boolean', false>\n delete (rest as ConfigOptionMeta<'string', false>).validOptions\n if (def !== undefined && !isValidValue(def, 'boolean', false)) {\n throw new TypeError('invalid default value')\n }\n const validate =\n val ?\n (val as (v: unknown) => v is ValidValue<'boolean', false>)\n : undefined\n if (hint !== undefined) {\n throw new TypeError('cannot provide hint for flag')\n }\n return {\n ...rest,\n default: def,\n validate,\n type: 'boolean',\n multiple: false,\n }\n}\n\nfunction flagList(\n o: ConfigOptionMeta<'boolean'> = {},\n): ConfigOptionBase<'boolean', true> {\n const {\n hint,\n default: def,\n validate: val,\n ...rest\n } = o as ConfigOptionMeta<'boolean', false>\n delete (rest as ConfigOptionMeta<'string', false>).validOptions\n if (def !== undefined && !isValidValue(def, 'boolean', true)) {\n throw new TypeError('invalid default value')\n }\n const validate =\n val ?\n (val as (v: unknown) => v is ValidValue<'boolean', true>)\n : undefined\n if (hint !== undefined) {\n throw new TypeError('cannot provide hint for flag list')\n }\n return {\n ...rest,\n default: def,\n validate,\n type: 'boolean',\n multiple: true,\n }\n}\nconst toParseArgsOptionsConfig = (\n options: ConfigSet,\n): Exclude => {\n const c: Exclude = {}\n for (const longOption in options) {\n const config = options[longOption]\n /* c8 ignore start */\n if (!config) {\n throw new Error('config must be an object: ' + longOption)\n }\n /* c8 ignore start */\n if (isConfigOption(config, 'number', true)) {\n c[longOption] = {\n type: 'string',\n multiple: true,\n default: config.default?.map(c => String(c)),\n }\n } else if (isConfigOption(config, 'number', false)) {\n c[longOption] = {\n type: 'string',\n multiple: false,\n default:\n config.default === undefined ?\n undefined\n : String(config.default),\n }\n } else {\n const conf = config as\n | ConfigOptionBase<'string'>\n | ConfigOptionBase<'boolean'>\n c[longOption] = {\n type: conf.type,\n multiple: !!conf.multiple,\n default: conf.default,\n }\n }\n const clo = c[longOption] as ConfigOptionBase\n if (typeof config.short === 'string') {\n clo.short = config.short\n }\n\n if (\n config.type === 'boolean' &&\n !longOption.startsWith('no-') &&\n !options[`no-${longOption}`]\n ) {\n c[`no-${longOption}`] = {\n type: 'boolean',\n multiple: config.multiple,\n }\n }\n }\n return c\n}\n\n/**\n * A row used when generating the {@link Jack#usage} string\n */\nexport interface Row {\n left?: string\n text: string\n skipLine?: boolean\n type?: string\n}\n\n/**\n * A heading for a section in the usage, created by the jack.heading()\n * method.\n *\n * First heading is always level 1, subsequent headings default to 2.\n *\n * The level of the nearest heading level sets the indentation of the\n * description that follows.\n */\nexport interface Heading extends Row {\n type: 'heading'\n text: string\n left?: ''\n skipLine?: boolean\n level: number\n pre?: boolean\n}\nconst isHeading = (r: { type?: string }): r is Heading =>\n r.type === 'heading'\n\n/**\n * An arbitrary blob of text describing some stuff, set by the\n * jack.description() method.\n *\n * Indentation determined by level of the nearest header.\n */\nexport interface Description extends Row {\n type: 'description'\n text: string\n left?: ''\n skipLine?: boolean\n pre?: boolean\n}\n\nconst isDescription = (r: { type?: string }): r is Description =>\n r.type === 'description'\n\n/**\n * A heading or description row used when generating the {@link Jack#usage}\n * string\n */\nexport type TextRow = Heading | Description\n\n/**\n * Either a {@link TextRow} or a reference to a {@link ConfigOptionBase}\n */\nexport type UsageField =\n | TextRow\n | {\n type: 'config'\n name: string\n value: ConfigOptionBase\n }\n\n/**\n * Options provided to the {@link Jack} constructor\n */\nexport interface JackOptions {\n /**\n * Whether to allow positional arguments\n *\n * @default true\n */\n allowPositionals?: boolean\n\n /**\n * Prefix to use when reading/writing the environment variables\n *\n * If not specified, environment behavior will not be available.\n */\n envPrefix?: string\n\n /**\n * Environment object to read/write. Defaults `process.env`.\n * No effect if `envPrefix` is not set.\n */\n env?: { [k: string]: string | undefined }\n\n /**\n * A short usage string. If not provided, will be generated from the\n * options provided, but that can of course be rather verbose if\n * there are a lot of options.\n */\n usage?: string\n\n /**\n * Stop parsing flags and opts at the first positional argument.\n * This is to support cases like `cmd [flags] [options]`, where\n * each subcommand may have different options. This effectively treats\n * any positional as a `--` argument. Only relevant if `allowPositionals`\n * is true.\n *\n * To do subcommands, set this option, look at the first positional, and\n * parse the remaining positionals as appropriate.\n *\n * @default false\n */\n stopAtPositional?: boolean\n\n /**\n * Conditional `stopAtPositional`. If set to a `(string)=>boolean` function,\n * will be called with each positional argument encountered. If the function\n * returns true, then parsing will stop at that point.\n */\n stopAtPositionalTest?: (arg: string) => boolean\n}\n\n/**\n * Class returned by the {@link jack} function and all configuration\n * definition methods. This is what gets chained together.\n */\nexport class Jack {\n #configSet: C\n #shorts: { [k: string]: string }\n #options: JackOptions\n #fields: UsageField[] = []\n #env: { [k: string]: string | undefined }\n #envPrefix?: string\n #allowPositionals: boolean\n #usage?: string\n #usageMarkdown?: string\n\n constructor(options: JackOptions = {}) {\n this.#options = options\n this.#allowPositionals = options.allowPositionals !== false\n this.#env =\n this.#options.env === undefined ? process.env : this.#options.env\n this.#envPrefix = options.envPrefix\n // We need to fib a little, because it's always the same object, but it\n // starts out as having an empty config set. Then each method that adds\n // fields returns `this as Jack`\n this.#configSet = Object.create(null) as C\n this.#shorts = Object.create(null)\n }\n\n /**\n * Set the default value (which will still be overridden by env or cli)\n * as if from a parsed config file. The optional `source` param, if\n * provided, will be included in error messages if a value is invalid or\n * unknown.\n */\n setConfigValues(values: OptionsResults, source = '') {\n try {\n this.validate(values)\n } catch (er) {\n const e = er as Error\n if (source && e && typeof e === 'object') {\n if (e.cause && typeof e.cause === 'object') {\n Object.assign(e.cause, { path: source })\n } else {\n e.cause = { path: source }\n }\n }\n throw e\n }\n for (const [field, value] of Object.entries(values)) {\n const my = this.#configSet[field]\n // already validated, just for TS's benefit\n /* c8 ignore start */\n if (!my) {\n throw new Error('unexpected field in config set: ' + field, {\n cause: { found: field },\n })\n }\n /* c8 ignore stop */\n my.default = value\n }\n return this\n }\n\n /**\n * Parse a string of arguments, and return the resulting\n * `{ values, positionals }` object.\n *\n * If an {@link JackOptions#envPrefix} is set, then it will read default\n * values from the environment, and write the resulting values back\n * to the environment as well.\n *\n * Environment values always take precedence over any other value, except\n * an explicit CLI setting.\n */\n parse(args: string[] = process.argv): Parsed {\n this.loadEnvDefaults()\n const p = this.parseRaw(args)\n this.applyDefaults(p)\n this.writeEnv(p)\n return p\n }\n\n loadEnvDefaults() {\n if (this.#envPrefix) {\n for (const [field, my] of Object.entries(this.#configSet)) {\n const ek = toEnvKey(this.#envPrefix, field)\n const env = this.#env[ek]\n if (env !== undefined) {\n my.default = fromEnvVal(env, my.type, !!my.multiple, my.delim)\n }\n }\n }\n }\n\n applyDefaults(p: Parsed) {\n for (const [field, c] of Object.entries(this.#configSet)) {\n if (c.default !== undefined && !(field in p.values)) {\n //@ts-ignore\n p.values[field] = c.default\n }\n }\n }\n\n /**\n * Only parse the command line arguments passed in.\n * Does not strip off the `node script.js` bits, so it must be just the\n * arguments you wish to have parsed.\n * Does not read from or write to the environment, or set defaults.\n */\n parseRaw(args: string[]): Parsed {\n if (args === process.argv) {\n args = args.slice(\n (process as { _eval?: string })._eval !== undefined ? 1 : 2,\n )\n }\n\n const options = toParseArgsOptionsConfig(this.#configSet)\n const result = parseArgs({\n args,\n options,\n // always strict, but using our own logic\n strict: false,\n allowPositionals: this.#allowPositionals,\n tokens: true,\n })\n\n const p: Parsed = {\n values: {},\n positionals: [],\n }\n for (const token of result.tokens) {\n if (token.kind === 'positional') {\n p.positionals.push(token.value)\n if (\n this.#options.stopAtPositional ||\n this.#options.stopAtPositionalTest?.(token.value)\n ) {\n p.positionals.push(...args.slice(token.index + 1))\n break\n }\n } else if (token.kind === 'option') {\n let value: string | number | boolean | undefined = undefined\n if (token.name.startsWith('no-')) {\n const my = this.#configSet[token.name]\n const pname = token.name.substring('no-'.length)\n const pos = this.#configSet[pname]\n if (\n pos &&\n pos.type === 'boolean' &&\n (!my ||\n (my.type === 'boolean' && !!my.multiple === !!pos.multiple))\n ) {\n value = false\n token.name = pname\n }\n }\n const my = this.#configSet[token.name]\n if (!my) {\n throw new Error(\n `Unknown option '${token.rawName}'. ` +\n `To specify a positional argument starting with a '-', ` +\n `place it at the end of the command after '--', as in ` +\n `'-- ${token.rawName}'`,\n {\n cause: {\n found:\n token.rawName + (token.value ? `=${token.value}` : ''),\n },\n },\n )\n }\n if (value === undefined) {\n if (token.value === undefined) {\n if (my.type !== 'boolean') {\n throw new Error(\n `No value provided for ${token.rawName}, expected ${my.type}`,\n {\n cause: {\n name: token.rawName,\n wanted: valueType(my),\n },\n },\n )\n }\n value = true\n } else {\n if (my.type === 'boolean') {\n throw new Error(\n `Flag ${token.rawName} does not take a value, received '${token.value}'`,\n { cause: { found: token } },\n )\n }\n if (my.type === 'string') {\n value = token.value\n } else {\n value = +token.value\n if (value !== value) {\n throw new Error(\n `Invalid value '${token.value}' provided for ` +\n `'${token.rawName}' option, expected number`,\n {\n cause: {\n name: token.rawName,\n found: token.value,\n wanted: 'number',\n },\n },\n )\n }\n }\n }\n }\n if (my.multiple) {\n const pv = p.values as {\n [k: string]: (string | number | boolean)[]\n }\n const tn = pv[token.name] ?? []\n pv[token.name] = tn\n tn.push(value)\n } else {\n const pv = p.values as { [k: string]: string | number | boolean }\n pv[token.name] = value\n }\n }\n }\n\n for (const [field, value] of Object.entries(p.values)) {\n const valid = this.#configSet[field]?.validate\n const validOptions = this.#configSet[field]?.validOptions\n let cause:\n | undefined\n | {\n name: string\n found: unknown\n validOptions?: readonly string[] | readonly number[]\n }\n if (validOptions && !isValidOption(value, validOptions)) {\n cause = { name: field, found: value, validOptions: validOptions }\n }\n if (valid && !valid(value)) {\n cause = cause || { name: field, found: value }\n }\n if (cause) {\n throw new Error(\n `Invalid value provided for --${field}: ${JSON.stringify(\n value,\n )}`,\n { cause },\n )\n }\n }\n\n return p\n }\n\n /**\n * do not set fields as 'no-foo' if 'foo' exists and both are bools\n * just set foo.\n */\n #noNoFields(f: string, val: unknown, s: string = f) {\n if (!f.startsWith('no-') || typeof val !== 'boolean') return\n const yes = f.substring('no-'.length)\n // recurse so we get the core config key we care about.\n this.#noNoFields(yes, val, s)\n if (this.#configSet[yes]?.type === 'boolean') {\n throw new Error(\n `do not set '${s}', instead set '${yes}' as desired.`,\n { cause: { found: s, wanted: yes } },\n )\n }\n }\n\n /**\n * Validate that any arbitrary object is a valid configuration `values`\n * object. Useful when loading config files or other sources.\n */\n validate(o: unknown): asserts o is Parsed['values'] {\n if (!o || typeof o !== 'object') {\n throw new Error('Invalid config: not an object', {\n cause: { found: o },\n })\n }\n const opts = o as Record\n for (const field in o) {\n const value = opts[field]\n /* c8 ignore next - for TS */\n if (value === undefined) continue\n this.#noNoFields(field, value)\n const config = this.#configSet[field]\n if (!config) {\n throw new Error(`Unknown config option: ${field}`, {\n cause: { found: field },\n })\n }\n if (!isValidValue(value, config.type, !!config.multiple)) {\n throw new Error(\n `Invalid value ${valueType(\n value,\n )} for ${field}, expected ${valueType(config)}`,\n {\n cause: {\n name: field,\n found: value,\n wanted: valueType(config),\n },\n },\n )\n }\n let cause:\n | undefined\n | {\n name: string\n found: any\n validOptions?: readonly string[] | readonly number[]\n }\n if (\n config.validOptions &&\n !isValidOption(value, config.validOptions)\n ) {\n cause = {\n name: field,\n found: value,\n validOptions: config.validOptions,\n }\n }\n if (config.validate && !config.validate(value)) {\n cause = cause || { name: field, found: value }\n }\n if (cause) {\n throw new Error(`Invalid config value for ${field}: ${value}`, {\n cause,\n })\n }\n }\n }\n\n writeEnv(p: Parsed) {\n if (!this.#env || !this.#envPrefix) return\n for (const [field, value] of Object.entries(p.values)) {\n const my = this.#configSet[field]\n this.#env[toEnvKey(this.#envPrefix, field)] = toEnvVal(\n value,\n my?.delim,\n )\n }\n }\n\n /**\n * Add a heading to the usage output banner\n */\n heading(\n text: string,\n level?: 1 | 2 | 3 | 4 | 5 | 6,\n { pre = false }: { pre?: boolean } = {},\n ): Jack {\n if (level === undefined) {\n level = this.#fields.some(r => isHeading(r)) ? 2 : 1\n }\n this.#fields.push({ type: 'heading', text, level, pre })\n return this\n }\n\n /**\n * Add a long-form description to the usage output at this position.\n */\n description(text: string, { pre }: { pre?: boolean } = {}): Jack {\n this.#fields.push({ type: 'description', text, pre })\n return this\n }\n\n /**\n * Add one or more number fields.\n */\n num>(\n fields: F,\n ): Jack> {\n return this.#addFields(fields, num)\n }\n\n /**\n * Add one or more multiple number fields.\n */\n numList>(\n fields: F,\n ): Jack> {\n return this.#addFields(fields, numList)\n }\n\n /**\n * Add one or more string option fields.\n */\n opt>(\n fields: F,\n ): Jack> {\n return this.#addFields(fields, opt)\n }\n\n /**\n * Add one or more multiple string option fields.\n */\n optList>(\n fields: F,\n ): Jack> {\n return this.#addFields(fields, optList)\n }\n\n /**\n * Add one or more flag fields.\n */\n flag>(\n fields: F,\n ): Jack> {\n return this.#addFields(fields, flag)\n }\n\n /**\n * Add one or more multiple flag fields.\n */\n flagList>(\n fields: F,\n ): Jack> {\n return this.#addFields(fields, flagList)\n }\n\n /**\n * Generic field definition method. Similar to flag/flagList/number/etc,\n * but you must specify the `type` (and optionally `multiple` and `delim`)\n * fields on each one, or Jack won't know how to define them.\n */\n addFields(fields: F): Jack {\n const next = this as unknown as Jack\n for (const [name, field] of Object.entries(fields)) {\n this.#validateName(name, field)\n next.#fields.push({\n type: 'config',\n name,\n value: field as ConfigOptionBase,\n })\n }\n Object.assign(next.#configSet, fields)\n return next\n }\n\n #addFields<\n T extends ConfigType,\n M extends boolean,\n F extends ConfigMetaSet,\n >(\n fields: F,\n fn: (m: ConfigOptionMeta) => ConfigOptionBase,\n ): Jack> {\n type NextC = C & ConfigSetFromMetaSet\n const next = this as unknown as Jack\n Object.assign(\n next.#configSet,\n Object.fromEntries(\n Object.entries(fields).map(([name, field]) => {\n this.#validateName(name, field)\n const option = fn(field)\n next.#fields.push({\n type: 'config',\n name,\n value: option as ConfigOptionBase,\n })\n return [name, option]\n }),\n ),\n )\n return next\n }\n\n #validateName(name: string, field: { short?: string }) {\n if (!/^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?$/.test(name)) {\n throw new TypeError(\n `Invalid option name: ${name}, ` +\n `must be '-' delimited ASCII alphanumeric`,\n )\n }\n if (this.#configSet[name]) {\n throw new TypeError(`Cannot redefine option ${field}`)\n }\n if (this.#shorts[name]) {\n throw new TypeError(\n `Cannot redefine option ${name}, already ` +\n `in use for ${this.#shorts[name]}`,\n )\n }\n if (field.short) {\n if (!/^[a-zA-Z0-9]$/.test(field.short)) {\n throw new TypeError(\n `Invalid ${name} short option: ${field.short}, ` +\n 'must be 1 ASCII alphanumeric character',\n )\n }\n if (this.#shorts[field.short]) {\n throw new TypeError(\n `Invalid ${name} short option: ${field.short}, ` +\n `already in use for ${this.#shorts[field.short]}`,\n )\n }\n this.#shorts[field.short] = name\n this.#shorts[name] = name\n }\n }\n\n /**\n * Return the usage banner for the given configuration\n */\n usage(): string {\n if (this.#usage) return this.#usage\n\n let headingLevel = 1\n const ui = cliui({ width })\n const first = this.#fields[0]\n let start = first?.type === 'heading' ? 1 : 0\n if (first?.type === 'heading') {\n ui.div({\n padding: [0, 0, 0, 0],\n text: normalize(first.text),\n })\n }\n ui.div({ padding: [0, 0, 0, 0], text: 'Usage:' })\n if (this.#options.usage) {\n ui.div({\n text: this.#options.usage,\n padding: [0, 0, 0, 2],\n })\n } else {\n const cmd = basename(String(process.argv[1]))\n const shortFlags: string[] = []\n const shorts: string[][] = []\n const flags: string[] = []\n const opts: string[][] = []\n for (const [field, config] of Object.entries(this.#configSet)) {\n if (config.short) {\n if (config.type === 'boolean') shortFlags.push(config.short)\n else shorts.push([config.short, config.hint || field])\n } else {\n if (config.type === 'boolean') flags.push(field)\n else opts.push([field, config.hint || field])\n }\n }\n const sf = shortFlags.length ? ' -' + shortFlags.join('') : ''\n const so = shorts.map(([k, v]) => ` --${k}=<${v}>`).join('')\n const lf = flags.map(k => ` --${k}`).join('')\n const lo = opts.map(([k, v]) => ` --${k}=<${v}>`).join('')\n const usage = `${cmd}${sf}${so}${lf}${lo}`.trim()\n ui.div({\n text: usage,\n padding: [0, 0, 0, 2],\n })\n }\n\n ui.div({ padding: [0, 0, 0, 0], text: '' })\n const maybeDesc = this.#fields[start]\n if (maybeDesc && isDescription(maybeDesc)) {\n const print = normalize(maybeDesc.text, maybeDesc.pre)\n start++\n ui.div({ padding: [0, 0, 0, 0], text: print })\n ui.div({ padding: [0, 0, 0, 0], text: '' })\n }\n\n const { rows, maxWidth } = this.#usageRows(start)\n\n // every heading/description after the first gets indented by 2\n // extra spaces.\n for (const row of rows) {\n if (row.left) {\n // If the row is too long, don't wrap it\n // Bump the right-hand side down a line to make room\n const configIndent = indent(Math.max(headingLevel, 2))\n if (row.left.length > maxWidth - 3) {\n ui.div({ text: row.left, padding: [0, 0, 0, configIndent] })\n ui.div({ text: row.text, padding: [0, 0, 0, maxWidth] })\n } else {\n ui.div(\n {\n text: row.left,\n padding: [0, 1, 0, configIndent],\n width: maxWidth,\n },\n { padding: [0, 0, 0, 0], text: row.text },\n )\n }\n if (row.skipLine) {\n ui.div({ padding: [0, 0, 0, 0], text: '' })\n }\n } else {\n if (isHeading(row)) {\n const { level } = row\n headingLevel = level\n // only h1 and h2 have bottom padding\n // h3-h6 do not\n const b = level <= 2 ? 1 : 0\n ui.div({ ...row, padding: [0, 0, b, indent(level)] })\n } else {\n ui.div({ ...row, padding: [0, 0, 1, indent(headingLevel + 1)] })\n }\n }\n }\n\n return (this.#usage = ui.toString())\n }\n\n /**\n * Return the usage banner markdown for the given configuration\n */\n usageMarkdown(): string {\n if (this.#usageMarkdown) return this.#usageMarkdown\n\n const out: string[] = []\n\n let headingLevel = 1\n const first = this.#fields[0]\n let start = first?.type === 'heading' ? 1 : 0\n if (first?.type === 'heading') {\n out.push(`# ${normalizeOneLine(first.text)}`)\n }\n out.push('Usage:')\n if (this.#options.usage) {\n out.push(normalizeMarkdown(this.#options.usage, true))\n } else {\n const cmd = basename(String(process.argv[1]))\n const shortFlags: string[] = []\n const shorts: string[][] = []\n const flags: string[] = []\n const opts: string[][] = []\n for (const [field, config] of Object.entries(this.#configSet)) {\n if (config.short) {\n if (config.type === 'boolean') shortFlags.push(config.short)\n else shorts.push([config.short, config.hint || field])\n } else {\n if (config.type === 'boolean') flags.push(field)\n else opts.push([field, config.hint || field])\n }\n }\n const sf = shortFlags.length ? ' -' + shortFlags.join('') : ''\n const so = shorts.map(([k, v]) => ` --${k}=<${v}>`).join('')\n const lf = flags.map(k => ` --${k}`).join('')\n const lo = opts.map(([k, v]) => ` --${k}=<${v}>`).join('')\n const usage = `${cmd}${sf}${so}${lf}${lo}`.trim()\n out.push(normalizeMarkdown(usage, true))\n }\n\n const maybeDesc = this.#fields[start]\n if (maybeDesc && isDescription(maybeDesc)) {\n out.push(normalizeMarkdown(maybeDesc.text, maybeDesc.pre))\n start++\n }\n\n const { rows } = this.#usageRows(start)\n\n // heading level in markdown is number of # ahead of text\n for (const row of rows) {\n if (row.left) {\n out.push(\n '#'.repeat(headingLevel + 1) +\n ' ' +\n normalizeOneLine(row.left, true),\n )\n if (row.text) out.push(normalizeMarkdown(row.text))\n } else if (isHeading(row)) {\n const { level } = row\n headingLevel = level\n out.push(\n `${'#'.repeat(headingLevel)} ${normalizeOneLine(\n row.text,\n row.pre,\n )}`,\n )\n } else {\n out.push(normalizeMarkdown(row.text, !!(row as Description).pre))\n }\n }\n\n return (this.#usageMarkdown = out.join('\\n\\n') + '\\n')\n }\n\n #usageRows(start: number) {\n // turn each config type into a row, and figure out the width of the\n // left hand indentation for the option descriptions.\n let maxMax = Math.max(12, Math.min(26, Math.floor(width / 3)))\n let maxWidth = 8\n let prev: Row | TextRow | undefined = undefined\n const rows: (Row | TextRow)[] = []\n for (const field of this.#fields.slice(start)) {\n if (field.type !== 'config') {\n if (prev?.type === 'config') prev.skipLine = true\n prev = undefined\n field.text = normalize(field.text, !!field.pre)\n rows.push(field)\n continue\n }\n const { value } = field\n const desc = value.description || ''\n const mult = value.multiple ? 'Can be set multiple times' : ''\n const opts =\n value.validOptions?.length ?\n `Valid options:${value.validOptions.map(\n v => ` ${JSON.stringify(v)}`,\n )}`\n : ''\n const dmDelim = desc.includes('\\n') ? '\\n\\n' : '\\n'\n const extra = [opts, mult].join(dmDelim).trim()\n const text = (normalize(desc) + dmDelim + extra).trim()\n const hint =\n value.hint ||\n (value.type === 'number' ? 'n'\n : value.type === 'string' ? field.name\n : undefined)\n const short =\n !value.short ? ''\n : value.type === 'boolean' ? `-${value.short} `\n : `-${value.short}<${hint}> `\n const left =\n value.type === 'boolean' ?\n `${short}--${field.name}`\n : `${short}--${field.name}=<${hint}>`\n const row: Row = { text, left, type: 'config' }\n if (text.length > width - maxMax) {\n row.skipLine = true\n }\n if (prev && left.length > maxMax) prev.skipLine = true\n prev = row\n const len = left.length + 4\n if (len > maxWidth && len < maxMax) {\n maxWidth = len\n }\n\n rows.push(row)\n }\n\n return { rows, maxWidth }\n }\n\n /**\n * Return the configuration options as a plain object\n */\n toJSON() {\n return Object.fromEntries(\n Object.entries(this.#configSet).map(([field, def]) => [\n field,\n {\n type: def.type,\n ...(def.multiple ? { multiple: true } : {}),\n ...(def.delim ? { delim: def.delim } : {}),\n ...(def.short ? { short: def.short } : {}),\n ...(def.description ?\n { description: normalize(def.description) }\n : {}),\n ...(def.validate ? { validate: def.validate } : {}),\n ...(def.validOptions ? { validOptions: def.validOptions } : {}),\n ...(def.default !== undefined ? { default: def.default } : {}),\n ...(def.hint ? { hint: def.hint } : {}),\n },\n ]),\n )\n }\n\n /**\n * Custom printer for `util.inspect`\n */\n [inspect.custom](_: number, options: InspectOptions) {\n return `Jack ${inspect(this.toJSON(), options)}`\n }\n}\n\n// Unwrap and un-indent, so we can wrap description\n// strings however makes them look nice in the code.\nconst normalize = (s: string, pre = false) => {\n if (pre)\n // prepend a ZWSP to each line so cliui doesn't strip it.\n return s\n .split('\\n')\n .map(l => `\\u200b${l}`)\n .join('\\n')\n return s\n .split(/^\\s*```\\s*$/gm)\n .map((s, i) => {\n if (i % 2 === 1) {\n if (!s.trim()) {\n return `\\`\\`\\`\\n\\`\\`\\`\\n`\n }\n // outdent the ``` blocks, but preserve whitespace otherwise.\n const split = s.split('\\n')\n // throw out the \\n at the start and end\n split.pop()\n split.shift()\n const si = split.reduce((shortest, l) => {\n /* c8 ignore next */\n const ind = l.match(/^\\s*/)?.[0] ?? ''\n if (ind.length) return Math.min(ind.length, shortest)\n else return shortest\n }, Infinity)\n /* c8 ignore next */\n const i = isFinite(si) ? si : 0\n return (\n '\\n```\\n' +\n split.map(s => `\\u200b${s.substring(i)}`).join('\\n') +\n '\\n```\\n'\n )\n }\n return (\n s\n // remove single line breaks, except for lists\n .replace(/([^\\n])\\n[ \\t]*([^\\n])/g, (_, $1, $2) =>\n !/^[-*]/.test($2) ? `${$1} ${$2}` : `${$1}\\n${$2}`,\n )\n // normalize mid-line whitespace\n .replace(/([^\\n])[ \\t]+([^\\n])/g, '$1 $2')\n // two line breaks are enough\n .replace(/\\n{3,}/g, '\\n\\n')\n // remove any spaces at the start of a line\n .replace(/\\n[ \\t]+/g, '\\n')\n .trim()\n )\n })\n .join('\\n')\n}\n\n// normalize for markdown printing, remove leading spaces on lines\nconst normalizeMarkdown = (s: string, pre: boolean = false): string => {\n const n = normalize(s, pre).replace(/\\\\/g, '\\\\\\\\')\n return pre ?\n `\\`\\`\\`\\n${n.replace(/\\u200b/g, '')}\\n\\`\\`\\``\n : n.replace(/\\n +/g, '\\n').trim()\n}\n\nconst normalizeOneLine = (s: string, pre: boolean = false) => {\n const n = normalize(s, pre)\n .replace(/[\\s\\u200b]+/g, ' ')\n .trim()\n return pre ? `\\`${n}\\`` : n\n}\n\n/**\n * Main entry point. Create and return a {@link Jack} object.\n */\nexport const jack = (options: JackOptions = {}) => new Jack(options)\n"]} \ No newline at end of file diff --git a/node_modules/jackspeak/dist/commonjs/package.json b/node_modules/jackspeak/dist/commonjs/package.json deleted file mode 100644 index 5bbefff..0000000 --- a/node_modules/jackspeak/dist/commonjs/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "commonjs" -} diff --git a/node_modules/jackspeak/dist/commonjs/parse-args-cjs.cjs.map b/node_modules/jackspeak/dist/commonjs/parse-args-cjs.cjs.map deleted file mode 100644 index 0a4a369..0000000 --- a/node_modules/jackspeak/dist/commonjs/parse-args-cjs.cjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"parse-args-cjs.cjs","sourceRoot":"","sources":["../../src/parse-args-cjs.cts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA4B;AAE5B,MAAM,EAAE,GACN,CACE,OAAO,OAAO,KAAK,QAAQ;IAC3B,CAAC,CAAC,OAAO;IACT,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,CACpC,CAAC,CAAC;IACD,OAAO,CAAC,OAAO;IACjB,CAAC,CAAC,QAAQ,CAAA;AACZ,MAAM,GAAG,GAAG,EAAE;KACX,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;KACjB,KAAK,CAAC,GAAG,CAAC;KACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;AAE5B,qBAAqB;AACrB,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAA;AAClC,oBAAoB;AAEpB,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,IAAI,CAAA;AAC5B,qBAAqB;AACrB,IACE,CAAC,EAAE;IACH,KAAK,GAAG,EAAE;IACV,CAAC,KAAK,KAAK,EAAE,IAAI,KAAK,GAAG,EAAE,CAAC;IAC5B,CAAC,KAAK,KAAK,EAAE,IAAI,KAAK,GAAG,EAAE,CAAC,EAC5B,CAAC;IACD,oBAAoB;IACpB,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,SAAS,CAAA;AAC5C,CAAC;AAEY,QAAA,SAAS,GAAG,EAAE,CAAA","sourcesContent":["import * as util from 'util'\n\nconst pv =\n (\n typeof process === 'object' &&\n !!process &&\n typeof process.version === 'string'\n ) ?\n process.version\n : 'v0.0.0'\nconst pvs = pv\n .replace(/^v/, '')\n .split('.')\n .map(s => parseInt(s, 10))\n\n/* c8 ignore start */\nconst [major = 0, minor = 0] = pvs\n/* c8 ignore stop */\n\nlet { parseArgs: pa } = util\n/* c8 ignore start */\nif (\n !pa ||\n major < 16 ||\n (major === 18 && minor < 11) ||\n (major === 16 && minor < 19)\n) {\n /* c8 ignore stop */\n pa = require('@pkgjs/parseargs').parseArgs\n}\n\nexport const parseArgs = pa\n"]} \ No newline at end of file diff --git a/node_modules/jackspeak/dist/commonjs/parse-args-cjs.d.cts.map b/node_modules/jackspeak/dist/commonjs/parse-args-cjs.d.cts.map deleted file mode 100644 index 066287c..0000000 --- a/node_modules/jackspeak/dist/commonjs/parse-args-cjs.d.cts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"parse-args-cjs.d.cts","sourceRoot":"","sources":["../../src/parse-args-cjs.cts"],"names":[],"mappings":";AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AA+B5B,eAAO,MAAM,SAAS,uBAAK,CAAA"} \ No newline at end of file diff --git a/node_modules/jackspeak/dist/commonjs/parse-args.d.ts b/node_modules/jackspeak/dist/commonjs/parse-args.d.ts deleted file mode 100644 index 07f995c..0000000 --- a/node_modules/jackspeak/dist/commonjs/parse-args.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -/// -import * as util from 'util'; -export declare const parseArgs: typeof util.parseArgs; -//# sourceMappingURL=parse-args-cjs.d.cts.map \ No newline at end of file diff --git a/node_modules/jackspeak/dist/commonjs/parse-args.js b/node_modules/jackspeak/dist/commonjs/parse-args.js deleted file mode 100644 index fc918a4..0000000 --- a/node_modules/jackspeak/dist/commonjs/parse-args.js +++ /dev/null @@ -1,50 +0,0 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parseArgs = void 0; -const util = __importStar(require("util")); -const pv = (typeof process === 'object' && - !!process && - typeof process.version === 'string') ? - process.version - : 'v0.0.0'; -const pvs = pv - .replace(/^v/, '') - .split('.') - .map(s => parseInt(s, 10)); -/* c8 ignore start */ -const [major = 0, minor = 0] = pvs; -/* c8 ignore stop */ -let { parseArgs: pa } = util; -/* c8 ignore start */ -if (!pa || - major < 16 || - (major === 18 && minor < 11) || - (major === 16 && minor < 19)) { - /* c8 ignore stop */ - pa = require('@pkgjs/parseargs').parseArgs; -} -exports.parseArgs = pa; -//# sourceMappingURL=parse-args-cjs.cjs.map \ No newline at end of file diff --git a/node_modules/jackspeak/dist/esm/index.d.ts b/node_modules/jackspeak/dist/esm/index.d.ts deleted file mode 100644 index 214a177..0000000 --- a/node_modules/jackspeak/dist/esm/index.d.ts +++ /dev/null @@ -1,315 +0,0 @@ -/// -export type ConfigType = 'number' | 'string' | 'boolean'; -/** - * Given a Jack object, get the typeof its ConfigSet - */ -export type Unwrap = J extends Jack ? C : never; -import { inspect, InspectOptions } from 'node:util'; -/** - * Defines the type of value that is valid, given a config definition's - * {@link ConfigType} and boolean multiple setting - */ -export type ValidValue = [ - T, - M -] extends ['number', true] ? number[] : [T, M] extends ['string', true] ? string[] : [T, M] extends ['boolean', true] ? boolean[] : [T, M] extends ['number', false] ? number : [T, M] extends ['string', false] ? string : [T, M] extends ['boolean', false] ? boolean : [T, M] extends ['string', boolean] ? string | string[] : [T, M] extends ['boolean', boolean] ? boolean | boolean[] : [T, M] extends ['number', boolean] ? number | number[] : [T, M] extends [ConfigType, false] ? string | number | boolean : [T, M] extends [ConfigType, true] ? string[] | number[] | boolean[] : string | number | boolean | string[] | number[] | boolean[]; -/** - * The meta information for a config option definition, when the - * type and multiple values can be inferred by the method being used - */ -export type ConfigOptionMeta = { - default?: undefined | (ValidValue & (O extends number[] | string[] ? M extends false ? O[number] : O[number][] : unknown)); - validOptions?: O; - description?: string; - validate?: ((v: unknown) => v is ValidValue) | ((v: unknown) => boolean); - short?: string | undefined; - type?: T; - hint?: T extends 'boolean' ? never : string; - delim?: M extends true ? string : never; -} & (M extends false ? { - multiple?: false | undefined; -} : M extends true ? { - multiple: true; -} : { - multiple?: boolean; -}); -/** - * A set of {@link ConfigOptionMeta} fields, referenced by their longOption - * string values. - */ -export type ConfigMetaSet = { - [longOption: string]: ConfigOptionMeta; -}; -/** - * Infer {@link ConfigSet} fields from a given {@link ConfigMetaSet} - */ -export type ConfigSetFromMetaSet> = { - [longOption in keyof S]: ConfigOptionBase; -}; -/** - * Fields that can be set on a {@link ConfigOptionBase} or - * {@link ConfigOptionMeta} based on whether or not the field is known to be - * multiple. - */ -export type MultiType = M extends true ? { - multiple: true; - delim?: string | undefined; -} : M extends false ? { - multiple?: false | undefined; - delim?: undefined; -} : { - multiple?: boolean | undefined; - delim?: string | undefined; -}; -/** - * A config field definition, in its full representation. - */ -export type ConfigOptionBase = { - type: T; - short?: string | undefined; - default?: ValidValue | undefined; - description?: string; - hint?: T extends 'boolean' ? undefined : string | undefined; - validate?: (v: unknown) => v is ValidValue; - validOptions?: T extends 'boolean' ? undefined : T extends 'string' ? readonly string[] : T extends 'number' ? readonly number[] : readonly number[] | readonly string[]; -} & MultiType; -export declare const isConfigType: (t: string) => t is ConfigType; -export declare const isConfigOption: (o: any, type: T, multi: M) => o is ConfigOptionBase; -/** - * A set of {@link ConfigOptionBase} objects, referenced by their longOption - * string values. - */ -export type ConfigSet = { - [longOption: string]: ConfigOptionBase; -}; -/** - * The 'values' field returned by {@link Jack#parse} - */ -export type OptionsResults = { - [k in keyof T]?: T[k]['validOptions'] extends (readonly string[] | readonly number[]) ? T[k] extends ConfigOptionBase<'string' | 'number', false> ? T[k]['validOptions'][number] : T[k] extends ConfigOptionBase<'string' | 'number', true> ? T[k]['validOptions'][number][] : never : T[k] extends ConfigOptionBase<'string', false> ? string : T[k] extends ConfigOptionBase<'string', true> ? string[] : T[k] extends ConfigOptionBase<'number', false> ? number : T[k] extends ConfigOptionBase<'number', true> ? number[] : T[k] extends ConfigOptionBase<'boolean', false> ? boolean : T[k] extends ConfigOptionBase<'boolean', true> ? boolean[] : never; -}; -/** - * The object retured by {@link Jack#parse} - */ -export type Parsed = { - values: OptionsResults; - positionals: string[]; -}; -/** - * A row used when generating the {@link Jack#usage} string - */ -export interface Row { - left?: string; - text: string; - skipLine?: boolean; - type?: string; -} -/** - * A heading for a section in the usage, created by the jack.heading() - * method. - * - * First heading is always level 1, subsequent headings default to 2. - * - * The level of the nearest heading level sets the indentation of the - * description that follows. - */ -export interface Heading extends Row { - type: 'heading'; - text: string; - left?: ''; - skipLine?: boolean; - level: number; - pre?: boolean; -} -/** - * An arbitrary blob of text describing some stuff, set by the - * jack.description() method. - * - * Indentation determined by level of the nearest header. - */ -export interface Description extends Row { - type: 'description'; - text: string; - left?: ''; - skipLine?: boolean; - pre?: boolean; -} -/** - * A heading or description row used when generating the {@link Jack#usage} - * string - */ -export type TextRow = Heading | Description; -/** - * Either a {@link TextRow} or a reference to a {@link ConfigOptionBase} - */ -export type UsageField = TextRow | { - type: 'config'; - name: string; - value: ConfigOptionBase; -}; -/** - * Options provided to the {@link Jack} constructor - */ -export interface JackOptions { - /** - * Whether to allow positional arguments - * - * @default true - */ - allowPositionals?: boolean; - /** - * Prefix to use when reading/writing the environment variables - * - * If not specified, environment behavior will not be available. - */ - envPrefix?: string; - /** - * Environment object to read/write. Defaults `process.env`. - * No effect if `envPrefix` is not set. - */ - env?: { - [k: string]: string | undefined; - }; - /** - * A short usage string. If not provided, will be generated from the - * options provided, but that can of course be rather verbose if - * there are a lot of options. - */ - usage?: string; - /** - * Stop parsing flags and opts at the first positional argument. - * This is to support cases like `cmd [flags] [options]`, where - * each subcommand may have different options. This effectively treats - * any positional as a `--` argument. Only relevant if `allowPositionals` - * is true. - * - * To do subcommands, set this option, look at the first positional, and - * parse the remaining positionals as appropriate. - * - * @default false - */ - stopAtPositional?: boolean; - /** - * Conditional `stopAtPositional`. If set to a `(string)=>boolean` function, - * will be called with each positional argument encountered. If the function - * returns true, then parsing will stop at that point. - */ - stopAtPositionalTest?: (arg: string) => boolean; -} -/** - * Class returned by the {@link jack} function and all configuration - * definition methods. This is what gets chained together. - */ -export declare class Jack { - #private; - constructor(options?: JackOptions); - /** - * Set the default value (which will still be overridden by env or cli) - * as if from a parsed config file. The optional `source` param, if - * provided, will be included in error messages if a value is invalid or - * unknown. - */ - setConfigValues(values: OptionsResults, source?: string): this; - /** - * Parse a string of arguments, and return the resulting - * `{ values, positionals }` object. - * - * If an {@link JackOptions#envPrefix} is set, then it will read default - * values from the environment, and write the resulting values back - * to the environment as well. - * - * Environment values always take precedence over any other value, except - * an explicit CLI setting. - */ - parse(args?: string[]): Parsed; - loadEnvDefaults(): void; - applyDefaults(p: Parsed): void; - /** - * Only parse the command line arguments passed in. - * Does not strip off the `node script.js` bits, so it must be just the - * arguments you wish to have parsed. - * Does not read from or write to the environment, or set defaults. - */ - parseRaw(args: string[]): Parsed; - /** - * Validate that any arbitrary object is a valid configuration `values` - * object. Useful when loading config files or other sources. - */ - validate(o: unknown): asserts o is Parsed['values']; - writeEnv(p: Parsed): void; - /** - * Add a heading to the usage output banner - */ - heading(text: string, level?: 1 | 2 | 3 | 4 | 5 | 6, { pre }?: { - pre?: boolean; - }): Jack; - /** - * Add a long-form description to the usage output at this position. - */ - description(text: string, { pre }?: { - pre?: boolean; - }): Jack; - /** - * Add one or more number fields. - */ - num>(fields: F): Jack>; - /** - * Add one or more multiple number fields. - */ - numList>(fields: F): Jack>; - /** - * Add one or more string option fields. - */ - opt>(fields: F): Jack>; - /** - * Add one or more multiple string option fields. - */ - optList>(fields: F): Jack>; - /** - * Add one or more flag fields. - */ - flag>(fields: F): Jack>; - /** - * Add one or more multiple flag fields. - */ - flagList>(fields: F): Jack>; - /** - * Generic field definition method. Similar to flag/flagList/number/etc, - * but you must specify the `type` (and optionally `multiple` and `delim`) - * fields on each one, or Jack won't know how to define them. - */ - addFields(fields: F): Jack; - /** - * Return the usage banner for the given configuration - */ - usage(): string; - /** - * Return the usage banner markdown for the given configuration - */ - usageMarkdown(): string; - /** - * Return the configuration options as a plain object - */ - toJSON(): { - [k: string]: { - hint?: string | undefined; - default?: string | number | boolean | string[] | number[] | boolean[] | undefined; - validOptions?: readonly number[] | readonly string[] | undefined; - validate?: ((v: unknown) => v is string | number | boolean | string[] | number[] | boolean[]) | undefined; - description?: string | undefined; - short?: string | undefined; - delim?: string | undefined; - multiple?: boolean | undefined; - type: ConfigType; - }; - }; - /** - * Custom printer for `util.inspect` - */ - [inspect.custom](_: number, options: InspectOptions): string; -} -/** - * Main entry point. Create and return a {@link Jack} object. - */ -export declare const jack: (options?: JackOptions) => Jack<{}>; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/jackspeak/dist/esm/index.d.ts.map b/node_modules/jackspeak/dist/esm/index.d.ts.map deleted file mode 100644 index faf9ddd..0000000 --- a/node_modules/jackspeak/dist/esm/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAA;AAExD;;GAEG;AACH,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AAE3D,OAAO,EAAE,OAAO,EAAE,cAAc,EAAmB,MAAM,WAAW,CAAA;AA2DpE;;;GAGG;AACH,MAAM,MAAM,UAAU,CACpB,CAAC,SAAS,UAAU,GAAG,UAAU,EACjC,CAAC,SAAS,OAAO,GAAG,OAAO,IAE3B;IAAC,CAAC;IAAE,CAAC;CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,MAAM,EAAE,GACxC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,MAAM,EAAE,GAC1C,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,OAAO,EAAE,GAC5C,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM,GACzC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM,GACzC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,OAAO,GAC3C,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,MAAM,EAAE,GACtD,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,OAAO,GAAG,OAAO,EAAE,GACzD,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,MAAM,EAAE,GACtD,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAC9D,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,EAAE,GACnE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,EAAE,CAAA;AAE/D;;;GAGG;AACH,MAAM,MAAM,gBAAgB,CAC1B,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,OAAO,GAAG,OAAO,EAC3B,CAAC,SACG,SAAS,GACT,CAAC,CAAC,SAAS,SAAS,GAAG,KAAK,GAC1B,CAAC,SAAS,QAAQ,GAAG,SAAS,MAAM,EAAE,GACtC,CAAC,SAAS,QAAQ,GAAG,SAAS,MAAM,EAAE,GACtC,SAAS,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE,CAAC,GACxC,SAAS,GACT,CAAC,CAAC,SAAS,SAAS,GAAG,KAAK,GAC1B,CAAC,SAAS,QAAQ,GAAG,SAAS,MAAM,EAAE,GACtC,CAAC,SAAS,QAAQ,GAAG,SAAS,MAAM,EAAE,GACtC,SAAS,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE,CAAC,IAC1C;IACF,OAAO,CAAC,EACJ,SAAS,GACT,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,GACf,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,GAC5B,CAAC,SAAS,KAAK,GACb,CAAC,CAAC,MAAM,CAAC,GACT,CAAC,CAAC,MAAM,CAAC,EAAE,GACb,OAAO,CAAC,CAAC,CAAA;IACjB,YAAY,CAAC,EAAE,CAAC,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EACL,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GACvC,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,CAAA;IAC7B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,IAAI,CAAC,EAAE,CAAC,CAAA;IACR,IAAI,CAAC,EAAE,CAAC,SAAS,SAAS,GAAG,KAAK,GAAG,MAAM,CAAA;IAC3C,KAAK,CAAC,EAAE,CAAC,SAAS,IAAI,GAAG,MAAM,GAAG,KAAK,CAAA;CACxC,GAAG,CAAC,CAAC,SAAS,KAAK,GAAG;IAAE,QAAQ,CAAC,EAAE,KAAK,GAAG,SAAS,CAAA;CAAE,GACrD,CAAC,SAAS,IAAI,GAAG;IAAE,QAAQ,EAAE,IAAI,CAAA;CAAE,GACnC;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAAA;AAEzB;;;GAGG;AACH,MAAM,MAAM,aAAa,CACvB,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,OAAO,GAAG,OAAO,IACzB;IACF,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;CAC7C,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,CAC9B,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,OAAO,EACjB,CAAC,SAAS,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,IAC3B;KACD,UAAU,IAAI,MAAM,CAAC,GAAG,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC;CAChD,CAAA;AAED;;;;GAIG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,OAAO,IACrC,CAAC,SAAS,IAAI,GACZ;IACE,QAAQ,EAAE,IAAI,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC3B,GACD,CAAC,SAAS,KAAK,GACf;IACE,QAAQ,CAAC,EAAE,KAAK,GAAG,SAAS,CAAA;IAC5B,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB,GACD;IACE,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IAC9B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC3B,CAAA;AAEL;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAC1B,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,OAAO,GAAG,OAAO,IACzB;IACF,IAAI,EAAE,CAAC,CAAA;IACP,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,CAAA;IACtC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,CAAC,SAAS,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAA;IAC3D,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAChD,YAAY,CAAC,EAAE,CAAC,SAAS,SAAS,GAAG,SAAS,GAC5C,CAAC,SAAS,QAAQ,GAAG,SAAS,MAAM,EAAE,GACtC,CAAC,SAAS,QAAQ,GAAG,SAAS,MAAM,EAAE,GACtC,SAAS,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE,CAAA;CACxC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;AAEhB,eAAO,MAAM,YAAY,MAAO,MAAM,oBAEiB,CAAA;AA8CvD,eAAO,MAAM,cAAc,+CACtB,GAAG,QACA,CAAC,SACA,CAAC,gCAcc,CAAA;AAExB;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAA;CACnD,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,SAAS,IAAI;KAC/C,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,SAAS,CAC5C,SAAS,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE,CACtC,GACC,CAAC,CAAC,CAAC,CAAC,SAAS,gBAAgB,CAAC,QAAQ,GAAG,QAAQ,EAAE,KAAK,CAAC,GACvD,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,GAC5B,CAAC,CAAC,CAAC,CAAC,SAAS,gBAAgB,CAAC,QAAQ,GAAG,QAAQ,EAAE,IAAI,CAAC,GACxD,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,EAAE,GAC9B,KAAK,GACP,CAAC,CAAC,CAAC,CAAC,SAAS,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM,GACvD,CAAC,CAAC,CAAC,CAAC,SAAS,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,MAAM,EAAE,GACxD,CAAC,CAAC,CAAC,CAAC,SAAS,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM,GACvD,CAAC,CAAC,CAAC,CAAC,SAAS,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,MAAM,EAAE,GACxD,CAAC,CAAC,CAAC,CAAC,SAAS,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,OAAO,GACzD,CAAC,CAAC,CAAC,CAAC,SAAS,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,OAAO,EAAE,GAC1D,KAAK;CACR,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,SAAS,IAAI;IACxC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,CAAA;IACzB,WAAW,EAAE,MAAM,EAAE,CAAA;CACtB,CAAA;AA0PD;;GAEG;AACH,MAAM,WAAW,GAAG;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,OAAQ,SAAQ,GAAG;IAClC,IAAI,EAAE,SAAS,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,EAAE,CAAA;IACT,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AAID;;;;;GAKG;AACH,MAAM,WAAW,WAAY,SAAQ,GAAG;IACtC,IAAI,EAAE,aAAa,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,EAAE,CAAA;IACT,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AAKD;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,WAAW,CAAA;AAE3C;;GAEG;AACH,MAAM,MAAM,UAAU,GAClB,OAAO,GACP;IACE,IAAI,EAAE,QAAQ,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAA;CACpC,CAAA;AAEL;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAE1B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB;;;OAGG;IACH,GAAG,CAAC,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;KAAE,CAAA;IAEzC;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd;;;;;;;;;;;OAWG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAE1B;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAA;CAChD;AAED;;;GAGG;AACH,qBAAa,IAAI,CAAC,CAAC,SAAS,SAAS,GAAG,EAAE;;gBAW5B,OAAO,GAAE,WAAgB;IAarC;;;;;OAKG;IACH,eAAe,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,SAAK;IA6BtD;;;;;;;;;;OAUG;IACH,KAAK,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG,MAAM,CAAC,CAAC,CAAC;IAQ/C,eAAe;IAYf,aAAa,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAS1B;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;IAmKnC;;;OAGG;IACH,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IA4DtD,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAWrB;;OAEG;IACH,OAAO,CACL,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAC7B,EAAE,GAAW,EAAE,GAAE;QAAE,GAAG,CAAC,EAAE,OAAO,CAAA;KAAO,GACtC,IAAI,CAAC,CAAC,CAAC;IAQV;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,GAAE;QAAE,GAAG,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,IAAI,CAAC,CAAC,CAAC;IAKnE;;OAEG;IACH,GAAG,CAAC,CAAC,SAAS,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,EAC1C,MAAM,EAAE,CAAC,GACR,IAAI,CAAC,CAAC,GAAG,oBAAoB,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAIrD;;OAEG;IACH,OAAO,CAAC,CAAC,SAAS,aAAa,CAAC,QAAQ,CAAC,EACvC,MAAM,EAAE,CAAC,GACR,IAAI,CAAC,CAAC,GAAG,oBAAoB,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAIpD;;OAEG;IACH,GAAG,CAAC,CAAC,SAAS,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,EAC1C,MAAM,EAAE,CAAC,GACR,IAAI,CAAC,CAAC,GAAG,oBAAoB,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAIrD;;OAEG;IACH,OAAO,CAAC,CAAC,SAAS,aAAa,CAAC,QAAQ,CAAC,EACvC,MAAM,EAAE,CAAC,GACR,IAAI,CAAC,CAAC,GAAG,oBAAoB,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAIpD;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,EAC5C,MAAM,EAAE,CAAC,GACR,IAAI,CAAC,CAAC,GAAG,oBAAoB,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAItD;;OAEG;IACH,QAAQ,CAAC,CAAC,SAAS,aAAa,CAAC,SAAS,CAAC,EACzC,MAAM,EAAE,CAAC,GACR,IAAI,CAAC,CAAC,GAAG,oBAAoB,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAIrD;;;;OAIG;IACH,SAAS,CAAC,CAAC,SAAS,SAAS,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IA4EtD;;OAEG;IACH,KAAK,IAAI,MAAM;IAgGf;;OAEG;IACH,aAAa,IAAI,MAAM;IAgIvB;;OAEG;IACH,MAAM;;;;;;;;;;;;;IAqBN;;OAEG;IACH,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc;CAGpD;AAsED;;GAEG;AACH,eAAO,MAAM,IAAI,aAAa,WAAW,aAA2B,CAAA"} \ No newline at end of file diff --git a/node_modules/jackspeak/dist/esm/index.js b/node_modules/jackspeak/dist/esm/index.js deleted file mode 100644 index 78fdfa8..0000000 --- a/node_modules/jackspeak/dist/esm/index.js +++ /dev/null @@ -1,1000 +0,0 @@ -import { inspect } from 'node:util'; -import { parseArgs } from './parse-args.js'; -// it's a tiny API, just cast it inline, it's fine -//@ts-ignore -import cliui from '@isaacs/cliui'; -import { basename } from 'node:path'; -const width = Math.min((process && process.stdout && process.stdout.columns) || 80, 80); -// indentation spaces from heading level -const indent = (n) => (n - 1) * 2; -const toEnvKey = (pref, key) => { - return [pref, key.replace(/[^a-zA-Z0-9]+/g, ' ')] - .join(' ') - .trim() - .toUpperCase() - .replace(/ /g, '_'); -}; -const toEnvVal = (value, delim = '\n') => { - const str = typeof value === 'string' ? value - : typeof value === 'boolean' ? - value ? '1' - : '0' - : typeof value === 'number' ? String(value) - : Array.isArray(value) ? - value.map((v) => toEnvVal(v)).join(delim) - : /* c8 ignore start */ undefined; - if (typeof str !== 'string') { - throw new Error(`could not serialize value to environment: ${JSON.stringify(value)}`); - } - /* c8 ignore stop */ - return str; -}; -const fromEnvVal = (env, type, multiple, delim = '\n') => (multiple ? - env ? env.split(delim).map(v => fromEnvVal(v, type, false)) - : [] - : type === 'string' ? env - : type === 'boolean' ? env === '1' - : +env.trim()); -export const isConfigType = (t) => typeof t === 'string' && - (t === 'string' || t === 'number' || t === 'boolean'); -const undefOrType = (v, t) => v === undefined || typeof v === t; -const undefOrTypeArray = (v, t) => v === undefined || (Array.isArray(v) && v.every(x => typeof x === t)); -const isValidOption = (v, vo) => Array.isArray(v) ? v.every(x => isValidOption(x, vo)) : vo.includes(v); -// print the value type, for error message reporting -const valueType = (v) => typeof v === 'string' ? 'string' - : typeof v === 'boolean' ? 'boolean' - : typeof v === 'number' ? 'number' - : Array.isArray(v) ? - joinTypes([...new Set(v.map(v => valueType(v)))]) + '[]' - : `${v.type}${v.multiple ? '[]' : ''}`; -const joinTypes = (types) => types.length === 1 && typeof types[0] === 'string' ? - types[0] - : `(${types.join('|')})`; -const isValidValue = (v, type, multi) => { - if (multi) { - if (!Array.isArray(v)) - return false; - return !v.some((v) => !isValidValue(v, type, false)); - } - if (Array.isArray(v)) - return false; - return typeof v === type; -}; -export const isConfigOption = (o, type, multi) => !!o && - typeof o === 'object' && - isConfigType(o.type) && - o.type === type && - undefOrType(o.short, 'string') && - undefOrType(o.description, 'string') && - undefOrType(o.hint, 'string') && - undefOrType(o.validate, 'function') && - (o.type === 'boolean' ? - o.validOptions === undefined - : undefOrTypeArray(o.validOptions, o.type)) && - (o.default === undefined || isValidValue(o.default, type, multi)) && - !!o.multiple === multi; -function num(o = {}) { - const { default: def, validate: val, validOptions, ...rest } = o; - if (def !== undefined && !isValidValue(def, 'number', false)) { - throw new TypeError('invalid default value', { - cause: { - found: def, - wanted: 'number', - }, - }); - } - if (!undefOrTypeArray(validOptions, 'number')) { - throw new TypeError('invalid validOptions', { - cause: { - found: validOptions, - wanted: 'number[]', - }, - }); - } - const validate = val ? - val - : undefined; - return { - ...rest, - default: def, - validate, - validOptions, - type: 'number', - multiple: false, - }; -} -function numList(o = {}) { - const { default: def, validate: val, validOptions, ...rest } = o; - if (def !== undefined && !isValidValue(def, 'number', true)) { - throw new TypeError('invalid default value', { - cause: { - found: def, - wanted: 'number[]', - }, - }); - } - if (!undefOrTypeArray(validOptions, 'number')) { - throw new TypeError('invalid validOptions', { - cause: { - found: validOptions, - wanted: 'number[]', - }, - }); - } - const validate = val ? - val - : undefined; - return { - ...rest, - default: def, - validate, - validOptions, - type: 'number', - multiple: true, - }; -} -function opt(o = {}) { - const { default: def, validate: val, validOptions, ...rest } = o; - if (def !== undefined && !isValidValue(def, 'string', false)) { - throw new TypeError('invalid default value', { - cause: { - found: def, - wanted: 'string', - }, - }); - } - if (!undefOrTypeArray(validOptions, 'string')) { - throw new TypeError('invalid validOptions', { - cause: { - found: validOptions, - wanted: 'string[]', - }, - }); - } - const validate = val ? - val - : undefined; - return { - ...rest, - default: def, - validate, - validOptions, - type: 'string', - multiple: false, - }; -} -function optList(o = {}) { - const { default: def, validate: val, validOptions, ...rest } = o; - if (def !== undefined && !isValidValue(def, 'string', true)) { - throw new TypeError('invalid default value', { - cause: { - found: def, - wanted: 'string[]', - }, - }); - } - if (!undefOrTypeArray(validOptions, 'string')) { - throw new TypeError('invalid validOptions', { - cause: { - found: validOptions, - wanted: 'string[]', - }, - }); - } - const validate = val ? - val - : undefined; - return { - ...rest, - default: def, - validate, - validOptions, - type: 'string', - multiple: true, - }; -} -function flag(o = {}) { - const { hint, default: def, validate: val, ...rest } = o; - delete rest.validOptions; - if (def !== undefined && !isValidValue(def, 'boolean', false)) { - throw new TypeError('invalid default value'); - } - const validate = val ? - val - : undefined; - if (hint !== undefined) { - throw new TypeError('cannot provide hint for flag'); - } - return { - ...rest, - default: def, - validate, - type: 'boolean', - multiple: false, - }; -} -function flagList(o = {}) { - const { hint, default: def, validate: val, ...rest } = o; - delete rest.validOptions; - if (def !== undefined && !isValidValue(def, 'boolean', true)) { - throw new TypeError('invalid default value'); - } - const validate = val ? - val - : undefined; - if (hint !== undefined) { - throw new TypeError('cannot provide hint for flag list'); - } - return { - ...rest, - default: def, - validate, - type: 'boolean', - multiple: true, - }; -} -const toParseArgsOptionsConfig = (options) => { - const c = {}; - for (const longOption in options) { - const config = options[longOption]; - /* c8 ignore start */ - if (!config) { - throw new Error('config must be an object: ' + longOption); - } - /* c8 ignore start */ - if (isConfigOption(config, 'number', true)) { - c[longOption] = { - type: 'string', - multiple: true, - default: config.default?.map(c => String(c)), - }; - } - else if (isConfigOption(config, 'number', false)) { - c[longOption] = { - type: 'string', - multiple: false, - default: config.default === undefined ? - undefined - : String(config.default), - }; - } - else { - const conf = config; - c[longOption] = { - type: conf.type, - multiple: !!conf.multiple, - default: conf.default, - }; - } - const clo = c[longOption]; - if (typeof config.short === 'string') { - clo.short = config.short; - } - if (config.type === 'boolean' && - !longOption.startsWith('no-') && - !options[`no-${longOption}`]) { - c[`no-${longOption}`] = { - type: 'boolean', - multiple: config.multiple, - }; - } - } - return c; -}; -const isHeading = (r) => r.type === 'heading'; -const isDescription = (r) => r.type === 'description'; -/** - * Class returned by the {@link jack} function and all configuration - * definition methods. This is what gets chained together. - */ -export class Jack { - #configSet; - #shorts; - #options; - #fields = []; - #env; - #envPrefix; - #allowPositionals; - #usage; - #usageMarkdown; - constructor(options = {}) { - this.#options = options; - this.#allowPositionals = options.allowPositionals !== false; - this.#env = - this.#options.env === undefined ? process.env : this.#options.env; - this.#envPrefix = options.envPrefix; - // We need to fib a little, because it's always the same object, but it - // starts out as having an empty config set. Then each method that adds - // fields returns `this as Jack` - this.#configSet = Object.create(null); - this.#shorts = Object.create(null); - } - /** - * Set the default value (which will still be overridden by env or cli) - * as if from a parsed config file. The optional `source` param, if - * provided, will be included in error messages if a value is invalid or - * unknown. - */ - setConfigValues(values, source = '') { - try { - this.validate(values); - } - catch (er) { - const e = er; - if (source && e && typeof e === 'object') { - if (e.cause && typeof e.cause === 'object') { - Object.assign(e.cause, { path: source }); - } - else { - e.cause = { path: source }; - } - } - throw e; - } - for (const [field, value] of Object.entries(values)) { - const my = this.#configSet[field]; - // already validated, just for TS's benefit - /* c8 ignore start */ - if (!my) { - throw new Error('unexpected field in config set: ' + field, { - cause: { found: field }, - }); - } - /* c8 ignore stop */ - my.default = value; - } - return this; - } - /** - * Parse a string of arguments, and return the resulting - * `{ values, positionals }` object. - * - * If an {@link JackOptions#envPrefix} is set, then it will read default - * values from the environment, and write the resulting values back - * to the environment as well. - * - * Environment values always take precedence over any other value, except - * an explicit CLI setting. - */ - parse(args = process.argv) { - this.loadEnvDefaults(); - const p = this.parseRaw(args); - this.applyDefaults(p); - this.writeEnv(p); - return p; - } - loadEnvDefaults() { - if (this.#envPrefix) { - for (const [field, my] of Object.entries(this.#configSet)) { - const ek = toEnvKey(this.#envPrefix, field); - const env = this.#env[ek]; - if (env !== undefined) { - my.default = fromEnvVal(env, my.type, !!my.multiple, my.delim); - } - } - } - } - applyDefaults(p) { - for (const [field, c] of Object.entries(this.#configSet)) { - if (c.default !== undefined && !(field in p.values)) { - //@ts-ignore - p.values[field] = c.default; - } - } - } - /** - * Only parse the command line arguments passed in. - * Does not strip off the `node script.js` bits, so it must be just the - * arguments you wish to have parsed. - * Does not read from or write to the environment, or set defaults. - */ - parseRaw(args) { - if (args === process.argv) { - args = args.slice(process._eval !== undefined ? 1 : 2); - } - const options = toParseArgsOptionsConfig(this.#configSet); - const result = parseArgs({ - args, - options, - // always strict, but using our own logic - strict: false, - allowPositionals: this.#allowPositionals, - tokens: true, - }); - const p = { - values: {}, - positionals: [], - }; - for (const token of result.tokens) { - if (token.kind === 'positional') { - p.positionals.push(token.value); - if (this.#options.stopAtPositional || - this.#options.stopAtPositionalTest?.(token.value)) { - p.positionals.push(...args.slice(token.index + 1)); - break; - } - } - else if (token.kind === 'option') { - let value = undefined; - if (token.name.startsWith('no-')) { - const my = this.#configSet[token.name]; - const pname = token.name.substring('no-'.length); - const pos = this.#configSet[pname]; - if (pos && - pos.type === 'boolean' && - (!my || - (my.type === 'boolean' && !!my.multiple === !!pos.multiple))) { - value = false; - token.name = pname; - } - } - const my = this.#configSet[token.name]; - if (!my) { - throw new Error(`Unknown option '${token.rawName}'. ` + - `To specify a positional argument starting with a '-', ` + - `place it at the end of the command after '--', as in ` + - `'-- ${token.rawName}'`, { - cause: { - found: token.rawName + (token.value ? `=${token.value}` : ''), - }, - }); - } - if (value === undefined) { - if (token.value === undefined) { - if (my.type !== 'boolean') { - throw new Error(`No value provided for ${token.rawName}, expected ${my.type}`, { - cause: { - name: token.rawName, - wanted: valueType(my), - }, - }); - } - value = true; - } - else { - if (my.type === 'boolean') { - throw new Error(`Flag ${token.rawName} does not take a value, received '${token.value}'`, { cause: { found: token } }); - } - if (my.type === 'string') { - value = token.value; - } - else { - value = +token.value; - if (value !== value) { - throw new Error(`Invalid value '${token.value}' provided for ` + - `'${token.rawName}' option, expected number`, { - cause: { - name: token.rawName, - found: token.value, - wanted: 'number', - }, - }); - } - } - } - } - if (my.multiple) { - const pv = p.values; - const tn = pv[token.name] ?? []; - pv[token.name] = tn; - tn.push(value); - } - else { - const pv = p.values; - pv[token.name] = value; - } - } - } - for (const [field, value] of Object.entries(p.values)) { - const valid = this.#configSet[field]?.validate; - const validOptions = this.#configSet[field]?.validOptions; - let cause; - if (validOptions && !isValidOption(value, validOptions)) { - cause = { name: field, found: value, validOptions: validOptions }; - } - if (valid && !valid(value)) { - cause = cause || { name: field, found: value }; - } - if (cause) { - throw new Error(`Invalid value provided for --${field}: ${JSON.stringify(value)}`, { cause }); - } - } - return p; - } - /** - * do not set fields as 'no-foo' if 'foo' exists and both are bools - * just set foo. - */ - #noNoFields(f, val, s = f) { - if (!f.startsWith('no-') || typeof val !== 'boolean') - return; - const yes = f.substring('no-'.length); - // recurse so we get the core config key we care about. - this.#noNoFields(yes, val, s); - if (this.#configSet[yes]?.type === 'boolean') { - throw new Error(`do not set '${s}', instead set '${yes}' as desired.`, { cause: { found: s, wanted: yes } }); - } - } - /** - * Validate that any arbitrary object is a valid configuration `values` - * object. Useful when loading config files or other sources. - */ - validate(o) { - if (!o || typeof o !== 'object') { - throw new Error('Invalid config: not an object', { - cause: { found: o }, - }); - } - const opts = o; - for (const field in o) { - const value = opts[field]; - /* c8 ignore next - for TS */ - if (value === undefined) - continue; - this.#noNoFields(field, value); - const config = this.#configSet[field]; - if (!config) { - throw new Error(`Unknown config option: ${field}`, { - cause: { found: field }, - }); - } - if (!isValidValue(value, config.type, !!config.multiple)) { - throw new Error(`Invalid value ${valueType(value)} for ${field}, expected ${valueType(config)}`, { - cause: { - name: field, - found: value, - wanted: valueType(config), - }, - }); - } - let cause; - if (config.validOptions && - !isValidOption(value, config.validOptions)) { - cause = { - name: field, - found: value, - validOptions: config.validOptions, - }; - } - if (config.validate && !config.validate(value)) { - cause = cause || { name: field, found: value }; - } - if (cause) { - throw new Error(`Invalid config value for ${field}: ${value}`, { - cause, - }); - } - } - } - writeEnv(p) { - if (!this.#env || !this.#envPrefix) - return; - for (const [field, value] of Object.entries(p.values)) { - const my = this.#configSet[field]; - this.#env[toEnvKey(this.#envPrefix, field)] = toEnvVal(value, my?.delim); - } - } - /** - * Add a heading to the usage output banner - */ - heading(text, level, { pre = false } = {}) { - if (level === undefined) { - level = this.#fields.some(r => isHeading(r)) ? 2 : 1; - } - this.#fields.push({ type: 'heading', text, level, pre }); - return this; - } - /** - * Add a long-form description to the usage output at this position. - */ - description(text, { pre } = {}) { - this.#fields.push({ type: 'description', text, pre }); - return this; - } - /** - * Add one or more number fields. - */ - num(fields) { - return this.#addFields(fields, num); - } - /** - * Add one or more multiple number fields. - */ - numList(fields) { - return this.#addFields(fields, numList); - } - /** - * Add one or more string option fields. - */ - opt(fields) { - return this.#addFields(fields, opt); - } - /** - * Add one or more multiple string option fields. - */ - optList(fields) { - return this.#addFields(fields, optList); - } - /** - * Add one or more flag fields. - */ - flag(fields) { - return this.#addFields(fields, flag); - } - /** - * Add one or more multiple flag fields. - */ - flagList(fields) { - return this.#addFields(fields, flagList); - } - /** - * Generic field definition method. Similar to flag/flagList/number/etc, - * but you must specify the `type` (and optionally `multiple` and `delim`) - * fields on each one, or Jack won't know how to define them. - */ - addFields(fields) { - const next = this; - for (const [name, field] of Object.entries(fields)) { - this.#validateName(name, field); - next.#fields.push({ - type: 'config', - name, - value: field, - }); - } - Object.assign(next.#configSet, fields); - return next; - } - #addFields(fields, fn) { - const next = this; - Object.assign(next.#configSet, Object.fromEntries(Object.entries(fields).map(([name, field]) => { - this.#validateName(name, field); - const option = fn(field); - next.#fields.push({ - type: 'config', - name, - value: option, - }); - return [name, option]; - }))); - return next; - } - #validateName(name, field) { - if (!/^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?$/.test(name)) { - throw new TypeError(`Invalid option name: ${name}, ` + - `must be '-' delimited ASCII alphanumeric`); - } - if (this.#configSet[name]) { - throw new TypeError(`Cannot redefine option ${field}`); - } - if (this.#shorts[name]) { - throw new TypeError(`Cannot redefine option ${name}, already ` + - `in use for ${this.#shorts[name]}`); - } - if (field.short) { - if (!/^[a-zA-Z0-9]$/.test(field.short)) { - throw new TypeError(`Invalid ${name} short option: ${field.short}, ` + - 'must be 1 ASCII alphanumeric character'); - } - if (this.#shorts[field.short]) { - throw new TypeError(`Invalid ${name} short option: ${field.short}, ` + - `already in use for ${this.#shorts[field.short]}`); - } - this.#shorts[field.short] = name; - this.#shorts[name] = name; - } - } - /** - * Return the usage banner for the given configuration - */ - usage() { - if (this.#usage) - return this.#usage; - let headingLevel = 1; - const ui = cliui({ width }); - const first = this.#fields[0]; - let start = first?.type === 'heading' ? 1 : 0; - if (first?.type === 'heading') { - ui.div({ - padding: [0, 0, 0, 0], - text: normalize(first.text), - }); - } - ui.div({ padding: [0, 0, 0, 0], text: 'Usage:' }); - if (this.#options.usage) { - ui.div({ - text: this.#options.usage, - padding: [0, 0, 0, 2], - }); - } - else { - const cmd = basename(String(process.argv[1])); - const shortFlags = []; - const shorts = []; - const flags = []; - const opts = []; - for (const [field, config] of Object.entries(this.#configSet)) { - if (config.short) { - if (config.type === 'boolean') - shortFlags.push(config.short); - else - shorts.push([config.short, config.hint || field]); - } - else { - if (config.type === 'boolean') - flags.push(field); - else - opts.push([field, config.hint || field]); - } - } - const sf = shortFlags.length ? ' -' + shortFlags.join('') : ''; - const so = shorts.map(([k, v]) => ` --${k}=<${v}>`).join(''); - const lf = flags.map(k => ` --${k}`).join(''); - const lo = opts.map(([k, v]) => ` --${k}=<${v}>`).join(''); - const usage = `${cmd}${sf}${so}${lf}${lo}`.trim(); - ui.div({ - text: usage, - padding: [0, 0, 0, 2], - }); - } - ui.div({ padding: [0, 0, 0, 0], text: '' }); - const maybeDesc = this.#fields[start]; - if (maybeDesc && isDescription(maybeDesc)) { - const print = normalize(maybeDesc.text, maybeDesc.pre); - start++; - ui.div({ padding: [0, 0, 0, 0], text: print }); - ui.div({ padding: [0, 0, 0, 0], text: '' }); - } - const { rows, maxWidth } = this.#usageRows(start); - // every heading/description after the first gets indented by 2 - // extra spaces. - for (const row of rows) { - if (row.left) { - // If the row is too long, don't wrap it - // Bump the right-hand side down a line to make room - const configIndent = indent(Math.max(headingLevel, 2)); - if (row.left.length > maxWidth - 3) { - ui.div({ text: row.left, padding: [0, 0, 0, configIndent] }); - ui.div({ text: row.text, padding: [0, 0, 0, maxWidth] }); - } - else { - ui.div({ - text: row.left, - padding: [0, 1, 0, configIndent], - width: maxWidth, - }, { padding: [0, 0, 0, 0], text: row.text }); - } - if (row.skipLine) { - ui.div({ padding: [0, 0, 0, 0], text: '' }); - } - } - else { - if (isHeading(row)) { - const { level } = row; - headingLevel = level; - // only h1 and h2 have bottom padding - // h3-h6 do not - const b = level <= 2 ? 1 : 0; - ui.div({ ...row, padding: [0, 0, b, indent(level)] }); - } - else { - ui.div({ ...row, padding: [0, 0, 1, indent(headingLevel + 1)] }); - } - } - } - return (this.#usage = ui.toString()); - } - /** - * Return the usage banner markdown for the given configuration - */ - usageMarkdown() { - if (this.#usageMarkdown) - return this.#usageMarkdown; - const out = []; - let headingLevel = 1; - const first = this.#fields[0]; - let start = first?.type === 'heading' ? 1 : 0; - if (first?.type === 'heading') { - out.push(`# ${normalizeOneLine(first.text)}`); - } - out.push('Usage:'); - if (this.#options.usage) { - out.push(normalizeMarkdown(this.#options.usage, true)); - } - else { - const cmd = basename(String(process.argv[1])); - const shortFlags = []; - const shorts = []; - const flags = []; - const opts = []; - for (const [field, config] of Object.entries(this.#configSet)) { - if (config.short) { - if (config.type === 'boolean') - shortFlags.push(config.short); - else - shorts.push([config.short, config.hint || field]); - } - else { - if (config.type === 'boolean') - flags.push(field); - else - opts.push([field, config.hint || field]); - } - } - const sf = shortFlags.length ? ' -' + shortFlags.join('') : ''; - const so = shorts.map(([k, v]) => ` --${k}=<${v}>`).join(''); - const lf = flags.map(k => ` --${k}`).join(''); - const lo = opts.map(([k, v]) => ` --${k}=<${v}>`).join(''); - const usage = `${cmd}${sf}${so}${lf}${lo}`.trim(); - out.push(normalizeMarkdown(usage, true)); - } - const maybeDesc = this.#fields[start]; - if (maybeDesc && isDescription(maybeDesc)) { - out.push(normalizeMarkdown(maybeDesc.text, maybeDesc.pre)); - start++; - } - const { rows } = this.#usageRows(start); - // heading level in markdown is number of # ahead of text - for (const row of rows) { - if (row.left) { - out.push('#'.repeat(headingLevel + 1) + - ' ' + - normalizeOneLine(row.left, true)); - if (row.text) - out.push(normalizeMarkdown(row.text)); - } - else if (isHeading(row)) { - const { level } = row; - headingLevel = level; - out.push(`${'#'.repeat(headingLevel)} ${normalizeOneLine(row.text, row.pre)}`); - } - else { - out.push(normalizeMarkdown(row.text, !!row.pre)); - } - } - return (this.#usageMarkdown = out.join('\n\n') + '\n'); - } - #usageRows(start) { - // turn each config type into a row, and figure out the width of the - // left hand indentation for the option descriptions. - let maxMax = Math.max(12, Math.min(26, Math.floor(width / 3))); - let maxWidth = 8; - let prev = undefined; - const rows = []; - for (const field of this.#fields.slice(start)) { - if (field.type !== 'config') { - if (prev?.type === 'config') - prev.skipLine = true; - prev = undefined; - field.text = normalize(field.text, !!field.pre); - rows.push(field); - continue; - } - const { value } = field; - const desc = value.description || ''; - const mult = value.multiple ? 'Can be set multiple times' : ''; - const opts = value.validOptions?.length ? - `Valid options:${value.validOptions.map(v => ` ${JSON.stringify(v)}`)}` - : ''; - const dmDelim = desc.includes('\n') ? '\n\n' : '\n'; - const extra = [opts, mult].join(dmDelim).trim(); - const text = (normalize(desc) + dmDelim + extra).trim(); - const hint = value.hint || - (value.type === 'number' ? 'n' - : value.type === 'string' ? field.name - : undefined); - const short = !value.short ? '' - : value.type === 'boolean' ? `-${value.short} ` - : `-${value.short}<${hint}> `; - const left = value.type === 'boolean' ? - `${short}--${field.name}` - : `${short}--${field.name}=<${hint}>`; - const row = { text, left, type: 'config' }; - if (text.length > width - maxMax) { - row.skipLine = true; - } - if (prev && left.length > maxMax) - prev.skipLine = true; - prev = row; - const len = left.length + 4; - if (len > maxWidth && len < maxMax) { - maxWidth = len; - } - rows.push(row); - } - return { rows, maxWidth }; - } - /** - * Return the configuration options as a plain object - */ - toJSON() { - return Object.fromEntries(Object.entries(this.#configSet).map(([field, def]) => [ - field, - { - type: def.type, - ...(def.multiple ? { multiple: true } : {}), - ...(def.delim ? { delim: def.delim } : {}), - ...(def.short ? { short: def.short } : {}), - ...(def.description ? - { description: normalize(def.description) } - : {}), - ...(def.validate ? { validate: def.validate } : {}), - ...(def.validOptions ? { validOptions: def.validOptions } : {}), - ...(def.default !== undefined ? { default: def.default } : {}), - ...(def.hint ? { hint: def.hint } : {}), - }, - ])); - } - /** - * Custom printer for `util.inspect` - */ - [inspect.custom](_, options) { - return `Jack ${inspect(this.toJSON(), options)}`; - } -} -// Unwrap and un-indent, so we can wrap description -// strings however makes them look nice in the code. -const normalize = (s, pre = false) => { - if (pre) - // prepend a ZWSP to each line so cliui doesn't strip it. - return s - .split('\n') - .map(l => `\u200b${l}`) - .join('\n'); - return s - .split(/^\s*```\s*$/gm) - .map((s, i) => { - if (i % 2 === 1) { - if (!s.trim()) { - return `\`\`\`\n\`\`\`\n`; - } - // outdent the ``` blocks, but preserve whitespace otherwise. - const split = s.split('\n'); - // throw out the \n at the start and end - split.pop(); - split.shift(); - const si = split.reduce((shortest, l) => { - /* c8 ignore next */ - const ind = l.match(/^\s*/)?.[0] ?? ''; - if (ind.length) - return Math.min(ind.length, shortest); - else - return shortest; - }, Infinity); - /* c8 ignore next */ - const i = isFinite(si) ? si : 0; - return ('\n```\n' + - split.map(s => `\u200b${s.substring(i)}`).join('\n') + - '\n```\n'); - } - return (s - // remove single line breaks, except for lists - .replace(/([^\n])\n[ \t]*([^\n])/g, (_, $1, $2) => !/^[-*]/.test($2) ? `${$1} ${$2}` : `${$1}\n${$2}`) - // normalize mid-line whitespace - .replace(/([^\n])[ \t]+([^\n])/g, '$1 $2') - // two line breaks are enough - .replace(/\n{3,}/g, '\n\n') - // remove any spaces at the start of a line - .replace(/\n[ \t]+/g, '\n') - .trim()); - }) - .join('\n'); -}; -// normalize for markdown printing, remove leading spaces on lines -const normalizeMarkdown = (s, pre = false) => { - const n = normalize(s, pre).replace(/\\/g, '\\\\'); - return pre ? - `\`\`\`\n${n.replace(/\u200b/g, '')}\n\`\`\`` - : n.replace(/\n +/g, '\n').trim(); -}; -const normalizeOneLine = (s, pre = false) => { - const n = normalize(s, pre) - .replace(/[\s\u200b]+/g, ' ') - .trim(); - return pre ? `\`${n}\`` : n; -}; -/** - * Main entry point. Create and return a {@link Jack} object. - */ -export const jack = (options = {}) => new Jack(options); -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/jackspeak/dist/esm/index.js.map b/node_modules/jackspeak/dist/esm/index.js.map deleted file mode 100644 index 1ca796a..0000000 --- a/node_modules/jackspeak/dist/esm/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["export type ConfigType = 'number' | 'string' | 'boolean'\n\n/**\n * Given a Jack object, get the typeof its ConfigSet\n */\nexport type Unwrap = J extends Jack ? C : never\n\nimport { inspect, InspectOptions, ParseArgsConfig } from 'node:util'\nimport { parseArgs } from './parse-args.js'\n\n// it's a tiny API, just cast it inline, it's fine\n//@ts-ignore\nimport cliui from '@isaacs/cliui'\nimport { basename } from 'node:path'\n\nconst width = Math.min(\n (process && process.stdout && process.stdout.columns) || 80,\n 80,\n)\n\n// indentation spaces from heading level\nconst indent = (n: number) => (n - 1) * 2\n\nconst toEnvKey = (pref: string, key: string): string => {\n return [pref, key.replace(/[^a-zA-Z0-9]+/g, ' ')]\n .join(' ')\n .trim()\n .toUpperCase()\n .replace(/ /g, '_')\n}\n\nconst toEnvVal = (\n value: string | boolean | number | string[] | boolean[] | number[],\n delim: string = '\\n',\n): string => {\n const str =\n typeof value === 'string' ? value\n : typeof value === 'boolean' ?\n value ? '1'\n : '0'\n : typeof value === 'number' ? String(value)\n : Array.isArray(value) ?\n value.map((v: string | number | boolean) => toEnvVal(v)).join(delim)\n : /* c8 ignore start */ undefined\n if (typeof str !== 'string') {\n throw new Error(\n `could not serialize value to environment: ${JSON.stringify(value)}`,\n )\n }\n /* c8 ignore stop */\n return str\n}\n\nconst fromEnvVal = (\n env: string,\n type: T,\n multiple: M,\n delim: string = '\\n',\n): ValidValue =>\n (multiple ?\n env ? env.split(delim).map(v => fromEnvVal(v, type, false))\n : []\n : type === 'string' ? env\n : type === 'boolean' ? env === '1'\n : +env.trim()) as ValidValue\n\n/**\n * Defines the type of value that is valid, given a config definition's\n * {@link ConfigType} and boolean multiple setting\n */\nexport type ValidValue<\n T extends ConfigType = ConfigType,\n M extends boolean = boolean,\n> =\n [T, M] extends ['number', true] ? number[]\n : [T, M] extends ['string', true] ? string[]\n : [T, M] extends ['boolean', true] ? boolean[]\n : [T, M] extends ['number', false] ? number\n : [T, M] extends ['string', false] ? string\n : [T, M] extends ['boolean', false] ? boolean\n : [T, M] extends ['string', boolean] ? string | string[]\n : [T, M] extends ['boolean', boolean] ? boolean | boolean[]\n : [T, M] extends ['number', boolean] ? number | number[]\n : [T, M] extends [ConfigType, false] ? string | number | boolean\n : [T, M] extends [ConfigType, true] ? string[] | number[] | boolean[]\n : string | number | boolean | string[] | number[] | boolean[]\n\n/**\n * The meta information for a config option definition, when the\n * type and multiple values can be inferred by the method being used\n */\nexport type ConfigOptionMeta<\n T extends ConfigType,\n M extends boolean = boolean,\n O extends\n | undefined\n | (T extends 'boolean' ? never\n : T extends 'string' ? readonly string[]\n : T extends 'number' ? readonly number[]\n : readonly number[] | readonly string[]) =\n | undefined\n | (T extends 'boolean' ? never\n : T extends 'string' ? readonly string[]\n : T extends 'number' ? readonly number[]\n : readonly number[] | readonly string[]),\n> = {\n default?:\n | undefined\n | (ValidValue &\n (O extends number[] | string[] ?\n M extends false ?\n O[number]\n : O[number][]\n : unknown))\n validOptions?: O\n description?: string\n validate?:\n | ((v: unknown) => v is ValidValue)\n | ((v: unknown) => boolean)\n short?: string | undefined\n type?: T\n hint?: T extends 'boolean' ? never : string\n delim?: M extends true ? string : never\n} & (M extends false ? { multiple?: false | undefined }\n: M extends true ? { multiple: true }\n: { multiple?: boolean })\n\n/**\n * A set of {@link ConfigOptionMeta} fields, referenced by their longOption\n * string values.\n */\nexport type ConfigMetaSet<\n T extends ConfigType,\n M extends boolean = boolean,\n> = {\n [longOption: string]: ConfigOptionMeta\n}\n\n/**\n * Infer {@link ConfigSet} fields from a given {@link ConfigMetaSet}\n */\nexport type ConfigSetFromMetaSet<\n T extends ConfigType,\n M extends boolean,\n S extends ConfigMetaSet,\n> = {\n [longOption in keyof S]: ConfigOptionBase\n}\n\n/**\n * Fields that can be set on a {@link ConfigOptionBase} or\n * {@link ConfigOptionMeta} based on whether or not the field is known to be\n * multiple.\n */\nexport type MultiType =\n M extends true ?\n {\n multiple: true\n delim?: string | undefined\n }\n : M extends false ?\n {\n multiple?: false | undefined\n delim?: undefined\n }\n : {\n multiple?: boolean | undefined\n delim?: string | undefined\n }\n\n/**\n * A config field definition, in its full representation.\n */\nexport type ConfigOptionBase<\n T extends ConfigType,\n M extends boolean = boolean,\n> = {\n type: T\n short?: string | undefined\n default?: ValidValue | undefined\n description?: string\n hint?: T extends 'boolean' ? undefined : string | undefined\n validate?: (v: unknown) => v is ValidValue\n validOptions?: T extends 'boolean' ? undefined\n : T extends 'string' ? readonly string[]\n : T extends 'number' ? readonly number[]\n : readonly number[] | readonly string[]\n} & MultiType\n\nexport const isConfigType = (t: string): t is ConfigType =>\n typeof t === 'string' &&\n (t === 'string' || t === 'number' || t === 'boolean')\n\nconst undefOrType = (v: unknown, t: string): boolean =>\n v === undefined || typeof v === t\nconst undefOrTypeArray = (v: unknown, t: string): boolean =>\n v === undefined || (Array.isArray(v) && v.every(x => typeof x === t))\n\nconst isValidOption = (v: unknown, vo: readonly unknown[]): boolean =>\n Array.isArray(v) ? v.every(x => isValidOption(x, vo)) : vo.includes(v)\n\n// print the value type, for error message reporting\nconst valueType = (\n v:\n | string\n | number\n | boolean\n | string[]\n | number[]\n | boolean[]\n | { type: ConfigType; multiple?: boolean },\n): string =>\n typeof v === 'string' ? 'string'\n : typeof v === 'boolean' ? 'boolean'\n : typeof v === 'number' ? 'number'\n : Array.isArray(v) ?\n joinTypes([...new Set(v.map(v => valueType(v)))]) + '[]'\n : `${v.type}${v.multiple ? '[]' : ''}`\n\nconst joinTypes = (types: string[]): string =>\n types.length === 1 && typeof types[0] === 'string' ?\n types[0]\n : `(${types.join('|')})`\n\nconst isValidValue = (\n v: unknown,\n type: T,\n multi: M,\n): v is ValidValue => {\n if (multi) {\n if (!Array.isArray(v)) return false\n return !v.some((v: unknown) => !isValidValue(v, type, false))\n }\n if (Array.isArray(v)) return false\n return typeof v === type\n}\n\nexport const isConfigOption = (\n o: any,\n type: T,\n multi: M,\n): o is ConfigOptionBase =>\n !!o &&\n typeof o === 'object' &&\n isConfigType(o.type) &&\n o.type === type &&\n undefOrType(o.short, 'string') &&\n undefOrType(o.description, 'string') &&\n undefOrType(o.hint, 'string') &&\n undefOrType(o.validate, 'function') &&\n (o.type === 'boolean' ?\n o.validOptions === undefined\n : undefOrTypeArray(o.validOptions, o.type)) &&\n (o.default === undefined || isValidValue(o.default, type, multi)) &&\n !!o.multiple === multi\n\n/**\n * A set of {@link ConfigOptionBase} objects, referenced by their longOption\n * string values.\n */\nexport type ConfigSet = {\n [longOption: string]: ConfigOptionBase\n}\n\n/**\n * The 'values' field returned by {@link Jack#parse}\n */\nexport type OptionsResults = {\n [k in keyof T]?: T[k]['validOptions'] extends (\n readonly string[] | readonly number[]\n ) ?\n T[k] extends ConfigOptionBase<'string' | 'number', false> ?\n T[k]['validOptions'][number]\n : T[k] extends ConfigOptionBase<'string' | 'number', true> ?\n T[k]['validOptions'][number][]\n : never\n : T[k] extends ConfigOptionBase<'string', false> ? string\n : T[k] extends ConfigOptionBase<'string', true> ? string[]\n : T[k] extends ConfigOptionBase<'number', false> ? number\n : T[k] extends ConfigOptionBase<'number', true> ? number[]\n : T[k] extends ConfigOptionBase<'boolean', false> ? boolean\n : T[k] extends ConfigOptionBase<'boolean', true> ? boolean[]\n : never\n}\n\n/**\n * The object retured by {@link Jack#parse}\n */\nexport type Parsed = {\n values: OptionsResults\n positionals: string[]\n}\n\nfunction num(\n o: ConfigOptionMeta<'number', false> = {},\n): ConfigOptionBase<'number', false> {\n const { default: def, validate: val, validOptions, ...rest } = o\n if (def !== undefined && !isValidValue(def, 'number', false)) {\n throw new TypeError('invalid default value', {\n cause: {\n found: def,\n wanted: 'number',\n },\n })\n }\n if (!undefOrTypeArray(validOptions, 'number')) {\n throw new TypeError('invalid validOptions', {\n cause: {\n found: validOptions,\n wanted: 'number[]',\n },\n })\n }\n const validate =\n val ?\n (val as (v: unknown) => v is ValidValue<'number', false>)\n : undefined\n return {\n ...rest,\n default: def,\n validate,\n validOptions,\n type: 'number',\n multiple: false,\n }\n}\n\nfunction numList(\n o: ConfigOptionMeta<'number'> = {},\n): ConfigOptionBase<'number', true> {\n const { default: def, validate: val, validOptions, ...rest } = o\n if (def !== undefined && !isValidValue(def, 'number', true)) {\n throw new TypeError('invalid default value', {\n cause: {\n found: def,\n wanted: 'number[]',\n },\n })\n }\n if (!undefOrTypeArray(validOptions, 'number')) {\n throw new TypeError('invalid validOptions', {\n cause: {\n found: validOptions,\n wanted: 'number[]',\n },\n })\n }\n const validate =\n val ?\n (val as (v: unknown) => v is ValidValue<'number', true>)\n : undefined\n return {\n ...rest,\n default: def,\n validate,\n validOptions,\n type: 'number',\n multiple: true,\n }\n}\n\nfunction opt(\n o: ConfigOptionMeta<'string', false> = {},\n): ConfigOptionBase<'string', false> {\n const { default: def, validate: val, validOptions, ...rest } = o\n if (def !== undefined && !isValidValue(def, 'string', false)) {\n throw new TypeError('invalid default value', {\n cause: {\n found: def,\n wanted: 'string',\n },\n })\n }\n if (!undefOrTypeArray(validOptions, 'string')) {\n throw new TypeError('invalid validOptions', {\n cause: {\n found: validOptions,\n wanted: 'string[]',\n },\n })\n }\n const validate =\n val ?\n (val as (v: unknown) => v is ValidValue<'string', false>)\n : undefined\n return {\n ...rest,\n default: def,\n validate,\n validOptions,\n type: 'string',\n multiple: false,\n }\n}\n\nfunction optList(\n o: ConfigOptionMeta<'string'> = {},\n): ConfigOptionBase<'string', true> {\n const { default: def, validate: val, validOptions, ...rest } = o\n if (def !== undefined && !isValidValue(def, 'string', true)) {\n throw new TypeError('invalid default value', {\n cause: {\n found: def,\n wanted: 'string[]',\n },\n })\n }\n if (!undefOrTypeArray(validOptions, 'string')) {\n throw new TypeError('invalid validOptions', {\n cause: {\n found: validOptions,\n wanted: 'string[]',\n },\n })\n }\n const validate =\n val ?\n (val as (v: unknown) => v is ValidValue<'string', true>)\n : undefined\n return {\n ...rest,\n default: def,\n validate,\n validOptions,\n type: 'string',\n multiple: true,\n }\n}\n\nfunction flag(\n o: ConfigOptionMeta<'boolean', false> = {},\n): ConfigOptionBase<'boolean', false> {\n const {\n hint,\n default: def,\n validate: val,\n ...rest\n } = o as ConfigOptionMeta<'boolean', false>\n delete (rest as ConfigOptionMeta<'string', false>).validOptions\n if (def !== undefined && !isValidValue(def, 'boolean', false)) {\n throw new TypeError('invalid default value')\n }\n const validate =\n val ?\n (val as (v: unknown) => v is ValidValue<'boolean', false>)\n : undefined\n if (hint !== undefined) {\n throw new TypeError('cannot provide hint for flag')\n }\n return {\n ...rest,\n default: def,\n validate,\n type: 'boolean',\n multiple: false,\n }\n}\n\nfunction flagList(\n o: ConfigOptionMeta<'boolean'> = {},\n): ConfigOptionBase<'boolean', true> {\n const {\n hint,\n default: def,\n validate: val,\n ...rest\n } = o as ConfigOptionMeta<'boolean', false>\n delete (rest as ConfigOptionMeta<'string', false>).validOptions\n if (def !== undefined && !isValidValue(def, 'boolean', true)) {\n throw new TypeError('invalid default value')\n }\n const validate =\n val ?\n (val as (v: unknown) => v is ValidValue<'boolean', true>)\n : undefined\n if (hint !== undefined) {\n throw new TypeError('cannot provide hint for flag list')\n }\n return {\n ...rest,\n default: def,\n validate,\n type: 'boolean',\n multiple: true,\n }\n}\nconst toParseArgsOptionsConfig = (\n options: ConfigSet,\n): Exclude => {\n const c: Exclude = {}\n for (const longOption in options) {\n const config = options[longOption]\n /* c8 ignore start */\n if (!config) {\n throw new Error('config must be an object: ' + longOption)\n }\n /* c8 ignore start */\n if (isConfigOption(config, 'number', true)) {\n c[longOption] = {\n type: 'string',\n multiple: true,\n default: config.default?.map(c => String(c)),\n }\n } else if (isConfigOption(config, 'number', false)) {\n c[longOption] = {\n type: 'string',\n multiple: false,\n default:\n config.default === undefined ?\n undefined\n : String(config.default),\n }\n } else {\n const conf = config as\n | ConfigOptionBase<'string'>\n | ConfigOptionBase<'boolean'>\n c[longOption] = {\n type: conf.type,\n multiple: !!conf.multiple,\n default: conf.default,\n }\n }\n const clo = c[longOption] as ConfigOptionBase\n if (typeof config.short === 'string') {\n clo.short = config.short\n }\n\n if (\n config.type === 'boolean' &&\n !longOption.startsWith('no-') &&\n !options[`no-${longOption}`]\n ) {\n c[`no-${longOption}`] = {\n type: 'boolean',\n multiple: config.multiple,\n }\n }\n }\n return c\n}\n\n/**\n * A row used when generating the {@link Jack#usage} string\n */\nexport interface Row {\n left?: string\n text: string\n skipLine?: boolean\n type?: string\n}\n\n/**\n * A heading for a section in the usage, created by the jack.heading()\n * method.\n *\n * First heading is always level 1, subsequent headings default to 2.\n *\n * The level of the nearest heading level sets the indentation of the\n * description that follows.\n */\nexport interface Heading extends Row {\n type: 'heading'\n text: string\n left?: ''\n skipLine?: boolean\n level: number\n pre?: boolean\n}\nconst isHeading = (r: { type?: string }): r is Heading =>\n r.type === 'heading'\n\n/**\n * An arbitrary blob of text describing some stuff, set by the\n * jack.description() method.\n *\n * Indentation determined by level of the nearest header.\n */\nexport interface Description extends Row {\n type: 'description'\n text: string\n left?: ''\n skipLine?: boolean\n pre?: boolean\n}\n\nconst isDescription = (r: { type?: string }): r is Description =>\n r.type === 'description'\n\n/**\n * A heading or description row used when generating the {@link Jack#usage}\n * string\n */\nexport type TextRow = Heading | Description\n\n/**\n * Either a {@link TextRow} or a reference to a {@link ConfigOptionBase}\n */\nexport type UsageField =\n | TextRow\n | {\n type: 'config'\n name: string\n value: ConfigOptionBase\n }\n\n/**\n * Options provided to the {@link Jack} constructor\n */\nexport interface JackOptions {\n /**\n * Whether to allow positional arguments\n *\n * @default true\n */\n allowPositionals?: boolean\n\n /**\n * Prefix to use when reading/writing the environment variables\n *\n * If not specified, environment behavior will not be available.\n */\n envPrefix?: string\n\n /**\n * Environment object to read/write. Defaults `process.env`.\n * No effect if `envPrefix` is not set.\n */\n env?: { [k: string]: string | undefined }\n\n /**\n * A short usage string. If not provided, will be generated from the\n * options provided, but that can of course be rather verbose if\n * there are a lot of options.\n */\n usage?: string\n\n /**\n * Stop parsing flags and opts at the first positional argument.\n * This is to support cases like `cmd [flags] [options]`, where\n * each subcommand may have different options. This effectively treats\n * any positional as a `--` argument. Only relevant if `allowPositionals`\n * is true.\n *\n * To do subcommands, set this option, look at the first positional, and\n * parse the remaining positionals as appropriate.\n *\n * @default false\n */\n stopAtPositional?: boolean\n\n /**\n * Conditional `stopAtPositional`. If set to a `(string)=>boolean` function,\n * will be called with each positional argument encountered. If the function\n * returns true, then parsing will stop at that point.\n */\n stopAtPositionalTest?: (arg: string) => boolean\n}\n\n/**\n * Class returned by the {@link jack} function and all configuration\n * definition methods. This is what gets chained together.\n */\nexport class Jack {\n #configSet: C\n #shorts: { [k: string]: string }\n #options: JackOptions\n #fields: UsageField[] = []\n #env: { [k: string]: string | undefined }\n #envPrefix?: string\n #allowPositionals: boolean\n #usage?: string\n #usageMarkdown?: string\n\n constructor(options: JackOptions = {}) {\n this.#options = options\n this.#allowPositionals = options.allowPositionals !== false\n this.#env =\n this.#options.env === undefined ? process.env : this.#options.env\n this.#envPrefix = options.envPrefix\n // We need to fib a little, because it's always the same object, but it\n // starts out as having an empty config set. Then each method that adds\n // fields returns `this as Jack`\n this.#configSet = Object.create(null) as C\n this.#shorts = Object.create(null)\n }\n\n /**\n * Set the default value (which will still be overridden by env or cli)\n * as if from a parsed config file. The optional `source` param, if\n * provided, will be included in error messages if a value is invalid or\n * unknown.\n */\n setConfigValues(values: OptionsResults, source = '') {\n try {\n this.validate(values)\n } catch (er) {\n const e = er as Error\n if (source && e && typeof e === 'object') {\n if (e.cause && typeof e.cause === 'object') {\n Object.assign(e.cause, { path: source })\n } else {\n e.cause = { path: source }\n }\n }\n throw e\n }\n for (const [field, value] of Object.entries(values)) {\n const my = this.#configSet[field]\n // already validated, just for TS's benefit\n /* c8 ignore start */\n if (!my) {\n throw new Error('unexpected field in config set: ' + field, {\n cause: { found: field },\n })\n }\n /* c8 ignore stop */\n my.default = value\n }\n return this\n }\n\n /**\n * Parse a string of arguments, and return the resulting\n * `{ values, positionals }` object.\n *\n * If an {@link JackOptions#envPrefix} is set, then it will read default\n * values from the environment, and write the resulting values back\n * to the environment as well.\n *\n * Environment values always take precedence over any other value, except\n * an explicit CLI setting.\n */\n parse(args: string[] = process.argv): Parsed {\n this.loadEnvDefaults()\n const p = this.parseRaw(args)\n this.applyDefaults(p)\n this.writeEnv(p)\n return p\n }\n\n loadEnvDefaults() {\n if (this.#envPrefix) {\n for (const [field, my] of Object.entries(this.#configSet)) {\n const ek = toEnvKey(this.#envPrefix, field)\n const env = this.#env[ek]\n if (env !== undefined) {\n my.default = fromEnvVal(env, my.type, !!my.multiple, my.delim)\n }\n }\n }\n }\n\n applyDefaults(p: Parsed) {\n for (const [field, c] of Object.entries(this.#configSet)) {\n if (c.default !== undefined && !(field in p.values)) {\n //@ts-ignore\n p.values[field] = c.default\n }\n }\n }\n\n /**\n * Only parse the command line arguments passed in.\n * Does not strip off the `node script.js` bits, so it must be just the\n * arguments you wish to have parsed.\n * Does not read from or write to the environment, or set defaults.\n */\n parseRaw(args: string[]): Parsed {\n if (args === process.argv) {\n args = args.slice(\n (process as { _eval?: string })._eval !== undefined ? 1 : 2,\n )\n }\n\n const options = toParseArgsOptionsConfig(this.#configSet)\n const result = parseArgs({\n args,\n options,\n // always strict, but using our own logic\n strict: false,\n allowPositionals: this.#allowPositionals,\n tokens: true,\n })\n\n const p: Parsed = {\n values: {},\n positionals: [],\n }\n for (const token of result.tokens) {\n if (token.kind === 'positional') {\n p.positionals.push(token.value)\n if (\n this.#options.stopAtPositional ||\n this.#options.stopAtPositionalTest?.(token.value)\n ) {\n p.positionals.push(...args.slice(token.index + 1))\n break\n }\n } else if (token.kind === 'option') {\n let value: string | number | boolean | undefined = undefined\n if (token.name.startsWith('no-')) {\n const my = this.#configSet[token.name]\n const pname = token.name.substring('no-'.length)\n const pos = this.#configSet[pname]\n if (\n pos &&\n pos.type === 'boolean' &&\n (!my ||\n (my.type === 'boolean' && !!my.multiple === !!pos.multiple))\n ) {\n value = false\n token.name = pname\n }\n }\n const my = this.#configSet[token.name]\n if (!my) {\n throw new Error(\n `Unknown option '${token.rawName}'. ` +\n `To specify a positional argument starting with a '-', ` +\n `place it at the end of the command after '--', as in ` +\n `'-- ${token.rawName}'`,\n {\n cause: {\n found:\n token.rawName + (token.value ? `=${token.value}` : ''),\n },\n },\n )\n }\n if (value === undefined) {\n if (token.value === undefined) {\n if (my.type !== 'boolean') {\n throw new Error(\n `No value provided for ${token.rawName}, expected ${my.type}`,\n {\n cause: {\n name: token.rawName,\n wanted: valueType(my),\n },\n },\n )\n }\n value = true\n } else {\n if (my.type === 'boolean') {\n throw new Error(\n `Flag ${token.rawName} does not take a value, received '${token.value}'`,\n { cause: { found: token } },\n )\n }\n if (my.type === 'string') {\n value = token.value\n } else {\n value = +token.value\n if (value !== value) {\n throw new Error(\n `Invalid value '${token.value}' provided for ` +\n `'${token.rawName}' option, expected number`,\n {\n cause: {\n name: token.rawName,\n found: token.value,\n wanted: 'number',\n },\n },\n )\n }\n }\n }\n }\n if (my.multiple) {\n const pv = p.values as {\n [k: string]: (string | number | boolean)[]\n }\n const tn = pv[token.name] ?? []\n pv[token.name] = tn\n tn.push(value)\n } else {\n const pv = p.values as { [k: string]: string | number | boolean }\n pv[token.name] = value\n }\n }\n }\n\n for (const [field, value] of Object.entries(p.values)) {\n const valid = this.#configSet[field]?.validate\n const validOptions = this.#configSet[field]?.validOptions\n let cause:\n | undefined\n | {\n name: string\n found: unknown\n validOptions?: readonly string[] | readonly number[]\n }\n if (validOptions && !isValidOption(value, validOptions)) {\n cause = { name: field, found: value, validOptions: validOptions }\n }\n if (valid && !valid(value)) {\n cause = cause || { name: field, found: value }\n }\n if (cause) {\n throw new Error(\n `Invalid value provided for --${field}: ${JSON.stringify(\n value,\n )}`,\n { cause },\n )\n }\n }\n\n return p\n }\n\n /**\n * do not set fields as 'no-foo' if 'foo' exists and both are bools\n * just set foo.\n */\n #noNoFields(f: string, val: unknown, s: string = f) {\n if (!f.startsWith('no-') || typeof val !== 'boolean') return\n const yes = f.substring('no-'.length)\n // recurse so we get the core config key we care about.\n this.#noNoFields(yes, val, s)\n if (this.#configSet[yes]?.type === 'boolean') {\n throw new Error(\n `do not set '${s}', instead set '${yes}' as desired.`,\n { cause: { found: s, wanted: yes } },\n )\n }\n }\n\n /**\n * Validate that any arbitrary object is a valid configuration `values`\n * object. Useful when loading config files or other sources.\n */\n validate(o: unknown): asserts o is Parsed['values'] {\n if (!o || typeof o !== 'object') {\n throw new Error('Invalid config: not an object', {\n cause: { found: o },\n })\n }\n const opts = o as Record\n for (const field in o) {\n const value = opts[field]\n /* c8 ignore next - for TS */\n if (value === undefined) continue\n this.#noNoFields(field, value)\n const config = this.#configSet[field]\n if (!config) {\n throw new Error(`Unknown config option: ${field}`, {\n cause: { found: field },\n })\n }\n if (!isValidValue(value, config.type, !!config.multiple)) {\n throw new Error(\n `Invalid value ${valueType(\n value,\n )} for ${field}, expected ${valueType(config)}`,\n {\n cause: {\n name: field,\n found: value,\n wanted: valueType(config),\n },\n },\n )\n }\n let cause:\n | undefined\n | {\n name: string\n found: any\n validOptions?: readonly string[] | readonly number[]\n }\n if (\n config.validOptions &&\n !isValidOption(value, config.validOptions)\n ) {\n cause = {\n name: field,\n found: value,\n validOptions: config.validOptions,\n }\n }\n if (config.validate && !config.validate(value)) {\n cause = cause || { name: field, found: value }\n }\n if (cause) {\n throw new Error(`Invalid config value for ${field}: ${value}`, {\n cause,\n })\n }\n }\n }\n\n writeEnv(p: Parsed) {\n if (!this.#env || !this.#envPrefix) return\n for (const [field, value] of Object.entries(p.values)) {\n const my = this.#configSet[field]\n this.#env[toEnvKey(this.#envPrefix, field)] = toEnvVal(\n value,\n my?.delim,\n )\n }\n }\n\n /**\n * Add a heading to the usage output banner\n */\n heading(\n text: string,\n level?: 1 | 2 | 3 | 4 | 5 | 6,\n { pre = false }: { pre?: boolean } = {},\n ): Jack {\n if (level === undefined) {\n level = this.#fields.some(r => isHeading(r)) ? 2 : 1\n }\n this.#fields.push({ type: 'heading', text, level, pre })\n return this\n }\n\n /**\n * Add a long-form description to the usage output at this position.\n */\n description(text: string, { pre }: { pre?: boolean } = {}): Jack {\n this.#fields.push({ type: 'description', text, pre })\n return this\n }\n\n /**\n * Add one or more number fields.\n */\n num>(\n fields: F,\n ): Jack> {\n return this.#addFields(fields, num)\n }\n\n /**\n * Add one or more multiple number fields.\n */\n numList>(\n fields: F,\n ): Jack> {\n return this.#addFields(fields, numList)\n }\n\n /**\n * Add one or more string option fields.\n */\n opt>(\n fields: F,\n ): Jack> {\n return this.#addFields(fields, opt)\n }\n\n /**\n * Add one or more multiple string option fields.\n */\n optList>(\n fields: F,\n ): Jack> {\n return this.#addFields(fields, optList)\n }\n\n /**\n * Add one or more flag fields.\n */\n flag>(\n fields: F,\n ): Jack> {\n return this.#addFields(fields, flag)\n }\n\n /**\n * Add one or more multiple flag fields.\n */\n flagList>(\n fields: F,\n ): Jack> {\n return this.#addFields(fields, flagList)\n }\n\n /**\n * Generic field definition method. Similar to flag/flagList/number/etc,\n * but you must specify the `type` (and optionally `multiple` and `delim`)\n * fields on each one, or Jack won't know how to define them.\n */\n addFields(fields: F): Jack {\n const next = this as unknown as Jack\n for (const [name, field] of Object.entries(fields)) {\n this.#validateName(name, field)\n next.#fields.push({\n type: 'config',\n name,\n value: field as ConfigOptionBase,\n })\n }\n Object.assign(next.#configSet, fields)\n return next\n }\n\n #addFields<\n T extends ConfigType,\n M extends boolean,\n F extends ConfigMetaSet,\n >(\n fields: F,\n fn: (m: ConfigOptionMeta) => ConfigOptionBase,\n ): Jack> {\n type NextC = C & ConfigSetFromMetaSet\n const next = this as unknown as Jack\n Object.assign(\n next.#configSet,\n Object.fromEntries(\n Object.entries(fields).map(([name, field]) => {\n this.#validateName(name, field)\n const option = fn(field)\n next.#fields.push({\n type: 'config',\n name,\n value: option as ConfigOptionBase,\n })\n return [name, option]\n }),\n ),\n )\n return next\n }\n\n #validateName(name: string, field: { short?: string }) {\n if (!/^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?$/.test(name)) {\n throw new TypeError(\n `Invalid option name: ${name}, ` +\n `must be '-' delimited ASCII alphanumeric`,\n )\n }\n if (this.#configSet[name]) {\n throw new TypeError(`Cannot redefine option ${field}`)\n }\n if (this.#shorts[name]) {\n throw new TypeError(\n `Cannot redefine option ${name}, already ` +\n `in use for ${this.#shorts[name]}`,\n )\n }\n if (field.short) {\n if (!/^[a-zA-Z0-9]$/.test(field.short)) {\n throw new TypeError(\n `Invalid ${name} short option: ${field.short}, ` +\n 'must be 1 ASCII alphanumeric character',\n )\n }\n if (this.#shorts[field.short]) {\n throw new TypeError(\n `Invalid ${name} short option: ${field.short}, ` +\n `already in use for ${this.#shorts[field.short]}`,\n )\n }\n this.#shorts[field.short] = name\n this.#shorts[name] = name\n }\n }\n\n /**\n * Return the usage banner for the given configuration\n */\n usage(): string {\n if (this.#usage) return this.#usage\n\n let headingLevel = 1\n const ui = cliui({ width })\n const first = this.#fields[0]\n let start = first?.type === 'heading' ? 1 : 0\n if (first?.type === 'heading') {\n ui.div({\n padding: [0, 0, 0, 0],\n text: normalize(first.text),\n })\n }\n ui.div({ padding: [0, 0, 0, 0], text: 'Usage:' })\n if (this.#options.usage) {\n ui.div({\n text: this.#options.usage,\n padding: [0, 0, 0, 2],\n })\n } else {\n const cmd = basename(String(process.argv[1]))\n const shortFlags: string[] = []\n const shorts: string[][] = []\n const flags: string[] = []\n const opts: string[][] = []\n for (const [field, config] of Object.entries(this.#configSet)) {\n if (config.short) {\n if (config.type === 'boolean') shortFlags.push(config.short)\n else shorts.push([config.short, config.hint || field])\n } else {\n if (config.type === 'boolean') flags.push(field)\n else opts.push([field, config.hint || field])\n }\n }\n const sf = shortFlags.length ? ' -' + shortFlags.join('') : ''\n const so = shorts.map(([k, v]) => ` --${k}=<${v}>`).join('')\n const lf = flags.map(k => ` --${k}`).join('')\n const lo = opts.map(([k, v]) => ` --${k}=<${v}>`).join('')\n const usage = `${cmd}${sf}${so}${lf}${lo}`.trim()\n ui.div({\n text: usage,\n padding: [0, 0, 0, 2],\n })\n }\n\n ui.div({ padding: [0, 0, 0, 0], text: '' })\n const maybeDesc = this.#fields[start]\n if (maybeDesc && isDescription(maybeDesc)) {\n const print = normalize(maybeDesc.text, maybeDesc.pre)\n start++\n ui.div({ padding: [0, 0, 0, 0], text: print })\n ui.div({ padding: [0, 0, 0, 0], text: '' })\n }\n\n const { rows, maxWidth } = this.#usageRows(start)\n\n // every heading/description after the first gets indented by 2\n // extra spaces.\n for (const row of rows) {\n if (row.left) {\n // If the row is too long, don't wrap it\n // Bump the right-hand side down a line to make room\n const configIndent = indent(Math.max(headingLevel, 2))\n if (row.left.length > maxWidth - 3) {\n ui.div({ text: row.left, padding: [0, 0, 0, configIndent] })\n ui.div({ text: row.text, padding: [0, 0, 0, maxWidth] })\n } else {\n ui.div(\n {\n text: row.left,\n padding: [0, 1, 0, configIndent],\n width: maxWidth,\n },\n { padding: [0, 0, 0, 0], text: row.text },\n )\n }\n if (row.skipLine) {\n ui.div({ padding: [0, 0, 0, 0], text: '' })\n }\n } else {\n if (isHeading(row)) {\n const { level } = row\n headingLevel = level\n // only h1 and h2 have bottom padding\n // h3-h6 do not\n const b = level <= 2 ? 1 : 0\n ui.div({ ...row, padding: [0, 0, b, indent(level)] })\n } else {\n ui.div({ ...row, padding: [0, 0, 1, indent(headingLevel + 1)] })\n }\n }\n }\n\n return (this.#usage = ui.toString())\n }\n\n /**\n * Return the usage banner markdown for the given configuration\n */\n usageMarkdown(): string {\n if (this.#usageMarkdown) return this.#usageMarkdown\n\n const out: string[] = []\n\n let headingLevel = 1\n const first = this.#fields[0]\n let start = first?.type === 'heading' ? 1 : 0\n if (first?.type === 'heading') {\n out.push(`# ${normalizeOneLine(first.text)}`)\n }\n out.push('Usage:')\n if (this.#options.usage) {\n out.push(normalizeMarkdown(this.#options.usage, true))\n } else {\n const cmd = basename(String(process.argv[1]))\n const shortFlags: string[] = []\n const shorts: string[][] = []\n const flags: string[] = []\n const opts: string[][] = []\n for (const [field, config] of Object.entries(this.#configSet)) {\n if (config.short) {\n if (config.type === 'boolean') shortFlags.push(config.short)\n else shorts.push([config.short, config.hint || field])\n } else {\n if (config.type === 'boolean') flags.push(field)\n else opts.push([field, config.hint || field])\n }\n }\n const sf = shortFlags.length ? ' -' + shortFlags.join('') : ''\n const so = shorts.map(([k, v]) => ` --${k}=<${v}>`).join('')\n const lf = flags.map(k => ` --${k}`).join('')\n const lo = opts.map(([k, v]) => ` --${k}=<${v}>`).join('')\n const usage = `${cmd}${sf}${so}${lf}${lo}`.trim()\n out.push(normalizeMarkdown(usage, true))\n }\n\n const maybeDesc = this.#fields[start]\n if (maybeDesc && isDescription(maybeDesc)) {\n out.push(normalizeMarkdown(maybeDesc.text, maybeDesc.pre))\n start++\n }\n\n const { rows } = this.#usageRows(start)\n\n // heading level in markdown is number of # ahead of text\n for (const row of rows) {\n if (row.left) {\n out.push(\n '#'.repeat(headingLevel + 1) +\n ' ' +\n normalizeOneLine(row.left, true),\n )\n if (row.text) out.push(normalizeMarkdown(row.text))\n } else if (isHeading(row)) {\n const { level } = row\n headingLevel = level\n out.push(\n `${'#'.repeat(headingLevel)} ${normalizeOneLine(\n row.text,\n row.pre,\n )}`,\n )\n } else {\n out.push(normalizeMarkdown(row.text, !!(row as Description).pre))\n }\n }\n\n return (this.#usageMarkdown = out.join('\\n\\n') + '\\n')\n }\n\n #usageRows(start: number) {\n // turn each config type into a row, and figure out the width of the\n // left hand indentation for the option descriptions.\n let maxMax = Math.max(12, Math.min(26, Math.floor(width / 3)))\n let maxWidth = 8\n let prev: Row | TextRow | undefined = undefined\n const rows: (Row | TextRow)[] = []\n for (const field of this.#fields.slice(start)) {\n if (field.type !== 'config') {\n if (prev?.type === 'config') prev.skipLine = true\n prev = undefined\n field.text = normalize(field.text, !!field.pre)\n rows.push(field)\n continue\n }\n const { value } = field\n const desc = value.description || ''\n const mult = value.multiple ? 'Can be set multiple times' : ''\n const opts =\n value.validOptions?.length ?\n `Valid options:${value.validOptions.map(\n v => ` ${JSON.stringify(v)}`,\n )}`\n : ''\n const dmDelim = desc.includes('\\n') ? '\\n\\n' : '\\n'\n const extra = [opts, mult].join(dmDelim).trim()\n const text = (normalize(desc) + dmDelim + extra).trim()\n const hint =\n value.hint ||\n (value.type === 'number' ? 'n'\n : value.type === 'string' ? field.name\n : undefined)\n const short =\n !value.short ? ''\n : value.type === 'boolean' ? `-${value.short} `\n : `-${value.short}<${hint}> `\n const left =\n value.type === 'boolean' ?\n `${short}--${field.name}`\n : `${short}--${field.name}=<${hint}>`\n const row: Row = { text, left, type: 'config' }\n if (text.length > width - maxMax) {\n row.skipLine = true\n }\n if (prev && left.length > maxMax) prev.skipLine = true\n prev = row\n const len = left.length + 4\n if (len > maxWidth && len < maxMax) {\n maxWidth = len\n }\n\n rows.push(row)\n }\n\n return { rows, maxWidth }\n }\n\n /**\n * Return the configuration options as a plain object\n */\n toJSON() {\n return Object.fromEntries(\n Object.entries(this.#configSet).map(([field, def]) => [\n field,\n {\n type: def.type,\n ...(def.multiple ? { multiple: true } : {}),\n ...(def.delim ? { delim: def.delim } : {}),\n ...(def.short ? { short: def.short } : {}),\n ...(def.description ?\n { description: normalize(def.description) }\n : {}),\n ...(def.validate ? { validate: def.validate } : {}),\n ...(def.validOptions ? { validOptions: def.validOptions } : {}),\n ...(def.default !== undefined ? { default: def.default } : {}),\n ...(def.hint ? { hint: def.hint } : {}),\n },\n ]),\n )\n }\n\n /**\n * Custom printer for `util.inspect`\n */\n [inspect.custom](_: number, options: InspectOptions) {\n return `Jack ${inspect(this.toJSON(), options)}`\n }\n}\n\n// Unwrap and un-indent, so we can wrap description\n// strings however makes them look nice in the code.\nconst normalize = (s: string, pre = false) => {\n if (pre)\n // prepend a ZWSP to each line so cliui doesn't strip it.\n return s\n .split('\\n')\n .map(l => `\\u200b${l}`)\n .join('\\n')\n return s\n .split(/^\\s*```\\s*$/gm)\n .map((s, i) => {\n if (i % 2 === 1) {\n if (!s.trim()) {\n return `\\`\\`\\`\\n\\`\\`\\`\\n`\n }\n // outdent the ``` blocks, but preserve whitespace otherwise.\n const split = s.split('\\n')\n // throw out the \\n at the start and end\n split.pop()\n split.shift()\n const si = split.reduce((shortest, l) => {\n /* c8 ignore next */\n const ind = l.match(/^\\s*/)?.[0] ?? ''\n if (ind.length) return Math.min(ind.length, shortest)\n else return shortest\n }, Infinity)\n /* c8 ignore next */\n const i = isFinite(si) ? si : 0\n return (\n '\\n```\\n' +\n split.map(s => `\\u200b${s.substring(i)}`).join('\\n') +\n '\\n```\\n'\n )\n }\n return (\n s\n // remove single line breaks, except for lists\n .replace(/([^\\n])\\n[ \\t]*([^\\n])/g, (_, $1, $2) =>\n !/^[-*]/.test($2) ? `${$1} ${$2}` : `${$1}\\n${$2}`,\n )\n // normalize mid-line whitespace\n .replace(/([^\\n])[ \\t]+([^\\n])/g, '$1 $2')\n // two line breaks are enough\n .replace(/\\n{3,}/g, '\\n\\n')\n // remove any spaces at the start of a line\n .replace(/\\n[ \\t]+/g, '\\n')\n .trim()\n )\n })\n .join('\\n')\n}\n\n// normalize for markdown printing, remove leading spaces on lines\nconst normalizeMarkdown = (s: string, pre: boolean = false): string => {\n const n = normalize(s, pre).replace(/\\\\/g, '\\\\\\\\')\n return pre ?\n `\\`\\`\\`\\n${n.replace(/\\u200b/g, '')}\\n\\`\\`\\``\n : n.replace(/\\n +/g, '\\n').trim()\n}\n\nconst normalizeOneLine = (s: string, pre: boolean = false) => {\n const n = normalize(s, pre)\n .replace(/[\\s\\u200b]+/g, ' ')\n .trim()\n return pre ? `\\`${n}\\`` : n\n}\n\n/**\n * Main entry point. Create and return a {@link Jack} object.\n */\nexport const jack = (options: JackOptions = {}) => new Jack(options)\n"]} \ No newline at end of file diff --git a/node_modules/jackspeak/dist/esm/package.json b/node_modules/jackspeak/dist/esm/package.json deleted file mode 100644 index 3dbc1ca..0000000 --- a/node_modules/jackspeak/dist/esm/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "module" -} diff --git a/node_modules/jackspeak/dist/esm/parse-args.d.ts b/node_modules/jackspeak/dist/esm/parse-args.d.ts deleted file mode 100644 index 498d114..0000000 --- a/node_modules/jackspeak/dist/esm/parse-args.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -/// -import * as util from 'util'; -export declare const parseArgs: typeof util.parseArgs; -//# sourceMappingURL=parse-args.d.ts.map \ No newline at end of file diff --git a/node_modules/jackspeak/dist/esm/parse-args.d.ts.map b/node_modules/jackspeak/dist/esm/parse-args.d.ts.map deleted file mode 100644 index d56cb69..0000000 --- a/node_modules/jackspeak/dist/esm/parse-args.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"parse-args.d.ts","sourceRoot":"","sources":["../../src/parse-args.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAoC5B,eAAO,MAAM,SAAS,uBAA6C,CAAA"} \ No newline at end of file diff --git a/node_modules/jackspeak/dist/esm/parse-args.js b/node_modules/jackspeak/dist/esm/parse-args.js deleted file mode 100644 index a4be715..0000000 --- a/node_modules/jackspeak/dist/esm/parse-args.js +++ /dev/null @@ -1,26 +0,0 @@ -import * as util from 'util'; -const pv = (typeof process === 'object' && - !!process && - typeof process.version === 'string') ? - process.version - : 'v0.0.0'; -const pvs = pv - .replace(/^v/, '') - .split('.') - .map(s => parseInt(s, 10)); -/* c8 ignore start */ -const [major = 0, minor = 0] = pvs; -/* c8 ignore stop */ -let { parseArgs: pa, } = util; -/* c8 ignore start - version specific */ -if (!pa || - major < 16 || - (major === 18 && minor < 11) || - (major === 16 && minor < 19)) { - // Ignore because we will clobber it for commonjs - //@ts-ignore - pa = (await import('@pkgjs/parseargs')).parseArgs; -} -/* c8 ignore stop */ -export const parseArgs = pa; -//# sourceMappingURL=parse-args.js.map \ No newline at end of file diff --git a/node_modules/jackspeak/dist/esm/parse-args.js.map b/node_modules/jackspeak/dist/esm/parse-args.js.map deleted file mode 100644 index 48017f0..0000000 --- a/node_modules/jackspeak/dist/esm/parse-args.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"parse-args.js","sourceRoot":"","sources":["../../src/parse-args.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAE5B,MAAM,EAAE,GACN,CACE,OAAO,OAAO,KAAK,QAAQ;IAC3B,CAAC,CAAC,OAAO;IACT,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,CACpC,CAAC,CAAC;IACD,OAAO,CAAC,OAAO;IACjB,CAAC,CAAC,QAAQ,CAAA;AACZ,MAAM,GAAG,GAAG,EAAE;KACX,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;KACjB,KAAK,CAAC,GAAG,CAAC;KACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;AAE5B,qBAAqB;AACrB,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAA;AAClC,oBAAoB;AAEpB,IAAI,EACF,SAAS,EAAE,EAAE,GACd,GAA8D,IAAI,CAAA;AAEnE,wCAAwC;AACxC,IACE,CAAC,EAAE;IACH,KAAK,GAAG,EAAE;IACV,CAAC,KAAK,KAAK,EAAE,IAAI,KAAK,GAAG,EAAE,CAAC;IAC5B,CAAC,KAAK,KAAK,EAAE,IAAI,KAAK,GAAG,EAAE,CAAC,EAC5B,CAAC;IACD,iDAAiD;IACjD,YAAY;IACZ,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAA;AACnD,CAAC;AACD,oBAAoB;AAEpB,MAAM,CAAC,MAAM,SAAS,GAAG,EAA0C,CAAA","sourcesContent":["import * as util from 'util'\n\nconst pv =\n (\n typeof process === 'object' &&\n !!process &&\n typeof process.version === 'string'\n ) ?\n process.version\n : 'v0.0.0'\nconst pvs = pv\n .replace(/^v/, '')\n .split('.')\n .map(s => parseInt(s, 10))\n\n/* c8 ignore start */\nconst [major = 0, minor = 0] = pvs\n/* c8 ignore stop */\n\nlet {\n parseArgs: pa,\n}: typeof import('util') | typeof import('@pkgjs/parseargs') = util\n\n/* c8 ignore start - version specific */\nif (\n !pa ||\n major < 16 ||\n (major === 18 && minor < 11) ||\n (major === 16 && minor < 19)\n) {\n // Ignore because we will clobber it for commonjs\n //@ts-ignore\n pa = (await import('@pkgjs/parseargs')).parseArgs\n}\n/* c8 ignore stop */\n\nexport const parseArgs = pa as (typeof import('util'))['parseArgs']\n"]} \ No newline at end of file diff --git a/node_modules/jackspeak/package.json b/node_modules/jackspeak/package.json deleted file mode 100644 index 51eaabd..0000000 --- a/node_modules/jackspeak/package.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "name": "jackspeak", - "publishConfig": { - "tag": "v3-legacy" - }, - "version": "3.4.3", - "description": "A very strict and proper argument parser.", - "tshy": { - "main": true, - "exports": { - "./package.json": "./package.json", - ".": "./src/index.js" - } - }, - "main": "./dist/commonjs/index.js", - "types": "./dist/commonjs/index.d.ts", - "type": "module", - "exports": { - "./package.json": "./package.json", - ".": { - "import": { - "types": "./dist/esm/index.d.ts", - "default": "./dist/esm/index.js" - }, - "require": { - "types": "./dist/commonjs/index.d.ts", - "default": "./dist/commonjs/index.js" - } - } - }, - "files": [ - "dist" - ], - "scripts": { - "build-examples": "for i in examples/*.js ; do node $i -h > ${i/.js/.txt}; done", - "preversion": "npm test", - "postversion": "npm publish", - "prepublishOnly": "git push origin --follow-tags", - "prepare": "tshy", - "pretest": "npm run prepare", - "presnap": "npm run prepare", - "test": "tap", - "snap": "tap", - "format": "prettier --write . --log-level warn", - "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts" - }, - "license": "BlueOak-1.0.0", - "prettier": { - "experimentalTernaries": true, - "semi": false, - "printWidth": 75, - "tabWidth": 2, - "useTabs": false, - "singleQuote": true, - "jsxSingleQuote": false, - "bracketSameLine": true, - "arrowParens": "avoid", - "endOfLine": "lf" - }, - "devDependencies": { - "@types/node": "^20.7.0", - "@types/pkgjs__parseargs": "^0.10.1", - "prettier": "^3.2.5", - "tap": "^18.8.0", - "tshy": "^1.14.0", - "typedoc": "^0.25.1", - "typescript": "^5.2.2" - }, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/isaacs/jackspeak.git" - }, - "keywords": [ - "argument", - "parser", - "args", - "option", - "flag", - "cli", - "command", - "line", - "parse", - "parsing" - ], - "author": "Isaac Z. Schlueter ", - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } -} diff --git a/node_modules/lilconfig/LICENSE b/node_modules/lilconfig/LICENSE deleted file mode 100644 index fd866f4..0000000 --- a/node_modules/lilconfig/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 Anton Kastritskiy - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/node_modules/lilconfig/package.json b/node_modules/lilconfig/package.json deleted file mode 100644 index b64e55c..0000000 --- a/node_modules/lilconfig/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "lilconfig", - "version": "3.1.3", - "description": "A zero-dependency alternative to cosmiconfig", - "main": "src/index.js", - "types": "src/index.d.ts", - "scripts": { - "test": "NODE_OPTIONS=--experimental-vm-modules ./node_modules/.bin/jest --coverage", - "lint": "biome ci ./src", - "types": "tsc" - }, - "keywords": [ - "cosmiconfig", - "config", - "configuration", - "search" - ], - "files": [ - "src/index.*" - ], - "repository": { - "type": "git", - "url": "https://github.com/antonk52/lilconfig" - }, - "bugs": "https://github.com/antonk52/lilconfig/issues", - "author": "antonk52", - "license": "MIT", - "devDependencies": { - "@biomejs/biome": "^1.6.0", - "@types/jest": "^29.5.12", - "@types/node": "^14.18.63", - "@types/webpack-env": "^1.18.5", - "cosmiconfig": "^8.3.6", - "jest": "^29.7.0", - "typescript": "^5.3.3", - "uvu": "^0.5.6" - }, - "funding": "https://github.com/sponsors/antonk52", - "engines": { - "node": ">=14" - } -} diff --git a/node_modules/lilconfig/readme.md b/node_modules/lilconfig/readme.md deleted file mode 100644 index 99c4262..0000000 --- a/node_modules/lilconfig/readme.md +++ /dev/null @@ -1,98 +0,0 @@ -# Lilconfig ⚙️ -[![npm version](https://badge.fury.io/js/lilconfig.svg)](https://badge.fury.io/js/lilconfig) -[![install size](https://packagephobia.now.sh/badge?p=lilconfig)](https://packagephobia.now.sh/result?p=lilconfig) -[![Coverage Status](https://coveralls.io/repos/github/antonk52/lilconfig/badge.svg)](https://coveralls.io/github/antonk52/lilconfig) - -A zero-dependency alternative to [cosmiconfig](https://www.npmjs.com/package/cosmiconfig) with the same API. - -## Installation - -```sh -npm install lilconfig -``` - -## Usage - -```js -import {lilconfig, lilconfigSync} from 'lilconfig'; - -// all keys are optional -const options = { - stopDir: '/Users/you/some/dir', - searchPlaces: ['package.json', 'myapp.conf.js'], - ignoreEmptySearchPlaces: false -} - -lilconfig( - 'myapp', - options // optional -).search() // Promise - -lilconfigSync( - 'myapp', - options // optional -).load(pathToConfig) // LilconfigResult - -/** - * LilconfigResult - * { - * config: any; // your config - * filepath: string; - * } - */ -``` - -## ESM - -ESM configs can be loaded with **async API only**. Specifically `js` files in projects with `"type": "module"` in `package.json` or `mjs` files. - -## Difference to `cosmiconfig` -Lilconfig does not intend to be 100% compatible with `cosmiconfig` but tries to mimic it where possible. The key difference is **no** support for yaml files out of the box(`lilconfig` attempts to parse files with no extension as JSON instead of YAML). You can still add the support for YAML files by providing a loader, see an [example](#yaml-loader) below. - -### Options difference between the two. - -|cosmiconfig option | lilconfig | -|------------------------|-----------| -|cache | ✅ | -|loaders | ✅ | -|ignoreEmptySearchPlaces | ✅ | -|packageProp | ✅ | -|searchPlaces | ✅ | -|stopDir | ✅ | -|transform | ✅ | - -## Loaders examples - -### Yaml loader - -If you need the YAML support you can provide your own loader - -```js -import {lilconfig} from 'lilconfig'; -import yaml from 'yaml'; - -function loadYaml(filepath, content) { - return yaml.parse(content); -} - -const options = { - loaders: { - '.yaml': loadYaml, - '.yml': loadYaml, - // loader for files with no extension - noExt: loadYaml - } -}; - -lilconfig('myapp', options) - .search() - .then(result => { - result // {config, filepath} - }); -``` - -## Version correlation - -- lilconig v1 → cosmiconfig v6 -- lilconig v2 → cosmiconfig v7 -- lilconig v3 → cosmiconfig v8 diff --git a/node_modules/lilconfig/src/index.d.ts b/node_modules/lilconfig/src/index.d.ts deleted file mode 100644 index fa1146b..0000000 --- a/node_modules/lilconfig/src/index.d.ts +++ /dev/null @@ -1,54 +0,0 @@ -export type LilconfigResult = null | { - filepath: string; - config: any; - isEmpty?: boolean; -}; -interface OptionsBase { - cache?: boolean; - stopDir?: string; - searchPlaces?: string[]; - ignoreEmptySearchPlaces?: boolean; - packageProp?: string | string[]; -} -export type Transform = - | TransformSync - | ((result: LilconfigResult) => Promise); -export type TransformSync = (result: LilconfigResult) => LilconfigResult; -type LoaderResult = any; -export type LoaderSync = (filepath: string, content: string) => LoaderResult; -export type Loader = - | LoaderSync - | ((filepath: string, content: string) => Promise); -export type Loaders = Record; -export type LoadersSync = Record; -export interface Options extends OptionsBase { - loaders?: Loaders; - transform?: Transform; -} -export interface OptionsSync extends OptionsBase { - loaders?: LoadersSync; - transform?: TransformSync; -} -export declare const defaultLoadersSync: LoadersSync; -export declare const defaultLoaders: Loaders; -type ClearCaches = { - clearLoadCache: () => void; - clearSearchCache: () => void; - clearCaches: () => void; -}; -type AsyncSearcher = { - search(searchFrom?: string): Promise; - load(filepath: string): Promise; -} & ClearCaches; -export declare function lilconfig( - name: string, - options?: Partial, -): AsyncSearcher; -type SyncSearcher = { - search(searchFrom?: string): LilconfigResult; - load(filepath: string): LilconfigResult; -} & ClearCaches; -export declare function lilconfigSync( - name: string, - options?: OptionsSync, -): SyncSearcher; diff --git a/node_modules/lilconfig/src/index.js b/node_modules/lilconfig/src/index.js deleted file mode 100644 index af7bf47..0000000 --- a/node_modules/lilconfig/src/index.js +++ /dev/null @@ -1,460 +0,0 @@ -// @ts-check -const path = require('path'); -const fs = require('fs'); -const os = require('os'); -const url = require('url'); - -const fsReadFileAsync = fs.promises.readFile; - -/** @type {(name: string, sync: boolean) => string[]} */ -function getDefaultSearchPlaces(name, sync) { - return [ - 'package.json', - `.${name}rc.json`, - `.${name}rc.js`, - `.${name}rc.cjs`, - ...(sync ? [] : [`.${name}rc.mjs`]), - `.config/${name}rc`, - `.config/${name}rc.json`, - `.config/${name}rc.js`, - `.config/${name}rc.cjs`, - ...(sync ? [] : [`.config/${name}rc.mjs`]), - `${name}.config.js`, - `${name}.config.cjs`, - ...(sync ? [] : [`${name}.config.mjs`]), - ]; -} - -/** - * @type {(p: string) => string} - * - * see #17 - * On *nix, if cwd is not under homedir, - * the last path will be '', ('/build' -> '') - * but it should be '/' actually. - * And on Windows, this will never happen. ('C:\build' -> 'C:') - */ -function parentDir(p) { - return path.dirname(p) || path.sep; -} - -/** @type {import('./index').LoaderSync} */ -const jsonLoader = (_, content) => JSON.parse(content); -// Use plain require in webpack context for dynamic import -const requireFunc = - typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require; -/** @type {import('./index').LoadersSync} */ -const defaultLoadersSync = Object.freeze({ - '.js': requireFunc, - '.json': requireFunc, - '.cjs': requireFunc, - noExt: jsonLoader, -}); -module.exports.defaultLoadersSync = defaultLoadersSync; - -/** @type {import('./index').Loader} */ -const dynamicImport = async id => { - try { - const fileUrl = url.pathToFileURL(id).href; - const mod = await import(/* webpackIgnore: true */ fileUrl); - - return mod.default; - } catch (e) { - try { - return requireFunc(id); - } catch (/** @type {any} */ requireE) { - if ( - requireE.code === 'ERR_REQUIRE_ESM' || - (requireE instanceof SyntaxError && - requireE - .toString() - .includes('Cannot use import statement outside a module')) - ) { - throw e; - } - throw requireE; - } - } -}; - -/** @type {import('./index').Loaders} */ -const defaultLoaders = Object.freeze({ - '.js': dynamicImport, - '.mjs': dynamicImport, - '.cjs': dynamicImport, - '.json': jsonLoader, - noExt: jsonLoader, -}); -module.exports.defaultLoaders = defaultLoaders; - -/** - * @param {string} name - * @param {import('./index').Options | import('./index').OptionsSync} options - * @param {boolean} sync - * @returns {Required} - */ -function getOptions(name, options, sync) { - /** @type {Required} */ - const conf = { - stopDir: os.homedir(), - searchPlaces: getDefaultSearchPlaces(name, sync), - ignoreEmptySearchPlaces: true, - cache: true, - transform: x => x, - packageProp: [name], - ...options, - loaders: { - ...(sync ? defaultLoadersSync : defaultLoaders), - ...options.loaders, - }, - }; - conf.searchPlaces.forEach(place => { - const key = path.extname(place) || 'noExt'; - const loader = conf.loaders[key]; - if (!loader) { - throw new Error(`Missing loader for extension "${place}"`); - } - - if (typeof loader !== 'function') { - throw new Error( - `Loader for extension "${place}" is not a function: Received ${typeof loader}.`, - ); - } - }); - - return conf; -} - -/** @type {(props: string | string[], obj: Record) => unknown} */ -function getPackageProp(props, obj) { - if (typeof props === 'string' && props in obj) return obj[props]; - return ( - (Array.isArray(props) ? props : props.split('.')).reduce( - (acc, prop) => (acc === undefined ? acc : acc[prop]), - obj, - ) || null - ); -} - -/** @param {string} filepath */ -function validateFilePath(filepath) { - if (!filepath) throw new Error('load must pass a non-empty string'); -} - -/** @type {(loader: import('./index').Loader, ext: string) => void} */ -function validateLoader(loader, ext) { - if (!loader) throw new Error(`No loader specified for extension "${ext}"`); - if (typeof loader !== 'function') throw new Error('loader is not a function'); -} - -/** @type {(enableCache: boolean) => (c: Map, filepath: string, res: T) => T} */ -const makeEmplace = enableCache => (c, filepath, res) => { - if (enableCache) c.set(filepath, res); - return res; -}; - -/** @type {import('./index').lilconfig} */ -module.exports.lilconfig = function lilconfig(name, options) { - const { - ignoreEmptySearchPlaces, - loaders, - packageProp, - searchPlaces, - stopDir, - transform, - cache, - } = getOptions(name, options ?? {}, false); - const searchCache = new Map(); - const loadCache = new Map(); - const emplace = makeEmplace(cache); - - return { - async search(searchFrom = process.cwd()) { - /** @type {import('./index').LilconfigResult} */ - const result = { - config: null, - filepath: '', - }; - - /** @type {Set} */ - const visited = new Set(); - let dir = searchFrom; - dirLoop: while (true) { - if (cache) { - const r = searchCache.get(dir); - if (r !== undefined) { - for (const p of visited) searchCache.set(p, r); - return r; - } - visited.add(dir); - } - - for (const searchPlace of searchPlaces) { - const filepath = path.join(dir, searchPlace); - try { - await fs.promises.access(filepath); - } catch { - continue; - } - const content = String(await fsReadFileAsync(filepath)); - const loaderKey = path.extname(searchPlace) || 'noExt'; - const loader = loaders[loaderKey]; - - // handle package.json - if (searchPlace === 'package.json') { - const pkg = await loader(filepath, content); - const maybeConfig = getPackageProp(packageProp, pkg); - if (maybeConfig != null) { - result.config = maybeConfig; - result.filepath = filepath; - break dirLoop; - } - - continue; - } - - // handle other type of configs - const isEmpty = content.trim() === ''; - if (isEmpty && ignoreEmptySearchPlaces) continue; - - if (isEmpty) { - result.isEmpty = true; - result.config = undefined; - } else { - validateLoader(loader, loaderKey); - result.config = await loader(filepath, content); - } - result.filepath = filepath; - break dirLoop; - } - if (dir === stopDir || dir === parentDir(dir)) break dirLoop; - dir = parentDir(dir); - } - - const transformed = - // not found - result.filepath === '' && result.config === null - ? transform(null) - : transform(result); - - if (cache) { - for (const p of visited) searchCache.set(p, transformed); - } - - return transformed; - }, - async load(filepath) { - validateFilePath(filepath); - const absPath = path.resolve(process.cwd(), filepath); - if (cache && loadCache.has(absPath)) { - return loadCache.get(absPath); - } - const {base, ext} = path.parse(absPath); - const loaderKey = ext || 'noExt'; - const loader = loaders[loaderKey]; - validateLoader(loader, loaderKey); - const content = String(await fsReadFileAsync(absPath)); - - if (base === 'package.json') { - const pkg = await loader(absPath, content); - return emplace( - loadCache, - absPath, - transform({ - config: getPackageProp(packageProp, pkg), - filepath: absPath, - }), - ); - } - /** @type {import('./index').LilconfigResult} */ - const result = { - config: null, - filepath: absPath, - }; - // handle other type of configs - const isEmpty = content.trim() === ''; - if (isEmpty && ignoreEmptySearchPlaces) - return emplace( - loadCache, - absPath, - transform({ - config: undefined, - filepath: absPath, - isEmpty: true, - }), - ); - - // cosmiconfig returns undefined for empty files - result.config = isEmpty ? undefined : await loader(absPath, content); - - return emplace( - loadCache, - absPath, - transform(isEmpty ? {...result, isEmpty, config: undefined} : result), - ); - }, - clearLoadCache() { - if (cache) loadCache.clear(); - }, - clearSearchCache() { - if (cache) searchCache.clear(); - }, - clearCaches() { - if (cache) { - loadCache.clear(); - searchCache.clear(); - } - }, - }; -}; - -/** @type {import('./index').lilconfigSync} */ -module.exports.lilconfigSync = function lilconfigSync(name, options) { - const { - ignoreEmptySearchPlaces, - loaders, - packageProp, - searchPlaces, - stopDir, - transform, - cache, - } = getOptions(name, options ?? {}, true); - const searchCache = new Map(); - const loadCache = new Map(); - const emplace = makeEmplace(cache); - - return { - search(searchFrom = process.cwd()) { - /** @type {import('./index').LilconfigResult} */ - const result = { - config: null, - filepath: '', - }; - - /** @type {Set} */ - const visited = new Set(); - let dir = searchFrom; - dirLoop: while (true) { - if (cache) { - const r = searchCache.get(dir); - if (r !== undefined) { - for (const p of visited) searchCache.set(p, r); - return r; - } - visited.add(dir); - } - - for (const searchPlace of searchPlaces) { - const filepath = path.join(dir, searchPlace); - try { - fs.accessSync(filepath); - } catch { - continue; - } - const loaderKey = path.extname(searchPlace) || 'noExt'; - const loader = loaders[loaderKey]; - const content = String(fs.readFileSync(filepath)); - - // handle package.json - if (searchPlace === 'package.json') { - const pkg = loader(filepath, content); - const maybeConfig = getPackageProp(packageProp, pkg); - if (maybeConfig != null) { - result.config = maybeConfig; - result.filepath = filepath; - break dirLoop; - } - - continue; - } - - // handle other type of configs - const isEmpty = content.trim() === ''; - if (isEmpty && ignoreEmptySearchPlaces) continue; - - if (isEmpty) { - result.isEmpty = true; - result.config = undefined; - } else { - validateLoader(loader, loaderKey); - result.config = loader(filepath, content); - } - result.filepath = filepath; - break dirLoop; - } - if (dir === stopDir || dir === parentDir(dir)) break dirLoop; - dir = parentDir(dir); - } - - const transformed = - // not found - result.filepath === '' && result.config === null - ? transform(null) - : transform(result); - - if (cache) { - for (const p of visited) searchCache.set(p, transformed); - } - - return transformed; - }, - load(filepath) { - validateFilePath(filepath); - const absPath = path.resolve(process.cwd(), filepath); - if (cache && loadCache.has(absPath)) { - return loadCache.get(absPath); - } - const {base, ext} = path.parse(absPath); - const loaderKey = ext || 'noExt'; - const loader = loaders[loaderKey]; - validateLoader(loader, loaderKey); - - const content = String(fs.readFileSync(absPath)); - - if (base === 'package.json') { - const pkg = loader(absPath, content); - return transform({ - config: getPackageProp(packageProp, pkg), - filepath: absPath, - }); - } - const result = { - config: null, - filepath: absPath, - }; - // handle other type of configs - const isEmpty = content.trim() === ''; - if (isEmpty && ignoreEmptySearchPlaces) - return emplace( - loadCache, - absPath, - transform({ - filepath: absPath, - config: undefined, - isEmpty: true, - }), - ); - - // cosmiconfig returns undefined for empty files - result.config = isEmpty ? undefined : loader(absPath, content); - - return emplace( - loadCache, - absPath, - transform(isEmpty ? {...result, isEmpty, config: undefined} : result), - ); - }, - clearLoadCache() { - if (cache) loadCache.clear(); - }, - clearSearchCache() { - if (cache) searchCache.clear(); - }, - clearCaches() { - if (cache) { - loadCache.clear(); - searchCache.clear(); - } - }, - }; -}; diff --git a/node_modules/lines-and-columns/LICENSE b/node_modules/lines-and-columns/LICENSE deleted file mode 100644 index 12978ec..0000000 --- a/node_modules/lines-and-columns/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 Brian Donovan - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/node_modules/lines-and-columns/README.md b/node_modules/lines-and-columns/README.md deleted file mode 100644 index fa90223..0000000 --- a/node_modules/lines-and-columns/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# lines-and-columns - -Maps lines and columns to character offsets and back. This is useful for parsers -and other text processors that deal in character ranges but process text with -meaningful lines and columns. - -## Install - -``` -$ npm install [--save] lines-and-columns -``` - -## Usage - -```js -import { LinesAndColumns } from 'lines-and-columns' - -const lines = new LinesAndColumns( - `table { - border: 0 -}` -) - -lines.locationForIndex(9) -// { line: 1, column: 1 } - -lines.indexForLocation({ line: 1, column: 2 }) -// 10 -``` - -## License - -MIT diff --git a/node_modules/lines-and-columns/build/index.d.ts b/node_modules/lines-and-columns/build/index.d.ts deleted file mode 100644 index 459bc1f..0000000 --- a/node_modules/lines-and-columns/build/index.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -export declare type SourceLocation = { - line: number; - column: number; -}; -export declare class LinesAndColumns { - private string; - private offsets; - constructor(string: string); - locationForIndex(index: number): SourceLocation | null; - indexForLocation(location: SourceLocation): number | null; - private lengthOfLine; -} -export default LinesAndColumns; diff --git a/node_modules/lines-and-columns/build/index.js b/node_modules/lines-and-columns/build/index.js deleted file mode 100644 index 5117cad..0000000 --- a/node_modules/lines-and-columns/build/index.js +++ /dev/null @@ -1,62 +0,0 @@ -"use strict"; -exports.__esModule = true; -exports.LinesAndColumns = void 0; -var LF = '\n'; -var CR = '\r'; -var LinesAndColumns = /** @class */ (function () { - function LinesAndColumns(string) { - this.string = string; - var offsets = [0]; - for (var offset = 0; offset < string.length;) { - switch (string[offset]) { - case LF: - offset += LF.length; - offsets.push(offset); - break; - case CR: - offset += CR.length; - if (string[offset] === LF) { - offset += LF.length; - } - offsets.push(offset); - break; - default: - offset++; - break; - } - } - this.offsets = offsets; - } - LinesAndColumns.prototype.locationForIndex = function (index) { - if (index < 0 || index > this.string.length) { - return null; - } - var line = 0; - var offsets = this.offsets; - while (offsets[line + 1] <= index) { - line++; - } - var column = index - offsets[line]; - return { line: line, column: column }; - }; - LinesAndColumns.prototype.indexForLocation = function (location) { - var line = location.line, column = location.column; - if (line < 0 || line >= this.offsets.length) { - return null; - } - if (column < 0 || column > this.lengthOfLine(line)) { - return null; - } - return this.offsets[line] + column; - }; - LinesAndColumns.prototype.lengthOfLine = function (line) { - var offset = this.offsets[line]; - var nextOffset = line === this.offsets.length - 1 - ? this.string.length - : this.offsets[line + 1]; - return nextOffset - offset; - }; - return LinesAndColumns; -}()); -exports.LinesAndColumns = LinesAndColumns; -exports["default"] = LinesAndColumns; diff --git a/node_modules/lines-and-columns/package.json b/node_modules/lines-and-columns/package.json deleted file mode 100644 index a12eb6b..0000000 --- a/node_modules/lines-and-columns/package.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "lines-and-columns", - "version": "1.2.4", - "description": "Maps lines and columns to character offsets and back.", - "keywords": [ - "lines", - "columns", - "parser" - ], - "homepage": "https://github.com/eventualbuddha/lines-and-columns#readme", - "bugs": { - "url": "https://github.com/eventualbuddha/lines-and-columns/issues" - }, - "repository": { - "type": "git", - "url": "https://github.com/eventualbuddha/lines-and-columns.git" - }, - "license": "MIT", - "author": "Brian Donovan ", - "main": "./build/index.js", - "types": "./build/index.d.ts", - "files": [ - "build" - ], - "scripts": { - "build:watch": "tsc --build tsconfig.build.json --watch", - "lint": "eslint .", - "lint:fix": "eslint . --fix", - "test": "is-ci test:coverage test:watch", - "test:coverage": "jest --coverage", - "test:watch": "jest --watch" - }, - "devDependencies": { - "@types/jest": "^27.0.3", - "@types/node": "^16.11.9", - "@typescript-eslint/eslint-plugin": "^5.4.0", - "@typescript-eslint/parser": "^5.4.0", - "esbuild": "^0.13.15", - "esbuild-runner": "^2.2.1", - "eslint": "^8.2.0", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-prettier": "^4.0.0", - "is-ci-cli": "^2.2.0", - "jest": "^27.3.1", - "prettier": "^2.4.1", - "semantic-release": "^18.0.0", - "typescript": "^4.5.2" - } -} diff --git a/node_modules/locate-path/index.d.ts b/node_modules/locate-path/index.d.ts deleted file mode 100644 index fbde526..0000000 --- a/node_modules/locate-path/index.d.ts +++ /dev/null @@ -1,83 +0,0 @@ -declare namespace locatePath { - interface Options { - /** - Current working directory. - - @default process.cwd() - */ - readonly cwd?: string; - - /** - Type of path to match. - - @default 'file' - */ - readonly type?: 'file' | 'directory'; - - /** - Allow symbolic links to match if they point to the requested path type. - - @default true - */ - readonly allowSymlinks?: boolean; - } - - interface AsyncOptions extends Options { - /** - Number of concurrently pending promises. Minimum: `1`. - - @default Infinity - */ - readonly concurrency?: number; - - /** - Preserve `paths` order when searching. - - Disable this to improve performance if you don't care about the order. - - @default true - */ - readonly preserveOrder?: boolean; - } -} - -declare const locatePath: { - /** - Get the first path that exists on disk of multiple paths. - - @param paths - Paths to check. - @returns The first path that exists or `undefined` if none exists. - - @example - ``` - import locatePath = require('locate-path'); - - const files = [ - 'unicorn.png', - 'rainbow.png', // Only this one actually exists on disk - 'pony.png' - ]; - - (async () => { - console(await locatePath(files)); - //=> 'rainbow' - })(); - ``` - */ - (paths: Iterable, options?: locatePath.AsyncOptions): Promise< - string | undefined - >; - - /** - Synchronously get the first path that exists on disk of multiple paths. - - @param paths - Paths to check. - @returns The first path that exists or `undefined` if none exists. - */ - sync( - paths: Iterable, - options?: locatePath.Options - ): string | undefined; -}; - -export = locatePath; diff --git a/node_modules/locate-path/index.js b/node_modules/locate-path/index.js deleted file mode 100644 index 4604bbf..0000000 --- a/node_modules/locate-path/index.js +++ /dev/null @@ -1,65 +0,0 @@ -'use strict'; -const path = require('path'); -const fs = require('fs'); -const {promisify} = require('util'); -const pLocate = require('p-locate'); - -const fsStat = promisify(fs.stat); -const fsLStat = promisify(fs.lstat); - -const typeMappings = { - directory: 'isDirectory', - file: 'isFile' -}; - -function checkType({type}) { - if (type in typeMappings) { - return; - } - - throw new Error(`Invalid type specified: ${type}`); -} - -const matchType = (type, stat) => type === undefined || stat[typeMappings[type]](); - -module.exports = async (paths, options) => { - options = { - cwd: process.cwd(), - type: 'file', - allowSymlinks: true, - ...options - }; - checkType(options); - const statFn = options.allowSymlinks ? fsStat : fsLStat; - - return pLocate(paths, async path_ => { - try { - const stat = await statFn(path.resolve(options.cwd, path_)); - return matchType(options.type, stat); - } catch (_) { - return false; - } - }, options); -}; - -module.exports.sync = (paths, options) => { - options = { - cwd: process.cwd(), - allowSymlinks: true, - type: 'file', - ...options - }; - checkType(options); - const statFn = options.allowSymlinks ? fs.statSync : fs.lstatSync; - - for (const path_ of paths) { - try { - const stat = statFn(path.resolve(options.cwd, path_)); - - if (matchType(options.type, stat)) { - return path_; - } - } catch (_) { - } - } -}; diff --git a/node_modules/locate-path/license b/node_modules/locate-path/license deleted file mode 100644 index e7af2f7..0000000 --- a/node_modules/locate-path/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/locate-path/package.json b/node_modules/locate-path/package.json deleted file mode 100644 index 063b290..0000000 --- a/node_modules/locate-path/package.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "locate-path", - "version": "5.0.0", - "description": "Get the first path that exists on disk of multiple paths", - "license": "MIT", - "repository": "sindresorhus/locate-path", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=8" - }, - "scripts": { - "test": "xo && ava && tsd" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "locate", - "path", - "paths", - "file", - "files", - "exists", - "find", - "finder", - "search", - "searcher", - "array", - "iterable", - "iterator" - ], - "dependencies": { - "p-locate": "^4.1.0" - }, - "devDependencies": { - "ava": "^1.4.1", - "tsd": "^0.7.2", - "xo": "^0.24.0" - } -} diff --git a/node_modules/locate-path/readme.md b/node_modules/locate-path/readme.md deleted file mode 100644 index 2184c6f..0000000 --- a/node_modules/locate-path/readme.md +++ /dev/null @@ -1,122 +0,0 @@ -# locate-path [![Build Status](https://travis-ci.org/sindresorhus/locate-path.svg?branch=master)](https://travis-ci.org/sindresorhus/locate-path) - -> Get the first path that exists on disk of multiple paths - - -## Install - -``` -$ npm install locate-path -``` - - -## Usage - -Here we find the first file that exists on disk, in array order. - -```js -const locatePath = require('locate-path'); - -const files = [ - 'unicorn.png', - 'rainbow.png', // Only this one actually exists on disk - 'pony.png' -]; - -(async () => { - console(await locatePath(files)); - //=> 'rainbow' -})(); -``` - - -## API - -### locatePath(paths, [options]) - -Returns a `Promise` for the first path that exists or `undefined` if none exists. - -#### paths - -Type: `Iterable` - -Paths to check. - -#### options - -Type: `Object` - -##### concurrency - -Type: `number`
    -Default: `Infinity`
    -Minimum: `1` - -Number of concurrently pending promises. - -##### preserveOrder - -Type: `boolean`
    -Default: `true` - -Preserve `paths` order when searching. - -Disable this to improve performance if you don't care about the order. - -##### cwd - -Type: `string`
    -Default: `process.cwd()` - -Current working directory. - -##### type - -Type: `string`
    -Default: `file`
    -Values: `file` `directory` - -The type of paths that can match. - -##### allowSymlinks - -Type: `boolean`
    -Default: `true` - -Allow symbolic links to match if they point to the chosen path type. - -### locatePath.sync(paths, [options]) - -Returns the first path that exists or `undefined` if none exists. - -#### paths - -Type: `Iterable` - -Paths to check. - -#### options - -Type: `Object` - -##### cwd - -Same as above. - -##### type - -Same as above. - -##### allowSymlinks - -Same as above. - - -## Related - -- [path-exists](https://github.com/sindresorhus/path-exists) - Check if a path exists - - -## License - -MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/lru-cache/LICENSE b/node_modules/lru-cache/LICENSE deleted file mode 100644 index f785757..0000000 --- a/node_modules/lru-cache/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) 2010-2023 Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/lru-cache/README.md b/node_modules/lru-cache/README.md deleted file mode 100644 index 931822f..0000000 --- a/node_modules/lru-cache/README.md +++ /dev/null @@ -1,331 +0,0 @@ -# lru-cache - -A cache object that deletes the least-recently-used items. - -Specify a max number of the most recently used items that you -want to keep, and this cache will keep that many of the most -recently accessed items. - -This is not primarily a TTL cache, and does not make strong TTL -guarantees. There is no preemptive pruning of expired items by -default, but you _may_ set a TTL on the cache or on a single -`set`. If you do so, it will treat expired items as missing, and -delete them when fetched. If you are more interested in TTL -caching than LRU caching, check out -[@isaacs/ttlcache](http://npm.im/@isaacs/ttlcache). - -As of version 7, this is one of the most performant LRU -implementations available in JavaScript, and supports a wide -diversity of use cases. However, note that using some of the -features will necessarily impact performance, by causing the -cache to have to do more work. See the "Performance" section -below. - -## Installation - -```bash -npm install lru-cache --save -``` - -## Usage - -```js -// hybrid module, either works -import { LRUCache } from 'lru-cache' -// or: -const { LRUCache } = require('lru-cache') -// or in minified form for web browsers: -import { LRUCache } from 'http://unpkg.com/lru-cache@9/dist/mjs/index.min.mjs' - -// At least one of 'max', 'ttl', or 'maxSize' is required, to prevent -// unsafe unbounded storage. -// -// In most cases, it's best to specify a max for performance, so all -// the required memory allocation is done up-front. -// -// All the other options are optional, see the sections below for -// documentation on what each one does. Most of them can be -// overridden for specific items in get()/set() -const options = { - max: 500, - - // for use with tracking overall storage size - maxSize: 5000, - sizeCalculation: (value, key) => { - return 1 - }, - - // for use when you need to clean up something when objects - // are evicted from the cache - dispose: (value, key) => { - freeFromMemoryOrWhatever(value) - }, - - // how long to live in ms - ttl: 1000 * 60 * 5, - - // return stale items before removing from cache? - allowStale: false, - - updateAgeOnGet: false, - updateAgeOnHas: false, - - // async method to use for cache.fetch(), for - // stale-while-revalidate type of behavior - fetchMethod: async ( - key, - staleValue, - { options, signal, context } - ) => {}, -} - -const cache = new LRUCache(options) - -cache.set('key', 'value') -cache.get('key') // "value" - -// non-string keys ARE fully supported -// but note that it must be THE SAME object, not -// just a JSON-equivalent object. -var someObject = { a: 1 } -cache.set(someObject, 'a value') -// Object keys are not toString()-ed -cache.set('[object Object]', 'a different value') -assert.equal(cache.get(someObject), 'a value') -// A similar object with same keys/values won't work, -// because it's a different object identity -assert.equal(cache.get({ a: 1 }), undefined) - -cache.clear() // empty the cache -``` - -If you put more stuff in the cache, then less recently used items -will fall out. That's what an LRU cache is. - -For full description of the API and all options, please see [the -LRUCache typedocs](https://isaacs.github.io/node-lru-cache/) - -## Storage Bounds Safety - -This implementation aims to be as flexible as possible, within -the limits of safe memory consumption and optimal performance. - -At initial object creation, storage is allocated for `max` items. -If `max` is set to zero, then some performance is lost, and item -count is unbounded. Either `maxSize` or `ttl` _must_ be set if -`max` is not specified. - -If `maxSize` is set, then this creates a safe limit on the -maximum storage consumed, but without the performance benefits of -pre-allocation. When `maxSize` is set, every item _must_ provide -a size, either via the `sizeCalculation` method provided to the -constructor, or via a `size` or `sizeCalculation` option provided -to `cache.set()`. The size of every item _must_ be a positive -integer. - -If neither `max` nor `maxSize` are set, then `ttl` tracking must -be enabled. Note that, even when tracking item `ttl`, items are -_not_ preemptively deleted when they become stale, unless -`ttlAutopurge` is enabled. Instead, they are only purged the -next time the key is requested. Thus, if `ttlAutopurge`, `max`, -and `maxSize` are all not set, then the cache will potentially -grow unbounded. - -In this case, a warning is printed to standard error. Future -versions may require the use of `ttlAutopurge` if `max` and -`maxSize` are not specified. - -If you truly wish to use a cache that is bound _only_ by TTL -expiration, consider using a `Map` object, and calling -`setTimeout` to delete entries when they expire. It will perform -much better than an LRU cache. - -Here is an implementation you may use, under the same -[license](./LICENSE) as this package: - -```js -// a storage-unbounded ttl cache that is not an lru-cache -const cache = { - data: new Map(), - timers: new Map(), - set: (k, v, ttl) => { - if (cache.timers.has(k)) { - clearTimeout(cache.timers.get(k)) - } - cache.timers.set( - k, - setTimeout(() => cache.delete(k), ttl) - ) - cache.data.set(k, v) - }, - get: k => cache.data.get(k), - has: k => cache.data.has(k), - delete: k => { - if (cache.timers.has(k)) { - clearTimeout(cache.timers.get(k)) - } - cache.timers.delete(k) - return cache.data.delete(k) - }, - clear: () => { - cache.data.clear() - for (const v of cache.timers.values()) { - clearTimeout(v) - } - cache.timers.clear() - }, -} -``` - -If that isn't to your liking, check out -[@isaacs/ttlcache](http://npm.im/@isaacs/ttlcache). - -## Storing Undefined Values - -This cache never stores undefined values, as `undefined` is used -internally in a few places to indicate that a key is not in the -cache. - -You may call `cache.set(key, undefined)`, but this is just -an alias for `cache.delete(key)`. Note that this has the effect -that `cache.has(key)` will return _false_ after setting it to -undefined. - -```js -cache.set(myKey, undefined) -cache.has(myKey) // false! -``` - -If you need to track `undefined` values, and still note that the -key is in the cache, an easy workaround is to use a sigil object -of your own. - -```js -import { LRUCache } from 'lru-cache' -const undefinedValue = Symbol('undefined') -const cache = new LRUCache(...) -const mySet = (key, value) => - cache.set(key, value === undefined ? undefinedValue : value) -const myGet = (key, value) => { - const v = cache.get(key) - return v === undefinedValue ? undefined : v -} -``` - -## Performance - -As of January 2022, version 7 of this library is one of the most -performant LRU cache implementations in JavaScript. - -Benchmarks can be extremely difficult to get right. In -particular, the performance of set/get/delete operations on -objects will vary _wildly_ depending on the type of key used. V8 -is highly optimized for objects with keys that are short strings, -especially integer numeric strings. Thus any benchmark which -tests _solely_ using numbers as keys will tend to find that an -object-based approach performs the best. - -Note that coercing _anything_ to strings to use as object keys is -unsafe, unless you can be 100% certain that no other type of -value will be used. For example: - -```js -const myCache = {} -const set = (k, v) => (myCache[k] = v) -const get = k => myCache[k] - -set({}, 'please hang onto this for me') -set('[object Object]', 'oopsie') -``` - -Also beware of "Just So" stories regarding performance. Garbage -collection of large (especially: deep) object graphs can be -incredibly costly, with several "tipping points" where it -increases exponentially. As a result, putting that off until -later can make it much worse, and less predictable. If a library -performs well, but only in a scenario where the object graph is -kept shallow, then that won't help you if you are using large -objects as keys. - -In general, when attempting to use a library to improve -performance (such as a cache like this one), it's best to choose -an option that will perform well in the sorts of scenarios where -you'll actually use it. - -This library is optimized for repeated gets and minimizing -eviction time, since that is the expected need of a LRU. Set -operations are somewhat slower on average than a few other -options, in part because of that optimization. It is assumed -that you'll be caching some costly operation, ideally as rarely -as possible, so optimizing set over get would be unwise. - -If performance matters to you: - -1. If it's at all possible to use small integer values as keys, - and you can guarantee that no other types of values will be - used as keys, then do that, and use a cache such as - [lru-fast](https://npmjs.com/package/lru-fast), or - [mnemonist's - LRUCache](https://yomguithereal.github.io/mnemonist/lru-cache) - which uses an Object as its data store. - -2. Failing that, if at all possible, use short non-numeric - strings (ie, less than 256 characters) as your keys, and use - [mnemonist's - LRUCache](https://yomguithereal.github.io/mnemonist/lru-cache). - -3. If the types of your keys will be anything else, especially - long strings, strings that look like floats, objects, or some - mix of types, or if you aren't sure, then this library will - work well for you. - - If you do not need the features that this library provides - (like asynchronous fetching, a variety of TTL staleness - options, and so on), then [mnemonist's - LRUMap](https://yomguithereal.github.io/mnemonist/lru-map) is - a very good option, and just slightly faster than this module - (since it does considerably less). - -4. Do not use a `dispose` function, size tracking, or especially - ttl behavior, unless absolutely needed. These features are - convenient, and necessary in some use cases, and every attempt - has been made to make the performance impact minimal, but it - isn't nothing. - -## Breaking Changes in Version 7 - -This library changed to a different algorithm and internal data -structure in version 7, yielding significantly better -performance, albeit with some subtle changes as a result. - -If you were relying on the internals of LRUCache in version 6 or -before, it probably will not work in version 7 and above. - -## Breaking Changes in Version 8 - -- The `fetchContext` option was renamed to `context`, and may no - longer be set on the cache instance itself. -- Rewritten in TypeScript, so pretty much all the types moved - around a lot. -- The AbortController/AbortSignal polyfill was removed. For this - reason, **Node version 16.14.0 or higher is now required**. -- Internal properties were moved to actual private class - properties. -- Keys and values must not be `null` or `undefined`. -- Minified export available at `'lru-cache/min'`, for both CJS - and MJS builds. - -## Breaking Changes in Version 9 - -- Named export only, no default export. -- AbortController polyfill returned, albeit with a warning when - used. - -## Breaking Changes in Version 10 - -- `cache.fetch()` return type is now `Promise` - instead of `Promise`. This is an irrelevant change - practically speaking, but can require changes for TypeScript - users. - -For more info, see the [change log](CHANGELOG.md). diff --git a/node_modules/lru-cache/dist/commonjs/index.d.ts b/node_modules/lru-cache/dist/commonjs/index.d.ts deleted file mode 100644 index f59de76..0000000 --- a/node_modules/lru-cache/dist/commonjs/index.d.ts +++ /dev/null @@ -1,1277 +0,0 @@ -/** - * @module LRUCache - */ -declare const TYPE: unique symbol; -export type PosInt = number & { - [TYPE]: 'Positive Integer'; -}; -export type Index = number & { - [TYPE]: 'LRUCache Index'; -}; -export type UintArray = Uint8Array | Uint16Array | Uint32Array; -export type NumberArray = UintArray | number[]; -declare class ZeroArray extends Array { - constructor(size: number); -} -export type { ZeroArray }; -export type { Stack }; -export type StackLike = Stack | Index[]; -declare class Stack { - #private; - heap: NumberArray; - length: number; - static create(max: number): StackLike; - constructor(max: number, HeapCls: { - new (n: number): NumberArray; - }); - push(n: Index): void; - pop(): Index; -} -/** - * Promise representing an in-progress {@link LRUCache#fetch} call - */ -export type BackgroundFetch = Promise & { - __returned: BackgroundFetch | undefined; - __abortController: AbortController; - __staleWhileFetching: V | undefined; -}; -export type DisposeTask = [ - value: V, - key: K, - reason: LRUCache.DisposeReason -]; -export declare namespace LRUCache { - /** - * An integer greater than 0, reflecting the calculated size of items - */ - type Size = number; - /** - * Integer greater than 0, representing some number of milliseconds, or the - * time at which a TTL started counting from. - */ - type Milliseconds = number; - /** - * An integer greater than 0, reflecting a number of items - */ - type Count = number; - /** - * The reason why an item was removed from the cache, passed - * to the {@link Disposer} methods. - * - * - `evict`: The item was evicted because it is the least recently used, - * and the cache is full. - * - `set`: A new value was set, overwriting the old value being disposed. - * - `delete`: The item was explicitly deleted, either by calling - * {@link LRUCache#delete}, {@link LRUCache#clear}, or - * {@link LRUCache#set} with an undefined value. - * - `expire`: The item was removed due to exceeding its TTL. - * - `fetch`: A {@link OptionsBase#fetchMethod} operation returned - * `undefined` or was aborted, causing the item to be deleted. - */ - type DisposeReason = 'evict' | 'set' | 'delete' | 'expire' | 'fetch'; - /** - * A method called upon item removal, passed as the - * {@link OptionsBase.dispose} and/or - * {@link OptionsBase.disposeAfter} options. - */ - type Disposer = (value: V, key: K, reason: DisposeReason) => void; - /** - * A function that returns the effective calculated size - * of an entry in the cache. - */ - type SizeCalculator = (value: V, key: K) => Size; - /** - * Options provided to the - * {@link OptionsBase.fetchMethod} function. - */ - interface FetcherOptions { - signal: AbortSignal; - options: FetcherFetchOptions; - /** - * Object provided in the {@link FetchOptions.context} option to - * {@link LRUCache#fetch} - */ - context: FC; - } - /** - * Occasionally, it may be useful to track the internal behavior of the - * cache, particularly for logging, debugging, or for behavior within the - * `fetchMethod`. To do this, you can pass a `status` object to the - * {@link LRUCache#fetch}, {@link LRUCache#get}, {@link LRUCache#set}, - * {@link LRUCache#memo}, and {@link LRUCache#has} methods. - * - * The `status` option should be a plain JavaScript object. The following - * fields will be set on it appropriately, depending on the situation. - */ - interface Status { - /** - * The status of a set() operation. - * - * - add: the item was not found in the cache, and was added - * - update: the item was in the cache, with the same value provided - * - replace: the item was in the cache, and replaced - * - miss: the item was not added to the cache for some reason - */ - set?: 'add' | 'update' | 'replace' | 'miss'; - /** - * the ttl stored for the item, or undefined if ttls are not used. - */ - ttl?: Milliseconds; - /** - * the start time for the item, or undefined if ttls are not used. - */ - start?: Milliseconds; - /** - * The timestamp used for TTL calculation - */ - now?: Milliseconds; - /** - * the remaining ttl for the item, or undefined if ttls are not used. - */ - remainingTTL?: Milliseconds; - /** - * The calculated size for the item, if sizes are used. - */ - entrySize?: Size; - /** - * The total calculated size of the cache, if sizes are used. - */ - totalCalculatedSize?: Size; - /** - * A flag indicating that the item was not stored, due to exceeding the - * {@link OptionsBase.maxEntrySize} - */ - maxEntrySizeExceeded?: true; - /** - * The old value, specified in the case of `set:'update'` or - * `set:'replace'` - */ - oldValue?: V; - /** - * The results of a {@link LRUCache#has} operation - * - * - hit: the item was found in the cache - * - stale: the item was found in the cache, but is stale - * - miss: the item was not found in the cache - */ - has?: 'hit' | 'stale' | 'miss'; - /** - * The status of a {@link LRUCache#fetch} operation. - * Note that this can change as the underlying fetch() moves through - * various states. - * - * - inflight: there is another fetch() for this key which is in process - * - get: there is no {@link OptionsBase.fetchMethod}, so - * {@link LRUCache#get} was called. - * - miss: the item is not in cache, and will be fetched. - * - hit: the item is in the cache, and was resolved immediately. - * - stale: the item is in the cache, but stale. - * - refresh: the item is in the cache, and not stale, but - * {@link FetchOptions.forceRefresh} was specified. - */ - fetch?: 'get' | 'inflight' | 'miss' | 'hit' | 'stale' | 'refresh'; - /** - * The {@link OptionsBase.fetchMethod} was called - */ - fetchDispatched?: true; - /** - * The cached value was updated after a successful call to - * {@link OptionsBase.fetchMethod} - */ - fetchUpdated?: true; - /** - * The reason for a fetch() rejection. Either the error raised by the - * {@link OptionsBase.fetchMethod}, or the reason for an - * AbortSignal. - */ - fetchError?: Error; - /** - * The fetch received an abort signal - */ - fetchAborted?: true; - /** - * The abort signal received was ignored, and the fetch was allowed to - * continue. - */ - fetchAbortIgnored?: true; - /** - * The fetchMethod promise resolved successfully - */ - fetchResolved?: true; - /** - * The fetchMethod promise was rejected - */ - fetchRejected?: true; - /** - * The status of a {@link LRUCache#get} operation. - * - * - fetching: The item is currently being fetched. If a previous value - * is present and allowed, that will be returned. - * - stale: The item is in the cache, and is stale. - * - hit: the item is in the cache - * - miss: the item is not in the cache - */ - get?: 'stale' | 'hit' | 'miss'; - /** - * A fetch or get operation returned a stale value. - */ - returnedStale?: true; - } - /** - * options which override the options set in the LRUCache constructor - * when calling {@link LRUCache#fetch}. - * - * This is the union of {@link GetOptions} and {@link SetOptions}, plus - * {@link OptionsBase.noDeleteOnFetchRejection}, - * {@link OptionsBase.allowStaleOnFetchRejection}, - * {@link FetchOptions.forceRefresh}, and - * {@link FetcherOptions.context} - * - * Any of these may be modified in the {@link OptionsBase.fetchMethod} - * function, but the {@link GetOptions} fields will of course have no - * effect, as the {@link LRUCache#get} call already happened by the time - * the fetchMethod is called. - */ - interface FetcherFetchOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet' | 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL' | 'noDeleteOnFetchRejection' | 'allowStaleOnFetchRejection' | 'ignoreFetchAbort' | 'allowStaleOnFetchAbort'> { - status?: Status; - size?: Size; - } - /** - * Options that may be passed to the {@link LRUCache#fetch} method. - */ - interface FetchOptions extends FetcherFetchOptions { - /** - * Set to true to force a re-load of the existing data, even if it - * is not yet stale. - */ - forceRefresh?: boolean; - /** - * Context provided to the {@link OptionsBase.fetchMethod} as - * the {@link FetcherOptions.context} param. - * - * If the FC type is specified as unknown (the default), - * undefined or void, then this is optional. Otherwise, it will - * be required. - */ - context?: FC; - signal?: AbortSignal; - status?: Status; - } - /** - * Options provided to {@link LRUCache#fetch} when the FC type is something - * other than `unknown`, `undefined`, or `void` - */ - interface FetchOptionsWithContext extends FetchOptions { - context: FC; - } - /** - * Options provided to {@link LRUCache#fetch} when the FC type is - * `undefined` or `void` - */ - interface FetchOptionsNoContext extends FetchOptions { - context?: undefined; - } - interface MemoOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet' | 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL' | 'noDeleteOnFetchRejection' | 'allowStaleOnFetchRejection' | 'ignoreFetchAbort' | 'allowStaleOnFetchAbort'> { - /** - * Set to true to force a re-load of the existing data, even if it - * is not yet stale. - */ - forceRefresh?: boolean; - /** - * Context provided to the {@link OptionsBase.memoMethod} as - * the {@link MemoizerOptions.context} param. - * - * If the FC type is specified as unknown (the default), - * undefined or void, then this is optional. Otherwise, it will - * be required. - */ - context?: FC; - status?: Status; - } - /** - * Options provided to {@link LRUCache#memo} when the FC type is something - * other than `unknown`, `undefined`, or `void` - */ - interface MemoOptionsWithContext extends MemoOptions { - context: FC; - } - /** - * Options provided to {@link LRUCache#memo} when the FC type is - * `undefined` or `void` - */ - interface MemoOptionsNoContext extends MemoOptions { - context?: undefined; - } - /** - * Options provided to the - * {@link OptionsBase.memoMethod} function. - */ - interface MemoizerOptions { - options: MemoizerMemoOptions; - /** - * Object provided in the {@link MemoOptions.context} option to - * {@link LRUCache#memo} - */ - context: FC; - } - /** - * options which override the options set in the LRUCache constructor - * when calling {@link LRUCache#memo}. - * - * This is the union of {@link GetOptions} and {@link SetOptions}, plus - * {@link MemoOptions.forceRefresh}, and - * {@link MemoerOptions.context} - * - * Any of these may be modified in the {@link OptionsBase.memoMethod} - * function, but the {@link GetOptions} fields will of course have no - * effect, as the {@link LRUCache#get} call already happened by the time - * the memoMethod is called. - */ - interface MemoizerMemoOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet' | 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'> { - status?: Status; - size?: Size; - start?: Milliseconds; - } - /** - * Options that may be passed to the {@link LRUCache#has} method. - */ - interface HasOptions extends Pick, 'updateAgeOnHas'> { - status?: Status; - } - /** - * Options that may be passed to the {@link LRUCache#get} method. - */ - interface GetOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet'> { - status?: Status; - } - /** - * Options that may be passed to the {@link LRUCache#peek} method. - */ - interface PeekOptions extends Pick, 'allowStale'> { - } - /** - * Options that may be passed to the {@link LRUCache#set} method. - */ - interface SetOptions extends Pick, 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'> { - /** - * If size tracking is enabled, then setting an explicit size - * in the {@link LRUCache#set} call will prevent calling the - * {@link OptionsBase.sizeCalculation} function. - */ - size?: Size; - /** - * If TTL tracking is enabled, then setting an explicit start - * time in the {@link LRUCache#set} call will override the - * default time from `performance.now()` or `Date.now()`. - * - * Note that it must be a valid value for whichever time-tracking - * method is in use. - */ - start?: Milliseconds; - status?: Status; - } - /** - * The type signature for the {@link OptionsBase.fetchMethod} option. - */ - type Fetcher = (key: K, staleValue: V | undefined, options: FetcherOptions) => Promise | V | undefined | void; - /** - * the type signature for the {@link OptionsBase.memoMethod} option. - */ - type Memoizer = (key: K, staleValue: V | undefined, options: MemoizerOptions) => V; - /** - * Options which may be passed to the {@link LRUCache} constructor. - * - * Most of these may be overridden in the various options that use - * them. - * - * Despite all being technically optional, the constructor requires that - * a cache is at minimum limited by one or more of {@link OptionsBase.max}, - * {@link OptionsBase.ttl}, or {@link OptionsBase.maxSize}. - * - * If {@link OptionsBase.ttl} is used alone, then it is strongly advised - * (and in fact required by the type definitions here) that the cache - * also set {@link OptionsBase.ttlAutopurge}, to prevent potentially - * unbounded storage. - * - * All options are also available on the {@link LRUCache} instance, making - * it safe to pass an LRUCache instance as the options argumemnt to - * make another empty cache of the same type. - * - * Some options are marked as read-only, because changing them after - * instantiation is not safe. Changing any of the other options will of - * course only have an effect on subsequent method calls. - */ - interface OptionsBase { - /** - * The maximum number of items to store in the cache before evicting - * old entries. This is read-only on the {@link LRUCache} instance, - * and may not be overridden. - * - * If set, then storage space will be pre-allocated at construction - * time, and the cache will perform significantly faster. - * - * Note that significantly fewer items may be stored, if - * {@link OptionsBase.maxSize} and/or {@link OptionsBase.ttl} are also - * set. - * - * **It is strongly recommended to set a `max` to prevent unbounded growth - * of the cache.** - */ - max?: Count; - /** - * Max time in milliseconds for items to live in cache before they are - * considered stale. Note that stale items are NOT preemptively removed by - * default, and MAY live in the cache, contributing to its LRU max, long - * after they have expired, unless {@link OptionsBase.ttlAutopurge} is - * set. - * - * If set to `0` (the default value), then that means "do not track - * TTL", not "expire immediately". - * - * Also, as this cache is optimized for LRU/MRU operations, some of - * the staleness/TTL checks will reduce performance, as they will incur - * overhead by deleting items. - * - * This is not primarily a TTL cache, and does not make strong TTL - * guarantees. There is no pre-emptive pruning of expired items, but you - * _may_ set a TTL on the cache, and it will treat expired items as missing - * when they are fetched, and delete them. - * - * Optional, but must be a non-negative integer in ms if specified. - * - * This may be overridden by passing an options object to `cache.set()`. - * - * At least one of `max`, `maxSize`, or `TTL` is required. This must be a - * positive integer if set. - * - * Even if ttl tracking is enabled, **it is strongly recommended to set a - * `max` to prevent unbounded growth of the cache.** - * - * If ttl tracking is enabled, and `max` and `maxSize` are not set, - * and `ttlAutopurge` is not set, then a warning will be emitted - * cautioning about the potential for unbounded memory consumption. - * (The TypeScript definitions will also discourage this.) - */ - ttl?: Milliseconds; - /** - * Minimum amount of time in ms in which to check for staleness. - * Defaults to 1, which means that the current time is checked - * at most once per millisecond. - * - * Set to 0 to check the current time every time staleness is tested. - * (This reduces performance, and is theoretically unnecessary.) - * - * Setting this to a higher value will improve performance somewhat - * while using ttl tracking, albeit at the expense of keeping stale - * items around a bit longer than their TTLs would indicate. - * - * @default 1 - */ - ttlResolution?: Milliseconds; - /** - * Preemptively remove stale items from the cache. - * - * Note that this may *significantly* degrade performance, especially if - * the cache is storing a large number of items. It is almost always best - * to just leave the stale items in the cache, and let them fall out as new - * items are added. - * - * Note that this means that {@link OptionsBase.allowStale} is a bit - * pointless, as stale items will be deleted almost as soon as they - * expire. - * - * Use with caution! - */ - ttlAutopurge?: boolean; - /** - * When using time-expiring entries with `ttl`, setting this to `true` will - * make each item's age reset to 0 whenever it is retrieved from cache with - * {@link LRUCache#get}, causing it to not expire. (It can still fall out - * of cache based on recency of use, of course.) - * - * Has no effect if {@link OptionsBase.ttl} is not set. - * - * This may be overridden by passing an options object to `cache.get()`. - */ - updateAgeOnGet?: boolean; - /** - * When using time-expiring entries with `ttl`, setting this to `true` will - * make each item's age reset to 0 whenever its presence in the cache is - * checked with {@link LRUCache#has}, causing it to not expire. (It can - * still fall out of cache based on recency of use, of course.) - * - * Has no effect if {@link OptionsBase.ttl} is not set. - */ - updateAgeOnHas?: boolean; - /** - * Allow {@link LRUCache#get} and {@link LRUCache#fetch} calls to return - * stale data, if available. - * - * By default, if you set `ttl`, stale items will only be deleted from the - * cache when you `get(key)`. That is, it's not preemptively pruning items, - * unless {@link OptionsBase.ttlAutopurge} is set. - * - * If you set `allowStale:true`, it'll return the stale value *as well as* - * deleting it. If you don't set this, then it'll return `undefined` when - * you try to get a stale entry. - * - * Note that when a stale entry is fetched, _even if it is returned due to - * `allowStale` being set_, it is removed from the cache immediately. You - * can suppress this behavior by setting - * {@link OptionsBase.noDeleteOnStaleGet}, either in the constructor, or in - * the options provided to {@link LRUCache#get}. - * - * This may be overridden by passing an options object to `cache.get()`. - * The `cache.has()` method will always return `false` for stale items. - * - * Only relevant if a ttl is set. - */ - allowStale?: boolean; - /** - * Function that is called on items when they are dropped from the - * cache, as `dispose(value, key, reason)`. - * - * This can be handy if you want to close file descriptors or do - * other cleanup tasks when items are no longer stored in the cache. - * - * **NOTE**: It is called _before_ the item has been fully removed - * from the cache, so if you want to put it right back in, you need - * to wait until the next tick. If you try to add it back in during - * the `dispose()` function call, it will break things in subtle and - * weird ways. - * - * Unlike several other options, this may _not_ be overridden by - * passing an option to `set()`, for performance reasons. - * - * The `reason` will be one of the following strings, corresponding - * to the reason for the item's deletion: - * - * - `evict` Item was evicted to make space for a new addition - * - `set` Item was overwritten by a new value - * - `expire` Item expired its TTL - * - `fetch` Item was deleted due to a failed or aborted fetch, or a - * fetchMethod returning `undefined. - * - `delete` Item was removed by explicit `cache.delete(key)`, - * `cache.clear()`, or `cache.set(key, undefined)`. - */ - dispose?: Disposer; - /** - * The same as {@link OptionsBase.dispose}, but called *after* the entry - * is completely removed and the cache is once again in a clean state. - * - * It is safe to add an item right back into the cache at this point. - * However, note that it is *very* easy to inadvertently create infinite - * recursion this way. - */ - disposeAfter?: Disposer; - /** - * Set to true to suppress calling the - * {@link OptionsBase.dispose} function if the entry key is - * still accessible within the cache. - * - * This may be overridden by passing an options object to - * {@link LRUCache#set}. - * - * Only relevant if `dispose` or `disposeAfter` are set. - */ - noDisposeOnSet?: boolean; - /** - * Boolean flag to tell the cache to not update the TTL when setting a new - * value for an existing key (ie, when updating a value rather than - * inserting a new value). Note that the TTL value is _always_ set (if - * provided) when adding a new entry into the cache. - * - * Has no effect if a {@link OptionsBase.ttl} is not set. - * - * May be passed as an option to {@link LRUCache#set}. - */ - noUpdateTTL?: boolean; - /** - * Set to a positive integer to track the sizes of items added to the - * cache, and automatically evict items in order to stay below this size. - * Note that this may result in fewer than `max` items being stored. - * - * Attempting to add an item to the cache whose calculated size is greater - * that this amount will be a no-op. The item will not be cached, and no - * other items will be evicted. - * - * Optional, must be a positive integer if provided. - * - * Sets `maxEntrySize` to the same value, unless a different value is - * provided for `maxEntrySize`. - * - * At least one of `max`, `maxSize`, or `TTL` is required. This must be a - * positive integer if set. - * - * Even if size tracking is enabled, **it is strongly recommended to set a - * `max` to prevent unbounded growth of the cache.** - * - * Note also that size tracking can negatively impact performance, - * though for most cases, only minimally. - */ - maxSize?: Size; - /** - * The maximum allowed size for any single item in the cache. - * - * If a larger item is passed to {@link LRUCache#set} or returned by a - * {@link OptionsBase.fetchMethod} or {@link OptionsBase.memoMethod}, then - * it will not be stored in the cache. - * - * Attempting to add an item whose calculated size is greater than - * this amount will not cache the item or evict any old items, but - * WILL delete an existing value if one is already present. - * - * Optional, must be a positive integer if provided. Defaults to - * the value of `maxSize` if provided. - */ - maxEntrySize?: Size; - /** - * A function that returns a number indicating the item's size. - * - * Requires {@link OptionsBase.maxSize} to be set. - * - * If not provided, and {@link OptionsBase.maxSize} or - * {@link OptionsBase.maxEntrySize} are set, then all - * {@link LRUCache#set} calls **must** provide an explicit - * {@link SetOptions.size} or sizeCalculation param. - */ - sizeCalculation?: SizeCalculator; - /** - * Method that provides the implementation for {@link LRUCache#fetch} - * - * ```ts - * fetchMethod(key, staleValue, { signal, options, context }) - * ``` - * - * If `fetchMethod` is not provided, then `cache.fetch(key)` is equivalent - * to `Promise.resolve(cache.get(key))`. - * - * If at any time, `signal.aborted` is set to `true`, or if the - * `signal.onabort` method is called, or if it emits an `'abort'` event - * which you can listen to with `addEventListener`, then that means that - * the fetch should be abandoned. This may be passed along to async - * functions aware of AbortController/AbortSignal behavior. - * - * The `fetchMethod` should **only** return `undefined` or a Promise - * resolving to `undefined` if the AbortController signaled an `abort` - * event. In all other cases, it should return or resolve to a value - * suitable for adding to the cache. - * - * The `options` object is a union of the options that may be provided to - * `set()` and `get()`. If they are modified, then that will result in - * modifying the settings to `cache.set()` when the value is resolved, and - * in the case of - * {@link OptionsBase.noDeleteOnFetchRejection} and - * {@link OptionsBase.allowStaleOnFetchRejection}, the handling of - * `fetchMethod` failures. - * - * For example, a DNS cache may update the TTL based on the value returned - * from a remote DNS server by changing `options.ttl` in the `fetchMethod`. - */ - fetchMethod?: Fetcher; - /** - * Method that provides the implementation for {@link LRUCache#memo} - */ - memoMethod?: Memoizer; - /** - * Set to true to suppress the deletion of stale data when a - * {@link OptionsBase.fetchMethod} returns a rejected promise. - */ - noDeleteOnFetchRejection?: boolean; - /** - * Do not delete stale items when they are retrieved with - * {@link LRUCache#get}. - * - * Note that the `get` return value will still be `undefined` - * unless {@link OptionsBase.allowStale} is true. - * - * When using time-expiring entries with `ttl`, by default stale - * items will be removed from the cache when the key is accessed - * with `cache.get()`. - * - * Setting this option will cause stale items to remain in the cache, until - * they are explicitly deleted with `cache.delete(key)`, or retrieved with - * `noDeleteOnStaleGet` set to `false`. - * - * This may be overridden by passing an options object to `cache.get()`. - * - * Only relevant if a ttl is used. - */ - noDeleteOnStaleGet?: boolean; - /** - * Set to true to allow returning stale data when a - * {@link OptionsBase.fetchMethod} throws an error or returns a rejected - * promise. - * - * This differs from using {@link OptionsBase.allowStale} in that stale - * data will ONLY be returned in the case that the {@link LRUCache#fetch} - * fails, not any other times. - * - * If a `fetchMethod` fails, and there is no stale value available, the - * `fetch()` will resolve to `undefined`. Ie, all `fetchMethod` errors are - * suppressed. - * - * Implies `noDeleteOnFetchRejection`. - * - * This may be set in calls to `fetch()`, or defaulted on the constructor, - * or overridden by modifying the options object in the `fetchMethod`. - */ - allowStaleOnFetchRejection?: boolean; - /** - * Set to true to return a stale value from the cache when the - * `AbortSignal` passed to the {@link OptionsBase.fetchMethod} dispatches - * an `'abort'` event, whether user-triggered, or due to internal cache - * behavior. - * - * Unless {@link OptionsBase.ignoreFetchAbort} is also set, the underlying - * {@link OptionsBase.fetchMethod} will still be considered canceled, and - * any value it returns will be ignored and not cached. - * - * Caveat: since fetches are aborted when a new value is explicitly - * set in the cache, this can lead to fetch returning a stale value, - * since that was the fallback value _at the moment the `fetch()` was - * initiated_, even though the new updated value is now present in - * the cache. - * - * For example: - * - * ```ts - * const cache = new LRUCache({ - * ttl: 100, - * fetchMethod: async (url, oldValue, { signal }) => { - * const res = await fetch(url, { signal }) - * return await res.json() - * } - * }) - * cache.set('https://example.com/', { some: 'data' }) - * // 100ms go by... - * const result = cache.fetch('https://example.com/') - * cache.set('https://example.com/', { other: 'thing' }) - * console.log(await result) // { some: 'data' } - * console.log(cache.get('https://example.com/')) // { other: 'thing' } - * ``` - */ - allowStaleOnFetchAbort?: boolean; - /** - * Set to true to ignore the `abort` event emitted by the `AbortSignal` - * object passed to {@link OptionsBase.fetchMethod}, and still cache the - * resulting resolution value, as long as it is not `undefined`. - * - * When used on its own, this means aborted {@link LRUCache#fetch} calls - * are not immediately resolved or rejected when they are aborted, and - * instead take the full time to await. - * - * When used with {@link OptionsBase.allowStaleOnFetchAbort}, aborted - * {@link LRUCache#fetch} calls will resolve immediately to their stale - * cached value or `undefined`, and will continue to process and eventually - * update the cache when they resolve, as long as the resulting value is - * not `undefined`, thus supporting a "return stale on timeout while - * refreshing" mechanism by passing `AbortSignal.timeout(n)` as the signal. - * - * For example: - * - * ```ts - * const c = new LRUCache({ - * ttl: 100, - * ignoreFetchAbort: true, - * allowStaleOnFetchAbort: true, - * fetchMethod: async (key, oldValue, { signal }) => { - * // note: do NOT pass the signal to fetch()! - * // let's say this fetch can take a long time. - * const res = await fetch(`https://slow-backend-server/${key}`) - * return await res.json() - * }, - * }) - * - * // this will return the stale value after 100ms, while still - * // updating in the background for next time. - * const val = await c.fetch('key', { signal: AbortSignal.timeout(100) }) - * ``` - * - * **Note**: regardless of this setting, an `abort` event _is still - * emitted on the `AbortSignal` object_, so may result in invalid results - * when passed to other underlying APIs that use AbortSignals. - * - * This may be overridden in the {@link OptionsBase.fetchMethod} or the - * call to {@link LRUCache#fetch}. - */ - ignoreFetchAbort?: boolean; - } - interface OptionsMaxLimit extends OptionsBase { - max: Count; - } - interface OptionsTTLLimit extends OptionsBase { - ttl: Milliseconds; - ttlAutopurge: boolean; - } - interface OptionsSizeLimit extends OptionsBase { - maxSize: Size; - } - /** - * The valid safe options for the {@link LRUCache} constructor - */ - type Options = OptionsMaxLimit | OptionsSizeLimit | OptionsTTLLimit; - /** - * Entry objects used by {@link LRUCache#load} and {@link LRUCache#dump}, - * and returned by {@link LRUCache#info}. - */ - interface Entry { - value: V; - ttl?: Milliseconds; - size?: Size; - start?: Milliseconds; - } -} -/** - * Default export, the thing you're using this module to get. - * - * The `K` and `V` types define the key and value types, respectively. The - * optional `FC` type defines the type of the `context` object passed to - * `cache.fetch()` and `cache.memo()`. - * - * Keys and values **must not** be `null` or `undefined`. - * - * All properties from the options object (with the exception of `max`, - * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are - * added as normal public members. (The listed options are read-only getters.) - * - * Changing any of these will alter the defaults for subsequent method calls. - */ -export declare class LRUCache implements Map { - #private; - /** - * {@link LRUCache.OptionsBase.ttl} - */ - ttl: LRUCache.Milliseconds; - /** - * {@link LRUCache.OptionsBase.ttlResolution} - */ - ttlResolution: LRUCache.Milliseconds; - /** - * {@link LRUCache.OptionsBase.ttlAutopurge} - */ - ttlAutopurge: boolean; - /** - * {@link LRUCache.OptionsBase.updateAgeOnGet} - */ - updateAgeOnGet: boolean; - /** - * {@link LRUCache.OptionsBase.updateAgeOnHas} - */ - updateAgeOnHas: boolean; - /** - * {@link LRUCache.OptionsBase.allowStale} - */ - allowStale: boolean; - /** - * {@link LRUCache.OptionsBase.noDisposeOnSet} - */ - noDisposeOnSet: boolean; - /** - * {@link LRUCache.OptionsBase.noUpdateTTL} - */ - noUpdateTTL: boolean; - /** - * {@link LRUCache.OptionsBase.maxEntrySize} - */ - maxEntrySize: LRUCache.Size; - /** - * {@link LRUCache.OptionsBase.sizeCalculation} - */ - sizeCalculation?: LRUCache.SizeCalculator; - /** - * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection} - */ - noDeleteOnFetchRejection: boolean; - /** - * {@link LRUCache.OptionsBase.noDeleteOnStaleGet} - */ - noDeleteOnStaleGet: boolean; - /** - * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort} - */ - allowStaleOnFetchAbort: boolean; - /** - * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} - */ - allowStaleOnFetchRejection: boolean; - /** - * {@link LRUCache.OptionsBase.ignoreFetchAbort} - */ - ignoreFetchAbort: boolean; - /** - * Do not call this method unless you need to inspect the - * inner workings of the cache. If anything returned by this - * object is modified in any way, strange breakage may occur. - * - * These fields are private for a reason! - * - * @internal - */ - static unsafeExposeInternals(c: LRUCache): { - starts: ZeroArray | undefined; - ttls: ZeroArray | undefined; - sizes: ZeroArray | undefined; - keyMap: Map; - keyList: (K | undefined)[]; - valList: (V | BackgroundFetch | undefined)[]; - next: NumberArray; - prev: NumberArray; - readonly head: Index; - readonly tail: Index; - free: StackLike; - isBackgroundFetch: (p: any) => boolean; - backgroundFetch: (k: K, index: number | undefined, options: LRUCache.FetchOptions, context: any) => BackgroundFetch; - moveToTail: (index: number) => void; - indexes: (options?: { - allowStale: boolean; - }) => Generator; - rindexes: (options?: { - allowStale: boolean; - }) => Generator; - isStale: (index: number | undefined) => boolean; - }; - /** - * {@link LRUCache.OptionsBase.max} (read-only) - */ - get max(): LRUCache.Count; - /** - * {@link LRUCache.OptionsBase.maxSize} (read-only) - */ - get maxSize(): LRUCache.Count; - /** - * The total computed size of items in the cache (read-only) - */ - get calculatedSize(): LRUCache.Size; - /** - * The number of items stored in the cache (read-only) - */ - get size(): LRUCache.Count; - /** - * {@link LRUCache.OptionsBase.fetchMethod} (read-only) - */ - get fetchMethod(): LRUCache.Fetcher | undefined; - get memoMethod(): LRUCache.Memoizer | undefined; - /** - * {@link LRUCache.OptionsBase.dispose} (read-only) - */ - get dispose(): LRUCache.Disposer | undefined; - /** - * {@link LRUCache.OptionsBase.disposeAfter} (read-only) - */ - get disposeAfter(): LRUCache.Disposer | undefined; - constructor(options: LRUCache.Options | LRUCache); - /** - * Return the number of ms left in the item's TTL. If item is not in cache, - * returns `0`. Returns `Infinity` if item is in cache without a defined TTL. - */ - getRemainingTTL(key: K): number; - /** - * Return a generator yielding `[key, value]` pairs, - * in order from most recently used to least recently used. - */ - entries(): Generator<[K, V], void, unknown>; - /** - * Inverse order version of {@link LRUCache.entries} - * - * Return a generator yielding `[key, value]` pairs, - * in order from least recently used to most recently used. - */ - rentries(): Generator<(K | V | BackgroundFetch | undefined)[], void, unknown>; - /** - * Return a generator yielding the keys in the cache, - * in order from most recently used to least recently used. - */ - keys(): Generator; - /** - * Inverse order version of {@link LRUCache.keys} - * - * Return a generator yielding the keys in the cache, - * in order from least recently used to most recently used. - */ - rkeys(): Generator; - /** - * Return a generator yielding the values in the cache, - * in order from most recently used to least recently used. - */ - values(): Generator; - /** - * Inverse order version of {@link LRUCache.values} - * - * Return a generator yielding the values in the cache, - * in order from least recently used to most recently used. - */ - rvalues(): Generator | undefined, void, unknown>; - /** - * Iterating over the cache itself yields the same results as - * {@link LRUCache.entries} - */ - [Symbol.iterator](): Generator<[K, V], void, unknown>; - /** - * A String value that is used in the creation of the default string - * description of an object. Called by the built-in method - * `Object.prototype.toString`. - */ - [Symbol.toStringTag]: string; - /** - * Find a value for which the supplied fn method returns a truthy value, - * similar to `Array.find()`. fn is called as `fn(value, key, cache)`. - */ - find(fn: (v: V, k: K, self: LRUCache) => boolean, getOptions?: LRUCache.GetOptions): V | undefined; - /** - * Call the supplied function on each item in the cache, in order from most - * recently used to least recently used. - * - * `fn` is called as `fn(value, key, cache)`. - * - * If `thisp` is provided, function will be called in the `this`-context of - * the provided object, or the cache if no `thisp` object is provided. - * - * Does not update age or recenty of use, or iterate over stale values. - */ - forEach(fn: (v: V, k: K, self: LRUCache) => any, thisp?: any): void; - /** - * The same as {@link LRUCache.forEach} but items are iterated over in - * reverse order. (ie, less recently used items are iterated over first.) - */ - rforEach(fn: (v: V, k: K, self: LRUCache) => any, thisp?: any): void; - /** - * Delete any stale entries. Returns true if anything was removed, - * false otherwise. - */ - purgeStale(): boolean; - /** - * Get the extended info about a given entry, to get its value, size, and - * TTL info simultaneously. Returns `undefined` if the key is not present. - * - * Unlike {@link LRUCache#dump}, which is designed to be portable and survive - * serialization, the `start` value is always the current timestamp, and the - * `ttl` is a calculated remaining time to live (negative if expired). - * - * Always returns stale values, if their info is found in the cache, so be - * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl}) - * if relevant. - */ - info(key: K): LRUCache.Entry | undefined; - /** - * Return an array of [key, {@link LRUCache.Entry}] tuples which can be - * passed to {@link LRLUCache#load}. - * - * The `start` fields are calculated relative to a portable `Date.now()` - * timestamp, even if `performance.now()` is available. - * - * Stale entries are always included in the `dump`, even if - * {@link LRUCache.OptionsBase.allowStale} is false. - * - * Note: this returns an actual array, not a generator, so it can be more - * easily passed around. - */ - dump(): [K, LRUCache.Entry][]; - /** - * Reset the cache and load in the items in entries in the order listed. - * - * The shape of the resulting cache may be different if the same options are - * not used in both caches. - * - * The `start` fields are assumed to be calculated relative to a portable - * `Date.now()` timestamp, even if `performance.now()` is available. - */ - load(arr: [K, LRUCache.Entry][]): void; - /** - * Add a value to the cache. - * - * Note: if `undefined` is specified as a value, this is an alias for - * {@link LRUCache#delete} - * - * Fields on the {@link LRUCache.SetOptions} options param will override - * their corresponding values in the constructor options for the scope - * of this single `set()` operation. - * - * If `start` is provided, then that will set the effective start - * time for the TTL calculation. Note that this must be a previous - * value of `performance.now()` if supported, or a previous value of - * `Date.now()` if not. - * - * Options object may also include `size`, which will prevent - * calling the `sizeCalculation` function and just use the specified - * number if it is a positive integer, and `noDisposeOnSet` which - * will prevent calling a `dispose` function in the case of - * overwrites. - * - * If the `size` (or return value of `sizeCalculation`) for a given - * entry is greater than `maxEntrySize`, then the item will not be - * added to the cache. - * - * Will update the recency of the entry. - * - * If the value is `undefined`, then this is an alias for - * `cache.delete(key)`. `undefined` is never stored in the cache. - */ - set(k: K, v: V | BackgroundFetch | undefined, setOptions?: LRUCache.SetOptions): this; - /** - * Evict the least recently used item, returning its value or - * `undefined` if cache is empty. - */ - pop(): V | undefined; - /** - * Check if a key is in the cache, without updating the recency of use. - * Will return false if the item is stale, even though it is technically - * in the cache. - * - * Check if a key is in the cache, without updating the recency of - * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set - * to `true` in either the options or the constructor. - * - * Will return `false` if the item is stale, even though it is technically in - * the cache. The difference can be determined (if it matters) by using a - * `status` argument, and inspecting the `has` field. - * - * Will not update item age unless - * {@link LRUCache.OptionsBase.updateAgeOnHas} is set. - */ - has(k: K, hasOptions?: LRUCache.HasOptions): boolean; - /** - * Like {@link LRUCache#get} but doesn't update recency or delete stale - * items. - * - * Returns `undefined` if the item is stale, unless - * {@link LRUCache.OptionsBase.allowStale} is set. - */ - peek(k: K, peekOptions?: LRUCache.PeekOptions): V | undefined; - /** - * Make an asynchronous cached fetch using the - * {@link LRUCache.OptionsBase.fetchMethod} function. - * - * If the value is in the cache and not stale, then the returned - * Promise resolves to the value. - * - * If not in the cache, or beyond its TTL staleness, then - * `fetchMethod(key, staleValue, { options, signal, context })` is - * called, and the value returned will be added to the cache once - * resolved. - * - * If called with `allowStale`, and an asynchronous fetch is - * currently in progress to reload a stale value, then the former - * stale value will be returned. - * - * If called with `forceRefresh`, then the cached item will be - * re-fetched, even if it is not stale. However, if `allowStale` is also - * set, then the old value will still be returned. This is useful - * in cases where you want to force a reload of a cached value. If - * a background fetch is already in progress, then `forceRefresh` - * has no effect. - * - * If multiple fetches for the same key are issued, then they will all be - * coalesced into a single call to fetchMethod. - * - * Note that this means that handling options such as - * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}, - * {@link LRUCache.FetchOptions.signal}, - * and {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} will be - * determined by the FIRST fetch() call for a given key. - * - * This is a known (fixable) shortcoming which will be addresed on when - * someone complains about it, as the fix would involve added complexity and - * may not be worth the costs for this edge case. - * - * If {@link LRUCache.OptionsBase.fetchMethod} is not specified, then this is - * effectively an alias for `Promise.resolve(cache.get(key))`. - * - * When the fetch method resolves to a value, if the fetch has not - * been aborted due to deletion, eviction, or being overwritten, - * then it is added to the cache using the options provided. - * - * If the key is evicted or deleted before the `fetchMethod` - * resolves, then the AbortSignal passed to the `fetchMethod` will - * receive an `abort` event, and the promise returned by `fetch()` - * will reject with the reason for the abort. - * - * If a `signal` is passed to the `fetch()` call, then aborting the - * signal will abort the fetch and cause the `fetch()` promise to - * reject with the reason provided. - * - * **Setting `context`** - * - * If an `FC` type is set to a type other than `unknown`, `void`, or - * `undefined` in the {@link LRUCache} constructor, then all - * calls to `cache.fetch()` _must_ provide a `context` option. If - * set to `undefined` or `void`, then calls to fetch _must not_ - * provide a `context` option. - * - * The `context` param allows you to provide arbitrary data that - * might be relevant in the course of fetching the data. It is only - * relevant for the course of a single `fetch()` operation, and - * discarded afterwards. - * - * **Note: `fetch()` calls are inflight-unique** - * - * If you call `fetch()` multiple times with the same key value, - * then every call after the first will resolve on the same - * promise1, - * _even if they have different settings that would otherwise change - * the behavior of the fetch_, such as `noDeleteOnFetchRejection` - * or `ignoreFetchAbort`. - * - * In most cases, this is not a problem (in fact, only fetching - * something once is what you probably want, if you're caching in - * the first place). If you are changing the fetch() options - * dramatically between runs, there's a good chance that you might - * be trying to fit divergent semantics into a single object, and - * would be better off with multiple cache instances. - * - * **1**: Ie, they're not the "same Promise", but they resolve at - * the same time, because they're both waiting on the same - * underlying fetchMethod response. - */ - fetch(k: K, fetchOptions: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : LRUCache.FetchOptionsWithContext): Promise; - fetch(k: unknown extends FC ? K : FC extends undefined | void ? K : never, fetchOptions?: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : never): Promise; - /** - * In some cases, `cache.fetch()` may resolve to `undefined`, either because - * a {@link LRUCache.OptionsBase#fetchMethod} was not provided (turning - * `cache.fetch(k)` into just an async wrapper around `cache.get(k)`) or - * because `ignoreFetchAbort` was specified (either to the constructor or - * in the {@link LRUCache.FetchOptions}). Also, the - * {@link OptionsBase.fetchMethod} may return `undefined` or `void`, making - * the test even more complicated. - * - * Because inferring the cases where `undefined` might be returned are so - * cumbersome, but testing for `undefined` can also be annoying, this method - * can be used, which will reject if `this.fetch()` resolves to undefined. - */ - forceFetch(k: K, fetchOptions: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : LRUCache.FetchOptionsWithContext): Promise; - forceFetch(k: unknown extends FC ? K : FC extends undefined | void ? K : never, fetchOptions?: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : never): Promise; - /** - * If the key is found in the cache, then this is equivalent to - * {@link LRUCache#get}. If not, in the cache, then calculate the value using - * the {@link LRUCache.OptionsBase.memoMethod}, and add it to the cache. - * - * If an `FC` type is set to a type other than `unknown`, `void`, or - * `undefined` in the LRUCache constructor, then all calls to `cache.memo()` - * _must_ provide a `context` option. If set to `undefined` or `void`, then - * calls to memo _must not_ provide a `context` option. - * - * The `context` param allows you to provide arbitrary data that might be - * relevant in the course of fetching the data. It is only relevant for the - * course of a single `memo()` operation, and discarded afterwards. - */ - memo(k: K, memoOptions: unknown extends FC ? LRUCache.MemoOptions : FC extends undefined | void ? LRUCache.MemoOptionsNoContext : LRUCache.MemoOptionsWithContext): V; - memo(k: unknown extends FC ? K : FC extends undefined | void ? K : never, memoOptions?: unknown extends FC ? LRUCache.MemoOptions : FC extends undefined | void ? LRUCache.MemoOptionsNoContext : never): V; - /** - * Return a value from the cache. Will update the recency of the cache - * entry found. - * - * If the key is not found, get() will return `undefined`. - */ - get(k: K, getOptions?: LRUCache.GetOptions): V | undefined; - /** - * Deletes a key out of the cache. - * - * Returns true if the key was deleted, false otherwise. - */ - delete(k: K): boolean; - /** - * Clear the cache entirely, throwing away all values. - */ - clear(): void; -} -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/index.d.ts.map b/node_modules/lru-cache/dist/commonjs/index.d.ts.map deleted file mode 100644 index 34d60c5..0000000 --- a/node_modules/lru-cache/dist/commonjs/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/index.js b/node_modules/lru-cache/dist/commonjs/index.js deleted file mode 100644 index 0589231..0000000 --- a/node_modules/lru-cache/dist/commonjs/index.js +++ /dev/null @@ -1,1546 +0,0 @@ -"use strict"; -/** - * @module LRUCache - */ -Object.defineProperty(exports, "__esModule", { value: true }); -exports.LRUCache = void 0; -const perf = typeof performance === 'object' && - performance && - typeof performance.now === 'function' - ? performance - : Date; -const warned = new Set(); -/* c8 ignore start */ -const PROCESS = (typeof process === 'object' && !!process ? process : {}); -/* c8 ignore start */ -const emitWarning = (msg, type, code, fn) => { - typeof PROCESS.emitWarning === 'function' - ? PROCESS.emitWarning(msg, type, code, fn) - : console.error(`[${code}] ${type}: ${msg}`); -}; -let AC = globalThis.AbortController; -let AS = globalThis.AbortSignal; -/* c8 ignore start */ -if (typeof AC === 'undefined') { - //@ts-ignore - AS = class AbortSignal { - onabort; - _onabort = []; - reason; - aborted = false; - addEventListener(_, fn) { - this._onabort.push(fn); - } - }; - //@ts-ignore - AC = class AbortController { - constructor() { - warnACPolyfill(); - } - signal = new AS(); - abort(reason) { - if (this.signal.aborted) - return; - //@ts-ignore - this.signal.reason = reason; - //@ts-ignore - this.signal.aborted = true; - //@ts-ignore - for (const fn of this.signal._onabort) { - fn(reason); - } - this.signal.onabort?.(reason); - } - }; - let printACPolyfillWarning = PROCESS.env?.LRU_CACHE_IGNORE_AC_WARNING !== '1'; - const warnACPolyfill = () => { - if (!printACPolyfillWarning) - return; - printACPolyfillWarning = false; - emitWarning('AbortController is not defined. If using lru-cache in ' + - 'node 14, load an AbortController polyfill from the ' + - '`node-abort-controller` package. A minimal polyfill is ' + - 'provided for use by LRUCache.fetch(), but it should not be ' + - 'relied upon in other contexts (eg, passing it to other APIs that ' + - 'use AbortController/AbortSignal might have undesirable effects). ' + - 'You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.', 'NO_ABORT_CONTROLLER', 'ENOTSUP', warnACPolyfill); - }; -} -/* c8 ignore stop */ -const shouldWarn = (code) => !warned.has(code); -const TYPE = Symbol('type'); -const isPosInt = (n) => n && n === Math.floor(n) && n > 0 && isFinite(n); -/* c8 ignore start */ -// This is a little bit ridiculous, tbh. -// The maximum array length is 2^32-1 or thereabouts on most JS impls. -// And well before that point, you're caching the entire world, I mean, -// that's ~32GB of just integers for the next/prev links, plus whatever -// else to hold that many keys and values. Just filling the memory with -// zeroes at init time is brutal when you get that big. -// But why not be complete? -// Maybe in the future, these limits will have expanded. -const getUintArray = (max) => !isPosInt(max) - ? null - : max <= Math.pow(2, 8) - ? Uint8Array - : max <= Math.pow(2, 16) - ? Uint16Array - : max <= Math.pow(2, 32) - ? Uint32Array - : max <= Number.MAX_SAFE_INTEGER - ? ZeroArray - : null; -/* c8 ignore stop */ -class ZeroArray extends Array { - constructor(size) { - super(size); - this.fill(0); - } -} -class Stack { - heap; - length; - // private constructor - static #constructing = false; - static create(max) { - const HeapCls = getUintArray(max); - if (!HeapCls) - return []; - Stack.#constructing = true; - const s = new Stack(max, HeapCls); - Stack.#constructing = false; - return s; - } - constructor(max, HeapCls) { - /* c8 ignore start */ - if (!Stack.#constructing) { - throw new TypeError('instantiate Stack using Stack.create(n)'); - } - /* c8 ignore stop */ - this.heap = new HeapCls(max); - this.length = 0; - } - push(n) { - this.heap[this.length++] = n; - } - pop() { - return this.heap[--this.length]; - } -} -/** - * Default export, the thing you're using this module to get. - * - * The `K` and `V` types define the key and value types, respectively. The - * optional `FC` type defines the type of the `context` object passed to - * `cache.fetch()` and `cache.memo()`. - * - * Keys and values **must not** be `null` or `undefined`. - * - * All properties from the options object (with the exception of `max`, - * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are - * added as normal public members. (The listed options are read-only getters.) - * - * Changing any of these will alter the defaults for subsequent method calls. - */ -class LRUCache { - // options that cannot be changed without disaster - #max; - #maxSize; - #dispose; - #disposeAfter; - #fetchMethod; - #memoMethod; - /** - * {@link LRUCache.OptionsBase.ttl} - */ - ttl; - /** - * {@link LRUCache.OptionsBase.ttlResolution} - */ - ttlResolution; - /** - * {@link LRUCache.OptionsBase.ttlAutopurge} - */ - ttlAutopurge; - /** - * {@link LRUCache.OptionsBase.updateAgeOnGet} - */ - updateAgeOnGet; - /** - * {@link LRUCache.OptionsBase.updateAgeOnHas} - */ - updateAgeOnHas; - /** - * {@link LRUCache.OptionsBase.allowStale} - */ - allowStale; - /** - * {@link LRUCache.OptionsBase.noDisposeOnSet} - */ - noDisposeOnSet; - /** - * {@link LRUCache.OptionsBase.noUpdateTTL} - */ - noUpdateTTL; - /** - * {@link LRUCache.OptionsBase.maxEntrySize} - */ - maxEntrySize; - /** - * {@link LRUCache.OptionsBase.sizeCalculation} - */ - sizeCalculation; - /** - * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection} - */ - noDeleteOnFetchRejection; - /** - * {@link LRUCache.OptionsBase.noDeleteOnStaleGet} - */ - noDeleteOnStaleGet; - /** - * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort} - */ - allowStaleOnFetchAbort; - /** - * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} - */ - allowStaleOnFetchRejection; - /** - * {@link LRUCache.OptionsBase.ignoreFetchAbort} - */ - ignoreFetchAbort; - // computed properties - #size; - #calculatedSize; - #keyMap; - #keyList; - #valList; - #next; - #prev; - #head; - #tail; - #free; - #disposed; - #sizes; - #starts; - #ttls; - #hasDispose; - #hasFetchMethod; - #hasDisposeAfter; - /** - * Do not call this method unless you need to inspect the - * inner workings of the cache. If anything returned by this - * object is modified in any way, strange breakage may occur. - * - * These fields are private for a reason! - * - * @internal - */ - static unsafeExposeInternals(c) { - return { - // properties - starts: c.#starts, - ttls: c.#ttls, - sizes: c.#sizes, - keyMap: c.#keyMap, - keyList: c.#keyList, - valList: c.#valList, - next: c.#next, - prev: c.#prev, - get head() { - return c.#head; - }, - get tail() { - return c.#tail; - }, - free: c.#free, - // methods - isBackgroundFetch: (p) => c.#isBackgroundFetch(p), - backgroundFetch: (k, index, options, context) => c.#backgroundFetch(k, index, options, context), - moveToTail: (index) => c.#moveToTail(index), - indexes: (options) => c.#indexes(options), - rindexes: (options) => c.#rindexes(options), - isStale: (index) => c.#isStale(index), - }; - } - // Protected read-only members - /** - * {@link LRUCache.OptionsBase.max} (read-only) - */ - get max() { - return this.#max; - } - /** - * {@link LRUCache.OptionsBase.maxSize} (read-only) - */ - get maxSize() { - return this.#maxSize; - } - /** - * The total computed size of items in the cache (read-only) - */ - get calculatedSize() { - return this.#calculatedSize; - } - /** - * The number of items stored in the cache (read-only) - */ - get size() { - return this.#size; - } - /** - * {@link LRUCache.OptionsBase.fetchMethod} (read-only) - */ - get fetchMethod() { - return this.#fetchMethod; - } - get memoMethod() { - return this.#memoMethod; - } - /** - * {@link LRUCache.OptionsBase.dispose} (read-only) - */ - get dispose() { - return this.#dispose; - } - /** - * {@link LRUCache.OptionsBase.disposeAfter} (read-only) - */ - get disposeAfter() { - return this.#disposeAfter; - } - constructor(options) { - const { max = 0, ttl, ttlResolution = 1, ttlAutopurge, updateAgeOnGet, updateAgeOnHas, allowStale, dispose, disposeAfter, noDisposeOnSet, noUpdateTTL, maxSize = 0, maxEntrySize = 0, sizeCalculation, fetchMethod, memoMethod, noDeleteOnFetchRejection, noDeleteOnStaleGet, allowStaleOnFetchRejection, allowStaleOnFetchAbort, ignoreFetchAbort, } = options; - if (max !== 0 && !isPosInt(max)) { - throw new TypeError('max option must be a nonnegative integer'); - } - const UintArray = max ? getUintArray(max) : Array; - if (!UintArray) { - throw new Error('invalid max value: ' + max); - } - this.#max = max; - this.#maxSize = maxSize; - this.maxEntrySize = maxEntrySize || this.#maxSize; - this.sizeCalculation = sizeCalculation; - if (this.sizeCalculation) { - if (!this.#maxSize && !this.maxEntrySize) { - throw new TypeError('cannot set sizeCalculation without setting maxSize or maxEntrySize'); - } - if (typeof this.sizeCalculation !== 'function') { - throw new TypeError('sizeCalculation set to non-function'); - } - } - if (memoMethod !== undefined && - typeof memoMethod !== 'function') { - throw new TypeError('memoMethod must be a function if defined'); - } - this.#memoMethod = memoMethod; - if (fetchMethod !== undefined && - typeof fetchMethod !== 'function') { - throw new TypeError('fetchMethod must be a function if specified'); - } - this.#fetchMethod = fetchMethod; - this.#hasFetchMethod = !!fetchMethod; - this.#keyMap = new Map(); - this.#keyList = new Array(max).fill(undefined); - this.#valList = new Array(max).fill(undefined); - this.#next = new UintArray(max); - this.#prev = new UintArray(max); - this.#head = 0; - this.#tail = 0; - this.#free = Stack.create(max); - this.#size = 0; - this.#calculatedSize = 0; - if (typeof dispose === 'function') { - this.#dispose = dispose; - } - if (typeof disposeAfter === 'function') { - this.#disposeAfter = disposeAfter; - this.#disposed = []; - } - else { - this.#disposeAfter = undefined; - this.#disposed = undefined; - } - this.#hasDispose = !!this.#dispose; - this.#hasDisposeAfter = !!this.#disposeAfter; - this.noDisposeOnSet = !!noDisposeOnSet; - this.noUpdateTTL = !!noUpdateTTL; - this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection; - this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection; - this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort; - this.ignoreFetchAbort = !!ignoreFetchAbort; - // NB: maxEntrySize is set to maxSize if it's set - if (this.maxEntrySize !== 0) { - if (this.#maxSize !== 0) { - if (!isPosInt(this.#maxSize)) { - throw new TypeError('maxSize must be a positive integer if specified'); - } - } - if (!isPosInt(this.maxEntrySize)) { - throw new TypeError('maxEntrySize must be a positive integer if specified'); - } - this.#initializeSizeTracking(); - } - this.allowStale = !!allowStale; - this.noDeleteOnStaleGet = !!noDeleteOnStaleGet; - this.updateAgeOnGet = !!updateAgeOnGet; - this.updateAgeOnHas = !!updateAgeOnHas; - this.ttlResolution = - isPosInt(ttlResolution) || ttlResolution === 0 - ? ttlResolution - : 1; - this.ttlAutopurge = !!ttlAutopurge; - this.ttl = ttl || 0; - if (this.ttl) { - if (!isPosInt(this.ttl)) { - throw new TypeError('ttl must be a positive integer if specified'); - } - this.#initializeTTLTracking(); - } - // do not allow completely unbounded caches - if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) { - throw new TypeError('At least one of max, maxSize, or ttl is required'); - } - if (!this.ttlAutopurge && !this.#max && !this.#maxSize) { - const code = 'LRU_CACHE_UNBOUNDED'; - if (shouldWarn(code)) { - warned.add(code); - const msg = 'TTL caching without ttlAutopurge, max, or maxSize can ' + - 'result in unbounded memory consumption.'; - emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache); - } - } - } - /** - * Return the number of ms left in the item's TTL. If item is not in cache, - * returns `0`. Returns `Infinity` if item is in cache without a defined TTL. - */ - getRemainingTTL(key) { - return this.#keyMap.has(key) ? Infinity : 0; - } - #initializeTTLTracking() { - const ttls = new ZeroArray(this.#max); - const starts = new ZeroArray(this.#max); - this.#ttls = ttls; - this.#starts = starts; - this.#setItemTTL = (index, ttl, start = perf.now()) => { - starts[index] = ttl !== 0 ? start : 0; - ttls[index] = ttl; - if (ttl !== 0 && this.ttlAutopurge) { - const t = setTimeout(() => { - if (this.#isStale(index)) { - this.#delete(this.#keyList[index], 'expire'); - } - }, ttl + 1); - // unref() not supported on all platforms - /* c8 ignore start */ - if (t.unref) { - t.unref(); - } - /* c8 ignore stop */ - } - }; - this.#updateItemAge = index => { - starts[index] = ttls[index] !== 0 ? perf.now() : 0; - }; - this.#statusTTL = (status, index) => { - if (ttls[index]) { - const ttl = ttls[index]; - const start = starts[index]; - /* c8 ignore next */ - if (!ttl || !start) - return; - status.ttl = ttl; - status.start = start; - status.now = cachedNow || getNow(); - const age = status.now - start; - status.remainingTTL = ttl - age; - } - }; - // debounce calls to perf.now() to 1s so we're not hitting - // that costly call repeatedly. - let cachedNow = 0; - const getNow = () => { - const n = perf.now(); - if (this.ttlResolution > 0) { - cachedNow = n; - const t = setTimeout(() => (cachedNow = 0), this.ttlResolution); - // not available on all platforms - /* c8 ignore start */ - if (t.unref) { - t.unref(); - } - /* c8 ignore stop */ - } - return n; - }; - this.getRemainingTTL = key => { - const index = this.#keyMap.get(key); - if (index === undefined) { - return 0; - } - const ttl = ttls[index]; - const start = starts[index]; - if (!ttl || !start) { - return Infinity; - } - const age = (cachedNow || getNow()) - start; - return ttl - age; - }; - this.#isStale = index => { - const s = starts[index]; - const t = ttls[index]; - return !!t && !!s && (cachedNow || getNow()) - s > t; - }; - } - // conditionally set private methods related to TTL - #updateItemAge = () => { }; - #statusTTL = () => { }; - #setItemTTL = () => { }; - /* c8 ignore stop */ - #isStale = () => false; - #initializeSizeTracking() { - const sizes = new ZeroArray(this.#max); - this.#calculatedSize = 0; - this.#sizes = sizes; - this.#removeItemSize = index => { - this.#calculatedSize -= sizes[index]; - sizes[index] = 0; - }; - this.#requireSize = (k, v, size, sizeCalculation) => { - // provisionally accept background fetches. - // actual value size will be checked when they return. - if (this.#isBackgroundFetch(v)) { - return 0; - } - if (!isPosInt(size)) { - if (sizeCalculation) { - if (typeof sizeCalculation !== 'function') { - throw new TypeError('sizeCalculation must be a function'); - } - size = sizeCalculation(v, k); - if (!isPosInt(size)) { - throw new TypeError('sizeCalculation return invalid (expect positive integer)'); - } - } - else { - throw new TypeError('invalid size value (must be positive integer). ' + - 'When maxSize or maxEntrySize is used, sizeCalculation ' + - 'or size must be set.'); - } - } - return size; - }; - this.#addItemSize = (index, size, status) => { - sizes[index] = size; - if (this.#maxSize) { - const maxSize = this.#maxSize - sizes[index]; - while (this.#calculatedSize > maxSize) { - this.#evict(true); - } - } - this.#calculatedSize += sizes[index]; - if (status) { - status.entrySize = size; - status.totalCalculatedSize = this.#calculatedSize; - } - }; - } - #removeItemSize = _i => { }; - #addItemSize = (_i, _s, _st) => { }; - #requireSize = (_k, _v, size, sizeCalculation) => { - if (size || sizeCalculation) { - throw new TypeError('cannot set size without setting maxSize or maxEntrySize on cache'); - } - return 0; - }; - *#indexes({ allowStale = this.allowStale } = {}) { - if (this.#size) { - for (let i = this.#tail; true;) { - if (!this.#isValidIndex(i)) { - break; - } - if (allowStale || !this.#isStale(i)) { - yield i; - } - if (i === this.#head) { - break; - } - else { - i = this.#prev[i]; - } - } - } - } - *#rindexes({ allowStale = this.allowStale } = {}) { - if (this.#size) { - for (let i = this.#head; true;) { - if (!this.#isValidIndex(i)) { - break; - } - if (allowStale || !this.#isStale(i)) { - yield i; - } - if (i === this.#tail) { - break; - } - else { - i = this.#next[i]; - } - } - } - } - #isValidIndex(index) { - return (index !== undefined && - this.#keyMap.get(this.#keyList[index]) === index); - } - /** - * Return a generator yielding `[key, value]` pairs, - * in order from most recently used to least recently used. - */ - *entries() { - for (const i of this.#indexes()) { - if (this.#valList[i] !== undefined && - this.#keyList[i] !== undefined && - !this.#isBackgroundFetch(this.#valList[i])) { - yield [this.#keyList[i], this.#valList[i]]; - } - } - } - /** - * Inverse order version of {@link LRUCache.entries} - * - * Return a generator yielding `[key, value]` pairs, - * in order from least recently used to most recently used. - */ - *rentries() { - for (const i of this.#rindexes()) { - if (this.#valList[i] !== undefined && - this.#keyList[i] !== undefined && - !this.#isBackgroundFetch(this.#valList[i])) { - yield [this.#keyList[i], this.#valList[i]]; - } - } - } - /** - * Return a generator yielding the keys in the cache, - * in order from most recently used to least recently used. - */ - *keys() { - for (const i of this.#indexes()) { - const k = this.#keyList[i]; - if (k !== undefined && - !this.#isBackgroundFetch(this.#valList[i])) { - yield k; - } - } - } - /** - * Inverse order version of {@link LRUCache.keys} - * - * Return a generator yielding the keys in the cache, - * in order from least recently used to most recently used. - */ - *rkeys() { - for (const i of this.#rindexes()) { - const k = this.#keyList[i]; - if (k !== undefined && - !this.#isBackgroundFetch(this.#valList[i])) { - yield k; - } - } - } - /** - * Return a generator yielding the values in the cache, - * in order from most recently used to least recently used. - */ - *values() { - for (const i of this.#indexes()) { - const v = this.#valList[i]; - if (v !== undefined && - !this.#isBackgroundFetch(this.#valList[i])) { - yield this.#valList[i]; - } - } - } - /** - * Inverse order version of {@link LRUCache.values} - * - * Return a generator yielding the values in the cache, - * in order from least recently used to most recently used. - */ - *rvalues() { - for (const i of this.#rindexes()) { - const v = this.#valList[i]; - if (v !== undefined && - !this.#isBackgroundFetch(this.#valList[i])) { - yield this.#valList[i]; - } - } - } - /** - * Iterating over the cache itself yields the same results as - * {@link LRUCache.entries} - */ - [Symbol.iterator]() { - return this.entries(); - } - /** - * A String value that is used in the creation of the default string - * description of an object. Called by the built-in method - * `Object.prototype.toString`. - */ - [Symbol.toStringTag] = 'LRUCache'; - /** - * Find a value for which the supplied fn method returns a truthy value, - * similar to `Array.find()`. fn is called as `fn(value, key, cache)`. - */ - find(fn, getOptions = {}) { - for (const i of this.#indexes()) { - const v = this.#valList[i]; - const value = this.#isBackgroundFetch(v) - ? v.__staleWhileFetching - : v; - if (value === undefined) - continue; - if (fn(value, this.#keyList[i], this)) { - return this.get(this.#keyList[i], getOptions); - } - } - } - /** - * Call the supplied function on each item in the cache, in order from most - * recently used to least recently used. - * - * `fn` is called as `fn(value, key, cache)`. - * - * If `thisp` is provided, function will be called in the `this`-context of - * the provided object, or the cache if no `thisp` object is provided. - * - * Does not update age or recenty of use, or iterate over stale values. - */ - forEach(fn, thisp = this) { - for (const i of this.#indexes()) { - const v = this.#valList[i]; - const value = this.#isBackgroundFetch(v) - ? v.__staleWhileFetching - : v; - if (value === undefined) - continue; - fn.call(thisp, value, this.#keyList[i], this); - } - } - /** - * The same as {@link LRUCache.forEach} but items are iterated over in - * reverse order. (ie, less recently used items are iterated over first.) - */ - rforEach(fn, thisp = this) { - for (const i of this.#rindexes()) { - const v = this.#valList[i]; - const value = this.#isBackgroundFetch(v) - ? v.__staleWhileFetching - : v; - if (value === undefined) - continue; - fn.call(thisp, value, this.#keyList[i], this); - } - } - /** - * Delete any stale entries. Returns true if anything was removed, - * false otherwise. - */ - purgeStale() { - let deleted = false; - for (const i of this.#rindexes({ allowStale: true })) { - if (this.#isStale(i)) { - this.#delete(this.#keyList[i], 'expire'); - deleted = true; - } - } - return deleted; - } - /** - * Get the extended info about a given entry, to get its value, size, and - * TTL info simultaneously. Returns `undefined` if the key is not present. - * - * Unlike {@link LRUCache#dump}, which is designed to be portable and survive - * serialization, the `start` value is always the current timestamp, and the - * `ttl` is a calculated remaining time to live (negative if expired). - * - * Always returns stale values, if their info is found in the cache, so be - * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl}) - * if relevant. - */ - info(key) { - const i = this.#keyMap.get(key); - if (i === undefined) - return undefined; - const v = this.#valList[i]; - const value = this.#isBackgroundFetch(v) - ? v.__staleWhileFetching - : v; - if (value === undefined) - return undefined; - const entry = { value }; - if (this.#ttls && this.#starts) { - const ttl = this.#ttls[i]; - const start = this.#starts[i]; - if (ttl && start) { - const remain = ttl - (perf.now() - start); - entry.ttl = remain; - entry.start = Date.now(); - } - } - if (this.#sizes) { - entry.size = this.#sizes[i]; - } - return entry; - } - /** - * Return an array of [key, {@link LRUCache.Entry}] tuples which can be - * passed to {@link LRLUCache#load}. - * - * The `start` fields are calculated relative to a portable `Date.now()` - * timestamp, even if `performance.now()` is available. - * - * Stale entries are always included in the `dump`, even if - * {@link LRUCache.OptionsBase.allowStale} is false. - * - * Note: this returns an actual array, not a generator, so it can be more - * easily passed around. - */ - dump() { - const arr = []; - for (const i of this.#indexes({ allowStale: true })) { - const key = this.#keyList[i]; - const v = this.#valList[i]; - const value = this.#isBackgroundFetch(v) - ? v.__staleWhileFetching - : v; - if (value === undefined || key === undefined) - continue; - const entry = { value }; - if (this.#ttls && this.#starts) { - entry.ttl = this.#ttls[i]; - // always dump the start relative to a portable timestamp - // it's ok for this to be a bit slow, it's a rare operation. - const age = perf.now() - this.#starts[i]; - entry.start = Math.floor(Date.now() - age); - } - if (this.#sizes) { - entry.size = this.#sizes[i]; - } - arr.unshift([key, entry]); - } - return arr; - } - /** - * Reset the cache and load in the items in entries in the order listed. - * - * The shape of the resulting cache may be different if the same options are - * not used in both caches. - * - * The `start` fields are assumed to be calculated relative to a portable - * `Date.now()` timestamp, even if `performance.now()` is available. - */ - load(arr) { - this.clear(); - for (const [key, entry] of arr) { - if (entry.start) { - // entry.start is a portable timestamp, but we may be using - // node's performance.now(), so calculate the offset, so that - // we get the intended remaining TTL, no matter how long it's - // been on ice. - // - // it's ok for this to be a bit slow, it's a rare operation. - const age = Date.now() - entry.start; - entry.start = perf.now() - age; - } - this.set(key, entry.value, entry); - } - } - /** - * Add a value to the cache. - * - * Note: if `undefined` is specified as a value, this is an alias for - * {@link LRUCache#delete} - * - * Fields on the {@link LRUCache.SetOptions} options param will override - * their corresponding values in the constructor options for the scope - * of this single `set()` operation. - * - * If `start` is provided, then that will set the effective start - * time for the TTL calculation. Note that this must be a previous - * value of `performance.now()` if supported, or a previous value of - * `Date.now()` if not. - * - * Options object may also include `size`, which will prevent - * calling the `sizeCalculation` function and just use the specified - * number if it is a positive integer, and `noDisposeOnSet` which - * will prevent calling a `dispose` function in the case of - * overwrites. - * - * If the `size` (or return value of `sizeCalculation`) for a given - * entry is greater than `maxEntrySize`, then the item will not be - * added to the cache. - * - * Will update the recency of the entry. - * - * If the value is `undefined`, then this is an alias for - * `cache.delete(key)`. `undefined` is never stored in the cache. - */ - set(k, v, setOptions = {}) { - if (v === undefined) { - this.delete(k); - return this; - } - const { ttl = this.ttl, start, noDisposeOnSet = this.noDisposeOnSet, sizeCalculation = this.sizeCalculation, status, } = setOptions; - let { noUpdateTTL = this.noUpdateTTL } = setOptions; - const size = this.#requireSize(k, v, setOptions.size || 0, sizeCalculation); - // if the item doesn't fit, don't do anything - // NB: maxEntrySize set to maxSize by default - if (this.maxEntrySize && size > this.maxEntrySize) { - if (status) { - status.set = 'miss'; - status.maxEntrySizeExceeded = true; - } - // have to delete, in case something is there already. - this.#delete(k, 'set'); - return this; - } - let index = this.#size === 0 ? undefined : this.#keyMap.get(k); - if (index === undefined) { - // addition - index = (this.#size === 0 - ? this.#tail - : this.#free.length !== 0 - ? this.#free.pop() - : this.#size === this.#max - ? this.#evict(false) - : this.#size); - this.#keyList[index] = k; - this.#valList[index] = v; - this.#keyMap.set(k, index); - this.#next[this.#tail] = index; - this.#prev[index] = this.#tail; - this.#tail = index; - this.#size++; - this.#addItemSize(index, size, status); - if (status) - status.set = 'add'; - noUpdateTTL = false; - } - else { - // update - this.#moveToTail(index); - const oldVal = this.#valList[index]; - if (v !== oldVal) { - if (this.#hasFetchMethod && this.#isBackgroundFetch(oldVal)) { - oldVal.__abortController.abort(new Error('replaced')); - const { __staleWhileFetching: s } = oldVal; - if (s !== undefined && !noDisposeOnSet) { - if (this.#hasDispose) { - this.#dispose?.(s, k, 'set'); - } - if (this.#hasDisposeAfter) { - this.#disposed?.push([s, k, 'set']); - } - } - } - else if (!noDisposeOnSet) { - if (this.#hasDispose) { - this.#dispose?.(oldVal, k, 'set'); - } - if (this.#hasDisposeAfter) { - this.#disposed?.push([oldVal, k, 'set']); - } - } - this.#removeItemSize(index); - this.#addItemSize(index, size, status); - this.#valList[index] = v; - if (status) { - status.set = 'replace'; - const oldValue = oldVal && this.#isBackgroundFetch(oldVal) - ? oldVal.__staleWhileFetching - : oldVal; - if (oldValue !== undefined) - status.oldValue = oldValue; - } - } - else if (status) { - status.set = 'update'; - } - } - if (ttl !== 0 && !this.#ttls) { - this.#initializeTTLTracking(); - } - if (this.#ttls) { - if (!noUpdateTTL) { - this.#setItemTTL(index, ttl, start); - } - if (status) - this.#statusTTL(status, index); - } - if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) { - const dt = this.#disposed; - let task; - while ((task = dt?.shift())) { - this.#disposeAfter?.(...task); - } - } - return this; - } - /** - * Evict the least recently used item, returning its value or - * `undefined` if cache is empty. - */ - pop() { - try { - while (this.#size) { - const val = this.#valList[this.#head]; - this.#evict(true); - if (this.#isBackgroundFetch(val)) { - if (val.__staleWhileFetching) { - return val.__staleWhileFetching; - } - } - else if (val !== undefined) { - return val; - } - } - } - finally { - if (this.#hasDisposeAfter && this.#disposed) { - const dt = this.#disposed; - let task; - while ((task = dt?.shift())) { - this.#disposeAfter?.(...task); - } - } - } - } - #evict(free) { - const head = this.#head; - const k = this.#keyList[head]; - const v = this.#valList[head]; - if (this.#hasFetchMethod && this.#isBackgroundFetch(v)) { - v.__abortController.abort(new Error('evicted')); - } - else if (this.#hasDispose || this.#hasDisposeAfter) { - if (this.#hasDispose) { - this.#dispose?.(v, k, 'evict'); - } - if (this.#hasDisposeAfter) { - this.#disposed?.push([v, k, 'evict']); - } - } - this.#removeItemSize(head); - // if we aren't about to use the index, then null these out - if (free) { - this.#keyList[head] = undefined; - this.#valList[head] = undefined; - this.#free.push(head); - } - if (this.#size === 1) { - this.#head = this.#tail = 0; - this.#free.length = 0; - } - else { - this.#head = this.#next[head]; - } - this.#keyMap.delete(k); - this.#size--; - return head; - } - /** - * Check if a key is in the cache, without updating the recency of use. - * Will return false if the item is stale, even though it is technically - * in the cache. - * - * Check if a key is in the cache, without updating the recency of - * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set - * to `true` in either the options or the constructor. - * - * Will return `false` if the item is stale, even though it is technically in - * the cache. The difference can be determined (if it matters) by using a - * `status` argument, and inspecting the `has` field. - * - * Will not update item age unless - * {@link LRUCache.OptionsBase.updateAgeOnHas} is set. - */ - has(k, hasOptions = {}) { - const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions; - const index = this.#keyMap.get(k); - if (index !== undefined) { - const v = this.#valList[index]; - if (this.#isBackgroundFetch(v) && - v.__staleWhileFetching === undefined) { - return false; - } - if (!this.#isStale(index)) { - if (updateAgeOnHas) { - this.#updateItemAge(index); - } - if (status) { - status.has = 'hit'; - this.#statusTTL(status, index); - } - return true; - } - else if (status) { - status.has = 'stale'; - this.#statusTTL(status, index); - } - } - else if (status) { - status.has = 'miss'; - } - return false; - } - /** - * Like {@link LRUCache#get} but doesn't update recency or delete stale - * items. - * - * Returns `undefined` if the item is stale, unless - * {@link LRUCache.OptionsBase.allowStale} is set. - */ - peek(k, peekOptions = {}) { - const { allowStale = this.allowStale } = peekOptions; - const index = this.#keyMap.get(k); - if (index === undefined || - (!allowStale && this.#isStale(index))) { - return; - } - const v = this.#valList[index]; - // either stale and allowed, or forcing a refresh of non-stale value - return this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; - } - #backgroundFetch(k, index, options, context) { - const v = index === undefined ? undefined : this.#valList[index]; - if (this.#isBackgroundFetch(v)) { - return v; - } - const ac = new AC(); - const { signal } = options; - // when/if our AC signals, then stop listening to theirs. - signal?.addEventListener('abort', () => ac.abort(signal.reason), { - signal: ac.signal, - }); - const fetchOpts = { - signal: ac.signal, - options, - context, - }; - const cb = (v, updateCache = false) => { - const { aborted } = ac.signal; - const ignoreAbort = options.ignoreFetchAbort && v !== undefined; - if (options.status) { - if (aborted && !updateCache) { - options.status.fetchAborted = true; - options.status.fetchError = ac.signal.reason; - if (ignoreAbort) - options.status.fetchAbortIgnored = true; - } - else { - options.status.fetchResolved = true; - } - } - if (aborted && !ignoreAbort && !updateCache) { - return fetchFail(ac.signal.reason); - } - // either we didn't abort, and are still here, or we did, and ignored - const bf = p; - if (this.#valList[index] === p) { - if (v === undefined) { - if (bf.__staleWhileFetching) { - this.#valList[index] = bf.__staleWhileFetching; - } - else { - this.#delete(k, 'fetch'); - } - } - else { - if (options.status) - options.status.fetchUpdated = true; - this.set(k, v, fetchOpts.options); - } - } - return v; - }; - const eb = (er) => { - if (options.status) { - options.status.fetchRejected = true; - options.status.fetchError = er; - } - return fetchFail(er); - }; - const fetchFail = (er) => { - const { aborted } = ac.signal; - const allowStaleAborted = aborted && options.allowStaleOnFetchAbort; - const allowStale = allowStaleAborted || options.allowStaleOnFetchRejection; - const noDelete = allowStale || options.noDeleteOnFetchRejection; - const bf = p; - if (this.#valList[index] === p) { - // if we allow stale on fetch rejections, then we need to ensure that - // the stale value is not removed from the cache when the fetch fails. - const del = !noDelete || bf.__staleWhileFetching === undefined; - if (del) { - this.#delete(k, 'fetch'); - } - else if (!allowStaleAborted) { - // still replace the *promise* with the stale value, - // since we are done with the promise at this point. - // leave it untouched if we're still waiting for an - // aborted background fetch that hasn't yet returned. - this.#valList[index] = bf.__staleWhileFetching; - } - } - if (allowStale) { - if (options.status && bf.__staleWhileFetching !== undefined) { - options.status.returnedStale = true; - } - return bf.__staleWhileFetching; - } - else if (bf.__returned === bf) { - throw er; - } - }; - const pcall = (res, rej) => { - const fmp = this.#fetchMethod?.(k, v, fetchOpts); - if (fmp && fmp instanceof Promise) { - fmp.then(v => res(v === undefined ? undefined : v), rej); - } - // ignored, we go until we finish, regardless. - // defer check until we are actually aborting, - // so fetchMethod can override. - ac.signal.addEventListener('abort', () => { - if (!options.ignoreFetchAbort || - options.allowStaleOnFetchAbort) { - res(undefined); - // when it eventually resolves, update the cache. - if (options.allowStaleOnFetchAbort) { - res = v => cb(v, true); - } - } - }); - }; - if (options.status) - options.status.fetchDispatched = true; - const p = new Promise(pcall).then(cb, eb); - const bf = Object.assign(p, { - __abortController: ac, - __staleWhileFetching: v, - __returned: undefined, - }); - if (index === undefined) { - // internal, don't expose status. - this.set(k, bf, { ...fetchOpts.options, status: undefined }); - index = this.#keyMap.get(k); - } - else { - this.#valList[index] = bf; - } - return bf; - } - #isBackgroundFetch(p) { - if (!this.#hasFetchMethod) - return false; - const b = p; - return (!!b && - b instanceof Promise && - b.hasOwnProperty('__staleWhileFetching') && - b.__abortController instanceof AC); - } - async fetch(k, fetchOptions = {}) { - const { - // get options - allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, - // set options - ttl = this.ttl, noDisposeOnSet = this.noDisposeOnSet, size = 0, sizeCalculation = this.sizeCalculation, noUpdateTTL = this.noUpdateTTL, - // fetch exclusive options - noDeleteOnFetchRejection = this.noDeleteOnFetchRejection, allowStaleOnFetchRejection = this.allowStaleOnFetchRejection, ignoreFetchAbort = this.ignoreFetchAbort, allowStaleOnFetchAbort = this.allowStaleOnFetchAbort, context, forceRefresh = false, status, signal, } = fetchOptions; - if (!this.#hasFetchMethod) { - if (status) - status.fetch = 'get'; - return this.get(k, { - allowStale, - updateAgeOnGet, - noDeleteOnStaleGet, - status, - }); - } - const options = { - allowStale, - updateAgeOnGet, - noDeleteOnStaleGet, - ttl, - noDisposeOnSet, - size, - sizeCalculation, - noUpdateTTL, - noDeleteOnFetchRejection, - allowStaleOnFetchRejection, - allowStaleOnFetchAbort, - ignoreFetchAbort, - status, - signal, - }; - let index = this.#keyMap.get(k); - if (index === undefined) { - if (status) - status.fetch = 'miss'; - const p = this.#backgroundFetch(k, index, options, context); - return (p.__returned = p); - } - else { - // in cache, maybe already fetching - const v = this.#valList[index]; - if (this.#isBackgroundFetch(v)) { - const stale = allowStale && v.__staleWhileFetching !== undefined; - if (status) { - status.fetch = 'inflight'; - if (stale) - status.returnedStale = true; - } - return stale ? v.__staleWhileFetching : (v.__returned = v); - } - // if we force a refresh, that means do NOT serve the cached value, - // unless we are already in the process of refreshing the cache. - const isStale = this.#isStale(index); - if (!forceRefresh && !isStale) { - if (status) - status.fetch = 'hit'; - this.#moveToTail(index); - if (updateAgeOnGet) { - this.#updateItemAge(index); - } - if (status) - this.#statusTTL(status, index); - return v; - } - // ok, it is stale or a forced refresh, and not already fetching. - // refresh the cache. - const p = this.#backgroundFetch(k, index, options, context); - const hasStale = p.__staleWhileFetching !== undefined; - const staleVal = hasStale && allowStale; - if (status) { - status.fetch = isStale ? 'stale' : 'refresh'; - if (staleVal && isStale) - status.returnedStale = true; - } - return staleVal ? p.__staleWhileFetching : (p.__returned = p); - } - } - async forceFetch(k, fetchOptions = {}) { - const v = await this.fetch(k, fetchOptions); - if (v === undefined) - throw new Error('fetch() returned undefined'); - return v; - } - memo(k, memoOptions = {}) { - const memoMethod = this.#memoMethod; - if (!memoMethod) { - throw new Error('no memoMethod provided to constructor'); - } - const { context, forceRefresh, ...options } = memoOptions; - const v = this.get(k, options); - if (!forceRefresh && v !== undefined) - return v; - const vv = memoMethod(k, v, { - options, - context, - }); - this.set(k, vv, options); - return vv; - } - /** - * Return a value from the cache. Will update the recency of the cache - * entry found. - * - * If the key is not found, get() will return `undefined`. - */ - get(k, getOptions = {}) { - const { allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, status, } = getOptions; - const index = this.#keyMap.get(k); - if (index !== undefined) { - const value = this.#valList[index]; - const fetching = this.#isBackgroundFetch(value); - if (status) - this.#statusTTL(status, index); - if (this.#isStale(index)) { - if (status) - status.get = 'stale'; - // delete only if not an in-flight background fetch - if (!fetching) { - if (!noDeleteOnStaleGet) { - this.#delete(k, 'expire'); - } - if (status && allowStale) - status.returnedStale = true; - return allowStale ? value : undefined; - } - else { - if (status && - allowStale && - value.__staleWhileFetching !== undefined) { - status.returnedStale = true; - } - return allowStale ? value.__staleWhileFetching : undefined; - } - } - else { - if (status) - status.get = 'hit'; - // if we're currently fetching it, we don't actually have it yet - // it's not stale, which means this isn't a staleWhileRefetching. - // If it's not stale, and fetching, AND has a __staleWhileFetching - // value, then that means the user fetched with {forceRefresh:true}, - // so it's safe to return that value. - if (fetching) { - return value.__staleWhileFetching; - } - this.#moveToTail(index); - if (updateAgeOnGet) { - this.#updateItemAge(index); - } - return value; - } - } - else if (status) { - status.get = 'miss'; - } - } - #connect(p, n) { - this.#prev[n] = p; - this.#next[p] = n; - } - #moveToTail(index) { - // if tail already, nothing to do - // if head, move head to next[index] - // else - // move next[prev[index]] to next[index] (head has no prev) - // move prev[next[index]] to prev[index] - // prev[index] = tail - // next[tail] = index - // tail = index - if (index !== this.#tail) { - if (index === this.#head) { - this.#head = this.#next[index]; - } - else { - this.#connect(this.#prev[index], this.#next[index]); - } - this.#connect(this.#tail, index); - this.#tail = index; - } - } - /** - * Deletes a key out of the cache. - * - * Returns true if the key was deleted, false otherwise. - */ - delete(k) { - return this.#delete(k, 'delete'); - } - #delete(k, reason) { - let deleted = false; - if (this.#size !== 0) { - const index = this.#keyMap.get(k); - if (index !== undefined) { - deleted = true; - if (this.#size === 1) { - this.#clear(reason); - } - else { - this.#removeItemSize(index); - const v = this.#valList[index]; - if (this.#isBackgroundFetch(v)) { - v.__abortController.abort(new Error('deleted')); - } - else if (this.#hasDispose || this.#hasDisposeAfter) { - if (this.#hasDispose) { - this.#dispose?.(v, k, reason); - } - if (this.#hasDisposeAfter) { - this.#disposed?.push([v, k, reason]); - } - } - this.#keyMap.delete(k); - this.#keyList[index] = undefined; - this.#valList[index] = undefined; - if (index === this.#tail) { - this.#tail = this.#prev[index]; - } - else if (index === this.#head) { - this.#head = this.#next[index]; - } - else { - const pi = this.#prev[index]; - this.#next[pi] = this.#next[index]; - const ni = this.#next[index]; - this.#prev[ni] = this.#prev[index]; - } - this.#size--; - this.#free.push(index); - } - } - } - if (this.#hasDisposeAfter && this.#disposed?.length) { - const dt = this.#disposed; - let task; - while ((task = dt?.shift())) { - this.#disposeAfter?.(...task); - } - } - return deleted; - } - /** - * Clear the cache entirely, throwing away all values. - */ - clear() { - return this.#clear('delete'); - } - #clear(reason) { - for (const index of this.#rindexes({ allowStale: true })) { - const v = this.#valList[index]; - if (this.#isBackgroundFetch(v)) { - v.__abortController.abort(new Error('deleted')); - } - else { - const k = this.#keyList[index]; - if (this.#hasDispose) { - this.#dispose?.(v, k, reason); - } - if (this.#hasDisposeAfter) { - this.#disposed?.push([v, k, reason]); - } - } - } - this.#keyMap.clear(); - this.#valList.fill(undefined); - this.#keyList.fill(undefined); - if (this.#ttls && this.#starts) { - this.#ttls.fill(0); - this.#starts.fill(0); - } - if (this.#sizes) { - this.#sizes.fill(0); - } - this.#head = 0; - this.#tail = 0; - this.#free.length = 0; - this.#calculatedSize = 0; - this.#size = 0; - if (this.#hasDisposeAfter && this.#disposed) { - const dt = this.#disposed; - let task; - while ((task = dt?.shift())) { - this.#disposeAfter?.(...task); - } - } - } -} -exports.LRUCache = LRUCache; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/index.js.map b/node_modules/lru-cache/dist/commonjs/index.js.map deleted file mode 100644 index 557c616..0000000 --- a/node_modules/lru-cache/dist/commonjs/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module LRUCache\n */\n\n// module-private names and types\ntype Perf = { now: () => number }\nconst perf: Perf =\n typeof performance === 'object' &&\n performance &&\n typeof performance.now === 'function'\n ? performance\n : Date\n\nconst warned = new Set()\n\n// either a function or a class\ntype ForC = ((...a: any[]) => any) | { new (...a: any[]): any }\n\n/* c8 ignore start */\nconst PROCESS = (\n typeof process === 'object' && !!process ? process : {}\n) as { [k: string]: any }\n/* c8 ignore start */\n\nconst emitWarning = (\n msg: string,\n type: string,\n code: string,\n fn: ForC\n) => {\n typeof PROCESS.emitWarning === 'function'\n ? PROCESS.emitWarning(msg, type, code, fn)\n : console.error(`[${code}] ${type}: ${msg}`)\n}\n\nlet AC = globalThis.AbortController\nlet AS = globalThis.AbortSignal\n\n/* c8 ignore start */\nif (typeof AC === 'undefined') {\n //@ts-ignore\n AS = class AbortSignal {\n onabort?: (...a: any[]) => any\n _onabort: ((...a: any[]) => any)[] = []\n reason?: any\n aborted: boolean = false\n addEventListener(_: string, fn: (...a: any[]) => any) {\n this._onabort.push(fn)\n }\n }\n //@ts-ignore\n AC = class AbortController {\n constructor() {\n warnACPolyfill()\n }\n signal = new AS()\n abort(reason: any) {\n if (this.signal.aborted) return\n //@ts-ignore\n this.signal.reason = reason\n //@ts-ignore\n this.signal.aborted = true\n //@ts-ignore\n for (const fn of this.signal._onabort) {\n fn(reason)\n }\n this.signal.onabort?.(reason)\n }\n }\n let printACPolyfillWarning =\n PROCESS.env?.LRU_CACHE_IGNORE_AC_WARNING !== '1'\n const warnACPolyfill = () => {\n if (!printACPolyfillWarning) return\n printACPolyfillWarning = false\n emitWarning(\n 'AbortController is not defined. If using lru-cache in ' +\n 'node 14, load an AbortController polyfill from the ' +\n '`node-abort-controller` package. A minimal polyfill is ' +\n 'provided for use by LRUCache.fetch(), but it should not be ' +\n 'relied upon in other contexts (eg, passing it to other APIs that ' +\n 'use AbortController/AbortSignal might have undesirable effects). ' +\n 'You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.',\n 'NO_ABORT_CONTROLLER',\n 'ENOTSUP',\n warnACPolyfill\n )\n }\n}\n/* c8 ignore stop */\n\nconst shouldWarn = (code: string) => !warned.has(code)\n\nconst TYPE = Symbol('type')\nexport type PosInt = number & { [TYPE]: 'Positive Integer' }\nexport type Index = number & { [TYPE]: 'LRUCache Index' }\n\nconst isPosInt = (n: any): n is PosInt =>\n n && n === Math.floor(n) && n > 0 && isFinite(n)\n\nexport type UintArray = Uint8Array | Uint16Array | Uint32Array\nexport type NumberArray = UintArray | number[]\n\n/* c8 ignore start */\n// This is a little bit ridiculous, tbh.\n// The maximum array length is 2^32-1 or thereabouts on most JS impls.\n// And well before that point, you're caching the entire world, I mean,\n// that's ~32GB of just integers for the next/prev links, plus whatever\n// else to hold that many keys and values. Just filling the memory with\n// zeroes at init time is brutal when you get that big.\n// But why not be complete?\n// Maybe in the future, these limits will have expanded.\nconst getUintArray = (max: number) =>\n !isPosInt(max)\n ? null\n : max <= Math.pow(2, 8)\n ? Uint8Array\n : max <= Math.pow(2, 16)\n ? Uint16Array\n : max <= Math.pow(2, 32)\n ? Uint32Array\n : max <= Number.MAX_SAFE_INTEGER\n ? ZeroArray\n : null\n/* c8 ignore stop */\n\nclass ZeroArray extends Array {\n constructor(size: number) {\n super(size)\n this.fill(0)\n }\n}\nexport type { ZeroArray }\nexport type { Stack }\n\nexport type StackLike = Stack | Index[]\nclass Stack {\n heap: NumberArray\n length: number\n // private constructor\n static #constructing: boolean = false\n static create(max: number): StackLike {\n const HeapCls = getUintArray(max)\n if (!HeapCls) return []\n Stack.#constructing = true\n const s = new Stack(max, HeapCls)\n Stack.#constructing = false\n return s\n }\n constructor(\n max: number,\n HeapCls: { new (n: number): NumberArray }\n ) {\n /* c8 ignore start */\n if (!Stack.#constructing) {\n throw new TypeError('instantiate Stack using Stack.create(n)')\n }\n /* c8 ignore stop */\n this.heap = new HeapCls(max)\n this.length = 0\n }\n push(n: Index) {\n this.heap[this.length++] = n\n }\n pop(): Index {\n return this.heap[--this.length] as Index\n }\n}\n\n/**\n * Promise representing an in-progress {@link LRUCache#fetch} call\n */\nexport type BackgroundFetch = Promise & {\n __returned: BackgroundFetch | undefined\n __abortController: AbortController\n __staleWhileFetching: V | undefined\n}\n\nexport type DisposeTask = [\n value: V,\n key: K,\n reason: LRUCache.DisposeReason\n]\n\nexport namespace LRUCache {\n /**\n * An integer greater than 0, reflecting the calculated size of items\n */\n export type Size = number\n\n /**\n * Integer greater than 0, representing some number of milliseconds, or the\n * time at which a TTL started counting from.\n */\n export type Milliseconds = number\n\n /**\n * An integer greater than 0, reflecting a number of items\n */\n export type Count = number\n\n /**\n * The reason why an item was removed from the cache, passed\n * to the {@link Disposer} methods.\n *\n * - `evict`: The item was evicted because it is the least recently used,\n * and the cache is full.\n * - `set`: A new value was set, overwriting the old value being disposed.\n * - `delete`: The item was explicitly deleted, either by calling\n * {@link LRUCache#delete}, {@link LRUCache#clear}, or\n * {@link LRUCache#set} with an undefined value.\n * - `expire`: The item was removed due to exceeding its TTL.\n * - `fetch`: A {@link OptionsBase#fetchMethod} operation returned\n * `undefined` or was aborted, causing the item to be deleted.\n */\n export type DisposeReason =\n | 'evict'\n | 'set'\n | 'delete'\n | 'expire'\n | 'fetch'\n /**\n * A method called upon item removal, passed as the\n * {@link OptionsBase.dispose} and/or\n * {@link OptionsBase.disposeAfter} options.\n */\n export type Disposer = (\n value: V,\n key: K,\n reason: DisposeReason\n ) => void\n\n /**\n * A function that returns the effective calculated size\n * of an entry in the cache.\n */\n export type SizeCalculator = (value: V, key: K) => Size\n\n /**\n * Options provided to the\n * {@link OptionsBase.fetchMethod} function.\n */\n export interface FetcherOptions {\n signal: AbortSignal\n options: FetcherFetchOptions\n /**\n * Object provided in the {@link FetchOptions.context} option to\n * {@link LRUCache#fetch}\n */\n context: FC\n }\n\n /**\n * Occasionally, it may be useful to track the internal behavior of the\n * cache, particularly for logging, debugging, or for behavior within the\n * `fetchMethod`. To do this, you can pass a `status` object to the\n * {@link LRUCache#fetch}, {@link LRUCache#get}, {@link LRUCache#set},\n * {@link LRUCache#memo}, and {@link LRUCache#has} methods.\n *\n * The `status` option should be a plain JavaScript object. The following\n * fields will be set on it appropriately, depending on the situation.\n */\n export interface Status {\n /**\n * The status of a set() operation.\n *\n * - add: the item was not found in the cache, and was added\n * - update: the item was in the cache, with the same value provided\n * - replace: the item was in the cache, and replaced\n * - miss: the item was not added to the cache for some reason\n */\n set?: 'add' | 'update' | 'replace' | 'miss'\n\n /**\n * the ttl stored for the item, or undefined if ttls are not used.\n */\n ttl?: Milliseconds\n\n /**\n * the start time for the item, or undefined if ttls are not used.\n */\n start?: Milliseconds\n\n /**\n * The timestamp used for TTL calculation\n */\n now?: Milliseconds\n\n /**\n * the remaining ttl for the item, or undefined if ttls are not used.\n */\n remainingTTL?: Milliseconds\n\n /**\n * The calculated size for the item, if sizes are used.\n */\n entrySize?: Size\n\n /**\n * The total calculated size of the cache, if sizes are used.\n */\n totalCalculatedSize?: Size\n\n /**\n * A flag indicating that the item was not stored, due to exceeding the\n * {@link OptionsBase.maxEntrySize}\n */\n maxEntrySizeExceeded?: true\n\n /**\n * The old value, specified in the case of `set:'update'` or\n * `set:'replace'`\n */\n oldValue?: V\n\n /**\n * The results of a {@link LRUCache#has} operation\n *\n * - hit: the item was found in the cache\n * - stale: the item was found in the cache, but is stale\n * - miss: the item was not found in the cache\n */\n has?: 'hit' | 'stale' | 'miss'\n\n /**\n * The status of a {@link LRUCache#fetch} operation.\n * Note that this can change as the underlying fetch() moves through\n * various states.\n *\n * - inflight: there is another fetch() for this key which is in process\n * - get: there is no {@link OptionsBase.fetchMethod}, so\n * {@link LRUCache#get} was called.\n * - miss: the item is not in cache, and will be fetched.\n * - hit: the item is in the cache, and was resolved immediately.\n * - stale: the item is in the cache, but stale.\n * - refresh: the item is in the cache, and not stale, but\n * {@link FetchOptions.forceRefresh} was specified.\n */\n fetch?: 'get' | 'inflight' | 'miss' | 'hit' | 'stale' | 'refresh'\n\n /**\n * The {@link OptionsBase.fetchMethod} was called\n */\n fetchDispatched?: true\n\n /**\n * The cached value was updated after a successful call to\n * {@link OptionsBase.fetchMethod}\n */\n fetchUpdated?: true\n\n /**\n * The reason for a fetch() rejection. Either the error raised by the\n * {@link OptionsBase.fetchMethod}, or the reason for an\n * AbortSignal.\n */\n fetchError?: Error\n\n /**\n * The fetch received an abort signal\n */\n fetchAborted?: true\n\n /**\n * The abort signal received was ignored, and the fetch was allowed to\n * continue.\n */\n fetchAbortIgnored?: true\n\n /**\n * The fetchMethod promise resolved successfully\n */\n fetchResolved?: true\n\n /**\n * The fetchMethod promise was rejected\n */\n fetchRejected?: true\n\n /**\n * The status of a {@link LRUCache#get} operation.\n *\n * - fetching: The item is currently being fetched. If a previous value\n * is present and allowed, that will be returned.\n * - stale: The item is in the cache, and is stale.\n * - hit: the item is in the cache\n * - miss: the item is not in the cache\n */\n get?: 'stale' | 'hit' | 'miss'\n\n /**\n * A fetch or get operation returned a stale value.\n */\n returnedStale?: true\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#fetch}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link OptionsBase.noDeleteOnFetchRejection},\n * {@link OptionsBase.allowStaleOnFetchRejection},\n * {@link FetchOptions.forceRefresh}, and\n * {@link FetcherOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.fetchMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the fetchMethod is called.\n */\n export interface FetcherFetchOptions\n extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n status?: Status\n size?: Size\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#fetch} method.\n */\n export interface FetchOptions\n extends FetcherFetchOptions {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.fetchMethod} as\n * the {@link FetcherOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n signal?: AbortSignal\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface FetchOptionsWithContext\n extends FetchOptions {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is\n * `undefined` or `void`\n */\n export interface FetchOptionsNoContext\n extends FetchOptions {\n context?: undefined\n }\n\n export interface MemoOptions\n extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.memoMethod} as\n * the {@link MemoizerOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface MemoOptionsWithContext\n extends MemoOptions {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is\n * `undefined` or `void`\n */\n export interface MemoOptionsNoContext\n extends MemoOptions {\n context?: undefined\n }\n\n /**\n * Options provided to the\n * {@link OptionsBase.memoMethod} function.\n */\n export interface MemoizerOptions {\n options: MemoizerMemoOptions\n /**\n * Object provided in the {@link MemoOptions.context} option to\n * {@link LRUCache#memo}\n */\n context: FC\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#memo}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link MemoOptions.forceRefresh}, and\n * {@link MemoerOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.memoMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the memoMethod is called.\n */\n export interface MemoizerMemoOptions\n extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n > {\n status?: Status\n size?: Size\n start?: Milliseconds\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#has} method.\n */\n export interface HasOptions\n extends Pick, 'updateAgeOnHas'> {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#get} method.\n */\n export interface GetOptions\n extends Pick<\n OptionsBase,\n 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#peek} method.\n */\n export interface PeekOptions\n extends Pick, 'allowStale'> {}\n\n /**\n * Options that may be passed to the {@link LRUCache#set} method.\n */\n export interface SetOptions\n extends Pick<\n OptionsBase,\n 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'\n > {\n /**\n * If size tracking is enabled, then setting an explicit size\n * in the {@link LRUCache#set} call will prevent calling the\n * {@link OptionsBase.sizeCalculation} function.\n */\n size?: Size\n /**\n * If TTL tracking is enabled, then setting an explicit start\n * time in the {@link LRUCache#set} call will override the\n * default time from `performance.now()` or `Date.now()`.\n *\n * Note that it must be a valid value for whichever time-tracking\n * method is in use.\n */\n start?: Milliseconds\n status?: Status\n }\n\n /**\n * The type signature for the {@link OptionsBase.fetchMethod} option.\n */\n export type Fetcher = (\n key: K,\n staleValue: V | undefined,\n options: FetcherOptions\n ) => Promise | V | undefined | void\n\n /**\n * the type signature for the {@link OptionsBase.memoMethod} option.\n */\n export type Memoizer = (\n key: K,\n staleValue: V | undefined,\n options: MemoizerOptions\n ) => V\n\n /**\n * Options which may be passed to the {@link LRUCache} constructor.\n *\n * Most of these may be overridden in the various options that use\n * them.\n *\n * Despite all being technically optional, the constructor requires that\n * a cache is at minimum limited by one or more of {@link OptionsBase.max},\n * {@link OptionsBase.ttl}, or {@link OptionsBase.maxSize}.\n *\n * If {@link OptionsBase.ttl} is used alone, then it is strongly advised\n * (and in fact required by the type definitions here) that the cache\n * also set {@link OptionsBase.ttlAutopurge}, to prevent potentially\n * unbounded storage.\n *\n * All options are also available on the {@link LRUCache} instance, making\n * it safe to pass an LRUCache instance as the options argumemnt to\n * make another empty cache of the same type.\n *\n * Some options are marked as read-only, because changing them after\n * instantiation is not safe. Changing any of the other options will of\n * course only have an effect on subsequent method calls.\n */\n export interface OptionsBase {\n /**\n * The maximum number of items to store in the cache before evicting\n * old entries. This is read-only on the {@link LRUCache} instance,\n * and may not be overridden.\n *\n * If set, then storage space will be pre-allocated at construction\n * time, and the cache will perform significantly faster.\n *\n * Note that significantly fewer items may be stored, if\n * {@link OptionsBase.maxSize} and/or {@link OptionsBase.ttl} are also\n * set.\n *\n * **It is strongly recommended to set a `max` to prevent unbounded growth\n * of the cache.**\n */\n max?: Count\n\n /**\n * Max time in milliseconds for items to live in cache before they are\n * considered stale. Note that stale items are NOT preemptively removed by\n * default, and MAY live in the cache, contributing to its LRU max, long\n * after they have expired, unless {@link OptionsBase.ttlAutopurge} is\n * set.\n *\n * If set to `0` (the default value), then that means \"do not track\n * TTL\", not \"expire immediately\".\n *\n * Also, as this cache is optimized for LRU/MRU operations, some of\n * the staleness/TTL checks will reduce performance, as they will incur\n * overhead by deleting items.\n *\n * This is not primarily a TTL cache, and does not make strong TTL\n * guarantees. There is no pre-emptive pruning of expired items, but you\n * _may_ set a TTL on the cache, and it will treat expired items as missing\n * when they are fetched, and delete them.\n *\n * Optional, but must be a non-negative integer in ms if specified.\n *\n * This may be overridden by passing an options object to `cache.set()`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if ttl tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * If ttl tracking is enabled, and `max` and `maxSize` are not set,\n * and `ttlAutopurge` is not set, then a warning will be emitted\n * cautioning about the potential for unbounded memory consumption.\n * (The TypeScript definitions will also discourage this.)\n */\n ttl?: Milliseconds\n\n /**\n * Minimum amount of time in ms in which to check for staleness.\n * Defaults to 1, which means that the current time is checked\n * at most once per millisecond.\n *\n * Set to 0 to check the current time every time staleness is tested.\n * (This reduces performance, and is theoretically unnecessary.)\n *\n * Setting this to a higher value will improve performance somewhat\n * while using ttl tracking, albeit at the expense of keeping stale\n * items around a bit longer than their TTLs would indicate.\n *\n * @default 1\n */\n ttlResolution?: Milliseconds\n\n /**\n * Preemptively remove stale items from the cache.\n *\n * Note that this may *significantly* degrade performance, especially if\n * the cache is storing a large number of items. It is almost always best\n * to just leave the stale items in the cache, and let them fall out as new\n * items are added.\n *\n * Note that this means that {@link OptionsBase.allowStale} is a bit\n * pointless, as stale items will be deleted almost as soon as they\n * expire.\n *\n * Use with caution!\n */\n ttlAutopurge?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever it is retrieved from cache with\n * {@link LRUCache#get}, causing it to not expire. (It can still fall out\n * of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n */\n updateAgeOnGet?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever its presence in the cache is\n * checked with {@link LRUCache#has}, causing it to not expire. (It can\n * still fall out of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n */\n updateAgeOnHas?: boolean\n\n /**\n * Allow {@link LRUCache#get} and {@link LRUCache#fetch} calls to return\n * stale data, if available.\n *\n * By default, if you set `ttl`, stale items will only be deleted from the\n * cache when you `get(key)`. That is, it's not preemptively pruning items,\n * unless {@link OptionsBase.ttlAutopurge} is set.\n *\n * If you set `allowStale:true`, it'll return the stale value *as well as*\n * deleting it. If you don't set this, then it'll return `undefined` when\n * you try to get a stale entry.\n *\n * Note that when a stale entry is fetched, _even if it is returned due to\n * `allowStale` being set_, it is removed from the cache immediately. You\n * can suppress this behavior by setting\n * {@link OptionsBase.noDeleteOnStaleGet}, either in the constructor, or in\n * the options provided to {@link LRUCache#get}.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n * The `cache.has()` method will always return `false` for stale items.\n *\n * Only relevant if a ttl is set.\n */\n allowStale?: boolean\n\n /**\n * Function that is called on items when they are dropped from the\n * cache, as `dispose(value, key, reason)`.\n *\n * This can be handy if you want to close file descriptors or do\n * other cleanup tasks when items are no longer stored in the cache.\n *\n * **NOTE**: It is called _before_ the item has been fully removed\n * from the cache, so if you want to put it right back in, you need\n * to wait until the next tick. If you try to add it back in during\n * the `dispose()` function call, it will break things in subtle and\n * weird ways.\n *\n * Unlike several other options, this may _not_ be overridden by\n * passing an option to `set()`, for performance reasons.\n *\n * The `reason` will be one of the following strings, corresponding\n * to the reason for the item's deletion:\n *\n * - `evict` Item was evicted to make space for a new addition\n * - `set` Item was overwritten by a new value\n * - `expire` Item expired its TTL\n * - `fetch` Item was deleted due to a failed or aborted fetch, or a\n * fetchMethod returning `undefined.\n * - `delete` Item was removed by explicit `cache.delete(key)`,\n * `cache.clear()`, or `cache.set(key, undefined)`.\n */\n dispose?: Disposer\n\n /**\n * The same as {@link OptionsBase.dispose}, but called *after* the entry\n * is completely removed and the cache is once again in a clean state.\n *\n * It is safe to add an item right back into the cache at this point.\n * However, note that it is *very* easy to inadvertently create infinite\n * recursion this way.\n */\n disposeAfter?: Disposer\n\n /**\n * Set to true to suppress calling the\n * {@link OptionsBase.dispose} function if the entry key is\n * still accessible within the cache.\n *\n * This may be overridden by passing an options object to\n * {@link LRUCache#set}.\n *\n * Only relevant if `dispose` or `disposeAfter` are set.\n */\n noDisposeOnSet?: boolean\n\n /**\n * Boolean flag to tell the cache to not update the TTL when setting a new\n * value for an existing key (ie, when updating a value rather than\n * inserting a new value). Note that the TTL value is _always_ set (if\n * provided) when adding a new entry into the cache.\n *\n * Has no effect if a {@link OptionsBase.ttl} is not set.\n *\n * May be passed as an option to {@link LRUCache#set}.\n */\n noUpdateTTL?: boolean\n\n /**\n * Set to a positive integer to track the sizes of items added to the\n * cache, and automatically evict items in order to stay below this size.\n * Note that this may result in fewer than `max` items being stored.\n *\n * Attempting to add an item to the cache whose calculated size is greater\n * that this amount will be a no-op. The item will not be cached, and no\n * other items will be evicted.\n *\n * Optional, must be a positive integer if provided.\n *\n * Sets `maxEntrySize` to the same value, unless a different value is\n * provided for `maxEntrySize`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if size tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * Note also that size tracking can negatively impact performance,\n * though for most cases, only minimally.\n */\n maxSize?: Size\n\n /**\n * The maximum allowed size for any single item in the cache.\n *\n * If a larger item is passed to {@link LRUCache#set} or returned by a\n * {@link OptionsBase.fetchMethod} or {@link OptionsBase.memoMethod}, then\n * it will not be stored in the cache.\n *\n * Attempting to add an item whose calculated size is greater than\n * this amount will not cache the item or evict any old items, but\n * WILL delete an existing value if one is already present.\n *\n * Optional, must be a positive integer if provided. Defaults to\n * the value of `maxSize` if provided.\n */\n maxEntrySize?: Size\n\n /**\n * A function that returns a number indicating the item's size.\n *\n * Requires {@link OptionsBase.maxSize} to be set.\n *\n * If not provided, and {@link OptionsBase.maxSize} or\n * {@link OptionsBase.maxEntrySize} are set, then all\n * {@link LRUCache#set} calls **must** provide an explicit\n * {@link SetOptions.size} or sizeCalculation param.\n */\n sizeCalculation?: SizeCalculator\n\n /**\n * Method that provides the implementation for {@link LRUCache#fetch}\n *\n * ```ts\n * fetchMethod(key, staleValue, { signal, options, context })\n * ```\n *\n * If `fetchMethod` is not provided, then `cache.fetch(key)` is equivalent\n * to `Promise.resolve(cache.get(key))`.\n *\n * If at any time, `signal.aborted` is set to `true`, or if the\n * `signal.onabort` method is called, or if it emits an `'abort'` event\n * which you can listen to with `addEventListener`, then that means that\n * the fetch should be abandoned. This may be passed along to async\n * functions aware of AbortController/AbortSignal behavior.\n *\n * The `fetchMethod` should **only** return `undefined` or a Promise\n * resolving to `undefined` if the AbortController signaled an `abort`\n * event. In all other cases, it should return or resolve to a value\n * suitable for adding to the cache.\n *\n * The `options` object is a union of the options that may be provided to\n * `set()` and `get()`. If they are modified, then that will result in\n * modifying the settings to `cache.set()` when the value is resolved, and\n * in the case of\n * {@link OptionsBase.noDeleteOnFetchRejection} and\n * {@link OptionsBase.allowStaleOnFetchRejection}, the handling of\n * `fetchMethod` failures.\n *\n * For example, a DNS cache may update the TTL based on the value returned\n * from a remote DNS server by changing `options.ttl` in the `fetchMethod`.\n */\n fetchMethod?: Fetcher\n\n /**\n * Method that provides the implementation for {@link LRUCache#memo}\n */\n memoMethod?: Memoizer\n\n /**\n * Set to true to suppress the deletion of stale data when a\n * {@link OptionsBase.fetchMethod} returns a rejected promise.\n */\n noDeleteOnFetchRejection?: boolean\n\n /**\n * Do not delete stale items when they are retrieved with\n * {@link LRUCache#get}.\n *\n * Note that the `get` return value will still be `undefined`\n * unless {@link OptionsBase.allowStale} is true.\n *\n * When using time-expiring entries with `ttl`, by default stale\n * items will be removed from the cache when the key is accessed\n * with `cache.get()`.\n *\n * Setting this option will cause stale items to remain in the cache, until\n * they are explicitly deleted with `cache.delete(key)`, or retrieved with\n * `noDeleteOnStaleGet` set to `false`.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n *\n * Only relevant if a ttl is used.\n */\n noDeleteOnStaleGet?: boolean\n\n /**\n * Set to true to allow returning stale data when a\n * {@link OptionsBase.fetchMethod} throws an error or returns a rejected\n * promise.\n *\n * This differs from using {@link OptionsBase.allowStale} in that stale\n * data will ONLY be returned in the case that the {@link LRUCache#fetch}\n * fails, not any other times.\n *\n * If a `fetchMethod` fails, and there is no stale value available, the\n * `fetch()` will resolve to `undefined`. Ie, all `fetchMethod` errors are\n * suppressed.\n *\n * Implies `noDeleteOnFetchRejection`.\n *\n * This may be set in calls to `fetch()`, or defaulted on the constructor,\n * or overridden by modifying the options object in the `fetchMethod`.\n */\n allowStaleOnFetchRejection?: boolean\n\n /**\n * Set to true to return a stale value from the cache when the\n * `AbortSignal` passed to the {@link OptionsBase.fetchMethod} dispatches\n * an `'abort'` event, whether user-triggered, or due to internal cache\n * behavior.\n *\n * Unless {@link OptionsBase.ignoreFetchAbort} is also set, the underlying\n * {@link OptionsBase.fetchMethod} will still be considered canceled, and\n * any value it returns will be ignored and not cached.\n *\n * Caveat: since fetches are aborted when a new value is explicitly\n * set in the cache, this can lead to fetch returning a stale value,\n * since that was the fallback value _at the moment the `fetch()` was\n * initiated_, even though the new updated value is now present in\n * the cache.\n *\n * For example:\n *\n * ```ts\n * const cache = new LRUCache({\n * ttl: 100,\n * fetchMethod: async (url, oldValue, { signal }) => {\n * const res = await fetch(url, { signal })\n * return await res.json()\n * }\n * })\n * cache.set('https://example.com/', { some: 'data' })\n * // 100ms go by...\n * const result = cache.fetch('https://example.com/')\n * cache.set('https://example.com/', { other: 'thing' })\n * console.log(await result) // { some: 'data' }\n * console.log(cache.get('https://example.com/')) // { other: 'thing' }\n * ```\n */\n allowStaleOnFetchAbort?: boolean\n\n /**\n * Set to true to ignore the `abort` event emitted by the `AbortSignal`\n * object passed to {@link OptionsBase.fetchMethod}, and still cache the\n * resulting resolution value, as long as it is not `undefined`.\n *\n * When used on its own, this means aborted {@link LRUCache#fetch} calls\n * are not immediately resolved or rejected when they are aborted, and\n * instead take the full time to await.\n *\n * When used with {@link OptionsBase.allowStaleOnFetchAbort}, aborted\n * {@link LRUCache#fetch} calls will resolve immediately to their stale\n * cached value or `undefined`, and will continue to process and eventually\n * update the cache when they resolve, as long as the resulting value is\n * not `undefined`, thus supporting a \"return stale on timeout while\n * refreshing\" mechanism by passing `AbortSignal.timeout(n)` as the signal.\n *\n * For example:\n *\n * ```ts\n * const c = new LRUCache({\n * ttl: 100,\n * ignoreFetchAbort: true,\n * allowStaleOnFetchAbort: true,\n * fetchMethod: async (key, oldValue, { signal }) => {\n * // note: do NOT pass the signal to fetch()!\n * // let's say this fetch can take a long time.\n * const res = await fetch(`https://slow-backend-server/${key}`)\n * return await res.json()\n * },\n * })\n *\n * // this will return the stale value after 100ms, while still\n * // updating in the background for next time.\n * const val = await c.fetch('key', { signal: AbortSignal.timeout(100) })\n * ```\n *\n * **Note**: regardless of this setting, an `abort` event _is still\n * emitted on the `AbortSignal` object_, so may result in invalid results\n * when passed to other underlying APIs that use AbortSignals.\n *\n * This may be overridden in the {@link OptionsBase.fetchMethod} or the\n * call to {@link LRUCache#fetch}.\n */\n ignoreFetchAbort?: boolean\n }\n\n export interface OptionsMaxLimit\n extends OptionsBase {\n max: Count\n }\n export interface OptionsTTLLimit\n extends OptionsBase {\n ttl: Milliseconds\n ttlAutopurge: boolean\n }\n export interface OptionsSizeLimit\n extends OptionsBase {\n maxSize: Size\n }\n\n /**\n * The valid safe options for the {@link LRUCache} constructor\n */\n export type Options =\n | OptionsMaxLimit\n | OptionsSizeLimit\n | OptionsTTLLimit\n\n /**\n * Entry objects used by {@link LRUCache#load} and {@link LRUCache#dump},\n * and returned by {@link LRUCache#info}.\n */\n export interface Entry {\n value: V\n ttl?: Milliseconds\n size?: Size\n start?: Milliseconds\n }\n}\n\n/**\n * Default export, the thing you're using this module to get.\n *\n * The `K` and `V` types define the key and value types, respectively. The\n * optional `FC` type defines the type of the `context` object passed to\n * `cache.fetch()` and `cache.memo()`.\n *\n * Keys and values **must not** be `null` or `undefined`.\n *\n * All properties from the options object (with the exception of `max`,\n * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are\n * added as normal public members. (The listed options are read-only getters.)\n *\n * Changing any of these will alter the defaults for subsequent method calls.\n */\nexport class LRUCache\n implements Map\n{\n // options that cannot be changed without disaster\n readonly #max: LRUCache.Count\n readonly #maxSize: LRUCache.Size\n readonly #dispose?: LRUCache.Disposer\n readonly #disposeAfter?: LRUCache.Disposer\n readonly #fetchMethod?: LRUCache.Fetcher\n readonly #memoMethod?: LRUCache.Memoizer\n\n /**\n * {@link LRUCache.OptionsBase.ttl}\n */\n ttl: LRUCache.Milliseconds\n\n /**\n * {@link LRUCache.OptionsBase.ttlResolution}\n */\n ttlResolution: LRUCache.Milliseconds\n /**\n * {@link LRUCache.OptionsBase.ttlAutopurge}\n */\n ttlAutopurge: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnGet}\n */\n updateAgeOnGet: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnHas}\n */\n updateAgeOnHas: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStale}\n */\n allowStale: boolean\n\n /**\n * {@link LRUCache.OptionsBase.noDisposeOnSet}\n */\n noDisposeOnSet: boolean\n /**\n * {@link LRUCache.OptionsBase.noUpdateTTL}\n */\n noUpdateTTL: boolean\n /**\n * {@link LRUCache.OptionsBase.maxEntrySize}\n */\n maxEntrySize: LRUCache.Size\n /**\n * {@link LRUCache.OptionsBase.sizeCalculation}\n */\n sizeCalculation?: LRUCache.SizeCalculator\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection}\n */\n noDeleteOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnStaleGet}\n */\n noDeleteOnStaleGet: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}\n */\n allowStaleOnFetchAbort: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection}\n */\n allowStaleOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.ignoreFetchAbort}\n */\n ignoreFetchAbort: boolean\n\n // computed properties\n #size: LRUCache.Count\n #calculatedSize: LRUCache.Size\n #keyMap: Map\n #keyList: (K | undefined)[]\n #valList: (V | BackgroundFetch | undefined)[]\n #next: NumberArray\n #prev: NumberArray\n #head: Index\n #tail: Index\n #free: StackLike\n #disposed?: DisposeTask[]\n #sizes?: ZeroArray\n #starts?: ZeroArray\n #ttls?: ZeroArray\n\n #hasDispose: boolean\n #hasFetchMethod: boolean\n #hasDisposeAfter: boolean\n\n /**\n * Do not call this method unless you need to inspect the\n * inner workings of the cache. If anything returned by this\n * object is modified in any way, strange breakage may occur.\n *\n * These fields are private for a reason!\n *\n * @internal\n */\n static unsafeExposeInternals<\n K extends {},\n V extends {},\n FC extends unknown = unknown\n >(c: LRUCache) {\n return {\n // properties\n starts: c.#starts,\n ttls: c.#ttls,\n sizes: c.#sizes,\n keyMap: c.#keyMap as Map,\n keyList: c.#keyList,\n valList: c.#valList,\n next: c.#next,\n prev: c.#prev,\n get head() {\n return c.#head\n },\n get tail() {\n return c.#tail\n },\n free: c.#free,\n // methods\n isBackgroundFetch: (p: any) => c.#isBackgroundFetch(p),\n backgroundFetch: (\n k: K,\n index: number | undefined,\n options: LRUCache.FetchOptions,\n context: any\n ): BackgroundFetch =>\n c.#backgroundFetch(\n k,\n index as Index | undefined,\n options,\n context\n ),\n moveToTail: (index: number): void =>\n c.#moveToTail(index as Index),\n indexes: (options?: { allowStale: boolean }) =>\n c.#indexes(options),\n rindexes: (options?: { allowStale: boolean }) =>\n c.#rindexes(options),\n isStale: (index: number | undefined) =>\n c.#isStale(index as Index),\n }\n }\n\n // Protected read-only members\n\n /**\n * {@link LRUCache.OptionsBase.max} (read-only)\n */\n get max(): LRUCache.Count {\n return this.#max\n }\n /**\n * {@link LRUCache.OptionsBase.maxSize} (read-only)\n */\n get maxSize(): LRUCache.Count {\n return this.#maxSize\n }\n /**\n * The total computed size of items in the cache (read-only)\n */\n get calculatedSize(): LRUCache.Size {\n return this.#calculatedSize\n }\n /**\n * The number of items stored in the cache (read-only)\n */\n get size(): LRUCache.Count {\n return this.#size\n }\n /**\n * {@link LRUCache.OptionsBase.fetchMethod} (read-only)\n */\n get fetchMethod(): LRUCache.Fetcher | undefined {\n return this.#fetchMethod\n }\n get memoMethod(): LRUCache.Memoizer | undefined {\n return this.#memoMethod\n }\n /**\n * {@link LRUCache.OptionsBase.dispose} (read-only)\n */\n get dispose() {\n return this.#dispose\n }\n /**\n * {@link LRUCache.OptionsBase.disposeAfter} (read-only)\n */\n get disposeAfter() {\n return this.#disposeAfter\n }\n\n constructor(\n options: LRUCache.Options | LRUCache\n ) {\n const {\n max = 0,\n ttl,\n ttlResolution = 1,\n ttlAutopurge,\n updateAgeOnGet,\n updateAgeOnHas,\n allowStale,\n dispose,\n disposeAfter,\n noDisposeOnSet,\n noUpdateTTL,\n maxSize = 0,\n maxEntrySize = 0,\n sizeCalculation,\n fetchMethod,\n memoMethod,\n noDeleteOnFetchRejection,\n noDeleteOnStaleGet,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n } = options\n\n if (max !== 0 && !isPosInt(max)) {\n throw new TypeError('max option must be a nonnegative integer')\n }\n\n const UintArray = max ? getUintArray(max) : Array\n if (!UintArray) {\n throw new Error('invalid max value: ' + max)\n }\n\n this.#max = max\n this.#maxSize = maxSize\n this.maxEntrySize = maxEntrySize || this.#maxSize\n this.sizeCalculation = sizeCalculation\n if (this.sizeCalculation) {\n if (!this.#maxSize && !this.maxEntrySize) {\n throw new TypeError(\n 'cannot set sizeCalculation without setting maxSize or maxEntrySize'\n )\n }\n if (typeof this.sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation set to non-function')\n }\n }\n\n if (\n memoMethod !== undefined &&\n typeof memoMethod !== 'function'\n ) {\n throw new TypeError('memoMethod must be a function if defined')\n }\n this.#memoMethod = memoMethod\n\n if (\n fetchMethod !== undefined &&\n typeof fetchMethod !== 'function'\n ) {\n throw new TypeError(\n 'fetchMethod must be a function if specified'\n )\n }\n this.#fetchMethod = fetchMethod\n this.#hasFetchMethod = !!fetchMethod\n\n this.#keyMap = new Map()\n this.#keyList = new Array(max).fill(undefined)\n this.#valList = new Array(max).fill(undefined)\n this.#next = new UintArray(max)\n this.#prev = new UintArray(max)\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free = Stack.create(max)\n this.#size = 0\n this.#calculatedSize = 0\n\n if (typeof dispose === 'function') {\n this.#dispose = dispose\n }\n if (typeof disposeAfter === 'function') {\n this.#disposeAfter = disposeAfter\n this.#disposed = []\n } else {\n this.#disposeAfter = undefined\n this.#disposed = undefined\n }\n this.#hasDispose = !!this.#dispose\n this.#hasDisposeAfter = !!this.#disposeAfter\n\n this.noDisposeOnSet = !!noDisposeOnSet\n this.noUpdateTTL = !!noUpdateTTL\n this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection\n this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection\n this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort\n this.ignoreFetchAbort = !!ignoreFetchAbort\n\n // NB: maxEntrySize is set to maxSize if it's set\n if (this.maxEntrySize !== 0) {\n if (this.#maxSize !== 0) {\n if (!isPosInt(this.#maxSize)) {\n throw new TypeError(\n 'maxSize must be a positive integer if specified'\n )\n }\n }\n if (!isPosInt(this.maxEntrySize)) {\n throw new TypeError(\n 'maxEntrySize must be a positive integer if specified'\n )\n }\n this.#initializeSizeTracking()\n }\n\n this.allowStale = !!allowStale\n this.noDeleteOnStaleGet = !!noDeleteOnStaleGet\n this.updateAgeOnGet = !!updateAgeOnGet\n this.updateAgeOnHas = !!updateAgeOnHas\n this.ttlResolution =\n isPosInt(ttlResolution) || ttlResolution === 0\n ? ttlResolution\n : 1\n this.ttlAutopurge = !!ttlAutopurge\n this.ttl = ttl || 0\n if (this.ttl) {\n if (!isPosInt(this.ttl)) {\n throw new TypeError(\n 'ttl must be a positive integer if specified'\n )\n }\n this.#initializeTTLTracking()\n }\n\n // do not allow completely unbounded caches\n if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) {\n throw new TypeError(\n 'At least one of max, maxSize, or ttl is required'\n )\n }\n if (!this.ttlAutopurge && !this.#max && !this.#maxSize) {\n const code = 'LRU_CACHE_UNBOUNDED'\n if (shouldWarn(code)) {\n warned.add(code)\n const msg =\n 'TTL caching without ttlAutopurge, max, or maxSize can ' +\n 'result in unbounded memory consumption.'\n emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache)\n }\n }\n }\n\n /**\n * Return the number of ms left in the item's TTL. If item is not in cache,\n * returns `0`. Returns `Infinity` if item is in cache without a defined TTL.\n */\n getRemainingTTL(key: K) {\n return this.#keyMap.has(key) ? Infinity : 0\n }\n\n #initializeTTLTracking() {\n const ttls = new ZeroArray(this.#max)\n const starts = new ZeroArray(this.#max)\n this.#ttls = ttls\n this.#starts = starts\n\n this.#setItemTTL = (index, ttl, start = perf.now()) => {\n starts[index] = ttl !== 0 ? start : 0\n ttls[index] = ttl\n if (ttl !== 0 && this.ttlAutopurge) {\n const t = setTimeout(() => {\n if (this.#isStale(index)) {\n this.#delete(this.#keyList[index] as K, 'expire')\n }\n }, ttl + 1)\n // unref() not supported on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n }\n }\n\n this.#updateItemAge = index => {\n starts[index] = ttls[index] !== 0 ? perf.now() : 0\n }\n\n this.#statusTTL = (status, index) => {\n if (ttls[index]) {\n const ttl = ttls[index]\n const start = starts[index]\n /* c8 ignore next */\n if (!ttl || !start) return\n status.ttl = ttl\n status.start = start\n status.now = cachedNow || getNow()\n const age = status.now - start\n status.remainingTTL = ttl - age\n }\n }\n\n // debounce calls to perf.now() to 1s so we're not hitting\n // that costly call repeatedly.\n let cachedNow = 0\n const getNow = () => {\n const n = perf.now()\n if (this.ttlResolution > 0) {\n cachedNow = n\n const t = setTimeout(\n () => (cachedNow = 0),\n this.ttlResolution\n )\n // not available on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n }\n return n\n }\n\n this.getRemainingTTL = key => {\n const index = this.#keyMap.get(key)\n if (index === undefined) {\n return 0\n }\n const ttl = ttls[index]\n const start = starts[index]\n if (!ttl || !start) {\n return Infinity\n }\n const age = (cachedNow || getNow()) - start\n return ttl - age\n }\n\n this.#isStale = index => {\n const s = starts[index]\n const t = ttls[index]\n return !!t && !!s && (cachedNow || getNow()) - s > t\n }\n }\n\n // conditionally set private methods related to TTL\n #updateItemAge: (index: Index) => void = () => {}\n #statusTTL: (status: LRUCache.Status, index: Index) => void =\n () => {}\n #setItemTTL: (\n index: Index,\n ttl: LRUCache.Milliseconds,\n start?: LRUCache.Milliseconds\n // ignore because we never call this if we're not already in TTL mode\n /* c8 ignore start */\n ) => void = () => {}\n /* c8 ignore stop */\n\n #isStale: (index: Index) => boolean = () => false\n\n #initializeSizeTracking() {\n const sizes = new ZeroArray(this.#max)\n this.#calculatedSize = 0\n this.#sizes = sizes\n this.#removeItemSize = index => {\n this.#calculatedSize -= sizes[index] as number\n sizes[index] = 0\n }\n this.#requireSize = (k, v, size, sizeCalculation) => {\n // provisionally accept background fetches.\n // actual value size will be checked when they return.\n if (this.#isBackgroundFetch(v)) {\n return 0\n }\n if (!isPosInt(size)) {\n if (sizeCalculation) {\n if (typeof sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation must be a function')\n }\n size = sizeCalculation(v, k)\n if (!isPosInt(size)) {\n throw new TypeError(\n 'sizeCalculation return invalid (expect positive integer)'\n )\n }\n } else {\n throw new TypeError(\n 'invalid size value (must be positive integer). ' +\n 'When maxSize or maxEntrySize is used, sizeCalculation ' +\n 'or size must be set.'\n )\n }\n }\n return size\n }\n this.#addItemSize = (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status\n ) => {\n sizes[index] = size\n if (this.#maxSize) {\n const maxSize = this.#maxSize - (sizes[index] as number)\n while (this.#calculatedSize > maxSize) {\n this.#evict(true)\n }\n }\n this.#calculatedSize += sizes[index] as number\n if (status) {\n status.entrySize = size\n status.totalCalculatedSize = this.#calculatedSize\n }\n }\n }\n\n #removeItemSize: (index: Index) => void = _i => {}\n #addItemSize: (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status\n ) => void = (_i, _s, _st) => {}\n #requireSize: (\n k: K,\n v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator\n ) => LRUCache.Size = (\n _k: K,\n _v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator\n ) => {\n if (size || sizeCalculation) {\n throw new TypeError(\n 'cannot set size without setting maxSize or maxEntrySize on cache'\n )\n }\n return 0\n };\n\n *#indexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#tail; true; ) {\n if (!this.#isValidIndex(i)) {\n break\n }\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#head) {\n break\n } else {\n i = this.#prev[i] as Index\n }\n }\n }\n }\n\n *#rindexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#head; true; ) {\n if (!this.#isValidIndex(i)) {\n break\n }\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#tail) {\n break\n } else {\n i = this.#next[i] as Index\n }\n }\n }\n }\n\n #isValidIndex(index: Index) {\n return (\n index !== undefined &&\n this.#keyMap.get(this.#keyList[index] as K) === index\n )\n }\n\n /**\n * Return a generator yielding `[key, value]` pairs,\n * in order from most recently used to least recently used.\n */\n *entries() {\n for (const i of this.#indexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]] as [K, V]\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.entries}\n *\n * Return a generator yielding `[key, value]` pairs,\n * in order from least recently used to most recently used.\n */\n *rentries() {\n for (const i of this.#rindexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]]\n }\n }\n }\n\n /**\n * Return a generator yielding the keys in the cache,\n * in order from most recently used to least recently used.\n */\n *keys() {\n for (const i of this.#indexes()) {\n const k = this.#keyList[i]\n if (\n k !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield k\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.keys}\n *\n * Return a generator yielding the keys in the cache,\n * in order from least recently used to most recently used.\n */\n *rkeys() {\n for (const i of this.#rindexes()) {\n const k = this.#keyList[i]\n if (\n k !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield k\n }\n }\n }\n\n /**\n * Return a generator yielding the values in the cache,\n * in order from most recently used to least recently used.\n */\n *values() {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n if (\n v !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield this.#valList[i] as V\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.values}\n *\n * Return a generator yielding the values in the cache,\n * in order from least recently used to most recently used.\n */\n *rvalues() {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n if (\n v !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield this.#valList[i]\n }\n }\n }\n\n /**\n * Iterating over the cache itself yields the same results as\n * {@link LRUCache.entries}\n */\n [Symbol.iterator]() {\n return this.entries()\n }\n\n /**\n * A String value that is used in the creation of the default string\n * description of an object. Called by the built-in method\n * `Object.prototype.toString`.\n */\n [Symbol.toStringTag] = 'LRUCache'\n\n /**\n * Find a value for which the supplied fn method returns a truthy value,\n * similar to `Array.find()`. fn is called as `fn(value, key, cache)`.\n */\n find(\n fn: (v: V, k: K, self: LRUCache) => boolean,\n getOptions: LRUCache.GetOptions = {}\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined) continue\n if (fn(value, this.#keyList[i] as K, this)) {\n return this.get(this.#keyList[i] as K, getOptions)\n }\n }\n }\n\n /**\n * Call the supplied function on each item in the cache, in order from most\n * recently used to least recently used.\n *\n * `fn` is called as `fn(value, key, cache)`.\n *\n * If `thisp` is provided, function will be called in the `this`-context of\n * the provided object, or the cache if no `thisp` object is provided.\n *\n * Does not update age or recenty of use, or iterate over stale values.\n */\n forEach(\n fn: (v: V, k: K, self: LRUCache) => any,\n thisp: any = this\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * The same as {@link LRUCache.forEach} but items are iterated over in\n * reverse order. (ie, less recently used items are iterated over first.)\n */\n rforEach(\n fn: (v: V, k: K, self: LRUCache) => any,\n thisp: any = this\n ) {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * Delete any stale entries. Returns true if anything was removed,\n * false otherwise.\n */\n purgeStale() {\n let deleted = false\n for (const i of this.#rindexes({ allowStale: true })) {\n if (this.#isStale(i)) {\n this.#delete(this.#keyList[i] as K, 'expire')\n deleted = true\n }\n }\n return deleted\n }\n\n /**\n * Get the extended info about a given entry, to get its value, size, and\n * TTL info simultaneously. Returns `undefined` if the key is not present.\n *\n * Unlike {@link LRUCache#dump}, which is designed to be portable and survive\n * serialization, the `start` value is always the current timestamp, and the\n * `ttl` is a calculated remaining time to live (negative if expired).\n *\n * Always returns stale values, if their info is found in the cache, so be\n * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl})\n * if relevant.\n */\n info(key: K): LRUCache.Entry | undefined {\n const i = this.#keyMap.get(key)\n if (i === undefined) return undefined\n const v = this.#valList[i]\n const value: V | undefined = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined) return undefined\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n const ttl = this.#ttls[i]\n const start = this.#starts[i]\n if (ttl && start) {\n const remain = ttl - (perf.now() - start)\n entry.ttl = remain\n entry.start = Date.now()\n }\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n return entry\n }\n\n /**\n * Return an array of [key, {@link LRUCache.Entry}] tuples which can be\n * passed to {@link LRLUCache#load}.\n *\n * The `start` fields are calculated relative to a portable `Date.now()`\n * timestamp, even if `performance.now()` is available.\n *\n * Stale entries are always included in the `dump`, even if\n * {@link LRUCache.OptionsBase.allowStale} is false.\n *\n * Note: this returns an actual array, not a generator, so it can be more\n * easily passed around.\n */\n dump() {\n const arr: [K, LRUCache.Entry][] = []\n for (const i of this.#indexes({ allowStale: true })) {\n const key = this.#keyList[i]\n const v = this.#valList[i]\n const value: V | undefined = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined || key === undefined) continue\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n entry.ttl = this.#ttls[i]\n // always dump the start relative to a portable timestamp\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = perf.now() - (this.#starts[i] as number)\n entry.start = Math.floor(Date.now() - age)\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n arr.unshift([key, entry])\n }\n return arr\n }\n\n /**\n * Reset the cache and load in the items in entries in the order listed.\n *\n * The shape of the resulting cache may be different if the same options are\n * not used in both caches.\n *\n * The `start` fields are assumed to be calculated relative to a portable\n * `Date.now()` timestamp, even if `performance.now()` is available.\n */\n load(arr: [K, LRUCache.Entry][]) {\n this.clear()\n for (const [key, entry] of arr) {\n if (entry.start) {\n // entry.start is a portable timestamp, but we may be using\n // node's performance.now(), so calculate the offset, so that\n // we get the intended remaining TTL, no matter how long it's\n // been on ice.\n //\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = Date.now() - entry.start\n entry.start = perf.now() - age\n }\n this.set(key, entry.value, entry)\n }\n }\n\n /**\n * Add a value to the cache.\n *\n * Note: if `undefined` is specified as a value, this is an alias for\n * {@link LRUCache#delete}\n *\n * Fields on the {@link LRUCache.SetOptions} options param will override\n * their corresponding values in the constructor options for the scope\n * of this single `set()` operation.\n *\n * If `start` is provided, then that will set the effective start\n * time for the TTL calculation. Note that this must be a previous\n * value of `performance.now()` if supported, or a previous value of\n * `Date.now()` if not.\n *\n * Options object may also include `size`, which will prevent\n * calling the `sizeCalculation` function and just use the specified\n * number if it is a positive integer, and `noDisposeOnSet` which\n * will prevent calling a `dispose` function in the case of\n * overwrites.\n *\n * If the `size` (or return value of `sizeCalculation`) for a given\n * entry is greater than `maxEntrySize`, then the item will not be\n * added to the cache.\n *\n * Will update the recency of the entry.\n *\n * If the value is `undefined`, then this is an alias for\n * `cache.delete(key)`. `undefined` is never stored in the cache.\n */\n set(\n k: K,\n v: V | BackgroundFetch | undefined,\n setOptions: LRUCache.SetOptions = {}\n ) {\n if (v === undefined) {\n this.delete(k)\n return this\n }\n const {\n ttl = this.ttl,\n start,\n noDisposeOnSet = this.noDisposeOnSet,\n sizeCalculation = this.sizeCalculation,\n status,\n } = setOptions\n let { noUpdateTTL = this.noUpdateTTL } = setOptions\n\n const size = this.#requireSize(\n k,\n v,\n setOptions.size || 0,\n sizeCalculation\n )\n // if the item doesn't fit, don't do anything\n // NB: maxEntrySize set to maxSize by default\n if (this.maxEntrySize && size > this.maxEntrySize) {\n if (status) {\n status.set = 'miss'\n status.maxEntrySizeExceeded = true\n }\n // have to delete, in case something is there already.\n this.#delete(k, 'set')\n return this\n }\n let index = this.#size === 0 ? undefined : this.#keyMap.get(k)\n if (index === undefined) {\n // addition\n index = (\n this.#size === 0\n ? this.#tail\n : this.#free.length !== 0\n ? this.#free.pop()\n : this.#size === this.#max\n ? this.#evict(false)\n : this.#size\n ) as Index\n this.#keyList[index] = k\n this.#valList[index] = v\n this.#keyMap.set(k, index)\n this.#next[this.#tail] = index\n this.#prev[index] = this.#tail\n this.#tail = index\n this.#size++\n this.#addItemSize(index, size, status)\n if (status) status.set = 'add'\n noUpdateTTL = false\n } else {\n // update\n this.#moveToTail(index)\n const oldVal = this.#valList[index] as V | BackgroundFetch\n if (v !== oldVal) {\n if (this.#hasFetchMethod && this.#isBackgroundFetch(oldVal)) {\n oldVal.__abortController.abort(new Error('replaced'))\n const { __staleWhileFetching: s } = oldVal\n if (s !== undefined && !noDisposeOnSet) {\n if (this.#hasDispose) {\n this.#dispose?.(s as V, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([s as V, k, 'set'])\n }\n }\n } else if (!noDisposeOnSet) {\n if (this.#hasDispose) {\n this.#dispose?.(oldVal as V, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldVal as V, k, 'set'])\n }\n }\n this.#removeItemSize(index)\n this.#addItemSize(index, size, status)\n this.#valList[index] = v\n if (status) {\n status.set = 'replace'\n const oldValue =\n oldVal && this.#isBackgroundFetch(oldVal)\n ? oldVal.__staleWhileFetching\n : oldVal\n if (oldValue !== undefined) status.oldValue = oldValue\n }\n } else if (status) {\n status.set = 'update'\n }\n }\n if (ttl !== 0 && !this.#ttls) {\n this.#initializeTTLTracking()\n }\n if (this.#ttls) {\n if (!noUpdateTTL) {\n this.#setItemTTL(index, ttl, start)\n }\n if (status) this.#statusTTL(status, index)\n }\n if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return this\n }\n\n /**\n * Evict the least recently used item, returning its value or\n * `undefined` if cache is empty.\n */\n pop(): V | undefined {\n try {\n while (this.#size) {\n const val = this.#valList[this.#head]\n this.#evict(true)\n if (this.#isBackgroundFetch(val)) {\n if (val.__staleWhileFetching) {\n return val.__staleWhileFetching\n }\n } else if (val !== undefined) {\n return val\n }\n }\n } finally {\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n }\n\n #evict(free: boolean) {\n const head = this.#head\n const k = this.#keyList[head] as K\n const v = this.#valList[head] as V\n if (this.#hasFetchMethod && this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('evicted'))\n } else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v, k, 'evict')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v, k, 'evict'])\n }\n }\n this.#removeItemSize(head)\n // if we aren't about to use the index, then null these out\n if (free) {\n this.#keyList[head] = undefined\n this.#valList[head] = undefined\n this.#free.push(head)\n }\n if (this.#size === 1) {\n this.#head = this.#tail = 0 as Index\n this.#free.length = 0\n } else {\n this.#head = this.#next[head] as Index\n }\n this.#keyMap.delete(k)\n this.#size--\n return head\n }\n\n /**\n * Check if a key is in the cache, without updating the recency of use.\n * Will return false if the item is stale, even though it is technically\n * in the cache.\n *\n * Check if a key is in the cache, without updating the recency of\n * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set\n * to `true` in either the options or the constructor.\n *\n * Will return `false` if the item is stale, even though it is technically in\n * the cache. The difference can be determined (if it matters) by using a\n * `status` argument, and inspecting the `has` field.\n *\n * Will not update item age unless\n * {@link LRUCache.OptionsBase.updateAgeOnHas} is set.\n */\n has(k: K, hasOptions: LRUCache.HasOptions = {}) {\n const { updateAgeOnHas = this.updateAgeOnHas, status } =\n hasOptions\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n const v = this.#valList[index]\n if (\n this.#isBackgroundFetch(v) &&\n v.__staleWhileFetching === undefined\n ) {\n return false\n }\n if (!this.#isStale(index)) {\n if (updateAgeOnHas) {\n this.#updateItemAge(index)\n }\n if (status) {\n status.has = 'hit'\n this.#statusTTL(status, index)\n }\n return true\n } else if (status) {\n status.has = 'stale'\n this.#statusTTL(status, index)\n }\n } else if (status) {\n status.has = 'miss'\n }\n return false\n }\n\n /**\n * Like {@link LRUCache#get} but doesn't update recency or delete stale\n * items.\n *\n * Returns `undefined` if the item is stale, unless\n * {@link LRUCache.OptionsBase.allowStale} is set.\n */\n peek(k: K, peekOptions: LRUCache.PeekOptions = {}) {\n const { allowStale = this.allowStale } = peekOptions\n const index = this.#keyMap.get(k)\n if (\n index === undefined ||\n (!allowStale && this.#isStale(index))\n ) {\n return\n }\n const v = this.#valList[index]\n // either stale and allowed, or forcing a refresh of non-stale value\n return this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n }\n\n #backgroundFetch(\n k: K,\n index: Index | undefined,\n options: LRUCache.FetchOptions,\n context: any\n ): BackgroundFetch {\n const v = index === undefined ? undefined : this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n return v\n }\n\n const ac = new AC()\n const { signal } = options\n // when/if our AC signals, then stop listening to theirs.\n signal?.addEventListener('abort', () => ac.abort(signal.reason), {\n signal: ac.signal,\n })\n\n const fetchOpts = {\n signal: ac.signal,\n options,\n context,\n }\n\n const cb = (\n v: V | undefined,\n updateCache = false\n ): V | undefined => {\n const { aborted } = ac.signal\n const ignoreAbort = options.ignoreFetchAbort && v !== undefined\n if (options.status) {\n if (aborted && !updateCache) {\n options.status.fetchAborted = true\n options.status.fetchError = ac.signal.reason\n if (ignoreAbort) options.status.fetchAbortIgnored = true\n } else {\n options.status.fetchResolved = true\n }\n }\n if (aborted && !ignoreAbort && !updateCache) {\n return fetchFail(ac.signal.reason)\n }\n // either we didn't abort, and are still here, or we did, and ignored\n const bf = p as BackgroundFetch\n if (this.#valList[index as Index] === p) {\n if (v === undefined) {\n if (bf.__staleWhileFetching) {\n this.#valList[index as Index] = bf.__staleWhileFetching\n } else {\n this.#delete(k, 'fetch')\n }\n } else {\n if (options.status) options.status.fetchUpdated = true\n this.set(k, v, fetchOpts.options)\n }\n }\n return v\n }\n\n const eb = (er: any) => {\n if (options.status) {\n options.status.fetchRejected = true\n options.status.fetchError = er\n }\n return fetchFail(er)\n }\n\n const fetchFail = (er: any): V | undefined => {\n const { aborted } = ac.signal\n const allowStaleAborted =\n aborted && options.allowStaleOnFetchAbort\n const allowStale =\n allowStaleAborted || options.allowStaleOnFetchRejection\n const noDelete = allowStale || options.noDeleteOnFetchRejection\n const bf = p as BackgroundFetch\n if (this.#valList[index as Index] === p) {\n // if we allow stale on fetch rejections, then we need to ensure that\n // the stale value is not removed from the cache when the fetch fails.\n const del = !noDelete || bf.__staleWhileFetching === undefined\n if (del) {\n this.#delete(k, 'fetch')\n } else if (!allowStaleAborted) {\n // still replace the *promise* with the stale value,\n // since we are done with the promise at this point.\n // leave it untouched if we're still waiting for an\n // aborted background fetch that hasn't yet returned.\n this.#valList[index as Index] = bf.__staleWhileFetching\n }\n }\n if (allowStale) {\n if (options.status && bf.__staleWhileFetching !== undefined) {\n options.status.returnedStale = true\n }\n return bf.__staleWhileFetching\n } else if (bf.__returned === bf) {\n throw er\n }\n }\n\n const pcall = (\n res: (v: V | undefined) => void,\n rej: (e: any) => void\n ) => {\n const fmp = this.#fetchMethod?.(k, v, fetchOpts)\n if (fmp && fmp instanceof Promise) {\n fmp.then(v => res(v === undefined ? undefined : v), rej)\n }\n // ignored, we go until we finish, regardless.\n // defer check until we are actually aborting,\n // so fetchMethod can override.\n ac.signal.addEventListener('abort', () => {\n if (\n !options.ignoreFetchAbort ||\n options.allowStaleOnFetchAbort\n ) {\n res(undefined)\n // when it eventually resolves, update the cache.\n if (options.allowStaleOnFetchAbort) {\n res = v => cb(v, true)\n }\n }\n })\n }\n\n if (options.status) options.status.fetchDispatched = true\n const p = new Promise(pcall).then(cb, eb)\n const bf: BackgroundFetch = Object.assign(p, {\n __abortController: ac,\n __staleWhileFetching: v,\n __returned: undefined,\n })\n\n if (index === undefined) {\n // internal, don't expose status.\n this.set(k, bf, { ...fetchOpts.options, status: undefined })\n index = this.#keyMap.get(k)\n } else {\n this.#valList[index] = bf\n }\n return bf\n }\n\n #isBackgroundFetch(p: any): p is BackgroundFetch {\n if (!this.#hasFetchMethod) return false\n const b = p as BackgroundFetch\n return (\n !!b &&\n b instanceof Promise &&\n b.hasOwnProperty('__staleWhileFetching') &&\n b.__abortController instanceof AC\n )\n }\n\n /**\n * Make an asynchronous cached fetch using the\n * {@link LRUCache.OptionsBase.fetchMethod} function.\n *\n * If the value is in the cache and not stale, then the returned\n * Promise resolves to the value.\n *\n * If not in the cache, or beyond its TTL staleness, then\n * `fetchMethod(key, staleValue, { options, signal, context })` is\n * called, and the value returned will be added to the cache once\n * resolved.\n *\n * If called with `allowStale`, and an asynchronous fetch is\n * currently in progress to reload a stale value, then the former\n * stale value will be returned.\n *\n * If called with `forceRefresh`, then the cached item will be\n * re-fetched, even if it is not stale. However, if `allowStale` is also\n * set, then the old value will still be returned. This is useful\n * in cases where you want to force a reload of a cached value. If\n * a background fetch is already in progress, then `forceRefresh`\n * has no effect.\n *\n * If multiple fetches for the same key are issued, then they will all be\n * coalesced into a single call to fetchMethod.\n *\n * Note that this means that handling options such as\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort},\n * {@link LRUCache.FetchOptions.signal},\n * and {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} will be\n * determined by the FIRST fetch() call for a given key.\n *\n * This is a known (fixable) shortcoming which will be addresed on when\n * someone complains about it, as the fix would involve added complexity and\n * may not be worth the costs for this edge case.\n *\n * If {@link LRUCache.OptionsBase.fetchMethod} is not specified, then this is\n * effectively an alias for `Promise.resolve(cache.get(key))`.\n *\n * When the fetch method resolves to a value, if the fetch has not\n * been aborted due to deletion, eviction, or being overwritten,\n * then it is added to the cache using the options provided.\n *\n * If the key is evicted or deleted before the `fetchMethod`\n * resolves, then the AbortSignal passed to the `fetchMethod` will\n * receive an `abort` event, and the promise returned by `fetch()`\n * will reject with the reason for the abort.\n *\n * If a `signal` is passed to the `fetch()` call, then aborting the\n * signal will abort the fetch and cause the `fetch()` promise to\n * reject with the reason provided.\n *\n * **Setting `context`**\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the {@link LRUCache} constructor, then all\n * calls to `cache.fetch()` _must_ provide a `context` option. If\n * set to `undefined` or `void`, then calls to fetch _must not_\n * provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that\n * might be relevant in the course of fetching the data. It is only\n * relevant for the course of a single `fetch()` operation, and\n * discarded afterwards.\n *\n * **Note: `fetch()` calls are inflight-unique**\n *\n * If you call `fetch()` multiple times with the same key value,\n * then every call after the first will resolve on the same\n * promise1,\n * _even if they have different settings that would otherwise change\n * the behavior of the fetch_, such as `noDeleteOnFetchRejection`\n * or `ignoreFetchAbort`.\n *\n * In most cases, this is not a problem (in fact, only fetching\n * something once is what you probably want, if you're caching in\n * the first place). If you are changing the fetch() options\n * dramatically between runs, there's a good chance that you might\n * be trying to fit divergent semantics into a single object, and\n * would be better off with multiple cache instances.\n *\n * **1**: Ie, they're not the \"same Promise\", but they resolve at\n * the same time, because they're both waiting on the same\n * underlying fetchMethod response.\n */\n\n fetch(\n k: K,\n fetchOptions: unknown extends FC\n ? LRUCache.FetchOptions\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext\n ): Promise\n\n // this overload not allowed if context is required\n fetch(\n k: unknown extends FC\n ? K\n : FC extends undefined | void\n ? K\n : never,\n fetchOptions?: unknown extends FC\n ? LRUCache.FetchOptions\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext\n : never\n ): Promise\n\n async fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {}\n ): Promise {\n const {\n // get options\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n // set options\n ttl = this.ttl,\n noDisposeOnSet = this.noDisposeOnSet,\n size = 0,\n sizeCalculation = this.sizeCalculation,\n noUpdateTTL = this.noUpdateTTL,\n // fetch exclusive options\n noDeleteOnFetchRejection = this.noDeleteOnFetchRejection,\n allowStaleOnFetchRejection = this.allowStaleOnFetchRejection,\n ignoreFetchAbort = this.ignoreFetchAbort,\n allowStaleOnFetchAbort = this.allowStaleOnFetchAbort,\n context,\n forceRefresh = false,\n status,\n signal,\n } = fetchOptions\n\n if (!this.#hasFetchMethod) {\n if (status) status.fetch = 'get'\n return this.get(k, {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n status,\n })\n }\n\n const options = {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n ttl,\n noDisposeOnSet,\n size,\n sizeCalculation,\n noUpdateTTL,\n noDeleteOnFetchRejection,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n status,\n signal,\n }\n\n let index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.fetch = 'miss'\n const p = this.#backgroundFetch(k, index, options, context)\n return (p.__returned = p)\n } else {\n // in cache, maybe already fetching\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n const stale =\n allowStale && v.__staleWhileFetching !== undefined\n if (status) {\n status.fetch = 'inflight'\n if (stale) status.returnedStale = true\n }\n return stale ? v.__staleWhileFetching : (v.__returned = v)\n }\n\n // if we force a refresh, that means do NOT serve the cached value,\n // unless we are already in the process of refreshing the cache.\n const isStale = this.#isStale(index)\n if (!forceRefresh && !isStale) {\n if (status) status.fetch = 'hit'\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n if (status) this.#statusTTL(status, index)\n return v\n }\n\n // ok, it is stale or a forced refresh, and not already fetching.\n // refresh the cache.\n const p = this.#backgroundFetch(k, index, options, context)\n const hasStale = p.__staleWhileFetching !== undefined\n const staleVal = hasStale && allowStale\n if (status) {\n status.fetch = isStale ? 'stale' : 'refresh'\n if (staleVal && isStale) status.returnedStale = true\n }\n return staleVal ? p.__staleWhileFetching : (p.__returned = p)\n }\n }\n\n /**\n * In some cases, `cache.fetch()` may resolve to `undefined`, either because\n * a {@link LRUCache.OptionsBase#fetchMethod} was not provided (turning\n * `cache.fetch(k)` into just an async wrapper around `cache.get(k)`) or\n * because `ignoreFetchAbort` was specified (either to the constructor or\n * in the {@link LRUCache.FetchOptions}). Also, the\n * {@link OptionsBase.fetchMethod} may return `undefined` or `void`, making\n * the test even more complicated.\n *\n * Because inferring the cases where `undefined` might be returned are so\n * cumbersome, but testing for `undefined` can also be annoying, this method\n * can be used, which will reject if `this.fetch()` resolves to undefined.\n */\n forceFetch(\n k: K,\n fetchOptions: unknown extends FC\n ? LRUCache.FetchOptions\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext\n ): Promise\n // this overload not allowed if context is required\n forceFetch(\n k: unknown extends FC\n ? K\n : FC extends undefined | void\n ? K\n : never,\n fetchOptions?: unknown extends FC\n ? LRUCache.FetchOptions\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext\n : never\n ): Promise\n async forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {}\n ): Promise {\n const v = await this.fetch(\n k,\n fetchOptions as unknown extends FC\n ? LRUCache.FetchOptions\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext\n )\n if (v === undefined) throw new Error('fetch() returned undefined')\n return v\n }\n\n /**\n * If the key is found in the cache, then this is equivalent to\n * {@link LRUCache#get}. If not, in the cache, then calculate the value using\n * the {@link LRUCache.OptionsBase.memoMethod}, and add it to the cache.\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the LRUCache constructor, then all calls to `cache.memo()`\n * _must_ provide a `context` option. If set to `undefined` or `void`, then\n * calls to memo _must not_ provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that might be\n * relevant in the course of fetching the data. It is only relevant for the\n * course of a single `memo()` operation, and discarded afterwards.\n */\n memo(\n k: K,\n memoOptions: unknown extends FC\n ? LRUCache.MemoOptions\n : FC extends undefined | void\n ? LRUCache.MemoOptionsNoContext\n : LRUCache.MemoOptionsWithContext\n ): V\n // this overload not allowed if context is required\n memo(\n k: unknown extends FC\n ? K\n : FC extends undefined | void\n ? K\n : never,\n memoOptions?: unknown extends FC\n ? LRUCache.MemoOptions\n : FC extends undefined | void\n ? LRUCache.MemoOptionsNoContext\n : never\n ): V\n memo(k: K, memoOptions: LRUCache.MemoOptions = {}) {\n const memoMethod = this.#memoMethod\n if (!memoMethod) {\n throw new Error('no memoMethod provided to constructor')\n }\n const { context, forceRefresh, ...options } = memoOptions\n const v = this.get(k, options)\n if (!forceRefresh && v !== undefined) return v\n const vv = memoMethod(k, v, {\n options,\n context,\n } as LRUCache.MemoizerOptions)\n this.set(k, vv, options)\n return vv\n }\n\n /**\n * Return a value from the cache. Will update the recency of the cache\n * entry found.\n *\n * If the key is not found, get() will return `undefined`.\n */\n get(k: K, getOptions: LRUCache.GetOptions = {}) {\n const {\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n status,\n } = getOptions\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n const value = this.#valList[index]\n const fetching = this.#isBackgroundFetch(value)\n if (status) this.#statusTTL(status, index)\n if (this.#isStale(index)) {\n if (status) status.get = 'stale'\n // delete only if not an in-flight background fetch\n if (!fetching) {\n if (!noDeleteOnStaleGet) {\n this.#delete(k, 'expire')\n }\n if (status && allowStale) status.returnedStale = true\n return allowStale ? value : undefined\n } else {\n if (\n status &&\n allowStale &&\n value.__staleWhileFetching !== undefined\n ) {\n status.returnedStale = true\n }\n return allowStale ? value.__staleWhileFetching : undefined\n }\n } else {\n if (status) status.get = 'hit'\n // if we're currently fetching it, we don't actually have it yet\n // it's not stale, which means this isn't a staleWhileRefetching.\n // If it's not stale, and fetching, AND has a __staleWhileFetching\n // value, then that means the user fetched with {forceRefresh:true},\n // so it's safe to return that value.\n if (fetching) {\n return value.__staleWhileFetching\n }\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n return value\n }\n } else if (status) {\n status.get = 'miss'\n }\n }\n\n #connect(p: Index, n: Index) {\n this.#prev[n] = p\n this.#next[p] = n\n }\n\n #moveToTail(index: Index): void {\n // if tail already, nothing to do\n // if head, move head to next[index]\n // else\n // move next[prev[index]] to next[index] (head has no prev)\n // move prev[next[index]] to prev[index]\n // prev[index] = tail\n // next[tail] = index\n // tail = index\n if (index !== this.#tail) {\n if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n this.#connect(\n this.#prev[index] as Index,\n this.#next[index] as Index\n )\n }\n this.#connect(this.#tail, index)\n this.#tail = index\n }\n }\n\n /**\n * Deletes a key out of the cache.\n *\n * Returns true if the key was deleted, false otherwise.\n */\n delete(k: K) {\n return this.#delete(k, 'delete')\n }\n\n #delete(k: K, reason: LRUCache.DisposeReason) {\n let deleted = false\n if (this.#size !== 0) {\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n deleted = true\n if (this.#size === 1) {\n this.#clear(reason)\n } else {\n this.#removeItemSize(index)\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k, reason])\n }\n }\n this.#keyMap.delete(k)\n this.#keyList[index] = undefined\n this.#valList[index] = undefined\n if (index === this.#tail) {\n this.#tail = this.#prev[index] as Index\n } else if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n const pi = this.#prev[index] as number\n this.#next[pi] = this.#next[index] as number\n const ni = this.#next[index] as number\n this.#prev[ni] = this.#prev[index] as number\n }\n this.#size--\n this.#free.push(index)\n }\n }\n }\n if (this.#hasDisposeAfter && this.#disposed?.length) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return deleted\n }\n\n /**\n * Clear the cache entirely, throwing away all values.\n */\n clear() {\n return this.#clear('delete')\n }\n #clear(reason: LRUCache.DisposeReason) {\n for (const index of this.#rindexes({ allowStale: true })) {\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else {\n const k = this.#keyList[index]\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k as K, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k as K, reason])\n }\n }\n }\n\n this.#keyMap.clear()\n this.#valList.fill(undefined)\n this.#keyList.fill(undefined)\n if (this.#ttls && this.#starts) {\n this.#ttls.fill(0)\n this.#starts.fill(0)\n }\n if (this.#sizes) {\n this.#sizes.fill(0)\n }\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free.length = 0\n this.#calculatedSize = 0\n this.#size = 0\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/commonjs/index.min.js b/node_modules/lru-cache/dist/commonjs/index.min.js deleted file mode 100644 index ad643b0..0000000 --- a/node_modules/lru-cache/dist/commonjs/index.min.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";var G=(l,t,e)=>{if(!t.has(l))throw TypeError("Cannot "+e)};var j=(l,t,e)=>(G(l,t,"read from private field"),e?e.call(l):t.get(l)),I=(l,t,e)=>{if(t.has(l))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(l):t.set(l,e)},x=(l,t,e,i)=>(G(l,t,"write to private field"),i?i.call(l,e):t.set(l,e),e);Object.defineProperty(exports,"__esModule",{value:!0});exports.LRUCache=void 0;var T=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,P=new Set,U=typeof process=="object"&&process?process:{},H=(l,t,e,i)=>{typeof U.emitWarning=="function"?U.emitWarning(l,t,e,i):console.error(`[${e}] ${t}: ${l}`)},D=globalThis.AbortController,N=globalThis.AbortSignal;if(typeof D>"u"){N=class{onabort;_onabort=[];reason;aborted=!1;addEventListener(i,s){this._onabort.push(s)}},D=class{constructor(){t()}signal=new N;abort(i){if(!this.signal.aborted){this.signal.reason=i,this.signal.aborted=!0;for(let s of this.signal._onabort)s(i);this.signal.onabort?.(i)}}};let l=U.env?.LRU_CACHE_IGNORE_AC_WARNING!=="1",t=()=>{l&&(l=!1,H("AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.","NO_ABORT_CONTROLLER","ENOTSUP",t))}}var V=l=>!P.has(l),Y=Symbol("type"),A=l=>l&&l===Math.floor(l)&&l>0&&isFinite(l),k=l=>A(l)?l<=Math.pow(2,8)?Uint8Array:l<=Math.pow(2,16)?Uint16Array:l<=Math.pow(2,32)?Uint32Array:l<=Number.MAX_SAFE_INTEGER?E:null:null,E=class extends Array{constructor(t){super(t),this.fill(0)}},v,O=class{heap;length;static create(t){let e=k(t);if(!e)return[];x(O,v,!0);let i=new O(t,e);return x(O,v,!1),i}constructor(t,e){if(!j(O,v))throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new e(t),this.length=0}push(t){this.heap[this.length++]=t}pop(){return this.heap[--this.length]}},W=O;v=new WeakMap,I(W,v,!1);var C=class{#g;#f;#p;#w;#R;#W;ttl;ttlResolution;ttlAutopurge;updateAgeOnGet;updateAgeOnHas;allowStale;noDisposeOnSet;noUpdateTTL;maxEntrySize;sizeCalculation;noDeleteOnFetchRejection;noDeleteOnStaleGet;allowStaleOnFetchAbort;allowStaleOnFetchRejection;ignoreFetchAbort;#n;#S;#s;#i;#t;#l;#c;#o;#h;#_;#r;#b;#m;#u;#y;#E;#a;static unsafeExposeInternals(t){return{starts:t.#m,ttls:t.#u,sizes:t.#b,keyMap:t.#s,keyList:t.#i,valList:t.#t,next:t.#l,prev:t.#c,get head(){return t.#o},get tail(){return t.#h},free:t.#_,isBackgroundFetch:e=>t.#e(e),backgroundFetch:(e,i,s,n)=>t.#x(e,i,s,n),moveToTail:e=>t.#C(e),indexes:e=>t.#A(e),rindexes:e=>t.#F(e),isStale:e=>t.#d(e)}}get max(){return this.#g}get maxSize(){return this.#f}get calculatedSize(){return this.#S}get size(){return this.#n}get fetchMethod(){return this.#R}get memoMethod(){return this.#W}get dispose(){return this.#p}get disposeAfter(){return this.#w}constructor(t){let{max:e=0,ttl:i,ttlResolution:s=1,ttlAutopurge:n,updateAgeOnGet:h,updateAgeOnHas:o,allowStale:r,dispose:g,disposeAfter:b,noDisposeOnSet:f,noUpdateTTL:u,maxSize:c=0,maxEntrySize:F=0,sizeCalculation:d,fetchMethod:S,memoMethod:a,noDeleteOnFetchRejection:w,noDeleteOnStaleGet:m,allowStaleOnFetchRejection:p,allowStaleOnFetchAbort:_,ignoreFetchAbort:z}=t;if(e!==0&&!A(e))throw new TypeError("max option must be a nonnegative integer");let y=e?k(e):Array;if(!y)throw new Error("invalid max value: "+e);if(this.#g=e,this.#f=c,this.maxEntrySize=F||this.#f,this.sizeCalculation=d,this.sizeCalculation){if(!this.#f&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(a!==void 0&&typeof a!="function")throw new TypeError("memoMethod must be a function if defined");if(this.#W=a,S!==void 0&&typeof S!="function")throw new TypeError("fetchMethod must be a function if specified");if(this.#R=S,this.#E=!!S,this.#s=new Map,this.#i=new Array(e).fill(void 0),this.#t=new Array(e).fill(void 0),this.#l=new y(e),this.#c=new y(e),this.#o=0,this.#h=0,this.#_=W.create(e),this.#n=0,this.#S=0,typeof g=="function"&&(this.#p=g),typeof b=="function"?(this.#w=b,this.#r=[]):(this.#w=void 0,this.#r=void 0),this.#y=!!this.#p,this.#a=!!this.#w,this.noDisposeOnSet=!!f,this.noUpdateTTL=!!u,this.noDeleteOnFetchRejection=!!w,this.allowStaleOnFetchRejection=!!p,this.allowStaleOnFetchAbort=!!_,this.ignoreFetchAbort=!!z,this.maxEntrySize!==0){if(this.#f!==0&&!A(this.#f))throw new TypeError("maxSize must be a positive integer if specified");if(!A(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.#P()}if(this.allowStale=!!r,this.noDeleteOnStaleGet=!!m,this.updateAgeOnGet=!!h,this.updateAgeOnHas=!!o,this.ttlResolution=A(s)||s===0?s:1,this.ttlAutopurge=!!n,this.ttl=i||0,this.ttl){if(!A(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.#U()}if(this.#g===0&&this.ttl===0&&this.#f===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.#g&&!this.#f){let R="LRU_CACHE_UNBOUNDED";V(R)&&(P.add(R),H("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",R,C))}}getRemainingTTL(t){return this.#s.has(t)?1/0:0}#U(){let t=new E(this.#g),e=new E(this.#g);this.#u=t,this.#m=e,this.#M=(n,h,o=T.now())=>{if(e[n]=h!==0?o:0,t[n]=h,h!==0&&this.ttlAutopurge){let r=setTimeout(()=>{this.#d(n)&&this.#T(this.#i[n],"expire")},h+1);r.unref&&r.unref()}},this.#v=n=>{e[n]=t[n]!==0?T.now():0},this.#O=(n,h)=>{if(t[h]){let o=t[h],r=e[h];if(!o||!r)return;n.ttl=o,n.start=r,n.now=i||s();let g=n.now-r;n.remainingTTL=o-g}};let i=0,s=()=>{let n=T.now();if(this.ttlResolution>0){i=n;let h=setTimeout(()=>i=0,this.ttlResolution);h.unref&&h.unref()}return n};this.getRemainingTTL=n=>{let h=this.#s.get(n);if(h===void 0)return 0;let o=t[h],r=e[h];if(!o||!r)return 1/0;let g=(i||s())-r;return o-g},this.#d=n=>{let h=e[n],o=t[n];return!!o&&!!h&&(i||s())-h>o}}#v=()=>{};#O=()=>{};#M=()=>{};#d=()=>!1;#P(){let t=new E(this.#g);this.#S=0,this.#b=t,this.#z=e=>{this.#S-=t[e],t[e]=0},this.#G=(e,i,s,n)=>{if(this.#e(i))return 0;if(!A(s))if(n){if(typeof n!="function")throw new TypeError("sizeCalculation must be a function");if(s=n(i,e),!A(s))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.");return s},this.#D=(e,i,s)=>{if(t[e]=i,this.#f){let n=this.#f-t[e];for(;this.#S>n;)this.#L(!0)}this.#S+=t[e],s&&(s.entrySize=i,s.totalCalculatedSize=this.#S)}}#z=t=>{};#D=(t,e,i)=>{};#G=(t,e,i,s)=>{if(i||s)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0};*#A({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#h;!(!this.#j(e)||((t||!this.#d(e))&&(yield e),e===this.#o));)e=this.#c[e]}*#F({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#o;!(!this.#j(e)||((t||!this.#d(e))&&(yield e),e===this.#h));)e=this.#l[e]}#j(t){return t!==void 0&&this.#s.get(this.#i[t])===t}*entries(){for(let t of this.#A())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*rentries(){for(let t of this.#F())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*keys(){for(let t of this.#A()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*rkeys(){for(let t of this.#F()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*values(){for(let t of this.#A())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}*rvalues(){for(let t of this.#F())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}[Symbol.iterator](){return this.entries()}[Symbol.toStringTag]="LRUCache";find(t,e={}){for(let i of this.#A()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;if(n!==void 0&&t(n,this.#i[i],this))return this.get(this.#i[i],e)}}forEach(t,e=this){for(let i of this.#A()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;n!==void 0&&t.call(e,n,this.#i[i],this)}}rforEach(t,e=this){for(let i of this.#F()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;n!==void 0&&t.call(e,n,this.#i[i],this)}}purgeStale(){let t=!1;for(let e of this.#F({allowStale:!0}))this.#d(e)&&(this.#T(this.#i[e],"expire"),t=!0);return t}info(t){let e=this.#s.get(t);if(e===void 0)return;let i=this.#t[e],s=this.#e(i)?i.__staleWhileFetching:i;if(s===void 0)return;let n={value:s};if(this.#u&&this.#m){let h=this.#u[e],o=this.#m[e];if(h&&o){let r=h-(T.now()-o);n.ttl=r,n.start=Date.now()}}return this.#b&&(n.size=this.#b[e]),n}dump(){let t=[];for(let e of this.#A({allowStale:!0})){let i=this.#i[e],s=this.#t[e],n=this.#e(s)?s.__staleWhileFetching:s;if(n===void 0||i===void 0)continue;let h={value:n};if(this.#u&&this.#m){h.ttl=this.#u[e];let o=T.now()-this.#m[e];h.start=Math.floor(Date.now()-o)}this.#b&&(h.size=this.#b[e]),t.unshift([i,h])}return t}load(t){this.clear();for(let[e,i]of t){if(i.start){let s=Date.now()-i.start;i.start=T.now()-s}this.set(e,i.value,i)}}set(t,e,i={}){if(e===void 0)return this.delete(t),this;let{ttl:s=this.ttl,start:n,noDisposeOnSet:h=this.noDisposeOnSet,sizeCalculation:o=this.sizeCalculation,status:r}=i,{noUpdateTTL:g=this.noUpdateTTL}=i,b=this.#G(t,e,i.size||0,o);if(this.maxEntrySize&&b>this.maxEntrySize)return r&&(r.set="miss",r.maxEntrySizeExceeded=!0),this.#T(t,"set"),this;let f=this.#n===0?void 0:this.#s.get(t);if(f===void 0)f=this.#n===0?this.#h:this.#_.length!==0?this.#_.pop():this.#n===this.#g?this.#L(!1):this.#n,this.#i[f]=t,this.#t[f]=e,this.#s.set(t,f),this.#l[this.#h]=f,this.#c[f]=this.#h,this.#h=f,this.#n++,this.#D(f,b,r),r&&(r.set="add"),g=!1;else{this.#C(f);let u=this.#t[f];if(e!==u){if(this.#E&&this.#e(u)){u.__abortController.abort(new Error("replaced"));let{__staleWhileFetching:c}=u;c!==void 0&&!h&&(this.#y&&this.#p?.(c,t,"set"),this.#a&&this.#r?.push([c,t,"set"]))}else h||(this.#y&&this.#p?.(u,t,"set"),this.#a&&this.#r?.push([u,t,"set"]));if(this.#z(f),this.#D(f,b,r),this.#t[f]=e,r){r.set="replace";let c=u&&this.#e(u)?u.__staleWhileFetching:u;c!==void 0&&(r.oldValue=c)}}else r&&(r.set="update")}if(s!==0&&!this.#u&&this.#U(),this.#u&&(g||this.#M(f,s,n),r&&this.#O(r,f)),!h&&this.#a&&this.#r){let u=this.#r,c;for(;c=u?.shift();)this.#w?.(...c)}return this}pop(){try{for(;this.#n;){let t=this.#t[this.#o];if(this.#L(!0),this.#e(t)){if(t.__staleWhileFetching)return t.__staleWhileFetching}else if(t!==void 0)return t}}finally{if(this.#a&&this.#r){let t=this.#r,e;for(;e=t?.shift();)this.#w?.(...e)}}}#L(t){let e=this.#o,i=this.#i[e],s=this.#t[e];return this.#E&&this.#e(s)?s.__abortController.abort(new Error("evicted")):(this.#y||this.#a)&&(this.#y&&this.#p?.(s,i,"evict"),this.#a&&this.#r?.push([s,i,"evict"])),this.#z(e),t&&(this.#i[e]=void 0,this.#t[e]=void 0,this.#_.push(e)),this.#n===1?(this.#o=this.#h=0,this.#_.length=0):this.#o=this.#l[e],this.#s.delete(i),this.#n--,e}has(t,e={}){let{updateAgeOnHas:i=this.updateAgeOnHas,status:s}=e,n=this.#s.get(t);if(n!==void 0){let h=this.#t[n];if(this.#e(h)&&h.__staleWhileFetching===void 0)return!1;if(this.#d(n))s&&(s.has="stale",this.#O(s,n));else return i&&this.#v(n),s&&(s.has="hit",this.#O(s,n)),!0}else s&&(s.has="miss");return!1}peek(t,e={}){let{allowStale:i=this.allowStale}=e,s=this.#s.get(t);if(s===void 0||!i&&this.#d(s))return;let n=this.#t[s];return this.#e(n)?n.__staleWhileFetching:n}#x(t,e,i,s){let n=e===void 0?void 0:this.#t[e];if(this.#e(n))return n;let h=new D,{signal:o}=i;o?.addEventListener("abort",()=>h.abort(o.reason),{signal:h.signal});let r={signal:h.signal,options:i,context:s},g=(d,S=!1)=>{let{aborted:a}=h.signal,w=i.ignoreFetchAbort&&d!==void 0;if(i.status&&(a&&!S?(i.status.fetchAborted=!0,i.status.fetchError=h.signal.reason,w&&(i.status.fetchAbortIgnored=!0)):i.status.fetchResolved=!0),a&&!w&&!S)return f(h.signal.reason);let m=c;return this.#t[e]===c&&(d===void 0?m.__staleWhileFetching?this.#t[e]=m.__staleWhileFetching:this.#T(t,"fetch"):(i.status&&(i.status.fetchUpdated=!0),this.set(t,d,r.options))),d},b=d=>(i.status&&(i.status.fetchRejected=!0,i.status.fetchError=d),f(d)),f=d=>{let{aborted:S}=h.signal,a=S&&i.allowStaleOnFetchAbort,w=a||i.allowStaleOnFetchRejection,m=w||i.noDeleteOnFetchRejection,p=c;if(this.#t[e]===c&&(!m||p.__staleWhileFetching===void 0?this.#T(t,"fetch"):a||(this.#t[e]=p.__staleWhileFetching)),w)return i.status&&p.__staleWhileFetching!==void 0&&(i.status.returnedStale=!0),p.__staleWhileFetching;if(p.__returned===p)throw d},u=(d,S)=>{let a=this.#R?.(t,n,r);a&&a instanceof Promise&&a.then(w=>d(w===void 0?void 0:w),S),h.signal.addEventListener("abort",()=>{(!i.ignoreFetchAbort||i.allowStaleOnFetchAbort)&&(d(void 0),i.allowStaleOnFetchAbort&&(d=w=>g(w,!0)))})};i.status&&(i.status.fetchDispatched=!0);let c=new Promise(u).then(g,b),F=Object.assign(c,{__abortController:h,__staleWhileFetching:n,__returned:void 0});return e===void 0?(this.set(t,F,{...r.options,status:void 0}),e=this.#s.get(t)):this.#t[e]=F,F}#e(t){if(!this.#E)return!1;let e=t;return!!e&&e instanceof Promise&&e.hasOwnProperty("__staleWhileFetching")&&e.__abortController instanceof D}async fetch(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,ttl:h=this.ttl,noDisposeOnSet:o=this.noDisposeOnSet,size:r=0,sizeCalculation:g=this.sizeCalculation,noUpdateTTL:b=this.noUpdateTTL,noDeleteOnFetchRejection:f=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:u=this.allowStaleOnFetchRejection,ignoreFetchAbort:c=this.ignoreFetchAbort,allowStaleOnFetchAbort:F=this.allowStaleOnFetchAbort,context:d,forceRefresh:S=!1,status:a,signal:w}=e;if(!this.#E)return a&&(a.fetch="get"),this.get(t,{allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:n,status:a});let m={allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:n,ttl:h,noDisposeOnSet:o,size:r,sizeCalculation:g,noUpdateTTL:b,noDeleteOnFetchRejection:f,allowStaleOnFetchRejection:u,allowStaleOnFetchAbort:F,ignoreFetchAbort:c,status:a,signal:w},p=this.#s.get(t);if(p===void 0){a&&(a.fetch="miss");let _=this.#x(t,p,m,d);return _.__returned=_}else{let _=this.#t[p];if(this.#e(_)){let M=i&&_.__staleWhileFetching!==void 0;return a&&(a.fetch="inflight",M&&(a.returnedStale=!0)),M?_.__staleWhileFetching:_.__returned=_}let z=this.#d(p);if(!S&&!z)return a&&(a.fetch="hit"),this.#C(p),s&&this.#v(p),a&&this.#O(a,p),_;let y=this.#x(t,p,m,d),L=y.__staleWhileFetching!==void 0&&i;return a&&(a.fetch=z?"stale":"refresh",L&&z&&(a.returnedStale=!0)),L?y.__staleWhileFetching:y.__returned=y}}async forceFetch(t,e={}){let i=await this.fetch(t,e);if(i===void 0)throw new Error("fetch() returned undefined");return i}memo(t,e={}){let i=this.#W;if(!i)throw new Error("no memoMethod provided to constructor");let{context:s,forceRefresh:n,...h}=e,o=this.get(t,h);if(!n&&o!==void 0)return o;let r=i(t,o,{options:h,context:s});return this.set(t,r,h),r}get(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,status:h}=e,o=this.#s.get(t);if(o!==void 0){let r=this.#t[o],g=this.#e(r);return h&&this.#O(h,o),this.#d(o)?(h&&(h.get="stale"),g?(h&&i&&r.__staleWhileFetching!==void 0&&(h.returnedStale=!0),i?r.__staleWhileFetching:void 0):(n||this.#T(t,"expire"),h&&i&&(h.returnedStale=!0),i?r:void 0)):(h&&(h.get="hit"),g?r.__staleWhileFetching:(this.#C(o),s&&this.#v(o),r))}else h&&(h.get="miss")}#I(t,e){this.#c[e]=t,this.#l[t]=e}#C(t){t!==this.#h&&(t===this.#o?this.#o=this.#l[t]:this.#I(this.#c[t],this.#l[t]),this.#I(this.#h,t),this.#h=t)}delete(t){return this.#T(t,"delete")}#T(t,e){let i=!1;if(this.#n!==0){let s=this.#s.get(t);if(s!==void 0)if(i=!0,this.#n===1)this.#N(e);else{this.#z(s);let n=this.#t[s];if(this.#e(n)?n.__abortController.abort(new Error("deleted")):(this.#y||this.#a)&&(this.#y&&this.#p?.(n,t,e),this.#a&&this.#r?.push([n,t,e])),this.#s.delete(t),this.#i[s]=void 0,this.#t[s]=void 0,s===this.#h)this.#h=this.#c[s];else if(s===this.#o)this.#o=this.#l[s];else{let h=this.#c[s];this.#l[h]=this.#l[s];let o=this.#l[s];this.#c[o]=this.#c[s]}this.#n--,this.#_.push(s)}}if(this.#a&&this.#r?.length){let s=this.#r,n;for(;n=s?.shift();)this.#w?.(...n)}return i}clear(){return this.#N("delete")}#N(t){for(let e of this.#F({allowStale:!0})){let i=this.#t[e];if(this.#e(i))i.__abortController.abort(new Error("deleted"));else{let s=this.#i[e];this.#y&&this.#p?.(i,s,t),this.#a&&this.#r?.push([i,s,t])}}if(this.#s.clear(),this.#t.fill(void 0),this.#i.fill(void 0),this.#u&&this.#m&&(this.#u.fill(0),this.#m.fill(0)),this.#b&&this.#b.fill(0),this.#o=0,this.#h=0,this.#_.length=0,this.#S=0,this.#n=0,this.#a&&this.#r){let e=this.#r,i;for(;i=e?.shift();)this.#w?.(...i)}}};exports.LRUCache=C; -//# sourceMappingURL=index.min.js.map diff --git a/node_modules/lru-cache/dist/commonjs/index.min.js.map b/node_modules/lru-cache/dist/commonjs/index.min.js.map deleted file mode 100644 index 11b43a0..0000000 --- a/node_modules/lru-cache/dist/commonjs/index.min.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/index.ts"], - "sourcesContent": ["/**\n * @module LRUCache\n */\n\n// module-private names and types\ntype Perf = { now: () => number }\nconst perf: Perf =\n typeof performance === 'object' &&\n performance &&\n typeof performance.now === 'function'\n ? performance\n : Date\n\nconst warned = new Set()\n\n// either a function or a class\ntype ForC = ((...a: any[]) => any) | { new (...a: any[]): any }\n\n/* c8 ignore start */\nconst PROCESS = (\n typeof process === 'object' && !!process ? process : {}\n) as { [k: string]: any }\n/* c8 ignore start */\n\nconst emitWarning = (\n msg: string,\n type: string,\n code: string,\n fn: ForC\n) => {\n typeof PROCESS.emitWarning === 'function'\n ? PROCESS.emitWarning(msg, type, code, fn)\n : console.error(`[${code}] ${type}: ${msg}`)\n}\n\nlet AC = globalThis.AbortController\nlet AS = globalThis.AbortSignal\n\n/* c8 ignore start */\nif (typeof AC === 'undefined') {\n //@ts-ignore\n AS = class AbortSignal {\n onabort?: (...a: any[]) => any\n _onabort: ((...a: any[]) => any)[] = []\n reason?: any\n aborted: boolean = false\n addEventListener(_: string, fn: (...a: any[]) => any) {\n this._onabort.push(fn)\n }\n }\n //@ts-ignore\n AC = class AbortController {\n constructor() {\n warnACPolyfill()\n }\n signal = new AS()\n abort(reason: any) {\n if (this.signal.aborted) return\n //@ts-ignore\n this.signal.reason = reason\n //@ts-ignore\n this.signal.aborted = true\n //@ts-ignore\n for (const fn of this.signal._onabort) {\n fn(reason)\n }\n this.signal.onabort?.(reason)\n }\n }\n let printACPolyfillWarning =\n PROCESS.env?.LRU_CACHE_IGNORE_AC_WARNING !== '1'\n const warnACPolyfill = () => {\n if (!printACPolyfillWarning) return\n printACPolyfillWarning = false\n emitWarning(\n 'AbortController is not defined. If using lru-cache in ' +\n 'node 14, load an AbortController polyfill from the ' +\n '`node-abort-controller` package. A minimal polyfill is ' +\n 'provided for use by LRUCache.fetch(), but it should not be ' +\n 'relied upon in other contexts (eg, passing it to other APIs that ' +\n 'use AbortController/AbortSignal might have undesirable effects). ' +\n 'You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.',\n 'NO_ABORT_CONTROLLER',\n 'ENOTSUP',\n warnACPolyfill\n )\n }\n}\n/* c8 ignore stop */\n\nconst shouldWarn = (code: string) => !warned.has(code)\n\nconst TYPE = Symbol('type')\nexport type PosInt = number & { [TYPE]: 'Positive Integer' }\nexport type Index = number & { [TYPE]: 'LRUCache Index' }\n\nconst isPosInt = (n: any): n is PosInt =>\n n && n === Math.floor(n) && n > 0 && isFinite(n)\n\nexport type UintArray = Uint8Array | Uint16Array | Uint32Array\nexport type NumberArray = UintArray | number[]\n\n/* c8 ignore start */\n// This is a little bit ridiculous, tbh.\n// The maximum array length is 2^32-1 or thereabouts on most JS impls.\n// And well before that point, you're caching the entire world, I mean,\n// that's ~32GB of just integers for the next/prev links, plus whatever\n// else to hold that many keys and values. Just filling the memory with\n// zeroes at init time is brutal when you get that big.\n// But why not be complete?\n// Maybe in the future, these limits will have expanded.\nconst getUintArray = (max: number) =>\n !isPosInt(max)\n ? null\n : max <= Math.pow(2, 8)\n ? Uint8Array\n : max <= Math.pow(2, 16)\n ? Uint16Array\n : max <= Math.pow(2, 32)\n ? Uint32Array\n : max <= Number.MAX_SAFE_INTEGER\n ? ZeroArray\n : null\n/* c8 ignore stop */\n\nclass ZeroArray extends Array {\n constructor(size: number) {\n super(size)\n this.fill(0)\n }\n}\nexport type { ZeroArray }\nexport type { Stack }\n\nexport type StackLike = Stack | Index[]\nclass Stack {\n heap: NumberArray\n length: number\n // private constructor\n static #constructing: boolean = false\n static create(max: number): StackLike {\n const HeapCls = getUintArray(max)\n if (!HeapCls) return []\n Stack.#constructing = true\n const s = new Stack(max, HeapCls)\n Stack.#constructing = false\n return s\n }\n constructor(\n max: number,\n HeapCls: { new (n: number): NumberArray }\n ) {\n /* c8 ignore start */\n if (!Stack.#constructing) {\n throw new TypeError('instantiate Stack using Stack.create(n)')\n }\n /* c8 ignore stop */\n this.heap = new HeapCls(max)\n this.length = 0\n }\n push(n: Index) {\n this.heap[this.length++] = n\n }\n pop(): Index {\n return this.heap[--this.length] as Index\n }\n}\n\n/**\n * Promise representing an in-progress {@link LRUCache#fetch} call\n */\nexport type BackgroundFetch = Promise & {\n __returned: BackgroundFetch | undefined\n __abortController: AbortController\n __staleWhileFetching: V | undefined\n}\n\nexport type DisposeTask = [\n value: V,\n key: K,\n reason: LRUCache.DisposeReason\n]\n\nexport namespace LRUCache {\n /**\n * An integer greater than 0, reflecting the calculated size of items\n */\n export type Size = number\n\n /**\n * Integer greater than 0, representing some number of milliseconds, or the\n * time at which a TTL started counting from.\n */\n export type Milliseconds = number\n\n /**\n * An integer greater than 0, reflecting a number of items\n */\n export type Count = number\n\n /**\n * The reason why an item was removed from the cache, passed\n * to the {@link Disposer} methods.\n *\n * - `evict`: The item was evicted because it is the least recently used,\n * and the cache is full.\n * - `set`: A new value was set, overwriting the old value being disposed.\n * - `delete`: The item was explicitly deleted, either by calling\n * {@link LRUCache#delete}, {@link LRUCache#clear}, or\n * {@link LRUCache#set} with an undefined value.\n * - `expire`: The item was removed due to exceeding its TTL.\n * - `fetch`: A {@link OptionsBase#fetchMethod} operation returned\n * `undefined` or was aborted, causing the item to be deleted.\n */\n export type DisposeReason =\n | 'evict'\n | 'set'\n | 'delete'\n | 'expire'\n | 'fetch'\n /**\n * A method called upon item removal, passed as the\n * {@link OptionsBase.dispose} and/or\n * {@link OptionsBase.disposeAfter} options.\n */\n export type Disposer = (\n value: V,\n key: K,\n reason: DisposeReason\n ) => void\n\n /**\n * A function that returns the effective calculated size\n * of an entry in the cache.\n */\n export type SizeCalculator = (value: V, key: K) => Size\n\n /**\n * Options provided to the\n * {@link OptionsBase.fetchMethod} function.\n */\n export interface FetcherOptions {\n signal: AbortSignal\n options: FetcherFetchOptions\n /**\n * Object provided in the {@link FetchOptions.context} option to\n * {@link LRUCache#fetch}\n */\n context: FC\n }\n\n /**\n * Occasionally, it may be useful to track the internal behavior of the\n * cache, particularly for logging, debugging, or for behavior within the\n * `fetchMethod`. To do this, you can pass a `status` object to the\n * {@link LRUCache#fetch}, {@link LRUCache#get}, {@link LRUCache#set},\n * {@link LRUCache#memo}, and {@link LRUCache#has} methods.\n *\n * The `status` option should be a plain JavaScript object. The following\n * fields will be set on it appropriately, depending on the situation.\n */\n export interface Status {\n /**\n * The status of a set() operation.\n *\n * - add: the item was not found in the cache, and was added\n * - update: the item was in the cache, with the same value provided\n * - replace: the item was in the cache, and replaced\n * - miss: the item was not added to the cache for some reason\n */\n set?: 'add' | 'update' | 'replace' | 'miss'\n\n /**\n * the ttl stored for the item, or undefined if ttls are not used.\n */\n ttl?: Milliseconds\n\n /**\n * the start time for the item, or undefined if ttls are not used.\n */\n start?: Milliseconds\n\n /**\n * The timestamp used for TTL calculation\n */\n now?: Milliseconds\n\n /**\n * the remaining ttl for the item, or undefined if ttls are not used.\n */\n remainingTTL?: Milliseconds\n\n /**\n * The calculated size for the item, if sizes are used.\n */\n entrySize?: Size\n\n /**\n * The total calculated size of the cache, if sizes are used.\n */\n totalCalculatedSize?: Size\n\n /**\n * A flag indicating that the item was not stored, due to exceeding the\n * {@link OptionsBase.maxEntrySize}\n */\n maxEntrySizeExceeded?: true\n\n /**\n * The old value, specified in the case of `set:'update'` or\n * `set:'replace'`\n */\n oldValue?: V\n\n /**\n * The results of a {@link LRUCache#has} operation\n *\n * - hit: the item was found in the cache\n * - stale: the item was found in the cache, but is stale\n * - miss: the item was not found in the cache\n */\n has?: 'hit' | 'stale' | 'miss'\n\n /**\n * The status of a {@link LRUCache#fetch} operation.\n * Note that this can change as the underlying fetch() moves through\n * various states.\n *\n * - inflight: there is another fetch() for this key which is in process\n * - get: there is no {@link OptionsBase.fetchMethod}, so\n * {@link LRUCache#get} was called.\n * - miss: the item is not in cache, and will be fetched.\n * - hit: the item is in the cache, and was resolved immediately.\n * - stale: the item is in the cache, but stale.\n * - refresh: the item is in the cache, and not stale, but\n * {@link FetchOptions.forceRefresh} was specified.\n */\n fetch?: 'get' | 'inflight' | 'miss' | 'hit' | 'stale' | 'refresh'\n\n /**\n * The {@link OptionsBase.fetchMethod} was called\n */\n fetchDispatched?: true\n\n /**\n * The cached value was updated after a successful call to\n * {@link OptionsBase.fetchMethod}\n */\n fetchUpdated?: true\n\n /**\n * The reason for a fetch() rejection. Either the error raised by the\n * {@link OptionsBase.fetchMethod}, or the reason for an\n * AbortSignal.\n */\n fetchError?: Error\n\n /**\n * The fetch received an abort signal\n */\n fetchAborted?: true\n\n /**\n * The abort signal received was ignored, and the fetch was allowed to\n * continue.\n */\n fetchAbortIgnored?: true\n\n /**\n * The fetchMethod promise resolved successfully\n */\n fetchResolved?: true\n\n /**\n * The fetchMethod promise was rejected\n */\n fetchRejected?: true\n\n /**\n * The status of a {@link LRUCache#get} operation.\n *\n * - fetching: The item is currently being fetched. If a previous value\n * is present and allowed, that will be returned.\n * - stale: The item is in the cache, and is stale.\n * - hit: the item is in the cache\n * - miss: the item is not in the cache\n */\n get?: 'stale' | 'hit' | 'miss'\n\n /**\n * A fetch or get operation returned a stale value.\n */\n returnedStale?: true\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#fetch}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link OptionsBase.noDeleteOnFetchRejection},\n * {@link OptionsBase.allowStaleOnFetchRejection},\n * {@link FetchOptions.forceRefresh}, and\n * {@link FetcherOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.fetchMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the fetchMethod is called.\n */\n export interface FetcherFetchOptions\n extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n status?: Status\n size?: Size\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#fetch} method.\n */\n export interface FetchOptions\n extends FetcherFetchOptions {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.fetchMethod} as\n * the {@link FetcherOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n signal?: AbortSignal\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface FetchOptionsWithContext\n extends FetchOptions {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is\n * `undefined` or `void`\n */\n export interface FetchOptionsNoContext\n extends FetchOptions {\n context?: undefined\n }\n\n export interface MemoOptions\n extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.memoMethod} as\n * the {@link MemoizerOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface MemoOptionsWithContext\n extends MemoOptions {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is\n * `undefined` or `void`\n */\n export interface MemoOptionsNoContext\n extends MemoOptions {\n context?: undefined\n }\n\n /**\n * Options provided to the\n * {@link OptionsBase.memoMethod} function.\n */\n export interface MemoizerOptions {\n options: MemoizerMemoOptions\n /**\n * Object provided in the {@link MemoOptions.context} option to\n * {@link LRUCache#memo}\n */\n context: FC\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#memo}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link MemoOptions.forceRefresh}, and\n * {@link MemoerOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.memoMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the memoMethod is called.\n */\n export interface MemoizerMemoOptions\n extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n > {\n status?: Status\n size?: Size\n start?: Milliseconds\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#has} method.\n */\n export interface HasOptions\n extends Pick, 'updateAgeOnHas'> {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#get} method.\n */\n export interface GetOptions\n extends Pick<\n OptionsBase,\n 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#peek} method.\n */\n export interface PeekOptions\n extends Pick, 'allowStale'> {}\n\n /**\n * Options that may be passed to the {@link LRUCache#set} method.\n */\n export interface SetOptions\n extends Pick<\n OptionsBase,\n 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'\n > {\n /**\n * If size tracking is enabled, then setting an explicit size\n * in the {@link LRUCache#set} call will prevent calling the\n * {@link OptionsBase.sizeCalculation} function.\n */\n size?: Size\n /**\n * If TTL tracking is enabled, then setting an explicit start\n * time in the {@link LRUCache#set} call will override the\n * default time from `performance.now()` or `Date.now()`.\n *\n * Note that it must be a valid value for whichever time-tracking\n * method is in use.\n */\n start?: Milliseconds\n status?: Status\n }\n\n /**\n * The type signature for the {@link OptionsBase.fetchMethod} option.\n */\n export type Fetcher = (\n key: K,\n staleValue: V | undefined,\n options: FetcherOptions\n ) => Promise | V | undefined | void\n\n /**\n * the type signature for the {@link OptionsBase.memoMethod} option.\n */\n export type Memoizer = (\n key: K,\n staleValue: V | undefined,\n options: MemoizerOptions\n ) => V\n\n /**\n * Options which may be passed to the {@link LRUCache} constructor.\n *\n * Most of these may be overridden in the various options that use\n * them.\n *\n * Despite all being technically optional, the constructor requires that\n * a cache is at minimum limited by one or more of {@link OptionsBase.max},\n * {@link OptionsBase.ttl}, or {@link OptionsBase.maxSize}.\n *\n * If {@link OptionsBase.ttl} is used alone, then it is strongly advised\n * (and in fact required by the type definitions here) that the cache\n * also set {@link OptionsBase.ttlAutopurge}, to prevent potentially\n * unbounded storage.\n *\n * All options are also available on the {@link LRUCache} instance, making\n * it safe to pass an LRUCache instance as the options argumemnt to\n * make another empty cache of the same type.\n *\n * Some options are marked as read-only, because changing them after\n * instantiation is not safe. Changing any of the other options will of\n * course only have an effect on subsequent method calls.\n */\n export interface OptionsBase {\n /**\n * The maximum number of items to store in the cache before evicting\n * old entries. This is read-only on the {@link LRUCache} instance,\n * and may not be overridden.\n *\n * If set, then storage space will be pre-allocated at construction\n * time, and the cache will perform significantly faster.\n *\n * Note that significantly fewer items may be stored, if\n * {@link OptionsBase.maxSize} and/or {@link OptionsBase.ttl} are also\n * set.\n *\n * **It is strongly recommended to set a `max` to prevent unbounded growth\n * of the cache.**\n */\n max?: Count\n\n /**\n * Max time in milliseconds for items to live in cache before they are\n * considered stale. Note that stale items are NOT preemptively removed by\n * default, and MAY live in the cache, contributing to its LRU max, long\n * after they have expired, unless {@link OptionsBase.ttlAutopurge} is\n * set.\n *\n * If set to `0` (the default value), then that means \"do not track\n * TTL\", not \"expire immediately\".\n *\n * Also, as this cache is optimized for LRU/MRU operations, some of\n * the staleness/TTL checks will reduce performance, as they will incur\n * overhead by deleting items.\n *\n * This is not primarily a TTL cache, and does not make strong TTL\n * guarantees. There is no pre-emptive pruning of expired items, but you\n * _may_ set a TTL on the cache, and it will treat expired items as missing\n * when they are fetched, and delete them.\n *\n * Optional, but must be a non-negative integer in ms if specified.\n *\n * This may be overridden by passing an options object to `cache.set()`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if ttl tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * If ttl tracking is enabled, and `max` and `maxSize` are not set,\n * and `ttlAutopurge` is not set, then a warning will be emitted\n * cautioning about the potential for unbounded memory consumption.\n * (The TypeScript definitions will also discourage this.)\n */\n ttl?: Milliseconds\n\n /**\n * Minimum amount of time in ms in which to check for staleness.\n * Defaults to 1, which means that the current time is checked\n * at most once per millisecond.\n *\n * Set to 0 to check the current time every time staleness is tested.\n * (This reduces performance, and is theoretically unnecessary.)\n *\n * Setting this to a higher value will improve performance somewhat\n * while using ttl tracking, albeit at the expense of keeping stale\n * items around a bit longer than their TTLs would indicate.\n *\n * @default 1\n */\n ttlResolution?: Milliseconds\n\n /**\n * Preemptively remove stale items from the cache.\n *\n * Note that this may *significantly* degrade performance, especially if\n * the cache is storing a large number of items. It is almost always best\n * to just leave the stale items in the cache, and let them fall out as new\n * items are added.\n *\n * Note that this means that {@link OptionsBase.allowStale} is a bit\n * pointless, as stale items will be deleted almost as soon as they\n * expire.\n *\n * Use with caution!\n */\n ttlAutopurge?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever it is retrieved from cache with\n * {@link LRUCache#get}, causing it to not expire. (It can still fall out\n * of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n */\n updateAgeOnGet?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever its presence in the cache is\n * checked with {@link LRUCache#has}, causing it to not expire. (It can\n * still fall out of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n */\n updateAgeOnHas?: boolean\n\n /**\n * Allow {@link LRUCache#get} and {@link LRUCache#fetch} calls to return\n * stale data, if available.\n *\n * By default, if you set `ttl`, stale items will only be deleted from the\n * cache when you `get(key)`. That is, it's not preemptively pruning items,\n * unless {@link OptionsBase.ttlAutopurge} is set.\n *\n * If you set `allowStale:true`, it'll return the stale value *as well as*\n * deleting it. If you don't set this, then it'll return `undefined` when\n * you try to get a stale entry.\n *\n * Note that when a stale entry is fetched, _even if it is returned due to\n * `allowStale` being set_, it is removed from the cache immediately. You\n * can suppress this behavior by setting\n * {@link OptionsBase.noDeleteOnStaleGet}, either in the constructor, or in\n * the options provided to {@link LRUCache#get}.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n * The `cache.has()` method will always return `false` for stale items.\n *\n * Only relevant if a ttl is set.\n */\n allowStale?: boolean\n\n /**\n * Function that is called on items when they are dropped from the\n * cache, as `dispose(value, key, reason)`.\n *\n * This can be handy if you want to close file descriptors or do\n * other cleanup tasks when items are no longer stored in the cache.\n *\n * **NOTE**: It is called _before_ the item has been fully removed\n * from the cache, so if you want to put it right back in, you need\n * to wait until the next tick. If you try to add it back in during\n * the `dispose()` function call, it will break things in subtle and\n * weird ways.\n *\n * Unlike several other options, this may _not_ be overridden by\n * passing an option to `set()`, for performance reasons.\n *\n * The `reason` will be one of the following strings, corresponding\n * to the reason for the item's deletion:\n *\n * - `evict` Item was evicted to make space for a new addition\n * - `set` Item was overwritten by a new value\n * - `expire` Item expired its TTL\n * - `fetch` Item was deleted due to a failed or aborted fetch, or a\n * fetchMethod returning `undefined.\n * - `delete` Item was removed by explicit `cache.delete(key)`,\n * `cache.clear()`, or `cache.set(key, undefined)`.\n */\n dispose?: Disposer\n\n /**\n * The same as {@link OptionsBase.dispose}, but called *after* the entry\n * is completely removed and the cache is once again in a clean state.\n *\n * It is safe to add an item right back into the cache at this point.\n * However, note that it is *very* easy to inadvertently create infinite\n * recursion this way.\n */\n disposeAfter?: Disposer\n\n /**\n * Set to true to suppress calling the\n * {@link OptionsBase.dispose} function if the entry key is\n * still accessible within the cache.\n *\n * This may be overridden by passing an options object to\n * {@link LRUCache#set}.\n *\n * Only relevant if `dispose` or `disposeAfter` are set.\n */\n noDisposeOnSet?: boolean\n\n /**\n * Boolean flag to tell the cache to not update the TTL when setting a new\n * value for an existing key (ie, when updating a value rather than\n * inserting a new value). Note that the TTL value is _always_ set (if\n * provided) when adding a new entry into the cache.\n *\n * Has no effect if a {@link OptionsBase.ttl} is not set.\n *\n * May be passed as an option to {@link LRUCache#set}.\n */\n noUpdateTTL?: boolean\n\n /**\n * Set to a positive integer to track the sizes of items added to the\n * cache, and automatically evict items in order to stay below this size.\n * Note that this may result in fewer than `max` items being stored.\n *\n * Attempting to add an item to the cache whose calculated size is greater\n * that this amount will be a no-op. The item will not be cached, and no\n * other items will be evicted.\n *\n * Optional, must be a positive integer if provided.\n *\n * Sets `maxEntrySize` to the same value, unless a different value is\n * provided for `maxEntrySize`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if size tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * Note also that size tracking can negatively impact performance,\n * though for most cases, only minimally.\n */\n maxSize?: Size\n\n /**\n * The maximum allowed size for any single item in the cache.\n *\n * If a larger item is passed to {@link LRUCache#set} or returned by a\n * {@link OptionsBase.fetchMethod} or {@link OptionsBase.memoMethod}, then\n * it will not be stored in the cache.\n *\n * Attempting to add an item whose calculated size is greater than\n * this amount will not cache the item or evict any old items, but\n * WILL delete an existing value if one is already present.\n *\n * Optional, must be a positive integer if provided. Defaults to\n * the value of `maxSize` if provided.\n */\n maxEntrySize?: Size\n\n /**\n * A function that returns a number indicating the item's size.\n *\n * Requires {@link OptionsBase.maxSize} to be set.\n *\n * If not provided, and {@link OptionsBase.maxSize} or\n * {@link OptionsBase.maxEntrySize} are set, then all\n * {@link LRUCache#set} calls **must** provide an explicit\n * {@link SetOptions.size} or sizeCalculation param.\n */\n sizeCalculation?: SizeCalculator\n\n /**\n * Method that provides the implementation for {@link LRUCache#fetch}\n *\n * ```ts\n * fetchMethod(key, staleValue, { signal, options, context })\n * ```\n *\n * If `fetchMethod` is not provided, then `cache.fetch(key)` is equivalent\n * to `Promise.resolve(cache.get(key))`.\n *\n * If at any time, `signal.aborted` is set to `true`, or if the\n * `signal.onabort` method is called, or if it emits an `'abort'` event\n * which you can listen to with `addEventListener`, then that means that\n * the fetch should be abandoned. This may be passed along to async\n * functions aware of AbortController/AbortSignal behavior.\n *\n * The `fetchMethod` should **only** return `undefined` or a Promise\n * resolving to `undefined` if the AbortController signaled an `abort`\n * event. In all other cases, it should return or resolve to a value\n * suitable for adding to the cache.\n *\n * The `options` object is a union of the options that may be provided to\n * `set()` and `get()`. If they are modified, then that will result in\n * modifying the settings to `cache.set()` when the value is resolved, and\n * in the case of\n * {@link OptionsBase.noDeleteOnFetchRejection} and\n * {@link OptionsBase.allowStaleOnFetchRejection}, the handling of\n * `fetchMethod` failures.\n *\n * For example, a DNS cache may update the TTL based on the value returned\n * from a remote DNS server by changing `options.ttl` in the `fetchMethod`.\n */\n fetchMethod?: Fetcher\n\n /**\n * Method that provides the implementation for {@link LRUCache#memo}\n */\n memoMethod?: Memoizer\n\n /**\n * Set to true to suppress the deletion of stale data when a\n * {@link OptionsBase.fetchMethod} returns a rejected promise.\n */\n noDeleteOnFetchRejection?: boolean\n\n /**\n * Do not delete stale items when they are retrieved with\n * {@link LRUCache#get}.\n *\n * Note that the `get` return value will still be `undefined`\n * unless {@link OptionsBase.allowStale} is true.\n *\n * When using time-expiring entries with `ttl`, by default stale\n * items will be removed from the cache when the key is accessed\n * with `cache.get()`.\n *\n * Setting this option will cause stale items to remain in the cache, until\n * they are explicitly deleted with `cache.delete(key)`, or retrieved with\n * `noDeleteOnStaleGet` set to `false`.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n *\n * Only relevant if a ttl is used.\n */\n noDeleteOnStaleGet?: boolean\n\n /**\n * Set to true to allow returning stale data when a\n * {@link OptionsBase.fetchMethod} throws an error or returns a rejected\n * promise.\n *\n * This differs from using {@link OptionsBase.allowStale} in that stale\n * data will ONLY be returned in the case that the {@link LRUCache#fetch}\n * fails, not any other times.\n *\n * If a `fetchMethod` fails, and there is no stale value available, the\n * `fetch()` will resolve to `undefined`. Ie, all `fetchMethod` errors are\n * suppressed.\n *\n * Implies `noDeleteOnFetchRejection`.\n *\n * This may be set in calls to `fetch()`, or defaulted on the constructor,\n * or overridden by modifying the options object in the `fetchMethod`.\n */\n allowStaleOnFetchRejection?: boolean\n\n /**\n * Set to true to return a stale value from the cache when the\n * `AbortSignal` passed to the {@link OptionsBase.fetchMethod} dispatches\n * an `'abort'` event, whether user-triggered, or due to internal cache\n * behavior.\n *\n * Unless {@link OptionsBase.ignoreFetchAbort} is also set, the underlying\n * {@link OptionsBase.fetchMethod} will still be considered canceled, and\n * any value it returns will be ignored and not cached.\n *\n * Caveat: since fetches are aborted when a new value is explicitly\n * set in the cache, this can lead to fetch returning a stale value,\n * since that was the fallback value _at the moment the `fetch()` was\n * initiated_, even though the new updated value is now present in\n * the cache.\n *\n * For example:\n *\n * ```ts\n * const cache = new LRUCache({\n * ttl: 100,\n * fetchMethod: async (url, oldValue, { signal }) => {\n * const res = await fetch(url, { signal })\n * return await res.json()\n * }\n * })\n * cache.set('https://example.com/', { some: 'data' })\n * // 100ms go by...\n * const result = cache.fetch('https://example.com/')\n * cache.set('https://example.com/', { other: 'thing' })\n * console.log(await result) // { some: 'data' }\n * console.log(cache.get('https://example.com/')) // { other: 'thing' }\n * ```\n */\n allowStaleOnFetchAbort?: boolean\n\n /**\n * Set to true to ignore the `abort` event emitted by the `AbortSignal`\n * object passed to {@link OptionsBase.fetchMethod}, and still cache the\n * resulting resolution value, as long as it is not `undefined`.\n *\n * When used on its own, this means aborted {@link LRUCache#fetch} calls\n * are not immediately resolved or rejected when they are aborted, and\n * instead take the full time to await.\n *\n * When used with {@link OptionsBase.allowStaleOnFetchAbort}, aborted\n * {@link LRUCache#fetch} calls will resolve immediately to their stale\n * cached value or `undefined`, and will continue to process and eventually\n * update the cache when they resolve, as long as the resulting value is\n * not `undefined`, thus supporting a \"return stale on timeout while\n * refreshing\" mechanism by passing `AbortSignal.timeout(n)` as the signal.\n *\n * For example:\n *\n * ```ts\n * const c = new LRUCache({\n * ttl: 100,\n * ignoreFetchAbort: true,\n * allowStaleOnFetchAbort: true,\n * fetchMethod: async (key, oldValue, { signal }) => {\n * // note: do NOT pass the signal to fetch()!\n * // let's say this fetch can take a long time.\n * const res = await fetch(`https://slow-backend-server/${key}`)\n * return await res.json()\n * },\n * })\n *\n * // this will return the stale value after 100ms, while still\n * // updating in the background for next time.\n * const val = await c.fetch('key', { signal: AbortSignal.timeout(100) })\n * ```\n *\n * **Note**: regardless of this setting, an `abort` event _is still\n * emitted on the `AbortSignal` object_, so may result in invalid results\n * when passed to other underlying APIs that use AbortSignals.\n *\n * This may be overridden in the {@link OptionsBase.fetchMethod} or the\n * call to {@link LRUCache#fetch}.\n */\n ignoreFetchAbort?: boolean\n }\n\n export interface OptionsMaxLimit\n extends OptionsBase {\n max: Count\n }\n export interface OptionsTTLLimit\n extends OptionsBase {\n ttl: Milliseconds\n ttlAutopurge: boolean\n }\n export interface OptionsSizeLimit\n extends OptionsBase {\n maxSize: Size\n }\n\n /**\n * The valid safe options for the {@link LRUCache} constructor\n */\n export type Options =\n | OptionsMaxLimit\n | OptionsSizeLimit\n | OptionsTTLLimit\n\n /**\n * Entry objects used by {@link LRUCache#load} and {@link LRUCache#dump},\n * and returned by {@link LRUCache#info}.\n */\n export interface Entry {\n value: V\n ttl?: Milliseconds\n size?: Size\n start?: Milliseconds\n }\n}\n\n/**\n * Default export, the thing you're using this module to get.\n *\n * The `K` and `V` types define the key and value types, respectively. The\n * optional `FC` type defines the type of the `context` object passed to\n * `cache.fetch()` and `cache.memo()`.\n *\n * Keys and values **must not** be `null` or `undefined`.\n *\n * All properties from the options object (with the exception of `max`,\n * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are\n * added as normal public members. (The listed options are read-only getters.)\n *\n * Changing any of these will alter the defaults for subsequent method calls.\n */\nexport class LRUCache\n implements Map\n{\n // options that cannot be changed without disaster\n readonly #max: LRUCache.Count\n readonly #maxSize: LRUCache.Size\n readonly #dispose?: LRUCache.Disposer\n readonly #disposeAfter?: LRUCache.Disposer\n readonly #fetchMethod?: LRUCache.Fetcher\n readonly #memoMethod?: LRUCache.Memoizer\n\n /**\n * {@link LRUCache.OptionsBase.ttl}\n */\n ttl: LRUCache.Milliseconds\n\n /**\n * {@link LRUCache.OptionsBase.ttlResolution}\n */\n ttlResolution: LRUCache.Milliseconds\n /**\n * {@link LRUCache.OptionsBase.ttlAutopurge}\n */\n ttlAutopurge: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnGet}\n */\n updateAgeOnGet: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnHas}\n */\n updateAgeOnHas: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStale}\n */\n allowStale: boolean\n\n /**\n * {@link LRUCache.OptionsBase.noDisposeOnSet}\n */\n noDisposeOnSet: boolean\n /**\n * {@link LRUCache.OptionsBase.noUpdateTTL}\n */\n noUpdateTTL: boolean\n /**\n * {@link LRUCache.OptionsBase.maxEntrySize}\n */\n maxEntrySize: LRUCache.Size\n /**\n * {@link LRUCache.OptionsBase.sizeCalculation}\n */\n sizeCalculation?: LRUCache.SizeCalculator\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection}\n */\n noDeleteOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnStaleGet}\n */\n noDeleteOnStaleGet: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}\n */\n allowStaleOnFetchAbort: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection}\n */\n allowStaleOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.ignoreFetchAbort}\n */\n ignoreFetchAbort: boolean\n\n // computed properties\n #size: LRUCache.Count\n #calculatedSize: LRUCache.Size\n #keyMap: Map\n #keyList: (K | undefined)[]\n #valList: (V | BackgroundFetch | undefined)[]\n #next: NumberArray\n #prev: NumberArray\n #head: Index\n #tail: Index\n #free: StackLike\n #disposed?: DisposeTask[]\n #sizes?: ZeroArray\n #starts?: ZeroArray\n #ttls?: ZeroArray\n\n #hasDispose: boolean\n #hasFetchMethod: boolean\n #hasDisposeAfter: boolean\n\n /**\n * Do not call this method unless you need to inspect the\n * inner workings of the cache. If anything returned by this\n * object is modified in any way, strange breakage may occur.\n *\n * These fields are private for a reason!\n *\n * @internal\n */\n static unsafeExposeInternals<\n K extends {},\n V extends {},\n FC extends unknown = unknown\n >(c: LRUCache) {\n return {\n // properties\n starts: c.#starts,\n ttls: c.#ttls,\n sizes: c.#sizes,\n keyMap: c.#keyMap as Map,\n keyList: c.#keyList,\n valList: c.#valList,\n next: c.#next,\n prev: c.#prev,\n get head() {\n return c.#head\n },\n get tail() {\n return c.#tail\n },\n free: c.#free,\n // methods\n isBackgroundFetch: (p: any) => c.#isBackgroundFetch(p),\n backgroundFetch: (\n k: K,\n index: number | undefined,\n options: LRUCache.FetchOptions,\n context: any\n ): BackgroundFetch =>\n c.#backgroundFetch(\n k,\n index as Index | undefined,\n options,\n context\n ),\n moveToTail: (index: number): void =>\n c.#moveToTail(index as Index),\n indexes: (options?: { allowStale: boolean }) =>\n c.#indexes(options),\n rindexes: (options?: { allowStale: boolean }) =>\n c.#rindexes(options),\n isStale: (index: number | undefined) =>\n c.#isStale(index as Index),\n }\n }\n\n // Protected read-only members\n\n /**\n * {@link LRUCache.OptionsBase.max} (read-only)\n */\n get max(): LRUCache.Count {\n return this.#max\n }\n /**\n * {@link LRUCache.OptionsBase.maxSize} (read-only)\n */\n get maxSize(): LRUCache.Count {\n return this.#maxSize\n }\n /**\n * The total computed size of items in the cache (read-only)\n */\n get calculatedSize(): LRUCache.Size {\n return this.#calculatedSize\n }\n /**\n * The number of items stored in the cache (read-only)\n */\n get size(): LRUCache.Count {\n return this.#size\n }\n /**\n * {@link LRUCache.OptionsBase.fetchMethod} (read-only)\n */\n get fetchMethod(): LRUCache.Fetcher | undefined {\n return this.#fetchMethod\n }\n get memoMethod(): LRUCache.Memoizer | undefined {\n return this.#memoMethod\n }\n /**\n * {@link LRUCache.OptionsBase.dispose} (read-only)\n */\n get dispose() {\n return this.#dispose\n }\n /**\n * {@link LRUCache.OptionsBase.disposeAfter} (read-only)\n */\n get disposeAfter() {\n return this.#disposeAfter\n }\n\n constructor(\n options: LRUCache.Options | LRUCache\n ) {\n const {\n max = 0,\n ttl,\n ttlResolution = 1,\n ttlAutopurge,\n updateAgeOnGet,\n updateAgeOnHas,\n allowStale,\n dispose,\n disposeAfter,\n noDisposeOnSet,\n noUpdateTTL,\n maxSize = 0,\n maxEntrySize = 0,\n sizeCalculation,\n fetchMethod,\n memoMethod,\n noDeleteOnFetchRejection,\n noDeleteOnStaleGet,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n } = options\n\n if (max !== 0 && !isPosInt(max)) {\n throw new TypeError('max option must be a nonnegative integer')\n }\n\n const UintArray = max ? getUintArray(max) : Array\n if (!UintArray) {\n throw new Error('invalid max value: ' + max)\n }\n\n this.#max = max\n this.#maxSize = maxSize\n this.maxEntrySize = maxEntrySize || this.#maxSize\n this.sizeCalculation = sizeCalculation\n if (this.sizeCalculation) {\n if (!this.#maxSize && !this.maxEntrySize) {\n throw new TypeError(\n 'cannot set sizeCalculation without setting maxSize or maxEntrySize'\n )\n }\n if (typeof this.sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation set to non-function')\n }\n }\n\n if (\n memoMethod !== undefined &&\n typeof memoMethod !== 'function'\n ) {\n throw new TypeError('memoMethod must be a function if defined')\n }\n this.#memoMethod = memoMethod\n\n if (\n fetchMethod !== undefined &&\n typeof fetchMethod !== 'function'\n ) {\n throw new TypeError(\n 'fetchMethod must be a function if specified'\n )\n }\n this.#fetchMethod = fetchMethod\n this.#hasFetchMethod = !!fetchMethod\n\n this.#keyMap = new Map()\n this.#keyList = new Array(max).fill(undefined)\n this.#valList = new Array(max).fill(undefined)\n this.#next = new UintArray(max)\n this.#prev = new UintArray(max)\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free = Stack.create(max)\n this.#size = 0\n this.#calculatedSize = 0\n\n if (typeof dispose === 'function') {\n this.#dispose = dispose\n }\n if (typeof disposeAfter === 'function') {\n this.#disposeAfter = disposeAfter\n this.#disposed = []\n } else {\n this.#disposeAfter = undefined\n this.#disposed = undefined\n }\n this.#hasDispose = !!this.#dispose\n this.#hasDisposeAfter = !!this.#disposeAfter\n\n this.noDisposeOnSet = !!noDisposeOnSet\n this.noUpdateTTL = !!noUpdateTTL\n this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection\n this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection\n this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort\n this.ignoreFetchAbort = !!ignoreFetchAbort\n\n // NB: maxEntrySize is set to maxSize if it's set\n if (this.maxEntrySize !== 0) {\n if (this.#maxSize !== 0) {\n if (!isPosInt(this.#maxSize)) {\n throw new TypeError(\n 'maxSize must be a positive integer if specified'\n )\n }\n }\n if (!isPosInt(this.maxEntrySize)) {\n throw new TypeError(\n 'maxEntrySize must be a positive integer if specified'\n )\n }\n this.#initializeSizeTracking()\n }\n\n this.allowStale = !!allowStale\n this.noDeleteOnStaleGet = !!noDeleteOnStaleGet\n this.updateAgeOnGet = !!updateAgeOnGet\n this.updateAgeOnHas = !!updateAgeOnHas\n this.ttlResolution =\n isPosInt(ttlResolution) || ttlResolution === 0\n ? ttlResolution\n : 1\n this.ttlAutopurge = !!ttlAutopurge\n this.ttl = ttl || 0\n if (this.ttl) {\n if (!isPosInt(this.ttl)) {\n throw new TypeError(\n 'ttl must be a positive integer if specified'\n )\n }\n this.#initializeTTLTracking()\n }\n\n // do not allow completely unbounded caches\n if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) {\n throw new TypeError(\n 'At least one of max, maxSize, or ttl is required'\n )\n }\n if (!this.ttlAutopurge && !this.#max && !this.#maxSize) {\n const code = 'LRU_CACHE_UNBOUNDED'\n if (shouldWarn(code)) {\n warned.add(code)\n const msg =\n 'TTL caching without ttlAutopurge, max, or maxSize can ' +\n 'result in unbounded memory consumption.'\n emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache)\n }\n }\n }\n\n /**\n * Return the number of ms left in the item's TTL. If item is not in cache,\n * returns `0`. Returns `Infinity` if item is in cache without a defined TTL.\n */\n getRemainingTTL(key: K) {\n return this.#keyMap.has(key) ? Infinity : 0\n }\n\n #initializeTTLTracking() {\n const ttls = new ZeroArray(this.#max)\n const starts = new ZeroArray(this.#max)\n this.#ttls = ttls\n this.#starts = starts\n\n this.#setItemTTL = (index, ttl, start = perf.now()) => {\n starts[index] = ttl !== 0 ? start : 0\n ttls[index] = ttl\n if (ttl !== 0 && this.ttlAutopurge) {\n const t = setTimeout(() => {\n if (this.#isStale(index)) {\n this.#delete(this.#keyList[index] as K, 'expire')\n }\n }, ttl + 1)\n // unref() not supported on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n }\n }\n\n this.#updateItemAge = index => {\n starts[index] = ttls[index] !== 0 ? perf.now() : 0\n }\n\n this.#statusTTL = (status, index) => {\n if (ttls[index]) {\n const ttl = ttls[index]\n const start = starts[index]\n /* c8 ignore next */\n if (!ttl || !start) return\n status.ttl = ttl\n status.start = start\n status.now = cachedNow || getNow()\n const age = status.now - start\n status.remainingTTL = ttl - age\n }\n }\n\n // debounce calls to perf.now() to 1s so we're not hitting\n // that costly call repeatedly.\n let cachedNow = 0\n const getNow = () => {\n const n = perf.now()\n if (this.ttlResolution > 0) {\n cachedNow = n\n const t = setTimeout(\n () => (cachedNow = 0),\n this.ttlResolution\n )\n // not available on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n }\n return n\n }\n\n this.getRemainingTTL = key => {\n const index = this.#keyMap.get(key)\n if (index === undefined) {\n return 0\n }\n const ttl = ttls[index]\n const start = starts[index]\n if (!ttl || !start) {\n return Infinity\n }\n const age = (cachedNow || getNow()) - start\n return ttl - age\n }\n\n this.#isStale = index => {\n const s = starts[index]\n const t = ttls[index]\n return !!t && !!s && (cachedNow || getNow()) - s > t\n }\n }\n\n // conditionally set private methods related to TTL\n #updateItemAge: (index: Index) => void = () => {}\n #statusTTL: (status: LRUCache.Status, index: Index) => void =\n () => {}\n #setItemTTL: (\n index: Index,\n ttl: LRUCache.Milliseconds,\n start?: LRUCache.Milliseconds\n // ignore because we never call this if we're not already in TTL mode\n /* c8 ignore start */\n ) => void = () => {}\n /* c8 ignore stop */\n\n #isStale: (index: Index) => boolean = () => false\n\n #initializeSizeTracking() {\n const sizes = new ZeroArray(this.#max)\n this.#calculatedSize = 0\n this.#sizes = sizes\n this.#removeItemSize = index => {\n this.#calculatedSize -= sizes[index] as number\n sizes[index] = 0\n }\n this.#requireSize = (k, v, size, sizeCalculation) => {\n // provisionally accept background fetches.\n // actual value size will be checked when they return.\n if (this.#isBackgroundFetch(v)) {\n return 0\n }\n if (!isPosInt(size)) {\n if (sizeCalculation) {\n if (typeof sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation must be a function')\n }\n size = sizeCalculation(v, k)\n if (!isPosInt(size)) {\n throw new TypeError(\n 'sizeCalculation return invalid (expect positive integer)'\n )\n }\n } else {\n throw new TypeError(\n 'invalid size value (must be positive integer). ' +\n 'When maxSize or maxEntrySize is used, sizeCalculation ' +\n 'or size must be set.'\n )\n }\n }\n return size\n }\n this.#addItemSize = (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status\n ) => {\n sizes[index] = size\n if (this.#maxSize) {\n const maxSize = this.#maxSize - (sizes[index] as number)\n while (this.#calculatedSize > maxSize) {\n this.#evict(true)\n }\n }\n this.#calculatedSize += sizes[index] as number\n if (status) {\n status.entrySize = size\n status.totalCalculatedSize = this.#calculatedSize\n }\n }\n }\n\n #removeItemSize: (index: Index) => void = _i => {}\n #addItemSize: (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status\n ) => void = (_i, _s, _st) => {}\n #requireSize: (\n k: K,\n v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator\n ) => LRUCache.Size = (\n _k: K,\n _v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator\n ) => {\n if (size || sizeCalculation) {\n throw new TypeError(\n 'cannot set size without setting maxSize or maxEntrySize on cache'\n )\n }\n return 0\n };\n\n *#indexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#tail; true; ) {\n if (!this.#isValidIndex(i)) {\n break\n }\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#head) {\n break\n } else {\n i = this.#prev[i] as Index\n }\n }\n }\n }\n\n *#rindexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#head; true; ) {\n if (!this.#isValidIndex(i)) {\n break\n }\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#tail) {\n break\n } else {\n i = this.#next[i] as Index\n }\n }\n }\n }\n\n #isValidIndex(index: Index) {\n return (\n index !== undefined &&\n this.#keyMap.get(this.#keyList[index] as K) === index\n )\n }\n\n /**\n * Return a generator yielding `[key, value]` pairs,\n * in order from most recently used to least recently used.\n */\n *entries() {\n for (const i of this.#indexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]] as [K, V]\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.entries}\n *\n * Return a generator yielding `[key, value]` pairs,\n * in order from least recently used to most recently used.\n */\n *rentries() {\n for (const i of this.#rindexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]]\n }\n }\n }\n\n /**\n * Return a generator yielding the keys in the cache,\n * in order from most recently used to least recently used.\n */\n *keys() {\n for (const i of this.#indexes()) {\n const k = this.#keyList[i]\n if (\n k !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield k\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.keys}\n *\n * Return a generator yielding the keys in the cache,\n * in order from least recently used to most recently used.\n */\n *rkeys() {\n for (const i of this.#rindexes()) {\n const k = this.#keyList[i]\n if (\n k !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield k\n }\n }\n }\n\n /**\n * Return a generator yielding the values in the cache,\n * in order from most recently used to least recently used.\n */\n *values() {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n if (\n v !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield this.#valList[i] as V\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.values}\n *\n * Return a generator yielding the values in the cache,\n * in order from least recently used to most recently used.\n */\n *rvalues() {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n if (\n v !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield this.#valList[i]\n }\n }\n }\n\n /**\n * Iterating over the cache itself yields the same results as\n * {@link LRUCache.entries}\n */\n [Symbol.iterator]() {\n return this.entries()\n }\n\n /**\n * A String value that is used in the creation of the default string\n * description of an object. Called by the built-in method\n * `Object.prototype.toString`.\n */\n [Symbol.toStringTag] = 'LRUCache'\n\n /**\n * Find a value for which the supplied fn method returns a truthy value,\n * similar to `Array.find()`. fn is called as `fn(value, key, cache)`.\n */\n find(\n fn: (v: V, k: K, self: LRUCache) => boolean,\n getOptions: LRUCache.GetOptions = {}\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined) continue\n if (fn(value, this.#keyList[i] as K, this)) {\n return this.get(this.#keyList[i] as K, getOptions)\n }\n }\n }\n\n /**\n * Call the supplied function on each item in the cache, in order from most\n * recently used to least recently used.\n *\n * `fn` is called as `fn(value, key, cache)`.\n *\n * If `thisp` is provided, function will be called in the `this`-context of\n * the provided object, or the cache if no `thisp` object is provided.\n *\n * Does not update age or recenty of use, or iterate over stale values.\n */\n forEach(\n fn: (v: V, k: K, self: LRUCache) => any,\n thisp: any = this\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * The same as {@link LRUCache.forEach} but items are iterated over in\n * reverse order. (ie, less recently used items are iterated over first.)\n */\n rforEach(\n fn: (v: V, k: K, self: LRUCache) => any,\n thisp: any = this\n ) {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * Delete any stale entries. Returns true if anything was removed,\n * false otherwise.\n */\n purgeStale() {\n let deleted = false\n for (const i of this.#rindexes({ allowStale: true })) {\n if (this.#isStale(i)) {\n this.#delete(this.#keyList[i] as K, 'expire')\n deleted = true\n }\n }\n return deleted\n }\n\n /**\n * Get the extended info about a given entry, to get its value, size, and\n * TTL info simultaneously. Returns `undefined` if the key is not present.\n *\n * Unlike {@link LRUCache#dump}, which is designed to be portable and survive\n * serialization, the `start` value is always the current timestamp, and the\n * `ttl` is a calculated remaining time to live (negative if expired).\n *\n * Always returns stale values, if their info is found in the cache, so be\n * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl})\n * if relevant.\n */\n info(key: K): LRUCache.Entry | undefined {\n const i = this.#keyMap.get(key)\n if (i === undefined) return undefined\n const v = this.#valList[i]\n const value: V | undefined = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined) return undefined\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n const ttl = this.#ttls[i]\n const start = this.#starts[i]\n if (ttl && start) {\n const remain = ttl - (perf.now() - start)\n entry.ttl = remain\n entry.start = Date.now()\n }\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n return entry\n }\n\n /**\n * Return an array of [key, {@link LRUCache.Entry}] tuples which can be\n * passed to {@link LRLUCache#load}.\n *\n * The `start` fields are calculated relative to a portable `Date.now()`\n * timestamp, even if `performance.now()` is available.\n *\n * Stale entries are always included in the `dump`, even if\n * {@link LRUCache.OptionsBase.allowStale} is false.\n *\n * Note: this returns an actual array, not a generator, so it can be more\n * easily passed around.\n */\n dump() {\n const arr: [K, LRUCache.Entry][] = []\n for (const i of this.#indexes({ allowStale: true })) {\n const key = this.#keyList[i]\n const v = this.#valList[i]\n const value: V | undefined = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined || key === undefined) continue\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n entry.ttl = this.#ttls[i]\n // always dump the start relative to a portable timestamp\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = perf.now() - (this.#starts[i] as number)\n entry.start = Math.floor(Date.now() - age)\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n arr.unshift([key, entry])\n }\n return arr\n }\n\n /**\n * Reset the cache and load in the items in entries in the order listed.\n *\n * The shape of the resulting cache may be different if the same options are\n * not used in both caches.\n *\n * The `start` fields are assumed to be calculated relative to a portable\n * `Date.now()` timestamp, even if `performance.now()` is available.\n */\n load(arr: [K, LRUCache.Entry][]) {\n this.clear()\n for (const [key, entry] of arr) {\n if (entry.start) {\n // entry.start is a portable timestamp, but we may be using\n // node's performance.now(), so calculate the offset, so that\n // we get the intended remaining TTL, no matter how long it's\n // been on ice.\n //\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = Date.now() - entry.start\n entry.start = perf.now() - age\n }\n this.set(key, entry.value, entry)\n }\n }\n\n /**\n * Add a value to the cache.\n *\n * Note: if `undefined` is specified as a value, this is an alias for\n * {@link LRUCache#delete}\n *\n * Fields on the {@link LRUCache.SetOptions} options param will override\n * their corresponding values in the constructor options for the scope\n * of this single `set()` operation.\n *\n * If `start` is provided, then that will set the effective start\n * time for the TTL calculation. Note that this must be a previous\n * value of `performance.now()` if supported, or a previous value of\n * `Date.now()` if not.\n *\n * Options object may also include `size`, which will prevent\n * calling the `sizeCalculation` function and just use the specified\n * number if it is a positive integer, and `noDisposeOnSet` which\n * will prevent calling a `dispose` function in the case of\n * overwrites.\n *\n * If the `size` (or return value of `sizeCalculation`) for a given\n * entry is greater than `maxEntrySize`, then the item will not be\n * added to the cache.\n *\n * Will update the recency of the entry.\n *\n * If the value is `undefined`, then this is an alias for\n * `cache.delete(key)`. `undefined` is never stored in the cache.\n */\n set(\n k: K,\n v: V | BackgroundFetch | undefined,\n setOptions: LRUCache.SetOptions = {}\n ) {\n if (v === undefined) {\n this.delete(k)\n return this\n }\n const {\n ttl = this.ttl,\n start,\n noDisposeOnSet = this.noDisposeOnSet,\n sizeCalculation = this.sizeCalculation,\n status,\n } = setOptions\n let { noUpdateTTL = this.noUpdateTTL } = setOptions\n\n const size = this.#requireSize(\n k,\n v,\n setOptions.size || 0,\n sizeCalculation\n )\n // if the item doesn't fit, don't do anything\n // NB: maxEntrySize set to maxSize by default\n if (this.maxEntrySize && size > this.maxEntrySize) {\n if (status) {\n status.set = 'miss'\n status.maxEntrySizeExceeded = true\n }\n // have to delete, in case something is there already.\n this.#delete(k, 'set')\n return this\n }\n let index = this.#size === 0 ? undefined : this.#keyMap.get(k)\n if (index === undefined) {\n // addition\n index = (\n this.#size === 0\n ? this.#tail\n : this.#free.length !== 0\n ? this.#free.pop()\n : this.#size === this.#max\n ? this.#evict(false)\n : this.#size\n ) as Index\n this.#keyList[index] = k\n this.#valList[index] = v\n this.#keyMap.set(k, index)\n this.#next[this.#tail] = index\n this.#prev[index] = this.#tail\n this.#tail = index\n this.#size++\n this.#addItemSize(index, size, status)\n if (status) status.set = 'add'\n noUpdateTTL = false\n } else {\n // update\n this.#moveToTail(index)\n const oldVal = this.#valList[index] as V | BackgroundFetch\n if (v !== oldVal) {\n if (this.#hasFetchMethod && this.#isBackgroundFetch(oldVal)) {\n oldVal.__abortController.abort(new Error('replaced'))\n const { __staleWhileFetching: s } = oldVal\n if (s !== undefined && !noDisposeOnSet) {\n if (this.#hasDispose) {\n this.#dispose?.(s as V, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([s as V, k, 'set'])\n }\n }\n } else if (!noDisposeOnSet) {\n if (this.#hasDispose) {\n this.#dispose?.(oldVal as V, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldVal as V, k, 'set'])\n }\n }\n this.#removeItemSize(index)\n this.#addItemSize(index, size, status)\n this.#valList[index] = v\n if (status) {\n status.set = 'replace'\n const oldValue =\n oldVal && this.#isBackgroundFetch(oldVal)\n ? oldVal.__staleWhileFetching\n : oldVal\n if (oldValue !== undefined) status.oldValue = oldValue\n }\n } else if (status) {\n status.set = 'update'\n }\n }\n if (ttl !== 0 && !this.#ttls) {\n this.#initializeTTLTracking()\n }\n if (this.#ttls) {\n if (!noUpdateTTL) {\n this.#setItemTTL(index, ttl, start)\n }\n if (status) this.#statusTTL(status, index)\n }\n if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return this\n }\n\n /**\n * Evict the least recently used item, returning its value or\n * `undefined` if cache is empty.\n */\n pop(): V | undefined {\n try {\n while (this.#size) {\n const val = this.#valList[this.#head]\n this.#evict(true)\n if (this.#isBackgroundFetch(val)) {\n if (val.__staleWhileFetching) {\n return val.__staleWhileFetching\n }\n } else if (val !== undefined) {\n return val\n }\n }\n } finally {\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n }\n\n #evict(free: boolean) {\n const head = this.#head\n const k = this.#keyList[head] as K\n const v = this.#valList[head] as V\n if (this.#hasFetchMethod && this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('evicted'))\n } else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v, k, 'evict')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v, k, 'evict'])\n }\n }\n this.#removeItemSize(head)\n // if we aren't about to use the index, then null these out\n if (free) {\n this.#keyList[head] = undefined\n this.#valList[head] = undefined\n this.#free.push(head)\n }\n if (this.#size === 1) {\n this.#head = this.#tail = 0 as Index\n this.#free.length = 0\n } else {\n this.#head = this.#next[head] as Index\n }\n this.#keyMap.delete(k)\n this.#size--\n return head\n }\n\n /**\n * Check if a key is in the cache, without updating the recency of use.\n * Will return false if the item is stale, even though it is technically\n * in the cache.\n *\n * Check if a key is in the cache, without updating the recency of\n * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set\n * to `true` in either the options or the constructor.\n *\n * Will return `false` if the item is stale, even though it is technically in\n * the cache. The difference can be determined (if it matters) by using a\n * `status` argument, and inspecting the `has` field.\n *\n * Will not update item age unless\n * {@link LRUCache.OptionsBase.updateAgeOnHas} is set.\n */\n has(k: K, hasOptions: LRUCache.HasOptions = {}) {\n const { updateAgeOnHas = this.updateAgeOnHas, status } =\n hasOptions\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n const v = this.#valList[index]\n if (\n this.#isBackgroundFetch(v) &&\n v.__staleWhileFetching === undefined\n ) {\n return false\n }\n if (!this.#isStale(index)) {\n if (updateAgeOnHas) {\n this.#updateItemAge(index)\n }\n if (status) {\n status.has = 'hit'\n this.#statusTTL(status, index)\n }\n return true\n } else if (status) {\n status.has = 'stale'\n this.#statusTTL(status, index)\n }\n } else if (status) {\n status.has = 'miss'\n }\n return false\n }\n\n /**\n * Like {@link LRUCache#get} but doesn't update recency or delete stale\n * items.\n *\n * Returns `undefined` if the item is stale, unless\n * {@link LRUCache.OptionsBase.allowStale} is set.\n */\n peek(k: K, peekOptions: LRUCache.PeekOptions = {}) {\n const { allowStale = this.allowStale } = peekOptions\n const index = this.#keyMap.get(k)\n if (\n index === undefined ||\n (!allowStale && this.#isStale(index))\n ) {\n return\n }\n const v = this.#valList[index]\n // either stale and allowed, or forcing a refresh of non-stale value\n return this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n }\n\n #backgroundFetch(\n k: K,\n index: Index | undefined,\n options: LRUCache.FetchOptions,\n context: any\n ): BackgroundFetch {\n const v = index === undefined ? undefined : this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n return v\n }\n\n const ac = new AC()\n const { signal } = options\n // when/if our AC signals, then stop listening to theirs.\n signal?.addEventListener('abort', () => ac.abort(signal.reason), {\n signal: ac.signal,\n })\n\n const fetchOpts = {\n signal: ac.signal,\n options,\n context,\n }\n\n const cb = (\n v: V | undefined,\n updateCache = false\n ): V | undefined => {\n const { aborted } = ac.signal\n const ignoreAbort = options.ignoreFetchAbort && v !== undefined\n if (options.status) {\n if (aborted && !updateCache) {\n options.status.fetchAborted = true\n options.status.fetchError = ac.signal.reason\n if (ignoreAbort) options.status.fetchAbortIgnored = true\n } else {\n options.status.fetchResolved = true\n }\n }\n if (aborted && !ignoreAbort && !updateCache) {\n return fetchFail(ac.signal.reason)\n }\n // either we didn't abort, and are still here, or we did, and ignored\n const bf = p as BackgroundFetch\n if (this.#valList[index as Index] === p) {\n if (v === undefined) {\n if (bf.__staleWhileFetching) {\n this.#valList[index as Index] = bf.__staleWhileFetching\n } else {\n this.#delete(k, 'fetch')\n }\n } else {\n if (options.status) options.status.fetchUpdated = true\n this.set(k, v, fetchOpts.options)\n }\n }\n return v\n }\n\n const eb = (er: any) => {\n if (options.status) {\n options.status.fetchRejected = true\n options.status.fetchError = er\n }\n return fetchFail(er)\n }\n\n const fetchFail = (er: any): V | undefined => {\n const { aborted } = ac.signal\n const allowStaleAborted =\n aborted && options.allowStaleOnFetchAbort\n const allowStale =\n allowStaleAborted || options.allowStaleOnFetchRejection\n const noDelete = allowStale || options.noDeleteOnFetchRejection\n const bf = p as BackgroundFetch\n if (this.#valList[index as Index] === p) {\n // if we allow stale on fetch rejections, then we need to ensure that\n // the stale value is not removed from the cache when the fetch fails.\n const del = !noDelete || bf.__staleWhileFetching === undefined\n if (del) {\n this.#delete(k, 'fetch')\n } else if (!allowStaleAborted) {\n // still replace the *promise* with the stale value,\n // since we are done with the promise at this point.\n // leave it untouched if we're still waiting for an\n // aborted background fetch that hasn't yet returned.\n this.#valList[index as Index] = bf.__staleWhileFetching\n }\n }\n if (allowStale) {\n if (options.status && bf.__staleWhileFetching !== undefined) {\n options.status.returnedStale = true\n }\n return bf.__staleWhileFetching\n } else if (bf.__returned === bf) {\n throw er\n }\n }\n\n const pcall = (\n res: (v: V | undefined) => void,\n rej: (e: any) => void\n ) => {\n const fmp = this.#fetchMethod?.(k, v, fetchOpts)\n if (fmp && fmp instanceof Promise) {\n fmp.then(v => res(v === undefined ? undefined : v), rej)\n }\n // ignored, we go until we finish, regardless.\n // defer check until we are actually aborting,\n // so fetchMethod can override.\n ac.signal.addEventListener('abort', () => {\n if (\n !options.ignoreFetchAbort ||\n options.allowStaleOnFetchAbort\n ) {\n res(undefined)\n // when it eventually resolves, update the cache.\n if (options.allowStaleOnFetchAbort) {\n res = v => cb(v, true)\n }\n }\n })\n }\n\n if (options.status) options.status.fetchDispatched = true\n const p = new Promise(pcall).then(cb, eb)\n const bf: BackgroundFetch = Object.assign(p, {\n __abortController: ac,\n __staleWhileFetching: v,\n __returned: undefined,\n })\n\n if (index === undefined) {\n // internal, don't expose status.\n this.set(k, bf, { ...fetchOpts.options, status: undefined })\n index = this.#keyMap.get(k)\n } else {\n this.#valList[index] = bf\n }\n return bf\n }\n\n #isBackgroundFetch(p: any): p is BackgroundFetch {\n if (!this.#hasFetchMethod) return false\n const b = p as BackgroundFetch\n return (\n !!b &&\n b instanceof Promise &&\n b.hasOwnProperty('__staleWhileFetching') &&\n b.__abortController instanceof AC\n )\n }\n\n /**\n * Make an asynchronous cached fetch using the\n * {@link LRUCache.OptionsBase.fetchMethod} function.\n *\n * If the value is in the cache and not stale, then the returned\n * Promise resolves to the value.\n *\n * If not in the cache, or beyond its TTL staleness, then\n * `fetchMethod(key, staleValue, { options, signal, context })` is\n * called, and the value returned will be added to the cache once\n * resolved.\n *\n * If called with `allowStale`, and an asynchronous fetch is\n * currently in progress to reload a stale value, then the former\n * stale value will be returned.\n *\n * If called with `forceRefresh`, then the cached item will be\n * re-fetched, even if it is not stale. However, if `allowStale` is also\n * set, then the old value will still be returned. This is useful\n * in cases where you want to force a reload of a cached value. If\n * a background fetch is already in progress, then `forceRefresh`\n * has no effect.\n *\n * If multiple fetches for the same key are issued, then they will all be\n * coalesced into a single call to fetchMethod.\n *\n * Note that this means that handling options such as\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort},\n * {@link LRUCache.FetchOptions.signal},\n * and {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} will be\n * determined by the FIRST fetch() call for a given key.\n *\n * This is a known (fixable) shortcoming which will be addresed on when\n * someone complains about it, as the fix would involve added complexity and\n * may not be worth the costs for this edge case.\n *\n * If {@link LRUCache.OptionsBase.fetchMethod} is not specified, then this is\n * effectively an alias for `Promise.resolve(cache.get(key))`.\n *\n * When the fetch method resolves to a value, if the fetch has not\n * been aborted due to deletion, eviction, or being overwritten,\n * then it is added to the cache using the options provided.\n *\n * If the key is evicted or deleted before the `fetchMethod`\n * resolves, then the AbortSignal passed to the `fetchMethod` will\n * receive an `abort` event, and the promise returned by `fetch()`\n * will reject with the reason for the abort.\n *\n * If a `signal` is passed to the `fetch()` call, then aborting the\n * signal will abort the fetch and cause the `fetch()` promise to\n * reject with the reason provided.\n *\n * **Setting `context`**\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the {@link LRUCache} constructor, then all\n * calls to `cache.fetch()` _must_ provide a `context` option. If\n * set to `undefined` or `void`, then calls to fetch _must not_\n * provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that\n * might be relevant in the course of fetching the data. It is only\n * relevant for the course of a single `fetch()` operation, and\n * discarded afterwards.\n *\n * **Note: `fetch()` calls are inflight-unique**\n *\n * If you call `fetch()` multiple times with the same key value,\n * then every call after the first will resolve on the same\n * promise1,\n * _even if they have different settings that would otherwise change\n * the behavior of the fetch_, such as `noDeleteOnFetchRejection`\n * or `ignoreFetchAbort`.\n *\n * In most cases, this is not a problem (in fact, only fetching\n * something once is what you probably want, if you're caching in\n * the first place). If you are changing the fetch() options\n * dramatically between runs, there's a good chance that you might\n * be trying to fit divergent semantics into a single object, and\n * would be better off with multiple cache instances.\n *\n * **1**: Ie, they're not the \"same Promise\", but they resolve at\n * the same time, because they're both waiting on the same\n * underlying fetchMethod response.\n */\n\n fetch(\n k: K,\n fetchOptions: unknown extends FC\n ? LRUCache.FetchOptions\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext\n ): Promise\n\n // this overload not allowed if context is required\n fetch(\n k: unknown extends FC\n ? K\n : FC extends undefined | void\n ? K\n : never,\n fetchOptions?: unknown extends FC\n ? LRUCache.FetchOptions\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext\n : never\n ): Promise\n\n async fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {}\n ): Promise {\n const {\n // get options\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n // set options\n ttl = this.ttl,\n noDisposeOnSet = this.noDisposeOnSet,\n size = 0,\n sizeCalculation = this.sizeCalculation,\n noUpdateTTL = this.noUpdateTTL,\n // fetch exclusive options\n noDeleteOnFetchRejection = this.noDeleteOnFetchRejection,\n allowStaleOnFetchRejection = this.allowStaleOnFetchRejection,\n ignoreFetchAbort = this.ignoreFetchAbort,\n allowStaleOnFetchAbort = this.allowStaleOnFetchAbort,\n context,\n forceRefresh = false,\n status,\n signal,\n } = fetchOptions\n\n if (!this.#hasFetchMethod) {\n if (status) status.fetch = 'get'\n return this.get(k, {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n status,\n })\n }\n\n const options = {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n ttl,\n noDisposeOnSet,\n size,\n sizeCalculation,\n noUpdateTTL,\n noDeleteOnFetchRejection,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n status,\n signal,\n }\n\n let index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.fetch = 'miss'\n const p = this.#backgroundFetch(k, index, options, context)\n return (p.__returned = p)\n } else {\n // in cache, maybe already fetching\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n const stale =\n allowStale && v.__staleWhileFetching !== undefined\n if (status) {\n status.fetch = 'inflight'\n if (stale) status.returnedStale = true\n }\n return stale ? v.__staleWhileFetching : (v.__returned = v)\n }\n\n // if we force a refresh, that means do NOT serve the cached value,\n // unless we are already in the process of refreshing the cache.\n const isStale = this.#isStale(index)\n if (!forceRefresh && !isStale) {\n if (status) status.fetch = 'hit'\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n if (status) this.#statusTTL(status, index)\n return v\n }\n\n // ok, it is stale or a forced refresh, and not already fetching.\n // refresh the cache.\n const p = this.#backgroundFetch(k, index, options, context)\n const hasStale = p.__staleWhileFetching !== undefined\n const staleVal = hasStale && allowStale\n if (status) {\n status.fetch = isStale ? 'stale' : 'refresh'\n if (staleVal && isStale) status.returnedStale = true\n }\n return staleVal ? p.__staleWhileFetching : (p.__returned = p)\n }\n }\n\n /**\n * In some cases, `cache.fetch()` may resolve to `undefined`, either because\n * a {@link LRUCache.OptionsBase#fetchMethod} was not provided (turning\n * `cache.fetch(k)` into just an async wrapper around `cache.get(k)`) or\n * because `ignoreFetchAbort` was specified (either to the constructor or\n * in the {@link LRUCache.FetchOptions}). Also, the\n * {@link OptionsBase.fetchMethod} may return `undefined` or `void`, making\n * the test even more complicated.\n *\n * Because inferring the cases where `undefined` might be returned are so\n * cumbersome, but testing for `undefined` can also be annoying, this method\n * can be used, which will reject if `this.fetch()` resolves to undefined.\n */\n forceFetch(\n k: K,\n fetchOptions: unknown extends FC\n ? LRUCache.FetchOptions\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext\n ): Promise\n // this overload not allowed if context is required\n forceFetch(\n k: unknown extends FC\n ? K\n : FC extends undefined | void\n ? K\n : never,\n fetchOptions?: unknown extends FC\n ? LRUCache.FetchOptions\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext\n : never\n ): Promise\n async forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {}\n ): Promise {\n const v = await this.fetch(\n k,\n fetchOptions as unknown extends FC\n ? LRUCache.FetchOptions\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext\n )\n if (v === undefined) throw new Error('fetch() returned undefined')\n return v\n }\n\n /**\n * If the key is found in the cache, then this is equivalent to\n * {@link LRUCache#get}. If not, in the cache, then calculate the value using\n * the {@link LRUCache.OptionsBase.memoMethod}, and add it to the cache.\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the LRUCache constructor, then all calls to `cache.memo()`\n * _must_ provide a `context` option. If set to `undefined` or `void`, then\n * calls to memo _must not_ provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that might be\n * relevant in the course of fetching the data. It is only relevant for the\n * course of a single `memo()` operation, and discarded afterwards.\n */\n memo(\n k: K,\n memoOptions: unknown extends FC\n ? LRUCache.MemoOptions\n : FC extends undefined | void\n ? LRUCache.MemoOptionsNoContext\n : LRUCache.MemoOptionsWithContext\n ): V\n // this overload not allowed if context is required\n memo(\n k: unknown extends FC\n ? K\n : FC extends undefined | void\n ? K\n : never,\n memoOptions?: unknown extends FC\n ? LRUCache.MemoOptions\n : FC extends undefined | void\n ? LRUCache.MemoOptionsNoContext\n : never\n ): V\n memo(k: K, memoOptions: LRUCache.MemoOptions = {}) {\n const memoMethod = this.#memoMethod\n if (!memoMethod) {\n throw new Error('no memoMethod provided to constructor')\n }\n const { context, forceRefresh, ...options } = memoOptions\n const v = this.get(k, options)\n if (!forceRefresh && v !== undefined) return v\n const vv = memoMethod(k, v, {\n options,\n context,\n } as LRUCache.MemoizerOptions)\n this.set(k, vv, options)\n return vv\n }\n\n /**\n * Return a value from the cache. Will update the recency of the cache\n * entry found.\n *\n * If the key is not found, get() will return `undefined`.\n */\n get(k: K, getOptions: LRUCache.GetOptions = {}) {\n const {\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n status,\n } = getOptions\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n const value = this.#valList[index]\n const fetching = this.#isBackgroundFetch(value)\n if (status) this.#statusTTL(status, index)\n if (this.#isStale(index)) {\n if (status) status.get = 'stale'\n // delete only if not an in-flight background fetch\n if (!fetching) {\n if (!noDeleteOnStaleGet) {\n this.#delete(k, 'expire')\n }\n if (status && allowStale) status.returnedStale = true\n return allowStale ? value : undefined\n } else {\n if (\n status &&\n allowStale &&\n value.__staleWhileFetching !== undefined\n ) {\n status.returnedStale = true\n }\n return allowStale ? value.__staleWhileFetching : undefined\n }\n } else {\n if (status) status.get = 'hit'\n // if we're currently fetching it, we don't actually have it yet\n // it's not stale, which means this isn't a staleWhileRefetching.\n // If it's not stale, and fetching, AND has a __staleWhileFetching\n // value, then that means the user fetched with {forceRefresh:true},\n // so it's safe to return that value.\n if (fetching) {\n return value.__staleWhileFetching\n }\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n return value\n }\n } else if (status) {\n status.get = 'miss'\n }\n }\n\n #connect(p: Index, n: Index) {\n this.#prev[n] = p\n this.#next[p] = n\n }\n\n #moveToTail(index: Index): void {\n // if tail already, nothing to do\n // if head, move head to next[index]\n // else\n // move next[prev[index]] to next[index] (head has no prev)\n // move prev[next[index]] to prev[index]\n // prev[index] = tail\n // next[tail] = index\n // tail = index\n if (index !== this.#tail) {\n if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n this.#connect(\n this.#prev[index] as Index,\n this.#next[index] as Index\n )\n }\n this.#connect(this.#tail, index)\n this.#tail = index\n }\n }\n\n /**\n * Deletes a key out of the cache.\n *\n * Returns true if the key was deleted, false otherwise.\n */\n delete(k: K) {\n return this.#delete(k, 'delete')\n }\n\n #delete(k: K, reason: LRUCache.DisposeReason) {\n let deleted = false\n if (this.#size !== 0) {\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n deleted = true\n if (this.#size === 1) {\n this.#clear(reason)\n } else {\n this.#removeItemSize(index)\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k, reason])\n }\n }\n this.#keyMap.delete(k)\n this.#keyList[index] = undefined\n this.#valList[index] = undefined\n if (index === this.#tail) {\n this.#tail = this.#prev[index] as Index\n } else if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n const pi = this.#prev[index] as number\n this.#next[pi] = this.#next[index] as number\n const ni = this.#next[index] as number\n this.#prev[ni] = this.#prev[index] as number\n }\n this.#size--\n this.#free.push(index)\n }\n }\n }\n if (this.#hasDisposeAfter && this.#disposed?.length) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return deleted\n }\n\n /**\n * Clear the cache entirely, throwing away all values.\n */\n clear() {\n return this.#clear('delete')\n }\n #clear(reason: LRUCache.DisposeReason) {\n for (const index of this.#rindexes({ allowStale: true })) {\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else {\n const k = this.#keyList[index]\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k as K, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k as K, reason])\n }\n }\n }\n\n this.#keyMap.clear()\n this.#valList.fill(undefined)\n this.#keyList.fill(undefined)\n if (this.#ttls && this.#starts) {\n this.#ttls.fill(0)\n this.#starts.fill(0)\n }\n if (this.#sizes) {\n this.#sizes.fill(0)\n }\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free.length = 0\n this.#calculatedSize = 0\n this.#size = 0\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n}\n"], - "mappings": "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", - "names": ["perf", "warned", "PROCESS", "emitWarning", "msg", "type", "code", "fn", "AC", "AS", "_", "warnACPolyfill", "reason", "printACPolyfillWarning", "shouldWarn", "TYPE", "isPosInt", "n", "getUintArray", "max", "ZeroArray", "size", "_Stack", "HeapCls", "__privateSet", "_constructing", "s", "__privateGet", "Stack", "__privateAdd", "LRUCache", "#max", "#maxSize", "#dispose", "#disposeAfter", "#fetchMethod", "#memoMethod", "#size", "#calculatedSize", "#keyMap", "#keyList", "#valList", "#next", "#prev", "#head", "#tail", "#free", "#disposed", "#sizes", "#starts", "#ttls", "#hasDispose", "#hasFetchMethod", "#hasDisposeAfter", "c", "p", "#isBackgroundFetch", "k", "index", "options", "context", "#backgroundFetch", "#moveToTail", "#indexes", "#rindexes", "#isStale", "ttl", "ttlResolution", "ttlAutopurge", "updateAgeOnGet", "updateAgeOnHas", "allowStale", "dispose", "disposeAfter", "noDisposeOnSet", "noUpdateTTL", "maxSize", "maxEntrySize", "sizeCalculation", "fetchMethod", "memoMethod", "noDeleteOnFetchRejection", "noDeleteOnStaleGet", "allowStaleOnFetchRejection", "allowStaleOnFetchAbort", "ignoreFetchAbort", "UintArray", "#initializeSizeTracking", "#initializeTTLTracking", "key", "ttls", "starts", "#setItemTTL", "start", "t", "#delete", "#updateItemAge", "#statusTTL", "status", "cachedNow", "getNow", "age", "sizes", "#removeItemSize", "#requireSize", "v", "#addItemSize", "#evict", "_i", "_s", "_st", "_k", "_v", "i", "#isValidIndex", "getOptions", "value", "thisp", "deleted", "entry", "remain", "arr", "setOptions", "oldVal", "oldValue", "dt", "task", "val", "free", "head", "hasOptions", "peekOptions", "ac", "signal", "fetchOpts", "cb", "updateCache", "aborted", "ignoreAbort", "fetchFail", "bf", "eb", "er", "allowStaleAborted", "noDelete", "pcall", "res", "rej", "fmp", "b", "fetchOptions", "forceRefresh", "stale", "isStale", "staleVal", "memoOptions", "vv", "fetching", "#connect", "#clear", "pi", "ni"] -} diff --git a/node_modules/lru-cache/dist/commonjs/package.json b/node_modules/lru-cache/dist/commonjs/package.json deleted file mode 100644 index 5bbefff..0000000 --- a/node_modules/lru-cache/dist/commonjs/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "commonjs" -} diff --git a/node_modules/lru-cache/dist/esm/index.d.ts b/node_modules/lru-cache/dist/esm/index.d.ts deleted file mode 100644 index f59de76..0000000 --- a/node_modules/lru-cache/dist/esm/index.d.ts +++ /dev/null @@ -1,1277 +0,0 @@ -/** - * @module LRUCache - */ -declare const TYPE: unique symbol; -export type PosInt = number & { - [TYPE]: 'Positive Integer'; -}; -export type Index = number & { - [TYPE]: 'LRUCache Index'; -}; -export type UintArray = Uint8Array | Uint16Array | Uint32Array; -export type NumberArray = UintArray | number[]; -declare class ZeroArray extends Array { - constructor(size: number); -} -export type { ZeroArray }; -export type { Stack }; -export type StackLike = Stack | Index[]; -declare class Stack { - #private; - heap: NumberArray; - length: number; - static create(max: number): StackLike; - constructor(max: number, HeapCls: { - new (n: number): NumberArray; - }); - push(n: Index): void; - pop(): Index; -} -/** - * Promise representing an in-progress {@link LRUCache#fetch} call - */ -export type BackgroundFetch = Promise & { - __returned: BackgroundFetch | undefined; - __abortController: AbortController; - __staleWhileFetching: V | undefined; -}; -export type DisposeTask = [ - value: V, - key: K, - reason: LRUCache.DisposeReason -]; -export declare namespace LRUCache { - /** - * An integer greater than 0, reflecting the calculated size of items - */ - type Size = number; - /** - * Integer greater than 0, representing some number of milliseconds, or the - * time at which a TTL started counting from. - */ - type Milliseconds = number; - /** - * An integer greater than 0, reflecting a number of items - */ - type Count = number; - /** - * The reason why an item was removed from the cache, passed - * to the {@link Disposer} methods. - * - * - `evict`: The item was evicted because it is the least recently used, - * and the cache is full. - * - `set`: A new value was set, overwriting the old value being disposed. - * - `delete`: The item was explicitly deleted, either by calling - * {@link LRUCache#delete}, {@link LRUCache#clear}, or - * {@link LRUCache#set} with an undefined value. - * - `expire`: The item was removed due to exceeding its TTL. - * - `fetch`: A {@link OptionsBase#fetchMethod} operation returned - * `undefined` or was aborted, causing the item to be deleted. - */ - type DisposeReason = 'evict' | 'set' | 'delete' | 'expire' | 'fetch'; - /** - * A method called upon item removal, passed as the - * {@link OptionsBase.dispose} and/or - * {@link OptionsBase.disposeAfter} options. - */ - type Disposer = (value: V, key: K, reason: DisposeReason) => void; - /** - * A function that returns the effective calculated size - * of an entry in the cache. - */ - type SizeCalculator = (value: V, key: K) => Size; - /** - * Options provided to the - * {@link OptionsBase.fetchMethod} function. - */ - interface FetcherOptions { - signal: AbortSignal; - options: FetcherFetchOptions; - /** - * Object provided in the {@link FetchOptions.context} option to - * {@link LRUCache#fetch} - */ - context: FC; - } - /** - * Occasionally, it may be useful to track the internal behavior of the - * cache, particularly for logging, debugging, or for behavior within the - * `fetchMethod`. To do this, you can pass a `status` object to the - * {@link LRUCache#fetch}, {@link LRUCache#get}, {@link LRUCache#set}, - * {@link LRUCache#memo}, and {@link LRUCache#has} methods. - * - * The `status` option should be a plain JavaScript object. The following - * fields will be set on it appropriately, depending on the situation. - */ - interface Status { - /** - * The status of a set() operation. - * - * - add: the item was not found in the cache, and was added - * - update: the item was in the cache, with the same value provided - * - replace: the item was in the cache, and replaced - * - miss: the item was not added to the cache for some reason - */ - set?: 'add' | 'update' | 'replace' | 'miss'; - /** - * the ttl stored for the item, or undefined if ttls are not used. - */ - ttl?: Milliseconds; - /** - * the start time for the item, or undefined if ttls are not used. - */ - start?: Milliseconds; - /** - * The timestamp used for TTL calculation - */ - now?: Milliseconds; - /** - * the remaining ttl for the item, or undefined if ttls are not used. - */ - remainingTTL?: Milliseconds; - /** - * The calculated size for the item, if sizes are used. - */ - entrySize?: Size; - /** - * The total calculated size of the cache, if sizes are used. - */ - totalCalculatedSize?: Size; - /** - * A flag indicating that the item was not stored, due to exceeding the - * {@link OptionsBase.maxEntrySize} - */ - maxEntrySizeExceeded?: true; - /** - * The old value, specified in the case of `set:'update'` or - * `set:'replace'` - */ - oldValue?: V; - /** - * The results of a {@link LRUCache#has} operation - * - * - hit: the item was found in the cache - * - stale: the item was found in the cache, but is stale - * - miss: the item was not found in the cache - */ - has?: 'hit' | 'stale' | 'miss'; - /** - * The status of a {@link LRUCache#fetch} operation. - * Note that this can change as the underlying fetch() moves through - * various states. - * - * - inflight: there is another fetch() for this key which is in process - * - get: there is no {@link OptionsBase.fetchMethod}, so - * {@link LRUCache#get} was called. - * - miss: the item is not in cache, and will be fetched. - * - hit: the item is in the cache, and was resolved immediately. - * - stale: the item is in the cache, but stale. - * - refresh: the item is in the cache, and not stale, but - * {@link FetchOptions.forceRefresh} was specified. - */ - fetch?: 'get' | 'inflight' | 'miss' | 'hit' | 'stale' | 'refresh'; - /** - * The {@link OptionsBase.fetchMethod} was called - */ - fetchDispatched?: true; - /** - * The cached value was updated after a successful call to - * {@link OptionsBase.fetchMethod} - */ - fetchUpdated?: true; - /** - * The reason for a fetch() rejection. Either the error raised by the - * {@link OptionsBase.fetchMethod}, or the reason for an - * AbortSignal. - */ - fetchError?: Error; - /** - * The fetch received an abort signal - */ - fetchAborted?: true; - /** - * The abort signal received was ignored, and the fetch was allowed to - * continue. - */ - fetchAbortIgnored?: true; - /** - * The fetchMethod promise resolved successfully - */ - fetchResolved?: true; - /** - * The fetchMethod promise was rejected - */ - fetchRejected?: true; - /** - * The status of a {@link LRUCache#get} operation. - * - * - fetching: The item is currently being fetched. If a previous value - * is present and allowed, that will be returned. - * - stale: The item is in the cache, and is stale. - * - hit: the item is in the cache - * - miss: the item is not in the cache - */ - get?: 'stale' | 'hit' | 'miss'; - /** - * A fetch or get operation returned a stale value. - */ - returnedStale?: true; - } - /** - * options which override the options set in the LRUCache constructor - * when calling {@link LRUCache#fetch}. - * - * This is the union of {@link GetOptions} and {@link SetOptions}, plus - * {@link OptionsBase.noDeleteOnFetchRejection}, - * {@link OptionsBase.allowStaleOnFetchRejection}, - * {@link FetchOptions.forceRefresh}, and - * {@link FetcherOptions.context} - * - * Any of these may be modified in the {@link OptionsBase.fetchMethod} - * function, but the {@link GetOptions} fields will of course have no - * effect, as the {@link LRUCache#get} call already happened by the time - * the fetchMethod is called. - */ - interface FetcherFetchOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet' | 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL' | 'noDeleteOnFetchRejection' | 'allowStaleOnFetchRejection' | 'ignoreFetchAbort' | 'allowStaleOnFetchAbort'> { - status?: Status; - size?: Size; - } - /** - * Options that may be passed to the {@link LRUCache#fetch} method. - */ - interface FetchOptions extends FetcherFetchOptions { - /** - * Set to true to force a re-load of the existing data, even if it - * is not yet stale. - */ - forceRefresh?: boolean; - /** - * Context provided to the {@link OptionsBase.fetchMethod} as - * the {@link FetcherOptions.context} param. - * - * If the FC type is specified as unknown (the default), - * undefined or void, then this is optional. Otherwise, it will - * be required. - */ - context?: FC; - signal?: AbortSignal; - status?: Status; - } - /** - * Options provided to {@link LRUCache#fetch} when the FC type is something - * other than `unknown`, `undefined`, or `void` - */ - interface FetchOptionsWithContext extends FetchOptions { - context: FC; - } - /** - * Options provided to {@link LRUCache#fetch} when the FC type is - * `undefined` or `void` - */ - interface FetchOptionsNoContext extends FetchOptions { - context?: undefined; - } - interface MemoOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet' | 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL' | 'noDeleteOnFetchRejection' | 'allowStaleOnFetchRejection' | 'ignoreFetchAbort' | 'allowStaleOnFetchAbort'> { - /** - * Set to true to force a re-load of the existing data, even if it - * is not yet stale. - */ - forceRefresh?: boolean; - /** - * Context provided to the {@link OptionsBase.memoMethod} as - * the {@link MemoizerOptions.context} param. - * - * If the FC type is specified as unknown (the default), - * undefined or void, then this is optional. Otherwise, it will - * be required. - */ - context?: FC; - status?: Status; - } - /** - * Options provided to {@link LRUCache#memo} when the FC type is something - * other than `unknown`, `undefined`, or `void` - */ - interface MemoOptionsWithContext extends MemoOptions { - context: FC; - } - /** - * Options provided to {@link LRUCache#memo} when the FC type is - * `undefined` or `void` - */ - interface MemoOptionsNoContext extends MemoOptions { - context?: undefined; - } - /** - * Options provided to the - * {@link OptionsBase.memoMethod} function. - */ - interface MemoizerOptions { - options: MemoizerMemoOptions; - /** - * Object provided in the {@link MemoOptions.context} option to - * {@link LRUCache#memo} - */ - context: FC; - } - /** - * options which override the options set in the LRUCache constructor - * when calling {@link LRUCache#memo}. - * - * This is the union of {@link GetOptions} and {@link SetOptions}, plus - * {@link MemoOptions.forceRefresh}, and - * {@link MemoerOptions.context} - * - * Any of these may be modified in the {@link OptionsBase.memoMethod} - * function, but the {@link GetOptions} fields will of course have no - * effect, as the {@link LRUCache#get} call already happened by the time - * the memoMethod is called. - */ - interface MemoizerMemoOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet' | 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'> { - status?: Status; - size?: Size; - start?: Milliseconds; - } - /** - * Options that may be passed to the {@link LRUCache#has} method. - */ - interface HasOptions extends Pick, 'updateAgeOnHas'> { - status?: Status; - } - /** - * Options that may be passed to the {@link LRUCache#get} method. - */ - interface GetOptions extends Pick, 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet'> { - status?: Status; - } - /** - * Options that may be passed to the {@link LRUCache#peek} method. - */ - interface PeekOptions extends Pick, 'allowStale'> { - } - /** - * Options that may be passed to the {@link LRUCache#set} method. - */ - interface SetOptions extends Pick, 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'> { - /** - * If size tracking is enabled, then setting an explicit size - * in the {@link LRUCache#set} call will prevent calling the - * {@link OptionsBase.sizeCalculation} function. - */ - size?: Size; - /** - * If TTL tracking is enabled, then setting an explicit start - * time in the {@link LRUCache#set} call will override the - * default time from `performance.now()` or `Date.now()`. - * - * Note that it must be a valid value for whichever time-tracking - * method is in use. - */ - start?: Milliseconds; - status?: Status; - } - /** - * The type signature for the {@link OptionsBase.fetchMethod} option. - */ - type Fetcher = (key: K, staleValue: V | undefined, options: FetcherOptions) => Promise | V | undefined | void; - /** - * the type signature for the {@link OptionsBase.memoMethod} option. - */ - type Memoizer = (key: K, staleValue: V | undefined, options: MemoizerOptions) => V; - /** - * Options which may be passed to the {@link LRUCache} constructor. - * - * Most of these may be overridden in the various options that use - * them. - * - * Despite all being technically optional, the constructor requires that - * a cache is at minimum limited by one or more of {@link OptionsBase.max}, - * {@link OptionsBase.ttl}, or {@link OptionsBase.maxSize}. - * - * If {@link OptionsBase.ttl} is used alone, then it is strongly advised - * (and in fact required by the type definitions here) that the cache - * also set {@link OptionsBase.ttlAutopurge}, to prevent potentially - * unbounded storage. - * - * All options are also available on the {@link LRUCache} instance, making - * it safe to pass an LRUCache instance as the options argumemnt to - * make another empty cache of the same type. - * - * Some options are marked as read-only, because changing them after - * instantiation is not safe. Changing any of the other options will of - * course only have an effect on subsequent method calls. - */ - interface OptionsBase { - /** - * The maximum number of items to store in the cache before evicting - * old entries. This is read-only on the {@link LRUCache} instance, - * and may not be overridden. - * - * If set, then storage space will be pre-allocated at construction - * time, and the cache will perform significantly faster. - * - * Note that significantly fewer items may be stored, if - * {@link OptionsBase.maxSize} and/or {@link OptionsBase.ttl} are also - * set. - * - * **It is strongly recommended to set a `max` to prevent unbounded growth - * of the cache.** - */ - max?: Count; - /** - * Max time in milliseconds for items to live in cache before they are - * considered stale. Note that stale items are NOT preemptively removed by - * default, and MAY live in the cache, contributing to its LRU max, long - * after they have expired, unless {@link OptionsBase.ttlAutopurge} is - * set. - * - * If set to `0` (the default value), then that means "do not track - * TTL", not "expire immediately". - * - * Also, as this cache is optimized for LRU/MRU operations, some of - * the staleness/TTL checks will reduce performance, as they will incur - * overhead by deleting items. - * - * This is not primarily a TTL cache, and does not make strong TTL - * guarantees. There is no pre-emptive pruning of expired items, but you - * _may_ set a TTL on the cache, and it will treat expired items as missing - * when they are fetched, and delete them. - * - * Optional, but must be a non-negative integer in ms if specified. - * - * This may be overridden by passing an options object to `cache.set()`. - * - * At least one of `max`, `maxSize`, or `TTL` is required. This must be a - * positive integer if set. - * - * Even if ttl tracking is enabled, **it is strongly recommended to set a - * `max` to prevent unbounded growth of the cache.** - * - * If ttl tracking is enabled, and `max` and `maxSize` are not set, - * and `ttlAutopurge` is not set, then a warning will be emitted - * cautioning about the potential for unbounded memory consumption. - * (The TypeScript definitions will also discourage this.) - */ - ttl?: Milliseconds; - /** - * Minimum amount of time in ms in which to check for staleness. - * Defaults to 1, which means that the current time is checked - * at most once per millisecond. - * - * Set to 0 to check the current time every time staleness is tested. - * (This reduces performance, and is theoretically unnecessary.) - * - * Setting this to a higher value will improve performance somewhat - * while using ttl tracking, albeit at the expense of keeping stale - * items around a bit longer than their TTLs would indicate. - * - * @default 1 - */ - ttlResolution?: Milliseconds; - /** - * Preemptively remove stale items from the cache. - * - * Note that this may *significantly* degrade performance, especially if - * the cache is storing a large number of items. It is almost always best - * to just leave the stale items in the cache, and let them fall out as new - * items are added. - * - * Note that this means that {@link OptionsBase.allowStale} is a bit - * pointless, as stale items will be deleted almost as soon as they - * expire. - * - * Use with caution! - */ - ttlAutopurge?: boolean; - /** - * When using time-expiring entries with `ttl`, setting this to `true` will - * make each item's age reset to 0 whenever it is retrieved from cache with - * {@link LRUCache#get}, causing it to not expire. (It can still fall out - * of cache based on recency of use, of course.) - * - * Has no effect if {@link OptionsBase.ttl} is not set. - * - * This may be overridden by passing an options object to `cache.get()`. - */ - updateAgeOnGet?: boolean; - /** - * When using time-expiring entries with `ttl`, setting this to `true` will - * make each item's age reset to 0 whenever its presence in the cache is - * checked with {@link LRUCache#has}, causing it to not expire. (It can - * still fall out of cache based on recency of use, of course.) - * - * Has no effect if {@link OptionsBase.ttl} is not set. - */ - updateAgeOnHas?: boolean; - /** - * Allow {@link LRUCache#get} and {@link LRUCache#fetch} calls to return - * stale data, if available. - * - * By default, if you set `ttl`, stale items will only be deleted from the - * cache when you `get(key)`. That is, it's not preemptively pruning items, - * unless {@link OptionsBase.ttlAutopurge} is set. - * - * If you set `allowStale:true`, it'll return the stale value *as well as* - * deleting it. If you don't set this, then it'll return `undefined` when - * you try to get a stale entry. - * - * Note that when a stale entry is fetched, _even if it is returned due to - * `allowStale` being set_, it is removed from the cache immediately. You - * can suppress this behavior by setting - * {@link OptionsBase.noDeleteOnStaleGet}, either in the constructor, or in - * the options provided to {@link LRUCache#get}. - * - * This may be overridden by passing an options object to `cache.get()`. - * The `cache.has()` method will always return `false` for stale items. - * - * Only relevant if a ttl is set. - */ - allowStale?: boolean; - /** - * Function that is called on items when they are dropped from the - * cache, as `dispose(value, key, reason)`. - * - * This can be handy if you want to close file descriptors or do - * other cleanup tasks when items are no longer stored in the cache. - * - * **NOTE**: It is called _before_ the item has been fully removed - * from the cache, so if you want to put it right back in, you need - * to wait until the next tick. If you try to add it back in during - * the `dispose()` function call, it will break things in subtle and - * weird ways. - * - * Unlike several other options, this may _not_ be overridden by - * passing an option to `set()`, for performance reasons. - * - * The `reason` will be one of the following strings, corresponding - * to the reason for the item's deletion: - * - * - `evict` Item was evicted to make space for a new addition - * - `set` Item was overwritten by a new value - * - `expire` Item expired its TTL - * - `fetch` Item was deleted due to a failed or aborted fetch, or a - * fetchMethod returning `undefined. - * - `delete` Item was removed by explicit `cache.delete(key)`, - * `cache.clear()`, or `cache.set(key, undefined)`. - */ - dispose?: Disposer; - /** - * The same as {@link OptionsBase.dispose}, but called *after* the entry - * is completely removed and the cache is once again in a clean state. - * - * It is safe to add an item right back into the cache at this point. - * However, note that it is *very* easy to inadvertently create infinite - * recursion this way. - */ - disposeAfter?: Disposer; - /** - * Set to true to suppress calling the - * {@link OptionsBase.dispose} function if the entry key is - * still accessible within the cache. - * - * This may be overridden by passing an options object to - * {@link LRUCache#set}. - * - * Only relevant if `dispose` or `disposeAfter` are set. - */ - noDisposeOnSet?: boolean; - /** - * Boolean flag to tell the cache to not update the TTL when setting a new - * value for an existing key (ie, when updating a value rather than - * inserting a new value). Note that the TTL value is _always_ set (if - * provided) when adding a new entry into the cache. - * - * Has no effect if a {@link OptionsBase.ttl} is not set. - * - * May be passed as an option to {@link LRUCache#set}. - */ - noUpdateTTL?: boolean; - /** - * Set to a positive integer to track the sizes of items added to the - * cache, and automatically evict items in order to stay below this size. - * Note that this may result in fewer than `max` items being stored. - * - * Attempting to add an item to the cache whose calculated size is greater - * that this amount will be a no-op. The item will not be cached, and no - * other items will be evicted. - * - * Optional, must be a positive integer if provided. - * - * Sets `maxEntrySize` to the same value, unless a different value is - * provided for `maxEntrySize`. - * - * At least one of `max`, `maxSize`, or `TTL` is required. This must be a - * positive integer if set. - * - * Even if size tracking is enabled, **it is strongly recommended to set a - * `max` to prevent unbounded growth of the cache.** - * - * Note also that size tracking can negatively impact performance, - * though for most cases, only minimally. - */ - maxSize?: Size; - /** - * The maximum allowed size for any single item in the cache. - * - * If a larger item is passed to {@link LRUCache#set} or returned by a - * {@link OptionsBase.fetchMethod} or {@link OptionsBase.memoMethod}, then - * it will not be stored in the cache. - * - * Attempting to add an item whose calculated size is greater than - * this amount will not cache the item or evict any old items, but - * WILL delete an existing value if one is already present. - * - * Optional, must be a positive integer if provided. Defaults to - * the value of `maxSize` if provided. - */ - maxEntrySize?: Size; - /** - * A function that returns a number indicating the item's size. - * - * Requires {@link OptionsBase.maxSize} to be set. - * - * If not provided, and {@link OptionsBase.maxSize} or - * {@link OptionsBase.maxEntrySize} are set, then all - * {@link LRUCache#set} calls **must** provide an explicit - * {@link SetOptions.size} or sizeCalculation param. - */ - sizeCalculation?: SizeCalculator; - /** - * Method that provides the implementation for {@link LRUCache#fetch} - * - * ```ts - * fetchMethod(key, staleValue, { signal, options, context }) - * ``` - * - * If `fetchMethod` is not provided, then `cache.fetch(key)` is equivalent - * to `Promise.resolve(cache.get(key))`. - * - * If at any time, `signal.aborted` is set to `true`, or if the - * `signal.onabort` method is called, or if it emits an `'abort'` event - * which you can listen to with `addEventListener`, then that means that - * the fetch should be abandoned. This may be passed along to async - * functions aware of AbortController/AbortSignal behavior. - * - * The `fetchMethod` should **only** return `undefined` or a Promise - * resolving to `undefined` if the AbortController signaled an `abort` - * event. In all other cases, it should return or resolve to a value - * suitable for adding to the cache. - * - * The `options` object is a union of the options that may be provided to - * `set()` and `get()`. If they are modified, then that will result in - * modifying the settings to `cache.set()` when the value is resolved, and - * in the case of - * {@link OptionsBase.noDeleteOnFetchRejection} and - * {@link OptionsBase.allowStaleOnFetchRejection}, the handling of - * `fetchMethod` failures. - * - * For example, a DNS cache may update the TTL based on the value returned - * from a remote DNS server by changing `options.ttl` in the `fetchMethod`. - */ - fetchMethod?: Fetcher; - /** - * Method that provides the implementation for {@link LRUCache#memo} - */ - memoMethod?: Memoizer; - /** - * Set to true to suppress the deletion of stale data when a - * {@link OptionsBase.fetchMethod} returns a rejected promise. - */ - noDeleteOnFetchRejection?: boolean; - /** - * Do not delete stale items when they are retrieved with - * {@link LRUCache#get}. - * - * Note that the `get` return value will still be `undefined` - * unless {@link OptionsBase.allowStale} is true. - * - * When using time-expiring entries with `ttl`, by default stale - * items will be removed from the cache when the key is accessed - * with `cache.get()`. - * - * Setting this option will cause stale items to remain in the cache, until - * they are explicitly deleted with `cache.delete(key)`, or retrieved with - * `noDeleteOnStaleGet` set to `false`. - * - * This may be overridden by passing an options object to `cache.get()`. - * - * Only relevant if a ttl is used. - */ - noDeleteOnStaleGet?: boolean; - /** - * Set to true to allow returning stale data when a - * {@link OptionsBase.fetchMethod} throws an error or returns a rejected - * promise. - * - * This differs from using {@link OptionsBase.allowStale} in that stale - * data will ONLY be returned in the case that the {@link LRUCache#fetch} - * fails, not any other times. - * - * If a `fetchMethod` fails, and there is no stale value available, the - * `fetch()` will resolve to `undefined`. Ie, all `fetchMethod` errors are - * suppressed. - * - * Implies `noDeleteOnFetchRejection`. - * - * This may be set in calls to `fetch()`, or defaulted on the constructor, - * or overridden by modifying the options object in the `fetchMethod`. - */ - allowStaleOnFetchRejection?: boolean; - /** - * Set to true to return a stale value from the cache when the - * `AbortSignal` passed to the {@link OptionsBase.fetchMethod} dispatches - * an `'abort'` event, whether user-triggered, or due to internal cache - * behavior. - * - * Unless {@link OptionsBase.ignoreFetchAbort} is also set, the underlying - * {@link OptionsBase.fetchMethod} will still be considered canceled, and - * any value it returns will be ignored and not cached. - * - * Caveat: since fetches are aborted when a new value is explicitly - * set in the cache, this can lead to fetch returning a stale value, - * since that was the fallback value _at the moment the `fetch()` was - * initiated_, even though the new updated value is now present in - * the cache. - * - * For example: - * - * ```ts - * const cache = new LRUCache({ - * ttl: 100, - * fetchMethod: async (url, oldValue, { signal }) => { - * const res = await fetch(url, { signal }) - * return await res.json() - * } - * }) - * cache.set('https://example.com/', { some: 'data' }) - * // 100ms go by... - * const result = cache.fetch('https://example.com/') - * cache.set('https://example.com/', { other: 'thing' }) - * console.log(await result) // { some: 'data' } - * console.log(cache.get('https://example.com/')) // { other: 'thing' } - * ``` - */ - allowStaleOnFetchAbort?: boolean; - /** - * Set to true to ignore the `abort` event emitted by the `AbortSignal` - * object passed to {@link OptionsBase.fetchMethod}, and still cache the - * resulting resolution value, as long as it is not `undefined`. - * - * When used on its own, this means aborted {@link LRUCache#fetch} calls - * are not immediately resolved or rejected when they are aborted, and - * instead take the full time to await. - * - * When used with {@link OptionsBase.allowStaleOnFetchAbort}, aborted - * {@link LRUCache#fetch} calls will resolve immediately to their stale - * cached value or `undefined`, and will continue to process and eventually - * update the cache when they resolve, as long as the resulting value is - * not `undefined`, thus supporting a "return stale on timeout while - * refreshing" mechanism by passing `AbortSignal.timeout(n)` as the signal. - * - * For example: - * - * ```ts - * const c = new LRUCache({ - * ttl: 100, - * ignoreFetchAbort: true, - * allowStaleOnFetchAbort: true, - * fetchMethod: async (key, oldValue, { signal }) => { - * // note: do NOT pass the signal to fetch()! - * // let's say this fetch can take a long time. - * const res = await fetch(`https://slow-backend-server/${key}`) - * return await res.json() - * }, - * }) - * - * // this will return the stale value after 100ms, while still - * // updating in the background for next time. - * const val = await c.fetch('key', { signal: AbortSignal.timeout(100) }) - * ``` - * - * **Note**: regardless of this setting, an `abort` event _is still - * emitted on the `AbortSignal` object_, so may result in invalid results - * when passed to other underlying APIs that use AbortSignals. - * - * This may be overridden in the {@link OptionsBase.fetchMethod} or the - * call to {@link LRUCache#fetch}. - */ - ignoreFetchAbort?: boolean; - } - interface OptionsMaxLimit extends OptionsBase { - max: Count; - } - interface OptionsTTLLimit extends OptionsBase { - ttl: Milliseconds; - ttlAutopurge: boolean; - } - interface OptionsSizeLimit extends OptionsBase { - maxSize: Size; - } - /** - * The valid safe options for the {@link LRUCache} constructor - */ - type Options = OptionsMaxLimit | OptionsSizeLimit | OptionsTTLLimit; - /** - * Entry objects used by {@link LRUCache#load} and {@link LRUCache#dump}, - * and returned by {@link LRUCache#info}. - */ - interface Entry { - value: V; - ttl?: Milliseconds; - size?: Size; - start?: Milliseconds; - } -} -/** - * Default export, the thing you're using this module to get. - * - * The `K` and `V` types define the key and value types, respectively. The - * optional `FC` type defines the type of the `context` object passed to - * `cache.fetch()` and `cache.memo()`. - * - * Keys and values **must not** be `null` or `undefined`. - * - * All properties from the options object (with the exception of `max`, - * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are - * added as normal public members. (The listed options are read-only getters.) - * - * Changing any of these will alter the defaults for subsequent method calls. - */ -export declare class LRUCache implements Map { - #private; - /** - * {@link LRUCache.OptionsBase.ttl} - */ - ttl: LRUCache.Milliseconds; - /** - * {@link LRUCache.OptionsBase.ttlResolution} - */ - ttlResolution: LRUCache.Milliseconds; - /** - * {@link LRUCache.OptionsBase.ttlAutopurge} - */ - ttlAutopurge: boolean; - /** - * {@link LRUCache.OptionsBase.updateAgeOnGet} - */ - updateAgeOnGet: boolean; - /** - * {@link LRUCache.OptionsBase.updateAgeOnHas} - */ - updateAgeOnHas: boolean; - /** - * {@link LRUCache.OptionsBase.allowStale} - */ - allowStale: boolean; - /** - * {@link LRUCache.OptionsBase.noDisposeOnSet} - */ - noDisposeOnSet: boolean; - /** - * {@link LRUCache.OptionsBase.noUpdateTTL} - */ - noUpdateTTL: boolean; - /** - * {@link LRUCache.OptionsBase.maxEntrySize} - */ - maxEntrySize: LRUCache.Size; - /** - * {@link LRUCache.OptionsBase.sizeCalculation} - */ - sizeCalculation?: LRUCache.SizeCalculator; - /** - * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection} - */ - noDeleteOnFetchRejection: boolean; - /** - * {@link LRUCache.OptionsBase.noDeleteOnStaleGet} - */ - noDeleteOnStaleGet: boolean; - /** - * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort} - */ - allowStaleOnFetchAbort: boolean; - /** - * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} - */ - allowStaleOnFetchRejection: boolean; - /** - * {@link LRUCache.OptionsBase.ignoreFetchAbort} - */ - ignoreFetchAbort: boolean; - /** - * Do not call this method unless you need to inspect the - * inner workings of the cache. If anything returned by this - * object is modified in any way, strange breakage may occur. - * - * These fields are private for a reason! - * - * @internal - */ - static unsafeExposeInternals(c: LRUCache): { - starts: ZeroArray | undefined; - ttls: ZeroArray | undefined; - sizes: ZeroArray | undefined; - keyMap: Map; - keyList: (K | undefined)[]; - valList: (V | BackgroundFetch | undefined)[]; - next: NumberArray; - prev: NumberArray; - readonly head: Index; - readonly tail: Index; - free: StackLike; - isBackgroundFetch: (p: any) => boolean; - backgroundFetch: (k: K, index: number | undefined, options: LRUCache.FetchOptions, context: any) => BackgroundFetch; - moveToTail: (index: number) => void; - indexes: (options?: { - allowStale: boolean; - }) => Generator; - rindexes: (options?: { - allowStale: boolean; - }) => Generator; - isStale: (index: number | undefined) => boolean; - }; - /** - * {@link LRUCache.OptionsBase.max} (read-only) - */ - get max(): LRUCache.Count; - /** - * {@link LRUCache.OptionsBase.maxSize} (read-only) - */ - get maxSize(): LRUCache.Count; - /** - * The total computed size of items in the cache (read-only) - */ - get calculatedSize(): LRUCache.Size; - /** - * The number of items stored in the cache (read-only) - */ - get size(): LRUCache.Count; - /** - * {@link LRUCache.OptionsBase.fetchMethod} (read-only) - */ - get fetchMethod(): LRUCache.Fetcher | undefined; - get memoMethod(): LRUCache.Memoizer | undefined; - /** - * {@link LRUCache.OptionsBase.dispose} (read-only) - */ - get dispose(): LRUCache.Disposer | undefined; - /** - * {@link LRUCache.OptionsBase.disposeAfter} (read-only) - */ - get disposeAfter(): LRUCache.Disposer | undefined; - constructor(options: LRUCache.Options | LRUCache); - /** - * Return the number of ms left in the item's TTL. If item is not in cache, - * returns `0`. Returns `Infinity` if item is in cache without a defined TTL. - */ - getRemainingTTL(key: K): number; - /** - * Return a generator yielding `[key, value]` pairs, - * in order from most recently used to least recently used. - */ - entries(): Generator<[K, V], void, unknown>; - /** - * Inverse order version of {@link LRUCache.entries} - * - * Return a generator yielding `[key, value]` pairs, - * in order from least recently used to most recently used. - */ - rentries(): Generator<(K | V | BackgroundFetch | undefined)[], void, unknown>; - /** - * Return a generator yielding the keys in the cache, - * in order from most recently used to least recently used. - */ - keys(): Generator; - /** - * Inverse order version of {@link LRUCache.keys} - * - * Return a generator yielding the keys in the cache, - * in order from least recently used to most recently used. - */ - rkeys(): Generator; - /** - * Return a generator yielding the values in the cache, - * in order from most recently used to least recently used. - */ - values(): Generator; - /** - * Inverse order version of {@link LRUCache.values} - * - * Return a generator yielding the values in the cache, - * in order from least recently used to most recently used. - */ - rvalues(): Generator | undefined, void, unknown>; - /** - * Iterating over the cache itself yields the same results as - * {@link LRUCache.entries} - */ - [Symbol.iterator](): Generator<[K, V], void, unknown>; - /** - * A String value that is used in the creation of the default string - * description of an object. Called by the built-in method - * `Object.prototype.toString`. - */ - [Symbol.toStringTag]: string; - /** - * Find a value for which the supplied fn method returns a truthy value, - * similar to `Array.find()`. fn is called as `fn(value, key, cache)`. - */ - find(fn: (v: V, k: K, self: LRUCache) => boolean, getOptions?: LRUCache.GetOptions): V | undefined; - /** - * Call the supplied function on each item in the cache, in order from most - * recently used to least recently used. - * - * `fn` is called as `fn(value, key, cache)`. - * - * If `thisp` is provided, function will be called in the `this`-context of - * the provided object, or the cache if no `thisp` object is provided. - * - * Does not update age or recenty of use, or iterate over stale values. - */ - forEach(fn: (v: V, k: K, self: LRUCache) => any, thisp?: any): void; - /** - * The same as {@link LRUCache.forEach} but items are iterated over in - * reverse order. (ie, less recently used items are iterated over first.) - */ - rforEach(fn: (v: V, k: K, self: LRUCache) => any, thisp?: any): void; - /** - * Delete any stale entries. Returns true if anything was removed, - * false otherwise. - */ - purgeStale(): boolean; - /** - * Get the extended info about a given entry, to get its value, size, and - * TTL info simultaneously. Returns `undefined` if the key is not present. - * - * Unlike {@link LRUCache#dump}, which is designed to be portable and survive - * serialization, the `start` value is always the current timestamp, and the - * `ttl` is a calculated remaining time to live (negative if expired). - * - * Always returns stale values, if their info is found in the cache, so be - * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl}) - * if relevant. - */ - info(key: K): LRUCache.Entry | undefined; - /** - * Return an array of [key, {@link LRUCache.Entry}] tuples which can be - * passed to {@link LRLUCache#load}. - * - * The `start` fields are calculated relative to a portable `Date.now()` - * timestamp, even if `performance.now()` is available. - * - * Stale entries are always included in the `dump`, even if - * {@link LRUCache.OptionsBase.allowStale} is false. - * - * Note: this returns an actual array, not a generator, so it can be more - * easily passed around. - */ - dump(): [K, LRUCache.Entry][]; - /** - * Reset the cache and load in the items in entries in the order listed. - * - * The shape of the resulting cache may be different if the same options are - * not used in both caches. - * - * The `start` fields are assumed to be calculated relative to a portable - * `Date.now()` timestamp, even if `performance.now()` is available. - */ - load(arr: [K, LRUCache.Entry][]): void; - /** - * Add a value to the cache. - * - * Note: if `undefined` is specified as a value, this is an alias for - * {@link LRUCache#delete} - * - * Fields on the {@link LRUCache.SetOptions} options param will override - * their corresponding values in the constructor options for the scope - * of this single `set()` operation. - * - * If `start` is provided, then that will set the effective start - * time for the TTL calculation. Note that this must be a previous - * value of `performance.now()` if supported, or a previous value of - * `Date.now()` if not. - * - * Options object may also include `size`, which will prevent - * calling the `sizeCalculation` function and just use the specified - * number if it is a positive integer, and `noDisposeOnSet` which - * will prevent calling a `dispose` function in the case of - * overwrites. - * - * If the `size` (or return value of `sizeCalculation`) for a given - * entry is greater than `maxEntrySize`, then the item will not be - * added to the cache. - * - * Will update the recency of the entry. - * - * If the value is `undefined`, then this is an alias for - * `cache.delete(key)`. `undefined` is never stored in the cache. - */ - set(k: K, v: V | BackgroundFetch | undefined, setOptions?: LRUCache.SetOptions): this; - /** - * Evict the least recently used item, returning its value or - * `undefined` if cache is empty. - */ - pop(): V | undefined; - /** - * Check if a key is in the cache, without updating the recency of use. - * Will return false if the item is stale, even though it is technically - * in the cache. - * - * Check if a key is in the cache, without updating the recency of - * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set - * to `true` in either the options or the constructor. - * - * Will return `false` if the item is stale, even though it is technically in - * the cache. The difference can be determined (if it matters) by using a - * `status` argument, and inspecting the `has` field. - * - * Will not update item age unless - * {@link LRUCache.OptionsBase.updateAgeOnHas} is set. - */ - has(k: K, hasOptions?: LRUCache.HasOptions): boolean; - /** - * Like {@link LRUCache#get} but doesn't update recency or delete stale - * items. - * - * Returns `undefined` if the item is stale, unless - * {@link LRUCache.OptionsBase.allowStale} is set. - */ - peek(k: K, peekOptions?: LRUCache.PeekOptions): V | undefined; - /** - * Make an asynchronous cached fetch using the - * {@link LRUCache.OptionsBase.fetchMethod} function. - * - * If the value is in the cache and not stale, then the returned - * Promise resolves to the value. - * - * If not in the cache, or beyond its TTL staleness, then - * `fetchMethod(key, staleValue, { options, signal, context })` is - * called, and the value returned will be added to the cache once - * resolved. - * - * If called with `allowStale`, and an asynchronous fetch is - * currently in progress to reload a stale value, then the former - * stale value will be returned. - * - * If called with `forceRefresh`, then the cached item will be - * re-fetched, even if it is not stale. However, if `allowStale` is also - * set, then the old value will still be returned. This is useful - * in cases where you want to force a reload of a cached value. If - * a background fetch is already in progress, then `forceRefresh` - * has no effect. - * - * If multiple fetches for the same key are issued, then they will all be - * coalesced into a single call to fetchMethod. - * - * Note that this means that handling options such as - * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}, - * {@link LRUCache.FetchOptions.signal}, - * and {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} will be - * determined by the FIRST fetch() call for a given key. - * - * This is a known (fixable) shortcoming which will be addresed on when - * someone complains about it, as the fix would involve added complexity and - * may not be worth the costs for this edge case. - * - * If {@link LRUCache.OptionsBase.fetchMethod} is not specified, then this is - * effectively an alias for `Promise.resolve(cache.get(key))`. - * - * When the fetch method resolves to a value, if the fetch has not - * been aborted due to deletion, eviction, or being overwritten, - * then it is added to the cache using the options provided. - * - * If the key is evicted or deleted before the `fetchMethod` - * resolves, then the AbortSignal passed to the `fetchMethod` will - * receive an `abort` event, and the promise returned by `fetch()` - * will reject with the reason for the abort. - * - * If a `signal` is passed to the `fetch()` call, then aborting the - * signal will abort the fetch and cause the `fetch()` promise to - * reject with the reason provided. - * - * **Setting `context`** - * - * If an `FC` type is set to a type other than `unknown`, `void`, or - * `undefined` in the {@link LRUCache} constructor, then all - * calls to `cache.fetch()` _must_ provide a `context` option. If - * set to `undefined` or `void`, then calls to fetch _must not_ - * provide a `context` option. - * - * The `context` param allows you to provide arbitrary data that - * might be relevant in the course of fetching the data. It is only - * relevant for the course of a single `fetch()` operation, and - * discarded afterwards. - * - * **Note: `fetch()` calls are inflight-unique** - * - * If you call `fetch()` multiple times with the same key value, - * then every call after the first will resolve on the same - * promise1, - * _even if they have different settings that would otherwise change - * the behavior of the fetch_, such as `noDeleteOnFetchRejection` - * or `ignoreFetchAbort`. - * - * In most cases, this is not a problem (in fact, only fetching - * something once is what you probably want, if you're caching in - * the first place). If you are changing the fetch() options - * dramatically between runs, there's a good chance that you might - * be trying to fit divergent semantics into a single object, and - * would be better off with multiple cache instances. - * - * **1**: Ie, they're not the "same Promise", but they resolve at - * the same time, because they're both waiting on the same - * underlying fetchMethod response. - */ - fetch(k: K, fetchOptions: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : LRUCache.FetchOptionsWithContext): Promise; - fetch(k: unknown extends FC ? K : FC extends undefined | void ? K : never, fetchOptions?: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : never): Promise; - /** - * In some cases, `cache.fetch()` may resolve to `undefined`, either because - * a {@link LRUCache.OptionsBase#fetchMethod} was not provided (turning - * `cache.fetch(k)` into just an async wrapper around `cache.get(k)`) or - * because `ignoreFetchAbort` was specified (either to the constructor or - * in the {@link LRUCache.FetchOptions}). Also, the - * {@link OptionsBase.fetchMethod} may return `undefined` or `void`, making - * the test even more complicated. - * - * Because inferring the cases where `undefined` might be returned are so - * cumbersome, but testing for `undefined` can also be annoying, this method - * can be used, which will reject if `this.fetch()` resolves to undefined. - */ - forceFetch(k: K, fetchOptions: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : LRUCache.FetchOptionsWithContext): Promise; - forceFetch(k: unknown extends FC ? K : FC extends undefined | void ? K : never, fetchOptions?: unknown extends FC ? LRUCache.FetchOptions : FC extends undefined | void ? LRUCache.FetchOptionsNoContext : never): Promise; - /** - * If the key is found in the cache, then this is equivalent to - * {@link LRUCache#get}. If not, in the cache, then calculate the value using - * the {@link LRUCache.OptionsBase.memoMethod}, and add it to the cache. - * - * If an `FC` type is set to a type other than `unknown`, `void`, or - * `undefined` in the LRUCache constructor, then all calls to `cache.memo()` - * _must_ provide a `context` option. If set to `undefined` or `void`, then - * calls to memo _must not_ provide a `context` option. - * - * The `context` param allows you to provide arbitrary data that might be - * relevant in the course of fetching the data. It is only relevant for the - * course of a single `memo()` operation, and discarded afterwards. - */ - memo(k: K, memoOptions: unknown extends FC ? LRUCache.MemoOptions : FC extends undefined | void ? LRUCache.MemoOptionsNoContext : LRUCache.MemoOptionsWithContext): V; - memo(k: unknown extends FC ? K : FC extends undefined | void ? K : never, memoOptions?: unknown extends FC ? LRUCache.MemoOptions : FC extends undefined | void ? LRUCache.MemoOptionsNoContext : never): V; - /** - * Return a value from the cache. Will update the recency of the cache - * entry found. - * - * If the key is not found, get() will return `undefined`. - */ - get(k: K, getOptions?: LRUCache.GetOptions): V | undefined; - /** - * Deletes a key out of the cache. - * - * Returns true if the key was deleted, false otherwise. - */ - delete(k: K): boolean; - /** - * Clear the cache entirely, throwing away all values. - */ - clear(): void; -} -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/index.d.ts.map b/node_modules/lru-cache/dist/esm/index.d.ts.map deleted file mode 100644 index 34d60c5..0000000 --- a/node_modules/lru-cache/dist/esm/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/index.js b/node_modules/lru-cache/dist/esm/index.js deleted file mode 100644 index 555654a..0000000 --- a/node_modules/lru-cache/dist/esm/index.js +++ /dev/null @@ -1,1542 +0,0 @@ -/** - * @module LRUCache - */ -const perf = typeof performance === 'object' && - performance && - typeof performance.now === 'function' - ? performance - : Date; -const warned = new Set(); -/* c8 ignore start */ -const PROCESS = (typeof process === 'object' && !!process ? process : {}); -/* c8 ignore start */ -const emitWarning = (msg, type, code, fn) => { - typeof PROCESS.emitWarning === 'function' - ? PROCESS.emitWarning(msg, type, code, fn) - : console.error(`[${code}] ${type}: ${msg}`); -}; -let AC = globalThis.AbortController; -let AS = globalThis.AbortSignal; -/* c8 ignore start */ -if (typeof AC === 'undefined') { - //@ts-ignore - AS = class AbortSignal { - onabort; - _onabort = []; - reason; - aborted = false; - addEventListener(_, fn) { - this._onabort.push(fn); - } - }; - //@ts-ignore - AC = class AbortController { - constructor() { - warnACPolyfill(); - } - signal = new AS(); - abort(reason) { - if (this.signal.aborted) - return; - //@ts-ignore - this.signal.reason = reason; - //@ts-ignore - this.signal.aborted = true; - //@ts-ignore - for (const fn of this.signal._onabort) { - fn(reason); - } - this.signal.onabort?.(reason); - } - }; - let printACPolyfillWarning = PROCESS.env?.LRU_CACHE_IGNORE_AC_WARNING !== '1'; - const warnACPolyfill = () => { - if (!printACPolyfillWarning) - return; - printACPolyfillWarning = false; - emitWarning('AbortController is not defined. If using lru-cache in ' + - 'node 14, load an AbortController polyfill from the ' + - '`node-abort-controller` package. A minimal polyfill is ' + - 'provided for use by LRUCache.fetch(), but it should not be ' + - 'relied upon in other contexts (eg, passing it to other APIs that ' + - 'use AbortController/AbortSignal might have undesirable effects). ' + - 'You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.', 'NO_ABORT_CONTROLLER', 'ENOTSUP', warnACPolyfill); - }; -} -/* c8 ignore stop */ -const shouldWarn = (code) => !warned.has(code); -const TYPE = Symbol('type'); -const isPosInt = (n) => n && n === Math.floor(n) && n > 0 && isFinite(n); -/* c8 ignore start */ -// This is a little bit ridiculous, tbh. -// The maximum array length is 2^32-1 or thereabouts on most JS impls. -// And well before that point, you're caching the entire world, I mean, -// that's ~32GB of just integers for the next/prev links, plus whatever -// else to hold that many keys and values. Just filling the memory with -// zeroes at init time is brutal when you get that big. -// But why not be complete? -// Maybe in the future, these limits will have expanded. -const getUintArray = (max) => !isPosInt(max) - ? null - : max <= Math.pow(2, 8) - ? Uint8Array - : max <= Math.pow(2, 16) - ? Uint16Array - : max <= Math.pow(2, 32) - ? Uint32Array - : max <= Number.MAX_SAFE_INTEGER - ? ZeroArray - : null; -/* c8 ignore stop */ -class ZeroArray extends Array { - constructor(size) { - super(size); - this.fill(0); - } -} -class Stack { - heap; - length; - // private constructor - static #constructing = false; - static create(max) { - const HeapCls = getUintArray(max); - if (!HeapCls) - return []; - Stack.#constructing = true; - const s = new Stack(max, HeapCls); - Stack.#constructing = false; - return s; - } - constructor(max, HeapCls) { - /* c8 ignore start */ - if (!Stack.#constructing) { - throw new TypeError('instantiate Stack using Stack.create(n)'); - } - /* c8 ignore stop */ - this.heap = new HeapCls(max); - this.length = 0; - } - push(n) { - this.heap[this.length++] = n; - } - pop() { - return this.heap[--this.length]; - } -} -/** - * Default export, the thing you're using this module to get. - * - * The `K` and `V` types define the key and value types, respectively. The - * optional `FC` type defines the type of the `context` object passed to - * `cache.fetch()` and `cache.memo()`. - * - * Keys and values **must not** be `null` or `undefined`. - * - * All properties from the options object (with the exception of `max`, - * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are - * added as normal public members. (The listed options are read-only getters.) - * - * Changing any of these will alter the defaults for subsequent method calls. - */ -export class LRUCache { - // options that cannot be changed without disaster - #max; - #maxSize; - #dispose; - #disposeAfter; - #fetchMethod; - #memoMethod; - /** - * {@link LRUCache.OptionsBase.ttl} - */ - ttl; - /** - * {@link LRUCache.OptionsBase.ttlResolution} - */ - ttlResolution; - /** - * {@link LRUCache.OptionsBase.ttlAutopurge} - */ - ttlAutopurge; - /** - * {@link LRUCache.OptionsBase.updateAgeOnGet} - */ - updateAgeOnGet; - /** - * {@link LRUCache.OptionsBase.updateAgeOnHas} - */ - updateAgeOnHas; - /** - * {@link LRUCache.OptionsBase.allowStale} - */ - allowStale; - /** - * {@link LRUCache.OptionsBase.noDisposeOnSet} - */ - noDisposeOnSet; - /** - * {@link LRUCache.OptionsBase.noUpdateTTL} - */ - noUpdateTTL; - /** - * {@link LRUCache.OptionsBase.maxEntrySize} - */ - maxEntrySize; - /** - * {@link LRUCache.OptionsBase.sizeCalculation} - */ - sizeCalculation; - /** - * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection} - */ - noDeleteOnFetchRejection; - /** - * {@link LRUCache.OptionsBase.noDeleteOnStaleGet} - */ - noDeleteOnStaleGet; - /** - * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort} - */ - allowStaleOnFetchAbort; - /** - * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} - */ - allowStaleOnFetchRejection; - /** - * {@link LRUCache.OptionsBase.ignoreFetchAbort} - */ - ignoreFetchAbort; - // computed properties - #size; - #calculatedSize; - #keyMap; - #keyList; - #valList; - #next; - #prev; - #head; - #tail; - #free; - #disposed; - #sizes; - #starts; - #ttls; - #hasDispose; - #hasFetchMethod; - #hasDisposeAfter; - /** - * Do not call this method unless you need to inspect the - * inner workings of the cache. If anything returned by this - * object is modified in any way, strange breakage may occur. - * - * These fields are private for a reason! - * - * @internal - */ - static unsafeExposeInternals(c) { - return { - // properties - starts: c.#starts, - ttls: c.#ttls, - sizes: c.#sizes, - keyMap: c.#keyMap, - keyList: c.#keyList, - valList: c.#valList, - next: c.#next, - prev: c.#prev, - get head() { - return c.#head; - }, - get tail() { - return c.#tail; - }, - free: c.#free, - // methods - isBackgroundFetch: (p) => c.#isBackgroundFetch(p), - backgroundFetch: (k, index, options, context) => c.#backgroundFetch(k, index, options, context), - moveToTail: (index) => c.#moveToTail(index), - indexes: (options) => c.#indexes(options), - rindexes: (options) => c.#rindexes(options), - isStale: (index) => c.#isStale(index), - }; - } - // Protected read-only members - /** - * {@link LRUCache.OptionsBase.max} (read-only) - */ - get max() { - return this.#max; - } - /** - * {@link LRUCache.OptionsBase.maxSize} (read-only) - */ - get maxSize() { - return this.#maxSize; - } - /** - * The total computed size of items in the cache (read-only) - */ - get calculatedSize() { - return this.#calculatedSize; - } - /** - * The number of items stored in the cache (read-only) - */ - get size() { - return this.#size; - } - /** - * {@link LRUCache.OptionsBase.fetchMethod} (read-only) - */ - get fetchMethod() { - return this.#fetchMethod; - } - get memoMethod() { - return this.#memoMethod; - } - /** - * {@link LRUCache.OptionsBase.dispose} (read-only) - */ - get dispose() { - return this.#dispose; - } - /** - * {@link LRUCache.OptionsBase.disposeAfter} (read-only) - */ - get disposeAfter() { - return this.#disposeAfter; - } - constructor(options) { - const { max = 0, ttl, ttlResolution = 1, ttlAutopurge, updateAgeOnGet, updateAgeOnHas, allowStale, dispose, disposeAfter, noDisposeOnSet, noUpdateTTL, maxSize = 0, maxEntrySize = 0, sizeCalculation, fetchMethod, memoMethod, noDeleteOnFetchRejection, noDeleteOnStaleGet, allowStaleOnFetchRejection, allowStaleOnFetchAbort, ignoreFetchAbort, } = options; - if (max !== 0 && !isPosInt(max)) { - throw new TypeError('max option must be a nonnegative integer'); - } - const UintArray = max ? getUintArray(max) : Array; - if (!UintArray) { - throw new Error('invalid max value: ' + max); - } - this.#max = max; - this.#maxSize = maxSize; - this.maxEntrySize = maxEntrySize || this.#maxSize; - this.sizeCalculation = sizeCalculation; - if (this.sizeCalculation) { - if (!this.#maxSize && !this.maxEntrySize) { - throw new TypeError('cannot set sizeCalculation without setting maxSize or maxEntrySize'); - } - if (typeof this.sizeCalculation !== 'function') { - throw new TypeError('sizeCalculation set to non-function'); - } - } - if (memoMethod !== undefined && - typeof memoMethod !== 'function') { - throw new TypeError('memoMethod must be a function if defined'); - } - this.#memoMethod = memoMethod; - if (fetchMethod !== undefined && - typeof fetchMethod !== 'function') { - throw new TypeError('fetchMethod must be a function if specified'); - } - this.#fetchMethod = fetchMethod; - this.#hasFetchMethod = !!fetchMethod; - this.#keyMap = new Map(); - this.#keyList = new Array(max).fill(undefined); - this.#valList = new Array(max).fill(undefined); - this.#next = new UintArray(max); - this.#prev = new UintArray(max); - this.#head = 0; - this.#tail = 0; - this.#free = Stack.create(max); - this.#size = 0; - this.#calculatedSize = 0; - if (typeof dispose === 'function') { - this.#dispose = dispose; - } - if (typeof disposeAfter === 'function') { - this.#disposeAfter = disposeAfter; - this.#disposed = []; - } - else { - this.#disposeAfter = undefined; - this.#disposed = undefined; - } - this.#hasDispose = !!this.#dispose; - this.#hasDisposeAfter = !!this.#disposeAfter; - this.noDisposeOnSet = !!noDisposeOnSet; - this.noUpdateTTL = !!noUpdateTTL; - this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection; - this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection; - this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort; - this.ignoreFetchAbort = !!ignoreFetchAbort; - // NB: maxEntrySize is set to maxSize if it's set - if (this.maxEntrySize !== 0) { - if (this.#maxSize !== 0) { - if (!isPosInt(this.#maxSize)) { - throw new TypeError('maxSize must be a positive integer if specified'); - } - } - if (!isPosInt(this.maxEntrySize)) { - throw new TypeError('maxEntrySize must be a positive integer if specified'); - } - this.#initializeSizeTracking(); - } - this.allowStale = !!allowStale; - this.noDeleteOnStaleGet = !!noDeleteOnStaleGet; - this.updateAgeOnGet = !!updateAgeOnGet; - this.updateAgeOnHas = !!updateAgeOnHas; - this.ttlResolution = - isPosInt(ttlResolution) || ttlResolution === 0 - ? ttlResolution - : 1; - this.ttlAutopurge = !!ttlAutopurge; - this.ttl = ttl || 0; - if (this.ttl) { - if (!isPosInt(this.ttl)) { - throw new TypeError('ttl must be a positive integer if specified'); - } - this.#initializeTTLTracking(); - } - // do not allow completely unbounded caches - if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) { - throw new TypeError('At least one of max, maxSize, or ttl is required'); - } - if (!this.ttlAutopurge && !this.#max && !this.#maxSize) { - const code = 'LRU_CACHE_UNBOUNDED'; - if (shouldWarn(code)) { - warned.add(code); - const msg = 'TTL caching without ttlAutopurge, max, or maxSize can ' + - 'result in unbounded memory consumption.'; - emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache); - } - } - } - /** - * Return the number of ms left in the item's TTL. If item is not in cache, - * returns `0`. Returns `Infinity` if item is in cache without a defined TTL. - */ - getRemainingTTL(key) { - return this.#keyMap.has(key) ? Infinity : 0; - } - #initializeTTLTracking() { - const ttls = new ZeroArray(this.#max); - const starts = new ZeroArray(this.#max); - this.#ttls = ttls; - this.#starts = starts; - this.#setItemTTL = (index, ttl, start = perf.now()) => { - starts[index] = ttl !== 0 ? start : 0; - ttls[index] = ttl; - if (ttl !== 0 && this.ttlAutopurge) { - const t = setTimeout(() => { - if (this.#isStale(index)) { - this.#delete(this.#keyList[index], 'expire'); - } - }, ttl + 1); - // unref() not supported on all platforms - /* c8 ignore start */ - if (t.unref) { - t.unref(); - } - /* c8 ignore stop */ - } - }; - this.#updateItemAge = index => { - starts[index] = ttls[index] !== 0 ? perf.now() : 0; - }; - this.#statusTTL = (status, index) => { - if (ttls[index]) { - const ttl = ttls[index]; - const start = starts[index]; - /* c8 ignore next */ - if (!ttl || !start) - return; - status.ttl = ttl; - status.start = start; - status.now = cachedNow || getNow(); - const age = status.now - start; - status.remainingTTL = ttl - age; - } - }; - // debounce calls to perf.now() to 1s so we're not hitting - // that costly call repeatedly. - let cachedNow = 0; - const getNow = () => { - const n = perf.now(); - if (this.ttlResolution > 0) { - cachedNow = n; - const t = setTimeout(() => (cachedNow = 0), this.ttlResolution); - // not available on all platforms - /* c8 ignore start */ - if (t.unref) { - t.unref(); - } - /* c8 ignore stop */ - } - return n; - }; - this.getRemainingTTL = key => { - const index = this.#keyMap.get(key); - if (index === undefined) { - return 0; - } - const ttl = ttls[index]; - const start = starts[index]; - if (!ttl || !start) { - return Infinity; - } - const age = (cachedNow || getNow()) - start; - return ttl - age; - }; - this.#isStale = index => { - const s = starts[index]; - const t = ttls[index]; - return !!t && !!s && (cachedNow || getNow()) - s > t; - }; - } - // conditionally set private methods related to TTL - #updateItemAge = () => { }; - #statusTTL = () => { }; - #setItemTTL = () => { }; - /* c8 ignore stop */ - #isStale = () => false; - #initializeSizeTracking() { - const sizes = new ZeroArray(this.#max); - this.#calculatedSize = 0; - this.#sizes = sizes; - this.#removeItemSize = index => { - this.#calculatedSize -= sizes[index]; - sizes[index] = 0; - }; - this.#requireSize = (k, v, size, sizeCalculation) => { - // provisionally accept background fetches. - // actual value size will be checked when they return. - if (this.#isBackgroundFetch(v)) { - return 0; - } - if (!isPosInt(size)) { - if (sizeCalculation) { - if (typeof sizeCalculation !== 'function') { - throw new TypeError('sizeCalculation must be a function'); - } - size = sizeCalculation(v, k); - if (!isPosInt(size)) { - throw new TypeError('sizeCalculation return invalid (expect positive integer)'); - } - } - else { - throw new TypeError('invalid size value (must be positive integer). ' + - 'When maxSize or maxEntrySize is used, sizeCalculation ' + - 'or size must be set.'); - } - } - return size; - }; - this.#addItemSize = (index, size, status) => { - sizes[index] = size; - if (this.#maxSize) { - const maxSize = this.#maxSize - sizes[index]; - while (this.#calculatedSize > maxSize) { - this.#evict(true); - } - } - this.#calculatedSize += sizes[index]; - if (status) { - status.entrySize = size; - status.totalCalculatedSize = this.#calculatedSize; - } - }; - } - #removeItemSize = _i => { }; - #addItemSize = (_i, _s, _st) => { }; - #requireSize = (_k, _v, size, sizeCalculation) => { - if (size || sizeCalculation) { - throw new TypeError('cannot set size without setting maxSize or maxEntrySize on cache'); - } - return 0; - }; - *#indexes({ allowStale = this.allowStale } = {}) { - if (this.#size) { - for (let i = this.#tail; true;) { - if (!this.#isValidIndex(i)) { - break; - } - if (allowStale || !this.#isStale(i)) { - yield i; - } - if (i === this.#head) { - break; - } - else { - i = this.#prev[i]; - } - } - } - } - *#rindexes({ allowStale = this.allowStale } = {}) { - if (this.#size) { - for (let i = this.#head; true;) { - if (!this.#isValidIndex(i)) { - break; - } - if (allowStale || !this.#isStale(i)) { - yield i; - } - if (i === this.#tail) { - break; - } - else { - i = this.#next[i]; - } - } - } - } - #isValidIndex(index) { - return (index !== undefined && - this.#keyMap.get(this.#keyList[index]) === index); - } - /** - * Return a generator yielding `[key, value]` pairs, - * in order from most recently used to least recently used. - */ - *entries() { - for (const i of this.#indexes()) { - if (this.#valList[i] !== undefined && - this.#keyList[i] !== undefined && - !this.#isBackgroundFetch(this.#valList[i])) { - yield [this.#keyList[i], this.#valList[i]]; - } - } - } - /** - * Inverse order version of {@link LRUCache.entries} - * - * Return a generator yielding `[key, value]` pairs, - * in order from least recently used to most recently used. - */ - *rentries() { - for (const i of this.#rindexes()) { - if (this.#valList[i] !== undefined && - this.#keyList[i] !== undefined && - !this.#isBackgroundFetch(this.#valList[i])) { - yield [this.#keyList[i], this.#valList[i]]; - } - } - } - /** - * Return a generator yielding the keys in the cache, - * in order from most recently used to least recently used. - */ - *keys() { - for (const i of this.#indexes()) { - const k = this.#keyList[i]; - if (k !== undefined && - !this.#isBackgroundFetch(this.#valList[i])) { - yield k; - } - } - } - /** - * Inverse order version of {@link LRUCache.keys} - * - * Return a generator yielding the keys in the cache, - * in order from least recently used to most recently used. - */ - *rkeys() { - for (const i of this.#rindexes()) { - const k = this.#keyList[i]; - if (k !== undefined && - !this.#isBackgroundFetch(this.#valList[i])) { - yield k; - } - } - } - /** - * Return a generator yielding the values in the cache, - * in order from most recently used to least recently used. - */ - *values() { - for (const i of this.#indexes()) { - const v = this.#valList[i]; - if (v !== undefined && - !this.#isBackgroundFetch(this.#valList[i])) { - yield this.#valList[i]; - } - } - } - /** - * Inverse order version of {@link LRUCache.values} - * - * Return a generator yielding the values in the cache, - * in order from least recently used to most recently used. - */ - *rvalues() { - for (const i of this.#rindexes()) { - const v = this.#valList[i]; - if (v !== undefined && - !this.#isBackgroundFetch(this.#valList[i])) { - yield this.#valList[i]; - } - } - } - /** - * Iterating over the cache itself yields the same results as - * {@link LRUCache.entries} - */ - [Symbol.iterator]() { - return this.entries(); - } - /** - * A String value that is used in the creation of the default string - * description of an object. Called by the built-in method - * `Object.prototype.toString`. - */ - [Symbol.toStringTag] = 'LRUCache'; - /** - * Find a value for which the supplied fn method returns a truthy value, - * similar to `Array.find()`. fn is called as `fn(value, key, cache)`. - */ - find(fn, getOptions = {}) { - for (const i of this.#indexes()) { - const v = this.#valList[i]; - const value = this.#isBackgroundFetch(v) - ? v.__staleWhileFetching - : v; - if (value === undefined) - continue; - if (fn(value, this.#keyList[i], this)) { - return this.get(this.#keyList[i], getOptions); - } - } - } - /** - * Call the supplied function on each item in the cache, in order from most - * recently used to least recently used. - * - * `fn` is called as `fn(value, key, cache)`. - * - * If `thisp` is provided, function will be called in the `this`-context of - * the provided object, or the cache if no `thisp` object is provided. - * - * Does not update age or recenty of use, or iterate over stale values. - */ - forEach(fn, thisp = this) { - for (const i of this.#indexes()) { - const v = this.#valList[i]; - const value = this.#isBackgroundFetch(v) - ? v.__staleWhileFetching - : v; - if (value === undefined) - continue; - fn.call(thisp, value, this.#keyList[i], this); - } - } - /** - * The same as {@link LRUCache.forEach} but items are iterated over in - * reverse order. (ie, less recently used items are iterated over first.) - */ - rforEach(fn, thisp = this) { - for (const i of this.#rindexes()) { - const v = this.#valList[i]; - const value = this.#isBackgroundFetch(v) - ? v.__staleWhileFetching - : v; - if (value === undefined) - continue; - fn.call(thisp, value, this.#keyList[i], this); - } - } - /** - * Delete any stale entries. Returns true if anything was removed, - * false otherwise. - */ - purgeStale() { - let deleted = false; - for (const i of this.#rindexes({ allowStale: true })) { - if (this.#isStale(i)) { - this.#delete(this.#keyList[i], 'expire'); - deleted = true; - } - } - return deleted; - } - /** - * Get the extended info about a given entry, to get its value, size, and - * TTL info simultaneously. Returns `undefined` if the key is not present. - * - * Unlike {@link LRUCache#dump}, which is designed to be portable and survive - * serialization, the `start` value is always the current timestamp, and the - * `ttl` is a calculated remaining time to live (negative if expired). - * - * Always returns stale values, if their info is found in the cache, so be - * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl}) - * if relevant. - */ - info(key) { - const i = this.#keyMap.get(key); - if (i === undefined) - return undefined; - const v = this.#valList[i]; - const value = this.#isBackgroundFetch(v) - ? v.__staleWhileFetching - : v; - if (value === undefined) - return undefined; - const entry = { value }; - if (this.#ttls && this.#starts) { - const ttl = this.#ttls[i]; - const start = this.#starts[i]; - if (ttl && start) { - const remain = ttl - (perf.now() - start); - entry.ttl = remain; - entry.start = Date.now(); - } - } - if (this.#sizes) { - entry.size = this.#sizes[i]; - } - return entry; - } - /** - * Return an array of [key, {@link LRUCache.Entry}] tuples which can be - * passed to {@link LRLUCache#load}. - * - * The `start` fields are calculated relative to a portable `Date.now()` - * timestamp, even if `performance.now()` is available. - * - * Stale entries are always included in the `dump`, even if - * {@link LRUCache.OptionsBase.allowStale} is false. - * - * Note: this returns an actual array, not a generator, so it can be more - * easily passed around. - */ - dump() { - const arr = []; - for (const i of this.#indexes({ allowStale: true })) { - const key = this.#keyList[i]; - const v = this.#valList[i]; - const value = this.#isBackgroundFetch(v) - ? v.__staleWhileFetching - : v; - if (value === undefined || key === undefined) - continue; - const entry = { value }; - if (this.#ttls && this.#starts) { - entry.ttl = this.#ttls[i]; - // always dump the start relative to a portable timestamp - // it's ok for this to be a bit slow, it's a rare operation. - const age = perf.now() - this.#starts[i]; - entry.start = Math.floor(Date.now() - age); - } - if (this.#sizes) { - entry.size = this.#sizes[i]; - } - arr.unshift([key, entry]); - } - return arr; - } - /** - * Reset the cache and load in the items in entries in the order listed. - * - * The shape of the resulting cache may be different if the same options are - * not used in both caches. - * - * The `start` fields are assumed to be calculated relative to a portable - * `Date.now()` timestamp, even if `performance.now()` is available. - */ - load(arr) { - this.clear(); - for (const [key, entry] of arr) { - if (entry.start) { - // entry.start is a portable timestamp, but we may be using - // node's performance.now(), so calculate the offset, so that - // we get the intended remaining TTL, no matter how long it's - // been on ice. - // - // it's ok for this to be a bit slow, it's a rare operation. - const age = Date.now() - entry.start; - entry.start = perf.now() - age; - } - this.set(key, entry.value, entry); - } - } - /** - * Add a value to the cache. - * - * Note: if `undefined` is specified as a value, this is an alias for - * {@link LRUCache#delete} - * - * Fields on the {@link LRUCache.SetOptions} options param will override - * their corresponding values in the constructor options for the scope - * of this single `set()` operation. - * - * If `start` is provided, then that will set the effective start - * time for the TTL calculation. Note that this must be a previous - * value of `performance.now()` if supported, or a previous value of - * `Date.now()` if not. - * - * Options object may also include `size`, which will prevent - * calling the `sizeCalculation` function and just use the specified - * number if it is a positive integer, and `noDisposeOnSet` which - * will prevent calling a `dispose` function in the case of - * overwrites. - * - * If the `size` (or return value of `sizeCalculation`) for a given - * entry is greater than `maxEntrySize`, then the item will not be - * added to the cache. - * - * Will update the recency of the entry. - * - * If the value is `undefined`, then this is an alias for - * `cache.delete(key)`. `undefined` is never stored in the cache. - */ - set(k, v, setOptions = {}) { - if (v === undefined) { - this.delete(k); - return this; - } - const { ttl = this.ttl, start, noDisposeOnSet = this.noDisposeOnSet, sizeCalculation = this.sizeCalculation, status, } = setOptions; - let { noUpdateTTL = this.noUpdateTTL } = setOptions; - const size = this.#requireSize(k, v, setOptions.size || 0, sizeCalculation); - // if the item doesn't fit, don't do anything - // NB: maxEntrySize set to maxSize by default - if (this.maxEntrySize && size > this.maxEntrySize) { - if (status) { - status.set = 'miss'; - status.maxEntrySizeExceeded = true; - } - // have to delete, in case something is there already. - this.#delete(k, 'set'); - return this; - } - let index = this.#size === 0 ? undefined : this.#keyMap.get(k); - if (index === undefined) { - // addition - index = (this.#size === 0 - ? this.#tail - : this.#free.length !== 0 - ? this.#free.pop() - : this.#size === this.#max - ? this.#evict(false) - : this.#size); - this.#keyList[index] = k; - this.#valList[index] = v; - this.#keyMap.set(k, index); - this.#next[this.#tail] = index; - this.#prev[index] = this.#tail; - this.#tail = index; - this.#size++; - this.#addItemSize(index, size, status); - if (status) - status.set = 'add'; - noUpdateTTL = false; - } - else { - // update - this.#moveToTail(index); - const oldVal = this.#valList[index]; - if (v !== oldVal) { - if (this.#hasFetchMethod && this.#isBackgroundFetch(oldVal)) { - oldVal.__abortController.abort(new Error('replaced')); - const { __staleWhileFetching: s } = oldVal; - if (s !== undefined && !noDisposeOnSet) { - if (this.#hasDispose) { - this.#dispose?.(s, k, 'set'); - } - if (this.#hasDisposeAfter) { - this.#disposed?.push([s, k, 'set']); - } - } - } - else if (!noDisposeOnSet) { - if (this.#hasDispose) { - this.#dispose?.(oldVal, k, 'set'); - } - if (this.#hasDisposeAfter) { - this.#disposed?.push([oldVal, k, 'set']); - } - } - this.#removeItemSize(index); - this.#addItemSize(index, size, status); - this.#valList[index] = v; - if (status) { - status.set = 'replace'; - const oldValue = oldVal && this.#isBackgroundFetch(oldVal) - ? oldVal.__staleWhileFetching - : oldVal; - if (oldValue !== undefined) - status.oldValue = oldValue; - } - } - else if (status) { - status.set = 'update'; - } - } - if (ttl !== 0 && !this.#ttls) { - this.#initializeTTLTracking(); - } - if (this.#ttls) { - if (!noUpdateTTL) { - this.#setItemTTL(index, ttl, start); - } - if (status) - this.#statusTTL(status, index); - } - if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) { - const dt = this.#disposed; - let task; - while ((task = dt?.shift())) { - this.#disposeAfter?.(...task); - } - } - return this; - } - /** - * Evict the least recently used item, returning its value or - * `undefined` if cache is empty. - */ - pop() { - try { - while (this.#size) { - const val = this.#valList[this.#head]; - this.#evict(true); - if (this.#isBackgroundFetch(val)) { - if (val.__staleWhileFetching) { - return val.__staleWhileFetching; - } - } - else if (val !== undefined) { - return val; - } - } - } - finally { - if (this.#hasDisposeAfter && this.#disposed) { - const dt = this.#disposed; - let task; - while ((task = dt?.shift())) { - this.#disposeAfter?.(...task); - } - } - } - } - #evict(free) { - const head = this.#head; - const k = this.#keyList[head]; - const v = this.#valList[head]; - if (this.#hasFetchMethod && this.#isBackgroundFetch(v)) { - v.__abortController.abort(new Error('evicted')); - } - else if (this.#hasDispose || this.#hasDisposeAfter) { - if (this.#hasDispose) { - this.#dispose?.(v, k, 'evict'); - } - if (this.#hasDisposeAfter) { - this.#disposed?.push([v, k, 'evict']); - } - } - this.#removeItemSize(head); - // if we aren't about to use the index, then null these out - if (free) { - this.#keyList[head] = undefined; - this.#valList[head] = undefined; - this.#free.push(head); - } - if (this.#size === 1) { - this.#head = this.#tail = 0; - this.#free.length = 0; - } - else { - this.#head = this.#next[head]; - } - this.#keyMap.delete(k); - this.#size--; - return head; - } - /** - * Check if a key is in the cache, without updating the recency of use. - * Will return false if the item is stale, even though it is technically - * in the cache. - * - * Check if a key is in the cache, without updating the recency of - * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set - * to `true` in either the options or the constructor. - * - * Will return `false` if the item is stale, even though it is technically in - * the cache. The difference can be determined (if it matters) by using a - * `status` argument, and inspecting the `has` field. - * - * Will not update item age unless - * {@link LRUCache.OptionsBase.updateAgeOnHas} is set. - */ - has(k, hasOptions = {}) { - const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions; - const index = this.#keyMap.get(k); - if (index !== undefined) { - const v = this.#valList[index]; - if (this.#isBackgroundFetch(v) && - v.__staleWhileFetching === undefined) { - return false; - } - if (!this.#isStale(index)) { - if (updateAgeOnHas) { - this.#updateItemAge(index); - } - if (status) { - status.has = 'hit'; - this.#statusTTL(status, index); - } - return true; - } - else if (status) { - status.has = 'stale'; - this.#statusTTL(status, index); - } - } - else if (status) { - status.has = 'miss'; - } - return false; - } - /** - * Like {@link LRUCache#get} but doesn't update recency or delete stale - * items. - * - * Returns `undefined` if the item is stale, unless - * {@link LRUCache.OptionsBase.allowStale} is set. - */ - peek(k, peekOptions = {}) { - const { allowStale = this.allowStale } = peekOptions; - const index = this.#keyMap.get(k); - if (index === undefined || - (!allowStale && this.#isStale(index))) { - return; - } - const v = this.#valList[index]; - // either stale and allowed, or forcing a refresh of non-stale value - return this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; - } - #backgroundFetch(k, index, options, context) { - const v = index === undefined ? undefined : this.#valList[index]; - if (this.#isBackgroundFetch(v)) { - return v; - } - const ac = new AC(); - const { signal } = options; - // when/if our AC signals, then stop listening to theirs. - signal?.addEventListener('abort', () => ac.abort(signal.reason), { - signal: ac.signal, - }); - const fetchOpts = { - signal: ac.signal, - options, - context, - }; - const cb = (v, updateCache = false) => { - const { aborted } = ac.signal; - const ignoreAbort = options.ignoreFetchAbort && v !== undefined; - if (options.status) { - if (aborted && !updateCache) { - options.status.fetchAborted = true; - options.status.fetchError = ac.signal.reason; - if (ignoreAbort) - options.status.fetchAbortIgnored = true; - } - else { - options.status.fetchResolved = true; - } - } - if (aborted && !ignoreAbort && !updateCache) { - return fetchFail(ac.signal.reason); - } - // either we didn't abort, and are still here, or we did, and ignored - const bf = p; - if (this.#valList[index] === p) { - if (v === undefined) { - if (bf.__staleWhileFetching) { - this.#valList[index] = bf.__staleWhileFetching; - } - else { - this.#delete(k, 'fetch'); - } - } - else { - if (options.status) - options.status.fetchUpdated = true; - this.set(k, v, fetchOpts.options); - } - } - return v; - }; - const eb = (er) => { - if (options.status) { - options.status.fetchRejected = true; - options.status.fetchError = er; - } - return fetchFail(er); - }; - const fetchFail = (er) => { - const { aborted } = ac.signal; - const allowStaleAborted = aborted && options.allowStaleOnFetchAbort; - const allowStale = allowStaleAborted || options.allowStaleOnFetchRejection; - const noDelete = allowStale || options.noDeleteOnFetchRejection; - const bf = p; - if (this.#valList[index] === p) { - // if we allow stale on fetch rejections, then we need to ensure that - // the stale value is not removed from the cache when the fetch fails. - const del = !noDelete || bf.__staleWhileFetching === undefined; - if (del) { - this.#delete(k, 'fetch'); - } - else if (!allowStaleAborted) { - // still replace the *promise* with the stale value, - // since we are done with the promise at this point. - // leave it untouched if we're still waiting for an - // aborted background fetch that hasn't yet returned. - this.#valList[index] = bf.__staleWhileFetching; - } - } - if (allowStale) { - if (options.status && bf.__staleWhileFetching !== undefined) { - options.status.returnedStale = true; - } - return bf.__staleWhileFetching; - } - else if (bf.__returned === bf) { - throw er; - } - }; - const pcall = (res, rej) => { - const fmp = this.#fetchMethod?.(k, v, fetchOpts); - if (fmp && fmp instanceof Promise) { - fmp.then(v => res(v === undefined ? undefined : v), rej); - } - // ignored, we go until we finish, regardless. - // defer check until we are actually aborting, - // so fetchMethod can override. - ac.signal.addEventListener('abort', () => { - if (!options.ignoreFetchAbort || - options.allowStaleOnFetchAbort) { - res(undefined); - // when it eventually resolves, update the cache. - if (options.allowStaleOnFetchAbort) { - res = v => cb(v, true); - } - } - }); - }; - if (options.status) - options.status.fetchDispatched = true; - const p = new Promise(pcall).then(cb, eb); - const bf = Object.assign(p, { - __abortController: ac, - __staleWhileFetching: v, - __returned: undefined, - }); - if (index === undefined) { - // internal, don't expose status. - this.set(k, bf, { ...fetchOpts.options, status: undefined }); - index = this.#keyMap.get(k); - } - else { - this.#valList[index] = bf; - } - return bf; - } - #isBackgroundFetch(p) { - if (!this.#hasFetchMethod) - return false; - const b = p; - return (!!b && - b instanceof Promise && - b.hasOwnProperty('__staleWhileFetching') && - b.__abortController instanceof AC); - } - async fetch(k, fetchOptions = {}) { - const { - // get options - allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, - // set options - ttl = this.ttl, noDisposeOnSet = this.noDisposeOnSet, size = 0, sizeCalculation = this.sizeCalculation, noUpdateTTL = this.noUpdateTTL, - // fetch exclusive options - noDeleteOnFetchRejection = this.noDeleteOnFetchRejection, allowStaleOnFetchRejection = this.allowStaleOnFetchRejection, ignoreFetchAbort = this.ignoreFetchAbort, allowStaleOnFetchAbort = this.allowStaleOnFetchAbort, context, forceRefresh = false, status, signal, } = fetchOptions; - if (!this.#hasFetchMethod) { - if (status) - status.fetch = 'get'; - return this.get(k, { - allowStale, - updateAgeOnGet, - noDeleteOnStaleGet, - status, - }); - } - const options = { - allowStale, - updateAgeOnGet, - noDeleteOnStaleGet, - ttl, - noDisposeOnSet, - size, - sizeCalculation, - noUpdateTTL, - noDeleteOnFetchRejection, - allowStaleOnFetchRejection, - allowStaleOnFetchAbort, - ignoreFetchAbort, - status, - signal, - }; - let index = this.#keyMap.get(k); - if (index === undefined) { - if (status) - status.fetch = 'miss'; - const p = this.#backgroundFetch(k, index, options, context); - return (p.__returned = p); - } - else { - // in cache, maybe already fetching - const v = this.#valList[index]; - if (this.#isBackgroundFetch(v)) { - const stale = allowStale && v.__staleWhileFetching !== undefined; - if (status) { - status.fetch = 'inflight'; - if (stale) - status.returnedStale = true; - } - return stale ? v.__staleWhileFetching : (v.__returned = v); - } - // if we force a refresh, that means do NOT serve the cached value, - // unless we are already in the process of refreshing the cache. - const isStale = this.#isStale(index); - if (!forceRefresh && !isStale) { - if (status) - status.fetch = 'hit'; - this.#moveToTail(index); - if (updateAgeOnGet) { - this.#updateItemAge(index); - } - if (status) - this.#statusTTL(status, index); - return v; - } - // ok, it is stale or a forced refresh, and not already fetching. - // refresh the cache. - const p = this.#backgroundFetch(k, index, options, context); - const hasStale = p.__staleWhileFetching !== undefined; - const staleVal = hasStale && allowStale; - if (status) { - status.fetch = isStale ? 'stale' : 'refresh'; - if (staleVal && isStale) - status.returnedStale = true; - } - return staleVal ? p.__staleWhileFetching : (p.__returned = p); - } - } - async forceFetch(k, fetchOptions = {}) { - const v = await this.fetch(k, fetchOptions); - if (v === undefined) - throw new Error('fetch() returned undefined'); - return v; - } - memo(k, memoOptions = {}) { - const memoMethod = this.#memoMethod; - if (!memoMethod) { - throw new Error('no memoMethod provided to constructor'); - } - const { context, forceRefresh, ...options } = memoOptions; - const v = this.get(k, options); - if (!forceRefresh && v !== undefined) - return v; - const vv = memoMethod(k, v, { - options, - context, - }); - this.set(k, vv, options); - return vv; - } - /** - * Return a value from the cache. Will update the recency of the cache - * entry found. - * - * If the key is not found, get() will return `undefined`. - */ - get(k, getOptions = {}) { - const { allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, status, } = getOptions; - const index = this.#keyMap.get(k); - if (index !== undefined) { - const value = this.#valList[index]; - const fetching = this.#isBackgroundFetch(value); - if (status) - this.#statusTTL(status, index); - if (this.#isStale(index)) { - if (status) - status.get = 'stale'; - // delete only if not an in-flight background fetch - if (!fetching) { - if (!noDeleteOnStaleGet) { - this.#delete(k, 'expire'); - } - if (status && allowStale) - status.returnedStale = true; - return allowStale ? value : undefined; - } - else { - if (status && - allowStale && - value.__staleWhileFetching !== undefined) { - status.returnedStale = true; - } - return allowStale ? value.__staleWhileFetching : undefined; - } - } - else { - if (status) - status.get = 'hit'; - // if we're currently fetching it, we don't actually have it yet - // it's not stale, which means this isn't a staleWhileRefetching. - // If it's not stale, and fetching, AND has a __staleWhileFetching - // value, then that means the user fetched with {forceRefresh:true}, - // so it's safe to return that value. - if (fetching) { - return value.__staleWhileFetching; - } - this.#moveToTail(index); - if (updateAgeOnGet) { - this.#updateItemAge(index); - } - return value; - } - } - else if (status) { - status.get = 'miss'; - } - } - #connect(p, n) { - this.#prev[n] = p; - this.#next[p] = n; - } - #moveToTail(index) { - // if tail already, nothing to do - // if head, move head to next[index] - // else - // move next[prev[index]] to next[index] (head has no prev) - // move prev[next[index]] to prev[index] - // prev[index] = tail - // next[tail] = index - // tail = index - if (index !== this.#tail) { - if (index === this.#head) { - this.#head = this.#next[index]; - } - else { - this.#connect(this.#prev[index], this.#next[index]); - } - this.#connect(this.#tail, index); - this.#tail = index; - } - } - /** - * Deletes a key out of the cache. - * - * Returns true if the key was deleted, false otherwise. - */ - delete(k) { - return this.#delete(k, 'delete'); - } - #delete(k, reason) { - let deleted = false; - if (this.#size !== 0) { - const index = this.#keyMap.get(k); - if (index !== undefined) { - deleted = true; - if (this.#size === 1) { - this.#clear(reason); - } - else { - this.#removeItemSize(index); - const v = this.#valList[index]; - if (this.#isBackgroundFetch(v)) { - v.__abortController.abort(new Error('deleted')); - } - else if (this.#hasDispose || this.#hasDisposeAfter) { - if (this.#hasDispose) { - this.#dispose?.(v, k, reason); - } - if (this.#hasDisposeAfter) { - this.#disposed?.push([v, k, reason]); - } - } - this.#keyMap.delete(k); - this.#keyList[index] = undefined; - this.#valList[index] = undefined; - if (index === this.#tail) { - this.#tail = this.#prev[index]; - } - else if (index === this.#head) { - this.#head = this.#next[index]; - } - else { - const pi = this.#prev[index]; - this.#next[pi] = this.#next[index]; - const ni = this.#next[index]; - this.#prev[ni] = this.#prev[index]; - } - this.#size--; - this.#free.push(index); - } - } - } - if (this.#hasDisposeAfter && this.#disposed?.length) { - const dt = this.#disposed; - let task; - while ((task = dt?.shift())) { - this.#disposeAfter?.(...task); - } - } - return deleted; - } - /** - * Clear the cache entirely, throwing away all values. - */ - clear() { - return this.#clear('delete'); - } - #clear(reason) { - for (const index of this.#rindexes({ allowStale: true })) { - const v = this.#valList[index]; - if (this.#isBackgroundFetch(v)) { - v.__abortController.abort(new Error('deleted')); - } - else { - const k = this.#keyList[index]; - if (this.#hasDispose) { - this.#dispose?.(v, k, reason); - } - if (this.#hasDisposeAfter) { - this.#disposed?.push([v, k, reason]); - } - } - } - this.#keyMap.clear(); - this.#valList.fill(undefined); - this.#keyList.fill(undefined); - if (this.#ttls && this.#starts) { - this.#ttls.fill(0); - this.#starts.fill(0); - } - if (this.#sizes) { - this.#sizes.fill(0); - } - this.#head = 0; - this.#tail = 0; - this.#free.length = 0; - this.#calculatedSize = 0; - this.#size = 0; - if (this.#hasDisposeAfter && this.#disposed) { - const dt = this.#disposed; - let task; - while ((task = dt?.shift())) { - this.#disposeAfter?.(...task); - } - } - } -} -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/index.js.map b/node_modules/lru-cache/dist/esm/index.js.map deleted file mode 100644 index 8f7ac53..0000000 --- a/node_modules/lru-cache/dist/esm/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,IAAI,GACR,OAAO,WAAW,KAAK,QAAQ;IAC/B,WAAW;IACX,OAAO,WAAW,CAAC,GAAG,KAAK,UAAU;IACnC,CAAC,CAAC,WAAW;IACb,CAAC,CAAC,IAAI,CAAA;AAEV,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAA;AAKhC,qBAAqB;AACrB,MAAM,OAAO,GAAG,CACd,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAChC,CAAA;AACzB,qBAAqB;AAErB,MAAM,WAAW,GAAG,CAClB,GAAW,EACX,IAAY,EACZ,IAAY,EACZ,EAAQ,EACR,EAAE;IACF,OAAO,OAAO,CAAC,WAAW,KAAK,UAAU;QACvC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;QAC1C,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,IAAI,KAAK,GAAG,EAAE,CAAC,CAAA;AAChD,CAAC,CAAA;AAED,IAAI,EAAE,GAAG,UAAU,CAAC,eAAe,CAAA;AACnC,IAAI,EAAE,GAAG,UAAU,CAAC,WAAW,CAAA;AAE/B,qBAAqB;AACrB,IAAI,OAAO,EAAE,KAAK,WAAW,EAAE;IAC7B,YAAY;IACZ,EAAE,GAAG,MAAM,WAAW;QACpB,OAAO,CAAuB;QAC9B,QAAQ,GAA6B,EAAE,CAAA;QACvC,MAAM,CAAM;QACZ,OAAO,GAAY,KAAK,CAAA;QACxB,gBAAgB,CAAC,CAAS,EAAE,EAAwB;YAClD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACxB,CAAC;KACF,CAAA;IACD,YAAY;IACZ,EAAE,GAAG,MAAM,eAAe;QACxB;YACE,cAAc,EAAE,CAAA;QAClB,CAAC;QACD,MAAM,GAAG,IAAI,EAAE,EAAE,CAAA;QACjB,KAAK,CAAC,MAAW;YACf,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAM;YAC/B,YAAY;YACZ,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAA;YAC3B,YAAY;YACZ,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAA;YAC1B,YAAY;YACZ,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;gBACrC,EAAE,CAAC,MAAM,CAAC,CAAA;aACX;YACD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAA;QAC/B,CAAC;KACF,CAAA;IACD,IAAI,sBAAsB,GACxB,OAAO,CAAC,GAAG,EAAE,2BAA2B,KAAK,GAAG,CAAA;IAClD,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,IAAI,CAAC,sBAAsB;YAAE,OAAM;QACnC,sBAAsB,GAAG,KAAK,CAAA;QAC9B,WAAW,CACT,wDAAwD;YACtD,qDAAqD;YACrD,yDAAyD;YACzD,6DAA6D;YAC7D,mEAAmE;YACnE,mEAAmE;YACnE,qEAAqE,EACvE,qBAAqB,EACrB,SAAS,EACT,cAAc,CACf,CAAA;IACH,CAAC,CAAA;CACF;AACD,oBAAoB;AAEpB,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AAEtD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;AAI3B,MAAM,QAAQ,GAAG,CAAC,CAAM,EAAe,EAAE,CACvC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAA;AAKlD,qBAAqB;AACrB,wCAAwC;AACxC,sEAAsE;AACtE,uEAAuE;AACvE,uEAAuE;AACvE,wEAAwE;AACxE,uDAAuD;AACvD,2BAA2B;AAC3B,wDAAwD;AACxD,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,EAAE,CACnC,CAAC,QAAQ,CAAC,GAAG,CAAC;IACZ,CAAC,CAAC,IAAI;IACN,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC;YACxB,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC;gBACxB,CAAC,CAAC,WAAW;gBACb,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,gBAAgB;oBAChC,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,IAAI,CAAA;AACV,oBAAoB;AAEpB,MAAM,SAAU,SAAQ,KAAa;IACnC,YAAY,IAAY;QACtB,KAAK,CAAC,IAAI,CAAC,CAAA;QACX,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACd,CAAC;CACF;AAKD,MAAM,KAAK;IACT,IAAI,CAAa;IACjB,MAAM,CAAQ;IACd,sBAAsB;IACtB,MAAM,CAAC,aAAa,GAAY,KAAK,CAAA;IACrC,MAAM,CAAC,MAAM,CAAC,GAAW;QACvB,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAA;QACjC,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAA;QACvB,KAAK,CAAC,aAAa,GAAG,IAAI,CAAA;QAC1B,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;QACjC,KAAK,CAAC,aAAa,GAAG,KAAK,CAAA;QAC3B,OAAO,CAAC,CAAA;IACV,CAAC;IACD,YACE,GAAW,EACX,OAAyC;QAEzC,qBAAqB;QACrB,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;YACxB,MAAM,IAAI,SAAS,CAAC,yCAAyC,CAAC,CAAA;SAC/D;QACD,oBAAoB;QACpB,IAAI,CAAC,IAAI,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,CAAA;QAC5B,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;IACjB,CAAC;IACD,IAAI,CAAC,CAAQ;QACX,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAA;IAC9B,CAAC;IACD,GAAG;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM,CAAU,CAAA;IAC1C,CAAC;;AAw6BH;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,QAAQ;IAGnB,kDAAkD;IACzC,IAAI,CAAgB;IACpB,QAAQ,CAAe;IACvB,QAAQ,CAA0B;IAClC,aAAa,CAA0B;IACvC,YAAY,CAA6B;IACzC,WAAW,CAA8B;IAElD;;OAEG;IACH,GAAG,CAAuB;IAE1B;;OAEG;IACH,aAAa,CAAuB;IACpC;;OAEG;IACH,YAAY,CAAS;IACrB;;OAEG;IACH,cAAc,CAAS;IACvB;;OAEG;IACH,cAAc,CAAS;IACvB;;OAEG;IACH,UAAU,CAAS;IAEnB;;OAEG;IACH,cAAc,CAAS;IACvB;;OAEG;IACH,WAAW,CAAS;IACpB;;OAEG;IACH,YAAY,CAAe;IAC3B;;OAEG;IACH,eAAe,CAAgC;IAC/C;;OAEG;IACH,wBAAwB,CAAS;IACjC;;OAEG;IACH,kBAAkB,CAAS;IAC3B;;OAEG;IACH,sBAAsB,CAAS;IAC/B;;OAEG;IACH,0BAA0B,CAAS;IACnC;;OAEG;IACH,gBAAgB,CAAS;IAEzB,sBAAsB;IACtB,KAAK,CAAgB;IACrB,eAAe,CAAe;IAC9B,OAAO,CAAe;IACtB,QAAQ,CAAmB;IAC3B,QAAQ,CAAwC;IAChD,KAAK,CAAa;IAClB,KAAK,CAAa;IAClB,KAAK,CAAO;IACZ,KAAK,CAAO;IACZ,KAAK,CAAW;IAChB,SAAS,CAAsB;IAC/B,MAAM,CAAY;IAClB,OAAO,CAAY;IACnB,KAAK,CAAY;IAEjB,WAAW,CAAS;IACpB,eAAe,CAAS;IACxB,gBAAgB,CAAS;IAEzB;;;;;;;;OAQG;IACH,MAAM,CAAC,qBAAqB,CAI1B,CAAqB;QACrB,OAAO;YACL,aAAa;YACb,MAAM,EAAE,CAAC,CAAC,OAAO;YACjB,IAAI,EAAE,CAAC,CAAC,KAAK;YACb,KAAK,EAAE,CAAC,CAAC,MAAM;YACf,MAAM,EAAE,CAAC,CAAC,OAAyB;YACnC,OAAO,EAAE,CAAC,CAAC,QAAQ;YACnB,OAAO,EAAE,CAAC,CAAC,QAAQ;YACnB,IAAI,EAAE,CAAC,CAAC,KAAK;YACb,IAAI,EAAE,CAAC,CAAC,KAAK;YACb,IAAI,IAAI;gBACN,OAAO,CAAC,CAAC,KAAK,CAAA;YAChB,CAAC;YACD,IAAI,IAAI;gBACN,OAAO,CAAC,CAAC,KAAK,CAAA;YAChB,CAAC;YACD,IAAI,EAAE,CAAC,CAAC,KAAK;YACb,UAAU;YACV,iBAAiB,EAAE,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;YACtD,eAAe,EAAE,CACf,CAAI,EACJ,KAAyB,EACzB,OAAwC,EACxC,OAAY,EACQ,EAAE,CACtB,CAAC,CAAC,gBAAgB,CAChB,CAAC,EACD,KAA0B,EAC1B,OAAO,EACP,OAAO,CACR;YACH,UAAU,EAAE,CAAC,KAAa,EAAQ,EAAE,CAClC,CAAC,CAAC,WAAW,CAAC,KAAc,CAAC;YAC/B,OAAO,EAAE,CAAC,OAAiC,EAAE,EAAE,CAC7C,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;YACrB,QAAQ,EAAE,CAAC,OAAiC,EAAE,EAAE,CAC9C,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC;YACtB,OAAO,EAAE,CAAC,KAAyB,EAAE,EAAE,CACrC,CAAC,CAAC,QAAQ,CAAC,KAAc,CAAC;SAC7B,CAAA;IACH,CAAC;IAED,8BAA8B;IAE9B;;OAEG;IACH,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IACD;;OAEG;IACH,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IACD;;OAEG;IACH,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,eAAe,CAAA;IAC7B,CAAC;IACD;;OAEG;IACH,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IACD;;OAEG;IACH,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IACD,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,WAAW,CAAA;IACzB,CAAC;IACD;;OAEG;IACH,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IACD;;OAEG;IACH,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,aAAa,CAAA;IAC3B,CAAC;IAED,YACE,OAAwD;QAExD,MAAM,EACJ,GAAG,GAAG,CAAC,EACP,GAAG,EACH,aAAa,GAAG,CAAC,EACjB,YAAY,EACZ,cAAc,EACd,cAAc,EACd,UAAU,EACV,OAAO,EACP,YAAY,EACZ,cAAc,EACd,WAAW,EACX,OAAO,GAAG,CAAC,EACX,YAAY,GAAG,CAAC,EAChB,eAAe,EACf,WAAW,EACX,UAAU,EACV,wBAAwB,EACxB,kBAAkB,EAClB,0BAA0B,EAC1B,sBAAsB,EACtB,gBAAgB,GACjB,GAAG,OAAO,CAAA;QAEX,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YAC/B,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAA;SAChE;QAED,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QACjD,IAAI,CAAC,SAAS,EAAE;YACd,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,GAAG,CAAC,CAAA;SAC7C;QAED,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;QACf,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;QACvB,IAAI,CAAC,YAAY,GAAG,YAAY,IAAI,IAAI,CAAC,QAAQ,CAAA;QACjD,IAAI,CAAC,eAAe,GAAG,eAAe,CAAA;QACtC,IAAI,IAAI,CAAC,eAAe,EAAE;YACxB,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;gBACxC,MAAM,IAAI,SAAS,CACjB,oEAAoE,CACrE,CAAA;aACF;YACD,IAAI,OAAO,IAAI,CAAC,eAAe,KAAK,UAAU,EAAE;gBAC9C,MAAM,IAAI,SAAS,CAAC,qCAAqC,CAAC,CAAA;aAC3D;SACF;QAED,IACE,UAAU,KAAK,SAAS;YACxB,OAAO,UAAU,KAAK,UAAU,EAChC;YACA,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAA;SAChE;QACD,IAAI,CAAC,WAAW,GAAG,UAAU,CAAA;QAE7B,IACE,WAAW,KAAK,SAAS;YACzB,OAAO,WAAW,KAAK,UAAU,EACjC;YACA,MAAM,IAAI,SAAS,CACjB,6CAA6C,CAC9C,CAAA;SACF;QACD,IAAI,CAAC,YAAY,GAAG,WAAW,CAAA;QAC/B,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,WAAW,CAAA;QAEpC,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAAE,CAAA;QACxB,IAAI,CAAC,QAAQ,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC9C,IAAI,CAAC,QAAQ,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC9C,IAAI,CAAC,KAAK,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,CAAA;QAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,CAAA;QAC/B,IAAI,CAAC,KAAK,GAAG,CAAU,CAAA;QACvB,IAAI,CAAC,KAAK,GAAG,CAAU,CAAA;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC9B,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;QACd,IAAI,CAAC,eAAe,GAAG,CAAC,CAAA;QAExB,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE;YACjC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;SACxB;QACD,IAAI,OAAO,YAAY,KAAK,UAAU,EAAE;YACtC,IAAI,CAAC,aAAa,GAAG,YAAY,CAAA;YACjC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAA;SACpB;aAAM;YACL,IAAI,CAAC,aAAa,GAAG,SAAS,CAAA;YAC9B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;SAC3B;QACD,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAA;QAClC,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAA;QAE5C,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,CAAA;QACtC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAA;QAChC,IAAI,CAAC,wBAAwB,GAAG,CAAC,CAAC,wBAAwB,CAAA;QAC1D,IAAI,CAAC,0BAA0B,GAAG,CAAC,CAAC,0BAA0B,CAAA;QAC9D,IAAI,CAAC,sBAAsB,GAAG,CAAC,CAAC,sBAAsB,CAAA;QACtD,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,gBAAgB,CAAA;QAE1C,iDAAiD;QACjD,IAAI,IAAI,CAAC,YAAY,KAAK,CAAC,EAAE;YAC3B,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,EAAE;gBACvB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;oBAC5B,MAAM,IAAI,SAAS,CACjB,iDAAiD,CAClD,CAAA;iBACF;aACF;YACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;gBAChC,MAAM,IAAI,SAAS,CACjB,sDAAsD,CACvD,CAAA;aACF;YACD,IAAI,CAAC,uBAAuB,EAAE,CAAA;SAC/B;QAED,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAA;QAC9B,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC,kBAAkB,CAAA;QAC9C,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,CAAA;QACtC,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,CAAA;QACtC,IAAI,CAAC,aAAa;YAChB,QAAQ,CAAC,aAAa,CAAC,IAAI,aAAa,KAAK,CAAC;gBAC5C,CAAC,CAAC,aAAa;gBACf,CAAC,CAAC,CAAC,CAAA;QACP,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAA;QAClC,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,CAAA;QACnB,IAAI,IAAI,CAAC,GAAG,EAAE;YACZ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gBACvB,MAAM,IAAI,SAAS,CACjB,6CAA6C,CAC9C,CAAA;aACF;YACD,IAAI,CAAC,sBAAsB,EAAE,CAAA;SAC9B;QAED,2CAA2C;QAC3C,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,EAAE;YAC5D,MAAM,IAAI,SAAS,CACjB,kDAAkD,CACnD,CAAA;SACF;QACD,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YACtD,MAAM,IAAI,GAAG,qBAAqB,CAAA;YAClC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE;gBACpB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;gBAChB,MAAM,GAAG,GACP,wDAAwD;oBACxD,yCAAyC,CAAA;gBAC3C,WAAW,CAAC,GAAG,EAAE,uBAAuB,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;aAC1D;SACF;IACH,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,GAAM;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7C,CAAC;IAED,sBAAsB;QACpB,MAAM,IAAI,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACrC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACvC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;QACjB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;QAErB,IAAI,CAAC,WAAW,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE;YACpD,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YACrC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA;YACjB,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE;gBAClC,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE;oBACxB,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;wBACxB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAM,EAAE,QAAQ,CAAC,CAAA;qBAClD;gBACH,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAA;gBACX,yCAAyC;gBACzC,qBAAqB;gBACrB,IAAI,CAAC,CAAC,KAAK,EAAE;oBACX,CAAC,CAAC,KAAK,EAAE,CAAA;iBACV;gBACD,oBAAoB;aACrB;QACH,CAAC,CAAA;QAED,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,EAAE;YAC5B,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QACpD,CAAC,CAAA;QAED,IAAI,CAAC,UAAU,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAClC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE;gBACf,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAA;gBACvB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;gBAC3B,oBAAoB;gBACpB,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK;oBAAE,OAAM;gBAC1B,MAAM,CAAC,GAAG,GAAG,GAAG,CAAA;gBAChB,MAAM,CAAC,KAAK,GAAG,KAAK,CAAA;gBACpB,MAAM,CAAC,GAAG,GAAG,SAAS,IAAI,MAAM,EAAE,CAAA;gBAClC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,KAAK,CAAA;gBAC9B,MAAM,CAAC,YAAY,GAAG,GAAG,GAAG,GAAG,CAAA;aAChC;QACH,CAAC,CAAA;QAED,0DAA0D;QAC1D,+BAA+B;QAC/B,IAAI,SAAS,GAAG,CAAC,CAAA;QACjB,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YACpB,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE;gBAC1B,SAAS,GAAG,CAAC,CAAA;gBACb,MAAM,CAAC,GAAG,UAAU,CAClB,GAAG,EAAE,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,EACrB,IAAI,CAAC,aAAa,CACnB,CAAA;gBACD,iCAAiC;gBACjC,qBAAqB;gBACrB,IAAI,CAAC,CAAC,KAAK,EAAE;oBACX,CAAC,CAAC,KAAK,EAAE,CAAA;iBACV;gBACD,oBAAoB;aACrB;YACD,OAAO,CAAC,CAAA;QACV,CAAC,CAAA;QAED,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC,EAAE;YAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACnC,IAAI,KAAK,KAAK,SAAS,EAAE;gBACvB,OAAO,CAAC,CAAA;aACT;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAA;YACvB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;YAC3B,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;gBAClB,OAAO,QAAQ,CAAA;aAChB;YACD,MAAM,GAAG,GAAG,CAAC,SAAS,IAAI,MAAM,EAAE,CAAC,GAAG,KAAK,CAAA;YAC3C,OAAO,GAAG,GAAG,GAAG,CAAA;QAClB,CAAC,CAAA;QAED,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,EAAE;YACtB,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;YACvB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAA;YACrB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACtD,CAAC,CAAA;IACH,CAAC;IAED,mDAAmD;IACnD,cAAc,GAA2B,GAAG,EAAE,GAAE,CAAC,CAAA;IACjD,UAAU,GACR,GAAG,EAAE,GAAE,CAAC,CAAA;IACV,WAAW,GAMC,GAAG,EAAE,GAAE,CAAC,CAAA;IACpB,oBAAoB;IAEpB,QAAQ,GAA8B,GAAG,EAAE,CAAC,KAAK,CAAA;IAEjD,uBAAuB;QACrB,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACtC,IAAI,CAAC,eAAe,GAAG,CAAC,CAAA;QACxB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,EAAE;YAC7B,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,CAAW,CAAA;YAC9C,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAClB,CAAC,CAAA;QACD,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE;YAClD,2CAA2C;YAC3C,sDAAsD;YACtD,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE;gBAC9B,OAAO,CAAC,CAAA;aACT;YACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;gBACnB,IAAI,eAAe,EAAE;oBACnB,IAAI,OAAO,eAAe,KAAK,UAAU,EAAE;wBACzC,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAA;qBAC1D;oBACD,IAAI,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;oBAC5B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;wBACnB,MAAM,IAAI,SAAS,CACjB,0DAA0D,CAC3D,CAAA;qBACF;iBACF;qBAAM;oBACL,MAAM,IAAI,SAAS,CACjB,iDAAiD;wBAC/C,wDAAwD;wBACxD,sBAAsB,CACzB,CAAA;iBACF;aACF;YACD,OAAO,IAAI,CAAA;QACb,CAAC,CAAA;QACD,IAAI,CAAC,YAAY,GAAG,CAClB,KAAY,EACZ,IAAmB,EACnB,MAA2B,EAC3B,EAAE;YACF,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAA;YACnB,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACjB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,GAAI,KAAK,CAAC,KAAK,CAAY,CAAA;gBACxD,OAAO,IAAI,CAAC,eAAe,GAAG,OAAO,EAAE;oBACrC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;iBAClB;aACF;YACD,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,CAAW,CAAA;YAC9C,IAAI,MAAM,EAAE;gBACV,MAAM,CAAC,SAAS,GAAG,IAAI,CAAA;gBACvB,MAAM,CAAC,mBAAmB,GAAG,IAAI,CAAC,eAAe,CAAA;aAClD;QACH,CAAC,CAAA;IACH,CAAC;IAED,eAAe,GAA2B,EAAE,CAAC,EAAE,GAAE,CAAC,CAAA;IAClD,YAAY,GAIA,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAE,CAAC,CAAA;IAC/B,YAAY,GAKS,CACnB,EAAK,EACL,EAA0B,EAC1B,IAAoB,EACpB,eAA+C,EAC/C,EAAE;QACF,IAAI,IAAI,IAAI,eAAe,EAAE;YAC3B,MAAM,IAAI,SAAS,CACjB,kEAAkE,CACnE,CAAA;SACF;QACD,OAAO,CAAC,CAAA;IACV,CAAC,CAAC;IAEF,CAAC,QAAQ,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;QAC7C,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,GAAI;gBAC/B,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE;oBAC1B,MAAK;iBACN;gBACD,IAAI,UAAU,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;oBACnC,MAAM,CAAC,CAAA;iBACR;gBACD,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE;oBACpB,MAAK;iBACN;qBAAM;oBACL,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAU,CAAA;iBAC3B;aACF;SACF;IACH,CAAC;IAED,CAAC,SAAS,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;QAC9C,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,GAAI;gBAC/B,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE;oBAC1B,MAAK;iBACN;gBACD,IAAI,UAAU,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;oBACnC,MAAM,CAAC,CAAA;iBACR;gBACD,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE;oBACpB,MAAK;iBACN;qBAAM;oBACL,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAU,CAAA;iBAC3B;aACF;SACF;IACH,CAAC;IAED,aAAa,CAAC,KAAY;QACxB,OAAO,CACL,KAAK,KAAK,SAAS;YACnB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAM,CAAC,KAAK,KAAK,CACtD,CAAA;IACH,CAAC;IAED;;;OAGG;IACH,CAAC,OAAO;QACN,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YAC/B,IACE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,SAAS;gBAC9B,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,SAAS;gBAC9B,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAC1C;gBACA,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAW,CAAA;aACrD;SACF;IACH,CAAC;IAED;;;;;OAKG;IACH,CAAC,QAAQ;QACP,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YAChC,IACE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,SAAS;gBAC9B,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,SAAS;gBAC9B,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAC1C;gBACA,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;aAC3C;SACF;IACH,CAAC;IAED;;;OAGG;IACH,CAAC,IAAI;QACH,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAC1B,IACE,CAAC,KAAK,SAAS;gBACf,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAC1C;gBACA,MAAM,CAAC,CAAA;aACR;SACF;IACH,CAAC;IAED;;;;;OAKG;IACH,CAAC,KAAK;QACJ,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YAChC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAC1B,IACE,CAAC,KAAK,SAAS;gBACf,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAC1C;gBACA,MAAM,CAAC,CAAA;aACR;SACF;IACH,CAAC;IAED;;;OAGG;IACH,CAAC,MAAM;QACL,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAC1B,IACE,CAAC,KAAK,SAAS;gBACf,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAC1C;gBACA,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAM,CAAA;aAC5B;SACF;IACH,CAAC;IAED;;;;;OAKG;IACH,CAAC,OAAO;QACN,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YAChC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAC1B,IACE,CAAC,KAAK,SAAS;gBACf,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAC1C;gBACA,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;aACvB;SACF;IACH,CAAC;IAED;;;OAGG;IACH,CAAC,MAAM,CAAC,QAAQ,CAAC;QACf,OAAO,IAAI,CAAC,OAAO,EAAE,CAAA;IACvB,CAAC;IAED;;;;OAIG;IACH,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,UAAU,CAAA;IAEjC;;;OAGG;IACH,IAAI,CACF,EAAqD,EACrD,aAA4C,EAAE;QAE9C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;gBACtC,CAAC,CAAC,CAAC,CAAC,oBAAoB;gBACxB,CAAC,CAAC,CAAC,CAAA;YACL,IAAI,KAAK,KAAK,SAAS;gBAAE,SAAQ;YACjC,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAM,EAAE,IAAI,CAAC,EAAE;gBAC1C,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAM,EAAE,UAAU,CAAC,CAAA;aACnD;SACF;IACH,CAAC;IAED;;;;;;;;;;OAUG;IACH,OAAO,CACL,EAAiD,EACjD,QAAa,IAAI;QAEjB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;gBACtC,CAAC,CAAC,CAAC,CAAC,oBAAoB;gBACxB,CAAC,CAAC,CAAC,CAAA;YACL,IAAI,KAAK,KAAK,SAAS;gBAAE,SAAQ;YACjC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAM,EAAE,IAAI,CAAC,CAAA;SACnD;IACH,CAAC;IAED;;;OAGG;IACH,QAAQ,CACN,EAAiD,EACjD,QAAa,IAAI;QAEjB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YAChC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;gBACtC,CAAC,CAAC,CAAC,CAAC,oBAAoB;gBACxB,CAAC,CAAC,CAAC,CAAA;YACL,IAAI,KAAK,KAAK,SAAS;gBAAE,SAAQ;YACjC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAM,EAAE,IAAI,CAAC,CAAA;SACnD;IACH,CAAC;IAED;;;OAGG;IACH,UAAU;QACR,IAAI,OAAO,GAAG,KAAK,CAAA;QACnB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE;YACpD,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;gBACpB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAM,EAAE,QAAQ,CAAC,CAAA;gBAC7C,OAAO,GAAG,IAAI,CAAA;aACf;SACF;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED;;;;;;;;;;;OAWG;IACH,IAAI,CAAC,GAAM;QACT,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC/B,IAAI,CAAC,KAAK,SAAS;YAAE,OAAO,SAAS,CAAA;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;QAC1B,MAAM,KAAK,GAAkB,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;YACrD,CAAC,CAAC,CAAC,CAAC,oBAAoB;YACxB,CAAC,CAAC,CAAC,CAAA;QACL,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,SAAS,CAAA;QACzC,MAAM,KAAK,GAAsB,EAAE,KAAK,EAAE,CAAA;QAC1C,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE;YAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YACzB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;YAC7B,IAAI,GAAG,IAAI,KAAK,EAAE;gBAChB,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAA;gBACzC,KAAK,CAAC,GAAG,GAAG,MAAM,CAAA;gBAClB,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;aACzB;SACF;QACD,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;SAC5B;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,IAAI;QACF,MAAM,GAAG,GAA6B,EAAE,CAAA;QACxC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE;YACnD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAC1B,MAAM,KAAK,GAAkB,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;gBACrD,CAAC,CAAC,CAAC,CAAC,oBAAoB;gBACxB,CAAC,CAAC,CAAC,CAAA;YACL,IAAI,KAAK,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS;gBAAE,SAAQ;YACtD,MAAM,KAAK,GAAsB,EAAE,KAAK,EAAE,CAAA;YAC1C,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE;gBAC9B,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;gBACzB,yDAAyD;gBACzD,4DAA4D;gBAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAY,CAAA;gBACpD,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAA;aAC3C;YACD,IAAI,IAAI,CAAC,MAAM,EAAE;gBACf,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;aAC5B;YACD,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;SAC1B;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IAED;;;;;;;;OAQG;IACH,IAAI,CAAC,GAA6B;QAChC,IAAI,CAAC,KAAK,EAAE,CAAA;QACZ,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,GAAG,EAAE;YAC9B,IAAI,KAAK,CAAC,KAAK,EAAE;gBACf,2DAA2D;gBAC3D,6DAA6D;gBAC7D,6DAA6D;gBAC7D,eAAe;gBACf,EAAE;gBACF,4DAA4D;gBAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,KAAK,CAAA;gBACpC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAA;aAC/B;YACD,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;SAClC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,GAAG,CACD,CAAI,EACJ,CAAqC,EACrC,aAA4C,EAAE;QAE9C,IAAI,CAAC,KAAK,SAAS,EAAE;YACnB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;YACd,OAAO,IAAI,CAAA;SACZ;QACD,MAAM,EACJ,GAAG,GAAG,IAAI,CAAC,GAAG,EACd,KAAK,EACL,cAAc,GAAG,IAAI,CAAC,cAAc,EACpC,eAAe,GAAG,IAAI,CAAC,eAAe,EACtC,MAAM,GACP,GAAG,UAAU,CAAA;QACd,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,UAAU,CAAA;QAEnD,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAC5B,CAAC,EACD,CAAC,EACD,UAAU,CAAC,IAAI,IAAI,CAAC,EACpB,eAAe,CAChB,CAAA;QACD,6CAA6C;QAC7C,6CAA6C;QAC7C,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE;YACjD,IAAI,MAAM,EAAE;gBACV,MAAM,CAAC,GAAG,GAAG,MAAM,CAAA;gBACnB,MAAM,CAAC,oBAAoB,GAAG,IAAI,CAAA;aACnC;YACD,sDAAsD;YACtD,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;YACtB,OAAO,IAAI,CAAA;SACZ;QACD,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC9D,IAAI,KAAK,KAAK,SAAS,EAAE;YACvB,WAAW;YACX,KAAK,GAAG,CACN,IAAI,CAAC,KAAK,KAAK,CAAC;gBACd,CAAC,CAAC,IAAI,CAAC,KAAK;gBACZ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;oBACzB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;oBAClB,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI;wBAC1B,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;wBACpB,CAAC,CAAC,IAAI,CAAC,KAAK,CACN,CAAA;YACV,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACxB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACxB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;YAC1B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAA;YAC9B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAA;YAC9B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;YAClB,IAAI,CAAC,KAAK,EAAE,CAAA;YACZ,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;YACtC,IAAI,MAAM;gBAAE,MAAM,CAAC,GAAG,GAAG,KAAK,CAAA;YAC9B,WAAW,GAAG,KAAK,CAAA;SACpB;aAAM;YACL,SAAS;YACT,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;YACvB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAA2B,CAAA;YAC7D,IAAI,CAAC,KAAK,MAAM,EAAE;gBAChB,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE;oBAC3D,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAA;oBACrD,MAAM,EAAE,oBAAoB,EAAE,CAAC,EAAE,GAAG,MAAM,CAAA;oBAC1C,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,cAAc,EAAE;wBACtC,IAAI,IAAI,CAAC,WAAW,EAAE;4BACpB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAM,EAAE,CAAC,EAAE,KAAK,CAAC,CAAA;yBAClC;wBACD,IAAI,IAAI,CAAC,gBAAgB,EAAE;4BACzB,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAA;yBACzC;qBACF;iBACF;qBAAM,IAAI,CAAC,cAAc,EAAE;oBAC1B,IAAI,IAAI,CAAC,WAAW,EAAE;wBACpB,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAW,EAAE,CAAC,EAAE,KAAK,CAAC,CAAA;qBACvC;oBACD,IAAI,IAAI,CAAC,gBAAgB,EAAE;wBACzB,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,MAAW,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAA;qBAC9C;iBACF;gBACD,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;gBAC3B,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;gBACtC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;gBACxB,IAAI,MAAM,EAAE;oBACV,MAAM,CAAC,GAAG,GAAG,SAAS,CAAA;oBACtB,MAAM,QAAQ,GACZ,MAAM,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;wBACvC,CAAC,CAAC,MAAM,CAAC,oBAAoB;wBAC7B,CAAC,CAAC,MAAM,CAAA;oBACZ,IAAI,QAAQ,KAAK,SAAS;wBAAE,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAA;iBACvD;aACF;iBAAM,IAAI,MAAM,EAAE;gBACjB,MAAM,CAAC,GAAG,GAAG,QAAQ,CAAA;aACtB;SACF;QACD,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YAC5B,IAAI,CAAC,sBAAsB,EAAE,CAAA;SAC9B;QACD,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,IAAI,CAAC,WAAW,EAAE;gBAChB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;aACpC;YACD,IAAI,MAAM;gBAAE,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;SAC3C;QACD,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,SAAS,EAAE;YAC9D,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAA;YACzB,IAAI,IAAmC,CAAA;YACvC,OAAO,CAAC,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;gBAC3B,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,IAAI,CAAC,CAAA;aAC9B;SACF;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;OAGG;IACH,GAAG;QACD,IAAI;YACF,OAAO,IAAI,CAAC,KAAK,EAAE;gBACjB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBACrC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;gBACjB,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE;oBAChC,IAAI,GAAG,CAAC,oBAAoB,EAAE;wBAC5B,OAAO,GAAG,CAAC,oBAAoB,CAAA;qBAChC;iBACF;qBAAM,IAAI,GAAG,KAAK,SAAS,EAAE;oBAC5B,OAAO,GAAG,CAAA;iBACX;aACF;SACF;gBAAS;YACR,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,SAAS,EAAE;gBAC3C,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAA;gBACzB,IAAI,IAAmC,CAAA;gBACvC,OAAO,CAAC,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;oBAC3B,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,IAAI,CAAC,CAAA;iBAC9B;aACF;SACF;IACH,CAAC;IAED,MAAM,CAAC,IAAa;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAA;QACvB,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAM,CAAA;QAClC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAM,CAAA;QAClC,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE;YACtD,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAA;SAChD;aAAM,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACpD,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAA;aAC/B;YACD,IAAI,IAAI,CAAC,gBAAgB,EAAE;gBACzB,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;aACtC;SACF;QACD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;QAC1B,2DAA2D;QAC3D,IAAI,IAAI,EAAE;YACR,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,CAAA;YAC/B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,CAAA;YAC/B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;SACtB;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE;YACpB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAU,CAAA;YACpC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAA;SACtB;aAAM;YACL,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAU,CAAA;SACvC;QACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACtB,IAAI,CAAC,KAAK,EAAE,CAAA;QACZ,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACH,GAAG,CAAC,CAAI,EAAE,aAA4C,EAAE;QACtD,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,GACpD,UAAU,CAAA;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACjC,IAAI,KAAK,KAAK,SAAS,EAAE;YACvB,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;YAC9B,IACE,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;gBAC1B,CAAC,CAAC,oBAAoB,KAAK,SAAS,EACpC;gBACA,OAAO,KAAK,CAAA;aACb;YACD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;gBACzB,IAAI,cAAc,EAAE;oBAClB,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;iBAC3B;gBACD,IAAI,MAAM,EAAE;oBACV,MAAM,CAAC,GAAG,GAAG,KAAK,CAAA;oBAClB,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;iBAC/B;gBACD,OAAO,IAAI,CAAA;aACZ;iBAAM,IAAI,MAAM,EAAE;gBACjB,MAAM,CAAC,GAAG,GAAG,OAAO,CAAA;gBACpB,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;aAC/B;SACF;aAAM,IAAI,MAAM,EAAE;YACjB,MAAM,CAAC,GAAG,GAAG,MAAM,CAAA;SACpB;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED;;;;;;OAMG;IACH,IAAI,CAAC,CAAI,EAAE,cAA8C,EAAE;QACzD,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,WAAW,CAAA;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACjC,IACE,KAAK,KAAK,SAAS;YACnB,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EACrC;YACA,OAAM;SACP;QACD,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAC9B,oEAAoE;QACpE,OAAO,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAA;IAChE,CAAC;IAED,gBAAgB,CACd,CAAI,EACJ,KAAwB,EACxB,OAAwC,EACxC,OAAY;QAEZ,MAAM,CAAC,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAChE,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE;YAC9B,OAAO,CAAC,CAAA;SACT;QAED,MAAM,EAAE,GAAG,IAAI,EAAE,EAAE,CAAA;QACnB,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;QAC1B,yDAAyD;QACzD,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;YAC/D,MAAM,EAAE,EAAE,CAAC,MAAM;SAClB,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG;YAChB,MAAM,EAAE,EAAE,CAAC,MAAM;YACjB,OAAO;YACP,OAAO;SACR,CAAA;QAED,MAAM,EAAE,GAAG,CACT,CAAgB,EAChB,WAAW,GAAG,KAAK,EACJ,EAAE;YACjB,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAA;YAC7B,MAAM,WAAW,GAAG,OAAO,CAAC,gBAAgB,IAAI,CAAC,KAAK,SAAS,CAAA;YAC/D,IAAI,OAAO,CAAC,MAAM,EAAE;gBAClB,IAAI,OAAO,IAAI,CAAC,WAAW,EAAE;oBAC3B,OAAO,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAA;oBAClC,OAAO,CAAC,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAA;oBAC5C,IAAI,WAAW;wBAAE,OAAO,CAAC,MAAM,CAAC,iBAAiB,GAAG,IAAI,CAAA;iBACzD;qBAAM;oBACL,OAAO,CAAC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAA;iBACpC;aACF;YACD,IAAI,OAAO,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,EAAE;gBAC3C,OAAO,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;aACnC;YACD,qEAAqE;YACrE,MAAM,EAAE,GAAG,CAAuB,CAAA;YAClC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAc,CAAC,KAAK,CAAC,EAAE;gBACvC,IAAI,CAAC,KAAK,SAAS,EAAE;oBACnB,IAAI,EAAE,CAAC,oBAAoB,EAAE;wBAC3B,IAAI,CAAC,QAAQ,CAAC,KAAc,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAA;qBACxD;yBAAM;wBACL,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;qBACzB;iBACF;qBAAM;oBACL,IAAI,OAAO,CAAC,MAAM;wBAAE,OAAO,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAA;oBACtD,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAA;iBAClC;aACF;YACD,OAAO,CAAC,CAAA;QACV,CAAC,CAAA;QAED,MAAM,EAAE,GAAG,CAAC,EAAO,EAAE,EAAE;YACrB,IAAI,OAAO,CAAC,MAAM,EAAE;gBAClB,OAAO,CAAC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAA;gBACnC,OAAO,CAAC,MAAM,CAAC,UAAU,GAAG,EAAE,CAAA;aAC/B;YACD,OAAO,SAAS,CAAC,EAAE,CAAC,CAAA;QACtB,CAAC,CAAA;QAED,MAAM,SAAS,GAAG,CAAC,EAAO,EAAiB,EAAE;YAC3C,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAA;YAC7B,MAAM,iBAAiB,GACrB,OAAO,IAAI,OAAO,CAAC,sBAAsB,CAAA;YAC3C,MAAM,UAAU,GACd,iBAAiB,IAAI,OAAO,CAAC,0BAA0B,CAAA;YACzD,MAAM,QAAQ,GAAG,UAAU,IAAI,OAAO,CAAC,wBAAwB,CAAA;YAC/D,MAAM,EAAE,GAAG,CAAuB,CAAA;YAClC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAc,CAAC,KAAK,CAAC,EAAE;gBACvC,qEAAqE;gBACrE,sEAAsE;gBACtE,MAAM,GAAG,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,oBAAoB,KAAK,SAAS,CAAA;gBAC9D,IAAI,GAAG,EAAE;oBACP,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;iBACzB;qBAAM,IAAI,CAAC,iBAAiB,EAAE;oBAC7B,oDAAoD;oBACpD,oDAAoD;oBACpD,mDAAmD;oBACnD,qDAAqD;oBACrD,IAAI,CAAC,QAAQ,CAAC,KAAc,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAA;iBACxD;aACF;YACD,IAAI,UAAU,EAAE;gBACd,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,oBAAoB,KAAK,SAAS,EAAE;oBAC3D,OAAO,CAAC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAA;iBACpC;gBACD,OAAO,EAAE,CAAC,oBAAoB,CAAA;aAC/B;iBAAM,IAAI,EAAE,CAAC,UAAU,KAAK,EAAE,EAAE;gBAC/B,MAAM,EAAE,CAAA;aACT;QACH,CAAC,CAAA;QAED,MAAM,KAAK,GAAG,CACZ,GAA+B,EAC/B,GAAqB,EACrB,EAAE;YACF,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAA;YAChD,IAAI,GAAG,IAAI,GAAG,YAAY,OAAO,EAAE;gBACjC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;aACzD;YACD,8CAA8C;YAC9C,8CAA8C;YAC9C,+BAA+B;YAC/B,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;gBACvC,IACE,CAAC,OAAO,CAAC,gBAAgB;oBACzB,OAAO,CAAC,sBAAsB,EAC9B;oBACA,GAAG,CAAC,SAAS,CAAC,CAAA;oBACd,iDAAiD;oBACjD,IAAI,OAAO,CAAC,sBAAsB,EAAE;wBAClC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;qBACvB;iBACF;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAA;QAED,IAAI,OAAO,CAAC,MAAM;YAAE,OAAO,CAAC,MAAM,CAAC,eAAe,GAAG,IAAI,CAAA;QACzD,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QACzC,MAAM,EAAE,GAAuB,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE;YAC9C,iBAAiB,EAAE,EAAE;YACrB,oBAAoB,EAAE,CAAC;YACvB,UAAU,EAAE,SAAS;SACtB,CAAC,CAAA;QAEF,IAAI,KAAK,KAAK,SAAS,EAAE;YACvB,iCAAiC;YACjC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAA;YAC5D,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;SAC5B;aAAM;YACL,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAA;SAC1B;QACD,OAAO,EAAE,CAAA;IACX,CAAC;IAED,kBAAkB,CAAC,CAAM;QACvB,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,OAAO,KAAK,CAAA;QACvC,MAAM,CAAC,GAAG,CAAuB,CAAA;QACjC,OAAO,CACL,CAAC,CAAC,CAAC;YACH,CAAC,YAAY,OAAO;YACpB,CAAC,CAAC,cAAc,CAAC,sBAAsB,CAAC;YACxC,CAAC,CAAC,iBAAiB,YAAY,EAAE,CAClC,CAAA;IACH,CAAC;IA+GD,KAAK,CAAC,KAAK,CACT,CAAI,EACJ,eAAgD,EAAE;QAElD,MAAM;QACJ,cAAc;QACd,UAAU,GAAG,IAAI,CAAC,UAAU,EAC5B,cAAc,GAAG,IAAI,CAAC,cAAc,EACpC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB;QAC5C,cAAc;QACd,GAAG,GAAG,IAAI,CAAC,GAAG,EACd,cAAc,GAAG,IAAI,CAAC,cAAc,EACpC,IAAI,GAAG,CAAC,EACR,eAAe,GAAG,IAAI,CAAC,eAAe,EACtC,WAAW,GAAG,IAAI,CAAC,WAAW;QAC9B,0BAA0B;QAC1B,wBAAwB,GAAG,IAAI,CAAC,wBAAwB,EACxD,0BAA0B,GAAG,IAAI,CAAC,0BAA0B,EAC5D,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,EACxC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,EACpD,OAAO,EACP,YAAY,GAAG,KAAK,EACpB,MAAM,EACN,MAAM,GACP,GAAG,YAAY,CAAA;QAEhB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YACzB,IAAI,MAAM;gBAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAA;YAChC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;gBACjB,UAAU;gBACV,cAAc;gBACd,kBAAkB;gBAClB,MAAM;aACP,CAAC,CAAA;SACH;QAED,MAAM,OAAO,GAAG;YACd,UAAU;YACV,cAAc;YACd,kBAAkB;YAClB,GAAG;YACH,cAAc;YACd,IAAI;YACJ,eAAe;YACf,WAAW;YACX,wBAAwB;YACxB,0BAA0B;YAC1B,sBAAsB;YACtB,gBAAgB;YAChB,MAAM;YACN,MAAM;SACP,CAAA;QAED,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC/B,IAAI,KAAK,KAAK,SAAS,EAAE;YACvB,IAAI,MAAM;gBAAE,MAAM,CAAC,KAAK,GAAG,MAAM,CAAA;YACjC,MAAM,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;YAC3D,OAAO,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAA;SAC1B;aAAM;YACL,mCAAmC;YACnC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;YAC9B,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE;gBAC9B,MAAM,KAAK,GACT,UAAU,IAAI,CAAC,CAAC,oBAAoB,KAAK,SAAS,CAAA;gBACpD,IAAI,MAAM,EAAE;oBACV,MAAM,CAAC,KAAK,GAAG,UAAU,CAAA;oBACzB,IAAI,KAAK;wBAAE,MAAM,CAAC,aAAa,GAAG,IAAI,CAAA;iBACvC;gBACD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAA;aAC3D;YAED,mEAAmE;YACnE,gEAAgE;YAChE,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;YACpC,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO,EAAE;gBAC7B,IAAI,MAAM;oBAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAA;gBAChC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;gBACvB,IAAI,cAAc,EAAE;oBAClB,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;iBAC3B;gBACD,IAAI,MAAM;oBAAE,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;gBAC1C,OAAO,CAAC,CAAA;aACT;YAED,iEAAiE;YACjE,qBAAqB;YACrB,MAAM,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;YAC3D,MAAM,QAAQ,GAAG,CAAC,CAAC,oBAAoB,KAAK,SAAS,CAAA;YACrD,MAAM,QAAQ,GAAG,QAAQ,IAAI,UAAU,CAAA;YACvC,IAAI,MAAM,EAAE;gBACV,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;gBAC5C,IAAI,QAAQ,IAAI,OAAO;oBAAE,MAAM,CAAC,aAAa,GAAG,IAAI,CAAA;aACrD;YACD,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAA;SAC9D;IACH,CAAC;IAoCD,KAAK,CAAC,UAAU,CACd,CAAI,EACJ,eAAgD,EAAE;QAElD,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CACxB,CAAC,EACD,YAI8C,CAC/C,CAAA;QACD,IAAI,CAAC,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAA;QAClE,OAAO,CAAC,CAAA;IACV,CAAC;IAqCD,IAAI,CAAC,CAAI,EAAE,cAA8C,EAAE;QACzD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAA;QACnC,IAAI,CAAC,UAAU,EAAE;YACf,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;SACzD;QACD,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,GAAG,WAAW,CAAA;QACzD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;QAC9B,IAAI,CAAC,YAAY,IAAI,CAAC,KAAK,SAAS;YAAE,OAAO,CAAC,CAAA;QAC9C,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE;YAC1B,OAAO;YACP,OAAO;SAC8B,CAAC,CAAA;QACxC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;QACxB,OAAO,EAAE,CAAA;IACX,CAAC;IAED;;;;;OAKG;IACH,GAAG,CAAC,CAAI,EAAE,aAA4C,EAAE;QACtD,MAAM,EACJ,UAAU,GAAG,IAAI,CAAC,UAAU,EAC5B,cAAc,GAAG,IAAI,CAAC,cAAc,EACpC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,EAC5C,MAAM,GACP,GAAG,UAAU,CAAA;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACjC,IAAI,KAAK,KAAK,SAAS,EAAE;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;YAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAA;YAC/C,IAAI,MAAM;gBAAE,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;YAC1C,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;gBACxB,IAAI,MAAM;oBAAE,MAAM,CAAC,GAAG,GAAG,OAAO,CAAA;gBAChC,mDAAmD;gBACnD,IAAI,CAAC,QAAQ,EAAE;oBACb,IAAI,CAAC,kBAAkB,EAAE;wBACvB,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;qBAC1B;oBACD,IAAI,MAAM,IAAI,UAAU;wBAAE,MAAM,CAAC,aAAa,GAAG,IAAI,CAAA;oBACrD,OAAO,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;iBACtC;qBAAM;oBACL,IACE,MAAM;wBACN,UAAU;wBACV,KAAK,CAAC,oBAAoB,KAAK,SAAS,EACxC;wBACA,MAAM,CAAC,aAAa,GAAG,IAAI,CAAA;qBAC5B;oBACD,OAAO,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC,SAAS,CAAA;iBAC3D;aACF;iBAAM;gBACL,IAAI,MAAM;oBAAE,MAAM,CAAC,GAAG,GAAG,KAAK,CAAA;gBAC9B,gEAAgE;gBAChE,iEAAiE;gBACjE,kEAAkE;gBAClE,oEAAoE;gBACpE,qCAAqC;gBACrC,IAAI,QAAQ,EAAE;oBACZ,OAAO,KAAK,CAAC,oBAAoB,CAAA;iBAClC;gBACD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;gBACvB,IAAI,cAAc,EAAE;oBAClB,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;iBAC3B;gBACD,OAAO,KAAK,CAAA;aACb;SACF;aAAM,IAAI,MAAM,EAAE;YACjB,MAAM,CAAC,GAAG,GAAG,MAAM,CAAA;SACpB;IACH,CAAC;IAED,QAAQ,CAAC,CAAQ,EAAE,CAAQ;QACzB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QACjB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IACnB,CAAC;IAED,WAAW,CAAC,KAAY;QACtB,iCAAiC;QACjC,oCAAoC;QACpC,OAAO;QACP,6DAA6D;QAC7D,0CAA0C;QAC1C,qBAAqB;QACrB,qBAAqB;QACrB,eAAe;QACf,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE;YACxB,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE;gBACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAU,CAAA;aACxC;iBAAM;gBACL,IAAI,CAAC,QAAQ,CACX,IAAI,CAAC,KAAK,CAAC,KAAK,CAAU,EAC1B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAU,CAC3B,CAAA;aACF;YACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;YAChC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;SACnB;IACH,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,CAAI;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IAClC,CAAC;IAED,OAAO,CAAC,CAAI,EAAE,MAA8B;QAC1C,IAAI,OAAO,GAAG,KAAK,CAAA;QACnB,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE;YACpB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACjC,IAAI,KAAK,KAAK,SAAS,EAAE;gBACvB,OAAO,GAAG,IAAI,CAAA;gBACd,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE;oBACpB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;iBACpB;qBAAM;oBACL,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;oBAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;oBAC9B,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE;wBAC9B,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAA;qBAChD;yBAAM,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,gBAAgB,EAAE;wBACpD,IAAI,IAAI,CAAC,WAAW,EAAE;4BACpB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAA;yBACnC;wBACD,IAAI,IAAI,CAAC,gBAAgB,EAAE;4BACzB,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;yBAC1C;qBACF;oBACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;oBACtB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,SAAS,CAAA;oBAChC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,SAAS,CAAA;oBAChC,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE;wBACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAU,CAAA;qBACxC;yBAAM,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE;wBAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAU,CAAA;qBACxC;yBAAM;wBACL,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAW,CAAA;wBACtC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAW,CAAA;wBAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAW,CAAA;wBACtC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAW,CAAA;qBAC7C;oBACD,IAAI,CAAC,KAAK,EAAE,CAAA;oBACZ,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;iBACvB;aACF;SACF;QACD,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE;YACnD,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAA;YACzB,IAAI,IAAmC,CAAA;YACvC,OAAO,CAAC,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;gBAC3B,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,IAAI,CAAC,CAAA;aAC9B;SACF;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC9B,CAAC;IACD,MAAM,CAAC,MAA8B;QACnC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE;YACxD,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;YAC9B,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE;gBAC9B,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAA;aAChD;iBAAM;gBACL,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;gBAC9B,IAAI,IAAI,CAAC,WAAW,EAAE;oBACpB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAM,EAAE,CAAM,EAAE,MAAM,CAAC,CAAA;iBACxC;gBACD,IAAI,IAAI,CAAC,gBAAgB,EAAE;oBACzB,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,CAAM,EAAE,MAAM,CAAC,CAAC,CAAA;iBAC/C;aACF;SACF;QAED,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;QACpB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC7B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC7B,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE;YAC9B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAClB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;SACrB;QACD,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;SACpB;QACD,IAAI,CAAC,KAAK,GAAG,CAAU,CAAA;QACvB,IAAI,CAAC,KAAK,GAAG,CAAU,CAAA;QACvB,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAA;QACrB,IAAI,CAAC,eAAe,GAAG,CAAC,CAAA;QACxB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;QACd,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,SAAS,EAAE;YAC3C,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAA;YACzB,IAAI,IAAmC,CAAA;YACvC,OAAO,CAAC,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;gBAC3B,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,IAAI,CAAC,CAAA;aAC9B;SACF;IACH,CAAC;CACF","sourcesContent":["/**\n * @module LRUCache\n */\n\n// module-private names and types\ntype Perf = { now: () => number }\nconst perf: Perf =\n typeof performance === 'object' &&\n performance &&\n typeof performance.now === 'function'\n ? performance\n : Date\n\nconst warned = new Set()\n\n// either a function or a class\ntype ForC = ((...a: any[]) => any) | { new (...a: any[]): any }\n\n/* c8 ignore start */\nconst PROCESS = (\n typeof process === 'object' && !!process ? process : {}\n) as { [k: string]: any }\n/* c8 ignore start */\n\nconst emitWarning = (\n msg: string,\n type: string,\n code: string,\n fn: ForC\n) => {\n typeof PROCESS.emitWarning === 'function'\n ? PROCESS.emitWarning(msg, type, code, fn)\n : console.error(`[${code}] ${type}: ${msg}`)\n}\n\nlet AC = globalThis.AbortController\nlet AS = globalThis.AbortSignal\n\n/* c8 ignore start */\nif (typeof AC === 'undefined') {\n //@ts-ignore\n AS = class AbortSignal {\n onabort?: (...a: any[]) => any\n _onabort: ((...a: any[]) => any)[] = []\n reason?: any\n aborted: boolean = false\n addEventListener(_: string, fn: (...a: any[]) => any) {\n this._onabort.push(fn)\n }\n }\n //@ts-ignore\n AC = class AbortController {\n constructor() {\n warnACPolyfill()\n }\n signal = new AS()\n abort(reason: any) {\n if (this.signal.aborted) return\n //@ts-ignore\n this.signal.reason = reason\n //@ts-ignore\n this.signal.aborted = true\n //@ts-ignore\n for (const fn of this.signal._onabort) {\n fn(reason)\n }\n this.signal.onabort?.(reason)\n }\n }\n let printACPolyfillWarning =\n PROCESS.env?.LRU_CACHE_IGNORE_AC_WARNING !== '1'\n const warnACPolyfill = () => {\n if (!printACPolyfillWarning) return\n printACPolyfillWarning = false\n emitWarning(\n 'AbortController is not defined. If using lru-cache in ' +\n 'node 14, load an AbortController polyfill from the ' +\n '`node-abort-controller` package. A minimal polyfill is ' +\n 'provided for use by LRUCache.fetch(), but it should not be ' +\n 'relied upon in other contexts (eg, passing it to other APIs that ' +\n 'use AbortController/AbortSignal might have undesirable effects). ' +\n 'You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.',\n 'NO_ABORT_CONTROLLER',\n 'ENOTSUP',\n warnACPolyfill\n )\n }\n}\n/* c8 ignore stop */\n\nconst shouldWarn = (code: string) => !warned.has(code)\n\nconst TYPE = Symbol('type')\nexport type PosInt = number & { [TYPE]: 'Positive Integer' }\nexport type Index = number & { [TYPE]: 'LRUCache Index' }\n\nconst isPosInt = (n: any): n is PosInt =>\n n && n === Math.floor(n) && n > 0 && isFinite(n)\n\nexport type UintArray = Uint8Array | Uint16Array | Uint32Array\nexport type NumberArray = UintArray | number[]\n\n/* c8 ignore start */\n// This is a little bit ridiculous, tbh.\n// The maximum array length is 2^32-1 or thereabouts on most JS impls.\n// And well before that point, you're caching the entire world, I mean,\n// that's ~32GB of just integers for the next/prev links, plus whatever\n// else to hold that many keys and values. Just filling the memory with\n// zeroes at init time is brutal when you get that big.\n// But why not be complete?\n// Maybe in the future, these limits will have expanded.\nconst getUintArray = (max: number) =>\n !isPosInt(max)\n ? null\n : max <= Math.pow(2, 8)\n ? Uint8Array\n : max <= Math.pow(2, 16)\n ? Uint16Array\n : max <= Math.pow(2, 32)\n ? Uint32Array\n : max <= Number.MAX_SAFE_INTEGER\n ? ZeroArray\n : null\n/* c8 ignore stop */\n\nclass ZeroArray extends Array {\n constructor(size: number) {\n super(size)\n this.fill(0)\n }\n}\nexport type { ZeroArray }\nexport type { Stack }\n\nexport type StackLike = Stack | Index[]\nclass Stack {\n heap: NumberArray\n length: number\n // private constructor\n static #constructing: boolean = false\n static create(max: number): StackLike {\n const HeapCls = getUintArray(max)\n if (!HeapCls) return []\n Stack.#constructing = true\n const s = new Stack(max, HeapCls)\n Stack.#constructing = false\n return s\n }\n constructor(\n max: number,\n HeapCls: { new (n: number): NumberArray }\n ) {\n /* c8 ignore start */\n if (!Stack.#constructing) {\n throw new TypeError('instantiate Stack using Stack.create(n)')\n }\n /* c8 ignore stop */\n this.heap = new HeapCls(max)\n this.length = 0\n }\n push(n: Index) {\n this.heap[this.length++] = n\n }\n pop(): Index {\n return this.heap[--this.length] as Index\n }\n}\n\n/**\n * Promise representing an in-progress {@link LRUCache#fetch} call\n */\nexport type BackgroundFetch = Promise & {\n __returned: BackgroundFetch | undefined\n __abortController: AbortController\n __staleWhileFetching: V | undefined\n}\n\nexport type DisposeTask = [\n value: V,\n key: K,\n reason: LRUCache.DisposeReason\n]\n\nexport namespace LRUCache {\n /**\n * An integer greater than 0, reflecting the calculated size of items\n */\n export type Size = number\n\n /**\n * Integer greater than 0, representing some number of milliseconds, or the\n * time at which a TTL started counting from.\n */\n export type Milliseconds = number\n\n /**\n * An integer greater than 0, reflecting a number of items\n */\n export type Count = number\n\n /**\n * The reason why an item was removed from the cache, passed\n * to the {@link Disposer} methods.\n *\n * - `evict`: The item was evicted because it is the least recently used,\n * and the cache is full.\n * - `set`: A new value was set, overwriting the old value being disposed.\n * - `delete`: The item was explicitly deleted, either by calling\n * {@link LRUCache#delete}, {@link LRUCache#clear}, or\n * {@link LRUCache#set} with an undefined value.\n * - `expire`: The item was removed due to exceeding its TTL.\n * - `fetch`: A {@link OptionsBase#fetchMethod} operation returned\n * `undefined` or was aborted, causing the item to be deleted.\n */\n export type DisposeReason =\n | 'evict'\n | 'set'\n | 'delete'\n | 'expire'\n | 'fetch'\n /**\n * A method called upon item removal, passed as the\n * {@link OptionsBase.dispose} and/or\n * {@link OptionsBase.disposeAfter} options.\n */\n export type Disposer = (\n value: V,\n key: K,\n reason: DisposeReason\n ) => void\n\n /**\n * A function that returns the effective calculated size\n * of an entry in the cache.\n */\n export type SizeCalculator = (value: V, key: K) => Size\n\n /**\n * Options provided to the\n * {@link OptionsBase.fetchMethod} function.\n */\n export interface FetcherOptions {\n signal: AbortSignal\n options: FetcherFetchOptions\n /**\n * Object provided in the {@link FetchOptions.context} option to\n * {@link LRUCache#fetch}\n */\n context: FC\n }\n\n /**\n * Occasionally, it may be useful to track the internal behavior of the\n * cache, particularly for logging, debugging, or for behavior within the\n * `fetchMethod`. To do this, you can pass a `status` object to the\n * {@link LRUCache#fetch}, {@link LRUCache#get}, {@link LRUCache#set},\n * {@link LRUCache#memo}, and {@link LRUCache#has} methods.\n *\n * The `status` option should be a plain JavaScript object. The following\n * fields will be set on it appropriately, depending on the situation.\n */\n export interface Status {\n /**\n * The status of a set() operation.\n *\n * - add: the item was not found in the cache, and was added\n * - update: the item was in the cache, with the same value provided\n * - replace: the item was in the cache, and replaced\n * - miss: the item was not added to the cache for some reason\n */\n set?: 'add' | 'update' | 'replace' | 'miss'\n\n /**\n * the ttl stored for the item, or undefined if ttls are not used.\n */\n ttl?: Milliseconds\n\n /**\n * the start time for the item, or undefined if ttls are not used.\n */\n start?: Milliseconds\n\n /**\n * The timestamp used for TTL calculation\n */\n now?: Milliseconds\n\n /**\n * the remaining ttl for the item, or undefined if ttls are not used.\n */\n remainingTTL?: Milliseconds\n\n /**\n * The calculated size for the item, if sizes are used.\n */\n entrySize?: Size\n\n /**\n * The total calculated size of the cache, if sizes are used.\n */\n totalCalculatedSize?: Size\n\n /**\n * A flag indicating that the item was not stored, due to exceeding the\n * {@link OptionsBase.maxEntrySize}\n */\n maxEntrySizeExceeded?: true\n\n /**\n * The old value, specified in the case of `set:'update'` or\n * `set:'replace'`\n */\n oldValue?: V\n\n /**\n * The results of a {@link LRUCache#has} operation\n *\n * - hit: the item was found in the cache\n * - stale: the item was found in the cache, but is stale\n * - miss: the item was not found in the cache\n */\n has?: 'hit' | 'stale' | 'miss'\n\n /**\n * The status of a {@link LRUCache#fetch} operation.\n * Note that this can change as the underlying fetch() moves through\n * various states.\n *\n * - inflight: there is another fetch() for this key which is in process\n * - get: there is no {@link OptionsBase.fetchMethod}, so\n * {@link LRUCache#get} was called.\n * - miss: the item is not in cache, and will be fetched.\n * - hit: the item is in the cache, and was resolved immediately.\n * - stale: the item is in the cache, but stale.\n * - refresh: the item is in the cache, and not stale, but\n * {@link FetchOptions.forceRefresh} was specified.\n */\n fetch?: 'get' | 'inflight' | 'miss' | 'hit' | 'stale' | 'refresh'\n\n /**\n * The {@link OptionsBase.fetchMethod} was called\n */\n fetchDispatched?: true\n\n /**\n * The cached value was updated after a successful call to\n * {@link OptionsBase.fetchMethod}\n */\n fetchUpdated?: true\n\n /**\n * The reason for a fetch() rejection. Either the error raised by the\n * {@link OptionsBase.fetchMethod}, or the reason for an\n * AbortSignal.\n */\n fetchError?: Error\n\n /**\n * The fetch received an abort signal\n */\n fetchAborted?: true\n\n /**\n * The abort signal received was ignored, and the fetch was allowed to\n * continue.\n */\n fetchAbortIgnored?: true\n\n /**\n * The fetchMethod promise resolved successfully\n */\n fetchResolved?: true\n\n /**\n * The fetchMethod promise was rejected\n */\n fetchRejected?: true\n\n /**\n * The status of a {@link LRUCache#get} operation.\n *\n * - fetching: The item is currently being fetched. If a previous value\n * is present and allowed, that will be returned.\n * - stale: The item is in the cache, and is stale.\n * - hit: the item is in the cache\n * - miss: the item is not in the cache\n */\n get?: 'stale' | 'hit' | 'miss'\n\n /**\n * A fetch or get operation returned a stale value.\n */\n returnedStale?: true\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#fetch}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link OptionsBase.noDeleteOnFetchRejection},\n * {@link OptionsBase.allowStaleOnFetchRejection},\n * {@link FetchOptions.forceRefresh}, and\n * {@link FetcherOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.fetchMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the fetchMethod is called.\n */\n export interface FetcherFetchOptions\n extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n status?: Status\n size?: Size\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#fetch} method.\n */\n export interface FetchOptions\n extends FetcherFetchOptions {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.fetchMethod} as\n * the {@link FetcherOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n signal?: AbortSignal\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface FetchOptionsWithContext\n extends FetchOptions {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is\n * `undefined` or `void`\n */\n export interface FetchOptionsNoContext\n extends FetchOptions {\n context?: undefined\n }\n\n export interface MemoOptions\n extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.memoMethod} as\n * the {@link MemoizerOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface MemoOptionsWithContext\n extends MemoOptions {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is\n * `undefined` or `void`\n */\n export interface MemoOptionsNoContext\n extends MemoOptions {\n context?: undefined\n }\n\n /**\n * Options provided to the\n * {@link OptionsBase.memoMethod} function.\n */\n export interface MemoizerOptions {\n options: MemoizerMemoOptions\n /**\n * Object provided in the {@link MemoOptions.context} option to\n * {@link LRUCache#memo}\n */\n context: FC\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#memo}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link MemoOptions.forceRefresh}, and\n * {@link MemoerOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.memoMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the memoMethod is called.\n */\n export interface MemoizerMemoOptions\n extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n > {\n status?: Status\n size?: Size\n start?: Milliseconds\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#has} method.\n */\n export interface HasOptions\n extends Pick, 'updateAgeOnHas'> {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#get} method.\n */\n export interface GetOptions\n extends Pick<\n OptionsBase,\n 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#peek} method.\n */\n export interface PeekOptions\n extends Pick, 'allowStale'> {}\n\n /**\n * Options that may be passed to the {@link LRUCache#set} method.\n */\n export interface SetOptions\n extends Pick<\n OptionsBase,\n 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'\n > {\n /**\n * If size tracking is enabled, then setting an explicit size\n * in the {@link LRUCache#set} call will prevent calling the\n * {@link OptionsBase.sizeCalculation} function.\n */\n size?: Size\n /**\n * If TTL tracking is enabled, then setting an explicit start\n * time in the {@link LRUCache#set} call will override the\n * default time from `performance.now()` or `Date.now()`.\n *\n * Note that it must be a valid value for whichever time-tracking\n * method is in use.\n */\n start?: Milliseconds\n status?: Status\n }\n\n /**\n * The type signature for the {@link OptionsBase.fetchMethod} option.\n */\n export type Fetcher = (\n key: K,\n staleValue: V | undefined,\n options: FetcherOptions\n ) => Promise | V | undefined | void\n\n /**\n * the type signature for the {@link OptionsBase.memoMethod} option.\n */\n export type Memoizer = (\n key: K,\n staleValue: V | undefined,\n options: MemoizerOptions\n ) => V\n\n /**\n * Options which may be passed to the {@link LRUCache} constructor.\n *\n * Most of these may be overridden in the various options that use\n * them.\n *\n * Despite all being technically optional, the constructor requires that\n * a cache is at minimum limited by one or more of {@link OptionsBase.max},\n * {@link OptionsBase.ttl}, or {@link OptionsBase.maxSize}.\n *\n * If {@link OptionsBase.ttl} is used alone, then it is strongly advised\n * (and in fact required by the type definitions here) that the cache\n * also set {@link OptionsBase.ttlAutopurge}, to prevent potentially\n * unbounded storage.\n *\n * All options are also available on the {@link LRUCache} instance, making\n * it safe to pass an LRUCache instance as the options argumemnt to\n * make another empty cache of the same type.\n *\n * Some options are marked as read-only, because changing them after\n * instantiation is not safe. Changing any of the other options will of\n * course only have an effect on subsequent method calls.\n */\n export interface OptionsBase {\n /**\n * The maximum number of items to store in the cache before evicting\n * old entries. This is read-only on the {@link LRUCache} instance,\n * and may not be overridden.\n *\n * If set, then storage space will be pre-allocated at construction\n * time, and the cache will perform significantly faster.\n *\n * Note that significantly fewer items may be stored, if\n * {@link OptionsBase.maxSize} and/or {@link OptionsBase.ttl} are also\n * set.\n *\n * **It is strongly recommended to set a `max` to prevent unbounded growth\n * of the cache.**\n */\n max?: Count\n\n /**\n * Max time in milliseconds for items to live in cache before they are\n * considered stale. Note that stale items are NOT preemptively removed by\n * default, and MAY live in the cache, contributing to its LRU max, long\n * after they have expired, unless {@link OptionsBase.ttlAutopurge} is\n * set.\n *\n * If set to `0` (the default value), then that means \"do not track\n * TTL\", not \"expire immediately\".\n *\n * Also, as this cache is optimized for LRU/MRU operations, some of\n * the staleness/TTL checks will reduce performance, as they will incur\n * overhead by deleting items.\n *\n * This is not primarily a TTL cache, and does not make strong TTL\n * guarantees. There is no pre-emptive pruning of expired items, but you\n * _may_ set a TTL on the cache, and it will treat expired items as missing\n * when they are fetched, and delete them.\n *\n * Optional, but must be a non-negative integer in ms if specified.\n *\n * This may be overridden by passing an options object to `cache.set()`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if ttl tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * If ttl tracking is enabled, and `max` and `maxSize` are not set,\n * and `ttlAutopurge` is not set, then a warning will be emitted\n * cautioning about the potential for unbounded memory consumption.\n * (The TypeScript definitions will also discourage this.)\n */\n ttl?: Milliseconds\n\n /**\n * Minimum amount of time in ms in which to check for staleness.\n * Defaults to 1, which means that the current time is checked\n * at most once per millisecond.\n *\n * Set to 0 to check the current time every time staleness is tested.\n * (This reduces performance, and is theoretically unnecessary.)\n *\n * Setting this to a higher value will improve performance somewhat\n * while using ttl tracking, albeit at the expense of keeping stale\n * items around a bit longer than their TTLs would indicate.\n *\n * @default 1\n */\n ttlResolution?: Milliseconds\n\n /**\n * Preemptively remove stale items from the cache.\n *\n * Note that this may *significantly* degrade performance, especially if\n * the cache is storing a large number of items. It is almost always best\n * to just leave the stale items in the cache, and let them fall out as new\n * items are added.\n *\n * Note that this means that {@link OptionsBase.allowStale} is a bit\n * pointless, as stale items will be deleted almost as soon as they\n * expire.\n *\n * Use with caution!\n */\n ttlAutopurge?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever it is retrieved from cache with\n * {@link LRUCache#get}, causing it to not expire. (It can still fall out\n * of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n */\n updateAgeOnGet?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever its presence in the cache is\n * checked with {@link LRUCache#has}, causing it to not expire. (It can\n * still fall out of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n */\n updateAgeOnHas?: boolean\n\n /**\n * Allow {@link LRUCache#get} and {@link LRUCache#fetch} calls to return\n * stale data, if available.\n *\n * By default, if you set `ttl`, stale items will only be deleted from the\n * cache when you `get(key)`. That is, it's not preemptively pruning items,\n * unless {@link OptionsBase.ttlAutopurge} is set.\n *\n * If you set `allowStale:true`, it'll return the stale value *as well as*\n * deleting it. If you don't set this, then it'll return `undefined` when\n * you try to get a stale entry.\n *\n * Note that when a stale entry is fetched, _even if it is returned due to\n * `allowStale` being set_, it is removed from the cache immediately. You\n * can suppress this behavior by setting\n * {@link OptionsBase.noDeleteOnStaleGet}, either in the constructor, or in\n * the options provided to {@link LRUCache#get}.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n * The `cache.has()` method will always return `false` for stale items.\n *\n * Only relevant if a ttl is set.\n */\n allowStale?: boolean\n\n /**\n * Function that is called on items when they are dropped from the\n * cache, as `dispose(value, key, reason)`.\n *\n * This can be handy if you want to close file descriptors or do\n * other cleanup tasks when items are no longer stored in the cache.\n *\n * **NOTE**: It is called _before_ the item has been fully removed\n * from the cache, so if you want to put it right back in, you need\n * to wait until the next tick. If you try to add it back in during\n * the `dispose()` function call, it will break things in subtle and\n * weird ways.\n *\n * Unlike several other options, this may _not_ be overridden by\n * passing an option to `set()`, for performance reasons.\n *\n * The `reason` will be one of the following strings, corresponding\n * to the reason for the item's deletion:\n *\n * - `evict` Item was evicted to make space for a new addition\n * - `set` Item was overwritten by a new value\n * - `expire` Item expired its TTL\n * - `fetch` Item was deleted due to a failed or aborted fetch, or a\n * fetchMethod returning `undefined.\n * - `delete` Item was removed by explicit `cache.delete(key)`,\n * `cache.clear()`, or `cache.set(key, undefined)`.\n */\n dispose?: Disposer\n\n /**\n * The same as {@link OptionsBase.dispose}, but called *after* the entry\n * is completely removed and the cache is once again in a clean state.\n *\n * It is safe to add an item right back into the cache at this point.\n * However, note that it is *very* easy to inadvertently create infinite\n * recursion this way.\n */\n disposeAfter?: Disposer\n\n /**\n * Set to true to suppress calling the\n * {@link OptionsBase.dispose} function if the entry key is\n * still accessible within the cache.\n *\n * This may be overridden by passing an options object to\n * {@link LRUCache#set}.\n *\n * Only relevant if `dispose` or `disposeAfter` are set.\n */\n noDisposeOnSet?: boolean\n\n /**\n * Boolean flag to tell the cache to not update the TTL when setting a new\n * value for an existing key (ie, when updating a value rather than\n * inserting a new value). Note that the TTL value is _always_ set (if\n * provided) when adding a new entry into the cache.\n *\n * Has no effect if a {@link OptionsBase.ttl} is not set.\n *\n * May be passed as an option to {@link LRUCache#set}.\n */\n noUpdateTTL?: boolean\n\n /**\n * Set to a positive integer to track the sizes of items added to the\n * cache, and automatically evict items in order to stay below this size.\n * Note that this may result in fewer than `max` items being stored.\n *\n * Attempting to add an item to the cache whose calculated size is greater\n * that this amount will be a no-op. The item will not be cached, and no\n * other items will be evicted.\n *\n * Optional, must be a positive integer if provided.\n *\n * Sets `maxEntrySize` to the same value, unless a different value is\n * provided for `maxEntrySize`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if size tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * Note also that size tracking can negatively impact performance,\n * though for most cases, only minimally.\n */\n maxSize?: Size\n\n /**\n * The maximum allowed size for any single item in the cache.\n *\n * If a larger item is passed to {@link LRUCache#set} or returned by a\n * {@link OptionsBase.fetchMethod} or {@link OptionsBase.memoMethod}, then\n * it will not be stored in the cache.\n *\n * Attempting to add an item whose calculated size is greater than\n * this amount will not cache the item or evict any old items, but\n * WILL delete an existing value if one is already present.\n *\n * Optional, must be a positive integer if provided. Defaults to\n * the value of `maxSize` if provided.\n */\n maxEntrySize?: Size\n\n /**\n * A function that returns a number indicating the item's size.\n *\n * Requires {@link OptionsBase.maxSize} to be set.\n *\n * If not provided, and {@link OptionsBase.maxSize} or\n * {@link OptionsBase.maxEntrySize} are set, then all\n * {@link LRUCache#set} calls **must** provide an explicit\n * {@link SetOptions.size} or sizeCalculation param.\n */\n sizeCalculation?: SizeCalculator\n\n /**\n * Method that provides the implementation for {@link LRUCache#fetch}\n *\n * ```ts\n * fetchMethod(key, staleValue, { signal, options, context })\n * ```\n *\n * If `fetchMethod` is not provided, then `cache.fetch(key)` is equivalent\n * to `Promise.resolve(cache.get(key))`.\n *\n * If at any time, `signal.aborted` is set to `true`, or if the\n * `signal.onabort` method is called, or if it emits an `'abort'` event\n * which you can listen to with `addEventListener`, then that means that\n * the fetch should be abandoned. This may be passed along to async\n * functions aware of AbortController/AbortSignal behavior.\n *\n * The `fetchMethod` should **only** return `undefined` or a Promise\n * resolving to `undefined` if the AbortController signaled an `abort`\n * event. In all other cases, it should return or resolve to a value\n * suitable for adding to the cache.\n *\n * The `options` object is a union of the options that may be provided to\n * `set()` and `get()`. If they are modified, then that will result in\n * modifying the settings to `cache.set()` when the value is resolved, and\n * in the case of\n * {@link OptionsBase.noDeleteOnFetchRejection} and\n * {@link OptionsBase.allowStaleOnFetchRejection}, the handling of\n * `fetchMethod` failures.\n *\n * For example, a DNS cache may update the TTL based on the value returned\n * from a remote DNS server by changing `options.ttl` in the `fetchMethod`.\n */\n fetchMethod?: Fetcher\n\n /**\n * Method that provides the implementation for {@link LRUCache#memo}\n */\n memoMethod?: Memoizer\n\n /**\n * Set to true to suppress the deletion of stale data when a\n * {@link OptionsBase.fetchMethod} returns a rejected promise.\n */\n noDeleteOnFetchRejection?: boolean\n\n /**\n * Do not delete stale items when they are retrieved with\n * {@link LRUCache#get}.\n *\n * Note that the `get` return value will still be `undefined`\n * unless {@link OptionsBase.allowStale} is true.\n *\n * When using time-expiring entries with `ttl`, by default stale\n * items will be removed from the cache when the key is accessed\n * with `cache.get()`.\n *\n * Setting this option will cause stale items to remain in the cache, until\n * they are explicitly deleted with `cache.delete(key)`, or retrieved with\n * `noDeleteOnStaleGet` set to `false`.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n *\n * Only relevant if a ttl is used.\n */\n noDeleteOnStaleGet?: boolean\n\n /**\n * Set to true to allow returning stale data when a\n * {@link OptionsBase.fetchMethod} throws an error or returns a rejected\n * promise.\n *\n * This differs from using {@link OptionsBase.allowStale} in that stale\n * data will ONLY be returned in the case that the {@link LRUCache#fetch}\n * fails, not any other times.\n *\n * If a `fetchMethod` fails, and there is no stale value available, the\n * `fetch()` will resolve to `undefined`. Ie, all `fetchMethod` errors are\n * suppressed.\n *\n * Implies `noDeleteOnFetchRejection`.\n *\n * This may be set in calls to `fetch()`, or defaulted on the constructor,\n * or overridden by modifying the options object in the `fetchMethod`.\n */\n allowStaleOnFetchRejection?: boolean\n\n /**\n * Set to true to return a stale value from the cache when the\n * `AbortSignal` passed to the {@link OptionsBase.fetchMethod} dispatches\n * an `'abort'` event, whether user-triggered, or due to internal cache\n * behavior.\n *\n * Unless {@link OptionsBase.ignoreFetchAbort} is also set, the underlying\n * {@link OptionsBase.fetchMethod} will still be considered canceled, and\n * any value it returns will be ignored and not cached.\n *\n * Caveat: since fetches are aborted when a new value is explicitly\n * set in the cache, this can lead to fetch returning a stale value,\n * since that was the fallback value _at the moment the `fetch()` was\n * initiated_, even though the new updated value is now present in\n * the cache.\n *\n * For example:\n *\n * ```ts\n * const cache = new LRUCache({\n * ttl: 100,\n * fetchMethod: async (url, oldValue, { signal }) => {\n * const res = await fetch(url, { signal })\n * return await res.json()\n * }\n * })\n * cache.set('https://example.com/', { some: 'data' })\n * // 100ms go by...\n * const result = cache.fetch('https://example.com/')\n * cache.set('https://example.com/', { other: 'thing' })\n * console.log(await result) // { some: 'data' }\n * console.log(cache.get('https://example.com/')) // { other: 'thing' }\n * ```\n */\n allowStaleOnFetchAbort?: boolean\n\n /**\n * Set to true to ignore the `abort` event emitted by the `AbortSignal`\n * object passed to {@link OptionsBase.fetchMethod}, and still cache the\n * resulting resolution value, as long as it is not `undefined`.\n *\n * When used on its own, this means aborted {@link LRUCache#fetch} calls\n * are not immediately resolved or rejected when they are aborted, and\n * instead take the full time to await.\n *\n * When used with {@link OptionsBase.allowStaleOnFetchAbort}, aborted\n * {@link LRUCache#fetch} calls will resolve immediately to their stale\n * cached value or `undefined`, and will continue to process and eventually\n * update the cache when they resolve, as long as the resulting value is\n * not `undefined`, thus supporting a \"return stale on timeout while\n * refreshing\" mechanism by passing `AbortSignal.timeout(n)` as the signal.\n *\n * For example:\n *\n * ```ts\n * const c = new LRUCache({\n * ttl: 100,\n * ignoreFetchAbort: true,\n * allowStaleOnFetchAbort: true,\n * fetchMethod: async (key, oldValue, { signal }) => {\n * // note: do NOT pass the signal to fetch()!\n * // let's say this fetch can take a long time.\n * const res = await fetch(`https://slow-backend-server/${key}`)\n * return await res.json()\n * },\n * })\n *\n * // this will return the stale value after 100ms, while still\n * // updating in the background for next time.\n * const val = await c.fetch('key', { signal: AbortSignal.timeout(100) })\n * ```\n *\n * **Note**: regardless of this setting, an `abort` event _is still\n * emitted on the `AbortSignal` object_, so may result in invalid results\n * when passed to other underlying APIs that use AbortSignals.\n *\n * This may be overridden in the {@link OptionsBase.fetchMethod} or the\n * call to {@link LRUCache#fetch}.\n */\n ignoreFetchAbort?: boolean\n }\n\n export interface OptionsMaxLimit\n extends OptionsBase {\n max: Count\n }\n export interface OptionsTTLLimit\n extends OptionsBase {\n ttl: Milliseconds\n ttlAutopurge: boolean\n }\n export interface OptionsSizeLimit\n extends OptionsBase {\n maxSize: Size\n }\n\n /**\n * The valid safe options for the {@link LRUCache} constructor\n */\n export type Options =\n | OptionsMaxLimit\n | OptionsSizeLimit\n | OptionsTTLLimit\n\n /**\n * Entry objects used by {@link LRUCache#load} and {@link LRUCache#dump},\n * and returned by {@link LRUCache#info}.\n */\n export interface Entry {\n value: V\n ttl?: Milliseconds\n size?: Size\n start?: Milliseconds\n }\n}\n\n/**\n * Default export, the thing you're using this module to get.\n *\n * The `K` and `V` types define the key and value types, respectively. The\n * optional `FC` type defines the type of the `context` object passed to\n * `cache.fetch()` and `cache.memo()`.\n *\n * Keys and values **must not** be `null` or `undefined`.\n *\n * All properties from the options object (with the exception of `max`,\n * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are\n * added as normal public members. (The listed options are read-only getters.)\n *\n * Changing any of these will alter the defaults for subsequent method calls.\n */\nexport class LRUCache\n implements Map\n{\n // options that cannot be changed without disaster\n readonly #max: LRUCache.Count\n readonly #maxSize: LRUCache.Size\n readonly #dispose?: LRUCache.Disposer\n readonly #disposeAfter?: LRUCache.Disposer\n readonly #fetchMethod?: LRUCache.Fetcher\n readonly #memoMethod?: LRUCache.Memoizer\n\n /**\n * {@link LRUCache.OptionsBase.ttl}\n */\n ttl: LRUCache.Milliseconds\n\n /**\n * {@link LRUCache.OptionsBase.ttlResolution}\n */\n ttlResolution: LRUCache.Milliseconds\n /**\n * {@link LRUCache.OptionsBase.ttlAutopurge}\n */\n ttlAutopurge: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnGet}\n */\n updateAgeOnGet: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnHas}\n */\n updateAgeOnHas: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStale}\n */\n allowStale: boolean\n\n /**\n * {@link LRUCache.OptionsBase.noDisposeOnSet}\n */\n noDisposeOnSet: boolean\n /**\n * {@link LRUCache.OptionsBase.noUpdateTTL}\n */\n noUpdateTTL: boolean\n /**\n * {@link LRUCache.OptionsBase.maxEntrySize}\n */\n maxEntrySize: LRUCache.Size\n /**\n * {@link LRUCache.OptionsBase.sizeCalculation}\n */\n sizeCalculation?: LRUCache.SizeCalculator\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection}\n */\n noDeleteOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnStaleGet}\n */\n noDeleteOnStaleGet: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}\n */\n allowStaleOnFetchAbort: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection}\n */\n allowStaleOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.ignoreFetchAbort}\n */\n ignoreFetchAbort: boolean\n\n // computed properties\n #size: LRUCache.Count\n #calculatedSize: LRUCache.Size\n #keyMap: Map\n #keyList: (K | undefined)[]\n #valList: (V | BackgroundFetch | undefined)[]\n #next: NumberArray\n #prev: NumberArray\n #head: Index\n #tail: Index\n #free: StackLike\n #disposed?: DisposeTask[]\n #sizes?: ZeroArray\n #starts?: ZeroArray\n #ttls?: ZeroArray\n\n #hasDispose: boolean\n #hasFetchMethod: boolean\n #hasDisposeAfter: boolean\n\n /**\n * Do not call this method unless you need to inspect the\n * inner workings of the cache. If anything returned by this\n * object is modified in any way, strange breakage may occur.\n *\n * These fields are private for a reason!\n *\n * @internal\n */\n static unsafeExposeInternals<\n K extends {},\n V extends {},\n FC extends unknown = unknown\n >(c: LRUCache) {\n return {\n // properties\n starts: c.#starts,\n ttls: c.#ttls,\n sizes: c.#sizes,\n keyMap: c.#keyMap as Map,\n keyList: c.#keyList,\n valList: c.#valList,\n next: c.#next,\n prev: c.#prev,\n get head() {\n return c.#head\n },\n get tail() {\n return c.#tail\n },\n free: c.#free,\n // methods\n isBackgroundFetch: (p: any) => c.#isBackgroundFetch(p),\n backgroundFetch: (\n k: K,\n index: number | undefined,\n options: LRUCache.FetchOptions,\n context: any\n ): BackgroundFetch =>\n c.#backgroundFetch(\n k,\n index as Index | undefined,\n options,\n context\n ),\n moveToTail: (index: number): void =>\n c.#moveToTail(index as Index),\n indexes: (options?: { allowStale: boolean }) =>\n c.#indexes(options),\n rindexes: (options?: { allowStale: boolean }) =>\n c.#rindexes(options),\n isStale: (index: number | undefined) =>\n c.#isStale(index as Index),\n }\n }\n\n // Protected read-only members\n\n /**\n * {@link LRUCache.OptionsBase.max} (read-only)\n */\n get max(): LRUCache.Count {\n return this.#max\n }\n /**\n * {@link LRUCache.OptionsBase.maxSize} (read-only)\n */\n get maxSize(): LRUCache.Count {\n return this.#maxSize\n }\n /**\n * The total computed size of items in the cache (read-only)\n */\n get calculatedSize(): LRUCache.Size {\n return this.#calculatedSize\n }\n /**\n * The number of items stored in the cache (read-only)\n */\n get size(): LRUCache.Count {\n return this.#size\n }\n /**\n * {@link LRUCache.OptionsBase.fetchMethod} (read-only)\n */\n get fetchMethod(): LRUCache.Fetcher | undefined {\n return this.#fetchMethod\n }\n get memoMethod(): LRUCache.Memoizer | undefined {\n return this.#memoMethod\n }\n /**\n * {@link LRUCache.OptionsBase.dispose} (read-only)\n */\n get dispose() {\n return this.#dispose\n }\n /**\n * {@link LRUCache.OptionsBase.disposeAfter} (read-only)\n */\n get disposeAfter() {\n return this.#disposeAfter\n }\n\n constructor(\n options: LRUCache.Options | LRUCache\n ) {\n const {\n max = 0,\n ttl,\n ttlResolution = 1,\n ttlAutopurge,\n updateAgeOnGet,\n updateAgeOnHas,\n allowStale,\n dispose,\n disposeAfter,\n noDisposeOnSet,\n noUpdateTTL,\n maxSize = 0,\n maxEntrySize = 0,\n sizeCalculation,\n fetchMethod,\n memoMethod,\n noDeleteOnFetchRejection,\n noDeleteOnStaleGet,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n } = options\n\n if (max !== 0 && !isPosInt(max)) {\n throw new TypeError('max option must be a nonnegative integer')\n }\n\n const UintArray = max ? getUintArray(max) : Array\n if (!UintArray) {\n throw new Error('invalid max value: ' + max)\n }\n\n this.#max = max\n this.#maxSize = maxSize\n this.maxEntrySize = maxEntrySize || this.#maxSize\n this.sizeCalculation = sizeCalculation\n if (this.sizeCalculation) {\n if (!this.#maxSize && !this.maxEntrySize) {\n throw new TypeError(\n 'cannot set sizeCalculation without setting maxSize or maxEntrySize'\n )\n }\n if (typeof this.sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation set to non-function')\n }\n }\n\n if (\n memoMethod !== undefined &&\n typeof memoMethod !== 'function'\n ) {\n throw new TypeError('memoMethod must be a function if defined')\n }\n this.#memoMethod = memoMethod\n\n if (\n fetchMethod !== undefined &&\n typeof fetchMethod !== 'function'\n ) {\n throw new TypeError(\n 'fetchMethod must be a function if specified'\n )\n }\n this.#fetchMethod = fetchMethod\n this.#hasFetchMethod = !!fetchMethod\n\n this.#keyMap = new Map()\n this.#keyList = new Array(max).fill(undefined)\n this.#valList = new Array(max).fill(undefined)\n this.#next = new UintArray(max)\n this.#prev = new UintArray(max)\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free = Stack.create(max)\n this.#size = 0\n this.#calculatedSize = 0\n\n if (typeof dispose === 'function') {\n this.#dispose = dispose\n }\n if (typeof disposeAfter === 'function') {\n this.#disposeAfter = disposeAfter\n this.#disposed = []\n } else {\n this.#disposeAfter = undefined\n this.#disposed = undefined\n }\n this.#hasDispose = !!this.#dispose\n this.#hasDisposeAfter = !!this.#disposeAfter\n\n this.noDisposeOnSet = !!noDisposeOnSet\n this.noUpdateTTL = !!noUpdateTTL\n this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection\n this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection\n this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort\n this.ignoreFetchAbort = !!ignoreFetchAbort\n\n // NB: maxEntrySize is set to maxSize if it's set\n if (this.maxEntrySize !== 0) {\n if (this.#maxSize !== 0) {\n if (!isPosInt(this.#maxSize)) {\n throw new TypeError(\n 'maxSize must be a positive integer if specified'\n )\n }\n }\n if (!isPosInt(this.maxEntrySize)) {\n throw new TypeError(\n 'maxEntrySize must be a positive integer if specified'\n )\n }\n this.#initializeSizeTracking()\n }\n\n this.allowStale = !!allowStale\n this.noDeleteOnStaleGet = !!noDeleteOnStaleGet\n this.updateAgeOnGet = !!updateAgeOnGet\n this.updateAgeOnHas = !!updateAgeOnHas\n this.ttlResolution =\n isPosInt(ttlResolution) || ttlResolution === 0\n ? ttlResolution\n : 1\n this.ttlAutopurge = !!ttlAutopurge\n this.ttl = ttl || 0\n if (this.ttl) {\n if (!isPosInt(this.ttl)) {\n throw new TypeError(\n 'ttl must be a positive integer if specified'\n )\n }\n this.#initializeTTLTracking()\n }\n\n // do not allow completely unbounded caches\n if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) {\n throw new TypeError(\n 'At least one of max, maxSize, or ttl is required'\n )\n }\n if (!this.ttlAutopurge && !this.#max && !this.#maxSize) {\n const code = 'LRU_CACHE_UNBOUNDED'\n if (shouldWarn(code)) {\n warned.add(code)\n const msg =\n 'TTL caching without ttlAutopurge, max, or maxSize can ' +\n 'result in unbounded memory consumption.'\n emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache)\n }\n }\n }\n\n /**\n * Return the number of ms left in the item's TTL. If item is not in cache,\n * returns `0`. Returns `Infinity` if item is in cache without a defined TTL.\n */\n getRemainingTTL(key: K) {\n return this.#keyMap.has(key) ? Infinity : 0\n }\n\n #initializeTTLTracking() {\n const ttls = new ZeroArray(this.#max)\n const starts = new ZeroArray(this.#max)\n this.#ttls = ttls\n this.#starts = starts\n\n this.#setItemTTL = (index, ttl, start = perf.now()) => {\n starts[index] = ttl !== 0 ? start : 0\n ttls[index] = ttl\n if (ttl !== 0 && this.ttlAutopurge) {\n const t = setTimeout(() => {\n if (this.#isStale(index)) {\n this.#delete(this.#keyList[index] as K, 'expire')\n }\n }, ttl + 1)\n // unref() not supported on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n }\n }\n\n this.#updateItemAge = index => {\n starts[index] = ttls[index] !== 0 ? perf.now() : 0\n }\n\n this.#statusTTL = (status, index) => {\n if (ttls[index]) {\n const ttl = ttls[index]\n const start = starts[index]\n /* c8 ignore next */\n if (!ttl || !start) return\n status.ttl = ttl\n status.start = start\n status.now = cachedNow || getNow()\n const age = status.now - start\n status.remainingTTL = ttl - age\n }\n }\n\n // debounce calls to perf.now() to 1s so we're not hitting\n // that costly call repeatedly.\n let cachedNow = 0\n const getNow = () => {\n const n = perf.now()\n if (this.ttlResolution > 0) {\n cachedNow = n\n const t = setTimeout(\n () => (cachedNow = 0),\n this.ttlResolution\n )\n // not available on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n }\n return n\n }\n\n this.getRemainingTTL = key => {\n const index = this.#keyMap.get(key)\n if (index === undefined) {\n return 0\n }\n const ttl = ttls[index]\n const start = starts[index]\n if (!ttl || !start) {\n return Infinity\n }\n const age = (cachedNow || getNow()) - start\n return ttl - age\n }\n\n this.#isStale = index => {\n const s = starts[index]\n const t = ttls[index]\n return !!t && !!s && (cachedNow || getNow()) - s > t\n }\n }\n\n // conditionally set private methods related to TTL\n #updateItemAge: (index: Index) => void = () => {}\n #statusTTL: (status: LRUCache.Status, index: Index) => void =\n () => {}\n #setItemTTL: (\n index: Index,\n ttl: LRUCache.Milliseconds,\n start?: LRUCache.Milliseconds\n // ignore because we never call this if we're not already in TTL mode\n /* c8 ignore start */\n ) => void = () => {}\n /* c8 ignore stop */\n\n #isStale: (index: Index) => boolean = () => false\n\n #initializeSizeTracking() {\n const sizes = new ZeroArray(this.#max)\n this.#calculatedSize = 0\n this.#sizes = sizes\n this.#removeItemSize = index => {\n this.#calculatedSize -= sizes[index] as number\n sizes[index] = 0\n }\n this.#requireSize = (k, v, size, sizeCalculation) => {\n // provisionally accept background fetches.\n // actual value size will be checked when they return.\n if (this.#isBackgroundFetch(v)) {\n return 0\n }\n if (!isPosInt(size)) {\n if (sizeCalculation) {\n if (typeof sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation must be a function')\n }\n size = sizeCalculation(v, k)\n if (!isPosInt(size)) {\n throw new TypeError(\n 'sizeCalculation return invalid (expect positive integer)'\n )\n }\n } else {\n throw new TypeError(\n 'invalid size value (must be positive integer). ' +\n 'When maxSize or maxEntrySize is used, sizeCalculation ' +\n 'or size must be set.'\n )\n }\n }\n return size\n }\n this.#addItemSize = (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status\n ) => {\n sizes[index] = size\n if (this.#maxSize) {\n const maxSize = this.#maxSize - (sizes[index] as number)\n while (this.#calculatedSize > maxSize) {\n this.#evict(true)\n }\n }\n this.#calculatedSize += sizes[index] as number\n if (status) {\n status.entrySize = size\n status.totalCalculatedSize = this.#calculatedSize\n }\n }\n }\n\n #removeItemSize: (index: Index) => void = _i => {}\n #addItemSize: (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status\n ) => void = (_i, _s, _st) => {}\n #requireSize: (\n k: K,\n v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator\n ) => LRUCache.Size = (\n _k: K,\n _v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator\n ) => {\n if (size || sizeCalculation) {\n throw new TypeError(\n 'cannot set size without setting maxSize or maxEntrySize on cache'\n )\n }\n return 0\n };\n\n *#indexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#tail; true; ) {\n if (!this.#isValidIndex(i)) {\n break\n }\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#head) {\n break\n } else {\n i = this.#prev[i] as Index\n }\n }\n }\n }\n\n *#rindexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#head; true; ) {\n if (!this.#isValidIndex(i)) {\n break\n }\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#tail) {\n break\n } else {\n i = this.#next[i] as Index\n }\n }\n }\n }\n\n #isValidIndex(index: Index) {\n return (\n index !== undefined &&\n this.#keyMap.get(this.#keyList[index] as K) === index\n )\n }\n\n /**\n * Return a generator yielding `[key, value]` pairs,\n * in order from most recently used to least recently used.\n */\n *entries() {\n for (const i of this.#indexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]] as [K, V]\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.entries}\n *\n * Return a generator yielding `[key, value]` pairs,\n * in order from least recently used to most recently used.\n */\n *rentries() {\n for (const i of this.#rindexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]]\n }\n }\n }\n\n /**\n * Return a generator yielding the keys in the cache,\n * in order from most recently used to least recently used.\n */\n *keys() {\n for (const i of this.#indexes()) {\n const k = this.#keyList[i]\n if (\n k !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield k\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.keys}\n *\n * Return a generator yielding the keys in the cache,\n * in order from least recently used to most recently used.\n */\n *rkeys() {\n for (const i of this.#rindexes()) {\n const k = this.#keyList[i]\n if (\n k !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield k\n }\n }\n }\n\n /**\n * Return a generator yielding the values in the cache,\n * in order from most recently used to least recently used.\n */\n *values() {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n if (\n v !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield this.#valList[i] as V\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.values}\n *\n * Return a generator yielding the values in the cache,\n * in order from least recently used to most recently used.\n */\n *rvalues() {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n if (\n v !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield this.#valList[i]\n }\n }\n }\n\n /**\n * Iterating over the cache itself yields the same results as\n * {@link LRUCache.entries}\n */\n [Symbol.iterator]() {\n return this.entries()\n }\n\n /**\n * A String value that is used in the creation of the default string\n * description of an object. Called by the built-in method\n * `Object.prototype.toString`.\n */\n [Symbol.toStringTag] = 'LRUCache'\n\n /**\n * Find a value for which the supplied fn method returns a truthy value,\n * similar to `Array.find()`. fn is called as `fn(value, key, cache)`.\n */\n find(\n fn: (v: V, k: K, self: LRUCache) => boolean,\n getOptions: LRUCache.GetOptions = {}\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined) continue\n if (fn(value, this.#keyList[i] as K, this)) {\n return this.get(this.#keyList[i] as K, getOptions)\n }\n }\n }\n\n /**\n * Call the supplied function on each item in the cache, in order from most\n * recently used to least recently used.\n *\n * `fn` is called as `fn(value, key, cache)`.\n *\n * If `thisp` is provided, function will be called in the `this`-context of\n * the provided object, or the cache if no `thisp` object is provided.\n *\n * Does not update age or recenty of use, or iterate over stale values.\n */\n forEach(\n fn: (v: V, k: K, self: LRUCache) => any,\n thisp: any = this\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * The same as {@link LRUCache.forEach} but items are iterated over in\n * reverse order. (ie, less recently used items are iterated over first.)\n */\n rforEach(\n fn: (v: V, k: K, self: LRUCache) => any,\n thisp: any = this\n ) {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * Delete any stale entries. Returns true if anything was removed,\n * false otherwise.\n */\n purgeStale() {\n let deleted = false\n for (const i of this.#rindexes({ allowStale: true })) {\n if (this.#isStale(i)) {\n this.#delete(this.#keyList[i] as K, 'expire')\n deleted = true\n }\n }\n return deleted\n }\n\n /**\n * Get the extended info about a given entry, to get its value, size, and\n * TTL info simultaneously. Returns `undefined` if the key is not present.\n *\n * Unlike {@link LRUCache#dump}, which is designed to be portable and survive\n * serialization, the `start` value is always the current timestamp, and the\n * `ttl` is a calculated remaining time to live (negative if expired).\n *\n * Always returns stale values, if their info is found in the cache, so be\n * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl})\n * if relevant.\n */\n info(key: K): LRUCache.Entry | undefined {\n const i = this.#keyMap.get(key)\n if (i === undefined) return undefined\n const v = this.#valList[i]\n const value: V | undefined = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined) return undefined\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n const ttl = this.#ttls[i]\n const start = this.#starts[i]\n if (ttl && start) {\n const remain = ttl - (perf.now() - start)\n entry.ttl = remain\n entry.start = Date.now()\n }\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n return entry\n }\n\n /**\n * Return an array of [key, {@link LRUCache.Entry}] tuples which can be\n * passed to {@link LRLUCache#load}.\n *\n * The `start` fields are calculated relative to a portable `Date.now()`\n * timestamp, even if `performance.now()` is available.\n *\n * Stale entries are always included in the `dump`, even if\n * {@link LRUCache.OptionsBase.allowStale} is false.\n *\n * Note: this returns an actual array, not a generator, so it can be more\n * easily passed around.\n */\n dump() {\n const arr: [K, LRUCache.Entry][] = []\n for (const i of this.#indexes({ allowStale: true })) {\n const key = this.#keyList[i]\n const v = this.#valList[i]\n const value: V | undefined = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined || key === undefined) continue\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n entry.ttl = this.#ttls[i]\n // always dump the start relative to a portable timestamp\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = perf.now() - (this.#starts[i] as number)\n entry.start = Math.floor(Date.now() - age)\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n arr.unshift([key, entry])\n }\n return arr\n }\n\n /**\n * Reset the cache and load in the items in entries in the order listed.\n *\n * The shape of the resulting cache may be different if the same options are\n * not used in both caches.\n *\n * The `start` fields are assumed to be calculated relative to a portable\n * `Date.now()` timestamp, even if `performance.now()` is available.\n */\n load(arr: [K, LRUCache.Entry][]) {\n this.clear()\n for (const [key, entry] of arr) {\n if (entry.start) {\n // entry.start is a portable timestamp, but we may be using\n // node's performance.now(), so calculate the offset, so that\n // we get the intended remaining TTL, no matter how long it's\n // been on ice.\n //\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = Date.now() - entry.start\n entry.start = perf.now() - age\n }\n this.set(key, entry.value, entry)\n }\n }\n\n /**\n * Add a value to the cache.\n *\n * Note: if `undefined` is specified as a value, this is an alias for\n * {@link LRUCache#delete}\n *\n * Fields on the {@link LRUCache.SetOptions} options param will override\n * their corresponding values in the constructor options for the scope\n * of this single `set()` operation.\n *\n * If `start` is provided, then that will set the effective start\n * time for the TTL calculation. Note that this must be a previous\n * value of `performance.now()` if supported, or a previous value of\n * `Date.now()` if not.\n *\n * Options object may also include `size`, which will prevent\n * calling the `sizeCalculation` function and just use the specified\n * number if it is a positive integer, and `noDisposeOnSet` which\n * will prevent calling a `dispose` function in the case of\n * overwrites.\n *\n * If the `size` (or return value of `sizeCalculation`) for a given\n * entry is greater than `maxEntrySize`, then the item will not be\n * added to the cache.\n *\n * Will update the recency of the entry.\n *\n * If the value is `undefined`, then this is an alias for\n * `cache.delete(key)`. `undefined` is never stored in the cache.\n */\n set(\n k: K,\n v: V | BackgroundFetch | undefined,\n setOptions: LRUCache.SetOptions = {}\n ) {\n if (v === undefined) {\n this.delete(k)\n return this\n }\n const {\n ttl = this.ttl,\n start,\n noDisposeOnSet = this.noDisposeOnSet,\n sizeCalculation = this.sizeCalculation,\n status,\n } = setOptions\n let { noUpdateTTL = this.noUpdateTTL } = setOptions\n\n const size = this.#requireSize(\n k,\n v,\n setOptions.size || 0,\n sizeCalculation\n )\n // if the item doesn't fit, don't do anything\n // NB: maxEntrySize set to maxSize by default\n if (this.maxEntrySize && size > this.maxEntrySize) {\n if (status) {\n status.set = 'miss'\n status.maxEntrySizeExceeded = true\n }\n // have to delete, in case something is there already.\n this.#delete(k, 'set')\n return this\n }\n let index = this.#size === 0 ? undefined : this.#keyMap.get(k)\n if (index === undefined) {\n // addition\n index = (\n this.#size === 0\n ? this.#tail\n : this.#free.length !== 0\n ? this.#free.pop()\n : this.#size === this.#max\n ? this.#evict(false)\n : this.#size\n ) as Index\n this.#keyList[index] = k\n this.#valList[index] = v\n this.#keyMap.set(k, index)\n this.#next[this.#tail] = index\n this.#prev[index] = this.#tail\n this.#tail = index\n this.#size++\n this.#addItemSize(index, size, status)\n if (status) status.set = 'add'\n noUpdateTTL = false\n } else {\n // update\n this.#moveToTail(index)\n const oldVal = this.#valList[index] as V | BackgroundFetch\n if (v !== oldVal) {\n if (this.#hasFetchMethod && this.#isBackgroundFetch(oldVal)) {\n oldVal.__abortController.abort(new Error('replaced'))\n const { __staleWhileFetching: s } = oldVal\n if (s !== undefined && !noDisposeOnSet) {\n if (this.#hasDispose) {\n this.#dispose?.(s as V, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([s as V, k, 'set'])\n }\n }\n } else if (!noDisposeOnSet) {\n if (this.#hasDispose) {\n this.#dispose?.(oldVal as V, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldVal as V, k, 'set'])\n }\n }\n this.#removeItemSize(index)\n this.#addItemSize(index, size, status)\n this.#valList[index] = v\n if (status) {\n status.set = 'replace'\n const oldValue =\n oldVal && this.#isBackgroundFetch(oldVal)\n ? oldVal.__staleWhileFetching\n : oldVal\n if (oldValue !== undefined) status.oldValue = oldValue\n }\n } else if (status) {\n status.set = 'update'\n }\n }\n if (ttl !== 0 && !this.#ttls) {\n this.#initializeTTLTracking()\n }\n if (this.#ttls) {\n if (!noUpdateTTL) {\n this.#setItemTTL(index, ttl, start)\n }\n if (status) this.#statusTTL(status, index)\n }\n if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return this\n }\n\n /**\n * Evict the least recently used item, returning its value or\n * `undefined` if cache is empty.\n */\n pop(): V | undefined {\n try {\n while (this.#size) {\n const val = this.#valList[this.#head]\n this.#evict(true)\n if (this.#isBackgroundFetch(val)) {\n if (val.__staleWhileFetching) {\n return val.__staleWhileFetching\n }\n } else if (val !== undefined) {\n return val\n }\n }\n } finally {\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n }\n\n #evict(free: boolean) {\n const head = this.#head\n const k = this.#keyList[head] as K\n const v = this.#valList[head] as V\n if (this.#hasFetchMethod && this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('evicted'))\n } else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v, k, 'evict')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v, k, 'evict'])\n }\n }\n this.#removeItemSize(head)\n // if we aren't about to use the index, then null these out\n if (free) {\n this.#keyList[head] = undefined\n this.#valList[head] = undefined\n this.#free.push(head)\n }\n if (this.#size === 1) {\n this.#head = this.#tail = 0 as Index\n this.#free.length = 0\n } else {\n this.#head = this.#next[head] as Index\n }\n this.#keyMap.delete(k)\n this.#size--\n return head\n }\n\n /**\n * Check if a key is in the cache, without updating the recency of use.\n * Will return false if the item is stale, even though it is technically\n * in the cache.\n *\n * Check if a key is in the cache, without updating the recency of\n * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set\n * to `true` in either the options or the constructor.\n *\n * Will return `false` if the item is stale, even though it is technically in\n * the cache. The difference can be determined (if it matters) by using a\n * `status` argument, and inspecting the `has` field.\n *\n * Will not update item age unless\n * {@link LRUCache.OptionsBase.updateAgeOnHas} is set.\n */\n has(k: K, hasOptions: LRUCache.HasOptions = {}) {\n const { updateAgeOnHas = this.updateAgeOnHas, status } =\n hasOptions\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n const v = this.#valList[index]\n if (\n this.#isBackgroundFetch(v) &&\n v.__staleWhileFetching === undefined\n ) {\n return false\n }\n if (!this.#isStale(index)) {\n if (updateAgeOnHas) {\n this.#updateItemAge(index)\n }\n if (status) {\n status.has = 'hit'\n this.#statusTTL(status, index)\n }\n return true\n } else if (status) {\n status.has = 'stale'\n this.#statusTTL(status, index)\n }\n } else if (status) {\n status.has = 'miss'\n }\n return false\n }\n\n /**\n * Like {@link LRUCache#get} but doesn't update recency or delete stale\n * items.\n *\n * Returns `undefined` if the item is stale, unless\n * {@link LRUCache.OptionsBase.allowStale} is set.\n */\n peek(k: K, peekOptions: LRUCache.PeekOptions = {}) {\n const { allowStale = this.allowStale } = peekOptions\n const index = this.#keyMap.get(k)\n if (\n index === undefined ||\n (!allowStale && this.#isStale(index))\n ) {\n return\n }\n const v = this.#valList[index]\n // either stale and allowed, or forcing a refresh of non-stale value\n return this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n }\n\n #backgroundFetch(\n k: K,\n index: Index | undefined,\n options: LRUCache.FetchOptions,\n context: any\n ): BackgroundFetch {\n const v = index === undefined ? undefined : this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n return v\n }\n\n const ac = new AC()\n const { signal } = options\n // when/if our AC signals, then stop listening to theirs.\n signal?.addEventListener('abort', () => ac.abort(signal.reason), {\n signal: ac.signal,\n })\n\n const fetchOpts = {\n signal: ac.signal,\n options,\n context,\n }\n\n const cb = (\n v: V | undefined,\n updateCache = false\n ): V | undefined => {\n const { aborted } = ac.signal\n const ignoreAbort = options.ignoreFetchAbort && v !== undefined\n if (options.status) {\n if (aborted && !updateCache) {\n options.status.fetchAborted = true\n options.status.fetchError = ac.signal.reason\n if (ignoreAbort) options.status.fetchAbortIgnored = true\n } else {\n options.status.fetchResolved = true\n }\n }\n if (aborted && !ignoreAbort && !updateCache) {\n return fetchFail(ac.signal.reason)\n }\n // either we didn't abort, and are still here, or we did, and ignored\n const bf = p as BackgroundFetch\n if (this.#valList[index as Index] === p) {\n if (v === undefined) {\n if (bf.__staleWhileFetching) {\n this.#valList[index as Index] = bf.__staleWhileFetching\n } else {\n this.#delete(k, 'fetch')\n }\n } else {\n if (options.status) options.status.fetchUpdated = true\n this.set(k, v, fetchOpts.options)\n }\n }\n return v\n }\n\n const eb = (er: any) => {\n if (options.status) {\n options.status.fetchRejected = true\n options.status.fetchError = er\n }\n return fetchFail(er)\n }\n\n const fetchFail = (er: any): V | undefined => {\n const { aborted } = ac.signal\n const allowStaleAborted =\n aborted && options.allowStaleOnFetchAbort\n const allowStale =\n allowStaleAborted || options.allowStaleOnFetchRejection\n const noDelete = allowStale || options.noDeleteOnFetchRejection\n const bf = p as BackgroundFetch\n if (this.#valList[index as Index] === p) {\n // if we allow stale on fetch rejections, then we need to ensure that\n // the stale value is not removed from the cache when the fetch fails.\n const del = !noDelete || bf.__staleWhileFetching === undefined\n if (del) {\n this.#delete(k, 'fetch')\n } else if (!allowStaleAborted) {\n // still replace the *promise* with the stale value,\n // since we are done with the promise at this point.\n // leave it untouched if we're still waiting for an\n // aborted background fetch that hasn't yet returned.\n this.#valList[index as Index] = bf.__staleWhileFetching\n }\n }\n if (allowStale) {\n if (options.status && bf.__staleWhileFetching !== undefined) {\n options.status.returnedStale = true\n }\n return bf.__staleWhileFetching\n } else if (bf.__returned === bf) {\n throw er\n }\n }\n\n const pcall = (\n res: (v: V | undefined) => void,\n rej: (e: any) => void\n ) => {\n const fmp = this.#fetchMethod?.(k, v, fetchOpts)\n if (fmp && fmp instanceof Promise) {\n fmp.then(v => res(v === undefined ? undefined : v), rej)\n }\n // ignored, we go until we finish, regardless.\n // defer check until we are actually aborting,\n // so fetchMethod can override.\n ac.signal.addEventListener('abort', () => {\n if (\n !options.ignoreFetchAbort ||\n options.allowStaleOnFetchAbort\n ) {\n res(undefined)\n // when it eventually resolves, update the cache.\n if (options.allowStaleOnFetchAbort) {\n res = v => cb(v, true)\n }\n }\n })\n }\n\n if (options.status) options.status.fetchDispatched = true\n const p = new Promise(pcall).then(cb, eb)\n const bf: BackgroundFetch = Object.assign(p, {\n __abortController: ac,\n __staleWhileFetching: v,\n __returned: undefined,\n })\n\n if (index === undefined) {\n // internal, don't expose status.\n this.set(k, bf, { ...fetchOpts.options, status: undefined })\n index = this.#keyMap.get(k)\n } else {\n this.#valList[index] = bf\n }\n return bf\n }\n\n #isBackgroundFetch(p: any): p is BackgroundFetch {\n if (!this.#hasFetchMethod) return false\n const b = p as BackgroundFetch\n return (\n !!b &&\n b instanceof Promise &&\n b.hasOwnProperty('__staleWhileFetching') &&\n b.__abortController instanceof AC\n )\n }\n\n /**\n * Make an asynchronous cached fetch using the\n * {@link LRUCache.OptionsBase.fetchMethod} function.\n *\n * If the value is in the cache and not stale, then the returned\n * Promise resolves to the value.\n *\n * If not in the cache, or beyond its TTL staleness, then\n * `fetchMethod(key, staleValue, { options, signal, context })` is\n * called, and the value returned will be added to the cache once\n * resolved.\n *\n * If called with `allowStale`, and an asynchronous fetch is\n * currently in progress to reload a stale value, then the former\n * stale value will be returned.\n *\n * If called with `forceRefresh`, then the cached item will be\n * re-fetched, even if it is not stale. However, if `allowStale` is also\n * set, then the old value will still be returned. This is useful\n * in cases where you want to force a reload of a cached value. If\n * a background fetch is already in progress, then `forceRefresh`\n * has no effect.\n *\n * If multiple fetches for the same key are issued, then they will all be\n * coalesced into a single call to fetchMethod.\n *\n * Note that this means that handling options such as\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort},\n * {@link LRUCache.FetchOptions.signal},\n * and {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} will be\n * determined by the FIRST fetch() call for a given key.\n *\n * This is a known (fixable) shortcoming which will be addresed on when\n * someone complains about it, as the fix would involve added complexity and\n * may not be worth the costs for this edge case.\n *\n * If {@link LRUCache.OptionsBase.fetchMethod} is not specified, then this is\n * effectively an alias for `Promise.resolve(cache.get(key))`.\n *\n * When the fetch method resolves to a value, if the fetch has not\n * been aborted due to deletion, eviction, or being overwritten,\n * then it is added to the cache using the options provided.\n *\n * If the key is evicted or deleted before the `fetchMethod`\n * resolves, then the AbortSignal passed to the `fetchMethod` will\n * receive an `abort` event, and the promise returned by `fetch()`\n * will reject with the reason for the abort.\n *\n * If a `signal` is passed to the `fetch()` call, then aborting the\n * signal will abort the fetch and cause the `fetch()` promise to\n * reject with the reason provided.\n *\n * **Setting `context`**\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the {@link LRUCache} constructor, then all\n * calls to `cache.fetch()` _must_ provide a `context` option. If\n * set to `undefined` or `void`, then calls to fetch _must not_\n * provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that\n * might be relevant in the course of fetching the data. It is only\n * relevant for the course of a single `fetch()` operation, and\n * discarded afterwards.\n *\n * **Note: `fetch()` calls are inflight-unique**\n *\n * If you call `fetch()` multiple times with the same key value,\n * then every call after the first will resolve on the same\n * promise1,\n * _even if they have different settings that would otherwise change\n * the behavior of the fetch_, such as `noDeleteOnFetchRejection`\n * or `ignoreFetchAbort`.\n *\n * In most cases, this is not a problem (in fact, only fetching\n * something once is what you probably want, if you're caching in\n * the first place). If you are changing the fetch() options\n * dramatically between runs, there's a good chance that you might\n * be trying to fit divergent semantics into a single object, and\n * would be better off with multiple cache instances.\n *\n * **1**: Ie, they're not the \"same Promise\", but they resolve at\n * the same time, because they're both waiting on the same\n * underlying fetchMethod response.\n */\n\n fetch(\n k: K,\n fetchOptions: unknown extends FC\n ? LRUCache.FetchOptions\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext\n ): Promise\n\n // this overload not allowed if context is required\n fetch(\n k: unknown extends FC\n ? K\n : FC extends undefined | void\n ? K\n : never,\n fetchOptions?: unknown extends FC\n ? LRUCache.FetchOptions\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext\n : never\n ): Promise\n\n async fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {}\n ): Promise {\n const {\n // get options\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n // set options\n ttl = this.ttl,\n noDisposeOnSet = this.noDisposeOnSet,\n size = 0,\n sizeCalculation = this.sizeCalculation,\n noUpdateTTL = this.noUpdateTTL,\n // fetch exclusive options\n noDeleteOnFetchRejection = this.noDeleteOnFetchRejection,\n allowStaleOnFetchRejection = this.allowStaleOnFetchRejection,\n ignoreFetchAbort = this.ignoreFetchAbort,\n allowStaleOnFetchAbort = this.allowStaleOnFetchAbort,\n context,\n forceRefresh = false,\n status,\n signal,\n } = fetchOptions\n\n if (!this.#hasFetchMethod) {\n if (status) status.fetch = 'get'\n return this.get(k, {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n status,\n })\n }\n\n const options = {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n ttl,\n noDisposeOnSet,\n size,\n sizeCalculation,\n noUpdateTTL,\n noDeleteOnFetchRejection,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n status,\n signal,\n }\n\n let index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.fetch = 'miss'\n const p = this.#backgroundFetch(k, index, options, context)\n return (p.__returned = p)\n } else {\n // in cache, maybe already fetching\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n const stale =\n allowStale && v.__staleWhileFetching !== undefined\n if (status) {\n status.fetch = 'inflight'\n if (stale) status.returnedStale = true\n }\n return stale ? v.__staleWhileFetching : (v.__returned = v)\n }\n\n // if we force a refresh, that means do NOT serve the cached value,\n // unless we are already in the process of refreshing the cache.\n const isStale = this.#isStale(index)\n if (!forceRefresh && !isStale) {\n if (status) status.fetch = 'hit'\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n if (status) this.#statusTTL(status, index)\n return v\n }\n\n // ok, it is stale or a forced refresh, and not already fetching.\n // refresh the cache.\n const p = this.#backgroundFetch(k, index, options, context)\n const hasStale = p.__staleWhileFetching !== undefined\n const staleVal = hasStale && allowStale\n if (status) {\n status.fetch = isStale ? 'stale' : 'refresh'\n if (staleVal && isStale) status.returnedStale = true\n }\n return staleVal ? p.__staleWhileFetching : (p.__returned = p)\n }\n }\n\n /**\n * In some cases, `cache.fetch()` may resolve to `undefined`, either because\n * a {@link LRUCache.OptionsBase#fetchMethod} was not provided (turning\n * `cache.fetch(k)` into just an async wrapper around `cache.get(k)`) or\n * because `ignoreFetchAbort` was specified (either to the constructor or\n * in the {@link LRUCache.FetchOptions}). Also, the\n * {@link OptionsBase.fetchMethod} may return `undefined` or `void`, making\n * the test even more complicated.\n *\n * Because inferring the cases where `undefined` might be returned are so\n * cumbersome, but testing for `undefined` can also be annoying, this method\n * can be used, which will reject if `this.fetch()` resolves to undefined.\n */\n forceFetch(\n k: K,\n fetchOptions: unknown extends FC\n ? LRUCache.FetchOptions\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext\n ): Promise\n // this overload not allowed if context is required\n forceFetch(\n k: unknown extends FC\n ? K\n : FC extends undefined | void\n ? K\n : never,\n fetchOptions?: unknown extends FC\n ? LRUCache.FetchOptions\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext\n : never\n ): Promise\n async forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {}\n ): Promise {\n const v = await this.fetch(\n k,\n fetchOptions as unknown extends FC\n ? LRUCache.FetchOptions\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext\n )\n if (v === undefined) throw new Error('fetch() returned undefined')\n return v\n }\n\n /**\n * If the key is found in the cache, then this is equivalent to\n * {@link LRUCache#get}. If not, in the cache, then calculate the value using\n * the {@link LRUCache.OptionsBase.memoMethod}, and add it to the cache.\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the LRUCache constructor, then all calls to `cache.memo()`\n * _must_ provide a `context` option. If set to `undefined` or `void`, then\n * calls to memo _must not_ provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that might be\n * relevant in the course of fetching the data. It is only relevant for the\n * course of a single `memo()` operation, and discarded afterwards.\n */\n memo(\n k: K,\n memoOptions: unknown extends FC\n ? LRUCache.MemoOptions\n : FC extends undefined | void\n ? LRUCache.MemoOptionsNoContext\n : LRUCache.MemoOptionsWithContext\n ): V\n // this overload not allowed if context is required\n memo(\n k: unknown extends FC\n ? K\n : FC extends undefined | void\n ? K\n : never,\n memoOptions?: unknown extends FC\n ? LRUCache.MemoOptions\n : FC extends undefined | void\n ? LRUCache.MemoOptionsNoContext\n : never\n ): V\n memo(k: K, memoOptions: LRUCache.MemoOptions = {}) {\n const memoMethod = this.#memoMethod\n if (!memoMethod) {\n throw new Error('no memoMethod provided to constructor')\n }\n const { context, forceRefresh, ...options } = memoOptions\n const v = this.get(k, options)\n if (!forceRefresh && v !== undefined) return v\n const vv = memoMethod(k, v, {\n options,\n context,\n } as LRUCache.MemoizerOptions)\n this.set(k, vv, options)\n return vv\n }\n\n /**\n * Return a value from the cache. Will update the recency of the cache\n * entry found.\n *\n * If the key is not found, get() will return `undefined`.\n */\n get(k: K, getOptions: LRUCache.GetOptions = {}) {\n const {\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n status,\n } = getOptions\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n const value = this.#valList[index]\n const fetching = this.#isBackgroundFetch(value)\n if (status) this.#statusTTL(status, index)\n if (this.#isStale(index)) {\n if (status) status.get = 'stale'\n // delete only if not an in-flight background fetch\n if (!fetching) {\n if (!noDeleteOnStaleGet) {\n this.#delete(k, 'expire')\n }\n if (status && allowStale) status.returnedStale = true\n return allowStale ? value : undefined\n } else {\n if (\n status &&\n allowStale &&\n value.__staleWhileFetching !== undefined\n ) {\n status.returnedStale = true\n }\n return allowStale ? value.__staleWhileFetching : undefined\n }\n } else {\n if (status) status.get = 'hit'\n // if we're currently fetching it, we don't actually have it yet\n // it's not stale, which means this isn't a staleWhileRefetching.\n // If it's not stale, and fetching, AND has a __staleWhileFetching\n // value, then that means the user fetched with {forceRefresh:true},\n // so it's safe to return that value.\n if (fetching) {\n return value.__staleWhileFetching\n }\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n return value\n }\n } else if (status) {\n status.get = 'miss'\n }\n }\n\n #connect(p: Index, n: Index) {\n this.#prev[n] = p\n this.#next[p] = n\n }\n\n #moveToTail(index: Index): void {\n // if tail already, nothing to do\n // if head, move head to next[index]\n // else\n // move next[prev[index]] to next[index] (head has no prev)\n // move prev[next[index]] to prev[index]\n // prev[index] = tail\n // next[tail] = index\n // tail = index\n if (index !== this.#tail) {\n if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n this.#connect(\n this.#prev[index] as Index,\n this.#next[index] as Index\n )\n }\n this.#connect(this.#tail, index)\n this.#tail = index\n }\n }\n\n /**\n * Deletes a key out of the cache.\n *\n * Returns true if the key was deleted, false otherwise.\n */\n delete(k: K) {\n return this.#delete(k, 'delete')\n }\n\n #delete(k: K, reason: LRUCache.DisposeReason) {\n let deleted = false\n if (this.#size !== 0) {\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n deleted = true\n if (this.#size === 1) {\n this.#clear(reason)\n } else {\n this.#removeItemSize(index)\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k, reason])\n }\n }\n this.#keyMap.delete(k)\n this.#keyList[index] = undefined\n this.#valList[index] = undefined\n if (index === this.#tail) {\n this.#tail = this.#prev[index] as Index\n } else if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n const pi = this.#prev[index] as number\n this.#next[pi] = this.#next[index] as number\n const ni = this.#next[index] as number\n this.#prev[ni] = this.#prev[index] as number\n }\n this.#size--\n this.#free.push(index)\n }\n }\n }\n if (this.#hasDisposeAfter && this.#disposed?.length) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return deleted\n }\n\n /**\n * Clear the cache entirely, throwing away all values.\n */\n clear() {\n return this.#clear('delete')\n }\n #clear(reason: LRUCache.DisposeReason) {\n for (const index of this.#rindexes({ allowStale: true })) {\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else {\n const k = this.#keyList[index]\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k as K, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k as K, reason])\n }\n }\n }\n\n this.#keyMap.clear()\n this.#valList.fill(undefined)\n this.#keyList.fill(undefined)\n if (this.#ttls && this.#starts) {\n this.#ttls.fill(0)\n this.#starts.fill(0)\n }\n if (this.#sizes) {\n this.#sizes.fill(0)\n }\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free.length = 0\n this.#calculatedSize = 0\n this.#size = 0\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/lru-cache/dist/esm/index.min.js b/node_modules/lru-cache/dist/esm/index.min.js deleted file mode 100644 index 4571d02..0000000 --- a/node_modules/lru-cache/dist/esm/index.min.js +++ /dev/null @@ -1,2 +0,0 @@ -var G=(l,t,e)=>{if(!t.has(l))throw TypeError("Cannot "+e)};var I=(l,t,e)=>(G(l,t,"read from private field"),e?e.call(l):t.get(l)),j=(l,t,e)=>{if(t.has(l))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(l):t.set(l,e)},x=(l,t,e,i)=>(G(l,t,"write to private field"),i?i.call(l,e):t.set(l,e),e);var T=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,P=new Set,M=typeof process=="object"&&process?process:{},H=(l,t,e,i)=>{typeof M.emitWarning=="function"?M.emitWarning(l,t,e,i):console.error(`[${e}] ${t}: ${l}`)},W=globalThis.AbortController,N=globalThis.AbortSignal;if(typeof W>"u"){N=class{onabort;_onabort=[];reason;aborted=!1;addEventListener(i,s){this._onabort.push(s)}},W=class{constructor(){t()}signal=new N;abort(i){if(!this.signal.aborted){this.signal.reason=i,this.signal.aborted=!0;for(let s of this.signal._onabort)s(i);this.signal.onabort?.(i)}}};let l=M.env?.LRU_CACHE_IGNORE_AC_WARNING!=="1",t=()=>{l&&(l=!1,H("AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.","NO_ABORT_CONTROLLER","ENOTSUP",t))}}var V=l=>!P.has(l),Y=Symbol("type"),A=l=>l&&l===Math.floor(l)&&l>0&&isFinite(l),k=l=>A(l)?l<=Math.pow(2,8)?Uint8Array:l<=Math.pow(2,16)?Uint16Array:l<=Math.pow(2,32)?Uint32Array:l<=Number.MAX_SAFE_INTEGER?O:null:null,O=class extends Array{constructor(t){super(t),this.fill(0)}},z,E=class{heap;length;static create(t){let e=k(t);if(!e)return[];x(E,z,!0);let i=new E(t,e);return x(E,z,!1),i}constructor(t,e){if(!I(E,z))throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new e(t),this.length=0}push(t){this.heap[this.length++]=t}pop(){return this.heap[--this.length]}},R=E;z=new WeakMap,j(R,z,!1);var D=class{#g;#f;#p;#w;#R;#W;ttl;ttlResolution;ttlAutopurge;updateAgeOnGet;updateAgeOnHas;allowStale;noDisposeOnSet;noUpdateTTL;maxEntrySize;sizeCalculation;noDeleteOnFetchRejection;noDeleteOnStaleGet;allowStaleOnFetchAbort;allowStaleOnFetchRejection;ignoreFetchAbort;#n;#S;#s;#i;#t;#l;#c;#o;#h;#_;#r;#m;#b;#u;#y;#O;#a;static unsafeExposeInternals(t){return{starts:t.#b,ttls:t.#u,sizes:t.#m,keyMap:t.#s,keyList:t.#i,valList:t.#t,next:t.#l,prev:t.#c,get head(){return t.#o},get tail(){return t.#h},free:t.#_,isBackgroundFetch:e=>t.#e(e),backgroundFetch:(e,i,s,n)=>t.#x(e,i,s,n),moveToTail:e=>t.#C(e),indexes:e=>t.#A(e),rindexes:e=>t.#F(e),isStale:e=>t.#d(e)}}get max(){return this.#g}get maxSize(){return this.#f}get calculatedSize(){return this.#S}get size(){return this.#n}get fetchMethod(){return this.#R}get memoMethod(){return this.#W}get dispose(){return this.#p}get disposeAfter(){return this.#w}constructor(t){let{max:e=0,ttl:i,ttlResolution:s=1,ttlAutopurge:n,updateAgeOnGet:h,updateAgeOnHas:o,allowStale:r,dispose:g,disposeAfter:m,noDisposeOnSet:f,noUpdateTTL:u,maxSize:c=0,maxEntrySize:F=0,sizeCalculation:d,fetchMethod:S,memoMethod:a,noDeleteOnFetchRejection:w,noDeleteOnStaleGet:b,allowStaleOnFetchRejection:p,allowStaleOnFetchAbort:_,ignoreFetchAbort:v}=t;if(e!==0&&!A(e))throw new TypeError("max option must be a nonnegative integer");let y=e?k(e):Array;if(!y)throw new Error("invalid max value: "+e);if(this.#g=e,this.#f=c,this.maxEntrySize=F||this.#f,this.sizeCalculation=d,this.sizeCalculation){if(!this.#f&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(a!==void 0&&typeof a!="function")throw new TypeError("memoMethod must be a function if defined");if(this.#W=a,S!==void 0&&typeof S!="function")throw new TypeError("fetchMethod must be a function if specified");if(this.#R=S,this.#O=!!S,this.#s=new Map,this.#i=new Array(e).fill(void 0),this.#t=new Array(e).fill(void 0),this.#l=new y(e),this.#c=new y(e),this.#o=0,this.#h=0,this.#_=R.create(e),this.#n=0,this.#S=0,typeof g=="function"&&(this.#p=g),typeof m=="function"?(this.#w=m,this.#r=[]):(this.#w=void 0,this.#r=void 0),this.#y=!!this.#p,this.#a=!!this.#w,this.noDisposeOnSet=!!f,this.noUpdateTTL=!!u,this.noDeleteOnFetchRejection=!!w,this.allowStaleOnFetchRejection=!!p,this.allowStaleOnFetchAbort=!!_,this.ignoreFetchAbort=!!v,this.maxEntrySize!==0){if(this.#f!==0&&!A(this.#f))throw new TypeError("maxSize must be a positive integer if specified");if(!A(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.#P()}if(this.allowStale=!!r,this.noDeleteOnStaleGet=!!b,this.updateAgeOnGet=!!h,this.updateAgeOnHas=!!o,this.ttlResolution=A(s)||s===0?s:1,this.ttlAutopurge=!!n,this.ttl=i||0,this.ttl){if(!A(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.#M()}if(this.#g===0&&this.ttl===0&&this.#f===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.#g&&!this.#f){let C="LRU_CACHE_UNBOUNDED";V(C)&&(P.add(C),H("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",C,D))}}getRemainingTTL(t){return this.#s.has(t)?1/0:0}#M(){let t=new O(this.#g),e=new O(this.#g);this.#u=t,this.#b=e,this.#U=(n,h,o=T.now())=>{if(e[n]=h!==0?o:0,t[n]=h,h!==0&&this.ttlAutopurge){let r=setTimeout(()=>{this.#d(n)&&this.#T(this.#i[n],"expire")},h+1);r.unref&&r.unref()}},this.#z=n=>{e[n]=t[n]!==0?T.now():0},this.#E=(n,h)=>{if(t[h]){let o=t[h],r=e[h];if(!o||!r)return;n.ttl=o,n.start=r,n.now=i||s();let g=n.now-r;n.remainingTTL=o-g}};let i=0,s=()=>{let n=T.now();if(this.ttlResolution>0){i=n;let h=setTimeout(()=>i=0,this.ttlResolution);h.unref&&h.unref()}return n};this.getRemainingTTL=n=>{let h=this.#s.get(n);if(h===void 0)return 0;let o=t[h],r=e[h];if(!o||!r)return 1/0;let g=(i||s())-r;return o-g},this.#d=n=>{let h=e[n],o=t[n];return!!o&&!!h&&(i||s())-h>o}}#z=()=>{};#E=()=>{};#U=()=>{};#d=()=>!1;#P(){let t=new O(this.#g);this.#S=0,this.#m=t,this.#v=e=>{this.#S-=t[e],t[e]=0},this.#G=(e,i,s,n)=>{if(this.#e(i))return 0;if(!A(s))if(n){if(typeof n!="function")throw new TypeError("sizeCalculation must be a function");if(s=n(i,e),!A(s))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.");return s},this.#D=(e,i,s)=>{if(t[e]=i,this.#f){let n=this.#f-t[e];for(;this.#S>n;)this.#L(!0)}this.#S+=t[e],s&&(s.entrySize=i,s.totalCalculatedSize=this.#S)}}#v=t=>{};#D=(t,e,i)=>{};#G=(t,e,i,s)=>{if(i||s)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0};*#A({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#h;!(!this.#I(e)||((t||!this.#d(e))&&(yield e),e===this.#o));)e=this.#c[e]}*#F({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#o;!(!this.#I(e)||((t||!this.#d(e))&&(yield e),e===this.#h));)e=this.#l[e]}#I(t){return t!==void 0&&this.#s.get(this.#i[t])===t}*entries(){for(let t of this.#A())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*rentries(){for(let t of this.#F())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*keys(){for(let t of this.#A()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*rkeys(){for(let t of this.#F()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*values(){for(let t of this.#A())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}*rvalues(){for(let t of this.#F())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}[Symbol.iterator](){return this.entries()}[Symbol.toStringTag]="LRUCache";find(t,e={}){for(let i of this.#A()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;if(n!==void 0&&t(n,this.#i[i],this))return this.get(this.#i[i],e)}}forEach(t,e=this){for(let i of this.#A()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;n!==void 0&&t.call(e,n,this.#i[i],this)}}rforEach(t,e=this){for(let i of this.#F()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;n!==void 0&&t.call(e,n,this.#i[i],this)}}purgeStale(){let t=!1;for(let e of this.#F({allowStale:!0}))this.#d(e)&&(this.#T(this.#i[e],"expire"),t=!0);return t}info(t){let e=this.#s.get(t);if(e===void 0)return;let i=this.#t[e],s=this.#e(i)?i.__staleWhileFetching:i;if(s===void 0)return;let n={value:s};if(this.#u&&this.#b){let h=this.#u[e],o=this.#b[e];if(h&&o){let r=h-(T.now()-o);n.ttl=r,n.start=Date.now()}}return this.#m&&(n.size=this.#m[e]),n}dump(){let t=[];for(let e of this.#A({allowStale:!0})){let i=this.#i[e],s=this.#t[e],n=this.#e(s)?s.__staleWhileFetching:s;if(n===void 0||i===void 0)continue;let h={value:n};if(this.#u&&this.#b){h.ttl=this.#u[e];let o=T.now()-this.#b[e];h.start=Math.floor(Date.now()-o)}this.#m&&(h.size=this.#m[e]),t.unshift([i,h])}return t}load(t){this.clear();for(let[e,i]of t){if(i.start){let s=Date.now()-i.start;i.start=T.now()-s}this.set(e,i.value,i)}}set(t,e,i={}){if(e===void 0)return this.delete(t),this;let{ttl:s=this.ttl,start:n,noDisposeOnSet:h=this.noDisposeOnSet,sizeCalculation:o=this.sizeCalculation,status:r}=i,{noUpdateTTL:g=this.noUpdateTTL}=i,m=this.#G(t,e,i.size||0,o);if(this.maxEntrySize&&m>this.maxEntrySize)return r&&(r.set="miss",r.maxEntrySizeExceeded=!0),this.#T(t,"set"),this;let f=this.#n===0?void 0:this.#s.get(t);if(f===void 0)f=this.#n===0?this.#h:this.#_.length!==0?this.#_.pop():this.#n===this.#g?this.#L(!1):this.#n,this.#i[f]=t,this.#t[f]=e,this.#s.set(t,f),this.#l[this.#h]=f,this.#c[f]=this.#h,this.#h=f,this.#n++,this.#D(f,m,r),r&&(r.set="add"),g=!1;else{this.#C(f);let u=this.#t[f];if(e!==u){if(this.#O&&this.#e(u)){u.__abortController.abort(new Error("replaced"));let{__staleWhileFetching:c}=u;c!==void 0&&!h&&(this.#y&&this.#p?.(c,t,"set"),this.#a&&this.#r?.push([c,t,"set"]))}else h||(this.#y&&this.#p?.(u,t,"set"),this.#a&&this.#r?.push([u,t,"set"]));if(this.#v(f),this.#D(f,m,r),this.#t[f]=e,r){r.set="replace";let c=u&&this.#e(u)?u.__staleWhileFetching:u;c!==void 0&&(r.oldValue=c)}}else r&&(r.set="update")}if(s!==0&&!this.#u&&this.#M(),this.#u&&(g||this.#U(f,s,n),r&&this.#E(r,f)),!h&&this.#a&&this.#r){let u=this.#r,c;for(;c=u?.shift();)this.#w?.(...c)}return this}pop(){try{for(;this.#n;){let t=this.#t[this.#o];if(this.#L(!0),this.#e(t)){if(t.__staleWhileFetching)return t.__staleWhileFetching}else if(t!==void 0)return t}}finally{if(this.#a&&this.#r){let t=this.#r,e;for(;e=t?.shift();)this.#w?.(...e)}}}#L(t){let e=this.#o,i=this.#i[e],s=this.#t[e];return this.#O&&this.#e(s)?s.__abortController.abort(new Error("evicted")):(this.#y||this.#a)&&(this.#y&&this.#p?.(s,i,"evict"),this.#a&&this.#r?.push([s,i,"evict"])),this.#v(e),t&&(this.#i[e]=void 0,this.#t[e]=void 0,this.#_.push(e)),this.#n===1?(this.#o=this.#h=0,this.#_.length=0):this.#o=this.#l[e],this.#s.delete(i),this.#n--,e}has(t,e={}){let{updateAgeOnHas:i=this.updateAgeOnHas,status:s}=e,n=this.#s.get(t);if(n!==void 0){let h=this.#t[n];if(this.#e(h)&&h.__staleWhileFetching===void 0)return!1;if(this.#d(n))s&&(s.has="stale",this.#E(s,n));else return i&&this.#z(n),s&&(s.has="hit",this.#E(s,n)),!0}else s&&(s.has="miss");return!1}peek(t,e={}){let{allowStale:i=this.allowStale}=e,s=this.#s.get(t);if(s===void 0||!i&&this.#d(s))return;let n=this.#t[s];return this.#e(n)?n.__staleWhileFetching:n}#x(t,e,i,s){let n=e===void 0?void 0:this.#t[e];if(this.#e(n))return n;let h=new W,{signal:o}=i;o?.addEventListener("abort",()=>h.abort(o.reason),{signal:h.signal});let r={signal:h.signal,options:i,context:s},g=(d,S=!1)=>{let{aborted:a}=h.signal,w=i.ignoreFetchAbort&&d!==void 0;if(i.status&&(a&&!S?(i.status.fetchAborted=!0,i.status.fetchError=h.signal.reason,w&&(i.status.fetchAbortIgnored=!0)):i.status.fetchResolved=!0),a&&!w&&!S)return f(h.signal.reason);let b=c;return this.#t[e]===c&&(d===void 0?b.__staleWhileFetching?this.#t[e]=b.__staleWhileFetching:this.#T(t,"fetch"):(i.status&&(i.status.fetchUpdated=!0),this.set(t,d,r.options))),d},m=d=>(i.status&&(i.status.fetchRejected=!0,i.status.fetchError=d),f(d)),f=d=>{let{aborted:S}=h.signal,a=S&&i.allowStaleOnFetchAbort,w=a||i.allowStaleOnFetchRejection,b=w||i.noDeleteOnFetchRejection,p=c;if(this.#t[e]===c&&(!b||p.__staleWhileFetching===void 0?this.#T(t,"fetch"):a||(this.#t[e]=p.__staleWhileFetching)),w)return i.status&&p.__staleWhileFetching!==void 0&&(i.status.returnedStale=!0),p.__staleWhileFetching;if(p.__returned===p)throw d},u=(d,S)=>{let a=this.#R?.(t,n,r);a&&a instanceof Promise&&a.then(w=>d(w===void 0?void 0:w),S),h.signal.addEventListener("abort",()=>{(!i.ignoreFetchAbort||i.allowStaleOnFetchAbort)&&(d(void 0),i.allowStaleOnFetchAbort&&(d=w=>g(w,!0)))})};i.status&&(i.status.fetchDispatched=!0);let c=new Promise(u).then(g,m),F=Object.assign(c,{__abortController:h,__staleWhileFetching:n,__returned:void 0});return e===void 0?(this.set(t,F,{...r.options,status:void 0}),e=this.#s.get(t)):this.#t[e]=F,F}#e(t){if(!this.#O)return!1;let e=t;return!!e&&e instanceof Promise&&e.hasOwnProperty("__staleWhileFetching")&&e.__abortController instanceof W}async fetch(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,ttl:h=this.ttl,noDisposeOnSet:o=this.noDisposeOnSet,size:r=0,sizeCalculation:g=this.sizeCalculation,noUpdateTTL:m=this.noUpdateTTL,noDeleteOnFetchRejection:f=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:u=this.allowStaleOnFetchRejection,ignoreFetchAbort:c=this.ignoreFetchAbort,allowStaleOnFetchAbort:F=this.allowStaleOnFetchAbort,context:d,forceRefresh:S=!1,status:a,signal:w}=e;if(!this.#O)return a&&(a.fetch="get"),this.get(t,{allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:n,status:a});let b={allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:n,ttl:h,noDisposeOnSet:o,size:r,sizeCalculation:g,noUpdateTTL:m,noDeleteOnFetchRejection:f,allowStaleOnFetchRejection:u,allowStaleOnFetchAbort:F,ignoreFetchAbort:c,status:a,signal:w},p=this.#s.get(t);if(p===void 0){a&&(a.fetch="miss");let _=this.#x(t,p,b,d);return _.__returned=_}else{let _=this.#t[p];if(this.#e(_)){let U=i&&_.__staleWhileFetching!==void 0;return a&&(a.fetch="inflight",U&&(a.returnedStale=!0)),U?_.__staleWhileFetching:_.__returned=_}let v=this.#d(p);if(!S&&!v)return a&&(a.fetch="hit"),this.#C(p),s&&this.#z(p),a&&this.#E(a,p),_;let y=this.#x(t,p,b,d),L=y.__staleWhileFetching!==void 0&&i;return a&&(a.fetch=v?"stale":"refresh",L&&v&&(a.returnedStale=!0)),L?y.__staleWhileFetching:y.__returned=y}}async forceFetch(t,e={}){let i=await this.fetch(t,e);if(i===void 0)throw new Error("fetch() returned undefined");return i}memo(t,e={}){let i=this.#W;if(!i)throw new Error("no memoMethod provided to constructor");let{context:s,forceRefresh:n,...h}=e,o=this.get(t,h);if(!n&&o!==void 0)return o;let r=i(t,o,{options:h,context:s});return this.set(t,r,h),r}get(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,status:h}=e,o=this.#s.get(t);if(o!==void 0){let r=this.#t[o],g=this.#e(r);return h&&this.#E(h,o),this.#d(o)?(h&&(h.get="stale"),g?(h&&i&&r.__staleWhileFetching!==void 0&&(h.returnedStale=!0),i?r.__staleWhileFetching:void 0):(n||this.#T(t,"expire"),h&&i&&(h.returnedStale=!0),i?r:void 0)):(h&&(h.get="hit"),g?r.__staleWhileFetching:(this.#C(o),s&&this.#z(o),r))}else h&&(h.get="miss")}#j(t,e){this.#c[e]=t,this.#l[t]=e}#C(t){t!==this.#h&&(t===this.#o?this.#o=this.#l[t]:this.#j(this.#c[t],this.#l[t]),this.#j(this.#h,t),this.#h=t)}delete(t){return this.#T(t,"delete")}#T(t,e){let i=!1;if(this.#n!==0){let s=this.#s.get(t);if(s!==void 0)if(i=!0,this.#n===1)this.#N(e);else{this.#v(s);let n=this.#t[s];if(this.#e(n)?n.__abortController.abort(new Error("deleted")):(this.#y||this.#a)&&(this.#y&&this.#p?.(n,t,e),this.#a&&this.#r?.push([n,t,e])),this.#s.delete(t),this.#i[s]=void 0,this.#t[s]=void 0,s===this.#h)this.#h=this.#c[s];else if(s===this.#o)this.#o=this.#l[s];else{let h=this.#c[s];this.#l[h]=this.#l[s];let o=this.#l[s];this.#c[o]=this.#c[s]}this.#n--,this.#_.push(s)}}if(this.#a&&this.#r?.length){let s=this.#r,n;for(;n=s?.shift();)this.#w?.(...n)}return i}clear(){return this.#N("delete")}#N(t){for(let e of this.#F({allowStale:!0})){let i=this.#t[e];if(this.#e(i))i.__abortController.abort(new Error("deleted"));else{let s=this.#i[e];this.#y&&this.#p?.(i,s,t),this.#a&&this.#r?.push([i,s,t])}}if(this.#s.clear(),this.#t.fill(void 0),this.#i.fill(void 0),this.#u&&this.#b&&(this.#u.fill(0),this.#b.fill(0)),this.#m&&this.#m.fill(0),this.#o=0,this.#h=0,this.#_.length=0,this.#S=0,this.#n=0,this.#a&&this.#r){let e=this.#r,i;for(;i=e?.shift();)this.#w?.(...i)}}};export{D as LRUCache}; -//# sourceMappingURL=index.min.js.map diff --git a/node_modules/lru-cache/dist/esm/index.min.js.map b/node_modules/lru-cache/dist/esm/index.min.js.map deleted file mode 100644 index 117a9de..0000000 --- a/node_modules/lru-cache/dist/esm/index.min.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/index.ts"], - "sourcesContent": ["/**\n * @module LRUCache\n */\n\n// module-private names and types\ntype Perf = { now: () => number }\nconst perf: Perf =\n typeof performance === 'object' &&\n performance &&\n typeof performance.now === 'function'\n ? performance\n : Date\n\nconst warned = new Set()\n\n// either a function or a class\ntype ForC = ((...a: any[]) => any) | { new (...a: any[]): any }\n\n/* c8 ignore start */\nconst PROCESS = (\n typeof process === 'object' && !!process ? process : {}\n) as { [k: string]: any }\n/* c8 ignore start */\n\nconst emitWarning = (\n msg: string,\n type: string,\n code: string,\n fn: ForC\n) => {\n typeof PROCESS.emitWarning === 'function'\n ? PROCESS.emitWarning(msg, type, code, fn)\n : console.error(`[${code}] ${type}: ${msg}`)\n}\n\nlet AC = globalThis.AbortController\nlet AS = globalThis.AbortSignal\n\n/* c8 ignore start */\nif (typeof AC === 'undefined') {\n //@ts-ignore\n AS = class AbortSignal {\n onabort?: (...a: any[]) => any\n _onabort: ((...a: any[]) => any)[] = []\n reason?: any\n aborted: boolean = false\n addEventListener(_: string, fn: (...a: any[]) => any) {\n this._onabort.push(fn)\n }\n }\n //@ts-ignore\n AC = class AbortController {\n constructor() {\n warnACPolyfill()\n }\n signal = new AS()\n abort(reason: any) {\n if (this.signal.aborted) return\n //@ts-ignore\n this.signal.reason = reason\n //@ts-ignore\n this.signal.aborted = true\n //@ts-ignore\n for (const fn of this.signal._onabort) {\n fn(reason)\n }\n this.signal.onabort?.(reason)\n }\n }\n let printACPolyfillWarning =\n PROCESS.env?.LRU_CACHE_IGNORE_AC_WARNING !== '1'\n const warnACPolyfill = () => {\n if (!printACPolyfillWarning) return\n printACPolyfillWarning = false\n emitWarning(\n 'AbortController is not defined. If using lru-cache in ' +\n 'node 14, load an AbortController polyfill from the ' +\n '`node-abort-controller` package. A minimal polyfill is ' +\n 'provided for use by LRUCache.fetch(), but it should not be ' +\n 'relied upon in other contexts (eg, passing it to other APIs that ' +\n 'use AbortController/AbortSignal might have undesirable effects). ' +\n 'You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.',\n 'NO_ABORT_CONTROLLER',\n 'ENOTSUP',\n warnACPolyfill\n )\n }\n}\n/* c8 ignore stop */\n\nconst shouldWarn = (code: string) => !warned.has(code)\n\nconst TYPE = Symbol('type')\nexport type PosInt = number & { [TYPE]: 'Positive Integer' }\nexport type Index = number & { [TYPE]: 'LRUCache Index' }\n\nconst isPosInt = (n: any): n is PosInt =>\n n && n === Math.floor(n) && n > 0 && isFinite(n)\n\nexport type UintArray = Uint8Array | Uint16Array | Uint32Array\nexport type NumberArray = UintArray | number[]\n\n/* c8 ignore start */\n// This is a little bit ridiculous, tbh.\n// The maximum array length is 2^32-1 or thereabouts on most JS impls.\n// And well before that point, you're caching the entire world, I mean,\n// that's ~32GB of just integers for the next/prev links, plus whatever\n// else to hold that many keys and values. Just filling the memory with\n// zeroes at init time is brutal when you get that big.\n// But why not be complete?\n// Maybe in the future, these limits will have expanded.\nconst getUintArray = (max: number) =>\n !isPosInt(max)\n ? null\n : max <= Math.pow(2, 8)\n ? Uint8Array\n : max <= Math.pow(2, 16)\n ? Uint16Array\n : max <= Math.pow(2, 32)\n ? Uint32Array\n : max <= Number.MAX_SAFE_INTEGER\n ? ZeroArray\n : null\n/* c8 ignore stop */\n\nclass ZeroArray extends Array {\n constructor(size: number) {\n super(size)\n this.fill(0)\n }\n}\nexport type { ZeroArray }\nexport type { Stack }\n\nexport type StackLike = Stack | Index[]\nclass Stack {\n heap: NumberArray\n length: number\n // private constructor\n static #constructing: boolean = false\n static create(max: number): StackLike {\n const HeapCls = getUintArray(max)\n if (!HeapCls) return []\n Stack.#constructing = true\n const s = new Stack(max, HeapCls)\n Stack.#constructing = false\n return s\n }\n constructor(\n max: number,\n HeapCls: { new (n: number): NumberArray }\n ) {\n /* c8 ignore start */\n if (!Stack.#constructing) {\n throw new TypeError('instantiate Stack using Stack.create(n)')\n }\n /* c8 ignore stop */\n this.heap = new HeapCls(max)\n this.length = 0\n }\n push(n: Index) {\n this.heap[this.length++] = n\n }\n pop(): Index {\n return this.heap[--this.length] as Index\n }\n}\n\n/**\n * Promise representing an in-progress {@link LRUCache#fetch} call\n */\nexport type BackgroundFetch = Promise & {\n __returned: BackgroundFetch | undefined\n __abortController: AbortController\n __staleWhileFetching: V | undefined\n}\n\nexport type DisposeTask = [\n value: V,\n key: K,\n reason: LRUCache.DisposeReason\n]\n\nexport namespace LRUCache {\n /**\n * An integer greater than 0, reflecting the calculated size of items\n */\n export type Size = number\n\n /**\n * Integer greater than 0, representing some number of milliseconds, or the\n * time at which a TTL started counting from.\n */\n export type Milliseconds = number\n\n /**\n * An integer greater than 0, reflecting a number of items\n */\n export type Count = number\n\n /**\n * The reason why an item was removed from the cache, passed\n * to the {@link Disposer} methods.\n *\n * - `evict`: The item was evicted because it is the least recently used,\n * and the cache is full.\n * - `set`: A new value was set, overwriting the old value being disposed.\n * - `delete`: The item was explicitly deleted, either by calling\n * {@link LRUCache#delete}, {@link LRUCache#clear}, or\n * {@link LRUCache#set} with an undefined value.\n * - `expire`: The item was removed due to exceeding its TTL.\n * - `fetch`: A {@link OptionsBase#fetchMethod} operation returned\n * `undefined` or was aborted, causing the item to be deleted.\n */\n export type DisposeReason =\n | 'evict'\n | 'set'\n | 'delete'\n | 'expire'\n | 'fetch'\n /**\n * A method called upon item removal, passed as the\n * {@link OptionsBase.dispose} and/or\n * {@link OptionsBase.disposeAfter} options.\n */\n export type Disposer = (\n value: V,\n key: K,\n reason: DisposeReason\n ) => void\n\n /**\n * A function that returns the effective calculated size\n * of an entry in the cache.\n */\n export type SizeCalculator = (value: V, key: K) => Size\n\n /**\n * Options provided to the\n * {@link OptionsBase.fetchMethod} function.\n */\n export interface FetcherOptions {\n signal: AbortSignal\n options: FetcherFetchOptions\n /**\n * Object provided in the {@link FetchOptions.context} option to\n * {@link LRUCache#fetch}\n */\n context: FC\n }\n\n /**\n * Occasionally, it may be useful to track the internal behavior of the\n * cache, particularly for logging, debugging, or for behavior within the\n * `fetchMethod`. To do this, you can pass a `status` object to the\n * {@link LRUCache#fetch}, {@link LRUCache#get}, {@link LRUCache#set},\n * {@link LRUCache#memo}, and {@link LRUCache#has} methods.\n *\n * The `status` option should be a plain JavaScript object. The following\n * fields will be set on it appropriately, depending on the situation.\n */\n export interface Status {\n /**\n * The status of a set() operation.\n *\n * - add: the item was not found in the cache, and was added\n * - update: the item was in the cache, with the same value provided\n * - replace: the item was in the cache, and replaced\n * - miss: the item was not added to the cache for some reason\n */\n set?: 'add' | 'update' | 'replace' | 'miss'\n\n /**\n * the ttl stored for the item, or undefined if ttls are not used.\n */\n ttl?: Milliseconds\n\n /**\n * the start time for the item, or undefined if ttls are not used.\n */\n start?: Milliseconds\n\n /**\n * The timestamp used for TTL calculation\n */\n now?: Milliseconds\n\n /**\n * the remaining ttl for the item, or undefined if ttls are not used.\n */\n remainingTTL?: Milliseconds\n\n /**\n * The calculated size for the item, if sizes are used.\n */\n entrySize?: Size\n\n /**\n * The total calculated size of the cache, if sizes are used.\n */\n totalCalculatedSize?: Size\n\n /**\n * A flag indicating that the item was not stored, due to exceeding the\n * {@link OptionsBase.maxEntrySize}\n */\n maxEntrySizeExceeded?: true\n\n /**\n * The old value, specified in the case of `set:'update'` or\n * `set:'replace'`\n */\n oldValue?: V\n\n /**\n * The results of a {@link LRUCache#has} operation\n *\n * - hit: the item was found in the cache\n * - stale: the item was found in the cache, but is stale\n * - miss: the item was not found in the cache\n */\n has?: 'hit' | 'stale' | 'miss'\n\n /**\n * The status of a {@link LRUCache#fetch} operation.\n * Note that this can change as the underlying fetch() moves through\n * various states.\n *\n * - inflight: there is another fetch() for this key which is in process\n * - get: there is no {@link OptionsBase.fetchMethod}, so\n * {@link LRUCache#get} was called.\n * - miss: the item is not in cache, and will be fetched.\n * - hit: the item is in the cache, and was resolved immediately.\n * - stale: the item is in the cache, but stale.\n * - refresh: the item is in the cache, and not stale, but\n * {@link FetchOptions.forceRefresh} was specified.\n */\n fetch?: 'get' | 'inflight' | 'miss' | 'hit' | 'stale' | 'refresh'\n\n /**\n * The {@link OptionsBase.fetchMethod} was called\n */\n fetchDispatched?: true\n\n /**\n * The cached value was updated after a successful call to\n * {@link OptionsBase.fetchMethod}\n */\n fetchUpdated?: true\n\n /**\n * The reason for a fetch() rejection. Either the error raised by the\n * {@link OptionsBase.fetchMethod}, or the reason for an\n * AbortSignal.\n */\n fetchError?: Error\n\n /**\n * The fetch received an abort signal\n */\n fetchAborted?: true\n\n /**\n * The abort signal received was ignored, and the fetch was allowed to\n * continue.\n */\n fetchAbortIgnored?: true\n\n /**\n * The fetchMethod promise resolved successfully\n */\n fetchResolved?: true\n\n /**\n * The fetchMethod promise was rejected\n */\n fetchRejected?: true\n\n /**\n * The status of a {@link LRUCache#get} operation.\n *\n * - fetching: The item is currently being fetched. If a previous value\n * is present and allowed, that will be returned.\n * - stale: The item is in the cache, and is stale.\n * - hit: the item is in the cache\n * - miss: the item is not in the cache\n */\n get?: 'stale' | 'hit' | 'miss'\n\n /**\n * A fetch or get operation returned a stale value.\n */\n returnedStale?: true\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#fetch}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link OptionsBase.noDeleteOnFetchRejection},\n * {@link OptionsBase.allowStaleOnFetchRejection},\n * {@link FetchOptions.forceRefresh}, and\n * {@link FetcherOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.fetchMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the fetchMethod is called.\n */\n export interface FetcherFetchOptions\n extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n status?: Status\n size?: Size\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#fetch} method.\n */\n export interface FetchOptions\n extends FetcherFetchOptions {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.fetchMethod} as\n * the {@link FetcherOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n signal?: AbortSignal\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface FetchOptionsWithContext\n extends FetchOptions {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is\n * `undefined` or `void`\n */\n export interface FetchOptionsNoContext\n extends FetchOptions {\n context?: undefined\n }\n\n export interface MemoOptions\n extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.memoMethod} as\n * the {@link MemoizerOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n status?: Status\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface MemoOptionsWithContext\n extends MemoOptions {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is\n * `undefined` or `void`\n */\n export interface MemoOptionsNoContext\n extends MemoOptions {\n context?: undefined\n }\n\n /**\n * Options provided to the\n * {@link OptionsBase.memoMethod} function.\n */\n export interface MemoizerOptions {\n options: MemoizerMemoOptions\n /**\n * Object provided in the {@link MemoOptions.context} option to\n * {@link LRUCache#memo}\n */\n context: FC\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#memo}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link MemoOptions.forceRefresh}, and\n * {@link MemoerOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.memoMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the memoMethod is called.\n */\n export interface MemoizerMemoOptions\n extends Pick<\n OptionsBase,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n > {\n status?: Status\n size?: Size\n start?: Milliseconds\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#has} method.\n */\n export interface HasOptions\n extends Pick, 'updateAgeOnHas'> {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#get} method.\n */\n export interface GetOptions\n extends Pick<\n OptionsBase,\n 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet'\n > {\n status?: Status\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#peek} method.\n */\n export interface PeekOptions\n extends Pick, 'allowStale'> {}\n\n /**\n * Options that may be passed to the {@link LRUCache#set} method.\n */\n export interface SetOptions\n extends Pick<\n OptionsBase,\n 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'\n > {\n /**\n * If size tracking is enabled, then setting an explicit size\n * in the {@link LRUCache#set} call will prevent calling the\n * {@link OptionsBase.sizeCalculation} function.\n */\n size?: Size\n /**\n * If TTL tracking is enabled, then setting an explicit start\n * time in the {@link LRUCache#set} call will override the\n * default time from `performance.now()` or `Date.now()`.\n *\n * Note that it must be a valid value for whichever time-tracking\n * method is in use.\n */\n start?: Milliseconds\n status?: Status\n }\n\n /**\n * The type signature for the {@link OptionsBase.fetchMethod} option.\n */\n export type Fetcher = (\n key: K,\n staleValue: V | undefined,\n options: FetcherOptions\n ) => Promise | V | undefined | void\n\n /**\n * the type signature for the {@link OptionsBase.memoMethod} option.\n */\n export type Memoizer = (\n key: K,\n staleValue: V | undefined,\n options: MemoizerOptions\n ) => V\n\n /**\n * Options which may be passed to the {@link LRUCache} constructor.\n *\n * Most of these may be overridden in the various options that use\n * them.\n *\n * Despite all being technically optional, the constructor requires that\n * a cache is at minimum limited by one or more of {@link OptionsBase.max},\n * {@link OptionsBase.ttl}, or {@link OptionsBase.maxSize}.\n *\n * If {@link OptionsBase.ttl} is used alone, then it is strongly advised\n * (and in fact required by the type definitions here) that the cache\n * also set {@link OptionsBase.ttlAutopurge}, to prevent potentially\n * unbounded storage.\n *\n * All options are also available on the {@link LRUCache} instance, making\n * it safe to pass an LRUCache instance as the options argumemnt to\n * make another empty cache of the same type.\n *\n * Some options are marked as read-only, because changing them after\n * instantiation is not safe. Changing any of the other options will of\n * course only have an effect on subsequent method calls.\n */\n export interface OptionsBase {\n /**\n * The maximum number of items to store in the cache before evicting\n * old entries. This is read-only on the {@link LRUCache} instance,\n * and may not be overridden.\n *\n * If set, then storage space will be pre-allocated at construction\n * time, and the cache will perform significantly faster.\n *\n * Note that significantly fewer items may be stored, if\n * {@link OptionsBase.maxSize} and/or {@link OptionsBase.ttl} are also\n * set.\n *\n * **It is strongly recommended to set a `max` to prevent unbounded growth\n * of the cache.**\n */\n max?: Count\n\n /**\n * Max time in milliseconds for items to live in cache before they are\n * considered stale. Note that stale items are NOT preemptively removed by\n * default, and MAY live in the cache, contributing to its LRU max, long\n * after they have expired, unless {@link OptionsBase.ttlAutopurge} is\n * set.\n *\n * If set to `0` (the default value), then that means \"do not track\n * TTL\", not \"expire immediately\".\n *\n * Also, as this cache is optimized for LRU/MRU operations, some of\n * the staleness/TTL checks will reduce performance, as they will incur\n * overhead by deleting items.\n *\n * This is not primarily a TTL cache, and does not make strong TTL\n * guarantees. There is no pre-emptive pruning of expired items, but you\n * _may_ set a TTL on the cache, and it will treat expired items as missing\n * when they are fetched, and delete them.\n *\n * Optional, but must be a non-negative integer in ms if specified.\n *\n * This may be overridden by passing an options object to `cache.set()`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if ttl tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * If ttl tracking is enabled, and `max` and `maxSize` are not set,\n * and `ttlAutopurge` is not set, then a warning will be emitted\n * cautioning about the potential for unbounded memory consumption.\n * (The TypeScript definitions will also discourage this.)\n */\n ttl?: Milliseconds\n\n /**\n * Minimum amount of time in ms in which to check for staleness.\n * Defaults to 1, which means that the current time is checked\n * at most once per millisecond.\n *\n * Set to 0 to check the current time every time staleness is tested.\n * (This reduces performance, and is theoretically unnecessary.)\n *\n * Setting this to a higher value will improve performance somewhat\n * while using ttl tracking, albeit at the expense of keeping stale\n * items around a bit longer than their TTLs would indicate.\n *\n * @default 1\n */\n ttlResolution?: Milliseconds\n\n /**\n * Preemptively remove stale items from the cache.\n *\n * Note that this may *significantly* degrade performance, especially if\n * the cache is storing a large number of items. It is almost always best\n * to just leave the stale items in the cache, and let them fall out as new\n * items are added.\n *\n * Note that this means that {@link OptionsBase.allowStale} is a bit\n * pointless, as stale items will be deleted almost as soon as they\n * expire.\n *\n * Use with caution!\n */\n ttlAutopurge?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever it is retrieved from cache with\n * {@link LRUCache#get}, causing it to not expire. (It can still fall out\n * of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n */\n updateAgeOnGet?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever its presence in the cache is\n * checked with {@link LRUCache#has}, causing it to not expire. (It can\n * still fall out of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n */\n updateAgeOnHas?: boolean\n\n /**\n * Allow {@link LRUCache#get} and {@link LRUCache#fetch} calls to return\n * stale data, if available.\n *\n * By default, if you set `ttl`, stale items will only be deleted from the\n * cache when you `get(key)`. That is, it's not preemptively pruning items,\n * unless {@link OptionsBase.ttlAutopurge} is set.\n *\n * If you set `allowStale:true`, it'll return the stale value *as well as*\n * deleting it. If you don't set this, then it'll return `undefined` when\n * you try to get a stale entry.\n *\n * Note that when a stale entry is fetched, _even if it is returned due to\n * `allowStale` being set_, it is removed from the cache immediately. You\n * can suppress this behavior by setting\n * {@link OptionsBase.noDeleteOnStaleGet}, either in the constructor, or in\n * the options provided to {@link LRUCache#get}.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n * The `cache.has()` method will always return `false` for stale items.\n *\n * Only relevant if a ttl is set.\n */\n allowStale?: boolean\n\n /**\n * Function that is called on items when they are dropped from the\n * cache, as `dispose(value, key, reason)`.\n *\n * This can be handy if you want to close file descriptors or do\n * other cleanup tasks when items are no longer stored in the cache.\n *\n * **NOTE**: It is called _before_ the item has been fully removed\n * from the cache, so if you want to put it right back in, you need\n * to wait until the next tick. If you try to add it back in during\n * the `dispose()` function call, it will break things in subtle and\n * weird ways.\n *\n * Unlike several other options, this may _not_ be overridden by\n * passing an option to `set()`, for performance reasons.\n *\n * The `reason` will be one of the following strings, corresponding\n * to the reason for the item's deletion:\n *\n * - `evict` Item was evicted to make space for a new addition\n * - `set` Item was overwritten by a new value\n * - `expire` Item expired its TTL\n * - `fetch` Item was deleted due to a failed or aborted fetch, or a\n * fetchMethod returning `undefined.\n * - `delete` Item was removed by explicit `cache.delete(key)`,\n * `cache.clear()`, or `cache.set(key, undefined)`.\n */\n dispose?: Disposer\n\n /**\n * The same as {@link OptionsBase.dispose}, but called *after* the entry\n * is completely removed and the cache is once again in a clean state.\n *\n * It is safe to add an item right back into the cache at this point.\n * However, note that it is *very* easy to inadvertently create infinite\n * recursion this way.\n */\n disposeAfter?: Disposer\n\n /**\n * Set to true to suppress calling the\n * {@link OptionsBase.dispose} function if the entry key is\n * still accessible within the cache.\n *\n * This may be overridden by passing an options object to\n * {@link LRUCache#set}.\n *\n * Only relevant if `dispose` or `disposeAfter` are set.\n */\n noDisposeOnSet?: boolean\n\n /**\n * Boolean flag to tell the cache to not update the TTL when setting a new\n * value for an existing key (ie, when updating a value rather than\n * inserting a new value). Note that the TTL value is _always_ set (if\n * provided) when adding a new entry into the cache.\n *\n * Has no effect if a {@link OptionsBase.ttl} is not set.\n *\n * May be passed as an option to {@link LRUCache#set}.\n */\n noUpdateTTL?: boolean\n\n /**\n * Set to a positive integer to track the sizes of items added to the\n * cache, and automatically evict items in order to stay below this size.\n * Note that this may result in fewer than `max` items being stored.\n *\n * Attempting to add an item to the cache whose calculated size is greater\n * that this amount will be a no-op. The item will not be cached, and no\n * other items will be evicted.\n *\n * Optional, must be a positive integer if provided.\n *\n * Sets `maxEntrySize` to the same value, unless a different value is\n * provided for `maxEntrySize`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if size tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * Note also that size tracking can negatively impact performance,\n * though for most cases, only minimally.\n */\n maxSize?: Size\n\n /**\n * The maximum allowed size for any single item in the cache.\n *\n * If a larger item is passed to {@link LRUCache#set} or returned by a\n * {@link OptionsBase.fetchMethod} or {@link OptionsBase.memoMethod}, then\n * it will not be stored in the cache.\n *\n * Attempting to add an item whose calculated size is greater than\n * this amount will not cache the item or evict any old items, but\n * WILL delete an existing value if one is already present.\n *\n * Optional, must be a positive integer if provided. Defaults to\n * the value of `maxSize` if provided.\n */\n maxEntrySize?: Size\n\n /**\n * A function that returns a number indicating the item's size.\n *\n * Requires {@link OptionsBase.maxSize} to be set.\n *\n * If not provided, and {@link OptionsBase.maxSize} or\n * {@link OptionsBase.maxEntrySize} are set, then all\n * {@link LRUCache#set} calls **must** provide an explicit\n * {@link SetOptions.size} or sizeCalculation param.\n */\n sizeCalculation?: SizeCalculator\n\n /**\n * Method that provides the implementation for {@link LRUCache#fetch}\n *\n * ```ts\n * fetchMethod(key, staleValue, { signal, options, context })\n * ```\n *\n * If `fetchMethod` is not provided, then `cache.fetch(key)` is equivalent\n * to `Promise.resolve(cache.get(key))`.\n *\n * If at any time, `signal.aborted` is set to `true`, or if the\n * `signal.onabort` method is called, or if it emits an `'abort'` event\n * which you can listen to with `addEventListener`, then that means that\n * the fetch should be abandoned. This may be passed along to async\n * functions aware of AbortController/AbortSignal behavior.\n *\n * The `fetchMethod` should **only** return `undefined` or a Promise\n * resolving to `undefined` if the AbortController signaled an `abort`\n * event. In all other cases, it should return or resolve to a value\n * suitable for adding to the cache.\n *\n * The `options` object is a union of the options that may be provided to\n * `set()` and `get()`. If they are modified, then that will result in\n * modifying the settings to `cache.set()` when the value is resolved, and\n * in the case of\n * {@link OptionsBase.noDeleteOnFetchRejection} and\n * {@link OptionsBase.allowStaleOnFetchRejection}, the handling of\n * `fetchMethod` failures.\n *\n * For example, a DNS cache may update the TTL based on the value returned\n * from a remote DNS server by changing `options.ttl` in the `fetchMethod`.\n */\n fetchMethod?: Fetcher\n\n /**\n * Method that provides the implementation for {@link LRUCache#memo}\n */\n memoMethod?: Memoizer\n\n /**\n * Set to true to suppress the deletion of stale data when a\n * {@link OptionsBase.fetchMethod} returns a rejected promise.\n */\n noDeleteOnFetchRejection?: boolean\n\n /**\n * Do not delete stale items when they are retrieved with\n * {@link LRUCache#get}.\n *\n * Note that the `get` return value will still be `undefined`\n * unless {@link OptionsBase.allowStale} is true.\n *\n * When using time-expiring entries with `ttl`, by default stale\n * items will be removed from the cache when the key is accessed\n * with `cache.get()`.\n *\n * Setting this option will cause stale items to remain in the cache, until\n * they are explicitly deleted with `cache.delete(key)`, or retrieved with\n * `noDeleteOnStaleGet` set to `false`.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n *\n * Only relevant if a ttl is used.\n */\n noDeleteOnStaleGet?: boolean\n\n /**\n * Set to true to allow returning stale data when a\n * {@link OptionsBase.fetchMethod} throws an error or returns a rejected\n * promise.\n *\n * This differs from using {@link OptionsBase.allowStale} in that stale\n * data will ONLY be returned in the case that the {@link LRUCache#fetch}\n * fails, not any other times.\n *\n * If a `fetchMethod` fails, and there is no stale value available, the\n * `fetch()` will resolve to `undefined`. Ie, all `fetchMethod` errors are\n * suppressed.\n *\n * Implies `noDeleteOnFetchRejection`.\n *\n * This may be set in calls to `fetch()`, or defaulted on the constructor,\n * or overridden by modifying the options object in the `fetchMethod`.\n */\n allowStaleOnFetchRejection?: boolean\n\n /**\n * Set to true to return a stale value from the cache when the\n * `AbortSignal` passed to the {@link OptionsBase.fetchMethod} dispatches\n * an `'abort'` event, whether user-triggered, or due to internal cache\n * behavior.\n *\n * Unless {@link OptionsBase.ignoreFetchAbort} is also set, the underlying\n * {@link OptionsBase.fetchMethod} will still be considered canceled, and\n * any value it returns will be ignored and not cached.\n *\n * Caveat: since fetches are aborted when a new value is explicitly\n * set in the cache, this can lead to fetch returning a stale value,\n * since that was the fallback value _at the moment the `fetch()` was\n * initiated_, even though the new updated value is now present in\n * the cache.\n *\n * For example:\n *\n * ```ts\n * const cache = new LRUCache({\n * ttl: 100,\n * fetchMethod: async (url, oldValue, { signal }) => {\n * const res = await fetch(url, { signal })\n * return await res.json()\n * }\n * })\n * cache.set('https://example.com/', { some: 'data' })\n * // 100ms go by...\n * const result = cache.fetch('https://example.com/')\n * cache.set('https://example.com/', { other: 'thing' })\n * console.log(await result) // { some: 'data' }\n * console.log(cache.get('https://example.com/')) // { other: 'thing' }\n * ```\n */\n allowStaleOnFetchAbort?: boolean\n\n /**\n * Set to true to ignore the `abort` event emitted by the `AbortSignal`\n * object passed to {@link OptionsBase.fetchMethod}, and still cache the\n * resulting resolution value, as long as it is not `undefined`.\n *\n * When used on its own, this means aborted {@link LRUCache#fetch} calls\n * are not immediately resolved or rejected when they are aborted, and\n * instead take the full time to await.\n *\n * When used with {@link OptionsBase.allowStaleOnFetchAbort}, aborted\n * {@link LRUCache#fetch} calls will resolve immediately to their stale\n * cached value or `undefined`, and will continue to process and eventually\n * update the cache when they resolve, as long as the resulting value is\n * not `undefined`, thus supporting a \"return stale on timeout while\n * refreshing\" mechanism by passing `AbortSignal.timeout(n)` as the signal.\n *\n * For example:\n *\n * ```ts\n * const c = new LRUCache({\n * ttl: 100,\n * ignoreFetchAbort: true,\n * allowStaleOnFetchAbort: true,\n * fetchMethod: async (key, oldValue, { signal }) => {\n * // note: do NOT pass the signal to fetch()!\n * // let's say this fetch can take a long time.\n * const res = await fetch(`https://slow-backend-server/${key}`)\n * return await res.json()\n * },\n * })\n *\n * // this will return the stale value after 100ms, while still\n * // updating in the background for next time.\n * const val = await c.fetch('key', { signal: AbortSignal.timeout(100) })\n * ```\n *\n * **Note**: regardless of this setting, an `abort` event _is still\n * emitted on the `AbortSignal` object_, so may result in invalid results\n * when passed to other underlying APIs that use AbortSignals.\n *\n * This may be overridden in the {@link OptionsBase.fetchMethod} or the\n * call to {@link LRUCache#fetch}.\n */\n ignoreFetchAbort?: boolean\n }\n\n export interface OptionsMaxLimit\n extends OptionsBase {\n max: Count\n }\n export interface OptionsTTLLimit\n extends OptionsBase {\n ttl: Milliseconds\n ttlAutopurge: boolean\n }\n export interface OptionsSizeLimit\n extends OptionsBase {\n maxSize: Size\n }\n\n /**\n * The valid safe options for the {@link LRUCache} constructor\n */\n export type Options =\n | OptionsMaxLimit\n | OptionsSizeLimit\n | OptionsTTLLimit\n\n /**\n * Entry objects used by {@link LRUCache#load} and {@link LRUCache#dump},\n * and returned by {@link LRUCache#info}.\n */\n export interface Entry {\n value: V\n ttl?: Milliseconds\n size?: Size\n start?: Milliseconds\n }\n}\n\n/**\n * Default export, the thing you're using this module to get.\n *\n * The `K` and `V` types define the key and value types, respectively. The\n * optional `FC` type defines the type of the `context` object passed to\n * `cache.fetch()` and `cache.memo()`.\n *\n * Keys and values **must not** be `null` or `undefined`.\n *\n * All properties from the options object (with the exception of `max`,\n * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are\n * added as normal public members. (The listed options are read-only getters.)\n *\n * Changing any of these will alter the defaults for subsequent method calls.\n */\nexport class LRUCache\n implements Map\n{\n // options that cannot be changed without disaster\n readonly #max: LRUCache.Count\n readonly #maxSize: LRUCache.Size\n readonly #dispose?: LRUCache.Disposer\n readonly #disposeAfter?: LRUCache.Disposer\n readonly #fetchMethod?: LRUCache.Fetcher\n readonly #memoMethod?: LRUCache.Memoizer\n\n /**\n * {@link LRUCache.OptionsBase.ttl}\n */\n ttl: LRUCache.Milliseconds\n\n /**\n * {@link LRUCache.OptionsBase.ttlResolution}\n */\n ttlResolution: LRUCache.Milliseconds\n /**\n * {@link LRUCache.OptionsBase.ttlAutopurge}\n */\n ttlAutopurge: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnGet}\n */\n updateAgeOnGet: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnHas}\n */\n updateAgeOnHas: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStale}\n */\n allowStale: boolean\n\n /**\n * {@link LRUCache.OptionsBase.noDisposeOnSet}\n */\n noDisposeOnSet: boolean\n /**\n * {@link LRUCache.OptionsBase.noUpdateTTL}\n */\n noUpdateTTL: boolean\n /**\n * {@link LRUCache.OptionsBase.maxEntrySize}\n */\n maxEntrySize: LRUCache.Size\n /**\n * {@link LRUCache.OptionsBase.sizeCalculation}\n */\n sizeCalculation?: LRUCache.SizeCalculator\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection}\n */\n noDeleteOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnStaleGet}\n */\n noDeleteOnStaleGet: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}\n */\n allowStaleOnFetchAbort: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection}\n */\n allowStaleOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.ignoreFetchAbort}\n */\n ignoreFetchAbort: boolean\n\n // computed properties\n #size: LRUCache.Count\n #calculatedSize: LRUCache.Size\n #keyMap: Map\n #keyList: (K | undefined)[]\n #valList: (V | BackgroundFetch | undefined)[]\n #next: NumberArray\n #prev: NumberArray\n #head: Index\n #tail: Index\n #free: StackLike\n #disposed?: DisposeTask[]\n #sizes?: ZeroArray\n #starts?: ZeroArray\n #ttls?: ZeroArray\n\n #hasDispose: boolean\n #hasFetchMethod: boolean\n #hasDisposeAfter: boolean\n\n /**\n * Do not call this method unless you need to inspect the\n * inner workings of the cache. If anything returned by this\n * object is modified in any way, strange breakage may occur.\n *\n * These fields are private for a reason!\n *\n * @internal\n */\n static unsafeExposeInternals<\n K extends {},\n V extends {},\n FC extends unknown = unknown\n >(c: LRUCache) {\n return {\n // properties\n starts: c.#starts,\n ttls: c.#ttls,\n sizes: c.#sizes,\n keyMap: c.#keyMap as Map,\n keyList: c.#keyList,\n valList: c.#valList,\n next: c.#next,\n prev: c.#prev,\n get head() {\n return c.#head\n },\n get tail() {\n return c.#tail\n },\n free: c.#free,\n // methods\n isBackgroundFetch: (p: any) => c.#isBackgroundFetch(p),\n backgroundFetch: (\n k: K,\n index: number | undefined,\n options: LRUCache.FetchOptions,\n context: any\n ): BackgroundFetch =>\n c.#backgroundFetch(\n k,\n index as Index | undefined,\n options,\n context\n ),\n moveToTail: (index: number): void =>\n c.#moveToTail(index as Index),\n indexes: (options?: { allowStale: boolean }) =>\n c.#indexes(options),\n rindexes: (options?: { allowStale: boolean }) =>\n c.#rindexes(options),\n isStale: (index: number | undefined) =>\n c.#isStale(index as Index),\n }\n }\n\n // Protected read-only members\n\n /**\n * {@link LRUCache.OptionsBase.max} (read-only)\n */\n get max(): LRUCache.Count {\n return this.#max\n }\n /**\n * {@link LRUCache.OptionsBase.maxSize} (read-only)\n */\n get maxSize(): LRUCache.Count {\n return this.#maxSize\n }\n /**\n * The total computed size of items in the cache (read-only)\n */\n get calculatedSize(): LRUCache.Size {\n return this.#calculatedSize\n }\n /**\n * The number of items stored in the cache (read-only)\n */\n get size(): LRUCache.Count {\n return this.#size\n }\n /**\n * {@link LRUCache.OptionsBase.fetchMethod} (read-only)\n */\n get fetchMethod(): LRUCache.Fetcher | undefined {\n return this.#fetchMethod\n }\n get memoMethod(): LRUCache.Memoizer | undefined {\n return this.#memoMethod\n }\n /**\n * {@link LRUCache.OptionsBase.dispose} (read-only)\n */\n get dispose() {\n return this.#dispose\n }\n /**\n * {@link LRUCache.OptionsBase.disposeAfter} (read-only)\n */\n get disposeAfter() {\n return this.#disposeAfter\n }\n\n constructor(\n options: LRUCache.Options | LRUCache\n ) {\n const {\n max = 0,\n ttl,\n ttlResolution = 1,\n ttlAutopurge,\n updateAgeOnGet,\n updateAgeOnHas,\n allowStale,\n dispose,\n disposeAfter,\n noDisposeOnSet,\n noUpdateTTL,\n maxSize = 0,\n maxEntrySize = 0,\n sizeCalculation,\n fetchMethod,\n memoMethod,\n noDeleteOnFetchRejection,\n noDeleteOnStaleGet,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n } = options\n\n if (max !== 0 && !isPosInt(max)) {\n throw new TypeError('max option must be a nonnegative integer')\n }\n\n const UintArray = max ? getUintArray(max) : Array\n if (!UintArray) {\n throw new Error('invalid max value: ' + max)\n }\n\n this.#max = max\n this.#maxSize = maxSize\n this.maxEntrySize = maxEntrySize || this.#maxSize\n this.sizeCalculation = sizeCalculation\n if (this.sizeCalculation) {\n if (!this.#maxSize && !this.maxEntrySize) {\n throw new TypeError(\n 'cannot set sizeCalculation without setting maxSize or maxEntrySize'\n )\n }\n if (typeof this.sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation set to non-function')\n }\n }\n\n if (\n memoMethod !== undefined &&\n typeof memoMethod !== 'function'\n ) {\n throw new TypeError('memoMethod must be a function if defined')\n }\n this.#memoMethod = memoMethod\n\n if (\n fetchMethod !== undefined &&\n typeof fetchMethod !== 'function'\n ) {\n throw new TypeError(\n 'fetchMethod must be a function if specified'\n )\n }\n this.#fetchMethod = fetchMethod\n this.#hasFetchMethod = !!fetchMethod\n\n this.#keyMap = new Map()\n this.#keyList = new Array(max).fill(undefined)\n this.#valList = new Array(max).fill(undefined)\n this.#next = new UintArray(max)\n this.#prev = new UintArray(max)\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free = Stack.create(max)\n this.#size = 0\n this.#calculatedSize = 0\n\n if (typeof dispose === 'function') {\n this.#dispose = dispose\n }\n if (typeof disposeAfter === 'function') {\n this.#disposeAfter = disposeAfter\n this.#disposed = []\n } else {\n this.#disposeAfter = undefined\n this.#disposed = undefined\n }\n this.#hasDispose = !!this.#dispose\n this.#hasDisposeAfter = !!this.#disposeAfter\n\n this.noDisposeOnSet = !!noDisposeOnSet\n this.noUpdateTTL = !!noUpdateTTL\n this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection\n this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection\n this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort\n this.ignoreFetchAbort = !!ignoreFetchAbort\n\n // NB: maxEntrySize is set to maxSize if it's set\n if (this.maxEntrySize !== 0) {\n if (this.#maxSize !== 0) {\n if (!isPosInt(this.#maxSize)) {\n throw new TypeError(\n 'maxSize must be a positive integer if specified'\n )\n }\n }\n if (!isPosInt(this.maxEntrySize)) {\n throw new TypeError(\n 'maxEntrySize must be a positive integer if specified'\n )\n }\n this.#initializeSizeTracking()\n }\n\n this.allowStale = !!allowStale\n this.noDeleteOnStaleGet = !!noDeleteOnStaleGet\n this.updateAgeOnGet = !!updateAgeOnGet\n this.updateAgeOnHas = !!updateAgeOnHas\n this.ttlResolution =\n isPosInt(ttlResolution) || ttlResolution === 0\n ? ttlResolution\n : 1\n this.ttlAutopurge = !!ttlAutopurge\n this.ttl = ttl || 0\n if (this.ttl) {\n if (!isPosInt(this.ttl)) {\n throw new TypeError(\n 'ttl must be a positive integer if specified'\n )\n }\n this.#initializeTTLTracking()\n }\n\n // do not allow completely unbounded caches\n if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) {\n throw new TypeError(\n 'At least one of max, maxSize, or ttl is required'\n )\n }\n if (!this.ttlAutopurge && !this.#max && !this.#maxSize) {\n const code = 'LRU_CACHE_UNBOUNDED'\n if (shouldWarn(code)) {\n warned.add(code)\n const msg =\n 'TTL caching without ttlAutopurge, max, or maxSize can ' +\n 'result in unbounded memory consumption.'\n emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache)\n }\n }\n }\n\n /**\n * Return the number of ms left in the item's TTL. If item is not in cache,\n * returns `0`. Returns `Infinity` if item is in cache without a defined TTL.\n */\n getRemainingTTL(key: K) {\n return this.#keyMap.has(key) ? Infinity : 0\n }\n\n #initializeTTLTracking() {\n const ttls = new ZeroArray(this.#max)\n const starts = new ZeroArray(this.#max)\n this.#ttls = ttls\n this.#starts = starts\n\n this.#setItemTTL = (index, ttl, start = perf.now()) => {\n starts[index] = ttl !== 0 ? start : 0\n ttls[index] = ttl\n if (ttl !== 0 && this.ttlAutopurge) {\n const t = setTimeout(() => {\n if (this.#isStale(index)) {\n this.#delete(this.#keyList[index] as K, 'expire')\n }\n }, ttl + 1)\n // unref() not supported on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n }\n }\n\n this.#updateItemAge = index => {\n starts[index] = ttls[index] !== 0 ? perf.now() : 0\n }\n\n this.#statusTTL = (status, index) => {\n if (ttls[index]) {\n const ttl = ttls[index]\n const start = starts[index]\n /* c8 ignore next */\n if (!ttl || !start) return\n status.ttl = ttl\n status.start = start\n status.now = cachedNow || getNow()\n const age = status.now - start\n status.remainingTTL = ttl - age\n }\n }\n\n // debounce calls to perf.now() to 1s so we're not hitting\n // that costly call repeatedly.\n let cachedNow = 0\n const getNow = () => {\n const n = perf.now()\n if (this.ttlResolution > 0) {\n cachedNow = n\n const t = setTimeout(\n () => (cachedNow = 0),\n this.ttlResolution\n )\n // not available on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n }\n return n\n }\n\n this.getRemainingTTL = key => {\n const index = this.#keyMap.get(key)\n if (index === undefined) {\n return 0\n }\n const ttl = ttls[index]\n const start = starts[index]\n if (!ttl || !start) {\n return Infinity\n }\n const age = (cachedNow || getNow()) - start\n return ttl - age\n }\n\n this.#isStale = index => {\n const s = starts[index]\n const t = ttls[index]\n return !!t && !!s && (cachedNow || getNow()) - s > t\n }\n }\n\n // conditionally set private methods related to TTL\n #updateItemAge: (index: Index) => void = () => {}\n #statusTTL: (status: LRUCache.Status, index: Index) => void =\n () => {}\n #setItemTTL: (\n index: Index,\n ttl: LRUCache.Milliseconds,\n start?: LRUCache.Milliseconds\n // ignore because we never call this if we're not already in TTL mode\n /* c8 ignore start */\n ) => void = () => {}\n /* c8 ignore stop */\n\n #isStale: (index: Index) => boolean = () => false\n\n #initializeSizeTracking() {\n const sizes = new ZeroArray(this.#max)\n this.#calculatedSize = 0\n this.#sizes = sizes\n this.#removeItemSize = index => {\n this.#calculatedSize -= sizes[index] as number\n sizes[index] = 0\n }\n this.#requireSize = (k, v, size, sizeCalculation) => {\n // provisionally accept background fetches.\n // actual value size will be checked when they return.\n if (this.#isBackgroundFetch(v)) {\n return 0\n }\n if (!isPosInt(size)) {\n if (sizeCalculation) {\n if (typeof sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation must be a function')\n }\n size = sizeCalculation(v, k)\n if (!isPosInt(size)) {\n throw new TypeError(\n 'sizeCalculation return invalid (expect positive integer)'\n )\n }\n } else {\n throw new TypeError(\n 'invalid size value (must be positive integer). ' +\n 'When maxSize or maxEntrySize is used, sizeCalculation ' +\n 'or size must be set.'\n )\n }\n }\n return size\n }\n this.#addItemSize = (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status\n ) => {\n sizes[index] = size\n if (this.#maxSize) {\n const maxSize = this.#maxSize - (sizes[index] as number)\n while (this.#calculatedSize > maxSize) {\n this.#evict(true)\n }\n }\n this.#calculatedSize += sizes[index] as number\n if (status) {\n status.entrySize = size\n status.totalCalculatedSize = this.#calculatedSize\n }\n }\n }\n\n #removeItemSize: (index: Index) => void = _i => {}\n #addItemSize: (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status\n ) => void = (_i, _s, _st) => {}\n #requireSize: (\n k: K,\n v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator\n ) => LRUCache.Size = (\n _k: K,\n _v: V | BackgroundFetch,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator\n ) => {\n if (size || sizeCalculation) {\n throw new TypeError(\n 'cannot set size without setting maxSize or maxEntrySize on cache'\n )\n }\n return 0\n };\n\n *#indexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#tail; true; ) {\n if (!this.#isValidIndex(i)) {\n break\n }\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#head) {\n break\n } else {\n i = this.#prev[i] as Index\n }\n }\n }\n }\n\n *#rindexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#head; true; ) {\n if (!this.#isValidIndex(i)) {\n break\n }\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#tail) {\n break\n } else {\n i = this.#next[i] as Index\n }\n }\n }\n }\n\n #isValidIndex(index: Index) {\n return (\n index !== undefined &&\n this.#keyMap.get(this.#keyList[index] as K) === index\n )\n }\n\n /**\n * Return a generator yielding `[key, value]` pairs,\n * in order from most recently used to least recently used.\n */\n *entries() {\n for (const i of this.#indexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]] as [K, V]\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.entries}\n *\n * Return a generator yielding `[key, value]` pairs,\n * in order from least recently used to most recently used.\n */\n *rentries() {\n for (const i of this.#rindexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]]\n }\n }\n }\n\n /**\n * Return a generator yielding the keys in the cache,\n * in order from most recently used to least recently used.\n */\n *keys() {\n for (const i of this.#indexes()) {\n const k = this.#keyList[i]\n if (\n k !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield k\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.keys}\n *\n * Return a generator yielding the keys in the cache,\n * in order from least recently used to most recently used.\n */\n *rkeys() {\n for (const i of this.#rindexes()) {\n const k = this.#keyList[i]\n if (\n k !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield k\n }\n }\n }\n\n /**\n * Return a generator yielding the values in the cache,\n * in order from most recently used to least recently used.\n */\n *values() {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n if (\n v !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield this.#valList[i] as V\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.values}\n *\n * Return a generator yielding the values in the cache,\n * in order from least recently used to most recently used.\n */\n *rvalues() {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n if (\n v !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield this.#valList[i]\n }\n }\n }\n\n /**\n * Iterating over the cache itself yields the same results as\n * {@link LRUCache.entries}\n */\n [Symbol.iterator]() {\n return this.entries()\n }\n\n /**\n * A String value that is used in the creation of the default string\n * description of an object. Called by the built-in method\n * `Object.prototype.toString`.\n */\n [Symbol.toStringTag] = 'LRUCache'\n\n /**\n * Find a value for which the supplied fn method returns a truthy value,\n * similar to `Array.find()`. fn is called as `fn(value, key, cache)`.\n */\n find(\n fn: (v: V, k: K, self: LRUCache) => boolean,\n getOptions: LRUCache.GetOptions = {}\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined) continue\n if (fn(value, this.#keyList[i] as K, this)) {\n return this.get(this.#keyList[i] as K, getOptions)\n }\n }\n }\n\n /**\n * Call the supplied function on each item in the cache, in order from most\n * recently used to least recently used.\n *\n * `fn` is called as `fn(value, key, cache)`.\n *\n * If `thisp` is provided, function will be called in the `this`-context of\n * the provided object, or the cache if no `thisp` object is provided.\n *\n * Does not update age or recenty of use, or iterate over stale values.\n */\n forEach(\n fn: (v: V, k: K, self: LRUCache) => any,\n thisp: any = this\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * The same as {@link LRUCache.forEach} but items are iterated over in\n * reverse order. (ie, less recently used items are iterated over first.)\n */\n rforEach(\n fn: (v: V, k: K, self: LRUCache) => any,\n thisp: any = this\n ) {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * Delete any stale entries. Returns true if anything was removed,\n * false otherwise.\n */\n purgeStale() {\n let deleted = false\n for (const i of this.#rindexes({ allowStale: true })) {\n if (this.#isStale(i)) {\n this.#delete(this.#keyList[i] as K, 'expire')\n deleted = true\n }\n }\n return deleted\n }\n\n /**\n * Get the extended info about a given entry, to get its value, size, and\n * TTL info simultaneously. Returns `undefined` if the key is not present.\n *\n * Unlike {@link LRUCache#dump}, which is designed to be portable and survive\n * serialization, the `start` value is always the current timestamp, and the\n * `ttl` is a calculated remaining time to live (negative if expired).\n *\n * Always returns stale values, if their info is found in the cache, so be\n * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl})\n * if relevant.\n */\n info(key: K): LRUCache.Entry | undefined {\n const i = this.#keyMap.get(key)\n if (i === undefined) return undefined\n const v = this.#valList[i]\n const value: V | undefined = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined) return undefined\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n const ttl = this.#ttls[i]\n const start = this.#starts[i]\n if (ttl && start) {\n const remain = ttl - (perf.now() - start)\n entry.ttl = remain\n entry.start = Date.now()\n }\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n return entry\n }\n\n /**\n * Return an array of [key, {@link LRUCache.Entry}] tuples which can be\n * passed to {@link LRLUCache#load}.\n *\n * The `start` fields are calculated relative to a portable `Date.now()`\n * timestamp, even if `performance.now()` is available.\n *\n * Stale entries are always included in the `dump`, even if\n * {@link LRUCache.OptionsBase.allowStale} is false.\n *\n * Note: this returns an actual array, not a generator, so it can be more\n * easily passed around.\n */\n dump() {\n const arr: [K, LRUCache.Entry][] = []\n for (const i of this.#indexes({ allowStale: true })) {\n const key = this.#keyList[i]\n const v = this.#valList[i]\n const value: V | undefined = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined || key === undefined) continue\n const entry: LRUCache.Entry = { value }\n if (this.#ttls && this.#starts) {\n entry.ttl = this.#ttls[i]\n // always dump the start relative to a portable timestamp\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = perf.now() - (this.#starts[i] as number)\n entry.start = Math.floor(Date.now() - age)\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n arr.unshift([key, entry])\n }\n return arr\n }\n\n /**\n * Reset the cache and load in the items in entries in the order listed.\n *\n * The shape of the resulting cache may be different if the same options are\n * not used in both caches.\n *\n * The `start` fields are assumed to be calculated relative to a portable\n * `Date.now()` timestamp, even if `performance.now()` is available.\n */\n load(arr: [K, LRUCache.Entry][]) {\n this.clear()\n for (const [key, entry] of arr) {\n if (entry.start) {\n // entry.start is a portable timestamp, but we may be using\n // node's performance.now(), so calculate the offset, so that\n // we get the intended remaining TTL, no matter how long it's\n // been on ice.\n //\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = Date.now() - entry.start\n entry.start = perf.now() - age\n }\n this.set(key, entry.value, entry)\n }\n }\n\n /**\n * Add a value to the cache.\n *\n * Note: if `undefined` is specified as a value, this is an alias for\n * {@link LRUCache#delete}\n *\n * Fields on the {@link LRUCache.SetOptions} options param will override\n * their corresponding values in the constructor options for the scope\n * of this single `set()` operation.\n *\n * If `start` is provided, then that will set the effective start\n * time for the TTL calculation. Note that this must be a previous\n * value of `performance.now()` if supported, or a previous value of\n * `Date.now()` if not.\n *\n * Options object may also include `size`, which will prevent\n * calling the `sizeCalculation` function and just use the specified\n * number if it is a positive integer, and `noDisposeOnSet` which\n * will prevent calling a `dispose` function in the case of\n * overwrites.\n *\n * If the `size` (or return value of `sizeCalculation`) for a given\n * entry is greater than `maxEntrySize`, then the item will not be\n * added to the cache.\n *\n * Will update the recency of the entry.\n *\n * If the value is `undefined`, then this is an alias for\n * `cache.delete(key)`. `undefined` is never stored in the cache.\n */\n set(\n k: K,\n v: V | BackgroundFetch | undefined,\n setOptions: LRUCache.SetOptions = {}\n ) {\n if (v === undefined) {\n this.delete(k)\n return this\n }\n const {\n ttl = this.ttl,\n start,\n noDisposeOnSet = this.noDisposeOnSet,\n sizeCalculation = this.sizeCalculation,\n status,\n } = setOptions\n let { noUpdateTTL = this.noUpdateTTL } = setOptions\n\n const size = this.#requireSize(\n k,\n v,\n setOptions.size || 0,\n sizeCalculation\n )\n // if the item doesn't fit, don't do anything\n // NB: maxEntrySize set to maxSize by default\n if (this.maxEntrySize && size > this.maxEntrySize) {\n if (status) {\n status.set = 'miss'\n status.maxEntrySizeExceeded = true\n }\n // have to delete, in case something is there already.\n this.#delete(k, 'set')\n return this\n }\n let index = this.#size === 0 ? undefined : this.#keyMap.get(k)\n if (index === undefined) {\n // addition\n index = (\n this.#size === 0\n ? this.#tail\n : this.#free.length !== 0\n ? this.#free.pop()\n : this.#size === this.#max\n ? this.#evict(false)\n : this.#size\n ) as Index\n this.#keyList[index] = k\n this.#valList[index] = v\n this.#keyMap.set(k, index)\n this.#next[this.#tail] = index\n this.#prev[index] = this.#tail\n this.#tail = index\n this.#size++\n this.#addItemSize(index, size, status)\n if (status) status.set = 'add'\n noUpdateTTL = false\n } else {\n // update\n this.#moveToTail(index)\n const oldVal = this.#valList[index] as V | BackgroundFetch\n if (v !== oldVal) {\n if (this.#hasFetchMethod && this.#isBackgroundFetch(oldVal)) {\n oldVal.__abortController.abort(new Error('replaced'))\n const { __staleWhileFetching: s } = oldVal\n if (s !== undefined && !noDisposeOnSet) {\n if (this.#hasDispose) {\n this.#dispose?.(s as V, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([s as V, k, 'set'])\n }\n }\n } else if (!noDisposeOnSet) {\n if (this.#hasDispose) {\n this.#dispose?.(oldVal as V, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldVal as V, k, 'set'])\n }\n }\n this.#removeItemSize(index)\n this.#addItemSize(index, size, status)\n this.#valList[index] = v\n if (status) {\n status.set = 'replace'\n const oldValue =\n oldVal && this.#isBackgroundFetch(oldVal)\n ? oldVal.__staleWhileFetching\n : oldVal\n if (oldValue !== undefined) status.oldValue = oldValue\n }\n } else if (status) {\n status.set = 'update'\n }\n }\n if (ttl !== 0 && !this.#ttls) {\n this.#initializeTTLTracking()\n }\n if (this.#ttls) {\n if (!noUpdateTTL) {\n this.#setItemTTL(index, ttl, start)\n }\n if (status) this.#statusTTL(status, index)\n }\n if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return this\n }\n\n /**\n * Evict the least recently used item, returning its value or\n * `undefined` if cache is empty.\n */\n pop(): V | undefined {\n try {\n while (this.#size) {\n const val = this.#valList[this.#head]\n this.#evict(true)\n if (this.#isBackgroundFetch(val)) {\n if (val.__staleWhileFetching) {\n return val.__staleWhileFetching\n }\n } else if (val !== undefined) {\n return val\n }\n }\n } finally {\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n }\n\n #evict(free: boolean) {\n const head = this.#head\n const k = this.#keyList[head] as K\n const v = this.#valList[head] as V\n if (this.#hasFetchMethod && this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('evicted'))\n } else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v, k, 'evict')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v, k, 'evict'])\n }\n }\n this.#removeItemSize(head)\n // if we aren't about to use the index, then null these out\n if (free) {\n this.#keyList[head] = undefined\n this.#valList[head] = undefined\n this.#free.push(head)\n }\n if (this.#size === 1) {\n this.#head = this.#tail = 0 as Index\n this.#free.length = 0\n } else {\n this.#head = this.#next[head] as Index\n }\n this.#keyMap.delete(k)\n this.#size--\n return head\n }\n\n /**\n * Check if a key is in the cache, without updating the recency of use.\n * Will return false if the item is stale, even though it is technically\n * in the cache.\n *\n * Check if a key is in the cache, without updating the recency of\n * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set\n * to `true` in either the options or the constructor.\n *\n * Will return `false` if the item is stale, even though it is technically in\n * the cache. The difference can be determined (if it matters) by using a\n * `status` argument, and inspecting the `has` field.\n *\n * Will not update item age unless\n * {@link LRUCache.OptionsBase.updateAgeOnHas} is set.\n */\n has(k: K, hasOptions: LRUCache.HasOptions = {}) {\n const { updateAgeOnHas = this.updateAgeOnHas, status } =\n hasOptions\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n const v = this.#valList[index]\n if (\n this.#isBackgroundFetch(v) &&\n v.__staleWhileFetching === undefined\n ) {\n return false\n }\n if (!this.#isStale(index)) {\n if (updateAgeOnHas) {\n this.#updateItemAge(index)\n }\n if (status) {\n status.has = 'hit'\n this.#statusTTL(status, index)\n }\n return true\n } else if (status) {\n status.has = 'stale'\n this.#statusTTL(status, index)\n }\n } else if (status) {\n status.has = 'miss'\n }\n return false\n }\n\n /**\n * Like {@link LRUCache#get} but doesn't update recency or delete stale\n * items.\n *\n * Returns `undefined` if the item is stale, unless\n * {@link LRUCache.OptionsBase.allowStale} is set.\n */\n peek(k: K, peekOptions: LRUCache.PeekOptions = {}) {\n const { allowStale = this.allowStale } = peekOptions\n const index = this.#keyMap.get(k)\n if (\n index === undefined ||\n (!allowStale && this.#isStale(index))\n ) {\n return\n }\n const v = this.#valList[index]\n // either stale and allowed, or forcing a refresh of non-stale value\n return this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n }\n\n #backgroundFetch(\n k: K,\n index: Index | undefined,\n options: LRUCache.FetchOptions,\n context: any\n ): BackgroundFetch {\n const v = index === undefined ? undefined : this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n return v\n }\n\n const ac = new AC()\n const { signal } = options\n // when/if our AC signals, then stop listening to theirs.\n signal?.addEventListener('abort', () => ac.abort(signal.reason), {\n signal: ac.signal,\n })\n\n const fetchOpts = {\n signal: ac.signal,\n options,\n context,\n }\n\n const cb = (\n v: V | undefined,\n updateCache = false\n ): V | undefined => {\n const { aborted } = ac.signal\n const ignoreAbort = options.ignoreFetchAbort && v !== undefined\n if (options.status) {\n if (aborted && !updateCache) {\n options.status.fetchAborted = true\n options.status.fetchError = ac.signal.reason\n if (ignoreAbort) options.status.fetchAbortIgnored = true\n } else {\n options.status.fetchResolved = true\n }\n }\n if (aborted && !ignoreAbort && !updateCache) {\n return fetchFail(ac.signal.reason)\n }\n // either we didn't abort, and are still here, or we did, and ignored\n const bf = p as BackgroundFetch\n if (this.#valList[index as Index] === p) {\n if (v === undefined) {\n if (bf.__staleWhileFetching) {\n this.#valList[index as Index] = bf.__staleWhileFetching\n } else {\n this.#delete(k, 'fetch')\n }\n } else {\n if (options.status) options.status.fetchUpdated = true\n this.set(k, v, fetchOpts.options)\n }\n }\n return v\n }\n\n const eb = (er: any) => {\n if (options.status) {\n options.status.fetchRejected = true\n options.status.fetchError = er\n }\n return fetchFail(er)\n }\n\n const fetchFail = (er: any): V | undefined => {\n const { aborted } = ac.signal\n const allowStaleAborted =\n aborted && options.allowStaleOnFetchAbort\n const allowStale =\n allowStaleAborted || options.allowStaleOnFetchRejection\n const noDelete = allowStale || options.noDeleteOnFetchRejection\n const bf = p as BackgroundFetch\n if (this.#valList[index as Index] === p) {\n // if we allow stale on fetch rejections, then we need to ensure that\n // the stale value is not removed from the cache when the fetch fails.\n const del = !noDelete || bf.__staleWhileFetching === undefined\n if (del) {\n this.#delete(k, 'fetch')\n } else if (!allowStaleAborted) {\n // still replace the *promise* with the stale value,\n // since we are done with the promise at this point.\n // leave it untouched if we're still waiting for an\n // aborted background fetch that hasn't yet returned.\n this.#valList[index as Index] = bf.__staleWhileFetching\n }\n }\n if (allowStale) {\n if (options.status && bf.__staleWhileFetching !== undefined) {\n options.status.returnedStale = true\n }\n return bf.__staleWhileFetching\n } else if (bf.__returned === bf) {\n throw er\n }\n }\n\n const pcall = (\n res: (v: V | undefined) => void,\n rej: (e: any) => void\n ) => {\n const fmp = this.#fetchMethod?.(k, v, fetchOpts)\n if (fmp && fmp instanceof Promise) {\n fmp.then(v => res(v === undefined ? undefined : v), rej)\n }\n // ignored, we go until we finish, regardless.\n // defer check until we are actually aborting,\n // so fetchMethod can override.\n ac.signal.addEventListener('abort', () => {\n if (\n !options.ignoreFetchAbort ||\n options.allowStaleOnFetchAbort\n ) {\n res(undefined)\n // when it eventually resolves, update the cache.\n if (options.allowStaleOnFetchAbort) {\n res = v => cb(v, true)\n }\n }\n })\n }\n\n if (options.status) options.status.fetchDispatched = true\n const p = new Promise(pcall).then(cb, eb)\n const bf: BackgroundFetch = Object.assign(p, {\n __abortController: ac,\n __staleWhileFetching: v,\n __returned: undefined,\n })\n\n if (index === undefined) {\n // internal, don't expose status.\n this.set(k, bf, { ...fetchOpts.options, status: undefined })\n index = this.#keyMap.get(k)\n } else {\n this.#valList[index] = bf\n }\n return bf\n }\n\n #isBackgroundFetch(p: any): p is BackgroundFetch {\n if (!this.#hasFetchMethod) return false\n const b = p as BackgroundFetch\n return (\n !!b &&\n b instanceof Promise &&\n b.hasOwnProperty('__staleWhileFetching') &&\n b.__abortController instanceof AC\n )\n }\n\n /**\n * Make an asynchronous cached fetch using the\n * {@link LRUCache.OptionsBase.fetchMethod} function.\n *\n * If the value is in the cache and not stale, then the returned\n * Promise resolves to the value.\n *\n * If not in the cache, or beyond its TTL staleness, then\n * `fetchMethod(key, staleValue, { options, signal, context })` is\n * called, and the value returned will be added to the cache once\n * resolved.\n *\n * If called with `allowStale`, and an asynchronous fetch is\n * currently in progress to reload a stale value, then the former\n * stale value will be returned.\n *\n * If called with `forceRefresh`, then the cached item will be\n * re-fetched, even if it is not stale. However, if `allowStale` is also\n * set, then the old value will still be returned. This is useful\n * in cases where you want to force a reload of a cached value. If\n * a background fetch is already in progress, then `forceRefresh`\n * has no effect.\n *\n * If multiple fetches for the same key are issued, then they will all be\n * coalesced into a single call to fetchMethod.\n *\n * Note that this means that handling options such as\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort},\n * {@link LRUCache.FetchOptions.signal},\n * and {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} will be\n * determined by the FIRST fetch() call for a given key.\n *\n * This is a known (fixable) shortcoming which will be addresed on when\n * someone complains about it, as the fix would involve added complexity and\n * may not be worth the costs for this edge case.\n *\n * If {@link LRUCache.OptionsBase.fetchMethod} is not specified, then this is\n * effectively an alias for `Promise.resolve(cache.get(key))`.\n *\n * When the fetch method resolves to a value, if the fetch has not\n * been aborted due to deletion, eviction, or being overwritten,\n * then it is added to the cache using the options provided.\n *\n * If the key is evicted or deleted before the `fetchMethod`\n * resolves, then the AbortSignal passed to the `fetchMethod` will\n * receive an `abort` event, and the promise returned by `fetch()`\n * will reject with the reason for the abort.\n *\n * If a `signal` is passed to the `fetch()` call, then aborting the\n * signal will abort the fetch and cause the `fetch()` promise to\n * reject with the reason provided.\n *\n * **Setting `context`**\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the {@link LRUCache} constructor, then all\n * calls to `cache.fetch()` _must_ provide a `context` option. If\n * set to `undefined` or `void`, then calls to fetch _must not_\n * provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that\n * might be relevant in the course of fetching the data. It is only\n * relevant for the course of a single `fetch()` operation, and\n * discarded afterwards.\n *\n * **Note: `fetch()` calls are inflight-unique**\n *\n * If you call `fetch()` multiple times with the same key value,\n * then every call after the first will resolve on the same\n * promise1,\n * _even if they have different settings that would otherwise change\n * the behavior of the fetch_, such as `noDeleteOnFetchRejection`\n * or `ignoreFetchAbort`.\n *\n * In most cases, this is not a problem (in fact, only fetching\n * something once is what you probably want, if you're caching in\n * the first place). If you are changing the fetch() options\n * dramatically between runs, there's a good chance that you might\n * be trying to fit divergent semantics into a single object, and\n * would be better off with multiple cache instances.\n *\n * **1**: Ie, they're not the \"same Promise\", but they resolve at\n * the same time, because they're both waiting on the same\n * underlying fetchMethod response.\n */\n\n fetch(\n k: K,\n fetchOptions: unknown extends FC\n ? LRUCache.FetchOptions\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext\n ): Promise\n\n // this overload not allowed if context is required\n fetch(\n k: unknown extends FC\n ? K\n : FC extends undefined | void\n ? K\n : never,\n fetchOptions?: unknown extends FC\n ? LRUCache.FetchOptions\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext\n : never\n ): Promise\n\n async fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {}\n ): Promise {\n const {\n // get options\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n // set options\n ttl = this.ttl,\n noDisposeOnSet = this.noDisposeOnSet,\n size = 0,\n sizeCalculation = this.sizeCalculation,\n noUpdateTTL = this.noUpdateTTL,\n // fetch exclusive options\n noDeleteOnFetchRejection = this.noDeleteOnFetchRejection,\n allowStaleOnFetchRejection = this.allowStaleOnFetchRejection,\n ignoreFetchAbort = this.ignoreFetchAbort,\n allowStaleOnFetchAbort = this.allowStaleOnFetchAbort,\n context,\n forceRefresh = false,\n status,\n signal,\n } = fetchOptions\n\n if (!this.#hasFetchMethod) {\n if (status) status.fetch = 'get'\n return this.get(k, {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n status,\n })\n }\n\n const options = {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n ttl,\n noDisposeOnSet,\n size,\n sizeCalculation,\n noUpdateTTL,\n noDeleteOnFetchRejection,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n status,\n signal,\n }\n\n let index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.fetch = 'miss'\n const p = this.#backgroundFetch(k, index, options, context)\n return (p.__returned = p)\n } else {\n // in cache, maybe already fetching\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n const stale =\n allowStale && v.__staleWhileFetching !== undefined\n if (status) {\n status.fetch = 'inflight'\n if (stale) status.returnedStale = true\n }\n return stale ? v.__staleWhileFetching : (v.__returned = v)\n }\n\n // if we force a refresh, that means do NOT serve the cached value,\n // unless we are already in the process of refreshing the cache.\n const isStale = this.#isStale(index)\n if (!forceRefresh && !isStale) {\n if (status) status.fetch = 'hit'\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n if (status) this.#statusTTL(status, index)\n return v\n }\n\n // ok, it is stale or a forced refresh, and not already fetching.\n // refresh the cache.\n const p = this.#backgroundFetch(k, index, options, context)\n const hasStale = p.__staleWhileFetching !== undefined\n const staleVal = hasStale && allowStale\n if (status) {\n status.fetch = isStale ? 'stale' : 'refresh'\n if (staleVal && isStale) status.returnedStale = true\n }\n return staleVal ? p.__staleWhileFetching : (p.__returned = p)\n }\n }\n\n /**\n * In some cases, `cache.fetch()` may resolve to `undefined`, either because\n * a {@link LRUCache.OptionsBase#fetchMethod} was not provided (turning\n * `cache.fetch(k)` into just an async wrapper around `cache.get(k)`) or\n * because `ignoreFetchAbort` was specified (either to the constructor or\n * in the {@link LRUCache.FetchOptions}). Also, the\n * {@link OptionsBase.fetchMethod} may return `undefined` or `void`, making\n * the test even more complicated.\n *\n * Because inferring the cases where `undefined` might be returned are so\n * cumbersome, but testing for `undefined` can also be annoying, this method\n * can be used, which will reject if `this.fetch()` resolves to undefined.\n */\n forceFetch(\n k: K,\n fetchOptions: unknown extends FC\n ? LRUCache.FetchOptions\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext\n ): Promise\n // this overload not allowed if context is required\n forceFetch(\n k: unknown extends FC\n ? K\n : FC extends undefined | void\n ? K\n : never,\n fetchOptions?: unknown extends FC\n ? LRUCache.FetchOptions\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext\n : never\n ): Promise\n async forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions = {}\n ): Promise {\n const v = await this.fetch(\n k,\n fetchOptions as unknown extends FC\n ? LRUCache.FetchOptions\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext\n : LRUCache.FetchOptionsWithContext\n )\n if (v === undefined) throw new Error('fetch() returned undefined')\n return v\n }\n\n /**\n * If the key is found in the cache, then this is equivalent to\n * {@link LRUCache#get}. If not, in the cache, then calculate the value using\n * the {@link LRUCache.OptionsBase.memoMethod}, and add it to the cache.\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the LRUCache constructor, then all calls to `cache.memo()`\n * _must_ provide a `context` option. If set to `undefined` or `void`, then\n * calls to memo _must not_ provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that might be\n * relevant in the course of fetching the data. It is only relevant for the\n * course of a single `memo()` operation, and discarded afterwards.\n */\n memo(\n k: K,\n memoOptions: unknown extends FC\n ? LRUCache.MemoOptions\n : FC extends undefined | void\n ? LRUCache.MemoOptionsNoContext\n : LRUCache.MemoOptionsWithContext\n ): V\n // this overload not allowed if context is required\n memo(\n k: unknown extends FC\n ? K\n : FC extends undefined | void\n ? K\n : never,\n memoOptions?: unknown extends FC\n ? LRUCache.MemoOptions\n : FC extends undefined | void\n ? LRUCache.MemoOptionsNoContext\n : never\n ): V\n memo(k: K, memoOptions: LRUCache.MemoOptions = {}) {\n const memoMethod = this.#memoMethod\n if (!memoMethod) {\n throw new Error('no memoMethod provided to constructor')\n }\n const { context, forceRefresh, ...options } = memoOptions\n const v = this.get(k, options)\n if (!forceRefresh && v !== undefined) return v\n const vv = memoMethod(k, v, {\n options,\n context,\n } as LRUCache.MemoizerOptions)\n this.set(k, vv, options)\n return vv\n }\n\n /**\n * Return a value from the cache. Will update the recency of the cache\n * entry found.\n *\n * If the key is not found, get() will return `undefined`.\n */\n get(k: K, getOptions: LRUCache.GetOptions = {}) {\n const {\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n status,\n } = getOptions\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n const value = this.#valList[index]\n const fetching = this.#isBackgroundFetch(value)\n if (status) this.#statusTTL(status, index)\n if (this.#isStale(index)) {\n if (status) status.get = 'stale'\n // delete only if not an in-flight background fetch\n if (!fetching) {\n if (!noDeleteOnStaleGet) {\n this.#delete(k, 'expire')\n }\n if (status && allowStale) status.returnedStale = true\n return allowStale ? value : undefined\n } else {\n if (\n status &&\n allowStale &&\n value.__staleWhileFetching !== undefined\n ) {\n status.returnedStale = true\n }\n return allowStale ? value.__staleWhileFetching : undefined\n }\n } else {\n if (status) status.get = 'hit'\n // if we're currently fetching it, we don't actually have it yet\n // it's not stale, which means this isn't a staleWhileRefetching.\n // If it's not stale, and fetching, AND has a __staleWhileFetching\n // value, then that means the user fetched with {forceRefresh:true},\n // so it's safe to return that value.\n if (fetching) {\n return value.__staleWhileFetching\n }\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n return value\n }\n } else if (status) {\n status.get = 'miss'\n }\n }\n\n #connect(p: Index, n: Index) {\n this.#prev[n] = p\n this.#next[p] = n\n }\n\n #moveToTail(index: Index): void {\n // if tail already, nothing to do\n // if head, move head to next[index]\n // else\n // move next[prev[index]] to next[index] (head has no prev)\n // move prev[next[index]] to prev[index]\n // prev[index] = tail\n // next[tail] = index\n // tail = index\n if (index !== this.#tail) {\n if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n this.#connect(\n this.#prev[index] as Index,\n this.#next[index] as Index\n )\n }\n this.#connect(this.#tail, index)\n this.#tail = index\n }\n }\n\n /**\n * Deletes a key out of the cache.\n *\n * Returns true if the key was deleted, false otherwise.\n */\n delete(k: K) {\n return this.#delete(k, 'delete')\n }\n\n #delete(k: K, reason: LRUCache.DisposeReason) {\n let deleted = false\n if (this.#size !== 0) {\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n deleted = true\n if (this.#size === 1) {\n this.#clear(reason)\n } else {\n this.#removeItemSize(index)\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k, reason])\n }\n }\n this.#keyMap.delete(k)\n this.#keyList[index] = undefined\n this.#valList[index] = undefined\n if (index === this.#tail) {\n this.#tail = this.#prev[index] as Index\n } else if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n const pi = this.#prev[index] as number\n this.#next[pi] = this.#next[index] as number\n const ni = this.#next[index] as number\n this.#prev[ni] = this.#prev[index] as number\n }\n this.#size--\n this.#free.push(index)\n }\n }\n }\n if (this.#hasDisposeAfter && this.#disposed?.length) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return deleted\n }\n\n /**\n * Clear the cache entirely, throwing away all values.\n */\n clear() {\n return this.#clear('delete')\n }\n #clear(reason: LRUCache.DisposeReason) {\n for (const index of this.#rindexes({ allowStale: true })) {\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else {\n const k = this.#keyList[index]\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k as K, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k as K, reason])\n }\n }\n }\n\n this.#keyMap.clear()\n this.#valList.fill(undefined)\n this.#keyList.fill(undefined)\n if (this.#ttls && this.#starts) {\n this.#ttls.fill(0)\n this.#starts.fill(0)\n }\n if (this.#sizes) {\n this.#sizes.fill(0)\n }\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free.length = 0\n this.#calculatedSize = 0\n this.#size = 0\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n}\n"], - "mappings": "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", - "names": ["perf", "warned", "PROCESS", "emitWarning", "msg", "type", "code", "fn", "AC", "AS", "_", "warnACPolyfill", "reason", "printACPolyfillWarning", "shouldWarn", "TYPE", "isPosInt", "n", "getUintArray", "max", "ZeroArray", "size", "_constructing", "_Stack", "HeapCls", "__privateSet", "s", "__privateGet", "Stack", "__privateAdd", "LRUCache", "#max", "#maxSize", "#dispose", "#disposeAfter", "#fetchMethod", "#memoMethod", "#size", "#calculatedSize", "#keyMap", "#keyList", "#valList", "#next", "#prev", "#head", "#tail", "#free", "#disposed", "#sizes", "#starts", "#ttls", "#hasDispose", "#hasFetchMethod", "#hasDisposeAfter", "c", "p", "#isBackgroundFetch", "k", "index", "options", "context", "#backgroundFetch", "#moveToTail", "#indexes", "#rindexes", "#isStale", "ttl", "ttlResolution", "ttlAutopurge", "updateAgeOnGet", "updateAgeOnHas", "allowStale", "dispose", "disposeAfter", "noDisposeOnSet", "noUpdateTTL", "maxSize", "maxEntrySize", "sizeCalculation", "fetchMethod", "memoMethod", "noDeleteOnFetchRejection", "noDeleteOnStaleGet", "allowStaleOnFetchRejection", "allowStaleOnFetchAbort", "ignoreFetchAbort", "UintArray", "#initializeSizeTracking", "#initializeTTLTracking", "key", "ttls", "starts", "#setItemTTL", "start", "t", "#delete", "#updateItemAge", "#statusTTL", "status", "cachedNow", "getNow", "age", "sizes", "#removeItemSize", "#requireSize", "v", "#addItemSize", "#evict", "_i", "_s", "_st", "_k", "_v", "i", "#isValidIndex", "getOptions", "value", "thisp", "deleted", "entry", "remain", "arr", "setOptions", "oldVal", "oldValue", "dt", "task", "val", "free", "head", "hasOptions", "peekOptions", "ac", "signal", "fetchOpts", "cb", "updateCache", "aborted", "ignoreAbort", "fetchFail", "bf", "eb", "er", "allowStaleAborted", "noDelete", "pcall", "res", "rej", "fmp", "b", "fetchOptions", "forceRefresh", "stale", "isStale", "staleVal", "memoOptions", "vv", "fetching", "#connect", "#clear", "pi", "ni"] -} diff --git a/node_modules/lru-cache/dist/esm/package.json b/node_modules/lru-cache/dist/esm/package.json deleted file mode 100644 index 3dbc1ca..0000000 --- a/node_modules/lru-cache/dist/esm/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "module" -} diff --git a/node_modules/lru-cache/package.json b/node_modules/lru-cache/package.json deleted file mode 100644 index f3cd4c0..0000000 --- a/node_modules/lru-cache/package.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "name": "lru-cache", - "publishConfig": { - "tag": "legacy-v10" - }, - "description": "A cache object that deletes the least-recently-used items.", - "version": "10.4.3", - "author": "Isaac Z. Schlueter ", - "keywords": [ - "mru", - "lru", - "cache" - ], - "sideEffects": false, - "scripts": { - "build": "npm run prepare", - "prepare": "tshy && bash fixup.sh", - "pretest": "npm run prepare", - "presnap": "npm run prepare", - "test": "tap", - "snap": "tap", - "preversion": "npm test", - "postversion": "npm publish", - "prepublishOnly": "git push origin --follow-tags", - "format": "prettier --write .", - "typedoc": "typedoc --tsconfig ./.tshy/esm.json ./src/*.ts", - "benchmark-results-typedoc": "bash scripts/benchmark-results-typedoc.sh", - "prebenchmark": "npm run prepare", - "benchmark": "make -C benchmark", - "preprofile": "npm run prepare", - "profile": "make -C benchmark profile" - }, - "main": "./dist/commonjs/index.js", - "types": "./dist/commonjs/index.d.ts", - "tshy": { - "exports": { - ".": "./src/index.ts", - "./min": { - "import": { - "types": "./dist/esm/index.d.ts", - "default": "./dist/esm/index.min.js" - }, - "require": { - "types": "./dist/commonjs/index.d.ts", - "default": "./dist/commonjs/index.min.js" - } - } - } - }, - "repository": { - "type": "git", - "url": "git://github.com/isaacs/node-lru-cache.git" - }, - "devDependencies": { - "@types/node": "^20.2.5", - "@types/tap": "^15.0.6", - "benchmark": "^2.1.4", - "esbuild": "^0.17.11", - "eslint-config-prettier": "^8.5.0", - "marked": "^4.2.12", - "mkdirp": "^2.1.5", - "prettier": "^2.6.2", - "tap": "^20.0.3", - "tshy": "^2.0.0", - "tslib": "^2.4.0", - "typedoc": "^0.25.3", - "typescript": "^5.2.2" - }, - "license": "ISC", - "files": [ - "dist" - ], - "prettier": { - "semi": false, - "printWidth": 70, - "tabWidth": 2, - "useTabs": false, - "singleQuote": true, - "jsxSingleQuote": false, - "bracketSameLine": true, - "arrowParens": "avoid", - "endOfLine": "lf" - }, - "tap": { - "node-arg": [ - "--expose-gc" - ], - "plugin": [ - "@tapjs/clock" - ] - }, - "exports": { - ".": { - "import": { - "types": "./dist/esm/index.d.ts", - "default": "./dist/esm/index.js" - }, - "require": { - "types": "./dist/commonjs/index.d.ts", - "default": "./dist/commonjs/index.js" - } - }, - "./min": { - "import": { - "types": "./dist/esm/index.d.ts", - "default": "./dist/esm/index.min.js" - }, - "require": { - "types": "./dist/commonjs/index.d.ts", - "default": "./dist/commonjs/index.min.js" - } - } - }, - "type": "module", - "module": "./dist/esm/index.js" -} diff --git a/node_modules/merge2/LICENSE b/node_modules/merge2/LICENSE deleted file mode 100644 index 31dd9c7..0000000 --- a/node_modules/merge2/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014-2020 Teambition - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/node_modules/merge2/README.md b/node_modules/merge2/README.md deleted file mode 100644 index 27f8eb9..0000000 --- a/node_modules/merge2/README.md +++ /dev/null @@ -1,144 +0,0 @@ -# merge2 - -Merge multiple streams into one stream in sequence or parallel. - -[![NPM version][npm-image]][npm-url] -[![Build Status][travis-image]][travis-url] -[![Downloads][downloads-image]][downloads-url] - -## Install - -Install with [npm](https://npmjs.org/package/merge2) - -```sh -npm install merge2 -``` - -## Usage - -```js -const gulp = require('gulp') -const merge2 = require('merge2') -const concat = require('gulp-concat') -const minifyHtml = require('gulp-minify-html') -const ngtemplate = require('gulp-ngtemplate') - -gulp.task('app-js', function () { - return merge2( - gulp.src('static/src/tpl/*.html') - .pipe(minifyHtml({empty: true})) - .pipe(ngtemplate({ - module: 'genTemplates', - standalone: true - }) - ), gulp.src([ - 'static/src/js/app.js', - 'static/src/js/locale_zh-cn.js', - 'static/src/js/router.js', - 'static/src/js/tools.js', - 'static/src/js/services.js', - 'static/src/js/filters.js', - 'static/src/js/directives.js', - 'static/src/js/controllers.js' - ]) - ) - .pipe(concat('app.js')) - .pipe(gulp.dest('static/dist/js/')) -}) -``` - -```js -const stream = merge2([stream1, stream2], stream3, {end: false}) -//... -stream.add(stream4, stream5) -//.. -stream.end() -``` - -```js -// equal to merge2([stream1, stream2], stream3) -const stream = merge2() -stream.add([stream1, stream2]) -stream.add(stream3) -``` - -```js -// merge order: -// 1. merge `stream1`; -// 2. merge `stream2` and `stream3` in parallel after `stream1` merged; -// 3. merge 'stream4' after `stream2` and `stream3` merged; -const stream = merge2(stream1, [stream2, stream3], stream4) - -// merge order: -// 1. merge `stream5` and `stream6` in parallel after `stream4` merged; -// 2. merge 'stream7' after `stream5` and `stream6` merged; -stream.add([stream5, stream6], stream7) -``` - -```js -// nest merge -// equal to merge2(stream1, stream2, stream6, stream3, [stream4, stream5]); -const streamA = merge2(stream1, stream2) -const streamB = merge2(stream3, [stream4, stream5]) -const stream = merge2(streamA, streamB) -streamA.add(stream6) -``` - -## API - -```js -const merge2 = require('merge2') -``` - -### merge2() - -### merge2(options) - -### merge2(stream1, stream2, ..., streamN) - -### merge2(stream1, stream2, ..., streamN, options) - -### merge2(stream1, [stream2, stream3, ...], streamN, options) - -return a duplex stream (mergedStream). streams in array will be merged in parallel. - -### mergedStream.add(stream) - -### mergedStream.add(stream1, [stream2, stream3, ...], ...) - -return the mergedStream. - -### mergedStream.on('queueDrain', function() {}) - -It will emit 'queueDrain' when all streams merged. If you set `end === false` in options, this event give you a notice that should add more streams to merge or end the mergedStream. - -#### stream - -*option* -Type: `Readable` or `Duplex` or `Transform` stream. - -#### options - -*option* -Type: `Object`. - -* **end** - `Boolean` - if `end === false` then mergedStream will not be auto ended, you should end by yourself. **Default:** `undefined` - -* **pipeError** - `Boolean` - if `pipeError === true` then mergedStream will emit `error` event from source streams. **Default:** `undefined` - -* **objectMode** - `Boolean` . **Default:** `true` - -`objectMode` and other options(`highWaterMark`, `defaultEncoding` ...) is same as Node.js `Stream`. - -## License - -MIT © [Teambition](https://www.teambition.com) - -[npm-url]: https://npmjs.org/package/merge2 -[npm-image]: http://img.shields.io/npm/v/merge2.svg - -[travis-url]: https://travis-ci.org/teambition/merge2 -[travis-image]: http://img.shields.io/travis/teambition/merge2.svg - -[downloads-url]: https://npmjs.org/package/merge2 -[downloads-image]: http://img.shields.io/npm/dm/merge2.svg?style=flat-square diff --git a/node_modules/merge2/index.js b/node_modules/merge2/index.js deleted file mode 100644 index 78a61ed..0000000 --- a/node_modules/merge2/index.js +++ /dev/null @@ -1,144 +0,0 @@ -'use strict' -/* - * merge2 - * https://github.com/teambition/merge2 - * - * Copyright (c) 2014-2020 Teambition - * Licensed under the MIT license. - */ -const Stream = require('stream') -const PassThrough = Stream.PassThrough -const slice = Array.prototype.slice - -module.exports = merge2 - -function merge2 () { - const streamsQueue = [] - const args = slice.call(arguments) - let merging = false - let options = args[args.length - 1] - - if (options && !Array.isArray(options) && options.pipe == null) { - args.pop() - } else { - options = {} - } - - const doEnd = options.end !== false - const doPipeError = options.pipeError === true - if (options.objectMode == null) { - options.objectMode = true - } - if (options.highWaterMark == null) { - options.highWaterMark = 64 * 1024 - } - const mergedStream = PassThrough(options) - - function addStream () { - for (let i = 0, len = arguments.length; i < len; i++) { - streamsQueue.push(pauseStreams(arguments[i], options)) - } - mergeStream() - return this - } - - function mergeStream () { - if (merging) { - return - } - merging = true - - let streams = streamsQueue.shift() - if (!streams) { - process.nextTick(endStream) - return - } - if (!Array.isArray(streams)) { - streams = [streams] - } - - let pipesCount = streams.length + 1 - - function next () { - if (--pipesCount > 0) { - return - } - merging = false - mergeStream() - } - - function pipe (stream) { - function onend () { - stream.removeListener('merge2UnpipeEnd', onend) - stream.removeListener('end', onend) - if (doPipeError) { - stream.removeListener('error', onerror) - } - next() - } - function onerror (err) { - mergedStream.emit('error', err) - } - // skip ended stream - if (stream._readableState.endEmitted) { - return next() - } - - stream.on('merge2UnpipeEnd', onend) - stream.on('end', onend) - - if (doPipeError) { - stream.on('error', onerror) - } - - stream.pipe(mergedStream, { end: false }) - // compatible for old stream - stream.resume() - } - - for (let i = 0; i < streams.length; i++) { - pipe(streams[i]) - } - - next() - } - - function endStream () { - merging = false - // emit 'queueDrain' when all streams merged. - mergedStream.emit('queueDrain') - if (doEnd) { - mergedStream.end() - } - } - - mergedStream.setMaxListeners(0) - mergedStream.add = addStream - mergedStream.on('unpipe', function (stream) { - stream.emit('merge2UnpipeEnd') - }) - - if (args.length) { - addStream.apply(null, args) - } - return mergedStream -} - -// check and pause streams for pipe. -function pauseStreams (streams, options) { - if (!Array.isArray(streams)) { - // Backwards-compat with old-style streams - if (!streams._readableState && streams.pipe) { - streams = streams.pipe(PassThrough(options)) - } - if (!streams._readableState || !streams.pause || !streams.pipe) { - throw new Error('Only readable stream can be merged.') - } - streams.pause() - } else { - for (let i = 0, len = streams.length; i < len; i++) { - streams[i] = pauseStreams(streams[i], options) - } - } - return streams -} diff --git a/node_modules/merge2/package.json b/node_modules/merge2/package.json deleted file mode 100644 index 7777307..0000000 --- a/node_modules/merge2/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "merge2", - "description": "Merge multiple streams into one stream in sequence or parallel.", - "authors": [ - "Yan Qing " - ], - "license": "MIT", - "version": "1.4.1", - "main": "./index.js", - "repository": { - "type": "git", - "url": "git@github.com:teambition/merge2.git" - }, - "homepage": "https://github.com/teambition/merge2", - "keywords": [ - "merge2", - "multiple", - "sequence", - "parallel", - "merge", - "stream", - "merge stream", - "sync" - ], - "engines": { - "node": ">= 8" - }, - "dependencies": {}, - "devDependencies": { - "standard": "^14.3.4", - "through2": "^3.0.1", - "thunks": "^4.9.6", - "tman": "^1.10.0", - "to-through": "^2.0.0" - }, - "scripts": { - "test": "standard && tman" - }, - "files": [ - "README.md", - "index.js" - ] -} diff --git a/node_modules/micromatch/LICENSE b/node_modules/micromatch/LICENSE deleted file mode 100644 index 9af4a67..0000000 --- a/node_modules/micromatch/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014-present, Jon Schlinkert. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/node_modules/micromatch/README.md b/node_modules/micromatch/README.md deleted file mode 100644 index d72a059..0000000 --- a/node_modules/micromatch/README.md +++ /dev/null @@ -1,1024 +0,0 @@ -# micromatch [![NPM version](https://img.shields.io/npm/v/micromatch.svg?style=flat)](https://www.npmjs.com/package/micromatch) [![NPM monthly downloads](https://img.shields.io/npm/dm/micromatch.svg?style=flat)](https://npmjs.org/package/micromatch) [![NPM total downloads](https://img.shields.io/npm/dt/micromatch.svg?style=flat)](https://npmjs.org/package/micromatch) [![Tests](https://github.com/micromatch/micromatch/actions/workflows/test.yml/badge.svg)](https://github.com/micromatch/micromatch/actions/workflows/test.yml) - -> Glob matching for javascript/node.js. A replacement and faster alternative to minimatch and multimatch. - -Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. - -## Table of Contents - -
    -Details - - * [Install](#install) -- [Sponsors](#sponsors) - * [Gold Sponsors](#gold-sponsors) - * [Quickstart](#quickstart) - * [Why use micromatch?](#why-use-micromatch) - + [Matching features](#matching-features) - * [Switching to micromatch](#switching-to-micromatch) - + [From minimatch](#from-minimatch) - + [From multimatch](#from-multimatch) - * [API](#api) - * [Options](#options) - * [Options Examples](#options-examples) - + [options.basename](#optionsbasename) - + [options.bash](#optionsbash) - + [options.expandRange](#optionsexpandrange) - + [options.format](#optionsformat) - + [options.ignore](#optionsignore) - + [options.matchBase](#optionsmatchbase) - + [options.noextglob](#optionsnoextglob) - + [options.nonegate](#optionsnonegate) - + [options.noglobstar](#optionsnoglobstar) - + [options.nonull](#optionsnonull) - + [options.nullglob](#optionsnullglob) - + [options.onIgnore](#optionsonignore) - + [options.onMatch](#optionsonmatch) - + [options.onResult](#optionsonresult) - + [options.posixSlashes](#optionsposixslashes) - + [options.unescape](#optionsunescape) - * [Extended globbing](#extended-globbing) - + [Extglobs](#extglobs) - + [Braces](#braces) - + [Regex character classes](#regex-character-classes) - + [Regex groups](#regex-groups) - + [POSIX bracket expressions](#posix-bracket-expressions) - * [Notes](#notes) - + [Bash 4.3 parity](#bash-43-parity) - + [Backslashes](#backslashes) - * [Benchmarks](#benchmarks) - + [Running benchmarks](#running-benchmarks) - + [Latest results](#latest-results) - * [Contributing](#contributing) - * [About](#about) - -
    - -## Install - -Install with [npm](https://www.npmjs.com/): - -```sh -$ npm install --save micromatch -``` - -
    - -# Sponsors - -[Become a Sponsor](https://github.com/sponsors/jonschlinkert) to add your logo to this README, or any of [my other projects](https://github.com/jonschlinkert?tab=repositories&q=&type=&language=&sort=stargazers) - -
    - -## Quickstart - -```js -const micromatch = require('micromatch'); -// micromatch(list, patterns[, options]); -``` - -The [main export](#micromatch) takes a list of strings and one or more glob patterns: - -```js -console.log(micromatch(['foo', 'bar', 'baz', 'qux'], ['f*', 'b*'])) //=> ['foo', 'bar', 'baz'] -console.log(micromatch(['foo', 'bar', 'baz', 'qux'], ['*', '!b*'])) //=> ['foo', 'qux'] -``` - -Use [.isMatch()](#ismatch) to for boolean matching: - -```js -console.log(micromatch.isMatch('foo', 'f*')) //=> true -console.log(micromatch.isMatch('foo', ['b*', 'f*'])) //=> true -``` - -[Switching](#switching-to-micromatch) from minimatch and multimatch is easy! - -
    - -## Why use micromatch? - -> micromatch is a [replacement](#switching-to-micromatch) for minimatch and multimatch - -* Supports all of the same matching features as [minimatch](https://github.com/isaacs/minimatch) and [multimatch](https://github.com/sindresorhus/multimatch) -* More complete support for the Bash 4.3 specification than minimatch and multimatch. Micromatch passes _all of the spec tests_ from bash, including some that bash still fails. -* **Fast & Performant** - Loads in about 5ms and performs [fast matches](#benchmarks). -* **Glob matching** - Using wildcards (`*` and `?`), globstars (`**`) for nested directories -* **[Advanced globbing](#extended-globbing)** - Supports [extglobs](#extglobs), [braces](#braces-1), and [POSIX brackets](#posix-bracket-expressions), and support for escaping special characters with `\` or quotes. -* **Accurate** - Covers more scenarios [than minimatch](https://github.com/yarnpkg/yarn/pull/3339) -* **Well tested** - More than 5,000 [test assertions](./test) -* **Windows support** - More reliable windows support than minimatch and multimatch. -* **[Safe](https://github.com/micromatch/braces#braces-is-safe)** - Micromatch is not subject to DoS with brace patterns like minimatch and multimatch. - -### Matching features - -* Support for multiple glob patterns (no need for wrappers like multimatch) -* Wildcards (`**`, `*.js`) -* Negation (`'!a/*.js'`, `'*!(b).js'`) -* [extglobs](#extglobs) (`+(x|y)`, `!(a|b)`) -* [POSIX character classes](#posix-bracket-expressions) (`[[:alpha:][:digit:]]`) -* [brace expansion](https://github.com/micromatch/braces) (`foo/{1..5}.md`, `bar/{a,b,c}.js`) -* regex character classes (`foo-[1-5].js`) -* regex logical "or" (`foo/(abc|xyz).js`) - -You can mix and match these features to create whatever patterns you need! - -## Switching to micromatch - -_(There is one notable difference between micromatch and minimatch in regards to how backslashes are handled. See [the notes about backslashes](#backslashes) for more information.)_ - -### From minimatch - -Use [micromatch.isMatch()](#ismatch) instead of `minimatch()`: - -```js -console.log(micromatch.isMatch('foo', 'b*')); //=> false -``` - -Use [micromatch.match()](#match) instead of `minimatch.match()`: - -```js -console.log(micromatch.match(['foo', 'bar'], 'b*')); //=> 'bar' -``` - -### From multimatch - -Same signature: - -```js -console.log(micromatch(['foo', 'bar', 'baz'], ['f*', '*z'])); //=> ['foo', 'baz'] -``` - -## API - -**Params** - -* `list` **{String|Array}**: List of strings to match. -* `patterns` **{String|Array}**: One or more glob patterns to use for matching. -* `options` **{Object}**: See available [options](#options) -* `returns` **{Array}**: Returns an array of matches - -**Example** - -```js -const mm = require('micromatch'); -// mm(list, patterns[, options]); - -console.log(mm(['a.js', 'a.txt'], ['*.js'])); -//=> [ 'a.js' ] -``` - -### [.matcher](index.js#L109) - -Returns a matcher function from the given glob `pattern` and `options`. The returned function takes a string to match as its only argument and returns true if the string is a match. - -**Params** - -* `pattern` **{String}**: Glob pattern -* `options` **{Object}** -* `returns` **{Function}**: Returns a matcher function. - -**Example** - -```js -const mm = require('micromatch'); -// mm.matcher(pattern[, options]); - -const isMatch = mm.matcher('*.!(*a)'); -console.log(isMatch('a.a')); //=> false -console.log(isMatch('a.b')); //=> true -``` - -### [.isMatch](index.js#L128) - -Returns true if **any** of the given glob `patterns` match the specified `string`. - -**Params** - -* `str` **{String}**: The string to test. -* `patterns` **{String|Array}**: One or more glob patterns to use for matching. -* `[options]` **{Object}**: See available [options](#options). -* `returns` **{Boolean}**: Returns true if any patterns match `str` - -**Example** - -```js -const mm = require('micromatch'); -// mm.isMatch(string, patterns[, options]); - -console.log(mm.isMatch('a.a', ['b.*', '*.a'])); //=> true -console.log(mm.isMatch('a.a', 'b.*')); //=> false -``` - -### [.not](index.js#L153) - -Returns a list of strings that _**do not match any**_ of the given `patterns`. - -**Params** - -* `list` **{Array}**: Array of strings to match. -* `patterns` **{String|Array}**: One or more glob pattern to use for matching. -* `options` **{Object}**: See available [options](#options) for changing how matches are performed -* `returns` **{Array}**: Returns an array of strings that **do not match** the given patterns. - -**Example** - -```js -const mm = require('micromatch'); -// mm.not(list, patterns[, options]); - -console.log(mm.not(['a.a', 'b.b', 'c.c'], '*.a')); -//=> ['b.b', 'c.c'] -``` - -### [.contains](index.js#L193) - -Returns true if the given `string` contains the given pattern. Similar to [.isMatch](#isMatch) but the pattern can match any part of the string. - -**Params** - -* `str` **{String}**: The string to match. -* `patterns` **{String|Array}**: Glob pattern to use for matching. -* `options` **{Object}**: See available [options](#options) for changing how matches are performed -* `returns` **{Boolean}**: Returns true if any of the patterns matches any part of `str`. - -**Example** - -```js -var mm = require('micromatch'); -// mm.contains(string, pattern[, options]); - -console.log(mm.contains('aa/bb/cc', '*b')); -//=> true -console.log(mm.contains('aa/bb/cc', '*d')); -//=> false -``` - -### [.matchKeys](index.js#L235) - -Filter the keys of the given object with the given `glob` pattern and `options`. Does not attempt to match nested keys. If you need this feature, use [glob-object](https://github.com/jonschlinkert/glob-object) instead. - -**Params** - -* `object` **{Object}**: The object with keys to filter. -* `patterns` **{String|Array}**: One or more glob patterns to use for matching. -* `options` **{Object}**: See available [options](#options) for changing how matches are performed -* `returns` **{Object}**: Returns an object with only keys that match the given patterns. - -**Example** - -```js -const mm = require('micromatch'); -// mm.matchKeys(object, patterns[, options]); - -const obj = { aa: 'a', ab: 'b', ac: 'c' }; -console.log(mm.matchKeys(obj, '*b')); -//=> { ab: 'b' } -``` - -### [.some](index.js#L264) - -Returns true if some of the strings in the given `list` match any of the given glob `patterns`. - -**Params** - -* `list` **{String|Array}**: The string or array of strings to test. Returns as soon as the first match is found. -* `patterns` **{String|Array}**: One or more glob patterns to use for matching. -* `options` **{Object}**: See available [options](#options) for changing how matches are performed -* `returns` **{Boolean}**: Returns true if any `patterns` matches any of the strings in `list` - -**Example** - -```js -const mm = require('micromatch'); -// mm.some(list, patterns[, options]); - -console.log(mm.some(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); -// true -console.log(mm.some(['foo.js'], ['*.js', '!foo.js'])); -// false -``` - -### [.every](index.js#L300) - -Returns true if every string in the given `list` matches any of the given glob `patterns`. - -**Params** - -* `list` **{String|Array}**: The string or array of strings to test. -* `patterns` **{String|Array}**: One or more glob patterns to use for matching. -* `options` **{Object}**: See available [options](#options) for changing how matches are performed -* `returns` **{Boolean}**: Returns true if all `patterns` matches all of the strings in `list` - -**Example** - -```js -const mm = require('micromatch'); -// mm.every(list, patterns[, options]); - -console.log(mm.every('foo.js', ['foo.js'])); -// true -console.log(mm.every(['foo.js', 'bar.js'], ['*.js'])); -// true -console.log(mm.every(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); -// false -console.log(mm.every(['foo.js'], ['*.js', '!foo.js'])); -// false -``` - -### [.all](index.js#L339) - -Returns true if **all** of the given `patterns` match the specified string. - -**Params** - -* `str` **{String|Array}**: The string to test. -* `patterns` **{String|Array}**: One or more glob patterns to use for matching. -* `options` **{Object}**: See available [options](#options) for changing how matches are performed -* `returns` **{Boolean}**: Returns true if any patterns match `str` - -**Example** - -```js -const mm = require('micromatch'); -// mm.all(string, patterns[, options]); - -console.log(mm.all('foo.js', ['foo.js'])); -// true - -console.log(mm.all('foo.js', ['*.js', '!foo.js'])); -// false - -console.log(mm.all('foo.js', ['*.js', 'foo.js'])); -// true - -console.log(mm.all('foo.js', ['*.js', 'f*', '*o*', '*o.js'])); -// true -``` - -### [.capture](index.js#L366) - -Returns an array of matches captured by `pattern` in `string, or`null` if the pattern did not match. - -**Params** - -* `glob` **{String}**: Glob pattern to use for matching. -* `input` **{String}**: String to match -* `options` **{Object}**: See available [options](#options) for changing how matches are performed -* `returns` **{Array|null}**: Returns an array of captures if the input matches the glob pattern, otherwise `null`. - -**Example** - -```js -const mm = require('micromatch'); -// mm.capture(pattern, string[, options]); - -console.log(mm.capture('test/*.js', 'test/foo.js')); -//=> ['foo'] -console.log(mm.capture('test/*.js', 'foo/bar.css')); -//=> null -``` - -### [.makeRe](index.js#L392) - -Create a regular expression from the given glob `pattern`. - -**Params** - -* `pattern` **{String}**: A glob pattern to convert to regex. -* `options` **{Object}** -* `returns` **{RegExp}**: Returns a regex created from the given pattern. - -**Example** - -```js -const mm = require('micromatch'); -// mm.makeRe(pattern[, options]); - -console.log(mm.makeRe('*.js')); -//=> /^(?:(\.[\\\/])?(?!\.)(?=.)[^\/]*?\.js)$/ -``` - -### [.scan](index.js#L408) - -Scan a glob pattern to separate the pattern into segments. Used by the [split](#split) method. - -**Params** - -* `pattern` **{String}** -* `options` **{Object}** -* `returns` **{Object}**: Returns an object with - -**Example** - -```js -const mm = require('micromatch'); -const state = mm.scan(pattern[, options]); -``` - -### [.parse](index.js#L424) - -Parse a glob pattern to create the source string for a regular expression. - -**Params** - -* `glob` **{String}** -* `options` **{Object}** -* `returns` **{Object}**: Returns an object with useful properties and output to be used as regex source string. - -**Example** - -```js -const mm = require('micromatch'); -const state = mm.parse(pattern[, options]); -``` - -### [.braces](index.js#L451) - -Process the given brace `pattern`. - -**Params** - -* `pattern` **{String}**: String with brace pattern to process. -* `options` **{Object}**: Any [options](#options) to change how expansion is performed. See the [braces](https://github.com/micromatch/braces) library for all available options. -* `returns` **{Array}** - -**Example** - -```js -const { braces } = require('micromatch'); -console.log(braces('foo/{a,b,c}/bar')); -//=> [ 'foo/(a|b|c)/bar' ] - -console.log(braces('foo/{a,b,c}/bar', { expand: true })); -//=> [ 'foo/a/bar', 'foo/b/bar', 'foo/c/bar' ] -``` - -## Options - -| **Option** | **Type** | **Default value** | **Description** | -| --- | --- | --- | --- | -| `basename` | `boolean` | `false` | If set, then patterns without slashes will be matched against the basename of the path if it contains slashes. For example, `a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`. | -| `bash` | `boolean` | `false` | Follow bash matching rules more strictly - disallows backslashes as escape characters, and treats single stars as globstars (`**`). | -| `capture` | `boolean` | `undefined` | Return regex matches in supporting methods. | -| `contains` | `boolean` | `undefined` | Allows glob to match any part of the given string(s). | -| `cwd` | `string` | `process.cwd()` | Current working directory. Used by `picomatch.split()` | -| `debug` | `boolean` | `undefined` | Debug regular expressions when an error is thrown. | -| `dot` | `boolean` | `false` | Match dotfiles. Otherwise dotfiles are ignored unless a `.` is explicitly defined in the pattern. | -| `expandRange` | `function` | `undefined` | Custom function for expanding ranges in brace patterns, such as `{a..z}`. The function receives the range values as two arguments, and it must return a string to be used in the generated regex. It's recommended that returned strings be wrapped in parentheses. This option is overridden by the `expandBrace` option. | -| `failglob` | `boolean` | `false` | Similar to the `failglob` behavior in Bash, throws an error when no matches are found. Based on the bash option of the same name. | -| `fastpaths` | `boolean` | `true` | To speed up processing, full parsing is skipped for a handful common glob patterns. Disable this behavior by setting this option to `false`. | -| `flags` | `boolean` | `undefined` | Regex flags to use in the generated regex. If defined, the `nocase` option will be overridden. | -| [format](#optionsformat) | `function` | `undefined` | Custom function for formatting the returned string. This is useful for removing leading slashes, converting Windows paths to Posix paths, etc. | -| `ignore` | `array\|string` | `undefined` | One or more glob patterns for excluding strings that should not be matched from the result. | -| `keepQuotes` | `boolean` | `false` | Retain quotes in the generated regex, since quotes may also be used as an alternative to backslashes. | -| `literalBrackets` | `boolean` | `undefined` | When `true`, brackets in the glob pattern will be escaped so that only literal brackets will be matched. | -| `lookbehinds` | `boolean` | `true` | Support regex positive and negative lookbehinds. Note that you must be using Node 8.1.10 or higher to enable regex lookbehinds. | -| `matchBase` | `boolean` | `false` | Alias for `basename` | -| `maxLength` | `boolean` | `65536` | Limit the max length of the input string. An error is thrown if the input string is longer than this value. | -| `nobrace` | `boolean` | `false` | Disable brace matching, so that `{a,b}` and `{1..3}` would be treated as literal characters. | -| `nobracket` | `boolean` | `undefined` | Disable matching with regex brackets. | -| `nocase` | `boolean` | `false` | Perform case-insensitive matching. Equivalent to the regex `i` flag. Note that this option is ignored when the `flags` option is defined. | -| `nodupes` | `boolean` | `true` | Deprecated, use `nounique` instead. This option will be removed in a future major release. By default duplicates are removed. Disable uniquification by setting this option to false. | -| `noext` | `boolean` | `false` | Alias for `noextglob` | -| `noextglob` | `boolean` | `false` | Disable support for matching with [extglobs](#extglobs) (like `+(a\|b)`) | -| `noglobstar` | `boolean` | `false` | Disable support for matching nested directories with globstars (`**`) | -| `nonegate` | `boolean` | `false` | Disable support for negating with leading `!` | -| `noquantifiers` | `boolean` | `false` | Disable support for regex quantifiers (like `a{1,2}`) and treat them as brace patterns to be expanded. | -| [onIgnore](#optionsonIgnore) | `function` | `undefined` | Function to be called on ignored items. | -| [onMatch](#optionsonMatch) | `function` | `undefined` | Function to be called on matched items. | -| [onResult](#optionsonResult) | `function` | `undefined` | Function to be called on all items, regardless of whether or not they are matched or ignored. | -| `posix` | `boolean` | `false` | Support [POSIX character classes](#posix-bracket-expressions) ("posix brackets"). | -| `posixSlashes` | `boolean` | `undefined` | Convert all slashes in file paths to forward slashes. This does not convert slashes in the glob pattern itself | -| `prepend` | `string` | `undefined` | String to prepend to the generated regex used for matching. | -| `regex` | `boolean` | `false` | Use regular expression rules for `+` (instead of matching literal `+`), and for stars that follow closing parentheses or brackets (as in `)*` and `]*`). | -| `strictBrackets` | `boolean` | `undefined` | Throw an error if brackets, braces, or parens are imbalanced. | -| `strictSlashes` | `boolean` | `undefined` | When true, picomatch won't match trailing slashes with single stars. | -| `unescape` | `boolean` | `undefined` | Remove preceding backslashes from escaped glob characters before creating the regular expression to perform matches. | -| `unixify` | `boolean` | `undefined` | Alias for `posixSlashes`, for backwards compatitibility. | - -## Options Examples - -### options.basename - -Allow glob patterns without slashes to match a file path based on its basename. Same behavior as [minimatch](https://github.com/isaacs/minimatch) option `matchBase`. - -**Type**: `Boolean` - -**Default**: `false` - -**Example** - -```js -micromatch(['a/b.js', 'a/c.md'], '*.js'); -//=> [] - -micromatch(['a/b.js', 'a/c.md'], '*.js', { basename: true }); -//=> ['a/b.js'] -``` - -### options.bash - -Enabled by default, this option enforces bash-like behavior with stars immediately following a bracket expression. Bash bracket expressions are similar to regex character classes, but unlike regex, a star following a bracket expression **does not repeat the bracketed characters**. Instead, the star is treated the same as any other star. - -**Type**: `Boolean` - -**Default**: `true` - -**Example** - -```js -const files = ['abc', 'ajz']; -console.log(micromatch(files, '[a-c]*')); -//=> ['abc', 'ajz'] - -console.log(micromatch(files, '[a-c]*', { bash: false })); -``` - -### options.expandRange - -**Type**: `function` - -**Default**: `undefined` - -Custom function for expanding ranges in brace patterns. The [fill-range](https://github.com/jonschlinkert/fill-range) library is ideal for this purpose, or you can use custom code to do whatever you need. - -**Example** - -The following example shows how to create a glob that matches a numeric folder name between `01` and `25`, with leading zeros. - -```js -const fill = require('fill-range'); -const regex = micromatch.makeRe('foo/{01..25}/bar', { - expandRange(a, b) { - return `(${fill(a, b, { toRegex: true })})`; - } -}); - -console.log(regex) -//=> /^(?:foo\/((?:0[1-9]|1[0-9]|2[0-5]))\/bar)$/ - -console.log(regex.test('foo/00/bar')) // false -console.log(regex.test('foo/01/bar')) // true -console.log(regex.test('foo/10/bar')) // true -console.log(regex.test('foo/22/bar')) // true -console.log(regex.test('foo/25/bar')) // true -console.log(regex.test('foo/26/bar')) // false -``` - -### options.format - -**Type**: `function` - -**Default**: `undefined` - -Custom function for formatting strings before they're matched. - -**Example** - -```js -// strip leading './' from strings -const format = str => str.replace(/^\.\//, ''); -const isMatch = picomatch('foo/*.js', { format }); -console.log(isMatch('./foo/bar.js')) //=> true -``` - -### options.ignore - -String or array of glob patterns to match files to ignore. - -**Type**: `String|Array` - -**Default**: `undefined` - -```js -const isMatch = micromatch.matcher('*', { ignore: 'f*' }); -console.log(isMatch('foo')) //=> false -console.log(isMatch('bar')) //=> true -console.log(isMatch('baz')) //=> true -``` - -### options.matchBase - -Alias for [options.basename](#options-basename). - -### options.noextglob - -Disable extglob support, so that [extglobs](#extglobs) are regarded as literal characters. - -**Type**: `Boolean` - -**Default**: `undefined` - -**Examples** - -```js -console.log(micromatch(['a/z', 'a/b', 'a/!(z)'], 'a/!(z)')); -//=> ['a/b', 'a/!(z)'] - -console.log(micromatch(['a/z', 'a/b', 'a/!(z)'], 'a/!(z)', { noextglob: true })); -//=> ['a/!(z)'] (matches only as literal characters) -``` - -### options.nonegate - -Disallow negation (`!`) patterns, and treat leading `!` as a literal character to match. - -**Type**: `Boolean` - -**Default**: `undefined` - -### options.noglobstar - -Disable matching with globstars (`**`). - -**Type**: `Boolean` - -**Default**: `undefined` - -```js -micromatch(['a/b', 'a/b/c', 'a/b/c/d'], 'a/**'); -//=> ['a/b', 'a/b/c', 'a/b/c/d'] - -micromatch(['a/b', 'a/b/c', 'a/b/c/d'], 'a/**', {noglobstar: true}); -//=> ['a/b'] -``` - -### options.nonull - -Alias for [options.nullglob](#options-nullglob). - -### options.nullglob - -If `true`, when no matches are found the actual (arrayified) glob pattern is returned instead of an empty array. Same behavior as [minimatch](https://github.com/isaacs/minimatch) option `nonull`. - -**Type**: `Boolean` - -**Default**: `undefined` - -### options.onIgnore - -```js -const onIgnore = ({ glob, regex, input, output }) => { - console.log({ glob, regex, input, output }); - // { glob: '*', regex: /^(?:(?!\.)(?=.)[^\/]*?\/?)$/, input: 'foo', output: 'foo' } -}; - -const isMatch = micromatch.matcher('*', { onIgnore, ignore: 'f*' }); -isMatch('foo'); -isMatch('bar'); -isMatch('baz'); -``` - -### options.onMatch - -```js -const onMatch = ({ glob, regex, input, output }) => { - console.log({ input, output }); - // { input: 'some\\path', output: 'some/path' } - // { input: 'some\\path', output: 'some/path' } - // { input: 'some\\path', output: 'some/path' } -}; - -const isMatch = micromatch.matcher('**', { onMatch, posixSlashes: true }); -isMatch('some\\path'); -isMatch('some\\path'); -isMatch('some\\path'); -``` - -### options.onResult - -```js -const onResult = ({ glob, regex, input, output }) => { - console.log({ glob, regex, input, output }); -}; - -const isMatch = micromatch('*', { onResult, ignore: 'f*' }); -isMatch('foo'); -isMatch('bar'); -isMatch('baz'); -``` - -### options.posixSlashes - -Convert path separators on returned files to posix/unix-style forward slashes. Aliased as `unixify` for backwards compatibility. - -**Type**: `Boolean` - -**Default**: `true` on windows, `false` everywhere else. - -**Example** - -```js -console.log(micromatch.match(['a\\b\\c'], 'a/**')); -//=> ['a/b/c'] - -console.log(micromatch.match(['a\\b\\c'], { posixSlashes: false })); -//=> ['a\\b\\c'] -``` - -### options.unescape - -Remove backslashes from escaped glob characters before creating the regular expression to perform matches. - -**Type**: `Boolean` - -**Default**: `undefined` - -**Example** - -In this example we want to match a literal `*`: - -```js -console.log(micromatch.match(['abc', 'a\\*c'], 'a\\*c')); -//=> ['a\\*c'] - -console.log(micromatch.match(['abc', 'a\\*c'], 'a\\*c', { unescape: true })); -//=> ['a*c'] -``` - -
    -
    - -## Extended globbing - -Micromatch supports the following extended globbing features. - -### Extglobs - -Extended globbing, as described by the bash man page: - -| **pattern** | **regex equivalent** | **description** | -| --- | --- | --- | -| `?(pattern)` | `(pattern)?` | Matches zero or one occurrence of the given patterns | -| `*(pattern)` | `(pattern)*` | Matches zero or more occurrences of the given patterns | -| `+(pattern)` | `(pattern)+` | Matches one or more occurrences of the given patterns | -| `@(pattern)` | `(pattern)` * | Matches one of the given patterns | -| `!(pattern)` | N/A (equivalent regex is much more complicated) | Matches anything except one of the given patterns | - -* Note that `@` isn't a regex character. - -### Braces - -Brace patterns can be used to match specific ranges or sets of characters. - -**Example** - -The pattern `{f,b}*/{1..3}/{b,q}*` would match any of following strings: - -``` -foo/1/bar -foo/2/bar -foo/3/bar -baz/1/qux -baz/2/qux -baz/3/qux -``` - -Visit [braces](https://github.com/micromatch/braces) to see the full range of features and options related to brace expansion, or to create brace matching or expansion related issues. - -### Regex character classes - -Given the list: `['a.js', 'b.js', 'c.js', 'd.js', 'E.js']`: - -* `[ac].js`: matches both `a` and `c`, returning `['a.js', 'c.js']` -* `[b-d].js`: matches from `b` to `d`, returning `['b.js', 'c.js', 'd.js']` -* `a/[A-Z].js`: matches and uppercase letter, returning `['a/E.md']` - -Learn about [regex character classes](http://www.regular-expressions.info/charclass.html). - -### Regex groups - -Given `['a.js', 'b.js', 'c.js', 'd.js', 'E.js']`: - -* `(a|c).js`: would match either `a` or `c`, returning `['a.js', 'c.js']` -* `(b|d).js`: would match either `b` or `d`, returning `['b.js', 'd.js']` -* `(b|[A-Z]).js`: would match either `b` or an uppercase letter, returning `['b.js', 'E.js']` - -As with regex, parens can be nested, so patterns like `((a|b)|c)/b` will work. Although brace expansion might be friendlier to use, depending on preference. - -### POSIX bracket expressions - -POSIX brackets are intended to be more user-friendly than regex character classes. This of course is in the eye of the beholder. - -**Example** - -```js -console.log(micromatch.isMatch('a1', '[[:alpha:][:digit:]]')) //=> true -console.log(micromatch.isMatch('a1', '[[:alpha:][:alpha:]]')) //=> false -``` - -*** - -## Notes - -### Bash 4.3 parity - -Whenever possible matching behavior is based on behavior Bash 4.3, which is mostly consistent with minimatch. - -However, it's suprising how many edge cases and rabbit holes there are with glob matching, and since there is no real glob specification, and micromatch is more accurate than both Bash and minimatch, there are cases where best-guesses were made for behavior. In a few cases where Bash had no answers, we used wildmatch (used by git) as a fallback. - -### Backslashes - -There is an important, notable difference between minimatch and micromatch _in regards to how backslashes are handled_ in glob patterns. - -* Micromatch exclusively and explicitly reserves backslashes for escaping characters in a glob pattern, even on windows, which is consistent with bash behavior. _More importantly, unescaping globs can result in unsafe regular expressions_. -* Minimatch converts all backslashes to forward slashes, which means you can't use backslashes to escape any characters in your glob patterns. - -We made this decision for micromatch for a couple of reasons: - -* Consistency with bash conventions. -* Glob patterns are not filepaths. They are a type of [regular language](https://en.wikipedia.org/wiki/Regular_language) that is converted to a JavaScript regular expression. Thus, when forward slashes are defined in a glob pattern, the resulting regular expression will match windows or POSIX path separators just fine. - -**A note about joining paths to globs** - -Note that when you pass something like `path.join('foo', '*')` to micromatch, you are creating a filepath and expecting it to still work as a glob pattern. This causes problems on windows, since the `path.sep` is `\\`. - -In other words, since `\\` is reserved as an escape character in globs, on windows `path.join('foo', '*')` would result in `foo\\*`, which tells micromatch to match `*` as a literal character. This is the same behavior as bash. - -To solve this, you might be inspired to do something like `'foo\\*'.replace(/\\/g, '/')`, but this causes another, potentially much more serious, problem. - -## Benchmarks - -### Running benchmarks - -Install dependencies for running benchmarks: - -```sh -$ cd bench && npm install -``` - -Run the benchmarks: - -```sh -$ npm run bench -``` - -### Latest results - -As of August 23, 2024 (longer bars are better): - -```sh -# .makeRe star - micromatch x 2,232,802 ops/sec ±2.34% (89 runs sampled)) - minimatch x 781,018 ops/sec ±6.74% (92 runs sampled)) - -# .makeRe star; dot=true - micromatch x 1,863,453 ops/sec ±0.74% (93 runs sampled) - minimatch x 723,105 ops/sec ±0.75% (93 runs sampled) - -# .makeRe globstar - micromatch x 1,624,179 ops/sec ±2.22% (91 runs sampled) - minimatch x 1,117,230 ops/sec ±2.78% (86 runs sampled)) - -# .makeRe globstars - micromatch x 1,658,642 ops/sec ±0.86% (92 runs sampled) - minimatch x 741,224 ops/sec ±1.24% (89 runs sampled)) - -# .makeRe with leading star - micromatch x 1,525,014 ops/sec ±1.63% (90 runs sampled) - minimatch x 561,074 ops/sec ±3.07% (89 runs sampled) - -# .makeRe - braces - micromatch x 172,478 ops/sec ±2.37% (78 runs sampled) - minimatch x 96,087 ops/sec ±2.34% (88 runs sampled))) - -# .makeRe braces - range (expanded) - micromatch x 26,973 ops/sec ±0.84% (89 runs sampled) - minimatch x 3,023 ops/sec ±0.99% (90 runs sampled)) - -# .makeRe braces - range (compiled) - micromatch x 152,892 ops/sec ±1.67% (83 runs sampled) - minimatch x 992 ops/sec ±3.50% (89 runs sampled)d)) - -# .makeRe braces - nested ranges (expanded) - micromatch x 15,816 ops/sec ±13.05% (80 runs sampled) - minimatch x 2,953 ops/sec ±1.64% (91 runs sampled) - -# .makeRe braces - nested ranges (compiled) - micromatch x 110,881 ops/sec ±1.85% (82 runs sampled) - minimatch x 1,008 ops/sec ±1.51% (91 runs sampled) - -# .makeRe braces - set (compiled) - micromatch x 134,930 ops/sec ±3.54% (63 runs sampled)) - minimatch x 43,242 ops/sec ±0.60% (93 runs sampled) - -# .makeRe braces - nested sets (compiled) - micromatch x 94,455 ops/sec ±1.74% (69 runs sampled)) - minimatch x 27,720 ops/sec ±1.84% (93 runs sampled)) -``` - -## Contributing - -All contributions are welcome! Please read [the contributing guide](.github/contributing.md) to get started. - -**Bug reports** - -Please create an issue if you encounter a bug or matching behavior that doesn't seem correct. If you find a matching-related issue, please: - -* [research existing issues first](../../issues) (open and closed) -* visit the [GNU Bash documentation](https://www.gnu.org/software/bash/manual/) to see how Bash deals with the pattern -* visit the [minimatch](https://github.com/isaacs/minimatch) documentation to cross-check expected behavior in node.js -* if all else fails, since there is no real specification for globs we will probably need to discuss expected behavior and decide how to resolve it. which means any detail you can provide to help with this discussion would be greatly appreciated. - -**Platform issues** - -It's important to us that micromatch work consistently on all platforms. If you encounter any platform-specific matching or path related issues, please let us know (pull requests are also greatly appreciated). - -## About - -
    -Contributing - -Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). - -Please read the [contributing guide](.github/contributing.md) for advice on opening issues, pull requests, and coding standards. - -
    - -
    -Running Tests - -Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: - -```sh -$ npm install && npm test -``` - -
    - -
    -Building docs - -_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ - -To generate the readme, run the following command: - -```sh -$ npm install -g verbose/verb#dev verb-generate-readme && verb -``` - -
    - -### Related projects - -You might also be interested in these projects: - -* [braces](https://www.npmjs.com/package/braces): Bash-like brace expansion, implemented in JavaScript. Safer than other brace expansion libs, with complete support… [more](https://github.com/micromatch/braces) | [homepage](https://github.com/micromatch/braces "Bash-like brace expansion, implemented in JavaScript. Safer than other brace expansion libs, with complete support for the Bash 4.3 braces specification, without sacrificing speed.") -* [expand-brackets](https://www.npmjs.com/package/expand-brackets): Expand POSIX bracket expressions (character classes) in glob patterns. | [homepage](https://github.com/micromatch/expand-brackets "Expand POSIX bracket expressions (character classes) in glob patterns.") -* [extglob](https://www.npmjs.com/package/extglob): Extended glob support for JavaScript. Adds (almost) the expressive power of regular expressions to glob… [more](https://github.com/micromatch/extglob) | [homepage](https://github.com/micromatch/extglob "Extended glob support for JavaScript. Adds (almost) the expressive power of regular expressions to glob patterns.") -* [fill-range](https://www.npmjs.com/package/fill-range): Fill in a range of numbers or letters, optionally passing an increment or `step` to… [more](https://github.com/jonschlinkert/fill-range) | [homepage](https://github.com/jonschlinkert/fill-range "Fill in a range of numbers or letters, optionally passing an increment or `step` to use, or create a regex-compatible range with `options.toRegex`") -* [nanomatch](https://www.npmjs.com/package/nanomatch): Fast, minimal glob matcher for node.js. Similar to micromatch, minimatch and multimatch, but complete Bash… [more](https://github.com/micromatch/nanomatch) | [homepage](https://github.com/micromatch/nanomatch "Fast, minimal glob matcher for node.js. Similar to micromatch, minimatch and multimatch, but complete Bash 4.3 wildcard support only (no support for exglobs, posix brackets or braces)") - -### Contributors - -| **Commits** | **Contributor** | -| --- | --- | -| 523 | [jonschlinkert](https://github.com/jonschlinkert) | -| 12 | [es128](https://github.com/es128) | -| 9 | [danez](https://github.com/danez) | -| 8 | [doowb](https://github.com/doowb) | -| 6 | [paulmillr](https://github.com/paulmillr) | -| 5 | [mrmlnc](https://github.com/mrmlnc) | -| 3 | [DrPizza](https://github.com/DrPizza) | -| 2 | [Tvrqvoise](https://github.com/Tvrqvoise) | -| 2 | [antonyk](https://github.com/antonyk) | -| 2 | [MartinKolarik](https://github.com/MartinKolarik) | -| 2 | [Glazy](https://github.com/Glazy) | -| 2 | [mceIdo](https://github.com/mceIdo) | -| 2 | [TrySound](https://github.com/TrySound) | -| 1 | [yvele](https://github.com/yvele) | -| 1 | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) | -| 1 | [simlu](https://github.com/simlu) | -| 1 | [curbengh](https://github.com/curbengh) | -| 1 | [fidian](https://github.com/fidian) | -| 1 | [tomByrer](https://github.com/tomByrer) | -| 1 | [ZoomerTedJackson](https://github.com/ZoomerTedJackson) | -| 1 | [styfle](https://github.com/styfle) | -| 1 | [sebdeckers](https://github.com/sebdeckers) | -| 1 | [muescha](https://github.com/muescha) | -| 1 | [juszczykjakub](https://github.com/juszczykjakub) | -| 1 | [joyceerhl](https://github.com/joyceerhl) | -| 1 | [donatj](https://github.com/donatj) | -| 1 | [frangio](https://github.com/frangio) | -| 1 | [UltCombo](https://github.com/UltCombo) | -| 1 | [DianeLooney](https://github.com/DianeLooney) | -| 1 | [devongovett](https://github.com/devongovett) | -| 1 | [Cslove](https://github.com/Cslove) | -| 1 | [amilajack](https://github.com/amilajack) | - -### Author - -**Jon Schlinkert** - -* [GitHub Profile](https://github.com/jonschlinkert) -* [Twitter Profile](https://twitter.com/jonschlinkert) -* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) - -### License - -Copyright © 2024, [Jon Schlinkert](https://github.com/jonschlinkert). -Released under the [MIT License](LICENSE). - -*** - -_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on August 23, 2024._ \ No newline at end of file diff --git a/node_modules/micromatch/index.js b/node_modules/micromatch/index.js deleted file mode 100644 index cb9d9ef..0000000 --- a/node_modules/micromatch/index.js +++ /dev/null @@ -1,474 +0,0 @@ -'use strict'; - -const util = require('util'); -const braces = require('braces'); -const picomatch = require('picomatch'); -const utils = require('picomatch/lib/utils'); - -const isEmptyString = v => v === '' || v === './'; -const hasBraces = v => { - const index = v.indexOf('{'); - return index > -1 && v.indexOf('}', index) > -1; -}; - -/** - * Returns an array of strings that match one or more glob patterns. - * - * ```js - * const mm = require('micromatch'); - * // mm(list, patterns[, options]); - * - * console.log(mm(['a.js', 'a.txt'], ['*.js'])); - * //=> [ 'a.js' ] - * ``` - * @param {String|Array} `list` List of strings to match. - * @param {String|Array} `patterns` One or more glob patterns to use for matching. - * @param {Object} `options` See available [options](#options) - * @return {Array} Returns an array of matches - * @summary false - * @api public - */ - -const micromatch = (list, patterns, options) => { - patterns = [].concat(patterns); - list = [].concat(list); - - let omit = new Set(); - let keep = new Set(); - let items = new Set(); - let negatives = 0; - - let onResult = state => { - items.add(state.output); - if (options && options.onResult) { - options.onResult(state); - } - }; - - for (let i = 0; i < patterns.length; i++) { - let isMatch = picomatch(String(patterns[i]), { ...options, onResult }, true); - let negated = isMatch.state.negated || isMatch.state.negatedExtglob; - if (negated) negatives++; - - for (let item of list) { - let matched = isMatch(item, true); - - let match = negated ? !matched.isMatch : matched.isMatch; - if (!match) continue; - - if (negated) { - omit.add(matched.output); - } else { - omit.delete(matched.output); - keep.add(matched.output); - } - } - } - - let result = negatives === patterns.length ? [...items] : [...keep]; - let matches = result.filter(item => !omit.has(item)); - - if (options && matches.length === 0) { - if (options.failglob === true) { - throw new Error(`No matches found for "${patterns.join(', ')}"`); - } - - if (options.nonull === true || options.nullglob === true) { - return options.unescape ? patterns.map(p => p.replace(/\\/g, '')) : patterns; - } - } - - return matches; -}; - -/** - * Backwards compatibility - */ - -micromatch.match = micromatch; - -/** - * Returns a matcher function from the given glob `pattern` and `options`. - * The returned function takes a string to match as its only argument and returns - * true if the string is a match. - * - * ```js - * const mm = require('micromatch'); - * // mm.matcher(pattern[, options]); - * - * const isMatch = mm.matcher('*.!(*a)'); - * console.log(isMatch('a.a')); //=> false - * console.log(isMatch('a.b')); //=> true - * ``` - * @param {String} `pattern` Glob pattern - * @param {Object} `options` - * @return {Function} Returns a matcher function. - * @api public - */ - -micromatch.matcher = (pattern, options) => picomatch(pattern, options); - -/** - * Returns true if **any** of the given glob `patterns` match the specified `string`. - * - * ```js - * const mm = require('micromatch'); - * // mm.isMatch(string, patterns[, options]); - * - * console.log(mm.isMatch('a.a', ['b.*', '*.a'])); //=> true - * console.log(mm.isMatch('a.a', 'b.*')); //=> false - * ``` - * @param {String} `str` The string to test. - * @param {String|Array} `patterns` One or more glob patterns to use for matching. - * @param {Object} `[options]` See available [options](#options). - * @return {Boolean} Returns true if any patterns match `str` - * @api public - */ - -micromatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str); - -/** - * Backwards compatibility - */ - -micromatch.any = micromatch.isMatch; - -/** - * Returns a list of strings that _**do not match any**_ of the given `patterns`. - * - * ```js - * const mm = require('micromatch'); - * // mm.not(list, patterns[, options]); - * - * console.log(mm.not(['a.a', 'b.b', 'c.c'], '*.a')); - * //=> ['b.b', 'c.c'] - * ``` - * @param {Array} `list` Array of strings to match. - * @param {String|Array} `patterns` One or more glob pattern to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Array} Returns an array of strings that **do not match** the given patterns. - * @api public - */ - -micromatch.not = (list, patterns, options = {}) => { - patterns = [].concat(patterns).map(String); - let result = new Set(); - let items = []; - - let onResult = state => { - if (options.onResult) options.onResult(state); - items.push(state.output); - }; - - let matches = new Set(micromatch(list, patterns, { ...options, onResult })); - - for (let item of items) { - if (!matches.has(item)) { - result.add(item); - } - } - return [...result]; -}; - -/** - * Returns true if the given `string` contains the given pattern. Similar - * to [.isMatch](#isMatch) but the pattern can match any part of the string. - * - * ```js - * var mm = require('micromatch'); - * // mm.contains(string, pattern[, options]); - * - * console.log(mm.contains('aa/bb/cc', '*b')); - * //=> true - * console.log(mm.contains('aa/bb/cc', '*d')); - * //=> false - * ``` - * @param {String} `str` The string to match. - * @param {String|Array} `patterns` Glob pattern to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Boolean} Returns true if any of the patterns matches any part of `str`. - * @api public - */ - -micromatch.contains = (str, pattern, options) => { - if (typeof str !== 'string') { - throw new TypeError(`Expected a string: "${util.inspect(str)}"`); - } - - if (Array.isArray(pattern)) { - return pattern.some(p => micromatch.contains(str, p, options)); - } - - if (typeof pattern === 'string') { - if (isEmptyString(str) || isEmptyString(pattern)) { - return false; - } - - if (str.includes(pattern) || (str.startsWith('./') && str.slice(2).includes(pattern))) { - return true; - } - } - - return micromatch.isMatch(str, pattern, { ...options, contains: true }); -}; - -/** - * Filter the keys of the given object with the given `glob` pattern - * and `options`. Does not attempt to match nested keys. If you need this feature, - * use [glob-object][] instead. - * - * ```js - * const mm = require('micromatch'); - * // mm.matchKeys(object, patterns[, options]); - * - * const obj = { aa: 'a', ab: 'b', ac: 'c' }; - * console.log(mm.matchKeys(obj, '*b')); - * //=> { ab: 'b' } - * ``` - * @param {Object} `object` The object with keys to filter. - * @param {String|Array} `patterns` One or more glob patterns to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Object} Returns an object with only keys that match the given patterns. - * @api public - */ - -micromatch.matchKeys = (obj, patterns, options) => { - if (!utils.isObject(obj)) { - throw new TypeError('Expected the first argument to be an object'); - } - let keys = micromatch(Object.keys(obj), patterns, options); - let res = {}; - for (let key of keys) res[key] = obj[key]; - return res; -}; - -/** - * Returns true if some of the strings in the given `list` match any of the given glob `patterns`. - * - * ```js - * const mm = require('micromatch'); - * // mm.some(list, patterns[, options]); - * - * console.log(mm.some(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); - * // true - * console.log(mm.some(['foo.js'], ['*.js', '!foo.js'])); - * // false - * ``` - * @param {String|Array} `list` The string or array of strings to test. Returns as soon as the first match is found. - * @param {String|Array} `patterns` One or more glob patterns to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Boolean} Returns true if any `patterns` matches any of the strings in `list` - * @api public - */ - -micromatch.some = (list, patterns, options) => { - let items = [].concat(list); - - for (let pattern of [].concat(patterns)) { - let isMatch = picomatch(String(pattern), options); - if (items.some(item => isMatch(item))) { - return true; - } - } - return false; -}; - -/** - * Returns true if every string in the given `list` matches - * any of the given glob `patterns`. - * - * ```js - * const mm = require('micromatch'); - * // mm.every(list, patterns[, options]); - * - * console.log(mm.every('foo.js', ['foo.js'])); - * // true - * console.log(mm.every(['foo.js', 'bar.js'], ['*.js'])); - * // true - * console.log(mm.every(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); - * // false - * console.log(mm.every(['foo.js'], ['*.js', '!foo.js'])); - * // false - * ``` - * @param {String|Array} `list` The string or array of strings to test. - * @param {String|Array} `patterns` One or more glob patterns to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Boolean} Returns true if all `patterns` matches all of the strings in `list` - * @api public - */ - -micromatch.every = (list, patterns, options) => { - let items = [].concat(list); - - for (let pattern of [].concat(patterns)) { - let isMatch = picomatch(String(pattern), options); - if (!items.every(item => isMatch(item))) { - return false; - } - } - return true; -}; - -/** - * Returns true if **all** of the given `patterns` match - * the specified string. - * - * ```js - * const mm = require('micromatch'); - * // mm.all(string, patterns[, options]); - * - * console.log(mm.all('foo.js', ['foo.js'])); - * // true - * - * console.log(mm.all('foo.js', ['*.js', '!foo.js'])); - * // false - * - * console.log(mm.all('foo.js', ['*.js', 'foo.js'])); - * // true - * - * console.log(mm.all('foo.js', ['*.js', 'f*', '*o*', '*o.js'])); - * // true - * ``` - * @param {String|Array} `str` The string to test. - * @param {String|Array} `patterns` One or more glob patterns to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Boolean} Returns true if any patterns match `str` - * @api public - */ - -micromatch.all = (str, patterns, options) => { - if (typeof str !== 'string') { - throw new TypeError(`Expected a string: "${util.inspect(str)}"`); - } - - return [].concat(patterns).every(p => picomatch(p, options)(str)); -}; - -/** - * Returns an array of matches captured by `pattern` in `string, or `null` if the pattern did not match. - * - * ```js - * const mm = require('micromatch'); - * // mm.capture(pattern, string[, options]); - * - * console.log(mm.capture('test/*.js', 'test/foo.js')); - * //=> ['foo'] - * console.log(mm.capture('test/*.js', 'foo/bar.css')); - * //=> null - * ``` - * @param {String} `glob` Glob pattern to use for matching. - * @param {String} `input` String to match - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Array|null} Returns an array of captures if the input matches the glob pattern, otherwise `null`. - * @api public - */ - -micromatch.capture = (glob, input, options) => { - let posix = utils.isWindows(options); - let regex = picomatch.makeRe(String(glob), { ...options, capture: true }); - let match = regex.exec(posix ? utils.toPosixSlashes(input) : input); - - if (match) { - return match.slice(1).map(v => v === void 0 ? '' : v); - } -}; - -/** - * Create a regular expression from the given glob `pattern`. - * - * ```js - * const mm = require('micromatch'); - * // mm.makeRe(pattern[, options]); - * - * console.log(mm.makeRe('*.js')); - * //=> /^(?:(\.[\\\/])?(?!\.)(?=.)[^\/]*?\.js)$/ - * ``` - * @param {String} `pattern` A glob pattern to convert to regex. - * @param {Object} `options` - * @return {RegExp} Returns a regex created from the given pattern. - * @api public - */ - -micromatch.makeRe = (...args) => picomatch.makeRe(...args); - -/** - * Scan a glob pattern to separate the pattern into segments. Used - * by the [split](#split) method. - * - * ```js - * const mm = require('micromatch'); - * const state = mm.scan(pattern[, options]); - * ``` - * @param {String} `pattern` - * @param {Object} `options` - * @return {Object} Returns an object with - * @api public - */ - -micromatch.scan = (...args) => picomatch.scan(...args); - -/** - * Parse a glob pattern to create the source string for a regular - * expression. - * - * ```js - * const mm = require('micromatch'); - * const state = mm.parse(pattern[, options]); - * ``` - * @param {String} `glob` - * @param {Object} `options` - * @return {Object} Returns an object with useful properties and output to be used as regex source string. - * @api public - */ - -micromatch.parse = (patterns, options) => { - let res = []; - for (let pattern of [].concat(patterns || [])) { - for (let str of braces(String(pattern), options)) { - res.push(picomatch.parse(str, options)); - } - } - return res; -}; - -/** - * Process the given brace `pattern`. - * - * ```js - * const { braces } = require('micromatch'); - * console.log(braces('foo/{a,b,c}/bar')); - * //=> [ 'foo/(a|b|c)/bar' ] - * - * console.log(braces('foo/{a,b,c}/bar', { expand: true })); - * //=> [ 'foo/a/bar', 'foo/b/bar', 'foo/c/bar' ] - * ``` - * @param {String} `pattern` String with brace pattern to process. - * @param {Object} `options` Any [options](#options) to change how expansion is performed. See the [braces][] library for all available options. - * @return {Array} - * @api public - */ - -micromatch.braces = (pattern, options) => { - if (typeof pattern !== 'string') throw new TypeError('Expected a string'); - if ((options && options.nobrace === true) || !hasBraces(pattern)) { - return [pattern]; - } - return braces(pattern, options); -}; - -/** - * Expand braces - */ - -micromatch.braceExpand = (pattern, options) => { - if (typeof pattern !== 'string') throw new TypeError('Expected a string'); - return micromatch.braces(pattern, { ...options, expand: true }); -}; - -/** - * Expose micromatch - */ - -// exposed for tests -micromatch.hasBraces = hasBraces; -module.exports = micromatch; diff --git a/node_modules/micromatch/package.json b/node_modules/micromatch/package.json deleted file mode 100644 index d5558bb..0000000 --- a/node_modules/micromatch/package.json +++ /dev/null @@ -1,119 +0,0 @@ -{ - "name": "micromatch", - "description": "Glob matching for javascript/node.js. A replacement and faster alternative to minimatch and multimatch.", - "version": "4.0.8", - "homepage": "https://github.com/micromatch/micromatch", - "author": "Jon Schlinkert (https://github.com/jonschlinkert)", - "contributors": [ - "(https://github.com/DianeLooney)", - "Amila Welihinda (amilajack.com)", - "Bogdan Chadkin (https://github.com/TrySound)", - "Brian Woodward (https://twitter.com/doowb)", - "Devon Govett (http://badassjs.com)", - "Elan Shanker (https://github.com/es128)", - "Fabrício Matté (https://ultcombo.js.org)", - "Jon Schlinkert (http://twitter.com/jonschlinkert)", - "Martin Kolárik (https://kolarik.sk)", - "Olsten Larck (https://i.am.charlike.online)", - "Paul Miller (paulmillr.com)", - "Tom Byrer (https://github.com/tomByrer)", - "Tyler Akins (http://rumkin.com)", - "Peter Bright (https://github.com/drpizza)", - "Kuba Juszczyk (https://github.com/ku8ar)" - ], - "repository": "micromatch/micromatch", - "bugs": { - "url": "https://github.com/micromatch/micromatch/issues" - }, - "license": "MIT", - "files": [ - "index.js" - ], - "main": "index.js", - "engines": { - "node": ">=8.6" - }, - "scripts": { - "test": "mocha" - }, - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "devDependencies": { - "fill-range": "^7.0.1", - "gulp-format-md": "^2.0.0", - "minimatch": "^5.0.1", - "mocha": "^9.2.2", - "time-require": "github:jonschlinkert/time-require" - }, - "keywords": [ - "bash", - "bracket", - "character-class", - "expand", - "expansion", - "expression", - "extglob", - "extglobs", - "file", - "files", - "filter", - "find", - "glob", - "globbing", - "globs", - "globstar", - "lookahead", - "lookaround", - "lookbehind", - "match", - "matcher", - "matches", - "matching", - "micromatch", - "minimatch", - "multimatch", - "negate", - "negation", - "path", - "pattern", - "patterns", - "posix", - "regex", - "regexp", - "regular", - "shell", - "star", - "wildcard" - ], - "verb": { - "toc": "collapsible", - "layout": "default", - "tasks": [ - "readme" - ], - "plugins": [ - "gulp-format-md" - ], - "lint": { - "reflinks": true - }, - "related": { - "list": [ - "braces", - "expand-brackets", - "extglob", - "fill-range", - "nanomatch" - ] - }, - "reflinks": [ - "extglob", - "fill-range", - "glob-object", - "minimatch", - "multimatch" - ] - } -} diff --git a/node_modules/minimatch/LICENSE b/node_modules/minimatch/LICENSE deleted file mode 100644 index 1493534..0000000 --- a/node_modules/minimatch/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) 2011-2023 Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/minimatch/README.md b/node_modules/minimatch/README.md deleted file mode 100644 index 3c97a02..0000000 --- a/node_modules/minimatch/README.md +++ /dev/null @@ -1,454 +0,0 @@ -# minimatch - -A minimal matching utility. - -This is the matching library used internally by npm. - -It works by converting glob expressions into JavaScript `RegExp` -objects. - -## Usage - -```js -// hybrid module, load with require() or import -import { minimatch } from 'minimatch' -// or: -const { minimatch } = require('minimatch') - -minimatch('bar.foo', '*.foo') // true! -minimatch('bar.foo', '*.bar') // false! -minimatch('bar.foo', '*.+(bar|foo)', { debug: true }) // true, and noisy! -``` - -## Features - -Supports these glob features: - -- Brace Expansion -- Extended glob matching -- "Globstar" `**` matching -- [Posix character - classes](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html), - like `[[:alpha:]]`, supporting the full range of Unicode - characters. For example, `[[:alpha:]]` will match against - `'é'`, though `[a-zA-Z]` will not. Collating symbol and set - matching is not supported, so `[[=e=]]` will _not_ match `'é'` - and `[[.ch.]]` will not match `'ch'` in locales where `ch` is - considered a single character. - -See: - -- `man sh` -- `man bash` [Pattern - Matching](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html) -- `man 3 fnmatch` -- `man 5 gitignore` - -## Windows - -**Please only use forward-slashes in glob expressions.** - -Though windows uses either `/` or `\` as its path separator, only `/` -characters are used by this glob implementation. You must use -forward-slashes **only** in glob expressions. Back-slashes in patterns -will always be interpreted as escape characters, not path separators. - -Note that `\` or `/` _will_ be interpreted as path separators in paths on -Windows, and will match against `/` in glob expressions. - -So just always use `/` in patterns. - -### UNC Paths - -On Windows, UNC paths like `//?/c:/...` or -`//ComputerName/Share/...` are handled specially. - -- Patterns starting with a double-slash followed by some - non-slash characters will preserve their double-slash. As a - result, a pattern like `//*` will match `//x`, but not `/x`. -- Patterns staring with `//?/:` will _not_ treat - the `?` as a wildcard character. Instead, it will be treated - as a normal string. -- Patterns starting with `//?/:/...` will match - file paths starting with `:/...`, and vice versa, - as if the `//?/` was not present. This behavior only is - present when the drive letters are a case-insensitive match to - one another. The remaining portions of the path/pattern are - compared case sensitively, unless `nocase:true` is set. - -Note that specifying a UNC path using `\` characters as path -separators is always allowed in the file path argument, but only -allowed in the pattern argument when `windowsPathsNoEscape: true` -is set in the options. - -## Minimatch Class - -Create a minimatch object by instantiating the `minimatch.Minimatch` class. - -```javascript -var Minimatch = require('minimatch').Minimatch -var mm = new Minimatch(pattern, options) -``` - -### Properties - -- `pattern` The original pattern the minimatch object represents. -- `options` The options supplied to the constructor. -- `set` A 2-dimensional array of regexp or string expressions. - Each row in the - array corresponds to a brace-expanded pattern. Each item in the row - corresponds to a single path-part. For example, the pattern - `{a,b/c}/d` would expand to a set of patterns like: - - [ [ a, d ] - , [ b, c, d ] ] - - If a portion of the pattern doesn't have any "magic" in it - (that is, it's something like `"foo"` rather than `fo*o?`), then it - will be left as a string rather than converted to a regular - expression. - -- `regexp` Created by the `makeRe` method. A single regular expression - expressing the entire pattern. This is useful in cases where you wish - to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled. -- `negate` True if the pattern is negated. -- `comment` True if the pattern is a comment. -- `empty` True if the pattern is `""`. - -### Methods - -- `makeRe()` Generate the `regexp` member if necessary, and return it. - Will return `false` if the pattern is invalid. -- `match(fname)` Return true if the filename matches the pattern, or - false otherwise. -- `matchOne(fileArray, patternArray, partial)` Take a `/`-split - filename, and match it against a single row in the `regExpSet`. This - method is mainly for internal use, but is exposed so that it can be - used by a glob-walker that needs to avoid excessive filesystem calls. -- `hasMagic()` Returns true if the parsed pattern contains any - magic characters. Returns false if all comparator parts are - string literals. If the `magicalBraces` option is set on the - constructor, then it will consider brace expansions which are - not otherwise magical to be magic. If not set, then a pattern - like `a{b,c}d` will return `false`, because neither `abd` nor - `acd` contain any special glob characters. - - This does **not** mean that the pattern string can be used as a - literal filename, as it may contain magic glob characters that - are escaped. For example, the pattern `\\*` or `[*]` would not - be considered to have magic, as the matching portion parses to - the literal string `'*'` and would match a path named `'*'`, - not `'\\*'` or `'[*]'`. The `minimatch.unescape()` method may - be used to remove escape characters. - -All other methods are internal, and will be called as necessary. - -### minimatch(path, pattern, options) - -Main export. Tests a path against the pattern using the options. - -```javascript -var isJS = minimatch(file, '*.js', { matchBase: true }) -``` - -### minimatch.filter(pattern, options) - -Returns a function that tests its -supplied argument, suitable for use with `Array.filter`. Example: - -```javascript -var javascripts = fileList.filter(minimatch.filter('*.js', { matchBase: true })) -``` - -### minimatch.escape(pattern, options = {}) - -Escape all magic characters in a glob pattern, so that it will -only ever match literal strings - -If the `windowsPathsNoEscape` option is used, then characters are -escaped by wrapping in `[]`, because a magic character wrapped in -a character class can only be satisfied by that exact character. - -Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot -be escaped or unescaped. - -### minimatch.unescape(pattern, options = {}) - -Un-escape a glob string that may contain some escaped characters. - -If the `windowsPathsNoEscape` option is used, then square-brace -escapes are removed, but not backslash escapes. For example, it -will turn the string `'[*]'` into `*`, but it will not turn -`'\\*'` into `'*'`, because `\` is a path separator in -`windowsPathsNoEscape` mode. - -When `windowsPathsNoEscape` is not set, then both brace escapes -and backslash escapes are removed. - -Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot -be escaped or unescaped. - -### minimatch.match(list, pattern, options) - -Match against the list of -files, in the style of fnmatch or glob. If nothing is matched, and -options.nonull is set, then return a list containing the pattern itself. - -```javascript -var javascripts = minimatch.match(fileList, '*.js', { matchBase: true }) -``` - -### minimatch.makeRe(pattern, options) - -Make a regular expression object from the pattern. - -## Options - -All options are `false` by default. - -### debug - -Dump a ton of stuff to stderr. - -### nobrace - -Do not expand `{a,b}` and `{1..3}` brace sets. - -### noglobstar - -Disable `**` matching against multiple folder names. - -### dot - -Allow patterns to match filenames starting with a period, even if -the pattern does not explicitly have a period in that spot. - -Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot` -is set. - -### noext - -Disable "extglob" style patterns like `+(a|b)`. - -### nocase - -Perform a case-insensitive match. - -### nocaseMagicOnly - -When used with `{nocase: true}`, create regular expressions that -are case-insensitive, but leave string match portions untouched. -Has no effect when used without `{nocase: true}` - -Useful when some other form of case-insensitive matching is used, -or if the original string representation is useful in some other -way. - -### nonull - -When a match is not found by `minimatch.match`, return a list containing -the pattern itself if this option is set. When not set, an empty list -is returned if there are no matches. - -### magicalBraces - -This only affects the results of the `Minimatch.hasMagic` method. - -If the pattern contains brace expansions, such as `a{b,c}d`, but -no other magic characters, then the `Minimatch.hasMagic()` method -will return `false` by default. When this option set, it will -return `true` for brace expansion as well as other magic glob -characters. - -### matchBase - -If set, then patterns without slashes will be matched -against the basename of the path if it contains slashes. For example, -`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`. - -### nocomment - -Suppress the behavior of treating `#` at the start of a pattern as a -comment. - -### nonegate - -Suppress the behavior of treating a leading `!` character as negation. - -### flipNegate - -Returns from negate expressions the same as if they were not negated. -(Ie, true on a hit, false on a miss.) - -### partial - -Compare a partial path to a pattern. As long as the parts of the path that -are present are not contradicted by the pattern, it will be treated as a -match. This is useful in applications where you're walking through a -folder structure, and don't yet have the full path, but want to ensure that -you do not walk down paths that can never be a match. - -For example, - -```js -minimatch('/a/b', '/a/*/c/d', { partial: true }) // true, might be /a/b/c/d -minimatch('/a/b', '/**/d', { partial: true }) // true, might be /a/b/.../d -minimatch('/x/y/z', '/a/**/z', { partial: true }) // false, because x !== a -``` - -### windowsPathsNoEscape - -Use `\\` as a path separator _only_, and _never_ as an escape -character. If set, all `\\` characters are replaced with `/` in -the pattern. Note that this makes it **impossible** to match -against paths containing literal glob pattern characters, but -allows matching with patterns constructed using `path.join()` and -`path.resolve()` on Windows platforms, mimicking the (buggy!) -behavior of earlier versions on Windows. Please use with -caution, and be mindful of [the caveat about Windows -paths](#windows). - -For legacy reasons, this is also set if -`options.allowWindowsEscape` is set to the exact value `false`. - -### windowsNoMagicRoot - -When a pattern starts with a UNC path or drive letter, and in -`nocase:true` mode, do not convert the root portions of the -pattern into a case-insensitive regular expression, and instead -leave them as strings. - -This is the default when the platform is `win32` and -`nocase:true` is set. - -### preserveMultipleSlashes - -By default, multiple `/` characters (other than the leading `//` -in a UNC path, see "UNC Paths" above) are treated as a single -`/`. - -That is, a pattern like `a///b` will match the file path `a/b`. - -Set `preserveMultipleSlashes: true` to suppress this behavior. - -### optimizationLevel - -A number indicating the level of optimization that should be done -to the pattern prior to parsing and using it for matches. - -Globstar parts `**` are always converted to `*` when `noglobstar` -is set, and multiple adjacent `**` parts are converted into a -single `**` (ie, `a/**/**/b` will be treated as `a/**/b`, as this -is equivalent in all cases). - -- `0` - Make no further changes. In this mode, `.` and `..` are - maintained in the pattern, meaning that they must also appear - in the same position in the test path string. Eg, a pattern - like `a/*/../c` will match the string `a/b/../c` but not the - string `a/c`. -- `1` - (default) Remove cases where a double-dot `..` follows a - pattern portion that is not `**`, `.`, `..`, or empty `''`. For - example, the pattern `./a/b/../*` is converted to `./a/*`, and - so it will match the path string `./a/c`, but not the path - string `./a/b/../c`. Dots and empty path portions in the - pattern are preserved. -- `2` (or higher) - Much more aggressive optimizations, suitable - for use with file-walking cases: - - - Remove cases where a double-dot `..` follows a pattern - portion that is not `**`, `.`, or empty `''`. Remove empty - and `.` portions of the pattern, where safe to do so (ie, - anywhere other than the last position, the first position, or - the second position in a pattern starting with `/`, as this - may indicate a UNC path on Windows). - - Convert patterns containing `
    /**/../

    /` into the - equivalent `

    /{..,**}/

    /`, where `

    ` is a - a pattern portion other than `.`, `..`, `**`, or empty - `''`. - - Dedupe patterns where a `**` portion is present in one and - omitted in another, and it is not the final path portion, and - they are otherwise equivalent. So `{a/**/b,a/b}` becomes - `a/**/b`, because `**` matches against an empty path portion. - - Dedupe patterns where a `*` portion is present in one, and a - non-dot pattern other than `**`, `.`, `..`, or `''` is in the - same position in the other. So `a/{*,x}/b` becomes `a/*/b`, - because `*` can match against `x`. - - While these optimizations improve the performance of - file-walking use cases such as [glob](http://npm.im/glob) (ie, - the reason this module exists), there are cases where it will - fail to match a literal string that would have been matched in - optimization level 1 or 0. - - Specifically, while the `Minimatch.match()` method will - optimize the file path string in the same ways, resulting in - the same matches, it will fail when tested with the regular - expression provided by `Minimatch.makeRe()`, unless the path - string is first processed with - `minimatch.levelTwoFileOptimize()` or similar. - -### platform - -When set to `win32`, this will trigger all windows-specific -behaviors (special handling for UNC paths, and treating `\` as -separators in file paths for comparison.) - -Defaults to the value of `process.platform`. - -## Comparisons to other fnmatch/glob implementations - -While strict compliance with the existing standards is a -worthwhile goal, some discrepancies exist between minimatch and -other implementations. Some are intentional, and some are -unavoidable. - -If the pattern starts with a `!` character, then it is negated. Set the -`nonegate` flag to suppress this behavior, and treat leading `!` -characters normally. This is perhaps relevant if you wish to start the -pattern with a negative extglob pattern like `!(a|B)`. Multiple `!` -characters at the start of a pattern will negate the pattern multiple -times. - -If a pattern starts with `#`, then it is treated as a comment, and -will not match anything. Use `\#` to match a literal `#` at the -start of a line, or set the `nocomment` flag to suppress this behavior. - -The double-star character `**` is supported by default, unless the -`noglobstar` flag is set. This is supported in the manner of bsdglob -and bash 4.1, where `**` only has special significance if it is the only -thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but -`a/**b` will not. - -If an escaped pattern has no matches, and the `nonull` flag is set, -then minimatch.match returns the pattern as-provided, rather than -interpreting the character escapes. For example, -`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than -`"*a?"`. This is akin to setting the `nullglob` option in bash, except -that it does not resolve escaped pattern characters. - -If brace expansion is not disabled, then it is performed before any -other interpretation of the glob pattern. Thus, a pattern like -`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded -**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are -checked for validity. Since those two are valid, matching proceeds. - -Negated extglob patterns are handled as closely as possible to -Bash semantics, but there are some cases with negative extglobs -which are exceedingly difficult to express in a JavaScript -regular expression. In particular the negated pattern -`!(*|)*` will in bash match anything that does -not start with ``. However, -`!(*)*` _will_ match paths starting with -``, because the empty string can match against -the negated portion. In this library, `!(*|)*` -will _not_ match any pattern starting with ``, due to a -difference in precisely which patterns are considered "greedy" in -Regular Expressions vs bash path expansion. This may be fixable, -but not without incurring some complexity and performance costs, -and the trade-off seems to not be worth pursuing. - -Note that `fnmatch(3)` in libc is an extremely naive string comparison -matcher, which does not do anything special for slashes. This library is -designed to be used in glob searching and file walkers, and so it does do -special things with `/`. Thus, `foo*` will not match `foo/bar` in this -library, even though it would in `fnmatch(3)`. diff --git a/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts b/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts deleted file mode 100644 index 8e318b2..0000000 --- a/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export declare const assertValidPattern: (pattern: any) => void; -//# sourceMappingURL=assert-valid-pattern.d.ts.map \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map b/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map deleted file mode 100644 index c61c031..0000000 --- a/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"assert-valid-pattern.d.ts","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,kBAAkB,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAUlD,CAAA"} \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js b/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js deleted file mode 100644 index 5fc86bb..0000000 --- a/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js +++ /dev/null @@ -1,14 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.assertValidPattern = void 0; -const MAX_PATTERN_LENGTH = 1024 * 64; -const assertValidPattern = (pattern) => { - if (typeof pattern !== 'string') { - throw new TypeError('invalid pattern'); - } - if (pattern.length > MAX_PATTERN_LENGTH) { - throw new TypeError('pattern is too long'); - } -}; -exports.assertValidPattern = assertValidPattern; -//# sourceMappingURL=assert-valid-pattern.js.map \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js.map b/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js.map deleted file mode 100644 index d43215c..0000000 --- a/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"assert-valid-pattern.js","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":";;;AAAA,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAE,CAAA;AAC7B,MAAM,kBAAkB,GAA2B,CACxD,OAAY,EACe,EAAE;IAC7B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;QAC/B,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAA;KACvC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE;QACvC,MAAM,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAA;KAC3C;AACH,CAAC,CAAA;AAVY,QAAA,kBAAkB,sBAU9B","sourcesContent":["const MAX_PATTERN_LENGTH = 1024 * 64\nexport const assertValidPattern: (pattern: any) => void = (\n pattern: any\n): asserts pattern is string => {\n if (typeof pattern !== 'string') {\n throw new TypeError('invalid pattern')\n }\n\n if (pattern.length > MAX_PATTERN_LENGTH) {\n throw new TypeError('pattern is too long')\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/ast.d.ts b/node_modules/minimatch/dist/commonjs/ast.d.ts deleted file mode 100644 index b8c1e54..0000000 --- a/node_modules/minimatch/dist/commonjs/ast.d.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { MinimatchOptions, MMRegExp } from './index.js'; -export type ExtglobType = '!' | '?' | '+' | '*' | '@'; -export declare class AST { - #private; - type: ExtglobType | null; - constructor(type: ExtglobType | null, parent?: AST, options?: MinimatchOptions); - get hasMagic(): boolean | undefined; - toString(): string; - push(...parts: (string | AST)[]): void; - toJSON(): any[]; - isStart(): boolean; - isEnd(): boolean; - copyIn(part: AST | string): void; - clone(parent: AST): AST; - static fromGlob(pattern: string, options?: MinimatchOptions): AST; - toMMPattern(): MMRegExp | string; - get options(): MinimatchOptions; - toRegExpSource(allowDot?: boolean): [re: string, body: string, hasMagic: boolean, uflag: boolean]; -} -//# sourceMappingURL=ast.d.ts.map \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/ast.d.ts.map b/node_modules/minimatch/dist/commonjs/ast.d.ts.map deleted file mode 100644 index 9e7bfb9..0000000 --- a/node_modules/minimatch/dist/commonjs/ast.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAwCvD,MAAM,MAAM,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AAkCrD,qBAAa,GAAG;;IACd,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;gBAiBtB,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,MAAM,CAAC,EAAE,GAAG,EACZ,OAAO,GAAE,gBAAqB;IAahC,IAAI,QAAQ,IAAI,OAAO,GAAG,SAAS,CAUlC;IAGD,QAAQ,IAAI,MAAM;IA+ClB,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE;IAY/B,MAAM;IAgBN,OAAO,IAAI,OAAO;IAgBlB,KAAK,IAAI,OAAO;IAYhB,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM;IAKzB,KAAK,CAAC,MAAM,EAAE,GAAG;IAsIjB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;IAQ/D,WAAW,IAAI,QAAQ,GAAG,MAAM;IA2BhC,IAAI,OAAO,qBAEV;IAuED,cAAc,CACZ,QAAQ,CAAC,EAAE,OAAO,GACjB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC;CAiMjE"} \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/ast.js b/node_modules/minimatch/dist/commonjs/ast.js deleted file mode 100644 index 7b21096..0000000 --- a/node_modules/minimatch/dist/commonjs/ast.js +++ /dev/null @@ -1,592 +0,0 @@ -"use strict"; -// parse a single path portion -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AST = void 0; -const brace_expressions_js_1 = require("./brace-expressions.js"); -const unescape_js_1 = require("./unescape.js"); -const types = new Set(['!', '?', '+', '*', '@']); -const isExtglobType = (c) => types.has(c); -// Patterns that get prepended to bind to the start of either the -// entire string, or just a single path portion, to prevent dots -// and/or traversal patterns, when needed. -// Exts don't need the ^ or / bit, because the root binds that already. -const startNoTraversal = '(?!(?:^|/)\\.\\.?(?:$|/))'; -const startNoDot = '(?!\\.)'; -// characters that indicate a start of pattern needs the "no dots" bit, -// because a dot *might* be matched. ( is not in the list, because in -// the case of a child extglob, it will handle the prevention itself. -const addPatternStart = new Set(['[', '.']); -// cases where traversal is A-OK, no dot prevention needed -const justDots = new Set(['..', '.']); -const reSpecials = new Set('().*{}+?[]^$\\!'); -const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); -// any single thing other than / -const qmark = '[^/]'; -// * => any number of characters -const star = qmark + '*?'; -// use + when we need to ensure that *something* matches, because the * is -// the only thing in the path portion. -const starNoEmpty = qmark + '+?'; -// remove the \ chars that we added if we end up doing a nonmagic compare -// const deslash = (s: string) => s.replace(/\\(.)/g, '$1') -class AST { - type; - #root; - #hasMagic; - #uflag = false; - #parts = []; - #parent; - #parentIndex; - #negs; - #filledNegs = false; - #options; - #toString; - // set to true if it's an extglob with no children - // (which really means one child of '') - #emptyExt = false; - constructor(type, parent, options = {}) { - this.type = type; - // extglobs are inherently magical - if (type) - this.#hasMagic = true; - this.#parent = parent; - this.#root = this.#parent ? this.#parent.#root : this; - this.#options = this.#root === this ? options : this.#root.#options; - this.#negs = this.#root === this ? [] : this.#root.#negs; - if (type === '!' && !this.#root.#filledNegs) - this.#negs.push(this); - this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0; - } - get hasMagic() { - /* c8 ignore start */ - if (this.#hasMagic !== undefined) - return this.#hasMagic; - /* c8 ignore stop */ - for (const p of this.#parts) { - if (typeof p === 'string') - continue; - if (p.type || p.hasMagic) - return (this.#hasMagic = true); - } - // note: will be undefined until we generate the regexp src and find out - return this.#hasMagic; - } - // reconstructs the pattern - toString() { - if (this.#toString !== undefined) - return this.#toString; - if (!this.type) { - return (this.#toString = this.#parts.map(p => String(p)).join('')); - } - else { - return (this.#toString = - this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')'); - } - } - #fillNegs() { - /* c8 ignore start */ - if (this !== this.#root) - throw new Error('should only call on root'); - if (this.#filledNegs) - return this; - /* c8 ignore stop */ - // call toString() once to fill this out - this.toString(); - this.#filledNegs = true; - let n; - while ((n = this.#negs.pop())) { - if (n.type !== '!') - continue; - // walk up the tree, appending everthing that comes AFTER parentIndex - let p = n; - let pp = p.#parent; - while (pp) { - for (let i = p.#parentIndex + 1; !pp.type && i < pp.#parts.length; i++) { - for (const part of n.#parts) { - /* c8 ignore start */ - if (typeof part === 'string') { - throw new Error('string part in extglob AST??'); - } - /* c8 ignore stop */ - part.copyIn(pp.#parts[i]); - } - } - p = pp; - pp = p.#parent; - } - } - return this; - } - push(...parts) { - for (const p of parts) { - if (p === '') - continue; - /* c8 ignore start */ - if (typeof p !== 'string' && !(p instanceof AST && p.#parent === this)) { - throw new Error('invalid part: ' + p); - } - /* c8 ignore stop */ - this.#parts.push(p); - } - } - toJSON() { - const ret = this.type === null - ? this.#parts.slice().map(p => (typeof p === 'string' ? p : p.toJSON())) - : [this.type, ...this.#parts.map(p => p.toJSON())]; - if (this.isStart() && !this.type) - ret.unshift([]); - if (this.isEnd() && - (this === this.#root || - (this.#root.#filledNegs && this.#parent?.type === '!'))) { - ret.push({}); - } - return ret; - } - isStart() { - if (this.#root === this) - return true; - // if (this.type) return !!this.#parent?.isStart() - if (!this.#parent?.isStart()) - return false; - if (this.#parentIndex === 0) - return true; - // if everything AHEAD of this is a negation, then it's still the "start" - const p = this.#parent; - for (let i = 0; i < this.#parentIndex; i++) { - const pp = p.#parts[i]; - if (!(pp instanceof AST && pp.type === '!')) { - return false; - } - } - return true; - } - isEnd() { - if (this.#root === this) - return true; - if (this.#parent?.type === '!') - return true; - if (!this.#parent?.isEnd()) - return false; - if (!this.type) - return this.#parent?.isEnd(); - // if not root, it'll always have a parent - /* c8 ignore start */ - const pl = this.#parent ? this.#parent.#parts.length : 0; - /* c8 ignore stop */ - return this.#parentIndex === pl - 1; - } - copyIn(part) { - if (typeof part === 'string') - this.push(part); - else - this.push(part.clone(this)); - } - clone(parent) { - const c = new AST(this.type, parent); - for (const p of this.#parts) { - c.copyIn(p); - } - return c; - } - static #parseAST(str, ast, pos, opt) { - let escaping = false; - let inBrace = false; - let braceStart = -1; - let braceNeg = false; - if (ast.type === null) { - // outside of a extglob, append until we find a start - let i = pos; - let acc = ''; - while (i < str.length) { - const c = str.charAt(i++); - // still accumulate escapes at this point, but we do ignore - // starts that are escaped - if (escaping || c === '\\') { - escaping = !escaping; - acc += c; - continue; - } - if (inBrace) { - if (i === braceStart + 1) { - if (c === '^' || c === '!') { - braceNeg = true; - } - } - else if (c === ']' && !(i === braceStart + 2 && braceNeg)) { - inBrace = false; - } - acc += c; - continue; - } - else if (c === '[') { - inBrace = true; - braceStart = i; - braceNeg = false; - acc += c; - continue; - } - if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') { - ast.push(acc); - acc = ''; - const ext = new AST(c, ast); - i = AST.#parseAST(str, ext, i, opt); - ast.push(ext); - continue; - } - acc += c; - } - ast.push(acc); - return i; - } - // some kind of extglob, pos is at the ( - // find the next | or ) - let i = pos + 1; - let part = new AST(null, ast); - const parts = []; - let acc = ''; - while (i < str.length) { - const c = str.charAt(i++); - // still accumulate escapes at this point, but we do ignore - // starts that are escaped - if (escaping || c === '\\') { - escaping = !escaping; - acc += c; - continue; - } - if (inBrace) { - if (i === braceStart + 1) { - if (c === '^' || c === '!') { - braceNeg = true; - } - } - else if (c === ']' && !(i === braceStart + 2 && braceNeg)) { - inBrace = false; - } - acc += c; - continue; - } - else if (c === '[') { - inBrace = true; - braceStart = i; - braceNeg = false; - acc += c; - continue; - } - if (isExtglobType(c) && str.charAt(i) === '(') { - part.push(acc); - acc = ''; - const ext = new AST(c, part); - part.push(ext); - i = AST.#parseAST(str, ext, i, opt); - continue; - } - if (c === '|') { - part.push(acc); - acc = ''; - parts.push(part); - part = new AST(null, ast); - continue; - } - if (c === ')') { - if (acc === '' && ast.#parts.length === 0) { - ast.#emptyExt = true; - } - part.push(acc); - acc = ''; - ast.push(...parts, part); - return i; - } - acc += c; - } - // unfinished extglob - // if we got here, it was a malformed extglob! not an extglob, but - // maybe something else in there. - ast.type = null; - ast.#hasMagic = undefined; - ast.#parts = [str.substring(pos - 1)]; - return i; - } - static fromGlob(pattern, options = {}) { - const ast = new AST(null, undefined, options); - AST.#parseAST(pattern, ast, 0, options); - return ast; - } - // returns the regular expression if there's magic, or the unescaped - // string if not. - toMMPattern() { - // should only be called on root - /* c8 ignore start */ - if (this !== this.#root) - return this.#root.toMMPattern(); - /* c8 ignore stop */ - const glob = this.toString(); - const [re, body, hasMagic, uflag] = this.toRegExpSource(); - // if we're in nocase mode, and not nocaseMagicOnly, then we do - // still need a regular expression if we have to case-insensitively - // match capital/lowercase characters. - const anyMagic = hasMagic || - this.#hasMagic || - (this.#options.nocase && - !this.#options.nocaseMagicOnly && - glob.toUpperCase() !== glob.toLowerCase()); - if (!anyMagic) { - return body; - } - const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : ''); - return Object.assign(new RegExp(`^${re}$`, flags), { - _src: re, - _glob: glob, - }); - } - get options() { - return this.#options; - } - // returns the string match, the regexp source, whether there's magic - // in the regexp (so a regular expression is required) and whether or - // not the uflag is needed for the regular expression (for posix classes) - // TODO: instead of injecting the start/end at this point, just return - // the BODY of the regexp, along with the start/end portions suitable - // for binding the start/end in either a joined full-path makeRe context - // (where we bind to (^|/), or a standalone matchPart context (where - // we bind to ^, and not /). Otherwise slashes get duped! - // - // In part-matching mode, the start is: - // - if not isStart: nothing - // - if traversal possible, but not allowed: ^(?!\.\.?$) - // - if dots allowed or not possible: ^ - // - if dots possible and not allowed: ^(?!\.) - // end is: - // - if not isEnd(): nothing - // - else: $ - // - // In full-path matching mode, we put the slash at the START of the - // pattern, so start is: - // - if first pattern: same as part-matching mode - // - if not isStart(): nothing - // - if traversal possible, but not allowed: /(?!\.\.?(?:$|/)) - // - if dots allowed or not possible: / - // - if dots possible and not allowed: /(?!\.) - // end is: - // - if last pattern, same as part-matching mode - // - else nothing - // - // Always put the (?:$|/) on negated tails, though, because that has to be - // there to bind the end of the negated pattern portion, and it's easier to - // just stick it in now rather than try to inject it later in the middle of - // the pattern. - // - // We can just always return the same end, and leave it up to the caller - // to know whether it's going to be used joined or in parts. - // And, if the start is adjusted slightly, can do the same there: - // - if not isStart: nothing - // - if traversal possible, but not allowed: (?:/|^)(?!\.\.?$) - // - if dots allowed or not possible: (?:/|^) - // - if dots possible and not allowed: (?:/|^)(?!\.) - // - // But it's better to have a simpler binding without a conditional, for - // performance, so probably better to return both start options. - // - // Then the caller just ignores the end if it's not the first pattern, - // and the start always gets applied. - // - // But that's always going to be $ if it's the ending pattern, or nothing, - // so the caller can just attach $ at the end of the pattern when building. - // - // So the todo is: - // - better detect what kind of start is needed - // - return both flavors of starting pattern - // - attach $ at the end of the pattern when creating the actual RegExp - // - // Ah, but wait, no, that all only applies to the root when the first pattern - // is not an extglob. If the first pattern IS an extglob, then we need all - // that dot prevention biz to live in the extglob portions, because eg - // +(*|.x*) can match .xy but not .yx. - // - // So, return the two flavors if it's #root and the first child is not an - // AST, otherwise leave it to the child AST to handle it, and there, - // use the (?:^|/) style of start binding. - // - // Even simplified further: - // - Since the start for a join is eg /(?!\.) and the start for a part - // is ^(?!\.), we can just prepend (?!\.) to the pattern (either root - // or start or whatever) and prepend ^ or / at the Regexp construction. - toRegExpSource(allowDot) { - const dot = allowDot ?? !!this.#options.dot; - if (this.#root === this) - this.#fillNegs(); - if (!this.type) { - const noEmpty = this.isStart() && this.isEnd(); - const src = this.#parts - .map(p => { - const [re, _, hasMagic, uflag] = typeof p === 'string' - ? AST.#parseGlob(p, this.#hasMagic, noEmpty) - : p.toRegExpSource(allowDot); - this.#hasMagic = this.#hasMagic || hasMagic; - this.#uflag = this.#uflag || uflag; - return re; - }) - .join(''); - let start = ''; - if (this.isStart()) { - if (typeof this.#parts[0] === 'string') { - // this is the string that will match the start of the pattern, - // so we need to protect against dots and such. - // '.' and '..' cannot match unless the pattern is that exactly, - // even if it starts with . or dot:true is set. - const dotTravAllowed = this.#parts.length === 1 && justDots.has(this.#parts[0]); - if (!dotTravAllowed) { - const aps = addPatternStart; - // check if we have a possibility of matching . or .., - // and prevent that. - const needNoTrav = - // dots are allowed, and the pattern starts with [ or . - (dot && aps.has(src.charAt(0))) || - // the pattern starts with \., and then [ or . - (src.startsWith('\\.') && aps.has(src.charAt(2))) || - // the pattern starts with \.\., and then [ or . - (src.startsWith('\\.\\.') && aps.has(src.charAt(4))); - // no need to prevent dots if it can't match a dot, or if a - // sub-pattern will be preventing it anyway. - const needNoDot = !dot && !allowDot && aps.has(src.charAt(0)); - start = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : ''; - } - } - } - // append the "end of path portion" pattern to negation tails - let end = ''; - if (this.isEnd() && - this.#root.#filledNegs && - this.#parent?.type === '!') { - end = '(?:$|\\/)'; - } - const final = start + src + end; - return [ - final, - (0, unescape_js_1.unescape)(src), - (this.#hasMagic = !!this.#hasMagic), - this.#uflag, - ]; - } - // We need to calculate the body *twice* if it's a repeat pattern - // at the start, once in nodot mode, then again in dot mode, so a - // pattern like *(?) can match 'x.y' - const repeated = this.type === '*' || this.type === '+'; - // some kind of extglob - const start = this.type === '!' ? '(?:(?!(?:' : '(?:'; - let body = this.#partsToRegExp(dot); - if (this.isStart() && this.isEnd() && !body && this.type !== '!') { - // invalid extglob, has to at least be *something* present, if it's - // the entire path portion. - const s = this.toString(); - this.#parts = [s]; - this.type = null; - this.#hasMagic = undefined; - return [s, (0, unescape_js_1.unescape)(this.toString()), false, false]; - } - // XXX abstract out this map method - let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot - ? '' - : this.#partsToRegExp(true); - if (bodyDotAllowed === body) { - bodyDotAllowed = ''; - } - if (bodyDotAllowed) { - body = `(?:${body})(?:${bodyDotAllowed})*?`; - } - // an empty !() is exactly equivalent to a starNoEmpty - let final = ''; - if (this.type === '!' && this.#emptyExt) { - final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty; - } - else { - const close = this.type === '!' - ? // !() must match something,but !(x) can match '' - '))' + - (this.isStart() && !dot && !allowDot ? startNoDot : '') + - star + - ')' - : this.type === '@' - ? ')' - : this.type === '?' - ? ')?' - : this.type === '+' && bodyDotAllowed - ? ')' - : this.type === '*' && bodyDotAllowed - ? `)?` - : `)${this.type}`; - final = start + body + close; - } - return [ - final, - (0, unescape_js_1.unescape)(body), - (this.#hasMagic = !!this.#hasMagic), - this.#uflag, - ]; - } - #partsToRegExp(dot) { - return this.#parts - .map(p => { - // extglob ASTs should only contain parent ASTs - /* c8 ignore start */ - if (typeof p === 'string') { - throw new Error('string type in extglob ast??'); - } - /* c8 ignore stop */ - // can ignore hasMagic, because extglobs are already always magic - const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot); - this.#uflag = this.#uflag || uflag; - return re; - }) - .filter(p => !(this.isStart() && this.isEnd()) || !!p) - .join('|'); - } - static #parseGlob(glob, hasMagic, noEmpty = false) { - let escaping = false; - let re = ''; - let uflag = false; - for (let i = 0; i < glob.length; i++) { - const c = glob.charAt(i); - if (escaping) { - escaping = false; - re += (reSpecials.has(c) ? '\\' : '') + c; - continue; - } - if (c === '\\') { - if (i === glob.length - 1) { - re += '\\\\'; - } - else { - escaping = true; - } - continue; - } - if (c === '[') { - const [src, needUflag, consumed, magic] = (0, brace_expressions_js_1.parseClass)(glob, i); - if (consumed) { - re += src; - uflag = uflag || needUflag; - i += consumed - 1; - hasMagic = hasMagic || magic; - continue; - } - } - if (c === '*') { - if (noEmpty && glob === '*') - re += starNoEmpty; - else - re += star; - hasMagic = true; - continue; - } - if (c === '?') { - re += qmark; - hasMagic = true; - continue; - } - re += regExpEscape(c); - } - return [re, (0, unescape_js_1.unescape)(glob), !!hasMagic, uflag]; - } -} -exports.AST = AST; -//# sourceMappingURL=ast.js.map \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/ast.js.map b/node_modules/minimatch/dist/commonjs/ast.js.map deleted file mode 100644 index 8383e43..0000000 --- a/node_modules/minimatch/dist/commonjs/ast.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"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","sourcesContent":["// parse a single path portion\n\nimport { parseClass } from './brace-expressions.js'\nimport { MinimatchOptions, MMRegExp } from './index.js'\nimport { unescape } from './unescape.js'\n\n// classes [] are handled by the parseClass method\n// for positive extglobs, we sub-parse the contents, and combine,\n// with the appropriate regexp close.\n// for negative extglobs, we sub-parse the contents, but then\n// have to include the rest of the pattern, then the parent, etc.,\n// as the thing that cannot be because RegExp negative lookaheads\n// are different from globs.\n//\n// So for example:\n// a@(i|w!(x|y)z|j)b => ^a(i|w((!?(x|y)zb).*)z|j)b$\n// 1 2 3 4 5 6 1 2 3 46 5 6\n//\n// Assembling the extglob requires not just the negated patterns themselves,\n// but also anything following the negative patterns up to the boundary\n// of the current pattern, plus anything following in the parent pattern.\n//\n//\n// So, first, we parse the string into an AST of extglobs, without turning\n// anything into regexps yet.\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y']}, 'z'], ['j']]}, 'b']\n//\n// Then, for all the negative extglobs, we append whatever comes after in\n// each parent as their tail\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y'], 'z', 'b'}, 'z'], ['j']]}, 'b']\n//\n// Lastly, we turn each of these pieces into a regexp, and join\n//\n// v----- .* because there's more following,\n// v v otherwise, .+ because it must be\n// v v *something* there.\n// ['^a', {@ ['i', 'w(?:(!?(?:x|y).*zb$).*)z', 'j' ]}, 'b$']\n// copy what follows into here--^^^^^\n// ['^a', '(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)', 'b$']\n// ['^a(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)b$']\n\nexport type ExtglobType = '!' | '?' | '+' | '*' | '@'\nconst types = new Set(['!', '?', '+', '*', '@'])\nconst isExtglobType = (c: string): c is ExtglobType =>\n types.has(c as ExtglobType)\n\n// Patterns that get prepended to bind to the start of either the\n// entire string, or just a single path portion, to prevent dots\n// and/or traversal patterns, when needed.\n// Exts don't need the ^ or / bit, because the root binds that already.\nconst startNoTraversal = '(?!(?:^|/)\\\\.\\\\.?(?:$|/))'\nconst startNoDot = '(?!\\\\.)'\n\n// characters that indicate a start of pattern needs the \"no dots\" bit,\n// because a dot *might* be matched. ( is not in the list, because in\n// the case of a child extglob, it will handle the prevention itself.\nconst addPatternStart = new Set(['[', '.'])\n// cases where traversal is A-OK, no dot prevention needed\nconst justDots = new Set(['..', '.'])\nconst reSpecials = new Set('().*{}+?[]^$\\\\!')\nconst regExpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// any single thing other than /\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n// use + when we need to ensure that *something* matches, because the * is\n// the only thing in the path portion.\nconst starNoEmpty = qmark + '+?'\n\n// remove the \\ chars that we added if we end up doing a nonmagic compare\n// const deslash = (s: string) => s.replace(/\\\\(.)/g, '$1')\n\nexport class AST {\n type: ExtglobType | null\n readonly #root: AST\n\n #hasMagic?: boolean\n #uflag: boolean = false\n #parts: (string | AST)[] = []\n readonly #parent?: AST\n readonly #parentIndex: number\n #negs: AST[]\n #filledNegs: boolean = false\n #options: MinimatchOptions\n #toString?: string\n // set to true if it's an extglob with no children\n // (which really means one child of '')\n #emptyExt: boolean = false\n\n constructor(\n type: ExtglobType | null,\n parent?: AST,\n options: MinimatchOptions = {}\n ) {\n this.type = type\n // extglobs are inherently magical\n if (type) this.#hasMagic = true\n this.#parent = parent\n this.#root = this.#parent ? this.#parent.#root : this\n this.#options = this.#root === this ? options : this.#root.#options\n this.#negs = this.#root === this ? [] : this.#root.#negs\n if (type === '!' && !this.#root.#filledNegs) this.#negs.push(this)\n this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0\n }\n\n get hasMagic(): boolean | undefined {\n /* c8 ignore start */\n if (this.#hasMagic !== undefined) return this.#hasMagic\n /* c8 ignore stop */\n for (const p of this.#parts) {\n if (typeof p === 'string') continue\n if (p.type || p.hasMagic) return (this.#hasMagic = true)\n }\n // note: will be undefined until we generate the regexp src and find out\n return this.#hasMagic\n }\n\n // reconstructs the pattern\n toString(): string {\n if (this.#toString !== undefined) return this.#toString\n if (!this.type) {\n return (this.#toString = this.#parts.map(p => String(p)).join(''))\n } else {\n return (this.#toString =\n this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')')\n }\n }\n\n #fillNegs() {\n /* c8 ignore start */\n if (this !== this.#root) throw new Error('should only call on root')\n if (this.#filledNegs) return this\n /* c8 ignore stop */\n\n // call toString() once to fill this out\n this.toString()\n this.#filledNegs = true\n let n: AST | undefined\n while ((n = this.#negs.pop())) {\n if (n.type !== '!') continue\n // walk up the tree, appending everthing that comes AFTER parentIndex\n let p: AST | undefined = n\n let pp = p.#parent\n while (pp) {\n for (\n let i = p.#parentIndex + 1;\n !pp.type && i < pp.#parts.length;\n i++\n ) {\n for (const part of n.#parts) {\n /* c8 ignore start */\n if (typeof part === 'string') {\n throw new Error('string part in extglob AST??')\n }\n /* c8 ignore stop */\n part.copyIn(pp.#parts[i])\n }\n }\n p = pp\n pp = p.#parent\n }\n }\n return this\n }\n\n push(...parts: (string | AST)[]) {\n for (const p of parts) {\n if (p === '') continue\n /* c8 ignore start */\n if (typeof p !== 'string' && !(p instanceof AST && p.#parent === this)) {\n throw new Error('invalid part: ' + p)\n }\n /* c8 ignore stop */\n this.#parts.push(p)\n }\n }\n\n toJSON() {\n const ret: any[] =\n this.type === null\n ? this.#parts.slice().map(p => (typeof p === 'string' ? p : p.toJSON()))\n : [this.type, ...this.#parts.map(p => (p as AST).toJSON())]\n if (this.isStart() && !this.type) ret.unshift([])\n if (\n this.isEnd() &&\n (this === this.#root ||\n (this.#root.#filledNegs && this.#parent?.type === '!'))\n ) {\n ret.push({})\n }\n return ret\n }\n\n isStart(): boolean {\n if (this.#root === this) return true\n // if (this.type) return !!this.#parent?.isStart()\n if (!this.#parent?.isStart()) return false\n if (this.#parentIndex === 0) return true\n // if everything AHEAD of this is a negation, then it's still the \"start\"\n const p = this.#parent\n for (let i = 0; i < this.#parentIndex; i++) {\n const pp = p.#parts[i]\n if (!(pp instanceof AST && pp.type === '!')) {\n return false\n }\n }\n return true\n }\n\n isEnd(): boolean {\n if (this.#root === this) return true\n if (this.#parent?.type === '!') return true\n if (!this.#parent?.isEnd()) return false\n if (!this.type) return this.#parent?.isEnd()\n // if not root, it'll always have a parent\n /* c8 ignore start */\n const pl = this.#parent ? this.#parent.#parts.length : 0\n /* c8 ignore stop */\n return this.#parentIndex === pl - 1\n }\n\n copyIn(part: AST | string) {\n if (typeof part === 'string') this.push(part)\n else this.push(part.clone(this))\n }\n\n clone(parent: AST) {\n const c = new AST(this.type, parent)\n for (const p of this.#parts) {\n c.copyIn(p)\n }\n return c\n }\n\n static #parseAST(\n str: string,\n ast: AST,\n pos: number,\n opt: MinimatchOptions\n ): number {\n let escaping = false\n let inBrace = false\n let braceStart = -1\n let braceNeg = false\n if (ast.type === null) {\n // outside of a extglob, append until we find a start\n let i = pos\n let acc = ''\n while (i < str.length) {\n const c = str.charAt(i++)\n // still accumulate escapes at this point, but we do ignore\n // starts that are escaped\n if (escaping || c === '\\\\') {\n escaping = !escaping\n acc += c\n continue\n }\n\n if (inBrace) {\n if (i === braceStart + 1) {\n if (c === '^' || c === '!') {\n braceNeg = true\n }\n } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n inBrace = false\n }\n acc += c\n continue\n } else if (c === '[') {\n inBrace = true\n braceStart = i\n braceNeg = false\n acc += c\n continue\n }\n\n if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') {\n ast.push(acc)\n acc = ''\n const ext = new AST(c, ast)\n i = AST.#parseAST(str, ext, i, opt)\n ast.push(ext)\n continue\n }\n acc += c\n }\n ast.push(acc)\n return i\n }\n\n // some kind of extglob, pos is at the (\n // find the next | or )\n let i = pos + 1\n let part = new AST(null, ast)\n const parts: AST[] = []\n let acc = ''\n while (i < str.length) {\n const c = str.charAt(i++)\n // still accumulate escapes at this point, but we do ignore\n // starts that are escaped\n if (escaping || c === '\\\\') {\n escaping = !escaping\n acc += c\n continue\n }\n\n if (inBrace) {\n if (i === braceStart + 1) {\n if (c === '^' || c === '!') {\n braceNeg = true\n }\n } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n inBrace = false\n }\n acc += c\n continue\n } else if (c === '[') {\n inBrace = true\n braceStart = i\n braceNeg = false\n acc += c\n continue\n }\n\n if (isExtglobType(c) && str.charAt(i) === '(') {\n part.push(acc)\n acc = ''\n const ext = new AST(c, part)\n part.push(ext)\n i = AST.#parseAST(str, ext, i, opt)\n continue\n }\n if (c === '|') {\n part.push(acc)\n acc = ''\n parts.push(part)\n part = new AST(null, ast)\n continue\n }\n if (c === ')') {\n if (acc === '' && ast.#parts.length === 0) {\n ast.#emptyExt = true\n }\n part.push(acc)\n acc = ''\n ast.push(...parts, part)\n return i\n }\n acc += c\n }\n\n // unfinished extglob\n // if we got here, it was a malformed extglob! not an extglob, but\n // maybe something else in there.\n ast.type = null\n ast.#hasMagic = undefined\n ast.#parts = [str.substring(pos - 1)]\n return i\n }\n\n static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n const ast = new AST(null, undefined, options)\n AST.#parseAST(pattern, ast, 0, options)\n return ast\n }\n\n // returns the regular expression if there's magic, or the unescaped\n // string if not.\n toMMPattern(): MMRegExp | string {\n // should only be called on root\n /* c8 ignore start */\n if (this !== this.#root) return this.#root.toMMPattern()\n /* c8 ignore stop */\n const glob = this.toString()\n const [re, body, hasMagic, uflag] = this.toRegExpSource()\n // if we're in nocase mode, and not nocaseMagicOnly, then we do\n // still need a regular expression if we have to case-insensitively\n // match capital/lowercase characters.\n const anyMagic =\n hasMagic ||\n this.#hasMagic ||\n (this.#options.nocase &&\n !this.#options.nocaseMagicOnly &&\n glob.toUpperCase() !== glob.toLowerCase())\n if (!anyMagic) {\n return body\n }\n\n const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '')\n return Object.assign(new RegExp(`^${re}$`, flags), {\n _src: re,\n _glob: glob,\n })\n }\n\n get options() {\n return this.#options\n }\n\n // returns the string match, the regexp source, whether there's magic\n // in the regexp (so a regular expression is required) and whether or\n // not the uflag is needed for the regular expression (for posix classes)\n // TODO: instead of injecting the start/end at this point, just return\n // the BODY of the regexp, along with the start/end portions suitable\n // for binding the start/end in either a joined full-path makeRe context\n // (where we bind to (^|/), or a standalone matchPart context (where\n // we bind to ^, and not /). Otherwise slashes get duped!\n //\n // In part-matching mode, the start is:\n // - if not isStart: nothing\n // - if traversal possible, but not allowed: ^(?!\\.\\.?$)\n // - if dots allowed or not possible: ^\n // - if dots possible and not allowed: ^(?!\\.)\n // end is:\n // - if not isEnd(): nothing\n // - else: $\n //\n // In full-path matching mode, we put the slash at the START of the\n // pattern, so start is:\n // - if first pattern: same as part-matching mode\n // - if not isStart(): nothing\n // - if traversal possible, but not allowed: /(?!\\.\\.?(?:$|/))\n // - if dots allowed or not possible: /\n // - if dots possible and not allowed: /(?!\\.)\n // end is:\n // - if last pattern, same as part-matching mode\n // - else nothing\n //\n // Always put the (?:$|/) on negated tails, though, because that has to be\n // there to bind the end of the negated pattern portion, and it's easier to\n // just stick it in now rather than try to inject it later in the middle of\n // the pattern.\n //\n // We can just always return the same end, and leave it up to the caller\n // to know whether it's going to be used joined or in parts.\n // And, if the start is adjusted slightly, can do the same there:\n // - if not isStart: nothing\n // - if traversal possible, but not allowed: (?:/|^)(?!\\.\\.?$)\n // - if dots allowed or not possible: (?:/|^)\n // - if dots possible and not allowed: (?:/|^)(?!\\.)\n //\n // But it's better to have a simpler binding without a conditional, for\n // performance, so probably better to return both start options.\n //\n // Then the caller just ignores the end if it's not the first pattern,\n // and the start always gets applied.\n //\n // But that's always going to be $ if it's the ending pattern, or nothing,\n // so the caller can just attach $ at the end of the pattern when building.\n //\n // So the todo is:\n // - better detect what kind of start is needed\n // - return both flavors of starting pattern\n // - attach $ at the end of the pattern when creating the actual RegExp\n //\n // Ah, but wait, no, that all only applies to the root when the first pattern\n // is not an extglob. If the first pattern IS an extglob, then we need all\n // that dot prevention biz to live in the extglob portions, because eg\n // +(*|.x*) can match .xy but not .yx.\n //\n // So, return the two flavors if it's #root and the first child is not an\n // AST, otherwise leave it to the child AST to handle it, and there,\n // use the (?:^|/) style of start binding.\n //\n // Even simplified further:\n // - Since the start for a join is eg /(?!\\.) and the start for a part\n // is ^(?!\\.), we can just prepend (?!\\.) to the pattern (either root\n // or start or whatever) and prepend ^ or / at the Regexp construction.\n toRegExpSource(\n allowDot?: boolean\n ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n const dot = allowDot ?? !!this.#options.dot\n if (this.#root === this) this.#fillNegs()\n if (!this.type) {\n const noEmpty = this.isStart() && this.isEnd()\n const src = this.#parts\n .map(p => {\n const [re, _, hasMagic, uflag] =\n typeof p === 'string'\n ? AST.#parseGlob(p, this.#hasMagic, noEmpty)\n : p.toRegExpSource(allowDot)\n this.#hasMagic = this.#hasMagic || hasMagic\n this.#uflag = this.#uflag || uflag\n return re\n })\n .join('')\n\n let start = ''\n if (this.isStart()) {\n if (typeof this.#parts[0] === 'string') {\n // this is the string that will match the start of the pattern,\n // so we need to protect against dots and such.\n\n // '.' and '..' cannot match unless the pattern is that exactly,\n // even if it starts with . or dot:true is set.\n const dotTravAllowed =\n this.#parts.length === 1 && justDots.has(this.#parts[0])\n if (!dotTravAllowed) {\n const aps = addPatternStart\n // check if we have a possibility of matching . or ..,\n // and prevent that.\n const needNoTrav =\n // dots are allowed, and the pattern starts with [ or .\n (dot && aps.has(src.charAt(0))) ||\n // the pattern starts with \\., and then [ or .\n (src.startsWith('\\\\.') && aps.has(src.charAt(2))) ||\n // the pattern starts with \\.\\., and then [ or .\n (src.startsWith('\\\\.\\\\.') && aps.has(src.charAt(4)))\n // no need to prevent dots if it can't match a dot, or if a\n // sub-pattern will be preventing it anyway.\n const needNoDot = !dot && !allowDot && aps.has(src.charAt(0))\n\n start = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : ''\n }\n }\n }\n\n // append the \"end of path portion\" pattern to negation tails\n let end = ''\n if (\n this.isEnd() &&\n this.#root.#filledNegs &&\n this.#parent?.type === '!'\n ) {\n end = '(?:$|\\\\/)'\n }\n const final = start + src + end\n return [\n final,\n unescape(src),\n (this.#hasMagic = !!this.#hasMagic),\n this.#uflag,\n ]\n }\n\n // We need to calculate the body *twice* if it's a repeat pattern\n // at the start, once in nodot mode, then again in dot mode, so a\n // pattern like *(?) can match 'x.y'\n\n const repeated = this.type === '*' || this.type === '+'\n // some kind of extglob\n const start = this.type === '!' ? '(?:(?!(?:' : '(?:'\n let body = this.#partsToRegExp(dot)\n\n if (this.isStart() && this.isEnd() && !body && this.type !== '!') {\n // invalid extglob, has to at least be *something* present, if it's\n // the entire path portion.\n const s = this.toString()\n this.#parts = [s]\n this.type = null\n this.#hasMagic = undefined\n return [s, unescape(this.toString()), false, false]\n }\n\n // XXX abstract out this map method\n let bodyDotAllowed =\n !repeated || allowDot || dot || !startNoDot\n ? ''\n : this.#partsToRegExp(true)\n if (bodyDotAllowed === body) {\n bodyDotAllowed = ''\n }\n if (bodyDotAllowed) {\n body = `(?:${body})(?:${bodyDotAllowed})*?`\n }\n\n // an empty !() is exactly equivalent to a starNoEmpty\n let final = ''\n if (this.type === '!' && this.#emptyExt) {\n final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty\n } else {\n const close =\n this.type === '!'\n ? // !() must match something,but !(x) can match ''\n '))' +\n (this.isStart() && !dot && !allowDot ? startNoDot : '') +\n star +\n ')'\n : this.type === '@'\n ? ')'\n : this.type === '?'\n ? ')?'\n : this.type === '+' && bodyDotAllowed\n ? ')'\n : this.type === '*' && bodyDotAllowed\n ? `)?`\n : `)${this.type}`\n final = start + body + close\n }\n return [\n final,\n unescape(body),\n (this.#hasMagic = !!this.#hasMagic),\n this.#uflag,\n ]\n }\n\n #partsToRegExp(dot: boolean) {\n return this.#parts\n .map(p => {\n // extglob ASTs should only contain parent ASTs\n /* c8 ignore start */\n if (typeof p === 'string') {\n throw new Error('string type in extglob ast??')\n }\n /* c8 ignore stop */\n // can ignore hasMagic, because extglobs are already always magic\n const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot)\n this.#uflag = this.#uflag || uflag\n return re\n })\n .filter(p => !(this.isStart() && this.isEnd()) || !!p)\n .join('|')\n }\n\n static #parseGlob(\n glob: string,\n hasMagic: boolean | undefined,\n noEmpty: boolean = false\n ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n let escaping = false\n let re = ''\n let uflag = false\n for (let i = 0; i < glob.length; i++) {\n const c = glob.charAt(i)\n if (escaping) {\n escaping = false\n re += (reSpecials.has(c) ? '\\\\' : '') + c\n continue\n }\n if (c === '\\\\') {\n if (i === glob.length - 1) {\n re += '\\\\\\\\'\n } else {\n escaping = true\n }\n continue\n }\n if (c === '[') {\n const [src, needUflag, consumed, magic] = parseClass(glob, i)\n if (consumed) {\n re += src\n uflag = uflag || needUflag\n i += consumed - 1\n hasMagic = hasMagic || magic\n continue\n }\n }\n if (c === '*') {\n if (noEmpty && glob === '*') re += starNoEmpty\n else re += star\n hasMagic = true\n continue\n }\n if (c === '?') {\n re += qmark\n hasMagic = true\n continue\n }\n re += regExpEscape(c)\n }\n return [re, unescape(glob), !!hasMagic, uflag]\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts b/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts deleted file mode 100644 index b1572de..0000000 --- a/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -export type ParseClassResult = [ - src: string, - uFlag: boolean, - consumed: number, - hasMagic: boolean -]; -export declare const parseClass: (glob: string, position: number) => ParseClassResult; -//# sourceMappingURL=brace-expressions.d.ts.map \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts.map b/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts.map deleted file mode 100644 index d394964..0000000 --- a/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"brace-expressions.d.ts","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"AA+BA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,OAAO;CAClB,CAAA;AAQD,eAAO,MAAM,UAAU,SACf,MAAM,YACF,MAAM,qBA8HjB,CAAA"} \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/brace-expressions.js b/node_modules/minimatch/dist/commonjs/brace-expressions.js deleted file mode 100644 index 0e13eef..0000000 --- a/node_modules/minimatch/dist/commonjs/brace-expressions.js +++ /dev/null @@ -1,152 +0,0 @@ -"use strict"; -// translate the various posix character classes into unicode properties -// this works across all unicode locales -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parseClass = void 0; -// { : [, /u flag required, negated] -const posixClasses = { - '[:alnum:]': ['\\p{L}\\p{Nl}\\p{Nd}', true], - '[:alpha:]': ['\\p{L}\\p{Nl}', true], - '[:ascii:]': ['\\x' + '00-\\x' + '7f', false], - '[:blank:]': ['\\p{Zs}\\t', true], - '[:cntrl:]': ['\\p{Cc}', true], - '[:digit:]': ['\\p{Nd}', true], - '[:graph:]': ['\\p{Z}\\p{C}', true, true], - '[:lower:]': ['\\p{Ll}', true], - '[:print:]': ['\\p{C}', true], - '[:punct:]': ['\\p{P}', true], - '[:space:]': ['\\p{Z}\\t\\r\\n\\v\\f', true], - '[:upper:]': ['\\p{Lu}', true], - '[:word:]': ['\\p{L}\\p{Nl}\\p{Nd}\\p{Pc}', true], - '[:xdigit:]': ['A-Fa-f0-9', false], -}; -// only need to escape a few things inside of brace expressions -// escapes: [ \ ] - -const braceEscape = (s) => s.replace(/[[\]\\-]/g, '\\$&'); -// escape all regexp magic characters -const regexpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); -// everything has already been escaped, we just have to join -const rangesToString = (ranges) => ranges.join(''); -// takes a glob string at a posix brace expression, and returns -// an equivalent regular expression source, and boolean indicating -// whether the /u flag needs to be applied, and the number of chars -// consumed to parse the character class. -// This also removes out of order ranges, and returns ($.) if the -// entire class just no good. -const parseClass = (glob, position) => { - const pos = position; - /* c8 ignore start */ - if (glob.charAt(pos) !== '[') { - throw new Error('not in a brace expression'); - } - /* c8 ignore stop */ - const ranges = []; - const negs = []; - let i = pos + 1; - let sawStart = false; - let uflag = false; - let escaping = false; - let negate = false; - let endPos = pos; - let rangeStart = ''; - WHILE: while (i < glob.length) { - const c = glob.charAt(i); - if ((c === '!' || c === '^') && i === pos + 1) { - negate = true; - i++; - continue; - } - if (c === ']' && sawStart && !escaping) { - endPos = i + 1; - break; - } - sawStart = true; - if (c === '\\') { - if (!escaping) { - escaping = true; - i++; - continue; - } - // escaped \ char, fall through and treat like normal char - } - if (c === '[' && !escaping) { - // either a posix class, a collation equivalent, or just a [ - for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) { - if (glob.startsWith(cls, i)) { - // invalid, [a-[] is fine, but not [a-[:alpha]] - if (rangeStart) { - return ['$.', false, glob.length - pos, true]; - } - i += cls.length; - if (neg) - negs.push(unip); - else - ranges.push(unip); - uflag = uflag || u; - continue WHILE; - } - } - } - // now it's just a normal character, effectively - escaping = false; - if (rangeStart) { - // throw this range away if it's not valid, but others - // can still match. - if (c > rangeStart) { - ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c)); - } - else if (c === rangeStart) { - ranges.push(braceEscape(c)); - } - rangeStart = ''; - i++; - continue; - } - // now might be the start of a range. - // can be either c-d or c-] or c] or c] at this point - if (glob.startsWith('-]', i + 1)) { - ranges.push(braceEscape(c + '-')); - i += 2; - continue; - } - if (glob.startsWith('-', i + 1)) { - rangeStart = c; - i += 2; - continue; - } - // not the start of a range, just a single character - ranges.push(braceEscape(c)); - i++; - } - if (endPos < i) { - // didn't see the end of the class, not a valid class, - // but might still be valid as a literal match. - return ['', false, 0, false]; - } - // if we got no ranges and no negates, then we have a range that - // cannot possibly match anything, and that poisons the whole glob - if (!ranges.length && !negs.length) { - return ['$.', false, glob.length - pos, true]; - } - // if we got one positive range, and it's a single character, then that's - // not actually a magic pattern, it's just that one literal character. - // we should not treat that as "magic", we should just return the literal - // character. [_] is a perfectly valid way to escape glob magic chars. - if (negs.length === 0 && - ranges.length === 1 && - /^\\?.$/.test(ranges[0]) && - !negate) { - const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0]; - return [regexpEscape(r), false, endPos - pos, false]; - } - const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']'; - const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']'; - const comb = ranges.length && negs.length - ? '(' + sranges + '|' + snegs + ')' - : ranges.length - ? sranges - : snegs; - return [comb, uflag, endPos - pos, true]; -}; -exports.parseClass = parseClass; -//# sourceMappingURL=brace-expressions.js.map \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/brace-expressions.js.map b/node_modules/minimatch/dist/commonjs/brace-expressions.js.map deleted file mode 100644 index 86b0475..0000000 --- a/node_modules/minimatch/dist/commonjs/brace-expressions.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"brace-expressions.js","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"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","sourcesContent":["// translate the various posix character classes into unicode properties\n// this works across all unicode locales\n\n// { : [, /u flag required, negated]\nconst posixClasses: { [k: string]: [e: string, u: boolean, n?: boolean] } = {\n '[:alnum:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}', true],\n '[:alpha:]': ['\\\\p{L}\\\\p{Nl}', true],\n '[:ascii:]': ['\\\\x' + '00-\\\\x' + '7f', false],\n '[:blank:]': ['\\\\p{Zs}\\\\t', true],\n '[:cntrl:]': ['\\\\p{Cc}', true],\n '[:digit:]': ['\\\\p{Nd}', true],\n '[:graph:]': ['\\\\p{Z}\\\\p{C}', true, true],\n '[:lower:]': ['\\\\p{Ll}', true],\n '[:print:]': ['\\\\p{C}', true],\n '[:punct:]': ['\\\\p{P}', true],\n '[:space:]': ['\\\\p{Z}\\\\t\\\\r\\\\n\\\\v\\\\f', true],\n '[:upper:]': ['\\\\p{Lu}', true],\n '[:word:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}\\\\p{Pc}', true],\n '[:xdigit:]': ['A-Fa-f0-9', false],\n}\n\n// only need to escape a few things inside of brace expressions\n// escapes: [ \\ ] -\nconst braceEscape = (s: string) => s.replace(/[[\\]\\\\-]/g, '\\\\$&')\n// escape all regexp magic characters\nconst regexpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// everything has already been escaped, we just have to join\nconst rangesToString = (ranges: string[]): string => ranges.join('')\n\nexport type ParseClassResult = [\n src: string,\n uFlag: boolean,\n consumed: number,\n hasMagic: boolean\n]\n\n// takes a glob string at a posix brace expression, and returns\n// an equivalent regular expression source, and boolean indicating\n// whether the /u flag needs to be applied, and the number of chars\n// consumed to parse the character class.\n// This also removes out of order ranges, and returns ($.) if the\n// entire class just no good.\nexport const parseClass = (\n glob: string,\n position: number\n): ParseClassResult => {\n const pos = position\n /* c8 ignore start */\n if (glob.charAt(pos) !== '[') {\n throw new Error('not in a brace expression')\n }\n /* c8 ignore stop */\n const ranges: string[] = []\n const negs: string[] = []\n\n let i = pos + 1\n let sawStart = false\n let uflag = false\n let escaping = false\n let negate = false\n let endPos = pos\n let rangeStart = ''\n WHILE: while (i < glob.length) {\n const c = glob.charAt(i)\n if ((c === '!' || c === '^') && i === pos + 1) {\n negate = true\n i++\n continue\n }\n\n if (c === ']' && sawStart && !escaping) {\n endPos = i + 1\n break\n }\n\n sawStart = true\n if (c === '\\\\') {\n if (!escaping) {\n escaping = true\n i++\n continue\n }\n // escaped \\ char, fall through and treat like normal char\n }\n if (c === '[' && !escaping) {\n // either a posix class, a collation equivalent, or just a [\n for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {\n if (glob.startsWith(cls, i)) {\n // invalid, [a-[] is fine, but not [a-[:alpha]]\n if (rangeStart) {\n return ['$.', false, glob.length - pos, true]\n }\n i += cls.length\n if (neg) negs.push(unip)\n else ranges.push(unip)\n uflag = uflag || u\n continue WHILE\n }\n }\n }\n\n // now it's just a normal character, effectively\n escaping = false\n if (rangeStart) {\n // throw this range away if it's not valid, but others\n // can still match.\n if (c > rangeStart) {\n ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c))\n } else if (c === rangeStart) {\n ranges.push(braceEscape(c))\n }\n rangeStart = ''\n i++\n continue\n }\n\n // now might be the start of a range.\n // can be either c-d or c-] or c] or c] at this point\n if (glob.startsWith('-]', i + 1)) {\n ranges.push(braceEscape(c + '-'))\n i += 2\n continue\n }\n if (glob.startsWith('-', i + 1)) {\n rangeStart = c\n i += 2\n continue\n }\n\n // not the start of a range, just a single character\n ranges.push(braceEscape(c))\n i++\n }\n\n if (endPos < i) {\n // didn't see the end of the class, not a valid class,\n // but might still be valid as a literal match.\n return ['', false, 0, false]\n }\n\n // if we got no ranges and no negates, then we have a range that\n // cannot possibly match anything, and that poisons the whole glob\n if (!ranges.length && !negs.length) {\n return ['$.', false, glob.length - pos, true]\n }\n\n // if we got one positive range, and it's a single character, then that's\n // not actually a magic pattern, it's just that one literal character.\n // we should not treat that as \"magic\", we should just return the literal\n // character. [_] is a perfectly valid way to escape glob magic chars.\n if (\n negs.length === 0 &&\n ranges.length === 1 &&\n /^\\\\?.$/.test(ranges[0]) &&\n !negate\n ) {\n const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0]\n return [regexpEscape(r), false, endPos - pos, false]\n }\n\n const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']'\n const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']'\n const comb =\n ranges.length && negs.length\n ? '(' + sranges + '|' + snegs + ')'\n : ranges.length\n ? sranges\n : snegs\n\n return [comb, uflag, endPos - pos, true]\n}\n"]} \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/escape.d.ts b/node_modules/minimatch/dist/commonjs/escape.d.ts deleted file mode 100644 index dc3e316..0000000 --- a/node_modules/minimatch/dist/commonjs/escape.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { MinimatchOptions } from './index.js'; -/** - * Escape all magic characters in a glob pattern. - * - * If the {@link windowsPathsNoEscape | GlobOptions.windowsPathsNoEscape} - * option is used, then characters are escaped by wrapping in `[]`, because - * a magic character wrapped in a character class can only be satisfied by - * that exact character. In this mode, `\` is _not_ escaped, because it is - * not interpreted as a magic character, but instead as a path separator. - */ -export declare const escape: (s: string, { windowsPathsNoEscape, }?: Pick) => string; -//# sourceMappingURL=escape.d.ts.map \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/escape.d.ts.map b/node_modules/minimatch/dist/commonjs/escape.d.ts.map deleted file mode 100644 index 0779dae..0000000 --- a/node_modules/minimatch/dist/commonjs/escape.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"escape.d.ts","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC7C;;;;;;;;GAQG;AACH,eAAO,MAAM,MAAM,MACd,MAAM,8BAGN,KAAK,gBAAgB,EAAE,sBAAsB,CAAC,WAQlD,CAAA"} \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/escape.js b/node_modules/minimatch/dist/commonjs/escape.js deleted file mode 100644 index 02a4f8a..0000000 --- a/node_modules/minimatch/dist/commonjs/escape.js +++ /dev/null @@ -1,22 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.escape = void 0; -/** - * Escape all magic characters in a glob pattern. - * - * If the {@link windowsPathsNoEscape | GlobOptions.windowsPathsNoEscape} - * option is used, then characters are escaped by wrapping in `[]`, because - * a magic character wrapped in a character class can only be satisfied by - * that exact character. In this mode, `\` is _not_ escaped, because it is - * not interpreted as a magic character, but instead as a path separator. - */ -const escape = (s, { windowsPathsNoEscape = false, } = {}) => { - // don't need to escape +@! because we escape the parens - // that make those magic, and escaping ! as [!] isn't valid, - // because [!]] is a valid glob class meaning not ']'. - return windowsPathsNoEscape - ? s.replace(/[?*()[\]]/g, '[$&]') - : s.replace(/[?*()[\]\\]/g, '\\$&'); -}; -exports.escape = escape; -//# sourceMappingURL=escape.js.map \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/escape.js.map b/node_modules/minimatch/dist/commonjs/escape.js.map deleted file mode 100644 index 264b2ea..0000000 --- a/node_modules/minimatch/dist/commonjs/escape.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"escape.js","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":";;;AACA;;;;;;;;GAQG;AACI,MAAM,MAAM,GAAG,CACpB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,MACsB,EAAE,EACtD,EAAE;IACF,wDAAwD;IACxD,4DAA4D;IAC5D,sDAAsD;IACtD,OAAO,oBAAoB;QACzB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC;QACjC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;AACvC,CAAC,CAAA;AAZY,QAAA,MAAM,UAYlB","sourcesContent":["import { MinimatchOptions } from './index.js'\n/**\n * Escape all magic characters in a glob pattern.\n *\n * If the {@link windowsPathsNoEscape | GlobOptions.windowsPathsNoEscape}\n * option is used, then characters are escaped by wrapping in `[]`, because\n * a magic character wrapped in a character class can only be satisfied by\n * that exact character. In this mode, `\\` is _not_ escaped, because it is\n * not interpreted as a magic character, but instead as a path separator.\n */\nexport const escape = (\n s: string,\n {\n windowsPathsNoEscape = false,\n }: Pick = {}\n) => {\n // don't need to escape +@! because we escape the parens\n // that make those magic, and escaping ! as [!] isn't valid,\n // because [!]] is a valid glob class meaning not ']'.\n return windowsPathsNoEscape\n ? s.replace(/[?*()[\\]]/g, '[$&]')\n : s.replace(/[?*()[\\]\\\\]/g, '\\\\$&')\n}\n"]} \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/index.d.ts b/node_modules/minimatch/dist/commonjs/index.d.ts deleted file mode 100644 index 41d16a9..0000000 --- a/node_modules/minimatch/dist/commonjs/index.d.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { AST } from './ast.js'; -type Platform = 'aix' | 'android' | 'darwin' | 'freebsd' | 'haiku' | 'linux' | 'openbsd' | 'sunos' | 'win32' | 'cygwin' | 'netbsd'; -export interface MinimatchOptions { - nobrace?: boolean; - nocomment?: boolean; - nonegate?: boolean; - debug?: boolean; - noglobstar?: boolean; - noext?: boolean; - nonull?: boolean; - windowsPathsNoEscape?: boolean; - allowWindowsEscape?: boolean; - partial?: boolean; - dot?: boolean; - nocase?: boolean; - nocaseMagicOnly?: boolean; - magicalBraces?: boolean; - matchBase?: boolean; - flipNegate?: boolean; - preserveMultipleSlashes?: boolean; - optimizationLevel?: number; - platform?: Platform; - windowsNoMagicRoot?: boolean; -} -export declare const minimatch: { - (p: string, pattern: string, options?: MinimatchOptions): boolean; - sep: Sep; - GLOBSTAR: typeof GLOBSTAR; - filter: (pattern: string, options?: MinimatchOptions) => (p: string) => boolean; - defaults: (def: MinimatchOptions) => typeof minimatch; - braceExpand: (pattern: string, options?: MinimatchOptions) => string[]; - makeRe: (pattern: string, options?: MinimatchOptions) => false | MMRegExp; - match: (list: string[], pattern: string, options?: MinimatchOptions) => string[]; - AST: typeof AST; - Minimatch: typeof Minimatch; - escape: (s: string, { windowsPathsNoEscape, }?: Pick) => string; - unescape: (s: string, { windowsPathsNoEscape, }?: Pick) => string; -}; -type Sep = '\\' | '/'; -export declare const sep: Sep; -export declare const GLOBSTAR: unique symbol; -export declare const filter: (pattern: string, options?: MinimatchOptions) => (p: string) => boolean; -export declare const defaults: (def: MinimatchOptions) => typeof minimatch; -export declare const braceExpand: (pattern: string, options?: MinimatchOptions) => string[]; -export declare const makeRe: (pattern: string, options?: MinimatchOptions) => false | MMRegExp; -export declare const match: (list: string[], pattern: string, options?: MinimatchOptions) => string[]; -export type MMRegExp = RegExp & { - _src?: string; - _glob?: string; -}; -export type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR; -export type ParseReturn = ParseReturnFiltered | false; -export declare class Minimatch { - options: MinimatchOptions; - set: ParseReturnFiltered[][]; - pattern: string; - windowsPathsNoEscape: boolean; - nonegate: boolean; - negate: boolean; - comment: boolean; - empty: boolean; - preserveMultipleSlashes: boolean; - partial: boolean; - globSet: string[]; - globParts: string[][]; - nocase: boolean; - isWindows: boolean; - platform: Platform; - windowsNoMagicRoot: boolean; - regexp: false | null | MMRegExp; - constructor(pattern: string, options?: MinimatchOptions); - hasMagic(): boolean; - debug(..._: any[]): void; - make(): void; - preprocess(globParts: string[][]): string[][]; - adjascentGlobstarOptimize(globParts: string[][]): string[][]; - levelOneOptimize(globParts: string[][]): string[][]; - levelTwoFileOptimize(parts: string | string[]): string[]; - firstPhasePreProcess(globParts: string[][]): string[][]; - secondPhasePreProcess(globParts: string[][]): string[][]; - partsMatch(a: string[], b: string[], emptyGSMatch?: boolean): false | string[]; - parseNegate(): void; - matchOne(file: string[], pattern: ParseReturn[], partial?: boolean): boolean; - braceExpand(): string[]; - parse(pattern: string): ParseReturn; - makeRe(): false | MMRegExp; - slashSplit(p: string): string[]; - match(f: string, partial?: boolean): boolean; - static defaults(def: MinimatchOptions): typeof Minimatch; -} -export { AST } from './ast.js'; -export { escape } from './escape.js'; -export { unescape } from './unescape.js'; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/index.d.ts.map b/node_modules/minimatch/dist/commonjs/index.d.ts.map deleted file mode 100644 index 195491d..0000000 --- a/node_modules/minimatch/dist/commonjs/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/minimatch/dist/commonjs/index.js b/node_modules/minimatch/dist/commonjs/index.js deleted file mode 100644 index 64a0f1f..0000000 --- a/node_modules/minimatch/dist/commonjs/index.js +++ /dev/null @@ -1,1017 +0,0 @@ -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.unescape = exports.escape = exports.AST = exports.Minimatch = exports.match = exports.makeRe = exports.braceExpand = exports.defaults = exports.filter = exports.GLOBSTAR = exports.sep = exports.minimatch = void 0; -const brace_expansion_1 = __importDefault(require("brace-expansion")); -const assert_valid_pattern_js_1 = require("./assert-valid-pattern.js"); -const ast_js_1 = require("./ast.js"); -const escape_js_1 = require("./escape.js"); -const unescape_js_1 = require("./unescape.js"); -const minimatch = (p, pattern, options = {}) => { - (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); - // shortcut: comments match nothing. - if (!options.nocomment && pattern.charAt(0) === '#') { - return false; - } - return new Minimatch(pattern, options).match(p); -}; -exports.minimatch = minimatch; -// Optimized checking for the most common glob patterns. -const starDotExtRE = /^\*+([^+@!?\*\[\(]*)$/; -const starDotExtTest = (ext) => (f) => !f.startsWith('.') && f.endsWith(ext); -const starDotExtTestDot = (ext) => (f) => f.endsWith(ext); -const starDotExtTestNocase = (ext) => { - ext = ext.toLowerCase(); - return (f) => !f.startsWith('.') && f.toLowerCase().endsWith(ext); -}; -const starDotExtTestNocaseDot = (ext) => { - ext = ext.toLowerCase(); - return (f) => f.toLowerCase().endsWith(ext); -}; -const starDotStarRE = /^\*+\.\*+$/; -const starDotStarTest = (f) => !f.startsWith('.') && f.includes('.'); -const starDotStarTestDot = (f) => f !== '.' && f !== '..' && f.includes('.'); -const dotStarRE = /^\.\*+$/; -const dotStarTest = (f) => f !== '.' && f !== '..' && f.startsWith('.'); -const starRE = /^\*+$/; -const starTest = (f) => f.length !== 0 && !f.startsWith('.'); -const starTestDot = (f) => f.length !== 0 && f !== '.' && f !== '..'; -const qmarksRE = /^\?+([^+@!?\*\[\(]*)?$/; -const qmarksTestNocase = ([$0, ext = '']) => { - const noext = qmarksTestNoExt([$0]); - if (!ext) - return noext; - ext = ext.toLowerCase(); - return (f) => noext(f) && f.toLowerCase().endsWith(ext); -}; -const qmarksTestNocaseDot = ([$0, ext = '']) => { - const noext = qmarksTestNoExtDot([$0]); - if (!ext) - return noext; - ext = ext.toLowerCase(); - return (f) => noext(f) && f.toLowerCase().endsWith(ext); -}; -const qmarksTestDot = ([$0, ext = '']) => { - const noext = qmarksTestNoExtDot([$0]); - return !ext ? noext : (f) => noext(f) && f.endsWith(ext); -}; -const qmarksTest = ([$0, ext = '']) => { - const noext = qmarksTestNoExt([$0]); - return !ext ? noext : (f) => noext(f) && f.endsWith(ext); -}; -const qmarksTestNoExt = ([$0]) => { - const len = $0.length; - return (f) => f.length === len && !f.startsWith('.'); -}; -const qmarksTestNoExtDot = ([$0]) => { - const len = $0.length; - return (f) => f.length === len && f !== '.' && f !== '..'; -}; -/* c8 ignore start */ -const defaultPlatform = (typeof process === 'object' && process - ? (typeof process.env === 'object' && - process.env && - process.env.__MINIMATCH_TESTING_PLATFORM__) || - process.platform - : 'posix'); -const path = { - win32: { sep: '\\' }, - posix: { sep: '/' }, -}; -/* c8 ignore stop */ -exports.sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep; -exports.minimatch.sep = exports.sep; -exports.GLOBSTAR = Symbol('globstar **'); -exports.minimatch.GLOBSTAR = exports.GLOBSTAR; -// any single thing other than / -// don't need to escape / when using new RegExp() -const qmark = '[^/]'; -// * => any number of characters -const star = qmark + '*?'; -// ** when dots are allowed. Anything goes, except .. and . -// not (^ or / followed by one or two dots followed by $ or /), -// followed by anything, any number of times. -const twoStarDot = '(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?'; -// not a ^ or / followed by a dot, -// followed by anything, any number of times. -const twoStarNoDot = '(?:(?!(?:\\/|^)\\.).)*?'; -const filter = (pattern, options = {}) => (p) => (0, exports.minimatch)(p, pattern, options); -exports.filter = filter; -exports.minimatch.filter = exports.filter; -const ext = (a, b = {}) => Object.assign({}, a, b); -const defaults = (def) => { - if (!def || typeof def !== 'object' || !Object.keys(def).length) { - return exports.minimatch; - } - const orig = exports.minimatch; - const m = (p, pattern, options = {}) => orig(p, pattern, ext(def, options)); - return Object.assign(m, { - Minimatch: class Minimatch extends orig.Minimatch { - constructor(pattern, options = {}) { - super(pattern, ext(def, options)); - } - static defaults(options) { - return orig.defaults(ext(def, options)).Minimatch; - } - }, - AST: class AST extends orig.AST { - /* c8 ignore start */ - constructor(type, parent, options = {}) { - super(type, parent, ext(def, options)); - } - /* c8 ignore stop */ - static fromGlob(pattern, options = {}) { - return orig.AST.fromGlob(pattern, ext(def, options)); - } - }, - unescape: (s, options = {}) => orig.unescape(s, ext(def, options)), - escape: (s, options = {}) => orig.escape(s, ext(def, options)), - filter: (pattern, options = {}) => orig.filter(pattern, ext(def, options)), - defaults: (options) => orig.defaults(ext(def, options)), - makeRe: (pattern, options = {}) => orig.makeRe(pattern, ext(def, options)), - braceExpand: (pattern, options = {}) => orig.braceExpand(pattern, ext(def, options)), - match: (list, pattern, options = {}) => orig.match(list, pattern, ext(def, options)), - sep: orig.sep, - GLOBSTAR: exports.GLOBSTAR, - }); -}; -exports.defaults = defaults; -exports.minimatch.defaults = exports.defaults; -// Brace expansion: -// a{b,c}d -> abd acd -// a{b,}c -> abc ac -// a{0..3}d -> a0d a1d a2d a3d -// a{b,c{d,e}f}g -> abg acdfg acefg -// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg -// -// Invalid sets are not expanded. -// a{2..}b -> a{2..}b -// a{b}c -> a{b}c -const braceExpand = (pattern, options = {}) => { - (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); - // Thanks to Yeting Li for - // improving this regexp to avoid a ReDOS vulnerability. - if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) { - // shortcut. no need to expand. - return [pattern]; - } - return (0, brace_expansion_1.default)(pattern); -}; -exports.braceExpand = braceExpand; -exports.minimatch.braceExpand = exports.braceExpand; -// parse a component of the expanded set. -// At this point, no pattern may contain "/" in it -// so we're going to return a 2d array, where each entry is the full -// pattern, split on '/', and then turned into a regular expression. -// A regexp is made at the end which joins each array with an -// escaped /, and another full one which joins each regexp with |. -// -// Following the lead of Bash 4.1, note that "**" only has special meaning -// when it is the *only* thing in a path portion. Otherwise, any series -// of * is equivalent to a single *. Globstar behavior is enabled by -// default, and can be disabled by setting options.noglobstar. -const makeRe = (pattern, options = {}) => new Minimatch(pattern, options).makeRe(); -exports.makeRe = makeRe; -exports.minimatch.makeRe = exports.makeRe; -const match = (list, pattern, options = {}) => { - const mm = new Minimatch(pattern, options); - list = list.filter(f => mm.match(f)); - if (mm.options.nonull && !list.length) { - list.push(pattern); - } - return list; -}; -exports.match = match; -exports.minimatch.match = exports.match; -// replace stuff like \* with * -const globMagic = /[?*]|[+@!]\(.*?\)|\[|\]/; -const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); -class Minimatch { - options; - set; - pattern; - windowsPathsNoEscape; - nonegate; - negate; - comment; - empty; - preserveMultipleSlashes; - partial; - globSet; - globParts; - nocase; - isWindows; - platform; - windowsNoMagicRoot; - regexp; - constructor(pattern, options = {}) { - (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); - options = options || {}; - this.options = options; - this.pattern = pattern; - this.platform = options.platform || defaultPlatform; - this.isWindows = this.platform === 'win32'; - this.windowsPathsNoEscape = - !!options.windowsPathsNoEscape || options.allowWindowsEscape === false; - if (this.windowsPathsNoEscape) { - this.pattern = this.pattern.replace(/\\/g, '/'); - } - this.preserveMultipleSlashes = !!options.preserveMultipleSlashes; - this.regexp = null; - this.negate = false; - this.nonegate = !!options.nonegate; - this.comment = false; - this.empty = false; - this.partial = !!options.partial; - this.nocase = !!this.options.nocase; - this.windowsNoMagicRoot = - options.windowsNoMagicRoot !== undefined - ? options.windowsNoMagicRoot - : !!(this.isWindows && this.nocase); - this.globSet = []; - this.globParts = []; - this.set = []; - // make the set of regexps etc. - this.make(); - } - hasMagic() { - if (this.options.magicalBraces && this.set.length > 1) { - return true; - } - for (const pattern of this.set) { - for (const part of pattern) { - if (typeof part !== 'string') - return true; - } - } - return false; - } - debug(..._) { } - make() { - const pattern = this.pattern; - const options = this.options; - // empty patterns and comments match nothing. - if (!options.nocomment && pattern.charAt(0) === '#') { - this.comment = true; - return; - } - if (!pattern) { - this.empty = true; - return; - } - // step 1: figure out negation, etc. - this.parseNegate(); - // step 2: expand braces - this.globSet = [...new Set(this.braceExpand())]; - if (options.debug) { - this.debug = (...args) => console.error(...args); - } - this.debug(this.pattern, this.globSet); - // step 3: now we have a set, so turn each one into a series of - // path-portion matching patterns. - // These will be regexps, except in the case of "**", which is - // set to the GLOBSTAR object for globstar behavior, - // and will not contain any / characters - // - // First, we preprocess to make the glob pattern sets a bit simpler - // and deduped. There are some perf-killing patterns that can cause - // problems with a glob walk, but we can simplify them down a bit. - const rawGlobParts = this.globSet.map(s => this.slashSplit(s)); - this.globParts = this.preprocess(rawGlobParts); - this.debug(this.pattern, this.globParts); - // glob --> regexps - let set = this.globParts.map((s, _, __) => { - if (this.isWindows && this.windowsNoMagicRoot) { - // check if it's a drive or unc path. - const isUNC = s[0] === '' && - s[1] === '' && - (s[2] === '?' || !globMagic.test(s[2])) && - !globMagic.test(s[3]); - const isDrive = /^[a-z]:/i.test(s[0]); - if (isUNC) { - return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))]; - } - else if (isDrive) { - return [s[0], ...s.slice(1).map(ss => this.parse(ss))]; - } - } - return s.map(ss => this.parse(ss)); - }); - this.debug(this.pattern, set); - // filter out everything that didn't compile properly. - this.set = set.filter(s => s.indexOf(false) === -1); - // do not treat the ? in UNC paths as magic - if (this.isWindows) { - for (let i = 0; i < this.set.length; i++) { - const p = this.set[i]; - if (p[0] === '' && - p[1] === '' && - this.globParts[i][2] === '?' && - typeof p[3] === 'string' && - /^[a-z]:$/i.test(p[3])) { - p[2] = '?'; - } - } - } - this.debug(this.pattern, this.set); - } - // various transforms to equivalent pattern sets that are - // faster to process in a filesystem walk. The goal is to - // eliminate what we can, and push all ** patterns as far - // to the right as possible, even if it increases the number - // of patterns that we have to process. - preprocess(globParts) { - // if we're not in globstar mode, then turn all ** into * - if (this.options.noglobstar) { - for (let i = 0; i < globParts.length; i++) { - for (let j = 0; j < globParts[i].length; j++) { - if (globParts[i][j] === '**') { - globParts[i][j] = '*'; - } - } - } - } - const { optimizationLevel = 1 } = this.options; - if (optimizationLevel >= 2) { - // aggressive optimization for the purpose of fs walking - globParts = this.firstPhasePreProcess(globParts); - globParts = this.secondPhasePreProcess(globParts); - } - else if (optimizationLevel >= 1) { - // just basic optimizations to remove some .. parts - globParts = this.levelOneOptimize(globParts); - } - else { - // just collapse multiple ** portions into one - globParts = this.adjascentGlobstarOptimize(globParts); - } - return globParts; - } - // just get rid of adjascent ** portions - adjascentGlobstarOptimize(globParts) { - return globParts.map(parts => { - let gs = -1; - while (-1 !== (gs = parts.indexOf('**', gs + 1))) { - let i = gs; - while (parts[i + 1] === '**') { - i++; - } - if (i !== gs) { - parts.splice(gs, i - gs); - } - } - return parts; - }); - } - // get rid of adjascent ** and resolve .. portions - levelOneOptimize(globParts) { - return globParts.map(parts => { - parts = parts.reduce((set, part) => { - const prev = set[set.length - 1]; - if (part === '**' && prev === '**') { - return set; - } - if (part === '..') { - if (prev && prev !== '..' && prev !== '.' && prev !== '**') { - set.pop(); - return set; - } - } - set.push(part); - return set; - }, []); - return parts.length === 0 ? [''] : parts; - }); - } - levelTwoFileOptimize(parts) { - if (!Array.isArray(parts)) { - parts = this.slashSplit(parts); - } - let didSomething = false; - do { - didSomething = false; - //

    // -> 
    /
    -            if (!this.preserveMultipleSlashes) {
    -                for (let i = 1; i < parts.length - 1; i++) {
    -                    const p = parts[i];
    -                    // don't squeeze out UNC patterns
    -                    if (i === 1 && p === '' && parts[0] === '')
    -                        continue;
    -                    if (p === '.' || p === '') {
    -                        didSomething = true;
    -                        parts.splice(i, 1);
    -                        i--;
    -                    }
    -                }
    -                if (parts[0] === '.' &&
    -                    parts.length === 2 &&
    -                    (parts[1] === '.' || parts[1] === '')) {
    -                    didSomething = true;
    -                    parts.pop();
    -                }
    -            }
    -            // 
    /

    /../ ->

    /
    -            let dd = 0;
    -            while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
    -                const p = parts[dd - 1];
    -                if (p && p !== '.' && p !== '..' && p !== '**') {
    -                    didSomething = true;
    -                    parts.splice(dd - 1, 2);
    -                    dd -= 2;
    -                }
    -            }
    -        } while (didSomething);
    -        return parts.length === 0 ? [''] : parts;
    -    }
    -    // First phase: single-pattern processing
    -    // 
     is 1 or more portions
    -    //  is 1 or more portions
    -    // 

    is any portion other than ., .., '', or ** - // is . or '' - // - // **/.. is *brutal* for filesystem walking performance, because - // it effectively resets the recursive walk each time it occurs, - // and ** cannot be reduced out by a .. pattern part like a regexp - // or most strings (other than .., ., and '') can be. - // - //

    /**/../

    /

    / -> {

    /../

    /

    /,

    /**/

    /

    /} - //

    // -> 
    /
    -    // 
    /

    /../ ->

    /
    -    // **/**/ -> **/
    -    //
    -    // **/*/ -> */**/ <== not valid because ** doesn't follow
    -    // this WOULD be allowed if ** did follow symlinks, or * didn't
    -    firstPhasePreProcess(globParts) {
    -        let didSomething = false;
    -        do {
    -            didSomething = false;
    -            // 
    /**/../

    /

    / -> {

    /../

    /

    /,

    /**/

    /

    /} - for (let parts of globParts) { - let gs = -1; - while (-1 !== (gs = parts.indexOf('**', gs + 1))) { - let gss = gs; - while (parts[gss + 1] === '**') { - //

    /**/**/ -> 
    /**/
    -                        gss++;
    -                    }
    -                    // eg, if gs is 2 and gss is 4, that means we have 3 **
    -                    // parts, and can remove 2 of them.
    -                    if (gss > gs) {
    -                        parts.splice(gs + 1, gss - gs);
    -                    }
    -                    let next = parts[gs + 1];
    -                    const p = parts[gs + 2];
    -                    const p2 = parts[gs + 3];
    -                    if (next !== '..')
    -                        continue;
    -                    if (!p ||
    -                        p === '.' ||
    -                        p === '..' ||
    -                        !p2 ||
    -                        p2 === '.' ||
    -                        p2 === '..') {
    -                        continue;
    -                    }
    -                    didSomething = true;
    -                    // edit parts in place, and push the new one
    -                    parts.splice(gs, 1);
    -                    const other = parts.slice(0);
    -                    other[gs] = '**';
    -                    globParts.push(other);
    -                    gs--;
    -                }
    -                // 
    // -> 
    /
    -                if (!this.preserveMultipleSlashes) {
    -                    for (let i = 1; i < parts.length - 1; i++) {
    -                        const p = parts[i];
    -                        // don't squeeze out UNC patterns
    -                        if (i === 1 && p === '' && parts[0] === '')
    -                            continue;
    -                        if (p === '.' || p === '') {
    -                            didSomething = true;
    -                            parts.splice(i, 1);
    -                            i--;
    -                        }
    -                    }
    -                    if (parts[0] === '.' &&
    -                        parts.length === 2 &&
    -                        (parts[1] === '.' || parts[1] === '')) {
    -                        didSomething = true;
    -                        parts.pop();
    -                    }
    -                }
    -                // 
    /

    /../ ->

    /
    -                let dd = 0;
    -                while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
    -                    const p = parts[dd - 1];
    -                    if (p && p !== '.' && p !== '..' && p !== '**') {
    -                        didSomething = true;
    -                        const needDot = dd === 1 && parts[dd + 1] === '**';
    -                        const splin = needDot ? ['.'] : [];
    -                        parts.splice(dd - 1, 2, ...splin);
    -                        if (parts.length === 0)
    -                            parts.push('');
    -                        dd -= 2;
    -                    }
    -                }
    -            }
    -        } while (didSomething);
    -        return globParts;
    -    }
    -    // second phase: multi-pattern dedupes
    -    // {
    /*/,
    /

    /} ->

    /*/
    -    // {
    /,
    /} -> 
    /
    -    // {
    /**/,
    /} -> 
    /**/
    -    //
    -    // {
    /**/,
    /**/

    /} ->

    /**/
    -    // ^-- not valid because ** doens't follow symlinks
    -    secondPhasePreProcess(globParts) {
    -        for (let i = 0; i < globParts.length - 1; i++) {
    -            for (let j = i + 1; j < globParts.length; j++) {
    -                const matched = this.partsMatch(globParts[i], globParts[j], !this.preserveMultipleSlashes);
    -                if (matched) {
    -                    globParts[i] = [];
    -                    globParts[j] = matched;
    -                    break;
    -                }
    -            }
    -        }
    -        return globParts.filter(gs => gs.length);
    -    }
    -    partsMatch(a, b, emptyGSMatch = false) {
    -        let ai = 0;
    -        let bi = 0;
    -        let result = [];
    -        let which = '';
    -        while (ai < a.length && bi < b.length) {
    -            if (a[ai] === b[bi]) {
    -                result.push(which === 'b' ? b[bi] : a[ai]);
    -                ai++;
    -                bi++;
    -            }
    -            else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {
    -                result.push(a[ai]);
    -                ai++;
    -            }
    -            else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {
    -                result.push(b[bi]);
    -                bi++;
    -            }
    -            else if (a[ai] === '*' &&
    -                b[bi] &&
    -                (this.options.dot || !b[bi].startsWith('.')) &&
    -                b[bi] !== '**') {
    -                if (which === 'b')
    -                    return false;
    -                which = 'a';
    -                result.push(a[ai]);
    -                ai++;
    -                bi++;
    -            }
    -            else if (b[bi] === '*' &&
    -                a[ai] &&
    -                (this.options.dot || !a[ai].startsWith('.')) &&
    -                a[ai] !== '**') {
    -                if (which === 'a')
    -                    return false;
    -                which = 'b';
    -                result.push(b[bi]);
    -                ai++;
    -                bi++;
    -            }
    -            else {
    -                return false;
    -            }
    -        }
    -        // if we fall out of the loop, it means they two are identical
    -        // as long as their lengths match
    -        return a.length === b.length && result;
    -    }
    -    parseNegate() {
    -        if (this.nonegate)
    -            return;
    -        const pattern = this.pattern;
    -        let negate = false;
    -        let negateOffset = 0;
    -        for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {
    -            negate = !negate;
    -            negateOffset++;
    -        }
    -        if (negateOffset)
    -            this.pattern = pattern.slice(negateOffset);
    -        this.negate = negate;
    -    }
    -    // set partial to true to test if, for example,
    -    // "/a/b" matches the start of "/*/b/*/d"
    -    // Partial means, if you run out of file before you run
    -    // out of pattern, then that's fine, as long as all
    -    // the parts match.
    -    matchOne(file, pattern, partial = false) {
    -        const options = this.options;
    -        // UNC paths like //?/X:/... can match X:/... and vice versa
    -        // Drive letters in absolute drive or unc paths are always compared
    -        // case-insensitively.
    -        if (this.isWindows) {
    -            const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0]);
    -            const fileUNC = !fileDrive &&
    -                file[0] === '' &&
    -                file[1] === '' &&
    -                file[2] === '?' &&
    -                /^[a-z]:$/i.test(file[3]);
    -            const patternDrive = typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0]);
    -            const patternUNC = !patternDrive &&
    -                pattern[0] === '' &&
    -                pattern[1] === '' &&
    -                pattern[2] === '?' &&
    -                typeof pattern[3] === 'string' &&
    -                /^[a-z]:$/i.test(pattern[3]);
    -            const fdi = fileUNC ? 3 : fileDrive ? 0 : undefined;
    -            const pdi = patternUNC ? 3 : patternDrive ? 0 : undefined;
    -            if (typeof fdi === 'number' && typeof pdi === 'number') {
    -                const [fd, pd] = [file[fdi], pattern[pdi]];
    -                if (fd.toLowerCase() === pd.toLowerCase()) {
    -                    pattern[pdi] = fd;
    -                    if (pdi > fdi) {
    -                        pattern = pattern.slice(pdi);
    -                    }
    -                    else if (fdi > pdi) {
    -                        file = file.slice(fdi);
    -                    }
    -                }
    -            }
    -        }
    -        // resolve and reduce . and .. portions in the file as well.
    -        // dont' need to do the second phase, because it's only one string[]
    -        const { optimizationLevel = 1 } = this.options;
    -        if (optimizationLevel >= 2) {
    -            file = this.levelTwoFileOptimize(file);
    -        }
    -        this.debug('matchOne', this, { file, pattern });
    -        this.debug('matchOne', file.length, pattern.length);
    -        for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) {
    -            this.debug('matchOne loop');
    -            var p = pattern[pi];
    -            var f = file[fi];
    -            this.debug(pattern, p, f);
    -            // should be impossible.
    -            // some invalid regexp stuff in the set.
    -            /* c8 ignore start */
    -            if (p === false) {
    -                return false;
    -            }
    -            /* c8 ignore stop */
    -            if (p === exports.GLOBSTAR) {
    -                this.debug('GLOBSTAR', [pattern, p, f]);
    -                // "**"
    -                // a/**/b/**/c would match the following:
    -                // a/b/x/y/z/c
    -                // a/x/y/z/b/c
    -                // a/b/x/b/x/c
    -                // a/b/c
    -                // To do this, take the rest of the pattern after
    -                // the **, and see if it would match the file remainder.
    -                // If so, return success.
    -                // If not, the ** "swallows" a segment, and try again.
    -                // This is recursively awful.
    -                //
    -                // a/**/b/**/c matching a/b/x/y/z/c
    -                // - a matches a
    -                // - doublestar
    -                //   - matchOne(b/x/y/z/c, b/**/c)
    -                //     - b matches b
    -                //     - doublestar
    -                //       - matchOne(x/y/z/c, c) -> no
    -                //       - matchOne(y/z/c, c) -> no
    -                //       - matchOne(z/c, c) -> no
    -                //       - matchOne(c, c) yes, hit
    -                var fr = fi;
    -                var pr = pi + 1;
    -                if (pr === pl) {
    -                    this.debug('** at the end');
    -                    // a ** at the end will just swallow the rest.
    -                    // We have found a match.
    -                    // however, it will not swallow /.x, unless
    -                    // options.dot is set.
    -                    // . and .. are *never* matched by **, for explosively
    -                    // exponential reasons.
    -                    for (; fi < fl; fi++) {
    -                        if (file[fi] === '.' ||
    -                            file[fi] === '..' ||
    -                            (!options.dot && file[fi].charAt(0) === '.'))
    -                            return false;
    -                    }
    -                    return true;
    -                }
    -                // ok, let's see if we can swallow whatever we can.
    -                while (fr < fl) {
    -                    var swallowee = file[fr];
    -                    this.debug('\nglobstar while', file, fr, pattern, pr, swallowee);
    -                    // XXX remove this slice.  Just pass the start index.
    -                    if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
    -                        this.debug('globstar found match!', fr, fl, swallowee);
    -                        // found a match.
    -                        return true;
    -                    }
    -                    else {
    -                        // can't swallow "." or ".." ever.
    -                        // can only swallow ".foo" when explicitly asked.
    -                        if (swallowee === '.' ||
    -                            swallowee === '..' ||
    -                            (!options.dot && swallowee.charAt(0) === '.')) {
    -                            this.debug('dot detected!', file, fr, pattern, pr);
    -                            break;
    -                        }
    -                        // ** swallows a segment, and continue.
    -                        this.debug('globstar swallow a segment, and continue');
    -                        fr++;
    -                    }
    -                }
    -                // no match was found.
    -                // However, in partial mode, we can't say this is necessarily over.
    -                /* c8 ignore start */
    -                if (partial) {
    -                    // ran out of file
    -                    this.debug('\n>>> no match, partial?', file, fr, pattern, pr);
    -                    if (fr === fl) {
    -                        return true;
    -                    }
    -                }
    -                /* c8 ignore stop */
    -                return false;
    -            }
    -            // something other than **
    -            // non-magic patterns just have to match exactly
    -            // patterns with magic have been turned into regexps.
    -            let hit;
    -            if (typeof p === 'string') {
    -                hit = f === p;
    -                this.debug('string match', p, f, hit);
    -            }
    -            else {
    -                hit = p.test(f);
    -                this.debug('pattern match', p, f, hit);
    -            }
    -            if (!hit)
    -                return false;
    -        }
    -        // Note: ending in / means that we'll get a final ""
    -        // at the end of the pattern.  This can only match a
    -        // corresponding "" at the end of the file.
    -        // If the file ends in /, then it can only match a
    -        // a pattern that ends in /, unless the pattern just
    -        // doesn't have any more for it. But, a/b/ should *not*
    -        // match "a/b/*", even though "" matches against the
    -        // [^/]*? pattern, except in partial mode, where it might
    -        // simply not be reached yet.
    -        // However, a/b/ should still satisfy a/*
    -        // now either we fell off the end of the pattern, or we're done.
    -        if (fi === fl && pi === pl) {
    -            // ran out of pattern and filename at the same time.
    -            // an exact hit!
    -            return true;
    -        }
    -        else if (fi === fl) {
    -            // ran out of file, but still had pattern left.
    -            // this is ok if we're doing the match as part of
    -            // a glob fs traversal.
    -            return partial;
    -        }
    -        else if (pi === pl) {
    -            // ran out of pattern, still have file left.
    -            // this is only acceptable if we're on the very last
    -            // empty segment of a file with a trailing slash.
    -            // a/* should match a/b/
    -            return fi === fl - 1 && file[fi] === '';
    -            /* c8 ignore start */
    -        }
    -        else {
    -            // should be unreachable.
    -            throw new Error('wtf?');
    -        }
    -        /* c8 ignore stop */
    -    }
    -    braceExpand() {
    -        return (0, exports.braceExpand)(this.pattern, this.options);
    -    }
    -    parse(pattern) {
    -        (0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
    -        const options = this.options;
    -        // shortcuts
    -        if (pattern === '**')
    -            return exports.GLOBSTAR;
    -        if (pattern === '')
    -            return '';
    -        // far and away, the most common glob pattern parts are
    -        // *, *.*, and *.  Add a fast check method for those.
    -        let m;
    -        let fastTest = null;
    -        if ((m = pattern.match(starRE))) {
    -            fastTest = options.dot ? starTestDot : starTest;
    -        }
    -        else if ((m = pattern.match(starDotExtRE))) {
    -            fastTest = (options.nocase
    -                ? options.dot
    -                    ? starDotExtTestNocaseDot
    -                    : starDotExtTestNocase
    -                : options.dot
    -                    ? starDotExtTestDot
    -                    : starDotExtTest)(m[1]);
    -        }
    -        else if ((m = pattern.match(qmarksRE))) {
    -            fastTest = (options.nocase
    -                ? options.dot
    -                    ? qmarksTestNocaseDot
    -                    : qmarksTestNocase
    -                : options.dot
    -                    ? qmarksTestDot
    -                    : qmarksTest)(m);
    -        }
    -        else if ((m = pattern.match(starDotStarRE))) {
    -            fastTest = options.dot ? starDotStarTestDot : starDotStarTest;
    -        }
    -        else if ((m = pattern.match(dotStarRE))) {
    -            fastTest = dotStarTest;
    -        }
    -        const re = ast_js_1.AST.fromGlob(pattern, this.options).toMMPattern();
    -        if (fastTest && typeof re === 'object') {
    -            // Avoids overriding in frozen environments
    -            Reflect.defineProperty(re, 'test', { value: fastTest });
    -        }
    -        return re;
    -    }
    -    makeRe() {
    -        if (this.regexp || this.regexp === false)
    -            return this.regexp;
    -        // at this point, this.set is a 2d array of partial
    -        // pattern strings, or "**".
    -        //
    -        // It's better to use .match().  This function shouldn't
    -        // be used, really, but it's pretty convenient sometimes,
    -        // when you just want to work with a regex.
    -        const set = this.set;
    -        if (!set.length) {
    -            this.regexp = false;
    -            return this.regexp;
    -        }
    -        const options = this.options;
    -        const twoStar = options.noglobstar
    -            ? star
    -            : options.dot
    -                ? twoStarDot
    -                : twoStarNoDot;
    -        const flags = new Set(options.nocase ? ['i'] : []);
    -        // regexpify non-globstar patterns
    -        // if ** is only item, then we just do one twoStar
    -        // if ** is first, and there are more, prepend (\/|twoStar\/)? to next
    -        // if ** is last, append (\/twoStar|) to previous
    -        // if ** is in the middle, append (\/|\/twoStar\/) to previous
    -        // then filter out GLOBSTAR symbols
    -        let re = set
    -            .map(pattern => {
    -            const pp = pattern.map(p => {
    -                if (p instanceof RegExp) {
    -                    for (const f of p.flags.split(''))
    -                        flags.add(f);
    -                }
    -                return typeof p === 'string'
    -                    ? regExpEscape(p)
    -                    : p === exports.GLOBSTAR
    -                        ? exports.GLOBSTAR
    -                        : p._src;
    -            });
    -            pp.forEach((p, i) => {
    -                const next = pp[i + 1];
    -                const prev = pp[i - 1];
    -                if (p !== exports.GLOBSTAR || prev === exports.GLOBSTAR) {
    -                    return;
    -                }
    -                if (prev === undefined) {
    -                    if (next !== undefined && next !== exports.GLOBSTAR) {
    -                        pp[i + 1] = '(?:\\/|' + twoStar + '\\/)?' + next;
    -                    }
    -                    else {
    -                        pp[i] = twoStar;
    -                    }
    -                }
    -                else if (next === undefined) {
    -                    pp[i - 1] = prev + '(?:\\/|' + twoStar + ')?';
    -                }
    -                else if (next !== exports.GLOBSTAR) {
    -                    pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + '\\/)' + next;
    -                    pp[i + 1] = exports.GLOBSTAR;
    -                }
    -            });
    -            return pp.filter(p => p !== exports.GLOBSTAR).join('/');
    -        })
    -            .join('|');
    -        // need to wrap in parens if we had more than one thing with |,
    -        // otherwise only the first will be anchored to ^ and the last to $
    -        const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', ''];
    -        // must match entire pattern
    -        // ending in a * or ** will make it less strict.
    -        re = '^' + open + re + close + '$';
    -        // can match anything, as long as it's not this.
    -        if (this.negate)
    -            re = '^(?!' + re + ').+$';
    -        try {
    -            this.regexp = new RegExp(re, [...flags].join(''));
    -            /* c8 ignore start */
    -        }
    -        catch (ex) {
    -            // should be impossible
    -            this.regexp = false;
    -        }
    -        /* c8 ignore stop */
    -        return this.regexp;
    -    }
    -    slashSplit(p) {
    -        // if p starts with // on windows, we preserve that
    -        // so that UNC paths aren't broken.  Otherwise, any number of
    -        // / characters are coalesced into one, unless
    -        // preserveMultipleSlashes is set to true.
    -        if (this.preserveMultipleSlashes) {
    -            return p.split('/');
    -        }
    -        else if (this.isWindows && /^\/\/[^\/]+/.test(p)) {
    -            // add an extra '' for the one we lose
    -            return ['', ...p.split(/\/+/)];
    -        }
    -        else {
    -            return p.split(/\/+/);
    -        }
    -    }
    -    match(f, partial = this.partial) {
    -        this.debug('match', f, this.pattern);
    -        // short-circuit in the case of busted things.
    -        // comments, etc.
    -        if (this.comment) {
    -            return false;
    -        }
    -        if (this.empty) {
    -            return f === '';
    -        }
    -        if (f === '/' && partial) {
    -            return true;
    -        }
    -        const options = this.options;
    -        // windows: need to use /, not \
    -        if (this.isWindows) {
    -            f = f.split('\\').join('/');
    -        }
    -        // treat the test path as a set of pathparts.
    -        const ff = this.slashSplit(f);
    -        this.debug(this.pattern, 'split', ff);
    -        // just ONE of the pattern sets in this.set needs to match
    -        // in order for it to be valid.  If negating, then just one
    -        // match means that we have failed.
    -        // Either way, return on the first hit.
    -        const set = this.set;
    -        this.debug(this.pattern, 'set', set);
    -        // Find the basename of the path by looking for the last non-empty segment
    -        let filename = ff[ff.length - 1];
    -        if (!filename) {
    -            for (let i = ff.length - 2; !filename && i >= 0; i--) {
    -                filename = ff[i];
    -            }
    -        }
    -        for (let i = 0; i < set.length; i++) {
    -            const pattern = set[i];
    -            let file = ff;
    -            if (options.matchBase && pattern.length === 1) {
    -                file = [filename];
    -            }
    -            const hit = this.matchOne(file, pattern, partial);
    -            if (hit) {
    -                if (options.flipNegate) {
    -                    return true;
    -                }
    -                return !this.negate;
    -            }
    -        }
    -        // didn't get any hits.  this is success if it's a negative
    -        // pattern, failure otherwise.
    -        if (options.flipNegate) {
    -            return false;
    -        }
    -        return this.negate;
    -    }
    -    static defaults(def) {
    -        return exports.minimatch.defaults(def).Minimatch;
    -    }
    -}
    -exports.Minimatch = Minimatch;
    -/* c8 ignore start */
    -var ast_js_2 = require("./ast.js");
    -Object.defineProperty(exports, "AST", { enumerable: true, get: function () { return ast_js_2.AST; } });
    -var escape_js_2 = require("./escape.js");
    -Object.defineProperty(exports, "escape", { enumerable: true, get: function () { return escape_js_2.escape; } });
    -var unescape_js_2 = require("./unescape.js");
    -Object.defineProperty(exports, "unescape", { enumerable: true, get: function () { return unescape_js_2.unescape; } });
    -/* c8 ignore stop */
    -exports.minimatch.AST = ast_js_1.AST;
    -exports.minimatch.Minimatch = Minimatch;
    -exports.minimatch.escape = escape_js_1.escape;
    -exports.minimatch.unescape = unescape_js_1.unescape;
    -//# sourceMappingURL=index.js.map
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/commonjs/index.js.map b/node_modules/minimatch/dist/commonjs/index.js.map
    deleted file mode 100644
    index d4f6a87..0000000
    --- a/node_modules/minimatch/dist/commonjs/index.js.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import expand from 'brace-expansion'\nimport { assertValidPattern } from './assert-valid-pattern.js'\nimport { AST, ExtglobType } from './ast.js'\nimport { escape } from './escape.js'\nimport { unescape } from './unescape.js'\n\ntype Platform =\n  | 'aix'\n  | 'android'\n  | 'darwin'\n  | 'freebsd'\n  | 'haiku'\n  | 'linux'\n  | 'openbsd'\n  | 'sunos'\n  | 'win32'\n  | 'cygwin'\n  | 'netbsd'\n\nexport interface MinimatchOptions {\n  nobrace?: boolean\n  nocomment?: boolean\n  nonegate?: boolean\n  debug?: boolean\n  noglobstar?: boolean\n  noext?: boolean\n  nonull?: boolean\n  windowsPathsNoEscape?: boolean\n  allowWindowsEscape?: boolean\n  partial?: boolean\n  dot?: boolean\n  nocase?: boolean\n  nocaseMagicOnly?: boolean\n  magicalBraces?: boolean\n  matchBase?: boolean\n  flipNegate?: boolean\n  preserveMultipleSlashes?: boolean\n  optimizationLevel?: number\n  platform?: Platform\n  windowsNoMagicRoot?: boolean\n}\n\nexport const minimatch = (\n  p: string,\n  pattern: string,\n  options: MinimatchOptions = {}\n) => {\n  assertValidPattern(pattern)\n\n  // shortcut: comments match nothing.\n  if (!options.nocomment && pattern.charAt(0) === '#') {\n    return false\n  }\n\n  return new Minimatch(pattern, options).match(p)\n}\n\n// Optimized checking for the most common glob patterns.\nconst starDotExtRE = /^\\*+([^+@!?\\*\\[\\(]*)$/\nconst starDotExtTest = (ext: string) => (f: string) =>\n  !f.startsWith('.') && f.endsWith(ext)\nconst starDotExtTestDot = (ext: string) => (f: string) => f.endsWith(ext)\nconst starDotExtTestNocase = (ext: string) => {\n  ext = ext.toLowerCase()\n  return (f: string) => !f.startsWith('.') && f.toLowerCase().endsWith(ext)\n}\nconst starDotExtTestNocaseDot = (ext: string) => {\n  ext = ext.toLowerCase()\n  return (f: string) => f.toLowerCase().endsWith(ext)\n}\nconst starDotStarRE = /^\\*+\\.\\*+$/\nconst starDotStarTest = (f: string) => !f.startsWith('.') && f.includes('.')\nconst starDotStarTestDot = (f: string) =>\n  f !== '.' && f !== '..' && f.includes('.')\nconst dotStarRE = /^\\.\\*+$/\nconst dotStarTest = (f: string) => f !== '.' && f !== '..' && f.startsWith('.')\nconst starRE = /^\\*+$/\nconst starTest = (f: string) => f.length !== 0 && !f.startsWith('.')\nconst starTestDot = (f: string) => f.length !== 0 && f !== '.' && f !== '..'\nconst qmarksRE = /^\\?+([^+@!?\\*\\[\\(]*)?$/\nconst qmarksTestNocase = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExt([$0])\n  if (!ext) return noext\n  ext = ext.toLowerCase()\n  return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestNocaseDot = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExtDot([$0])\n  if (!ext) return noext\n  ext = ext.toLowerCase()\n  return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestDot = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExtDot([$0])\n  return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTest = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExt([$0])\n  return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTestNoExt = ([$0]: RegExpMatchArray) => {\n  const len = $0.length\n  return (f: string) => f.length === len && !f.startsWith('.')\n}\nconst qmarksTestNoExtDot = ([$0]: RegExpMatchArray) => {\n  const len = $0.length\n  return (f: string) => f.length === len && f !== '.' && f !== '..'\n}\n\n/* c8 ignore start */\nconst defaultPlatform: Platform = (\n  typeof process === 'object' && process\n    ? (typeof process.env === 'object' &&\n        process.env &&\n        process.env.__MINIMATCH_TESTING_PLATFORM__) ||\n      process.platform\n    : 'posix'\n) as Platform\ntype Sep = '\\\\' | '/'\nconst path: { [k: string]: { sep: Sep } } = {\n  win32: { sep: '\\\\' },\n  posix: { sep: '/' },\n}\n/* c8 ignore stop */\n\nexport const sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep\nminimatch.sep = sep\n\nexport const GLOBSTAR = Symbol('globstar **')\nminimatch.GLOBSTAR = GLOBSTAR\n\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n\n// ** when dots are allowed.  Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nconst twoStarDot = '(?:(?!(?:\\\\/|^)(?:\\\\.{1,2})($|\\\\/)).)*?'\n\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nconst twoStarNoDot = '(?:(?!(?:\\\\/|^)\\\\.).)*?'\n\nexport const filter =\n  (pattern: string, options: MinimatchOptions = {}) =>\n  (p: string) =>\n    minimatch(p, pattern, options)\nminimatch.filter = filter\n\nconst ext = (a: MinimatchOptions, b: MinimatchOptions = {}) =>\n  Object.assign({}, a, b)\n\nexport const defaults = (def: MinimatchOptions): typeof minimatch => {\n  if (!def || typeof def !== 'object' || !Object.keys(def).length) {\n    return minimatch\n  }\n\n  const orig = minimatch\n\n  const m = (p: string, pattern: string, options: MinimatchOptions = {}) =>\n    orig(p, pattern, ext(def, options))\n\n  return Object.assign(m, {\n    Minimatch: class Minimatch extends orig.Minimatch {\n      constructor(pattern: string, options: MinimatchOptions = {}) {\n        super(pattern, ext(def, options))\n      }\n      static defaults(options: MinimatchOptions) {\n        return orig.defaults(ext(def, options)).Minimatch\n      }\n    },\n\n    AST: class AST extends orig.AST {\n      /* c8 ignore start */\n      constructor(\n        type: ExtglobType | null,\n        parent?: AST,\n        options: MinimatchOptions = {}\n      ) {\n        super(type, parent, ext(def, options))\n      }\n      /* c8 ignore stop */\n\n      static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n        return orig.AST.fromGlob(pattern, ext(def, options))\n      }\n    },\n\n    unescape: (\n      s: string,\n      options: Pick = {}\n    ) => orig.unescape(s, ext(def, options)),\n\n    escape: (\n      s: string,\n      options: Pick = {}\n    ) => orig.escape(s, ext(def, options)),\n\n    filter: (pattern: string, options: MinimatchOptions = {}) =>\n      orig.filter(pattern, ext(def, options)),\n\n    defaults: (options: MinimatchOptions) => orig.defaults(ext(def, options)),\n\n    makeRe: (pattern: string, options: MinimatchOptions = {}) =>\n      orig.makeRe(pattern, ext(def, options)),\n\n    braceExpand: (pattern: string, options: MinimatchOptions = {}) =>\n      orig.braceExpand(pattern, ext(def, options)),\n\n    match: (list: string[], pattern: string, options: MinimatchOptions = {}) =>\n      orig.match(list, pattern, ext(def, options)),\n\n    sep: orig.sep,\n    GLOBSTAR: GLOBSTAR as typeof GLOBSTAR,\n  })\n}\nminimatch.defaults = defaults\n\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nexport const braceExpand = (\n  pattern: string,\n  options: MinimatchOptions = {}\n) => {\n  assertValidPattern(pattern)\n\n  // Thanks to Yeting Li  for\n  // improving this regexp to avoid a ReDOS vulnerability.\n  if (options.nobrace || !/\\{(?:(?!\\{).)*\\}/.test(pattern)) {\n    // shortcut. no need to expand.\n    return [pattern]\n  }\n\n  return expand(pattern)\n}\nminimatch.braceExpand = braceExpand\n\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion.  Otherwise, any series\n// of * is equivalent to a single *.  Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\n\nexport const makeRe = (pattern: string, options: MinimatchOptions = {}) =>\n  new Minimatch(pattern, options).makeRe()\nminimatch.makeRe = makeRe\n\nexport const match = (\n  list: string[],\n  pattern: string,\n  options: MinimatchOptions = {}\n) => {\n  const mm = new Minimatch(pattern, options)\n  list = list.filter(f => mm.match(f))\n  if (mm.options.nonull && !list.length) {\n    list.push(pattern)\n  }\n  return list\n}\nminimatch.match = match\n\n// replace stuff like \\* with *\nconst globMagic = /[?*]|[+@!]\\(.*?\\)|\\[|\\]/\nconst regExpEscape = (s: string) =>\n  s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\nexport type MMRegExp = RegExp & {\n  _src?: string\n  _glob?: string\n}\n\nexport type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR\nexport type ParseReturn = ParseReturnFiltered | false\n\nexport class Minimatch {\n  options: MinimatchOptions\n  set: ParseReturnFiltered[][]\n  pattern: string\n\n  windowsPathsNoEscape: boolean\n  nonegate: boolean\n  negate: boolean\n  comment: boolean\n  empty: boolean\n  preserveMultipleSlashes: boolean\n  partial: boolean\n  globSet: string[]\n  globParts: string[][]\n  nocase: boolean\n\n  isWindows: boolean\n  platform: Platform\n  windowsNoMagicRoot: boolean\n\n  regexp: false | null | MMRegExp\n  constructor(pattern: string, options: MinimatchOptions = {}) {\n    assertValidPattern(pattern)\n\n    options = options || {}\n    this.options = options\n    this.pattern = pattern\n    this.platform = options.platform || defaultPlatform\n    this.isWindows = this.platform === 'win32'\n    this.windowsPathsNoEscape =\n      !!options.windowsPathsNoEscape || options.allowWindowsEscape === false\n    if (this.windowsPathsNoEscape) {\n      this.pattern = this.pattern.replace(/\\\\/g, '/')\n    }\n    this.preserveMultipleSlashes = !!options.preserveMultipleSlashes\n    this.regexp = null\n    this.negate = false\n    this.nonegate = !!options.nonegate\n    this.comment = false\n    this.empty = false\n    this.partial = !!options.partial\n    this.nocase = !!this.options.nocase\n    this.windowsNoMagicRoot =\n      options.windowsNoMagicRoot !== undefined\n        ? options.windowsNoMagicRoot\n        : !!(this.isWindows && this.nocase)\n\n    this.globSet = []\n    this.globParts = []\n    this.set = []\n\n    // make the set of regexps etc.\n    this.make()\n  }\n\n  hasMagic(): boolean {\n    if (this.options.magicalBraces && this.set.length > 1) {\n      return true\n    }\n    for (const pattern of this.set) {\n      for (const part of pattern) {\n        if (typeof part !== 'string') return true\n      }\n    }\n    return false\n  }\n\n  debug(..._: any[]) {}\n\n  make() {\n    const pattern = this.pattern\n    const options = this.options\n\n    // empty patterns and comments match nothing.\n    if (!options.nocomment && pattern.charAt(0) === '#') {\n      this.comment = true\n      return\n    }\n\n    if (!pattern) {\n      this.empty = true\n      return\n    }\n\n    // step 1: figure out negation, etc.\n    this.parseNegate()\n\n    // step 2: expand braces\n    this.globSet = [...new Set(this.braceExpand())]\n\n    if (options.debug) {\n      this.debug = (...args: any[]) => console.error(...args)\n    }\n\n    this.debug(this.pattern, this.globSet)\n\n    // step 3: now we have a set, so turn each one into a series of\n    // path-portion matching patterns.\n    // These will be regexps, except in the case of \"**\", which is\n    // set to the GLOBSTAR object for globstar behavior,\n    // and will not contain any / characters\n    //\n    // First, we preprocess to make the glob pattern sets a bit simpler\n    // and deduped.  There are some perf-killing patterns that can cause\n    // problems with a glob walk, but we can simplify them down a bit.\n    const rawGlobParts = this.globSet.map(s => this.slashSplit(s))\n    this.globParts = this.preprocess(rawGlobParts)\n    this.debug(this.pattern, this.globParts)\n\n    // glob --> regexps\n    let set = this.globParts.map((s, _, __) => {\n      if (this.isWindows && this.windowsNoMagicRoot) {\n        // check if it's a drive or unc path.\n        const isUNC =\n          s[0] === '' &&\n          s[1] === '' &&\n          (s[2] === '?' || !globMagic.test(s[2])) &&\n          !globMagic.test(s[3])\n        const isDrive = /^[a-z]:/i.test(s[0])\n        if (isUNC) {\n          return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))]\n        } else if (isDrive) {\n          return [s[0], ...s.slice(1).map(ss => this.parse(ss))]\n        }\n      }\n      return s.map(ss => this.parse(ss))\n    })\n\n    this.debug(this.pattern, set)\n\n    // filter out everything that didn't compile properly.\n    this.set = set.filter(\n      s => s.indexOf(false) === -1\n    ) as ParseReturnFiltered[][]\n\n    // do not treat the ? in UNC paths as magic\n    if (this.isWindows) {\n      for (let i = 0; i < this.set.length; i++) {\n        const p = this.set[i]\n        if (\n          p[0] === '' &&\n          p[1] === '' &&\n          this.globParts[i][2] === '?' &&\n          typeof p[3] === 'string' &&\n          /^[a-z]:$/i.test(p[3])\n        ) {\n          p[2] = '?'\n        }\n      }\n    }\n\n    this.debug(this.pattern, this.set)\n  }\n\n  // various transforms to equivalent pattern sets that are\n  // faster to process in a filesystem walk.  The goal is to\n  // eliminate what we can, and push all ** patterns as far\n  // to the right as possible, even if it increases the number\n  // of patterns that we have to process.\n  preprocess(globParts: string[][]) {\n    // if we're not in globstar mode, then turn all ** into *\n    if (this.options.noglobstar) {\n      for (let i = 0; i < globParts.length; i++) {\n        for (let j = 0; j < globParts[i].length; j++) {\n          if (globParts[i][j] === '**') {\n            globParts[i][j] = '*'\n          }\n        }\n      }\n    }\n\n    const { optimizationLevel = 1 } = this.options\n\n    if (optimizationLevel >= 2) {\n      // aggressive optimization for the purpose of fs walking\n      globParts = this.firstPhasePreProcess(globParts)\n      globParts = this.secondPhasePreProcess(globParts)\n    } else if (optimizationLevel >= 1) {\n      // just basic optimizations to remove some .. parts\n      globParts = this.levelOneOptimize(globParts)\n    } else {\n      // just collapse multiple ** portions into one\n      globParts = this.adjascentGlobstarOptimize(globParts)\n    }\n\n    return globParts\n  }\n\n  // just get rid of adjascent ** portions\n  adjascentGlobstarOptimize(globParts: string[][]) {\n    return globParts.map(parts => {\n      let gs: number = -1\n      while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n        let i = gs\n        while (parts[i + 1] === '**') {\n          i++\n        }\n        if (i !== gs) {\n          parts.splice(gs, i - gs)\n        }\n      }\n      return parts\n    })\n  }\n\n  // get rid of adjascent ** and resolve .. portions\n  levelOneOptimize(globParts: string[][]) {\n    return globParts.map(parts => {\n      parts = parts.reduce((set: string[], part) => {\n        const prev = set[set.length - 1]\n        if (part === '**' && prev === '**') {\n          return set\n        }\n        if (part === '..') {\n          if (prev && prev !== '..' && prev !== '.' && prev !== '**') {\n            set.pop()\n            return set\n          }\n        }\n        set.push(part)\n        return set\n      }, [])\n      return parts.length === 0 ? [''] : parts\n    })\n  }\n\n  levelTwoFileOptimize(parts: string | string[]) {\n    if (!Array.isArray(parts)) {\n      parts = this.slashSplit(parts)\n    }\n    let didSomething: boolean = false\n    do {\n      didSomething = false\n      // 
    // -> 
    /\n      if (!this.preserveMultipleSlashes) {\n        for (let i = 1; i < parts.length - 1; i++) {\n          const p = parts[i]\n          // don't squeeze out UNC patterns\n          if (i === 1 && p === '' && parts[0] === '') continue\n          if (p === '.' || p === '') {\n            didSomething = true\n            parts.splice(i, 1)\n            i--\n          }\n        }\n        if (\n          parts[0] === '.' &&\n          parts.length === 2 &&\n          (parts[1] === '.' || parts[1] === '')\n        ) {\n          didSomething = true\n          parts.pop()\n        }\n      }\n\n      // 
    /

    /../ ->

    /\n      let dd: number = 0\n      while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n        const p = parts[dd - 1]\n        if (p && p !== '.' && p !== '..' && p !== '**') {\n          didSomething = true\n          parts.splice(dd - 1, 2)\n          dd -= 2\n        }\n      }\n    } while (didSomething)\n    return parts.length === 0 ? [''] : parts\n  }\n\n  // First phase: single-pattern processing\n  // 
     is 1 or more portions\n  //  is 1 or more portions\n  // 

    is any portion other than ., .., '', or **\n // is . or ''\n //\n // **/.. is *brutal* for filesystem walking performance, because\n // it effectively resets the recursive walk each time it occurs,\n // and ** cannot be reduced out by a .. pattern part like a regexp\n // or most strings (other than .., ., and '') can be.\n //\n //

    /**/../

    /

    / -> {

    /../

    /

    /,

    /**/

    /

    /}\n //

    // -> 
    /\n  // 
    /

    /../ ->

    /\n  // **/**/ -> **/\n  //\n  // **/*/ -> */**/ <== not valid because ** doesn't follow\n  // this WOULD be allowed if ** did follow symlinks, or * didn't\n  firstPhasePreProcess(globParts: string[][]) {\n    let didSomething = false\n    do {\n      didSomething = false\n      // 
    /**/../

    /

    / -> {

    /../

    /

    /,

    /**/

    /

    /}\n for (let parts of globParts) {\n let gs: number = -1\n while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n let gss: number = gs\n while (parts[gss + 1] === '**') {\n //

    /**/**/ -> 
    /**/\n            gss++\n          }\n          // eg, if gs is 2 and gss is 4, that means we have 3 **\n          // parts, and can remove 2 of them.\n          if (gss > gs) {\n            parts.splice(gs + 1, gss - gs)\n          }\n\n          let next = parts[gs + 1]\n          const p = parts[gs + 2]\n          const p2 = parts[gs + 3]\n          if (next !== '..') continue\n          if (\n            !p ||\n            p === '.' ||\n            p === '..' ||\n            !p2 ||\n            p2 === '.' ||\n            p2 === '..'\n          ) {\n            continue\n          }\n          didSomething = true\n          // edit parts in place, and push the new one\n          parts.splice(gs, 1)\n          const other = parts.slice(0)\n          other[gs] = '**'\n          globParts.push(other)\n          gs--\n        }\n\n        // 
    // -> 
    /\n        if (!this.preserveMultipleSlashes) {\n          for (let i = 1; i < parts.length - 1; i++) {\n            const p = parts[i]\n            // don't squeeze out UNC patterns\n            if (i === 1 && p === '' && parts[0] === '') continue\n            if (p === '.' || p === '') {\n              didSomething = true\n              parts.splice(i, 1)\n              i--\n            }\n          }\n          if (\n            parts[0] === '.' &&\n            parts.length === 2 &&\n            (parts[1] === '.' || parts[1] === '')\n          ) {\n            didSomething = true\n            parts.pop()\n          }\n        }\n\n        // 
    /

    /../ ->

    /\n        let dd: number = 0\n        while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n          const p = parts[dd - 1]\n          if (p && p !== '.' && p !== '..' && p !== '**') {\n            didSomething = true\n            const needDot = dd === 1 && parts[dd + 1] === '**'\n            const splin = needDot ? ['.'] : []\n            parts.splice(dd - 1, 2, ...splin)\n            if (parts.length === 0) parts.push('')\n            dd -= 2\n          }\n        }\n      }\n    } while (didSomething)\n\n    return globParts\n  }\n\n  // second phase: multi-pattern dedupes\n  // {
    /*/,
    /

    /} ->

    /*/\n  // {
    /,
    /} -> 
    /\n  // {
    /**/,
    /} -> 
    /**/\n  //\n  // {
    /**/,
    /**/

    /} ->

    /**/\n  // ^-- not valid because ** doens't follow symlinks\n  secondPhasePreProcess(globParts: string[][]): string[][] {\n    for (let i = 0; i < globParts.length - 1; i++) {\n      for (let j = i + 1; j < globParts.length; j++) {\n        const matched = this.partsMatch(\n          globParts[i],\n          globParts[j],\n          !this.preserveMultipleSlashes\n        )\n        if (matched) {\n          globParts[i] = []\n          globParts[j] = matched\n          break\n        }\n      }\n    }\n    return globParts.filter(gs => gs.length)\n  }\n\n  partsMatch(\n    a: string[],\n    b: string[],\n    emptyGSMatch: boolean = false\n  ): false | string[] {\n    let ai = 0\n    let bi = 0\n    let result: string[] = []\n    let which: string = ''\n    while (ai < a.length && bi < b.length) {\n      if (a[ai] === b[bi]) {\n        result.push(which === 'b' ? b[bi] : a[ai])\n        ai++\n        bi++\n      } else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {\n        result.push(a[ai])\n        ai++\n      } else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {\n        result.push(b[bi])\n        bi++\n      } else if (\n        a[ai] === '*' &&\n        b[bi] &&\n        (this.options.dot || !b[bi].startsWith('.')) &&\n        b[bi] !== '**'\n      ) {\n        if (which === 'b') return false\n        which = 'a'\n        result.push(a[ai])\n        ai++\n        bi++\n      } else if (\n        b[bi] === '*' &&\n        a[ai] &&\n        (this.options.dot || !a[ai].startsWith('.')) &&\n        a[ai] !== '**'\n      ) {\n        if (which === 'a') return false\n        which = 'b'\n        result.push(b[bi])\n        ai++\n        bi++\n      } else {\n        return false\n      }\n    }\n    // if we fall out of the loop, it means they two are identical\n    // as long as their lengths match\n    return a.length === b.length && result\n  }\n\n  parseNegate() {\n    if (this.nonegate) return\n\n    const pattern = this.pattern\n    let negate = false\n    let negateOffset = 0\n\n    for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {\n      negate = !negate\n      negateOffset++\n    }\n\n    if (negateOffset) this.pattern = pattern.slice(negateOffset)\n    this.negate = negate\n  }\n\n  // set partial to true to test if, for example,\n  // \"/a/b\" matches the start of \"/*/b/*/d\"\n  // Partial means, if you run out of file before you run\n  // out of pattern, then that's fine, as long as all\n  // the parts match.\n  matchOne(file: string[], pattern: ParseReturn[], partial: boolean = false) {\n    const options = this.options\n\n    // UNC paths like //?/X:/... can match X:/... and vice versa\n    // Drive letters in absolute drive or unc paths are always compared\n    // case-insensitively.\n    if (this.isWindows) {\n      const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0])\n      const fileUNC =\n        !fileDrive &&\n        file[0] === '' &&\n        file[1] === '' &&\n        file[2] === '?' &&\n        /^[a-z]:$/i.test(file[3])\n\n      const patternDrive =\n        typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0])\n      const patternUNC =\n        !patternDrive &&\n        pattern[0] === '' &&\n        pattern[1] === '' &&\n        pattern[2] === '?' &&\n        typeof pattern[3] === 'string' &&\n        /^[a-z]:$/i.test(pattern[3])\n\n      const fdi = fileUNC ? 3 : fileDrive ? 0 : undefined\n      const pdi = patternUNC ? 3 : patternDrive ? 0 : undefined\n      if (typeof fdi === 'number' && typeof pdi === 'number') {\n        const [fd, pd]: [string, string] = [file[fdi], pattern[pdi] as string]\n        if (fd.toLowerCase() === pd.toLowerCase()) {\n          pattern[pdi] = fd\n          if (pdi > fdi) {\n            pattern = pattern.slice(pdi)\n          } else if (fdi > pdi) {\n            file = file.slice(fdi)\n          }\n        }\n      }\n    }\n\n    // resolve and reduce . and .. portions in the file as well.\n    // dont' need to do the second phase, because it's only one string[]\n    const { optimizationLevel = 1 } = this.options\n    if (optimizationLevel >= 2) {\n      file = this.levelTwoFileOptimize(file)\n    }\n\n    this.debug('matchOne', this, { file, pattern })\n    this.debug('matchOne', file.length, pattern.length)\n\n    for (\n      var fi = 0, pi = 0, fl = file.length, pl = pattern.length;\n      fi < fl && pi < pl;\n      fi++, pi++\n    ) {\n      this.debug('matchOne loop')\n      var p = pattern[pi]\n      var f = file[fi]\n\n      this.debug(pattern, p, f)\n\n      // should be impossible.\n      // some invalid regexp stuff in the set.\n      /* c8 ignore start */\n      if (p === false) {\n        return false\n      }\n      /* c8 ignore stop */\n\n      if (p === GLOBSTAR) {\n        this.debug('GLOBSTAR', [pattern, p, f])\n\n        // \"**\"\n        // a/**/b/**/c would match the following:\n        // a/b/x/y/z/c\n        // a/x/y/z/b/c\n        // a/b/x/b/x/c\n        // a/b/c\n        // To do this, take the rest of the pattern after\n        // the **, and see if it would match the file remainder.\n        // If so, return success.\n        // If not, the ** \"swallows\" a segment, and try again.\n        // This is recursively awful.\n        //\n        // a/**/b/**/c matching a/b/x/y/z/c\n        // - a matches a\n        // - doublestar\n        //   - matchOne(b/x/y/z/c, b/**/c)\n        //     - b matches b\n        //     - doublestar\n        //       - matchOne(x/y/z/c, c) -> no\n        //       - matchOne(y/z/c, c) -> no\n        //       - matchOne(z/c, c) -> no\n        //       - matchOne(c, c) yes, hit\n        var fr = fi\n        var pr = pi + 1\n        if (pr === pl) {\n          this.debug('** at the end')\n          // a ** at the end will just swallow the rest.\n          // We have found a match.\n          // however, it will not swallow /.x, unless\n          // options.dot is set.\n          // . and .. are *never* matched by **, for explosively\n          // exponential reasons.\n          for (; fi < fl; fi++) {\n            if (\n              file[fi] === '.' ||\n              file[fi] === '..' ||\n              (!options.dot && file[fi].charAt(0) === '.')\n            )\n              return false\n          }\n          return true\n        }\n\n        // ok, let's see if we can swallow whatever we can.\n        while (fr < fl) {\n          var swallowee = file[fr]\n\n          this.debug('\\nglobstar while', file, fr, pattern, pr, swallowee)\n\n          // XXX remove this slice.  Just pass the start index.\n          if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {\n            this.debug('globstar found match!', fr, fl, swallowee)\n            // found a match.\n            return true\n          } else {\n            // can't swallow \".\" or \"..\" ever.\n            // can only swallow \".foo\" when explicitly asked.\n            if (\n              swallowee === '.' ||\n              swallowee === '..' ||\n              (!options.dot && swallowee.charAt(0) === '.')\n            ) {\n              this.debug('dot detected!', file, fr, pattern, pr)\n              break\n            }\n\n            // ** swallows a segment, and continue.\n            this.debug('globstar swallow a segment, and continue')\n            fr++\n          }\n        }\n\n        // no match was found.\n        // However, in partial mode, we can't say this is necessarily over.\n        /* c8 ignore start */\n        if (partial) {\n          // ran out of file\n          this.debug('\\n>>> no match, partial?', file, fr, pattern, pr)\n          if (fr === fl) {\n            return true\n          }\n        }\n        /* c8 ignore stop */\n        return false\n      }\n\n      // something other than **\n      // non-magic patterns just have to match exactly\n      // patterns with magic have been turned into regexps.\n      let hit: boolean\n      if (typeof p === 'string') {\n        hit = f === p\n        this.debug('string match', p, f, hit)\n      } else {\n        hit = p.test(f)\n        this.debug('pattern match', p, f, hit)\n      }\n\n      if (!hit) return false\n    }\n\n    // Note: ending in / means that we'll get a final \"\"\n    // at the end of the pattern.  This can only match a\n    // corresponding \"\" at the end of the file.\n    // If the file ends in /, then it can only match a\n    // a pattern that ends in /, unless the pattern just\n    // doesn't have any more for it. But, a/b/ should *not*\n    // match \"a/b/*\", even though \"\" matches against the\n    // [^/]*? pattern, except in partial mode, where it might\n    // simply not be reached yet.\n    // However, a/b/ should still satisfy a/*\n\n    // now either we fell off the end of the pattern, or we're done.\n    if (fi === fl && pi === pl) {\n      // ran out of pattern and filename at the same time.\n      // an exact hit!\n      return true\n    } else if (fi === fl) {\n      // ran out of file, but still had pattern left.\n      // this is ok if we're doing the match as part of\n      // a glob fs traversal.\n      return partial\n    } else if (pi === pl) {\n      // ran out of pattern, still have file left.\n      // this is only acceptable if we're on the very last\n      // empty segment of a file with a trailing slash.\n      // a/* should match a/b/\n      return fi === fl - 1 && file[fi] === ''\n\n      /* c8 ignore start */\n    } else {\n      // should be unreachable.\n      throw new Error('wtf?')\n    }\n    /* c8 ignore stop */\n  }\n\n  braceExpand() {\n    return braceExpand(this.pattern, this.options)\n  }\n\n  parse(pattern: string): ParseReturn {\n    assertValidPattern(pattern)\n\n    const options = this.options\n\n    // shortcuts\n    if (pattern === '**') return GLOBSTAR\n    if (pattern === '') return ''\n\n    // far and away, the most common glob pattern parts are\n    // *, *.*, and *.  Add a fast check method for those.\n    let m: RegExpMatchArray | null\n    let fastTest: null | ((f: string) => boolean) = null\n    if ((m = pattern.match(starRE))) {\n      fastTest = options.dot ? starTestDot : starTest\n    } else if ((m = pattern.match(starDotExtRE))) {\n      fastTest = (\n        options.nocase\n          ? options.dot\n            ? starDotExtTestNocaseDot\n            : starDotExtTestNocase\n          : options.dot\n          ? starDotExtTestDot\n          : starDotExtTest\n      )(m[1])\n    } else if ((m = pattern.match(qmarksRE))) {\n      fastTest = (\n        options.nocase\n          ? options.dot\n            ? qmarksTestNocaseDot\n            : qmarksTestNocase\n          : options.dot\n          ? qmarksTestDot\n          : qmarksTest\n      )(m)\n    } else if ((m = pattern.match(starDotStarRE))) {\n      fastTest = options.dot ? starDotStarTestDot : starDotStarTest\n    } else if ((m = pattern.match(dotStarRE))) {\n      fastTest = dotStarTest\n    }\n\n    const re = AST.fromGlob(pattern, this.options).toMMPattern()\n    if (fastTest && typeof re === 'object') {\n      // Avoids overriding in frozen environments\n      Reflect.defineProperty(re, 'test', { value: fastTest })\n    }\n    return re\n  }\n\n  makeRe() {\n    if (this.regexp || this.regexp === false) return this.regexp\n\n    // at this point, this.set is a 2d array of partial\n    // pattern strings, or \"**\".\n    //\n    // It's better to use .match().  This function shouldn't\n    // be used, really, but it's pretty convenient sometimes,\n    // when you just want to work with a regex.\n    const set = this.set\n\n    if (!set.length) {\n      this.regexp = false\n      return this.regexp\n    }\n    const options = this.options\n\n    const twoStar = options.noglobstar\n      ? star\n      : options.dot\n      ? twoStarDot\n      : twoStarNoDot\n    const flags = new Set(options.nocase ? ['i'] : [])\n\n    // regexpify non-globstar patterns\n    // if ** is only item, then we just do one twoStar\n    // if ** is first, and there are more, prepend (\\/|twoStar\\/)? to next\n    // if ** is last, append (\\/twoStar|) to previous\n    // if ** is in the middle, append (\\/|\\/twoStar\\/) to previous\n    // then filter out GLOBSTAR symbols\n    let re = set\n      .map(pattern => {\n        const pp: (string | typeof GLOBSTAR)[] = pattern.map(p => {\n          if (p instanceof RegExp) {\n            for (const f of p.flags.split('')) flags.add(f)\n          }\n          return typeof p === 'string'\n            ? regExpEscape(p)\n            : p === GLOBSTAR\n            ? GLOBSTAR\n            : p._src\n        }) as (string | typeof GLOBSTAR)[]\n        pp.forEach((p, i) => {\n          const next = pp[i + 1]\n          const prev = pp[i - 1]\n          if (p !== GLOBSTAR || prev === GLOBSTAR) {\n            return\n          }\n          if (prev === undefined) {\n            if (next !== undefined && next !== GLOBSTAR) {\n              pp[i + 1] = '(?:\\\\/|' + twoStar + '\\\\/)?' + next\n            } else {\n              pp[i] = twoStar\n            }\n          } else if (next === undefined) {\n            pp[i - 1] = prev + '(?:\\\\/|' + twoStar + ')?'\n          } else if (next !== GLOBSTAR) {\n            pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + '\\\\/)' + next\n            pp[i + 1] = GLOBSTAR\n          }\n        })\n        return pp.filter(p => p !== GLOBSTAR).join('/')\n      })\n      .join('|')\n\n    // need to wrap in parens if we had more than one thing with |,\n    // otherwise only the first will be anchored to ^ and the last to $\n    const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', '']\n    // must match entire pattern\n    // ending in a * or ** will make it less strict.\n    re = '^' + open + re + close + '$'\n\n    // can match anything, as long as it's not this.\n    if (this.negate) re = '^(?!' + re + ').+$'\n\n    try {\n      this.regexp = new RegExp(re, [...flags].join(''))\n      /* c8 ignore start */\n    } catch (ex) {\n      // should be impossible\n      this.regexp = false\n    }\n    /* c8 ignore stop */\n    return this.regexp\n  }\n\n  slashSplit(p: string) {\n    // if p starts with // on windows, we preserve that\n    // so that UNC paths aren't broken.  Otherwise, any number of\n    // / characters are coalesced into one, unless\n    // preserveMultipleSlashes is set to true.\n    if (this.preserveMultipleSlashes) {\n      return p.split('/')\n    } else if (this.isWindows && /^\\/\\/[^\\/]+/.test(p)) {\n      // add an extra '' for the one we lose\n      return ['', ...p.split(/\\/+/)]\n    } else {\n      return p.split(/\\/+/)\n    }\n  }\n\n  match(f: string, partial = this.partial) {\n    this.debug('match', f, this.pattern)\n    // short-circuit in the case of busted things.\n    // comments, etc.\n    if (this.comment) {\n      return false\n    }\n    if (this.empty) {\n      return f === ''\n    }\n\n    if (f === '/' && partial) {\n      return true\n    }\n\n    const options = this.options\n\n    // windows: need to use /, not \\\n    if (this.isWindows) {\n      f = f.split('\\\\').join('/')\n    }\n\n    // treat the test path as a set of pathparts.\n    const ff = this.slashSplit(f)\n    this.debug(this.pattern, 'split', ff)\n\n    // just ONE of the pattern sets in this.set needs to match\n    // in order for it to be valid.  If negating, then just one\n    // match means that we have failed.\n    // Either way, return on the first hit.\n\n    const set = this.set\n    this.debug(this.pattern, 'set', set)\n\n    // Find the basename of the path by looking for the last non-empty segment\n    let filename: string = ff[ff.length - 1]\n    if (!filename) {\n      for (let i = ff.length - 2; !filename && i >= 0; i--) {\n        filename = ff[i]\n      }\n    }\n\n    for (let i = 0; i < set.length; i++) {\n      const pattern = set[i]\n      let file = ff\n      if (options.matchBase && pattern.length === 1) {\n        file = [filename]\n      }\n      const hit = this.matchOne(file, pattern, partial)\n      if (hit) {\n        if (options.flipNegate) {\n          return true\n        }\n        return !this.negate\n      }\n    }\n\n    // didn't get any hits.  this is success if it's a negative\n    // pattern, failure otherwise.\n    if (options.flipNegate) {\n      return false\n    }\n    return this.negate\n  }\n\n  static defaults(def: MinimatchOptions) {\n    return minimatch.defaults(def).Minimatch\n  }\n}\n/* c8 ignore start */\nexport { AST } from './ast.js'\nexport { escape } from './escape.js'\nexport { unescape } from './unescape.js'\n/* c8 ignore stop */\nminimatch.AST = AST\nminimatch.Minimatch = Minimatch\nminimatch.escape = escape\nminimatch.unescape = unescape\n"]}
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/commonjs/package.json b/node_modules/minimatch/dist/commonjs/package.json
    deleted file mode 100644
    index 5bbefff..0000000
    --- a/node_modules/minimatch/dist/commonjs/package.json
    +++ /dev/null
    @@ -1,3 +0,0 @@
    -{
    -  "type": "commonjs"
    -}
    diff --git a/node_modules/minimatch/dist/commonjs/unescape.d.ts b/node_modules/minimatch/dist/commonjs/unescape.d.ts
    deleted file mode 100644
    index 23a7b38..0000000
    --- a/node_modules/minimatch/dist/commonjs/unescape.d.ts
    +++ /dev/null
    @@ -1,17 +0,0 @@
    -import { MinimatchOptions } from './index.js';
    -/**
    - * Un-escape a string that has been escaped with {@link escape}.
    - *
    - * If the {@link windowsPathsNoEscape} option is used, then square-brace
    - * escapes are removed, but not backslash escapes.  For example, it will turn
    - * the string `'[*]'` into `*`, but it will not turn `'\\*'` into `'*'`,
    - * becuase `\` is a path separator in `windowsPathsNoEscape` mode.
    - *
    - * When `windowsPathsNoEscape` is not set, then both brace escapes and
    - * backslash escapes are removed.
    - *
    - * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped
    - * or unescaped.
    - */
    -export declare const unescape: (s: string, { windowsPathsNoEscape, }?: Pick) => string;
    -//# sourceMappingURL=unescape.d.ts.map
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/commonjs/unescape.d.ts.map b/node_modules/minimatch/dist/commonjs/unescape.d.ts.map
    deleted file mode 100644
    index 7ace070..0000000
    --- a/node_modules/minimatch/dist/commonjs/unescape.d.ts.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"unescape.d.ts","sourceRoot":"","sources":["../../src/unescape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC7C;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,QAAQ,MAChB,MAAM,8BAGN,KAAK,gBAAgB,EAAE,sBAAsB,CAAC,WAKlD,CAAA"}
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/commonjs/unescape.js b/node_modules/minimatch/dist/commonjs/unescape.js
    deleted file mode 100644
    index 47c36bc..0000000
    --- a/node_modules/minimatch/dist/commonjs/unescape.js
    +++ /dev/null
    @@ -1,24 +0,0 @@
    -"use strict";
    -Object.defineProperty(exports, "__esModule", { value: true });
    -exports.unescape = void 0;
    -/**
    - * Un-escape a string that has been escaped with {@link escape}.
    - *
    - * If the {@link windowsPathsNoEscape} option is used, then square-brace
    - * escapes are removed, but not backslash escapes.  For example, it will turn
    - * the string `'[*]'` into `*`, but it will not turn `'\\*'` into `'*'`,
    - * becuase `\` is a path separator in `windowsPathsNoEscape` mode.
    - *
    - * When `windowsPathsNoEscape` is not set, then both brace escapes and
    - * backslash escapes are removed.
    - *
    - * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped
    - * or unescaped.
    - */
    -const unescape = (s, { windowsPathsNoEscape = false, } = {}) => {
    -    return windowsPathsNoEscape
    -        ? s.replace(/\[([^\/\\])\]/g, '$1')
    -        : s.replace(/((?!\\).|^)\[([^\/\\])\]/g, '$1$2').replace(/\\([^\/])/g, '$1');
    -};
    -exports.unescape = unescape;
    -//# sourceMappingURL=unescape.js.map
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/commonjs/unescape.js.map b/node_modules/minimatch/dist/commonjs/unescape.js.map
    deleted file mode 100644
    index 353d3aa..0000000
    --- a/node_modules/minimatch/dist/commonjs/unescape.js.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"unescape.js","sourceRoot":"","sources":["../../src/unescape.ts"],"names":[],"mappings":";;;AACA;;;;;;;;;;;;;GAaG;AACI,MAAM,QAAQ,GAAG,CACtB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,MACsB,EAAE,EACtD,EAAE;IACF,OAAO,oBAAoB;QACzB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC;QACnC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,2BAA2B,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;AAChF,CAAC,CAAA;AATY,QAAA,QAAQ,YASpB","sourcesContent":["import { MinimatchOptions } from './index.js'\n/**\n * Un-escape a string that has been escaped with {@link escape}.\n *\n * If the {@link windowsPathsNoEscape} option is used, then square-brace\n * escapes are removed, but not backslash escapes.  For example, it will turn\n * the string `'[*]'` into `*`, but it will not turn `'\\\\*'` into `'*'`,\n * becuase `\\` is a path separator in `windowsPathsNoEscape` mode.\n *\n * When `windowsPathsNoEscape` is not set, then both brace escapes and\n * backslash escapes are removed.\n *\n * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped\n * or unescaped.\n */\nexport const unescape = (\n  s: string,\n  {\n    windowsPathsNoEscape = false,\n  }: Pick = {}\n) => {\n  return windowsPathsNoEscape\n    ? s.replace(/\\[([^\\/\\\\])\\]/g, '$1')\n    : s.replace(/((?!\\\\).|^)\\[([^\\/\\\\])\\]/g, '$1$2').replace(/\\\\([^\\/])/g, '$1')\n}\n"]}
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts b/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts
    deleted file mode 100644
    index 8e318b2..0000000
    --- a/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts
    +++ /dev/null
    @@ -1,2 +0,0 @@
    -export declare const assertValidPattern: (pattern: any) => void;
    -//# sourceMappingURL=assert-valid-pattern.d.ts.map
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts.map b/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts.map
    deleted file mode 100644
    index c61c031..0000000
    --- a/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"assert-valid-pattern.d.ts","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,kBAAkB,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAUlD,CAAA"}
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/esm/assert-valid-pattern.js b/node_modules/minimatch/dist/esm/assert-valid-pattern.js
    deleted file mode 100644
    index 7b534fc..0000000
    --- a/node_modules/minimatch/dist/esm/assert-valid-pattern.js
    +++ /dev/null
    @@ -1,10 +0,0 @@
    -const MAX_PATTERN_LENGTH = 1024 * 64;
    -export const assertValidPattern = (pattern) => {
    -    if (typeof pattern !== 'string') {
    -        throw new TypeError('invalid pattern');
    -    }
    -    if (pattern.length > MAX_PATTERN_LENGTH) {
    -        throw new TypeError('pattern is too long');
    -    }
    -};
    -//# sourceMappingURL=assert-valid-pattern.js.map
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/esm/assert-valid-pattern.js.map b/node_modules/minimatch/dist/esm/assert-valid-pattern.js.map
    deleted file mode 100644
    index b1a5a0b..0000000
    --- a/node_modules/minimatch/dist/esm/assert-valid-pattern.js.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"assert-valid-pattern.js","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAE,CAAA;AACpC,MAAM,CAAC,MAAM,kBAAkB,GAA2B,CACxD,OAAY,EACe,EAAE;IAC7B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;QAC/B,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAA;KACvC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE;QACvC,MAAM,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAA;KAC3C;AACH,CAAC,CAAA","sourcesContent":["const MAX_PATTERN_LENGTH = 1024 * 64\nexport const assertValidPattern: (pattern: any) => void = (\n  pattern: any\n): asserts pattern is string => {\n  if (typeof pattern !== 'string') {\n    throw new TypeError('invalid pattern')\n  }\n\n  if (pattern.length > MAX_PATTERN_LENGTH) {\n    throw new TypeError('pattern is too long')\n  }\n}\n"]}
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/esm/ast.d.ts b/node_modules/minimatch/dist/esm/ast.d.ts
    deleted file mode 100644
    index b8c1e54..0000000
    --- a/node_modules/minimatch/dist/esm/ast.d.ts
    +++ /dev/null
    @@ -1,20 +0,0 @@
    -import { MinimatchOptions, MMRegExp } from './index.js';
    -export type ExtglobType = '!' | '?' | '+' | '*' | '@';
    -export declare class AST {
    -    #private;
    -    type: ExtglobType | null;
    -    constructor(type: ExtglobType | null, parent?: AST, options?: MinimatchOptions);
    -    get hasMagic(): boolean | undefined;
    -    toString(): string;
    -    push(...parts: (string | AST)[]): void;
    -    toJSON(): any[];
    -    isStart(): boolean;
    -    isEnd(): boolean;
    -    copyIn(part: AST | string): void;
    -    clone(parent: AST): AST;
    -    static fromGlob(pattern: string, options?: MinimatchOptions): AST;
    -    toMMPattern(): MMRegExp | string;
    -    get options(): MinimatchOptions;
    -    toRegExpSource(allowDot?: boolean): [re: string, body: string, hasMagic: boolean, uflag: boolean];
    -}
    -//# sourceMappingURL=ast.d.ts.map
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/esm/ast.d.ts.map b/node_modules/minimatch/dist/esm/ast.d.ts.map
    deleted file mode 100644
    index 9e7bfb9..0000000
    --- a/node_modules/minimatch/dist/esm/ast.d.ts.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAwCvD,MAAM,MAAM,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AAkCrD,qBAAa,GAAG;;IACd,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;gBAiBtB,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,MAAM,CAAC,EAAE,GAAG,EACZ,OAAO,GAAE,gBAAqB;IAahC,IAAI,QAAQ,IAAI,OAAO,GAAG,SAAS,CAUlC;IAGD,QAAQ,IAAI,MAAM;IA+ClB,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE;IAY/B,MAAM;IAgBN,OAAO,IAAI,OAAO;IAgBlB,KAAK,IAAI,OAAO;IAYhB,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM;IAKzB,KAAK,CAAC,MAAM,EAAE,GAAG;IAsIjB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;IAQ/D,WAAW,IAAI,QAAQ,GAAG,MAAM;IA2BhC,IAAI,OAAO,qBAEV;IAuED,cAAc,CACZ,QAAQ,CAAC,EAAE,OAAO,GACjB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC;CAiMjE"}
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/esm/ast.js b/node_modules/minimatch/dist/esm/ast.js
    deleted file mode 100644
    index 2d2bced..0000000
    --- a/node_modules/minimatch/dist/esm/ast.js
    +++ /dev/null
    @@ -1,588 +0,0 @@
    -// parse a single path portion
    -import { parseClass } from './brace-expressions.js';
    -import { unescape } from './unescape.js';
    -const types = new Set(['!', '?', '+', '*', '@']);
    -const isExtglobType = (c) => types.has(c);
    -// Patterns that get prepended to bind to the start of either the
    -// entire string, or just a single path portion, to prevent dots
    -// and/or traversal patterns, when needed.
    -// Exts don't need the ^ or / bit, because the root binds that already.
    -const startNoTraversal = '(?!(?:^|/)\\.\\.?(?:$|/))';
    -const startNoDot = '(?!\\.)';
    -// characters that indicate a start of pattern needs the "no dots" bit,
    -// because a dot *might* be matched. ( is not in the list, because in
    -// the case of a child extglob, it will handle the prevention itself.
    -const addPatternStart = new Set(['[', '.']);
    -// cases where traversal is A-OK, no dot prevention needed
    -const justDots = new Set(['..', '.']);
    -const reSpecials = new Set('().*{}+?[]^$\\!');
    -const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
    -// any single thing other than /
    -const qmark = '[^/]';
    -// * => any number of characters
    -const star = qmark + '*?';
    -// use + when we need to ensure that *something* matches, because the * is
    -// the only thing in the path portion.
    -const starNoEmpty = qmark + '+?';
    -// remove the \ chars that we added if we end up doing a nonmagic compare
    -// const deslash = (s: string) => s.replace(/\\(.)/g, '$1')
    -export class AST {
    -    type;
    -    #root;
    -    #hasMagic;
    -    #uflag = false;
    -    #parts = [];
    -    #parent;
    -    #parentIndex;
    -    #negs;
    -    #filledNegs = false;
    -    #options;
    -    #toString;
    -    // set to true if it's an extglob with no children
    -    // (which really means one child of '')
    -    #emptyExt = false;
    -    constructor(type, parent, options = {}) {
    -        this.type = type;
    -        // extglobs are inherently magical
    -        if (type)
    -            this.#hasMagic = true;
    -        this.#parent = parent;
    -        this.#root = this.#parent ? this.#parent.#root : this;
    -        this.#options = this.#root === this ? options : this.#root.#options;
    -        this.#negs = this.#root === this ? [] : this.#root.#negs;
    -        if (type === '!' && !this.#root.#filledNegs)
    -            this.#negs.push(this);
    -        this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0;
    -    }
    -    get hasMagic() {
    -        /* c8 ignore start */
    -        if (this.#hasMagic !== undefined)
    -            return this.#hasMagic;
    -        /* c8 ignore stop */
    -        for (const p of this.#parts) {
    -            if (typeof p === 'string')
    -                continue;
    -            if (p.type || p.hasMagic)
    -                return (this.#hasMagic = true);
    -        }
    -        // note: will be undefined until we generate the regexp src and find out
    -        return this.#hasMagic;
    -    }
    -    // reconstructs the pattern
    -    toString() {
    -        if (this.#toString !== undefined)
    -            return this.#toString;
    -        if (!this.type) {
    -            return (this.#toString = this.#parts.map(p => String(p)).join(''));
    -        }
    -        else {
    -            return (this.#toString =
    -                this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')');
    -        }
    -    }
    -    #fillNegs() {
    -        /* c8 ignore start */
    -        if (this !== this.#root)
    -            throw new Error('should only call on root');
    -        if (this.#filledNegs)
    -            return this;
    -        /* c8 ignore stop */
    -        // call toString() once to fill this out
    -        this.toString();
    -        this.#filledNegs = true;
    -        let n;
    -        while ((n = this.#negs.pop())) {
    -            if (n.type !== '!')
    -                continue;
    -            // walk up the tree, appending everthing that comes AFTER parentIndex
    -            let p = n;
    -            let pp = p.#parent;
    -            while (pp) {
    -                for (let i = p.#parentIndex + 1; !pp.type && i < pp.#parts.length; i++) {
    -                    for (const part of n.#parts) {
    -                        /* c8 ignore start */
    -                        if (typeof part === 'string') {
    -                            throw new Error('string part in extglob AST??');
    -                        }
    -                        /* c8 ignore stop */
    -                        part.copyIn(pp.#parts[i]);
    -                    }
    -                }
    -                p = pp;
    -                pp = p.#parent;
    -            }
    -        }
    -        return this;
    -    }
    -    push(...parts) {
    -        for (const p of parts) {
    -            if (p === '')
    -                continue;
    -            /* c8 ignore start */
    -            if (typeof p !== 'string' && !(p instanceof AST && p.#parent === this)) {
    -                throw new Error('invalid part: ' + p);
    -            }
    -            /* c8 ignore stop */
    -            this.#parts.push(p);
    -        }
    -    }
    -    toJSON() {
    -        const ret = this.type === null
    -            ? this.#parts.slice().map(p => (typeof p === 'string' ? p : p.toJSON()))
    -            : [this.type, ...this.#parts.map(p => p.toJSON())];
    -        if (this.isStart() && !this.type)
    -            ret.unshift([]);
    -        if (this.isEnd() &&
    -            (this === this.#root ||
    -                (this.#root.#filledNegs && this.#parent?.type === '!'))) {
    -            ret.push({});
    -        }
    -        return ret;
    -    }
    -    isStart() {
    -        if (this.#root === this)
    -            return true;
    -        // if (this.type) return !!this.#parent?.isStart()
    -        if (!this.#parent?.isStart())
    -            return false;
    -        if (this.#parentIndex === 0)
    -            return true;
    -        // if everything AHEAD of this is a negation, then it's still the "start"
    -        const p = this.#parent;
    -        for (let i = 0; i < this.#parentIndex; i++) {
    -            const pp = p.#parts[i];
    -            if (!(pp instanceof AST && pp.type === '!')) {
    -                return false;
    -            }
    -        }
    -        return true;
    -    }
    -    isEnd() {
    -        if (this.#root === this)
    -            return true;
    -        if (this.#parent?.type === '!')
    -            return true;
    -        if (!this.#parent?.isEnd())
    -            return false;
    -        if (!this.type)
    -            return this.#parent?.isEnd();
    -        // if not root, it'll always have a parent
    -        /* c8 ignore start */
    -        const pl = this.#parent ? this.#parent.#parts.length : 0;
    -        /* c8 ignore stop */
    -        return this.#parentIndex === pl - 1;
    -    }
    -    copyIn(part) {
    -        if (typeof part === 'string')
    -            this.push(part);
    -        else
    -            this.push(part.clone(this));
    -    }
    -    clone(parent) {
    -        const c = new AST(this.type, parent);
    -        for (const p of this.#parts) {
    -            c.copyIn(p);
    -        }
    -        return c;
    -    }
    -    static #parseAST(str, ast, pos, opt) {
    -        let escaping = false;
    -        let inBrace = false;
    -        let braceStart = -1;
    -        let braceNeg = false;
    -        if (ast.type === null) {
    -            // outside of a extglob, append until we find a start
    -            let i = pos;
    -            let acc = '';
    -            while (i < str.length) {
    -                const c = str.charAt(i++);
    -                // still accumulate escapes at this point, but we do ignore
    -                // starts that are escaped
    -                if (escaping || c === '\\') {
    -                    escaping = !escaping;
    -                    acc += c;
    -                    continue;
    -                }
    -                if (inBrace) {
    -                    if (i === braceStart + 1) {
    -                        if (c === '^' || c === '!') {
    -                            braceNeg = true;
    -                        }
    -                    }
    -                    else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {
    -                        inBrace = false;
    -                    }
    -                    acc += c;
    -                    continue;
    -                }
    -                else if (c === '[') {
    -                    inBrace = true;
    -                    braceStart = i;
    -                    braceNeg = false;
    -                    acc += c;
    -                    continue;
    -                }
    -                if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') {
    -                    ast.push(acc);
    -                    acc = '';
    -                    const ext = new AST(c, ast);
    -                    i = AST.#parseAST(str, ext, i, opt);
    -                    ast.push(ext);
    -                    continue;
    -                }
    -                acc += c;
    -            }
    -            ast.push(acc);
    -            return i;
    -        }
    -        // some kind of extglob, pos is at the (
    -        // find the next | or )
    -        let i = pos + 1;
    -        let part = new AST(null, ast);
    -        const parts = [];
    -        let acc = '';
    -        while (i < str.length) {
    -            const c = str.charAt(i++);
    -            // still accumulate escapes at this point, but we do ignore
    -            // starts that are escaped
    -            if (escaping || c === '\\') {
    -                escaping = !escaping;
    -                acc += c;
    -                continue;
    -            }
    -            if (inBrace) {
    -                if (i === braceStart + 1) {
    -                    if (c === '^' || c === '!') {
    -                        braceNeg = true;
    -                    }
    -                }
    -                else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {
    -                    inBrace = false;
    -                }
    -                acc += c;
    -                continue;
    -            }
    -            else if (c === '[') {
    -                inBrace = true;
    -                braceStart = i;
    -                braceNeg = false;
    -                acc += c;
    -                continue;
    -            }
    -            if (isExtglobType(c) && str.charAt(i) === '(') {
    -                part.push(acc);
    -                acc = '';
    -                const ext = new AST(c, part);
    -                part.push(ext);
    -                i = AST.#parseAST(str, ext, i, opt);
    -                continue;
    -            }
    -            if (c === '|') {
    -                part.push(acc);
    -                acc = '';
    -                parts.push(part);
    -                part = new AST(null, ast);
    -                continue;
    -            }
    -            if (c === ')') {
    -                if (acc === '' && ast.#parts.length === 0) {
    -                    ast.#emptyExt = true;
    -                }
    -                part.push(acc);
    -                acc = '';
    -                ast.push(...parts, part);
    -                return i;
    -            }
    -            acc += c;
    -        }
    -        // unfinished extglob
    -        // if we got here, it was a malformed extglob! not an extglob, but
    -        // maybe something else in there.
    -        ast.type = null;
    -        ast.#hasMagic = undefined;
    -        ast.#parts = [str.substring(pos - 1)];
    -        return i;
    -    }
    -    static fromGlob(pattern, options = {}) {
    -        const ast = new AST(null, undefined, options);
    -        AST.#parseAST(pattern, ast, 0, options);
    -        return ast;
    -    }
    -    // returns the regular expression if there's magic, or the unescaped
    -    // string if not.
    -    toMMPattern() {
    -        // should only be called on root
    -        /* c8 ignore start */
    -        if (this !== this.#root)
    -            return this.#root.toMMPattern();
    -        /* c8 ignore stop */
    -        const glob = this.toString();
    -        const [re, body, hasMagic, uflag] = this.toRegExpSource();
    -        // if we're in nocase mode, and not nocaseMagicOnly, then we do
    -        // still need a regular expression if we have to case-insensitively
    -        // match capital/lowercase characters.
    -        const anyMagic = hasMagic ||
    -            this.#hasMagic ||
    -            (this.#options.nocase &&
    -                !this.#options.nocaseMagicOnly &&
    -                glob.toUpperCase() !== glob.toLowerCase());
    -        if (!anyMagic) {
    -            return body;
    -        }
    -        const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '');
    -        return Object.assign(new RegExp(`^${re}$`, flags), {
    -            _src: re,
    -            _glob: glob,
    -        });
    -    }
    -    get options() {
    -        return this.#options;
    -    }
    -    // returns the string match, the regexp source, whether there's magic
    -    // in the regexp (so a regular expression is required) and whether or
    -    // not the uflag is needed for the regular expression (for posix classes)
    -    // TODO: instead of injecting the start/end at this point, just return
    -    // the BODY of the regexp, along with the start/end portions suitable
    -    // for binding the start/end in either a joined full-path makeRe context
    -    // (where we bind to (^|/), or a standalone matchPart context (where
    -    // we bind to ^, and not /).  Otherwise slashes get duped!
    -    //
    -    // In part-matching mode, the start is:
    -    // - if not isStart: nothing
    -    // - if traversal possible, but not allowed: ^(?!\.\.?$)
    -    // - if dots allowed or not possible: ^
    -    // - if dots possible and not allowed: ^(?!\.)
    -    // end is:
    -    // - if not isEnd(): nothing
    -    // - else: $
    -    //
    -    // In full-path matching mode, we put the slash at the START of the
    -    // pattern, so start is:
    -    // - if first pattern: same as part-matching mode
    -    // - if not isStart(): nothing
    -    // - if traversal possible, but not allowed: /(?!\.\.?(?:$|/))
    -    // - if dots allowed or not possible: /
    -    // - if dots possible and not allowed: /(?!\.)
    -    // end is:
    -    // - if last pattern, same as part-matching mode
    -    // - else nothing
    -    //
    -    // Always put the (?:$|/) on negated tails, though, because that has to be
    -    // there to bind the end of the negated pattern portion, and it's easier to
    -    // just stick it in now rather than try to inject it later in the middle of
    -    // the pattern.
    -    //
    -    // We can just always return the same end, and leave it up to the caller
    -    // to know whether it's going to be used joined or in parts.
    -    // And, if the start is adjusted slightly, can do the same there:
    -    // - if not isStart: nothing
    -    // - if traversal possible, but not allowed: (?:/|^)(?!\.\.?$)
    -    // - if dots allowed or not possible: (?:/|^)
    -    // - if dots possible and not allowed: (?:/|^)(?!\.)
    -    //
    -    // But it's better to have a simpler binding without a conditional, for
    -    // performance, so probably better to return both start options.
    -    //
    -    // Then the caller just ignores the end if it's not the first pattern,
    -    // and the start always gets applied.
    -    //
    -    // But that's always going to be $ if it's the ending pattern, or nothing,
    -    // so the caller can just attach $ at the end of the pattern when building.
    -    //
    -    // So the todo is:
    -    // - better detect what kind of start is needed
    -    // - return both flavors of starting pattern
    -    // - attach $ at the end of the pattern when creating the actual RegExp
    -    //
    -    // Ah, but wait, no, that all only applies to the root when the first pattern
    -    // is not an extglob. If the first pattern IS an extglob, then we need all
    -    // that dot prevention biz to live in the extglob portions, because eg
    -    // +(*|.x*) can match .xy but not .yx.
    -    //
    -    // So, return the two flavors if it's #root and the first child is not an
    -    // AST, otherwise leave it to the child AST to handle it, and there,
    -    // use the (?:^|/) style of start binding.
    -    //
    -    // Even simplified further:
    -    // - Since the start for a join is eg /(?!\.) and the start for a part
    -    // is ^(?!\.), we can just prepend (?!\.) to the pattern (either root
    -    // or start or whatever) and prepend ^ or / at the Regexp construction.
    -    toRegExpSource(allowDot) {
    -        const dot = allowDot ?? !!this.#options.dot;
    -        if (this.#root === this)
    -            this.#fillNegs();
    -        if (!this.type) {
    -            const noEmpty = this.isStart() && this.isEnd();
    -            const src = this.#parts
    -                .map(p => {
    -                const [re, _, hasMagic, uflag] = typeof p === 'string'
    -                    ? AST.#parseGlob(p, this.#hasMagic, noEmpty)
    -                    : p.toRegExpSource(allowDot);
    -                this.#hasMagic = this.#hasMagic || hasMagic;
    -                this.#uflag = this.#uflag || uflag;
    -                return re;
    -            })
    -                .join('');
    -            let start = '';
    -            if (this.isStart()) {
    -                if (typeof this.#parts[0] === 'string') {
    -                    // this is the string that will match the start of the pattern,
    -                    // so we need to protect against dots and such.
    -                    // '.' and '..' cannot match unless the pattern is that exactly,
    -                    // even if it starts with . or dot:true is set.
    -                    const dotTravAllowed = this.#parts.length === 1 && justDots.has(this.#parts[0]);
    -                    if (!dotTravAllowed) {
    -                        const aps = addPatternStart;
    -                        // check if we have a possibility of matching . or ..,
    -                        // and prevent that.
    -                        const needNoTrav = 
    -                        // dots are allowed, and the pattern starts with [ or .
    -                        (dot && aps.has(src.charAt(0))) ||
    -                            // the pattern starts with \., and then [ or .
    -                            (src.startsWith('\\.') && aps.has(src.charAt(2))) ||
    -                            // the pattern starts with \.\., and then [ or .
    -                            (src.startsWith('\\.\\.') && aps.has(src.charAt(4)));
    -                        // no need to prevent dots if it can't match a dot, or if a
    -                        // sub-pattern will be preventing it anyway.
    -                        const needNoDot = !dot && !allowDot && aps.has(src.charAt(0));
    -                        start = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : '';
    -                    }
    -                }
    -            }
    -            // append the "end of path portion" pattern to negation tails
    -            let end = '';
    -            if (this.isEnd() &&
    -                this.#root.#filledNegs &&
    -                this.#parent?.type === '!') {
    -                end = '(?:$|\\/)';
    -            }
    -            const final = start + src + end;
    -            return [
    -                final,
    -                unescape(src),
    -                (this.#hasMagic = !!this.#hasMagic),
    -                this.#uflag,
    -            ];
    -        }
    -        // We need to calculate the body *twice* if it's a repeat pattern
    -        // at the start, once in nodot mode, then again in dot mode, so a
    -        // pattern like *(?) can match 'x.y'
    -        const repeated = this.type === '*' || this.type === '+';
    -        // some kind of extglob
    -        const start = this.type === '!' ? '(?:(?!(?:' : '(?:';
    -        let body = this.#partsToRegExp(dot);
    -        if (this.isStart() && this.isEnd() && !body && this.type !== '!') {
    -            // invalid extglob, has to at least be *something* present, if it's
    -            // the entire path portion.
    -            const s = this.toString();
    -            this.#parts = [s];
    -            this.type = null;
    -            this.#hasMagic = undefined;
    -            return [s, unescape(this.toString()), false, false];
    -        }
    -        // XXX abstract out this map method
    -        let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot
    -            ? ''
    -            : this.#partsToRegExp(true);
    -        if (bodyDotAllowed === body) {
    -            bodyDotAllowed = '';
    -        }
    -        if (bodyDotAllowed) {
    -            body = `(?:${body})(?:${bodyDotAllowed})*?`;
    -        }
    -        // an empty !() is exactly equivalent to a starNoEmpty
    -        let final = '';
    -        if (this.type === '!' && this.#emptyExt) {
    -            final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty;
    -        }
    -        else {
    -            const close = this.type === '!'
    -                ? // !() must match something,but !(x) can match ''
    -                    '))' +
    -                        (this.isStart() && !dot && !allowDot ? startNoDot : '') +
    -                        star +
    -                        ')'
    -                : this.type === '@'
    -                    ? ')'
    -                    : this.type === '?'
    -                        ? ')?'
    -                        : this.type === '+' && bodyDotAllowed
    -                            ? ')'
    -                            : this.type === '*' && bodyDotAllowed
    -                                ? `)?`
    -                                : `)${this.type}`;
    -            final = start + body + close;
    -        }
    -        return [
    -            final,
    -            unescape(body),
    -            (this.#hasMagic = !!this.#hasMagic),
    -            this.#uflag,
    -        ];
    -    }
    -    #partsToRegExp(dot) {
    -        return this.#parts
    -            .map(p => {
    -            // extglob ASTs should only contain parent ASTs
    -            /* c8 ignore start */
    -            if (typeof p === 'string') {
    -                throw new Error('string type in extglob ast??');
    -            }
    -            /* c8 ignore stop */
    -            // can ignore hasMagic, because extglobs are already always magic
    -            const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot);
    -            this.#uflag = this.#uflag || uflag;
    -            return re;
    -        })
    -            .filter(p => !(this.isStart() && this.isEnd()) || !!p)
    -            .join('|');
    -    }
    -    static #parseGlob(glob, hasMagic, noEmpty = false) {
    -        let escaping = false;
    -        let re = '';
    -        let uflag = false;
    -        for (let i = 0; i < glob.length; i++) {
    -            const c = glob.charAt(i);
    -            if (escaping) {
    -                escaping = false;
    -                re += (reSpecials.has(c) ? '\\' : '') + c;
    -                continue;
    -            }
    -            if (c === '\\') {
    -                if (i === glob.length - 1) {
    -                    re += '\\\\';
    -                }
    -                else {
    -                    escaping = true;
    -                }
    -                continue;
    -            }
    -            if (c === '[') {
    -                const [src, needUflag, consumed, magic] = parseClass(glob, i);
    -                if (consumed) {
    -                    re += src;
    -                    uflag = uflag || needUflag;
    -                    i += consumed - 1;
    -                    hasMagic = hasMagic || magic;
    -                    continue;
    -                }
    -            }
    -            if (c === '*') {
    -                if (noEmpty && glob === '*')
    -                    re += starNoEmpty;
    -                else
    -                    re += star;
    -                hasMagic = true;
    -                continue;
    -            }
    -            if (c === '?') {
    -                re += qmark;
    -                hasMagic = true;
    -                continue;
    -            }
    -            re += regExpEscape(c);
    -        }
    -        return [re, unescape(glob), !!hasMagic, uflag];
    -    }
    -}
    -//# sourceMappingURL=ast.js.map
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/esm/ast.js.map b/node_modules/minimatch/dist/esm/ast.js.map
    deleted file mode 100644
    index f1f8b34..0000000
    --- a/node_modules/minimatch/dist/esm/ast.js.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"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","sourcesContent":["// parse a single path portion\n\nimport { parseClass } from './brace-expressions.js'\nimport { MinimatchOptions, MMRegExp } from './index.js'\nimport { unescape } from './unescape.js'\n\n// classes [] are handled by the parseClass method\n// for positive extglobs, we sub-parse the contents, and combine,\n// with the appropriate regexp close.\n// for negative extglobs, we sub-parse the contents, but then\n// have to include the rest of the pattern, then the parent, etc.,\n// as the thing that cannot be because RegExp negative lookaheads\n// are different from globs.\n//\n// So for example:\n// a@(i|w!(x|y)z|j)b => ^a(i|w((!?(x|y)zb).*)z|j)b$\n//   1   2 3   4 5 6      1   2    3   46      5 6\n//\n// Assembling the extglob requires not just the negated patterns themselves,\n// but also anything following the negative patterns up to the boundary\n// of the current pattern, plus anything following in the parent pattern.\n//\n//\n// So, first, we parse the string into an AST of extglobs, without turning\n// anything into regexps yet.\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y']}, 'z'], ['j']]}, 'b']\n//\n// Then, for all the negative extglobs, we append whatever comes after in\n// each parent as their tail\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y'], 'z', 'b'}, 'z'], ['j']]}, 'b']\n//\n// Lastly, we turn each of these pieces into a regexp, and join\n//\n//                                 v----- .* because there's more following,\n//                                 v    v  otherwise, .+ because it must be\n//                                 v    v  *something* there.\n// ['^a', {@ ['i', 'w(?:(!?(?:x|y).*zb$).*)z', 'j' ]}, 'b$']\n//   copy what follows into here--^^^^^\n// ['^a', '(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)', 'b$']\n// ['^a(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)b$']\n\nexport type ExtglobType = '!' | '?' | '+' | '*' | '@'\nconst types = new Set(['!', '?', '+', '*', '@'])\nconst isExtglobType = (c: string): c is ExtglobType =>\n  types.has(c as ExtglobType)\n\n// Patterns that get prepended to bind to the start of either the\n// entire string, or just a single path portion, to prevent dots\n// and/or traversal patterns, when needed.\n// Exts don't need the ^ or / bit, because the root binds that already.\nconst startNoTraversal = '(?!(?:^|/)\\\\.\\\\.?(?:$|/))'\nconst startNoDot = '(?!\\\\.)'\n\n// characters that indicate a start of pattern needs the \"no dots\" bit,\n// because a dot *might* be matched. ( is not in the list, because in\n// the case of a child extglob, it will handle the prevention itself.\nconst addPatternStart = new Set(['[', '.'])\n// cases where traversal is A-OK, no dot prevention needed\nconst justDots = new Set(['..', '.'])\nconst reSpecials = new Set('().*{}+?[]^$\\\\!')\nconst regExpEscape = (s: string) =>\n  s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// any single thing other than /\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n// use + when we need to ensure that *something* matches, because the * is\n// the only thing in the path portion.\nconst starNoEmpty = qmark + '+?'\n\n// remove the \\ chars that we added if we end up doing a nonmagic compare\n// const deslash = (s: string) => s.replace(/\\\\(.)/g, '$1')\n\nexport class AST {\n  type: ExtglobType | null\n  readonly #root: AST\n\n  #hasMagic?: boolean\n  #uflag: boolean = false\n  #parts: (string | AST)[] = []\n  readonly #parent?: AST\n  readonly #parentIndex: number\n  #negs: AST[]\n  #filledNegs: boolean = false\n  #options: MinimatchOptions\n  #toString?: string\n  // set to true if it's an extglob with no children\n  // (which really means one child of '')\n  #emptyExt: boolean = false\n\n  constructor(\n    type: ExtglobType | null,\n    parent?: AST,\n    options: MinimatchOptions = {}\n  ) {\n    this.type = type\n    // extglobs are inherently magical\n    if (type) this.#hasMagic = true\n    this.#parent = parent\n    this.#root = this.#parent ? this.#parent.#root : this\n    this.#options = this.#root === this ? options : this.#root.#options\n    this.#negs = this.#root === this ? [] : this.#root.#negs\n    if (type === '!' && !this.#root.#filledNegs) this.#negs.push(this)\n    this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0\n  }\n\n  get hasMagic(): boolean | undefined {\n    /* c8 ignore start */\n    if (this.#hasMagic !== undefined) return this.#hasMagic\n    /* c8 ignore stop */\n    for (const p of this.#parts) {\n      if (typeof p === 'string') continue\n      if (p.type || p.hasMagic) return (this.#hasMagic = true)\n    }\n    // note: will be undefined until we generate the regexp src and find out\n    return this.#hasMagic\n  }\n\n  // reconstructs the pattern\n  toString(): string {\n    if (this.#toString !== undefined) return this.#toString\n    if (!this.type) {\n      return (this.#toString = this.#parts.map(p => String(p)).join(''))\n    } else {\n      return (this.#toString =\n        this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')')\n    }\n  }\n\n  #fillNegs() {\n    /* c8 ignore start */\n    if (this !== this.#root) throw new Error('should only call on root')\n    if (this.#filledNegs) return this\n    /* c8 ignore stop */\n\n    // call toString() once to fill this out\n    this.toString()\n    this.#filledNegs = true\n    let n: AST | undefined\n    while ((n = this.#negs.pop())) {\n      if (n.type !== '!') continue\n      // walk up the tree, appending everthing that comes AFTER parentIndex\n      let p: AST | undefined = n\n      let pp = p.#parent\n      while (pp) {\n        for (\n          let i = p.#parentIndex + 1;\n          !pp.type && i < pp.#parts.length;\n          i++\n        ) {\n          for (const part of n.#parts) {\n            /* c8 ignore start */\n            if (typeof part === 'string') {\n              throw new Error('string part in extglob AST??')\n            }\n            /* c8 ignore stop */\n            part.copyIn(pp.#parts[i])\n          }\n        }\n        p = pp\n        pp = p.#parent\n      }\n    }\n    return this\n  }\n\n  push(...parts: (string | AST)[]) {\n    for (const p of parts) {\n      if (p === '') continue\n      /* c8 ignore start */\n      if (typeof p !== 'string' && !(p instanceof AST && p.#parent === this)) {\n        throw new Error('invalid part: ' + p)\n      }\n      /* c8 ignore stop */\n      this.#parts.push(p)\n    }\n  }\n\n  toJSON() {\n    const ret: any[] =\n      this.type === null\n        ? this.#parts.slice().map(p => (typeof p === 'string' ? p : p.toJSON()))\n        : [this.type, ...this.#parts.map(p => (p as AST).toJSON())]\n    if (this.isStart() && !this.type) ret.unshift([])\n    if (\n      this.isEnd() &&\n      (this === this.#root ||\n        (this.#root.#filledNegs && this.#parent?.type === '!'))\n    ) {\n      ret.push({})\n    }\n    return ret\n  }\n\n  isStart(): boolean {\n    if (this.#root === this) return true\n    // if (this.type) return !!this.#parent?.isStart()\n    if (!this.#parent?.isStart()) return false\n    if (this.#parentIndex === 0) return true\n    // if everything AHEAD of this is a negation, then it's still the \"start\"\n    const p = this.#parent\n    for (let i = 0; i < this.#parentIndex; i++) {\n      const pp = p.#parts[i]\n      if (!(pp instanceof AST && pp.type === '!')) {\n        return false\n      }\n    }\n    return true\n  }\n\n  isEnd(): boolean {\n    if (this.#root === this) return true\n    if (this.#parent?.type === '!') return true\n    if (!this.#parent?.isEnd()) return false\n    if (!this.type) return this.#parent?.isEnd()\n    // if not root, it'll always have a parent\n    /* c8 ignore start */\n    const pl = this.#parent ? this.#parent.#parts.length : 0\n    /* c8 ignore stop */\n    return this.#parentIndex === pl - 1\n  }\n\n  copyIn(part: AST | string) {\n    if (typeof part === 'string') this.push(part)\n    else this.push(part.clone(this))\n  }\n\n  clone(parent: AST) {\n    const c = new AST(this.type, parent)\n    for (const p of this.#parts) {\n      c.copyIn(p)\n    }\n    return c\n  }\n\n  static #parseAST(\n    str: string,\n    ast: AST,\n    pos: number,\n    opt: MinimatchOptions\n  ): number {\n    let escaping = false\n    let inBrace = false\n    let braceStart = -1\n    let braceNeg = false\n    if (ast.type === null) {\n      // outside of a extglob, append until we find a start\n      let i = pos\n      let acc = ''\n      while (i < str.length) {\n        const c = str.charAt(i++)\n        // still accumulate escapes at this point, but we do ignore\n        // starts that are escaped\n        if (escaping || c === '\\\\') {\n          escaping = !escaping\n          acc += c\n          continue\n        }\n\n        if (inBrace) {\n          if (i === braceStart + 1) {\n            if (c === '^' || c === '!') {\n              braceNeg = true\n            }\n          } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n            inBrace = false\n          }\n          acc += c\n          continue\n        } else if (c === '[') {\n          inBrace = true\n          braceStart = i\n          braceNeg = false\n          acc += c\n          continue\n        }\n\n        if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') {\n          ast.push(acc)\n          acc = ''\n          const ext = new AST(c, ast)\n          i = AST.#parseAST(str, ext, i, opt)\n          ast.push(ext)\n          continue\n        }\n        acc += c\n      }\n      ast.push(acc)\n      return i\n    }\n\n    // some kind of extglob, pos is at the (\n    // find the next | or )\n    let i = pos + 1\n    let part = new AST(null, ast)\n    const parts: AST[] = []\n    let acc = ''\n    while (i < str.length) {\n      const c = str.charAt(i++)\n      // still accumulate escapes at this point, but we do ignore\n      // starts that are escaped\n      if (escaping || c === '\\\\') {\n        escaping = !escaping\n        acc += c\n        continue\n      }\n\n      if (inBrace) {\n        if (i === braceStart + 1) {\n          if (c === '^' || c === '!') {\n            braceNeg = true\n          }\n        } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n          inBrace = false\n        }\n        acc += c\n        continue\n      } else if (c === '[') {\n        inBrace = true\n        braceStart = i\n        braceNeg = false\n        acc += c\n        continue\n      }\n\n      if (isExtglobType(c) && str.charAt(i) === '(') {\n        part.push(acc)\n        acc = ''\n        const ext = new AST(c, part)\n        part.push(ext)\n        i = AST.#parseAST(str, ext, i, opt)\n        continue\n      }\n      if (c === '|') {\n        part.push(acc)\n        acc = ''\n        parts.push(part)\n        part = new AST(null, ast)\n        continue\n      }\n      if (c === ')') {\n        if (acc === '' && ast.#parts.length === 0) {\n          ast.#emptyExt = true\n        }\n        part.push(acc)\n        acc = ''\n        ast.push(...parts, part)\n        return i\n      }\n      acc += c\n    }\n\n    // unfinished extglob\n    // if we got here, it was a malformed extglob! not an extglob, but\n    // maybe something else in there.\n    ast.type = null\n    ast.#hasMagic = undefined\n    ast.#parts = [str.substring(pos - 1)]\n    return i\n  }\n\n  static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n    const ast = new AST(null, undefined, options)\n    AST.#parseAST(pattern, ast, 0, options)\n    return ast\n  }\n\n  // returns the regular expression if there's magic, or the unescaped\n  // string if not.\n  toMMPattern(): MMRegExp | string {\n    // should only be called on root\n    /* c8 ignore start */\n    if (this !== this.#root) return this.#root.toMMPattern()\n    /* c8 ignore stop */\n    const glob = this.toString()\n    const [re, body, hasMagic, uflag] = this.toRegExpSource()\n    // if we're in nocase mode, and not nocaseMagicOnly, then we do\n    // still need a regular expression if we have to case-insensitively\n    // match capital/lowercase characters.\n    const anyMagic =\n      hasMagic ||\n      this.#hasMagic ||\n      (this.#options.nocase &&\n        !this.#options.nocaseMagicOnly &&\n        glob.toUpperCase() !== glob.toLowerCase())\n    if (!anyMagic) {\n      return body\n    }\n\n    const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '')\n    return Object.assign(new RegExp(`^${re}$`, flags), {\n      _src: re,\n      _glob: glob,\n    })\n  }\n\n  get options() {\n    return this.#options\n  }\n\n  // returns the string match, the regexp source, whether there's magic\n  // in the regexp (so a regular expression is required) and whether or\n  // not the uflag is needed for the regular expression (for posix classes)\n  // TODO: instead of injecting the start/end at this point, just return\n  // the BODY of the regexp, along with the start/end portions suitable\n  // for binding the start/end in either a joined full-path makeRe context\n  // (where we bind to (^|/), or a standalone matchPart context (where\n  // we bind to ^, and not /).  Otherwise slashes get duped!\n  //\n  // In part-matching mode, the start is:\n  // - if not isStart: nothing\n  // - if traversal possible, but not allowed: ^(?!\\.\\.?$)\n  // - if dots allowed or not possible: ^\n  // - if dots possible and not allowed: ^(?!\\.)\n  // end is:\n  // - if not isEnd(): nothing\n  // - else: $\n  //\n  // In full-path matching mode, we put the slash at the START of the\n  // pattern, so start is:\n  // - if first pattern: same as part-matching mode\n  // - if not isStart(): nothing\n  // - if traversal possible, but not allowed: /(?!\\.\\.?(?:$|/))\n  // - if dots allowed or not possible: /\n  // - if dots possible and not allowed: /(?!\\.)\n  // end is:\n  // - if last pattern, same as part-matching mode\n  // - else nothing\n  //\n  // Always put the (?:$|/) on negated tails, though, because that has to be\n  // there to bind the end of the negated pattern portion, and it's easier to\n  // just stick it in now rather than try to inject it later in the middle of\n  // the pattern.\n  //\n  // We can just always return the same end, and leave it up to the caller\n  // to know whether it's going to be used joined or in parts.\n  // And, if the start is adjusted slightly, can do the same there:\n  // - if not isStart: nothing\n  // - if traversal possible, but not allowed: (?:/|^)(?!\\.\\.?$)\n  // - if dots allowed or not possible: (?:/|^)\n  // - if dots possible and not allowed: (?:/|^)(?!\\.)\n  //\n  // But it's better to have a simpler binding without a conditional, for\n  // performance, so probably better to return both start options.\n  //\n  // Then the caller just ignores the end if it's not the first pattern,\n  // and the start always gets applied.\n  //\n  // But that's always going to be $ if it's the ending pattern, or nothing,\n  // so the caller can just attach $ at the end of the pattern when building.\n  //\n  // So the todo is:\n  // - better detect what kind of start is needed\n  // - return both flavors of starting pattern\n  // - attach $ at the end of the pattern when creating the actual RegExp\n  //\n  // Ah, but wait, no, that all only applies to the root when the first pattern\n  // is not an extglob. If the first pattern IS an extglob, then we need all\n  // that dot prevention biz to live in the extglob portions, because eg\n  // +(*|.x*) can match .xy but not .yx.\n  //\n  // So, return the two flavors if it's #root and the first child is not an\n  // AST, otherwise leave it to the child AST to handle it, and there,\n  // use the (?:^|/) style of start binding.\n  //\n  // Even simplified further:\n  // - Since the start for a join is eg /(?!\\.) and the start for a part\n  // is ^(?!\\.), we can just prepend (?!\\.) to the pattern (either root\n  // or start or whatever) and prepend ^ or / at the Regexp construction.\n  toRegExpSource(\n    allowDot?: boolean\n  ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n    const dot = allowDot ?? !!this.#options.dot\n    if (this.#root === this) this.#fillNegs()\n    if (!this.type) {\n      const noEmpty = this.isStart() && this.isEnd()\n      const src = this.#parts\n        .map(p => {\n          const [re, _, hasMagic, uflag] =\n            typeof p === 'string'\n              ? AST.#parseGlob(p, this.#hasMagic, noEmpty)\n              : p.toRegExpSource(allowDot)\n          this.#hasMagic = this.#hasMagic || hasMagic\n          this.#uflag = this.#uflag || uflag\n          return re\n        })\n        .join('')\n\n      let start = ''\n      if (this.isStart()) {\n        if (typeof this.#parts[0] === 'string') {\n          // this is the string that will match the start of the pattern,\n          // so we need to protect against dots and such.\n\n          // '.' and '..' cannot match unless the pattern is that exactly,\n          // even if it starts with . or dot:true is set.\n          const dotTravAllowed =\n            this.#parts.length === 1 && justDots.has(this.#parts[0])\n          if (!dotTravAllowed) {\n            const aps = addPatternStart\n            // check if we have a possibility of matching . or ..,\n            // and prevent that.\n            const needNoTrav =\n              // dots are allowed, and the pattern starts with [ or .\n              (dot && aps.has(src.charAt(0))) ||\n              // the pattern starts with \\., and then [ or .\n              (src.startsWith('\\\\.') && aps.has(src.charAt(2))) ||\n              // the pattern starts with \\.\\., and then [ or .\n              (src.startsWith('\\\\.\\\\.') && aps.has(src.charAt(4)))\n            // no need to prevent dots if it can't match a dot, or if a\n            // sub-pattern will be preventing it anyway.\n            const needNoDot = !dot && !allowDot && aps.has(src.charAt(0))\n\n            start = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : ''\n          }\n        }\n      }\n\n      // append the \"end of path portion\" pattern to negation tails\n      let end = ''\n      if (\n        this.isEnd() &&\n        this.#root.#filledNegs &&\n        this.#parent?.type === '!'\n      ) {\n        end = '(?:$|\\\\/)'\n      }\n      const final = start + src + end\n      return [\n        final,\n        unescape(src),\n        (this.#hasMagic = !!this.#hasMagic),\n        this.#uflag,\n      ]\n    }\n\n    // We need to calculate the body *twice* if it's a repeat pattern\n    // at the start, once in nodot mode, then again in dot mode, so a\n    // pattern like *(?) can match 'x.y'\n\n    const repeated = this.type === '*' || this.type === '+'\n    // some kind of extglob\n    const start = this.type === '!' ? '(?:(?!(?:' : '(?:'\n    let body = this.#partsToRegExp(dot)\n\n    if (this.isStart() && this.isEnd() && !body && this.type !== '!') {\n      // invalid extglob, has to at least be *something* present, if it's\n      // the entire path portion.\n      const s = this.toString()\n      this.#parts = [s]\n      this.type = null\n      this.#hasMagic = undefined\n      return [s, unescape(this.toString()), false, false]\n    }\n\n    // XXX abstract out this map method\n    let bodyDotAllowed =\n      !repeated || allowDot || dot || !startNoDot\n        ? ''\n        : this.#partsToRegExp(true)\n    if (bodyDotAllowed === body) {\n      bodyDotAllowed = ''\n    }\n    if (bodyDotAllowed) {\n      body = `(?:${body})(?:${bodyDotAllowed})*?`\n    }\n\n    // an empty !() is exactly equivalent to a starNoEmpty\n    let final = ''\n    if (this.type === '!' && this.#emptyExt) {\n      final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty\n    } else {\n      const close =\n        this.type === '!'\n          ? // !() must match something,but !(x) can match ''\n            '))' +\n            (this.isStart() && !dot && !allowDot ? startNoDot : '') +\n            star +\n            ')'\n          : this.type === '@'\n          ? ')'\n          : this.type === '?'\n          ? ')?'\n          : this.type === '+' && bodyDotAllowed\n          ? ')'\n          : this.type === '*' && bodyDotAllowed\n          ? `)?`\n          : `)${this.type}`\n      final = start + body + close\n    }\n    return [\n      final,\n      unescape(body),\n      (this.#hasMagic = !!this.#hasMagic),\n      this.#uflag,\n    ]\n  }\n\n  #partsToRegExp(dot: boolean) {\n    return this.#parts\n      .map(p => {\n        // extglob ASTs should only contain parent ASTs\n        /* c8 ignore start */\n        if (typeof p === 'string') {\n          throw new Error('string type in extglob ast??')\n        }\n        /* c8 ignore stop */\n        // can ignore hasMagic, because extglobs are already always magic\n        const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot)\n        this.#uflag = this.#uflag || uflag\n        return re\n      })\n      .filter(p => !(this.isStart() && this.isEnd()) || !!p)\n      .join('|')\n  }\n\n  static #parseGlob(\n    glob: string,\n    hasMagic: boolean | undefined,\n    noEmpty: boolean = false\n  ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n    let escaping = false\n    let re = ''\n    let uflag = false\n    for (let i = 0; i < glob.length; i++) {\n      const c = glob.charAt(i)\n      if (escaping) {\n        escaping = false\n        re += (reSpecials.has(c) ? '\\\\' : '') + c\n        continue\n      }\n      if (c === '\\\\') {\n        if (i === glob.length - 1) {\n          re += '\\\\\\\\'\n        } else {\n          escaping = true\n        }\n        continue\n      }\n      if (c === '[') {\n        const [src, needUflag, consumed, magic] = parseClass(glob, i)\n        if (consumed) {\n          re += src\n          uflag = uflag || needUflag\n          i += consumed - 1\n          hasMagic = hasMagic || magic\n          continue\n        }\n      }\n      if (c === '*') {\n        if (noEmpty && glob === '*') re += starNoEmpty\n        else re += star\n        hasMagic = true\n        continue\n      }\n      if (c === '?') {\n        re += qmark\n        hasMagic = true\n        continue\n      }\n      re += regExpEscape(c)\n    }\n    return [re, unescape(glob), !!hasMagic, uflag]\n  }\n}\n"]}
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/esm/brace-expressions.d.ts b/node_modules/minimatch/dist/esm/brace-expressions.d.ts
    deleted file mode 100644
    index b1572de..0000000
    --- a/node_modules/minimatch/dist/esm/brace-expressions.d.ts
    +++ /dev/null
    @@ -1,8 +0,0 @@
    -export type ParseClassResult = [
    -    src: string,
    -    uFlag: boolean,
    -    consumed: number,
    -    hasMagic: boolean
    -];
    -export declare const parseClass: (glob: string, position: number) => ParseClassResult;
    -//# sourceMappingURL=brace-expressions.d.ts.map
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/esm/brace-expressions.d.ts.map b/node_modules/minimatch/dist/esm/brace-expressions.d.ts.map
    deleted file mode 100644
    index d394964..0000000
    --- a/node_modules/minimatch/dist/esm/brace-expressions.d.ts.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"brace-expressions.d.ts","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"AA+BA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,OAAO;CAClB,CAAA;AAQD,eAAO,MAAM,UAAU,SACf,MAAM,YACF,MAAM,qBA8HjB,CAAA"}
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/esm/brace-expressions.js b/node_modules/minimatch/dist/esm/brace-expressions.js
    deleted file mode 100644
    index c629d6a..0000000
    --- a/node_modules/minimatch/dist/esm/brace-expressions.js
    +++ /dev/null
    @@ -1,148 +0,0 @@
    -// translate the various posix character classes into unicode properties
    -// this works across all unicode locales
    -// { : [, /u flag required, negated]
    -const posixClasses = {
    -    '[:alnum:]': ['\\p{L}\\p{Nl}\\p{Nd}', true],
    -    '[:alpha:]': ['\\p{L}\\p{Nl}', true],
    -    '[:ascii:]': ['\\x' + '00-\\x' + '7f', false],
    -    '[:blank:]': ['\\p{Zs}\\t', true],
    -    '[:cntrl:]': ['\\p{Cc}', true],
    -    '[:digit:]': ['\\p{Nd}', true],
    -    '[:graph:]': ['\\p{Z}\\p{C}', true, true],
    -    '[:lower:]': ['\\p{Ll}', true],
    -    '[:print:]': ['\\p{C}', true],
    -    '[:punct:]': ['\\p{P}', true],
    -    '[:space:]': ['\\p{Z}\\t\\r\\n\\v\\f', true],
    -    '[:upper:]': ['\\p{Lu}', true],
    -    '[:word:]': ['\\p{L}\\p{Nl}\\p{Nd}\\p{Pc}', true],
    -    '[:xdigit:]': ['A-Fa-f0-9', false],
    -};
    -// only need to escape a few things inside of brace expressions
    -// escapes: [ \ ] -
    -const braceEscape = (s) => s.replace(/[[\]\\-]/g, '\\$&');
    -// escape all regexp magic characters
    -const regexpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
    -// everything has already been escaped, we just have to join
    -const rangesToString = (ranges) => ranges.join('');
    -// takes a glob string at a posix brace expression, and returns
    -// an equivalent regular expression source, and boolean indicating
    -// whether the /u flag needs to be applied, and the number of chars
    -// consumed to parse the character class.
    -// This also removes out of order ranges, and returns ($.) if the
    -// entire class just no good.
    -export const parseClass = (glob, position) => {
    -    const pos = position;
    -    /* c8 ignore start */
    -    if (glob.charAt(pos) !== '[') {
    -        throw new Error('not in a brace expression');
    -    }
    -    /* c8 ignore stop */
    -    const ranges = [];
    -    const negs = [];
    -    let i = pos + 1;
    -    let sawStart = false;
    -    let uflag = false;
    -    let escaping = false;
    -    let negate = false;
    -    let endPos = pos;
    -    let rangeStart = '';
    -    WHILE: while (i < glob.length) {
    -        const c = glob.charAt(i);
    -        if ((c === '!' || c === '^') && i === pos + 1) {
    -            negate = true;
    -            i++;
    -            continue;
    -        }
    -        if (c === ']' && sawStart && !escaping) {
    -            endPos = i + 1;
    -            break;
    -        }
    -        sawStart = true;
    -        if (c === '\\') {
    -            if (!escaping) {
    -                escaping = true;
    -                i++;
    -                continue;
    -            }
    -            // escaped \ char, fall through and treat like normal char
    -        }
    -        if (c === '[' && !escaping) {
    -            // either a posix class, a collation equivalent, or just a [
    -            for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {
    -                if (glob.startsWith(cls, i)) {
    -                    // invalid, [a-[] is fine, but not [a-[:alpha]]
    -                    if (rangeStart) {
    -                        return ['$.', false, glob.length - pos, true];
    -                    }
    -                    i += cls.length;
    -                    if (neg)
    -                        negs.push(unip);
    -                    else
    -                        ranges.push(unip);
    -                    uflag = uflag || u;
    -                    continue WHILE;
    -                }
    -            }
    -        }
    -        // now it's just a normal character, effectively
    -        escaping = false;
    -        if (rangeStart) {
    -            // throw this range away if it's not valid, but others
    -            // can still match.
    -            if (c > rangeStart) {
    -                ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c));
    -            }
    -            else if (c === rangeStart) {
    -                ranges.push(braceEscape(c));
    -            }
    -            rangeStart = '';
    -            i++;
    -            continue;
    -        }
    -        // now might be the start of a range.
    -        // can be either c-d or c-] or c] or c] at this point
    -        if (glob.startsWith('-]', i + 1)) {
    -            ranges.push(braceEscape(c + '-'));
    -            i += 2;
    -            continue;
    -        }
    -        if (glob.startsWith('-', i + 1)) {
    -            rangeStart = c;
    -            i += 2;
    -            continue;
    -        }
    -        // not the start of a range, just a single character
    -        ranges.push(braceEscape(c));
    -        i++;
    -    }
    -    if (endPos < i) {
    -        // didn't see the end of the class, not a valid class,
    -        // but might still be valid as a literal match.
    -        return ['', false, 0, false];
    -    }
    -    // if we got no ranges and no negates, then we have a range that
    -    // cannot possibly match anything, and that poisons the whole glob
    -    if (!ranges.length && !negs.length) {
    -        return ['$.', false, glob.length - pos, true];
    -    }
    -    // if we got one positive range, and it's a single character, then that's
    -    // not actually a magic pattern, it's just that one literal character.
    -    // we should not treat that as "magic", we should just return the literal
    -    // character. [_] is a perfectly valid way to escape glob magic chars.
    -    if (negs.length === 0 &&
    -        ranges.length === 1 &&
    -        /^\\?.$/.test(ranges[0]) &&
    -        !negate) {
    -        const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0];
    -        return [regexpEscape(r), false, endPos - pos, false];
    -    }
    -    const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']';
    -    const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']';
    -    const comb = ranges.length && negs.length
    -        ? '(' + sranges + '|' + snegs + ')'
    -        : ranges.length
    -            ? sranges
    -            : snegs;
    -    return [comb, uflag, endPos - pos, true];
    -};
    -//# sourceMappingURL=brace-expressions.js.map
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/esm/brace-expressions.js.map b/node_modules/minimatch/dist/esm/brace-expressions.js.map
    deleted file mode 100644
    index cdba30d..0000000
    --- a/node_modules/minimatch/dist/esm/brace-expressions.js.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"brace-expressions.js","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"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","sourcesContent":["// translate the various posix character classes into unicode properties\n// this works across all unicode locales\n\n// { : [, /u flag required, negated]\nconst posixClasses: { [k: string]: [e: string, u: boolean, n?: boolean] } = {\n  '[:alnum:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}', true],\n  '[:alpha:]': ['\\\\p{L}\\\\p{Nl}', true],\n  '[:ascii:]': ['\\\\x' + '00-\\\\x' + '7f', false],\n  '[:blank:]': ['\\\\p{Zs}\\\\t', true],\n  '[:cntrl:]': ['\\\\p{Cc}', true],\n  '[:digit:]': ['\\\\p{Nd}', true],\n  '[:graph:]': ['\\\\p{Z}\\\\p{C}', true, true],\n  '[:lower:]': ['\\\\p{Ll}', true],\n  '[:print:]': ['\\\\p{C}', true],\n  '[:punct:]': ['\\\\p{P}', true],\n  '[:space:]': ['\\\\p{Z}\\\\t\\\\r\\\\n\\\\v\\\\f', true],\n  '[:upper:]': ['\\\\p{Lu}', true],\n  '[:word:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}\\\\p{Pc}', true],\n  '[:xdigit:]': ['A-Fa-f0-9', false],\n}\n\n// only need to escape a few things inside of brace expressions\n// escapes: [ \\ ] -\nconst braceEscape = (s: string) => s.replace(/[[\\]\\\\-]/g, '\\\\$&')\n// escape all regexp magic characters\nconst regexpEscape = (s: string) =>\n  s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// everything has already been escaped, we just have to join\nconst rangesToString = (ranges: string[]): string => ranges.join('')\n\nexport type ParseClassResult = [\n  src: string,\n  uFlag: boolean,\n  consumed: number,\n  hasMagic: boolean\n]\n\n// takes a glob string at a posix brace expression, and returns\n// an equivalent regular expression source, and boolean indicating\n// whether the /u flag needs to be applied, and the number of chars\n// consumed to parse the character class.\n// This also removes out of order ranges, and returns ($.) if the\n// entire class just no good.\nexport const parseClass = (\n  glob: string,\n  position: number\n): ParseClassResult => {\n  const pos = position\n  /* c8 ignore start */\n  if (glob.charAt(pos) !== '[') {\n    throw new Error('not in a brace expression')\n  }\n  /* c8 ignore stop */\n  const ranges: string[] = []\n  const negs: string[] = []\n\n  let i = pos + 1\n  let sawStart = false\n  let uflag = false\n  let escaping = false\n  let negate = false\n  let endPos = pos\n  let rangeStart = ''\n  WHILE: while (i < glob.length) {\n    const c = glob.charAt(i)\n    if ((c === '!' || c === '^') && i === pos + 1) {\n      negate = true\n      i++\n      continue\n    }\n\n    if (c === ']' && sawStart && !escaping) {\n      endPos = i + 1\n      break\n    }\n\n    sawStart = true\n    if (c === '\\\\') {\n      if (!escaping) {\n        escaping = true\n        i++\n        continue\n      }\n      // escaped \\ char, fall through and treat like normal char\n    }\n    if (c === '[' && !escaping) {\n      // either a posix class, a collation equivalent, or just a [\n      for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {\n        if (glob.startsWith(cls, i)) {\n          // invalid, [a-[] is fine, but not [a-[:alpha]]\n          if (rangeStart) {\n            return ['$.', false, glob.length - pos, true]\n          }\n          i += cls.length\n          if (neg) negs.push(unip)\n          else ranges.push(unip)\n          uflag = uflag || u\n          continue WHILE\n        }\n      }\n    }\n\n    // now it's just a normal character, effectively\n    escaping = false\n    if (rangeStart) {\n      // throw this range away if it's not valid, but others\n      // can still match.\n      if (c > rangeStart) {\n        ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c))\n      } else if (c === rangeStart) {\n        ranges.push(braceEscape(c))\n      }\n      rangeStart = ''\n      i++\n      continue\n    }\n\n    // now might be the start of a range.\n    // can be either c-d or c-] or c] or c] at this point\n    if (glob.startsWith('-]', i + 1)) {\n      ranges.push(braceEscape(c + '-'))\n      i += 2\n      continue\n    }\n    if (glob.startsWith('-', i + 1)) {\n      rangeStart = c\n      i += 2\n      continue\n    }\n\n    // not the start of a range, just a single character\n    ranges.push(braceEscape(c))\n    i++\n  }\n\n  if (endPos < i) {\n    // didn't see the end of the class, not a valid class,\n    // but might still be valid as a literal match.\n    return ['', false, 0, false]\n  }\n\n  // if we got no ranges and no negates, then we have a range that\n  // cannot possibly match anything, and that poisons the whole glob\n  if (!ranges.length && !negs.length) {\n    return ['$.', false, glob.length - pos, true]\n  }\n\n  // if we got one positive range, and it's a single character, then that's\n  // not actually a magic pattern, it's just that one literal character.\n  // we should not treat that as \"magic\", we should just return the literal\n  // character. [_] is a perfectly valid way to escape glob magic chars.\n  if (\n    negs.length === 0 &&\n    ranges.length === 1 &&\n    /^\\\\?.$/.test(ranges[0]) &&\n    !negate\n  ) {\n    const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0]\n    return [regexpEscape(r), false, endPos - pos, false]\n  }\n\n  const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']'\n  const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']'\n  const comb =\n    ranges.length && negs.length\n      ? '(' + sranges + '|' + snegs + ')'\n      : ranges.length\n      ? sranges\n      : snegs\n\n  return [comb, uflag, endPos - pos, true]\n}\n"]}
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/esm/escape.d.ts b/node_modules/minimatch/dist/esm/escape.d.ts
    deleted file mode 100644
    index dc3e316..0000000
    --- a/node_modules/minimatch/dist/esm/escape.d.ts
    +++ /dev/null
    @@ -1,12 +0,0 @@
    -import { MinimatchOptions } from './index.js';
    -/**
    - * Escape all magic characters in a glob pattern.
    - *
    - * If the {@link windowsPathsNoEscape | GlobOptions.windowsPathsNoEscape}
    - * option is used, then characters are escaped by wrapping in `[]`, because
    - * a magic character wrapped in a character class can only be satisfied by
    - * that exact character.  In this mode, `\` is _not_ escaped, because it is
    - * not interpreted as a magic character, but instead as a path separator.
    - */
    -export declare const escape: (s: string, { windowsPathsNoEscape, }?: Pick) => string;
    -//# sourceMappingURL=escape.d.ts.map
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/esm/escape.d.ts.map b/node_modules/minimatch/dist/esm/escape.d.ts.map
    deleted file mode 100644
    index 0779dae..0000000
    --- a/node_modules/minimatch/dist/esm/escape.d.ts.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"escape.d.ts","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC7C;;;;;;;;GAQG;AACH,eAAO,MAAM,MAAM,MACd,MAAM,8BAGN,KAAK,gBAAgB,EAAE,sBAAsB,CAAC,WAQlD,CAAA"}
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/esm/escape.js b/node_modules/minimatch/dist/esm/escape.js
    deleted file mode 100644
    index 16f7c8c..0000000
    --- a/node_modules/minimatch/dist/esm/escape.js
    +++ /dev/null
    @@ -1,18 +0,0 @@
    -/**
    - * Escape all magic characters in a glob pattern.
    - *
    - * If the {@link windowsPathsNoEscape | GlobOptions.windowsPathsNoEscape}
    - * option is used, then characters are escaped by wrapping in `[]`, because
    - * a magic character wrapped in a character class can only be satisfied by
    - * that exact character.  In this mode, `\` is _not_ escaped, because it is
    - * not interpreted as a magic character, but instead as a path separator.
    - */
    -export const escape = (s, { windowsPathsNoEscape = false, } = {}) => {
    -    // don't need to escape +@! because we escape the parens
    -    // that make those magic, and escaping ! as [!] isn't valid,
    -    // because [!]] is a valid glob class meaning not ']'.
    -    return windowsPathsNoEscape
    -        ? s.replace(/[?*()[\]]/g, '[$&]')
    -        : s.replace(/[?*()[\]\\]/g, '\\$&');
    -};
    -//# sourceMappingURL=escape.js.map
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/esm/escape.js.map b/node_modules/minimatch/dist/esm/escape.js.map
    deleted file mode 100644
    index 170fd1a..0000000
    --- a/node_modules/minimatch/dist/esm/escape.js.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"escape.js","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CACpB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,MACsB,EAAE,EACtD,EAAE;IACF,wDAAwD;IACxD,4DAA4D;IAC5D,sDAAsD;IACtD,OAAO,oBAAoB;QACzB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC;QACjC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;AACvC,CAAC,CAAA","sourcesContent":["import { MinimatchOptions } from './index.js'\n/**\n * Escape all magic characters in a glob pattern.\n *\n * If the {@link windowsPathsNoEscape | GlobOptions.windowsPathsNoEscape}\n * option is used, then characters are escaped by wrapping in `[]`, because\n * a magic character wrapped in a character class can only be satisfied by\n * that exact character.  In this mode, `\\` is _not_ escaped, because it is\n * not interpreted as a magic character, but instead as a path separator.\n */\nexport const escape = (\n  s: string,\n  {\n    windowsPathsNoEscape = false,\n  }: Pick = {}\n) => {\n  // don't need to escape +@! because we escape the parens\n  // that make those magic, and escaping ! as [!] isn't valid,\n  // because [!]] is a valid glob class meaning not ']'.\n  return windowsPathsNoEscape\n    ? s.replace(/[?*()[\\]]/g, '[$&]')\n    : s.replace(/[?*()[\\]\\\\]/g, '\\\\$&')\n}\n"]}
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/esm/index.d.ts b/node_modules/minimatch/dist/esm/index.d.ts
    deleted file mode 100644
    index 41d16a9..0000000
    --- a/node_modules/minimatch/dist/esm/index.d.ts
    +++ /dev/null
    @@ -1,94 +0,0 @@
    -import { AST } from './ast.js';
    -type Platform = 'aix' | 'android' | 'darwin' | 'freebsd' | 'haiku' | 'linux' | 'openbsd' | 'sunos' | 'win32' | 'cygwin' | 'netbsd';
    -export interface MinimatchOptions {
    -    nobrace?: boolean;
    -    nocomment?: boolean;
    -    nonegate?: boolean;
    -    debug?: boolean;
    -    noglobstar?: boolean;
    -    noext?: boolean;
    -    nonull?: boolean;
    -    windowsPathsNoEscape?: boolean;
    -    allowWindowsEscape?: boolean;
    -    partial?: boolean;
    -    dot?: boolean;
    -    nocase?: boolean;
    -    nocaseMagicOnly?: boolean;
    -    magicalBraces?: boolean;
    -    matchBase?: boolean;
    -    flipNegate?: boolean;
    -    preserveMultipleSlashes?: boolean;
    -    optimizationLevel?: number;
    -    platform?: Platform;
    -    windowsNoMagicRoot?: boolean;
    -}
    -export declare const minimatch: {
    -    (p: string, pattern: string, options?: MinimatchOptions): boolean;
    -    sep: Sep;
    -    GLOBSTAR: typeof GLOBSTAR;
    -    filter: (pattern: string, options?: MinimatchOptions) => (p: string) => boolean;
    -    defaults: (def: MinimatchOptions) => typeof minimatch;
    -    braceExpand: (pattern: string, options?: MinimatchOptions) => string[];
    -    makeRe: (pattern: string, options?: MinimatchOptions) => false | MMRegExp;
    -    match: (list: string[], pattern: string, options?: MinimatchOptions) => string[];
    -    AST: typeof AST;
    -    Minimatch: typeof Minimatch;
    -    escape: (s: string, { windowsPathsNoEscape, }?: Pick) => string;
    -    unescape: (s: string, { windowsPathsNoEscape, }?: Pick) => string;
    -};
    -type Sep = '\\' | '/';
    -export declare const sep: Sep;
    -export declare const GLOBSTAR: unique symbol;
    -export declare const filter: (pattern: string, options?: MinimatchOptions) => (p: string) => boolean;
    -export declare const defaults: (def: MinimatchOptions) => typeof minimatch;
    -export declare const braceExpand: (pattern: string, options?: MinimatchOptions) => string[];
    -export declare const makeRe: (pattern: string, options?: MinimatchOptions) => false | MMRegExp;
    -export declare const match: (list: string[], pattern: string, options?: MinimatchOptions) => string[];
    -export type MMRegExp = RegExp & {
    -    _src?: string;
    -    _glob?: string;
    -};
    -export type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR;
    -export type ParseReturn = ParseReturnFiltered | false;
    -export declare class Minimatch {
    -    options: MinimatchOptions;
    -    set: ParseReturnFiltered[][];
    -    pattern: string;
    -    windowsPathsNoEscape: boolean;
    -    nonegate: boolean;
    -    negate: boolean;
    -    comment: boolean;
    -    empty: boolean;
    -    preserveMultipleSlashes: boolean;
    -    partial: boolean;
    -    globSet: string[];
    -    globParts: string[][];
    -    nocase: boolean;
    -    isWindows: boolean;
    -    platform: Platform;
    -    windowsNoMagicRoot: boolean;
    -    regexp: false | null | MMRegExp;
    -    constructor(pattern: string, options?: MinimatchOptions);
    -    hasMagic(): boolean;
    -    debug(..._: any[]): void;
    -    make(): void;
    -    preprocess(globParts: string[][]): string[][];
    -    adjascentGlobstarOptimize(globParts: string[][]): string[][];
    -    levelOneOptimize(globParts: string[][]): string[][];
    -    levelTwoFileOptimize(parts: string | string[]): string[];
    -    firstPhasePreProcess(globParts: string[][]): string[][];
    -    secondPhasePreProcess(globParts: string[][]): string[][];
    -    partsMatch(a: string[], b: string[], emptyGSMatch?: boolean): false | string[];
    -    parseNegate(): void;
    -    matchOne(file: string[], pattern: ParseReturn[], partial?: boolean): boolean;
    -    braceExpand(): string[];
    -    parse(pattern: string): ParseReturn;
    -    makeRe(): false | MMRegExp;
    -    slashSplit(p: string): string[];
    -    match(f: string, partial?: boolean): boolean;
    -    static defaults(def: MinimatchOptions): typeof Minimatch;
    -}
    -export { AST } from './ast.js';
    -export { escape } from './escape.js';
    -export { unescape } from './unescape.js';
    -//# sourceMappingURL=index.d.ts.map
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/esm/index.d.ts.map b/node_modules/minimatch/dist/esm/index.d.ts.map
    deleted file mode 100644
    index 195491d..0000000
    --- a/node_modules/minimatch/dist/esm/index.d.ts.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/esm/index.js b/node_modules/minimatch/dist/esm/index.js
    deleted file mode 100644
    index 84b577b..0000000
    --- a/node_modules/minimatch/dist/esm/index.js
    +++ /dev/null
    @@ -1,1001 +0,0 @@
    -import expand from 'brace-expansion';
    -import { assertValidPattern } from './assert-valid-pattern.js';
    -import { AST } from './ast.js';
    -import { escape } from './escape.js';
    -import { unescape } from './unescape.js';
    -export const minimatch = (p, pattern, options = {}) => {
    -    assertValidPattern(pattern);
    -    // shortcut: comments match nothing.
    -    if (!options.nocomment && pattern.charAt(0) === '#') {
    -        return false;
    -    }
    -    return new Minimatch(pattern, options).match(p);
    -};
    -// Optimized checking for the most common glob patterns.
    -const starDotExtRE = /^\*+([^+@!?\*\[\(]*)$/;
    -const starDotExtTest = (ext) => (f) => !f.startsWith('.') && f.endsWith(ext);
    -const starDotExtTestDot = (ext) => (f) => f.endsWith(ext);
    -const starDotExtTestNocase = (ext) => {
    -    ext = ext.toLowerCase();
    -    return (f) => !f.startsWith('.') && f.toLowerCase().endsWith(ext);
    -};
    -const starDotExtTestNocaseDot = (ext) => {
    -    ext = ext.toLowerCase();
    -    return (f) => f.toLowerCase().endsWith(ext);
    -};
    -const starDotStarRE = /^\*+\.\*+$/;
    -const starDotStarTest = (f) => !f.startsWith('.') && f.includes('.');
    -const starDotStarTestDot = (f) => f !== '.' && f !== '..' && f.includes('.');
    -const dotStarRE = /^\.\*+$/;
    -const dotStarTest = (f) => f !== '.' && f !== '..' && f.startsWith('.');
    -const starRE = /^\*+$/;
    -const starTest = (f) => f.length !== 0 && !f.startsWith('.');
    -const starTestDot = (f) => f.length !== 0 && f !== '.' && f !== '..';
    -const qmarksRE = /^\?+([^+@!?\*\[\(]*)?$/;
    -const qmarksTestNocase = ([$0, ext = '']) => {
    -    const noext = qmarksTestNoExt([$0]);
    -    if (!ext)
    -        return noext;
    -    ext = ext.toLowerCase();
    -    return (f) => noext(f) && f.toLowerCase().endsWith(ext);
    -};
    -const qmarksTestNocaseDot = ([$0, ext = '']) => {
    -    const noext = qmarksTestNoExtDot([$0]);
    -    if (!ext)
    -        return noext;
    -    ext = ext.toLowerCase();
    -    return (f) => noext(f) && f.toLowerCase().endsWith(ext);
    -};
    -const qmarksTestDot = ([$0, ext = '']) => {
    -    const noext = qmarksTestNoExtDot([$0]);
    -    return !ext ? noext : (f) => noext(f) && f.endsWith(ext);
    -};
    -const qmarksTest = ([$0, ext = '']) => {
    -    const noext = qmarksTestNoExt([$0]);
    -    return !ext ? noext : (f) => noext(f) && f.endsWith(ext);
    -};
    -const qmarksTestNoExt = ([$0]) => {
    -    const len = $0.length;
    -    return (f) => f.length === len && !f.startsWith('.');
    -};
    -const qmarksTestNoExtDot = ([$0]) => {
    -    const len = $0.length;
    -    return (f) => f.length === len && f !== '.' && f !== '..';
    -};
    -/* c8 ignore start */
    -const defaultPlatform = (typeof process === 'object' && process
    -    ? (typeof process.env === 'object' &&
    -        process.env &&
    -        process.env.__MINIMATCH_TESTING_PLATFORM__) ||
    -        process.platform
    -    : 'posix');
    -const path = {
    -    win32: { sep: '\\' },
    -    posix: { sep: '/' },
    -};
    -/* c8 ignore stop */
    -export const sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep;
    -minimatch.sep = sep;
    -export const GLOBSTAR = Symbol('globstar **');
    -minimatch.GLOBSTAR = GLOBSTAR;
    -// any single thing other than /
    -// don't need to escape / when using new RegExp()
    -const qmark = '[^/]';
    -// * => any number of characters
    -const star = qmark + '*?';
    -// ** when dots are allowed.  Anything goes, except .. and .
    -// not (^ or / followed by one or two dots followed by $ or /),
    -// followed by anything, any number of times.
    -const twoStarDot = '(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?';
    -// not a ^ or / followed by a dot,
    -// followed by anything, any number of times.
    -const twoStarNoDot = '(?:(?!(?:\\/|^)\\.).)*?';
    -export const filter = (pattern, options = {}) => (p) => minimatch(p, pattern, options);
    -minimatch.filter = filter;
    -const ext = (a, b = {}) => Object.assign({}, a, b);
    -export const defaults = (def) => {
    -    if (!def || typeof def !== 'object' || !Object.keys(def).length) {
    -        return minimatch;
    -    }
    -    const orig = minimatch;
    -    const m = (p, pattern, options = {}) => orig(p, pattern, ext(def, options));
    -    return Object.assign(m, {
    -        Minimatch: class Minimatch extends orig.Minimatch {
    -            constructor(pattern, options = {}) {
    -                super(pattern, ext(def, options));
    -            }
    -            static defaults(options) {
    -                return orig.defaults(ext(def, options)).Minimatch;
    -            }
    -        },
    -        AST: class AST extends orig.AST {
    -            /* c8 ignore start */
    -            constructor(type, parent, options = {}) {
    -                super(type, parent, ext(def, options));
    -            }
    -            /* c8 ignore stop */
    -            static fromGlob(pattern, options = {}) {
    -                return orig.AST.fromGlob(pattern, ext(def, options));
    -            }
    -        },
    -        unescape: (s, options = {}) => orig.unescape(s, ext(def, options)),
    -        escape: (s, options = {}) => orig.escape(s, ext(def, options)),
    -        filter: (pattern, options = {}) => orig.filter(pattern, ext(def, options)),
    -        defaults: (options) => orig.defaults(ext(def, options)),
    -        makeRe: (pattern, options = {}) => orig.makeRe(pattern, ext(def, options)),
    -        braceExpand: (pattern, options = {}) => orig.braceExpand(pattern, ext(def, options)),
    -        match: (list, pattern, options = {}) => orig.match(list, pattern, ext(def, options)),
    -        sep: orig.sep,
    -        GLOBSTAR: GLOBSTAR,
    -    });
    -};
    -minimatch.defaults = defaults;
    -// Brace expansion:
    -// a{b,c}d -> abd acd
    -// a{b,}c -> abc ac
    -// a{0..3}d -> a0d a1d a2d a3d
    -// a{b,c{d,e}f}g -> abg acdfg acefg
    -// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
    -//
    -// Invalid sets are not expanded.
    -// a{2..}b -> a{2..}b
    -// a{b}c -> a{b}c
    -export const braceExpand = (pattern, options = {}) => {
    -    assertValidPattern(pattern);
    -    // Thanks to Yeting Li  for
    -    // improving this regexp to avoid a ReDOS vulnerability.
    -    if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) {
    -        // shortcut. no need to expand.
    -        return [pattern];
    -    }
    -    return expand(pattern);
    -};
    -minimatch.braceExpand = braceExpand;
    -// parse a component of the expanded set.
    -// At this point, no pattern may contain "/" in it
    -// so we're going to return a 2d array, where each entry is the full
    -// pattern, split on '/', and then turned into a regular expression.
    -// A regexp is made at the end which joins each array with an
    -// escaped /, and another full one which joins each regexp with |.
    -//
    -// Following the lead of Bash 4.1, note that "**" only has special meaning
    -// when it is the *only* thing in a path portion.  Otherwise, any series
    -// of * is equivalent to a single *.  Globstar behavior is enabled by
    -// default, and can be disabled by setting options.noglobstar.
    -export const makeRe = (pattern, options = {}) => new Minimatch(pattern, options).makeRe();
    -minimatch.makeRe = makeRe;
    -export const match = (list, pattern, options = {}) => {
    -    const mm = new Minimatch(pattern, options);
    -    list = list.filter(f => mm.match(f));
    -    if (mm.options.nonull && !list.length) {
    -        list.push(pattern);
    -    }
    -    return list;
    -};
    -minimatch.match = match;
    -// replace stuff like \* with *
    -const globMagic = /[?*]|[+@!]\(.*?\)|\[|\]/;
    -const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
    -export class Minimatch {
    -    options;
    -    set;
    -    pattern;
    -    windowsPathsNoEscape;
    -    nonegate;
    -    negate;
    -    comment;
    -    empty;
    -    preserveMultipleSlashes;
    -    partial;
    -    globSet;
    -    globParts;
    -    nocase;
    -    isWindows;
    -    platform;
    -    windowsNoMagicRoot;
    -    regexp;
    -    constructor(pattern, options = {}) {
    -        assertValidPattern(pattern);
    -        options = options || {};
    -        this.options = options;
    -        this.pattern = pattern;
    -        this.platform = options.platform || defaultPlatform;
    -        this.isWindows = this.platform === 'win32';
    -        this.windowsPathsNoEscape =
    -            !!options.windowsPathsNoEscape || options.allowWindowsEscape === false;
    -        if (this.windowsPathsNoEscape) {
    -            this.pattern = this.pattern.replace(/\\/g, '/');
    -        }
    -        this.preserveMultipleSlashes = !!options.preserveMultipleSlashes;
    -        this.regexp = null;
    -        this.negate = false;
    -        this.nonegate = !!options.nonegate;
    -        this.comment = false;
    -        this.empty = false;
    -        this.partial = !!options.partial;
    -        this.nocase = !!this.options.nocase;
    -        this.windowsNoMagicRoot =
    -            options.windowsNoMagicRoot !== undefined
    -                ? options.windowsNoMagicRoot
    -                : !!(this.isWindows && this.nocase);
    -        this.globSet = [];
    -        this.globParts = [];
    -        this.set = [];
    -        // make the set of regexps etc.
    -        this.make();
    -    }
    -    hasMagic() {
    -        if (this.options.magicalBraces && this.set.length > 1) {
    -            return true;
    -        }
    -        for (const pattern of this.set) {
    -            for (const part of pattern) {
    -                if (typeof part !== 'string')
    -                    return true;
    -            }
    -        }
    -        return false;
    -    }
    -    debug(..._) { }
    -    make() {
    -        const pattern = this.pattern;
    -        const options = this.options;
    -        // empty patterns and comments match nothing.
    -        if (!options.nocomment && pattern.charAt(0) === '#') {
    -            this.comment = true;
    -            return;
    -        }
    -        if (!pattern) {
    -            this.empty = true;
    -            return;
    -        }
    -        // step 1: figure out negation, etc.
    -        this.parseNegate();
    -        // step 2: expand braces
    -        this.globSet = [...new Set(this.braceExpand())];
    -        if (options.debug) {
    -            this.debug = (...args) => console.error(...args);
    -        }
    -        this.debug(this.pattern, this.globSet);
    -        // step 3: now we have a set, so turn each one into a series of
    -        // path-portion matching patterns.
    -        // These will be regexps, except in the case of "**", which is
    -        // set to the GLOBSTAR object for globstar behavior,
    -        // and will not contain any / characters
    -        //
    -        // First, we preprocess to make the glob pattern sets a bit simpler
    -        // and deduped.  There are some perf-killing patterns that can cause
    -        // problems with a glob walk, but we can simplify them down a bit.
    -        const rawGlobParts = this.globSet.map(s => this.slashSplit(s));
    -        this.globParts = this.preprocess(rawGlobParts);
    -        this.debug(this.pattern, this.globParts);
    -        // glob --> regexps
    -        let set = this.globParts.map((s, _, __) => {
    -            if (this.isWindows && this.windowsNoMagicRoot) {
    -                // check if it's a drive or unc path.
    -                const isUNC = s[0] === '' &&
    -                    s[1] === '' &&
    -                    (s[2] === '?' || !globMagic.test(s[2])) &&
    -                    !globMagic.test(s[3]);
    -                const isDrive = /^[a-z]:/i.test(s[0]);
    -                if (isUNC) {
    -                    return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))];
    -                }
    -                else if (isDrive) {
    -                    return [s[0], ...s.slice(1).map(ss => this.parse(ss))];
    -                }
    -            }
    -            return s.map(ss => this.parse(ss));
    -        });
    -        this.debug(this.pattern, set);
    -        // filter out everything that didn't compile properly.
    -        this.set = set.filter(s => s.indexOf(false) === -1);
    -        // do not treat the ? in UNC paths as magic
    -        if (this.isWindows) {
    -            for (let i = 0; i < this.set.length; i++) {
    -                const p = this.set[i];
    -                if (p[0] === '' &&
    -                    p[1] === '' &&
    -                    this.globParts[i][2] === '?' &&
    -                    typeof p[3] === 'string' &&
    -                    /^[a-z]:$/i.test(p[3])) {
    -                    p[2] = '?';
    -                }
    -            }
    -        }
    -        this.debug(this.pattern, this.set);
    -    }
    -    // various transforms to equivalent pattern sets that are
    -    // faster to process in a filesystem walk.  The goal is to
    -    // eliminate what we can, and push all ** patterns as far
    -    // to the right as possible, even if it increases the number
    -    // of patterns that we have to process.
    -    preprocess(globParts) {
    -        // if we're not in globstar mode, then turn all ** into *
    -        if (this.options.noglobstar) {
    -            for (let i = 0; i < globParts.length; i++) {
    -                for (let j = 0; j < globParts[i].length; j++) {
    -                    if (globParts[i][j] === '**') {
    -                        globParts[i][j] = '*';
    -                    }
    -                }
    -            }
    -        }
    -        const { optimizationLevel = 1 } = this.options;
    -        if (optimizationLevel >= 2) {
    -            // aggressive optimization for the purpose of fs walking
    -            globParts = this.firstPhasePreProcess(globParts);
    -            globParts = this.secondPhasePreProcess(globParts);
    -        }
    -        else if (optimizationLevel >= 1) {
    -            // just basic optimizations to remove some .. parts
    -            globParts = this.levelOneOptimize(globParts);
    -        }
    -        else {
    -            // just collapse multiple ** portions into one
    -            globParts = this.adjascentGlobstarOptimize(globParts);
    -        }
    -        return globParts;
    -    }
    -    // just get rid of adjascent ** portions
    -    adjascentGlobstarOptimize(globParts) {
    -        return globParts.map(parts => {
    -            let gs = -1;
    -            while (-1 !== (gs = parts.indexOf('**', gs + 1))) {
    -                let i = gs;
    -                while (parts[i + 1] === '**') {
    -                    i++;
    -                }
    -                if (i !== gs) {
    -                    parts.splice(gs, i - gs);
    -                }
    -            }
    -            return parts;
    -        });
    -    }
    -    // get rid of adjascent ** and resolve .. portions
    -    levelOneOptimize(globParts) {
    -        return globParts.map(parts => {
    -            parts = parts.reduce((set, part) => {
    -                const prev = set[set.length - 1];
    -                if (part === '**' && prev === '**') {
    -                    return set;
    -                }
    -                if (part === '..') {
    -                    if (prev && prev !== '..' && prev !== '.' && prev !== '**') {
    -                        set.pop();
    -                        return set;
    -                    }
    -                }
    -                set.push(part);
    -                return set;
    -            }, []);
    -            return parts.length === 0 ? [''] : parts;
    -        });
    -    }
    -    levelTwoFileOptimize(parts) {
    -        if (!Array.isArray(parts)) {
    -            parts = this.slashSplit(parts);
    -        }
    -        let didSomething = false;
    -        do {
    -            didSomething = false;
    -            // 
    // -> 
    /
    -            if (!this.preserveMultipleSlashes) {
    -                for (let i = 1; i < parts.length - 1; i++) {
    -                    const p = parts[i];
    -                    // don't squeeze out UNC patterns
    -                    if (i === 1 && p === '' && parts[0] === '')
    -                        continue;
    -                    if (p === '.' || p === '') {
    -                        didSomething = true;
    -                        parts.splice(i, 1);
    -                        i--;
    -                    }
    -                }
    -                if (parts[0] === '.' &&
    -                    parts.length === 2 &&
    -                    (parts[1] === '.' || parts[1] === '')) {
    -                    didSomething = true;
    -                    parts.pop();
    -                }
    -            }
    -            // 
    /

    /../ ->

    /
    -            let dd = 0;
    -            while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
    -                const p = parts[dd - 1];
    -                if (p && p !== '.' && p !== '..' && p !== '**') {
    -                    didSomething = true;
    -                    parts.splice(dd - 1, 2);
    -                    dd -= 2;
    -                }
    -            }
    -        } while (didSomething);
    -        return parts.length === 0 ? [''] : parts;
    -    }
    -    // First phase: single-pattern processing
    -    // 
     is 1 or more portions
    -    //  is 1 or more portions
    -    // 

    is any portion other than ., .., '', or ** - // is . or '' - // - // **/.. is *brutal* for filesystem walking performance, because - // it effectively resets the recursive walk each time it occurs, - // and ** cannot be reduced out by a .. pattern part like a regexp - // or most strings (other than .., ., and '') can be. - // - //

    /**/../

    /

    / -> {

    /../

    /

    /,

    /**/

    /

    /} - //

    // -> 
    /
    -    // 
    /

    /../ ->

    /
    -    // **/**/ -> **/
    -    //
    -    // **/*/ -> */**/ <== not valid because ** doesn't follow
    -    // this WOULD be allowed if ** did follow symlinks, or * didn't
    -    firstPhasePreProcess(globParts) {
    -        let didSomething = false;
    -        do {
    -            didSomething = false;
    -            // 
    /**/../

    /

    / -> {

    /../

    /

    /,

    /**/

    /

    /} - for (let parts of globParts) { - let gs = -1; - while (-1 !== (gs = parts.indexOf('**', gs + 1))) { - let gss = gs; - while (parts[gss + 1] === '**') { - //

    /**/**/ -> 
    /**/
    -                        gss++;
    -                    }
    -                    // eg, if gs is 2 and gss is 4, that means we have 3 **
    -                    // parts, and can remove 2 of them.
    -                    if (gss > gs) {
    -                        parts.splice(gs + 1, gss - gs);
    -                    }
    -                    let next = parts[gs + 1];
    -                    const p = parts[gs + 2];
    -                    const p2 = parts[gs + 3];
    -                    if (next !== '..')
    -                        continue;
    -                    if (!p ||
    -                        p === '.' ||
    -                        p === '..' ||
    -                        !p2 ||
    -                        p2 === '.' ||
    -                        p2 === '..') {
    -                        continue;
    -                    }
    -                    didSomething = true;
    -                    // edit parts in place, and push the new one
    -                    parts.splice(gs, 1);
    -                    const other = parts.slice(0);
    -                    other[gs] = '**';
    -                    globParts.push(other);
    -                    gs--;
    -                }
    -                // 
    // -> 
    /
    -                if (!this.preserveMultipleSlashes) {
    -                    for (let i = 1; i < parts.length - 1; i++) {
    -                        const p = parts[i];
    -                        // don't squeeze out UNC patterns
    -                        if (i === 1 && p === '' && parts[0] === '')
    -                            continue;
    -                        if (p === '.' || p === '') {
    -                            didSomething = true;
    -                            parts.splice(i, 1);
    -                            i--;
    -                        }
    -                    }
    -                    if (parts[0] === '.' &&
    -                        parts.length === 2 &&
    -                        (parts[1] === '.' || parts[1] === '')) {
    -                        didSomething = true;
    -                        parts.pop();
    -                    }
    -                }
    -                // 
    /

    /../ ->

    /
    -                let dd = 0;
    -                while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
    -                    const p = parts[dd - 1];
    -                    if (p && p !== '.' && p !== '..' && p !== '**') {
    -                        didSomething = true;
    -                        const needDot = dd === 1 && parts[dd + 1] === '**';
    -                        const splin = needDot ? ['.'] : [];
    -                        parts.splice(dd - 1, 2, ...splin);
    -                        if (parts.length === 0)
    -                            parts.push('');
    -                        dd -= 2;
    -                    }
    -                }
    -            }
    -        } while (didSomething);
    -        return globParts;
    -    }
    -    // second phase: multi-pattern dedupes
    -    // {
    /*/,
    /

    /} ->

    /*/
    -    // {
    /,
    /} -> 
    /
    -    // {
    /**/,
    /} -> 
    /**/
    -    //
    -    // {
    /**/,
    /**/

    /} ->

    /**/
    -    // ^-- not valid because ** doens't follow symlinks
    -    secondPhasePreProcess(globParts) {
    -        for (let i = 0; i < globParts.length - 1; i++) {
    -            for (let j = i + 1; j < globParts.length; j++) {
    -                const matched = this.partsMatch(globParts[i], globParts[j], !this.preserveMultipleSlashes);
    -                if (matched) {
    -                    globParts[i] = [];
    -                    globParts[j] = matched;
    -                    break;
    -                }
    -            }
    -        }
    -        return globParts.filter(gs => gs.length);
    -    }
    -    partsMatch(a, b, emptyGSMatch = false) {
    -        let ai = 0;
    -        let bi = 0;
    -        let result = [];
    -        let which = '';
    -        while (ai < a.length && bi < b.length) {
    -            if (a[ai] === b[bi]) {
    -                result.push(which === 'b' ? b[bi] : a[ai]);
    -                ai++;
    -                bi++;
    -            }
    -            else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {
    -                result.push(a[ai]);
    -                ai++;
    -            }
    -            else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {
    -                result.push(b[bi]);
    -                bi++;
    -            }
    -            else if (a[ai] === '*' &&
    -                b[bi] &&
    -                (this.options.dot || !b[bi].startsWith('.')) &&
    -                b[bi] !== '**') {
    -                if (which === 'b')
    -                    return false;
    -                which = 'a';
    -                result.push(a[ai]);
    -                ai++;
    -                bi++;
    -            }
    -            else if (b[bi] === '*' &&
    -                a[ai] &&
    -                (this.options.dot || !a[ai].startsWith('.')) &&
    -                a[ai] !== '**') {
    -                if (which === 'a')
    -                    return false;
    -                which = 'b';
    -                result.push(b[bi]);
    -                ai++;
    -                bi++;
    -            }
    -            else {
    -                return false;
    -            }
    -        }
    -        // if we fall out of the loop, it means they two are identical
    -        // as long as their lengths match
    -        return a.length === b.length && result;
    -    }
    -    parseNegate() {
    -        if (this.nonegate)
    -            return;
    -        const pattern = this.pattern;
    -        let negate = false;
    -        let negateOffset = 0;
    -        for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {
    -            negate = !negate;
    -            negateOffset++;
    -        }
    -        if (negateOffset)
    -            this.pattern = pattern.slice(negateOffset);
    -        this.negate = negate;
    -    }
    -    // set partial to true to test if, for example,
    -    // "/a/b" matches the start of "/*/b/*/d"
    -    // Partial means, if you run out of file before you run
    -    // out of pattern, then that's fine, as long as all
    -    // the parts match.
    -    matchOne(file, pattern, partial = false) {
    -        const options = this.options;
    -        // UNC paths like //?/X:/... can match X:/... and vice versa
    -        // Drive letters in absolute drive or unc paths are always compared
    -        // case-insensitively.
    -        if (this.isWindows) {
    -            const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0]);
    -            const fileUNC = !fileDrive &&
    -                file[0] === '' &&
    -                file[1] === '' &&
    -                file[2] === '?' &&
    -                /^[a-z]:$/i.test(file[3]);
    -            const patternDrive = typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0]);
    -            const patternUNC = !patternDrive &&
    -                pattern[0] === '' &&
    -                pattern[1] === '' &&
    -                pattern[2] === '?' &&
    -                typeof pattern[3] === 'string' &&
    -                /^[a-z]:$/i.test(pattern[3]);
    -            const fdi = fileUNC ? 3 : fileDrive ? 0 : undefined;
    -            const pdi = patternUNC ? 3 : patternDrive ? 0 : undefined;
    -            if (typeof fdi === 'number' && typeof pdi === 'number') {
    -                const [fd, pd] = [file[fdi], pattern[pdi]];
    -                if (fd.toLowerCase() === pd.toLowerCase()) {
    -                    pattern[pdi] = fd;
    -                    if (pdi > fdi) {
    -                        pattern = pattern.slice(pdi);
    -                    }
    -                    else if (fdi > pdi) {
    -                        file = file.slice(fdi);
    -                    }
    -                }
    -            }
    -        }
    -        // resolve and reduce . and .. portions in the file as well.
    -        // dont' need to do the second phase, because it's only one string[]
    -        const { optimizationLevel = 1 } = this.options;
    -        if (optimizationLevel >= 2) {
    -            file = this.levelTwoFileOptimize(file);
    -        }
    -        this.debug('matchOne', this, { file, pattern });
    -        this.debug('matchOne', file.length, pattern.length);
    -        for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) {
    -            this.debug('matchOne loop');
    -            var p = pattern[pi];
    -            var f = file[fi];
    -            this.debug(pattern, p, f);
    -            // should be impossible.
    -            // some invalid regexp stuff in the set.
    -            /* c8 ignore start */
    -            if (p === false) {
    -                return false;
    -            }
    -            /* c8 ignore stop */
    -            if (p === GLOBSTAR) {
    -                this.debug('GLOBSTAR', [pattern, p, f]);
    -                // "**"
    -                // a/**/b/**/c would match the following:
    -                // a/b/x/y/z/c
    -                // a/x/y/z/b/c
    -                // a/b/x/b/x/c
    -                // a/b/c
    -                // To do this, take the rest of the pattern after
    -                // the **, and see if it would match the file remainder.
    -                // If so, return success.
    -                // If not, the ** "swallows" a segment, and try again.
    -                // This is recursively awful.
    -                //
    -                // a/**/b/**/c matching a/b/x/y/z/c
    -                // - a matches a
    -                // - doublestar
    -                //   - matchOne(b/x/y/z/c, b/**/c)
    -                //     - b matches b
    -                //     - doublestar
    -                //       - matchOne(x/y/z/c, c) -> no
    -                //       - matchOne(y/z/c, c) -> no
    -                //       - matchOne(z/c, c) -> no
    -                //       - matchOne(c, c) yes, hit
    -                var fr = fi;
    -                var pr = pi + 1;
    -                if (pr === pl) {
    -                    this.debug('** at the end');
    -                    // a ** at the end will just swallow the rest.
    -                    // We have found a match.
    -                    // however, it will not swallow /.x, unless
    -                    // options.dot is set.
    -                    // . and .. are *never* matched by **, for explosively
    -                    // exponential reasons.
    -                    for (; fi < fl; fi++) {
    -                        if (file[fi] === '.' ||
    -                            file[fi] === '..' ||
    -                            (!options.dot && file[fi].charAt(0) === '.'))
    -                            return false;
    -                    }
    -                    return true;
    -                }
    -                // ok, let's see if we can swallow whatever we can.
    -                while (fr < fl) {
    -                    var swallowee = file[fr];
    -                    this.debug('\nglobstar while', file, fr, pattern, pr, swallowee);
    -                    // XXX remove this slice.  Just pass the start index.
    -                    if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
    -                        this.debug('globstar found match!', fr, fl, swallowee);
    -                        // found a match.
    -                        return true;
    -                    }
    -                    else {
    -                        // can't swallow "." or ".." ever.
    -                        // can only swallow ".foo" when explicitly asked.
    -                        if (swallowee === '.' ||
    -                            swallowee === '..' ||
    -                            (!options.dot && swallowee.charAt(0) === '.')) {
    -                            this.debug('dot detected!', file, fr, pattern, pr);
    -                            break;
    -                        }
    -                        // ** swallows a segment, and continue.
    -                        this.debug('globstar swallow a segment, and continue');
    -                        fr++;
    -                    }
    -                }
    -                // no match was found.
    -                // However, in partial mode, we can't say this is necessarily over.
    -                /* c8 ignore start */
    -                if (partial) {
    -                    // ran out of file
    -                    this.debug('\n>>> no match, partial?', file, fr, pattern, pr);
    -                    if (fr === fl) {
    -                        return true;
    -                    }
    -                }
    -                /* c8 ignore stop */
    -                return false;
    -            }
    -            // something other than **
    -            // non-magic patterns just have to match exactly
    -            // patterns with magic have been turned into regexps.
    -            let hit;
    -            if (typeof p === 'string') {
    -                hit = f === p;
    -                this.debug('string match', p, f, hit);
    -            }
    -            else {
    -                hit = p.test(f);
    -                this.debug('pattern match', p, f, hit);
    -            }
    -            if (!hit)
    -                return false;
    -        }
    -        // Note: ending in / means that we'll get a final ""
    -        // at the end of the pattern.  This can only match a
    -        // corresponding "" at the end of the file.
    -        // If the file ends in /, then it can only match a
    -        // a pattern that ends in /, unless the pattern just
    -        // doesn't have any more for it. But, a/b/ should *not*
    -        // match "a/b/*", even though "" matches against the
    -        // [^/]*? pattern, except in partial mode, where it might
    -        // simply not be reached yet.
    -        // However, a/b/ should still satisfy a/*
    -        // now either we fell off the end of the pattern, or we're done.
    -        if (fi === fl && pi === pl) {
    -            // ran out of pattern and filename at the same time.
    -            // an exact hit!
    -            return true;
    -        }
    -        else if (fi === fl) {
    -            // ran out of file, but still had pattern left.
    -            // this is ok if we're doing the match as part of
    -            // a glob fs traversal.
    -            return partial;
    -        }
    -        else if (pi === pl) {
    -            // ran out of pattern, still have file left.
    -            // this is only acceptable if we're on the very last
    -            // empty segment of a file with a trailing slash.
    -            // a/* should match a/b/
    -            return fi === fl - 1 && file[fi] === '';
    -            /* c8 ignore start */
    -        }
    -        else {
    -            // should be unreachable.
    -            throw new Error('wtf?');
    -        }
    -        /* c8 ignore stop */
    -    }
    -    braceExpand() {
    -        return braceExpand(this.pattern, this.options);
    -    }
    -    parse(pattern) {
    -        assertValidPattern(pattern);
    -        const options = this.options;
    -        // shortcuts
    -        if (pattern === '**')
    -            return GLOBSTAR;
    -        if (pattern === '')
    -            return '';
    -        // far and away, the most common glob pattern parts are
    -        // *, *.*, and *.  Add a fast check method for those.
    -        let m;
    -        let fastTest = null;
    -        if ((m = pattern.match(starRE))) {
    -            fastTest = options.dot ? starTestDot : starTest;
    -        }
    -        else if ((m = pattern.match(starDotExtRE))) {
    -            fastTest = (options.nocase
    -                ? options.dot
    -                    ? starDotExtTestNocaseDot
    -                    : starDotExtTestNocase
    -                : options.dot
    -                    ? starDotExtTestDot
    -                    : starDotExtTest)(m[1]);
    -        }
    -        else if ((m = pattern.match(qmarksRE))) {
    -            fastTest = (options.nocase
    -                ? options.dot
    -                    ? qmarksTestNocaseDot
    -                    : qmarksTestNocase
    -                : options.dot
    -                    ? qmarksTestDot
    -                    : qmarksTest)(m);
    -        }
    -        else if ((m = pattern.match(starDotStarRE))) {
    -            fastTest = options.dot ? starDotStarTestDot : starDotStarTest;
    -        }
    -        else if ((m = pattern.match(dotStarRE))) {
    -            fastTest = dotStarTest;
    -        }
    -        const re = AST.fromGlob(pattern, this.options).toMMPattern();
    -        if (fastTest && typeof re === 'object') {
    -            // Avoids overriding in frozen environments
    -            Reflect.defineProperty(re, 'test', { value: fastTest });
    -        }
    -        return re;
    -    }
    -    makeRe() {
    -        if (this.regexp || this.regexp === false)
    -            return this.regexp;
    -        // at this point, this.set is a 2d array of partial
    -        // pattern strings, or "**".
    -        //
    -        // It's better to use .match().  This function shouldn't
    -        // be used, really, but it's pretty convenient sometimes,
    -        // when you just want to work with a regex.
    -        const set = this.set;
    -        if (!set.length) {
    -            this.regexp = false;
    -            return this.regexp;
    -        }
    -        const options = this.options;
    -        const twoStar = options.noglobstar
    -            ? star
    -            : options.dot
    -                ? twoStarDot
    -                : twoStarNoDot;
    -        const flags = new Set(options.nocase ? ['i'] : []);
    -        // regexpify non-globstar patterns
    -        // if ** is only item, then we just do one twoStar
    -        // if ** is first, and there are more, prepend (\/|twoStar\/)? to next
    -        // if ** is last, append (\/twoStar|) to previous
    -        // if ** is in the middle, append (\/|\/twoStar\/) to previous
    -        // then filter out GLOBSTAR symbols
    -        let re = set
    -            .map(pattern => {
    -            const pp = pattern.map(p => {
    -                if (p instanceof RegExp) {
    -                    for (const f of p.flags.split(''))
    -                        flags.add(f);
    -                }
    -                return typeof p === 'string'
    -                    ? regExpEscape(p)
    -                    : p === GLOBSTAR
    -                        ? GLOBSTAR
    -                        : p._src;
    -            });
    -            pp.forEach((p, i) => {
    -                const next = pp[i + 1];
    -                const prev = pp[i - 1];
    -                if (p !== GLOBSTAR || prev === GLOBSTAR) {
    -                    return;
    -                }
    -                if (prev === undefined) {
    -                    if (next !== undefined && next !== GLOBSTAR) {
    -                        pp[i + 1] = '(?:\\/|' + twoStar + '\\/)?' + next;
    -                    }
    -                    else {
    -                        pp[i] = twoStar;
    -                    }
    -                }
    -                else if (next === undefined) {
    -                    pp[i - 1] = prev + '(?:\\/|' + twoStar + ')?';
    -                }
    -                else if (next !== GLOBSTAR) {
    -                    pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + '\\/)' + next;
    -                    pp[i + 1] = GLOBSTAR;
    -                }
    -            });
    -            return pp.filter(p => p !== GLOBSTAR).join('/');
    -        })
    -            .join('|');
    -        // need to wrap in parens if we had more than one thing with |,
    -        // otherwise only the first will be anchored to ^ and the last to $
    -        const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', ''];
    -        // must match entire pattern
    -        // ending in a * or ** will make it less strict.
    -        re = '^' + open + re + close + '$';
    -        // can match anything, as long as it's not this.
    -        if (this.negate)
    -            re = '^(?!' + re + ').+$';
    -        try {
    -            this.regexp = new RegExp(re, [...flags].join(''));
    -            /* c8 ignore start */
    -        }
    -        catch (ex) {
    -            // should be impossible
    -            this.regexp = false;
    -        }
    -        /* c8 ignore stop */
    -        return this.regexp;
    -    }
    -    slashSplit(p) {
    -        // if p starts with // on windows, we preserve that
    -        // so that UNC paths aren't broken.  Otherwise, any number of
    -        // / characters are coalesced into one, unless
    -        // preserveMultipleSlashes is set to true.
    -        if (this.preserveMultipleSlashes) {
    -            return p.split('/');
    -        }
    -        else if (this.isWindows && /^\/\/[^\/]+/.test(p)) {
    -            // add an extra '' for the one we lose
    -            return ['', ...p.split(/\/+/)];
    -        }
    -        else {
    -            return p.split(/\/+/);
    -        }
    -    }
    -    match(f, partial = this.partial) {
    -        this.debug('match', f, this.pattern);
    -        // short-circuit in the case of busted things.
    -        // comments, etc.
    -        if (this.comment) {
    -            return false;
    -        }
    -        if (this.empty) {
    -            return f === '';
    -        }
    -        if (f === '/' && partial) {
    -            return true;
    -        }
    -        const options = this.options;
    -        // windows: need to use /, not \
    -        if (this.isWindows) {
    -            f = f.split('\\').join('/');
    -        }
    -        // treat the test path as a set of pathparts.
    -        const ff = this.slashSplit(f);
    -        this.debug(this.pattern, 'split', ff);
    -        // just ONE of the pattern sets in this.set needs to match
    -        // in order for it to be valid.  If negating, then just one
    -        // match means that we have failed.
    -        // Either way, return on the first hit.
    -        const set = this.set;
    -        this.debug(this.pattern, 'set', set);
    -        // Find the basename of the path by looking for the last non-empty segment
    -        let filename = ff[ff.length - 1];
    -        if (!filename) {
    -            for (let i = ff.length - 2; !filename && i >= 0; i--) {
    -                filename = ff[i];
    -            }
    -        }
    -        for (let i = 0; i < set.length; i++) {
    -            const pattern = set[i];
    -            let file = ff;
    -            if (options.matchBase && pattern.length === 1) {
    -                file = [filename];
    -            }
    -            const hit = this.matchOne(file, pattern, partial);
    -            if (hit) {
    -                if (options.flipNegate) {
    -                    return true;
    -                }
    -                return !this.negate;
    -            }
    -        }
    -        // didn't get any hits.  this is success if it's a negative
    -        // pattern, failure otherwise.
    -        if (options.flipNegate) {
    -            return false;
    -        }
    -        return this.negate;
    -    }
    -    static defaults(def) {
    -        return minimatch.defaults(def).Minimatch;
    -    }
    -}
    -/* c8 ignore start */
    -export { AST } from './ast.js';
    -export { escape } from './escape.js';
    -export { unescape } from './unescape.js';
    -/* c8 ignore stop */
    -minimatch.AST = AST;
    -minimatch.Minimatch = Minimatch;
    -minimatch.escape = escape;
    -minimatch.unescape = unescape;
    -//# sourceMappingURL=index.js.map
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/esm/index.js.map b/node_modules/minimatch/dist/esm/index.js.map
    deleted file mode 100644
    index ff82a0d..0000000
    --- a/node_modules/minimatch/dist/esm/index.js.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import expand from 'brace-expansion'\nimport { assertValidPattern } from './assert-valid-pattern.js'\nimport { AST, ExtglobType } from './ast.js'\nimport { escape } from './escape.js'\nimport { unescape } from './unescape.js'\n\ntype Platform =\n  | 'aix'\n  | 'android'\n  | 'darwin'\n  | 'freebsd'\n  | 'haiku'\n  | 'linux'\n  | 'openbsd'\n  | 'sunos'\n  | 'win32'\n  | 'cygwin'\n  | 'netbsd'\n\nexport interface MinimatchOptions {\n  nobrace?: boolean\n  nocomment?: boolean\n  nonegate?: boolean\n  debug?: boolean\n  noglobstar?: boolean\n  noext?: boolean\n  nonull?: boolean\n  windowsPathsNoEscape?: boolean\n  allowWindowsEscape?: boolean\n  partial?: boolean\n  dot?: boolean\n  nocase?: boolean\n  nocaseMagicOnly?: boolean\n  magicalBraces?: boolean\n  matchBase?: boolean\n  flipNegate?: boolean\n  preserveMultipleSlashes?: boolean\n  optimizationLevel?: number\n  platform?: Platform\n  windowsNoMagicRoot?: boolean\n}\n\nexport const minimatch = (\n  p: string,\n  pattern: string,\n  options: MinimatchOptions = {}\n) => {\n  assertValidPattern(pattern)\n\n  // shortcut: comments match nothing.\n  if (!options.nocomment && pattern.charAt(0) === '#') {\n    return false\n  }\n\n  return new Minimatch(pattern, options).match(p)\n}\n\n// Optimized checking for the most common glob patterns.\nconst starDotExtRE = /^\\*+([^+@!?\\*\\[\\(]*)$/\nconst starDotExtTest = (ext: string) => (f: string) =>\n  !f.startsWith('.') && f.endsWith(ext)\nconst starDotExtTestDot = (ext: string) => (f: string) => f.endsWith(ext)\nconst starDotExtTestNocase = (ext: string) => {\n  ext = ext.toLowerCase()\n  return (f: string) => !f.startsWith('.') && f.toLowerCase().endsWith(ext)\n}\nconst starDotExtTestNocaseDot = (ext: string) => {\n  ext = ext.toLowerCase()\n  return (f: string) => f.toLowerCase().endsWith(ext)\n}\nconst starDotStarRE = /^\\*+\\.\\*+$/\nconst starDotStarTest = (f: string) => !f.startsWith('.') && f.includes('.')\nconst starDotStarTestDot = (f: string) =>\n  f !== '.' && f !== '..' && f.includes('.')\nconst dotStarRE = /^\\.\\*+$/\nconst dotStarTest = (f: string) => f !== '.' && f !== '..' && f.startsWith('.')\nconst starRE = /^\\*+$/\nconst starTest = (f: string) => f.length !== 0 && !f.startsWith('.')\nconst starTestDot = (f: string) => f.length !== 0 && f !== '.' && f !== '..'\nconst qmarksRE = /^\\?+([^+@!?\\*\\[\\(]*)?$/\nconst qmarksTestNocase = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExt([$0])\n  if (!ext) return noext\n  ext = ext.toLowerCase()\n  return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestNocaseDot = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExtDot([$0])\n  if (!ext) return noext\n  ext = ext.toLowerCase()\n  return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestDot = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExtDot([$0])\n  return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTest = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExt([$0])\n  return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTestNoExt = ([$0]: RegExpMatchArray) => {\n  const len = $0.length\n  return (f: string) => f.length === len && !f.startsWith('.')\n}\nconst qmarksTestNoExtDot = ([$0]: RegExpMatchArray) => {\n  const len = $0.length\n  return (f: string) => f.length === len && f !== '.' && f !== '..'\n}\n\n/* c8 ignore start */\nconst defaultPlatform: Platform = (\n  typeof process === 'object' && process\n    ? (typeof process.env === 'object' &&\n        process.env &&\n        process.env.__MINIMATCH_TESTING_PLATFORM__) ||\n      process.platform\n    : 'posix'\n) as Platform\ntype Sep = '\\\\' | '/'\nconst path: { [k: string]: { sep: Sep } } = {\n  win32: { sep: '\\\\' },\n  posix: { sep: '/' },\n}\n/* c8 ignore stop */\n\nexport const sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep\nminimatch.sep = sep\n\nexport const GLOBSTAR = Symbol('globstar **')\nminimatch.GLOBSTAR = GLOBSTAR\n\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n\n// ** when dots are allowed.  Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nconst twoStarDot = '(?:(?!(?:\\\\/|^)(?:\\\\.{1,2})($|\\\\/)).)*?'\n\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nconst twoStarNoDot = '(?:(?!(?:\\\\/|^)\\\\.).)*?'\n\nexport const filter =\n  (pattern: string, options: MinimatchOptions = {}) =>\n  (p: string) =>\n    minimatch(p, pattern, options)\nminimatch.filter = filter\n\nconst ext = (a: MinimatchOptions, b: MinimatchOptions = {}) =>\n  Object.assign({}, a, b)\n\nexport const defaults = (def: MinimatchOptions): typeof minimatch => {\n  if (!def || typeof def !== 'object' || !Object.keys(def).length) {\n    return minimatch\n  }\n\n  const orig = minimatch\n\n  const m = (p: string, pattern: string, options: MinimatchOptions = {}) =>\n    orig(p, pattern, ext(def, options))\n\n  return Object.assign(m, {\n    Minimatch: class Minimatch extends orig.Minimatch {\n      constructor(pattern: string, options: MinimatchOptions = {}) {\n        super(pattern, ext(def, options))\n      }\n      static defaults(options: MinimatchOptions) {\n        return orig.defaults(ext(def, options)).Minimatch\n      }\n    },\n\n    AST: class AST extends orig.AST {\n      /* c8 ignore start */\n      constructor(\n        type: ExtglobType | null,\n        parent?: AST,\n        options: MinimatchOptions = {}\n      ) {\n        super(type, parent, ext(def, options))\n      }\n      /* c8 ignore stop */\n\n      static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n        return orig.AST.fromGlob(pattern, ext(def, options))\n      }\n    },\n\n    unescape: (\n      s: string,\n      options: Pick = {}\n    ) => orig.unescape(s, ext(def, options)),\n\n    escape: (\n      s: string,\n      options: Pick = {}\n    ) => orig.escape(s, ext(def, options)),\n\n    filter: (pattern: string, options: MinimatchOptions = {}) =>\n      orig.filter(pattern, ext(def, options)),\n\n    defaults: (options: MinimatchOptions) => orig.defaults(ext(def, options)),\n\n    makeRe: (pattern: string, options: MinimatchOptions = {}) =>\n      orig.makeRe(pattern, ext(def, options)),\n\n    braceExpand: (pattern: string, options: MinimatchOptions = {}) =>\n      orig.braceExpand(pattern, ext(def, options)),\n\n    match: (list: string[], pattern: string, options: MinimatchOptions = {}) =>\n      orig.match(list, pattern, ext(def, options)),\n\n    sep: orig.sep,\n    GLOBSTAR: GLOBSTAR as typeof GLOBSTAR,\n  })\n}\nminimatch.defaults = defaults\n\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nexport const braceExpand = (\n  pattern: string,\n  options: MinimatchOptions = {}\n) => {\n  assertValidPattern(pattern)\n\n  // Thanks to Yeting Li  for\n  // improving this regexp to avoid a ReDOS vulnerability.\n  if (options.nobrace || !/\\{(?:(?!\\{).)*\\}/.test(pattern)) {\n    // shortcut. no need to expand.\n    return [pattern]\n  }\n\n  return expand(pattern)\n}\nminimatch.braceExpand = braceExpand\n\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion.  Otherwise, any series\n// of * is equivalent to a single *.  Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\n\nexport const makeRe = (pattern: string, options: MinimatchOptions = {}) =>\n  new Minimatch(pattern, options).makeRe()\nminimatch.makeRe = makeRe\n\nexport const match = (\n  list: string[],\n  pattern: string,\n  options: MinimatchOptions = {}\n) => {\n  const mm = new Minimatch(pattern, options)\n  list = list.filter(f => mm.match(f))\n  if (mm.options.nonull && !list.length) {\n    list.push(pattern)\n  }\n  return list\n}\nminimatch.match = match\n\n// replace stuff like \\* with *\nconst globMagic = /[?*]|[+@!]\\(.*?\\)|\\[|\\]/\nconst regExpEscape = (s: string) =>\n  s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\nexport type MMRegExp = RegExp & {\n  _src?: string\n  _glob?: string\n}\n\nexport type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR\nexport type ParseReturn = ParseReturnFiltered | false\n\nexport class Minimatch {\n  options: MinimatchOptions\n  set: ParseReturnFiltered[][]\n  pattern: string\n\n  windowsPathsNoEscape: boolean\n  nonegate: boolean\n  negate: boolean\n  comment: boolean\n  empty: boolean\n  preserveMultipleSlashes: boolean\n  partial: boolean\n  globSet: string[]\n  globParts: string[][]\n  nocase: boolean\n\n  isWindows: boolean\n  platform: Platform\n  windowsNoMagicRoot: boolean\n\n  regexp: false | null | MMRegExp\n  constructor(pattern: string, options: MinimatchOptions = {}) {\n    assertValidPattern(pattern)\n\n    options = options || {}\n    this.options = options\n    this.pattern = pattern\n    this.platform = options.platform || defaultPlatform\n    this.isWindows = this.platform === 'win32'\n    this.windowsPathsNoEscape =\n      !!options.windowsPathsNoEscape || options.allowWindowsEscape === false\n    if (this.windowsPathsNoEscape) {\n      this.pattern = this.pattern.replace(/\\\\/g, '/')\n    }\n    this.preserveMultipleSlashes = !!options.preserveMultipleSlashes\n    this.regexp = null\n    this.negate = false\n    this.nonegate = !!options.nonegate\n    this.comment = false\n    this.empty = false\n    this.partial = !!options.partial\n    this.nocase = !!this.options.nocase\n    this.windowsNoMagicRoot =\n      options.windowsNoMagicRoot !== undefined\n        ? options.windowsNoMagicRoot\n        : !!(this.isWindows && this.nocase)\n\n    this.globSet = []\n    this.globParts = []\n    this.set = []\n\n    // make the set of regexps etc.\n    this.make()\n  }\n\n  hasMagic(): boolean {\n    if (this.options.magicalBraces && this.set.length > 1) {\n      return true\n    }\n    for (const pattern of this.set) {\n      for (const part of pattern) {\n        if (typeof part !== 'string') return true\n      }\n    }\n    return false\n  }\n\n  debug(..._: any[]) {}\n\n  make() {\n    const pattern = this.pattern\n    const options = this.options\n\n    // empty patterns and comments match nothing.\n    if (!options.nocomment && pattern.charAt(0) === '#') {\n      this.comment = true\n      return\n    }\n\n    if (!pattern) {\n      this.empty = true\n      return\n    }\n\n    // step 1: figure out negation, etc.\n    this.parseNegate()\n\n    // step 2: expand braces\n    this.globSet = [...new Set(this.braceExpand())]\n\n    if (options.debug) {\n      this.debug = (...args: any[]) => console.error(...args)\n    }\n\n    this.debug(this.pattern, this.globSet)\n\n    // step 3: now we have a set, so turn each one into a series of\n    // path-portion matching patterns.\n    // These will be regexps, except in the case of \"**\", which is\n    // set to the GLOBSTAR object for globstar behavior,\n    // and will not contain any / characters\n    //\n    // First, we preprocess to make the glob pattern sets a bit simpler\n    // and deduped.  There are some perf-killing patterns that can cause\n    // problems with a glob walk, but we can simplify them down a bit.\n    const rawGlobParts = this.globSet.map(s => this.slashSplit(s))\n    this.globParts = this.preprocess(rawGlobParts)\n    this.debug(this.pattern, this.globParts)\n\n    // glob --> regexps\n    let set = this.globParts.map((s, _, __) => {\n      if (this.isWindows && this.windowsNoMagicRoot) {\n        // check if it's a drive or unc path.\n        const isUNC =\n          s[0] === '' &&\n          s[1] === '' &&\n          (s[2] === '?' || !globMagic.test(s[2])) &&\n          !globMagic.test(s[3])\n        const isDrive = /^[a-z]:/i.test(s[0])\n        if (isUNC) {\n          return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))]\n        } else if (isDrive) {\n          return [s[0], ...s.slice(1).map(ss => this.parse(ss))]\n        }\n      }\n      return s.map(ss => this.parse(ss))\n    })\n\n    this.debug(this.pattern, set)\n\n    // filter out everything that didn't compile properly.\n    this.set = set.filter(\n      s => s.indexOf(false) === -1\n    ) as ParseReturnFiltered[][]\n\n    // do not treat the ? in UNC paths as magic\n    if (this.isWindows) {\n      for (let i = 0; i < this.set.length; i++) {\n        const p = this.set[i]\n        if (\n          p[0] === '' &&\n          p[1] === '' &&\n          this.globParts[i][2] === '?' &&\n          typeof p[3] === 'string' &&\n          /^[a-z]:$/i.test(p[3])\n        ) {\n          p[2] = '?'\n        }\n      }\n    }\n\n    this.debug(this.pattern, this.set)\n  }\n\n  // various transforms to equivalent pattern sets that are\n  // faster to process in a filesystem walk.  The goal is to\n  // eliminate what we can, and push all ** patterns as far\n  // to the right as possible, even if it increases the number\n  // of patterns that we have to process.\n  preprocess(globParts: string[][]) {\n    // if we're not in globstar mode, then turn all ** into *\n    if (this.options.noglobstar) {\n      for (let i = 0; i < globParts.length; i++) {\n        for (let j = 0; j < globParts[i].length; j++) {\n          if (globParts[i][j] === '**') {\n            globParts[i][j] = '*'\n          }\n        }\n      }\n    }\n\n    const { optimizationLevel = 1 } = this.options\n\n    if (optimizationLevel >= 2) {\n      // aggressive optimization for the purpose of fs walking\n      globParts = this.firstPhasePreProcess(globParts)\n      globParts = this.secondPhasePreProcess(globParts)\n    } else if (optimizationLevel >= 1) {\n      // just basic optimizations to remove some .. parts\n      globParts = this.levelOneOptimize(globParts)\n    } else {\n      // just collapse multiple ** portions into one\n      globParts = this.adjascentGlobstarOptimize(globParts)\n    }\n\n    return globParts\n  }\n\n  // just get rid of adjascent ** portions\n  adjascentGlobstarOptimize(globParts: string[][]) {\n    return globParts.map(parts => {\n      let gs: number = -1\n      while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n        let i = gs\n        while (parts[i + 1] === '**') {\n          i++\n        }\n        if (i !== gs) {\n          parts.splice(gs, i - gs)\n        }\n      }\n      return parts\n    })\n  }\n\n  // get rid of adjascent ** and resolve .. portions\n  levelOneOptimize(globParts: string[][]) {\n    return globParts.map(parts => {\n      parts = parts.reduce((set: string[], part) => {\n        const prev = set[set.length - 1]\n        if (part === '**' && prev === '**') {\n          return set\n        }\n        if (part === '..') {\n          if (prev && prev !== '..' && prev !== '.' && prev !== '**') {\n            set.pop()\n            return set\n          }\n        }\n        set.push(part)\n        return set\n      }, [])\n      return parts.length === 0 ? [''] : parts\n    })\n  }\n\n  levelTwoFileOptimize(parts: string | string[]) {\n    if (!Array.isArray(parts)) {\n      parts = this.slashSplit(parts)\n    }\n    let didSomething: boolean = false\n    do {\n      didSomething = false\n      // 
    // -> 
    /\n      if (!this.preserveMultipleSlashes) {\n        for (let i = 1; i < parts.length - 1; i++) {\n          const p = parts[i]\n          // don't squeeze out UNC patterns\n          if (i === 1 && p === '' && parts[0] === '') continue\n          if (p === '.' || p === '') {\n            didSomething = true\n            parts.splice(i, 1)\n            i--\n          }\n        }\n        if (\n          parts[0] === '.' &&\n          parts.length === 2 &&\n          (parts[1] === '.' || parts[1] === '')\n        ) {\n          didSomething = true\n          parts.pop()\n        }\n      }\n\n      // 
    /

    /../ ->

    /\n      let dd: number = 0\n      while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n        const p = parts[dd - 1]\n        if (p && p !== '.' && p !== '..' && p !== '**') {\n          didSomething = true\n          parts.splice(dd - 1, 2)\n          dd -= 2\n        }\n      }\n    } while (didSomething)\n    return parts.length === 0 ? [''] : parts\n  }\n\n  // First phase: single-pattern processing\n  // 
     is 1 or more portions\n  //  is 1 or more portions\n  // 

    is any portion other than ., .., '', or **\n // is . or ''\n //\n // **/.. is *brutal* for filesystem walking performance, because\n // it effectively resets the recursive walk each time it occurs,\n // and ** cannot be reduced out by a .. pattern part like a regexp\n // or most strings (other than .., ., and '') can be.\n //\n //

    /**/../

    /

    / -> {

    /../

    /

    /,

    /**/

    /

    /}\n //

    // -> 
    /\n  // 
    /

    /../ ->

    /\n  // **/**/ -> **/\n  //\n  // **/*/ -> */**/ <== not valid because ** doesn't follow\n  // this WOULD be allowed if ** did follow symlinks, or * didn't\n  firstPhasePreProcess(globParts: string[][]) {\n    let didSomething = false\n    do {\n      didSomething = false\n      // 
    /**/../

    /

    / -> {

    /../

    /

    /,

    /**/

    /

    /}\n for (let parts of globParts) {\n let gs: number = -1\n while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n let gss: number = gs\n while (parts[gss + 1] === '**') {\n //

    /**/**/ -> 
    /**/\n            gss++\n          }\n          // eg, if gs is 2 and gss is 4, that means we have 3 **\n          // parts, and can remove 2 of them.\n          if (gss > gs) {\n            parts.splice(gs + 1, gss - gs)\n          }\n\n          let next = parts[gs + 1]\n          const p = parts[gs + 2]\n          const p2 = parts[gs + 3]\n          if (next !== '..') continue\n          if (\n            !p ||\n            p === '.' ||\n            p === '..' ||\n            !p2 ||\n            p2 === '.' ||\n            p2 === '..'\n          ) {\n            continue\n          }\n          didSomething = true\n          // edit parts in place, and push the new one\n          parts.splice(gs, 1)\n          const other = parts.slice(0)\n          other[gs] = '**'\n          globParts.push(other)\n          gs--\n        }\n\n        // 
    // -> 
    /\n        if (!this.preserveMultipleSlashes) {\n          for (let i = 1; i < parts.length - 1; i++) {\n            const p = parts[i]\n            // don't squeeze out UNC patterns\n            if (i === 1 && p === '' && parts[0] === '') continue\n            if (p === '.' || p === '') {\n              didSomething = true\n              parts.splice(i, 1)\n              i--\n            }\n          }\n          if (\n            parts[0] === '.' &&\n            parts.length === 2 &&\n            (parts[1] === '.' || parts[1] === '')\n          ) {\n            didSomething = true\n            parts.pop()\n          }\n        }\n\n        // 
    /

    /../ ->

    /\n        let dd: number = 0\n        while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n          const p = parts[dd - 1]\n          if (p && p !== '.' && p !== '..' && p !== '**') {\n            didSomething = true\n            const needDot = dd === 1 && parts[dd + 1] === '**'\n            const splin = needDot ? ['.'] : []\n            parts.splice(dd - 1, 2, ...splin)\n            if (parts.length === 0) parts.push('')\n            dd -= 2\n          }\n        }\n      }\n    } while (didSomething)\n\n    return globParts\n  }\n\n  // second phase: multi-pattern dedupes\n  // {
    /*/,
    /

    /} ->

    /*/\n  // {
    /,
    /} -> 
    /\n  // {
    /**/,
    /} -> 
    /**/\n  //\n  // {
    /**/,
    /**/

    /} ->

    /**/\n  // ^-- not valid because ** doens't follow symlinks\n  secondPhasePreProcess(globParts: string[][]): string[][] {\n    for (let i = 0; i < globParts.length - 1; i++) {\n      for (let j = i + 1; j < globParts.length; j++) {\n        const matched = this.partsMatch(\n          globParts[i],\n          globParts[j],\n          !this.preserveMultipleSlashes\n        )\n        if (matched) {\n          globParts[i] = []\n          globParts[j] = matched\n          break\n        }\n      }\n    }\n    return globParts.filter(gs => gs.length)\n  }\n\n  partsMatch(\n    a: string[],\n    b: string[],\n    emptyGSMatch: boolean = false\n  ): false | string[] {\n    let ai = 0\n    let bi = 0\n    let result: string[] = []\n    let which: string = ''\n    while (ai < a.length && bi < b.length) {\n      if (a[ai] === b[bi]) {\n        result.push(which === 'b' ? b[bi] : a[ai])\n        ai++\n        bi++\n      } else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {\n        result.push(a[ai])\n        ai++\n      } else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {\n        result.push(b[bi])\n        bi++\n      } else if (\n        a[ai] === '*' &&\n        b[bi] &&\n        (this.options.dot || !b[bi].startsWith('.')) &&\n        b[bi] !== '**'\n      ) {\n        if (which === 'b') return false\n        which = 'a'\n        result.push(a[ai])\n        ai++\n        bi++\n      } else if (\n        b[bi] === '*' &&\n        a[ai] &&\n        (this.options.dot || !a[ai].startsWith('.')) &&\n        a[ai] !== '**'\n      ) {\n        if (which === 'a') return false\n        which = 'b'\n        result.push(b[bi])\n        ai++\n        bi++\n      } else {\n        return false\n      }\n    }\n    // if we fall out of the loop, it means they two are identical\n    // as long as their lengths match\n    return a.length === b.length && result\n  }\n\n  parseNegate() {\n    if (this.nonegate) return\n\n    const pattern = this.pattern\n    let negate = false\n    let negateOffset = 0\n\n    for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {\n      negate = !negate\n      negateOffset++\n    }\n\n    if (negateOffset) this.pattern = pattern.slice(negateOffset)\n    this.negate = negate\n  }\n\n  // set partial to true to test if, for example,\n  // \"/a/b\" matches the start of \"/*/b/*/d\"\n  // Partial means, if you run out of file before you run\n  // out of pattern, then that's fine, as long as all\n  // the parts match.\n  matchOne(file: string[], pattern: ParseReturn[], partial: boolean = false) {\n    const options = this.options\n\n    // UNC paths like //?/X:/... can match X:/... and vice versa\n    // Drive letters in absolute drive or unc paths are always compared\n    // case-insensitively.\n    if (this.isWindows) {\n      const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0])\n      const fileUNC =\n        !fileDrive &&\n        file[0] === '' &&\n        file[1] === '' &&\n        file[2] === '?' &&\n        /^[a-z]:$/i.test(file[3])\n\n      const patternDrive =\n        typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0])\n      const patternUNC =\n        !patternDrive &&\n        pattern[0] === '' &&\n        pattern[1] === '' &&\n        pattern[2] === '?' &&\n        typeof pattern[3] === 'string' &&\n        /^[a-z]:$/i.test(pattern[3])\n\n      const fdi = fileUNC ? 3 : fileDrive ? 0 : undefined\n      const pdi = patternUNC ? 3 : patternDrive ? 0 : undefined\n      if (typeof fdi === 'number' && typeof pdi === 'number') {\n        const [fd, pd]: [string, string] = [file[fdi], pattern[pdi] as string]\n        if (fd.toLowerCase() === pd.toLowerCase()) {\n          pattern[pdi] = fd\n          if (pdi > fdi) {\n            pattern = pattern.slice(pdi)\n          } else if (fdi > pdi) {\n            file = file.slice(fdi)\n          }\n        }\n      }\n    }\n\n    // resolve and reduce . and .. portions in the file as well.\n    // dont' need to do the second phase, because it's only one string[]\n    const { optimizationLevel = 1 } = this.options\n    if (optimizationLevel >= 2) {\n      file = this.levelTwoFileOptimize(file)\n    }\n\n    this.debug('matchOne', this, { file, pattern })\n    this.debug('matchOne', file.length, pattern.length)\n\n    for (\n      var fi = 0, pi = 0, fl = file.length, pl = pattern.length;\n      fi < fl && pi < pl;\n      fi++, pi++\n    ) {\n      this.debug('matchOne loop')\n      var p = pattern[pi]\n      var f = file[fi]\n\n      this.debug(pattern, p, f)\n\n      // should be impossible.\n      // some invalid regexp stuff in the set.\n      /* c8 ignore start */\n      if (p === false) {\n        return false\n      }\n      /* c8 ignore stop */\n\n      if (p === GLOBSTAR) {\n        this.debug('GLOBSTAR', [pattern, p, f])\n\n        // \"**\"\n        // a/**/b/**/c would match the following:\n        // a/b/x/y/z/c\n        // a/x/y/z/b/c\n        // a/b/x/b/x/c\n        // a/b/c\n        // To do this, take the rest of the pattern after\n        // the **, and see if it would match the file remainder.\n        // If so, return success.\n        // If not, the ** \"swallows\" a segment, and try again.\n        // This is recursively awful.\n        //\n        // a/**/b/**/c matching a/b/x/y/z/c\n        // - a matches a\n        // - doublestar\n        //   - matchOne(b/x/y/z/c, b/**/c)\n        //     - b matches b\n        //     - doublestar\n        //       - matchOne(x/y/z/c, c) -> no\n        //       - matchOne(y/z/c, c) -> no\n        //       - matchOne(z/c, c) -> no\n        //       - matchOne(c, c) yes, hit\n        var fr = fi\n        var pr = pi + 1\n        if (pr === pl) {\n          this.debug('** at the end')\n          // a ** at the end will just swallow the rest.\n          // We have found a match.\n          // however, it will not swallow /.x, unless\n          // options.dot is set.\n          // . and .. are *never* matched by **, for explosively\n          // exponential reasons.\n          for (; fi < fl; fi++) {\n            if (\n              file[fi] === '.' ||\n              file[fi] === '..' ||\n              (!options.dot && file[fi].charAt(0) === '.')\n            )\n              return false\n          }\n          return true\n        }\n\n        // ok, let's see if we can swallow whatever we can.\n        while (fr < fl) {\n          var swallowee = file[fr]\n\n          this.debug('\\nglobstar while', file, fr, pattern, pr, swallowee)\n\n          // XXX remove this slice.  Just pass the start index.\n          if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {\n            this.debug('globstar found match!', fr, fl, swallowee)\n            // found a match.\n            return true\n          } else {\n            // can't swallow \".\" or \"..\" ever.\n            // can only swallow \".foo\" when explicitly asked.\n            if (\n              swallowee === '.' ||\n              swallowee === '..' ||\n              (!options.dot && swallowee.charAt(0) === '.')\n            ) {\n              this.debug('dot detected!', file, fr, pattern, pr)\n              break\n            }\n\n            // ** swallows a segment, and continue.\n            this.debug('globstar swallow a segment, and continue')\n            fr++\n          }\n        }\n\n        // no match was found.\n        // However, in partial mode, we can't say this is necessarily over.\n        /* c8 ignore start */\n        if (partial) {\n          // ran out of file\n          this.debug('\\n>>> no match, partial?', file, fr, pattern, pr)\n          if (fr === fl) {\n            return true\n          }\n        }\n        /* c8 ignore stop */\n        return false\n      }\n\n      // something other than **\n      // non-magic patterns just have to match exactly\n      // patterns with magic have been turned into regexps.\n      let hit: boolean\n      if (typeof p === 'string') {\n        hit = f === p\n        this.debug('string match', p, f, hit)\n      } else {\n        hit = p.test(f)\n        this.debug('pattern match', p, f, hit)\n      }\n\n      if (!hit) return false\n    }\n\n    // Note: ending in / means that we'll get a final \"\"\n    // at the end of the pattern.  This can only match a\n    // corresponding \"\" at the end of the file.\n    // If the file ends in /, then it can only match a\n    // a pattern that ends in /, unless the pattern just\n    // doesn't have any more for it. But, a/b/ should *not*\n    // match \"a/b/*\", even though \"\" matches against the\n    // [^/]*? pattern, except in partial mode, where it might\n    // simply not be reached yet.\n    // However, a/b/ should still satisfy a/*\n\n    // now either we fell off the end of the pattern, or we're done.\n    if (fi === fl && pi === pl) {\n      // ran out of pattern and filename at the same time.\n      // an exact hit!\n      return true\n    } else if (fi === fl) {\n      // ran out of file, but still had pattern left.\n      // this is ok if we're doing the match as part of\n      // a glob fs traversal.\n      return partial\n    } else if (pi === pl) {\n      // ran out of pattern, still have file left.\n      // this is only acceptable if we're on the very last\n      // empty segment of a file with a trailing slash.\n      // a/* should match a/b/\n      return fi === fl - 1 && file[fi] === ''\n\n      /* c8 ignore start */\n    } else {\n      // should be unreachable.\n      throw new Error('wtf?')\n    }\n    /* c8 ignore stop */\n  }\n\n  braceExpand() {\n    return braceExpand(this.pattern, this.options)\n  }\n\n  parse(pattern: string): ParseReturn {\n    assertValidPattern(pattern)\n\n    const options = this.options\n\n    // shortcuts\n    if (pattern === '**') return GLOBSTAR\n    if (pattern === '') return ''\n\n    // far and away, the most common glob pattern parts are\n    // *, *.*, and *.  Add a fast check method for those.\n    let m: RegExpMatchArray | null\n    let fastTest: null | ((f: string) => boolean) = null\n    if ((m = pattern.match(starRE))) {\n      fastTest = options.dot ? starTestDot : starTest\n    } else if ((m = pattern.match(starDotExtRE))) {\n      fastTest = (\n        options.nocase\n          ? options.dot\n            ? starDotExtTestNocaseDot\n            : starDotExtTestNocase\n          : options.dot\n          ? starDotExtTestDot\n          : starDotExtTest\n      )(m[1])\n    } else if ((m = pattern.match(qmarksRE))) {\n      fastTest = (\n        options.nocase\n          ? options.dot\n            ? qmarksTestNocaseDot\n            : qmarksTestNocase\n          : options.dot\n          ? qmarksTestDot\n          : qmarksTest\n      )(m)\n    } else if ((m = pattern.match(starDotStarRE))) {\n      fastTest = options.dot ? starDotStarTestDot : starDotStarTest\n    } else if ((m = pattern.match(dotStarRE))) {\n      fastTest = dotStarTest\n    }\n\n    const re = AST.fromGlob(pattern, this.options).toMMPattern()\n    if (fastTest && typeof re === 'object') {\n      // Avoids overriding in frozen environments\n      Reflect.defineProperty(re, 'test', { value: fastTest })\n    }\n    return re\n  }\n\n  makeRe() {\n    if (this.regexp || this.regexp === false) return this.regexp\n\n    // at this point, this.set is a 2d array of partial\n    // pattern strings, or \"**\".\n    //\n    // It's better to use .match().  This function shouldn't\n    // be used, really, but it's pretty convenient sometimes,\n    // when you just want to work with a regex.\n    const set = this.set\n\n    if (!set.length) {\n      this.regexp = false\n      return this.regexp\n    }\n    const options = this.options\n\n    const twoStar = options.noglobstar\n      ? star\n      : options.dot\n      ? twoStarDot\n      : twoStarNoDot\n    const flags = new Set(options.nocase ? ['i'] : [])\n\n    // regexpify non-globstar patterns\n    // if ** is only item, then we just do one twoStar\n    // if ** is first, and there are more, prepend (\\/|twoStar\\/)? to next\n    // if ** is last, append (\\/twoStar|) to previous\n    // if ** is in the middle, append (\\/|\\/twoStar\\/) to previous\n    // then filter out GLOBSTAR symbols\n    let re = set\n      .map(pattern => {\n        const pp: (string | typeof GLOBSTAR)[] = pattern.map(p => {\n          if (p instanceof RegExp) {\n            for (const f of p.flags.split('')) flags.add(f)\n          }\n          return typeof p === 'string'\n            ? regExpEscape(p)\n            : p === GLOBSTAR\n            ? GLOBSTAR\n            : p._src\n        }) as (string | typeof GLOBSTAR)[]\n        pp.forEach((p, i) => {\n          const next = pp[i + 1]\n          const prev = pp[i - 1]\n          if (p !== GLOBSTAR || prev === GLOBSTAR) {\n            return\n          }\n          if (prev === undefined) {\n            if (next !== undefined && next !== GLOBSTAR) {\n              pp[i + 1] = '(?:\\\\/|' + twoStar + '\\\\/)?' + next\n            } else {\n              pp[i] = twoStar\n            }\n          } else if (next === undefined) {\n            pp[i - 1] = prev + '(?:\\\\/|' + twoStar + ')?'\n          } else if (next !== GLOBSTAR) {\n            pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + '\\\\/)' + next\n            pp[i + 1] = GLOBSTAR\n          }\n        })\n        return pp.filter(p => p !== GLOBSTAR).join('/')\n      })\n      .join('|')\n\n    // need to wrap in parens if we had more than one thing with |,\n    // otherwise only the first will be anchored to ^ and the last to $\n    const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', '']\n    // must match entire pattern\n    // ending in a * or ** will make it less strict.\n    re = '^' + open + re + close + '$'\n\n    // can match anything, as long as it's not this.\n    if (this.negate) re = '^(?!' + re + ').+$'\n\n    try {\n      this.regexp = new RegExp(re, [...flags].join(''))\n      /* c8 ignore start */\n    } catch (ex) {\n      // should be impossible\n      this.regexp = false\n    }\n    /* c8 ignore stop */\n    return this.regexp\n  }\n\n  slashSplit(p: string) {\n    // if p starts with // on windows, we preserve that\n    // so that UNC paths aren't broken.  Otherwise, any number of\n    // / characters are coalesced into one, unless\n    // preserveMultipleSlashes is set to true.\n    if (this.preserveMultipleSlashes) {\n      return p.split('/')\n    } else if (this.isWindows && /^\\/\\/[^\\/]+/.test(p)) {\n      // add an extra '' for the one we lose\n      return ['', ...p.split(/\\/+/)]\n    } else {\n      return p.split(/\\/+/)\n    }\n  }\n\n  match(f: string, partial = this.partial) {\n    this.debug('match', f, this.pattern)\n    // short-circuit in the case of busted things.\n    // comments, etc.\n    if (this.comment) {\n      return false\n    }\n    if (this.empty) {\n      return f === ''\n    }\n\n    if (f === '/' && partial) {\n      return true\n    }\n\n    const options = this.options\n\n    // windows: need to use /, not \\\n    if (this.isWindows) {\n      f = f.split('\\\\').join('/')\n    }\n\n    // treat the test path as a set of pathparts.\n    const ff = this.slashSplit(f)\n    this.debug(this.pattern, 'split', ff)\n\n    // just ONE of the pattern sets in this.set needs to match\n    // in order for it to be valid.  If negating, then just one\n    // match means that we have failed.\n    // Either way, return on the first hit.\n\n    const set = this.set\n    this.debug(this.pattern, 'set', set)\n\n    // Find the basename of the path by looking for the last non-empty segment\n    let filename: string = ff[ff.length - 1]\n    if (!filename) {\n      for (let i = ff.length - 2; !filename && i >= 0; i--) {\n        filename = ff[i]\n      }\n    }\n\n    for (let i = 0; i < set.length; i++) {\n      const pattern = set[i]\n      let file = ff\n      if (options.matchBase && pattern.length === 1) {\n        file = [filename]\n      }\n      const hit = this.matchOne(file, pattern, partial)\n      if (hit) {\n        if (options.flipNegate) {\n          return true\n        }\n        return !this.negate\n      }\n    }\n\n    // didn't get any hits.  this is success if it's a negative\n    // pattern, failure otherwise.\n    if (options.flipNegate) {\n      return false\n    }\n    return this.negate\n  }\n\n  static defaults(def: MinimatchOptions) {\n    return minimatch.defaults(def).Minimatch\n  }\n}\n/* c8 ignore start */\nexport { AST } from './ast.js'\nexport { escape } from './escape.js'\nexport { unescape } from './unescape.js'\n/* c8 ignore stop */\nminimatch.AST = AST\nminimatch.Minimatch = Minimatch\nminimatch.escape = escape\nminimatch.unescape = unescape\n"]}
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/esm/package.json b/node_modules/minimatch/dist/esm/package.json
    deleted file mode 100644
    index 3dbc1ca..0000000
    --- a/node_modules/minimatch/dist/esm/package.json
    +++ /dev/null
    @@ -1,3 +0,0 @@
    -{
    -  "type": "module"
    -}
    diff --git a/node_modules/minimatch/dist/esm/unescape.d.ts b/node_modules/minimatch/dist/esm/unescape.d.ts
    deleted file mode 100644
    index 23a7b38..0000000
    --- a/node_modules/minimatch/dist/esm/unescape.d.ts
    +++ /dev/null
    @@ -1,17 +0,0 @@
    -import { MinimatchOptions } from './index.js';
    -/**
    - * Un-escape a string that has been escaped with {@link escape}.
    - *
    - * If the {@link windowsPathsNoEscape} option is used, then square-brace
    - * escapes are removed, but not backslash escapes.  For example, it will turn
    - * the string `'[*]'` into `*`, but it will not turn `'\\*'` into `'*'`,
    - * becuase `\` is a path separator in `windowsPathsNoEscape` mode.
    - *
    - * When `windowsPathsNoEscape` is not set, then both brace escapes and
    - * backslash escapes are removed.
    - *
    - * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped
    - * or unescaped.
    - */
    -export declare const unescape: (s: string, { windowsPathsNoEscape, }?: Pick) => string;
    -//# sourceMappingURL=unescape.d.ts.map
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/esm/unescape.d.ts.map b/node_modules/minimatch/dist/esm/unescape.d.ts.map
    deleted file mode 100644
    index 7ace070..0000000
    --- a/node_modules/minimatch/dist/esm/unescape.d.ts.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"unescape.d.ts","sourceRoot":"","sources":["../../src/unescape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC7C;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,QAAQ,MAChB,MAAM,8BAGN,KAAK,gBAAgB,EAAE,sBAAsB,CAAC,WAKlD,CAAA"}
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/esm/unescape.js b/node_modules/minimatch/dist/esm/unescape.js
    deleted file mode 100644
    index 0faf9a2..0000000
    --- a/node_modules/minimatch/dist/esm/unescape.js
    +++ /dev/null
    @@ -1,20 +0,0 @@
    -/**
    - * Un-escape a string that has been escaped with {@link escape}.
    - *
    - * If the {@link windowsPathsNoEscape} option is used, then square-brace
    - * escapes are removed, but not backslash escapes.  For example, it will turn
    - * the string `'[*]'` into `*`, but it will not turn `'\\*'` into `'*'`,
    - * becuase `\` is a path separator in `windowsPathsNoEscape` mode.
    - *
    - * When `windowsPathsNoEscape` is not set, then both brace escapes and
    - * backslash escapes are removed.
    - *
    - * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped
    - * or unescaped.
    - */
    -export const unescape = (s, { windowsPathsNoEscape = false, } = {}) => {
    -    return windowsPathsNoEscape
    -        ? s.replace(/\[([^\/\\])\]/g, '$1')
    -        : s.replace(/((?!\\).|^)\[([^\/\\])\]/g, '$1$2').replace(/\\([^\/])/g, '$1');
    -};
    -//# sourceMappingURL=unescape.js.map
    \ No newline at end of file
    diff --git a/node_modules/minimatch/dist/esm/unescape.js.map b/node_modules/minimatch/dist/esm/unescape.js.map
    deleted file mode 100644
    index eb146c2..0000000
    --- a/node_modules/minimatch/dist/esm/unescape.js.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"unescape.js","sourceRoot":"","sources":["../../src/unescape.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,MACsB,EAAE,EACtD,EAAE;IACF,OAAO,oBAAoB;QACzB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC;QACnC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,2BAA2B,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;AAChF,CAAC,CAAA","sourcesContent":["import { MinimatchOptions } from './index.js'\n/**\n * Un-escape a string that has been escaped with {@link escape}.\n *\n * If the {@link windowsPathsNoEscape} option is used, then square-brace\n * escapes are removed, but not backslash escapes.  For example, it will turn\n * the string `'[*]'` into `*`, but it will not turn `'\\\\*'` into `'*'`,\n * becuase `\\` is a path separator in `windowsPathsNoEscape` mode.\n *\n * When `windowsPathsNoEscape` is not set, then both brace escapes and\n * backslash escapes are removed.\n *\n * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped\n * or unescaped.\n */\nexport const unescape = (\n  s: string,\n  {\n    windowsPathsNoEscape = false,\n  }: Pick = {}\n) => {\n  return windowsPathsNoEscape\n    ? s.replace(/\\[([^\\/\\\\])\\]/g, '$1')\n    : s.replace(/((?!\\\\).|^)\\[([^\\/\\\\])\\]/g, '$1$2').replace(/\\\\([^\\/])/g, '$1')\n}\n"]}
    \ No newline at end of file
    diff --git a/node_modules/minimatch/package.json b/node_modules/minimatch/package.json
    deleted file mode 100644
    index 01fc48e..0000000
    --- a/node_modules/minimatch/package.json
    +++ /dev/null
    @@ -1,82 +0,0 @@
    -{
    -  "author": "Isaac Z. Schlueter  (http://blog.izs.me)",
    -  "name": "minimatch",
    -  "description": "a glob matcher in javascript",
    -  "version": "9.0.5",
    -  "repository": {
    -    "type": "git",
    -    "url": "git://github.com/isaacs/minimatch.git"
    -  },
    -  "main": "./dist/commonjs/index.js",
    -  "types": "./dist/commonjs/index.d.ts",
    -  "exports": {
    -    "./package.json": "./package.json",
    -    ".": {
    -      "import": {
    -        "types": "./dist/esm/index.d.ts",
    -        "default": "./dist/esm/index.js"
    -      },
    -      "require": {
    -        "types": "./dist/commonjs/index.d.ts",
    -        "default": "./dist/commonjs/index.js"
    -      }
    -    }
    -  },
    -  "files": [
    -    "dist"
    -  ],
    -  "scripts": {
    -    "preversion": "npm test",
    -    "postversion": "npm publish",
    -    "prepublishOnly": "git push origin --follow-tags",
    -    "prepare": "tshy",
    -    "pretest": "npm run prepare",
    -    "presnap": "npm run prepare",
    -    "test": "tap",
    -    "snap": "tap",
    -    "format": "prettier --write . --loglevel warn",
    -    "benchmark": "node benchmark/index.js",
    -    "typedoc": "typedoc --tsconfig tsconfig-esm.json ./src/*.ts"
    -  },
    -  "prettier": {
    -    "semi": false,
    -    "printWidth": 80,
    -    "tabWidth": 2,
    -    "useTabs": false,
    -    "singleQuote": true,
    -    "jsxSingleQuote": false,
    -    "bracketSameLine": true,
    -    "arrowParens": "avoid",
    -    "endOfLine": "lf"
    -  },
    -  "engines": {
    -    "node": ">=16 || 14 >=14.17"
    -  },
    -  "dependencies": {
    -    "brace-expansion": "^2.0.1"
    -  },
    -  "devDependencies": {
    -    "@types/brace-expansion": "^1.1.0",
    -    "@types/node": "^18.15.11",
    -    "@types/tap": "^15.0.8",
    -    "eslint-config-prettier": "^8.6.0",
    -    "mkdirp": "1",
    -    "prettier": "^2.8.2",
    -    "tap": "^18.7.2",
    -    "ts-node": "^10.9.1",
    -    "tshy": "^1.12.0",
    -    "typedoc": "^0.23.21",
    -    "typescript": "^4.9.3"
    -  },
    -  "funding": {
    -    "url": "https://github.com/sponsors/isaacs"
    -  },
    -  "license": "ISC",
    -  "tshy": {
    -    "exports": {
    -      "./package.json": "./package.json",
    -      ".": "./src/index.ts"
    -    }
    -  },
    -  "type": "module"
    -}
    diff --git a/node_modules/minipass/LICENSE b/node_modules/minipass/LICENSE
    deleted file mode 100644
    index 97f8e32..0000000
    --- a/node_modules/minipass/LICENSE
    +++ /dev/null
    @@ -1,15 +0,0 @@
    -The ISC License
    -
    -Copyright (c) 2017-2023 npm, Inc., Isaac Z. Schlueter, and Contributors
    -
    -Permission to use, copy, modify, and/or distribute this software for any
    -purpose with or without fee is hereby granted, provided that the above
    -copyright notice and this permission notice appear in all copies.
    -
    -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
    -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    diff --git a/node_modules/minipass/README.md b/node_modules/minipass/README.md
    deleted file mode 100644
    index 1126330..0000000
    --- a/node_modules/minipass/README.md
    +++ /dev/null
    @@ -1,825 +0,0 @@
    -# minipass
    -
    -A _very_ minimal implementation of a [PassThrough
    -stream](https://nodejs.org/api/stream.html#stream_class_stream_passthrough)
    -
    -[It's very
    -fast](https://docs.google.com/spreadsheets/d/1K_HR5oh3r80b8WVMWCPPjfuWXUgfkmhlX7FGI6JJ8tY/edit?usp=sharing)
    -for objects, strings, and buffers.
    -
    -Supports `pipe()`ing (including multi-`pipe()` and backpressure
    -transmission), buffering data until either a `data` event handler
    -or `pipe()` is added (so you don't lose the first chunk), and
    -most other cases where PassThrough is a good idea.
    -
    -There is a `read()` method, but it's much more efficient to
    -consume data from this stream via `'data'` events or by calling
    -`pipe()` into some other stream. Calling `read()` requires the
    -buffer to be flattened in some cases, which requires copying
    -memory.
    -
    -If you set `objectMode: true` in the options, then whatever is
    -written will be emitted. Otherwise, it'll do a minimal amount of
    -Buffer copying to ensure proper Streams semantics when `read(n)`
    -is called.
    -
    -`objectMode` can only be set at instantiation. Attempting to
    -write something other than a String or Buffer without having set
    -`objectMode` in the options will throw an error.
    -
    -This is not a `through` or `through2` stream. It doesn't
    -transform the data, it just passes it right through. If you want
    -to transform the data, extend the class, and override the
    -`write()` method. Once you're done transforming the data however
    -you want, call `super.write()` with the transform output.
    -
    -For some examples of streams that extend Minipass in various
    -ways, check out:
    -
    -- [minizlib](http://npm.im/minizlib)
    -- [fs-minipass](http://npm.im/fs-minipass)
    -- [tar](http://npm.im/tar)
    -- [minipass-collect](http://npm.im/minipass-collect)
    -- [minipass-flush](http://npm.im/minipass-flush)
    -- [minipass-pipeline](http://npm.im/minipass-pipeline)
    -- [tap](http://npm.im/tap)
    -- [tap-parser](http://npm.im/tap-parser)
    -- [treport](http://npm.im/treport)
    -- [minipass-fetch](http://npm.im/minipass-fetch)
    -- [pacote](http://npm.im/pacote)
    -- [make-fetch-happen](http://npm.im/make-fetch-happen)
    -- [cacache](http://npm.im/cacache)
    -- [ssri](http://npm.im/ssri)
    -- [npm-registry-fetch](http://npm.im/npm-registry-fetch)
    -- [minipass-json-stream](http://npm.im/minipass-json-stream)
    -- [minipass-sized](http://npm.im/minipass-sized)
    -
    -## Usage in TypeScript
    -
    -The `Minipass` class takes three type template definitions:
    -
    -- `RType` the type being read, which defaults to `Buffer`. If
    -  `RType` is `string`, then the constructor _must_ get an options
    -  object specifying either an `encoding` or `objectMode: true`.
    -  If it's anything other than `string` or `Buffer`, then it
    -  _must_ get an options object specifying `objectMode: true`.
    -- `WType` the type being written. If `RType` is `Buffer` or
    -  `string`, then this defaults to `ContiguousData` (Buffer,
    -  string, ArrayBuffer, or ArrayBufferView). Otherwise, it
    -  defaults to `RType`.
    -- `Events` type mapping event names to the arguments emitted
    -  with that event, which extends `Minipass.Events`.
    -
    -To declare types for custom events in subclasses, extend the
    -third parameter with your own event signatures. For example:
    -
    -```js
    -import { Minipass } from 'minipass'
    -
    -// a NDJSON stream that emits 'jsonError' when it can't stringify
    -export interface Events extends Minipass.Events {
    -  jsonError: [e: Error]
    -}
    -
    -export class NDJSONStream extends Minipass {
    -  constructor() {
    -    super({ objectMode: true })
    -  }
    -
    -  // data is type `any` because that's WType
    -  write(data, encoding, cb) {
    -    try {
    -      const json = JSON.stringify(data)
    -      return super.write(json + '\n', encoding, cb)
    -    } catch (er) {
    -      if (!er instanceof Error) {
    -        er = Object.assign(new Error('json stringify failed'), {
    -          cause: er,
    -        })
    -      }
    -      // trying to emit with something OTHER than an error will
    -      // fail, because we declared the event arguments type.
    -      this.emit('jsonError', er)
    -    }
    -  }
    -}
    -
    -const s = new NDJSONStream()
    -s.on('jsonError', e => {
    -  // here, TS knows that e is an Error
    -})
    -```
    -
    -Emitting/handling events that aren't declared in this way is
    -fine, but the arguments will be typed as `unknown`.
    -
    -## Differences from Node.js Streams
    -
    -There are several things that make Minipass streams different
    -from (and in some ways superior to) Node.js core streams.
    -
    -Please read these caveats if you are familiar with node-core
    -streams and intend to use Minipass streams in your programs.
    -
    -You can avoid most of these differences entirely (for a very
    -small performance penalty) by setting `{async: true}` in the
    -constructor options.
    -
    -### Timing
    -
    -Minipass streams are designed to support synchronous use-cases.
    -Thus, data is emitted as soon as it is available, always. It is
    -buffered until read, but no longer. Another way to look at it is
    -that Minipass streams are exactly as synchronous as the logic
    -that writes into them.
    -
    -This can be surprising if your code relies on
    -`PassThrough.write()` always providing data on the next tick
    -rather than the current one, or being able to call `resume()` and
    -not have the entire buffer disappear immediately.
    -
    -However, without this synchronicity guarantee, there would be no
    -way for Minipass to achieve the speeds it does, or support the
    -synchronous use cases that it does. Simply put, waiting takes
    -time.
    -
    -This non-deferring approach makes Minipass streams much easier to
    -reason about, especially in the context of Promises and other
    -flow-control mechanisms.
    -
    -Example:
    -
    -```js
    -// hybrid module, either works
    -import { Minipass } from 'minipass'
    -// or:
    -const { Minipass } = require('minipass')
    -
    -const stream = new Minipass()
    -stream.on('data', () => console.log('data event'))
    -console.log('before write')
    -stream.write('hello')
    -console.log('after write')
    -// output:
    -// before write
    -// data event
    -// after write
    -```
    -
    -### Exception: Async Opt-In
    -
    -If you wish to have a Minipass stream with behavior that more
    -closely mimics Node.js core streams, you can set the stream in
    -async mode either by setting `async: true` in the constructor
    -options, or by setting `stream.async = true` later on.
    -
    -```js
    -// hybrid module, either works
    -import { Minipass } from 'minipass'
    -// or:
    -const { Minipass } = require('minipass')
    -
    -const asyncStream = new Minipass({ async: true })
    -asyncStream.on('data', () => console.log('data event'))
    -console.log('before write')
    -asyncStream.write('hello')
    -console.log('after write')
    -// output:
    -// before write
    -// after write
    -// data event <-- this is deferred until the next tick
    -```
    -
    -Switching _out_ of async mode is unsafe, as it could cause data
    -corruption, and so is not enabled. Example:
    -
    -```js
    -import { Minipass } from 'minipass'
    -const stream = new Minipass({ encoding: 'utf8' })
    -stream.on('data', chunk => console.log(chunk))
    -stream.async = true
    -console.log('before writes')
    -stream.write('hello')
    -setStreamSyncAgainSomehow(stream) // <-- this doesn't actually exist!
    -stream.write('world')
    -console.log('after writes')
    -// hypothetical output would be:
    -// before writes
    -// world
    -// after writes
    -// hello
    -// NOT GOOD!
    -```
    -
    -To avoid this problem, once set into async mode, any attempt to
    -make the stream sync again will be ignored.
    -
    -```js
    -const { Minipass } = require('minipass')
    -const stream = new Minipass({ encoding: 'utf8' })
    -stream.on('data', chunk => console.log(chunk))
    -stream.async = true
    -console.log('before writes')
    -stream.write('hello')
    -stream.async = false // <-- no-op, stream already async
    -stream.write('world')
    -console.log('after writes')
    -// actual output:
    -// before writes
    -// after writes
    -// hello
    -// world
    -```
    -
    -### No High/Low Water Marks
    -
    -Node.js core streams will optimistically fill up a buffer,
    -returning `true` on all writes until the limit is hit, even if
    -the data has nowhere to go. Then, they will not attempt to draw
    -more data in until the buffer size dips below a minimum value.
    -
    -Minipass streams are much simpler. The `write()` method will
    -return `true` if the data has somewhere to go (which is to say,
    -given the timing guarantees, that the data is already there by
    -the time `write()` returns).
    -
    -If the data has nowhere to go, then `write()` returns false, and
    -the data sits in a buffer, to be drained out immediately as soon
    -as anyone consumes it.
    -
    -Since nothing is ever buffered unnecessarily, there is much less
    -copying data, and less bookkeeping about buffer capacity levels.
    -
    -### Hazards of Buffering (or: Why Minipass Is So Fast)
    -
    -Since data written to a Minipass stream is immediately written
    -all the way through the pipeline, and `write()` always returns
    -true/false based on whether the data was fully flushed,
    -backpressure is communicated immediately to the upstream caller.
    -This minimizes buffering.
    -
    -Consider this case:
    -
    -```js
    -const { PassThrough } = require('stream')
    -const p1 = new PassThrough({ highWaterMark: 1024 })
    -const p2 = new PassThrough({ highWaterMark: 1024 })
    -const p3 = new PassThrough({ highWaterMark: 1024 })
    -const p4 = new PassThrough({ highWaterMark: 1024 })
    -
    -p1.pipe(p2).pipe(p3).pipe(p4)
    -p4.on('data', () => console.log('made it through'))
    -
    -// this returns false and buffers, then writes to p2 on next tick (1)
    -// p2 returns false and buffers, pausing p1, then writes to p3 on next tick (2)
    -// p3 returns false and buffers, pausing p2, then writes to p4 on next tick (3)
    -// p4 returns false and buffers, pausing p3, then emits 'data' and 'drain'
    -// on next tick (4)
    -// p3 sees p4's 'drain' event, and calls resume(), emitting 'resume' and
    -// 'drain' on next tick (5)
    -// p2 sees p3's 'drain', calls resume(), emits 'resume' and 'drain' on next tick (6)
    -// p1 sees p2's 'drain', calls resume(), emits 'resume' and 'drain' on next
    -// tick (7)
    -
    -p1.write(Buffer.alloc(2048)) // returns false
    -```
    -
    -Along the way, the data was buffered and deferred at each stage,
    -and multiple event deferrals happened, for an unblocked pipeline
    -where it was perfectly safe to write all the way through!
    -
    -Furthermore, setting a `highWaterMark` of `1024` might lead
    -someone reading the code to think an advisory maximum of 1KiB is
    -being set for the pipeline. However, the actual advisory
    -buffering level is the _sum_ of `highWaterMark` values, since
    -each one has its own bucket.
    -
    -Consider the Minipass case:
    -
    -```js
    -const m1 = new Minipass()
    -const m2 = new Minipass()
    -const m3 = new Minipass()
    -const m4 = new Minipass()
    -
    -m1.pipe(m2).pipe(m3).pipe(m4)
    -m4.on('data', () => console.log('made it through'))
    -
    -// m1 is flowing, so it writes the data to m2 immediately
    -// m2 is flowing, so it writes the data to m3 immediately
    -// m3 is flowing, so it writes the data to m4 immediately
    -// m4 is flowing, so it fires the 'data' event immediately, returns true
    -// m4's write returned true, so m3 is still flowing, returns true
    -// m3's write returned true, so m2 is still flowing, returns true
    -// m2's write returned true, so m1 is still flowing, returns true
    -// No event deferrals or buffering along the way!
    -
    -m1.write(Buffer.alloc(2048)) // returns true
    -```
    -
    -It is extremely unlikely that you _don't_ want to buffer any data
    -written, or _ever_ buffer data that can be flushed all the way
    -through. Neither node-core streams nor Minipass ever fail to
    -buffer written data, but node-core streams do a lot of
    -unnecessary buffering and pausing.
    -
    -As always, the faster implementation is the one that does less
    -stuff and waits less time to do it.
    -
    -### Immediately emit `end` for empty streams (when not paused)
    -
    -If a stream is not paused, and `end()` is called before writing
    -any data into it, then it will emit `end` immediately.
    -
    -If you have logic that occurs on the `end` event which you don't
    -want to potentially happen immediately (for example, closing file
    -descriptors, moving on to the next entry in an archive parse
    -stream, etc.) then be sure to call `stream.pause()` on creation,
    -and then `stream.resume()` once you are ready to respond to the
    -`end` event.
    -
    -However, this is _usually_ not a problem because:
    -
    -### Emit `end` When Asked
    -
    -One hazard of immediately emitting `'end'` is that you may not
    -yet have had a chance to add a listener. In order to avoid this
    -hazard, Minipass streams safely re-emit the `'end'` event if a
    -new listener is added after `'end'` has been emitted.
    -
    -Ie, if you do `stream.on('end', someFunction)`, and the stream
    -has already emitted `end`, then it will call the handler right
    -away. (You can think of this somewhat like attaching a new
    -`.then(fn)` to a previously-resolved Promise.)
    -
    -To prevent calling handlers multiple times who would not expect
    -multiple ends to occur, all listeners are removed from the
    -`'end'` event whenever it is emitted.
    -
    -### Emit `error` When Asked
    -
    -The most recent error object passed to the `'error'` event is
    -stored on the stream. If a new `'error'` event handler is added,
    -and an error was previously emitted, then the event handler will
    -be called immediately (or on `process.nextTick` in the case of
    -async streams).
    -
    -This makes it much more difficult to end up trying to interact
    -with a broken stream, if the error handler is added after an
    -error was previously emitted.
    -
    -### Impact of "immediate flow" on Tee-streams
    -
    -A "tee stream" is a stream piping to multiple destinations:
    -
    -```js
    -const tee = new Minipass()
    -t.pipe(dest1)
    -t.pipe(dest2)
    -t.write('foo') // goes to both destinations
    -```
    -
    -Since Minipass streams _immediately_ process any pending data
    -through the pipeline when a new pipe destination is added, this
    -can have surprising effects, especially when a stream comes in
    -from some other function and may or may not have data in its
    -buffer.
    -
    -```js
    -// WARNING! WILL LOSE DATA!
    -const src = new Minipass()
    -src.write('foo')
    -src.pipe(dest1) // 'foo' chunk flows to dest1 immediately, and is gone
    -src.pipe(dest2) // gets nothing!
    -```
    -
    -One solution is to create a dedicated tee-stream junction that
    -pipes to both locations, and then pipe to _that_ instead.
    -
    -```js
    -// Safe example: tee to both places
    -const src = new Minipass()
    -src.write('foo')
    -const tee = new Minipass()
    -tee.pipe(dest1)
    -tee.pipe(dest2)
    -src.pipe(tee) // tee gets 'foo', pipes to both locations
    -```
    -
    -The same caveat applies to `on('data')` event listeners. The
    -first one added will _immediately_ receive all of the data,
    -leaving nothing for the second:
    -
    -```js
    -// WARNING! WILL LOSE DATA!
    -const src = new Minipass()
    -src.write('foo')
    -src.on('data', handler1) // receives 'foo' right away
    -src.on('data', handler2) // nothing to see here!
    -```
    -
    -Using a dedicated tee-stream can be used in this case as well:
    -
    -```js
    -// Safe example: tee to both data handlers
    -const src = new Minipass()
    -src.write('foo')
    -const tee = new Minipass()
    -tee.on('data', handler1)
    -tee.on('data', handler2)
    -src.pipe(tee)
    -```
    -
    -All of the hazards in this section are avoided by setting `{
    -async: true }` in the Minipass constructor, or by setting
    -`stream.async = true` afterwards. Note that this does add some
    -overhead, so should only be done in cases where you are willing
    -to lose a bit of performance in order to avoid having to refactor
    -program logic.
    -
    -## USAGE
    -
    -It's a stream! Use it like a stream and it'll most likely do what
    -you want.
    -
    -```js
    -import { Minipass } from 'minipass'
    -const mp = new Minipass(options) // options is optional
    -mp.write('foo')
    -mp.pipe(someOtherStream)
    -mp.end('bar')
    -```
    -
    -### OPTIONS
    -
    -- `encoding` How would you like the data coming _out_ of the
    -  stream to be encoded? Accepts any values that can be passed to
    -  `Buffer.toString()`.
    -- `objectMode` Emit data exactly as it comes in. This will be
    -  flipped on by default if you write() something other than a
    -  string or Buffer at any point. Setting `objectMode: true` will
    -  prevent setting any encoding value.
    -- `async` Defaults to `false`. Set to `true` to defer data
    -  emission until next tick. This reduces performance slightly,
    -  but makes Minipass streams use timing behavior closer to Node
    -  core streams. See [Timing](#timing) for more details.
    -- `signal` An `AbortSignal` that will cause the stream to unhook
    -  itself from everything and become as inert as possible. Note
    -  that providing a `signal` parameter will make `'error'` events
    -  no longer throw if they are unhandled, but they will still be
    -  emitted to handlers if any are attached.
    -
    -### API
    -
    -Implements the user-facing portions of Node.js's `Readable` and
    -`Writable` streams.
    -
    -### Methods
    -
    -- `write(chunk, [encoding], [callback])` - Put data in. (Note
    -  that, in the base Minipass class, the same data will come out.)
    -  Returns `false` if the stream will buffer the next write, or
    -  true if it's still in "flowing" mode.
    -- `end([chunk, [encoding]], [callback])` - Signal that you have
    -  no more data to write. This will queue an `end` event to be
    -  fired when all the data has been consumed.
    -- `pause()` - No more data for a while, please. This also
    -  prevents `end` from being emitted for empty streams until the
    -  stream is resumed.
    -- `resume()` - Resume the stream. If there's data in the buffer,
    -  it is all discarded. Any buffered events are immediately
    -  emitted.
    -- `pipe(dest)` - Send all output to the stream provided. When
    -  data is emitted, it is immediately written to any and all pipe
    -  destinations. (Or written on next tick in `async` mode.)
    -- `unpipe(dest)` - Stop piping to the destination stream. This is
    -  immediate, meaning that any asynchronously queued data will
    -  _not_ make it to the destination when running in `async` mode.
    -  - `options.end` - Boolean, end the destination stream when the
    -    source stream ends. Default `true`.
    -  - `options.proxyErrors` - Boolean, proxy `error` events from
    -    the source stream to the destination stream. Note that errors
    -    are _not_ proxied after the pipeline terminates, either due
    -    to the source emitting `'end'` or manually unpiping with
    -    `src.unpipe(dest)`. Default `false`.
    -- `on(ev, fn)`, `emit(ev, fn)` - Minipass streams are
    -  EventEmitters. Some events are given special treatment,
    -  however. (See below under "events".)
    -- `promise()` - Returns a Promise that resolves when the stream
    -  emits `end`, or rejects if the stream emits `error`.
    -- `collect()` - Return a Promise that resolves on `end` with an
    -  array containing each chunk of data that was emitted, or
    -  rejects if the stream emits `error`. Note that this consumes
    -  the stream data.
    -- `concat()` - Same as `collect()`, but concatenates the data
    -  into a single Buffer object. Will reject the returned promise
    -  if the stream is in objectMode, or if it goes into objectMode
    -  by the end of the data.
    -- `read(n)` - Consume `n` bytes of data out of the buffer. If `n`
    -  is not provided, then consume all of it. If `n` bytes are not
    -  available, then it returns null. **Note** consuming streams in
    -  this way is less efficient, and can lead to unnecessary Buffer
    -  copying.
    -- `destroy([er])` - Destroy the stream. If an error is provided,
    -  then an `'error'` event is emitted. If the stream has a
    -  `close()` method, and has not emitted a `'close'` event yet,
    -  then `stream.close()` will be called. Any Promises returned by
    -  `.promise()`, `.collect()` or `.concat()` will be rejected.
    -  After being destroyed, writing to the stream will emit an
    -  error. No more data will be emitted if the stream is destroyed,
    -  even if it was previously buffered.
    -
    -### Properties
    -
    -- `bufferLength` Read-only. Total number of bytes buffered, or in
    -  the case of objectMode, the total number of objects.
    -- `encoding` Read-only. The encoding that has been set.
    -- `flowing` Read-only. Boolean indicating whether a chunk written
    -  to the stream will be immediately emitted.
    -- `emittedEnd` Read-only. Boolean indicating whether the end-ish
    -  events (ie, `end`, `prefinish`, `finish`) have been emitted.
    -  Note that listening on any end-ish event will immediateyl
    -  re-emit it if it has already been emitted.
    -- `writable` Whether the stream is writable. Default `true`. Set
    -  to `false` when `end()`
    -- `readable` Whether the stream is readable. Default `true`.
    -- `pipes` An array of Pipe objects referencing streams that this
    -  stream is piping into.
    -- `destroyed` A getter that indicates whether the stream was
    -  destroyed.
    -- `paused` True if the stream has been explicitly paused,
    -  otherwise false.
    -- `objectMode` Indicates whether the stream is in `objectMode`.
    -- `aborted` Readonly property set when the `AbortSignal`
    -  dispatches an `abort` event.
    -
    -### Events
    -
    -- `data` Emitted when there's data to read. Argument is the data
    -  to read. This is never emitted while not flowing. If a listener
    -  is attached, that will resume the stream.
    -- `end` Emitted when there's no more data to read. This will be
    -  emitted immediately for empty streams when `end()` is called.
    -  If a listener is attached, and `end` was already emitted, then
    -  it will be emitted again. All listeners are removed when `end`
    -  is emitted.
    -- `prefinish` An end-ish event that follows the same logic as
    -  `end` and is emitted in the same conditions where `end` is
    -  emitted. Emitted after `'end'`.
    -- `finish` An end-ish event that follows the same logic as `end`
    -  and is emitted in the same conditions where `end` is emitted.
    -  Emitted after `'prefinish'`.
    -- `close` An indication that an underlying resource has been
    -  released. Minipass does not emit this event, but will defer it
    -  until after `end` has been emitted, since it throws off some
    -  stream libraries otherwise.
    -- `drain` Emitted when the internal buffer empties, and it is
    -  again suitable to `write()` into the stream.
    -- `readable` Emitted when data is buffered and ready to be read
    -  by a consumer.
    -- `resume` Emitted when stream changes state from buffering to
    -  flowing mode. (Ie, when `resume` is called, `pipe` is called,
    -  or a `data` event listener is added.)
    -
    -### Static Methods
    -
    -- `Minipass.isStream(stream)` Returns `true` if the argument is a
    -  stream, and false otherwise. To be considered a stream, the
    -  object must be either an instance of Minipass, or an
    -  EventEmitter that has either a `pipe()` method, or both
    -  `write()` and `end()` methods. (Pretty much any stream in
    -  node-land will return `true` for this.)
    -
    -## EXAMPLES
    -
    -Here are some examples of things you can do with Minipass
    -streams.
    -
    -### simple "are you done yet" promise
    -
    -```js
    -mp.promise().then(
    -  () => {
    -    // stream is finished
    -  },
    -  er => {
    -    // stream emitted an error
    -  }
    -)
    -```
    -
    -### collecting
    -
    -```js
    -mp.collect().then(all => {
    -  // all is an array of all the data emitted
    -  // encoding is supported in this case, so
    -  // so the result will be a collection of strings if
    -  // an encoding is specified, or buffers/objects if not.
    -  //
    -  // In an async function, you may do
    -  // const data = await stream.collect()
    -})
    -```
    -
    -### collecting into a single blob
    -
    -This is a bit slower because it concatenates the data into one
    -chunk for you, but if you're going to do it yourself anyway, it's
    -convenient this way:
    -
    -```js
    -mp.concat().then(onebigchunk => {
    -  // onebigchunk is a string if the stream
    -  // had an encoding set, or a buffer otherwise.
    -})
    -```
    -
    -### iteration
    -
    -You can iterate over streams synchronously or asynchronously in
    -platforms that support it.
    -
    -Synchronous iteration will end when the currently available data
    -is consumed, even if the `end` event has not been reached. In
    -string and buffer mode, the data is concatenated, so unless
    -multiple writes are occurring in the same tick as the `read()`,
    -sync iteration loops will generally only have a single iteration.
    -
    -To consume chunks in this way exactly as they have been written,
    -with no flattening, create the stream with the `{ objectMode:
    -true }` option.
    -
    -```js
    -const mp = new Minipass({ objectMode: true })
    -mp.write('a')
    -mp.write('b')
    -for (let letter of mp) {
    -  console.log(letter) // a, b
    -}
    -mp.write('c')
    -mp.write('d')
    -for (let letter of mp) {
    -  console.log(letter) // c, d
    -}
    -mp.write('e')
    -mp.end()
    -for (let letter of mp) {
    -  console.log(letter) // e
    -}
    -for (let letter of mp) {
    -  console.log(letter) // nothing
    -}
    -```
    -
    -Asynchronous iteration will continue until the end event is reached,
    -consuming all of the data.
    -
    -```js
    -const mp = new Minipass({ encoding: 'utf8' })
    -
    -// some source of some data
    -let i = 5
    -const inter = setInterval(() => {
    -  if (i-- > 0) mp.write(Buffer.from('foo\n', 'utf8'))
    -  else {
    -    mp.end()
    -    clearInterval(inter)
    -  }
    -}, 100)
    -
    -// consume the data with asynchronous iteration
    -async function consume() {
    -  for await (let chunk of mp) {
    -    console.log(chunk)
    -  }
    -  return 'ok'
    -}
    -
    -consume().then(res => console.log(res))
    -// logs `foo\n` 5 times, and then `ok`
    -```
    -
    -### subclass that `console.log()`s everything written into it
    -
    -```js
    -class Logger extends Minipass {
    -  write(chunk, encoding, callback) {
    -    console.log('WRITE', chunk, encoding)
    -    return super.write(chunk, encoding, callback)
    -  }
    -  end(chunk, encoding, callback) {
    -    console.log('END', chunk, encoding)
    -    return super.end(chunk, encoding, callback)
    -  }
    -}
    -
    -someSource.pipe(new Logger()).pipe(someDest)
    -```
    -
    -### same thing, but using an inline anonymous class
    -
    -```js
    -// js classes are fun
    -someSource
    -  .pipe(
    -    new (class extends Minipass {
    -      emit(ev, ...data) {
    -        // let's also log events, because debugging some weird thing
    -        console.log('EMIT', ev)
    -        return super.emit(ev, ...data)
    -      }
    -      write(chunk, encoding, callback) {
    -        console.log('WRITE', chunk, encoding)
    -        return super.write(chunk, encoding, callback)
    -      }
    -      end(chunk, encoding, callback) {
    -        console.log('END', chunk, encoding)
    -        return super.end(chunk, encoding, callback)
    -      }
    -    })()
    -  )
    -  .pipe(someDest)
    -```
    -
    -### subclass that defers 'end' for some reason
    -
    -```js
    -class SlowEnd extends Minipass {
    -  emit(ev, ...args) {
    -    if (ev === 'end') {
    -      console.log('going to end, hold on a sec')
    -      setTimeout(() => {
    -        console.log('ok, ready to end now')
    -        super.emit('end', ...args)
    -      }, 100)
    -      return true
    -    } else {
    -      return super.emit(ev, ...args)
    -    }
    -  }
    -}
    -```
    -
    -### transform that creates newline-delimited JSON
    -
    -```js
    -class NDJSONEncode extends Minipass {
    -  write(obj, cb) {
    -    try {
    -      // JSON.stringify can throw, emit an error on that
    -      return super.write(JSON.stringify(obj) + '\n', 'utf8', cb)
    -    } catch (er) {
    -      this.emit('error', er)
    -    }
    -  }
    -  end(obj, cb) {
    -    if (typeof obj === 'function') {
    -      cb = obj
    -      obj = undefined
    -    }
    -    if (obj !== undefined) {
    -      this.write(obj)
    -    }
    -    return super.end(cb)
    -  }
    -}
    -```
    -
    -### transform that parses newline-delimited JSON
    -
    -```js
    -class NDJSONDecode extends Minipass {
    -  constructor(options) {
    -    // always be in object mode, as far as Minipass is concerned
    -    super({ objectMode: true })
    -    this._jsonBuffer = ''
    -  }
    -  write(chunk, encoding, cb) {
    -    if (
    -      typeof chunk === 'string' &&
    -      typeof encoding === 'string' &&
    -      encoding !== 'utf8'
    -    ) {
    -      chunk = Buffer.from(chunk, encoding).toString()
    -    } else if (Buffer.isBuffer(chunk)) {
    -      chunk = chunk.toString()
    -    }
    -    if (typeof encoding === 'function') {
    -      cb = encoding
    -    }
    -    const jsonData = (this._jsonBuffer + chunk).split('\n')
    -    this._jsonBuffer = jsonData.pop()
    -    for (let i = 0; i < jsonData.length; i++) {
    -      try {
    -        // JSON.parse can throw, emit an error on that
    -        super.write(JSON.parse(jsonData[i]))
    -      } catch (er) {
    -        this.emit('error', er)
    -        continue
    -      }
    -    }
    -    if (cb) cb()
    -  }
    -}
    -```
    diff --git a/node_modules/minipass/dist/commonjs/index.d.ts b/node_modules/minipass/dist/commonjs/index.d.ts
    deleted file mode 100644
    index 031e61a..0000000
    --- a/node_modules/minipass/dist/commonjs/index.d.ts
    +++ /dev/null
    @@ -1,549 +0,0 @@
    -/// 
    -/// 
    -/// 
    -/// 
    -import { EventEmitter } from 'node:events';
    -import { StringDecoder } from 'node:string_decoder';
    -/**
    - * Same as StringDecoder, but exposing the `lastNeed` flag on the type
    - */
    -type SD = StringDecoder & {
    -    lastNeed: boolean;
    -};
    -export type { SD, Pipe, PipeProxyErrors };
    -/**
    - * Return true if the argument is a Minipass stream, Node stream, or something
    - * else that Minipass can interact with.
    - */
    -export declare const isStream: (s: any) => s is NodeJS.WriteStream | NodeJS.ReadStream | Minipass | (NodeJS.ReadStream & {
    -    fd: number;
    -}) | (EventEmitter & {
    -    pause(): any;
    -    resume(): any;
    -    pipe(...destArgs: any[]): any;
    -}) | (NodeJS.WriteStream & {
    -    fd: number;
    -}) | (EventEmitter & {
    -    end(): any;
    -    write(chunk: any, ...args: any[]): any;
    -});
    -/**
    - * Return true if the argument is a valid {@link Minipass.Readable}
    - */
    -export declare const isReadable: (s: any) => s is Minipass.Readable;
    -/**
    - * Return true if the argument is a valid {@link Minipass.Writable}
    - */
    -export declare const isWritable: (s: any) => s is Minipass.Readable;
    -declare const EOF: unique symbol;
    -declare const MAYBE_EMIT_END: unique symbol;
    -declare const EMITTED_END: unique symbol;
    -declare const EMITTING_END: unique symbol;
    -declare const EMITTED_ERROR: unique symbol;
    -declare const CLOSED: unique symbol;
    -declare const READ: unique symbol;
    -declare const FLUSH: unique symbol;
    -declare const FLUSHCHUNK: unique symbol;
    -declare const ENCODING: unique symbol;
    -declare const DECODER: unique symbol;
    -declare const FLOWING: unique symbol;
    -declare const PAUSED: unique symbol;
    -declare const RESUME: unique symbol;
    -declare const BUFFER: unique symbol;
    -declare const PIPES: unique symbol;
    -declare const BUFFERLENGTH: unique symbol;
    -declare const BUFFERPUSH: unique symbol;
    -declare const BUFFERSHIFT: unique symbol;
    -declare const OBJECTMODE: unique symbol;
    -declare const DESTROYED: unique symbol;
    -declare const ERROR: unique symbol;
    -declare const EMITDATA: unique symbol;
    -declare const EMITEND: unique symbol;
    -declare const EMITEND2: unique symbol;
    -declare const ASYNC: unique symbol;
    -declare const ABORT: unique symbol;
    -declare const ABORTED: unique symbol;
    -declare const SIGNAL: unique symbol;
    -declare const DATALISTENERS: unique symbol;
    -declare const DISCARDED: unique symbol;
    -/**
    - * Options that may be passed to stream.pipe()
    - */
    -export interface PipeOptions {
    -    /**
    -     * end the destination stream when the source stream ends
    -     */
    -    end?: boolean;
    -    /**
    -     * proxy errors from the source stream to the destination stream
    -     */
    -    proxyErrors?: boolean;
    -}
    -/**
    - * Internal class representing a pipe to a destination stream.
    - *
    - * @internal
    - */
    -declare class Pipe {
    -    src: Minipass;
    -    dest: Minipass;
    -    opts: PipeOptions;
    -    ondrain: () => any;
    -    constructor(src: Minipass, dest: Minipass.Writable, opts: PipeOptions);
    -    unpipe(): void;
    -    proxyErrors(_er: any): void;
    -    end(): void;
    -}
    -/**
    - * Internal class representing a pipe to a destination stream where
    - * errors are proxied.
    - *
    - * @internal
    - */
    -declare class PipeProxyErrors extends Pipe {
    -    unpipe(): void;
    -    constructor(src: Minipass, dest: Minipass.Writable, opts: PipeOptions);
    -}
    -export declare namespace Minipass {
    -    /**
    -     * Encoding used to create a stream that outputs strings rather than
    -     * Buffer objects.
    -     */
    -    export type Encoding = BufferEncoding | 'buffer' | null;
    -    /**
    -     * Any stream that Minipass can pipe into
    -     */
    -    export type Writable = Minipass | NodeJS.WriteStream | (NodeJS.WriteStream & {
    -        fd: number;
    -    }) | (EventEmitter & {
    -        end(): any;
    -        write(chunk: any, ...args: any[]): any;
    -    });
    -    /**
    -     * Any stream that can be read from
    -     */
    -    export type Readable = Minipass | NodeJS.ReadStream | (NodeJS.ReadStream & {
    -        fd: number;
    -    }) | (EventEmitter & {
    -        pause(): any;
    -        resume(): any;
    -        pipe(...destArgs: any[]): any;
    -    });
    -    /**
    -     * Utility type that can be iterated sync or async
    -     */
    -    export type DualIterable = Iterable & AsyncIterable;
    -    type EventArguments = Record;
    -    /**
    -     * The listing of events that a Minipass class can emit.
    -     * Extend this when extending the Minipass class, and pass as
    -     * the third template argument.  The key is the name of the event,
    -     * and the value is the argument list.
    -     *
    -     * Any undeclared events will still be allowed, but the handler will get
    -     * arguments as `unknown[]`.
    -     */
    -    export interface Events extends EventArguments {
    -        readable: [];
    -        data: [chunk: RType];
    -        error: [er: unknown];
    -        abort: [reason: unknown];
    -        drain: [];
    -        resume: [];
    -        end: [];
    -        finish: [];
    -        prefinish: [];
    -        close: [];
    -        [DESTROYED]: [er?: unknown];
    -        [ERROR]: [er: unknown];
    -    }
    -    /**
    -     * String or buffer-like data that can be joined and sliced
    -     */
    -    export type ContiguousData = Buffer | ArrayBufferLike | ArrayBufferView | string;
    -    export type BufferOrString = Buffer | string;
    -    /**
    -     * Options passed to the Minipass constructor.
    -     */
    -    export type SharedOptions = {
    -        /**
    -         * Defer all data emission and other events until the end of the
    -         * current tick, similar to Node core streams
    -         */
    -        async?: boolean;
    -        /**
    -         * A signal which will abort the stream
    -         */
    -        signal?: AbortSignal;
    -        /**
    -         * Output string encoding. Set to `null` or `'buffer'` (or omit) to
    -         * emit Buffer objects rather than strings.
    -         *
    -         * Conflicts with `objectMode`
    -         */
    -        encoding?: BufferEncoding | null | 'buffer';
    -        /**
    -         * Output data exactly as it was written, supporting non-buffer/string
    -         * data (such as arbitrary objects, falsey values, etc.)
    -         *
    -         * Conflicts with `encoding`
    -         */
    -        objectMode?: boolean;
    -    };
    -    /**
    -     * Options for a string encoded output
    -     */
    -    export type EncodingOptions = SharedOptions & {
    -        encoding: BufferEncoding;
    -        objectMode?: false;
    -    };
    -    /**
    -     * Options for contiguous data buffer output
    -     */
    -    export type BufferOptions = SharedOptions & {
    -        encoding?: null | 'buffer';
    -        objectMode?: false;
    -    };
    -    /**
    -     * Options for objectMode arbitrary output
    -     */
    -    export type ObjectModeOptions = SharedOptions & {
    -        objectMode: true;
    -        encoding?: null;
    -    };
    -    /**
    -     * Utility type to determine allowed options based on read type
    -     */
    -    export type Options = ObjectModeOptions | (T extends string ? EncodingOptions : T extends Buffer ? BufferOptions : SharedOptions);
    -    export {};
    -}
    -/**
    - * Main export, the Minipass class
    - *
    - * `RType` is the type of data emitted, defaults to Buffer
    - *
    - * `WType` is the type of data to be written, if RType is buffer or string,
    - * then any {@link Minipass.ContiguousData} is allowed.
    - *
    - * `Events` is the set of event handler signatures that this object
    - * will emit, see {@link Minipass.Events}
    - */
    -export declare class Minipass = Minipass.Events> extends EventEmitter implements Minipass.DualIterable {
    -    [FLOWING]: boolean;
    -    [PAUSED]: boolean;
    -    [PIPES]: Pipe[];
    -    [BUFFER]: RType[];
    -    [OBJECTMODE]: boolean;
    -    [ENCODING]: BufferEncoding | null;
    -    [ASYNC]: boolean;
    -    [DECODER]: SD | null;
    -    [EOF]: boolean;
    -    [EMITTED_END]: boolean;
    -    [EMITTING_END]: boolean;
    -    [CLOSED]: boolean;
    -    [EMITTED_ERROR]: unknown;
    -    [BUFFERLENGTH]: number;
    -    [DESTROYED]: boolean;
    -    [SIGNAL]?: AbortSignal;
    -    [ABORTED]: boolean;
    -    [DATALISTENERS]: number;
    -    [DISCARDED]: boolean;
    -    /**
    -     * true if the stream can be written
    -     */
    -    writable: boolean;
    -    /**
    -     * true if the stream can be read
    -     */
    -    readable: boolean;
    -    /**
    -     * If `RType` is Buffer, then options do not need to be provided.
    -     * Otherwise, an options object must be provided to specify either
    -     * {@link Minipass.SharedOptions.objectMode} or
    -     * {@link Minipass.SharedOptions.encoding}, as appropriate.
    -     */
    -    constructor(...args: [Minipass.ObjectModeOptions] | (RType extends Buffer ? [] | [Minipass.Options] : [Minipass.Options]));
    -    /**
    -     * The amount of data stored in the buffer waiting to be read.
    -     *
    -     * For Buffer strings, this will be the total byte length.
    -     * For string encoding streams, this will be the string character length,
    -     * according to JavaScript's `string.length` logic.
    -     * For objectMode streams, this is a count of the items waiting to be
    -     * emitted.
    -     */
    -    get bufferLength(): number;
    -    /**
    -     * The `BufferEncoding` currently in use, or `null`
    -     */
    -    get encoding(): BufferEncoding | null;
    -    /**
    -     * @deprecated - This is a read only property
    -     */
    -    set encoding(_enc: BufferEncoding | null);
    -    /**
    -     * @deprecated - Encoding may only be set at instantiation time
    -     */
    -    setEncoding(_enc: Minipass.Encoding): void;
    -    /**
    -     * True if this is an objectMode stream
    -     */
    -    get objectMode(): boolean;
    -    /**
    -     * @deprecated - This is a read-only property
    -     */
    -    set objectMode(_om: boolean);
    -    /**
    -     * true if this is an async stream
    -     */
    -    get ['async'](): boolean;
    -    /**
    -     * Set to true to make this stream async.
    -     *
    -     * Once set, it cannot be unset, as this would potentially cause incorrect
    -     * behavior.  Ie, a sync stream can be made async, but an async stream
    -     * cannot be safely made sync.
    -     */
    -    set ['async'](a: boolean);
    -    [ABORT](): void;
    -    /**
    -     * True if the stream has been aborted.
    -     */
    -    get aborted(): boolean;
    -    /**
    -     * No-op setter. Stream aborted status is set via the AbortSignal provided
    -     * in the constructor options.
    -     */
    -    set aborted(_: boolean);
    -    /**
    -     * Write data into the stream
    -     *
    -     * If the chunk written is a string, and encoding is not specified, then
    -     * `utf8` will be assumed. If the stream encoding matches the encoding of
    -     * a written string, and the state of the string decoder allows it, then
    -     * the string will be passed through to either the output or the internal
    -     * buffer without any processing. Otherwise, it will be turned into a
    -     * Buffer object for processing into the desired encoding.
    -     *
    -     * If provided, `cb` function is called immediately before return for
    -     * sync streams, or on next tick for async streams, because for this
    -     * base class, a chunk is considered "processed" once it is accepted
    -     * and either emitted or buffered. That is, the callback does not indicate
    -     * that the chunk has been eventually emitted, though of course child
    -     * classes can override this function to do whatever processing is required
    -     * and call `super.write(...)` only once processing is completed.
    -     */
    -    write(chunk: WType, cb?: () => void): boolean;
    -    write(chunk: WType, encoding?: Minipass.Encoding, cb?: () => void): boolean;
    -    /**
    -     * Low-level explicit read method.
    -     *
    -     * In objectMode, the argument is ignored, and one item is returned if
    -     * available.
    -     *
    -     * `n` is the number of bytes (or in the case of encoding streams,
    -     * characters) to consume. If `n` is not provided, then the entire buffer
    -     * is returned, or `null` is returned if no data is available.
    -     *
    -     * If `n` is greater that the amount of data in the internal buffer,
    -     * then `null` is returned.
    -     */
    -    read(n?: number | null): RType | null;
    -    [READ](n: number | null, chunk: RType): RType;
    -    /**
    -     * End the stream, optionally providing a final write.
    -     *
    -     * See {@link Minipass#write} for argument descriptions
    -     */
    -    end(cb?: () => void): this;
    -    end(chunk: WType, cb?: () => void): this;
    -    end(chunk: WType, encoding?: Minipass.Encoding, cb?: () => void): this;
    -    [RESUME](): void;
    -    /**
    -     * Resume the stream if it is currently in a paused state
    -     *
    -     * If called when there are no pipe destinations or `data` event listeners,
    -     * this will place the stream in a "discarded" state, where all data will
    -     * be thrown away. The discarded state is removed if a pipe destination or
    -     * data handler is added, if pause() is called, or if any synchronous or
    -     * asynchronous iteration is started.
    -     */
    -    resume(): void;
    -    /**
    -     * Pause the stream
    -     */
    -    pause(): void;
    -    /**
    -     * true if the stream has been forcibly destroyed
    -     */
    -    get destroyed(): boolean;
    -    /**
    -     * true if the stream is currently in a flowing state, meaning that
    -     * any writes will be immediately emitted.
    -     */
    -    get flowing(): boolean;
    -    /**
    -     * true if the stream is currently in a paused state
    -     */
    -    get paused(): boolean;
    -    [BUFFERPUSH](chunk: RType): void;
    -    [BUFFERSHIFT](): RType;
    -    [FLUSH](noDrain?: boolean): void;
    -    [FLUSHCHUNK](chunk: RType): boolean;
    -    /**
    -     * Pipe all data emitted by this stream into the destination provided.
    -     *
    -     * Triggers the flow of data.
    -     */
    -    pipe(dest: W, opts?: PipeOptions): W;
    -    /**
    -     * Fully unhook a piped destination stream.
    -     *
    -     * If the destination stream was the only consumer of this stream (ie,
    -     * there are no other piped destinations or `'data'` event listeners)
    -     * then the flow of data will stop until there is another consumer or
    -     * {@link Minipass#resume} is explicitly called.
    -     */
    -    unpipe(dest: W): void;
    -    /**
    -     * Alias for {@link Minipass#on}
    -     */
    -    addListener(ev: Event, handler: (...args: Events[Event]) => any): this;
    -    /**
    -     * Mostly identical to `EventEmitter.on`, with the following
    -     * behavior differences to prevent data loss and unnecessary hangs:
    -     *
    -     * - Adding a 'data' event handler will trigger the flow of data
    -     *
    -     * - Adding a 'readable' event handler when there is data waiting to be read
    -     *   will cause 'readable' to be emitted immediately.
    -     *
    -     * - Adding an 'endish' event handler ('end', 'finish', etc.) which has
    -     *   already passed will cause the event to be emitted immediately and all
    -     *   handlers removed.
    -     *
    -     * - Adding an 'error' event handler after an error has been emitted will
    -     *   cause the event to be re-emitted immediately with the error previously
    -     *   raised.
    -     */
    -    on(ev: Event, handler: (...args: Events[Event]) => any): this;
    -    /**
    -     * Alias for {@link Minipass#off}
    -     */
    -    removeListener(ev: Event, handler: (...args: Events[Event]) => any): this;
    -    /**
    -     * Mostly identical to `EventEmitter.off`
    -     *
    -     * If a 'data' event handler is removed, and it was the last consumer
    -     * (ie, there are no pipe destinations or other 'data' event listeners),
    -     * then the flow of data will stop until there is another consumer or
    -     * {@link Minipass#resume} is explicitly called.
    -     */
    -    off(ev: Event, handler: (...args: Events[Event]) => any): this;
    -    /**
    -     * Mostly identical to `EventEmitter.removeAllListeners`
    -     *
    -     * If all 'data' event handlers are removed, and they were the last consumer
    -     * (ie, there are no pipe destinations), then the flow of data will stop
    -     * until there is another consumer or {@link Minipass#resume} is explicitly
    -     * called.
    -     */
    -    removeAllListeners(ev?: Event): this;
    -    /**
    -     * true if the 'end' event has been emitted
    -     */
    -    get emittedEnd(): boolean;
    -    [MAYBE_EMIT_END](): void;
    -    /**
    -     * Mostly identical to `EventEmitter.emit`, with the following
    -     * behavior differences to prevent data loss and unnecessary hangs:
    -     *
    -     * If the stream has been destroyed, and the event is something other
    -     * than 'close' or 'error', then `false` is returned and no handlers
    -     * are called.
    -     *
    -     * If the event is 'end', and has already been emitted, then the event
    -     * is ignored. If the stream is in a paused or non-flowing state, then
    -     * the event will be deferred until data flow resumes. If the stream is
    -     * async, then handlers will be called on the next tick rather than
    -     * immediately.
    -     *
    -     * If the event is 'close', and 'end' has not yet been emitted, then
    -     * the event will be deferred until after 'end' is emitted.
    -     *
    -     * If the event is 'error', and an AbortSignal was provided for the stream,
    -     * and there are no listeners, then the event is ignored, matching the
    -     * behavior of node core streams in the presense of an AbortSignal.
    -     *
    -     * If the event is 'finish' or 'prefinish', then all listeners will be
    -     * removed after emitting the event, to prevent double-firing.
    -     */
    -    emit(ev: Event, ...args: Events[Event]): boolean;
    -    [EMITDATA](data: RType): boolean;
    -    [EMITEND](): boolean;
    -    [EMITEND2](): boolean;
    -    /**
    -     * Return a Promise that resolves to an array of all emitted data once
    -     * the stream ends.
    -     */
    -    collect(): Promise;
    -    /**
    -     * Return a Promise that resolves to the concatenation of all emitted data
    -     * once the stream ends.
    -     *
    -     * Not allowed on objectMode streams.
    -     */
    -    concat(): Promise;
    -    /**
    -     * Return a void Promise that resolves once the stream ends.
    -     */
    -    promise(): Promise;
    -    /**
    -     * Asynchronous `for await of` iteration.
    -     *
    -     * This will continue emitting all chunks until the stream terminates.
    -     */
    -    [Symbol.asyncIterator](): AsyncGenerator;
    -    /**
    -     * Synchronous `for of` iteration.
    -     *
    -     * The iteration will terminate when the internal buffer runs out, even
    -     * if the stream has not yet terminated.
    -     */
    -    [Symbol.iterator](): Generator;
    -    /**
    -     * Destroy a stream, preventing it from being used for any further purpose.
    -     *
    -     * If the stream has a `close()` method, then it will be called on
    -     * destruction.
    -     *
    -     * After destruction, any attempt to write data, read data, or emit most
    -     * events will be ignored.
    -     *
    -     * If an error argument is provided, then it will be emitted in an
    -     * 'error' event.
    -     */
    -    destroy(er?: unknown): this;
    -    /**
    -     * Alias for {@link isStream}
    -     *
    -     * Former export location, maintained for backwards compatibility.
    -     *
    -     * @deprecated
    -     */
    -    static get isStream(): (s: any) => s is NodeJS.WriteStream | NodeJS.ReadStream | Minipass | (NodeJS.ReadStream & {
    -        fd: number;
    -    }) | (EventEmitter & {
    -        pause(): any;
    -        resume(): any;
    -        pipe(...destArgs: any[]): any;
    -    }) | (NodeJS.WriteStream & {
    -        fd: number;
    -    }) | (EventEmitter & {
    -        end(): any;
    -        write(chunk: any, ...args: any[]): any;
    -    });
    -}
    -//# sourceMappingURL=index.d.ts.map
    \ No newline at end of file
    diff --git a/node_modules/minipass/dist/commonjs/index.d.ts.map b/node_modules/minipass/dist/commonjs/index.d.ts.map
    deleted file mode 100644
    index cac7e00..0000000
    --- a/node_modules/minipass/dist/commonjs/index.d.ts.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
    \ No newline at end of file
    diff --git a/node_modules/minipass/dist/commonjs/index.js b/node_modules/minipass/dist/commonjs/index.js
    deleted file mode 100644
    index 068c095..0000000
    --- a/node_modules/minipass/dist/commonjs/index.js
    +++ /dev/null
    @@ -1,1028 +0,0 @@
    -"use strict";
    -var __importDefault = (this && this.__importDefault) || function (mod) {
    -    return (mod && mod.__esModule) ? mod : { "default": mod };
    -};
    -Object.defineProperty(exports, "__esModule", { value: true });
    -exports.Minipass = exports.isWritable = exports.isReadable = exports.isStream = void 0;
    -const proc = typeof process === 'object' && process
    -    ? process
    -    : {
    -        stdout: null,
    -        stderr: null,
    -    };
    -const node_events_1 = require("node:events");
    -const node_stream_1 = __importDefault(require("node:stream"));
    -const node_string_decoder_1 = require("node:string_decoder");
    -/**
    - * Return true if the argument is a Minipass stream, Node stream, or something
    - * else that Minipass can interact with.
    - */
    -const isStream = (s) => !!s &&
    -    typeof s === 'object' &&
    -    (s instanceof Minipass ||
    -        s instanceof node_stream_1.default ||
    -        (0, exports.isReadable)(s) ||
    -        (0, exports.isWritable)(s));
    -exports.isStream = isStream;
    -/**
    - * Return true if the argument is a valid {@link Minipass.Readable}
    - */
    -const isReadable = (s) => !!s &&
    -    typeof s === 'object' &&
    -    s instanceof node_events_1.EventEmitter &&
    -    typeof s.pipe === 'function' &&
    -    // node core Writable streams have a pipe() method, but it throws
    -    s.pipe !== node_stream_1.default.Writable.prototype.pipe;
    -exports.isReadable = isReadable;
    -/**
    - * Return true if the argument is a valid {@link Minipass.Writable}
    - */
    -const isWritable = (s) => !!s &&
    -    typeof s === 'object' &&
    -    s instanceof node_events_1.EventEmitter &&
    -    typeof s.write === 'function' &&
    -    typeof s.end === 'function';
    -exports.isWritable = isWritable;
    -const EOF = Symbol('EOF');
    -const MAYBE_EMIT_END = Symbol('maybeEmitEnd');
    -const EMITTED_END = Symbol('emittedEnd');
    -const EMITTING_END = Symbol('emittingEnd');
    -const EMITTED_ERROR = Symbol('emittedError');
    -const CLOSED = Symbol('closed');
    -const READ = Symbol('read');
    -const FLUSH = Symbol('flush');
    -const FLUSHCHUNK = Symbol('flushChunk');
    -const ENCODING = Symbol('encoding');
    -const DECODER = Symbol('decoder');
    -const FLOWING = Symbol('flowing');
    -const PAUSED = Symbol('paused');
    -const RESUME = Symbol('resume');
    -const BUFFER = Symbol('buffer');
    -const PIPES = Symbol('pipes');
    -const BUFFERLENGTH = Symbol('bufferLength');
    -const BUFFERPUSH = Symbol('bufferPush');
    -const BUFFERSHIFT = Symbol('bufferShift');
    -const OBJECTMODE = Symbol('objectMode');
    -// internal event when stream is destroyed
    -const DESTROYED = Symbol('destroyed');
    -// internal event when stream has an error
    -const ERROR = Symbol('error');
    -const EMITDATA = Symbol('emitData');
    -const EMITEND = Symbol('emitEnd');
    -const EMITEND2 = Symbol('emitEnd2');
    -const ASYNC = Symbol('async');
    -const ABORT = Symbol('abort');
    -const ABORTED = Symbol('aborted');
    -const SIGNAL = Symbol('signal');
    -const DATALISTENERS = Symbol('dataListeners');
    -const DISCARDED = Symbol('discarded');
    -const defer = (fn) => Promise.resolve().then(fn);
    -const nodefer = (fn) => fn();
    -const isEndish = (ev) => ev === 'end' || ev === 'finish' || ev === 'prefinish';
    -const isArrayBufferLike = (b) => b instanceof ArrayBuffer ||
    -    (!!b &&
    -        typeof b === 'object' &&
    -        b.constructor &&
    -        b.constructor.name === 'ArrayBuffer' &&
    -        b.byteLength >= 0);
    -const isArrayBufferView = (b) => !Buffer.isBuffer(b) && ArrayBuffer.isView(b);
    -/**
    - * Internal class representing a pipe to a destination stream.
    - *
    - * @internal
    - */
    -class Pipe {
    -    src;
    -    dest;
    -    opts;
    -    ondrain;
    -    constructor(src, dest, opts) {
    -        this.src = src;
    -        this.dest = dest;
    -        this.opts = opts;
    -        this.ondrain = () => src[RESUME]();
    -        this.dest.on('drain', this.ondrain);
    -    }
    -    unpipe() {
    -        this.dest.removeListener('drain', this.ondrain);
    -    }
    -    // only here for the prototype
    -    /* c8 ignore start */
    -    proxyErrors(_er) { }
    -    /* c8 ignore stop */
    -    end() {
    -        this.unpipe();
    -        if (this.opts.end)
    -            this.dest.end();
    -    }
    -}
    -/**
    - * Internal class representing a pipe to a destination stream where
    - * errors are proxied.
    - *
    - * @internal
    - */
    -class PipeProxyErrors extends Pipe {
    -    unpipe() {
    -        this.src.removeListener('error', this.proxyErrors);
    -        super.unpipe();
    -    }
    -    constructor(src, dest, opts) {
    -        super(src, dest, opts);
    -        this.proxyErrors = er => dest.emit('error', er);
    -        src.on('error', this.proxyErrors);
    -    }
    -}
    -const isObjectModeOptions = (o) => !!o.objectMode;
    -const isEncodingOptions = (o) => !o.objectMode && !!o.encoding && o.encoding !== 'buffer';
    -/**
    - * Main export, the Minipass class
    - *
    - * `RType` is the type of data emitted, defaults to Buffer
    - *
    - * `WType` is the type of data to be written, if RType is buffer or string,
    - * then any {@link Minipass.ContiguousData} is allowed.
    - *
    - * `Events` is the set of event handler signatures that this object
    - * will emit, see {@link Minipass.Events}
    - */
    -class Minipass extends node_events_1.EventEmitter {
    -    [FLOWING] = false;
    -    [PAUSED] = false;
    -    [PIPES] = [];
    -    [BUFFER] = [];
    -    [OBJECTMODE];
    -    [ENCODING];
    -    [ASYNC];
    -    [DECODER];
    -    [EOF] = false;
    -    [EMITTED_END] = false;
    -    [EMITTING_END] = false;
    -    [CLOSED] = false;
    -    [EMITTED_ERROR] = null;
    -    [BUFFERLENGTH] = 0;
    -    [DESTROYED] = false;
    -    [SIGNAL];
    -    [ABORTED] = false;
    -    [DATALISTENERS] = 0;
    -    [DISCARDED] = false;
    -    /**
    -     * true if the stream can be written
    -     */
    -    writable = true;
    -    /**
    -     * true if the stream can be read
    -     */
    -    readable = true;
    -    /**
    -     * If `RType` is Buffer, then options do not need to be provided.
    -     * Otherwise, an options object must be provided to specify either
    -     * {@link Minipass.SharedOptions.objectMode} or
    -     * {@link Minipass.SharedOptions.encoding}, as appropriate.
    -     */
    -    constructor(...args) {
    -        const options = (args[0] ||
    -            {});
    -        super();
    -        if (options.objectMode && typeof options.encoding === 'string') {
    -            throw new TypeError('Encoding and objectMode may not be used together');
    -        }
    -        if (isObjectModeOptions(options)) {
    -            this[OBJECTMODE] = true;
    -            this[ENCODING] = null;
    -        }
    -        else if (isEncodingOptions(options)) {
    -            this[ENCODING] = options.encoding;
    -            this[OBJECTMODE] = false;
    -        }
    -        else {
    -            this[OBJECTMODE] = false;
    -            this[ENCODING] = null;
    -        }
    -        this[ASYNC] = !!options.async;
    -        this[DECODER] = this[ENCODING]
    -            ? new node_string_decoder_1.StringDecoder(this[ENCODING])
    -            : null;
    -        //@ts-ignore - private option for debugging and testing
    -        if (options && options.debugExposeBuffer === true) {
    -            Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] });
    -        }
    -        //@ts-ignore - private option for debugging and testing
    -        if (options && options.debugExposePipes === true) {
    -            Object.defineProperty(this, 'pipes', { get: () => this[PIPES] });
    -        }
    -        const { signal } = options;
    -        if (signal) {
    -            this[SIGNAL] = signal;
    -            if (signal.aborted) {
    -                this[ABORT]();
    -            }
    -            else {
    -                signal.addEventListener('abort', () => this[ABORT]());
    -            }
    -        }
    -    }
    -    /**
    -     * The amount of data stored in the buffer waiting to be read.
    -     *
    -     * For Buffer strings, this will be the total byte length.
    -     * For string encoding streams, this will be the string character length,
    -     * according to JavaScript's `string.length` logic.
    -     * For objectMode streams, this is a count of the items waiting to be
    -     * emitted.
    -     */
    -    get bufferLength() {
    -        return this[BUFFERLENGTH];
    -    }
    -    /**
    -     * The `BufferEncoding` currently in use, or `null`
    -     */
    -    get encoding() {
    -        return this[ENCODING];
    -    }
    -    /**
    -     * @deprecated - This is a read only property
    -     */
    -    set encoding(_enc) {
    -        throw new Error('Encoding must be set at instantiation time');
    -    }
    -    /**
    -     * @deprecated - Encoding may only be set at instantiation time
    -     */
    -    setEncoding(_enc) {
    -        throw new Error('Encoding must be set at instantiation time');
    -    }
    -    /**
    -     * True if this is an objectMode stream
    -     */
    -    get objectMode() {
    -        return this[OBJECTMODE];
    -    }
    -    /**
    -     * @deprecated - This is a read-only property
    -     */
    -    set objectMode(_om) {
    -        throw new Error('objectMode must be set at instantiation time');
    -    }
    -    /**
    -     * true if this is an async stream
    -     */
    -    get ['async']() {
    -        return this[ASYNC];
    -    }
    -    /**
    -     * Set to true to make this stream async.
    -     *
    -     * Once set, it cannot be unset, as this would potentially cause incorrect
    -     * behavior.  Ie, a sync stream can be made async, but an async stream
    -     * cannot be safely made sync.
    -     */
    -    set ['async'](a) {
    -        this[ASYNC] = this[ASYNC] || !!a;
    -    }
    -    // drop everything and get out of the flow completely
    -    [ABORT]() {
    -        this[ABORTED] = true;
    -        this.emit('abort', this[SIGNAL]?.reason);
    -        this.destroy(this[SIGNAL]?.reason);
    -    }
    -    /**
    -     * True if the stream has been aborted.
    -     */
    -    get aborted() {
    -        return this[ABORTED];
    -    }
    -    /**
    -     * No-op setter. Stream aborted status is set via the AbortSignal provided
    -     * in the constructor options.
    -     */
    -    set aborted(_) { }
    -    write(chunk, encoding, cb) {
    -        if (this[ABORTED])
    -            return false;
    -        if (this[EOF])
    -            throw new Error('write after end');
    -        if (this[DESTROYED]) {
    -            this.emit('error', Object.assign(new Error('Cannot call write after a stream was destroyed'), { code: 'ERR_STREAM_DESTROYED' }));
    -            return true;
    -        }
    -        if (typeof encoding === 'function') {
    -            cb = encoding;
    -            encoding = 'utf8';
    -        }
    -        if (!encoding)
    -            encoding = 'utf8';
    -        const fn = this[ASYNC] ? defer : nodefer;
    -        // convert array buffers and typed array views into buffers
    -        // at some point in the future, we may want to do the opposite!
    -        // leave strings and buffers as-is
    -        // anything is only allowed if in object mode, so throw
    -        if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) {
    -            if (isArrayBufferView(chunk)) {
    -                //@ts-ignore - sinful unsafe type changing
    -                chunk = Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength);
    -            }
    -            else if (isArrayBufferLike(chunk)) {
    -                //@ts-ignore - sinful unsafe type changing
    -                chunk = Buffer.from(chunk);
    -            }
    -            else if (typeof chunk !== 'string') {
    -                throw new Error('Non-contiguous data written to non-objectMode stream');
    -            }
    -        }
    -        // handle object mode up front, since it's simpler
    -        // this yields better performance, fewer checks later.
    -        if (this[OBJECTMODE]) {
    -            // maybe impossible?
    -            /* c8 ignore start */
    -            if (this[FLOWING] && this[BUFFERLENGTH] !== 0)
    -                this[FLUSH](true);
    -            /* c8 ignore stop */
    -            if (this[FLOWING])
    -                this.emit('data', chunk);
    -            else
    -                this[BUFFERPUSH](chunk);
    -            if (this[BUFFERLENGTH] !== 0)
    -                this.emit('readable');
    -            if (cb)
    -                fn(cb);
    -            return this[FLOWING];
    -        }
    -        // at this point the chunk is a buffer or string
    -        // don't buffer it up or send it to the decoder
    -        if (!chunk.length) {
    -            if (this[BUFFERLENGTH] !== 0)
    -                this.emit('readable');
    -            if (cb)
    -                fn(cb);
    -            return this[FLOWING];
    -        }
    -        // fast-path writing strings of same encoding to a stream with
    -        // an empty buffer, skipping the buffer/decoder dance
    -        if (typeof chunk === 'string' &&
    -            // unless it is a string already ready for us to use
    -            !(encoding === this[ENCODING] && !this[DECODER]?.lastNeed)) {
    -            //@ts-ignore - sinful unsafe type change
    -            chunk = Buffer.from(chunk, encoding);
    -        }
    -        if (Buffer.isBuffer(chunk) && this[ENCODING]) {
    -            //@ts-ignore - sinful unsafe type change
    -            chunk = this[DECODER].write(chunk);
    -        }
    -        // Note: flushing CAN potentially switch us into not-flowing mode
    -        if (this[FLOWING] && this[BUFFERLENGTH] !== 0)
    -            this[FLUSH](true);
    -        if (this[FLOWING])
    -            this.emit('data', chunk);
    -        else
    -            this[BUFFERPUSH](chunk);
    -        if (this[BUFFERLENGTH] !== 0)
    -            this.emit('readable');
    -        if (cb)
    -            fn(cb);
    -        return this[FLOWING];
    -    }
    -    /**
    -     * Low-level explicit read method.
    -     *
    -     * In objectMode, the argument is ignored, and one item is returned if
    -     * available.
    -     *
    -     * `n` is the number of bytes (or in the case of encoding streams,
    -     * characters) to consume. If `n` is not provided, then the entire buffer
    -     * is returned, or `null` is returned if no data is available.
    -     *
    -     * If `n` is greater that the amount of data in the internal buffer,
    -     * then `null` is returned.
    -     */
    -    read(n) {
    -        if (this[DESTROYED])
    -            return null;
    -        this[DISCARDED] = false;
    -        if (this[BUFFERLENGTH] === 0 ||
    -            n === 0 ||
    -            (n && n > this[BUFFERLENGTH])) {
    -            this[MAYBE_EMIT_END]();
    -            return null;
    -        }
    -        if (this[OBJECTMODE])
    -            n = null;
    -        if (this[BUFFER].length > 1 && !this[OBJECTMODE]) {
    -            // not object mode, so if we have an encoding, then RType is string
    -            // otherwise, must be Buffer
    -            this[BUFFER] = [
    -                (this[ENCODING]
    -                    ? this[BUFFER].join('')
    -                    : Buffer.concat(this[BUFFER], this[BUFFERLENGTH])),
    -            ];
    -        }
    -        const ret = this[READ](n || null, this[BUFFER][0]);
    -        this[MAYBE_EMIT_END]();
    -        return ret;
    -    }
    -    [READ](n, chunk) {
    -        if (this[OBJECTMODE])
    -            this[BUFFERSHIFT]();
    -        else {
    -            const c = chunk;
    -            if (n === c.length || n === null)
    -                this[BUFFERSHIFT]();
    -            else if (typeof c === 'string') {
    -                this[BUFFER][0] = c.slice(n);
    -                chunk = c.slice(0, n);
    -                this[BUFFERLENGTH] -= n;
    -            }
    -            else {
    -                this[BUFFER][0] = c.subarray(n);
    -                chunk = c.subarray(0, n);
    -                this[BUFFERLENGTH] -= n;
    -            }
    -        }
    -        this.emit('data', chunk);
    -        if (!this[BUFFER].length && !this[EOF])
    -            this.emit('drain');
    -        return chunk;
    -    }
    -    end(chunk, encoding, cb) {
    -        if (typeof chunk === 'function') {
    -            cb = chunk;
    -            chunk = undefined;
    -        }
    -        if (typeof encoding === 'function') {
    -            cb = encoding;
    -            encoding = 'utf8';
    -        }
    -        if (chunk !== undefined)
    -            this.write(chunk, encoding);
    -        if (cb)
    -            this.once('end', cb);
    -        this[EOF] = true;
    -        this.writable = false;
    -        // if we haven't written anything, then go ahead and emit,
    -        // even if we're not reading.
    -        // we'll re-emit if a new 'end' listener is added anyway.
    -        // This makes MP more suitable to write-only use cases.
    -        if (this[FLOWING] || !this[PAUSED])
    -            this[MAYBE_EMIT_END]();
    -        return this;
    -    }
    -    // don't let the internal resume be overwritten
    -    [RESUME]() {
    -        if (this[DESTROYED])
    -            return;
    -        if (!this[DATALISTENERS] && !this[PIPES].length) {
    -            this[DISCARDED] = true;
    -        }
    -        this[PAUSED] = false;
    -        this[FLOWING] = true;
    -        this.emit('resume');
    -        if (this[BUFFER].length)
    -            this[FLUSH]();
    -        else if (this[EOF])
    -            this[MAYBE_EMIT_END]();
    -        else
    -            this.emit('drain');
    -    }
    -    /**
    -     * Resume the stream if it is currently in a paused state
    -     *
    -     * If called when there are no pipe destinations or `data` event listeners,
    -     * this will place the stream in a "discarded" state, where all data will
    -     * be thrown away. The discarded state is removed if a pipe destination or
    -     * data handler is added, if pause() is called, or if any synchronous or
    -     * asynchronous iteration is started.
    -     */
    -    resume() {
    -        return this[RESUME]();
    -    }
    -    /**
    -     * Pause the stream
    -     */
    -    pause() {
    -        this[FLOWING] = false;
    -        this[PAUSED] = true;
    -        this[DISCARDED] = false;
    -    }
    -    /**
    -     * true if the stream has been forcibly destroyed
    -     */
    -    get destroyed() {
    -        return this[DESTROYED];
    -    }
    -    /**
    -     * true if the stream is currently in a flowing state, meaning that
    -     * any writes will be immediately emitted.
    -     */
    -    get flowing() {
    -        return this[FLOWING];
    -    }
    -    /**
    -     * true if the stream is currently in a paused state
    -     */
    -    get paused() {
    -        return this[PAUSED];
    -    }
    -    [BUFFERPUSH](chunk) {
    -        if (this[OBJECTMODE])
    -            this[BUFFERLENGTH] += 1;
    -        else
    -            this[BUFFERLENGTH] += chunk.length;
    -        this[BUFFER].push(chunk);
    -    }
    -    [BUFFERSHIFT]() {
    -        if (this[OBJECTMODE])
    -            this[BUFFERLENGTH] -= 1;
    -        else
    -            this[BUFFERLENGTH] -= this[BUFFER][0].length;
    -        return this[BUFFER].shift();
    -    }
    -    [FLUSH](noDrain = false) {
    -        do { } while (this[FLUSHCHUNK](this[BUFFERSHIFT]()) &&
    -            this[BUFFER].length);
    -        if (!noDrain && !this[BUFFER].length && !this[EOF])
    -            this.emit('drain');
    -    }
    -    [FLUSHCHUNK](chunk) {
    -        this.emit('data', chunk);
    -        return this[FLOWING];
    -    }
    -    /**
    -     * Pipe all data emitted by this stream into the destination provided.
    -     *
    -     * Triggers the flow of data.
    -     */
    -    pipe(dest, opts) {
    -        if (this[DESTROYED])
    -            return dest;
    -        this[DISCARDED] = false;
    -        const ended = this[EMITTED_END];
    -        opts = opts || {};
    -        if (dest === proc.stdout || dest === proc.stderr)
    -            opts.end = false;
    -        else
    -            opts.end = opts.end !== false;
    -        opts.proxyErrors = !!opts.proxyErrors;
    -        // piping an ended stream ends immediately
    -        if (ended) {
    -            if (opts.end)
    -                dest.end();
    -        }
    -        else {
    -            // "as" here just ignores the WType, which pipes don't care about,
    -            // since they're only consuming from us, and writing to the dest
    -            this[PIPES].push(!opts.proxyErrors
    -                ? new Pipe(this, dest, opts)
    -                : new PipeProxyErrors(this, dest, opts));
    -            if (this[ASYNC])
    -                defer(() => this[RESUME]());
    -            else
    -                this[RESUME]();
    -        }
    -        return dest;
    -    }
    -    /**
    -     * Fully unhook a piped destination stream.
    -     *
    -     * If the destination stream was the only consumer of this stream (ie,
    -     * there are no other piped destinations or `'data'` event listeners)
    -     * then the flow of data will stop until there is another consumer or
    -     * {@link Minipass#resume} is explicitly called.
    -     */
    -    unpipe(dest) {
    -        const p = this[PIPES].find(p => p.dest === dest);
    -        if (p) {
    -            if (this[PIPES].length === 1) {
    -                if (this[FLOWING] && this[DATALISTENERS] === 0) {
    -                    this[FLOWING] = false;
    -                }
    -                this[PIPES] = [];
    -            }
    -            else
    -                this[PIPES].splice(this[PIPES].indexOf(p), 1);
    -            p.unpipe();
    -        }
    -    }
    -    /**
    -     * Alias for {@link Minipass#on}
    -     */
    -    addListener(ev, handler) {
    -        return this.on(ev, handler);
    -    }
    -    /**
    -     * Mostly identical to `EventEmitter.on`, with the following
    -     * behavior differences to prevent data loss and unnecessary hangs:
    -     *
    -     * - Adding a 'data' event handler will trigger the flow of data
    -     *
    -     * - Adding a 'readable' event handler when there is data waiting to be read
    -     *   will cause 'readable' to be emitted immediately.
    -     *
    -     * - Adding an 'endish' event handler ('end', 'finish', etc.) which has
    -     *   already passed will cause the event to be emitted immediately and all
    -     *   handlers removed.
    -     *
    -     * - Adding an 'error' event handler after an error has been emitted will
    -     *   cause the event to be re-emitted immediately with the error previously
    -     *   raised.
    -     */
    -    on(ev, handler) {
    -        const ret = super.on(ev, handler);
    -        if (ev === 'data') {
    -            this[DISCARDED] = false;
    -            this[DATALISTENERS]++;
    -            if (!this[PIPES].length && !this[FLOWING]) {
    -                this[RESUME]();
    -            }
    -        }
    -        else if (ev === 'readable' && this[BUFFERLENGTH] !== 0) {
    -            super.emit('readable');
    -        }
    -        else if (isEndish(ev) && this[EMITTED_END]) {
    -            super.emit(ev);
    -            this.removeAllListeners(ev);
    -        }
    -        else if (ev === 'error' && this[EMITTED_ERROR]) {
    -            const h = handler;
    -            if (this[ASYNC])
    -                defer(() => h.call(this, this[EMITTED_ERROR]));
    -            else
    -                h.call(this, this[EMITTED_ERROR]);
    -        }
    -        return ret;
    -    }
    -    /**
    -     * Alias for {@link Minipass#off}
    -     */
    -    removeListener(ev, handler) {
    -        return this.off(ev, handler);
    -    }
    -    /**
    -     * Mostly identical to `EventEmitter.off`
    -     *
    -     * If a 'data' event handler is removed, and it was the last consumer
    -     * (ie, there are no pipe destinations or other 'data' event listeners),
    -     * then the flow of data will stop until there is another consumer or
    -     * {@link Minipass#resume} is explicitly called.
    -     */
    -    off(ev, handler) {
    -        const ret = super.off(ev, handler);
    -        // if we previously had listeners, and now we don't, and we don't
    -        // have any pipes, then stop the flow, unless it's been explicitly
    -        // put in a discarded flowing state via stream.resume().
    -        if (ev === 'data') {
    -            this[DATALISTENERS] = this.listeners('data').length;
    -            if (this[DATALISTENERS] === 0 &&
    -                !this[DISCARDED] &&
    -                !this[PIPES].length) {
    -                this[FLOWING] = false;
    -            }
    -        }
    -        return ret;
    -    }
    -    /**
    -     * Mostly identical to `EventEmitter.removeAllListeners`
    -     *
    -     * If all 'data' event handlers are removed, and they were the last consumer
    -     * (ie, there are no pipe destinations), then the flow of data will stop
    -     * until there is another consumer or {@link Minipass#resume} is explicitly
    -     * called.
    -     */
    -    removeAllListeners(ev) {
    -        const ret = super.removeAllListeners(ev);
    -        if (ev === 'data' || ev === undefined) {
    -            this[DATALISTENERS] = 0;
    -            if (!this[DISCARDED] && !this[PIPES].length) {
    -                this[FLOWING] = false;
    -            }
    -        }
    -        return ret;
    -    }
    -    /**
    -     * true if the 'end' event has been emitted
    -     */
    -    get emittedEnd() {
    -        return this[EMITTED_END];
    -    }
    -    [MAYBE_EMIT_END]() {
    -        if (!this[EMITTING_END] &&
    -            !this[EMITTED_END] &&
    -            !this[DESTROYED] &&
    -            this[BUFFER].length === 0 &&
    -            this[EOF]) {
    -            this[EMITTING_END] = true;
    -            this.emit('end');
    -            this.emit('prefinish');
    -            this.emit('finish');
    -            if (this[CLOSED])
    -                this.emit('close');
    -            this[EMITTING_END] = false;
    -        }
    -    }
    -    /**
    -     * Mostly identical to `EventEmitter.emit`, with the following
    -     * behavior differences to prevent data loss and unnecessary hangs:
    -     *
    -     * If the stream has been destroyed, and the event is something other
    -     * than 'close' or 'error', then `false` is returned and no handlers
    -     * are called.
    -     *
    -     * If the event is 'end', and has already been emitted, then the event
    -     * is ignored. If the stream is in a paused or non-flowing state, then
    -     * the event will be deferred until data flow resumes. If the stream is
    -     * async, then handlers will be called on the next tick rather than
    -     * immediately.
    -     *
    -     * If the event is 'close', and 'end' has not yet been emitted, then
    -     * the event will be deferred until after 'end' is emitted.
    -     *
    -     * If the event is 'error', and an AbortSignal was provided for the stream,
    -     * and there are no listeners, then the event is ignored, matching the
    -     * behavior of node core streams in the presense of an AbortSignal.
    -     *
    -     * If the event is 'finish' or 'prefinish', then all listeners will be
    -     * removed after emitting the event, to prevent double-firing.
    -     */
    -    emit(ev, ...args) {
    -        const data = args[0];
    -        // error and close are only events allowed after calling destroy()
    -        if (ev !== 'error' &&
    -            ev !== 'close' &&
    -            ev !== DESTROYED &&
    -            this[DESTROYED]) {
    -            return false;
    -        }
    -        else if (ev === 'data') {
    -            return !this[OBJECTMODE] && !data
    -                ? false
    -                : this[ASYNC]
    -                    ? (defer(() => this[EMITDATA](data)), true)
    -                    : this[EMITDATA](data);
    -        }
    -        else if (ev === 'end') {
    -            return this[EMITEND]();
    -        }
    -        else if (ev === 'close') {
    -            this[CLOSED] = true;
    -            // don't emit close before 'end' and 'finish'
    -            if (!this[EMITTED_END] && !this[DESTROYED])
    -                return false;
    -            const ret = super.emit('close');
    -            this.removeAllListeners('close');
    -            return ret;
    -        }
    -        else if (ev === 'error') {
    -            this[EMITTED_ERROR] = data;
    -            super.emit(ERROR, data);
    -            const ret = !this[SIGNAL] || this.listeners('error').length
    -                ? super.emit('error', data)
    -                : false;
    -            this[MAYBE_EMIT_END]();
    -            return ret;
    -        }
    -        else if (ev === 'resume') {
    -            const ret = super.emit('resume');
    -            this[MAYBE_EMIT_END]();
    -            return ret;
    -        }
    -        else if (ev === 'finish' || ev === 'prefinish') {
    -            const ret = super.emit(ev);
    -            this.removeAllListeners(ev);
    -            return ret;
    -        }
    -        // Some other unknown event
    -        const ret = super.emit(ev, ...args);
    -        this[MAYBE_EMIT_END]();
    -        return ret;
    -    }
    -    [EMITDATA](data) {
    -        for (const p of this[PIPES]) {
    -            if (p.dest.write(data) === false)
    -                this.pause();
    -        }
    -        const ret = this[DISCARDED] ? false : super.emit('data', data);
    -        this[MAYBE_EMIT_END]();
    -        return ret;
    -    }
    -    [EMITEND]() {
    -        if (this[EMITTED_END])
    -            return false;
    -        this[EMITTED_END] = true;
    -        this.readable = false;
    -        return this[ASYNC]
    -            ? (defer(() => this[EMITEND2]()), true)
    -            : this[EMITEND2]();
    -    }
    -    [EMITEND2]() {
    -        if (this[DECODER]) {
    -            const data = this[DECODER].end();
    -            if (data) {
    -                for (const p of this[PIPES]) {
    -                    p.dest.write(data);
    -                }
    -                if (!this[DISCARDED])
    -                    super.emit('data', data);
    -            }
    -        }
    -        for (const p of this[PIPES]) {
    -            p.end();
    -        }
    -        const ret = super.emit('end');
    -        this.removeAllListeners('end');
    -        return ret;
    -    }
    -    /**
    -     * Return a Promise that resolves to an array of all emitted data once
    -     * the stream ends.
    -     */
    -    async collect() {
    -        const buf = Object.assign([], {
    -            dataLength: 0,
    -        });
    -        if (!this[OBJECTMODE])
    -            buf.dataLength = 0;
    -        // set the promise first, in case an error is raised
    -        // by triggering the flow here.
    -        const p = this.promise();
    -        this.on('data', c => {
    -            buf.push(c);
    -            if (!this[OBJECTMODE])
    -                buf.dataLength += c.length;
    -        });
    -        await p;
    -        return buf;
    -    }
    -    /**
    -     * Return a Promise that resolves to the concatenation of all emitted data
    -     * once the stream ends.
    -     *
    -     * Not allowed on objectMode streams.
    -     */
    -    async concat() {
    -        if (this[OBJECTMODE]) {
    -            throw new Error('cannot concat in objectMode');
    -        }
    -        const buf = await this.collect();
    -        return (this[ENCODING]
    -            ? buf.join('')
    -            : Buffer.concat(buf, buf.dataLength));
    -    }
    -    /**
    -     * Return a void Promise that resolves once the stream ends.
    -     */
    -    async promise() {
    -        return new Promise((resolve, reject) => {
    -            this.on(DESTROYED, () => reject(new Error('stream destroyed')));
    -            this.on('error', er => reject(er));
    -            this.on('end', () => resolve());
    -        });
    -    }
    -    /**
    -     * Asynchronous `for await of` iteration.
    -     *
    -     * This will continue emitting all chunks until the stream terminates.
    -     */
    -    [Symbol.asyncIterator]() {
    -        // set this up front, in case the consumer doesn't call next()
    -        // right away.
    -        this[DISCARDED] = false;
    -        let stopped = false;
    -        const stop = async () => {
    -            this.pause();
    -            stopped = true;
    -            return { value: undefined, done: true };
    -        };
    -        const next = () => {
    -            if (stopped)
    -                return stop();
    -            const res = this.read();
    -            if (res !== null)
    -                return Promise.resolve({ done: false, value: res });
    -            if (this[EOF])
    -                return stop();
    -            let resolve;
    -            let reject;
    -            const onerr = (er) => {
    -                this.off('data', ondata);
    -                this.off('end', onend);
    -                this.off(DESTROYED, ondestroy);
    -                stop();
    -                reject(er);
    -            };
    -            const ondata = (value) => {
    -                this.off('error', onerr);
    -                this.off('end', onend);
    -                this.off(DESTROYED, ondestroy);
    -                this.pause();
    -                resolve({ value, done: !!this[EOF] });
    -            };
    -            const onend = () => {
    -                this.off('error', onerr);
    -                this.off('data', ondata);
    -                this.off(DESTROYED, ondestroy);
    -                stop();
    -                resolve({ done: true, value: undefined });
    -            };
    -            const ondestroy = () => onerr(new Error('stream destroyed'));
    -            return new Promise((res, rej) => {
    -                reject = rej;
    -                resolve = res;
    -                this.once(DESTROYED, ondestroy);
    -                this.once('error', onerr);
    -                this.once('end', onend);
    -                this.once('data', ondata);
    -            });
    -        };
    -        return {
    -            next,
    -            throw: stop,
    -            return: stop,
    -            [Symbol.asyncIterator]() {
    -                return this;
    -            },
    -        };
    -    }
    -    /**
    -     * Synchronous `for of` iteration.
    -     *
    -     * The iteration will terminate when the internal buffer runs out, even
    -     * if the stream has not yet terminated.
    -     */
    -    [Symbol.iterator]() {
    -        // set this up front, in case the consumer doesn't call next()
    -        // right away.
    -        this[DISCARDED] = false;
    -        let stopped = false;
    -        const stop = () => {
    -            this.pause();
    -            this.off(ERROR, stop);
    -            this.off(DESTROYED, stop);
    -            this.off('end', stop);
    -            stopped = true;
    -            return { done: true, value: undefined };
    -        };
    -        const next = () => {
    -            if (stopped)
    -                return stop();
    -            const value = this.read();
    -            return value === null ? stop() : { done: false, value };
    -        };
    -        this.once('end', stop);
    -        this.once(ERROR, stop);
    -        this.once(DESTROYED, stop);
    -        return {
    -            next,
    -            throw: stop,
    -            return: stop,
    -            [Symbol.iterator]() {
    -                return this;
    -            },
    -        };
    -    }
    -    /**
    -     * Destroy a stream, preventing it from being used for any further purpose.
    -     *
    -     * If the stream has a `close()` method, then it will be called on
    -     * destruction.
    -     *
    -     * After destruction, any attempt to write data, read data, or emit most
    -     * events will be ignored.
    -     *
    -     * If an error argument is provided, then it will be emitted in an
    -     * 'error' event.
    -     */
    -    destroy(er) {
    -        if (this[DESTROYED]) {
    -            if (er)
    -                this.emit('error', er);
    -            else
    -                this.emit(DESTROYED);
    -            return this;
    -        }
    -        this[DESTROYED] = true;
    -        this[DISCARDED] = true;
    -        // throw away all buffered data, it's never coming out
    -        this[BUFFER].length = 0;
    -        this[BUFFERLENGTH] = 0;
    -        const wc = this;
    -        if (typeof wc.close === 'function' && !this[CLOSED])
    -            wc.close();
    -        if (er)
    -            this.emit('error', er);
    -        // if no error to emit, still reject pending promises
    -        else
    -            this.emit(DESTROYED);
    -        return this;
    -    }
    -    /**
    -     * Alias for {@link isStream}
    -     *
    -     * Former export location, maintained for backwards compatibility.
    -     *
    -     * @deprecated
    -     */
    -    static get isStream() {
    -        return exports.isStream;
    -    }
    -}
    -exports.Minipass = Minipass;
    -//# sourceMappingURL=index.js.map
    \ No newline at end of file
    diff --git a/node_modules/minipass/dist/commonjs/index.js.map b/node_modules/minipass/dist/commonjs/index.js.map
    deleted file mode 100644
    index 9f3ef4b..0000000
    --- a/node_modules/minipass/dist/commonjs/index.js.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["const proc =\n  typeof process === 'object' && process\n    ? process\n    : {\n        stdout: null,\n        stderr: null,\n      }\nimport { EventEmitter } from 'node:events'\nimport Stream from 'node:stream'\nimport { StringDecoder } from 'node:string_decoder'\n\n/**\n * Same as StringDecoder, but exposing the `lastNeed` flag on the type\n */\ntype SD = StringDecoder & { lastNeed: boolean }\n\nexport type { SD, Pipe, PipeProxyErrors }\n\n/**\n * Return true if the argument is a Minipass stream, Node stream, or something\n * else that Minipass can interact with.\n */\nexport const isStream = (\n  s: any\n): s is Minipass.Readable | Minipass.Writable =>\n  !!s &&\n  typeof s === 'object' &&\n  (s instanceof Minipass ||\n    s instanceof Stream ||\n    isReadable(s) ||\n    isWritable(s))\n\n/**\n * Return true if the argument is a valid {@link Minipass.Readable}\n */\nexport const isReadable = (s: any): s is Minipass.Readable =>\n  !!s &&\n  typeof s === 'object' &&\n  s instanceof EventEmitter &&\n  typeof (s as Minipass.Readable).pipe === 'function' &&\n  // node core Writable streams have a pipe() method, but it throws\n  (s as Minipass.Readable).pipe !== Stream.Writable.prototype.pipe\n\n/**\n * Return true if the argument is a valid {@link Minipass.Writable}\n */\nexport const isWritable = (s: any): s is Minipass.Readable =>\n  !!s &&\n  typeof s === 'object' &&\n  s instanceof EventEmitter &&\n  typeof (s as Minipass.Writable).write === 'function' &&\n  typeof (s as Minipass.Writable).end === 'function'\n\nconst EOF = Symbol('EOF')\nconst MAYBE_EMIT_END = Symbol('maybeEmitEnd')\nconst EMITTED_END = Symbol('emittedEnd')\nconst EMITTING_END = Symbol('emittingEnd')\nconst EMITTED_ERROR = Symbol('emittedError')\nconst CLOSED = Symbol('closed')\nconst READ = Symbol('read')\nconst FLUSH = Symbol('flush')\nconst FLUSHCHUNK = Symbol('flushChunk')\nconst ENCODING = Symbol('encoding')\nconst DECODER = Symbol('decoder')\nconst FLOWING = Symbol('flowing')\nconst PAUSED = Symbol('paused')\nconst RESUME = Symbol('resume')\nconst BUFFER = Symbol('buffer')\nconst PIPES = Symbol('pipes')\nconst BUFFERLENGTH = Symbol('bufferLength')\nconst BUFFERPUSH = Symbol('bufferPush')\nconst BUFFERSHIFT = Symbol('bufferShift')\nconst OBJECTMODE = Symbol('objectMode')\n// internal event when stream is destroyed\nconst DESTROYED = Symbol('destroyed')\n// internal event when stream has an error\nconst ERROR = Symbol('error')\nconst EMITDATA = Symbol('emitData')\nconst EMITEND = Symbol('emitEnd')\nconst EMITEND2 = Symbol('emitEnd2')\nconst ASYNC = Symbol('async')\nconst ABORT = Symbol('abort')\nconst ABORTED = Symbol('aborted')\nconst SIGNAL = Symbol('signal')\nconst DATALISTENERS = Symbol('dataListeners')\nconst DISCARDED = Symbol('discarded')\n\nconst defer = (fn: (...a: any[]) => any) => Promise.resolve().then(fn)\nconst nodefer = (fn: (...a: any[]) => any) => fn()\n\n// events that mean 'the stream is over'\n// these are treated specially, and re-emitted\n// if they are listened for after emitting.\ntype EndishEvent = 'end' | 'finish' | 'prefinish'\nconst isEndish = (ev: any): ev is EndishEvent =>\n  ev === 'end' || ev === 'finish' || ev === 'prefinish'\n\nconst isArrayBufferLike = (b: any): b is ArrayBufferLike =>\n  b instanceof ArrayBuffer ||\n  (!!b &&\n    typeof b === 'object' &&\n    b.constructor &&\n    b.constructor.name === 'ArrayBuffer' &&\n    b.byteLength >= 0)\n\nconst isArrayBufferView = (b: any): b is ArrayBufferView =>\n  !Buffer.isBuffer(b) && ArrayBuffer.isView(b)\n\n/**\n * Options that may be passed to stream.pipe()\n */\nexport interface PipeOptions {\n  /**\n   * end the destination stream when the source stream ends\n   */\n  end?: boolean\n  /**\n   * proxy errors from the source stream to the destination stream\n   */\n  proxyErrors?: boolean\n}\n\n/**\n * Internal class representing a pipe to a destination stream.\n *\n * @internal\n */\nclass Pipe {\n  src: Minipass\n  dest: Minipass\n  opts: PipeOptions\n  ondrain: () => any\n  constructor(\n    src: Minipass,\n    dest: Minipass.Writable,\n    opts: PipeOptions\n  ) {\n    this.src = src\n    this.dest = dest as Minipass\n    this.opts = opts\n    this.ondrain = () => src[RESUME]()\n    this.dest.on('drain', this.ondrain)\n  }\n  unpipe() {\n    this.dest.removeListener('drain', this.ondrain)\n  }\n  // only here for the prototype\n  /* c8 ignore start */\n  proxyErrors(_er: any) {}\n  /* c8 ignore stop */\n  end() {\n    this.unpipe()\n    if (this.opts.end) this.dest.end()\n  }\n}\n\n/**\n * Internal class representing a pipe to a destination stream where\n * errors are proxied.\n *\n * @internal\n */\nclass PipeProxyErrors extends Pipe {\n  unpipe() {\n    this.src.removeListener('error', this.proxyErrors)\n    super.unpipe()\n  }\n  constructor(\n    src: Minipass,\n    dest: Minipass.Writable,\n    opts: PipeOptions\n  ) {\n    super(src, dest, opts)\n    this.proxyErrors = er => dest.emit('error', er)\n    src.on('error', this.proxyErrors)\n  }\n}\n\nexport namespace Minipass {\n  /**\n   * Encoding used to create a stream that outputs strings rather than\n   * Buffer objects.\n   */\n  export type Encoding = BufferEncoding | 'buffer' | null\n\n  /**\n   * Any stream that Minipass can pipe into\n   */\n  export type Writable =\n    | Minipass\n    | NodeJS.WriteStream\n    | (NodeJS.WriteStream & { fd: number })\n    | (EventEmitter & {\n        end(): any\n        write(chunk: any, ...args: any[]): any\n      })\n\n  /**\n   * Any stream that can be read from\n   */\n  export type Readable =\n    | Minipass\n    | NodeJS.ReadStream\n    | (NodeJS.ReadStream & { fd: number })\n    | (EventEmitter & {\n        pause(): any\n        resume(): any\n        pipe(...destArgs: any[]): any\n      })\n\n  /**\n   * Utility type that can be iterated sync or async\n   */\n  export type DualIterable = Iterable & AsyncIterable\n\n  type EventArguments = Record\n\n  /**\n   * The listing of events that a Minipass class can emit.\n   * Extend this when extending the Minipass class, and pass as\n   * the third template argument.  The key is the name of the event,\n   * and the value is the argument list.\n   *\n   * Any undeclared events will still be allowed, but the handler will get\n   * arguments as `unknown[]`.\n   */\n  export interface Events\n    extends EventArguments {\n    readable: []\n    data: [chunk: RType]\n    error: [er: unknown]\n    abort: [reason: unknown]\n    drain: []\n    resume: []\n    end: []\n    finish: []\n    prefinish: []\n    close: []\n    [DESTROYED]: [er?: unknown]\n    [ERROR]: [er: unknown]\n  }\n\n  /**\n   * String or buffer-like data that can be joined and sliced\n   */\n  export type ContiguousData =\n    | Buffer\n    | ArrayBufferLike\n    | ArrayBufferView\n    | string\n  export type BufferOrString = Buffer | string\n\n  /**\n   * Options passed to the Minipass constructor.\n   */\n  export type SharedOptions = {\n    /**\n     * Defer all data emission and other events until the end of the\n     * current tick, similar to Node core streams\n     */\n    async?: boolean\n    /**\n     * A signal which will abort the stream\n     */\n    signal?: AbortSignal\n    /**\n     * Output string encoding. Set to `null` or `'buffer'` (or omit) to\n     * emit Buffer objects rather than strings.\n     *\n     * Conflicts with `objectMode`\n     */\n    encoding?: BufferEncoding | null | 'buffer'\n    /**\n     * Output data exactly as it was written, supporting non-buffer/string\n     * data (such as arbitrary objects, falsey values, etc.)\n     *\n     * Conflicts with `encoding`\n     */\n    objectMode?: boolean\n  }\n\n  /**\n   * Options for a string encoded output\n   */\n  export type EncodingOptions = SharedOptions & {\n    encoding: BufferEncoding\n    objectMode?: false\n  }\n\n  /**\n   * Options for contiguous data buffer output\n   */\n  export type BufferOptions = SharedOptions & {\n    encoding?: null | 'buffer'\n    objectMode?: false\n  }\n\n  /**\n   * Options for objectMode arbitrary output\n   */\n  export type ObjectModeOptions = SharedOptions & {\n    objectMode: true\n    encoding?: null\n  }\n\n  /**\n   * Utility type to determine allowed options based on read type\n   */\n  export type Options =\n    | ObjectModeOptions\n    | (T extends string\n        ? EncodingOptions\n        : T extends Buffer\n        ? BufferOptions\n        : SharedOptions)\n}\n\nconst isObjectModeOptions = (\n  o: Minipass.SharedOptions\n): o is Minipass.ObjectModeOptions => !!o.objectMode\n\nconst isEncodingOptions = (\n  o: Minipass.SharedOptions\n): o is Minipass.EncodingOptions =>\n  !o.objectMode && !!o.encoding && o.encoding !== 'buffer'\n\n/**\n * Main export, the Minipass class\n *\n * `RType` is the type of data emitted, defaults to Buffer\n *\n * `WType` is the type of data to be written, if RType is buffer or string,\n * then any {@link Minipass.ContiguousData} is allowed.\n *\n * `Events` is the set of event handler signatures that this object\n * will emit, see {@link Minipass.Events}\n */\nexport class Minipass<\n    RType extends unknown = Buffer,\n    WType extends unknown = RType extends Minipass.BufferOrString\n      ? Minipass.ContiguousData\n      : RType,\n    Events extends Minipass.Events = Minipass.Events\n  >\n  extends EventEmitter\n  implements Minipass.DualIterable\n{\n  [FLOWING]: boolean = false;\n  [PAUSED]: boolean = false;\n  [PIPES]: Pipe[] = [];\n  [BUFFER]: RType[] = [];\n  [OBJECTMODE]: boolean;\n  [ENCODING]: BufferEncoding | null;\n  [ASYNC]: boolean;\n  [DECODER]: SD | null;\n  [EOF]: boolean = false;\n  [EMITTED_END]: boolean = false;\n  [EMITTING_END]: boolean = false;\n  [CLOSED]: boolean = false;\n  [EMITTED_ERROR]: unknown = null;\n  [BUFFERLENGTH]: number = 0;\n  [DESTROYED]: boolean = false;\n  [SIGNAL]?: AbortSignal;\n  [ABORTED]: boolean = false;\n  [DATALISTENERS]: number = 0;\n  [DISCARDED]: boolean = false\n\n  /**\n   * true if the stream can be written\n   */\n  writable: boolean = true\n  /**\n   * true if the stream can be read\n   */\n  readable: boolean = true\n\n  /**\n   * If `RType` is Buffer, then options do not need to be provided.\n   * Otherwise, an options object must be provided to specify either\n   * {@link Minipass.SharedOptions.objectMode} or\n   * {@link Minipass.SharedOptions.encoding}, as appropriate.\n   */\n  constructor(\n    ...args:\n      | [Minipass.ObjectModeOptions]\n      | (RType extends Buffer\n          ? [] | [Minipass.Options]\n          : [Minipass.Options])\n  ) {\n    const options: Minipass.Options = (args[0] ||\n      {}) as Minipass.Options\n    super()\n    if (options.objectMode && typeof options.encoding === 'string') {\n      throw new TypeError(\n        'Encoding and objectMode may not be used together'\n      )\n    }\n    if (isObjectModeOptions(options)) {\n      this[OBJECTMODE] = true\n      this[ENCODING] = null\n    } else if (isEncodingOptions(options)) {\n      this[ENCODING] = options.encoding\n      this[OBJECTMODE] = false\n    } else {\n      this[OBJECTMODE] = false\n      this[ENCODING] = null\n    }\n    this[ASYNC] = !!options.async\n    this[DECODER] = this[ENCODING]\n      ? (new StringDecoder(this[ENCODING]) as SD)\n      : null\n\n    //@ts-ignore - private option for debugging and testing\n    if (options && options.debugExposeBuffer === true) {\n      Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] })\n    }\n    //@ts-ignore - private option for debugging and testing\n    if (options && options.debugExposePipes === true) {\n      Object.defineProperty(this, 'pipes', { get: () => this[PIPES] })\n    }\n\n    const { signal } = options\n    if (signal) {\n      this[SIGNAL] = signal\n      if (signal.aborted) {\n        this[ABORT]()\n      } else {\n        signal.addEventListener('abort', () => this[ABORT]())\n      }\n    }\n  }\n\n  /**\n   * The amount of data stored in the buffer waiting to be read.\n   *\n   * For Buffer strings, this will be the total byte length.\n   * For string encoding streams, this will be the string character length,\n   * according to JavaScript's `string.length` logic.\n   * For objectMode streams, this is a count of the items waiting to be\n   * emitted.\n   */\n  get bufferLength() {\n    return this[BUFFERLENGTH]\n  }\n\n  /**\n   * The `BufferEncoding` currently in use, or `null`\n   */\n  get encoding() {\n    return this[ENCODING]\n  }\n\n  /**\n   * @deprecated - This is a read only property\n   */\n  set encoding(_enc) {\n    throw new Error('Encoding must be set at instantiation time')\n  }\n\n  /**\n   * @deprecated - Encoding may only be set at instantiation time\n   */\n  setEncoding(_enc: Minipass.Encoding) {\n    throw new Error('Encoding must be set at instantiation time')\n  }\n\n  /**\n   * True if this is an objectMode stream\n   */\n  get objectMode() {\n    return this[OBJECTMODE]\n  }\n\n  /**\n   * @deprecated - This is a read-only property\n   */\n  set objectMode(_om) {\n    throw new Error('objectMode must be set at instantiation time')\n  }\n\n  /**\n   * true if this is an async stream\n   */\n  get ['async'](): boolean {\n    return this[ASYNC]\n  }\n  /**\n   * Set to true to make this stream async.\n   *\n   * Once set, it cannot be unset, as this would potentially cause incorrect\n   * behavior.  Ie, a sync stream can be made async, but an async stream\n   * cannot be safely made sync.\n   */\n  set ['async'](a: boolean) {\n    this[ASYNC] = this[ASYNC] || !!a\n  }\n\n  // drop everything and get out of the flow completely\n  [ABORT]() {\n    this[ABORTED] = true\n    this.emit('abort', this[SIGNAL]?.reason)\n    this.destroy(this[SIGNAL]?.reason)\n  }\n\n  /**\n   * True if the stream has been aborted.\n   */\n  get aborted() {\n    return this[ABORTED]\n  }\n  /**\n   * No-op setter. Stream aborted status is set via the AbortSignal provided\n   * in the constructor options.\n   */\n  set aborted(_) {}\n\n  /**\n   * Write data into the stream\n   *\n   * If the chunk written is a string, and encoding is not specified, then\n   * `utf8` will be assumed. If the stream encoding matches the encoding of\n   * a written string, and the state of the string decoder allows it, then\n   * the string will be passed through to either the output or the internal\n   * buffer without any processing. Otherwise, it will be turned into a\n   * Buffer object for processing into the desired encoding.\n   *\n   * If provided, `cb` function is called immediately before return for\n   * sync streams, or on next tick for async streams, because for this\n   * base class, a chunk is considered \"processed\" once it is accepted\n   * and either emitted or buffered. That is, the callback does not indicate\n   * that the chunk has been eventually emitted, though of course child\n   * classes can override this function to do whatever processing is required\n   * and call `super.write(...)` only once processing is completed.\n   */\n  write(chunk: WType, cb?: () => void): boolean\n  write(\n    chunk: WType,\n    encoding?: Minipass.Encoding,\n    cb?: () => void\n  ): boolean\n  write(\n    chunk: WType,\n    encoding?: Minipass.Encoding | (() => void),\n    cb?: () => void\n  ): boolean {\n    if (this[ABORTED]) return false\n    if (this[EOF]) throw new Error('write after end')\n\n    if (this[DESTROYED]) {\n      this.emit(\n        'error',\n        Object.assign(\n          new Error('Cannot call write after a stream was destroyed'),\n          { code: 'ERR_STREAM_DESTROYED' }\n        )\n      )\n      return true\n    }\n\n    if (typeof encoding === 'function') {\n      cb = encoding\n      encoding = 'utf8'\n    }\n\n    if (!encoding) encoding = 'utf8'\n\n    const fn = this[ASYNC] ? defer : nodefer\n\n    // convert array buffers and typed array views into buffers\n    // at some point in the future, we may want to do the opposite!\n    // leave strings and buffers as-is\n    // anything is only allowed if in object mode, so throw\n    if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) {\n      if (isArrayBufferView(chunk)) {\n        //@ts-ignore - sinful unsafe type changing\n        chunk = Buffer.from(\n          chunk.buffer,\n          chunk.byteOffset,\n          chunk.byteLength\n        )\n      } else if (isArrayBufferLike(chunk)) {\n        //@ts-ignore - sinful unsafe type changing\n        chunk = Buffer.from(chunk)\n      } else if (typeof chunk !== 'string') {\n        throw new Error(\n          'Non-contiguous data written to non-objectMode stream'\n        )\n      }\n    }\n\n    // handle object mode up front, since it's simpler\n    // this yields better performance, fewer checks later.\n    if (this[OBJECTMODE]) {\n      // maybe impossible?\n      /* c8 ignore start */\n      if (this[FLOWING] && this[BUFFERLENGTH] !== 0) this[FLUSH](true)\n      /* c8 ignore stop */\n\n      if (this[FLOWING]) this.emit('data', chunk as unknown as RType)\n      else this[BUFFERPUSH](chunk as unknown as RType)\n\n      if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n\n      if (cb) fn(cb)\n\n      return this[FLOWING]\n    }\n\n    // at this point the chunk is a buffer or string\n    // don't buffer it up or send it to the decoder\n    if (!(chunk as Minipass.BufferOrString).length) {\n      if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n      if (cb) fn(cb)\n      return this[FLOWING]\n    }\n\n    // fast-path writing strings of same encoding to a stream with\n    // an empty buffer, skipping the buffer/decoder dance\n    if (\n      typeof chunk === 'string' &&\n      // unless it is a string already ready for us to use\n      !(encoding === this[ENCODING] && !this[DECODER]?.lastNeed)\n    ) {\n      //@ts-ignore - sinful unsafe type change\n      chunk = Buffer.from(chunk, encoding)\n    }\n\n    if (Buffer.isBuffer(chunk) && this[ENCODING]) {\n      //@ts-ignore - sinful unsafe type change\n      chunk = this[DECODER].write(chunk)\n    }\n\n    // Note: flushing CAN potentially switch us into not-flowing mode\n    if (this[FLOWING] && this[BUFFERLENGTH] !== 0) this[FLUSH](true)\n\n    if (this[FLOWING]) this.emit('data', chunk as unknown as RType)\n    else this[BUFFERPUSH](chunk as unknown as RType)\n\n    if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n\n    if (cb) fn(cb)\n\n    return this[FLOWING]\n  }\n\n  /**\n   * Low-level explicit read method.\n   *\n   * In objectMode, the argument is ignored, and one item is returned if\n   * available.\n   *\n   * `n` is the number of bytes (or in the case of encoding streams,\n   * characters) to consume. If `n` is not provided, then the entire buffer\n   * is returned, or `null` is returned if no data is available.\n   *\n   * If `n` is greater that the amount of data in the internal buffer,\n   * then `null` is returned.\n   */\n  read(n?: number | null): RType | null {\n    if (this[DESTROYED]) return null\n    this[DISCARDED] = false\n\n    if (\n      this[BUFFERLENGTH] === 0 ||\n      n === 0 ||\n      (n && n > this[BUFFERLENGTH])\n    ) {\n      this[MAYBE_EMIT_END]()\n      return null\n    }\n\n    if (this[OBJECTMODE]) n = null\n\n    if (this[BUFFER].length > 1 && !this[OBJECTMODE]) {\n      // not object mode, so if we have an encoding, then RType is string\n      // otherwise, must be Buffer\n      this[BUFFER] = [\n        (this[ENCODING]\n          ? this[BUFFER].join('')\n          : Buffer.concat(\n              this[BUFFER] as Buffer[],\n              this[BUFFERLENGTH]\n            )) as RType,\n      ]\n    }\n\n    const ret = this[READ](n || null, this[BUFFER][0] as RType)\n    this[MAYBE_EMIT_END]()\n    return ret\n  }\n\n  [READ](n: number | null, chunk: RType) {\n    if (this[OBJECTMODE]) this[BUFFERSHIFT]()\n    else {\n      const c = chunk as Minipass.BufferOrString\n      if (n === c.length || n === null) this[BUFFERSHIFT]()\n      else if (typeof c === 'string') {\n        this[BUFFER][0] = c.slice(n) as RType\n        chunk = c.slice(0, n) as RType\n        this[BUFFERLENGTH] -= n\n      } else {\n        this[BUFFER][0] = c.subarray(n) as RType\n        chunk = c.subarray(0, n) as RType\n        this[BUFFERLENGTH] -= n\n      }\n    }\n\n    this.emit('data', chunk)\n\n    if (!this[BUFFER].length && !this[EOF]) this.emit('drain')\n\n    return chunk\n  }\n\n  /**\n   * End the stream, optionally providing a final write.\n   *\n   * See {@link Minipass#write} for argument descriptions\n   */\n  end(cb?: () => void): this\n  end(chunk: WType, cb?: () => void): this\n  end(chunk: WType, encoding?: Minipass.Encoding, cb?: () => void): this\n  end(\n    chunk?: WType | (() => void),\n    encoding?: Minipass.Encoding | (() => void),\n    cb?: () => void\n  ): this {\n    if (typeof chunk === 'function') {\n      cb = chunk as () => void\n      chunk = undefined\n    }\n    if (typeof encoding === 'function') {\n      cb = encoding\n      encoding = 'utf8'\n    }\n    if (chunk !== undefined) this.write(chunk, encoding)\n    if (cb) this.once('end', cb)\n    this[EOF] = true\n    this.writable = false\n\n    // if we haven't written anything, then go ahead and emit,\n    // even if we're not reading.\n    // we'll re-emit if a new 'end' listener is added anyway.\n    // This makes MP more suitable to write-only use cases.\n    if (this[FLOWING] || !this[PAUSED]) this[MAYBE_EMIT_END]()\n    return this\n  }\n\n  // don't let the internal resume be overwritten\n  [RESUME]() {\n    if (this[DESTROYED]) return\n\n    if (!this[DATALISTENERS] && !this[PIPES].length) {\n      this[DISCARDED] = true\n    }\n    this[PAUSED] = false\n    this[FLOWING] = true\n    this.emit('resume')\n    if (this[BUFFER].length) this[FLUSH]()\n    else if (this[EOF]) this[MAYBE_EMIT_END]()\n    else this.emit('drain')\n  }\n\n  /**\n   * Resume the stream if it is currently in a paused state\n   *\n   * If called when there are no pipe destinations or `data` event listeners,\n   * this will place the stream in a \"discarded\" state, where all data will\n   * be thrown away. The discarded state is removed if a pipe destination or\n   * data handler is added, if pause() is called, or if any synchronous or\n   * asynchronous iteration is started.\n   */\n  resume() {\n    return this[RESUME]()\n  }\n\n  /**\n   * Pause the stream\n   */\n  pause() {\n    this[FLOWING] = false\n    this[PAUSED] = true\n    this[DISCARDED] = false\n  }\n\n  /**\n   * true if the stream has been forcibly destroyed\n   */\n  get destroyed() {\n    return this[DESTROYED]\n  }\n\n  /**\n   * true if the stream is currently in a flowing state, meaning that\n   * any writes will be immediately emitted.\n   */\n  get flowing() {\n    return this[FLOWING]\n  }\n\n  /**\n   * true if the stream is currently in a paused state\n   */\n  get paused() {\n    return this[PAUSED]\n  }\n\n  [BUFFERPUSH](chunk: RType) {\n    if (this[OBJECTMODE]) this[BUFFERLENGTH] += 1\n    else this[BUFFERLENGTH] += (chunk as Minipass.BufferOrString).length\n    this[BUFFER].push(chunk)\n  }\n\n  [BUFFERSHIFT](): RType {\n    if (this[OBJECTMODE]) this[BUFFERLENGTH] -= 1\n    else\n      this[BUFFERLENGTH] -= (\n        this[BUFFER][0] as Minipass.BufferOrString\n      ).length\n    return this[BUFFER].shift() as RType\n  }\n\n  [FLUSH](noDrain: boolean = false) {\n    do {} while (\n      this[FLUSHCHUNK](this[BUFFERSHIFT]()) &&\n      this[BUFFER].length\n    )\n\n    if (!noDrain && !this[BUFFER].length && !this[EOF]) this.emit('drain')\n  }\n\n  [FLUSHCHUNK](chunk: RType) {\n    this.emit('data', chunk)\n    return this[FLOWING]\n  }\n\n  /**\n   * Pipe all data emitted by this stream into the destination provided.\n   *\n   * Triggers the flow of data.\n   */\n  pipe(dest: W, opts?: PipeOptions): W {\n    if (this[DESTROYED]) return dest\n    this[DISCARDED] = false\n\n    const ended = this[EMITTED_END]\n    opts = opts || {}\n    if (dest === proc.stdout || dest === proc.stderr) opts.end = false\n    else opts.end = opts.end !== false\n    opts.proxyErrors = !!opts.proxyErrors\n\n    // piping an ended stream ends immediately\n    if (ended) {\n      if (opts.end) dest.end()\n    } else {\n      // \"as\" here just ignores the WType, which pipes don't care about,\n      // since they're only consuming from us, and writing to the dest\n      this[PIPES].push(\n        !opts.proxyErrors\n          ? new Pipe(this as Minipass, dest, opts)\n          : new PipeProxyErrors(this as Minipass, dest, opts)\n      )\n      if (this[ASYNC]) defer(() => this[RESUME]())\n      else this[RESUME]()\n    }\n\n    return dest\n  }\n\n  /**\n   * Fully unhook a piped destination stream.\n   *\n   * If the destination stream was the only consumer of this stream (ie,\n   * there are no other piped destinations or `'data'` event listeners)\n   * then the flow of data will stop until there is another consumer or\n   * {@link Minipass#resume} is explicitly called.\n   */\n  unpipe(dest: W) {\n    const p = this[PIPES].find(p => p.dest === dest)\n    if (p) {\n      if (this[PIPES].length === 1) {\n        if (this[FLOWING] && this[DATALISTENERS] === 0) {\n          this[FLOWING] = false\n        }\n        this[PIPES] = []\n      } else this[PIPES].splice(this[PIPES].indexOf(p), 1)\n      p.unpipe()\n    }\n  }\n\n  /**\n   * Alias for {@link Minipass#on}\n   */\n  addListener(\n    ev: Event,\n    handler: (...args: Events[Event]) => any\n  ): this {\n    return this.on(ev, handler)\n  }\n\n  /**\n   * Mostly identical to `EventEmitter.on`, with the following\n   * behavior differences to prevent data loss and unnecessary hangs:\n   *\n   * - Adding a 'data' event handler will trigger the flow of data\n   *\n   * - Adding a 'readable' event handler when there is data waiting to be read\n   *   will cause 'readable' to be emitted immediately.\n   *\n   * - Adding an 'endish' event handler ('end', 'finish', etc.) which has\n   *   already passed will cause the event to be emitted immediately and all\n   *   handlers removed.\n   *\n   * - Adding an 'error' event handler after an error has been emitted will\n   *   cause the event to be re-emitted immediately with the error previously\n   *   raised.\n   */\n  on(\n    ev: Event,\n    handler: (...args: Events[Event]) => any\n  ): this {\n    const ret = super.on(\n      ev as string | symbol,\n      handler as (...a: any[]) => any\n    )\n    if (ev === 'data') {\n      this[DISCARDED] = false\n      this[DATALISTENERS]++\n      if (!this[PIPES].length && !this[FLOWING]) {\n        this[RESUME]()\n      }\n    } else if (ev === 'readable' && this[BUFFERLENGTH] !== 0) {\n      super.emit('readable')\n    } else if (isEndish(ev) && this[EMITTED_END]) {\n      super.emit(ev)\n      this.removeAllListeners(ev)\n    } else if (ev === 'error' && this[EMITTED_ERROR]) {\n      const h = handler as (...a: Events['error']) => any\n      if (this[ASYNC]) defer(() => h.call(this, this[EMITTED_ERROR]))\n      else h.call(this, this[EMITTED_ERROR])\n    }\n    return ret\n  }\n\n  /**\n   * Alias for {@link Minipass#off}\n   */\n  removeListener(\n    ev: Event,\n    handler: (...args: Events[Event]) => any\n  ) {\n    return this.off(ev, handler)\n  }\n\n  /**\n   * Mostly identical to `EventEmitter.off`\n   *\n   * If a 'data' event handler is removed, and it was the last consumer\n   * (ie, there are no pipe destinations or other 'data' event listeners),\n   * then the flow of data will stop until there is another consumer or\n   * {@link Minipass#resume} is explicitly called.\n   */\n  off(\n    ev: Event,\n    handler: (...args: Events[Event]) => any\n  ) {\n    const ret = super.off(\n      ev as string | symbol,\n      handler as (...a: any[]) => any\n    )\n    // if we previously had listeners, and now we don't, and we don't\n    // have any pipes, then stop the flow, unless it's been explicitly\n    // put in a discarded flowing state via stream.resume().\n    if (ev === 'data') {\n      this[DATALISTENERS] = this.listeners('data').length\n      if (\n        this[DATALISTENERS] === 0 &&\n        !this[DISCARDED] &&\n        !this[PIPES].length\n      ) {\n        this[FLOWING] = false\n      }\n    }\n    return ret\n  }\n\n  /**\n   * Mostly identical to `EventEmitter.removeAllListeners`\n   *\n   * If all 'data' event handlers are removed, and they were the last consumer\n   * (ie, there are no pipe destinations), then the flow of data will stop\n   * until there is another consumer or {@link Minipass#resume} is explicitly\n   * called.\n   */\n  removeAllListeners(ev?: Event) {\n    const ret = super.removeAllListeners(ev as string | symbol | undefined)\n    if (ev === 'data' || ev === undefined) {\n      this[DATALISTENERS] = 0\n      if (!this[DISCARDED] && !this[PIPES].length) {\n        this[FLOWING] = false\n      }\n    }\n    return ret\n  }\n\n  /**\n   * true if the 'end' event has been emitted\n   */\n  get emittedEnd() {\n    return this[EMITTED_END]\n  }\n\n  [MAYBE_EMIT_END]() {\n    if (\n      !this[EMITTING_END] &&\n      !this[EMITTED_END] &&\n      !this[DESTROYED] &&\n      this[BUFFER].length === 0 &&\n      this[EOF]\n    ) {\n      this[EMITTING_END] = true\n      this.emit('end')\n      this.emit('prefinish')\n      this.emit('finish')\n      if (this[CLOSED]) this.emit('close')\n      this[EMITTING_END] = false\n    }\n  }\n\n  /**\n   * Mostly identical to `EventEmitter.emit`, with the following\n   * behavior differences to prevent data loss and unnecessary hangs:\n   *\n   * If the stream has been destroyed, and the event is something other\n   * than 'close' or 'error', then `false` is returned and no handlers\n   * are called.\n   *\n   * If the event is 'end', and has already been emitted, then the event\n   * is ignored. If the stream is in a paused or non-flowing state, then\n   * the event will be deferred until data flow resumes. If the stream is\n   * async, then handlers will be called on the next tick rather than\n   * immediately.\n   *\n   * If the event is 'close', and 'end' has not yet been emitted, then\n   * the event will be deferred until after 'end' is emitted.\n   *\n   * If the event is 'error', and an AbortSignal was provided for the stream,\n   * and there are no listeners, then the event is ignored, matching the\n   * behavior of node core streams in the presense of an AbortSignal.\n   *\n   * If the event is 'finish' or 'prefinish', then all listeners will be\n   * removed after emitting the event, to prevent double-firing.\n   */\n  emit(\n    ev: Event,\n    ...args: Events[Event]\n  ): boolean {\n    const data = args[0]\n    // error and close are only events allowed after calling destroy()\n    if (\n      ev !== 'error' &&\n      ev !== 'close' &&\n      ev !== DESTROYED &&\n      this[DESTROYED]\n    ) {\n      return false\n    } else if (ev === 'data') {\n      return !this[OBJECTMODE] && !data\n        ? false\n        : this[ASYNC]\n        ? (defer(() => this[EMITDATA](data as RType)), true)\n        : this[EMITDATA](data as RType)\n    } else if (ev === 'end') {\n      return this[EMITEND]()\n    } else if (ev === 'close') {\n      this[CLOSED] = true\n      // don't emit close before 'end' and 'finish'\n      if (!this[EMITTED_END] && !this[DESTROYED]) return false\n      const ret = super.emit('close')\n      this.removeAllListeners('close')\n      return ret\n    } else if (ev === 'error') {\n      this[EMITTED_ERROR] = data\n      super.emit(ERROR, data)\n      const ret =\n        !this[SIGNAL] || this.listeners('error').length\n          ? super.emit('error', data)\n          : false\n      this[MAYBE_EMIT_END]()\n      return ret\n    } else if (ev === 'resume') {\n      const ret = super.emit('resume')\n      this[MAYBE_EMIT_END]()\n      return ret\n    } else if (ev === 'finish' || ev === 'prefinish') {\n      const ret = super.emit(ev)\n      this.removeAllListeners(ev)\n      return ret\n    }\n\n    // Some other unknown event\n    const ret = super.emit(ev as string, ...args)\n    this[MAYBE_EMIT_END]()\n    return ret\n  }\n\n  [EMITDATA](data: RType) {\n    for (const p of this[PIPES]) {\n      if (p.dest.write(data as RType) === false) this.pause()\n    }\n    const ret = this[DISCARDED] ? false : super.emit('data', data)\n    this[MAYBE_EMIT_END]()\n    return ret\n  }\n\n  [EMITEND]() {\n    if (this[EMITTED_END]) return false\n\n    this[EMITTED_END] = true\n    this.readable = false\n    return this[ASYNC]\n      ? (defer(() => this[EMITEND2]()), true)\n      : this[EMITEND2]()\n  }\n\n  [EMITEND2]() {\n    if (this[DECODER]) {\n      const data = this[DECODER].end()\n      if (data) {\n        for (const p of this[PIPES]) {\n          p.dest.write(data as RType)\n        }\n        if (!this[DISCARDED]) super.emit('data', data)\n      }\n    }\n\n    for (const p of this[PIPES]) {\n      p.end()\n    }\n    const ret = super.emit('end')\n    this.removeAllListeners('end')\n    return ret\n  }\n\n  /**\n   * Return a Promise that resolves to an array of all emitted data once\n   * the stream ends.\n   */\n  async collect(): Promise {\n    const buf: RType[] & { dataLength: number } = Object.assign([], {\n      dataLength: 0,\n    })\n    if (!this[OBJECTMODE]) buf.dataLength = 0\n    // set the promise first, in case an error is raised\n    // by triggering the flow here.\n    const p = this.promise()\n    this.on('data', c => {\n      buf.push(c)\n      if (!this[OBJECTMODE])\n        buf.dataLength += (c as Minipass.BufferOrString).length\n    })\n    await p\n    return buf\n  }\n\n  /**\n   * Return a Promise that resolves to the concatenation of all emitted data\n   * once the stream ends.\n   *\n   * Not allowed on objectMode streams.\n   */\n  async concat(): Promise {\n    if (this[OBJECTMODE]) {\n      throw new Error('cannot concat in objectMode')\n    }\n    const buf = await this.collect()\n    return (\n      this[ENCODING]\n        ? buf.join('')\n        : Buffer.concat(buf as Buffer[], buf.dataLength)\n    ) as RType\n  }\n\n  /**\n   * Return a void Promise that resolves once the stream ends.\n   */\n  async promise(): Promise {\n    return new Promise((resolve, reject) => {\n      this.on(DESTROYED, () => reject(new Error('stream destroyed')))\n      this.on('error', er => reject(er))\n      this.on('end', () => resolve())\n    })\n  }\n\n  /**\n   * Asynchronous `for await of` iteration.\n   *\n   * This will continue emitting all chunks until the stream terminates.\n   */\n  [Symbol.asyncIterator](): AsyncGenerator {\n    // set this up front, in case the consumer doesn't call next()\n    // right away.\n    this[DISCARDED] = false\n    let stopped = false\n    const stop = async (): Promise> => {\n      this.pause()\n      stopped = true\n      return { value: undefined, done: true }\n    }\n    const next = (): Promise> => {\n      if (stopped) return stop()\n      const res = this.read()\n      if (res !== null) return Promise.resolve({ done: false, value: res })\n\n      if (this[EOF]) return stop()\n\n      let resolve!: (res: IteratorResult) => void\n      let reject!: (er: unknown) => void\n      const onerr = (er: unknown) => {\n        this.off('data', ondata)\n        this.off('end', onend)\n        this.off(DESTROYED, ondestroy)\n        stop()\n        reject(er)\n      }\n      const ondata = (value: RType) => {\n        this.off('error', onerr)\n        this.off('end', onend)\n        this.off(DESTROYED, ondestroy)\n        this.pause()\n        resolve({ value, done: !!this[EOF] })\n      }\n      const onend = () => {\n        this.off('error', onerr)\n        this.off('data', ondata)\n        this.off(DESTROYED, ondestroy)\n        stop()\n        resolve({ done: true, value: undefined })\n      }\n      const ondestroy = () => onerr(new Error('stream destroyed'))\n      return new Promise>((res, rej) => {\n        reject = rej\n        resolve = res\n        this.once(DESTROYED, ondestroy)\n        this.once('error', onerr)\n        this.once('end', onend)\n        this.once('data', ondata)\n      })\n    }\n\n    return {\n      next,\n      throw: stop,\n      return: stop,\n      [Symbol.asyncIterator]() {\n        return this\n      },\n    }\n  }\n\n  /**\n   * Synchronous `for of` iteration.\n   *\n   * The iteration will terminate when the internal buffer runs out, even\n   * if the stream has not yet terminated.\n   */\n  [Symbol.iterator](): Generator {\n    // set this up front, in case the consumer doesn't call next()\n    // right away.\n    this[DISCARDED] = false\n    let stopped = false\n    const stop = (): IteratorReturnResult => {\n      this.pause()\n      this.off(ERROR, stop)\n      this.off(DESTROYED, stop)\n      this.off('end', stop)\n      stopped = true\n      return { done: true, value: undefined }\n    }\n\n    const next = (): IteratorResult => {\n      if (stopped) return stop()\n      const value = this.read()\n      return value === null ? stop() : { done: false, value }\n    }\n\n    this.once('end', stop)\n    this.once(ERROR, stop)\n    this.once(DESTROYED, stop)\n\n    return {\n      next,\n      throw: stop,\n      return: stop,\n      [Symbol.iterator]() {\n        return this\n      },\n    }\n  }\n\n  /**\n   * Destroy a stream, preventing it from being used for any further purpose.\n   *\n   * If the stream has a `close()` method, then it will be called on\n   * destruction.\n   *\n   * After destruction, any attempt to write data, read data, or emit most\n   * events will be ignored.\n   *\n   * If an error argument is provided, then it will be emitted in an\n   * 'error' event.\n   */\n  destroy(er?: unknown) {\n    if (this[DESTROYED]) {\n      if (er) this.emit('error', er)\n      else this.emit(DESTROYED)\n      return this\n    }\n\n    this[DESTROYED] = true\n    this[DISCARDED] = true\n\n    // throw away all buffered data, it's never coming out\n    this[BUFFER].length = 0\n    this[BUFFERLENGTH] = 0\n\n    const wc = this as Minipass & {\n      close?: () => void\n    }\n    if (typeof wc.close === 'function' && !this[CLOSED]) wc.close()\n\n    if (er) this.emit('error', er)\n    // if no error to emit, still reject pending promises\n    else this.emit(DESTROYED)\n\n    return this\n  }\n\n  /**\n   * Alias for {@link isStream}\n   *\n   * Former export location, maintained for backwards compatibility.\n   *\n   * @deprecated\n   */\n  static get isStream() {\n    return isStream\n  }\n}\n"]}
    \ No newline at end of file
    diff --git a/node_modules/minipass/dist/commonjs/package.json b/node_modules/minipass/dist/commonjs/package.json
    deleted file mode 100644
    index 5bbefff..0000000
    --- a/node_modules/minipass/dist/commonjs/package.json
    +++ /dev/null
    @@ -1,3 +0,0 @@
    -{
    -  "type": "commonjs"
    -}
    diff --git a/node_modules/minipass/dist/esm/index.d.ts b/node_modules/minipass/dist/esm/index.d.ts
    deleted file mode 100644
    index 6dbfbcf..0000000
    --- a/node_modules/minipass/dist/esm/index.d.ts
    +++ /dev/null
    @@ -1,549 +0,0 @@
    -/// 
    -/// 
    -/// 
    -/// 
    -import { EventEmitter } from 'node:events';
    -import { StringDecoder } from 'node:string_decoder';
    -/**
    - * Same as StringDecoder, but exposing the `lastNeed` flag on the type
    - */
    -type SD = StringDecoder & {
    -    lastNeed: boolean;
    -};
    -export type { SD, Pipe, PipeProxyErrors };
    -/**
    - * Return true if the argument is a Minipass stream, Node stream, or something
    - * else that Minipass can interact with.
    - */
    -export declare const isStream: (s: any) => s is NodeJS.WriteStream | NodeJS.ReadStream | Minipass | (NodeJS.ReadStream & {
    -    fd: number;
    -}) | (EventEmitter & {
    -    pause(): any;
    -    resume(): any;
    -    pipe(...destArgs: any[]): any;
    -}) | (NodeJS.WriteStream & {
    -    fd: number;
    -}) | (EventEmitter & {
    -    end(): any;
    -    write(chunk: any, ...args: any[]): any;
    -});
    -/**
    - * Return true if the argument is a valid {@link Minipass.Readable}
    - */
    -export declare const isReadable: (s: any) => s is Minipass.Readable;
    -/**
    - * Return true if the argument is a valid {@link Minipass.Writable}
    - */
    -export declare const isWritable: (s: any) => s is Minipass.Readable;
    -declare const EOF: unique symbol;
    -declare const MAYBE_EMIT_END: unique symbol;
    -declare const EMITTED_END: unique symbol;
    -declare const EMITTING_END: unique symbol;
    -declare const EMITTED_ERROR: unique symbol;
    -declare const CLOSED: unique symbol;
    -declare const READ: unique symbol;
    -declare const FLUSH: unique symbol;
    -declare const FLUSHCHUNK: unique symbol;
    -declare const ENCODING: unique symbol;
    -declare const DECODER: unique symbol;
    -declare const FLOWING: unique symbol;
    -declare const PAUSED: unique symbol;
    -declare const RESUME: unique symbol;
    -declare const BUFFER: unique symbol;
    -declare const PIPES: unique symbol;
    -declare const BUFFERLENGTH: unique symbol;
    -declare const BUFFERPUSH: unique symbol;
    -declare const BUFFERSHIFT: unique symbol;
    -declare const OBJECTMODE: unique symbol;
    -declare const DESTROYED: unique symbol;
    -declare const ERROR: unique symbol;
    -declare const EMITDATA: unique symbol;
    -declare const EMITEND: unique symbol;
    -declare const EMITEND2: unique symbol;
    -declare const ASYNC: unique symbol;
    -declare const ABORT: unique symbol;
    -declare const ABORTED: unique symbol;
    -declare const SIGNAL: unique symbol;
    -declare const DATALISTENERS: unique symbol;
    -declare const DISCARDED: unique symbol;
    -/**
    - * Options that may be passed to stream.pipe()
    - */
    -export interface PipeOptions {
    -    /**
    -     * end the destination stream when the source stream ends
    -     */
    -    end?: boolean;
    -    /**
    -     * proxy errors from the source stream to the destination stream
    -     */
    -    proxyErrors?: boolean;
    -}
    -/**
    - * Internal class representing a pipe to a destination stream.
    - *
    - * @internal
    - */
    -declare class Pipe {
    -    src: Minipass;
    -    dest: Minipass;
    -    opts: PipeOptions;
    -    ondrain: () => any;
    -    constructor(src: Minipass, dest: Minipass.Writable, opts: PipeOptions);
    -    unpipe(): void;
    -    proxyErrors(_er: any): void;
    -    end(): void;
    -}
    -/**
    - * Internal class representing a pipe to a destination stream where
    - * errors are proxied.
    - *
    - * @internal
    - */
    -declare class PipeProxyErrors extends Pipe {
    -    unpipe(): void;
    -    constructor(src: Minipass, dest: Minipass.Writable, opts: PipeOptions);
    -}
    -export declare namespace Minipass {
    -    /**
    -     * Encoding used to create a stream that outputs strings rather than
    -     * Buffer objects.
    -     */
    -    export type Encoding = BufferEncoding | 'buffer' | null;
    -    /**
    -     * Any stream that Minipass can pipe into
    -     */
    -    export type Writable = Minipass | NodeJS.WriteStream | (NodeJS.WriteStream & {
    -        fd: number;
    -    }) | (EventEmitter & {
    -        end(): any;
    -        write(chunk: any, ...args: any[]): any;
    -    });
    -    /**
    -     * Any stream that can be read from
    -     */
    -    export type Readable = Minipass | NodeJS.ReadStream | (NodeJS.ReadStream & {
    -        fd: number;
    -    }) | (EventEmitter & {
    -        pause(): any;
    -        resume(): any;
    -        pipe(...destArgs: any[]): any;
    -    });
    -    /**
    -     * Utility type that can be iterated sync or async
    -     */
    -    export type DualIterable = Iterable & AsyncIterable;
    -    type EventArguments = Record;
    -    /**
    -     * The listing of events that a Minipass class can emit.
    -     * Extend this when extending the Minipass class, and pass as
    -     * the third template argument.  The key is the name of the event,
    -     * and the value is the argument list.
    -     *
    -     * Any undeclared events will still be allowed, but the handler will get
    -     * arguments as `unknown[]`.
    -     */
    -    export interface Events extends EventArguments {
    -        readable: [];
    -        data: [chunk: RType];
    -        error: [er: unknown];
    -        abort: [reason: unknown];
    -        drain: [];
    -        resume: [];
    -        end: [];
    -        finish: [];
    -        prefinish: [];
    -        close: [];
    -        [DESTROYED]: [er?: unknown];
    -        [ERROR]: [er: unknown];
    -    }
    -    /**
    -     * String or buffer-like data that can be joined and sliced
    -     */
    -    export type ContiguousData = Buffer | ArrayBufferLike | ArrayBufferView | string;
    -    export type BufferOrString = Buffer | string;
    -    /**
    -     * Options passed to the Minipass constructor.
    -     */
    -    export type SharedOptions = {
    -        /**
    -         * Defer all data emission and other events until the end of the
    -         * current tick, similar to Node core streams
    -         */
    -        async?: boolean;
    -        /**
    -         * A signal which will abort the stream
    -         */
    -        signal?: AbortSignal;
    -        /**
    -         * Output string encoding. Set to `null` or `'buffer'` (or omit) to
    -         * emit Buffer objects rather than strings.
    -         *
    -         * Conflicts with `objectMode`
    -         */
    -        encoding?: BufferEncoding | null | 'buffer';
    -        /**
    -         * Output data exactly as it was written, supporting non-buffer/string
    -         * data (such as arbitrary objects, falsey values, etc.)
    -         *
    -         * Conflicts with `encoding`
    -         */
    -        objectMode?: boolean;
    -    };
    -    /**
    -     * Options for a string encoded output
    -     */
    -    export type EncodingOptions = SharedOptions & {
    -        encoding: BufferEncoding;
    -        objectMode?: false;
    -    };
    -    /**
    -     * Options for contiguous data buffer output
    -     */
    -    export type BufferOptions = SharedOptions & {
    -        encoding?: null | 'buffer';
    -        objectMode?: false;
    -    };
    -    /**
    -     * Options for objectMode arbitrary output
    -     */
    -    export type ObjectModeOptions = SharedOptions & {
    -        objectMode: true;
    -        encoding?: null;
    -    };
    -    /**
    -     * Utility type to determine allowed options based on read type
    -     */
    -    export type Options = ObjectModeOptions | (T extends string ? EncodingOptions : T extends Buffer ? BufferOptions : SharedOptions);
    -    export {};
    -}
    -/**
    - * Main export, the Minipass class
    - *
    - * `RType` is the type of data emitted, defaults to Buffer
    - *
    - * `WType` is the type of data to be written, if RType is buffer or string,
    - * then any {@link Minipass.ContiguousData} is allowed.
    - *
    - * `Events` is the set of event handler signatures that this object
    - * will emit, see {@link Minipass.Events}
    - */
    -export declare class Minipass = Minipass.Events> extends EventEmitter implements Minipass.DualIterable {
    -    [FLOWING]: boolean;
    -    [PAUSED]: boolean;
    -    [PIPES]: Pipe[];
    -    [BUFFER]: RType[];
    -    [OBJECTMODE]: boolean;
    -    [ENCODING]: BufferEncoding | null;
    -    [ASYNC]: boolean;
    -    [DECODER]: SD | null;
    -    [EOF]: boolean;
    -    [EMITTED_END]: boolean;
    -    [EMITTING_END]: boolean;
    -    [CLOSED]: boolean;
    -    [EMITTED_ERROR]: unknown;
    -    [BUFFERLENGTH]: number;
    -    [DESTROYED]: boolean;
    -    [SIGNAL]?: AbortSignal;
    -    [ABORTED]: boolean;
    -    [DATALISTENERS]: number;
    -    [DISCARDED]: boolean;
    -    /**
    -     * true if the stream can be written
    -     */
    -    writable: boolean;
    -    /**
    -     * true if the stream can be read
    -     */
    -    readable: boolean;
    -    /**
    -     * If `RType` is Buffer, then options do not need to be provided.
    -     * Otherwise, an options object must be provided to specify either
    -     * {@link Minipass.SharedOptions.objectMode} or
    -     * {@link Minipass.SharedOptions.encoding}, as appropriate.
    -     */
    -    constructor(...args: [Minipass.ObjectModeOptions] | (RType extends Buffer ? [] | [Minipass.Options] : [Minipass.Options]));
    -    /**
    -     * The amount of data stored in the buffer waiting to be read.
    -     *
    -     * For Buffer strings, this will be the total byte length.
    -     * For string encoding streams, this will be the string character length,
    -     * according to JavaScript's `string.length` logic.
    -     * For objectMode streams, this is a count of the items waiting to be
    -     * emitted.
    -     */
    -    get bufferLength(): number;
    -    /**
    -     * The `BufferEncoding` currently in use, or `null`
    -     */
    -    get encoding(): BufferEncoding | null;
    -    /**
    -     * @deprecated - This is a read only property
    -     */
    -    set encoding(_enc: BufferEncoding | null);
    -    /**
    -     * @deprecated - Encoding may only be set at instantiation time
    -     */
    -    setEncoding(_enc: Minipass.Encoding): void;
    -    /**
    -     * True if this is an objectMode stream
    -     */
    -    get objectMode(): boolean;
    -    /**
    -     * @deprecated - This is a read-only property
    -     */
    -    set objectMode(_om: boolean);
    -    /**
    -     * true if this is an async stream
    -     */
    -    get ['async'](): boolean;
    -    /**
    -     * Set to true to make this stream async.
    -     *
    -     * Once set, it cannot be unset, as this would potentially cause incorrect
    -     * behavior.  Ie, a sync stream can be made async, but an async stream
    -     * cannot be safely made sync.
    -     */
    -    set ['async'](a: boolean);
    -    [ABORT](): void;
    -    /**
    -     * True if the stream has been aborted.
    -     */
    -    get aborted(): boolean;
    -    /**
    -     * No-op setter. Stream aborted status is set via the AbortSignal provided
    -     * in the constructor options.
    -     */
    -    set aborted(_: boolean);
    -    /**
    -     * Write data into the stream
    -     *
    -     * If the chunk written is a string, and encoding is not specified, then
    -     * `utf8` will be assumed. If the stream encoding matches the encoding of
    -     * a written string, and the state of the string decoder allows it, then
    -     * the string will be passed through to either the output or the internal
    -     * buffer without any processing. Otherwise, it will be turned into a
    -     * Buffer object for processing into the desired encoding.
    -     *
    -     * If provided, `cb` function is called immediately before return for
    -     * sync streams, or on next tick for async streams, because for this
    -     * base class, a chunk is considered "processed" once it is accepted
    -     * and either emitted or buffered. That is, the callback does not indicate
    -     * that the chunk has been eventually emitted, though of course child
    -     * classes can override this function to do whatever processing is required
    -     * and call `super.write(...)` only once processing is completed.
    -     */
    -    write(chunk: WType, cb?: () => void): boolean;
    -    write(chunk: WType, encoding?: Minipass.Encoding, cb?: () => void): boolean;
    -    /**
    -     * Low-level explicit read method.
    -     *
    -     * In objectMode, the argument is ignored, and one item is returned if
    -     * available.
    -     *
    -     * `n` is the number of bytes (or in the case of encoding streams,
    -     * characters) to consume. If `n` is not provided, then the entire buffer
    -     * is returned, or `null` is returned if no data is available.
    -     *
    -     * If `n` is greater that the amount of data in the internal buffer,
    -     * then `null` is returned.
    -     */
    -    read(n?: number | null): RType | null;
    -    [READ](n: number | null, chunk: RType): RType;
    -    /**
    -     * End the stream, optionally providing a final write.
    -     *
    -     * See {@link Minipass#write} for argument descriptions
    -     */
    -    end(cb?: () => void): this;
    -    end(chunk: WType, cb?: () => void): this;
    -    end(chunk: WType, encoding?: Minipass.Encoding, cb?: () => void): this;
    -    [RESUME](): void;
    -    /**
    -     * Resume the stream if it is currently in a paused state
    -     *
    -     * If called when there are no pipe destinations or `data` event listeners,
    -     * this will place the stream in a "discarded" state, where all data will
    -     * be thrown away. The discarded state is removed if a pipe destination or
    -     * data handler is added, if pause() is called, or if any synchronous or
    -     * asynchronous iteration is started.
    -     */
    -    resume(): void;
    -    /**
    -     * Pause the stream
    -     */
    -    pause(): void;
    -    /**
    -     * true if the stream has been forcibly destroyed
    -     */
    -    get destroyed(): boolean;
    -    /**
    -     * true if the stream is currently in a flowing state, meaning that
    -     * any writes will be immediately emitted.
    -     */
    -    get flowing(): boolean;
    -    /**
    -     * true if the stream is currently in a paused state
    -     */
    -    get paused(): boolean;
    -    [BUFFERPUSH](chunk: RType): void;
    -    [BUFFERSHIFT](): RType;
    -    [FLUSH](noDrain?: boolean): void;
    -    [FLUSHCHUNK](chunk: RType): boolean;
    -    /**
    -     * Pipe all data emitted by this stream into the destination provided.
    -     *
    -     * Triggers the flow of data.
    -     */
    -    pipe(dest: W, opts?: PipeOptions): W;
    -    /**
    -     * Fully unhook a piped destination stream.
    -     *
    -     * If the destination stream was the only consumer of this stream (ie,
    -     * there are no other piped destinations or `'data'` event listeners)
    -     * then the flow of data will stop until there is another consumer or
    -     * {@link Minipass#resume} is explicitly called.
    -     */
    -    unpipe(dest: W): void;
    -    /**
    -     * Alias for {@link Minipass#on}
    -     */
    -    addListener(ev: Event, handler: (...args: Events[Event]) => any): this;
    -    /**
    -     * Mostly identical to `EventEmitter.on`, with the following
    -     * behavior differences to prevent data loss and unnecessary hangs:
    -     *
    -     * - Adding a 'data' event handler will trigger the flow of data
    -     *
    -     * - Adding a 'readable' event handler when there is data waiting to be read
    -     *   will cause 'readable' to be emitted immediately.
    -     *
    -     * - Adding an 'endish' event handler ('end', 'finish', etc.) which has
    -     *   already passed will cause the event to be emitted immediately and all
    -     *   handlers removed.
    -     *
    -     * - Adding an 'error' event handler after an error has been emitted will
    -     *   cause the event to be re-emitted immediately with the error previously
    -     *   raised.
    -     */
    -    on(ev: Event, handler: (...args: Events[Event]) => any): this;
    -    /**
    -     * Alias for {@link Minipass#off}
    -     */
    -    removeListener(ev: Event, handler: (...args: Events[Event]) => any): this;
    -    /**
    -     * Mostly identical to `EventEmitter.off`
    -     *
    -     * If a 'data' event handler is removed, and it was the last consumer
    -     * (ie, there are no pipe destinations or other 'data' event listeners),
    -     * then the flow of data will stop until there is another consumer or
    -     * {@link Minipass#resume} is explicitly called.
    -     */
    -    off(ev: Event, handler: (...args: Events[Event]) => any): this;
    -    /**
    -     * Mostly identical to `EventEmitter.removeAllListeners`
    -     *
    -     * If all 'data' event handlers are removed, and they were the last consumer
    -     * (ie, there are no pipe destinations), then the flow of data will stop
    -     * until there is another consumer or {@link Minipass#resume} is explicitly
    -     * called.
    -     */
    -    removeAllListeners(ev?: Event): this;
    -    /**
    -     * true if the 'end' event has been emitted
    -     */
    -    get emittedEnd(): boolean;
    -    [MAYBE_EMIT_END](): void;
    -    /**
    -     * Mostly identical to `EventEmitter.emit`, with the following
    -     * behavior differences to prevent data loss and unnecessary hangs:
    -     *
    -     * If the stream has been destroyed, and the event is something other
    -     * than 'close' or 'error', then `false` is returned and no handlers
    -     * are called.
    -     *
    -     * If the event is 'end', and has already been emitted, then the event
    -     * is ignored. If the stream is in a paused or non-flowing state, then
    -     * the event will be deferred until data flow resumes. If the stream is
    -     * async, then handlers will be called on the next tick rather than
    -     * immediately.
    -     *
    -     * If the event is 'close', and 'end' has not yet been emitted, then
    -     * the event will be deferred until after 'end' is emitted.
    -     *
    -     * If the event is 'error', and an AbortSignal was provided for the stream,
    -     * and there are no listeners, then the event is ignored, matching the
    -     * behavior of node core streams in the presense of an AbortSignal.
    -     *
    -     * If the event is 'finish' or 'prefinish', then all listeners will be
    -     * removed after emitting the event, to prevent double-firing.
    -     */
    -    emit(ev: Event, ...args: Events[Event]): boolean;
    -    [EMITDATA](data: RType): boolean;
    -    [EMITEND](): boolean;
    -    [EMITEND2](): boolean;
    -    /**
    -     * Return a Promise that resolves to an array of all emitted data once
    -     * the stream ends.
    -     */
    -    collect(): Promise;
    -    /**
    -     * Return a Promise that resolves to the concatenation of all emitted data
    -     * once the stream ends.
    -     *
    -     * Not allowed on objectMode streams.
    -     */
    -    concat(): Promise;
    -    /**
    -     * Return a void Promise that resolves once the stream ends.
    -     */
    -    promise(): Promise;
    -    /**
    -     * Asynchronous `for await of` iteration.
    -     *
    -     * This will continue emitting all chunks until the stream terminates.
    -     */
    -    [Symbol.asyncIterator](): AsyncGenerator;
    -    /**
    -     * Synchronous `for of` iteration.
    -     *
    -     * The iteration will terminate when the internal buffer runs out, even
    -     * if the stream has not yet terminated.
    -     */
    -    [Symbol.iterator](): Generator;
    -    /**
    -     * Destroy a stream, preventing it from being used for any further purpose.
    -     *
    -     * If the stream has a `close()` method, then it will be called on
    -     * destruction.
    -     *
    -     * After destruction, any attempt to write data, read data, or emit most
    -     * events will be ignored.
    -     *
    -     * If an error argument is provided, then it will be emitted in an
    -     * 'error' event.
    -     */
    -    destroy(er?: unknown): this;
    -    /**
    -     * Alias for {@link isStream}
    -     *
    -     * Former export location, maintained for backwards compatibility.
    -     *
    -     * @deprecated
    -     */
    -    static get isStream(): (s: any) => s is NodeJS.WriteStream | NodeJS.ReadStream | Minipass | (NodeJS.ReadStream & {
    -        fd: number;
    -    }) | (EventEmitter & {
    -        pause(): any;
    -        resume(): any;
    -        pipe(...destArgs: any[]): any;
    -    }) | (NodeJS.WriteStream & {
    -        fd: number;
    -    }) | (EventEmitter & {
    -        end(): any;
    -        write(chunk: any, ...args: any[]): any;
    -    });
    -}
    -//# sourceMappingURL=index.d.ts.map
    \ No newline at end of file
    diff --git a/node_modules/minipass/dist/esm/index.d.ts.map b/node_modules/minipass/dist/esm/index.d.ts.map
    deleted file mode 100644
    index cac7e00..0000000
    --- a/node_modules/minipass/dist/esm/index.d.ts.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
    \ No newline at end of file
    diff --git a/node_modules/minipass/dist/esm/index.js b/node_modules/minipass/dist/esm/index.js
    deleted file mode 100644
    index b5fa451..0000000
    --- a/node_modules/minipass/dist/esm/index.js
    +++ /dev/null
    @@ -1,1018 +0,0 @@
    -const proc = typeof process === 'object' && process
    -    ? process
    -    : {
    -        stdout: null,
    -        stderr: null,
    -    };
    -import { EventEmitter } from 'node:events';
    -import Stream from 'node:stream';
    -import { StringDecoder } from 'node:string_decoder';
    -/**
    - * Return true if the argument is a Minipass stream, Node stream, or something
    - * else that Minipass can interact with.
    - */
    -export const isStream = (s) => !!s &&
    -    typeof s === 'object' &&
    -    (s instanceof Minipass ||
    -        s instanceof Stream ||
    -        isReadable(s) ||
    -        isWritable(s));
    -/**
    - * Return true if the argument is a valid {@link Minipass.Readable}
    - */
    -export const isReadable = (s) => !!s &&
    -    typeof s === 'object' &&
    -    s instanceof EventEmitter &&
    -    typeof s.pipe === 'function' &&
    -    // node core Writable streams have a pipe() method, but it throws
    -    s.pipe !== Stream.Writable.prototype.pipe;
    -/**
    - * Return true if the argument is a valid {@link Minipass.Writable}
    - */
    -export const isWritable = (s) => !!s &&
    -    typeof s === 'object' &&
    -    s instanceof EventEmitter &&
    -    typeof s.write === 'function' &&
    -    typeof s.end === 'function';
    -const EOF = Symbol('EOF');
    -const MAYBE_EMIT_END = Symbol('maybeEmitEnd');
    -const EMITTED_END = Symbol('emittedEnd');
    -const EMITTING_END = Symbol('emittingEnd');
    -const EMITTED_ERROR = Symbol('emittedError');
    -const CLOSED = Symbol('closed');
    -const READ = Symbol('read');
    -const FLUSH = Symbol('flush');
    -const FLUSHCHUNK = Symbol('flushChunk');
    -const ENCODING = Symbol('encoding');
    -const DECODER = Symbol('decoder');
    -const FLOWING = Symbol('flowing');
    -const PAUSED = Symbol('paused');
    -const RESUME = Symbol('resume');
    -const BUFFER = Symbol('buffer');
    -const PIPES = Symbol('pipes');
    -const BUFFERLENGTH = Symbol('bufferLength');
    -const BUFFERPUSH = Symbol('bufferPush');
    -const BUFFERSHIFT = Symbol('bufferShift');
    -const OBJECTMODE = Symbol('objectMode');
    -// internal event when stream is destroyed
    -const DESTROYED = Symbol('destroyed');
    -// internal event when stream has an error
    -const ERROR = Symbol('error');
    -const EMITDATA = Symbol('emitData');
    -const EMITEND = Symbol('emitEnd');
    -const EMITEND2 = Symbol('emitEnd2');
    -const ASYNC = Symbol('async');
    -const ABORT = Symbol('abort');
    -const ABORTED = Symbol('aborted');
    -const SIGNAL = Symbol('signal');
    -const DATALISTENERS = Symbol('dataListeners');
    -const DISCARDED = Symbol('discarded');
    -const defer = (fn) => Promise.resolve().then(fn);
    -const nodefer = (fn) => fn();
    -const isEndish = (ev) => ev === 'end' || ev === 'finish' || ev === 'prefinish';
    -const isArrayBufferLike = (b) => b instanceof ArrayBuffer ||
    -    (!!b &&
    -        typeof b === 'object' &&
    -        b.constructor &&
    -        b.constructor.name === 'ArrayBuffer' &&
    -        b.byteLength >= 0);
    -const isArrayBufferView = (b) => !Buffer.isBuffer(b) && ArrayBuffer.isView(b);
    -/**
    - * Internal class representing a pipe to a destination stream.
    - *
    - * @internal
    - */
    -class Pipe {
    -    src;
    -    dest;
    -    opts;
    -    ondrain;
    -    constructor(src, dest, opts) {
    -        this.src = src;
    -        this.dest = dest;
    -        this.opts = opts;
    -        this.ondrain = () => src[RESUME]();
    -        this.dest.on('drain', this.ondrain);
    -    }
    -    unpipe() {
    -        this.dest.removeListener('drain', this.ondrain);
    -    }
    -    // only here for the prototype
    -    /* c8 ignore start */
    -    proxyErrors(_er) { }
    -    /* c8 ignore stop */
    -    end() {
    -        this.unpipe();
    -        if (this.opts.end)
    -            this.dest.end();
    -    }
    -}
    -/**
    - * Internal class representing a pipe to a destination stream where
    - * errors are proxied.
    - *
    - * @internal
    - */
    -class PipeProxyErrors extends Pipe {
    -    unpipe() {
    -        this.src.removeListener('error', this.proxyErrors);
    -        super.unpipe();
    -    }
    -    constructor(src, dest, opts) {
    -        super(src, dest, opts);
    -        this.proxyErrors = er => dest.emit('error', er);
    -        src.on('error', this.proxyErrors);
    -    }
    -}
    -const isObjectModeOptions = (o) => !!o.objectMode;
    -const isEncodingOptions = (o) => !o.objectMode && !!o.encoding && o.encoding !== 'buffer';
    -/**
    - * Main export, the Minipass class
    - *
    - * `RType` is the type of data emitted, defaults to Buffer
    - *
    - * `WType` is the type of data to be written, if RType is buffer or string,
    - * then any {@link Minipass.ContiguousData} is allowed.
    - *
    - * `Events` is the set of event handler signatures that this object
    - * will emit, see {@link Minipass.Events}
    - */
    -export class Minipass extends EventEmitter {
    -    [FLOWING] = false;
    -    [PAUSED] = false;
    -    [PIPES] = [];
    -    [BUFFER] = [];
    -    [OBJECTMODE];
    -    [ENCODING];
    -    [ASYNC];
    -    [DECODER];
    -    [EOF] = false;
    -    [EMITTED_END] = false;
    -    [EMITTING_END] = false;
    -    [CLOSED] = false;
    -    [EMITTED_ERROR] = null;
    -    [BUFFERLENGTH] = 0;
    -    [DESTROYED] = false;
    -    [SIGNAL];
    -    [ABORTED] = false;
    -    [DATALISTENERS] = 0;
    -    [DISCARDED] = false;
    -    /**
    -     * true if the stream can be written
    -     */
    -    writable = true;
    -    /**
    -     * true if the stream can be read
    -     */
    -    readable = true;
    -    /**
    -     * If `RType` is Buffer, then options do not need to be provided.
    -     * Otherwise, an options object must be provided to specify either
    -     * {@link Minipass.SharedOptions.objectMode} or
    -     * {@link Minipass.SharedOptions.encoding}, as appropriate.
    -     */
    -    constructor(...args) {
    -        const options = (args[0] ||
    -            {});
    -        super();
    -        if (options.objectMode && typeof options.encoding === 'string') {
    -            throw new TypeError('Encoding and objectMode may not be used together');
    -        }
    -        if (isObjectModeOptions(options)) {
    -            this[OBJECTMODE] = true;
    -            this[ENCODING] = null;
    -        }
    -        else if (isEncodingOptions(options)) {
    -            this[ENCODING] = options.encoding;
    -            this[OBJECTMODE] = false;
    -        }
    -        else {
    -            this[OBJECTMODE] = false;
    -            this[ENCODING] = null;
    -        }
    -        this[ASYNC] = !!options.async;
    -        this[DECODER] = this[ENCODING]
    -            ? new StringDecoder(this[ENCODING])
    -            : null;
    -        //@ts-ignore - private option for debugging and testing
    -        if (options && options.debugExposeBuffer === true) {
    -            Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] });
    -        }
    -        //@ts-ignore - private option for debugging and testing
    -        if (options && options.debugExposePipes === true) {
    -            Object.defineProperty(this, 'pipes', { get: () => this[PIPES] });
    -        }
    -        const { signal } = options;
    -        if (signal) {
    -            this[SIGNAL] = signal;
    -            if (signal.aborted) {
    -                this[ABORT]();
    -            }
    -            else {
    -                signal.addEventListener('abort', () => this[ABORT]());
    -            }
    -        }
    -    }
    -    /**
    -     * The amount of data stored in the buffer waiting to be read.
    -     *
    -     * For Buffer strings, this will be the total byte length.
    -     * For string encoding streams, this will be the string character length,
    -     * according to JavaScript's `string.length` logic.
    -     * For objectMode streams, this is a count of the items waiting to be
    -     * emitted.
    -     */
    -    get bufferLength() {
    -        return this[BUFFERLENGTH];
    -    }
    -    /**
    -     * The `BufferEncoding` currently in use, or `null`
    -     */
    -    get encoding() {
    -        return this[ENCODING];
    -    }
    -    /**
    -     * @deprecated - This is a read only property
    -     */
    -    set encoding(_enc) {
    -        throw new Error('Encoding must be set at instantiation time');
    -    }
    -    /**
    -     * @deprecated - Encoding may only be set at instantiation time
    -     */
    -    setEncoding(_enc) {
    -        throw new Error('Encoding must be set at instantiation time');
    -    }
    -    /**
    -     * True if this is an objectMode stream
    -     */
    -    get objectMode() {
    -        return this[OBJECTMODE];
    -    }
    -    /**
    -     * @deprecated - This is a read-only property
    -     */
    -    set objectMode(_om) {
    -        throw new Error('objectMode must be set at instantiation time');
    -    }
    -    /**
    -     * true if this is an async stream
    -     */
    -    get ['async']() {
    -        return this[ASYNC];
    -    }
    -    /**
    -     * Set to true to make this stream async.
    -     *
    -     * Once set, it cannot be unset, as this would potentially cause incorrect
    -     * behavior.  Ie, a sync stream can be made async, but an async stream
    -     * cannot be safely made sync.
    -     */
    -    set ['async'](a) {
    -        this[ASYNC] = this[ASYNC] || !!a;
    -    }
    -    // drop everything and get out of the flow completely
    -    [ABORT]() {
    -        this[ABORTED] = true;
    -        this.emit('abort', this[SIGNAL]?.reason);
    -        this.destroy(this[SIGNAL]?.reason);
    -    }
    -    /**
    -     * True if the stream has been aborted.
    -     */
    -    get aborted() {
    -        return this[ABORTED];
    -    }
    -    /**
    -     * No-op setter. Stream aborted status is set via the AbortSignal provided
    -     * in the constructor options.
    -     */
    -    set aborted(_) { }
    -    write(chunk, encoding, cb) {
    -        if (this[ABORTED])
    -            return false;
    -        if (this[EOF])
    -            throw new Error('write after end');
    -        if (this[DESTROYED]) {
    -            this.emit('error', Object.assign(new Error('Cannot call write after a stream was destroyed'), { code: 'ERR_STREAM_DESTROYED' }));
    -            return true;
    -        }
    -        if (typeof encoding === 'function') {
    -            cb = encoding;
    -            encoding = 'utf8';
    -        }
    -        if (!encoding)
    -            encoding = 'utf8';
    -        const fn = this[ASYNC] ? defer : nodefer;
    -        // convert array buffers and typed array views into buffers
    -        // at some point in the future, we may want to do the opposite!
    -        // leave strings and buffers as-is
    -        // anything is only allowed if in object mode, so throw
    -        if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) {
    -            if (isArrayBufferView(chunk)) {
    -                //@ts-ignore - sinful unsafe type changing
    -                chunk = Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength);
    -            }
    -            else if (isArrayBufferLike(chunk)) {
    -                //@ts-ignore - sinful unsafe type changing
    -                chunk = Buffer.from(chunk);
    -            }
    -            else if (typeof chunk !== 'string') {
    -                throw new Error('Non-contiguous data written to non-objectMode stream');
    -            }
    -        }
    -        // handle object mode up front, since it's simpler
    -        // this yields better performance, fewer checks later.
    -        if (this[OBJECTMODE]) {
    -            // maybe impossible?
    -            /* c8 ignore start */
    -            if (this[FLOWING] && this[BUFFERLENGTH] !== 0)
    -                this[FLUSH](true);
    -            /* c8 ignore stop */
    -            if (this[FLOWING])
    -                this.emit('data', chunk);
    -            else
    -                this[BUFFERPUSH](chunk);
    -            if (this[BUFFERLENGTH] !== 0)
    -                this.emit('readable');
    -            if (cb)
    -                fn(cb);
    -            return this[FLOWING];
    -        }
    -        // at this point the chunk is a buffer or string
    -        // don't buffer it up or send it to the decoder
    -        if (!chunk.length) {
    -            if (this[BUFFERLENGTH] !== 0)
    -                this.emit('readable');
    -            if (cb)
    -                fn(cb);
    -            return this[FLOWING];
    -        }
    -        // fast-path writing strings of same encoding to a stream with
    -        // an empty buffer, skipping the buffer/decoder dance
    -        if (typeof chunk === 'string' &&
    -            // unless it is a string already ready for us to use
    -            !(encoding === this[ENCODING] && !this[DECODER]?.lastNeed)) {
    -            //@ts-ignore - sinful unsafe type change
    -            chunk = Buffer.from(chunk, encoding);
    -        }
    -        if (Buffer.isBuffer(chunk) && this[ENCODING]) {
    -            //@ts-ignore - sinful unsafe type change
    -            chunk = this[DECODER].write(chunk);
    -        }
    -        // Note: flushing CAN potentially switch us into not-flowing mode
    -        if (this[FLOWING] && this[BUFFERLENGTH] !== 0)
    -            this[FLUSH](true);
    -        if (this[FLOWING])
    -            this.emit('data', chunk);
    -        else
    -            this[BUFFERPUSH](chunk);
    -        if (this[BUFFERLENGTH] !== 0)
    -            this.emit('readable');
    -        if (cb)
    -            fn(cb);
    -        return this[FLOWING];
    -    }
    -    /**
    -     * Low-level explicit read method.
    -     *
    -     * In objectMode, the argument is ignored, and one item is returned if
    -     * available.
    -     *
    -     * `n` is the number of bytes (or in the case of encoding streams,
    -     * characters) to consume. If `n` is not provided, then the entire buffer
    -     * is returned, or `null` is returned if no data is available.
    -     *
    -     * If `n` is greater that the amount of data in the internal buffer,
    -     * then `null` is returned.
    -     */
    -    read(n) {
    -        if (this[DESTROYED])
    -            return null;
    -        this[DISCARDED] = false;
    -        if (this[BUFFERLENGTH] === 0 ||
    -            n === 0 ||
    -            (n && n > this[BUFFERLENGTH])) {
    -            this[MAYBE_EMIT_END]();
    -            return null;
    -        }
    -        if (this[OBJECTMODE])
    -            n = null;
    -        if (this[BUFFER].length > 1 && !this[OBJECTMODE]) {
    -            // not object mode, so if we have an encoding, then RType is string
    -            // otherwise, must be Buffer
    -            this[BUFFER] = [
    -                (this[ENCODING]
    -                    ? this[BUFFER].join('')
    -                    : Buffer.concat(this[BUFFER], this[BUFFERLENGTH])),
    -            ];
    -        }
    -        const ret = this[READ](n || null, this[BUFFER][0]);
    -        this[MAYBE_EMIT_END]();
    -        return ret;
    -    }
    -    [READ](n, chunk) {
    -        if (this[OBJECTMODE])
    -            this[BUFFERSHIFT]();
    -        else {
    -            const c = chunk;
    -            if (n === c.length || n === null)
    -                this[BUFFERSHIFT]();
    -            else if (typeof c === 'string') {
    -                this[BUFFER][0] = c.slice(n);
    -                chunk = c.slice(0, n);
    -                this[BUFFERLENGTH] -= n;
    -            }
    -            else {
    -                this[BUFFER][0] = c.subarray(n);
    -                chunk = c.subarray(0, n);
    -                this[BUFFERLENGTH] -= n;
    -            }
    -        }
    -        this.emit('data', chunk);
    -        if (!this[BUFFER].length && !this[EOF])
    -            this.emit('drain');
    -        return chunk;
    -    }
    -    end(chunk, encoding, cb) {
    -        if (typeof chunk === 'function') {
    -            cb = chunk;
    -            chunk = undefined;
    -        }
    -        if (typeof encoding === 'function') {
    -            cb = encoding;
    -            encoding = 'utf8';
    -        }
    -        if (chunk !== undefined)
    -            this.write(chunk, encoding);
    -        if (cb)
    -            this.once('end', cb);
    -        this[EOF] = true;
    -        this.writable = false;
    -        // if we haven't written anything, then go ahead and emit,
    -        // even if we're not reading.
    -        // we'll re-emit if a new 'end' listener is added anyway.
    -        // This makes MP more suitable to write-only use cases.
    -        if (this[FLOWING] || !this[PAUSED])
    -            this[MAYBE_EMIT_END]();
    -        return this;
    -    }
    -    // don't let the internal resume be overwritten
    -    [RESUME]() {
    -        if (this[DESTROYED])
    -            return;
    -        if (!this[DATALISTENERS] && !this[PIPES].length) {
    -            this[DISCARDED] = true;
    -        }
    -        this[PAUSED] = false;
    -        this[FLOWING] = true;
    -        this.emit('resume');
    -        if (this[BUFFER].length)
    -            this[FLUSH]();
    -        else if (this[EOF])
    -            this[MAYBE_EMIT_END]();
    -        else
    -            this.emit('drain');
    -    }
    -    /**
    -     * Resume the stream if it is currently in a paused state
    -     *
    -     * If called when there are no pipe destinations or `data` event listeners,
    -     * this will place the stream in a "discarded" state, where all data will
    -     * be thrown away. The discarded state is removed if a pipe destination or
    -     * data handler is added, if pause() is called, or if any synchronous or
    -     * asynchronous iteration is started.
    -     */
    -    resume() {
    -        return this[RESUME]();
    -    }
    -    /**
    -     * Pause the stream
    -     */
    -    pause() {
    -        this[FLOWING] = false;
    -        this[PAUSED] = true;
    -        this[DISCARDED] = false;
    -    }
    -    /**
    -     * true if the stream has been forcibly destroyed
    -     */
    -    get destroyed() {
    -        return this[DESTROYED];
    -    }
    -    /**
    -     * true if the stream is currently in a flowing state, meaning that
    -     * any writes will be immediately emitted.
    -     */
    -    get flowing() {
    -        return this[FLOWING];
    -    }
    -    /**
    -     * true if the stream is currently in a paused state
    -     */
    -    get paused() {
    -        return this[PAUSED];
    -    }
    -    [BUFFERPUSH](chunk) {
    -        if (this[OBJECTMODE])
    -            this[BUFFERLENGTH] += 1;
    -        else
    -            this[BUFFERLENGTH] += chunk.length;
    -        this[BUFFER].push(chunk);
    -    }
    -    [BUFFERSHIFT]() {
    -        if (this[OBJECTMODE])
    -            this[BUFFERLENGTH] -= 1;
    -        else
    -            this[BUFFERLENGTH] -= this[BUFFER][0].length;
    -        return this[BUFFER].shift();
    -    }
    -    [FLUSH](noDrain = false) {
    -        do { } while (this[FLUSHCHUNK](this[BUFFERSHIFT]()) &&
    -            this[BUFFER].length);
    -        if (!noDrain && !this[BUFFER].length && !this[EOF])
    -            this.emit('drain');
    -    }
    -    [FLUSHCHUNK](chunk) {
    -        this.emit('data', chunk);
    -        return this[FLOWING];
    -    }
    -    /**
    -     * Pipe all data emitted by this stream into the destination provided.
    -     *
    -     * Triggers the flow of data.
    -     */
    -    pipe(dest, opts) {
    -        if (this[DESTROYED])
    -            return dest;
    -        this[DISCARDED] = false;
    -        const ended = this[EMITTED_END];
    -        opts = opts || {};
    -        if (dest === proc.stdout || dest === proc.stderr)
    -            opts.end = false;
    -        else
    -            opts.end = opts.end !== false;
    -        opts.proxyErrors = !!opts.proxyErrors;
    -        // piping an ended stream ends immediately
    -        if (ended) {
    -            if (opts.end)
    -                dest.end();
    -        }
    -        else {
    -            // "as" here just ignores the WType, which pipes don't care about,
    -            // since they're only consuming from us, and writing to the dest
    -            this[PIPES].push(!opts.proxyErrors
    -                ? new Pipe(this, dest, opts)
    -                : new PipeProxyErrors(this, dest, opts));
    -            if (this[ASYNC])
    -                defer(() => this[RESUME]());
    -            else
    -                this[RESUME]();
    -        }
    -        return dest;
    -    }
    -    /**
    -     * Fully unhook a piped destination stream.
    -     *
    -     * If the destination stream was the only consumer of this stream (ie,
    -     * there are no other piped destinations or `'data'` event listeners)
    -     * then the flow of data will stop until there is another consumer or
    -     * {@link Minipass#resume} is explicitly called.
    -     */
    -    unpipe(dest) {
    -        const p = this[PIPES].find(p => p.dest === dest);
    -        if (p) {
    -            if (this[PIPES].length === 1) {
    -                if (this[FLOWING] && this[DATALISTENERS] === 0) {
    -                    this[FLOWING] = false;
    -                }
    -                this[PIPES] = [];
    -            }
    -            else
    -                this[PIPES].splice(this[PIPES].indexOf(p), 1);
    -            p.unpipe();
    -        }
    -    }
    -    /**
    -     * Alias for {@link Minipass#on}
    -     */
    -    addListener(ev, handler) {
    -        return this.on(ev, handler);
    -    }
    -    /**
    -     * Mostly identical to `EventEmitter.on`, with the following
    -     * behavior differences to prevent data loss and unnecessary hangs:
    -     *
    -     * - Adding a 'data' event handler will trigger the flow of data
    -     *
    -     * - Adding a 'readable' event handler when there is data waiting to be read
    -     *   will cause 'readable' to be emitted immediately.
    -     *
    -     * - Adding an 'endish' event handler ('end', 'finish', etc.) which has
    -     *   already passed will cause the event to be emitted immediately and all
    -     *   handlers removed.
    -     *
    -     * - Adding an 'error' event handler after an error has been emitted will
    -     *   cause the event to be re-emitted immediately with the error previously
    -     *   raised.
    -     */
    -    on(ev, handler) {
    -        const ret = super.on(ev, handler);
    -        if (ev === 'data') {
    -            this[DISCARDED] = false;
    -            this[DATALISTENERS]++;
    -            if (!this[PIPES].length && !this[FLOWING]) {
    -                this[RESUME]();
    -            }
    -        }
    -        else if (ev === 'readable' && this[BUFFERLENGTH] !== 0) {
    -            super.emit('readable');
    -        }
    -        else if (isEndish(ev) && this[EMITTED_END]) {
    -            super.emit(ev);
    -            this.removeAllListeners(ev);
    -        }
    -        else if (ev === 'error' && this[EMITTED_ERROR]) {
    -            const h = handler;
    -            if (this[ASYNC])
    -                defer(() => h.call(this, this[EMITTED_ERROR]));
    -            else
    -                h.call(this, this[EMITTED_ERROR]);
    -        }
    -        return ret;
    -    }
    -    /**
    -     * Alias for {@link Minipass#off}
    -     */
    -    removeListener(ev, handler) {
    -        return this.off(ev, handler);
    -    }
    -    /**
    -     * Mostly identical to `EventEmitter.off`
    -     *
    -     * If a 'data' event handler is removed, and it was the last consumer
    -     * (ie, there are no pipe destinations or other 'data' event listeners),
    -     * then the flow of data will stop until there is another consumer or
    -     * {@link Minipass#resume} is explicitly called.
    -     */
    -    off(ev, handler) {
    -        const ret = super.off(ev, handler);
    -        // if we previously had listeners, and now we don't, and we don't
    -        // have any pipes, then stop the flow, unless it's been explicitly
    -        // put in a discarded flowing state via stream.resume().
    -        if (ev === 'data') {
    -            this[DATALISTENERS] = this.listeners('data').length;
    -            if (this[DATALISTENERS] === 0 &&
    -                !this[DISCARDED] &&
    -                !this[PIPES].length) {
    -                this[FLOWING] = false;
    -            }
    -        }
    -        return ret;
    -    }
    -    /**
    -     * Mostly identical to `EventEmitter.removeAllListeners`
    -     *
    -     * If all 'data' event handlers are removed, and they were the last consumer
    -     * (ie, there are no pipe destinations), then the flow of data will stop
    -     * until there is another consumer or {@link Minipass#resume} is explicitly
    -     * called.
    -     */
    -    removeAllListeners(ev) {
    -        const ret = super.removeAllListeners(ev);
    -        if (ev === 'data' || ev === undefined) {
    -            this[DATALISTENERS] = 0;
    -            if (!this[DISCARDED] && !this[PIPES].length) {
    -                this[FLOWING] = false;
    -            }
    -        }
    -        return ret;
    -    }
    -    /**
    -     * true if the 'end' event has been emitted
    -     */
    -    get emittedEnd() {
    -        return this[EMITTED_END];
    -    }
    -    [MAYBE_EMIT_END]() {
    -        if (!this[EMITTING_END] &&
    -            !this[EMITTED_END] &&
    -            !this[DESTROYED] &&
    -            this[BUFFER].length === 0 &&
    -            this[EOF]) {
    -            this[EMITTING_END] = true;
    -            this.emit('end');
    -            this.emit('prefinish');
    -            this.emit('finish');
    -            if (this[CLOSED])
    -                this.emit('close');
    -            this[EMITTING_END] = false;
    -        }
    -    }
    -    /**
    -     * Mostly identical to `EventEmitter.emit`, with the following
    -     * behavior differences to prevent data loss and unnecessary hangs:
    -     *
    -     * If the stream has been destroyed, and the event is something other
    -     * than 'close' or 'error', then `false` is returned and no handlers
    -     * are called.
    -     *
    -     * If the event is 'end', and has already been emitted, then the event
    -     * is ignored. If the stream is in a paused or non-flowing state, then
    -     * the event will be deferred until data flow resumes. If the stream is
    -     * async, then handlers will be called on the next tick rather than
    -     * immediately.
    -     *
    -     * If the event is 'close', and 'end' has not yet been emitted, then
    -     * the event will be deferred until after 'end' is emitted.
    -     *
    -     * If the event is 'error', and an AbortSignal was provided for the stream,
    -     * and there are no listeners, then the event is ignored, matching the
    -     * behavior of node core streams in the presense of an AbortSignal.
    -     *
    -     * If the event is 'finish' or 'prefinish', then all listeners will be
    -     * removed after emitting the event, to prevent double-firing.
    -     */
    -    emit(ev, ...args) {
    -        const data = args[0];
    -        // error and close are only events allowed after calling destroy()
    -        if (ev !== 'error' &&
    -            ev !== 'close' &&
    -            ev !== DESTROYED &&
    -            this[DESTROYED]) {
    -            return false;
    -        }
    -        else if (ev === 'data') {
    -            return !this[OBJECTMODE] && !data
    -                ? false
    -                : this[ASYNC]
    -                    ? (defer(() => this[EMITDATA](data)), true)
    -                    : this[EMITDATA](data);
    -        }
    -        else if (ev === 'end') {
    -            return this[EMITEND]();
    -        }
    -        else if (ev === 'close') {
    -            this[CLOSED] = true;
    -            // don't emit close before 'end' and 'finish'
    -            if (!this[EMITTED_END] && !this[DESTROYED])
    -                return false;
    -            const ret = super.emit('close');
    -            this.removeAllListeners('close');
    -            return ret;
    -        }
    -        else if (ev === 'error') {
    -            this[EMITTED_ERROR] = data;
    -            super.emit(ERROR, data);
    -            const ret = !this[SIGNAL] || this.listeners('error').length
    -                ? super.emit('error', data)
    -                : false;
    -            this[MAYBE_EMIT_END]();
    -            return ret;
    -        }
    -        else if (ev === 'resume') {
    -            const ret = super.emit('resume');
    -            this[MAYBE_EMIT_END]();
    -            return ret;
    -        }
    -        else if (ev === 'finish' || ev === 'prefinish') {
    -            const ret = super.emit(ev);
    -            this.removeAllListeners(ev);
    -            return ret;
    -        }
    -        // Some other unknown event
    -        const ret = super.emit(ev, ...args);
    -        this[MAYBE_EMIT_END]();
    -        return ret;
    -    }
    -    [EMITDATA](data) {
    -        for (const p of this[PIPES]) {
    -            if (p.dest.write(data) === false)
    -                this.pause();
    -        }
    -        const ret = this[DISCARDED] ? false : super.emit('data', data);
    -        this[MAYBE_EMIT_END]();
    -        return ret;
    -    }
    -    [EMITEND]() {
    -        if (this[EMITTED_END])
    -            return false;
    -        this[EMITTED_END] = true;
    -        this.readable = false;
    -        return this[ASYNC]
    -            ? (defer(() => this[EMITEND2]()), true)
    -            : this[EMITEND2]();
    -    }
    -    [EMITEND2]() {
    -        if (this[DECODER]) {
    -            const data = this[DECODER].end();
    -            if (data) {
    -                for (const p of this[PIPES]) {
    -                    p.dest.write(data);
    -                }
    -                if (!this[DISCARDED])
    -                    super.emit('data', data);
    -            }
    -        }
    -        for (const p of this[PIPES]) {
    -            p.end();
    -        }
    -        const ret = super.emit('end');
    -        this.removeAllListeners('end');
    -        return ret;
    -    }
    -    /**
    -     * Return a Promise that resolves to an array of all emitted data once
    -     * the stream ends.
    -     */
    -    async collect() {
    -        const buf = Object.assign([], {
    -            dataLength: 0,
    -        });
    -        if (!this[OBJECTMODE])
    -            buf.dataLength = 0;
    -        // set the promise first, in case an error is raised
    -        // by triggering the flow here.
    -        const p = this.promise();
    -        this.on('data', c => {
    -            buf.push(c);
    -            if (!this[OBJECTMODE])
    -                buf.dataLength += c.length;
    -        });
    -        await p;
    -        return buf;
    -    }
    -    /**
    -     * Return a Promise that resolves to the concatenation of all emitted data
    -     * once the stream ends.
    -     *
    -     * Not allowed on objectMode streams.
    -     */
    -    async concat() {
    -        if (this[OBJECTMODE]) {
    -            throw new Error('cannot concat in objectMode');
    -        }
    -        const buf = await this.collect();
    -        return (this[ENCODING]
    -            ? buf.join('')
    -            : Buffer.concat(buf, buf.dataLength));
    -    }
    -    /**
    -     * Return a void Promise that resolves once the stream ends.
    -     */
    -    async promise() {
    -        return new Promise((resolve, reject) => {
    -            this.on(DESTROYED, () => reject(new Error('stream destroyed')));
    -            this.on('error', er => reject(er));
    -            this.on('end', () => resolve());
    -        });
    -    }
    -    /**
    -     * Asynchronous `for await of` iteration.
    -     *
    -     * This will continue emitting all chunks until the stream terminates.
    -     */
    -    [Symbol.asyncIterator]() {
    -        // set this up front, in case the consumer doesn't call next()
    -        // right away.
    -        this[DISCARDED] = false;
    -        let stopped = false;
    -        const stop = async () => {
    -            this.pause();
    -            stopped = true;
    -            return { value: undefined, done: true };
    -        };
    -        const next = () => {
    -            if (stopped)
    -                return stop();
    -            const res = this.read();
    -            if (res !== null)
    -                return Promise.resolve({ done: false, value: res });
    -            if (this[EOF])
    -                return stop();
    -            let resolve;
    -            let reject;
    -            const onerr = (er) => {
    -                this.off('data', ondata);
    -                this.off('end', onend);
    -                this.off(DESTROYED, ondestroy);
    -                stop();
    -                reject(er);
    -            };
    -            const ondata = (value) => {
    -                this.off('error', onerr);
    -                this.off('end', onend);
    -                this.off(DESTROYED, ondestroy);
    -                this.pause();
    -                resolve({ value, done: !!this[EOF] });
    -            };
    -            const onend = () => {
    -                this.off('error', onerr);
    -                this.off('data', ondata);
    -                this.off(DESTROYED, ondestroy);
    -                stop();
    -                resolve({ done: true, value: undefined });
    -            };
    -            const ondestroy = () => onerr(new Error('stream destroyed'));
    -            return new Promise((res, rej) => {
    -                reject = rej;
    -                resolve = res;
    -                this.once(DESTROYED, ondestroy);
    -                this.once('error', onerr);
    -                this.once('end', onend);
    -                this.once('data', ondata);
    -            });
    -        };
    -        return {
    -            next,
    -            throw: stop,
    -            return: stop,
    -            [Symbol.asyncIterator]() {
    -                return this;
    -            },
    -        };
    -    }
    -    /**
    -     * Synchronous `for of` iteration.
    -     *
    -     * The iteration will terminate when the internal buffer runs out, even
    -     * if the stream has not yet terminated.
    -     */
    -    [Symbol.iterator]() {
    -        // set this up front, in case the consumer doesn't call next()
    -        // right away.
    -        this[DISCARDED] = false;
    -        let stopped = false;
    -        const stop = () => {
    -            this.pause();
    -            this.off(ERROR, stop);
    -            this.off(DESTROYED, stop);
    -            this.off('end', stop);
    -            stopped = true;
    -            return { done: true, value: undefined };
    -        };
    -        const next = () => {
    -            if (stopped)
    -                return stop();
    -            const value = this.read();
    -            return value === null ? stop() : { done: false, value };
    -        };
    -        this.once('end', stop);
    -        this.once(ERROR, stop);
    -        this.once(DESTROYED, stop);
    -        return {
    -            next,
    -            throw: stop,
    -            return: stop,
    -            [Symbol.iterator]() {
    -                return this;
    -            },
    -        };
    -    }
    -    /**
    -     * Destroy a stream, preventing it from being used for any further purpose.
    -     *
    -     * If the stream has a `close()` method, then it will be called on
    -     * destruction.
    -     *
    -     * After destruction, any attempt to write data, read data, or emit most
    -     * events will be ignored.
    -     *
    -     * If an error argument is provided, then it will be emitted in an
    -     * 'error' event.
    -     */
    -    destroy(er) {
    -        if (this[DESTROYED]) {
    -            if (er)
    -                this.emit('error', er);
    -            else
    -                this.emit(DESTROYED);
    -            return this;
    -        }
    -        this[DESTROYED] = true;
    -        this[DISCARDED] = true;
    -        // throw away all buffered data, it's never coming out
    -        this[BUFFER].length = 0;
    -        this[BUFFERLENGTH] = 0;
    -        const wc = this;
    -        if (typeof wc.close === 'function' && !this[CLOSED])
    -            wc.close();
    -        if (er)
    -            this.emit('error', er);
    -        // if no error to emit, still reject pending promises
    -        else
    -            this.emit(DESTROYED);
    -        return this;
    -    }
    -    /**
    -     * Alias for {@link isStream}
    -     *
    -     * Former export location, maintained for backwards compatibility.
    -     *
    -     * @deprecated
    -     */
    -    static get isStream() {
    -        return isStream;
    -    }
    -}
    -//# sourceMappingURL=index.js.map
    \ No newline at end of file
    diff --git a/node_modules/minipass/dist/esm/index.js.map b/node_modules/minipass/dist/esm/index.js.map
    deleted file mode 100644
    index 741425a..0000000
    --- a/node_modules/minipass/dist/esm/index.js.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["const proc =\n  typeof process === 'object' && process\n    ? process\n    : {\n        stdout: null,\n        stderr: null,\n      }\nimport { EventEmitter } from 'node:events'\nimport Stream from 'node:stream'\nimport { StringDecoder } from 'node:string_decoder'\n\n/**\n * Same as StringDecoder, but exposing the `lastNeed` flag on the type\n */\ntype SD = StringDecoder & { lastNeed: boolean }\n\nexport type { SD, Pipe, PipeProxyErrors }\n\n/**\n * Return true if the argument is a Minipass stream, Node stream, or something\n * else that Minipass can interact with.\n */\nexport const isStream = (\n  s: any\n): s is Minipass.Readable | Minipass.Writable =>\n  !!s &&\n  typeof s === 'object' &&\n  (s instanceof Minipass ||\n    s instanceof Stream ||\n    isReadable(s) ||\n    isWritable(s))\n\n/**\n * Return true if the argument is a valid {@link Minipass.Readable}\n */\nexport const isReadable = (s: any): s is Minipass.Readable =>\n  !!s &&\n  typeof s === 'object' &&\n  s instanceof EventEmitter &&\n  typeof (s as Minipass.Readable).pipe === 'function' &&\n  // node core Writable streams have a pipe() method, but it throws\n  (s as Minipass.Readable).pipe !== Stream.Writable.prototype.pipe\n\n/**\n * Return true if the argument is a valid {@link Minipass.Writable}\n */\nexport const isWritable = (s: any): s is Minipass.Readable =>\n  !!s &&\n  typeof s === 'object' &&\n  s instanceof EventEmitter &&\n  typeof (s as Minipass.Writable).write === 'function' &&\n  typeof (s as Minipass.Writable).end === 'function'\n\nconst EOF = Symbol('EOF')\nconst MAYBE_EMIT_END = Symbol('maybeEmitEnd')\nconst EMITTED_END = Symbol('emittedEnd')\nconst EMITTING_END = Symbol('emittingEnd')\nconst EMITTED_ERROR = Symbol('emittedError')\nconst CLOSED = Symbol('closed')\nconst READ = Symbol('read')\nconst FLUSH = Symbol('flush')\nconst FLUSHCHUNK = Symbol('flushChunk')\nconst ENCODING = Symbol('encoding')\nconst DECODER = Symbol('decoder')\nconst FLOWING = Symbol('flowing')\nconst PAUSED = Symbol('paused')\nconst RESUME = Symbol('resume')\nconst BUFFER = Symbol('buffer')\nconst PIPES = Symbol('pipes')\nconst BUFFERLENGTH = Symbol('bufferLength')\nconst BUFFERPUSH = Symbol('bufferPush')\nconst BUFFERSHIFT = Symbol('bufferShift')\nconst OBJECTMODE = Symbol('objectMode')\n// internal event when stream is destroyed\nconst DESTROYED = Symbol('destroyed')\n// internal event when stream has an error\nconst ERROR = Symbol('error')\nconst EMITDATA = Symbol('emitData')\nconst EMITEND = Symbol('emitEnd')\nconst EMITEND2 = Symbol('emitEnd2')\nconst ASYNC = Symbol('async')\nconst ABORT = Symbol('abort')\nconst ABORTED = Symbol('aborted')\nconst SIGNAL = Symbol('signal')\nconst DATALISTENERS = Symbol('dataListeners')\nconst DISCARDED = Symbol('discarded')\n\nconst defer = (fn: (...a: any[]) => any) => Promise.resolve().then(fn)\nconst nodefer = (fn: (...a: any[]) => any) => fn()\n\n// events that mean 'the stream is over'\n// these are treated specially, and re-emitted\n// if they are listened for after emitting.\ntype EndishEvent = 'end' | 'finish' | 'prefinish'\nconst isEndish = (ev: any): ev is EndishEvent =>\n  ev === 'end' || ev === 'finish' || ev === 'prefinish'\n\nconst isArrayBufferLike = (b: any): b is ArrayBufferLike =>\n  b instanceof ArrayBuffer ||\n  (!!b &&\n    typeof b === 'object' &&\n    b.constructor &&\n    b.constructor.name === 'ArrayBuffer' &&\n    b.byteLength >= 0)\n\nconst isArrayBufferView = (b: any): b is ArrayBufferView =>\n  !Buffer.isBuffer(b) && ArrayBuffer.isView(b)\n\n/**\n * Options that may be passed to stream.pipe()\n */\nexport interface PipeOptions {\n  /**\n   * end the destination stream when the source stream ends\n   */\n  end?: boolean\n  /**\n   * proxy errors from the source stream to the destination stream\n   */\n  proxyErrors?: boolean\n}\n\n/**\n * Internal class representing a pipe to a destination stream.\n *\n * @internal\n */\nclass Pipe {\n  src: Minipass\n  dest: Minipass\n  opts: PipeOptions\n  ondrain: () => any\n  constructor(\n    src: Minipass,\n    dest: Minipass.Writable,\n    opts: PipeOptions\n  ) {\n    this.src = src\n    this.dest = dest as Minipass\n    this.opts = opts\n    this.ondrain = () => src[RESUME]()\n    this.dest.on('drain', this.ondrain)\n  }\n  unpipe() {\n    this.dest.removeListener('drain', this.ondrain)\n  }\n  // only here for the prototype\n  /* c8 ignore start */\n  proxyErrors(_er: any) {}\n  /* c8 ignore stop */\n  end() {\n    this.unpipe()\n    if (this.opts.end) this.dest.end()\n  }\n}\n\n/**\n * Internal class representing a pipe to a destination stream where\n * errors are proxied.\n *\n * @internal\n */\nclass PipeProxyErrors extends Pipe {\n  unpipe() {\n    this.src.removeListener('error', this.proxyErrors)\n    super.unpipe()\n  }\n  constructor(\n    src: Minipass,\n    dest: Minipass.Writable,\n    opts: PipeOptions\n  ) {\n    super(src, dest, opts)\n    this.proxyErrors = er => dest.emit('error', er)\n    src.on('error', this.proxyErrors)\n  }\n}\n\nexport namespace Minipass {\n  /**\n   * Encoding used to create a stream that outputs strings rather than\n   * Buffer objects.\n   */\n  export type Encoding = BufferEncoding | 'buffer' | null\n\n  /**\n   * Any stream that Minipass can pipe into\n   */\n  export type Writable =\n    | Minipass\n    | NodeJS.WriteStream\n    | (NodeJS.WriteStream & { fd: number })\n    | (EventEmitter & {\n        end(): any\n        write(chunk: any, ...args: any[]): any\n      })\n\n  /**\n   * Any stream that can be read from\n   */\n  export type Readable =\n    | Minipass\n    | NodeJS.ReadStream\n    | (NodeJS.ReadStream & { fd: number })\n    | (EventEmitter & {\n        pause(): any\n        resume(): any\n        pipe(...destArgs: any[]): any\n      })\n\n  /**\n   * Utility type that can be iterated sync or async\n   */\n  export type DualIterable = Iterable & AsyncIterable\n\n  type EventArguments = Record\n\n  /**\n   * The listing of events that a Minipass class can emit.\n   * Extend this when extending the Minipass class, and pass as\n   * the third template argument.  The key is the name of the event,\n   * and the value is the argument list.\n   *\n   * Any undeclared events will still be allowed, but the handler will get\n   * arguments as `unknown[]`.\n   */\n  export interface Events\n    extends EventArguments {\n    readable: []\n    data: [chunk: RType]\n    error: [er: unknown]\n    abort: [reason: unknown]\n    drain: []\n    resume: []\n    end: []\n    finish: []\n    prefinish: []\n    close: []\n    [DESTROYED]: [er?: unknown]\n    [ERROR]: [er: unknown]\n  }\n\n  /**\n   * String or buffer-like data that can be joined and sliced\n   */\n  export type ContiguousData =\n    | Buffer\n    | ArrayBufferLike\n    | ArrayBufferView\n    | string\n  export type BufferOrString = Buffer | string\n\n  /**\n   * Options passed to the Minipass constructor.\n   */\n  export type SharedOptions = {\n    /**\n     * Defer all data emission and other events until the end of the\n     * current tick, similar to Node core streams\n     */\n    async?: boolean\n    /**\n     * A signal which will abort the stream\n     */\n    signal?: AbortSignal\n    /**\n     * Output string encoding. Set to `null` or `'buffer'` (or omit) to\n     * emit Buffer objects rather than strings.\n     *\n     * Conflicts with `objectMode`\n     */\n    encoding?: BufferEncoding | null | 'buffer'\n    /**\n     * Output data exactly as it was written, supporting non-buffer/string\n     * data (such as arbitrary objects, falsey values, etc.)\n     *\n     * Conflicts with `encoding`\n     */\n    objectMode?: boolean\n  }\n\n  /**\n   * Options for a string encoded output\n   */\n  export type EncodingOptions = SharedOptions & {\n    encoding: BufferEncoding\n    objectMode?: false\n  }\n\n  /**\n   * Options for contiguous data buffer output\n   */\n  export type BufferOptions = SharedOptions & {\n    encoding?: null | 'buffer'\n    objectMode?: false\n  }\n\n  /**\n   * Options for objectMode arbitrary output\n   */\n  export type ObjectModeOptions = SharedOptions & {\n    objectMode: true\n    encoding?: null\n  }\n\n  /**\n   * Utility type to determine allowed options based on read type\n   */\n  export type Options =\n    | ObjectModeOptions\n    | (T extends string\n        ? EncodingOptions\n        : T extends Buffer\n        ? BufferOptions\n        : SharedOptions)\n}\n\nconst isObjectModeOptions = (\n  o: Minipass.SharedOptions\n): o is Minipass.ObjectModeOptions => !!o.objectMode\n\nconst isEncodingOptions = (\n  o: Minipass.SharedOptions\n): o is Minipass.EncodingOptions =>\n  !o.objectMode && !!o.encoding && o.encoding !== 'buffer'\n\n/**\n * Main export, the Minipass class\n *\n * `RType` is the type of data emitted, defaults to Buffer\n *\n * `WType` is the type of data to be written, if RType is buffer or string,\n * then any {@link Minipass.ContiguousData} is allowed.\n *\n * `Events` is the set of event handler signatures that this object\n * will emit, see {@link Minipass.Events}\n */\nexport class Minipass<\n    RType extends unknown = Buffer,\n    WType extends unknown = RType extends Minipass.BufferOrString\n      ? Minipass.ContiguousData\n      : RType,\n    Events extends Minipass.Events = Minipass.Events\n  >\n  extends EventEmitter\n  implements Minipass.DualIterable\n{\n  [FLOWING]: boolean = false;\n  [PAUSED]: boolean = false;\n  [PIPES]: Pipe[] = [];\n  [BUFFER]: RType[] = [];\n  [OBJECTMODE]: boolean;\n  [ENCODING]: BufferEncoding | null;\n  [ASYNC]: boolean;\n  [DECODER]: SD | null;\n  [EOF]: boolean = false;\n  [EMITTED_END]: boolean = false;\n  [EMITTING_END]: boolean = false;\n  [CLOSED]: boolean = false;\n  [EMITTED_ERROR]: unknown = null;\n  [BUFFERLENGTH]: number = 0;\n  [DESTROYED]: boolean = false;\n  [SIGNAL]?: AbortSignal;\n  [ABORTED]: boolean = false;\n  [DATALISTENERS]: number = 0;\n  [DISCARDED]: boolean = false\n\n  /**\n   * true if the stream can be written\n   */\n  writable: boolean = true\n  /**\n   * true if the stream can be read\n   */\n  readable: boolean = true\n\n  /**\n   * If `RType` is Buffer, then options do not need to be provided.\n   * Otherwise, an options object must be provided to specify either\n   * {@link Minipass.SharedOptions.objectMode} or\n   * {@link Minipass.SharedOptions.encoding}, as appropriate.\n   */\n  constructor(\n    ...args:\n      | [Minipass.ObjectModeOptions]\n      | (RType extends Buffer\n          ? [] | [Minipass.Options]\n          : [Minipass.Options])\n  ) {\n    const options: Minipass.Options = (args[0] ||\n      {}) as Minipass.Options\n    super()\n    if (options.objectMode && typeof options.encoding === 'string') {\n      throw new TypeError(\n        'Encoding and objectMode may not be used together'\n      )\n    }\n    if (isObjectModeOptions(options)) {\n      this[OBJECTMODE] = true\n      this[ENCODING] = null\n    } else if (isEncodingOptions(options)) {\n      this[ENCODING] = options.encoding\n      this[OBJECTMODE] = false\n    } else {\n      this[OBJECTMODE] = false\n      this[ENCODING] = null\n    }\n    this[ASYNC] = !!options.async\n    this[DECODER] = this[ENCODING]\n      ? (new StringDecoder(this[ENCODING]) as SD)\n      : null\n\n    //@ts-ignore - private option for debugging and testing\n    if (options && options.debugExposeBuffer === true) {\n      Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] })\n    }\n    //@ts-ignore - private option for debugging and testing\n    if (options && options.debugExposePipes === true) {\n      Object.defineProperty(this, 'pipes', { get: () => this[PIPES] })\n    }\n\n    const { signal } = options\n    if (signal) {\n      this[SIGNAL] = signal\n      if (signal.aborted) {\n        this[ABORT]()\n      } else {\n        signal.addEventListener('abort', () => this[ABORT]())\n      }\n    }\n  }\n\n  /**\n   * The amount of data stored in the buffer waiting to be read.\n   *\n   * For Buffer strings, this will be the total byte length.\n   * For string encoding streams, this will be the string character length,\n   * according to JavaScript's `string.length` logic.\n   * For objectMode streams, this is a count of the items waiting to be\n   * emitted.\n   */\n  get bufferLength() {\n    return this[BUFFERLENGTH]\n  }\n\n  /**\n   * The `BufferEncoding` currently in use, or `null`\n   */\n  get encoding() {\n    return this[ENCODING]\n  }\n\n  /**\n   * @deprecated - This is a read only property\n   */\n  set encoding(_enc) {\n    throw new Error('Encoding must be set at instantiation time')\n  }\n\n  /**\n   * @deprecated - Encoding may only be set at instantiation time\n   */\n  setEncoding(_enc: Minipass.Encoding) {\n    throw new Error('Encoding must be set at instantiation time')\n  }\n\n  /**\n   * True if this is an objectMode stream\n   */\n  get objectMode() {\n    return this[OBJECTMODE]\n  }\n\n  /**\n   * @deprecated - This is a read-only property\n   */\n  set objectMode(_om) {\n    throw new Error('objectMode must be set at instantiation time')\n  }\n\n  /**\n   * true if this is an async stream\n   */\n  get ['async'](): boolean {\n    return this[ASYNC]\n  }\n  /**\n   * Set to true to make this stream async.\n   *\n   * Once set, it cannot be unset, as this would potentially cause incorrect\n   * behavior.  Ie, a sync stream can be made async, but an async stream\n   * cannot be safely made sync.\n   */\n  set ['async'](a: boolean) {\n    this[ASYNC] = this[ASYNC] || !!a\n  }\n\n  // drop everything and get out of the flow completely\n  [ABORT]() {\n    this[ABORTED] = true\n    this.emit('abort', this[SIGNAL]?.reason)\n    this.destroy(this[SIGNAL]?.reason)\n  }\n\n  /**\n   * True if the stream has been aborted.\n   */\n  get aborted() {\n    return this[ABORTED]\n  }\n  /**\n   * No-op setter. Stream aborted status is set via the AbortSignal provided\n   * in the constructor options.\n   */\n  set aborted(_) {}\n\n  /**\n   * Write data into the stream\n   *\n   * If the chunk written is a string, and encoding is not specified, then\n   * `utf8` will be assumed. If the stream encoding matches the encoding of\n   * a written string, and the state of the string decoder allows it, then\n   * the string will be passed through to either the output or the internal\n   * buffer without any processing. Otherwise, it will be turned into a\n   * Buffer object for processing into the desired encoding.\n   *\n   * If provided, `cb` function is called immediately before return for\n   * sync streams, or on next tick for async streams, because for this\n   * base class, a chunk is considered \"processed\" once it is accepted\n   * and either emitted or buffered. That is, the callback does not indicate\n   * that the chunk has been eventually emitted, though of course child\n   * classes can override this function to do whatever processing is required\n   * and call `super.write(...)` only once processing is completed.\n   */\n  write(chunk: WType, cb?: () => void): boolean\n  write(\n    chunk: WType,\n    encoding?: Minipass.Encoding,\n    cb?: () => void\n  ): boolean\n  write(\n    chunk: WType,\n    encoding?: Minipass.Encoding | (() => void),\n    cb?: () => void\n  ): boolean {\n    if (this[ABORTED]) return false\n    if (this[EOF]) throw new Error('write after end')\n\n    if (this[DESTROYED]) {\n      this.emit(\n        'error',\n        Object.assign(\n          new Error('Cannot call write after a stream was destroyed'),\n          { code: 'ERR_STREAM_DESTROYED' }\n        )\n      )\n      return true\n    }\n\n    if (typeof encoding === 'function') {\n      cb = encoding\n      encoding = 'utf8'\n    }\n\n    if (!encoding) encoding = 'utf8'\n\n    const fn = this[ASYNC] ? defer : nodefer\n\n    // convert array buffers and typed array views into buffers\n    // at some point in the future, we may want to do the opposite!\n    // leave strings and buffers as-is\n    // anything is only allowed if in object mode, so throw\n    if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) {\n      if (isArrayBufferView(chunk)) {\n        //@ts-ignore - sinful unsafe type changing\n        chunk = Buffer.from(\n          chunk.buffer,\n          chunk.byteOffset,\n          chunk.byteLength\n        )\n      } else if (isArrayBufferLike(chunk)) {\n        //@ts-ignore - sinful unsafe type changing\n        chunk = Buffer.from(chunk)\n      } else if (typeof chunk !== 'string') {\n        throw new Error(\n          'Non-contiguous data written to non-objectMode stream'\n        )\n      }\n    }\n\n    // handle object mode up front, since it's simpler\n    // this yields better performance, fewer checks later.\n    if (this[OBJECTMODE]) {\n      // maybe impossible?\n      /* c8 ignore start */\n      if (this[FLOWING] && this[BUFFERLENGTH] !== 0) this[FLUSH](true)\n      /* c8 ignore stop */\n\n      if (this[FLOWING]) this.emit('data', chunk as unknown as RType)\n      else this[BUFFERPUSH](chunk as unknown as RType)\n\n      if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n\n      if (cb) fn(cb)\n\n      return this[FLOWING]\n    }\n\n    // at this point the chunk is a buffer or string\n    // don't buffer it up or send it to the decoder\n    if (!(chunk as Minipass.BufferOrString).length) {\n      if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n      if (cb) fn(cb)\n      return this[FLOWING]\n    }\n\n    // fast-path writing strings of same encoding to a stream with\n    // an empty buffer, skipping the buffer/decoder dance\n    if (\n      typeof chunk === 'string' &&\n      // unless it is a string already ready for us to use\n      !(encoding === this[ENCODING] && !this[DECODER]?.lastNeed)\n    ) {\n      //@ts-ignore - sinful unsafe type change\n      chunk = Buffer.from(chunk, encoding)\n    }\n\n    if (Buffer.isBuffer(chunk) && this[ENCODING]) {\n      //@ts-ignore - sinful unsafe type change\n      chunk = this[DECODER].write(chunk)\n    }\n\n    // Note: flushing CAN potentially switch us into not-flowing mode\n    if (this[FLOWING] && this[BUFFERLENGTH] !== 0) this[FLUSH](true)\n\n    if (this[FLOWING]) this.emit('data', chunk as unknown as RType)\n    else this[BUFFERPUSH](chunk as unknown as RType)\n\n    if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n\n    if (cb) fn(cb)\n\n    return this[FLOWING]\n  }\n\n  /**\n   * Low-level explicit read method.\n   *\n   * In objectMode, the argument is ignored, and one item is returned if\n   * available.\n   *\n   * `n` is the number of bytes (or in the case of encoding streams,\n   * characters) to consume. If `n` is not provided, then the entire buffer\n   * is returned, or `null` is returned if no data is available.\n   *\n   * If `n` is greater that the amount of data in the internal buffer,\n   * then `null` is returned.\n   */\n  read(n?: number | null): RType | null {\n    if (this[DESTROYED]) return null\n    this[DISCARDED] = false\n\n    if (\n      this[BUFFERLENGTH] === 0 ||\n      n === 0 ||\n      (n && n > this[BUFFERLENGTH])\n    ) {\n      this[MAYBE_EMIT_END]()\n      return null\n    }\n\n    if (this[OBJECTMODE]) n = null\n\n    if (this[BUFFER].length > 1 && !this[OBJECTMODE]) {\n      // not object mode, so if we have an encoding, then RType is string\n      // otherwise, must be Buffer\n      this[BUFFER] = [\n        (this[ENCODING]\n          ? this[BUFFER].join('')\n          : Buffer.concat(\n              this[BUFFER] as Buffer[],\n              this[BUFFERLENGTH]\n            )) as RType,\n      ]\n    }\n\n    const ret = this[READ](n || null, this[BUFFER][0] as RType)\n    this[MAYBE_EMIT_END]()\n    return ret\n  }\n\n  [READ](n: number | null, chunk: RType) {\n    if (this[OBJECTMODE]) this[BUFFERSHIFT]()\n    else {\n      const c = chunk as Minipass.BufferOrString\n      if (n === c.length || n === null) this[BUFFERSHIFT]()\n      else if (typeof c === 'string') {\n        this[BUFFER][0] = c.slice(n) as RType\n        chunk = c.slice(0, n) as RType\n        this[BUFFERLENGTH] -= n\n      } else {\n        this[BUFFER][0] = c.subarray(n) as RType\n        chunk = c.subarray(0, n) as RType\n        this[BUFFERLENGTH] -= n\n      }\n    }\n\n    this.emit('data', chunk)\n\n    if (!this[BUFFER].length && !this[EOF]) this.emit('drain')\n\n    return chunk\n  }\n\n  /**\n   * End the stream, optionally providing a final write.\n   *\n   * See {@link Minipass#write} for argument descriptions\n   */\n  end(cb?: () => void): this\n  end(chunk: WType, cb?: () => void): this\n  end(chunk: WType, encoding?: Minipass.Encoding, cb?: () => void): this\n  end(\n    chunk?: WType | (() => void),\n    encoding?: Minipass.Encoding | (() => void),\n    cb?: () => void\n  ): this {\n    if (typeof chunk === 'function') {\n      cb = chunk as () => void\n      chunk = undefined\n    }\n    if (typeof encoding === 'function') {\n      cb = encoding\n      encoding = 'utf8'\n    }\n    if (chunk !== undefined) this.write(chunk, encoding)\n    if (cb) this.once('end', cb)\n    this[EOF] = true\n    this.writable = false\n\n    // if we haven't written anything, then go ahead and emit,\n    // even if we're not reading.\n    // we'll re-emit if a new 'end' listener is added anyway.\n    // This makes MP more suitable to write-only use cases.\n    if (this[FLOWING] || !this[PAUSED]) this[MAYBE_EMIT_END]()\n    return this\n  }\n\n  // don't let the internal resume be overwritten\n  [RESUME]() {\n    if (this[DESTROYED]) return\n\n    if (!this[DATALISTENERS] && !this[PIPES].length) {\n      this[DISCARDED] = true\n    }\n    this[PAUSED] = false\n    this[FLOWING] = true\n    this.emit('resume')\n    if (this[BUFFER].length) this[FLUSH]()\n    else if (this[EOF]) this[MAYBE_EMIT_END]()\n    else this.emit('drain')\n  }\n\n  /**\n   * Resume the stream if it is currently in a paused state\n   *\n   * If called when there are no pipe destinations or `data` event listeners,\n   * this will place the stream in a \"discarded\" state, where all data will\n   * be thrown away. The discarded state is removed if a pipe destination or\n   * data handler is added, if pause() is called, or if any synchronous or\n   * asynchronous iteration is started.\n   */\n  resume() {\n    return this[RESUME]()\n  }\n\n  /**\n   * Pause the stream\n   */\n  pause() {\n    this[FLOWING] = false\n    this[PAUSED] = true\n    this[DISCARDED] = false\n  }\n\n  /**\n   * true if the stream has been forcibly destroyed\n   */\n  get destroyed() {\n    return this[DESTROYED]\n  }\n\n  /**\n   * true if the stream is currently in a flowing state, meaning that\n   * any writes will be immediately emitted.\n   */\n  get flowing() {\n    return this[FLOWING]\n  }\n\n  /**\n   * true if the stream is currently in a paused state\n   */\n  get paused() {\n    return this[PAUSED]\n  }\n\n  [BUFFERPUSH](chunk: RType) {\n    if (this[OBJECTMODE]) this[BUFFERLENGTH] += 1\n    else this[BUFFERLENGTH] += (chunk as Minipass.BufferOrString).length\n    this[BUFFER].push(chunk)\n  }\n\n  [BUFFERSHIFT](): RType {\n    if (this[OBJECTMODE]) this[BUFFERLENGTH] -= 1\n    else\n      this[BUFFERLENGTH] -= (\n        this[BUFFER][0] as Minipass.BufferOrString\n      ).length\n    return this[BUFFER].shift() as RType\n  }\n\n  [FLUSH](noDrain: boolean = false) {\n    do {} while (\n      this[FLUSHCHUNK](this[BUFFERSHIFT]()) &&\n      this[BUFFER].length\n    )\n\n    if (!noDrain && !this[BUFFER].length && !this[EOF]) this.emit('drain')\n  }\n\n  [FLUSHCHUNK](chunk: RType) {\n    this.emit('data', chunk)\n    return this[FLOWING]\n  }\n\n  /**\n   * Pipe all data emitted by this stream into the destination provided.\n   *\n   * Triggers the flow of data.\n   */\n  pipe(dest: W, opts?: PipeOptions): W {\n    if (this[DESTROYED]) return dest\n    this[DISCARDED] = false\n\n    const ended = this[EMITTED_END]\n    opts = opts || {}\n    if (dest === proc.stdout || dest === proc.stderr) opts.end = false\n    else opts.end = opts.end !== false\n    opts.proxyErrors = !!opts.proxyErrors\n\n    // piping an ended stream ends immediately\n    if (ended) {\n      if (opts.end) dest.end()\n    } else {\n      // \"as\" here just ignores the WType, which pipes don't care about,\n      // since they're only consuming from us, and writing to the dest\n      this[PIPES].push(\n        !opts.proxyErrors\n          ? new Pipe(this as Minipass, dest, opts)\n          : new PipeProxyErrors(this as Minipass, dest, opts)\n      )\n      if (this[ASYNC]) defer(() => this[RESUME]())\n      else this[RESUME]()\n    }\n\n    return dest\n  }\n\n  /**\n   * Fully unhook a piped destination stream.\n   *\n   * If the destination stream was the only consumer of this stream (ie,\n   * there are no other piped destinations or `'data'` event listeners)\n   * then the flow of data will stop until there is another consumer or\n   * {@link Minipass#resume} is explicitly called.\n   */\n  unpipe(dest: W) {\n    const p = this[PIPES].find(p => p.dest === dest)\n    if (p) {\n      if (this[PIPES].length === 1) {\n        if (this[FLOWING] && this[DATALISTENERS] === 0) {\n          this[FLOWING] = false\n        }\n        this[PIPES] = []\n      } else this[PIPES].splice(this[PIPES].indexOf(p), 1)\n      p.unpipe()\n    }\n  }\n\n  /**\n   * Alias for {@link Minipass#on}\n   */\n  addListener(\n    ev: Event,\n    handler: (...args: Events[Event]) => any\n  ): this {\n    return this.on(ev, handler)\n  }\n\n  /**\n   * Mostly identical to `EventEmitter.on`, with the following\n   * behavior differences to prevent data loss and unnecessary hangs:\n   *\n   * - Adding a 'data' event handler will trigger the flow of data\n   *\n   * - Adding a 'readable' event handler when there is data waiting to be read\n   *   will cause 'readable' to be emitted immediately.\n   *\n   * - Adding an 'endish' event handler ('end', 'finish', etc.) which has\n   *   already passed will cause the event to be emitted immediately and all\n   *   handlers removed.\n   *\n   * - Adding an 'error' event handler after an error has been emitted will\n   *   cause the event to be re-emitted immediately with the error previously\n   *   raised.\n   */\n  on(\n    ev: Event,\n    handler: (...args: Events[Event]) => any\n  ): this {\n    const ret = super.on(\n      ev as string | symbol,\n      handler as (...a: any[]) => any\n    )\n    if (ev === 'data') {\n      this[DISCARDED] = false\n      this[DATALISTENERS]++\n      if (!this[PIPES].length && !this[FLOWING]) {\n        this[RESUME]()\n      }\n    } else if (ev === 'readable' && this[BUFFERLENGTH] !== 0) {\n      super.emit('readable')\n    } else if (isEndish(ev) && this[EMITTED_END]) {\n      super.emit(ev)\n      this.removeAllListeners(ev)\n    } else if (ev === 'error' && this[EMITTED_ERROR]) {\n      const h = handler as (...a: Events['error']) => any\n      if (this[ASYNC]) defer(() => h.call(this, this[EMITTED_ERROR]))\n      else h.call(this, this[EMITTED_ERROR])\n    }\n    return ret\n  }\n\n  /**\n   * Alias for {@link Minipass#off}\n   */\n  removeListener(\n    ev: Event,\n    handler: (...args: Events[Event]) => any\n  ) {\n    return this.off(ev, handler)\n  }\n\n  /**\n   * Mostly identical to `EventEmitter.off`\n   *\n   * If a 'data' event handler is removed, and it was the last consumer\n   * (ie, there are no pipe destinations or other 'data' event listeners),\n   * then the flow of data will stop until there is another consumer or\n   * {@link Minipass#resume} is explicitly called.\n   */\n  off(\n    ev: Event,\n    handler: (...args: Events[Event]) => any\n  ) {\n    const ret = super.off(\n      ev as string | symbol,\n      handler as (...a: any[]) => any\n    )\n    // if we previously had listeners, and now we don't, and we don't\n    // have any pipes, then stop the flow, unless it's been explicitly\n    // put in a discarded flowing state via stream.resume().\n    if (ev === 'data') {\n      this[DATALISTENERS] = this.listeners('data').length\n      if (\n        this[DATALISTENERS] === 0 &&\n        !this[DISCARDED] &&\n        !this[PIPES].length\n      ) {\n        this[FLOWING] = false\n      }\n    }\n    return ret\n  }\n\n  /**\n   * Mostly identical to `EventEmitter.removeAllListeners`\n   *\n   * If all 'data' event handlers are removed, and they were the last consumer\n   * (ie, there are no pipe destinations), then the flow of data will stop\n   * until there is another consumer or {@link Minipass#resume} is explicitly\n   * called.\n   */\n  removeAllListeners(ev?: Event) {\n    const ret = super.removeAllListeners(ev as string | symbol | undefined)\n    if (ev === 'data' || ev === undefined) {\n      this[DATALISTENERS] = 0\n      if (!this[DISCARDED] && !this[PIPES].length) {\n        this[FLOWING] = false\n      }\n    }\n    return ret\n  }\n\n  /**\n   * true if the 'end' event has been emitted\n   */\n  get emittedEnd() {\n    return this[EMITTED_END]\n  }\n\n  [MAYBE_EMIT_END]() {\n    if (\n      !this[EMITTING_END] &&\n      !this[EMITTED_END] &&\n      !this[DESTROYED] &&\n      this[BUFFER].length === 0 &&\n      this[EOF]\n    ) {\n      this[EMITTING_END] = true\n      this.emit('end')\n      this.emit('prefinish')\n      this.emit('finish')\n      if (this[CLOSED]) this.emit('close')\n      this[EMITTING_END] = false\n    }\n  }\n\n  /**\n   * Mostly identical to `EventEmitter.emit`, with the following\n   * behavior differences to prevent data loss and unnecessary hangs:\n   *\n   * If the stream has been destroyed, and the event is something other\n   * than 'close' or 'error', then `false` is returned and no handlers\n   * are called.\n   *\n   * If the event is 'end', and has already been emitted, then the event\n   * is ignored. If the stream is in a paused or non-flowing state, then\n   * the event will be deferred until data flow resumes. If the stream is\n   * async, then handlers will be called on the next tick rather than\n   * immediately.\n   *\n   * If the event is 'close', and 'end' has not yet been emitted, then\n   * the event will be deferred until after 'end' is emitted.\n   *\n   * If the event is 'error', and an AbortSignal was provided for the stream,\n   * and there are no listeners, then the event is ignored, matching the\n   * behavior of node core streams in the presense of an AbortSignal.\n   *\n   * If the event is 'finish' or 'prefinish', then all listeners will be\n   * removed after emitting the event, to prevent double-firing.\n   */\n  emit(\n    ev: Event,\n    ...args: Events[Event]\n  ): boolean {\n    const data = args[0]\n    // error and close are only events allowed after calling destroy()\n    if (\n      ev !== 'error' &&\n      ev !== 'close' &&\n      ev !== DESTROYED &&\n      this[DESTROYED]\n    ) {\n      return false\n    } else if (ev === 'data') {\n      return !this[OBJECTMODE] && !data\n        ? false\n        : this[ASYNC]\n        ? (defer(() => this[EMITDATA](data as RType)), true)\n        : this[EMITDATA](data as RType)\n    } else if (ev === 'end') {\n      return this[EMITEND]()\n    } else if (ev === 'close') {\n      this[CLOSED] = true\n      // don't emit close before 'end' and 'finish'\n      if (!this[EMITTED_END] && !this[DESTROYED]) return false\n      const ret = super.emit('close')\n      this.removeAllListeners('close')\n      return ret\n    } else if (ev === 'error') {\n      this[EMITTED_ERROR] = data\n      super.emit(ERROR, data)\n      const ret =\n        !this[SIGNAL] || this.listeners('error').length\n          ? super.emit('error', data)\n          : false\n      this[MAYBE_EMIT_END]()\n      return ret\n    } else if (ev === 'resume') {\n      const ret = super.emit('resume')\n      this[MAYBE_EMIT_END]()\n      return ret\n    } else if (ev === 'finish' || ev === 'prefinish') {\n      const ret = super.emit(ev)\n      this.removeAllListeners(ev)\n      return ret\n    }\n\n    // Some other unknown event\n    const ret = super.emit(ev as string, ...args)\n    this[MAYBE_EMIT_END]()\n    return ret\n  }\n\n  [EMITDATA](data: RType) {\n    for (const p of this[PIPES]) {\n      if (p.dest.write(data as RType) === false) this.pause()\n    }\n    const ret = this[DISCARDED] ? false : super.emit('data', data)\n    this[MAYBE_EMIT_END]()\n    return ret\n  }\n\n  [EMITEND]() {\n    if (this[EMITTED_END]) return false\n\n    this[EMITTED_END] = true\n    this.readable = false\n    return this[ASYNC]\n      ? (defer(() => this[EMITEND2]()), true)\n      : this[EMITEND2]()\n  }\n\n  [EMITEND2]() {\n    if (this[DECODER]) {\n      const data = this[DECODER].end()\n      if (data) {\n        for (const p of this[PIPES]) {\n          p.dest.write(data as RType)\n        }\n        if (!this[DISCARDED]) super.emit('data', data)\n      }\n    }\n\n    for (const p of this[PIPES]) {\n      p.end()\n    }\n    const ret = super.emit('end')\n    this.removeAllListeners('end')\n    return ret\n  }\n\n  /**\n   * Return a Promise that resolves to an array of all emitted data once\n   * the stream ends.\n   */\n  async collect(): Promise {\n    const buf: RType[] & { dataLength: number } = Object.assign([], {\n      dataLength: 0,\n    })\n    if (!this[OBJECTMODE]) buf.dataLength = 0\n    // set the promise first, in case an error is raised\n    // by triggering the flow here.\n    const p = this.promise()\n    this.on('data', c => {\n      buf.push(c)\n      if (!this[OBJECTMODE])\n        buf.dataLength += (c as Minipass.BufferOrString).length\n    })\n    await p\n    return buf\n  }\n\n  /**\n   * Return a Promise that resolves to the concatenation of all emitted data\n   * once the stream ends.\n   *\n   * Not allowed on objectMode streams.\n   */\n  async concat(): Promise {\n    if (this[OBJECTMODE]) {\n      throw new Error('cannot concat in objectMode')\n    }\n    const buf = await this.collect()\n    return (\n      this[ENCODING]\n        ? buf.join('')\n        : Buffer.concat(buf as Buffer[], buf.dataLength)\n    ) as RType\n  }\n\n  /**\n   * Return a void Promise that resolves once the stream ends.\n   */\n  async promise(): Promise {\n    return new Promise((resolve, reject) => {\n      this.on(DESTROYED, () => reject(new Error('stream destroyed')))\n      this.on('error', er => reject(er))\n      this.on('end', () => resolve())\n    })\n  }\n\n  /**\n   * Asynchronous `for await of` iteration.\n   *\n   * This will continue emitting all chunks until the stream terminates.\n   */\n  [Symbol.asyncIterator](): AsyncGenerator {\n    // set this up front, in case the consumer doesn't call next()\n    // right away.\n    this[DISCARDED] = false\n    let stopped = false\n    const stop = async (): Promise> => {\n      this.pause()\n      stopped = true\n      return { value: undefined, done: true }\n    }\n    const next = (): Promise> => {\n      if (stopped) return stop()\n      const res = this.read()\n      if (res !== null) return Promise.resolve({ done: false, value: res })\n\n      if (this[EOF]) return stop()\n\n      let resolve!: (res: IteratorResult) => void\n      let reject!: (er: unknown) => void\n      const onerr = (er: unknown) => {\n        this.off('data', ondata)\n        this.off('end', onend)\n        this.off(DESTROYED, ondestroy)\n        stop()\n        reject(er)\n      }\n      const ondata = (value: RType) => {\n        this.off('error', onerr)\n        this.off('end', onend)\n        this.off(DESTROYED, ondestroy)\n        this.pause()\n        resolve({ value, done: !!this[EOF] })\n      }\n      const onend = () => {\n        this.off('error', onerr)\n        this.off('data', ondata)\n        this.off(DESTROYED, ondestroy)\n        stop()\n        resolve({ done: true, value: undefined })\n      }\n      const ondestroy = () => onerr(new Error('stream destroyed'))\n      return new Promise>((res, rej) => {\n        reject = rej\n        resolve = res\n        this.once(DESTROYED, ondestroy)\n        this.once('error', onerr)\n        this.once('end', onend)\n        this.once('data', ondata)\n      })\n    }\n\n    return {\n      next,\n      throw: stop,\n      return: stop,\n      [Symbol.asyncIterator]() {\n        return this\n      },\n    }\n  }\n\n  /**\n   * Synchronous `for of` iteration.\n   *\n   * The iteration will terminate when the internal buffer runs out, even\n   * if the stream has not yet terminated.\n   */\n  [Symbol.iterator](): Generator {\n    // set this up front, in case the consumer doesn't call next()\n    // right away.\n    this[DISCARDED] = false\n    let stopped = false\n    const stop = (): IteratorReturnResult => {\n      this.pause()\n      this.off(ERROR, stop)\n      this.off(DESTROYED, stop)\n      this.off('end', stop)\n      stopped = true\n      return { done: true, value: undefined }\n    }\n\n    const next = (): IteratorResult => {\n      if (stopped) return stop()\n      const value = this.read()\n      return value === null ? stop() : { done: false, value }\n    }\n\n    this.once('end', stop)\n    this.once(ERROR, stop)\n    this.once(DESTROYED, stop)\n\n    return {\n      next,\n      throw: stop,\n      return: stop,\n      [Symbol.iterator]() {\n        return this\n      },\n    }\n  }\n\n  /**\n   * Destroy a stream, preventing it from being used for any further purpose.\n   *\n   * If the stream has a `close()` method, then it will be called on\n   * destruction.\n   *\n   * After destruction, any attempt to write data, read data, or emit most\n   * events will be ignored.\n   *\n   * If an error argument is provided, then it will be emitted in an\n   * 'error' event.\n   */\n  destroy(er?: unknown) {\n    if (this[DESTROYED]) {\n      if (er) this.emit('error', er)\n      else this.emit(DESTROYED)\n      return this\n    }\n\n    this[DESTROYED] = true\n    this[DISCARDED] = true\n\n    // throw away all buffered data, it's never coming out\n    this[BUFFER].length = 0\n    this[BUFFERLENGTH] = 0\n\n    const wc = this as Minipass & {\n      close?: () => void\n    }\n    if (typeof wc.close === 'function' && !this[CLOSED]) wc.close()\n\n    if (er) this.emit('error', er)\n    // if no error to emit, still reject pending promises\n    else this.emit(DESTROYED)\n\n    return this\n  }\n\n  /**\n   * Alias for {@link isStream}\n   *\n   * Former export location, maintained for backwards compatibility.\n   *\n   * @deprecated\n   */\n  static get isStream() {\n    return isStream\n  }\n}\n"]}
    \ No newline at end of file
    diff --git a/node_modules/minipass/dist/esm/package.json b/node_modules/minipass/dist/esm/package.json
    deleted file mode 100644
    index 3dbc1ca..0000000
    --- a/node_modules/minipass/dist/esm/package.json
    +++ /dev/null
    @@ -1,3 +0,0 @@
    -{
    -  "type": "module"
    -}
    diff --git a/node_modules/minipass/package.json b/node_modules/minipass/package.json
    deleted file mode 100644
    index 771969b..0000000
    --- a/node_modules/minipass/package.json
    +++ /dev/null
    @@ -1,82 +0,0 @@
    -{
    -  "name": "minipass",
    -  "version": "7.1.2",
    -  "description": "minimal implementation of a PassThrough stream",
    -  "main": "./dist/commonjs/index.js",
    -  "types": "./dist/commonjs/index.d.ts",
    -  "type": "module",
    -  "tshy": {
    -    "selfLink": false,
    -    "main": true,
    -    "exports": {
    -      "./package.json": "./package.json",
    -      ".": "./src/index.ts"
    -    }
    -  },
    -  "exports": {
    -    "./package.json": "./package.json",
    -    ".": {
    -      "import": {
    -        "types": "./dist/esm/index.d.ts",
    -        "default": "./dist/esm/index.js"
    -      },
    -      "require": {
    -        "types": "./dist/commonjs/index.d.ts",
    -        "default": "./dist/commonjs/index.js"
    -      }
    -    }
    -  },
    -  "files": [
    -    "dist"
    -  ],
    -  "scripts": {
    -    "preversion": "npm test",
    -    "postversion": "npm publish",
    -    "prepublishOnly": "git push origin --follow-tags",
    -    "prepare": "tshy",
    -    "pretest": "npm run prepare",
    -    "presnap": "npm run prepare",
    -    "test": "tap",
    -    "snap": "tap",
    -    "format": "prettier --write . --loglevel warn",
    -    "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts"
    -  },
    -  "prettier": {
    -    "semi": false,
    -    "printWidth": 75,
    -    "tabWidth": 2,
    -    "useTabs": false,
    -    "singleQuote": true,
    -    "jsxSingleQuote": false,
    -    "bracketSameLine": true,
    -    "arrowParens": "avoid",
    -    "endOfLine": "lf"
    -  },
    -  "devDependencies": {
    -    "@types/end-of-stream": "^1.4.2",
    -    "@types/node": "^20.1.2",
    -    "end-of-stream": "^1.4.0",
    -    "node-abort-controller": "^3.1.1",
    -    "prettier": "^2.6.2",
    -    "tap": "^19.0.0",
    -    "through2": "^2.0.3",
    -    "tshy": "^1.14.0",
    -    "typedoc": "^0.25.1"
    -  },
    -  "repository": "https://github.com/isaacs/minipass",
    -  "keywords": [
    -    "passthrough",
    -    "stream"
    -  ],
    -  "author": "Isaac Z. Schlueter  (http://blog.izs.me/)",
    -  "license": "ISC",
    -  "engines": {
    -    "node": ">=16 || 14 >=14.17"
    -  },
    -  "tap": {
    -    "typecheck": true,
    -    "include": [
    -      "test/*.ts"
    -    ]
    -  }
    -}
    diff --git a/node_modules/mz/HISTORY.md b/node_modules/mz/HISTORY.md
    deleted file mode 100644
    index 6ebee21..0000000
    --- a/node_modules/mz/HISTORY.md
    +++ /dev/null
    @@ -1,66 +0,0 @@
    -
    -2.7.0 / 2017-09-13
    -==================
    -
    -  * feat: support fs.copyFile (#58)
    -
    -2.6.0 / 2016-11-22
    -==================
    -
    -  * Added fdatasync to fs api (#46)
    -
    -2.5.0 / 2016-11-04
    -==================
    -
    -  * feat: support fs.mkdtemp
    -
    -2.4.0 / 2016-03-23
    -==================
    -
    -  * add `fs.truncate()` [#34](https://github.com/normalize/mz/pull/34)
    -
    -2.3.1 / 2016-02-01
    -==================
    -
    -  * update `any-promise@v1`
    -
    -2.3.0 / 2016-01-30
    -==================
    -
    -  * feat(package): switch to `any-promise` to support more promise engines
    -
    -2.2.0 / 2016-01-24
    -==================
    -
    -  * feat(package): add index.js to files
    -
    -2.1.0 / 2015-10-15
    -==================
    -
    - * support for readline library
    -
    -2.0.0 / 2015-05-24
    -==================
    -
    - * support callbacks as well
    -
    -1.2.0 / 2014-12-16
    -==================
    -
    - * refactor promisification to `thenify` and `thenify-all`
    -
    -1.1.0 / 2014-11-14
    -==================
    -
    - * use `graceful-fs` if available
    -
    -1.0.1 / 2014-08-18
    -==================
    -
    - * don't use `bluebird.promisify()` - unnecessarily wraps runtime errors, causing issues
    -
    -1.0.0 / 2014-06-18
    -==================
    -
    - * use `bluebird` by default if found
    - * support node 0.8
    diff --git a/node_modules/mz/LICENSE b/node_modules/mz/LICENSE
    deleted file mode 100644
    index 1835f3d..0000000
    --- a/node_modules/mz/LICENSE
    +++ /dev/null
    @@ -1,22 +0,0 @@
    -
    -The MIT License (MIT)
    -
    -Copyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and Contributors
    -
    -Permission is hereby granted, free of charge, to any person obtaining a copy
    -of this software and associated documentation files (the "Software"), to deal
    -in the Software without restriction, including without limitation the rights
    -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    -copies of the Software, and to permit persons to whom the Software is
    -furnished to do so, subject to the following conditions:
    -
    -The above copyright notice and this permission notice shall be included in
    -all copies or substantial portions of the Software.
    -
    -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    -THE SOFTWARE.
    diff --git a/node_modules/mz/README.md b/node_modules/mz/README.md
    deleted file mode 100644
    index 50d6557..0000000
    --- a/node_modules/mz/README.md
    +++ /dev/null
    @@ -1,106 +0,0 @@
    -
    -# MZ - Modernize node.js
    -
    -[![NPM version][npm-image]][npm-url]
    -[![Build status][travis-image]][travis-url]
    -[![Test coverage][coveralls-image]][coveralls-url]
    -[![Dependency Status][david-image]][david-url]
    -[![License][license-image]][license-url]
    -[![Downloads][downloads-image]][downloads-url]
    -
    -Modernize node.js to current ECMAScript specifications!
    -node.js will not update their API to ES6+ [for a while](https://github.com/joyent/node/issues/7549).
    -This library is a wrapper for various aspects of node.js' API.
    -
    -## Installation and Usage
    -
    -Set `mz` as a dependency and install it.
    -
    -```bash
    -npm i mz
    -```
    -
    -Then prefix the relevant `require()`s with `mz/`:
    -
    -```js
    -var fs = require('mz/fs')
    -
    -fs.exists(__filename).then(function (exists) {
    -  if (exists) // do something
    -})
    -```
    -
    -With ES2017, this will allow you to use async functions cleanly with node's core API:
    -
    -```js
    -const fs = require('mz/fs')
    -
    -
    -async function doSomething () {
    -  if (await fs.exists(__filename)) // do something
    -}
    -```
    -
    -## Promisification
    -
    -Many node methods are converted into promises.
    -Any properties that are deprecated or aren't asynchronous will simply be proxied.
    -The modules wrapped are:
    -
    -- `child_process`
    -- `crypto`
    -- `dns`
    -- `fs` (uses `graceful-fs` if available)
    -- `readline`
    -- `zlib`
    -
    -```js
    -var exec = require('mz/child_process').exec
    -
    -exec('node --version').then(function (stdout) {
    -  console.log(stdout)
    -})
    -```
    -
    -## Promise Engine
    -
    -`mz` uses [`any-promise`](https://github.com/kevinbeaty/any-promise).
    -
    -## FAQ
    -
    -### Can I use this in production?
    -
    -Yes, Node 4.x ships with stable promises support. For older engines,
    -you should probably install your own promise implementation and register it with
    -`require('any-promise/register')('bluebird')`.
    -
    -### Will this make my app faster?
    -
    -Nope, probably slower actually.
    -
    -### Can I add more features?
    -
    -Sure.
    -Open an issue.
    -
    -Currently, the plans are to eventually support:
    -
    -- New APIs in node.js that are not available in older versions of node
    -- ECMAScript7 Streams
    -
    -[bluebird]: https://github.com/petkaantonov/bluebird
    -
    -[npm-image]: https://img.shields.io/npm/v/mz.svg?style=flat-square
    -[npm-url]: https://npmjs.org/package/mz
    -[github-tag]: http://img.shields.io/github/tag/normalize/mz.svg?style=flat-square
    -[github-url]: https://github.com/normalize/mz/tags
    -[travis-image]: https://img.shields.io/travis/normalize/mz.svg?style=flat-square
    -[travis-url]: https://travis-ci.org/normalize/mz
    -[coveralls-image]: https://img.shields.io/coveralls/normalize/mz.svg?style=flat-square
    -[coveralls-url]: https://coveralls.io/r/normalize/mz?branch=master
    -[david-image]: http://img.shields.io/david/normalize/mz.svg?style=flat-square
    -[david-url]: https://david-dm.org/normalize/mz
    -[license-image]: http://img.shields.io/npm/l/mz.svg?style=flat-square
    -[license-url]: LICENSE
    -[downloads-image]: http://img.shields.io/npm/dm/mz.svg?style=flat-square
    -[downloads-url]: https://npmjs.org/package/mz
    diff --git a/node_modules/mz/child_process.js b/node_modules/mz/child_process.js
    deleted file mode 100644
    index 06d5d9e..0000000
    --- a/node_modules/mz/child_process.js
    +++ /dev/null
    @@ -1,8 +0,0 @@
    -
    -require('thenify-all').withCallback(
    -  require('child_process'),
    -  exports, [
    -    'exec',
    -    'execFile',
    -  ]
    -)
    diff --git a/node_modules/mz/crypto.js b/node_modules/mz/crypto.js
    deleted file mode 100644
    index d8cff57..0000000
    --- a/node_modules/mz/crypto.js
    +++ /dev/null
    @@ -1,9 +0,0 @@
    -
    -require('thenify-all').withCallback(
    -  require('crypto'),
    -  exports, [
    -    'pbkdf2',
    -    'pseudoRandomBytes',
    -    'randomBytes'
    -  ]
    -)
    diff --git a/node_modules/mz/dns.js b/node_modules/mz/dns.js
    deleted file mode 100644
    index c103582..0000000
    --- a/node_modules/mz/dns.js
    +++ /dev/null
    @@ -1,16 +0,0 @@
    -
    -require('thenify-all').withCallback(
    -  require('dns'),
    -  exports, [
    -    'lookup',
    -    'resolve',
    -    'resolve4',
    -    'resolve6',
    -    'resolveCname',
    -    'resolveMx',
    -    'resolveNs',
    -    'resolveSrv',
    -    'resolveTxt',
    -    'reverse'
    -  ]
    -)
    diff --git a/node_modules/mz/fs.js b/node_modules/mz/fs.js
    deleted file mode 100644
    index 1cfd2d7..0000000
    --- a/node_modules/mz/fs.js
    +++ /dev/null
    @@ -1,62 +0,0 @@
    -
    -var Promise = require('any-promise')
    -var fs
    -try {
    -  fs = require('graceful-fs')
    -} catch(err) {
    -  fs = require('fs')
    -}
    -
    -var api = [
    -  'appendFile',
    -  'chmod',
    -  'chown',
    -  'close',
    -  'fchmod',
    -  'fchown',
    -  'fdatasync',
    -  'fstat',
    -  'fsync',
    -  'ftruncate',
    -  'futimes',
    -  'lchown',
    -  'link',
    -  'lstat',
    -  'mkdir',
    -  'open',
    -  'read',
    -  'readFile',
    -  'readdir',
    -  'readlink',
    -  'realpath',
    -  'rename',
    -  'rmdir',
    -  'stat',
    -  'symlink',
    -  'truncate',
    -  'unlink',
    -  'utimes',
    -  'write',
    -  'writeFile'
    -]
    -
    -typeof fs.access === 'function' && api.push('access')
    -typeof fs.copyFile === 'function' && api.push('copyFile')
    -typeof fs.mkdtemp === 'function' && api.push('mkdtemp')
    -
    -require('thenify-all').withCallback(fs, exports, api)
    -
    -exports.exists = function (filename, callback) {
    -  // callback
    -  if (typeof callback === 'function') {
    -    return fs.stat(filename, function (err) {
    -      callback(null, !err);
    -    })
    -  }
    -  // or promise
    -  return new Promise(function (resolve) {
    -    fs.stat(filename, function (err) {
    -      resolve(!err)
    -    })
    -  })
    -}
    diff --git a/node_modules/mz/index.js b/node_modules/mz/index.js
    deleted file mode 100644
    index cef508d..0000000
    --- a/node_modules/mz/index.js
    +++ /dev/null
    @@ -1,8 +0,0 @@
    -module.exports = {
    -  fs: require('./fs'),
    -  dns: require('./dns'),
    -  zlib: require('./zlib'),
    -  crypto: require('./crypto'),
    -  readline: require('./readline'),
    -  child_process: require('./child_process')
    -}
    diff --git a/node_modules/mz/package.json b/node_modules/mz/package.json
    deleted file mode 100644
    index de8d542..0000000
    --- a/node_modules/mz/package.json
    +++ /dev/null
    @@ -1,44 +0,0 @@
    -{
    -  "name": "mz",
    -  "description": "modernize node.js to current ECMAScript standards",
    -  "version": "2.7.0",
    -  "author": {
    -    "name": "Jonathan Ong",
    -    "email": "me@jongleberry.com",
    -    "url": "http://jongleberry.com",
    -    "twitter": "https://twitter.com/jongleberry"
    -  },
    -  "license": "MIT",
    -  "repository": "normalize/mz",
    -  "dependencies": {
    -    "any-promise": "^1.0.0",
    -    "object-assign": "^4.0.1",
    -    "thenify-all": "^1.0.0"
    -  },
    -  "devDependencies": {
    -    "istanbul": "^0.4.0",
    -    "bluebird": "^3.0.0",
    -    "mocha": "^3.0.0"
    -  },
    -  "scripts": {
    -    "test": "mocha --reporter spec",
    -    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot",
    -    "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter dot"
    -  },
    -  "keywords": [
    -    "promisify",
    -    "promise",
    -    "thenify",
    -    "then",
    -    "es6"
    -  ],
    -  "files": [
    -    "index.js",
    -    "child_process.js",
    -    "crypto.js",
    -    "dns.js",
    -    "fs.js",
    -    "readline.js",
    -    "zlib.js"
    -  ]
    -}
    diff --git a/node_modules/mz/readline.js b/node_modules/mz/readline.js
    deleted file mode 100644
    index eb70c46..0000000
    --- a/node_modules/mz/readline.js
    +++ /dev/null
    @@ -1,64 +0,0 @@
    -var readline = require('readline')
    -var Promise = require('any-promise')
    -var objectAssign = require('object-assign')
    -var Interface = readline.Interface
    -
    -function wrapCompleter (completer) {
    -  if (completer.length === 2) return completer
    -
    -  return function (line, cb) {
    -    var result = completer(line)
    -
    -    if (typeof result.then !== 'function') {
    -      return cb(null, result)
    -    }
    -
    -    result.catch(cb).then(function (result) {
    -      process.nextTick(function () { cb(null, result) })
    -    })
    -  }
    -}
    -
    -function InterfaceAsPromised (input, output, completer, terminal) {
    -  if (arguments.length === 1) {
    -    var options = input
    -
    -    if (typeof options.completer === 'function') {
    -      options = objectAssign({}, options, {
    -        completer: wrapCompleter(options.completer)
    -      })
    -    }
    -
    -    Interface.call(this, options)
    -  } else {
    -    if (typeof completer === 'function') {
    -      completer = wrapCompleter(completer)
    -    }
    -
    -    Interface.call(this, input, output, completer, terminal)
    -  }
    -}
    -
    -InterfaceAsPromised.prototype = Object.create(Interface.prototype)
    -
    -InterfaceAsPromised.prototype.question = function (question, callback) {
    -  if (typeof callback === 'function') {
    -    return Interface.prototype.question.call(this, question, callback)
    -  }
    -
    -  var self = this
    -  return new Promise(function (resolve) {
    -    Interface.prototype.question.call(self, question, resolve)
    -  })
    -}
    -
    -objectAssign(exports, readline, {
    -  Interface: InterfaceAsPromised,
    -  createInterface: function (input, output, completer, terminal) {
    -    if (arguments.length === 1) {
    -      return new InterfaceAsPromised(input)
    -    }
    -
    -    return new InterfaceAsPromised(input, output, completer, terminal)
    -  }
    -})
    diff --git a/node_modules/mz/zlib.js b/node_modules/mz/zlib.js
    deleted file mode 100644
    index a05c26a..0000000
    --- a/node_modules/mz/zlib.js
    +++ /dev/null
    @@ -1,13 +0,0 @@
    -
    -require('thenify-all').withCallback(
    -  require('zlib'),
    -  exports, [
    -    'deflate',
    -    'deflateRaw',
    -    'gzip',
    -    'gunzip',
    -    'inflate',
    -    'inflateRaw',
    -    'unzip',
    -  ]
    -)
    diff --git a/node_modules/nanoid/LICENSE b/node_modules/nanoid/LICENSE
    deleted file mode 100644
    index 37f56aa..0000000
    --- a/node_modules/nanoid/LICENSE
    +++ /dev/null
    @@ -1,20 +0,0 @@
    -The MIT License (MIT)
    -
    -Copyright 2017 Andrey Sitnik 
    -
    -Permission is hereby granted, free of charge, to any person obtaining a copy of
    -this software and associated documentation files (the "Software"), to deal in
    -the Software without restriction, including without limitation the rights to
    -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
    -the Software, and to permit persons to whom the Software is furnished to do so,
    -subject to the following conditions:
    -
    -The above copyright notice and this permission notice shall be included in all
    -copies or substantial portions of the Software.
    -
    -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
    -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
    -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
    -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
    -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    diff --git a/node_modules/nanoid/README.md b/node_modules/nanoid/README.md
    deleted file mode 100644
    index 35abb57..0000000
    --- a/node_modules/nanoid/README.md
    +++ /dev/null
    @@ -1,39 +0,0 @@
    -# Nano ID
    -
    -Nano ID logo by Anton Lovchikov
    -
    -**English** | [Русский](./README.ru.md) | [简体中文](./README.zh-CN.md) | [Bahasa Indonesia](./README.id-ID.md)
    -
    -A tiny, secure, URL-friendly, unique string ID generator for JavaScript.
    -
    -> “An amazing level of senseless perfectionism,
    -> which is simply impossible not to respect.”
    -
    -* **Small.** 130 bytes (minified and gzipped). No dependencies.
    -  [Size Limit] controls the size.
    -* **Fast.** It is 2 times faster than UUID.
    -* **Safe.** It uses hardware random generator. Can be used in clusters.
    -* **Short IDs.** It uses a larger alphabet than UUID (`A-Za-z0-9_-`).
    -  So ID size was reduced from 36 to 21 symbols.
    -* **Portable.** Nano ID was ported
    -  to [20 programming languages](#other-programming-languages).
    -
    -```js
    -import { nanoid } from 'nanoid'
    -model.id = nanoid() //=> "V1StGXR8_Z5jdHi6B-myT"
    -```
    -
    -Supports modern browsers, IE [with Babel], Node.js and React Native.
    -
    -[online tool]: https://gitpod.io/#https://github.com/ai/nanoid/
    -[with Babel]:  https://developer.epages.com/blog/coding/how-to-transpile-node-modules-with-babel-and-webpack-in-a-monorepo/
    -[Size Limit]:  https://github.com/ai/size-limit
    -
    -
    -  Sponsored by Evil Martians
    -
    -
    -## Docs
    -Read full docs **[here](https://github.com/ai/nanoid#readme)**.
    diff --git a/node_modules/nanoid/async/index.browser.cjs b/node_modules/nanoid/async/index.browser.cjs
    deleted file mode 100644
    index 80d1871..0000000
    --- a/node_modules/nanoid/async/index.browser.cjs
    +++ /dev/null
    @@ -1,69 +0,0 @@
    -let random = async bytes => crypto.getRandomValues(new Uint8Array(bytes))
    -
    -let customAlphabet = (alphabet, defaultSize = 21) => {
    -  // First, a bitmask is necessary to generate the ID. The bitmask makes bytes
    -  // values closer to the alphabet size. The bitmask calculates the closest
    -  // `2^31 - 1` number, which exceeds the alphabet size.
    -  // For example, the bitmask for the alphabet size 30 is 31 (00011111).
    -  // `Math.clz32` is not used, because it is not available in browsers.
    -  let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1
    -  // Though, the bitmask solution is not perfect since the bytes exceeding
    -  // the alphabet size are refused. Therefore, to reliably generate the ID,
    -  // the random bytes redundancy has to be satisfied.
    -
    -  // Note: every hardware random generator call is performance expensive,
    -  // because the system call for entropy collection takes a lot of time.
    -  // So, to avoid additional system calls, extra bytes are requested in advance.
    -
    -  // Next, a step determines how many random bytes to generate.
    -  // The number of random bytes gets decided upon the ID size, mask,
    -  // alphabet size, and magic number 1.6 (using 1.6 peaks at performance
    -  // according to benchmarks).
    -
    -  // `-~f => Math.ceil(f)` if f is a float
    -  // `-~i => i + 1` if i is an integer
    -  let step = -~((1.6 * mask * defaultSize) / alphabet.length)
    -
    -  return async (size = defaultSize) => {
    -    let id = ''
    -    while (true) {
    -      let bytes = crypto.getRandomValues(new Uint8Array(step))
    -      // A compact alternative for `for (var i = 0; i < step; i++)`.
    -      let i = step | 0
    -      while (i--) {
    -        // Adding `|| ''` refuses a random byte that exceeds the alphabet size.
    -        id += alphabet[bytes[i] & mask] || ''
    -        if (id.length === size) return id
    -      }
    -    }
    -  }
    -}
    -
    -let nanoid = async (size = 21) => {
    -  let id = ''
    -  let bytes = crypto.getRandomValues(new Uint8Array((size |= 0)))
    -
    -  // A compact alternative for `for (var i = 0; i < step; i++)`.
    -  while (size--) {
    -    // It is incorrect to use bytes exceeding the alphabet size.
    -    // The following mask reduces the random byte in the 0-255 value
    -    // range to the 0-63 value range. Therefore, adding hacks, such
    -    // as empty string fallback or magic numbers, is unneccessary because
    -    // the bitmask trims bytes down to the alphabet size.
    -    let byte = bytes[size] & 63
    -    if (byte < 36) {
    -      // `0-9a-z`
    -      id += byte.toString(36)
    -    } else if (byte < 62) {
    -      // `A-Z`
    -      id += (byte - 26).toString(36).toUpperCase()
    -    } else if (byte < 63) {
    -      id += '_'
    -    } else {
    -      id += '-'
    -    }
    -  }
    -  return id
    -}
    -
    -module.exports = { nanoid, customAlphabet, random }
    diff --git a/node_modules/nanoid/async/index.browser.js b/node_modules/nanoid/async/index.browser.js
    deleted file mode 100644
    index fbaa230..0000000
    --- a/node_modules/nanoid/async/index.browser.js
    +++ /dev/null
    @@ -1,34 +0,0 @@
    -let random = async bytes => crypto.getRandomValues(new Uint8Array(bytes))
    -let customAlphabet = (alphabet, defaultSize = 21) => {
    -  let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1
    -  let step = -~((1.6 * mask * defaultSize) / alphabet.length)
    -  return async (size = defaultSize) => {
    -    let id = ''
    -    while (true) {
    -      let bytes = crypto.getRandomValues(new Uint8Array(step))
    -      let i = step | 0
    -      while (i--) {
    -        id += alphabet[bytes[i] & mask] || ''
    -        if (id.length === size) return id
    -      }
    -    }
    -  }
    -}
    -let nanoid = async (size = 21) => {
    -  let id = ''
    -  let bytes = crypto.getRandomValues(new Uint8Array((size |= 0)))
    -  while (size--) {
    -    let byte = bytes[size] & 63
    -    if (byte < 36) {
    -      id += byte.toString(36)
    -    } else if (byte < 62) {
    -      id += (byte - 26).toString(36).toUpperCase()
    -    } else if (byte < 63) {
    -      id += '_'
    -    } else {
    -      id += '-'
    -    }
    -  }
    -  return id
    -}
    -export { nanoid, customAlphabet, random }
    diff --git a/node_modules/nanoid/async/index.cjs b/node_modules/nanoid/async/index.cjs
    deleted file mode 100644
    index f1b0ad0..0000000
    --- a/node_modules/nanoid/async/index.cjs
    +++ /dev/null
    @@ -1,71 +0,0 @@
    -let crypto = require('crypto')
    -
    -let { urlAlphabet } = require('../url-alphabet/index.cjs')
    -
    -// `crypto.randomFill()` is a little faster than `crypto.randomBytes()`,
    -// because it is possible to use in combination with `Buffer.allocUnsafe()`.
    -let random = bytes =>
    -  new Promise((resolve, reject) => {
    -    // `Buffer.allocUnsafe()` is faster because it doesn’t flush the memory.
    -    // Memory flushing is unnecessary since the buffer allocation itself resets
    -    // the memory with the new bytes.
    -    crypto.randomFill(Buffer.allocUnsafe(bytes), (err, buf) => {
    -      if (err) {
    -        reject(err)
    -      } else {
    -        resolve(buf)
    -      }
    -    })
    -  })
    -
    -let customAlphabet = (alphabet, defaultSize = 21) => {
    -  // First, a bitmask is necessary to generate the ID. The bitmask makes bytes
    -  // values closer to the alphabet size. The bitmask calculates the closest
    -  // `2^31 - 1` number, which exceeds the alphabet size.
    -  // For example, the bitmask for the alphabet size 30 is 31 (00011111).
    -  let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1
    -  // Though, the bitmask solution is not perfect since the bytes exceeding
    -  // the alphabet size are refused. Therefore, to reliably generate the ID,
    -  // the random bytes redundancy has to be satisfied.
    -
    -  // Note: every hardware random generator call is performance expensive,
    -  // because the system call for entropy collection takes a lot of time.
    -  // So, to avoid additional system calls, extra bytes are requested in advance.
    -
    -  // Next, a step determines how many random bytes to generate.
    -  // The number of random bytes gets decided upon the ID size, mask,
    -  // alphabet size, and magic number 1.6 (using 1.6 peaks at performance
    -  // according to benchmarks).
    -  let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length)
    -
    -  let tick = (id, size = defaultSize) =>
    -    random(step).then(bytes => {
    -      // A compact alternative for `for (var i = 0; i < step; i++)`.
    -      let i = step
    -      while (i--) {
    -        // Adding `|| ''` refuses a random byte that exceeds the alphabet size.
    -        id += alphabet[bytes[i] & mask] || ''
    -        if (id.length >= size) return id
    -      }
    -      return tick(id, size)
    -    })
    -
    -  return size => tick('', size)
    -}
    -
    -let nanoid = (size = 21) =>
    -  random((size |= 0)).then(bytes => {
    -    let id = ''
    -    // A compact alternative for `for (var i = 0; i < step; i++)`.
    -    while (size--) {
    -      // It is incorrect to use bytes exceeding the alphabet size.
    -      // The following mask reduces the random byte in the 0-255 value
    -      // range to the 0-63 value range. Therefore, adding hacks, such
    -      // as empty string fallback or magic numbers, is unneccessary because
    -      // the bitmask trims bytes down to the alphabet size.
    -      id += urlAlphabet[bytes[size] & 63]
    -    }
    -    return id
    -  })
    -
    -module.exports = { nanoid, customAlphabet, random }
    diff --git a/node_modules/nanoid/async/index.d.ts b/node_modules/nanoid/async/index.d.ts
    deleted file mode 100644
    index 9e91965..0000000
    --- a/node_modules/nanoid/async/index.d.ts
    +++ /dev/null
    @@ -1,56 +0,0 @@
    -/**
    - * Generate secure URL-friendly unique ID. The non-blocking version.
    - *
    - * By default, the ID will have 21 symbols to have a collision probability
    - * similar to UUID v4.
    - *
    - * ```js
    - * import { nanoid } from 'nanoid/async'
    - * nanoid().then(id => {
    - *   model.id = id
    - * })
    - * ```
    - *
    - * @param size Size of the ID. The default size is 21.
    - * @returns A promise with a random string.
    - */
    -export function nanoid(size?: number): Promise
    -
    -/**
    - * A low-level function.
    - * Generate secure unique ID with custom alphabet. The non-blocking version.
    - *
    - * Alphabet must contain 256 symbols or less. Otherwise, the generator
    - * will not be secure.
    - *
    - * @param alphabet Alphabet used to generate the ID.
    - * @param defaultSize Size of the ID. The default size is 21.
    - * @returns A function that returns a promise with a random string.
    - *
    - * ```js
    - * import { customAlphabet } from 'nanoid/async'
    - * const nanoid = customAlphabet('0123456789абвгдеё', 5)
    - * nanoid().then(id => {
    - *   model.id = id //=> "8ё56а"
    - * })
    - * ```
    - */
    -export function customAlphabet(
    -  alphabet: string,
    -  defaultSize?: number
    -): (size?: number) => Promise
    -
    -/**
    - * Generate an array of random bytes collected from hardware noise.
    - *
    - * ```js
    - * import { random } from 'nanoid/async'
    - * random(5).then(bytes => {
    - *   bytes //=> [10, 67, 212, 67, 89]
    - * })
    - * ```
    - *
    - * @param bytes Size of the array.
    - * @returns A promise with a random bytes array.
    - */
    -export function random(bytes: number): Promise
    diff --git a/node_modules/nanoid/async/index.js b/node_modules/nanoid/async/index.js
    deleted file mode 100644
    index cec454a..0000000
    --- a/node_modules/nanoid/async/index.js
    +++ /dev/null
    @@ -1,35 +0,0 @@
    -import crypto from 'crypto'
    -import { urlAlphabet } from '../url-alphabet/index.js'
    -let random = bytes =>
    -  new Promise((resolve, reject) => {
    -    crypto.randomFill(Buffer.allocUnsafe(bytes), (err, buf) => {
    -      if (err) {
    -        reject(err)
    -      } else {
    -        resolve(buf)
    -      }
    -    })
    -  })
    -let customAlphabet = (alphabet, defaultSize = 21) => {
    -  let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1
    -  let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length)
    -  let tick = (id, size = defaultSize) =>
    -    random(step).then(bytes => {
    -      let i = step
    -      while (i--) {
    -        id += alphabet[bytes[i] & mask] || ''
    -        if (id.length >= size) return id
    -      }
    -      return tick(id, size)
    -    })
    -  return size => tick('', size)
    -}
    -let nanoid = (size = 21) =>
    -  random((size |= 0)).then(bytes => {
    -    let id = ''
    -    while (size--) {
    -      id += urlAlphabet[bytes[size] & 63]
    -    }
    -    return id
    -  })
    -export { nanoid, customAlphabet, random }
    diff --git a/node_modules/nanoid/async/index.native.js b/node_modules/nanoid/async/index.native.js
    deleted file mode 100644
    index 7c1d6f3..0000000
    --- a/node_modules/nanoid/async/index.native.js
    +++ /dev/null
    @@ -1,26 +0,0 @@
    -import { getRandomBytesAsync } from 'expo-random'
    -import { urlAlphabet } from '../url-alphabet/index.js'
    -let random = getRandomBytesAsync
    -let customAlphabet = (alphabet, defaultSize = 21) => {
    -  let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1
    -  let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length)
    -  let tick = (id, size = defaultSize) =>
    -    random(step).then(bytes => {
    -      let i = step
    -      while (i--) {
    -        id += alphabet[bytes[i] & mask] || ''
    -        if (id.length >= size) return id
    -      }
    -      return tick(id, size)
    -    })
    -  return size => tick('', size)
    -}
    -let nanoid = (size = 21) =>
    -  random((size |= 0)).then(bytes => {
    -    let id = ''
    -    while (size--) {
    -      id += urlAlphabet[bytes[size] & 63]
    -    }
    -    return id
    -  })
    -export { nanoid, customAlphabet, random }
    diff --git a/node_modules/nanoid/async/package.json b/node_modules/nanoid/async/package.json
    deleted file mode 100644
    index 578cdb4..0000000
    --- a/node_modules/nanoid/async/package.json
    +++ /dev/null
    @@ -1,12 +0,0 @@
    -{
    -  "type": "module",
    -  "main": "index.cjs",
    -  "module": "index.js",
    -  "react-native": {
    -    "./index.js": "./index.native.js"
    -  },
    -  "browser": {
    -    "./index.js": "./index.browser.js",
    -    "./index.cjs": "./index.browser.cjs"
    -  }
    -}
    \ No newline at end of file
    diff --git a/node_modules/nanoid/bin/nanoid.cjs b/node_modules/nanoid/bin/nanoid.cjs
    deleted file mode 100644
    index c76db0f..0000000
    --- a/node_modules/nanoid/bin/nanoid.cjs
    +++ /dev/null
    @@ -1,55 +0,0 @@
    -#!/usr/bin/env node
    -
    -let { nanoid, customAlphabet } = require('..')
    -
    -function print(msg) {
    -  process.stdout.write(msg + '\n')
    -}
    -
    -function error(msg) {
    -  process.stderr.write(msg + '\n')
    -  process.exit(1)
    -}
    -
    -if (process.argv.includes('--help') || process.argv.includes('-h')) {
    -  print(`
    -  Usage
    -    $ nanoid [options]
    -
    -  Options
    -    -s, --size       Generated ID size
    -    -a, --alphabet   Alphabet to use
    -    -h, --help       Show this help
    -
    -  Examples
    -    $ nanoid --s 15
    -    S9sBF77U6sDB8Yg
    -
    -    $ nanoid --size 10 --alphabet abc
    -    bcabababca`)
    -  process.exit()
    -}
    -
    -let alphabet, size
    -for (let i = 2; i < process.argv.length; i++) {
    -  let arg = process.argv[i]
    -  if (arg === '--size' || arg === '-s') {
    -    size = Number(process.argv[i + 1])
    -    i += 1
    -    if (Number.isNaN(size) || size <= 0) {
    -      error('Size must be positive integer')
    -    }
    -  } else if (arg === '--alphabet' || arg === '-a') {
    -    alphabet = process.argv[i + 1]
    -    i += 1
    -  } else {
    -    error('Unknown argument ' + arg)
    -  }
    -}
    -
    -if (alphabet) {
    -  let customNanoid = customAlphabet(alphabet, size)
    -  print(customNanoid())
    -} else {
    -  print(nanoid(size))
    -}
    diff --git a/node_modules/nanoid/index.browser.cjs b/node_modules/nanoid/index.browser.cjs
    deleted file mode 100644
    index d21a91f..0000000
    --- a/node_modules/nanoid/index.browser.cjs
    +++ /dev/null
    @@ -1,72 +0,0 @@
    -// This file replaces `index.js` in bundlers like webpack or Rollup,
    -// according to `browser` config in `package.json`.
    -
    -let { urlAlphabet } = require('./url-alphabet/index.cjs')
    -
    -let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))
    -
    -let customRandom = (alphabet, defaultSize, getRandom) => {
    -  // First, a bitmask is necessary to generate the ID. The bitmask makes bytes
    -  // values closer to the alphabet size. The bitmask calculates the closest
    -  // `2^31 - 1` number, which exceeds the alphabet size.
    -  // For example, the bitmask for the alphabet size 30 is 31 (00011111).
    -  // `Math.clz32` is not used, because it is not available in browsers.
    -  let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1
    -  // Though, the bitmask solution is not perfect since the bytes exceeding
    -  // the alphabet size are refused. Therefore, to reliably generate the ID,
    -  // the random bytes redundancy has to be satisfied.
    -
    -  // Note: every hardware random generator call is performance expensive,
    -  // because the system call for entropy collection takes a lot of time.
    -  // So, to avoid additional system calls, extra bytes are requested in advance.
    -
    -  // Next, a step determines how many random bytes to generate.
    -  // The number of random bytes gets decided upon the ID size, mask,
    -  // alphabet size, and magic number 1.6 (using 1.6 peaks at performance
    -  // according to benchmarks).
    -
    -  // `-~f => Math.ceil(f)` if f is a float
    -  // `-~i => i + 1` if i is an integer
    -  let step = -~((1.6 * mask * defaultSize) / alphabet.length)
    -
    -  return (size = defaultSize) => {
    -    let id = ''
    -    while (true) {
    -      let bytes = getRandom(step)
    -      // A compact alternative for `for (var i = 0; i < step; i++)`.
    -      let j = step | 0
    -      while (j--) {
    -        // Adding `|| ''` refuses a random byte that exceeds the alphabet size.
    -        id += alphabet[bytes[j] & mask] || ''
    -        if (id.length === size) return id
    -      }
    -    }
    -  }
    -}
    -
    -let customAlphabet = (alphabet, size = 21) =>
    -  customRandom(alphabet, size, random)
    -
    -let nanoid = (size = 21) =>
    -  crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {
    -    // It is incorrect to use bytes exceeding the alphabet size.
    -    // The following mask reduces the random byte in the 0-255 value
    -    // range to the 0-63 value range. Therefore, adding hacks, such
    -    // as empty string fallback or magic numbers, is unneccessary because
    -    // the bitmask trims bytes down to the alphabet size.
    -    byte &= 63
    -    if (byte < 36) {
    -      // `0-9a-z`
    -      id += byte.toString(36)
    -    } else if (byte < 62) {
    -      // `A-Z`
    -      id += (byte - 26).toString(36).toUpperCase()
    -    } else if (byte > 62) {
    -      id += '-'
    -    } else {
    -      id += '_'
    -    }
    -    return id
    -  }, '')
    -
    -module.exports = { nanoid, customAlphabet, customRandom, urlAlphabet, random }
    diff --git a/node_modules/nanoid/index.browser.js b/node_modules/nanoid/index.browser.js
    deleted file mode 100644
    index 7d3b876..0000000
    --- a/node_modules/nanoid/index.browser.js
    +++ /dev/null
    @@ -1,34 +0,0 @@
    -import { urlAlphabet } from './url-alphabet/index.js'
    -let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))
    -let customRandom = (alphabet, defaultSize, getRandom) => {
    -  let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1
    -  let step = -~((1.6 * mask * defaultSize) / alphabet.length)
    -  return (size = defaultSize) => {
    -    let id = ''
    -    while (true) {
    -      let bytes = getRandom(step)
    -      let j = step | 0
    -      while (j--) {
    -        id += alphabet[bytes[j] & mask] || ''
    -        if (id.length === size) return id
    -      }
    -    }
    -  }
    -}
    -let customAlphabet = (alphabet, size = 21) =>
    -  customRandom(alphabet, size, random)
    -let nanoid = (size = 21) =>
    -  crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {
    -    byte &= 63
    -    if (byte < 36) {
    -      id += byte.toString(36)
    -    } else if (byte < 62) {
    -      id += (byte - 26).toString(36).toUpperCase()
    -    } else if (byte > 62) {
    -      id += '-'
    -    } else {
    -      id += '_'
    -    }
    -    return id
    -  }, '')
    -export { nanoid, customAlphabet, customRandom, urlAlphabet, random }
    diff --git a/node_modules/nanoid/index.cjs b/node_modules/nanoid/index.cjs
    deleted file mode 100644
    index c20e374..0000000
    --- a/node_modules/nanoid/index.cjs
    +++ /dev/null
    @@ -1,85 +0,0 @@
    -let crypto = require('crypto')
    -
    -let { urlAlphabet } = require('./url-alphabet/index.cjs')
    -
    -// It is best to make fewer, larger requests to the crypto module to
    -// avoid system call overhead. So, random numbers are generated in a
    -// pool. The pool is a Buffer that is larger than the initial random
    -// request size by this multiplier. The pool is enlarged if subsequent
    -// requests exceed the maximum buffer size.
    -const POOL_SIZE_MULTIPLIER = 128
    -let pool, poolOffset
    -
    -let fillPool = bytes => {
    -  if (!pool || pool.length < bytes) {
    -    pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER)
    -    crypto.randomFillSync(pool)
    -    poolOffset = 0
    -  } else if (poolOffset + bytes > pool.length) {
    -    crypto.randomFillSync(pool)
    -    poolOffset = 0
    -  }
    -  poolOffset += bytes
    -}
    -
    -let random = bytes => {
    -  // `|=` convert `bytes` to number to prevent `valueOf` abusing and pool pollution
    -  fillPool((bytes |= 0))
    -  return pool.subarray(poolOffset - bytes, poolOffset)
    -}
    -
    -let customRandom = (alphabet, defaultSize, getRandom) => {
    -  // First, a bitmask is necessary to generate the ID. The bitmask makes bytes
    -  // values closer to the alphabet size. The bitmask calculates the closest
    -  // `2^31 - 1` number, which exceeds the alphabet size.
    -  // For example, the bitmask for the alphabet size 30 is 31 (00011111).
    -  let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1
    -  // Though, the bitmask solution is not perfect since the bytes exceeding
    -  // the alphabet size are refused. Therefore, to reliably generate the ID,
    -  // the random bytes redundancy has to be satisfied.
    -
    -  // Note: every hardware random generator call is performance expensive,
    -  // because the system call for entropy collection takes a lot of time.
    -  // So, to avoid additional system calls, extra bytes are requested in advance.
    -
    -  // Next, a step determines how many random bytes to generate.
    -  // The number of random bytes gets decided upon the ID size, mask,
    -  // alphabet size, and magic number 1.6 (using 1.6 peaks at performance
    -  // according to benchmarks).
    -  let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length)
    -
    -  return (size = defaultSize) => {
    -    let id = ''
    -    while (true) {
    -      let bytes = getRandom(step)
    -      // A compact alternative for `for (let i = 0; i < step; i++)`.
    -      let i = step
    -      while (i--) {
    -        // Adding `|| ''` refuses a random byte that exceeds the alphabet size.
    -        id += alphabet[bytes[i] & mask] || ''
    -        if (id.length === size) return id
    -      }
    -    }
    -  }
    -}
    -
    -let customAlphabet = (alphabet, size = 21) =>
    -  customRandom(alphabet, size, random)
    -
    -let nanoid = (size = 21) => {
    -  // `|=` convert `size` to number to prevent `valueOf` abusing and pool pollution
    -  fillPool((size |= 0))
    -  let id = ''
    -  // We are reading directly from the random pool to avoid creating new array
    -  for (let i = poolOffset - size; i < poolOffset; i++) {
    -    // It is incorrect to use bytes exceeding the alphabet size.
    -    // The following mask reduces the random byte in the 0-255 value
    -    // range to the 0-63 value range. Therefore, adding hacks, such
    -    // as empty string fallback or magic numbers, is unneccessary because
    -    // the bitmask trims bytes down to the alphabet size.
    -    id += urlAlphabet[pool[i] & 63]
    -  }
    -  return id
    -}
    -
    -module.exports = { nanoid, customAlphabet, customRandom, urlAlphabet, random }
    diff --git a/node_modules/nanoid/index.d.cts b/node_modules/nanoid/index.d.cts
    deleted file mode 100644
    index 3e111a3..0000000
    --- a/node_modules/nanoid/index.d.cts
    +++ /dev/null
    @@ -1,91 +0,0 @@
    -/**
    - * Generate secure URL-friendly unique ID.
    - *
    - * By default, the ID will have 21 symbols to have a collision probability
    - * similar to UUID v4.
    - *
    - * ```js
    - * import { nanoid } from 'nanoid'
    - * model.id = nanoid() //=> "Uakgb_J5m9g-0JDMbcJqL"
    - * ```
    - *
    - * @param size Size of the ID. The default size is 21.
    - * @returns A random string.
    - */
    -export function nanoid(size?: number): string
    -
    -/**
    - * Generate secure unique ID with custom alphabet.
    - *
    - * Alphabet must contain 256 symbols or less. Otherwise, the generator
    - * will not be secure.
    - *
    - * @param alphabet Alphabet used to generate the ID.
    - * @param defaultSize Size of the ID. The default size is 21.
    - * @returns A random string generator.
    - *
    - * ```js
    - * const { customAlphabet } = require('nanoid')
    - * const nanoid = customAlphabet('0123456789абвгдеё', 5)
    - * nanoid() //=> "8ё56а"
    - * ```
    - */
    -export function customAlphabet(
    -  alphabet: string,
    -  defaultSize?: number
    -): (size?: number) => string
    -
    -/**
    - * Generate unique ID with custom random generator and alphabet.
    - *
    - * Alphabet must contain 256 symbols or less. Otherwise, the generator
    - * will not be secure.
    - *
    - * ```js
    - * import { customRandom } from 'nanoid/format'
    - *
    - * const nanoid = customRandom('abcdef', 5, size => {
    - *   const random = []
    - *   for (let i = 0; i < size; i++) {
    - *     random.push(randomByte())
    - *   }
    - *   return random
    - * })
    - *
    - * nanoid() //=> "fbaef"
    - * ```
    - *
    - * @param alphabet Alphabet used to generate a random string.
    - * @param size Size of the random string.
    - * @param random A random bytes generator.
    - * @returns A random string generator.
    - */
    -export function customRandom(
    -  alphabet: string,
    -  size: number,
    -  random: (bytes: number) => Uint8Array
    -): () => string
    -
    -/**
    - * URL safe symbols.
    - *
    - * ```js
    - * import { urlAlphabet } from 'nanoid'
    - * const nanoid = customAlphabet(urlAlphabet, 10)
    - * nanoid() //=> "Uakgb_J5m9"
    - * ```
    - */
    -export const urlAlphabet: string
    -
    -/**
    - * Generate an array of random bytes collected from hardware noise.
    - *
    - * ```js
    - * import { customRandom, random } from 'nanoid'
    - * const nanoid = customRandom("abcdef", 5, random)
    - * ```
    - *
    - * @param bytes Size of the array.
    - * @returns An array of random bytes.
    - */
    -export function random(bytes: number): Uint8Array
    diff --git a/node_modules/nanoid/index.d.ts b/node_modules/nanoid/index.d.ts
    deleted file mode 100644
    index 3e111a3..0000000
    --- a/node_modules/nanoid/index.d.ts
    +++ /dev/null
    @@ -1,91 +0,0 @@
    -/**
    - * Generate secure URL-friendly unique ID.
    - *
    - * By default, the ID will have 21 symbols to have a collision probability
    - * similar to UUID v4.
    - *
    - * ```js
    - * import { nanoid } from 'nanoid'
    - * model.id = nanoid() //=> "Uakgb_J5m9g-0JDMbcJqL"
    - * ```
    - *
    - * @param size Size of the ID. The default size is 21.
    - * @returns A random string.
    - */
    -export function nanoid(size?: number): string
    -
    -/**
    - * Generate secure unique ID with custom alphabet.
    - *
    - * Alphabet must contain 256 symbols or less. Otherwise, the generator
    - * will not be secure.
    - *
    - * @param alphabet Alphabet used to generate the ID.
    - * @param defaultSize Size of the ID. The default size is 21.
    - * @returns A random string generator.
    - *
    - * ```js
    - * const { customAlphabet } = require('nanoid')
    - * const nanoid = customAlphabet('0123456789абвгдеё', 5)
    - * nanoid() //=> "8ё56а"
    - * ```
    - */
    -export function customAlphabet(
    -  alphabet: string,
    -  defaultSize?: number
    -): (size?: number) => string
    -
    -/**
    - * Generate unique ID with custom random generator and alphabet.
    - *
    - * Alphabet must contain 256 symbols or less. Otherwise, the generator
    - * will not be secure.
    - *
    - * ```js
    - * import { customRandom } from 'nanoid/format'
    - *
    - * const nanoid = customRandom('abcdef', 5, size => {
    - *   const random = []
    - *   for (let i = 0; i < size; i++) {
    - *     random.push(randomByte())
    - *   }
    - *   return random
    - * })
    - *
    - * nanoid() //=> "fbaef"
    - * ```
    - *
    - * @param alphabet Alphabet used to generate a random string.
    - * @param size Size of the random string.
    - * @param random A random bytes generator.
    - * @returns A random string generator.
    - */
    -export function customRandom(
    -  alphabet: string,
    -  size: number,
    -  random: (bytes: number) => Uint8Array
    -): () => string
    -
    -/**
    - * URL safe symbols.
    - *
    - * ```js
    - * import { urlAlphabet } from 'nanoid'
    - * const nanoid = customAlphabet(urlAlphabet, 10)
    - * nanoid() //=> "Uakgb_J5m9"
    - * ```
    - */
    -export const urlAlphabet: string
    -
    -/**
    - * Generate an array of random bytes collected from hardware noise.
    - *
    - * ```js
    - * import { customRandom, random } from 'nanoid'
    - * const nanoid = customRandom("abcdef", 5, random)
    - * ```
    - *
    - * @param bytes Size of the array.
    - * @returns An array of random bytes.
    - */
    -export function random(bytes: number): Uint8Array
    diff --git a/node_modules/nanoid/index.js b/node_modules/nanoid/index.js
    deleted file mode 100644
    index 9bc909d..0000000
    --- a/node_modules/nanoid/index.js
    +++ /dev/null
    @@ -1,45 +0,0 @@
    -import crypto from 'crypto'
    -import { urlAlphabet } from './url-alphabet/index.js'
    -const POOL_SIZE_MULTIPLIER = 128
    -let pool, poolOffset
    -let fillPool = bytes => {
    -  if (!pool || pool.length < bytes) {
    -    pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER)
    -    crypto.randomFillSync(pool)
    -    poolOffset = 0
    -  } else if (poolOffset + bytes > pool.length) {
    -    crypto.randomFillSync(pool)
    -    poolOffset = 0
    -  }
    -  poolOffset += bytes
    -}
    -let random = bytes => {
    -  fillPool((bytes |= 0))
    -  return pool.subarray(poolOffset - bytes, poolOffset)
    -}
    -let customRandom = (alphabet, defaultSize, getRandom) => {
    -  let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1
    -  let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length)
    -  return (size = defaultSize) => {
    -    let id = ''
    -    while (true) {
    -      let bytes = getRandom(step)
    -      let i = step
    -      while (i--) {
    -        id += alphabet[bytes[i] & mask] || ''
    -        if (id.length === size) return id
    -      }
    -    }
    -  }
    -}
    -let customAlphabet = (alphabet, size = 21) =>
    -  customRandom(alphabet, size, random)
    -let nanoid = (size = 21) => {
    -  fillPool((size |= 0))
    -  let id = ''
    -  for (let i = poolOffset - size; i < poolOffset; i++) {
    -    id += urlAlphabet[pool[i] & 63]
    -  }
    -  return id
    -}
    -export { nanoid, customAlphabet, customRandom, urlAlphabet, random }
    diff --git a/node_modules/nanoid/nanoid.js b/node_modules/nanoid/nanoid.js
    deleted file mode 100644
    index ec242ea..0000000
    --- a/node_modules/nanoid/nanoid.js
    +++ /dev/null
    @@ -1 +0,0 @@
    -export let nanoid=(t=21)=>crypto.getRandomValues(new Uint8Array(t)).reduce(((t,e)=>t+=(e&=63)<36?e.toString(36):e<62?(e-26).toString(36).toUpperCase():e<63?"_":"-"),"");
    \ No newline at end of file
    diff --git a/node_modules/nanoid/non-secure/index.cjs b/node_modules/nanoid/non-secure/index.cjs
    deleted file mode 100644
    index d51fcb6..0000000
    --- a/node_modules/nanoid/non-secure/index.cjs
    +++ /dev/null
    @@ -1,34 +0,0 @@
    -// This alphabet uses `A-Za-z0-9_-` symbols.
    -// The order of characters is optimized for better gzip and brotli compression.
    -// References to the same file (works both for gzip and brotli):
    -// `'use`, `andom`, and `rict'`
    -// References to the brotli default dictionary:
    -// `-26T`, `1983`, `40px`, `75px`, `bush`, `jack`, `mind`, `very`, and `wolf`
    -let urlAlphabet =
    -  'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'
    -
    -let customAlphabet = (alphabet, defaultSize = 21) => {
    -  return (size = defaultSize) => {
    -    let id = ''
    -    // A compact alternative for `for (var i = 0; i < step; i++)`.
    -    let i = size | 0
    -    while (i--) {
    -      // `| 0` is more compact and faster than `Math.floor()`.
    -      id += alphabet[(Math.random() * alphabet.length) | 0]
    -    }
    -    return id
    -  }
    -}
    -
    -let nanoid = (size = 21) => {
    -  let id = ''
    -  // A compact alternative for `for (var i = 0; i < step; i++)`.
    -  let i = size | 0
    -  while (i--) {
    -    // `| 0` is more compact and faster than `Math.floor()`.
    -    id += urlAlphabet[(Math.random() * 64) | 0]
    -  }
    -  return id
    -}
    -
    -module.exports = { nanoid, customAlphabet }
    diff --git a/node_modules/nanoid/non-secure/index.d.ts b/node_modules/nanoid/non-secure/index.d.ts
    deleted file mode 100644
    index 4965322..0000000
    --- a/node_modules/nanoid/non-secure/index.d.ts
    +++ /dev/null
    @@ -1,33 +0,0 @@
    -/**
    - * Generate URL-friendly unique ID. This method uses the non-secure
    - * predictable random generator with bigger collision probability.
    - *
    - * ```js
    - * import { nanoid } from 'nanoid/non-secure'
    - * model.id = nanoid() //=> "Uakgb_J5m9g-0JDMbcJqL"
    - * ```
    - *
    - * @param size Size of the ID. The default size is 21.
    - * @returns A random string.
    - */
    -export function nanoid(size?: number): string
    -
    -/**
    - * Generate a unique ID based on a custom alphabet.
    - * This method uses the non-secure predictable random generator
    - * with bigger collision probability.
    - *
    - * @param alphabet Alphabet used to generate the ID.
    - * @param defaultSize Size of the ID. The default size is 21.
    - * @returns A random string generator.
    - *
    - * ```js
    - * import { customAlphabet } from 'nanoid/non-secure'
    - * const nanoid = customAlphabet('0123456789абвгдеё', 5)
    - * model.id = //=> "8ё56а"
    - * ```
    - */
    -export function customAlphabet(
    -  alphabet: string,
    -  defaultSize?: number
    -): (size?: number) => string
    diff --git a/node_modules/nanoid/non-secure/index.js b/node_modules/nanoid/non-secure/index.js
    deleted file mode 100644
    index 2ea5827..0000000
    --- a/node_modules/nanoid/non-secure/index.js
    +++ /dev/null
    @@ -1,21 +0,0 @@
    -let urlAlphabet =
    -  'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'
    -let customAlphabet = (alphabet, defaultSize = 21) => {
    -  return (size = defaultSize) => {
    -    let id = ''
    -    let i = size | 0
    -    while (i--) {
    -      id += alphabet[(Math.random() * alphabet.length) | 0]
    -    }
    -    return id
    -  }
    -}
    -let nanoid = (size = 21) => {
    -  let id = ''
    -  let i = size | 0
    -  while (i--) {
    -    id += urlAlphabet[(Math.random() * 64) | 0]
    -  }
    -  return id
    -}
    -export { nanoid, customAlphabet }
    diff --git a/node_modules/nanoid/non-secure/package.json b/node_modules/nanoid/non-secure/package.json
    deleted file mode 100644
    index 9930d6a..0000000
    --- a/node_modules/nanoid/non-secure/package.json
    +++ /dev/null
    @@ -1,6 +0,0 @@
    -{
    -  "type": "module",
    -  "main": "index.cjs",
    -  "module": "index.js",
    -  "react-native": "index.js"
    -}
    \ No newline at end of file
    diff --git a/node_modules/nanoid/package.json b/node_modules/nanoid/package.json
    deleted file mode 100644
    index a3d3f44..0000000
    --- a/node_modules/nanoid/package.json
    +++ /dev/null
    @@ -1,89 +0,0 @@
    -{
    -  "name": "nanoid",
    -  "version": "3.3.11",
    -  "description": "A tiny (116 bytes), secure URL-friendly unique string ID generator",
    -  "keywords": [
    -    "uuid",
    -    "random",
    -    "id",
    -    "url"
    -  ],
    -  "engines": {
    -    "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
    -  },
    -  "funding": [
    -    {
    -      "type": "github",
    -      "url": "https://github.com/sponsors/ai"
    -    }
    -  ],
    -  "author": "Andrey Sitnik ",
    -  "license": "MIT",
    -  "repository": "ai/nanoid",
    -  "browser": {
    -    "./index.js": "./index.browser.js",
    -    "./async/index.js": "./async/index.browser.js",
    -    "./async/index.cjs": "./async/index.browser.cjs",
    -    "./index.cjs": "./index.browser.cjs"
    -  },
    -  "react-native": "index.js",
    -  "bin": "./bin/nanoid.cjs",
    -  "sideEffects": false,
    -  "types": "./index.d.ts",
    -  "type": "module",
    -  "main": "index.cjs",
    -  "module": "index.js",
    -  "exports": {
    -    ".": {
    -      "react-native": "./index.browser.js",
    -      "browser": "./index.browser.js",
    -      "require": {
    -        "types": "./index.d.cts",
    -        "default": "./index.cjs"
    -      },
    -      "import": {
    -        "types": "./index.d.ts",
    -        "default": "./index.js"
    -      },
    -      "default": "./index.js"
    -    },
    -    "./package.json": "./package.json",
    -    "./async/package.json": "./async/package.json",
    -    "./async": {
    -      "browser": "./async/index.browser.js",
    -      "require": {
    -        "types": "./index.d.cts",
    -        "default": "./async/index.cjs"
    -      },
    -      "import": {
    -        "types": "./index.d.ts",
    -        "default": "./async/index.js"
    -      },
    -      "default": "./async/index.js"
    -    },
    -    "./non-secure/package.json": "./non-secure/package.json",
    -    "./non-secure": {
    -      "require": {
    -        "types": "./index.d.cts",
    -        "default": "./non-secure/index.cjs"
    -      },
    -      "import": {
    -        "types": "./index.d.ts",
    -        "default": "./non-secure/index.js"
    -      },
    -      "default": "./non-secure/index.js"
    -    },
    -    "./url-alphabet/package.json": "./url-alphabet/package.json",
    -    "./url-alphabet": {
    -      "require": {
    -        "types": "./index.d.cts",
    -        "default": "./url-alphabet/index.cjs"
    -      },
    -      "import": {
    -        "types": "./index.d.ts",
    -        "default": "./url-alphabet/index.js"
    -      },
    -      "default": "./url-alphabet/index.js"
    -    }
    -  }
    -}
    diff --git a/node_modules/nanoid/url-alphabet/index.cjs b/node_modules/nanoid/url-alphabet/index.cjs
    deleted file mode 100644
    index a332f0b..0000000
    --- a/node_modules/nanoid/url-alphabet/index.cjs
    +++ /dev/null
    @@ -1,7 +0,0 @@
    -// This alphabet uses `A-Za-z0-9_-` symbols.
    -// The order of characters is optimized for better gzip and brotli compression.
    -// Same as in non-secure/index.js
    -let urlAlphabet =
    -  'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'
    -
    -module.exports = { urlAlphabet }
    diff --git a/node_modules/nanoid/url-alphabet/index.js b/node_modules/nanoid/url-alphabet/index.js
    deleted file mode 100644
    index c2782e5..0000000
    --- a/node_modules/nanoid/url-alphabet/index.js
    +++ /dev/null
    @@ -1,3 +0,0 @@
    -let urlAlphabet =
    -  'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'
    -export { urlAlphabet }
    diff --git a/node_modules/nanoid/url-alphabet/package.json b/node_modules/nanoid/url-alphabet/package.json
    deleted file mode 100644
    index 9930d6a..0000000
    --- a/node_modules/nanoid/url-alphabet/package.json
    +++ /dev/null
    @@ -1,6 +0,0 @@
    -{
    -  "type": "module",
    -  "main": "index.cjs",
    -  "module": "index.js",
    -  "react-native": "index.js"
    -}
    \ No newline at end of file
    diff --git a/node_modules/normalize-path/LICENSE b/node_modules/normalize-path/LICENSE
    deleted file mode 100644
    index d32ab44..0000000
    --- a/node_modules/normalize-path/LICENSE
    +++ /dev/null
    @@ -1,21 +0,0 @@
    -The MIT License (MIT)
    -
    -Copyright (c) 2014-2018, Jon Schlinkert.
    -
    -Permission is hereby granted, free of charge, to any person obtaining a copy
    -of this software and associated documentation files (the "Software"), to deal
    -in the Software without restriction, including without limitation the rights
    -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    -copies of the Software, and to permit persons to whom the Software is
    -furnished to do so, subject to the following conditions:
    -
    -The above copyright notice and this permission notice shall be included in
    -all copies or substantial portions of the Software.
    -
    -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    -THE SOFTWARE.
    diff --git a/node_modules/normalize-path/README.md b/node_modules/normalize-path/README.md
    deleted file mode 100644
    index 726d4d6..0000000
    --- a/node_modules/normalize-path/README.md
    +++ /dev/null
    @@ -1,127 +0,0 @@
    -# normalize-path [![NPM version](https://img.shields.io/npm/v/normalize-path.svg?style=flat)](https://www.npmjs.com/package/normalize-path) [![NPM monthly downloads](https://img.shields.io/npm/dm/normalize-path.svg?style=flat)](https://npmjs.org/package/normalize-path) [![NPM total downloads](https://img.shields.io/npm/dt/normalize-path.svg?style=flat)](https://npmjs.org/package/normalize-path) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/normalize-path.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/normalize-path)
    -
    -> Normalize slashes in a file path to be posix/unix-like forward slashes. Also condenses repeat slashes to a single slash and removes and trailing slashes, unless disabled.
    -
    -Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support.
    -
    -## Install
    -
    -Install with [npm](https://www.npmjs.com/):
    -
    -```sh
    -$ npm install --save normalize-path
    -```
    -
    -## Usage
    -
    -```js
    -const normalize = require('normalize-path');
    -
    -console.log(normalize('\\foo\\bar\\baz\\')); 
    -//=> '/foo/bar/baz'
    -```
    -
    -**win32 namespaces**
    -
    -```js
    -console.log(normalize('\\\\?\\UNC\\Server01\\user\\docs\\Letter.txt')); 
    -//=> '//?/UNC/Server01/user/docs/Letter.txt'
    -
    -console.log(normalize('\\\\.\\CdRomX')); 
    -//=> '//./CdRomX'
    -```
    -
    -**Consecutive slashes**
    -
    -Condenses multiple consecutive forward slashes (except for leading slashes in win32 namespaces) to a single slash.
    -
    -```js
    -console.log(normalize('.//foo//bar///////baz/')); 
    -//=> './foo/bar/baz'
    -```
    -
    -### Trailing slashes
    -
    -By default trailing slashes are removed. Pass `false` as the last argument to disable this behavior and _**keep** trailing slashes_:
    -
    -```js
    -console.log(normalize('foo\\bar\\baz\\', false)); //=> 'foo/bar/baz/'
    -console.log(normalize('./foo/bar/baz/', false)); //=> './foo/bar/baz/'
    -```
    -
    -## Release history
    -
    -### v3.0
    -
    -No breaking changes in this release.
    -
    -* a check was added to ensure that [win32 namespaces](https://msdn.microsoft.com/library/windows/desktop/aa365247(v=vs.85).aspx#namespaces) are handled properly by win32 `path.parse()` after a path has been normalized by this library.
    -* a minor optimization was made to simplify how the trailing separator was handled
    -
    -## About
    -
    -
    -Contributing - -Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). - -
    - -
    -Running Tests - -Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: - -```sh -$ npm install && npm test -``` - -
    - -
    -Building docs - -_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ - -To generate the readme, run the following command: - -```sh -$ npm install -g verbose/verb#dev verb-generate-readme && verb -``` - -
    - -### Related projects - -Other useful path-related libraries: - -* [contains-path](https://www.npmjs.com/package/contains-path): Return true if a file path contains the given path. | [homepage](https://github.com/jonschlinkert/contains-path "Return true if a file path contains the given path.") -* [is-absolute](https://www.npmjs.com/package/is-absolute): Returns true if a file path is absolute. Does not rely on the path module… [more](https://github.com/jonschlinkert/is-absolute) | [homepage](https://github.com/jonschlinkert/is-absolute "Returns true if a file path is absolute. Does not rely on the path module and can be used as a polyfill for node.js native `path.isAbolute`.") -* [is-relative](https://www.npmjs.com/package/is-relative): Returns `true` if the path appears to be relative. | [homepage](https://github.com/jonschlinkert/is-relative "Returns `true` if the path appears to be relative.") -* [parse-filepath](https://www.npmjs.com/package/parse-filepath): Pollyfill for node.js `path.parse`, parses a filepath into an object. | [homepage](https://github.com/jonschlinkert/parse-filepath "Pollyfill for node.js `path.parse`, parses a filepath into an object.") -* [path-ends-with](https://www.npmjs.com/package/path-ends-with): Return `true` if a file path ends with the given string/suffix. | [homepage](https://github.com/jonschlinkert/path-ends-with "Return `true` if a file path ends with the given string/suffix.") -* [unixify](https://www.npmjs.com/package/unixify): Convert Windows file paths to unix paths. | [homepage](https://github.com/jonschlinkert/unixify "Convert Windows file paths to unix paths.") - -### Contributors - -| **Commits** | **Contributor** | -| --- | --- | -| 35 | [jonschlinkert](https://github.com/jonschlinkert) | -| 1 | [phated](https://github.com/phated) | - -### Author - -**Jon Schlinkert** - -* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) -* [GitHub Profile](https://github.com/jonschlinkert) -* [Twitter Profile](https://twitter.com/jonschlinkert) - -### License - -Copyright © 2018, [Jon Schlinkert](https://github.com/jonschlinkert). -Released under the [MIT License](LICENSE). - -*** - -_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on April 19, 2018._ \ No newline at end of file diff --git a/node_modules/normalize-path/index.js b/node_modules/normalize-path/index.js deleted file mode 100644 index 6fac553..0000000 --- a/node_modules/normalize-path/index.js +++ /dev/null @@ -1,35 +0,0 @@ -/*! - * normalize-path - * - * Copyright (c) 2014-2018, Jon Schlinkert. - * Released under the MIT License. - */ - -module.exports = function(path, stripTrailing) { - if (typeof path !== 'string') { - throw new TypeError('expected path to be a string'); - } - - if (path === '\\' || path === '/') return '/'; - - var len = path.length; - if (len <= 1) return path; - - // ensure that win32 namespaces has two leading slashes, so that the path is - // handled properly by the win32 version of path.parse() after being normalized - // https://msdn.microsoft.com/library/windows/desktop/aa365247(v=vs.85).aspx#namespaces - var prefix = ''; - if (len > 4 && path[3] === '\\') { - var ch = path[2]; - if ((ch === '?' || ch === '.') && path.slice(0, 2) === '\\\\') { - path = path.slice(2); - prefix = '//'; - } - } - - var segs = path.split(/[/\\]+/); - if (stripTrailing !== false && segs[segs.length - 1] === '') { - segs.pop(); - } - return prefix + segs.join('/'); -}; diff --git a/node_modules/normalize-path/package.json b/node_modules/normalize-path/package.json deleted file mode 100644 index ad61098..0000000 --- a/node_modules/normalize-path/package.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "name": "normalize-path", - "description": "Normalize slashes in a file path to be posix/unix-like forward slashes. Also condenses repeat slashes to a single slash and removes and trailing slashes, unless disabled.", - "version": "3.0.0", - "homepage": "https://github.com/jonschlinkert/normalize-path", - "author": "Jon Schlinkert (https://github.com/jonschlinkert)", - "contributors": [ - "Blaine Bublitz (https://twitter.com/BlaineBublitz)", - "Jon Schlinkert (http://twitter.com/jonschlinkert)" - ], - "repository": "jonschlinkert/normalize-path", - "bugs": { - "url": "https://github.com/jonschlinkert/normalize-path/issues" - }, - "license": "MIT", - "files": [ - "index.js" - ], - "main": "index.js", - "engines": { - "node": ">=0.10.0" - }, - "scripts": { - "test": "mocha" - }, - "devDependencies": { - "gulp-format-md": "^1.0.0", - "minimist": "^1.2.0", - "mocha": "^3.5.3" - }, - "keywords": [ - "absolute", - "backslash", - "delimiter", - "file", - "file-path", - "filepath", - "fix", - "forward", - "fp", - "fs", - "normalize", - "path", - "relative", - "separator", - "slash", - "slashes", - "trailing", - "unix", - "urix" - ], - "verb": { - "toc": false, - "layout": "default", - "tasks": [ - "readme" - ], - "plugins": [ - "gulp-format-md" - ], - "related": { - "description": "Other useful path-related libraries:", - "list": [ - "contains-path", - "is-absolute", - "is-relative", - "parse-filepath", - "path-ends-with", - "path-ends-with", - "unixify" - ] - }, - "lint": { - "reflinks": true - } - } -} diff --git a/node_modules/object-assign/index.js b/node_modules/object-assign/index.js deleted file mode 100644 index 0930cf8..0000000 --- a/node_modules/object-assign/index.js +++ /dev/null @@ -1,90 +0,0 @@ -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ - -'use strict'; -/* eslint-disable no-unused-vars */ -var getOwnPropertySymbols = Object.getOwnPropertySymbols; -var hasOwnProperty = Object.prototype.hasOwnProperty; -var propIsEnumerable = Object.prototype.propertyIsEnumerable; - -function toObject(val) { - if (val === null || val === undefined) { - throw new TypeError('Object.assign cannot be called with null or undefined'); - } - - return Object(val); -} - -function shouldUseNative() { - try { - if (!Object.assign) { - return false; - } - - // Detect buggy property enumeration order in older V8 versions. - - // https://bugs.chromium.org/p/v8/issues/detail?id=4118 - var test1 = new String('abc'); // eslint-disable-line no-new-wrappers - test1[5] = 'de'; - if (Object.getOwnPropertyNames(test1)[0] === '5') { - return false; - } - - // https://bugs.chromium.org/p/v8/issues/detail?id=3056 - var test2 = {}; - for (var i = 0; i < 10; i++) { - test2['_' + String.fromCharCode(i)] = i; - } - var order2 = Object.getOwnPropertyNames(test2).map(function (n) { - return test2[n]; - }); - if (order2.join('') !== '0123456789') { - return false; - } - - // https://bugs.chromium.org/p/v8/issues/detail?id=3056 - var test3 = {}; - 'abcdefghijklmnopqrst'.split('').forEach(function (letter) { - test3[letter] = letter; - }); - if (Object.keys(Object.assign({}, test3)).join('') !== - 'abcdefghijklmnopqrst') { - return false; - } - - return true; - } catch (err) { - // We don't expect any of the above to throw, but better to be safe. - return false; - } -} - -module.exports = shouldUseNative() ? Object.assign : function (target, source) { - var from; - var to = toObject(target); - var symbols; - - for (var s = 1; s < arguments.length; s++) { - from = Object(arguments[s]); - - for (var key in from) { - if (hasOwnProperty.call(from, key)) { - to[key] = from[key]; - } - } - - if (getOwnPropertySymbols) { - symbols = getOwnPropertySymbols(from); - for (var i = 0; i < symbols.length; i++) { - if (propIsEnumerable.call(from, symbols[i])) { - to[symbols[i]] = from[symbols[i]]; - } - } - } - } - - return to; -}; diff --git a/node_modules/object-assign/license b/node_modules/object-assign/license deleted file mode 100644 index 654d0bf..0000000 --- a/node_modules/object-assign/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/node_modules/object-assign/package.json b/node_modules/object-assign/package.json deleted file mode 100644 index 503eb1e..0000000 --- a/node_modules/object-assign/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "object-assign", - "version": "4.1.1", - "description": "ES2015 `Object.assign()` ponyfill", - "license": "MIT", - "repository": "sindresorhus/object-assign", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=0.10.0" - }, - "scripts": { - "test": "xo && ava", - "bench": "matcha bench.js" - }, - "files": [ - "index.js" - ], - "keywords": [ - "object", - "assign", - "extend", - "properties", - "es2015", - "ecmascript", - "harmony", - "ponyfill", - "prollyfill", - "polyfill", - "shim", - "browser" - ], - "devDependencies": { - "ava": "^0.16.0", - "lodash": "^4.16.4", - "matcha": "^0.7.0", - "xo": "^0.16.0" - } -} diff --git a/node_modules/object-assign/readme.md b/node_modules/object-assign/readme.md deleted file mode 100644 index 1be09d3..0000000 --- a/node_modules/object-assign/readme.md +++ /dev/null @@ -1,61 +0,0 @@ -# object-assign [![Build Status](https://travis-ci.org/sindresorhus/object-assign.svg?branch=master)](https://travis-ci.org/sindresorhus/object-assign) - -> ES2015 [`Object.assign()`](http://www.2ality.com/2014/01/object-assign.html) [ponyfill](https://ponyfill.com) - - -## Use the built-in - -Node.js 4 and up, as well as every evergreen browser (Chrome, Edge, Firefox, Opera, Safari), -support `Object.assign()` :tada:. If you target only those environments, then by all -means, use `Object.assign()` instead of this package. - - -## Install - -``` -$ npm install --save object-assign -``` - - -## Usage - -```js -const objectAssign = require('object-assign'); - -objectAssign({foo: 0}, {bar: 1}); -//=> {foo: 0, bar: 1} - -// multiple sources -objectAssign({foo: 0}, {bar: 1}, {baz: 2}); -//=> {foo: 0, bar: 1, baz: 2} - -// overwrites equal keys -objectAssign({foo: 0}, {foo: 1}, {foo: 2}); -//=> {foo: 2} - -// ignores null and undefined sources -objectAssign({foo: 0}, null, {bar: 1}, undefined); -//=> {foo: 0, bar: 1} -``` - - -## API - -### objectAssign(target, [source, ...]) - -Assigns enumerable own properties of `source` objects to the `target` object and returns the `target` object. Additional `source` objects will overwrite previous ones. - - -## Resources - -- [ES2015 spec - Object.assign](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign) - - -## Related - -- [deep-assign](https://github.com/sindresorhus/deep-assign) - Recursive `Object.assign()` - - -## License - -MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/object-hash/LICENSE b/node_modules/object-hash/LICENSE deleted file mode 100644 index 6ea185f..0000000 --- a/node_modules/object-hash/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 object-hash contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/node_modules/object-hash/dist/object_hash.js b/node_modules/object-hash/dist/object_hash.js deleted file mode 100644 index 2e584c5..0000000 --- a/node_modules/object-hash/dist/object_hash.js +++ /dev/null @@ -1 +0,0 @@ -!function(e){var t;"object"==typeof exports?module.exports=e():"function"==typeof define&&define.amd?define(e):("undefined"!=typeof window?t=window:"undefined"!=typeof global?t=global:"undefined"!=typeof self&&(t=self),t.objectHash=e())}(function(){return function r(o,i,u){function s(n,e){if(!i[n]){if(!o[n]){var t="function"==typeof require&&require;if(!e&&t)return t(n,!0);if(a)return a(n,!0);throw new Error("Cannot find module '"+n+"'")}e=i[n]={exports:{}};o[n][0].call(e.exports,function(e){var t=o[n][1][e];return s(t||e)},e,e.exports,r,o,i,u)}return i[n].exports}for(var a="function"==typeof require&&require,e=0;e>16),s((65280&n)>>8),s(255&n);return 2==r?s(255&(n=f(e.charAt(t))<<2|f(e.charAt(t+1))>>4)):1==r&&(s((n=f(e.charAt(t))<<10|f(e.charAt(t+1))<<4|f(e.charAt(t+2))>>2)>>8&255),s(255&n)),o},e.fromByteArray=function(e){var t,n,r,o,i=e.length%3,u="";function s(e){return"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(e)}for(t=0,r=e.length-i;t>18&63)+s(o>>12&63)+s(o>>6&63)+s(63&o);switch(i){case 1:u=(u+=s((n=e[e.length-1])>>2))+s(n<<4&63)+"==";break;case 2:u=(u=(u+=s((n=(e[e.length-2]<<8)+e[e.length-1])>>10))+s(n>>4&63))+s(n<<2&63)+"="}return u}}(void 0===f?this.base64js={}:f)}.call(this,e("lYpoI2"),"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},e("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/base64-js/lib/b64.js","/node_modules/gulp-browserify/node_modules/base64-js/lib")},{buffer:3,lYpoI2:11}],3:[function(O,e,H){!function(e,n,f,r,h,p,g,y,w){var a=O("base64-js"),i=O("ieee754");function f(e,t,n){if(!(this instanceof f))return new f(e,t,n);var r,o,i,u,s=typeof e;if("base64"===t&&"string"==s)for(e=(u=e).trim?u.trim():u.replace(/^\s+|\s+$/g,"");e.length%4!=0;)e+="=";if("number"==s)r=j(e);else if("string"==s)r=f.byteLength(e,t);else{if("object"!=s)throw new Error("First argument needs to be a number, array or string.");r=j(e.length)}if(f._useTypedArrays?o=f._augment(new Uint8Array(r)):((o=this).length=r,o._isBuffer=!0),f._useTypedArrays&&"number"==typeof e.byteLength)o._set(e);else if(C(u=e)||f.isBuffer(u)||u&&"object"==typeof u&&"number"==typeof u.length)for(i=0;i>8,n=n%256,r.push(n),r.push(t);return r}(t),e,n,r)}function v(e,t,n){var r="";n=Math.min(e.length,n);for(var o=t;o>>0)):(t+1>>0),o}function _(e,t,n,r){if(r||(d("boolean"==typeof n,"missing or invalid endian"),d(null!=t,"missing offset"),d(t+1>>8*(r?i:1-i)}function l(e,t,n,r,o){o||(d(null!=t,"missing value"),d("boolean"==typeof r,"missing or invalid endian"),d(null!=n,"missing offset"),d(n+3>>8*(r?i:3-i)&255}function B(e,t,n,r,o){o||(d(null!=t,"missing value"),d("boolean"==typeof r,"missing or invalid endian"),d(null!=n,"missing offset"),d(n+1this.length&&(r=this.length);var o=(r=e.length-t=this.length))return this[e]},f.prototype.readUInt16LE=function(e,t){return o(this,e,!0,t)},f.prototype.readUInt16BE=function(e,t){return o(this,e,!1,t)},f.prototype.readUInt32LE=function(e,t){return u(this,e,!0,t)},f.prototype.readUInt32BE=function(e,t){return u(this,e,!1,t)},f.prototype.readInt8=function(e,t){if(t||(d(null!=e,"missing offset"),d(e=this.length))return 128&this[e]?-1*(255-this[e]+1):this[e]},f.prototype.readInt16LE=function(e,t){return _(this,e,!0,t)},f.prototype.readInt16BE=function(e,t){return _(this,e,!1,t)},f.prototype.readInt32LE=function(e,t){return E(this,e,!0,t)},f.prototype.readInt32BE=function(e,t){return E(this,e,!1,t)},f.prototype.readFloatLE=function(e,t){return I(this,e,!0,t)},f.prototype.readFloatBE=function(e,t){return I(this,e,!1,t)},f.prototype.readDoubleLE=function(e,t){return A(this,e,!0,t)},f.prototype.readDoubleBE=function(e,t){return A(this,e,!1,t)},f.prototype.writeUInt8=function(e,t,n){n||(d(null!=e,"missing value"),d(null!=t,"missing offset"),d(t=this.length||(this[t]=e)},f.prototype.writeUInt16LE=function(e,t,n){s(this,e,t,!0,n)},f.prototype.writeUInt16BE=function(e,t,n){s(this,e,t,!1,n)},f.prototype.writeUInt32LE=function(e,t,n){l(this,e,t,!0,n)},f.prototype.writeUInt32BE=function(e,t,n){l(this,e,t,!1,n)},f.prototype.writeInt8=function(e,t,n){n||(d(null!=e,"missing value"),d(null!=t,"missing offset"),d(t=this.length||(0<=e?this.writeUInt8(e,t,n):this.writeUInt8(255+e+1,t,n))},f.prototype.writeInt16LE=function(e,t,n){B(this,e,t,!0,n)},f.prototype.writeInt16BE=function(e,t,n){B(this,e,t,!1,n)},f.prototype.writeInt32LE=function(e,t,n){L(this,e,t,!0,n)},f.prototype.writeInt32BE=function(e,t,n){L(this,e,t,!1,n)},f.prototype.writeFloatLE=function(e,t,n){U(this,e,t,!0,n)},f.prototype.writeFloatBE=function(e,t,n){U(this,e,t,!1,n)},f.prototype.writeDoubleLE=function(e,t,n){x(this,e,t,!0,n)},f.prototype.writeDoubleBE=function(e,t,n){x(this,e,t,!1,n)},f.prototype.fill=function(e,t,n){if(t=t||0,n=n||this.length,d("number"==typeof(e="string"==typeof(e=e||0)?e.charCodeAt(0):e)&&!isNaN(e),"value is not a number"),d(t<=n,"end < start"),n!==t&&0!==this.length){d(0<=t&&t"},f.prototype.toArrayBuffer=function(){if("undefined"==typeof Uint8Array)throw new Error("Buffer.toArrayBuffer not supported in this browser");if(f._useTypedArrays)return new f(this).buffer;for(var e=new Uint8Array(this.length),t=0,n=e.length;t=t.length||o>=e.length);o++)t[o+n]=e[o];return o}function N(e){try{return decodeURIComponent(e)}catch(e){return String.fromCharCode(65533)}}function Y(e,t){d("number"==typeof e,"cannot write a non-number as a number"),d(0<=e,"specified a negative value for writing an unsigned value"),d(e<=t,"value is larger than maximum value for type"),d(Math.floor(e)===e,"value has a fractional component")}function F(e,t,n){d("number"==typeof e,"cannot write a non-number as a number"),d(e<=t,"value larger than maximum allowed value"),d(n<=e,"value smaller than minimum allowed value"),d(Math.floor(e)===e,"value has a fractional component")}function D(e,t,n){d("number"==typeof e,"cannot write a non-number as a number"),d(e<=t,"value larger than maximum allowed value"),d(n<=e,"value smaller than minimum allowed value")}function d(e,t){if(!e)throw new Error(t||"Failed assertion")}f._augment=function(e){return e._isBuffer=!0,e._get=e.get,e._set=e.set,e.get=t.get,e.set=t.set,e.write=t.write,e.toString=t.toString,e.toLocaleString=t.toString,e.toJSON=t.toJSON,e.copy=t.copy,e.slice=t.slice,e.readUInt8=t.readUInt8,e.readUInt16LE=t.readUInt16LE,e.readUInt16BE=t.readUInt16BE,e.readUInt32LE=t.readUInt32LE,e.readUInt32BE=t.readUInt32BE,e.readInt8=t.readInt8,e.readInt16LE=t.readInt16LE,e.readInt16BE=t.readInt16BE,e.readInt32LE=t.readInt32LE,e.readInt32BE=t.readInt32BE,e.readFloatLE=t.readFloatLE,e.readFloatBE=t.readFloatBE,e.readDoubleLE=t.readDoubleLE,e.readDoubleBE=t.readDoubleBE,e.writeUInt8=t.writeUInt8,e.writeUInt16LE=t.writeUInt16LE,e.writeUInt16BE=t.writeUInt16BE,e.writeUInt32LE=t.writeUInt32LE,e.writeUInt32BE=t.writeUInt32BE,e.writeInt8=t.writeInt8,e.writeInt16LE=t.writeInt16LE,e.writeInt16BE=t.writeInt16BE,e.writeInt32LE=t.writeInt32LE,e.writeInt32BE=t.writeInt32BE,e.writeFloatLE=t.writeFloatLE,e.writeFloatBE=t.writeFloatBE,e.writeDoubleLE=t.writeDoubleLE,e.writeDoubleBE=t.writeDoubleBE,e.fill=t.fill,e.inspect=t.inspect,e.toArrayBuffer=t.toArrayBuffer,e}}.call(this,O("lYpoI2"),"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},O("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/buffer/index.js","/node_modules/gulp-browserify/node_modules/buffer")},{"base64-js":2,buffer:3,ieee754:10,lYpoI2:11}],4:[function(c,d,e){!function(e,t,a,n,r,o,i,u,s){var a=c("buffer").Buffer,f=4,l=new a(f);l.fill(0);d.exports={hash:function(e,t,n,r){for(var o=t(function(e,t){e.length%f!=0&&(n=e.length+(f-e.length%f),e=a.concat([e,l],n));for(var n,r=[],o=t?e.readInt32BE:e.readInt32LE,i=0;is?t=e(t):t.length>5]|=128<>>9<<4)]=t;for(var n=1732584193,r=-271733879,o=-1732584194,i=271733878,u=0;u>>32-o,n)}function c(e,t,n,r,o,i,u){return s(t&n|~t&r,e,t,o,i,u)}function d(e,t,n,r,o,i,u){return s(t&r|n&~r,e,t,o,i,u)}function h(e,t,n,r,o,i,u){return s(t^n^r,e,t,o,i,u)}function p(e,t,n,r,o,i,u){return s(n^(t|~r),e,t,o,i,u)}function g(e,t){var n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}b.exports=function(e){return t.hash(e,n,16)}}.call(this,w("lYpoI2"),"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},w("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/crypto-browserify/md5.js","/node_modules/gulp-browserify/node_modules/crypto-browserify")},{"./helpers":4,buffer:3,lYpoI2:11}],7:[function(e,l,t){!function(e,t,n,r,o,i,u,s,f){var a;l.exports=a||function(e){for(var t,n=new Array(e),r=0;r>>((3&r)<<3)&255;return n}}.call(this,e("lYpoI2"),"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},e("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/crypto-browserify/rng.js","/node_modules/gulp-browserify/node_modules/crypto-browserify")},{buffer:3,lYpoI2:11}],8:[function(c,d,e){!function(e,t,n,r,o,s,a,f,l){var i=c("./helpers");function u(l,c){l[c>>5]|=128<<24-c%32,l[15+(c+64>>9<<4)]=c;for(var e,t,n,r=Array(80),o=1732584193,i=-271733879,u=-1732584194,s=271733878,d=-1009589776,h=0;h>16)+(t>>16)+(n>>16)<<16|65535&n}function v(e,t){return e<>>32-t}d.exports=function(e){return i.hash(e,u,20,!0)}}.call(this,c("lYpoI2"),"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},c("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/crypto-browserify/sha.js","/node_modules/gulp-browserify/node_modules/crypto-browserify")},{"./helpers":4,buffer:3,lYpoI2:11}],9:[function(c,d,e){!function(e,t,n,r,u,s,a,f,l){function b(e,t){var n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}function o(e,l){var c,d=new Array(1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298),t=new Array(1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225),n=new Array(64);e[l>>5]|=128<<24-l%32,e[15+(l+64>>9<<4)]=l;for(var r,o,h=0;h>>t|e<<32-t},v=function(e,t){return e>>>t};d.exports=function(e){return i.hash(e,o,32,!0)}}.call(this,c("lYpoI2"),"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},c("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/crypto-browserify/sha256.js","/node_modules/gulp-browserify/node_modules/crypto-browserify")},{"./helpers":4,buffer:3,lYpoI2:11}],10:[function(e,t,f){!function(e,t,n,r,o,i,u,s,a){f.read=function(e,t,n,r,o){var i,u,l=8*o-r-1,c=(1<>1,s=-7,a=n?o-1:0,f=n?-1:1,o=e[t+a];for(a+=f,i=o&(1<<-s)-1,o>>=-s,s+=l;0>=-s,s+=r;0>1,d=23===r?Math.pow(2,-24)-Math.pow(2,-77):0,f=n?0:c-1,h=n?1:-1,c=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(i=isNaN(t)?1:0,o=s):(o=Math.floor(Math.log(t)/Math.LN2),t*(n=Math.pow(2,-o))<1&&(o--,n*=2),2<=(t+=1<=o+a?d/n:d*Math.pow(2,1-a))*n&&(o++,n/=2),s<=o+a?(i=0,o=s):1<=o+a?(i=(t*n-1)*Math.pow(2,r),o+=a):(i=t*Math.pow(2,a-1)*Math.pow(2,r),o=0));8<=r;e[l+f]=255&i,f+=h,i/=256,r-=8);for(o=o<", type, " -> ", "_" + type); - - return this['_' + type](value); - }, - _object: function(object) { - var pattern = (/\[object (.*)\]/i); - var objString = Object.prototype.toString.call(object); - var objType = pattern.exec(objString); - if (!objType) { // object type did not match [object ...] - objType = 'unknown:[' + objString + ']'; - } else { - objType = objType[1]; // take only the class name - } - - objType = objType.toLowerCase(); - - var objectNumber = null; - - if ((objectNumber = context.indexOf(object)) >= 0) { - return this.dispatch('[CIRCULAR:' + objectNumber + ']'); - } else { - context.push(object); - } - - if (typeof Buffer !== 'undefined' && Buffer.isBuffer && Buffer.isBuffer(object)) { - write('buffer:'); - return write(object); - } - - if(objType !== 'object' && objType !== 'function' && objType !== 'asyncfunction') { - if(this['_' + objType]) { - this['_' + objType](object); - } else if (options.ignoreUnknown) { - return write('[' + objType + ']'); - } else { - throw new Error('Unknown object type "' + objType + '"'); - } - }else{ - var keys = Object.keys(object); - if (options.unorderedObjects) { - keys = keys.sort(); - } - // Make sure to incorporate special properties, so - // Types with different prototypes will produce - // a different hash and objects derived from - // different functions (`new Foo`, `new Bar`) will - // produce different hashes. - // We never do this for native functions since some - // seem to break because of that. - if (options.respectType !== false && !isNativeFunction(object)) { - keys.splice(0, 0, 'prototype', '__proto__', 'constructor'); - } - - if (options.excludeKeys) { - keys = keys.filter(function(key) { return !options.excludeKeys(key); }); - } - - write('object:' + keys.length + ':'); - var self = this; - return keys.forEach(function(key){ - self.dispatch(key); - write(':'); - if(!options.excludeValues) { - self.dispatch(object[key]); - } - write(','); - }); - } - }, - _array: function(arr, unordered){ - unordered = typeof unordered !== 'undefined' ? unordered : - options.unorderedArrays !== false; // default to options.unorderedArrays - - var self = this; - write('array:' + arr.length + ':'); - if (!unordered || arr.length <= 1) { - return arr.forEach(function(entry) { - return self.dispatch(entry); - }); - } - - // the unordered case is a little more complicated: - // since there is no canonical ordering on objects, - // i.e. {a:1} < {a:2} and {a:1} > {a:2} are both false, - // we first serialize each entry using a PassThrough stream - // before sorting. - // also: we can’t use the same context array for all entries - // since the order of hashing should *not* matter. instead, - // we keep track of the additions to a copy of the context array - // and add all of them to the global context array when we’re done - var contextAdditions = []; - var entries = arr.map(function(entry) { - var strm = new PassThrough(); - var localContext = context.slice(); // make copy - var hasher = typeHasher(options, strm, localContext); - hasher.dispatch(entry); - // take only what was added to localContext and append it to contextAdditions - contextAdditions = contextAdditions.concat(localContext.slice(context.length)); - return strm.read().toString(); - }); - context = context.concat(contextAdditions); - entries.sort(); - return this._array(entries, false); - }, - _date: function(date){ - return write('date:' + date.toJSON()); - }, - _symbol: function(sym){ - return write('symbol:' + sym.toString()); - }, - _error: function(err){ - return write('error:' + err.toString()); - }, - _boolean: function(bool){ - return write('bool:' + bool.toString()); - }, - _string: function(string){ - write('string:' + string.length + ':'); - write(string.toString()); - }, - _function: function(fn){ - write('fn:'); - if (isNativeFunction(fn)) { - this.dispatch('[native]'); - } else { - this.dispatch(fn.toString()); - } - - if (options.respectFunctionNames !== false) { - // Make sure we can still distinguish native functions - // by their name, otherwise String and Function will - // have the same hash - this.dispatch("function-name:" + String(fn.name)); - } - - if (options.respectFunctionProperties) { - this._object(fn); - } - }, - _number: function(number){ - return write('number:' + number.toString()); - }, - _xml: function(xml){ - return write('xml:' + xml.toString()); - }, - _null: function() { - return write('Null'); - }, - _undefined: function() { - return write('Undefined'); - }, - _regexp: function(regex){ - return write('regex:' + regex.toString()); - }, - _uint8array: function(arr){ - write('uint8array:'); - return this.dispatch(Array.prototype.slice.call(arr)); - }, - _uint8clampedarray: function(arr){ - write('uint8clampedarray:'); - return this.dispatch(Array.prototype.slice.call(arr)); - }, - _int8array: function(arr){ - write('int8array:'); - return this.dispatch(Array.prototype.slice.call(arr)); - }, - _uint16array: function(arr){ - write('uint16array:'); - return this.dispatch(Array.prototype.slice.call(arr)); - }, - _int16array: function(arr){ - write('int16array:'); - return this.dispatch(Array.prototype.slice.call(arr)); - }, - _uint32array: function(arr){ - write('uint32array:'); - return this.dispatch(Array.prototype.slice.call(arr)); - }, - _int32array: function(arr){ - write('int32array:'); - return this.dispatch(Array.prototype.slice.call(arr)); - }, - _float32array: function(arr){ - write('float32array:'); - return this.dispatch(Array.prototype.slice.call(arr)); - }, - _float64array: function(arr){ - write('float64array:'); - return this.dispatch(Array.prototype.slice.call(arr)); - }, - _arraybuffer: function(arr){ - write('arraybuffer:'); - return this.dispatch(new Uint8Array(arr)); - }, - _url: function(url) { - return write('url:' + url.toString(), 'utf8'); - }, - _map: function(map) { - write('map:'); - var arr = Array.from(map); - return this._array(arr, options.unorderedSets !== false); - }, - _set: function(set) { - write('set:'); - var arr = Array.from(set); - return this._array(arr, options.unorderedSets !== false); - }, - _file: function(file) { - write('file:'); - return this.dispatch([file.name, file.size, file.type, file.lastModfied]); - }, - _blob: function() { - if (options.ignoreUnknown) { - return write('[blob]'); - } - - throw Error('Hashing Blob objects is currently not supported\n' + - '(see https://github.com/puleos/object-hash/issues/26)\n' + - 'Use "options.replacer" or "options.ignoreUnknown"\n'); - }, - _domwindow: function() { return write('domwindow'); }, - _bigint: function(number){ - return write('bigint:' + number.toString()); - }, - /* Node.js standard native objects */ - _process: function() { return write('process'); }, - _timer: function() { return write('timer'); }, - _pipe: function() { return write('pipe'); }, - _tcp: function() { return write('tcp'); }, - _udp: function() { return write('udp'); }, - _tty: function() { return write('tty'); }, - _statwatcher: function() { return write('statwatcher'); }, - _securecontext: function() { return write('securecontext'); }, - _connection: function() { return write('connection'); }, - _zlib: function() { return write('zlib'); }, - _context: function() { return write('context'); }, - _nodescript: function() { return write('nodescript'); }, - _httpparser: function() { return write('httpparser'); }, - _dataview: function() { return write('dataview'); }, - _signal: function() { return write('signal'); }, - _fsevent: function() { return write('fsevent'); }, - _tlswrap: function() { return write('tlswrap'); }, - }; -} - -// Mini-implementation of stream.PassThrough -// We are far from having need for the full implementation, and we can -// make assumptions like "many writes, then only one final read" -// and we can ignore encoding specifics -function PassThrough() { - return { - buf: '', - - write: function(b) { - this.buf += b; - }, - - end: function(b) { - this.buf += b; - }, - - read: function() { - return this.buf; - } - }; -} diff --git a/node_modules/object-hash/package.json b/node_modules/object-hash/package.json deleted file mode 100644 index a72557f..0000000 --- a/node_modules/object-hash/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "object-hash", - "version": "3.0.0", - "description": "Generate hashes from javascript objects in node and the browser.", - "homepage": "https://github.com/puleos/object-hash", - "repository": { - "type": "git", - "url": "https://github.com/puleos/object-hash" - }, - "keywords": [ - "object", - "hash", - "sha1", - "md5" - ], - "bugs": { - "url": "https://github.com/puleos/object-hash/issues" - }, - "scripts": { - "test": "node ./node_modules/.bin/mocha test", - "prepublish": "gulp dist" - }, - "author": "Scott Puleo ", - "files": [ - "index.js", - "dist/object_hash.js" - ], - "license": "MIT", - "devDependencies": { - "browserify": "^16.2.3", - "gulp": "^4.0.0", - "gulp-browserify": "^0.5.1", - "gulp-coveralls": "^0.1.4", - "gulp-exec": "^3.0.1", - "gulp-istanbul": "^1.1.3", - "gulp-jshint": "^2.0.0", - "gulp-mocha": "^5.0.0", - "gulp-rename": "^1.2.0", - "gulp-replace": "^1.0.0", - "gulp-uglify": "^3.0.0", - "jshint": "^2.8.0", - "jshint-stylish": "^2.1.0", - "karma": "^4.2.0", - "karma-chrome-launcher": "^2.2.0", - "karma-mocha": "^1.3.0", - "mocha": "^6.2.0" - }, - "engines": { - "node": ">= 6" - }, - "main": "./index.js", - "browser": "./dist/object_hash.js" -} diff --git a/node_modules/object-hash/readme.markdown b/node_modules/object-hash/readme.markdown deleted file mode 100644 index c507cf8..0000000 --- a/node_modules/object-hash/readme.markdown +++ /dev/null @@ -1,198 +0,0 @@ -# object-hash - -Generate hashes from objects and values in node and the browser. Uses node.js -crypto module for hashing. Supports SHA1 and many others (depending on the platform) -as well as custom streams (e.g. CRC32). - -[![NPM](https://nodei.co/npm/object-hash.png?downloads=true&downloadRank=true)](https://www.npmjs.com/package/object-hash) - -[![Travis CI](https://secure.travis-ci.org/puleos/object-hash.png?branch=master)](https://secure.travis-ci.org/puleos/object-hash?branch=master) -[![Coverage Status](https://coveralls.io/repos/puleos/object-hash/badge.svg?branch=master&service=github)](https://coveralls.io/github/puleos/object-hash?branch=master) - -* Hash values of any type. -* Supports a keys only option for grouping similar objects with different values. - -```js -var hash = require('object-hash'); - -hash({foo: 'bar'}) // => '67b69634f9880a282c14a0f0cb7ba20cf5d677e9' -hash([1, 2, 2.718, 3.14159]) // => '136b9b88375971dff9f1af09d7356e3e04281951' -``` - -## Versioning Disclaimer - -Starting with version `1.1.8` (released April 2017), new versions will consider -the exact returned hash part of the API contract, i.e. changes that will affect -hash values will be considered `semver-major`. Previous versions may violate -that expectation. - -For more information, see [this discussion](https://github.com/puleos/object-hash/issues/30). - -## hash(value, options) - -Generate a hash from any object or type. Defaults to sha1 with hex encoding. - -* `algorithm` hash algo to be used: 'sha1', 'md5', 'passthrough'. default: sha1 - * This supports the algorithms returned by `crypto.getHashes()`. Note that the default of SHA-1 is not considered secure, and a stronger algorithm should be used if a cryptographical hash is desired. - * This also supports the `passthrough` algorith, which will return the information that would otherwise have been hashed. -* `excludeValues` {true|false} hash object keys, values ignored. default: false -* `encoding` hash encoding, supports 'buffer', 'hex', 'binary', 'base64'. default: hex -* `ignoreUnknown` {true|*false} ignore unknown object types. default: false -* `replacer` optional function that replaces values before hashing. default: accept all values -* `respectFunctionProperties` {true|false} Whether properties on functions are considered when hashing. default: true -* `respectFunctionNames` {true|false} consider `name` property of functions for hashing. default: true -* `respectType` {true|false} Whether special type attributes (`.prototype`, `.__proto__`, `.constructor`) - are hashed. default: true -* `unorderedArrays` {true|false} Sort all arrays before hashing. Note that this affects *all* collections, - i.e. including typed arrays, Sets, Maps, etc. default: false -* `unorderedSets` {true|false} Sort `Set` and `Map` instances before hashing, i.e. make - `hash(new Set([1, 2])) == hash(new Set([2, 1]))` return `true`. default: true -* `unorderedObjects` {true|false} Sort objects before hashing, i.e. make `hash({ x: 1, y: 2 }) === hash({ y: 2, x: 1 })`. default: true -* `excludeKeys` optional function for excluding specific key(s) from hashing, if true is returned then exclude from hash. default: include all keys - -## hash.sha1(value) - -Hash using the sha1 algorithm. - -Note that SHA-1 is not considered secure, and a stronger algorithm should be used if a cryptographical hash is desired. - -*Sugar method, equivalent to* `hash(value, {algorithm: 'sha1'})` - -## hash.keys(value) - -Hash object keys using the sha1 algorithm, values ignored. - -*Sugar method, equivalent to* `hash(value, {excludeValues: true})` - -## hash.MD5(value) - -Hash using the md5 algorithm. - -Note that the MD5 algorithm is not considered secure, and a stronger algorithm should be used if a cryptographical hash is desired. - -*Sugar method, equivalent to* `hash(value, {algorithm: 'md5'})` - -## hash.keysMD5(value) - -Hash object keys using the md5 algorithm, values ignored. - -Note that the MD5 algorithm is not considered secure, and a stronger algorithm should be used if a cryptographical hash is desired. - -*Sugar method, equivalent to* `hash(value, {algorithm: 'md5', excludeValues: true})` - -## hash.writeToStream(value, [options,] stream) - -Write the information that would otherwise have been hashed to a stream, e.g.: - -```js -hash.writeToStream({foo: 'bar', a: 42}, {respectType: false}, process.stdout) -// => e.g. 'object:a:number:42foo:string:bar' -``` - -## Installation - -node: - -```js -npm install object-hash -``` - -browser: */dist/object_hash.js* - -```html - - - -``` - -## Example usage - -```js -var hash = require('object-hash'); - -var peter = { name: 'Peter', stapler: false, friends: ['Joanna', 'Michael', 'Samir'] }; -var michael = { name: 'Michael', stapler: false, friends: ['Peter', 'Samir'] }; -var bob = { name: 'Bob', stapler: true, friends: [] }; - -/*** - * sha1 hex encoding (default) - */ -hash(peter); -// 14fa461bf4b98155e82adc86532938553b4d33a9 -hash(michael); -// 4b2b30e27699979ce46714253bc2213010db039c -hash(bob); -// 38d96106bc8ef3d8bd369b99bb6972702c9826d5 - -/*** - * hash object keys, values ignored - */ -hash(peter, { excludeValues: true }); -// 48f370a772c7496f6c9d2e6d92e920c87dd00a5c -hash(michael, { excludeValues: true }); -// 48f370a772c7496f6c9d2e6d92e920c87dd00a5c -hash.keys(bob); -// 48f370a772c7496f6c9d2e6d92e920c87dd00a5c - -/*** - * hash object, ignore specific key(s) - */ -hash(peter, { excludeKeys: function(key) { - if ( key === 'friends') { - return true; - } - return false; - } -}); -// 66b7d7e64871aa9fda1bdc8e88a28df797648d80 - -/*** - * md5 base64 encoding - */ -hash(peter, { algorithm: 'md5', encoding: 'base64' }); -// 6rkWaaDiG3NynWw4svGH7g== -hash(michael, { algorithm: 'md5', encoding: 'base64' }); -// djXaWpuWVJeOF8Sb6SFFNg== -hash(bob, { algorithm: 'md5', encoding: 'base64' }); -// lFzkw/IJ8/12jZI0rQeS3w== -``` - -## Legacy Browser Support - -IE <= 8 and Opera <= 11 support dropped in version 0.3.0. If you require -legacy browser support you must either use an ES5 shim or use version 0.2.5 -of this module. - -## Development - -```sh-session -git clone https://github.com/puleos/object-hash -``` - -## Node Docker Wrapper - -If you want to stand this up in a docker container, you should take at look -at the [![node-object-hash](https://github.com/bean5/node-object-hash)](https://github.com/bean5/node-object-hash) project. - -### gulp tasks - -* `gulp watch` (default) watch files, test and lint on change/add -* `gulp test` unit tests -* `gulp karma` browser unit tests -* `gulp lint` jshint -* `gulp dist` create browser version in /dist - -## License - -MIT - -## Changelog - -### v2.0.0 - -Only Node.js versions `>= 6.0.0` are being tested in CI now. -No other breaking changes were introduced. diff --git a/node_modules/p-limit/index.d.ts b/node_modules/p-limit/index.d.ts deleted file mode 100644 index 6bbfad4..0000000 --- a/node_modules/p-limit/index.d.ts +++ /dev/null @@ -1,38 +0,0 @@ -export interface Limit { - /** - @param fn - Promise-returning/async function. - @param arguments - Any arguments to pass through to `fn`. Support for passing arguments on to the `fn` is provided in order to be able to avoid creating unnecessary closures. You probably don't need this optimization unless you're pushing a lot of functions. - @returns The promise returned by calling `fn(...arguments)`. - */ - ( - fn: (...arguments: Arguments) => PromiseLike | ReturnType, - ...arguments: Arguments - ): Promise; - - /** - The number of promises that are currently running. - */ - readonly activeCount: number; - - /** - The number of promises that are waiting to run (i.e. their internal `fn` was not called yet). - */ - readonly pendingCount: number; - - /** - Discard pending promises that are waiting to run. - - This might be useful if you want to teardown the queue at the end of your program's lifecycle or discard any function calls referencing an intermediary state of your app. - - Note: This does not cancel promises that are already running. - */ - clearQueue(): void; -} - -/** -Run multiple promise-returning & async functions with limited concurrency. - -@param concurrency - Concurrency limit. Minimum: `1`. -@returns A `limit` function. -*/ -export default function pLimit(concurrency: number): Limit; diff --git a/node_modules/p-limit/index.js b/node_modules/p-limit/index.js deleted file mode 100644 index 6a72a4c..0000000 --- a/node_modules/p-limit/index.js +++ /dev/null @@ -1,57 +0,0 @@ -'use strict'; -const pTry = require('p-try'); - -const pLimit = concurrency => { - if (!((Number.isInteger(concurrency) || concurrency === Infinity) && concurrency > 0)) { - return Promise.reject(new TypeError('Expected `concurrency` to be a number from 1 and up')); - } - - const queue = []; - let activeCount = 0; - - const next = () => { - activeCount--; - - if (queue.length > 0) { - queue.shift()(); - } - }; - - const run = (fn, resolve, ...args) => { - activeCount++; - - const result = pTry(fn, ...args); - - resolve(result); - - result.then(next, next); - }; - - const enqueue = (fn, resolve, ...args) => { - if (activeCount < concurrency) { - run(fn, resolve, ...args); - } else { - queue.push(run.bind(null, fn, resolve, ...args)); - } - }; - - const generator = (fn, ...args) => new Promise(resolve => enqueue(fn, resolve, ...args)); - Object.defineProperties(generator, { - activeCount: { - get: () => activeCount - }, - pendingCount: { - get: () => queue.length - }, - clearQueue: { - value: () => { - queue.length = 0; - } - } - }); - - return generator; -}; - -module.exports = pLimit; -module.exports.default = pLimit; diff --git a/node_modules/p-limit/license b/node_modules/p-limit/license deleted file mode 100644 index e7af2f7..0000000 --- a/node_modules/p-limit/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/p-limit/package.json b/node_modules/p-limit/package.json deleted file mode 100644 index 99a814f..0000000 --- a/node_modules/p-limit/package.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "p-limit", - "version": "2.3.0", - "description": "Run multiple promise-returning & async functions with limited concurrency", - "license": "MIT", - "repository": "sindresorhus/p-limit", - "funding": "https://github.com/sponsors/sindresorhus", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=6" - }, - "scripts": { - "test": "xo && ava && tsd-check" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "promise", - "limit", - "limited", - "concurrency", - "throttle", - "throat", - "rate", - "batch", - "ratelimit", - "task", - "queue", - "async", - "await", - "promises", - "bluebird" - ], - "dependencies": { - "p-try": "^2.0.0" - }, - "devDependencies": { - "ava": "^1.2.1", - "delay": "^4.1.0", - "in-range": "^1.0.0", - "random-int": "^1.0.0", - "time-span": "^2.0.0", - "tsd-check": "^0.3.0", - "xo": "^0.24.0" - } -} diff --git a/node_modules/p-limit/readme.md b/node_modules/p-limit/readme.md deleted file mode 100644 index 64aa476..0000000 --- a/node_modules/p-limit/readme.md +++ /dev/null @@ -1,101 +0,0 @@ -# p-limit [![Build Status](https://travis-ci.org/sindresorhus/p-limit.svg?branch=master)](https://travis-ci.org/sindresorhus/p-limit) - -> Run multiple promise-returning & async functions with limited concurrency - -## Install - -``` -$ npm install p-limit -``` - -## Usage - -```js -const pLimit = require('p-limit'); - -const limit = pLimit(1); - -const input = [ - limit(() => fetchSomething('foo')), - limit(() => fetchSomething('bar')), - limit(() => doSomething()) -]; - -(async () => { - // Only one promise is run at once - const result = await Promise.all(input); - console.log(result); -})(); -``` - -## API - -### pLimit(concurrency) - -Returns a `limit` function. - -#### concurrency - -Type: `number`\ -Minimum: `1`\ -Default: `Infinity` - -Concurrency limit. - -### limit(fn, ...args) - -Returns the promise returned by calling `fn(...args)`. - -#### fn - -Type: `Function` - -Promise-returning/async function. - -#### args - -Any arguments to pass through to `fn`. - -Support for passing arguments on to the `fn` is provided in order to be able to avoid creating unnecessary closures. You probably don't need this optimization unless you're pushing a *lot* of functions. - -### limit.activeCount - -The number of promises that are currently running. - -### limit.pendingCount - -The number of promises that are waiting to run (i.e. their internal `fn` was not called yet). - -### limit.clearQueue() - -Discard pending promises that are waiting to run. - -This might be useful if you want to teardown the queue at the end of your program's lifecycle or discard any function calls referencing an intermediary state of your app. - -Note: This does not cancel promises that are already running. - -## FAQ - -### How is this different from the [`p-queue`](https://github.com/sindresorhus/p-queue) package? - -This package is only about limiting the number of concurrent executions, while `p-queue` is a fully featured queue implementation with lots of different options, introspection, and ability to pause the queue. - -## Related - -- [p-queue](https://github.com/sindresorhus/p-queue) - Promise queue with concurrency control -- [p-throttle](https://github.com/sindresorhus/p-throttle) - Throttle promise-returning & async functions -- [p-debounce](https://github.com/sindresorhus/p-debounce) - Debounce promise-returning & async functions -- [p-all](https://github.com/sindresorhus/p-all) - Run promise-returning & async functions concurrently with optional limited concurrency -- [More…](https://github.com/sindresorhus/promise-fun) - ---- - -
    - - Get professional support for this package with a Tidelift subscription - -
    - - Tidelift helps make open source sustainable for maintainers while giving companies
    assurances about security, maintenance, and licensing for their dependencies. -
    -
    diff --git a/node_modules/p-locate/index.d.ts b/node_modules/p-locate/index.d.ts deleted file mode 100644 index 14115e1..0000000 --- a/node_modules/p-locate/index.d.ts +++ /dev/null @@ -1,64 +0,0 @@ -declare namespace pLocate { - interface Options { - /** - Number of concurrently pending promises returned by `tester`. Minimum: `1`. - - @default Infinity - */ - readonly concurrency?: number; - - /** - Preserve `input` order when searching. - - Disable this to improve performance if you don't care about the order. - - @default true - */ - readonly preserveOrder?: boolean; - } -} - -declare const pLocate: { - /** - Get the first fulfilled promise that satisfies the provided testing function. - - @param input - An iterable of promises/values to test. - @param tester - This function will receive resolved values from `input` and is expected to return a `Promise` or `boolean`. - @returns A `Promise` that is fulfilled when `tester` resolves to `true` or the iterable is done, or rejects if any of the promises reject. The fulfilled value is the current iterable value or `undefined` if `tester` never resolved to `true`. - - @example - ``` - import pathExists = require('path-exists'); - import pLocate = require('p-locate'); - - const files = [ - 'unicorn.png', - 'rainbow.png', // Only this one actually exists on disk - 'pony.png' - ]; - - (async () => { - const foundPath = await pLocate(files, file => pathExists(file)); - - console.log(foundPath); - //=> 'rainbow' - })(); - ``` - */ - ( - input: Iterable | ValueType>, - tester: (element: ValueType) => PromiseLike | boolean, - options?: pLocate.Options - ): Promise; - - // TODO: Remove this for the next major release, refactor the whole definition to: - // declare function pLocate( - // input: Iterable | ValueType>, - // tester: (element: ValueType) => PromiseLike | boolean, - // options?: pLocate.Options - // ): Promise; - // export = pLocate; - default: typeof pLocate; -}; - -export = pLocate; diff --git a/node_modules/p-locate/index.js b/node_modules/p-locate/index.js deleted file mode 100644 index e13ce15..0000000 --- a/node_modules/p-locate/index.js +++ /dev/null @@ -1,52 +0,0 @@ -'use strict'; -const pLimit = require('p-limit'); - -class EndError extends Error { - constructor(value) { - super(); - this.value = value; - } -} - -// The input can also be a promise, so we await it -const testElement = async (element, tester) => tester(await element); - -// The input can also be a promise, so we `Promise.all()` them both -const finder = async element => { - const values = await Promise.all(element); - if (values[1] === true) { - throw new EndError(values[0]); - } - - return false; -}; - -const pLocate = async (iterable, tester, options) => { - options = { - concurrency: Infinity, - preserveOrder: true, - ...options - }; - - const limit = pLimit(options.concurrency); - - // Start all the promises concurrently with optional limit - const items = [...iterable].map(element => [element, limit(testElement, element, tester)]); - - // Check the promises either serially or concurrently - const checkLimit = pLimit(options.preserveOrder ? 1 : Infinity); - - try { - await Promise.all(items.map(element => checkLimit(finder, element))); - } catch (error) { - if (error instanceof EndError) { - return error.value; - } - - throw error; - } -}; - -module.exports = pLocate; -// TODO: Remove this for the next major release -module.exports.default = pLocate; diff --git a/node_modules/p-locate/license b/node_modules/p-locate/license deleted file mode 100644 index e7af2f7..0000000 --- a/node_modules/p-locate/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/p-locate/package.json b/node_modules/p-locate/package.json deleted file mode 100644 index e3de275..0000000 --- a/node_modules/p-locate/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "p-locate", - "version": "4.1.0", - "description": "Get the first fulfilled promise that satisfies the provided testing function", - "license": "MIT", - "repository": "sindresorhus/p-locate", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=8" - }, - "scripts": { - "test": "xo && ava && tsd" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "promise", - "locate", - "find", - "finder", - "search", - "searcher", - "test", - "array", - "collection", - "iterable", - "iterator", - "race", - "fulfilled", - "fastest", - "async", - "await", - "promises", - "bluebird" - ], - "dependencies": { - "p-limit": "^2.2.0" - }, - "devDependencies": { - "ava": "^1.4.1", - "delay": "^4.1.0", - "in-range": "^1.0.0", - "time-span": "^3.0.0", - "tsd": "^0.7.2", - "xo": "^0.24.0" - } -} diff --git a/node_modules/p-locate/readme.md b/node_modules/p-locate/readme.md deleted file mode 100644 index f8e2c2e..0000000 --- a/node_modules/p-locate/readme.md +++ /dev/null @@ -1,90 +0,0 @@ -# p-locate [![Build Status](https://travis-ci.org/sindresorhus/p-locate.svg?branch=master)](https://travis-ci.org/sindresorhus/p-locate) - -> Get the first fulfilled promise that satisfies the provided testing function - -Think of it like an async version of [`Array#find`](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/find). - - -## Install - -``` -$ npm install p-locate -``` - - -## Usage - -Here we find the first file that exists on disk, in array order. - -```js -const pathExists = require('path-exists'); -const pLocate = require('p-locate'); - -const files = [ - 'unicorn.png', - 'rainbow.png', // Only this one actually exists on disk - 'pony.png' -]; - -(async () => { - const foundPath = await pLocate(files, file => pathExists(file)); - - console.log(foundPath); - //=> 'rainbow' -})(); -``` - -*The above is just an example. Use [`locate-path`](https://github.com/sindresorhus/locate-path) if you need this.* - - -## API - -### pLocate(input, tester, [options]) - -Returns a `Promise` that is fulfilled when `tester` resolves to `true` or the iterable is done, or rejects if any of the promises reject. The fulfilled value is the current iterable value or `undefined` if `tester` never resolved to `true`. - -#### input - -Type: `Iterable` - -An iterable of promises/values to test. - -#### tester(element) - -Type: `Function` - -This function will receive resolved values from `input` and is expected to return a `Promise` or `boolean`. - -#### options - -Type: `Object` - -##### concurrency - -Type: `number`
    -Default: `Infinity`
    -Minimum: `1` - -Number of concurrently pending promises returned by `tester`. - -##### preserveOrder - -Type: `boolean`
    -Default: `true` - -Preserve `input` order when searching. - -Disable this to improve performance if you don't care about the order. - - -## Related - -- [p-map](https://github.com/sindresorhus/p-map) - Map over promises concurrently -- [p-filter](https://github.com/sindresorhus/p-filter) - Filter promises concurrently -- [p-any](https://github.com/sindresorhus/p-any) - Wait for any promise to be fulfilled -- [More…](https://github.com/sindresorhus/promise-fun) - - -## License - -MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/p-try/index.d.ts b/node_modules/p-try/index.d.ts deleted file mode 100644 index 2a7319e..0000000 --- a/node_modules/p-try/index.d.ts +++ /dev/null @@ -1,39 +0,0 @@ -declare const pTry: { - /** - Start a promise chain. - - @param fn - The function to run to start the promise chain. - @param arguments - Arguments to pass to `fn`. - @returns The value of calling `fn(...arguments)`. If the function throws an error, the returned `Promise` will be rejected with that error. - - @example - ``` - import pTry = require('p-try'); - - (async () => { - try { - const value = await pTry(() => { - return synchronousFunctionThatMightThrow(); - }); - console.log(value); - } catch (error) { - console.error(error); - } - })(); - ``` - */ - ( - fn: (...arguments: ArgumentsType) => PromiseLike | ValueType, - ...arguments: ArgumentsType - ): Promise; - - // TODO: remove this in the next major version, refactor the whole definition to: - // declare function pTry( - // fn: (...arguments: ArgumentsType) => PromiseLike | ValueType, - // ...arguments: ArgumentsType - // ): Promise; - // export = pTry; - default: typeof pTry; -}; - -export = pTry; diff --git a/node_modules/p-try/index.js b/node_modules/p-try/index.js deleted file mode 100644 index db858da..0000000 --- a/node_modules/p-try/index.js +++ /dev/null @@ -1,9 +0,0 @@ -'use strict'; - -const pTry = (fn, ...arguments_) => new Promise(resolve => { - resolve(fn(...arguments_)); -}); - -module.exports = pTry; -// TODO: remove this in the next major version -module.exports.default = pTry; diff --git a/node_modules/p-try/license b/node_modules/p-try/license deleted file mode 100644 index e7af2f7..0000000 --- a/node_modules/p-try/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/p-try/package.json b/node_modules/p-try/package.json deleted file mode 100644 index 81c4d32..0000000 --- a/node_modules/p-try/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "p-try", - "version": "2.2.0", - "description": "`Start a promise chain", - "license": "MIT", - "repository": "sindresorhus/p-try", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=6" - }, - "scripts": { - "test": "xo && ava && tsd" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "promise", - "try", - "resolve", - "function", - "catch", - "async", - "await", - "promises", - "settled", - "ponyfill", - "polyfill", - "shim", - "bluebird" - ], - "devDependencies": { - "ava": "^1.4.1", - "tsd": "^0.7.1", - "xo": "^0.24.0" - } -} diff --git a/node_modules/p-try/readme.md b/node_modules/p-try/readme.md deleted file mode 100644 index 4d7bd64..0000000 --- a/node_modules/p-try/readme.md +++ /dev/null @@ -1,58 +0,0 @@ -# p-try [![Build Status](https://travis-ci.org/sindresorhus/p-try.svg?branch=master)](https://travis-ci.org/sindresorhus/p-try) - -> Start a promise chain - -[How is it useful?](http://cryto.net/~joepie91/blog/2016/05/11/what-is-promise-try-and-why-does-it-matter/) - - -## Install - -``` -$ npm install p-try -``` - - -## Usage - -```js -const pTry = require('p-try'); - -(async () => { - try { - const value = await pTry(() => { - return synchronousFunctionThatMightThrow(); - }); - console.log(value); - } catch (error) { - console.error(error); - } -})(); -``` - - -## API - -### pTry(fn, ...arguments) - -Returns a `Promise` resolved with the value of calling `fn(...arguments)`. If the function throws an error, the returned `Promise` will be rejected with that error. - -Support for passing arguments on to the `fn` is provided in order to be able to avoid creating unnecessary closures. You probably don't need this optimization unless you're pushing a *lot* of functions. - -#### fn - -The function to run to start the promise chain. - -#### arguments - -Arguments to pass to `fn`. - - -## Related - -- [p-finally](https://github.com/sindresorhus/p-finally) - `Promise#finally()` ponyfill - Invoked when the promise is settled regardless of outcome -- [More…](https://github.com/sindresorhus/promise-fun) - - -## License - -MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/package-json-from-dist/LICENSE.md b/node_modules/package-json-from-dist/LICENSE.md deleted file mode 100644 index 881248b..0000000 --- a/node_modules/package-json-from-dist/LICENSE.md +++ /dev/null @@ -1,63 +0,0 @@ -All packages under `src/` are licensed according to the terms in -their respective `LICENSE` or `LICENSE.md` files. - -The remainder of this project is licensed under the Blue Oak -Model License, as follows: - ------ - -# Blue Oak Model License - -Version 1.0.0 - -## Purpose - -This license gives everyone as much permission to work with -this software as possible, while protecting contributors -from liability. - -## Acceptance - -In order to receive this license, you must agree to its -rules. The rules of this license are both obligations -under that agreement and conditions to your license. -You must not do anything with this software that triggers -a rule that you cannot or will not follow. - -## Copyright - -Each contributor licenses you to do everything with this -software that would otherwise infringe that contributor's -copyright in it. - -## Notices - -You must ensure that everyone who gets a copy of -any part of this software from you, with or without -changes, also gets the text of this license or a link to -. - -## Excuse - -If anyone notifies you in writing that you have not -complied with [Notices](#notices), you can keep your -license by taking all practical steps to comply within 30 -days after the notice. If you do not do so, your license -ends immediately. - -## Patent - -Each contributor licenses you to do everything with this -software that would otherwise infringe any patent claims -they can license or become able to license. - -## Reliability - -No contributor can revoke this license. - -## No Liability - -***As far as the law allows, this software comes as is, -without any warranty or condition, and no contributor -will be liable to anyone for any damages related to this -software or this license, under any kind of legal claim.*** diff --git a/node_modules/package-json-from-dist/README.md b/node_modules/package-json-from-dist/README.md deleted file mode 100644 index a9e1344..0000000 --- a/node_modules/package-json-from-dist/README.md +++ /dev/null @@ -1,110 +0,0 @@ -# package-json-from-dist - -Sometimes you want to load the `package.json` into your -TypeScript program, and it's tempting to just `import -'../package.json'`, since that seems to work. - -However, this requires `tsc` to make an entire copy of your -`package.json` file into the `dist` folder, which is a problem if -you're using something like -[tshy](https://github.com/isaacs/tshy), which uses the -`package.json` file in dist for another purpose. Even when that -does work, it's asking the module system to do a bunch of extra -fs system calls, just to load a version number or something. (See -[this issue](https://github.com/isaacs/tshy/issues/61).) - -This module helps by just finding the package.json file -appropriately, and reading and parsing it in the most normal -fashion. - -## Caveats - -This _only_ works if your code builds into a target folder called -`dist`, which is in the root of the package. It also requires -that you do not have a folder named `node_modules` anywhere -within your dev environment, or else it'll get the wrong answers -there. (But, at least, that'll be in dev, so you're pretty likely -to notice.) - -If you build to some other location, then you'll need a different -approach. (Feel free to fork this module and make it your own, or -just put the code right inline, there's not much of it.) - -## USAGE - -```js -// src/index.ts -import { - findPackageJson, - loadPackageJson, -} from 'package-json-from-dist' - -const pj = findPackageJson(import.meta.url) -console.log(`package.json found at ${pj}`) - -const pkg = loadPackageJson(import.meta.url) -console.log(`Hello from ${pkg.name}@${pkg.version}`) -``` - -If your module is not directly in the `./src` folder, then you need -to specify the path that you would expect to find the -`package.json` when it's _not_ built to the `dist` folder. - -```js -// src/components/something.ts -import { - findPackageJson, - loadPackageJson, -} from 'package-json-from-dist' - -const pj = findPackageJson(import.meta.url, '../../package.json') -console.log(`package.json found at ${pj}`) - -const pkg = loadPackageJson(import.meta.url, '../../package.json') -console.log(`Hello from ${pkg.name}@${pkg.version}`) -``` - -When running from CommmonJS, use `__filename` instead of -`import.meta.url`. - -```js -// src/index.cts -import { - findPackageJson, - loadPackageJson, -} from 'package-json-from-dist' - -const pj = findPackageJson(__filename) -console.log(`package.json found at ${pj}`) - -const pkg = loadPackageJson(__filename) -console.log(`Hello from ${pkg.name}@${pkg.version}`) -``` - -Since [tshy](https://github.com/isaacs/tshy) builds _both_ -CommonJS and ESM by default, you may find that you need a -CommonJS override and some `//@ts-ignore` magic to make it work. - -`src/pkg.ts`: - -```js -import { - findPackageJson, - loadPackageJson, -} from 'package-json-from-dist' -//@ts-ignore -export const pkg = loadPackageJson(import.meta.url) -//@ts-ignore -export const pj = findPackageJson(import.meta.url) -``` - -`src/pkg-cjs.cts`: - -```js -import { - findPackageJson, - loadPackageJson, -} from 'package-json-from-dist' -export const pkg = loadPackageJson(__filename) -export const pj = findPackageJson(__filename) -``` diff --git a/node_modules/package-json-from-dist/dist/commonjs/index.d.ts b/node_modules/package-json-from-dist/dist/commonjs/index.d.ts deleted file mode 100644 index d486ffd..0000000 --- a/node_modules/package-json-from-dist/dist/commonjs/index.d.ts +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Find the package.json file, either from a TypeScript file somewhere not - * in a 'dist' folder, or a built and/or installed 'dist' folder. - * - * Note: this *only* works if you build your code into `'./dist'`, and that the - * source path does not also contain `'dist'`! If you don't build into - * `'./dist'`, or if you have files at `./src/dist/dist.ts`, then this will - * not work properly! - * - * The default `pathFromSrc` option assumes that the calling code lives one - * folder below the root of the package. Otherwise, it must be specified. - * - * Example: - * - * ```ts - * // src/index.ts - * import { findPackageJson } from 'package-json-from-dist' - * - * const pj = findPackageJson(import.meta.url) - * console.log(`package.json found at ${pj}`) - * ``` - * - * If the caller is deeper within the project source, then you must provide - * the appropriate fallback path: - * - * ```ts - * // src/components/something.ts - * import { findPackageJson } from 'package-json-from-dist' - * - * const pj = findPackageJson(import.meta.url, '../../package.json') - * console.log(`package.json found at ${pj}`) - * ``` - * - * When running from CommmonJS, use `__filename` instead of `import.meta.url` - * - * ```ts - * // src/index.cts - * import { findPackageJson } from 'package-json-from-dist' - * - * const pj = findPackageJson(__filename) - * console.log(`package.json found at ${pj}`) - * ``` - */ -export declare const findPackageJson: (from: string | URL, pathFromSrc?: string) => string; -/** - * Load the package.json file, either from a TypeScript file somewhere not - * in a 'dist' folder, or a built and/or installed 'dist' folder. - * - * Note: this *only* works if you build your code into `'./dist'`, and that the - * source path does not also contain `'dist'`! If you don't build into - * `'./dist'`, or if you have files at `./src/dist/dist.ts`, then this will - * not work properly! - * - * The default `pathFromSrc` option assumes that the calling code lives one - * folder below the root of the package. Otherwise, it must be specified. - * - * Example: - * - * ```ts - * // src/index.ts - * import { loadPackageJson } from 'package-json-from-dist' - * - * const pj = loadPackageJson(import.meta.url) - * console.log(`Hello from ${pj.name}@${pj.version}`) - * ``` - * - * If the caller is deeper within the project source, then you must provide - * the appropriate fallback path: - * - * ```ts - * // src/components/something.ts - * import { loadPackageJson } from 'package-json-from-dist' - * - * const pj = loadPackageJson(import.meta.url, '../../package.json') - * console.log(`Hello from ${pj.name}@${pj.version}`) - * ``` - * - * When running from CommmonJS, use `__filename` instead of `import.meta.url` - * - * ```ts - * // src/index.cts - * import { loadPackageJson } from 'package-json-from-dist' - * - * const pj = loadPackageJson(__filename) - * console.log(`Hello from ${pj.name}@${pj.version}`) - * ``` - */ -export declare const loadPackageJson: (from: string | URL, pathFromSrc?: string) => any; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/package-json-from-dist/dist/commonjs/index.d.ts.map b/node_modules/package-json-from-dist/dist/commonjs/index.d.ts.map deleted file mode 100644 index ca3e21c..0000000 --- a/node_modules/package-json-from-dist/dist/commonjs/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,eAAO,MAAM,eAAe,SACpB,MAAM,GAAG,GAAG,gBACL,MAAM,KAClB,MAsCF,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,eAAO,MAAM,eAAe,SACpB,MAAM,GAAG,GAAG,gBACL,MAAM,QAEiD,CAAA"} \ No newline at end of file diff --git a/node_modules/package-json-from-dist/dist/commonjs/index.js b/node_modules/package-json-from-dist/dist/commonjs/index.js deleted file mode 100644 index b966ac9..0000000 --- a/node_modules/package-json-from-dist/dist/commonjs/index.js +++ /dev/null @@ -1,134 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.loadPackageJson = exports.findPackageJson = void 0; -const node_fs_1 = require("node:fs"); -const node_path_1 = require("node:path"); -const node_url_1 = require("node:url"); -const NM = `${node_path_1.sep}node_modules${node_path_1.sep}`; -const STORE = `.store${node_path_1.sep}`; -const PKG = `${node_path_1.sep}package${node_path_1.sep}`; -const DIST = `${node_path_1.sep}dist${node_path_1.sep}`; -/** - * Find the package.json file, either from a TypeScript file somewhere not - * in a 'dist' folder, or a built and/or installed 'dist' folder. - * - * Note: this *only* works if you build your code into `'./dist'`, and that the - * source path does not also contain `'dist'`! If you don't build into - * `'./dist'`, or if you have files at `./src/dist/dist.ts`, then this will - * not work properly! - * - * The default `pathFromSrc` option assumes that the calling code lives one - * folder below the root of the package. Otherwise, it must be specified. - * - * Example: - * - * ```ts - * // src/index.ts - * import { findPackageJson } from 'package-json-from-dist' - * - * const pj = findPackageJson(import.meta.url) - * console.log(`package.json found at ${pj}`) - * ``` - * - * If the caller is deeper within the project source, then you must provide - * the appropriate fallback path: - * - * ```ts - * // src/components/something.ts - * import { findPackageJson } from 'package-json-from-dist' - * - * const pj = findPackageJson(import.meta.url, '../../package.json') - * console.log(`package.json found at ${pj}`) - * ``` - * - * When running from CommmonJS, use `__filename` instead of `import.meta.url` - * - * ```ts - * // src/index.cts - * import { findPackageJson } from 'package-json-from-dist' - * - * const pj = findPackageJson(__filename) - * console.log(`package.json found at ${pj}`) - * ``` - */ -const findPackageJson = (from, pathFromSrc = '../package.json') => { - const f = typeof from === 'object' || from.startsWith('file://') ? - (0, node_url_1.fileURLToPath)(from) - : from; - const __dirname = (0, node_path_1.dirname)(f); - const nms = __dirname.lastIndexOf(NM); - if (nms !== -1) { - // inside of node_modules. find the dist directly under package name. - const nm = __dirname.substring(0, nms + NM.length); - const pkgDir = __dirname.substring(nms + NM.length); - // affordance for yarn berry, which puts package contents in - // '.../node_modules/.store/${id}-${hash}/package/...' - if (pkgDir.startsWith(STORE)) { - const pkg = pkgDir.indexOf(PKG, STORE.length); - if (pkg) { - return (0, node_path_1.resolve)(nm, pkgDir.substring(0, pkg + PKG.length), 'package.json'); - } - } - const pkgName = pkgDir.startsWith('@') ? - pkgDir.split(node_path_1.sep, 2).join(node_path_1.sep) - : String(pkgDir.split(node_path_1.sep)[0]); - return (0, node_path_1.resolve)(nm, pkgName, 'package.json'); - } - else { - // see if we are in a dist folder. - const d = __dirname.lastIndexOf(DIST); - if (d !== -1) { - return (0, node_path_1.resolve)(__dirname.substring(0, d), 'package.json'); - } - else { - return (0, node_path_1.resolve)(__dirname, pathFromSrc); - } - } -}; -exports.findPackageJson = findPackageJson; -/** - * Load the package.json file, either from a TypeScript file somewhere not - * in a 'dist' folder, or a built and/or installed 'dist' folder. - * - * Note: this *only* works if you build your code into `'./dist'`, and that the - * source path does not also contain `'dist'`! If you don't build into - * `'./dist'`, or if you have files at `./src/dist/dist.ts`, then this will - * not work properly! - * - * The default `pathFromSrc` option assumes that the calling code lives one - * folder below the root of the package. Otherwise, it must be specified. - * - * Example: - * - * ```ts - * // src/index.ts - * import { loadPackageJson } from 'package-json-from-dist' - * - * const pj = loadPackageJson(import.meta.url) - * console.log(`Hello from ${pj.name}@${pj.version}`) - * ``` - * - * If the caller is deeper within the project source, then you must provide - * the appropriate fallback path: - * - * ```ts - * // src/components/something.ts - * import { loadPackageJson } from 'package-json-from-dist' - * - * const pj = loadPackageJson(import.meta.url, '../../package.json') - * console.log(`Hello from ${pj.name}@${pj.version}`) - * ``` - * - * When running from CommmonJS, use `__filename` instead of `import.meta.url` - * - * ```ts - * // src/index.cts - * import { loadPackageJson } from 'package-json-from-dist' - * - * const pj = loadPackageJson(__filename) - * console.log(`Hello from ${pj.name}@${pj.version}`) - * ``` - */ -const loadPackageJson = (from, pathFromSrc = '../package.json') => JSON.parse((0, node_fs_1.readFileSync)((0, exports.findPackageJson)(from, pathFromSrc), 'utf8')); -exports.loadPackageJson = loadPackageJson; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/package-json-from-dist/dist/commonjs/index.js.map b/node_modules/package-json-from-dist/dist/commonjs/index.js.map deleted file mode 100644 index 2fb5d23..0000000 --- a/node_modules/package-json-from-dist/dist/commonjs/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,qCAAsC;AACtC,yCAAiD;AACjD,uCAAwC;AAExC,MAAM,EAAE,GAAG,GAAG,eAAG,eAAe,eAAG,EAAE,CAAA;AACrC,MAAM,KAAK,GAAG,SAAS,eAAG,EAAE,CAAA;AAC5B,MAAM,GAAG,GAAG,GAAG,eAAG,UAAU,eAAG,EAAE,CAAA;AACjC,MAAM,IAAI,GAAG,GAAG,eAAG,OAAO,eAAG,EAAE,CAAA;AAE/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACI,MAAM,eAAe,GAAG,CAC7B,IAAkB,EAClB,cAAsB,iBAAiB,EAC/B,EAAE;IACV,MAAM,CAAC,GACL,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;QACtD,IAAA,wBAAa,EAAC,IAAI,CAAC;QACrB,CAAC,CAAC,IAAI,CAAA;IACR,MAAM,SAAS,GAAG,IAAA,mBAAO,EAAC,CAAC,CAAC,CAAA;IAE5B,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;IACrC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;QACf,qEAAqE;QACrE,MAAM,EAAE,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,CAAA;QAClD,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,CAAA;QACnD,4DAA4D;QAC5D,sDAAsD;QACtD,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;YAC7C,IAAI,GAAG,EAAE,CAAC;gBACR,OAAO,IAAA,mBAAO,EACZ,EAAE,EACF,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,EACrC,cAAc,CACf,CAAA;YACH,CAAC;QACH,CAAC;QACD,MAAM,OAAO,GACX,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,eAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,eAAG,CAAC;YAChC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,eAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAChC,OAAO,IAAA,mBAAO,EAAC,EAAE,EAAE,OAAO,EAAE,cAAc,CAAC,CAAA;IAC7C,CAAC;SAAM,CAAC;QACN,kCAAkC;QAClC,MAAM,CAAC,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;QACrC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACb,OAAO,IAAA,mBAAO,EAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,cAAc,CAAC,CAAA;QAC3D,CAAC;aAAM,CAAC;YACN,OAAO,IAAA,mBAAO,EAAC,SAAS,EAAE,WAAW,CAAC,CAAA;QACxC,CAAC;IACH,CAAC;AACH,CAAC,CAAA;AAzCY,QAAA,eAAe,mBAyC3B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACI,MAAM,eAAe,GAAG,CAC7B,IAAkB,EAClB,cAAsB,iBAAiB,EACvC,EAAE,CACF,IAAI,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,IAAA,uBAAe,EAAC,IAAI,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;AAJzD,QAAA,eAAe,mBAI0C","sourcesContent":["import { readFileSync } from 'node:fs'\nimport { dirname, resolve, sep } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst NM = `${sep}node_modules${sep}`\nconst STORE = `.store${sep}`\nconst PKG = `${sep}package${sep}`\nconst DIST = `${sep}dist${sep}`\n\n/**\n * Find the package.json file, either from a TypeScript file somewhere not\n * in a 'dist' folder, or a built and/or installed 'dist' folder.\n *\n * Note: this *only* works if you build your code into `'./dist'`, and that the\n * source path does not also contain `'dist'`! If you don't build into\n * `'./dist'`, or if you have files at `./src/dist/dist.ts`, then this will\n * not work properly!\n *\n * The default `pathFromSrc` option assumes that the calling code lives one\n * folder below the root of the package. Otherwise, it must be specified.\n *\n * Example:\n *\n * ```ts\n * // src/index.ts\n * import { findPackageJson } from 'package-json-from-dist'\n *\n * const pj = findPackageJson(import.meta.url)\n * console.log(`package.json found at ${pj}`)\n * ```\n *\n * If the caller is deeper within the project source, then you must provide\n * the appropriate fallback path:\n *\n * ```ts\n * // src/components/something.ts\n * import { findPackageJson } from 'package-json-from-dist'\n *\n * const pj = findPackageJson(import.meta.url, '../../package.json')\n * console.log(`package.json found at ${pj}`)\n * ```\n *\n * When running from CommmonJS, use `__filename` instead of `import.meta.url`\n *\n * ```ts\n * // src/index.cts\n * import { findPackageJson } from 'package-json-from-dist'\n *\n * const pj = findPackageJson(__filename)\n * console.log(`package.json found at ${pj}`)\n * ```\n */\nexport const findPackageJson = (\n from: string | URL,\n pathFromSrc: string = '../package.json',\n): string => {\n const f =\n typeof from === 'object' || from.startsWith('file://') ?\n fileURLToPath(from)\n : from\n const __dirname = dirname(f)\n\n const nms = __dirname.lastIndexOf(NM)\n if (nms !== -1) {\n // inside of node_modules. find the dist directly under package name.\n const nm = __dirname.substring(0, nms + NM.length)\n const pkgDir = __dirname.substring(nms + NM.length)\n // affordance for yarn berry, which puts package contents in\n // '.../node_modules/.store/${id}-${hash}/package/...'\n if (pkgDir.startsWith(STORE)) {\n const pkg = pkgDir.indexOf(PKG, STORE.length)\n if (pkg) {\n return resolve(\n nm,\n pkgDir.substring(0, pkg + PKG.length),\n 'package.json',\n )\n }\n }\n const pkgName =\n pkgDir.startsWith('@') ?\n pkgDir.split(sep, 2).join(sep)\n : String(pkgDir.split(sep)[0])\n return resolve(nm, pkgName, 'package.json')\n } else {\n // see if we are in a dist folder.\n const d = __dirname.lastIndexOf(DIST)\n if (d !== -1) {\n return resolve(__dirname.substring(0, d), 'package.json')\n } else {\n return resolve(__dirname, pathFromSrc)\n }\n }\n}\n\n/**\n * Load the package.json file, either from a TypeScript file somewhere not\n * in a 'dist' folder, or a built and/or installed 'dist' folder.\n *\n * Note: this *only* works if you build your code into `'./dist'`, and that the\n * source path does not also contain `'dist'`! If you don't build into\n * `'./dist'`, or if you have files at `./src/dist/dist.ts`, then this will\n * not work properly!\n *\n * The default `pathFromSrc` option assumes that the calling code lives one\n * folder below the root of the package. Otherwise, it must be specified.\n *\n * Example:\n *\n * ```ts\n * // src/index.ts\n * import { loadPackageJson } from 'package-json-from-dist'\n *\n * const pj = loadPackageJson(import.meta.url)\n * console.log(`Hello from ${pj.name}@${pj.version}`)\n * ```\n *\n * If the caller is deeper within the project source, then you must provide\n * the appropriate fallback path:\n *\n * ```ts\n * // src/components/something.ts\n * import { loadPackageJson } from 'package-json-from-dist'\n *\n * const pj = loadPackageJson(import.meta.url, '../../package.json')\n * console.log(`Hello from ${pj.name}@${pj.version}`)\n * ```\n *\n * When running from CommmonJS, use `__filename` instead of `import.meta.url`\n *\n * ```ts\n * // src/index.cts\n * import { loadPackageJson } from 'package-json-from-dist'\n *\n * const pj = loadPackageJson(__filename)\n * console.log(`Hello from ${pj.name}@${pj.version}`)\n * ```\n */\nexport const loadPackageJson = (\n from: string | URL,\n pathFromSrc: string = '../package.json',\n) =>\n JSON.parse(readFileSync(findPackageJson(from, pathFromSrc), 'utf8'))\n"]} \ No newline at end of file diff --git a/node_modules/package-json-from-dist/dist/commonjs/package.json b/node_modules/package-json-from-dist/dist/commonjs/package.json deleted file mode 100644 index 5bbefff..0000000 --- a/node_modules/package-json-from-dist/dist/commonjs/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "commonjs" -} diff --git a/node_modules/package-json-from-dist/dist/esm/index.d.ts b/node_modules/package-json-from-dist/dist/esm/index.d.ts deleted file mode 100644 index d486ffd..0000000 --- a/node_modules/package-json-from-dist/dist/esm/index.d.ts +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Find the package.json file, either from a TypeScript file somewhere not - * in a 'dist' folder, or a built and/or installed 'dist' folder. - * - * Note: this *only* works if you build your code into `'./dist'`, and that the - * source path does not also contain `'dist'`! If you don't build into - * `'./dist'`, or if you have files at `./src/dist/dist.ts`, then this will - * not work properly! - * - * The default `pathFromSrc` option assumes that the calling code lives one - * folder below the root of the package. Otherwise, it must be specified. - * - * Example: - * - * ```ts - * // src/index.ts - * import { findPackageJson } from 'package-json-from-dist' - * - * const pj = findPackageJson(import.meta.url) - * console.log(`package.json found at ${pj}`) - * ``` - * - * If the caller is deeper within the project source, then you must provide - * the appropriate fallback path: - * - * ```ts - * // src/components/something.ts - * import { findPackageJson } from 'package-json-from-dist' - * - * const pj = findPackageJson(import.meta.url, '../../package.json') - * console.log(`package.json found at ${pj}`) - * ``` - * - * When running from CommmonJS, use `__filename` instead of `import.meta.url` - * - * ```ts - * // src/index.cts - * import { findPackageJson } from 'package-json-from-dist' - * - * const pj = findPackageJson(__filename) - * console.log(`package.json found at ${pj}`) - * ``` - */ -export declare const findPackageJson: (from: string | URL, pathFromSrc?: string) => string; -/** - * Load the package.json file, either from a TypeScript file somewhere not - * in a 'dist' folder, or a built and/or installed 'dist' folder. - * - * Note: this *only* works if you build your code into `'./dist'`, and that the - * source path does not also contain `'dist'`! If you don't build into - * `'./dist'`, or if you have files at `./src/dist/dist.ts`, then this will - * not work properly! - * - * The default `pathFromSrc` option assumes that the calling code lives one - * folder below the root of the package. Otherwise, it must be specified. - * - * Example: - * - * ```ts - * // src/index.ts - * import { loadPackageJson } from 'package-json-from-dist' - * - * const pj = loadPackageJson(import.meta.url) - * console.log(`Hello from ${pj.name}@${pj.version}`) - * ``` - * - * If the caller is deeper within the project source, then you must provide - * the appropriate fallback path: - * - * ```ts - * // src/components/something.ts - * import { loadPackageJson } from 'package-json-from-dist' - * - * const pj = loadPackageJson(import.meta.url, '../../package.json') - * console.log(`Hello from ${pj.name}@${pj.version}`) - * ``` - * - * When running from CommmonJS, use `__filename` instead of `import.meta.url` - * - * ```ts - * // src/index.cts - * import { loadPackageJson } from 'package-json-from-dist' - * - * const pj = loadPackageJson(__filename) - * console.log(`Hello from ${pj.name}@${pj.version}`) - * ``` - */ -export declare const loadPackageJson: (from: string | URL, pathFromSrc?: string) => any; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/package-json-from-dist/dist/esm/index.d.ts.map b/node_modules/package-json-from-dist/dist/esm/index.d.ts.map deleted file mode 100644 index ca3e21c..0000000 --- a/node_modules/package-json-from-dist/dist/esm/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,eAAO,MAAM,eAAe,SACpB,MAAM,GAAG,GAAG,gBACL,MAAM,KAClB,MAsCF,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,eAAO,MAAM,eAAe,SACpB,MAAM,GAAG,GAAG,gBACL,MAAM,QAEiD,CAAA"} \ No newline at end of file diff --git a/node_modules/package-json-from-dist/dist/esm/index.js b/node_modules/package-json-from-dist/dist/esm/index.js deleted file mode 100644 index 426ad3c..0000000 --- a/node_modules/package-json-from-dist/dist/esm/index.js +++ /dev/null @@ -1,129 +0,0 @@ -import { readFileSync } from 'node:fs'; -import { dirname, resolve, sep } from 'node:path'; -import { fileURLToPath } from 'node:url'; -const NM = `${sep}node_modules${sep}`; -const STORE = `.store${sep}`; -const PKG = `${sep}package${sep}`; -const DIST = `${sep}dist${sep}`; -/** - * Find the package.json file, either from a TypeScript file somewhere not - * in a 'dist' folder, or a built and/or installed 'dist' folder. - * - * Note: this *only* works if you build your code into `'./dist'`, and that the - * source path does not also contain `'dist'`! If you don't build into - * `'./dist'`, or if you have files at `./src/dist/dist.ts`, then this will - * not work properly! - * - * The default `pathFromSrc` option assumes that the calling code lives one - * folder below the root of the package. Otherwise, it must be specified. - * - * Example: - * - * ```ts - * // src/index.ts - * import { findPackageJson } from 'package-json-from-dist' - * - * const pj = findPackageJson(import.meta.url) - * console.log(`package.json found at ${pj}`) - * ``` - * - * If the caller is deeper within the project source, then you must provide - * the appropriate fallback path: - * - * ```ts - * // src/components/something.ts - * import { findPackageJson } from 'package-json-from-dist' - * - * const pj = findPackageJson(import.meta.url, '../../package.json') - * console.log(`package.json found at ${pj}`) - * ``` - * - * When running from CommmonJS, use `__filename` instead of `import.meta.url` - * - * ```ts - * // src/index.cts - * import { findPackageJson } from 'package-json-from-dist' - * - * const pj = findPackageJson(__filename) - * console.log(`package.json found at ${pj}`) - * ``` - */ -export const findPackageJson = (from, pathFromSrc = '../package.json') => { - const f = typeof from === 'object' || from.startsWith('file://') ? - fileURLToPath(from) - : from; - const __dirname = dirname(f); - const nms = __dirname.lastIndexOf(NM); - if (nms !== -1) { - // inside of node_modules. find the dist directly under package name. - const nm = __dirname.substring(0, nms + NM.length); - const pkgDir = __dirname.substring(nms + NM.length); - // affordance for yarn berry, which puts package contents in - // '.../node_modules/.store/${id}-${hash}/package/...' - if (pkgDir.startsWith(STORE)) { - const pkg = pkgDir.indexOf(PKG, STORE.length); - if (pkg) { - return resolve(nm, pkgDir.substring(0, pkg + PKG.length), 'package.json'); - } - } - const pkgName = pkgDir.startsWith('@') ? - pkgDir.split(sep, 2).join(sep) - : String(pkgDir.split(sep)[0]); - return resolve(nm, pkgName, 'package.json'); - } - else { - // see if we are in a dist folder. - const d = __dirname.lastIndexOf(DIST); - if (d !== -1) { - return resolve(__dirname.substring(0, d), 'package.json'); - } - else { - return resolve(__dirname, pathFromSrc); - } - } -}; -/** - * Load the package.json file, either from a TypeScript file somewhere not - * in a 'dist' folder, or a built and/or installed 'dist' folder. - * - * Note: this *only* works if you build your code into `'./dist'`, and that the - * source path does not also contain `'dist'`! If you don't build into - * `'./dist'`, or if you have files at `./src/dist/dist.ts`, then this will - * not work properly! - * - * The default `pathFromSrc` option assumes that the calling code lives one - * folder below the root of the package. Otherwise, it must be specified. - * - * Example: - * - * ```ts - * // src/index.ts - * import { loadPackageJson } from 'package-json-from-dist' - * - * const pj = loadPackageJson(import.meta.url) - * console.log(`Hello from ${pj.name}@${pj.version}`) - * ``` - * - * If the caller is deeper within the project source, then you must provide - * the appropriate fallback path: - * - * ```ts - * // src/components/something.ts - * import { loadPackageJson } from 'package-json-from-dist' - * - * const pj = loadPackageJson(import.meta.url, '../../package.json') - * console.log(`Hello from ${pj.name}@${pj.version}`) - * ``` - * - * When running from CommmonJS, use `__filename` instead of `import.meta.url` - * - * ```ts - * // src/index.cts - * import { loadPackageJson } from 'package-json-from-dist' - * - * const pj = loadPackageJson(__filename) - * console.log(`Hello from ${pj.name}@${pj.version}`) - * ``` - */ -export const loadPackageJson = (from, pathFromSrc = '../package.json') => JSON.parse(readFileSync(findPackageJson(from, pathFromSrc), 'utf8')); -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/package-json-from-dist/dist/esm/index.js.map b/node_modules/package-json-from-dist/dist/esm/index.js.map deleted file mode 100644 index 53b6ce7..0000000 --- a/node_modules/package-json-from-dist/dist/esm/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync } from 'node:fs'\nimport { dirname, resolve, sep } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst NM = `${sep}node_modules${sep}`\nconst STORE = `.store${sep}`\nconst PKG = `${sep}package${sep}`\nconst DIST = `${sep}dist${sep}`\n\n/**\n * Find the package.json file, either from a TypeScript file somewhere not\n * in a 'dist' folder, or a built and/or installed 'dist' folder.\n *\n * Note: this *only* works if you build your code into `'./dist'`, and that the\n * source path does not also contain `'dist'`! If you don't build into\n * `'./dist'`, or if you have files at `./src/dist/dist.ts`, then this will\n * not work properly!\n *\n * The default `pathFromSrc` option assumes that the calling code lives one\n * folder below the root of the package. Otherwise, it must be specified.\n *\n * Example:\n *\n * ```ts\n * // src/index.ts\n * import { findPackageJson } from 'package-json-from-dist'\n *\n * const pj = findPackageJson(import.meta.url)\n * console.log(`package.json found at ${pj}`)\n * ```\n *\n * If the caller is deeper within the project source, then you must provide\n * the appropriate fallback path:\n *\n * ```ts\n * // src/components/something.ts\n * import { findPackageJson } from 'package-json-from-dist'\n *\n * const pj = findPackageJson(import.meta.url, '../../package.json')\n * console.log(`package.json found at ${pj}`)\n * ```\n *\n * When running from CommmonJS, use `__filename` instead of `import.meta.url`\n *\n * ```ts\n * // src/index.cts\n * import { findPackageJson } from 'package-json-from-dist'\n *\n * const pj = findPackageJson(__filename)\n * console.log(`package.json found at ${pj}`)\n * ```\n */\nexport const findPackageJson = (\n from: string | URL,\n pathFromSrc: string = '../package.json',\n): string => {\n const f =\n typeof from === 'object' || from.startsWith('file://') ?\n fileURLToPath(from)\n : from\n const __dirname = dirname(f)\n\n const nms = __dirname.lastIndexOf(NM)\n if (nms !== -1) {\n // inside of node_modules. find the dist directly under package name.\n const nm = __dirname.substring(0, nms + NM.length)\n const pkgDir = __dirname.substring(nms + NM.length)\n // affordance for yarn berry, which puts package contents in\n // '.../node_modules/.store/${id}-${hash}/package/...'\n if (pkgDir.startsWith(STORE)) {\n const pkg = pkgDir.indexOf(PKG, STORE.length)\n if (pkg) {\n return resolve(\n nm,\n pkgDir.substring(0, pkg + PKG.length),\n 'package.json',\n )\n }\n }\n const pkgName =\n pkgDir.startsWith('@') ?\n pkgDir.split(sep, 2).join(sep)\n : String(pkgDir.split(sep)[0])\n return resolve(nm, pkgName, 'package.json')\n } else {\n // see if we are in a dist folder.\n const d = __dirname.lastIndexOf(DIST)\n if (d !== -1) {\n return resolve(__dirname.substring(0, d), 'package.json')\n } else {\n return resolve(__dirname, pathFromSrc)\n }\n }\n}\n\n/**\n * Load the package.json file, either from a TypeScript file somewhere not\n * in a 'dist' folder, or a built and/or installed 'dist' folder.\n *\n * Note: this *only* works if you build your code into `'./dist'`, and that the\n * source path does not also contain `'dist'`! If you don't build into\n * `'./dist'`, or if you have files at `./src/dist/dist.ts`, then this will\n * not work properly!\n *\n * The default `pathFromSrc` option assumes that the calling code lives one\n * folder below the root of the package. Otherwise, it must be specified.\n *\n * Example:\n *\n * ```ts\n * // src/index.ts\n * import { loadPackageJson } from 'package-json-from-dist'\n *\n * const pj = loadPackageJson(import.meta.url)\n * console.log(`Hello from ${pj.name}@${pj.version}`)\n * ```\n *\n * If the caller is deeper within the project source, then you must provide\n * the appropriate fallback path:\n *\n * ```ts\n * // src/components/something.ts\n * import { loadPackageJson } from 'package-json-from-dist'\n *\n * const pj = loadPackageJson(import.meta.url, '../../package.json')\n * console.log(`Hello from ${pj.name}@${pj.version}`)\n * ```\n *\n * When running from CommmonJS, use `__filename` instead of `import.meta.url`\n *\n * ```ts\n * // src/index.cts\n * import { loadPackageJson } from 'package-json-from-dist'\n *\n * const pj = loadPackageJson(__filename)\n * console.log(`Hello from ${pj.name}@${pj.version}`)\n * ```\n */\nexport const loadPackageJson = (\n from: string | URL,\n pathFromSrc: string = '../package.json',\n) =>\n JSON.parse(readFileSync(findPackageJson(from, pathFromSrc), 'utf8'))\n"]} \ No newline at end of file diff --git a/node_modules/package-json-from-dist/dist/esm/package.json b/node_modules/package-json-from-dist/dist/esm/package.json deleted file mode 100644 index 3dbc1ca..0000000 --- a/node_modules/package-json-from-dist/dist/esm/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "module" -} diff --git a/node_modules/package-json-from-dist/package.json b/node_modules/package-json-from-dist/package.json deleted file mode 100644 index a2d03c3..0000000 --- a/node_modules/package-json-from-dist/package.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "name": "package-json-from-dist", - "version": "1.0.1", - "description": "Load the local package.json from either src or dist folder", - "main": "./dist/commonjs/index.js", - "exports": { - "./package.json": "./package.json", - ".": { - "import": { - "types": "./dist/esm/index.d.ts", - "default": "./dist/esm/index.js" - }, - "require": { - "types": "./dist/commonjs/index.d.ts", - "default": "./dist/commonjs/index.js" - } - } - }, - "files": [ - "dist" - ], - "scripts": { - "preversion": "npm test", - "postversion": "npm publish", - "prepublishOnly": "git push origin --follow-tags", - "prepare": "tshy", - "pretest": "npm run prepare", - "presnap": "npm run prepare", - "test": "tap", - "snap": "tap", - "format": "prettier --write . --log-level warn", - "typedoc": "typedoc" - }, - "author": "Isaac Z. Schlueter (https://izs.me)", - "license": "BlueOak-1.0.0", - "repository": { - "type": "git", - "url": "git+https://github.com/isaacs/package-json-from-dist.git" - }, - "devDependencies": { - "@types/node": "^20.12.12", - "prettier": "^3.2.5", - "tap": "^18.5.3", - "typedoc": "^0.24.8", - "typescript": "^5.1.6", - "tshy": "^1.14.0" - }, - "prettier": { - "semi": false, - "printWidth": 70, - "tabWidth": 2, - "useTabs": false, - "singleQuote": true, - "jsxSingleQuote": false, - "bracketSameLine": true, - "arrowParens": "avoid", - "endOfLine": "lf", - "experimentalTernaries": true - }, - "tshy": { - "exports": { - "./package.json": "./package.json", - ".": "./src/index.ts" - } - }, - "types": "./dist/commonjs/index.d.ts", - "type": "module" -} diff --git a/node_modules/pako/LICENSE b/node_modules/pako/LICENSE deleted file mode 100644 index a934ef8..0000000 --- a/node_modules/pako/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -(The MIT License) - -Copyright (C) 2014-2017 by Vitaly Puzrin and Andrei Tuputcyn - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/node_modules/pako/README.md b/node_modules/pako/README.md deleted file mode 100644 index 507b0c9..0000000 --- a/node_modules/pako/README.md +++ /dev/null @@ -1,177 +0,0 @@ -pako -========================================== - -[![CI](https://github.com/nodeca/pako/workflows/CI/badge.svg)](https://github.com/nodeca/pako/actions) -[![NPM version](https://img.shields.io/npm/v/pako.svg)](https://www.npmjs.org/package/pako) - -> zlib port to javascript, very fast! - -__Why pako is cool:__ - -- Results are binary equal to well known [zlib](http://www.zlib.net/) (now contains ported zlib v1.2.8). -- Almost as fast in modern JS engines as C implementation (see benchmarks). -- Works in browsers, you can browserify any separate component. - -This project was done to understand how fast JS can be and is it necessary to -develop native C modules for CPU-intensive tasks. Enjoy the result! - - -__Benchmarks:__ - - -node v12.16.3 (zlib 1.2.9), 1mb input sample: - -``` -deflate-imaya x 4.75 ops/sec ±4.93% (15 runs sampled) -deflate-pako x 10.38 ops/sec ±0.37% (29 runs sampled) -deflate-zlib x 17.74 ops/sec ±0.77% (46 runs sampled) -gzip-pako x 8.86 ops/sec ±1.41% (29 runs sampled) -inflate-imaya x 107 ops/sec ±0.69% (77 runs sampled) -inflate-pako x 131 ops/sec ±1.74% (82 runs sampled) -inflate-zlib x 258 ops/sec ±0.66% (88 runs sampled) -ungzip-pako x 115 ops/sec ±1.92% (80 runs sampled) -``` - -node v14.15.0 (google's zlib), 1mb output sample: - -``` -deflate-imaya x 4.93 ops/sec ±3.09% (16 runs sampled) -deflate-pako x 10.22 ops/sec ±0.33% (29 runs sampled) -deflate-zlib x 18.48 ops/sec ±0.24% (48 runs sampled) -gzip-pako x 10.16 ops/sec ±0.25% (28 runs sampled) -inflate-imaya x 110 ops/sec ±0.41% (77 runs sampled) -inflate-pako x 134 ops/sec ±0.66% (83 runs sampled) -inflate-zlib x 402 ops/sec ±0.74% (87 runs sampled) -ungzip-pako x 113 ops/sec ±0.62% (80 runs sampled) -``` - -zlib's test is partially affected by marshalling (that make sense for inflate only). -You can change deflate level to 0 in benchmark source, to investigate details. -For deflate level 6 results can be considered as correct. - -__Install:__ - -``` -npm install pako -``` - - -Examples / API --------------- - -Full docs - http://nodeca.github.io/pako/ - -```javascript -const pako = require('pako'); - -// Deflate -// -const input = new Uint8Array(); -//... fill input data here -const output = pako.deflate(input); - -// Inflate (simple wrapper can throw exception on broken stream) -// -const compressed = new Uint8Array(); -//... fill data to uncompress here -try { - const result = pako.inflate(compressed); - // ... continue processing -} catch (err) { - console.log(err); -} - -// -// Alternate interface for chunking & without exceptions -// - -const deflator = new pako.Deflate(); - -deflator.push(chunk1, false); -deflator.push(chunk2); // second param is false by default. -... -deflator.push(chunk_last, true); // `true` says this chunk is last - -if (deflator.err) { - console.log(deflator.msg); -} - -const output = deflator.result; - - -const inflator = new pako.Inflate(); - -inflator.push(chunk1); -inflator.push(chunk2); -... -inflator.push(chunk_last); // no second param because end is auto-detected - -if (inflator.err) { - console.log(inflator.msg); -} - -const output = inflator.result; -``` - -Sometime you can wish to work with strings. For example, to send -stringified objects to server. Pako's deflate detects input data type, and -automatically recode strings to utf-8 prior to compress. Inflate has special -option, to say compressed data has utf-8 encoding and should be recoded to -javascript's utf-16. - -```javascript -const pako = require('pako'); - -const test = { my: 'super', puper: [456, 567], awesome: 'pako' }; - -const compressed = pako.deflate(JSON.stringify(test)); - -const restored = JSON.parse(pako.inflate(compressed, { to: 'string' })); -``` - - -Notes ------ - -Pako does not contain some specific zlib functions: - -- __deflate__ - methods `deflateCopy`, `deflateBound`, `deflateParams`, - `deflatePending`, `deflatePrime`, `deflateTune`. -- __inflate__ - methods `inflateCopy`, `inflateMark`, - `inflatePrime`, `inflateGetDictionary`, `inflateSync`, `inflateSyncPoint`, `inflateUndermine`. -- High level inflate/deflate wrappers (classes) may not support some flush - modes. - - -pako for enterprise -------------------- - -Available as part of the Tidelift Subscription - -The maintainers of pako and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-pako?utm_source=npm-pako&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) - - -Authors -------- - -- Andrey Tupitsin [@anrd83](https://github.com/andr83) -- Vitaly Puzrin [@puzrin](https://github.com/puzrin) - -Personal thanks to: - -- Vyacheslav Egorov ([@mraleph](https://github.com/mraleph)) for his awesome - tutorials about optimising JS code for v8, [IRHydra](http://mrale.ph/irhydra/) - tool and his advices. -- David Duponchel ([@dduponchel](https://github.com/dduponchel)) for help with - testing. - -Original implementation (in C): - -- [zlib](http://zlib.net/) by Jean-loup Gailly and Mark Adler. - - -License -------- - -- MIT - all files, except `/lib/zlib` folder -- ZLIB - `/lib/zlib` content diff --git a/node_modules/pako/dist/pako.es5.js b/node_modules/pako/dist/pako.es5.js deleted file mode 100644 index 1b411dc..0000000 --- a/node_modules/pako/dist/pako.es5.js +++ /dev/null @@ -1,6688 +0,0 @@ - -/*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : - typeof define === 'function' && define.amd ? define(['exports'], factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.pako = {})); -})(this, (function (exports) { 'use strict'; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - /* eslint-disable space-unary-ops */ - - /* Public constants ==========================================================*/ - /* ===========================================================================*/ - - //const Z_FILTERED = 1; - //const Z_HUFFMAN_ONLY = 2; - //const Z_RLE = 3; - var Z_FIXED$1 = 4; - //const Z_DEFAULT_STRATEGY = 0; - - /* Possible values of the data_type field (though see inflate()) */ - var Z_BINARY = 0; - var Z_TEXT = 1; - //const Z_ASCII = 1; // = Z_TEXT - var Z_UNKNOWN$1 = 2; - - /*============================================================================*/ - - function zero$1(buf) { - var len = buf.length; - while (--len >= 0) { - buf[len] = 0; - } - } - - // From zutil.h - - var STORED_BLOCK = 0; - var STATIC_TREES = 1; - var DYN_TREES = 2; - /* The three kinds of block type */ - - var MIN_MATCH$1 = 3; - var MAX_MATCH$1 = 258; - /* The minimum and maximum match lengths */ - - // From deflate.h - /* =========================================================================== - * Internal compression state. - */ - - var LENGTH_CODES$1 = 29; - /* number of length codes, not counting the special END_BLOCK code */ - - var LITERALS$1 = 256; - /* number of literal bytes 0..255 */ - - var L_CODES$1 = LITERALS$1 + 1 + LENGTH_CODES$1; - /* number of Literal or Length codes, including the END_BLOCK code */ - - var D_CODES$1 = 30; - /* number of distance codes */ - - var BL_CODES$1 = 19; - /* number of codes used to transfer the bit lengths */ - - var HEAP_SIZE$1 = 2 * L_CODES$1 + 1; - /* maximum heap size */ - - var MAX_BITS$1 = 15; - /* All codes must not exceed MAX_BITS bits */ - - var Buf_size = 16; - /* size of bit buffer in bi_buf */ - - /* =========================================================================== - * Constants - */ - - var MAX_BL_BITS = 7; - /* Bit length codes must not exceed MAX_BL_BITS bits */ - - var END_BLOCK = 256; - /* end of block literal code */ - - var REP_3_6 = 16; - /* repeat previous bit length 3-6 times (2 bits of repeat count) */ - - var REPZ_3_10 = 17; - /* repeat a zero length 3-10 times (3 bits of repeat count) */ - - var REPZ_11_138 = 18; - /* repeat a zero length 11-138 times (7 bits of repeat count) */ - - /* eslint-disable comma-spacing,array-bracket-spacing */ - var extra_lbits = /* extra bits for each length code */ - new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0]); - var extra_dbits = /* extra bits for each distance code */ - new Uint8Array([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13]); - var extra_blbits = /* extra bits for each bit length code */ - new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7]); - var bl_order = new Uint8Array([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]); - /* eslint-enable comma-spacing,array-bracket-spacing */ - - /* The lengths of the bit length codes are sent in order of decreasing - * probability, to avoid transmitting the lengths for unused bit length codes. - */ - - /* =========================================================================== - * Local data. These are initialized only once. - */ - - // We pre-fill arrays with 0 to avoid uninitialized gaps - - var DIST_CODE_LEN = 512; /* see definition of array dist_code below */ - - // !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1 - var static_ltree = new Array((L_CODES$1 + 2) * 2); - zero$1(static_ltree); - /* The static literal tree. Since the bit lengths are imposed, there is no - * need for the L_CODES extra codes used during heap construction. However - * The codes 286 and 287 are needed to build a canonical tree (see _tr_init - * below). - */ - - var static_dtree = new Array(D_CODES$1 * 2); - zero$1(static_dtree); - /* The static distance tree. (Actually a trivial tree since all codes use - * 5 bits.) - */ - - var _dist_code = new Array(DIST_CODE_LEN); - zero$1(_dist_code); - /* Distance codes. The first 256 values correspond to the distances - * 3 .. 258, the last 256 values correspond to the top 8 bits of - * the 15 bit distances. - */ - - var _length_code = new Array(MAX_MATCH$1 - MIN_MATCH$1 + 1); - zero$1(_length_code); - /* length code for each normalized match length (0 == MIN_MATCH) */ - - var base_length = new Array(LENGTH_CODES$1); - zero$1(base_length); - /* First normalized length for each code (0 = MIN_MATCH) */ - - var base_dist = new Array(D_CODES$1); - zero$1(base_dist); - /* First normalized distance for each code (0 = distance of 1) */ - - function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) { - this.static_tree = static_tree; /* static tree or NULL */ - this.extra_bits = extra_bits; /* extra bits for each code or NULL */ - this.extra_base = extra_base; /* base index for extra_bits */ - this.elems = elems; /* max number of elements in the tree */ - this.max_length = max_length; /* max bit length for the codes */ - - // show if `static_tree` has data or dummy - needed for monomorphic objects - this.has_stree = static_tree && static_tree.length; - } - var static_l_desc; - var static_d_desc; - var static_bl_desc; - function TreeDesc(dyn_tree, stat_desc) { - this.dyn_tree = dyn_tree; /* the dynamic tree */ - this.max_code = 0; /* largest code with non zero frequency */ - this.stat_desc = stat_desc; /* the corresponding static tree */ - } - - var d_code = function d_code(dist) { - return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)]; - }; - - /* =========================================================================== - * Output a short LSB first on the stream. - * IN assertion: there is enough room in pendingBuf. - */ - var put_short = function put_short(s, w) { - // put_byte(s, (uch)((w) & 0xff)); - // put_byte(s, (uch)((ush)(w) >> 8)); - s.pending_buf[s.pending++] = w & 0xff; - s.pending_buf[s.pending++] = w >>> 8 & 0xff; - }; - - /* =========================================================================== - * Send a value on a given number of bits. - * IN assertion: length <= 16 and value fits in length bits. - */ - var send_bits = function send_bits(s, value, length) { - if (s.bi_valid > Buf_size - length) { - s.bi_buf |= value << s.bi_valid & 0xffff; - put_short(s, s.bi_buf); - s.bi_buf = value >> Buf_size - s.bi_valid; - s.bi_valid += length - Buf_size; - } else { - s.bi_buf |= value << s.bi_valid & 0xffff; - s.bi_valid += length; - } - }; - var send_code = function send_code(s, c, tree) { - send_bits(s, tree[c * 2] /*.Code*/, tree[c * 2 + 1] /*.Len*/); - }; - - /* =========================================================================== - * Reverse the first len bits of a code, using straightforward code (a faster - * method would use a table) - * IN assertion: 1 <= len <= 15 - */ - var bi_reverse = function bi_reverse(code, len) { - var res = 0; - do { - res |= code & 1; - code >>>= 1; - res <<= 1; - } while (--len > 0); - return res >>> 1; - }; - - /* =========================================================================== - * Flush the bit buffer, keeping at most 7 bits in it. - */ - var bi_flush = function bi_flush(s) { - if (s.bi_valid === 16) { - put_short(s, s.bi_buf); - s.bi_buf = 0; - s.bi_valid = 0; - } else if (s.bi_valid >= 8) { - s.pending_buf[s.pending++] = s.bi_buf & 0xff; - s.bi_buf >>= 8; - s.bi_valid -= 8; - } - }; - - /* =========================================================================== - * Compute the optimal bit lengths for a tree and update the total bit length - * for the current block. - * IN assertion: the fields freq and dad are set, heap[heap_max] and - * above are the tree nodes sorted by increasing frequency. - * OUT assertions: the field len is set to the optimal bit length, the - * array bl_count contains the frequencies for each bit length. - * The length opt_len is updated; static_len is also updated if stree is - * not null. - */ - var gen_bitlen = function gen_bitlen(s, desc) { - // deflate_state *s; - // tree_desc *desc; /* the tree descriptor */ - - var tree = desc.dyn_tree; - var max_code = desc.max_code; - var stree = desc.stat_desc.static_tree; - var has_stree = desc.stat_desc.has_stree; - var extra = desc.stat_desc.extra_bits; - var base = desc.stat_desc.extra_base; - var max_length = desc.stat_desc.max_length; - var h; /* heap index */ - var n, m; /* iterate over the tree elements */ - var bits; /* bit length */ - var xbits; /* extra bits */ - var f; /* frequency */ - var overflow = 0; /* number of elements with bit length too large */ - - for (bits = 0; bits <= MAX_BITS$1; bits++) { - s.bl_count[bits] = 0; - } - - /* In a first pass, compute the optimal bit lengths (which may - * overflow in the case of the bit length tree). - */ - tree[s.heap[s.heap_max] * 2 + 1] /*.Len*/ = 0; /* root of the heap */ - - for (h = s.heap_max + 1; h < HEAP_SIZE$1; h++) { - n = s.heap[h]; - bits = tree[tree[n * 2 + 1] /*.Dad*/ * 2 + 1] /*.Len*/ + 1; - if (bits > max_length) { - bits = max_length; - overflow++; - } - tree[n * 2 + 1] /*.Len*/ = bits; - /* We overwrite tree[n].Dad which is no longer needed */ - - if (n > max_code) { - continue; - } /* not a leaf node */ - - s.bl_count[bits]++; - xbits = 0; - if (n >= base) { - xbits = extra[n - base]; - } - f = tree[n * 2] /*.Freq*/; - s.opt_len += f * (bits + xbits); - if (has_stree) { - s.static_len += f * (stree[n * 2 + 1] /*.Len*/ + xbits); - } - } - if (overflow === 0) { - return; - } - - // Tracev((stderr,"\nbit length overflow\n")); - /* This happens for example on obj2 and pic of the Calgary corpus */ - - /* Find the first bit length which could increase: */ - do { - bits = max_length - 1; - while (s.bl_count[bits] === 0) { - bits--; - } - s.bl_count[bits]--; /* move one leaf down the tree */ - s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */ - s.bl_count[max_length]--; - /* The brother of the overflow item also moves one step up, - * but this does not affect bl_count[max_length] - */ - overflow -= 2; - } while (overflow > 0); - - /* Now recompute all bit lengths, scanning in increasing frequency. - * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all - * lengths instead of fixing only the wrong ones. This idea is taken - * from 'ar' written by Haruhiko Okumura.) - */ - for (bits = max_length; bits !== 0; bits--) { - n = s.bl_count[bits]; - while (n !== 0) { - m = s.heap[--h]; - if (m > max_code) { - continue; - } - if (tree[m * 2 + 1] /*.Len*/ !== bits) { - // Tracev((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); - s.opt_len += (bits - tree[m * 2 + 1] /*.Len*/) * tree[m * 2] /*.Freq*/; - tree[m * 2 + 1] /*.Len*/ = bits; - } - n--; - } - } - }; - - /* =========================================================================== - * Generate the codes for a given tree and bit counts (which need not be - * optimal). - * IN assertion: the array bl_count contains the bit length statistics for - * the given tree and the field len is set for all tree elements. - * OUT assertion: the field code is set for all tree elements of non - * zero code length. - */ - var gen_codes = function gen_codes(tree, max_code, bl_count) { - // ct_data *tree; /* the tree to decorate */ - // int max_code; /* largest code with non zero frequency */ - // ushf *bl_count; /* number of codes at each bit length */ - - var next_code = new Array(MAX_BITS$1 + 1); /* next code value for each bit length */ - var code = 0; /* running code value */ - var bits; /* bit index */ - var n; /* code index */ - - /* The distribution counts are first used to generate the code values - * without bit reversal. - */ - for (bits = 1; bits <= MAX_BITS$1; bits++) { - code = code + bl_count[bits - 1] << 1; - next_code[bits] = code; - } - /* Check that the bit counts in bl_count are consistent. The last code - * must be all ones. - */ - //Assert (code + bl_count[MAX_BITS]-1 == (1< length code (0..28) */ - length = 0; - for (code = 0; code < LENGTH_CODES$1 - 1; code++) { - base_length[code] = length; - for (n = 0; n < 1 << extra_lbits[code]; n++) { - _length_code[length++] = code; - } - } - //Assert (length == 256, "tr_static_init: length != 256"); - /* Note that the length 255 (match length 258) can be represented - * in two different ways: code 284 + 5 bits or code 285, so we - * overwrite length_code[255] to use the best encoding: - */ - _length_code[length - 1] = code; - - /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ - dist = 0; - for (code = 0; code < 16; code++) { - base_dist[code] = dist; - for (n = 0; n < 1 << extra_dbits[code]; n++) { - _dist_code[dist++] = code; - } - } - //Assert (dist == 256, "tr_static_init: dist != 256"); - dist >>= 7; /* from now on, all distances are divided by 128 */ - for (; code < D_CODES$1; code++) { - base_dist[code] = dist << 7; - for (n = 0; n < 1 << extra_dbits[code] - 7; n++) { - _dist_code[256 + dist++] = code; - } - } - //Assert (dist == 256, "tr_static_init: 256+dist != 512"); - - /* Construct the codes of the static literal tree */ - for (bits = 0; bits <= MAX_BITS$1; bits++) { - bl_count[bits] = 0; - } - n = 0; - while (n <= 143) { - static_ltree[n * 2 + 1] /*.Len*/ = 8; - n++; - bl_count[8]++; - } - while (n <= 255) { - static_ltree[n * 2 + 1] /*.Len*/ = 9; - n++; - bl_count[9]++; - } - while (n <= 279) { - static_ltree[n * 2 + 1] /*.Len*/ = 7; - n++; - bl_count[7]++; - } - while (n <= 287) { - static_ltree[n * 2 + 1] /*.Len*/ = 8; - n++; - bl_count[8]++; - } - /* Codes 286 and 287 do not exist, but we must include them in the - * tree construction to get a canonical Huffman tree (longest code - * all ones) - */ - gen_codes(static_ltree, L_CODES$1 + 1, bl_count); - - /* The static distance tree is trivial: */ - for (n = 0; n < D_CODES$1; n++) { - static_dtree[n * 2 + 1] /*.Len*/ = 5; - static_dtree[n * 2] /*.Code*/ = bi_reverse(n, 5); - } - - // Now data ready and we can init static trees - static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS$1 + 1, L_CODES$1, MAX_BITS$1); - static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES$1, MAX_BITS$1); - static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES$1, MAX_BL_BITS); - - //static_init_done = true; - }; - - /* =========================================================================== - * Initialize a new block. - */ - var init_block = function init_block(s) { - var n; /* iterates over tree elements */ - - /* Initialize the trees. */ - for (n = 0; n < L_CODES$1; n++) { - s.dyn_ltree[n * 2] /*.Freq*/ = 0; - } - for (n = 0; n < D_CODES$1; n++) { - s.dyn_dtree[n * 2] /*.Freq*/ = 0; - } - for (n = 0; n < BL_CODES$1; n++) { - s.bl_tree[n * 2] /*.Freq*/ = 0; - } - s.dyn_ltree[END_BLOCK * 2] /*.Freq*/ = 1; - s.opt_len = s.static_len = 0; - s.sym_next = s.matches = 0; - }; - - /* =========================================================================== - * Flush the bit buffer and align the output on a byte boundary - */ - var bi_windup = function bi_windup(s) { - if (s.bi_valid > 8) { - put_short(s, s.bi_buf); - } else if (s.bi_valid > 0) { - //put_byte(s, (Byte)s->bi_buf); - s.pending_buf[s.pending++] = s.bi_buf; - } - s.bi_buf = 0; - s.bi_valid = 0; - }; - - /* =========================================================================== - * Compares to subtrees, using the tree depth as tie breaker when - * the subtrees have equal frequency. This minimizes the worst case length. - */ - var smaller = function smaller(tree, n, m, depth) { - var _n2 = n * 2; - var _m2 = m * 2; - return tree[_n2] /*.Freq*/ < tree[_m2] /*.Freq*/ || tree[_n2] /*.Freq*/ === tree[_m2] /*.Freq*/ && depth[n] <= depth[m]; - }; - - /* =========================================================================== - * Restore the heap property by moving down the tree starting at node k, - * exchanging a node with the smallest of its two sons if necessary, stopping - * when the heap property is re-established (each father smaller than its - * two sons). - */ - var pqdownheap = function pqdownheap(s, tree, k) { - // deflate_state *s; - // ct_data *tree; /* the tree to restore */ - // int k; /* node to move down */ - - var v = s.heap[k]; - var j = k << 1; /* left son of k */ - while (j <= s.heap_len) { - /* Set j to the smallest of the two sons: */ - if (j < s.heap_len && smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) { - j++; - } - /* Exit if v is smaller than both sons */ - if (smaller(tree, v, s.heap[j], s.depth)) { - break; - } - - /* Exchange v with the smallest son */ - s.heap[k] = s.heap[j]; - k = j; - - /* And continue down the tree, setting j to the left son of k */ - j <<= 1; - } - s.heap[k] = v; - }; - - // inlined manually - // const SMALLEST = 1; - - /* =========================================================================== - * Send the block data compressed using the given Huffman trees - */ - var compress_block = function compress_block(s, ltree, dtree) { - // deflate_state *s; - // const ct_data *ltree; /* literal tree */ - // const ct_data *dtree; /* distance tree */ - - var dist; /* distance of matched string */ - var lc; /* match length or unmatched char (if dist == 0) */ - var sx = 0; /* running index in sym_buf */ - var code; /* the code to send */ - var extra; /* number of extra bits to send */ - - if (s.sym_next !== 0) { - do { - dist = s.pending_buf[s.sym_buf + sx++] & 0xff; - dist += (s.pending_buf[s.sym_buf + sx++] & 0xff) << 8; - lc = s.pending_buf[s.sym_buf + sx++]; - if (dist === 0) { - send_code(s, lc, ltree); /* send a literal byte */ - //Tracecv(isgraph(lc), (stderr," '%c' ", lc)); - } else { - /* Here, lc is the match length - MIN_MATCH */ - code = _length_code[lc]; - send_code(s, code + LITERALS$1 + 1, ltree); /* send the length code */ - extra = extra_lbits[code]; - if (extra !== 0) { - lc -= base_length[code]; - send_bits(s, lc, extra); /* send the extra length bits */ - } - - dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - //Assert (code < D_CODES, "bad d_code"); - - send_code(s, code, dtree); /* send the distance code */ - extra = extra_dbits[code]; - if (extra !== 0) { - dist -= base_dist[code]; - send_bits(s, dist, extra); /* send the extra distance bits */ - } - } /* literal or match pair ? */ - - /* Check that the overlay between pending_buf and sym_buf is ok: */ - //Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow"); - } while (sx < s.sym_next); - } - send_code(s, END_BLOCK, ltree); - }; - - /* =========================================================================== - * Construct one Huffman tree and assigns the code bit strings and lengths. - * Update the total bit length for the current block. - * IN assertion: the field freq is set for all tree elements. - * OUT assertions: the fields len and code are set to the optimal bit length - * and corresponding code. The length opt_len is updated; static_len is - * also updated if stree is not null. The field max_code is set. - */ - var build_tree = function build_tree(s, desc) { - // deflate_state *s; - // tree_desc *desc; /* the tree descriptor */ - - var tree = desc.dyn_tree; - var stree = desc.stat_desc.static_tree; - var has_stree = desc.stat_desc.has_stree; - var elems = desc.stat_desc.elems; - var n, m; /* iterate over heap elements */ - var max_code = -1; /* largest code with non zero frequency */ - var node; /* new node being created */ - - /* Construct the initial heap, with least frequent element in - * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. - * heap[0] is not used. - */ - s.heap_len = 0; - s.heap_max = HEAP_SIZE$1; - for (n = 0; n < elems; n++) { - if (tree[n * 2] /*.Freq*/ !== 0) { - s.heap[++s.heap_len] = max_code = n; - s.depth[n] = 0; - } else { - tree[n * 2 + 1] /*.Len*/ = 0; - } - } - - /* The pkzip format requires that at least one distance code exists, - * and that at least one bit should be sent even if there is only one - * possible code. So to avoid special checks later on we force at least - * two codes of non zero frequency. - */ - while (s.heap_len < 2) { - node = s.heap[++s.heap_len] = max_code < 2 ? ++max_code : 0; - tree[node * 2] /*.Freq*/ = 1; - s.depth[node] = 0; - s.opt_len--; - if (has_stree) { - s.static_len -= stree[node * 2 + 1] /*.Len*/; - } - /* node is 0 or 1 so it does not have extra bits */ - } - - desc.max_code = max_code; - - /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, - * establish sub-heaps of increasing lengths: - */ - for (n = s.heap_len >> 1 /*int /2*/; n >= 1; n--) { - pqdownheap(s, tree, n); - } - - /* Construct the Huffman tree by repeatedly combining the least two - * frequent nodes. - */ - node = elems; /* next internal node of the tree */ - do { - //pqremove(s, tree, n); /* n = node of least frequency */ - /*** pqremove ***/ - n = s.heap[1 /*SMALLEST*/]; - s.heap[1 /*SMALLEST*/] = s.heap[s.heap_len--]; - pqdownheap(s, tree, 1 /*SMALLEST*/); - /***/ - - m = s.heap[1 /*SMALLEST*/]; /* m = node of next least frequency */ - - s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */ - s.heap[--s.heap_max] = m; - - /* Create a new node father of n and m */ - tree[node * 2] /*.Freq*/ = tree[n * 2] /*.Freq*/ + tree[m * 2] /*.Freq*/; - s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1; - tree[n * 2 + 1] /*.Dad*/ = tree[m * 2 + 1] /*.Dad*/ = node; - - /* and insert the new node in the heap */ - s.heap[1 /*SMALLEST*/] = node++; - pqdownheap(s, tree, 1 /*SMALLEST*/); - } while (s.heap_len >= 2); - s.heap[--s.heap_max] = s.heap[1 /*SMALLEST*/]; - - /* At this point, the fields freq and dad are set. We can now - * generate the bit lengths. - */ - gen_bitlen(s, desc); - - /* The field len is now set, we can generate the bit codes */ - gen_codes(tree, max_code, s.bl_count); - }; - - /* =========================================================================== - * Scan a literal or distance tree to determine the frequencies of the codes - * in the bit length tree. - */ - var scan_tree = function scan_tree(s, tree, max_code) { - // deflate_state *s; - // ct_data *tree; /* the tree to be scanned */ - // int max_code; /* and its largest code of non zero frequency */ - - var n; /* iterates over all tree elements */ - var prevlen = -1; /* last emitted length */ - var curlen; /* length of current code */ - - var nextlen = tree[0 * 2 + 1] /*.Len*/; /* length of next code */ - - var count = 0; /* repeat count of the current code */ - var max_count = 7; /* max repeat count */ - var min_count = 4; /* min repeat count */ - - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } - tree[(max_code + 1) * 2 + 1] /*.Len*/ = 0xffff; /* guard */ - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[(n + 1) * 2 + 1] /*.Len*/; - - if (++count < max_count && curlen === nextlen) { - continue; - } else if (count < min_count) { - s.bl_tree[curlen * 2] /*.Freq*/ += count; - } else if (curlen !== 0) { - if (curlen !== prevlen) { - s.bl_tree[curlen * 2] /*.Freq*/++; - } - s.bl_tree[REP_3_6 * 2] /*.Freq*/++; - } else if (count <= 10) { - s.bl_tree[REPZ_3_10 * 2] /*.Freq*/++; - } else { - s.bl_tree[REPZ_11_138 * 2] /*.Freq*/++; - } - - count = 0; - prevlen = curlen; - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } else if (curlen === nextlen) { - max_count = 6; - min_count = 3; - } else { - max_count = 7; - min_count = 4; - } - } - }; - - /* =========================================================================== - * Send a literal or distance tree in compressed form, using the codes in - * bl_tree. - */ - var send_tree = function send_tree(s, tree, max_code) { - // deflate_state *s; - // ct_data *tree; /* the tree to be scanned */ - // int max_code; /* and its largest code of non zero frequency */ - - var n; /* iterates over all tree elements */ - var prevlen = -1; /* last emitted length */ - var curlen; /* length of current code */ - - var nextlen = tree[0 * 2 + 1] /*.Len*/; /* length of next code */ - - var count = 0; /* repeat count of the current code */ - var max_count = 7; /* max repeat count */ - var min_count = 4; /* min repeat count */ - - /* tree[max_code+1].Len = -1; */ /* guard already set */ - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[(n + 1) * 2 + 1] /*.Len*/; - - if (++count < max_count && curlen === nextlen) { - continue; - } else if (count < min_count) { - do { - send_code(s, curlen, s.bl_tree); - } while (--count !== 0); - } else if (curlen !== 0) { - if (curlen !== prevlen) { - send_code(s, curlen, s.bl_tree); - count--; - } - //Assert(count >= 3 && count <= 6, " 3_6?"); - send_code(s, REP_3_6, s.bl_tree); - send_bits(s, count - 3, 2); - } else if (count <= 10) { - send_code(s, REPZ_3_10, s.bl_tree); - send_bits(s, count - 3, 3); - } else { - send_code(s, REPZ_11_138, s.bl_tree); - send_bits(s, count - 11, 7); - } - count = 0; - prevlen = curlen; - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } else if (curlen === nextlen) { - max_count = 6; - min_count = 3; - } else { - max_count = 7; - min_count = 4; - } - } - }; - - /* =========================================================================== - * Construct the Huffman tree for the bit lengths and return the index in - * bl_order of the last bit length code to send. - */ - var build_bl_tree = function build_bl_tree(s) { - var max_blindex; /* index of last bit length code of non zero freq */ - - /* Determine the bit length frequencies for literal and distance trees */ - scan_tree(s, s.dyn_ltree, s.l_desc.max_code); - scan_tree(s, s.dyn_dtree, s.d_desc.max_code); - - /* Build the bit length tree: */ - build_tree(s, s.bl_desc); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - */ - - /* Determine the number of bit length codes to send. The pkzip format - * requires that at least 4 bit length codes be sent. (appnote.txt says - * 3 but the actual value used is 4.) - */ - for (max_blindex = BL_CODES$1 - 1; max_blindex >= 3; max_blindex--) { - if (s.bl_tree[bl_order[max_blindex] * 2 + 1] /*.Len*/ !== 0) { - break; - } - } - /* Update opt_len to include the bit length tree and counts */ - s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; - //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", - // s->opt_len, s->static_len)); - - return max_blindex; - }; - - /* =========================================================================== - * Send the header for a block using dynamic Huffman trees: the counts, the - * lengths of the bit length codes, the literal tree and the distance tree. - * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. - */ - var send_all_trees = function send_all_trees(s, lcodes, dcodes, blcodes) { - // deflate_state *s; - // int lcodes, dcodes, blcodes; /* number of codes for each tree */ - - var rank; /* index in bl_order */ - - //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); - //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, - // "too many codes"); - //Tracev((stderr, "\nbl counts: ")); - send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ - send_bits(s, dcodes - 1, 5); - send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ - for (rank = 0; rank < blcodes; rank++) { - //Tracev((stderr, "\nbl code %2d ", bl_order[rank])); - send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1] /*.Len*/, 3); - } - //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); - - send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */ - //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); - - send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */ - //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); - }; - - /* =========================================================================== - * Check if the data type is TEXT or BINARY, using the following algorithm: - * - TEXT if the two conditions below are satisfied: - * a) There are no non-portable control characters belonging to the - * "block list" (0..6, 14..25, 28..31). - * b) There is at least one printable character belonging to the - * "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). - * - BINARY otherwise. - * - The following partially-portable control characters form a - * "gray list" that is ignored in this detection algorithm: - * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). - * IN assertion: the fields Freq of dyn_ltree are set. - */ - var detect_data_type = function detect_data_type(s) { - /* block_mask is the bit mask of block-listed bytes - * set bits 0..6, 14..25, and 28..31 - * 0xf3ffc07f = binary 11110011111111111100000001111111 - */ - var block_mask = 0xf3ffc07f; - var n; - - /* Check for non-textual ("block-listed") bytes. */ - for (n = 0; n <= 31; n++, block_mask >>>= 1) { - if (block_mask & 1 && s.dyn_ltree[n * 2] /*.Freq*/ !== 0) { - return Z_BINARY; - } - } - - /* Check for textual ("allow-listed") bytes. */ - if (s.dyn_ltree[9 * 2] /*.Freq*/ !== 0 || s.dyn_ltree[10 * 2] /*.Freq*/ !== 0 || s.dyn_ltree[13 * 2] /*.Freq*/ !== 0) { - return Z_TEXT; - } - for (n = 32; n < LITERALS$1; n++) { - if (s.dyn_ltree[n * 2] /*.Freq*/ !== 0) { - return Z_TEXT; - } - } - - /* There are no "block-listed" or "allow-listed" bytes: - * this stream either is empty or has tolerated ("gray-listed") bytes only. - */ - return Z_BINARY; - }; - var static_init_done = false; - - /* =========================================================================== - * Initialize the tree data structures for a new zlib stream. - */ - var _tr_init$1 = function _tr_init(s) { - if (!static_init_done) { - tr_static_init(); - static_init_done = true; - } - s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc); - s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc); - s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc); - s.bi_buf = 0; - s.bi_valid = 0; - - /* Initialize the first block of the first file: */ - init_block(s); - }; - - /* =========================================================================== - * Send a stored block - */ - var _tr_stored_block$1 = function _tr_stored_block(s, buf, stored_len, last) { - //DeflateState *s; - //charf *buf; /* input block */ - //ulg stored_len; /* length of input block */ - //int last; /* one if this is the last block for a file */ - - send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */ - bi_windup(s); /* align on byte boundary */ - put_short(s, stored_len); - put_short(s, ~stored_len); - if (stored_len) { - s.pending_buf.set(s.window.subarray(buf, buf + stored_len), s.pending); - } - s.pending += stored_len; - }; - - /* =========================================================================== - * Send one empty static block to give enough lookahead for inflate. - * This takes 10 bits, of which 7 may remain in the bit buffer. - */ - var _tr_align$1 = function _tr_align(s) { - send_bits(s, STATIC_TREES << 1, 3); - send_code(s, END_BLOCK, static_ltree); - bi_flush(s); - }; - - /* =========================================================================== - * Determine the best encoding for the current block: dynamic trees, static - * trees or store, and write out the encoded block. - */ - var _tr_flush_block$1 = function _tr_flush_block(s, buf, stored_len, last) { - //DeflateState *s; - //charf *buf; /* input block, or NULL if too old */ - //ulg stored_len; /* length of input block */ - //int last; /* one if this is the last block for a file */ - - var opt_lenb, static_lenb; /* opt_len and static_len in bytes */ - var max_blindex = 0; /* index of last bit length code of non zero freq */ - - /* Build the Huffman trees unless a stored block is forced */ - if (s.level > 0) { - /* Check if the file is binary or text */ - if (s.strm.data_type === Z_UNKNOWN$1) { - s.strm.data_type = detect_data_type(s); - } - - /* Construct the literal and distance trees */ - build_tree(s, s.l_desc); - // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, - // s->static_len)); - - build_tree(s, s.d_desc); - // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, - // s->static_len)); - /* At this point, opt_len and static_len are the total bit lengths of - * the compressed block data, excluding the tree representations. - */ - - /* Build the bit length tree for the above two trees, and get the index - * in bl_order of the last bit length code to send. - */ - max_blindex = build_bl_tree(s); - - /* Determine the best encoding. Compute the block lengths in bytes. */ - opt_lenb = s.opt_len + 3 + 7 >>> 3; - static_lenb = s.static_len + 3 + 7 >>> 3; - - // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", - // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, - // s->sym_next / 3)); - - if (static_lenb <= opt_lenb) { - opt_lenb = static_lenb; - } - } else { - // Assert(buf != (char*)0, "lost buf"); - opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ - } - - if (stored_len + 4 <= opt_lenb && buf !== -1) { - /* 4: two words for the lengths */ - - /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - * Otherwise we can't have processed more than WSIZE input bytes since - * the last block flush, because compression would have been - * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to - * transform a block into a stored block. - */ - _tr_stored_block$1(s, buf, stored_len, last); - } else if (s.strategy === Z_FIXED$1 || static_lenb === opt_lenb) { - send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3); - compress_block(s, static_ltree, static_dtree); - } else { - send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3); - send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1); - compress_block(s, s.dyn_ltree, s.dyn_dtree); - } - // Assert (s->compressed_len == s->bits_sent, "bad compressed size"); - /* The above check is made mod 2^32, for files larger than 512 MB - * and uLong implemented on 32 bits. - */ - init_block(s); - if (last) { - bi_windup(s); - } - // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, - // s->compressed_len-7*last)); - }; - - /* =========================================================================== - * Save the match info and tally the frequency counts. Return true if - * the current block must be flushed. - */ - var _tr_tally$1 = function _tr_tally(s, dist, lc) { - // deflate_state *s; - // unsigned dist; /* distance of matched string */ - // unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ - - s.pending_buf[s.sym_buf + s.sym_next++] = dist; - s.pending_buf[s.sym_buf + s.sym_next++] = dist >> 8; - s.pending_buf[s.sym_buf + s.sym_next++] = lc; - if (dist === 0) { - /* lc is the unmatched char */ - s.dyn_ltree[lc * 2] /*.Freq*/++; - } else { - s.matches++; - /* Here, lc is the match length - MIN_MATCH */ - dist--; /* dist = match distance - 1 */ - //Assert((ush)dist < (ush)MAX_DIST(s) && - // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && - // (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); - - s.dyn_ltree[(_length_code[lc] + LITERALS$1 + 1) * 2] /*.Freq*/++; - s.dyn_dtree[d_code(dist) * 2] /*.Freq*/++; - } - - return s.sym_next === s.sym_end; - }; - var _tr_init_1 = _tr_init$1; - var _tr_stored_block_1 = _tr_stored_block$1; - var _tr_flush_block_1 = _tr_flush_block$1; - var _tr_tally_1 = _tr_tally$1; - var _tr_align_1 = _tr_align$1; - var trees = { - _tr_init: _tr_init_1, - _tr_stored_block: _tr_stored_block_1, - _tr_flush_block: _tr_flush_block_1, - _tr_tally: _tr_tally_1, - _tr_align: _tr_align_1 - }; - - // Note: adler32 takes 12% for level 0 and 2% for level 6. - // It isn't worth it to make additional optimizations as in original. - // Small size is preferable. - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - var adler32 = function adler32(adler, buf, len, pos) { - var s1 = adler & 0xffff | 0, - s2 = adler >>> 16 & 0xffff | 0, - n = 0; - while (len !== 0) { - // Set limit ~ twice less than 5552, to keep - // s2 in 31-bits, because we force signed ints. - // in other case %= will fail. - n = len > 2000 ? 2000 : len; - len -= n; - do { - s1 = s1 + buf[pos++] | 0; - s2 = s2 + s1 | 0; - } while (--n); - s1 %= 65521; - s2 %= 65521; - } - return s1 | s2 << 16 | 0; - }; - var adler32_1 = adler32; - - // Note: we can't get significant speed boost here. - // So write code to minimize size - no pregenerated tables - // and array tools dependencies. - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - // Use ordinary array, since untyped makes no boost here - var makeTable = function makeTable() { - var c, - table = []; - for (var n = 0; n < 256; n++) { - c = n; - for (var k = 0; k < 8; k++) { - c = c & 1 ? 0xEDB88320 ^ c >>> 1 : c >>> 1; - } - table[n] = c; - } - return table; - }; - - // Create table on load. Just 255 signed longs. Not a problem. - var crcTable = new Uint32Array(makeTable()); - var crc32 = function crc32(crc, buf, len, pos) { - var t = crcTable; - var end = pos + len; - crc ^= -1; - for (var i = pos; i < end; i++) { - crc = crc >>> 8 ^ t[(crc ^ buf[i]) & 0xFF]; - } - return crc ^ -1; // >>> 0; - }; - - var crc32_1 = crc32; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - var messages = { - 2: 'need dictionary', - /* Z_NEED_DICT 2 */ - 1: 'stream end', - /* Z_STREAM_END 1 */ - 0: '', - /* Z_OK 0 */ - '-1': 'file error', - /* Z_ERRNO (-1) */ - '-2': 'stream error', - /* Z_STREAM_ERROR (-2) */ - '-3': 'data error', - /* Z_DATA_ERROR (-3) */ - '-4': 'insufficient memory', - /* Z_MEM_ERROR (-4) */ - '-5': 'buffer error', - /* Z_BUF_ERROR (-5) */ - '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ - }; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - var constants$2 = { - /* Allowed flush values; see deflate() and inflate() below for details */ - Z_NO_FLUSH: 0, - Z_PARTIAL_FLUSH: 1, - Z_SYNC_FLUSH: 2, - Z_FULL_FLUSH: 3, - Z_FINISH: 4, - Z_BLOCK: 5, - Z_TREES: 6, - /* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ - Z_OK: 0, - Z_STREAM_END: 1, - Z_NEED_DICT: 2, - Z_ERRNO: -1, - Z_STREAM_ERROR: -2, - Z_DATA_ERROR: -3, - Z_MEM_ERROR: -4, - Z_BUF_ERROR: -5, - //Z_VERSION_ERROR: -6, - - /* compression levels */ - Z_NO_COMPRESSION: 0, - Z_BEST_SPEED: 1, - Z_BEST_COMPRESSION: 9, - Z_DEFAULT_COMPRESSION: -1, - Z_FILTERED: 1, - Z_HUFFMAN_ONLY: 2, - Z_RLE: 3, - Z_FIXED: 4, - Z_DEFAULT_STRATEGY: 0, - /* Possible values of the data_type field (though see inflate()) */ - Z_BINARY: 0, - Z_TEXT: 1, - //Z_ASCII: 1, // = Z_TEXT (deprecated) - Z_UNKNOWN: 2, - /* The deflate compression method */ - Z_DEFLATED: 8 - //Z_NULL: null // Use -1 or null inline, depending on var type - }; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - var _tr_init = trees._tr_init, - _tr_stored_block = trees._tr_stored_block, - _tr_flush_block = trees._tr_flush_block, - _tr_tally = trees._tr_tally, - _tr_align = trees._tr_align; - - /* Public constants ==========================================================*/ - /* ===========================================================================*/ - - var Z_NO_FLUSH$2 = constants$2.Z_NO_FLUSH, - Z_PARTIAL_FLUSH = constants$2.Z_PARTIAL_FLUSH, - Z_FULL_FLUSH$1 = constants$2.Z_FULL_FLUSH, - Z_FINISH$3 = constants$2.Z_FINISH, - Z_BLOCK$1 = constants$2.Z_BLOCK, - Z_OK$3 = constants$2.Z_OK, - Z_STREAM_END$3 = constants$2.Z_STREAM_END, - Z_STREAM_ERROR$2 = constants$2.Z_STREAM_ERROR, - Z_DATA_ERROR$2 = constants$2.Z_DATA_ERROR, - Z_BUF_ERROR$1 = constants$2.Z_BUF_ERROR, - Z_DEFAULT_COMPRESSION$1 = constants$2.Z_DEFAULT_COMPRESSION, - Z_FILTERED = constants$2.Z_FILTERED, - Z_HUFFMAN_ONLY = constants$2.Z_HUFFMAN_ONLY, - Z_RLE = constants$2.Z_RLE, - Z_FIXED = constants$2.Z_FIXED, - Z_DEFAULT_STRATEGY$1 = constants$2.Z_DEFAULT_STRATEGY, - Z_UNKNOWN = constants$2.Z_UNKNOWN, - Z_DEFLATED$2 = constants$2.Z_DEFLATED; - - /*============================================================================*/ - - var MAX_MEM_LEVEL = 9; - /* Maximum value for memLevel in deflateInit2 */ - var MAX_WBITS$1 = 15; - /* 32K LZ77 window */ - var DEF_MEM_LEVEL = 8; - var LENGTH_CODES = 29; - /* number of length codes, not counting the special END_BLOCK code */ - var LITERALS = 256; - /* number of literal bytes 0..255 */ - var L_CODES = LITERALS + 1 + LENGTH_CODES; - /* number of Literal or Length codes, including the END_BLOCK code */ - var D_CODES = 30; - /* number of distance codes */ - var BL_CODES = 19; - /* number of codes used to transfer the bit lengths */ - var HEAP_SIZE = 2 * L_CODES + 1; - /* maximum heap size */ - var MAX_BITS = 15; - /* All codes must not exceed MAX_BITS bits */ - - var MIN_MATCH = 3; - var MAX_MATCH = 258; - var MIN_LOOKAHEAD = MAX_MATCH + MIN_MATCH + 1; - var PRESET_DICT = 0x20; - var INIT_STATE = 42; /* zlib header -> BUSY_STATE */ - //#ifdef GZIP - var GZIP_STATE = 57; /* gzip header -> BUSY_STATE | EXTRA_STATE */ - //#endif - var EXTRA_STATE = 69; /* gzip extra block -> NAME_STATE */ - var NAME_STATE = 73; /* gzip file name -> COMMENT_STATE */ - var COMMENT_STATE = 91; /* gzip comment -> HCRC_STATE */ - var HCRC_STATE = 103; /* gzip header CRC -> BUSY_STATE */ - var BUSY_STATE = 113; /* deflate -> FINISH_STATE */ - var FINISH_STATE = 666; /* stream complete */ - - var BS_NEED_MORE = 1; /* block not completed, need more input or more output */ - var BS_BLOCK_DONE = 2; /* block flush performed */ - var BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */ - var BS_FINISH_DONE = 4; /* finish done, accept no more input or output */ - - var OS_CODE = 0x03; // Unix :) . Don't detect, use this default. - - var err = function err(strm, errorCode) { - strm.msg = messages[errorCode]; - return errorCode; - }; - var rank = function rank(f) { - return f * 2 - (f > 4 ? 9 : 0); - }; - var zero = function zero(buf) { - var len = buf.length; - while (--len >= 0) { - buf[len] = 0; - } - }; - - /* =========================================================================== - * Slide the hash table when sliding the window down (could be avoided with 32 - * bit values at the expense of memory usage). We slide even when level == 0 to - * keep the hash table consistent if we switch back to level > 0 later. - */ - var slide_hash = function slide_hash(s) { - var n, m; - var p; - var wsize = s.w_size; - n = s.hash_size; - p = n; - do { - m = s.head[--p]; - s.head[p] = m >= wsize ? m - wsize : 0; - } while (--n); - n = wsize; - //#ifndef FASTEST - p = n; - do { - m = s.prev[--p]; - s.prev[p] = m >= wsize ? m - wsize : 0; - /* If n is not on any hash chain, prev[n] is garbage but - * its value will never be used. - */ - } while (--n); - //#endif - }; - - /* eslint-disable new-cap */ - var HASH_ZLIB = function HASH_ZLIB(s, prev, data) { - return (prev << s.hash_shift ^ data) & s.hash_mask; - }; - // This hash causes less collisions, https://github.com/nodeca/pako/issues/135 - // But breaks binary compatibility - //let HASH_FAST = (s, prev, data) => ((prev << 8) + (prev >> 8) + (data << 4)) & s.hash_mask; - var HASH = HASH_ZLIB; - - /* ========================================================================= - * Flush as much pending output as possible. All deflate() output, except for - * some deflate_stored() output, goes through this function so some - * applications may wish to modify it to avoid allocating a large - * strm->next_out buffer and copying into it. (See also read_buf()). - */ - var flush_pending = function flush_pending(strm) { - var s = strm.state; - - //_tr_flush_bits(s); - var len = s.pending; - if (len > strm.avail_out) { - len = strm.avail_out; - } - if (len === 0) { - return; - } - strm.output.set(s.pending_buf.subarray(s.pending_out, s.pending_out + len), strm.next_out); - strm.next_out += len; - s.pending_out += len; - strm.total_out += len; - strm.avail_out -= len; - s.pending -= len; - if (s.pending === 0) { - s.pending_out = 0; - } - }; - var flush_block_only = function flush_block_only(s, last) { - _tr_flush_block(s, s.block_start >= 0 ? s.block_start : -1, s.strstart - s.block_start, last); - s.block_start = s.strstart; - flush_pending(s.strm); - }; - var put_byte = function put_byte(s, b) { - s.pending_buf[s.pending++] = b; - }; - - /* ========================================================================= - * Put a short in the pending buffer. The 16-bit value is put in MSB order. - * IN assertion: the stream state is correct and there is enough room in - * pending_buf. - */ - var putShortMSB = function putShortMSB(s, b) { - // put_byte(s, (Byte)(b >> 8)); - // put_byte(s, (Byte)(b & 0xff)); - s.pending_buf[s.pending++] = b >>> 8 & 0xff; - s.pending_buf[s.pending++] = b & 0xff; - }; - - /* =========================================================================== - * Read a new buffer from the current input stream, update the adler32 - * and total number of bytes read. All deflate() input goes through - * this function so some applications may wish to modify it to avoid - * allocating a large strm->input buffer and copying from it. - * (See also flush_pending()). - */ - var read_buf = function read_buf(strm, buf, start, size) { - var len = strm.avail_in; - if (len > size) { - len = size; - } - if (len === 0) { - return 0; - } - strm.avail_in -= len; - - // zmemcpy(buf, strm->next_in, len); - buf.set(strm.input.subarray(strm.next_in, strm.next_in + len), start); - if (strm.state.wrap === 1) { - strm.adler = adler32_1(strm.adler, buf, len, start); - } else if (strm.state.wrap === 2) { - strm.adler = crc32_1(strm.adler, buf, len, start); - } - strm.next_in += len; - strm.total_in += len; - return len; - }; - - /* =========================================================================== - * Set match_start to the longest match starting at the given string and - * return its length. Matches shorter or equal to prev_length are discarded, - * in which case the result is equal to prev_length and match_start is - * garbage. - * IN assertions: cur_match is the head of the hash chain for the current - * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 - * OUT assertion: the match length is not greater than s->lookahead. - */ - var longest_match = function longest_match(s, cur_match) { - var chain_length = s.max_chain_length; /* max hash chain length */ - var scan = s.strstart; /* current string */ - var match; /* matched string */ - var len; /* length of current match */ - var best_len = s.prev_length; /* best match length so far */ - var nice_match = s.nice_match; /* stop if match long enough */ - var limit = s.strstart > s.w_size - MIN_LOOKAHEAD ? s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0 /*NIL*/; - - var _win = s.window; // shortcut - - var wmask = s.w_mask; - var prev = s.prev; - - /* Stop when cur_match becomes <= limit. To simplify the code, - * we prevent matches with the string of window index 0. - */ - - var strend = s.strstart + MAX_MATCH; - var scan_end1 = _win[scan + best_len - 1]; - var scan_end = _win[scan + best_len]; - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - /* Do not waste too much time if we already have a good match: */ - if (s.prev_length >= s.good_match) { - chain_length >>= 2; - } - /* Do not look for matches beyond the end of the input. This is necessary - * to make deflate deterministic. - */ - if (nice_match > s.lookahead) { - nice_match = s.lookahead; - } - - // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); - - do { - // Assert(cur_match < s->strstart, "no future"); - match = cur_match; - - /* Skip to next match if the match length cannot increase - * or if the match length is less than 2. Note that the checks below - * for insufficient lookahead only occur occasionally for performance - * reasons. Therefore uninitialized memory will be accessed, and - * conditional jumps will be made that depend on those values. - * However the length of the match is limited to the lookahead, so - * the output of deflate is not affected by the uninitialized values. - */ - - if (_win[match + best_len] !== scan_end || _win[match + best_len - 1] !== scan_end1 || _win[match] !== _win[scan] || _win[++match] !== _win[scan + 1]) { - continue; - } - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2; - match++; - // Assert(*scan == *match, "match[2]?"); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - /*jshint noempty:false*/ - } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && scan < strend); - - // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - - len = MAX_MATCH - (strend - scan); - scan = strend - MAX_MATCH; - if (len > best_len) { - s.match_start = cur_match; - best_len = len; - if (len >= nice_match) { - break; - } - scan_end1 = _win[scan + best_len - 1]; - scan_end = _win[scan + best_len]; - } - } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0); - if (best_len <= s.lookahead) { - return best_len; - } - return s.lookahead; - }; - - /* =========================================================================== - * Fill the window when the lookahead becomes insufficient. - * Updates strstart and lookahead. - * - * IN assertion: lookahead < MIN_LOOKAHEAD - * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD - * At least one byte has been read, or avail_in == 0; reads are - * performed for at least two bytes (required for the zip translate_eol - * option -- not supported here). - */ - var fill_window = function fill_window(s) { - var _w_size = s.w_size; - var n, more, str; - - //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); - - do { - more = s.window_size - s.lookahead - s.strstart; - - // JS ints have 32 bit, block below not needed - /* Deal with !@#$% 64K limit: */ - //if (sizeof(int) <= 2) { - // if (more == 0 && s->strstart == 0 && s->lookahead == 0) { - // more = wsize; - // - // } else if (more == (unsigned)(-1)) { - // /* Very unlikely, but possible on 16 bit machine if - // * strstart == 0 && lookahead == 1 (input done a byte at time) - // */ - // more--; - // } - //} - - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) { - s.window.set(s.window.subarray(_w_size, _w_size + _w_size - more), 0); - s.match_start -= _w_size; - s.strstart -= _w_size; - /* we now have strstart >= MAX_DIST */ - s.block_start -= _w_size; - if (s.insert > s.strstart) { - s.insert = s.strstart; - } - slide_hash(s); - more += _w_size; - } - if (s.strm.avail_in === 0) { - break; - } - - /* If there was no sliding: - * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - * more == window_size - lookahead - strstart - * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - * => more >= window_size - 2*WSIZE + 2 - * In the BIG_MEM or MMAP case (not yet supported), - * window_size == input_size + MIN_LOOKAHEAD && - * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - * Otherwise, window_size == 2*WSIZE so more >= 2. - * If there was sliding, more >= WSIZE. So in all cases, more >= 2. - */ - //Assert(more >= 2, "more < 2"); - n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more); - s.lookahead += n; - - /* Initialize the hash value now that we have some input: */ - if (s.lookahead + s.insert >= MIN_MATCH) { - str = s.strstart - s.insert; - s.ins_h = s.window[str]; - - /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */ - s.ins_h = HASH(s, s.ins_h, s.window[str + 1]); - //#if MIN_MATCH != 3 - // Call update_hash() MIN_MATCH-3 more times - //#endif - while (s.insert) { - /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ - s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]); - s.prev[str & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = str; - str++; - s.insert--; - if (s.lookahead + s.insert < MIN_MATCH) { - break; - } - } - } - /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - * but this is not important since only literal bytes will be emitted. - */ - } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0); - - /* If the WIN_INIT bytes after the end of the current data have never been - * written, then zero those bytes in order to avoid memory check reports of - * the use of uninitialized (or uninitialised as Julian writes) bytes by - * the longest match routines. Update the high water mark for the next - * time through here. WIN_INIT is set to MAX_MATCH since the longest match - * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. - */ - // if (s.high_water < s.window_size) { - // const curr = s.strstart + s.lookahead; - // let init = 0; - // - // if (s.high_water < curr) { - // /* Previous high water mark below current data -- zero WIN_INIT - // * bytes or up to end of window, whichever is less. - // */ - // init = s.window_size - curr; - // if (init > WIN_INIT) - // init = WIN_INIT; - // zmemzero(s->window + curr, (unsigned)init); - // s->high_water = curr + init; - // } - // else if (s->high_water < (ulg)curr + WIN_INIT) { - // /* High water mark at or above current data, but below current data - // * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up - // * to end of window, whichever is less. - // */ - // init = (ulg)curr + WIN_INIT - s->high_water; - // if (init > s->window_size - s->high_water) - // init = s->window_size - s->high_water; - // zmemzero(s->window + s->high_water, (unsigned)init); - // s->high_water += init; - // } - // } - // - // Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, - // "not enough room for search"); - }; - - /* =========================================================================== - * Copy without compression as much as possible from the input stream, return - * the current block state. - * - * In case deflateParams() is used to later switch to a non-zero compression - * level, s->matches (otherwise unused when storing) keeps track of the number - * of hash table slides to perform. If s->matches is 1, then one hash table - * slide will be done when switching. If s->matches is 2, the maximum value - * allowed here, then the hash table will be cleared, since two or more slides - * is the same as a clear. - * - * deflate_stored() is written to minimize the number of times an input byte is - * copied. It is most efficient with large input and output buffers, which - * maximizes the opportunites to have a single copy from next_in to next_out. - */ - var deflate_stored = function deflate_stored(s, flush) { - /* Smallest worthy block size when not flushing or finishing. By default - * this is 32K. This can be as small as 507 bytes for memLevel == 1. For - * large input and output buffers, the stored block size will be larger. - */ - var min_block = s.pending_buf_size - 5 > s.w_size ? s.w_size : s.pending_buf_size - 5; - - /* Copy as many min_block or larger stored blocks directly to next_out as - * possible. If flushing, copy the remaining available input to next_out as - * stored blocks, if there is enough space. - */ - var len, - left, - have, - last = 0; - var used = s.strm.avail_in; - do { - /* Set len to the maximum size block that we can copy directly with the - * available input data and output space. Set left to how much of that - * would be copied from what's left in the window. - */ - len = 65535 /* MAX_STORED */; /* maximum deflate stored block length */ - have = s.bi_valid + 42 >> 3; /* number of header bytes */ - if (s.strm.avail_out < have) { - /* need room for header */ - break; - } - /* maximum stored block length that will fit in avail_out: */ - have = s.strm.avail_out - have; - left = s.strstart - s.block_start; /* bytes left in window */ - if (len > left + s.strm.avail_in) { - len = left + s.strm.avail_in; /* limit len to the input */ - } - - if (len > have) { - len = have; /* limit len to the output */ - } - - /* If the stored block would be less than min_block in length, or if - * unable to copy all of the available input when flushing, then try - * copying to the window and the pending buffer instead. Also don't - * write an empty block when flushing -- deflate() does that. - */ - if (len < min_block && (len === 0 && flush !== Z_FINISH$3 || flush === Z_NO_FLUSH$2 || len !== left + s.strm.avail_in)) { - break; - } - - /* Make a dummy stored block in pending to get the header bytes, - * including any pending bits. This also updates the debugging counts. - */ - last = flush === Z_FINISH$3 && len === left + s.strm.avail_in ? 1 : 0; - _tr_stored_block(s, 0, 0, last); - - /* Replace the lengths in the dummy stored block with len. */ - s.pending_buf[s.pending - 4] = len; - s.pending_buf[s.pending - 3] = len >> 8; - s.pending_buf[s.pending - 2] = ~len; - s.pending_buf[s.pending - 1] = ~len >> 8; - - /* Write the stored block header bytes. */ - flush_pending(s.strm); - - //#ifdef ZLIB_DEBUG - // /* Update debugging counts for the data about to be copied. */ - // s->compressed_len += len << 3; - // s->bits_sent += len << 3; - //#endif - - /* Copy uncompressed bytes from the window to next_out. */ - if (left) { - if (left > len) { - left = len; - } - //zmemcpy(s->strm->next_out, s->window + s->block_start, left); - s.strm.output.set(s.window.subarray(s.block_start, s.block_start + left), s.strm.next_out); - s.strm.next_out += left; - s.strm.avail_out -= left; - s.strm.total_out += left; - s.block_start += left; - len -= left; - } - - /* Copy uncompressed bytes directly from next_in to next_out, updating - * the check value. - */ - if (len) { - read_buf(s.strm, s.strm.output, s.strm.next_out, len); - s.strm.next_out += len; - s.strm.avail_out -= len; - s.strm.total_out += len; - } - } while (last === 0); - - /* Update the sliding window with the last s->w_size bytes of the copied - * data, or append all of the copied data to the existing window if less - * than s->w_size bytes were copied. Also update the number of bytes to - * insert in the hash tables, in the event that deflateParams() switches to - * a non-zero compression level. - */ - used -= s.strm.avail_in; /* number of input bytes directly copied */ - if (used) { - /* If any input was used, then no unused input remains in the window, - * therefore s->block_start == s->strstart. - */ - if (used >= s.w_size) { - /* supplant the previous history */ - s.matches = 2; /* clear hash */ - //zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size); - s.window.set(s.strm.input.subarray(s.strm.next_in - s.w_size, s.strm.next_in), 0); - s.strstart = s.w_size; - s.insert = s.strstart; - } else { - if (s.window_size - s.strstart <= used) { - /* Slide the window down. */ - s.strstart -= s.w_size; - //zmemcpy(s->window, s->window + s->w_size, s->strstart); - s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0); - if (s.matches < 2) { - s.matches++; /* add a pending slide_hash() */ - } - - if (s.insert > s.strstart) { - s.insert = s.strstart; - } - } - //zmemcpy(s->window + s->strstart, s->strm->next_in - used, used); - s.window.set(s.strm.input.subarray(s.strm.next_in - used, s.strm.next_in), s.strstart); - s.strstart += used; - s.insert += used > s.w_size - s.insert ? s.w_size - s.insert : used; - } - s.block_start = s.strstart; - } - if (s.high_water < s.strstart) { - s.high_water = s.strstart; - } - - /* If the last block was written to next_out, then done. */ - if (last) { - return BS_FINISH_DONE; - } - - /* If flushing and all input has been consumed, then done. */ - if (flush !== Z_NO_FLUSH$2 && flush !== Z_FINISH$3 && s.strm.avail_in === 0 && s.strstart === s.block_start) { - return BS_BLOCK_DONE; - } - - /* Fill the window with any remaining input. */ - have = s.window_size - s.strstart; - if (s.strm.avail_in > have && s.block_start >= s.w_size) { - /* Slide the window down. */ - s.block_start -= s.w_size; - s.strstart -= s.w_size; - //zmemcpy(s->window, s->window + s->w_size, s->strstart); - s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0); - if (s.matches < 2) { - s.matches++; /* add a pending slide_hash() */ - } - - have += s.w_size; /* more space now */ - if (s.insert > s.strstart) { - s.insert = s.strstart; - } - } - if (have > s.strm.avail_in) { - have = s.strm.avail_in; - } - if (have) { - read_buf(s.strm, s.window, s.strstart, have); - s.strstart += have; - s.insert += have > s.w_size - s.insert ? s.w_size - s.insert : have; - } - if (s.high_water < s.strstart) { - s.high_water = s.strstart; - } - - /* There was not enough avail_out to write a complete worthy or flushed - * stored block to next_out. Write a stored block to pending instead, if we - * have enough input for a worthy block, or if flushing and there is enough - * room for the remaining input as a stored block in the pending buffer. - */ - have = s.bi_valid + 42 >> 3; /* number of header bytes */ - /* maximum stored block length that will fit in pending: */ - have = s.pending_buf_size - have > 65535 /* MAX_STORED */ ? 65535 /* MAX_STORED */ : s.pending_buf_size - have; - min_block = have > s.w_size ? s.w_size : have; - left = s.strstart - s.block_start; - if (left >= min_block || (left || flush === Z_FINISH$3) && flush !== Z_NO_FLUSH$2 && s.strm.avail_in === 0 && left <= have) { - len = left > have ? have : left; - last = flush === Z_FINISH$3 && s.strm.avail_in === 0 && len === left ? 1 : 0; - _tr_stored_block(s, s.block_start, len, last); - s.block_start += len; - flush_pending(s.strm); - } - - /* We've done all we can with the available input and output. */ - return last ? BS_FINISH_STARTED : BS_NEED_MORE; - }; - - /* =========================================================================== - * Compress as much as possible from the input stream, return the current - * block state. - * This function does not perform lazy evaluation of matches and inserts - * new strings in the dictionary only for unmatched strings or for short - * matches. It is used only for the fast compression options. - */ - var deflate_fast = function deflate_fast(s, flush) { - var hash_head; /* head of the hash chain */ - var bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s.lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$2) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { - break; /* flush the current block */ - } - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = 0 /*NIL*/; - if (s.lookahead >= MIN_MATCH) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]); - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - - /* Find the longest match, discarding those <= prev_length. - * At this point we have always match_length < MIN_MATCH - */ - if (hash_head !== 0 /*NIL*/ && s.strstart - hash_head <= s.w_size - MIN_LOOKAHEAD) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s.match_length = longest_match(s, hash_head); - /* longest_match() sets match_start */ - } - - if (s.match_length >= MIN_MATCH) { - // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only - - /*** _tr_tally_dist(s, s.strstart - s.match_start, - s.match_length - MIN_MATCH, bflush); ***/ - bflush = _tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH); - s.lookahead -= s.match_length; - - /* Insert new strings in the hash table only if the match length - * is not too large. This saves time but degrades compression. - */ - if (s.match_length <= s.max_lazy_match /*max_insert_length*/ && s.lookahead >= MIN_MATCH) { - s.match_length--; /* string at strstart already in table */ - do { - s.strstart++; - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]); - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - /* strstart never exceeds WSIZE-MAX_MATCH, so there are - * always MIN_MATCH bytes ahead. - */ - } while (--s.match_length !== 0); - s.strstart++; - } else { - s.strstart += s.match_length; - s.match_length = 0; - s.ins_h = s.window[s.strstart]; - /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + 1]); - - //#if MIN_MATCH != 3 - // Call UPDATE_HASH() MIN_MATCH-3 more times - //#endif - /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not - * matter since it will be recomputed at next deflate call. - */ - } - } else { - /* No match, output a literal byte */ - //Tracevv((stderr,"%c", s.window[s.strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart]); - s.lookahead--; - s.strstart++; - } - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - - s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1; - if (flush === Z_FINISH$3) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.sym_next) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - - return BS_BLOCK_DONE; - }; - - /* =========================================================================== - * Same as above, but achieves better compression. We use a lazy - * evaluation for matches: a match is finally adopted only if there is - * no better match at the next window position. - */ - var deflate_slow = function deflate_slow(s, flush) { - var hash_head; /* head of hash chain */ - var bflush; /* set if current block must be flushed */ - - var max_insert; - - /* Process the input block. */ - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s.lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$2) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { - break; - } /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = 0 /*NIL*/; - if (s.lookahead >= MIN_MATCH) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]); - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - - /* Find the longest match, discarding those <= prev_length. - */ - s.prev_length = s.match_length; - s.prev_match = s.match_start; - s.match_length = MIN_MATCH - 1; - if (hash_head !== 0 /*NIL*/ && s.prev_length < s.max_lazy_match && s.strstart - hash_head <= s.w_size - MIN_LOOKAHEAD /*MAX_DIST(s)*/) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s.match_length = longest_match(s, hash_head); - /* longest_match() sets match_start */ - - if (s.match_length <= 5 && (s.strategy === Z_FILTERED || s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096 /*TOO_FAR*/)) { - /* If prev_match is also MIN_MATCH, match_start is garbage - * but we will ignore the current match anyway. - */ - s.match_length = MIN_MATCH - 1; - } - } - /* If there was a match at the previous step and the current - * match is not better, output the previous match: - */ - if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) { - max_insert = s.strstart + s.lookahead - MIN_MATCH; - /* Do not insert strings in hash table beyond this. */ - - //check_match(s, s.strstart-1, s.prev_match, s.prev_length); - - /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match, - s.prev_length - MIN_MATCH, bflush);***/ - bflush = _tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH); - /* Insert in hash table all strings up to the end of the match. - * strstart-1 and strstart are already inserted. If there is not - * enough lookahead, the last two strings are not inserted in - * the hash table. - */ - s.lookahead -= s.prev_length - 1; - s.prev_length -= 2; - do { - if (++s.strstart <= max_insert) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]); - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - } while (--s.prev_length !== 0); - s.match_available = 0; - s.match_length = MIN_MATCH - 1; - s.strstart++; - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } else if (s.match_available) { - /* If there was no match at the previous position, output a - * single literal. If there was a match but the current match - * is longer, truncate the previous match to a single literal. - */ - //Tracevv((stderr,"%c", s->window[s->strstart-1])); - /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart - 1]); - if (bflush) { - /*** FLUSH_BLOCK_ONLY(s, 0) ***/ - flush_block_only(s, false); - /***/ - } - - s.strstart++; - s.lookahead--; - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - } else { - /* There is no previous match to compare with, wait for - * the next step to decide. - */ - s.match_available = 1; - s.strstart++; - s.lookahead--; - } - } - //Assert (flush != Z_NO_FLUSH, "no flush?"); - if (s.match_available) { - //Tracevv((stderr,"%c", s->window[s->strstart-1])); - /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart - 1]); - s.match_available = 0; - } - s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1; - if (flush === Z_FINISH$3) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.sym_next) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - - return BS_BLOCK_DONE; - }; - - /* =========================================================================== - * For Z_RLE, simply look for runs of bytes, generate matches only of distance - * one. Do not maintain a hash table. (It will be regenerated if this run of - * deflate switches away from Z_RLE.) - */ - var deflate_rle = function deflate_rle(s, flush) { - var bflush; /* set if current block must be flushed */ - var prev; /* byte at distance one to match */ - var scan, strend; /* scan goes up to strend for length of run */ - - var _win = s.window; - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the longest run, plus one for the unrolled loop. - */ - if (s.lookahead <= MAX_MATCH) { - fill_window(s); - if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH$2) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { - break; - } /* flush the current block */ - } - - /* See how many times the previous byte repeats */ - s.match_length = 0; - if (s.lookahead >= MIN_MATCH && s.strstart > 0) { - scan = s.strstart - 1; - prev = _win[scan]; - if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) { - strend = s.strstart + MAX_MATCH; - do { - /*jshint noempty:false*/ - } while (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && scan < strend); - s.match_length = MAX_MATCH - (strend - scan); - if (s.match_length > s.lookahead) { - s.match_length = s.lookahead; - } - } - //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); - } - - /* Emit match if have run of MIN_MATCH or longer, else emit literal */ - if (s.match_length >= MIN_MATCH) { - //check_match(s, s.strstart, s.strstart - 1, s.match_length); - - /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/ - bflush = _tr_tally(s, 1, s.match_length - MIN_MATCH); - s.lookahead -= s.match_length; - s.strstart += s.match_length; - s.match_length = 0; - } else { - /* No match, output a literal byte */ - //Tracevv((stderr,"%c", s->window[s->strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart]); - s.lookahead--; - s.strstart++; - } - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - - s.insert = 0; - if (flush === Z_FINISH$3) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.sym_next) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - - return BS_BLOCK_DONE; - }; - - /* =========================================================================== - * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. - * (It will be regenerated if this run of deflate switches away from Huffman.) - */ - var deflate_huff = function deflate_huff(s, flush) { - var bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we have a literal to write. */ - if (s.lookahead === 0) { - fill_window(s); - if (s.lookahead === 0) { - if (flush === Z_NO_FLUSH$2) { - return BS_NEED_MORE; - } - break; /* flush the current block */ - } - } - - /* Output a literal byte */ - s.match_length = 0; - //Tracevv((stderr,"%c", s->window[s->strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart]); - s.lookahead--; - s.strstart++; - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - - s.insert = 0; - if (flush === Z_FINISH$3) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.sym_next) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - - return BS_BLOCK_DONE; - }; - - /* Values for max_lazy_match, good_match and max_chain_length, depending on - * the desired pack level (0..9). The values given below have been tuned to - * exclude worst case performance for pathological files. Better values may be - * found for specific files. - */ - function Config(good_length, max_lazy, nice_length, max_chain, func) { - this.good_length = good_length; - this.max_lazy = max_lazy; - this.nice_length = nice_length; - this.max_chain = max_chain; - this.func = func; - } - var configuration_table = [/* good lazy nice chain */ - new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */ - new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */ - new Config(4, 5, 16, 8, deflate_fast), /* 2 */ - new Config(4, 6, 32, 32, deflate_fast), /* 3 */ - - new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */ - new Config(8, 16, 32, 32, deflate_slow), /* 5 */ - new Config(8, 16, 128, 128, deflate_slow), /* 6 */ - new Config(8, 32, 128, 256, deflate_slow), /* 7 */ - new Config(32, 128, 258, 1024, deflate_slow), /* 8 */ - new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */]; - - /* =========================================================================== - * Initialize the "longest match" routines for a new zlib stream - */ - var lm_init = function lm_init(s) { - s.window_size = 2 * s.w_size; - - /*** CLEAR_HASH(s); ***/ - zero(s.head); // Fill with NIL (= 0); - - /* Set the default configuration parameters: - */ - s.max_lazy_match = configuration_table[s.level].max_lazy; - s.good_match = configuration_table[s.level].good_length; - s.nice_match = configuration_table[s.level].nice_length; - s.max_chain_length = configuration_table[s.level].max_chain; - s.strstart = 0; - s.block_start = 0; - s.lookahead = 0; - s.insert = 0; - s.match_length = s.prev_length = MIN_MATCH - 1; - s.match_available = 0; - s.ins_h = 0; - }; - function DeflateState() { - this.strm = null; /* pointer back to this zlib stream */ - this.status = 0; /* as the name implies */ - this.pending_buf = null; /* output still pending */ - this.pending_buf_size = 0; /* size of pending_buf */ - this.pending_out = 0; /* next pending byte to output to the stream */ - this.pending = 0; /* nb of bytes in the pending buffer */ - this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ - this.gzhead = null; /* gzip header information to write */ - this.gzindex = 0; /* where in extra, name, or comment */ - this.method = Z_DEFLATED$2; /* can only be DEFLATED */ - this.last_flush = -1; /* value of flush param for previous deflate call */ - - this.w_size = 0; /* LZ77 window size (32K by default) */ - this.w_bits = 0; /* log2(w_size) (8..16) */ - this.w_mask = 0; /* w_size - 1 */ - - this.window = null; - /* Sliding window. Input bytes are read into the second half of the window, - * and move to the first half later to keep a dictionary of at least wSize - * bytes. With this organization, matches are limited to a distance of - * wSize-MAX_MATCH bytes, but this ensures that IO is always - * performed with a length multiple of the block size. - */ - - this.window_size = 0; - /* Actual size of window: 2*wSize, except when the user input buffer - * is directly used as sliding window. - */ - - this.prev = null; - /* Link to older string with same hash index. To limit the size of this - * array to 64K, this link is maintained only for the last 32K strings. - * An index in this array is thus a window index modulo 32K. - */ - - this.head = null; /* Heads of the hash chains or NIL. */ - - this.ins_h = 0; /* hash index of string to be inserted */ - this.hash_size = 0; /* number of elements in hash table */ - this.hash_bits = 0; /* log2(hash_size) */ - this.hash_mask = 0; /* hash_size-1 */ - - this.hash_shift = 0; - /* Number of bits by which ins_h must be shifted at each input - * step. It must be such that after MIN_MATCH steps, the oldest - * byte no longer takes part in the hash key, that is: - * hash_shift * MIN_MATCH >= hash_bits - */ - - this.block_start = 0; - /* Window position at the beginning of the current output block. Gets - * negative when the window is moved backwards. - */ - - this.match_length = 0; /* length of best match */ - this.prev_match = 0; /* previous match */ - this.match_available = 0; /* set if previous match exists */ - this.strstart = 0; /* start of string to insert */ - this.match_start = 0; /* start of matching string */ - this.lookahead = 0; /* number of valid bytes ahead in window */ - - this.prev_length = 0; - /* Length of the best match at previous step. Matches not greater than this - * are discarded. This is used in the lazy match evaluation. - */ - - this.max_chain_length = 0; - /* To speed up deflation, hash chains are never searched beyond this - * length. A higher limit improves compression ratio but degrades the - * speed. - */ - - this.max_lazy_match = 0; - /* Attempt to find a better match only when the current match is strictly - * smaller than this value. This mechanism is used only for compression - * levels >= 4. - */ - // That's alias to max_lazy_match, don't use directly - //this.max_insert_length = 0; - /* Insert new strings in the hash table only if the match length is not - * greater than this length. This saves time but degrades compression. - * max_insert_length is used only for compression levels <= 3. - */ - - this.level = 0; /* compression level (1..9) */ - this.strategy = 0; /* favor or force Huffman coding*/ - - this.good_match = 0; - /* Use a faster search when the previous match is longer than this */ - - this.nice_match = 0; /* Stop searching when current match exceeds this */ - - /* used by trees.c: */ - - /* Didn't use ct_data typedef below to suppress compiler warning */ - - // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ - // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ - // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ - - // Use flat array of DOUBLE size, with interleaved fata, - // because JS does not support effective - this.dyn_ltree = new Uint16Array(HEAP_SIZE * 2); - this.dyn_dtree = new Uint16Array((2 * D_CODES + 1) * 2); - this.bl_tree = new Uint16Array((2 * BL_CODES + 1) * 2); - zero(this.dyn_ltree); - zero(this.dyn_dtree); - zero(this.bl_tree); - this.l_desc = null; /* desc. for literal tree */ - this.d_desc = null; /* desc. for distance tree */ - this.bl_desc = null; /* desc. for bit length tree */ - - //ush bl_count[MAX_BITS+1]; - this.bl_count = new Uint16Array(MAX_BITS + 1); - /* number of codes at each bit length for an optimal tree */ - - //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ - this.heap = new Uint16Array(2 * L_CODES + 1); /* heap used to build the Huffman trees */ - zero(this.heap); - this.heap_len = 0; /* number of elements in the heap */ - this.heap_max = 0; /* element of largest frequency */ - /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. - * The same heap array is used to build all trees. - */ - - this.depth = new Uint16Array(2 * L_CODES + 1); //uch depth[2*L_CODES+1]; - zero(this.depth); - /* Depth of each subtree used as tie breaker for trees of equal frequency - */ - - this.sym_buf = 0; /* buffer for distances and literals/lengths */ - - this.lit_bufsize = 0; - /* Size of match buffer for literals/lengths. There are 4 reasons for - * limiting lit_bufsize to 64K: - * - frequencies can be kept in 16 bit counters - * - if compression is not successful for the first block, all input - * data is still in the window so we can still emit a stored block even - * when input comes from standard input. (This can also be done for - * all blocks if lit_bufsize is not greater than 32K.) - * - if compression is not successful for a file smaller than 64K, we can - * even emit a stored file instead of a stored block (saving 5 bytes). - * This is applicable only for zip (not gzip or zlib). - * - creating new Huffman trees less frequently may not provide fast - * adaptation to changes in the input data statistics. (Take for - * example a binary file with poorly compressible code followed by - * a highly compressible string table.) Smaller buffer sizes give - * fast adaptation but have of course the overhead of transmitting - * trees more frequently. - * - I can't count above 4 - */ - - this.sym_next = 0; /* running index in sym_buf */ - this.sym_end = 0; /* symbol table full when sym_next reaches this */ - - this.opt_len = 0; /* bit length of current block with optimal trees */ - this.static_len = 0; /* bit length of current block with static trees */ - this.matches = 0; /* number of string matches in current block */ - this.insert = 0; /* bytes at end of window left to insert */ - - this.bi_buf = 0; - /* Output buffer. bits are inserted starting at the bottom (least - * significant bits). - */ - this.bi_valid = 0; - /* Number of valid bits in bi_buf. All bits above the last valid bit - * are always zero. - */ - - // Used for window memory init. We safely ignore it for JS. That makes - // sense only for pointers and memory check tools. - //this.high_water = 0; - /* High water mark offset in window for initialized bytes -- bytes above - * this are set to zero in order to avoid memory check warnings when - * longest match routines access bytes past the input. This is then - * updated to the new high water mark. - */ - } - - /* ========================================================================= - * Check for a valid deflate stream state. Return 0 if ok, 1 if not. - */ - var deflateStateCheck = function deflateStateCheck(strm) { - if (!strm) { - return 1; - } - var s = strm.state; - if (!s || s.strm !== strm || s.status !== INIT_STATE && - //#ifdef GZIP - s.status !== GZIP_STATE && - //#endif - s.status !== EXTRA_STATE && s.status !== NAME_STATE && s.status !== COMMENT_STATE && s.status !== HCRC_STATE && s.status !== BUSY_STATE && s.status !== FINISH_STATE) { - return 1; - } - return 0; - }; - var deflateResetKeep = function deflateResetKeep(strm) { - if (deflateStateCheck(strm)) { - return err(strm, Z_STREAM_ERROR$2); - } - strm.total_in = strm.total_out = 0; - strm.data_type = Z_UNKNOWN; - var s = strm.state; - s.pending = 0; - s.pending_out = 0; - if (s.wrap < 0) { - s.wrap = -s.wrap; - /* was made negative by deflate(..., Z_FINISH); */ - } - - s.status = - //#ifdef GZIP - s.wrap === 2 ? GZIP_STATE : - //#endif - s.wrap ? INIT_STATE : BUSY_STATE; - strm.adler = s.wrap === 2 ? 0 // crc32(0, Z_NULL, 0) - : 1; // adler32(0, Z_NULL, 0) - s.last_flush = -2; - _tr_init(s); - return Z_OK$3; - }; - var deflateReset = function deflateReset(strm) { - var ret = deflateResetKeep(strm); - if (ret === Z_OK$3) { - lm_init(strm.state); - } - return ret; - }; - var deflateSetHeader = function deflateSetHeader(strm, head) { - if (deflateStateCheck(strm) || strm.state.wrap !== 2) { - return Z_STREAM_ERROR$2; - } - strm.state.gzhead = head; - return Z_OK$3; - }; - var deflateInit2 = function deflateInit2(strm, level, method, windowBits, memLevel, strategy) { - if (!strm) { - // === Z_NULL - return Z_STREAM_ERROR$2; - } - var wrap = 1; - if (level === Z_DEFAULT_COMPRESSION$1) { - level = 6; - } - if (windowBits < 0) { - /* suppress zlib wrapper */ - wrap = 0; - windowBits = -windowBits; - } else if (windowBits > 15) { - wrap = 2; /* write gzip wrapper instead */ - windowBits -= 16; - } - if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED$2 || windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED || windowBits === 8 && wrap !== 1) { - return err(strm, Z_STREAM_ERROR$2); - } - if (windowBits === 8) { - windowBits = 9; - } - /* until 256-byte window bug fixed */ - - var s = new DeflateState(); - strm.state = s; - s.strm = strm; - s.status = INIT_STATE; /* to pass state test in deflateReset() */ - - s.wrap = wrap; - s.gzhead = null; - s.w_bits = windowBits; - s.w_size = 1 << s.w_bits; - s.w_mask = s.w_size - 1; - s.hash_bits = memLevel + 7; - s.hash_size = 1 << s.hash_bits; - s.hash_mask = s.hash_size - 1; - s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH); - s.window = new Uint8Array(s.w_size * 2); - s.head = new Uint16Array(s.hash_size); - s.prev = new Uint16Array(s.w_size); - - // Don't need mem init magic for JS. - //s.high_water = 0; /* nothing written to s->window yet */ - - s.lit_bufsize = 1 << memLevel + 6; /* 16K elements by default */ - - /* We overlay pending_buf and sym_buf. This works since the average size - * for length/distance pairs over any compressed block is assured to be 31 - * bits or less. - * - * Analysis: The longest fixed codes are a length code of 8 bits plus 5 - * extra bits, for lengths 131 to 257. The longest fixed distance codes are - * 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest - * possible fixed-codes length/distance pair is then 31 bits total. - * - * sym_buf starts one-fourth of the way into pending_buf. So there are - * three bytes in sym_buf for every four bytes in pending_buf. Each symbol - * in sym_buf is three bytes -- two for the distance and one for the - * literal/length. As each symbol is consumed, the pointer to the next - * sym_buf value to read moves forward three bytes. From that symbol, up to - * 31 bits are written to pending_buf. The closest the written pending_buf - * bits gets to the next sym_buf symbol to read is just before the last - * code is written. At that time, 31*(n-2) bits have been written, just - * after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at - * 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1 - * symbols are written.) The closest the writing gets to what is unread is - * then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and - * can range from 128 to 32768. - * - * Therefore, at a minimum, there are 142 bits of space between what is - * written and what is read in the overlain buffers, so the symbols cannot - * be overwritten by the compressed data. That space is actually 139 bits, - * due to the three-bit fixed-code block header. - * - * That covers the case where either Z_FIXED is specified, forcing fixed - * codes, or when the use of fixed codes is chosen, because that choice - * results in a smaller compressed block than dynamic codes. That latter - * condition then assures that the above analysis also covers all dynamic - * blocks. A dynamic-code block will only be chosen to be emitted if it has - * fewer bits than a fixed-code block would for the same set of symbols. - * Therefore its average symbol length is assured to be less than 31. So - * the compressed data for a dynamic block also cannot overwrite the - * symbols from which it is being constructed. - */ - - s.pending_buf_size = s.lit_bufsize * 4; - s.pending_buf = new Uint8Array(s.pending_buf_size); - - // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`) - //s->sym_buf = s->pending_buf + s->lit_bufsize; - s.sym_buf = s.lit_bufsize; - - //s->sym_end = (s->lit_bufsize - 1) * 3; - s.sym_end = (s.lit_bufsize - 1) * 3; - /* We avoid equality with lit_bufsize*3 because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ - - s.level = level; - s.strategy = strategy; - s.method = method; - return deflateReset(strm); - }; - var deflateInit = function deflateInit(strm, level) { - return deflateInit2(strm, level, Z_DEFLATED$2, MAX_WBITS$1, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY$1); - }; - - /* ========================================================================= */ - var deflate$2 = function deflate(strm, flush) { - if (deflateStateCheck(strm) || flush > Z_BLOCK$1 || flush < 0) { - return strm ? err(strm, Z_STREAM_ERROR$2) : Z_STREAM_ERROR$2; - } - var s = strm.state; - if (!strm.output || strm.avail_in !== 0 && !strm.input || s.status === FINISH_STATE && flush !== Z_FINISH$3) { - return err(strm, strm.avail_out === 0 ? Z_BUF_ERROR$1 : Z_STREAM_ERROR$2); - } - var old_flush = s.last_flush; - s.last_flush = flush; - - /* Flush as much pending output as possible */ - if (s.pending !== 0) { - flush_pending(strm); - if (strm.avail_out === 0) { - /* Since avail_out is 0, deflate will be called again with - * more output space, but possibly with both pending and - * avail_in equal to zero. There won't be anything to do, - * but this is not an error situation so make sure we - * return OK instead of BUF_ERROR at next call of deflate: - */ - s.last_flush = -1; - return Z_OK$3; - } - - /* Make sure there is something to do and avoid duplicate consecutive - * flushes. For repeated and useless calls with Z_FINISH, we keep - * returning Z_STREAM_END instead of Z_BUF_ERROR. - */ - } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) && flush !== Z_FINISH$3) { - return err(strm, Z_BUF_ERROR$1); - } - - /* User must not provide more input after the first FINISH: */ - if (s.status === FINISH_STATE && strm.avail_in !== 0) { - return err(strm, Z_BUF_ERROR$1); - } - - /* Write the header */ - if (s.status === INIT_STATE && s.wrap === 0) { - s.status = BUSY_STATE; - } - if (s.status === INIT_STATE) { - /* zlib header */ - var header = Z_DEFLATED$2 + (s.w_bits - 8 << 4) << 8; - var level_flags = -1; - if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) { - level_flags = 0; - } else if (s.level < 6) { - level_flags = 1; - } else if (s.level === 6) { - level_flags = 2; - } else { - level_flags = 3; - } - header |= level_flags << 6; - if (s.strstart !== 0) { - header |= PRESET_DICT; - } - header += 31 - header % 31; - putShortMSB(s, header); - - /* Save the adler32 of the preset dictionary: */ - if (s.strstart !== 0) { - putShortMSB(s, strm.adler >>> 16); - putShortMSB(s, strm.adler & 0xffff); - } - strm.adler = 1; // adler32(0L, Z_NULL, 0); - s.status = BUSY_STATE; - - /* Compression must start with an empty pending buffer */ - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$3; - } - } - //#ifdef GZIP - if (s.status === GZIP_STATE) { - /* gzip header */ - strm.adler = 0; //crc32(0L, Z_NULL, 0); - put_byte(s, 31); - put_byte(s, 139); - put_byte(s, 8); - if (!s.gzhead) { - // s->gzhead == Z_NULL - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, s.level === 9 ? 2 : s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? 4 : 0); - put_byte(s, OS_CODE); - s.status = BUSY_STATE; - - /* Compression must start with an empty pending buffer */ - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$3; - } - } else { - put_byte(s, (s.gzhead.text ? 1 : 0) + (s.gzhead.hcrc ? 2 : 0) + (!s.gzhead.extra ? 0 : 4) + (!s.gzhead.name ? 0 : 8) + (!s.gzhead.comment ? 0 : 16)); - put_byte(s, s.gzhead.time & 0xff); - put_byte(s, s.gzhead.time >> 8 & 0xff); - put_byte(s, s.gzhead.time >> 16 & 0xff); - put_byte(s, s.gzhead.time >> 24 & 0xff); - put_byte(s, s.level === 9 ? 2 : s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? 4 : 0); - put_byte(s, s.gzhead.os & 0xff); - if (s.gzhead.extra && s.gzhead.extra.length) { - put_byte(s, s.gzhead.extra.length & 0xff); - put_byte(s, s.gzhead.extra.length >> 8 & 0xff); - } - if (s.gzhead.hcrc) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending, 0); - } - s.gzindex = 0; - s.status = EXTRA_STATE; - } - } - if (s.status === EXTRA_STATE) { - if (s.gzhead.extra /* != Z_NULL*/) { - var beg = s.pending; /* start of bytes to update crc */ - var left = (s.gzhead.extra.length & 0xffff) - s.gzindex; - while (s.pending + left > s.pending_buf_size) { - var copy = s.pending_buf_size - s.pending; - // zmemcpy(s.pending_buf + s.pending, - // s.gzhead.extra + s.gzindex, copy); - s.pending_buf.set(s.gzhead.extra.subarray(s.gzindex, s.gzindex + copy), s.pending); - s.pending = s.pending_buf_size; - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - //---// - s.gzindex += copy; - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$3; - } - beg = 0; - left -= copy; - } - // JS specific: s.gzhead.extra may be TypedArray or Array for backward compatibility - // TypedArray.slice and TypedArray.from don't exist in IE10-IE11 - var gzhead_extra = new Uint8Array(s.gzhead.extra); - // zmemcpy(s->pending_buf + s->pending, - // s->gzhead->extra + s->gzindex, left); - s.pending_buf.set(gzhead_extra.subarray(s.gzindex, s.gzindex + left), s.pending); - s.pending += left; - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - //---// - s.gzindex = 0; - } - s.status = NAME_STATE; - } - if (s.status === NAME_STATE) { - if (s.gzhead.name /* != Z_NULL*/) { - var _beg = s.pending; /* start of bytes to update crc */ - var val; - do { - if (s.pending === s.pending_buf_size) { - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > _beg) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - _beg, _beg); - } - //---// - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$3; - } - _beg = 0; - } - // JS specific: little magic to add zero terminator to end of string - if (s.gzindex < s.gzhead.name.length) { - val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff; - } else { - val = 0; - } - put_byte(s, val); - } while (val !== 0); - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > _beg) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - _beg, _beg); - } - //---// - s.gzindex = 0; - } - s.status = COMMENT_STATE; - } - if (s.status === COMMENT_STATE) { - if (s.gzhead.comment /* != Z_NULL*/) { - var _beg2 = s.pending; /* start of bytes to update crc */ - var _val; - do { - if (s.pending === s.pending_buf_size) { - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > _beg2) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - _beg2, _beg2); - } - //---// - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$3; - } - _beg2 = 0; - } - // JS specific: little magic to add zero terminator to end of string - if (s.gzindex < s.gzhead.comment.length) { - _val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff; - } else { - _val = 0; - } - put_byte(s, _val); - } while (_val !== 0); - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > _beg2) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - _beg2, _beg2); - } - //---// - } - - s.status = HCRC_STATE; - } - if (s.status === HCRC_STATE) { - if (s.gzhead.hcrc) { - if (s.pending + 2 > s.pending_buf_size) { - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$3; - } - } - put_byte(s, strm.adler & 0xff); - put_byte(s, strm.adler >> 8 & 0xff); - strm.adler = 0; //crc32(0L, Z_NULL, 0); - } - - s.status = BUSY_STATE; - - /* Compression must start with an empty pending buffer */ - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$3; - } - } - //#endif - - /* Start a new block or continue the current one. - */ - if (strm.avail_in !== 0 || s.lookahead !== 0 || flush !== Z_NO_FLUSH$2 && s.status !== FINISH_STATE) { - var bstate = s.level === 0 ? deflate_stored(s, flush) : s.strategy === Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : s.strategy === Z_RLE ? deflate_rle(s, flush) : configuration_table[s.level].func(s, flush); - if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) { - s.status = FINISH_STATE; - } - if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) { - if (strm.avail_out === 0) { - s.last_flush = -1; - /* avoid BUF_ERROR next call, see above */ - } - - return Z_OK$3; - /* If flush != Z_NO_FLUSH && avail_out == 0, the next call - * of deflate should use the same flush parameter to make sure - * that the flush is complete. So we don't have to output an - * empty block here, this will be done at next call. This also - * ensures that for a very small output buffer, we emit at most - * one empty block. - */ - } - - if (bstate === BS_BLOCK_DONE) { - if (flush === Z_PARTIAL_FLUSH) { - _tr_align(s); - } else if (flush !== Z_BLOCK$1) { - /* FULL_FLUSH or SYNC_FLUSH */ - - _tr_stored_block(s, 0, 0, false); - /* For a full flush, this empty block will be recognized - * as a special marker by inflate_sync(). - */ - if (flush === Z_FULL_FLUSH$1) { - /*** CLEAR_HASH(s); ***/ /* forget history */ - zero(s.head); // Fill with NIL (= 0); - - if (s.lookahead === 0) { - s.strstart = 0; - s.block_start = 0; - s.insert = 0; - } - } - } - flush_pending(strm); - if (strm.avail_out === 0) { - s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */ - return Z_OK$3; - } - } - } - if (flush !== Z_FINISH$3) { - return Z_OK$3; - } - if (s.wrap <= 0) { - return Z_STREAM_END$3; - } - - /* Write the trailer */ - if (s.wrap === 2) { - put_byte(s, strm.adler & 0xff); - put_byte(s, strm.adler >> 8 & 0xff); - put_byte(s, strm.adler >> 16 & 0xff); - put_byte(s, strm.adler >> 24 & 0xff); - put_byte(s, strm.total_in & 0xff); - put_byte(s, strm.total_in >> 8 & 0xff); - put_byte(s, strm.total_in >> 16 & 0xff); - put_byte(s, strm.total_in >> 24 & 0xff); - } else { - putShortMSB(s, strm.adler >>> 16); - putShortMSB(s, strm.adler & 0xffff); - } - flush_pending(strm); - /* If avail_out is zero, the application will call deflate again - * to flush the rest. - */ - if (s.wrap > 0) { - s.wrap = -s.wrap; - } - /* write the trailer only once! */ - return s.pending !== 0 ? Z_OK$3 : Z_STREAM_END$3; - }; - var deflateEnd = function deflateEnd(strm) { - if (deflateStateCheck(strm)) { - return Z_STREAM_ERROR$2; - } - var status = strm.state.status; - strm.state = null; - return status === BUSY_STATE ? err(strm, Z_DATA_ERROR$2) : Z_OK$3; - }; - - /* ========================================================================= - * Initializes the compression dictionary from the given byte - * sequence without producing any compressed output. - */ - var deflateSetDictionary = function deflateSetDictionary(strm, dictionary) { - var dictLength = dictionary.length; - if (deflateStateCheck(strm)) { - return Z_STREAM_ERROR$2; - } - var s = strm.state; - var wrap = s.wrap; - if (wrap === 2 || wrap === 1 && s.status !== INIT_STATE || s.lookahead) { - return Z_STREAM_ERROR$2; - } - - /* when using zlib wrappers, compute Adler-32 for provided dictionary */ - if (wrap === 1) { - /* adler32(strm->adler, dictionary, dictLength); */ - strm.adler = adler32_1(strm.adler, dictionary, dictLength, 0); - } - s.wrap = 0; /* avoid computing Adler-32 in read_buf */ - - /* if dictionary would fill window, just replace the history */ - if (dictLength >= s.w_size) { - if (wrap === 0) { - /* already empty otherwise */ - /*** CLEAR_HASH(s); ***/ - zero(s.head); // Fill with NIL (= 0); - s.strstart = 0; - s.block_start = 0; - s.insert = 0; - } - /* use the tail */ - // dictionary = dictionary.slice(dictLength - s.w_size); - var tmpDict = new Uint8Array(s.w_size); - tmpDict.set(dictionary.subarray(dictLength - s.w_size, dictLength), 0); - dictionary = tmpDict; - dictLength = s.w_size; - } - /* insert dictionary into window and hash */ - var avail = strm.avail_in; - var next = strm.next_in; - var input = strm.input; - strm.avail_in = dictLength; - strm.next_in = 0; - strm.input = dictionary; - fill_window(s); - while (s.lookahead >= MIN_MATCH) { - var str = s.strstart; - var n = s.lookahead - (MIN_MATCH - 1); - do { - /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ - s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]); - s.prev[str & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = str; - str++; - } while (--n); - s.strstart = str; - s.lookahead = MIN_MATCH - 1; - fill_window(s); - } - s.strstart += s.lookahead; - s.block_start = s.strstart; - s.insert = s.lookahead; - s.lookahead = 0; - s.match_length = s.prev_length = MIN_MATCH - 1; - s.match_available = 0; - strm.next_in = next; - strm.input = input; - strm.avail_in = avail; - s.wrap = wrap; - return Z_OK$3; - }; - var deflateInit_1 = deflateInit; - var deflateInit2_1 = deflateInit2; - var deflateReset_1 = deflateReset; - var deflateResetKeep_1 = deflateResetKeep; - var deflateSetHeader_1 = deflateSetHeader; - var deflate_2$1 = deflate$2; - var deflateEnd_1 = deflateEnd; - var deflateSetDictionary_1 = deflateSetDictionary; - var deflateInfo = 'pako deflate (from Nodeca project)'; - - /* Not implemented - module.exports.deflateBound = deflateBound; - module.exports.deflateCopy = deflateCopy; - module.exports.deflateGetDictionary = deflateGetDictionary; - module.exports.deflateParams = deflateParams; - module.exports.deflatePending = deflatePending; - module.exports.deflatePrime = deflatePrime; - module.exports.deflateTune = deflateTune; - */ - - var deflate_1$2 = { - deflateInit: deflateInit_1, - deflateInit2: deflateInit2_1, - deflateReset: deflateReset_1, - deflateResetKeep: deflateResetKeep_1, - deflateSetHeader: deflateSetHeader_1, - deflate: deflate_2$1, - deflateEnd: deflateEnd_1, - deflateSetDictionary: deflateSetDictionary_1, - deflateInfo: deflateInfo - }; - - function _typeof(obj) { - "@babel/helpers - typeof"; - - return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { - return typeof obj; - } : function (obj) { - return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }, _typeof(obj); - } - - var _has = function _has(obj, key) { - return Object.prototype.hasOwnProperty.call(obj, key); - }; - var assign = function assign(obj /*from1, from2, from3, ...*/) { - var sources = Array.prototype.slice.call(arguments, 1); - while (sources.length) { - var source = sources.shift(); - if (!source) { - continue; - } - if (_typeof(source) !== 'object') { - throw new TypeError(source + 'must be non-object'); - } - for (var p in source) { - if (_has(source, p)) { - obj[p] = source[p]; - } - } - } - return obj; - }; - - // Join array of chunks to single array. - var flattenChunks = function flattenChunks(chunks) { - // calculate data length - var len = 0; - for (var i = 0, l = chunks.length; i < l; i++) { - len += chunks[i].length; - } - - // join chunks - var result = new Uint8Array(len); - for (var _i = 0, pos = 0, _l = chunks.length; _i < _l; _i++) { - var chunk = chunks[_i]; - result.set(chunk, pos); - pos += chunk.length; - } - return result; - }; - var common = { - assign: assign, - flattenChunks: flattenChunks - }; - - // String encode/decode helpers - - // Quick check if we can use fast array to bin string conversion - // - // - apply(Array) can fail on Android 2.2 - // - apply(Uint8Array) can fail on iOS 5.1 Safari - // - var STR_APPLY_UIA_OK = true; - try { - String.fromCharCode.apply(null, new Uint8Array(1)); - } catch (__) { - STR_APPLY_UIA_OK = false; - } - - // Table with utf8 lengths (calculated by first byte of sequence) - // Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS, - // because max possible codepoint is 0x10ffff - var _utf8len = new Uint8Array(256); - for (var q = 0; q < 256; q++) { - _utf8len[q] = q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1; - } - _utf8len[254] = _utf8len[254] = 1; // Invalid sequence start - - // convert string to array (typed, when possible) - var string2buf = function string2buf(str) { - if (typeof TextEncoder === 'function' && TextEncoder.prototype.encode) { - return new TextEncoder().encode(str); - } - var buf, - c, - c2, - m_pos, - i, - str_len = str.length, - buf_len = 0; - - // count binary size - for (m_pos = 0; m_pos < str_len; m_pos++) { - c = str.charCodeAt(m_pos); - if ((c & 0xfc00) === 0xd800 && m_pos + 1 < str_len) { - c2 = str.charCodeAt(m_pos + 1); - if ((c2 & 0xfc00) === 0xdc00) { - c = 0x10000 + (c - 0xd800 << 10) + (c2 - 0xdc00); - m_pos++; - } - } - buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4; - } - - // allocate buffer - buf = new Uint8Array(buf_len); - - // convert - for (i = 0, m_pos = 0; i < buf_len; m_pos++) { - c = str.charCodeAt(m_pos); - if ((c & 0xfc00) === 0xd800 && m_pos + 1 < str_len) { - c2 = str.charCodeAt(m_pos + 1); - if ((c2 & 0xfc00) === 0xdc00) { - c = 0x10000 + (c - 0xd800 << 10) + (c2 - 0xdc00); - m_pos++; - } - } - if (c < 0x80) { - /* one byte */ - buf[i++] = c; - } else if (c < 0x800) { - /* two bytes */ - buf[i++] = 0xC0 | c >>> 6; - buf[i++] = 0x80 | c & 0x3f; - } else if (c < 0x10000) { - /* three bytes */ - buf[i++] = 0xE0 | c >>> 12; - buf[i++] = 0x80 | c >>> 6 & 0x3f; - buf[i++] = 0x80 | c & 0x3f; - } else { - /* four bytes */ - buf[i++] = 0xf0 | c >>> 18; - buf[i++] = 0x80 | c >>> 12 & 0x3f; - buf[i++] = 0x80 | c >>> 6 & 0x3f; - buf[i++] = 0x80 | c & 0x3f; - } - } - return buf; - }; - - // Helper - var buf2binstring = function buf2binstring(buf, len) { - // On Chrome, the arguments in a function call that are allowed is `65534`. - // If the length of the buffer is smaller than that, we can use this optimization, - // otherwise we will take a slower path. - if (len < 65534) { - if (buf.subarray && STR_APPLY_UIA_OK) { - return String.fromCharCode.apply(null, buf.length === len ? buf : buf.subarray(0, len)); - } - } - var result = ''; - for (var i = 0; i < len; i++) { - result += String.fromCharCode(buf[i]); - } - return result; - }; - - // convert array to string - var buf2string = function buf2string(buf, max) { - var len = max || buf.length; - if (typeof TextDecoder === 'function' && TextDecoder.prototype.decode) { - return new TextDecoder().decode(buf.subarray(0, max)); - } - var i, out; - - // Reserve max possible length (2 words per char) - // NB: by unknown reasons, Array is significantly faster for - // String.fromCharCode.apply than Uint16Array. - var utf16buf = new Array(len * 2); - for (out = 0, i = 0; i < len;) { - var c = buf[i++]; - // quick process ascii - if (c < 0x80) { - utf16buf[out++] = c; - continue; - } - var c_len = _utf8len[c]; - // skip 5 & 6 byte codes - if (c_len > 4) { - utf16buf[out++] = 0xfffd; - i += c_len - 1; - continue; - } - - // apply mask on first byte - c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07; - // join the rest - while (c_len > 1 && i < len) { - c = c << 6 | buf[i++] & 0x3f; - c_len--; - } - - // terminated by end of string? - if (c_len > 1) { - utf16buf[out++] = 0xfffd; - continue; - } - if (c < 0x10000) { - utf16buf[out++] = c; - } else { - c -= 0x10000; - utf16buf[out++] = 0xd800 | c >> 10 & 0x3ff; - utf16buf[out++] = 0xdc00 | c & 0x3ff; - } - } - return buf2binstring(utf16buf, out); - }; - - // Calculate max possible position in utf8 buffer, - // that will not break sequence. If that's not possible - // - (very small limits) return max size as is. - // - // buf[] - utf8 bytes array - // max - length limit (mandatory); - var utf8border = function utf8border(buf, max) { - max = max || buf.length; - if (max > buf.length) { - max = buf.length; - } - - // go back from last position, until start of sequence found - var pos = max - 1; - while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { - pos--; - } - - // Very small and broken sequence, - // return max, because we should return something anyway. - if (pos < 0) { - return max; - } - - // If we came to start of buffer - that means buffer is too small, - // return max too. - if (pos === 0) { - return max; - } - return pos + _utf8len[buf[pos]] > max ? pos : max; - }; - var strings = { - string2buf: string2buf, - buf2string: buf2string, - utf8border: utf8border - }; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - function ZStream() { - /* next input byte */ - this.input = null; // JS specific, because we have no pointers - this.next_in = 0; - /* number of bytes available at input */ - this.avail_in = 0; - /* total number of input bytes read so far */ - this.total_in = 0; - /* next output byte should be put there */ - this.output = null; // JS specific, because we have no pointers - this.next_out = 0; - /* remaining free space at output */ - this.avail_out = 0; - /* total number of bytes output so far */ - this.total_out = 0; - /* last error message, NULL if no error */ - this.msg = '' /*Z_NULL*/; - /* not visible by applications */ - this.state = null; - /* best guess about the data type: binary or text */ - this.data_type = 2 /*Z_UNKNOWN*/; - /* adler32 value of the uncompressed data */ - this.adler = 0; - } - var zstream = ZStream; - - var toString$1 = Object.prototype.toString; - - /* Public constants ==========================================================*/ - /* ===========================================================================*/ - - var Z_NO_FLUSH$1 = constants$2.Z_NO_FLUSH, - Z_SYNC_FLUSH = constants$2.Z_SYNC_FLUSH, - Z_FULL_FLUSH = constants$2.Z_FULL_FLUSH, - Z_FINISH$2 = constants$2.Z_FINISH, - Z_OK$2 = constants$2.Z_OK, - Z_STREAM_END$2 = constants$2.Z_STREAM_END, - Z_DEFAULT_COMPRESSION = constants$2.Z_DEFAULT_COMPRESSION, - Z_DEFAULT_STRATEGY = constants$2.Z_DEFAULT_STRATEGY, - Z_DEFLATED$1 = constants$2.Z_DEFLATED; - - /* ===========================================================================*/ - - /** - * class Deflate - * - * Generic JS-style wrapper for zlib calls. If you don't need - * streaming behaviour - use more simple functions: [[deflate]], - * [[deflateRaw]] and [[gzip]]. - **/ - - /* internal - * Deflate.chunks -> Array - * - * Chunks of output data, if [[Deflate#onData]] not overridden. - **/ - - /** - * Deflate.result -> Uint8Array - * - * Compressed result, generated by default [[Deflate#onData]] - * and [[Deflate#onEnd]] handlers. Filled after you push last chunk - * (call [[Deflate#push]] with `Z_FINISH` / `true` param). - **/ - - /** - * Deflate.err -> Number - * - * Error code after deflate finished. 0 (Z_OK) on success. - * You will not need it in real life, because deflate errors - * are possible only on wrong options or bad `onData` / `onEnd` - * custom handlers. - **/ - - /** - * Deflate.msg -> String - * - * Error message, if [[Deflate.err]] != 0 - **/ - - /** - * new Deflate(options) - * - options (Object): zlib deflate options. - * - * Creates new deflator instance with specified params. Throws exception - * on bad params. Supported options: - * - * - `level` - * - `windowBits` - * - `memLevel` - * - `strategy` - * - `dictionary` - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information on these. - * - * Additional options, for internal needs: - * - * - `chunkSize` - size of generated data chunks (16K by default) - * - `raw` (Boolean) - do raw deflate - * - `gzip` (Boolean) - create gzip wrapper - * - `header` (Object) - custom header for gzip - * - `text` (Boolean) - true if compressed data believed to be text - * - `time` (Number) - modification time, unix timestamp - * - `os` (Number) - operation system code - * - `extra` (Array) - array of bytes with extra data (max 65536) - * - `name` (String) - file name (binary string) - * - `comment` (String) - comment (binary string) - * - `hcrc` (Boolean) - true if header crc should be added - * - * ##### Example: - * - * ```javascript - * const pako = require('pako') - * , chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9]) - * , chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]); - * - * const deflate = new pako.Deflate({ level: 3}); - * - * deflate.push(chunk1, false); - * deflate.push(chunk2, true); // true -> last chunk - * - * if (deflate.err) { throw new Error(deflate.err); } - * - * console.log(deflate.result); - * ``` - **/ - function Deflate$1(options) { - this.options = common.assign({ - level: Z_DEFAULT_COMPRESSION, - method: Z_DEFLATED$1, - chunkSize: 16384, - windowBits: 15, - memLevel: 8, - strategy: Z_DEFAULT_STRATEGY - }, options || {}); - var opt = this.options; - if (opt.raw && opt.windowBits > 0) { - opt.windowBits = -opt.windowBits; - } else if (opt.gzip && opt.windowBits > 0 && opt.windowBits < 16) { - opt.windowBits += 16; - } - this.err = 0; // error code, if happens (0 = Z_OK) - this.msg = ''; // error message - this.ended = false; // used to avoid multiple onEnd() calls - this.chunks = []; // chunks of compressed data - - this.strm = new zstream(); - this.strm.avail_out = 0; - var status = deflate_1$2.deflateInit2(this.strm, opt.level, opt.method, opt.windowBits, opt.memLevel, opt.strategy); - if (status !== Z_OK$2) { - throw new Error(messages[status]); - } - if (opt.header) { - deflate_1$2.deflateSetHeader(this.strm, opt.header); - } - if (opt.dictionary) { - var dict; - // Convert data if needed - if (typeof opt.dictionary === 'string') { - // If we need to compress text, change encoding to utf8. - dict = strings.string2buf(opt.dictionary); - } else if (toString$1.call(opt.dictionary) === '[object ArrayBuffer]') { - dict = new Uint8Array(opt.dictionary); - } else { - dict = opt.dictionary; - } - status = deflate_1$2.deflateSetDictionary(this.strm, dict); - if (status !== Z_OK$2) { - throw new Error(messages[status]); - } - this._dict_set = true; - } - } - - /** - * Deflate#push(data[, flush_mode]) -> Boolean - * - data (Uint8Array|ArrayBuffer|String): input data. Strings will be - * converted to utf8 byte sequence. - * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes. - * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH. - * - * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with - * new compressed chunks. Returns `true` on success. The last data block must - * have `flush_mode` Z_FINISH (or `true`). That will flush internal pending - * buffers and call [[Deflate#onEnd]]. - * - * On fail call [[Deflate#onEnd]] with error code and return false. - * - * ##### Example - * - * ```javascript - * push(chunk, false); // push one of data chunks - * ... - * push(chunk, true); // push last chunk - * ``` - **/ - Deflate$1.prototype.push = function (data, flush_mode) { - var strm = this.strm; - var chunkSize = this.options.chunkSize; - var status, _flush_mode; - if (this.ended) { - return false; - } - if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;else _flush_mode = flush_mode === true ? Z_FINISH$2 : Z_NO_FLUSH$1; - - // Convert data if needed - if (typeof data === 'string') { - // If we need to compress text, change encoding to utf8. - strm.input = strings.string2buf(data); - } else if (toString$1.call(data) === '[object ArrayBuffer]') { - strm.input = new Uint8Array(data); - } else { - strm.input = data; - } - strm.next_in = 0; - strm.avail_in = strm.input.length; - for (;;) { - if (strm.avail_out === 0) { - strm.output = new Uint8Array(chunkSize); - strm.next_out = 0; - strm.avail_out = chunkSize; - } - - // Make sure avail_out > 6 to avoid repeating markers - if ((_flush_mode === Z_SYNC_FLUSH || _flush_mode === Z_FULL_FLUSH) && strm.avail_out <= 6) { - this.onData(strm.output.subarray(0, strm.next_out)); - strm.avail_out = 0; - continue; - } - status = deflate_1$2.deflate(strm, _flush_mode); - - // Ended => flush and finish - if (status === Z_STREAM_END$2) { - if (strm.next_out > 0) { - this.onData(strm.output.subarray(0, strm.next_out)); - } - status = deflate_1$2.deflateEnd(this.strm); - this.onEnd(status); - this.ended = true; - return status === Z_OK$2; - } - - // Flush if out buffer full - if (strm.avail_out === 0) { - this.onData(strm.output); - continue; - } - - // Flush if requested and has data - if (_flush_mode > 0 && strm.next_out > 0) { - this.onData(strm.output.subarray(0, strm.next_out)); - strm.avail_out = 0; - continue; - } - if (strm.avail_in === 0) break; - } - return true; - }; - - /** - * Deflate#onData(chunk) -> Void - * - chunk (Uint8Array): output data. - * - * By default, stores data blocks in `chunks[]` property and glue - * those in `onEnd`. Override this handler, if you need another behaviour. - **/ - Deflate$1.prototype.onData = function (chunk) { - this.chunks.push(chunk); - }; - - /** - * Deflate#onEnd(status) -> Void - * - status (Number): deflate status. 0 (Z_OK) on success, - * other if not. - * - * Called once after you tell deflate that the input stream is - * complete (Z_FINISH). By default - join collected chunks, - * free memory and fill `results` / `err` properties. - **/ - Deflate$1.prototype.onEnd = function (status) { - // On success - join - if (status === Z_OK$2) { - this.result = common.flattenChunks(this.chunks); - } - this.chunks = []; - this.err = status; - this.msg = this.strm.msg; - }; - - /** - * deflate(data[, options]) -> Uint8Array - * - data (Uint8Array|ArrayBuffer|String): input data to compress. - * - options (Object): zlib deflate options. - * - * Compress `data` with deflate algorithm and `options`. - * - * Supported options are: - * - * - level - * - windowBits - * - memLevel - * - strategy - * - dictionary - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information on these. - * - * Sugar (options): - * - * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify - * negative windowBits implicitly. - * - * ##### Example: - * - * ```javascript - * const pako = require('pako') - * const data = new Uint8Array([1,2,3,4,5,6,7,8,9]); - * - * console.log(pako.deflate(data)); - * ``` - **/ - function deflate$1(input, options) { - var deflator = new Deflate$1(options); - deflator.push(input, true); - - // That will never happens, if you don't cheat with options :) - if (deflator.err) { - throw deflator.msg || messages[deflator.err]; - } - return deflator.result; - } - - /** - * deflateRaw(data[, options]) -> Uint8Array - * - data (Uint8Array|ArrayBuffer|String): input data to compress. - * - options (Object): zlib deflate options. - * - * The same as [[deflate]], but creates raw data, without wrapper - * (header and adler32 crc). - **/ - function deflateRaw$1(input, options) { - options = options || {}; - options.raw = true; - return deflate$1(input, options); - } - - /** - * gzip(data[, options]) -> Uint8Array - * - data (Uint8Array|ArrayBuffer|String): input data to compress. - * - options (Object): zlib deflate options. - * - * The same as [[deflate]], but create gzip wrapper instead of - * deflate one. - **/ - function gzip$1(input, options) { - options = options || {}; - options.gzip = true; - return deflate$1(input, options); - } - var Deflate_1$1 = Deflate$1; - var deflate_2 = deflate$1; - var deflateRaw_1$1 = deflateRaw$1; - var gzip_1$1 = gzip$1; - var constants$1 = constants$2; - var deflate_1$1 = { - Deflate: Deflate_1$1, - deflate: deflate_2, - deflateRaw: deflateRaw_1$1, - gzip: gzip_1$1, - constants: constants$1 - }; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - // See state defs from inflate.js - var BAD$1 = 16209; /* got a data error -- remain here until reset */ - var TYPE$1 = 16191; /* i: waiting for type bits, including last-flag bit */ - - /* - Decode literal, length, and distance codes and write out the resulting - literal and match bytes until either not enough input or output is - available, an end-of-block is encountered, or a data error is encountered. - When large enough input and output buffers are supplied to inflate(), for - example, a 16K input buffer and a 64K output buffer, more than 95% of the - inflate execution time is spent in this routine. - - Entry assumptions: - - state.mode === LEN - strm.avail_in >= 6 - strm.avail_out >= 258 - start >= strm.avail_out - state.bits < 8 - - On return, state.mode is one of: - - LEN -- ran out of enough output space or enough available input - TYPE -- reached end of block code, inflate() to interpret next block - BAD -- error in block data - - Notes: - - - The maximum input bits used by a length/distance pair is 15 bits for the - length code, 5 bits for the length extra, 15 bits for the distance code, - and 13 bits for the distance extra. This totals 48 bits, or six bytes. - Therefore if strm.avail_in >= 6, then there is enough input to avoid - checking for available input while decoding. - - - The maximum bytes that a single length/distance pair can output is 258 - bytes, which is the maximum length that can be coded. inflate_fast() - requires strm.avail_out >= 258 for each loop to avoid checking for - output space. - */ - var inffast = function inflate_fast(strm, start) { - var _in; /* local strm.input */ - var last; /* have enough input while in < last */ - var _out; /* local strm.output */ - var beg; /* inflate()'s initial strm.output */ - var end; /* while out < end, enough space available */ - //#ifdef INFLATE_STRICT - var dmax; /* maximum distance from zlib header */ - //#endif - var wsize; /* window size or zero if not using window */ - var whave; /* valid bytes in the window */ - var wnext; /* window write index */ - // Use `s_window` instead `window`, avoid conflict with instrumentation tools - var s_window; /* allocated sliding window, if wsize != 0 */ - var hold; /* local strm.hold */ - var bits; /* local strm.bits */ - var lcode; /* local strm.lencode */ - var dcode; /* local strm.distcode */ - var lmask; /* mask for first level of length codes */ - var dmask; /* mask for first level of distance codes */ - var here; /* retrieved table entry */ - var op; /* code bits, operation, extra bits, or */ - /* window position, window bytes to copy */ - var len; /* match length, unused bytes */ - var dist; /* match distance */ - var from; /* where to copy match from */ - var from_source; - var input, output; // JS specific, because we have no pointers - - /* copy state to local variables */ - var state = strm.state; - //here = state.here; - _in = strm.next_in; - input = strm.input; - last = _in + (strm.avail_in - 5); - _out = strm.next_out; - output = strm.output; - beg = _out - (start - strm.avail_out); - end = _out + (strm.avail_out - 257); - //#ifdef INFLATE_STRICT - dmax = state.dmax; - //#endif - wsize = state.wsize; - whave = state.whave; - wnext = state.wnext; - s_window = state.window; - hold = state.hold; - bits = state.bits; - lcode = state.lencode; - dcode = state.distcode; - lmask = (1 << state.lenbits) - 1; - dmask = (1 << state.distbits) - 1; - - /* decode literals and length/distances until end-of-block or not enough - input data or output space */ - - top: do { - if (bits < 15) { - hold += input[_in++] << bits; - bits += 8; - hold += input[_in++] << bits; - bits += 8; - } - here = lcode[hold & lmask]; - dolen: for (;;) { - // Goto emulation - op = here >>> 24 /*here.bits*/; - hold >>>= op; - bits -= op; - op = here >>> 16 & 0xff /*here.op*/; - if (op === 0) { - /* literal */ - //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - // "inflate: literal '%c'\n" : - // "inflate: literal 0x%02x\n", here.val)); - output[_out++] = here & 0xffff /*here.val*/; - } else if (op & 16) { - /* length base */ - len = here & 0xffff /*here.val*/; - op &= 15; /* number of extra bits */ - if (op) { - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - } - len += hold & (1 << op) - 1; - hold >>>= op; - bits -= op; - } - //Tracevv((stderr, "inflate: length %u\n", len)); - if (bits < 15) { - hold += input[_in++] << bits; - bits += 8; - hold += input[_in++] << bits; - bits += 8; - } - here = dcode[hold & dmask]; - dodist: for (;;) { - // goto emulation - op = here >>> 24 /*here.bits*/; - hold >>>= op; - bits -= op; - op = here >>> 16 & 0xff /*here.op*/; - - if (op & 16) { - /* distance base */ - dist = here & 0xffff /*here.val*/; - op &= 15; /* number of extra bits */ - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - } - } - dist += hold & (1 << op) - 1; - //#ifdef INFLATE_STRICT - if (dist > dmax) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD$1; - break top; - } - //#endif - hold >>>= op; - bits -= op; - //Tracevv((stderr, "inflate: distance %u\n", dist)); - op = _out - beg; /* max distance in output */ - if (dist > op) { - /* see if copy from window */ - op = dist - op; /* distance back in window */ - if (op > whave) { - if (state.sane) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD$1; - break top; - } - - // (!) This block is disabled in zlib defaults, - // don't enable it for binary compatibility - //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR - // if (len <= op - whave) { - // do { - // output[_out++] = 0; - // } while (--len); - // continue top; - // } - // len -= op - whave; - // do { - // output[_out++] = 0; - // } while (--op > whave); - // if (op === 0) { - // from = _out - dist; - // do { - // output[_out++] = output[from++]; - // } while (--len); - // continue top; - // } - //#endif - } - - from = 0; // window index - from_source = s_window; - if (wnext === 0) { - /* very common case */ - from += wsize - op; - if (op < len) { - /* some from window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } else if (wnext < op) { - /* wrap around window */ - from += wsize + wnext - op; - op -= wnext; - if (op < len) { - /* some from end of window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = 0; - if (wnext < len) { - /* some from start of window */ - op = wnext; - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - } else { - /* contiguous in window */ - from += wnext - op; - if (op < len) { - /* some from window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - while (len > 2) { - output[_out++] = from_source[from++]; - output[_out++] = from_source[from++]; - output[_out++] = from_source[from++]; - len -= 3; - } - if (len) { - output[_out++] = from_source[from++]; - if (len > 1) { - output[_out++] = from_source[from++]; - } - } - } else { - from = _out - dist; /* copy direct from output */ - do { - /* minimum length is three */ - output[_out++] = output[from++]; - output[_out++] = output[from++]; - output[_out++] = output[from++]; - len -= 3; - } while (len > 2); - if (len) { - output[_out++] = output[from++]; - if (len > 1) { - output[_out++] = output[from++]; - } - } - } - } else if ((op & 64) === 0) { - /* 2nd level distance code */ - here = dcode[(here & 0xffff /*here.val*/) + (hold & (1 << op) - 1)]; - continue dodist; - } else { - strm.msg = 'invalid distance code'; - state.mode = BAD$1; - break top; - } - break; // need to emulate goto via "continue" - } - } else if ((op & 64) === 0) { - /* 2nd level length code */ - here = lcode[(here & 0xffff /*here.val*/) + (hold & (1 << op) - 1)]; - continue dolen; - } else if (op & 32) { - /* end-of-block */ - //Tracevv((stderr, "inflate: end of block\n")); - state.mode = TYPE$1; - break top; - } else { - strm.msg = 'invalid literal/length code'; - state.mode = BAD$1; - break top; - } - break; // need to emulate goto via "continue" - } - } while (_in < last && _out < end); - - /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ - len = bits >> 3; - _in -= len; - bits -= len << 3; - hold &= (1 << bits) - 1; - - /* update state and return */ - strm.next_in = _in; - strm.next_out = _out; - strm.avail_in = _in < last ? 5 + (last - _in) : 5 - (_in - last); - strm.avail_out = _out < end ? 257 + (end - _out) : 257 - (_out - end); - state.hold = hold; - state.bits = bits; - return; - }; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - var MAXBITS = 15; - var ENOUGH_LENS$1 = 852; - var ENOUGH_DISTS$1 = 592; - //const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); - - var CODES$1 = 0; - var LENS$1 = 1; - var DISTS$1 = 2; - var lbase = new Uint16Array([/* Length codes 257..285 base */ - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0]); - var lext = new Uint8Array([/* Length codes 257..285 extra */ - 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78]); - var dbase = new Uint16Array([/* Distance codes 0..29 base */ - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0]); - var dext = new Uint8Array([/* Distance codes 0..29 extra */ - 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64]); - var inflate_table = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts) { - var bits = opts.bits; - //here = opts.here; /* table entry for duplication */ - - var len = 0; /* a code's length in bits */ - var sym = 0; /* index of code symbols */ - var min = 0, - max = 0; /* minimum and maximum code lengths */ - var root = 0; /* number of index bits for root table */ - var curr = 0; /* number of index bits for current table */ - var drop = 0; /* code bits to drop for sub-table */ - var left = 0; /* number of prefix codes available */ - var used = 0; /* code entries in table used */ - var huff = 0; /* Huffman code */ - var incr; /* for incrementing code, index */ - var fill; /* index for replicating entries */ - var low; /* low bits for current root entry */ - var mask; /* mask for low root bits */ - var next; /* next available space in table */ - var base = null; /* base value table to use */ - // let shoextra; /* extra bits table to use */ - var match; /* use base and extra for symbol >= match */ - var count = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */ - var offs = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */ - var extra = null; - var here_bits, here_op, here_val; - - /* - Process a set of code lengths to create a canonical Huffman code. The - code lengths are lens[0..codes-1]. Each length corresponds to the - symbols 0..codes-1. The Huffman code is generated by first sorting the - symbols by length from short to long, and retaining the symbol order - for codes with equal lengths. Then the code starts with all zero bits - for the first code of the shortest length, and the codes are integer - increments for the same length, and zeros are appended as the length - increases. For the deflate format, these bits are stored backwards - from their more natural integer increment ordering, and so when the - decoding tables are built in the large loop below, the integer codes - are incremented backwards. - This routine assumes, but does not check, that all of the entries in - lens[] are in the range 0..MAXBITS. The caller must assure this. - 1..MAXBITS is interpreted as that code length. zero means that that - symbol does not occur in this code. - The codes are sorted by computing a count of codes for each length, - creating from that a table of starting indices for each length in the - sorted table, and then entering the symbols in order in the sorted - table. The sorted table is work[], with that space being provided by - the caller. - The length counts are used for other purposes as well, i.e. finding - the minimum and maximum length codes, determining if there are any - codes at all, checking for a valid set of lengths, and looking ahead - at length counts to determine sub-table sizes when building the - decoding tables. - */ - - /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ - for (len = 0; len <= MAXBITS; len++) { - count[len] = 0; - } - for (sym = 0; sym < codes; sym++) { - count[lens[lens_index + sym]]++; - } - - /* bound code lengths, force root to be within code lengths */ - root = bits; - for (max = MAXBITS; max >= 1; max--) { - if (count[max] !== 0) { - break; - } - } - if (root > max) { - root = max; - } - if (max === 0) { - /* no symbols to code at all */ - //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */ - //table.bits[opts.table_index] = 1; //here.bits = (var char)1; - //table.val[opts.table_index++] = 0; //here.val = (var short)0; - table[table_index++] = 1 << 24 | 64 << 16 | 0; - - //table.op[opts.table_index] = 64; - //table.bits[opts.table_index] = 1; - //table.val[opts.table_index++] = 0; - table[table_index++] = 1 << 24 | 64 << 16 | 0; - opts.bits = 1; - return 0; /* no symbols, but wait for decoding to report error */ - } - - for (min = 1; min < max; min++) { - if (count[min] !== 0) { - break; - } - } - if (root < min) { - root = min; - } - - /* check for an over-subscribed or incomplete set of lengths */ - left = 1; - for (len = 1; len <= MAXBITS; len++) { - left <<= 1; - left -= count[len]; - if (left < 0) { - return -1; - } /* over-subscribed */ - } - - if (left > 0 && (type === CODES$1 || max !== 1)) { - return -1; /* incomplete set */ - } - - /* generate offsets into symbol table for each length for sorting */ - offs[1] = 0; - for (len = 1; len < MAXBITS; len++) { - offs[len + 1] = offs[len] + count[len]; - } - - /* sort symbols by length, by symbol order within each length */ - for (sym = 0; sym < codes; sym++) { - if (lens[lens_index + sym] !== 0) { - work[offs[lens[lens_index + sym]]++] = sym; - } - } - - /* - Create and fill in decoding tables. In this loop, the table being - filled is at next and has curr index bits. The code being used is huff - with length len. That code is converted to an index by dropping drop - bits off of the bottom. For codes where len is less than drop + curr, - those top drop + curr - len bits are incremented through all values to - fill the table with replicated entries. - root is the number of index bits for the root table. When len exceeds - root, sub-tables are created pointed to by the root entry with an index - of the low root bits of huff. This is saved in low to check for when a - new sub-table should be started. drop is zero when the root table is - being filled, and drop is root when sub-tables are being filled. - When a new sub-table is needed, it is necessary to look ahead in the - code lengths to determine what size sub-table is needed. The length - counts are used for this, and so count[] is decremented as codes are - entered in the tables. - used keeps track of how many table entries have been allocated from the - provided *table space. It is checked for LENS and DIST tables against - the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in - the initial root table size constants. See the comments in inftrees.h - for more information. - sym increments through all symbols, and the loop terminates when - all codes of length max, i.e. all codes, have been processed. This - routine permits incomplete codes, so another loop after this one fills - in the rest of the decoding tables with invalid code markers. - */ - - /* set up for code type */ - // poor man optimization - use if-else instead of switch, - // to avoid deopts in old v8 - if (type === CODES$1) { - base = extra = work; /* dummy value--not used */ - match = 20; - } else if (type === LENS$1) { - base = lbase; - extra = lext; - match = 257; - } else { - /* DISTS */ - base = dbase; - extra = dext; - match = 0; - } - - /* initialize opts for loop */ - huff = 0; /* starting code */ - sym = 0; /* starting code symbol */ - len = min; /* starting code length */ - next = table_index; /* current table to fill in */ - curr = root; /* current table index bits */ - drop = 0; /* current bits to drop from code for index */ - low = -1; /* trigger new sub-table when len > root */ - used = 1 << root; /* use root table entries */ - mask = used - 1; /* mask for comparing low */ - - /* check available table space */ - if (type === LENS$1 && used > ENOUGH_LENS$1 || type === DISTS$1 && used > ENOUGH_DISTS$1) { - return 1; - } - - /* process all codes and make table entries */ - for (;;) { - /* create table entry */ - here_bits = len - drop; - if (work[sym] + 1 < match) { - here_op = 0; - here_val = work[sym]; - } else if (work[sym] >= match) { - here_op = extra[work[sym] - match]; - here_val = base[work[sym] - match]; - } else { - here_op = 32 + 64; /* end of block */ - here_val = 0; - } - - /* replicate for those indices with low len bits equal to huff */ - incr = 1 << len - drop; - fill = 1 << curr; - min = fill; /* save offset to next table */ - do { - fill -= incr; - table[next + (huff >> drop) + fill] = here_bits << 24 | here_op << 16 | here_val | 0; - } while (fill !== 0); - - /* backwards increment the len-bit code huff */ - incr = 1 << len - 1; - while (huff & incr) { - incr >>= 1; - } - if (incr !== 0) { - huff &= incr - 1; - huff += incr; - } else { - huff = 0; - } - - /* go to next symbol, update count, len */ - sym++; - if (--count[len] === 0) { - if (len === max) { - break; - } - len = lens[lens_index + work[sym]]; - } - - /* create new sub-table if needed */ - if (len > root && (huff & mask) !== low) { - /* if first time, transition to sub-tables */ - if (drop === 0) { - drop = root; - } - - /* increment past last table */ - next += min; /* here min is 1 << curr */ - - /* determine length of next table */ - curr = len - drop; - left = 1 << curr; - while (curr + drop < max) { - left -= count[curr + drop]; - if (left <= 0) { - break; - } - curr++; - left <<= 1; - } - - /* check for enough space */ - used += 1 << curr; - if (type === LENS$1 && used > ENOUGH_LENS$1 || type === DISTS$1 && used > ENOUGH_DISTS$1) { - return 1; - } - - /* point entry in root table to sub-table */ - low = huff & mask; - /*table.op[low] = curr; - table.bits[low] = root; - table.val[low] = next - opts.table_index;*/ - table[low] = root << 24 | curr << 16 | next - table_index | 0; - } - } - - /* fill in remaining table entry if code is incomplete (guaranteed to have - at most one remaining entry, since if the code is incomplete, the - maximum code length that was allowed to get this far is one bit) */ - if (huff !== 0) { - //table.op[next + huff] = 64; /* invalid code marker */ - //table.bits[next + huff] = len - drop; - //table.val[next + huff] = 0; - table[next + huff] = len - drop << 24 | 64 << 16 | 0; - } - - /* set return parameters */ - //opts.table_index += used; - opts.bits = root; - return 0; - }; - var inftrees = inflate_table; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - var CODES = 0; - var LENS = 1; - var DISTS = 2; - - /* Public constants ==========================================================*/ - /* ===========================================================================*/ - - var Z_FINISH$1 = constants$2.Z_FINISH, - Z_BLOCK = constants$2.Z_BLOCK, - Z_TREES = constants$2.Z_TREES, - Z_OK$1 = constants$2.Z_OK, - Z_STREAM_END$1 = constants$2.Z_STREAM_END, - Z_NEED_DICT$1 = constants$2.Z_NEED_DICT, - Z_STREAM_ERROR$1 = constants$2.Z_STREAM_ERROR, - Z_DATA_ERROR$1 = constants$2.Z_DATA_ERROR, - Z_MEM_ERROR$1 = constants$2.Z_MEM_ERROR, - Z_BUF_ERROR = constants$2.Z_BUF_ERROR, - Z_DEFLATED = constants$2.Z_DEFLATED; - - /* STATES ====================================================================*/ - /* ===========================================================================*/ - - var HEAD = 16180; /* i: waiting for magic header */ - var FLAGS = 16181; /* i: waiting for method and flags (gzip) */ - var TIME = 16182; /* i: waiting for modification time (gzip) */ - var OS = 16183; /* i: waiting for extra flags and operating system (gzip) */ - var EXLEN = 16184; /* i: waiting for extra length (gzip) */ - var EXTRA = 16185; /* i: waiting for extra bytes (gzip) */ - var NAME = 16186; /* i: waiting for end of file name (gzip) */ - var COMMENT = 16187; /* i: waiting for end of comment (gzip) */ - var HCRC = 16188; /* i: waiting for header crc (gzip) */ - var DICTID = 16189; /* i: waiting for dictionary check value */ - var DICT = 16190; /* waiting for inflateSetDictionary() call */ - var TYPE = 16191; /* i: waiting for type bits, including last-flag bit */ - var TYPEDO = 16192; /* i: same, but skip check to exit inflate on new block */ - var STORED = 16193; /* i: waiting for stored size (length and complement) */ - var COPY_ = 16194; /* i/o: same as COPY below, but only first time in */ - var COPY = 16195; /* i/o: waiting for input or output to copy stored block */ - var TABLE = 16196; /* i: waiting for dynamic block table lengths */ - var LENLENS = 16197; /* i: waiting for code length code lengths */ - var CODELENS = 16198; /* i: waiting for length/lit and distance code lengths */ - var LEN_ = 16199; /* i: same as LEN below, but only first time in */ - var LEN = 16200; /* i: waiting for length/lit/eob code */ - var LENEXT = 16201; /* i: waiting for length extra bits */ - var DIST = 16202; /* i: waiting for distance code */ - var DISTEXT = 16203; /* i: waiting for distance extra bits */ - var MATCH = 16204; /* o: waiting for output space to copy string */ - var LIT = 16205; /* o: waiting for output space to write literal */ - var CHECK = 16206; /* i: waiting for 32-bit check value */ - var LENGTH = 16207; /* i: waiting for 32-bit length (gzip) */ - var DONE = 16208; /* finished check, done -- remain here until reset */ - var BAD = 16209; /* got a data error -- remain here until reset */ - var MEM = 16210; /* got an inflate() memory error -- remain here until reset */ - var SYNC = 16211; /* looking for synchronization bytes to restart inflate() */ - - /* ===========================================================================*/ - - var ENOUGH_LENS = 852; - var ENOUGH_DISTS = 592; - //const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); - - var MAX_WBITS = 15; - /* 32K LZ77 window */ - var DEF_WBITS = MAX_WBITS; - var zswap32 = function zswap32(q) { - return (q >>> 24 & 0xff) + (q >>> 8 & 0xff00) + ((q & 0xff00) << 8) + ((q & 0xff) << 24); - }; - function InflateState() { - this.strm = null; /* pointer back to this zlib stream */ - this.mode = 0; /* current inflate mode */ - this.last = false; /* true if processing last block */ - this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip, - bit 2 true to validate check value */ - this.havedict = false; /* true if dictionary provided */ - this.flags = 0; /* gzip header method and flags (0 if zlib), or - -1 if raw or no header yet */ - this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */ - this.check = 0; /* protected copy of check value */ - this.total = 0; /* protected copy of output count */ - // TODO: may be {} - this.head = null; /* where to save gzip header information */ - - /* sliding window */ - this.wbits = 0; /* log base 2 of requested window size */ - this.wsize = 0; /* window size or zero if not using window */ - this.whave = 0; /* valid bytes in the window */ - this.wnext = 0; /* window write index */ - this.window = null; /* allocated sliding window, if needed */ - - /* bit accumulator */ - this.hold = 0; /* input bit accumulator */ - this.bits = 0; /* number of bits in "in" */ - - /* for string and stored block copying */ - this.length = 0; /* literal or length of data to copy */ - this.offset = 0; /* distance back to copy string from */ - - /* for table and code decoding */ - this.extra = 0; /* extra bits needed */ - - /* fixed and dynamic code tables */ - this.lencode = null; /* starting table for length/literal codes */ - this.distcode = null; /* starting table for distance codes */ - this.lenbits = 0; /* index bits for lencode */ - this.distbits = 0; /* index bits for distcode */ - - /* dynamic table building */ - this.ncode = 0; /* number of code length code lengths */ - this.nlen = 0; /* number of length code lengths */ - this.ndist = 0; /* number of distance code lengths */ - this.have = 0; /* number of code lengths in lens[] */ - this.next = null; /* next available space in codes[] */ - - this.lens = new Uint16Array(320); /* temporary storage for code lengths */ - this.work = new Uint16Array(288); /* work area for code table building */ - - /* - because we don't have pointers in js, we use lencode and distcode directly - as buffers so we don't need codes - */ - //this.codes = new Int32Array(ENOUGH); /* space for code tables */ - this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */ - this.distdyn = null; /* dynamic table for distance codes (JS specific) */ - this.sane = 0; /* if false, allow invalid distance too far */ - this.back = 0; /* bits back of last unprocessed length/lit */ - this.was = 0; /* initial length of match */ - } - - var inflateStateCheck = function inflateStateCheck(strm) { - if (!strm) { - return 1; - } - var state = strm.state; - if (!state || state.strm !== strm || state.mode < HEAD || state.mode > SYNC) { - return 1; - } - return 0; - }; - var inflateResetKeep = function inflateResetKeep(strm) { - if (inflateStateCheck(strm)) { - return Z_STREAM_ERROR$1; - } - var state = strm.state; - strm.total_in = strm.total_out = state.total = 0; - strm.msg = ''; /*Z_NULL*/ - if (state.wrap) { - /* to support ill-conceived Java test suite */ - strm.adler = state.wrap & 1; - } - state.mode = HEAD; - state.last = 0; - state.havedict = 0; - state.flags = -1; - state.dmax = 32768; - state.head = null /*Z_NULL*/; - state.hold = 0; - state.bits = 0; - //state.lencode = state.distcode = state.next = state.codes; - state.lencode = state.lendyn = new Int32Array(ENOUGH_LENS); - state.distcode = state.distdyn = new Int32Array(ENOUGH_DISTS); - state.sane = 1; - state.back = -1; - //Tracev((stderr, "inflate: reset\n")); - return Z_OK$1; - }; - var inflateReset = function inflateReset(strm) { - if (inflateStateCheck(strm)) { - return Z_STREAM_ERROR$1; - } - var state = strm.state; - state.wsize = 0; - state.whave = 0; - state.wnext = 0; - return inflateResetKeep(strm); - }; - var inflateReset2 = function inflateReset2(strm, windowBits) { - var wrap; - - /* get the state */ - if (inflateStateCheck(strm)) { - return Z_STREAM_ERROR$1; - } - var state = strm.state; - - /* extract wrap request from windowBits parameter */ - if (windowBits < 0) { - wrap = 0; - windowBits = -windowBits; - } else { - wrap = (windowBits >> 4) + 5; - if (windowBits < 48) { - windowBits &= 15; - } - } - - /* set number of window bits, free window if different */ - if (windowBits && (windowBits < 8 || windowBits > 15)) { - return Z_STREAM_ERROR$1; - } - if (state.window !== null && state.wbits !== windowBits) { - state.window = null; - } - - /* update state and reset the rest of it */ - state.wrap = wrap; - state.wbits = windowBits; - return inflateReset(strm); - }; - var inflateInit2 = function inflateInit2(strm, windowBits) { - if (!strm) { - return Z_STREAM_ERROR$1; - } - //strm.msg = Z_NULL; /* in case we return an error */ - - var state = new InflateState(); - - //if (state === Z_NULL) return Z_MEM_ERROR; - //Tracev((stderr, "inflate: allocated\n")); - strm.state = state; - state.strm = strm; - state.window = null /*Z_NULL*/; - state.mode = HEAD; /* to pass state test in inflateReset2() */ - var ret = inflateReset2(strm, windowBits); - if (ret !== Z_OK$1) { - strm.state = null /*Z_NULL*/; - } - - return ret; - }; - var inflateInit = function inflateInit(strm) { - return inflateInit2(strm, DEF_WBITS); - }; - - /* - Return state with length and distance decoding tables and index sizes set to - fixed code decoding. Normally this returns fixed tables from inffixed.h. - If BUILDFIXED is defined, then instead this routine builds the tables the - first time it's called, and returns those tables the first time and - thereafter. This reduces the size of the code by about 2K bytes, in - exchange for a little execution time. However, BUILDFIXED should not be - used for threaded applications, since the rewriting of the tables and virgin - may not be thread-safe. - */ - var virgin = true; - var lenfix, distfix; // We have no pointers in JS, so keep tables separate - - var fixedtables = function fixedtables(state) { - /* build fixed huffman tables if first call (may not be thread safe) */ - if (virgin) { - lenfix = new Int32Array(512); - distfix = new Int32Array(32); - - /* literal/length table */ - var sym = 0; - while (sym < 144) { - state.lens[sym++] = 8; - } - while (sym < 256) { - state.lens[sym++] = 9; - } - while (sym < 280) { - state.lens[sym++] = 7; - } - while (sym < 288) { - state.lens[sym++] = 8; - } - inftrees(LENS, state.lens, 0, 288, lenfix, 0, state.work, { - bits: 9 - }); - - /* distance table */ - sym = 0; - while (sym < 32) { - state.lens[sym++] = 5; - } - inftrees(DISTS, state.lens, 0, 32, distfix, 0, state.work, { - bits: 5 - }); - - /* do this just once */ - virgin = false; - } - state.lencode = lenfix; - state.lenbits = 9; - state.distcode = distfix; - state.distbits = 5; - }; - - /* - Update the window with the last wsize (normally 32K) bytes written before - returning. If window does not exist yet, create it. This is only called - when a window is already in use, or when output has been written during this - inflate call, but the end of the deflate stream has not been reached yet. - It is also called to create a window for dictionary data when a dictionary - is loaded. - - Providing output buffers larger than 32K to inflate() should provide a speed - advantage, since only the last 32K of output is copied to the sliding window - upon return from inflate(), and since all distances after the first 32K of - output will fall in the output data, making match copies simpler and faster. - The advantage may be dependent on the size of the processor's data caches. - */ - var updatewindow = function updatewindow(strm, src, end, copy) { - var dist; - var state = strm.state; - - /* if it hasn't been done already, allocate space for the window */ - if (state.window === null) { - state.wsize = 1 << state.wbits; - state.wnext = 0; - state.whave = 0; - state.window = new Uint8Array(state.wsize); - } - - /* copy state->wsize or less output bytes into the circular window */ - if (copy >= state.wsize) { - state.window.set(src.subarray(end - state.wsize, end), 0); - state.wnext = 0; - state.whave = state.wsize; - } else { - dist = state.wsize - state.wnext; - if (dist > copy) { - dist = copy; - } - //zmemcpy(state->window + state->wnext, end - copy, dist); - state.window.set(src.subarray(end - copy, end - copy + dist), state.wnext); - copy -= dist; - if (copy) { - //zmemcpy(state->window, end - copy, copy); - state.window.set(src.subarray(end - copy, end), 0); - state.wnext = copy; - state.whave = state.wsize; - } else { - state.wnext += dist; - if (state.wnext === state.wsize) { - state.wnext = 0; - } - if (state.whave < state.wsize) { - state.whave += dist; - } - } - } - return 0; - }; - var inflate$2 = function inflate(strm, flush) { - var state; - var input, output; // input/output buffers - var next; /* next input INDEX */ - var put; /* next output INDEX */ - var have, left; /* available input and output */ - var hold; /* bit buffer */ - var bits; /* bits in bit buffer */ - var _in, _out; /* save starting available input and output */ - var copy; /* number of stored or match bytes to copy */ - var from; /* where to copy match bytes from */ - var from_source; - var here = 0; /* current decoding table entry */ - var here_bits, here_op, here_val; // paked "here" denormalized (JS specific) - //let last; /* parent table entry */ - var last_bits, last_op, last_val; // paked "last" denormalized (JS specific) - var len; /* length to copy for repeats, bits to drop */ - var ret; /* return code */ - var hbuf = new Uint8Array(4); /* buffer for gzip header crc calculation */ - var opts; - var n; // temporary variable for NEED_BITS - - var order = /* permutation of code lengths */ - new Uint8Array([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]); - if (inflateStateCheck(strm) || !strm.output || !strm.input && strm.avail_in !== 0) { - return Z_STREAM_ERROR$1; - } - state = strm.state; - if (state.mode === TYPE) { - state.mode = TYPEDO; - } /* skip check */ - - //--- LOAD() --- - put = strm.next_out; - output = strm.output; - left = strm.avail_out; - next = strm.next_in; - input = strm.input; - have = strm.avail_in; - hold = state.hold; - bits = state.bits; - //--- - - _in = have; - _out = left; - ret = Z_OK$1; - inf_leave: - // goto emulation - for (;;) { - switch (state.mode) { - case HEAD: - if (state.wrap === 0) { - state.mode = TYPEDO; - break; - } - //=== NEEDBITS(16); - while (bits < 16) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (state.wrap & 2 && hold === 0x8b1f) { - /* gzip header */ - if (state.wbits === 0) { - state.wbits = 15; - } - state.check = 0 /*crc32(0L, Z_NULL, 0)*/; - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = hold >>> 8 & 0xff; - state.check = crc32_1(state.check, hbuf, 2, 0); - //===// - - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = FLAGS; - break; - } - if (state.head) { - state.head.done = false; - } - if (!(state.wrap & 1) || /* check if zlib header allowed */ - (((hold & 0xff /*BITS(8)*/) << 8) + (hold >> 8)) % 31) { - strm.msg = 'incorrect header check'; - state.mode = BAD; - break; - } - if ((hold & 0x0f /*BITS(4)*/) !== Z_DEFLATED) { - strm.msg = 'unknown compression method'; - state.mode = BAD; - break; - } - //--- DROPBITS(4) ---// - hold >>>= 4; - bits -= 4; - //---// - len = (hold & 0x0f /*BITS(4)*/) + 8; - if (state.wbits === 0) { - state.wbits = len; - } - if (len > 15 || len > state.wbits) { - strm.msg = 'invalid window size'; - state.mode = BAD; - break; - } - - // !!! pako patch. Force use `options.windowBits` if passed. - // Required to always use max window size by default. - state.dmax = 1 << state.wbits; - //state.dmax = 1 << len; - - state.flags = 0; /* indicate zlib header */ - //Tracev((stderr, "inflate: zlib header ok\n")); - strm.adler = state.check = 1 /*adler32(0L, Z_NULL, 0)*/; - state.mode = hold & 0x200 ? DICTID : TYPE; - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - break; - case FLAGS: - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.flags = hold; - if ((state.flags & 0xff) !== Z_DEFLATED) { - strm.msg = 'unknown compression method'; - state.mode = BAD; - break; - } - if (state.flags & 0xe000) { - strm.msg = 'unknown header flags set'; - state.mode = BAD; - break; - } - if (state.head) { - state.head.text = hold >> 8 & 1; - } - if (state.flags & 0x0200 && state.wrap & 4) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = hold >>> 8 & 0xff; - state.check = crc32_1(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = TIME; - /* falls through */ - case TIME: - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (state.head) { - state.head.time = hold; - } - if (state.flags & 0x0200 && state.wrap & 4) { - //=== CRC4(state.check, hold) - hbuf[0] = hold & 0xff; - hbuf[1] = hold >>> 8 & 0xff; - hbuf[2] = hold >>> 16 & 0xff; - hbuf[3] = hold >>> 24 & 0xff; - state.check = crc32_1(state.check, hbuf, 4, 0); - //=== - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = OS; - /* falls through */ - case OS: - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (state.head) { - state.head.xflags = hold & 0xff; - state.head.os = hold >> 8; - } - if (state.flags & 0x0200 && state.wrap & 4) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = hold >>> 8 & 0xff; - state.check = crc32_1(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = EXLEN; - /* falls through */ - case EXLEN: - if (state.flags & 0x0400) { - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.length = hold; - if (state.head) { - state.head.extra_len = hold; - } - if (state.flags & 0x0200 && state.wrap & 4) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = hold >>> 8 & 0xff; - state.check = crc32_1(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - } else if (state.head) { - state.head.extra = null /*Z_NULL*/; - } - - state.mode = EXTRA; - /* falls through */ - case EXTRA: - if (state.flags & 0x0400) { - copy = state.length; - if (copy > have) { - copy = have; - } - if (copy) { - if (state.head) { - len = state.head.extra_len - state.length; - if (!state.head.extra) { - // Use untyped array for more convenient processing later - state.head.extra = new Uint8Array(state.head.extra_len); - } - state.head.extra.set(input.subarray(next, - // extra field is limited to 65536 bytes - // - no need for additional size check - next + copy), /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/ - len); - //zmemcpy(state.head.extra + len, next, - // len + copy > state.head.extra_max ? - // state.head.extra_max - len : copy); - } - - if (state.flags & 0x0200 && state.wrap & 4) { - state.check = crc32_1(state.check, input, copy, next); - } - have -= copy; - next += copy; - state.length -= copy; - } - if (state.length) { - break inf_leave; - } - } - state.length = 0; - state.mode = NAME; - /* falls through */ - case NAME: - if (state.flags & 0x0800) { - if (have === 0) { - break inf_leave; - } - copy = 0; - do { - // TODO: 2 or 1 bytes? - len = input[next + copy++]; - /* use constant limit because in js we should not preallocate memory */ - if (state.head && len && state.length < 65536 /*state.head.name_max*/) { - state.head.name += String.fromCharCode(len); - } - } while (len && copy < have); - if (state.flags & 0x0200 && state.wrap & 4) { - state.check = crc32_1(state.check, input, copy, next); - } - have -= copy; - next += copy; - if (len) { - break inf_leave; - } - } else if (state.head) { - state.head.name = null; - } - state.length = 0; - state.mode = COMMENT; - /* falls through */ - case COMMENT: - if (state.flags & 0x1000) { - if (have === 0) { - break inf_leave; - } - copy = 0; - do { - len = input[next + copy++]; - /* use constant limit because in js we should not preallocate memory */ - if (state.head && len && state.length < 65536 /*state.head.comm_max*/) { - state.head.comment += String.fromCharCode(len); - } - } while (len && copy < have); - if (state.flags & 0x0200 && state.wrap & 4) { - state.check = crc32_1(state.check, input, copy, next); - } - have -= copy; - next += copy; - if (len) { - break inf_leave; - } - } else if (state.head) { - state.head.comment = null; - } - state.mode = HCRC; - /* falls through */ - case HCRC: - if (state.flags & 0x0200) { - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (state.wrap & 4 && hold !== (state.check & 0xffff)) { - strm.msg = 'header crc mismatch'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - } - - if (state.head) { - state.head.hcrc = state.flags >> 9 & 1; - state.head.done = true; - } - strm.adler = state.check = 0; - state.mode = TYPE; - break; - case DICTID: - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - strm.adler = state.check = zswap32(hold); - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = DICT; - /* falls through */ - case DICT: - if (state.havedict === 0) { - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - return Z_NEED_DICT$1; - } - strm.adler = state.check = 1 /*adler32(0L, Z_NULL, 0)*/; - state.mode = TYPE; - /* falls through */ - case TYPE: - if (flush === Z_BLOCK || flush === Z_TREES) { - break inf_leave; - } - /* falls through */ - case TYPEDO: - if (state.last) { - //--- BYTEBITS() ---// - hold >>>= bits & 7; - bits -= bits & 7; - //---// - state.mode = CHECK; - break; - } - //=== NEEDBITS(3); */ - while (bits < 3) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.last = hold & 0x01 /*BITS(1)*/; - //--- DROPBITS(1) ---// - hold >>>= 1; - bits -= 1; - //---// - - switch (hold & 0x03 /*BITS(2)*/) { - case 0: - /* stored block */ - //Tracev((stderr, "inflate: stored block%s\n", - // state.last ? " (last)" : "")); - state.mode = STORED; - break; - case 1: - /* fixed block */ - fixedtables(state); - //Tracev((stderr, "inflate: fixed codes block%s\n", - // state.last ? " (last)" : "")); - state.mode = LEN_; /* decode codes */ - if (flush === Z_TREES) { - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - break inf_leave; - } - break; - case 2: - /* dynamic block */ - //Tracev((stderr, "inflate: dynamic codes block%s\n", - // state.last ? " (last)" : "")); - state.mode = TABLE; - break; - case 3: - strm.msg = 'invalid block type'; - state.mode = BAD; - } - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - break; - case STORED: - //--- BYTEBITS() ---// /* go to byte boundary */ - hold >>>= bits & 7; - bits -= bits & 7; - //---// - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if ((hold & 0xffff) !== (hold >>> 16 ^ 0xffff)) { - strm.msg = 'invalid stored block lengths'; - state.mode = BAD; - break; - } - state.length = hold & 0xffff; - //Tracev((stderr, "inflate: stored length %u\n", - // state.length)); - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = COPY_; - if (flush === Z_TREES) { - break inf_leave; - } - /* falls through */ - case COPY_: - state.mode = COPY; - /* falls through */ - case COPY: - copy = state.length; - if (copy) { - if (copy > have) { - copy = have; - } - if (copy > left) { - copy = left; - } - if (copy === 0) { - break inf_leave; - } - //--- zmemcpy(put, next, copy); --- - output.set(input.subarray(next, next + copy), put); - //---// - have -= copy; - next += copy; - left -= copy; - put += copy; - state.length -= copy; - break; - } - //Tracev((stderr, "inflate: stored end\n")); - state.mode = TYPE; - break; - case TABLE: - //=== NEEDBITS(14); */ - while (bits < 14) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.nlen = (hold & 0x1f /*BITS(5)*/) + 257; - //--- DROPBITS(5) ---// - hold >>>= 5; - bits -= 5; - //---// - state.ndist = (hold & 0x1f /*BITS(5)*/) + 1; - //--- DROPBITS(5) ---// - hold >>>= 5; - bits -= 5; - //---// - state.ncode = (hold & 0x0f /*BITS(4)*/) + 4; - //--- DROPBITS(4) ---// - hold >>>= 4; - bits -= 4; - //---// - //#ifndef PKZIP_BUG_WORKAROUND - if (state.nlen > 286 || state.ndist > 30) { - strm.msg = 'too many length or distance symbols'; - state.mode = BAD; - break; - } - //#endif - //Tracev((stderr, "inflate: table sizes ok\n")); - state.have = 0; - state.mode = LENLENS; - /* falls through */ - case LENLENS: - while (state.have < state.ncode) { - //=== NEEDBITS(3); - while (bits < 3) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.lens[order[state.have++]] = hold & 0x07; //BITS(3); - //--- DROPBITS(3) ---// - hold >>>= 3; - bits -= 3; - //---// - } - - while (state.have < 19) { - state.lens[order[state.have++]] = 0; - } - // We have separate tables & no pointers. 2 commented lines below not needed. - //state.next = state.codes; - //state.lencode = state.next; - // Switch to use dynamic table - state.lencode = state.lendyn; - state.lenbits = 7; - opts = { - bits: state.lenbits - }; - ret = inftrees(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts); - state.lenbits = opts.bits; - if (ret) { - strm.msg = 'invalid code lengths set'; - state.mode = BAD; - break; - } - //Tracev((stderr, "inflate: code lengths ok\n")); - state.have = 0; - state.mode = CODELENS; - /* falls through */ - case CODELENS: - while (state.have < state.nlen + state.ndist) { - for (;;) { - here = state.lencode[hold & (1 << state.lenbits) - 1]; /*BITS(state.lenbits)*/ - here_bits = here >>> 24; - here_op = here >>> 16 & 0xff; - here_val = here & 0xffff; - if (here_bits <= bits) { - break; - } - //--- PULLBYTE() ---// - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - - if (here_val < 16) { - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.lens[state.have++] = here_val; - } else { - if (here_val === 16) { - //=== NEEDBITS(here.bits + 2); - n = here_bits + 2; - while (bits < n) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - if (state.have === 0) { - strm.msg = 'invalid bit length repeat'; - state.mode = BAD; - break; - } - len = state.lens[state.have - 1]; - copy = 3 + (hold & 0x03); //BITS(2); - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - } else if (here_val === 17) { - //=== NEEDBITS(here.bits + 3); - n = here_bits + 3; - while (bits < n) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - len = 0; - copy = 3 + (hold & 0x07); //BITS(3); - //--- DROPBITS(3) ---// - hold >>>= 3; - bits -= 3; - //---// - } else { - //=== NEEDBITS(here.bits + 7); - n = here_bits + 7; - while (bits < n) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - len = 0; - copy = 11 + (hold & 0x7f); //BITS(7); - //--- DROPBITS(7) ---// - hold >>>= 7; - bits -= 7; - //---// - } - - if (state.have + copy > state.nlen + state.ndist) { - strm.msg = 'invalid bit length repeat'; - state.mode = BAD; - break; - } - while (copy--) { - state.lens[state.have++] = len; - } - } - } - - /* handle error breaks in while */ - if (state.mode === BAD) { - break; - } - - /* check for end-of-block code (better have one) */ - if (state.lens[256] === 0) { - strm.msg = 'invalid code -- missing end-of-block'; - state.mode = BAD; - break; - } - - /* build code tables -- note: do not change the lenbits or distbits - values here (9 and 6) without reading the comments in inftrees.h - concerning the ENOUGH constants, which depend on those values */ - state.lenbits = 9; - opts = { - bits: state.lenbits - }; - ret = inftrees(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts); - // We have separate tables & no pointers. 2 commented lines below not needed. - // state.next_index = opts.table_index; - state.lenbits = opts.bits; - // state.lencode = state.next; - - if (ret) { - strm.msg = 'invalid literal/lengths set'; - state.mode = BAD; - break; - } - state.distbits = 6; - //state.distcode.copy(state.codes); - // Switch to use dynamic table - state.distcode = state.distdyn; - opts = { - bits: state.distbits - }; - ret = inftrees(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts); - // We have separate tables & no pointers. 2 commented lines below not needed. - // state.next_index = opts.table_index; - state.distbits = opts.bits; - // state.distcode = state.next; - - if (ret) { - strm.msg = 'invalid distances set'; - state.mode = BAD; - break; - } - //Tracev((stderr, 'inflate: codes ok\n')); - state.mode = LEN_; - if (flush === Z_TREES) { - break inf_leave; - } - /* falls through */ - case LEN_: - state.mode = LEN; - /* falls through */ - case LEN: - if (have >= 6 && left >= 258) { - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - inffast(strm, _out); - //--- LOAD() --- - put = strm.next_out; - output = strm.output; - left = strm.avail_out; - next = strm.next_in; - input = strm.input; - have = strm.avail_in; - hold = state.hold; - bits = state.bits; - //--- - - if (state.mode === TYPE) { - state.back = -1; - } - break; - } - state.back = 0; - for (;;) { - here = state.lencode[hold & (1 << state.lenbits) - 1]; /*BITS(state.lenbits)*/ - here_bits = here >>> 24; - here_op = here >>> 16 & 0xff; - here_val = here & 0xffff; - if (here_bits <= bits) { - break; - } - //--- PULLBYTE() ---// - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - - if (here_op && (here_op & 0xf0) === 0) { - last_bits = here_bits; - last_op = here_op; - last_val = here_val; - for (;;) { - here = state.lencode[last_val + ((hold & (1 << last_bits + last_op) - 1 /*BITS(last.bits + last.op)*/) >> last_bits)]; - here_bits = here >>> 24; - here_op = here >>> 16 & 0xff; - here_val = here & 0xffff; - if (last_bits + here_bits <= bits) { - break; - } - //--- PULLBYTE() ---// - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - //--- DROPBITS(last.bits) ---// - hold >>>= last_bits; - bits -= last_bits; - //---// - state.back += last_bits; - } - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.back += here_bits; - state.length = here_val; - if (here_op === 0) { - //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - // "inflate: literal '%c'\n" : - // "inflate: literal 0x%02x\n", here.val)); - state.mode = LIT; - break; - } - if (here_op & 32) { - //Tracevv((stderr, "inflate: end of block\n")); - state.back = -1; - state.mode = TYPE; - break; - } - if (here_op & 64) { - strm.msg = 'invalid literal/length code'; - state.mode = BAD; - break; - } - state.extra = here_op & 15; - state.mode = LENEXT; - /* falls through */ - case LENEXT: - if (state.extra) { - //=== NEEDBITS(state.extra); - n = state.extra; - while (bits < n) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.length += hold & (1 << state.extra) - 1 /*BITS(state.extra)*/; - //--- DROPBITS(state.extra) ---// - hold >>>= state.extra; - bits -= state.extra; - //---// - state.back += state.extra; - } - //Tracevv((stderr, "inflate: length %u\n", state.length)); - state.was = state.length; - state.mode = DIST; - /* falls through */ - case DIST: - for (;;) { - here = state.distcode[hold & (1 << state.distbits) - 1]; /*BITS(state.distbits)*/ - here_bits = here >>> 24; - here_op = here >>> 16 & 0xff; - here_val = here & 0xffff; - if (here_bits <= bits) { - break; - } - //--- PULLBYTE() ---// - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - - if ((here_op & 0xf0) === 0) { - last_bits = here_bits; - last_op = here_op; - last_val = here_val; - for (;;) { - here = state.distcode[last_val + ((hold & (1 << last_bits + last_op) - 1 /*BITS(last.bits + last.op)*/) >> last_bits)]; - here_bits = here >>> 24; - here_op = here >>> 16 & 0xff; - here_val = here & 0xffff; - if (last_bits + here_bits <= bits) { - break; - } - //--- PULLBYTE() ---// - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - //--- DROPBITS(last.bits) ---// - hold >>>= last_bits; - bits -= last_bits; - //---// - state.back += last_bits; - } - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.back += here_bits; - if (here_op & 64) { - strm.msg = 'invalid distance code'; - state.mode = BAD; - break; - } - state.offset = here_val; - state.extra = here_op & 15; - state.mode = DISTEXT; - /* falls through */ - case DISTEXT: - if (state.extra) { - //=== NEEDBITS(state.extra); - n = state.extra; - while (bits < n) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.offset += hold & (1 << state.extra) - 1 /*BITS(state.extra)*/; - //--- DROPBITS(state.extra) ---// - hold >>>= state.extra; - bits -= state.extra; - //---// - state.back += state.extra; - } - //#ifdef INFLATE_STRICT - if (state.offset > state.dmax) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break; - } - //#endif - //Tracevv((stderr, "inflate: distance %u\n", state.offset)); - state.mode = MATCH; - /* falls through */ - case MATCH: - if (left === 0) { - break inf_leave; - } - copy = _out - left; - if (state.offset > copy) { - /* copy from window */ - copy = state.offset - copy; - if (copy > state.whave) { - if (state.sane) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break; - } - // (!) This block is disabled in zlib defaults, - // don't enable it for binary compatibility - //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR - // Trace((stderr, "inflate.c too far\n")); - // copy -= state.whave; - // if (copy > state.length) { copy = state.length; } - // if (copy > left) { copy = left; } - // left -= copy; - // state.length -= copy; - // do { - // output[put++] = 0; - // } while (--copy); - // if (state.length === 0) { state.mode = LEN; } - // break; - //#endif - } - - if (copy > state.wnext) { - copy -= state.wnext; - from = state.wsize - copy; - } else { - from = state.wnext - copy; - } - if (copy > state.length) { - copy = state.length; - } - from_source = state.window; - } else { - /* copy from output */ - from_source = output; - from = put - state.offset; - copy = state.length; - } - if (copy > left) { - copy = left; - } - left -= copy; - state.length -= copy; - do { - output[put++] = from_source[from++]; - } while (--copy); - if (state.length === 0) { - state.mode = LEN; - } - break; - case LIT: - if (left === 0) { - break inf_leave; - } - output[put++] = state.length; - left--; - state.mode = LEN; - break; - case CHECK: - if (state.wrap) { - //=== NEEDBITS(32); - while (bits < 32) { - if (have === 0) { - break inf_leave; - } - have--; - // Use '|' instead of '+' to make sure that result is signed - hold |= input[next++] << bits; - bits += 8; - } - //===// - _out -= left; - strm.total_out += _out; - state.total += _out; - if (state.wrap & 4 && _out) { - strm.adler = state.check = /*UPDATE_CHECK(state.check, put - _out, _out);*/ - state.flags ? crc32_1(state.check, output, _out, put - _out) : adler32_1(state.check, output, _out, put - _out); - } - _out = left; - // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too - if (state.wrap & 4 && (state.flags ? hold : zswap32(hold)) !== state.check) { - strm.msg = 'incorrect data check'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - //Tracev((stderr, "inflate: check matches trailer\n")); - } - - state.mode = LENGTH; - /* falls through */ - case LENGTH: - if (state.wrap && state.flags) { - //=== NEEDBITS(32); - while (bits < 32) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (state.wrap & 4 && hold !== (state.total & 0xffffffff)) { - strm.msg = 'incorrect length check'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - //Tracev((stderr, "inflate: length matches trailer\n")); - } - - state.mode = DONE; - /* falls through */ - case DONE: - ret = Z_STREAM_END$1; - break inf_leave; - case BAD: - ret = Z_DATA_ERROR$1; - break inf_leave; - case MEM: - return Z_MEM_ERROR$1; - case SYNC: - /* falls through */ - default: - return Z_STREAM_ERROR$1; - } - } - - // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave" - - /* - Return from inflate(), updating the total counts and the check value. - If there was no progress during the inflate() call, return a buffer - error. Call updatewindow() to create and/or update the window state. - Note: a memory error from inflate() is non-recoverable. - */ - - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - - if (state.wsize || _out !== strm.avail_out && state.mode < BAD && (state.mode < CHECK || flush !== Z_FINISH$1)) { - if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) ; - } - _in -= strm.avail_in; - _out -= strm.avail_out; - strm.total_in += _in; - strm.total_out += _out; - state.total += _out; - if (state.wrap & 4 && _out) { - strm.adler = state.check = /*UPDATE_CHECK(state.check, strm.next_out - _out, _out);*/ - state.flags ? crc32_1(state.check, output, _out, strm.next_out - _out) : adler32_1(state.check, output, _out, strm.next_out - _out); - } - strm.data_type = state.bits + (state.last ? 64 : 0) + (state.mode === TYPE ? 128 : 0) + (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0); - if ((_in === 0 && _out === 0 || flush === Z_FINISH$1) && ret === Z_OK$1) { - ret = Z_BUF_ERROR; - } - return ret; - }; - var inflateEnd = function inflateEnd(strm) { - if (inflateStateCheck(strm)) { - return Z_STREAM_ERROR$1; - } - var state = strm.state; - if (state.window) { - state.window = null; - } - strm.state = null; - return Z_OK$1; - }; - var inflateGetHeader = function inflateGetHeader(strm, head) { - /* check state */ - if (inflateStateCheck(strm)) { - return Z_STREAM_ERROR$1; - } - var state = strm.state; - if ((state.wrap & 2) === 0) { - return Z_STREAM_ERROR$1; - } - - /* save header structure */ - state.head = head; - head.done = false; - return Z_OK$1; - }; - var inflateSetDictionary = function inflateSetDictionary(strm, dictionary) { - var dictLength = dictionary.length; - var state; - var dictid; - var ret; - - /* check state */ - if (inflateStateCheck(strm)) { - return Z_STREAM_ERROR$1; - } - state = strm.state; - if (state.wrap !== 0 && state.mode !== DICT) { - return Z_STREAM_ERROR$1; - } - - /* check for correct dictionary identifier */ - if (state.mode === DICT) { - dictid = 1; /* adler32(0, null, 0)*/ - /* dictid = adler32(dictid, dictionary, dictLength); */ - dictid = adler32_1(dictid, dictionary, dictLength, 0); - if (dictid !== state.check) { - return Z_DATA_ERROR$1; - } - } - /* copy dictionary to window using updatewindow(), which will amend the - existing dictionary if appropriate */ - ret = updatewindow(strm, dictionary, dictLength, dictLength); - if (ret) { - state.mode = MEM; - return Z_MEM_ERROR$1; - } - state.havedict = 1; - // Tracev((stderr, "inflate: dictionary set\n")); - return Z_OK$1; - }; - var inflateReset_1 = inflateReset; - var inflateReset2_1 = inflateReset2; - var inflateResetKeep_1 = inflateResetKeep; - var inflateInit_1 = inflateInit; - var inflateInit2_1 = inflateInit2; - var inflate_2$1 = inflate$2; - var inflateEnd_1 = inflateEnd; - var inflateGetHeader_1 = inflateGetHeader; - var inflateSetDictionary_1 = inflateSetDictionary; - var inflateInfo = 'pako inflate (from Nodeca project)'; - - /* Not implemented - module.exports.inflateCodesUsed = inflateCodesUsed; - module.exports.inflateCopy = inflateCopy; - module.exports.inflateGetDictionary = inflateGetDictionary; - module.exports.inflateMark = inflateMark; - module.exports.inflatePrime = inflatePrime; - module.exports.inflateSync = inflateSync; - module.exports.inflateSyncPoint = inflateSyncPoint; - module.exports.inflateUndermine = inflateUndermine; - module.exports.inflateValidate = inflateValidate; - */ - - var inflate_1$2 = { - inflateReset: inflateReset_1, - inflateReset2: inflateReset2_1, - inflateResetKeep: inflateResetKeep_1, - inflateInit: inflateInit_1, - inflateInit2: inflateInit2_1, - inflate: inflate_2$1, - inflateEnd: inflateEnd_1, - inflateGetHeader: inflateGetHeader_1, - inflateSetDictionary: inflateSetDictionary_1, - inflateInfo: inflateInfo - }; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - function GZheader() { - /* true if compressed data believed to be text */ - this.text = 0; - /* modification time */ - this.time = 0; - /* extra flags (not used when writing a gzip file) */ - this.xflags = 0; - /* operating system */ - this.os = 0; - /* pointer to extra field or Z_NULL if none */ - this.extra = null; - /* extra field length (valid if extra != Z_NULL) */ - this.extra_len = 0; // Actually, we don't need it in JS, - // but leave for few code modifications - - // - // Setup limits is not necessary because in js we should not preallocate memory - // for inflate use constant limit in 65536 bytes - // - - /* space at extra (only when reading header) */ - // this.extra_max = 0; - /* pointer to zero-terminated file name or Z_NULL */ - this.name = ''; - /* space at name (only when reading header) */ - // this.name_max = 0; - /* pointer to zero-terminated comment or Z_NULL */ - this.comment = ''; - /* space at comment (only when reading header) */ - // this.comm_max = 0; - /* true if there was or will be a header crc */ - this.hcrc = 0; - /* true when done reading gzip header (not used when writing a gzip file) */ - this.done = false; - } - var gzheader = GZheader; - - var toString = Object.prototype.toString; - - /* Public constants ==========================================================*/ - /* ===========================================================================*/ - - var Z_NO_FLUSH = constants$2.Z_NO_FLUSH, - Z_FINISH = constants$2.Z_FINISH, - Z_OK = constants$2.Z_OK, - Z_STREAM_END = constants$2.Z_STREAM_END, - Z_NEED_DICT = constants$2.Z_NEED_DICT, - Z_STREAM_ERROR = constants$2.Z_STREAM_ERROR, - Z_DATA_ERROR = constants$2.Z_DATA_ERROR, - Z_MEM_ERROR = constants$2.Z_MEM_ERROR; - - /* ===========================================================================*/ - - /** - * class Inflate - * - * Generic JS-style wrapper for zlib calls. If you don't need - * streaming behaviour - use more simple functions: [[inflate]] - * and [[inflateRaw]]. - **/ - - /* internal - * inflate.chunks -> Array - * - * Chunks of output data, if [[Inflate#onData]] not overridden. - **/ - - /** - * Inflate.result -> Uint8Array|String - * - * Uncompressed result, generated by default [[Inflate#onData]] - * and [[Inflate#onEnd]] handlers. Filled after you push last chunk - * (call [[Inflate#push]] with `Z_FINISH` / `true` param). - **/ - - /** - * Inflate.err -> Number - * - * Error code after inflate finished. 0 (Z_OK) on success. - * Should be checked if broken data possible. - **/ - - /** - * Inflate.msg -> String - * - * Error message, if [[Inflate.err]] != 0 - **/ - - /** - * new Inflate(options) - * - options (Object): zlib inflate options. - * - * Creates new inflator instance with specified params. Throws exception - * on bad params. Supported options: - * - * - `windowBits` - * - `dictionary` - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information on these. - * - * Additional options, for internal needs: - * - * - `chunkSize` - size of generated data chunks (16K by default) - * - `raw` (Boolean) - do raw inflate - * - `to` (String) - if equal to 'string', then result will be converted - * from utf8 to utf16 (javascript) string. When string output requested, - * chunk length can differ from `chunkSize`, depending on content. - * - * By default, when no options set, autodetect deflate/gzip data format via - * wrapper header. - * - * ##### Example: - * - * ```javascript - * const pako = require('pako') - * const chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9]) - * const chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]); - * - * const inflate = new pako.Inflate({ level: 3}); - * - * inflate.push(chunk1, false); - * inflate.push(chunk2, true); // true -> last chunk - * - * if (inflate.err) { throw new Error(inflate.err); } - * - * console.log(inflate.result); - * ``` - **/ - function Inflate$1(options) { - this.options = common.assign({ - chunkSize: 1024 * 64, - windowBits: 15, - to: '' - }, options || {}); - var opt = this.options; - - // Force window size for `raw` data, if not set directly, - // because we have no header for autodetect. - if (opt.raw && opt.windowBits >= 0 && opt.windowBits < 16) { - opt.windowBits = -opt.windowBits; - if (opt.windowBits === 0) { - opt.windowBits = -15; - } - } - - // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate - if (opt.windowBits >= 0 && opt.windowBits < 16 && !(options && options.windowBits)) { - opt.windowBits += 32; - } - - // Gzip header has no info about windows size, we can do autodetect only - // for deflate. So, if window size not set, force it to max when gzip possible - if (opt.windowBits > 15 && opt.windowBits < 48) { - // bit 3 (16) -> gzipped data - // bit 4 (32) -> autodetect gzip/deflate - if ((opt.windowBits & 15) === 0) { - opt.windowBits |= 15; - } - } - this.err = 0; // error code, if happens (0 = Z_OK) - this.msg = ''; // error message - this.ended = false; // used to avoid multiple onEnd() calls - this.chunks = []; // chunks of compressed data - - this.strm = new zstream(); - this.strm.avail_out = 0; - var status = inflate_1$2.inflateInit2(this.strm, opt.windowBits); - if (status !== Z_OK) { - throw new Error(messages[status]); - } - this.header = new gzheader(); - inflate_1$2.inflateGetHeader(this.strm, this.header); - - // Setup dictionary - if (opt.dictionary) { - // Convert data if needed - if (typeof opt.dictionary === 'string') { - opt.dictionary = strings.string2buf(opt.dictionary); - } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') { - opt.dictionary = new Uint8Array(opt.dictionary); - } - if (opt.raw) { - //In raw mode we need to set the dictionary early - status = inflate_1$2.inflateSetDictionary(this.strm, opt.dictionary); - if (status !== Z_OK) { - throw new Error(messages[status]); - } - } - } - } - - /** - * Inflate#push(data[, flush_mode]) -> Boolean - * - data (Uint8Array|ArrayBuffer): input data - * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE - * flush modes. See constants. Skipped or `false` means Z_NO_FLUSH, - * `true` means Z_FINISH. - * - * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with - * new output chunks. Returns `true` on success. If end of stream detected, - * [[Inflate#onEnd]] will be called. - * - * `flush_mode` is not needed for normal operation, because end of stream - * detected automatically. You may try to use it for advanced things, but - * this functionality was not tested. - * - * On fail call [[Inflate#onEnd]] with error code and return false. - * - * ##### Example - * - * ```javascript - * push(chunk, false); // push one of data chunks - * ... - * push(chunk, true); // push last chunk - * ``` - **/ - Inflate$1.prototype.push = function (data, flush_mode) { - var strm = this.strm; - var chunkSize = this.options.chunkSize; - var dictionary = this.options.dictionary; - var status, _flush_mode, last_avail_out; - if (this.ended) return false; - if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;else _flush_mode = flush_mode === true ? Z_FINISH : Z_NO_FLUSH; - - // Convert data if needed - if (toString.call(data) === '[object ArrayBuffer]') { - strm.input = new Uint8Array(data); - } else { - strm.input = data; - } - strm.next_in = 0; - strm.avail_in = strm.input.length; - for (;;) { - if (strm.avail_out === 0) { - strm.output = new Uint8Array(chunkSize); - strm.next_out = 0; - strm.avail_out = chunkSize; - } - status = inflate_1$2.inflate(strm, _flush_mode); - if (status === Z_NEED_DICT && dictionary) { - status = inflate_1$2.inflateSetDictionary(strm, dictionary); - if (status === Z_OK) { - status = inflate_1$2.inflate(strm, _flush_mode); - } else if (status === Z_DATA_ERROR) { - // Replace code with more verbose - status = Z_NEED_DICT; - } - } - - // Skip snyc markers if more data follows and not raw mode - while (strm.avail_in > 0 && status === Z_STREAM_END && strm.state.wrap > 0 && data[strm.next_in] !== 0) { - inflate_1$2.inflateReset(strm); - status = inflate_1$2.inflate(strm, _flush_mode); - } - switch (status) { - case Z_STREAM_ERROR: - case Z_DATA_ERROR: - case Z_NEED_DICT: - case Z_MEM_ERROR: - this.onEnd(status); - this.ended = true; - return false; - } - - // Remember real `avail_out` value, because we may patch out buffer content - // to align utf8 strings boundaries. - last_avail_out = strm.avail_out; - if (strm.next_out) { - if (strm.avail_out === 0 || status === Z_STREAM_END) { - if (this.options.to === 'string') { - var next_out_utf8 = strings.utf8border(strm.output, strm.next_out); - var tail = strm.next_out - next_out_utf8; - var utf8str = strings.buf2string(strm.output, next_out_utf8); - - // move tail & realign counters - strm.next_out = tail; - strm.avail_out = chunkSize - tail; - if (tail) strm.output.set(strm.output.subarray(next_out_utf8, next_out_utf8 + tail), 0); - this.onData(utf8str); - } else { - this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out)); - } - } - } - - // Must repeat iteration if out buffer is full - if (status === Z_OK && last_avail_out === 0) continue; - - // Finalize if end of stream reached. - if (status === Z_STREAM_END) { - status = inflate_1$2.inflateEnd(this.strm); - this.onEnd(status); - this.ended = true; - return true; - } - if (strm.avail_in === 0) break; - } - return true; - }; - - /** - * Inflate#onData(chunk) -> Void - * - chunk (Uint8Array|String): output data. When string output requested, - * each chunk will be string. - * - * By default, stores data blocks in `chunks[]` property and glue - * those in `onEnd`. Override this handler, if you need another behaviour. - **/ - Inflate$1.prototype.onData = function (chunk) { - this.chunks.push(chunk); - }; - - /** - * Inflate#onEnd(status) -> Void - * - status (Number): inflate status. 0 (Z_OK) on success, - * other if not. - * - * Called either after you tell inflate that the input stream is - * complete (Z_FINISH). By default - join collected chunks, - * free memory and fill `results` / `err` properties. - **/ - Inflate$1.prototype.onEnd = function (status) { - // On success - join - if (status === Z_OK) { - if (this.options.to === 'string') { - this.result = this.chunks.join(''); - } else { - this.result = common.flattenChunks(this.chunks); - } - } - this.chunks = []; - this.err = status; - this.msg = this.strm.msg; - }; - - /** - * inflate(data[, options]) -> Uint8Array|String - * - data (Uint8Array|ArrayBuffer): input data to decompress. - * - options (Object): zlib inflate options. - * - * Decompress `data` with inflate/ungzip and `options`. Autodetect - * format via wrapper header by default. That's why we don't provide - * separate `ungzip` method. - * - * Supported options are: - * - * - windowBits - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information. - * - * Sugar (options): - * - * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify - * negative windowBits implicitly. - * - `to` (String) - if equal to 'string', then result will be converted - * from utf8 to utf16 (javascript) string. When string output requested, - * chunk length can differ from `chunkSize`, depending on content. - * - * - * ##### Example: - * - * ```javascript - * const pako = require('pako'); - * const input = pako.deflate(new Uint8Array([1,2,3,4,5,6,7,8,9])); - * let output; - * - * try { - * output = pako.inflate(input); - * } catch (err) { - * console.log(err); - * } - * ``` - **/ - function inflate$1(input, options) { - var inflator = new Inflate$1(options); - inflator.push(input); - - // That will never happens, if you don't cheat with options :) - if (inflator.err) throw inflator.msg || messages[inflator.err]; - return inflator.result; - } - - /** - * inflateRaw(data[, options]) -> Uint8Array|String - * - data (Uint8Array|ArrayBuffer): input data to decompress. - * - options (Object): zlib inflate options. - * - * The same as [[inflate]], but creates raw data, without wrapper - * (header and adler32 crc). - **/ - function inflateRaw$1(input, options) { - options = options || {}; - options.raw = true; - return inflate$1(input, options); - } - - /** - * ungzip(data[, options]) -> Uint8Array|String - * - data (Uint8Array|ArrayBuffer): input data to decompress. - * - options (Object): zlib inflate options. - * - * Just shortcut to [[inflate]], because it autodetects format - * by header.content. Done for convenience. - **/ - - var Inflate_1$1 = Inflate$1; - var inflate_2 = inflate$1; - var inflateRaw_1$1 = inflateRaw$1; - var ungzip$1 = inflate$1; - var constants = constants$2; - var inflate_1$1 = { - Inflate: Inflate_1$1, - inflate: inflate_2, - inflateRaw: inflateRaw_1$1, - ungzip: ungzip$1, - constants: constants - }; - - var Deflate = deflate_1$1.Deflate, - deflate = deflate_1$1.deflate, - deflateRaw = deflate_1$1.deflateRaw, - gzip = deflate_1$1.gzip; - var Inflate = inflate_1$1.Inflate, - inflate = inflate_1$1.inflate, - inflateRaw = inflate_1$1.inflateRaw, - ungzip = inflate_1$1.ungzip; - var Deflate_1 = Deflate; - var deflate_1 = deflate; - var deflateRaw_1 = deflateRaw; - var gzip_1 = gzip; - var Inflate_1 = Inflate; - var inflate_1 = inflate; - var inflateRaw_1 = inflateRaw; - var ungzip_1 = ungzip; - var constants_1 = constants$2; - var pako = { - Deflate: Deflate_1, - deflate: deflate_1, - deflateRaw: deflateRaw_1, - gzip: gzip_1, - Inflate: Inflate_1, - inflate: inflate_1, - inflateRaw: inflateRaw_1, - ungzip: ungzip_1, - constants: constants_1 - }; - - exports.Deflate = Deflate_1; - exports.Inflate = Inflate_1; - exports.constants = constants_1; - exports["default"] = pako; - exports.deflate = deflate_1; - exports.deflateRaw = deflateRaw_1; - exports.gzip = gzip_1; - exports.inflate = inflate_1; - exports.inflateRaw = inflateRaw_1; - exports.ungzip = ungzip_1; - - Object.defineProperty(exports, '__esModule', { value: true }); - -})); diff --git a/node_modules/pako/dist/pako.es5.min.js b/node_modules/pako/dist/pako.es5.min.js deleted file mode 100644 index 5ffaec0..0000000 --- a/node_modules/pako/dist/pako.es5.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).pako={})}(this,(function(t){"use strict";function e(t){for(var e=t.length;--e>=0;)t[e]=0}var a=256,n=286,i=30,r=15,s=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]),o=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]),l=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),h=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),d=new Array(576);e(d);var _=new Array(60);e(_);var f=new Array(512);e(f);var u=new Array(256);e(u);var c=new Array(29);e(c);var w,m,b,g=new Array(i);function p(t,e,a,n,i){this.static_tree=t,this.extra_bits=e,this.extra_base=a,this.elems=n,this.max_length=i,this.has_stree=t&&t.length}function v(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}e(g);var k=function(t){return t<256?f[t]:f[256+(t>>>7)]},y=function(t,e){t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255},x=function(t,e,a){t.bi_valid>16-a?(t.bi_buf|=e<>16-t.bi_valid,t.bi_valid+=a-16):(t.bi_buf|=e<>>=1,a<<=1}while(--e>0);return a>>>1},E=function(t,e,a){var n,i,s=new Array(16),o=0;for(n=1;n<=r;n++)o=o+a[n-1]<<1,s[n]=o;for(i=0;i<=e;i++){var l=t[2*i+1];0!==l&&(t[2*i]=A(s[l]++,l))}},R=function(t){var e;for(e=0;e8?y(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0},S=function(t,e,a,n){var i=2*e,r=2*a;return t[i]>1;a>=1;a--)U(t,s,a);i=h;do{a=t.heap[1],t.heap[1]=t.heap[t.heap_len--],U(t,s,1),n=t.heap[1],t.heap[--t.heap_max]=a,t.heap[--t.heap_max]=n,s[2*i]=s[2*a]+s[2*n],t.depth[i]=(t.depth[a]>=t.depth[n]?t.depth[a]:t.depth[n])+1,s[2*a+1]=s[2*n+1]=i,t.heap[1]=i++,U(t,s,1)}while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],function(t,e){var a,n,i,s,o,l,h=e.dyn_tree,d=e.max_code,_=e.stat_desc.static_tree,f=e.stat_desc.has_stree,u=e.stat_desc.extra_bits,c=e.stat_desc.extra_base,w=e.stat_desc.max_length,m=0;for(s=0;s<=r;s++)t.bl_count[s]=0;for(h[2*t.heap[t.heap_max]+1]=0,a=t.heap_max+1;a<573;a++)(s=h[2*h[2*(n=t.heap[a])+1]+1]+1)>w&&(s=w,m++),h[2*n+1]=s,n>d||(t.bl_count[s]++,o=0,n>=c&&(o=u[n-c]),l=h[2*n],t.opt_len+=l*(s+o),f&&(t.static_len+=l*(_[2*n+1]+o)));if(0!==m){do{for(s=w-1;0===t.bl_count[s];)s--;t.bl_count[s]--,t.bl_count[s+1]+=2,t.bl_count[w]--,m-=2}while(m>0);for(s=w;0!==s;s--)for(n=t.bl_count[s];0!==n;)(i=t.heap[--a])>d||(h[2*i+1]!==s&&(t.opt_len+=(s-h[2*i+1])*h[2*i],h[2*i+1]=s),n--)}}(t,e),E(s,d,t.bl_count)},O=function(t,e,a){var n,i,r=-1,s=e[1],o=0,l=7,h=4;for(0===s&&(l=138,h=3),e[2*(a+1)+1]=65535,n=0;n<=a;n++)i=s,s=e[2*(n+1)+1],++o0?(2===t.strm.data_type&&(t.strm.data_type=function(t){var e,n=4093624447;for(e=0;e<=31;e++,n>>>=1)if(1&n&&0!==t.dyn_ltree[2*e])return 0;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return 1;for(e=32;e=3&&0===t.bl_tree[2*h[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e}(t),r=t.opt_len+3+7>>>3,(s=t.static_len+3+7>>>3)<=r&&(r=s)):r=s=n+5,n+4<=r&&-1!==e?L(t,e,n,i):4===t.strategy||s===r?(x(t,2+(i?1:0),3),D(t,d,_)):(x(t,4+(i?1:0),3),function(t,e,a,n){var i;for(x(t,e-257,5),x(t,a-1,5),x(t,n-4,4),i=0;i>=7;h>8,t.pending_buf[t.sym_buf+t.sym_next++]=n,0===e?t.dyn_ltree[2*n]++:(t.matches++,e--,t.dyn_ltree[2*(u[n]+a+1)]++,t.dyn_dtree[2*k(e)]++),t.sym_next===t.sym_end},_tr_align:function(t){x(t,2,3),z(t,256,d),function(t){16===t.bi_valid?(y(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)}(t)}},C=function(t,e,a,n){for(var i=65535&t|0,r=t>>>16&65535|0,s=0;0!==a;){a-=s=a>2e3?2e3:a;do{r=r+(i=i+e[n++]|0)|0}while(--s);i%=65521,r%=65521}return i|r<<16|0},M=new Uint32Array(function(){for(var t,e=[],a=0;a<256;a++){t=a;for(var n=0;n<8;n++)t=1&t?3988292384^t>>>1:t>>>1;e[a]=t}return e}()),H=function(t,e,a,n){var i=M,r=n+a;t^=-1;for(var s=n;s>>8^i[255&(t^e[s])];return-1^t},j={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},K={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8},P=B._tr_init,Y=B._tr_stored_block,G=B._tr_flush_block,X=B._tr_tally,W=B._tr_align,q=K.Z_NO_FLUSH,J=K.Z_PARTIAL_FLUSH,Q=K.Z_FULL_FLUSH,V=K.Z_FINISH,$=K.Z_BLOCK,tt=K.Z_OK,et=K.Z_STREAM_END,at=K.Z_STREAM_ERROR,nt=K.Z_DATA_ERROR,it=K.Z_BUF_ERROR,rt=K.Z_DEFAULT_COMPRESSION,st=K.Z_FILTERED,ot=K.Z_HUFFMAN_ONLY,lt=K.Z_RLE,ht=K.Z_FIXED,dt=K.Z_DEFAULT_STRATEGY,_t=K.Z_UNKNOWN,ft=K.Z_DEFLATED,ut=258,ct=262,wt=42,mt=113,bt=666,gt=function(t,e){return t.msg=j[e],e},pt=function(t){return 2*t-(t>4?9:0)},vt=function(t){for(var e=t.length;--e>=0;)t[e]=0},kt=function(t){var e,a,n,i=t.w_size;n=e=t.hash_size;do{a=t.head[--n],t.head[n]=a>=i?a-i:0}while(--e);n=e=i;do{a=t.prev[--n],t.prev[n]=a>=i?a-i:0}while(--e)},yt=function(t,e,a){return(e<t.avail_out&&(a=t.avail_out),0!==a&&(t.output.set(e.pending_buf.subarray(e.pending_out,e.pending_out+a),t.next_out),t.next_out+=a,e.pending_out+=a,t.total_out+=a,t.avail_out-=a,e.pending-=a,0===e.pending&&(e.pending_out=0))},zt=function(t,e){G(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,xt(t.strm)},At=function(t,e){t.pending_buf[t.pending++]=e},Et=function(t,e){t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e},Rt=function(t,e,a,n){var i=t.avail_in;return i>n&&(i=n),0===i?0:(t.avail_in-=i,e.set(t.input.subarray(t.next_in,t.next_in+i),a),1===t.state.wrap?t.adler=C(t.adler,e,i,a):2===t.state.wrap&&(t.adler=H(t.adler,e,i,a)),t.next_in+=i,t.total_in+=i,i)},Zt=function(t,e){var a,n,i=t.max_chain_length,r=t.strstart,s=t.prev_length,o=t.nice_match,l=t.strstart>t.w_size-ct?t.strstart-(t.w_size-ct):0,h=t.window,d=t.w_mask,_=t.prev,f=t.strstart+ut,u=h[r+s-1],c=h[r+s];t.prev_length>=t.good_match&&(i>>=2),o>t.lookahead&&(o=t.lookahead);do{if(h[(a=e)+s]===c&&h[a+s-1]===u&&h[a]===h[r]&&h[++a]===h[r+1]){r+=2,a++;do{}while(h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&rs){if(t.match_start=e,s=n,n>=o)break;u=h[r+s-1],c=h[r+s]}}}while((e=_[e&d])>l&&0!=--i);return s<=t.lookahead?s:t.lookahead},St=function(t){var e,a,n,i=t.w_size;do{if(a=t.window_size-t.lookahead-t.strstart,t.strstart>=i+(i-ct)&&(t.window.set(t.window.subarray(i,i+i-a),0),t.match_start-=i,t.strstart-=i,t.block_start-=i,t.insert>t.strstart&&(t.insert=t.strstart),kt(t),a+=i),0===t.strm.avail_in)break;if(e=Rt(t.strm,t.window,t.strstart+t.lookahead,a),t.lookahead+=e,t.lookahead+t.insert>=3)for(n=t.strstart-t.insert,t.ins_h=t.window[n],t.ins_h=yt(t,t.ins_h,t.window[n+1]);t.insert&&(t.ins_h=yt(t,t.ins_h,t.window[n+3-1]),t.prev[n&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=n,n++,t.insert--,!(t.lookahead+t.insert<3)););}while(t.lookaheadt.w_size?t.w_size:t.pending_buf_size-5,s=0,o=t.strm.avail_in;do{if(a=65535,i=t.bi_valid+42>>3,t.strm.avail_out(n=t.strstart-t.block_start)+t.strm.avail_in&&(a=n+t.strm.avail_in),a>i&&(a=i),a>8,t.pending_buf[t.pending-2]=~a,t.pending_buf[t.pending-1]=~a>>8,xt(t.strm),n&&(n>a&&(n=a),t.strm.output.set(t.window.subarray(t.block_start,t.block_start+n),t.strm.next_out),t.strm.next_out+=n,t.strm.avail_out-=n,t.strm.total_out+=n,t.block_start+=n,a-=n),a&&(Rt(t.strm,t.strm.output,t.strm.next_out,a),t.strm.next_out+=a,t.strm.avail_out-=a,t.strm.total_out+=a)}while(0===s);return(o-=t.strm.avail_in)&&(o>=t.w_size?(t.matches=2,t.window.set(t.strm.input.subarray(t.strm.next_in-t.w_size,t.strm.next_in),0),t.strstart=t.w_size,t.insert=t.strstart):(t.window_size-t.strstart<=o&&(t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,t.insert>t.strstart&&(t.insert=t.strstart)),t.window.set(t.strm.input.subarray(t.strm.next_in-o,t.strm.next_in),t.strstart),t.strstart+=o,t.insert+=o>t.w_size-t.insert?t.w_size-t.insert:o),t.block_start=t.strstart),t.high_wateri&&t.block_start>=t.w_size&&(t.block_start-=t.w_size,t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,i+=t.w_size,t.insert>t.strstart&&(t.insert=t.strstart)),i>t.strm.avail_in&&(i=t.strm.avail_in),i&&(Rt(t.strm,t.window,t.strstart,i),t.strstart+=i,t.insert+=i>t.w_size-t.insert?t.w_size-t.insert:i),t.high_water>3,r=(i=t.pending_buf_size-i>65535?65535:t.pending_buf_size-i)>t.w_size?t.w_size:i,((n=t.strstart-t.block_start)>=r||(n||e===V)&&e!==q&&0===t.strm.avail_in&&n<=i)&&(a=n>i?i:n,s=e===V&&0===t.strm.avail_in&&a===n?1:0,Y(t,t.block_start,a,s),t.block_start+=a,xt(t.strm)),s?3:1)},Dt=function(t,e){for(var a,n;;){if(t.lookahead=3&&(t.ins_h=yt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),0!==a&&t.strstart-a<=t.w_size-ct&&(t.match_length=Zt(t,a)),t.match_length>=3)if(n=X(t,t.strstart-t.match_start,t.match_length-3),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=3){t.match_length--;do{t.strstart++,t.ins_h=yt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart}while(0!=--t.match_length);t.strstart++}else t.strstart+=t.match_length,t.match_length=0,t.ins_h=t.window[t.strstart],t.ins_h=yt(t,t.ins_h,t.window[t.strstart+1]);else n=X(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++;if(n&&(zt(t,!1),0===t.strm.avail_out))return 1}return t.insert=t.strstart<2?t.strstart:2,e===V?(zt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(zt(t,!1),0===t.strm.avail_out)?1:2},Tt=function(t,e){for(var a,n,i;;){if(t.lookahead=3&&(t.ins_h=yt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),t.prev_length=t.match_length,t.prev_match=t.match_start,t.match_length=2,0!==a&&t.prev_length4096)&&(t.match_length=2)),t.prev_length>=3&&t.match_length<=t.prev_length){i=t.strstart+t.lookahead-3,n=X(t,t.strstart-1-t.prev_match,t.prev_length-3),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=i&&(t.ins_h=yt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart)}while(0!=--t.prev_length);if(t.match_available=0,t.match_length=2,t.strstart++,n&&(zt(t,!1),0===t.strm.avail_out))return 1}else if(t.match_available){if((n=X(t,0,t.window[t.strstart-1]))&&zt(t,!1),t.strstart++,t.lookahead--,0===t.strm.avail_out)return 1}else t.match_available=1,t.strstart++,t.lookahead--}return t.match_available&&(n=X(t,0,t.window[t.strstart-1]),t.match_available=0),t.insert=t.strstart<2?t.strstart:2,e===V?(zt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(zt(t,!1),0===t.strm.avail_out)?1:2};function Ot(t,e,a,n,i){this.good_length=t,this.max_lazy=e,this.nice_length=a,this.max_chain=n,this.func=i}var It=[new Ot(0,0,0,0,Ut),new Ot(4,4,8,4,Dt),new Ot(4,5,16,8,Dt),new Ot(4,6,32,32,Dt),new Ot(4,4,16,16,Tt),new Ot(8,16,32,32,Tt),new Ot(8,16,128,128,Tt),new Ot(8,32,128,256,Tt),new Ot(32,128,258,1024,Tt),new Ot(32,258,258,4096,Tt)];function Ft(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=ft,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Uint16Array(1146),this.dyn_dtree=new Uint16Array(122),this.bl_tree=new Uint16Array(78),vt(this.dyn_ltree),vt(this.dyn_dtree),vt(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Uint16Array(16),this.heap=new Uint16Array(573),vt(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(573),vt(this.depth),this.sym_buf=0,this.lit_bufsize=0,this.sym_next=0,this.sym_end=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}var Lt=function(t){if(!t)return 1;var e=t.state;return!e||e.strm!==t||e.status!==wt&&57!==e.status&&69!==e.status&&73!==e.status&&91!==e.status&&103!==e.status&&e.status!==mt&&e.status!==bt?1:0},Nt=function(t){if(Lt(t))return gt(t,at);t.total_in=t.total_out=0,t.data_type=_t;var e=t.state;return e.pending=0,e.pending_out=0,e.wrap<0&&(e.wrap=-e.wrap),e.status=2===e.wrap?57:e.wrap?wt:mt,t.adler=2===e.wrap?0:1,e.last_flush=-2,P(e),tt},Bt=function(t){var e,a=Nt(t);return a===tt&&((e=t.state).window_size=2*e.w_size,vt(e.head),e.max_lazy_match=It[e.level].max_lazy,e.good_match=It[e.level].good_length,e.nice_match=It[e.level].nice_length,e.max_chain_length=It[e.level].max_chain,e.strstart=0,e.block_start=0,e.lookahead=0,e.insert=0,e.match_length=e.prev_length=2,e.match_available=0,e.ins_h=0),a},Ct=function(t,e,a,n,i,r){if(!t)return at;var s=1;if(e===rt&&(e=6),n<0?(s=0,n=-n):n>15&&(s=2,n-=16),i<1||i>9||a!==ft||n<8||n>15||e<0||e>9||r<0||r>ht||8===n&&1!==s)return gt(t,at);8===n&&(n=9);var o=new Ft;return t.state=o,o.strm=t,o.status=wt,o.wrap=s,o.gzhead=null,o.w_bits=n,o.w_size=1<$||e<0)return t?gt(t,at):at;var a=t.state;if(!t.output||0!==t.avail_in&&!t.input||a.status===bt&&e!==V)return gt(t,0===t.avail_out?it:at);var n=a.last_flush;if(a.last_flush=e,0!==a.pending){if(xt(t),0===t.avail_out)return a.last_flush=-1,tt}else if(0===t.avail_in&&pt(e)<=pt(n)&&e!==V)return gt(t,it);if(a.status===bt&&0!==t.avail_in)return gt(t,it);if(a.status===wt&&0===a.wrap&&(a.status=mt),a.status===wt){var i=ft+(a.w_bits-8<<4)<<8;if(i|=(a.strategy>=ot||a.level<2?0:a.level<6?1:6===a.level?2:3)<<6,0!==a.strstart&&(i|=32),Et(a,i+=31-i%31),0!==a.strstart&&(Et(a,t.adler>>>16),Et(a,65535&t.adler)),t.adler=1,a.status=mt,xt(t),0!==a.pending)return a.last_flush=-1,tt}if(57===a.status)if(t.adler=0,At(a,31),At(a,139),At(a,8),a.gzhead)At(a,(a.gzhead.text?1:0)+(a.gzhead.hcrc?2:0)+(a.gzhead.extra?4:0)+(a.gzhead.name?8:0)+(a.gzhead.comment?16:0)),At(a,255&a.gzhead.time),At(a,a.gzhead.time>>8&255),At(a,a.gzhead.time>>16&255),At(a,a.gzhead.time>>24&255),At(a,9===a.level?2:a.strategy>=ot||a.level<2?4:0),At(a,255&a.gzhead.os),a.gzhead.extra&&a.gzhead.extra.length&&(At(a,255&a.gzhead.extra.length),At(a,a.gzhead.extra.length>>8&255)),a.gzhead.hcrc&&(t.adler=H(t.adler,a.pending_buf,a.pending,0)),a.gzindex=0,a.status=69;else if(At(a,0),At(a,0),At(a,0),At(a,0),At(a,0),At(a,9===a.level?2:a.strategy>=ot||a.level<2?4:0),At(a,3),a.status=mt,xt(t),0!==a.pending)return a.last_flush=-1,tt;if(69===a.status){if(a.gzhead.extra){for(var r=a.pending,s=(65535&a.gzhead.extra.length)-a.gzindex;a.pending+s>a.pending_buf_size;){var o=a.pending_buf_size-a.pending;if(a.pending_buf.set(a.gzhead.extra.subarray(a.gzindex,a.gzindex+o),a.pending),a.pending=a.pending_buf_size,a.gzhead.hcrc&&a.pending>r&&(t.adler=H(t.adler,a.pending_buf,a.pending-r,r)),a.gzindex+=o,xt(t),0!==a.pending)return a.last_flush=-1,tt;r=0,s-=o}var l=new Uint8Array(a.gzhead.extra);a.pending_buf.set(l.subarray(a.gzindex,a.gzindex+s),a.pending),a.pending+=s,a.gzhead.hcrc&&a.pending>r&&(t.adler=H(t.adler,a.pending_buf,a.pending-r,r)),a.gzindex=0}a.status=73}if(73===a.status){if(a.gzhead.name){var h,d=a.pending;do{if(a.pending===a.pending_buf_size){if(a.gzhead.hcrc&&a.pending>d&&(t.adler=H(t.adler,a.pending_buf,a.pending-d,d)),xt(t),0!==a.pending)return a.last_flush=-1,tt;d=0}h=a.gzindexd&&(t.adler=H(t.adler,a.pending_buf,a.pending-d,d)),a.gzindex=0}a.status=91}if(91===a.status){if(a.gzhead.comment){var _,f=a.pending;do{if(a.pending===a.pending_buf_size){if(a.gzhead.hcrc&&a.pending>f&&(t.adler=H(t.adler,a.pending_buf,a.pending-f,f)),xt(t),0!==a.pending)return a.last_flush=-1,tt;f=0}_=a.gzindexf&&(t.adler=H(t.adler,a.pending_buf,a.pending-f,f))}a.status=103}if(103===a.status){if(a.gzhead.hcrc){if(a.pending+2>a.pending_buf_size&&(xt(t),0!==a.pending))return a.last_flush=-1,tt;At(a,255&t.adler),At(a,t.adler>>8&255),t.adler=0}if(a.status=mt,xt(t),0!==a.pending)return a.last_flush=-1,tt}if(0!==t.avail_in||0!==a.lookahead||e!==q&&a.status!==bt){var u=0===a.level?Ut(a,e):a.strategy===ot?function(t,e){for(var a;;){if(0===t.lookahead&&(St(t),0===t.lookahead)){if(e===q)return 1;break}if(t.match_length=0,a=X(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,a&&(zt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===V?(zt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(zt(t,!1),0===t.strm.avail_out)?1:2}(a,e):a.strategy===lt?function(t,e){for(var a,n,i,r,s=t.window;;){if(t.lookahead<=ut){if(St(t),t.lookahead<=ut&&e===q)return 1;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=3&&t.strstart>0&&(n=s[i=t.strstart-1])===s[++i]&&n===s[++i]&&n===s[++i]){r=t.strstart+ut;do{}while(n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&it.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=3?(a=X(t,1,t.match_length-3),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(a=X(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),a&&(zt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===V?(zt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(zt(t,!1),0===t.strm.avail_out)?1:2}(a,e):It[a.level].func(a,e);if(3!==u&&4!==u||(a.status=bt),1===u||3===u)return 0===t.avail_out&&(a.last_flush=-1),tt;if(2===u&&(e===J?W(a):e!==$&&(Y(a,0,0,!1),e===Q&&(vt(a.head),0===a.lookahead&&(a.strstart=0,a.block_start=0,a.insert=0))),xt(t),0===t.avail_out))return a.last_flush=-1,tt}return e!==V?tt:a.wrap<=0?et:(2===a.wrap?(At(a,255&t.adler),At(a,t.adler>>8&255),At(a,t.adler>>16&255),At(a,t.adler>>24&255),At(a,255&t.total_in),At(a,t.total_in>>8&255),At(a,t.total_in>>16&255),At(a,t.total_in>>24&255)):(Et(a,t.adler>>>16),Et(a,65535&t.adler)),xt(t),a.wrap>0&&(a.wrap=-a.wrap),0!==a.pending?tt:et)},deflateEnd:function(t){if(Lt(t))return at;var e=t.state.status;return t.state=null,e===mt?gt(t,nt):tt},deflateSetDictionary:function(t,e){var a=e.length;if(Lt(t))return at;var n=t.state,i=n.wrap;if(2===i||1===i&&n.status!==wt||n.lookahead)return at;if(1===i&&(t.adler=C(t.adler,e,a,0)),n.wrap=0,a>=n.w_size){0===i&&(vt(n.head),n.strstart=0,n.block_start=0,n.insert=0);var r=new Uint8Array(n.w_size);r.set(e.subarray(a-n.w_size,a),0),e=r,a=n.w_size}var s=t.avail_in,o=t.next_in,l=t.input;for(t.avail_in=a,t.next_in=0,t.input=e,St(n);n.lookahead>=3;){var h=n.strstart,d=n.lookahead-2;do{n.ins_h=yt(n,n.ins_h,n.window[h+3-1]),n.prev[h&n.w_mask]=n.head[n.ins_h],n.head[n.ins_h]=h,h++}while(--d);n.strstart=h,n.lookahead=2,St(n)}return n.strstart+=n.lookahead,n.block_start=n.strstart,n.insert=n.lookahead,n.lookahead=0,n.match_length=n.prev_length=2,n.match_available=0,t.next_in=o,t.input=l,t.avail_in=s,n.wrap=i,tt},deflateInfo:"pako deflate (from Nodeca project)"};function Ht(t){return Ht="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Ht(t)}var jt=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},Kt=function(t){for(var e=Array.prototype.slice.call(arguments,1);e.length;){var a=e.shift();if(a){if("object"!==Ht(a))throw new TypeError(a+"must be non-object");for(var n in a)jt(a,n)&&(t[n]=a[n])}}return t},Pt=function(t){for(var e=0,a=0,n=t.length;a=252?6:Xt>=248?5:Xt>=240?4:Xt>=224?3:Xt>=192?2:1;Gt[254]=Gt[254]=1;var Wt=function(t){if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(t);var e,a,n,i,r,s=t.length,o=0;for(i=0;i>>6,e[r++]=128|63&a):a<65536?(e[r++]=224|a>>>12,e[r++]=128|a>>>6&63,e[r++]=128|63&a):(e[r++]=240|a>>>18,e[r++]=128|a>>>12&63,e[r++]=128|a>>>6&63,e[r++]=128|63&a);return e},qt=function(t,e){var a,n,i=e||t.length;if("function"==typeof TextDecoder&&TextDecoder.prototype.decode)return(new TextDecoder).decode(t.subarray(0,e));var r=new Array(2*i);for(n=0,a=0;a4)r[n++]=65533,a+=o-1;else{for(s&=2===o?31:3===o?15:7;o>1&&a1?r[n++]=65533:s<65536?r[n++]=s:(s-=65536,r[n++]=55296|s>>10&1023,r[n++]=56320|1023&s)}}}return function(t,e){if(e<65534&&t.subarray&&Yt)return String.fromCharCode.apply(null,t.length===e?t:t.subarray(0,e));for(var a="",n=0;nt.length&&(e=t.length);for(var a=e-1;a>=0&&128==(192&t[a]);)a--;return a<0||0===a?e:a+Gt[t[a]]>e?a:e};var Qt=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0},Vt=Object.prototype.toString,$t=K.Z_NO_FLUSH,te=K.Z_SYNC_FLUSH,ee=K.Z_FULL_FLUSH,ae=K.Z_FINISH,ne=K.Z_OK,ie=K.Z_STREAM_END,re=K.Z_DEFAULT_COMPRESSION,se=K.Z_DEFAULT_STRATEGY,oe=K.Z_DEFLATED;function le(t){this.options=Kt({level:re,method:oe,chunkSize:16384,windowBits:15,memLevel:8,strategy:se},t||{});var e=this.options;e.raw&&e.windowBits>0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new Qt,this.strm.avail_out=0;var a=Mt.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(a!==ne)throw new Error(j[a]);if(e.header&&Mt.deflateSetHeader(this.strm,e.header),e.dictionary){var n;if(n="string"==typeof e.dictionary?Wt(e.dictionary):"[object ArrayBuffer]"===Vt.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,(a=Mt.deflateSetDictionary(this.strm,n))!==ne)throw new Error(j[a]);this._dict_set=!0}}function he(t,e){var a=new le(e);if(a.push(t,!0),a.err)throw a.msg||j[a.err];return a.result}le.prototype.push=function(t,e){var a,n,i=this.strm,r=this.options.chunkSize;if(this.ended)return!1;for(n=e===~~e?e:!0===e?ae:$t,"string"==typeof t?i.input=Wt(t):"[object ArrayBuffer]"===Vt.call(t)?i.input=new Uint8Array(t):i.input=t,i.next_in=0,i.avail_in=i.input.length;;)if(0===i.avail_out&&(i.output=new Uint8Array(r),i.next_out=0,i.avail_out=r),(n===te||n===ee)&&i.avail_out<=6)this.onData(i.output.subarray(0,i.next_out)),i.avail_out=0;else{if((a=Mt.deflate(i,n))===ie)return i.next_out>0&&this.onData(i.output.subarray(0,i.next_out)),a=Mt.deflateEnd(this.strm),this.onEnd(a),this.ended=!0,a===ne;if(0!==i.avail_out){if(n>0&&i.next_out>0)this.onData(i.output.subarray(0,i.next_out)),i.avail_out=0;else if(0===i.avail_in)break}else this.onData(i.output)}return!0},le.prototype.onData=function(t){this.chunks.push(t)},le.prototype.onEnd=function(t){t===ne&&(this.result=Pt(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var de={Deflate:le,deflate:he,deflateRaw:function(t,e){return(e=e||{}).raw=!0,he(t,e)},gzip:function(t,e){return(e=e||{}).gzip=!0,he(t,e)},constants:K},_e=16209,fe=function(t,e){var a,n,i,r,s,o,l,h,d,_,f,u,c,w,m,b,g,p,v,k,y,x,z,A,E=t.state;a=t.next_in,z=t.input,n=a+(t.avail_in-5),i=t.next_out,A=t.output,r=i-(e-t.avail_out),s=i+(t.avail_out-257),o=E.dmax,l=E.wsize,h=E.whave,d=E.wnext,_=E.window,f=E.hold,u=E.bits,c=E.lencode,w=E.distcode,m=(1<>>=p=g>>>24,u-=p,0===(p=g>>>16&255))A[i++]=65535&g;else{if(!(16&p)){if(0==(64&p)){g=c[(65535&g)+(f&(1<>>=p,u-=p),u<15&&(f+=z[a++]<>>=p=g>>>24,u-=p,!(16&(p=g>>>16&255))){if(0==(64&p)){g=w[(65535&g)+(f&(1<o){t.msg="invalid distance too far back",E.mode=_e;break t}if(f>>>=p,u-=p,k>(p=i-r)){if((p=k-p)>h&&E.sane){t.msg="invalid distance too far back",E.mode=_e;break t}if(y=0,x=_,0===d){if(y+=l-p,p2;)A[i++]=x[y++],A[i++]=x[y++],A[i++]=x[y++],v-=3;v&&(A[i++]=x[y++],v>1&&(A[i++]=x[y++]))}else{y=i-k;do{A[i++]=A[y++],A[i++]=A[y++],A[i++]=A[y++],v-=3}while(v>2);v&&(A[i++]=A[y++],v>1&&(A[i++]=A[y++]))}break}}break}}while(a>3,f&=(1<<(u-=v<<3))-1,t.next_in=a,t.next_out=i,t.avail_in=a=1&&0===S[k];k--);if(y>k&&(y=k),0===k)return i[r++]=20971520,i[r++]=20971520,o.bits=1,0;for(v=1;v0&&(0===t||1!==k))return-1;for(U[1]=0,g=1;g852||2===t&&E>592)return 1;for(;;){c=g-z,s[p]+1=u?(w=D[s[p]-u],m=Z[s[p]-u]):(w=96,m=0),l=1<>z)+(h-=l)]=c<<24|w<<16|m|0}while(0!==h);for(l=1<>=1;if(0!==l?(R&=l-1,R+=l):R=0,p++,0==--S[g]){if(g===k)break;g=e[a+s[p]]}if(g>y&&(R&_)!==d){for(0===z&&(z=y),f+=v,A=1<<(x=g-z);x+z852||2===t&&E>592)return 1;i[d=R&_]=y<<24|x<<16|f-r|0}}return 0!==R&&(i[f+R]=g-z<<24|64<<16|0),o.bits=y,0},pe=K.Z_FINISH,ve=K.Z_BLOCK,ke=K.Z_TREES,ye=K.Z_OK,xe=K.Z_STREAM_END,ze=K.Z_NEED_DICT,Ae=K.Z_STREAM_ERROR,Ee=K.Z_DATA_ERROR,Re=K.Z_MEM_ERROR,Ze=K.Z_BUF_ERROR,Se=K.Z_DEFLATED,Ue=16180,De=16190,Te=16191,Oe=16192,Ie=16194,Fe=16199,Le=16200,Ne=16206,Be=16209,Ce=function(t){return(t>>>24&255)+(t>>>8&65280)+((65280&t)<<8)+((255&t)<<24)};function Me(){this.strm=null,this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}var He,je,Ke=function(t){if(!t)return 1;var e=t.state;return!e||e.strm!==t||e.mode16211?1:0},Pe=function(t){if(Ke(t))return Ae;var e=t.state;return t.total_in=t.total_out=e.total=0,t.msg="",e.wrap&&(t.adler=1&e.wrap),e.mode=Ue,e.last=0,e.havedict=0,e.flags=-1,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new Int32Array(852),e.distcode=e.distdyn=new Int32Array(592),e.sane=1,e.back=-1,ye},Ye=function(t){if(Ke(t))return Ae;var e=t.state;return e.wsize=0,e.whave=0,e.wnext=0,Pe(t)},Ge=function(t,e){var a;if(Ke(t))return Ae;var n=t.state;return e<0?(a=0,e=-e):(a=5+(e>>4),e<48&&(e&=15)),e&&(e<8||e>15)?Ae:(null!==n.window&&n.wbits!==e&&(n.window=null),n.wrap=a,n.wbits=e,Ye(t))},Xe=function(t,e){if(!t)return Ae;var a=new Me;t.state=a,a.strm=t,a.window=null,a.mode=Ue;var n=Ge(t,e);return n!==ye&&(t.state=null),n},We=!0,qe=function(t){if(We){He=new Int32Array(512),je=new Int32Array(32);for(var e=0;e<144;)t.lens[e++]=8;for(;e<256;)t.lens[e++]=9;for(;e<280;)t.lens[e++]=7;for(;e<288;)t.lens[e++]=8;for(ge(1,t.lens,0,288,He,0,t.work,{bits:9}),e=0;e<32;)t.lens[e++]=5;ge(2,t.lens,0,32,je,0,t.work,{bits:5}),We=!1}t.lencode=He,t.lenbits=9,t.distcode=je,t.distbits=5},Je=function(t,e,a,n){var i,r=t.state;return null===r.window&&(r.wsize=1<=r.wsize?(r.window.set(e.subarray(a-r.wsize,a),0),r.wnext=0,r.whave=r.wsize):((i=r.wsize-r.wnext)>n&&(i=n),r.window.set(e.subarray(a-n,a-n+i),r.wnext),(n-=i)?(r.window.set(e.subarray(a-n,a),0),r.wnext=n,r.whave=r.wsize):(r.wnext+=i,r.wnext===r.wsize&&(r.wnext=0),r.whave>>8&255,a.check=H(a.check,R,2,0),h=0,d=0,a.mode=16181;break}if(a.head&&(a.head.done=!1),!(1&a.wrap)||(((255&h)<<8)+(h>>8))%31){t.msg="incorrect header check",a.mode=Be;break}if((15&h)!==Se){t.msg="unknown compression method",a.mode=Be;break}if(d-=4,y=8+(15&(h>>>=4)),0===a.wbits&&(a.wbits=y),y>15||y>a.wbits){t.msg="invalid window size",a.mode=Be;break}a.dmax=1<>8&1),512&a.flags&&4&a.wrap&&(R[0]=255&h,R[1]=h>>>8&255,a.check=H(a.check,R,2,0)),h=0,d=0,a.mode=16182;case 16182:for(;d<32;){if(0===o)break t;o--,h+=n[r++]<>>8&255,R[2]=h>>>16&255,R[3]=h>>>24&255,a.check=H(a.check,R,4,0)),h=0,d=0,a.mode=16183;case 16183:for(;d<16;){if(0===o)break t;o--,h+=n[r++]<>8),512&a.flags&&4&a.wrap&&(R[0]=255&h,R[1]=h>>>8&255,a.check=H(a.check,R,2,0)),h=0,d=0,a.mode=16184;case 16184:if(1024&a.flags){for(;d<16;){if(0===o)break t;o--,h+=n[r++]<>>8&255,a.check=H(a.check,R,2,0)),h=0,d=0}else a.head&&(a.head.extra=null);a.mode=16185;case 16185:if(1024&a.flags&&((u=a.length)>o&&(u=o),u&&(a.head&&(y=a.head.extra_len-a.length,a.head.extra||(a.head.extra=new Uint8Array(a.head.extra_len)),a.head.extra.set(n.subarray(r,r+u),y)),512&a.flags&&4&a.wrap&&(a.check=H(a.check,n,u,r)),o-=u,r+=u,a.length-=u),a.length))break t;a.length=0,a.mode=16186;case 16186:if(2048&a.flags){if(0===o)break t;u=0;do{y=n[r+u++],a.head&&y&&a.length<65536&&(a.head.name+=String.fromCharCode(y))}while(y&&u>9&1,a.head.done=!0),t.adler=a.check=0,a.mode=Te;break;case 16189:for(;d<32;){if(0===o)break t;o--,h+=n[r++]<>>=7&d,d-=7&d,a.mode=Ne;break}for(;d<3;){if(0===o)break t;o--,h+=n[r++]<>>=1)){case 0:a.mode=16193;break;case 1:if(qe(a),a.mode=Fe,e===ke){h>>>=2,d-=2;break t}break;case 2:a.mode=16196;break;case 3:t.msg="invalid block type",a.mode=Be}h>>>=2,d-=2;break;case 16193:for(h>>>=7&d,d-=7&d;d<32;){if(0===o)break t;o--,h+=n[r++]<>>16^65535)){t.msg="invalid stored block lengths",a.mode=Be;break}if(a.length=65535&h,h=0,d=0,a.mode=Ie,e===ke)break t;case Ie:a.mode=16195;case 16195:if(u=a.length){if(u>o&&(u=o),u>l&&(u=l),0===u)break t;i.set(n.subarray(r,r+u),s),o-=u,r+=u,l-=u,s+=u,a.length-=u;break}a.mode=Te;break;case 16196:for(;d<14;){if(0===o)break t;o--,h+=n[r++]<>>=5,d-=5,a.ndist=1+(31&h),h>>>=5,d-=5,a.ncode=4+(15&h),h>>>=4,d-=4,a.nlen>286||a.ndist>30){t.msg="too many length or distance symbols",a.mode=Be;break}a.have=0,a.mode=16197;case 16197:for(;a.have>>=3,d-=3}for(;a.have<19;)a.lens[Z[a.have++]]=0;if(a.lencode=a.lendyn,a.lenbits=7,z={bits:a.lenbits},x=ge(0,a.lens,0,19,a.lencode,0,a.work,z),a.lenbits=z.bits,x){t.msg="invalid code lengths set",a.mode=Be;break}a.have=0,a.mode=16198;case 16198:for(;a.have>>16&255,g=65535&E,!((m=E>>>24)<=d);){if(0===o)break t;o--,h+=n[r++]<>>=m,d-=m,a.lens[a.have++]=g;else{if(16===g){for(A=m+2;d>>=m,d-=m,0===a.have){t.msg="invalid bit length repeat",a.mode=Be;break}y=a.lens[a.have-1],u=3+(3&h),h>>>=2,d-=2}else if(17===g){for(A=m+3;d>>=m)),h>>>=3,d-=3}else{for(A=m+7;d>>=m)),h>>>=7,d-=7}if(a.have+u>a.nlen+a.ndist){t.msg="invalid bit length repeat",a.mode=Be;break}for(;u--;)a.lens[a.have++]=y}}if(a.mode===Be)break;if(0===a.lens[256]){t.msg="invalid code -- missing end-of-block",a.mode=Be;break}if(a.lenbits=9,z={bits:a.lenbits},x=ge(1,a.lens,0,a.nlen,a.lencode,0,a.work,z),a.lenbits=z.bits,x){t.msg="invalid literal/lengths set",a.mode=Be;break}if(a.distbits=6,a.distcode=a.distdyn,z={bits:a.distbits},x=ge(2,a.lens,a.nlen,a.ndist,a.distcode,0,a.work,z),a.distbits=z.bits,x){t.msg="invalid distances set",a.mode=Be;break}if(a.mode=Fe,e===ke)break t;case Fe:a.mode=Le;case Le:if(o>=6&&l>=258){t.next_out=s,t.avail_out=l,t.next_in=r,t.avail_in=o,a.hold=h,a.bits=d,fe(t,f),s=t.next_out,i=t.output,l=t.avail_out,r=t.next_in,n=t.input,o=t.avail_in,h=a.hold,d=a.bits,a.mode===Te&&(a.back=-1);break}for(a.back=0;b=(E=a.lencode[h&(1<>>16&255,g=65535&E,!((m=E>>>24)<=d);){if(0===o)break t;o--,h+=n[r++]<>p)])>>>16&255,g=65535&E,!(p+(m=E>>>24)<=d);){if(0===o)break t;o--,h+=n[r++]<>>=p,d-=p,a.back+=p}if(h>>>=m,d-=m,a.back+=m,a.length=g,0===b){a.mode=16205;break}if(32&b){a.back=-1,a.mode=Te;break}if(64&b){t.msg="invalid literal/length code",a.mode=Be;break}a.extra=15&b,a.mode=16201;case 16201:if(a.extra){for(A=a.extra;d>>=a.extra,d-=a.extra,a.back+=a.extra}a.was=a.length,a.mode=16202;case 16202:for(;b=(E=a.distcode[h&(1<>>16&255,g=65535&E,!((m=E>>>24)<=d);){if(0===o)break t;o--,h+=n[r++]<>p)])>>>16&255,g=65535&E,!(p+(m=E>>>24)<=d);){if(0===o)break t;o--,h+=n[r++]<>>=p,d-=p,a.back+=p}if(h>>>=m,d-=m,a.back+=m,64&b){t.msg="invalid distance code",a.mode=Be;break}a.offset=g,a.extra=15&b,a.mode=16203;case 16203:if(a.extra){for(A=a.extra;d>>=a.extra,d-=a.extra,a.back+=a.extra}if(a.offset>a.dmax){t.msg="invalid distance too far back",a.mode=Be;break}a.mode=16204;case 16204:if(0===l)break t;if(u=f-l,a.offset>u){if((u=a.offset-u)>a.whave&&a.sane){t.msg="invalid distance too far back",a.mode=Be;break}u>a.wnext?(u-=a.wnext,c=a.wsize-u):c=a.wnext-u,u>a.length&&(u=a.length),w=a.window}else w=i,c=s-a.offset,u=a.length;u>l&&(u=l),l-=u,a.length-=u;do{i[s++]=w[c++]}while(--u);0===a.length&&(a.mode=Le);break;case 16205:if(0===l)break t;i[s++]=a.length,l--,a.mode=Le;break;case Ne:if(a.wrap){for(;d<32;){if(0===o)break t;o--,h|=n[r++]<=0&&e.windowBits<16&&(e.windowBits=-e.windowBits,0===e.windowBits&&(e.windowBits=-15)),!(e.windowBits>=0&&e.windowBits<16)||t&&t.windowBits||(e.windowBits+=32),e.windowBits>15&&e.windowBits<48&&0==(15&e.windowBits)&&(e.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new Qt,this.strm.avail_out=0;var a=Qe.inflateInit2(this.strm,e.windowBits);if(a!==aa)throw new Error(j[a]);if(this.header=new Ve,Qe.inflateGetHeader(this.strm,this.header),e.dictionary&&("string"==typeof e.dictionary?e.dictionary=Wt(e.dictionary):"[object ArrayBuffer]"===$e.call(e.dictionary)&&(e.dictionary=new Uint8Array(e.dictionary)),e.raw&&(a=Qe.inflateSetDictionary(this.strm,e.dictionary))!==aa))throw new Error(j[a])}function ha(t,e){var a=new la(e);if(a.push(t),a.err)throw a.msg||j[a.err];return a.result}la.prototype.push=function(t,e){var a,n,i,r=this.strm,s=this.options.chunkSize,o=this.options.dictionary;if(this.ended)return!1;for(n=e===~~e?e:!0===e?ea:ta,"[object ArrayBuffer]"===$e.call(t)?r.input=new Uint8Array(t):r.input=t,r.next_in=0,r.avail_in=r.input.length;;){for(0===r.avail_out&&(r.output=new Uint8Array(s),r.next_out=0,r.avail_out=s),(a=Qe.inflate(r,n))===ia&&o&&((a=Qe.inflateSetDictionary(r,o))===aa?a=Qe.inflate(r,n):a===sa&&(a=ia));r.avail_in>0&&a===na&&r.state.wrap>0&&0!==t[r.next_in];)Qe.inflateReset(r),a=Qe.inflate(r,n);switch(a){case ra:case sa:case ia:case oa:return this.onEnd(a),this.ended=!0,!1}if(i=r.avail_out,r.next_out&&(0===r.avail_out||a===na))if("string"===this.options.to){var l=Jt(r.output,r.next_out),h=r.next_out-l,d=qt(r.output,l);r.next_out=h,r.avail_out=s-h,h&&r.output.set(r.output.subarray(l,l+h),0),this.onData(d)}else this.onData(r.output.length===r.next_out?r.output:r.output.subarray(0,r.next_out));if(a!==aa||0!==i){if(a===na)return a=Qe.inflateEnd(this.strm),this.onEnd(a),this.ended=!0,!0;if(0===r.avail_in)break}}return!0},la.prototype.onData=function(t){this.chunks.push(t)},la.prototype.onEnd=function(t){t===aa&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=Pt(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var da={Inflate:la,inflate:ha,inflateRaw:function(t,e){return(e=e||{}).raw=!0,ha(t,e)},ungzip:ha,constants:K},_a=de.Deflate,fa=de.deflate,ua=de.deflateRaw,ca=de.gzip,wa=da.Inflate,ma=da.inflate,ba=da.inflateRaw,ga=da.ungzip,pa=K,va={Deflate:_a,deflate:fa,deflateRaw:ua,gzip:ca,Inflate:wa,inflate:ma,inflateRaw:ba,ungzip:ga,constants:pa};t.Deflate=_a,t.Inflate=wa,t.constants=pa,t.default=va,t.deflate=fa,t.deflateRaw=ua,t.gzip=ca,t.inflate=ma,t.inflateRaw=ba,t.ungzip=ga,Object.defineProperty(t,"__esModule",{value:!0})})); diff --git a/node_modules/pako/dist/pako.esm.mjs b/node_modules/pako/dist/pako.esm.mjs deleted file mode 100644 index d110ebd..0000000 --- a/node_modules/pako/dist/pako.esm.mjs +++ /dev/null @@ -1,6877 +0,0 @@ - -/*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */ -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -/* eslint-disable space-unary-ops */ - -/* Public constants ==========================================================*/ -/* ===========================================================================*/ - - -//const Z_FILTERED = 1; -//const Z_HUFFMAN_ONLY = 2; -//const Z_RLE = 3; -const Z_FIXED$1 = 4; -//const Z_DEFAULT_STRATEGY = 0; - -/* Possible values of the data_type field (though see inflate()) */ -const Z_BINARY = 0; -const Z_TEXT = 1; -//const Z_ASCII = 1; // = Z_TEXT -const Z_UNKNOWN$1 = 2; - -/*============================================================================*/ - - -function zero$1(buf) { let len = buf.length; while (--len >= 0) { buf[len] = 0; } } - -// From zutil.h - -const STORED_BLOCK = 0; -const STATIC_TREES = 1; -const DYN_TREES = 2; -/* The three kinds of block type */ - -const MIN_MATCH$1 = 3; -const MAX_MATCH$1 = 258; -/* The minimum and maximum match lengths */ - -// From deflate.h -/* =========================================================================== - * Internal compression state. - */ - -const LENGTH_CODES$1 = 29; -/* number of length codes, not counting the special END_BLOCK code */ - -const LITERALS$1 = 256; -/* number of literal bytes 0..255 */ - -const L_CODES$1 = LITERALS$1 + 1 + LENGTH_CODES$1; -/* number of Literal or Length codes, including the END_BLOCK code */ - -const D_CODES$1 = 30; -/* number of distance codes */ - -const BL_CODES$1 = 19; -/* number of codes used to transfer the bit lengths */ - -const HEAP_SIZE$1 = 2 * L_CODES$1 + 1; -/* maximum heap size */ - -const MAX_BITS$1 = 15; -/* All codes must not exceed MAX_BITS bits */ - -const Buf_size = 16; -/* size of bit buffer in bi_buf */ - - -/* =========================================================================== - * Constants - */ - -const MAX_BL_BITS = 7; -/* Bit length codes must not exceed MAX_BL_BITS bits */ - -const END_BLOCK = 256; -/* end of block literal code */ - -const REP_3_6 = 16; -/* repeat previous bit length 3-6 times (2 bits of repeat count) */ - -const REPZ_3_10 = 17; -/* repeat a zero length 3-10 times (3 bits of repeat count) */ - -const REPZ_11_138 = 18; -/* repeat a zero length 11-138 times (7 bits of repeat count) */ - -/* eslint-disable comma-spacing,array-bracket-spacing */ -const extra_lbits = /* extra bits for each length code */ - new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]); - -const extra_dbits = /* extra bits for each distance code */ - new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]); - -const extra_blbits = /* extra bits for each bit length code */ - new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]); - -const bl_order = - new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]); -/* eslint-enable comma-spacing,array-bracket-spacing */ - -/* The lengths of the bit length codes are sent in order of decreasing - * probability, to avoid transmitting the lengths for unused bit length codes. - */ - -/* =========================================================================== - * Local data. These are initialized only once. - */ - -// We pre-fill arrays with 0 to avoid uninitialized gaps - -const DIST_CODE_LEN = 512; /* see definition of array dist_code below */ - -// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1 -const static_ltree = new Array((L_CODES$1 + 2) * 2); -zero$1(static_ltree); -/* The static literal tree. Since the bit lengths are imposed, there is no - * need for the L_CODES extra codes used during heap construction. However - * The codes 286 and 287 are needed to build a canonical tree (see _tr_init - * below). - */ - -const static_dtree = new Array(D_CODES$1 * 2); -zero$1(static_dtree); -/* The static distance tree. (Actually a trivial tree since all codes use - * 5 bits.) - */ - -const _dist_code = new Array(DIST_CODE_LEN); -zero$1(_dist_code); -/* Distance codes. The first 256 values correspond to the distances - * 3 .. 258, the last 256 values correspond to the top 8 bits of - * the 15 bit distances. - */ - -const _length_code = new Array(MAX_MATCH$1 - MIN_MATCH$1 + 1); -zero$1(_length_code); -/* length code for each normalized match length (0 == MIN_MATCH) */ - -const base_length = new Array(LENGTH_CODES$1); -zero$1(base_length); -/* First normalized length for each code (0 = MIN_MATCH) */ - -const base_dist = new Array(D_CODES$1); -zero$1(base_dist); -/* First normalized distance for each code (0 = distance of 1) */ - - -function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) { - - this.static_tree = static_tree; /* static tree or NULL */ - this.extra_bits = extra_bits; /* extra bits for each code or NULL */ - this.extra_base = extra_base; /* base index for extra_bits */ - this.elems = elems; /* max number of elements in the tree */ - this.max_length = max_length; /* max bit length for the codes */ - - // show if `static_tree` has data or dummy - needed for monomorphic objects - this.has_stree = static_tree && static_tree.length; -} - - -let static_l_desc; -let static_d_desc; -let static_bl_desc; - - -function TreeDesc(dyn_tree, stat_desc) { - this.dyn_tree = dyn_tree; /* the dynamic tree */ - this.max_code = 0; /* largest code with non zero frequency */ - this.stat_desc = stat_desc; /* the corresponding static tree */ -} - - - -const d_code = (dist) => { - - return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)]; -}; - - -/* =========================================================================== - * Output a short LSB first on the stream. - * IN assertion: there is enough room in pendingBuf. - */ -const put_short = (s, w) => { -// put_byte(s, (uch)((w) & 0xff)); -// put_byte(s, (uch)((ush)(w) >> 8)); - s.pending_buf[s.pending++] = (w) & 0xff; - s.pending_buf[s.pending++] = (w >>> 8) & 0xff; -}; - - -/* =========================================================================== - * Send a value on a given number of bits. - * IN assertion: length <= 16 and value fits in length bits. - */ -const send_bits = (s, value, length) => { - - if (s.bi_valid > (Buf_size - length)) { - s.bi_buf |= (value << s.bi_valid) & 0xffff; - put_short(s, s.bi_buf); - s.bi_buf = value >> (Buf_size - s.bi_valid); - s.bi_valid += length - Buf_size; - } else { - s.bi_buf |= (value << s.bi_valid) & 0xffff; - s.bi_valid += length; - } -}; - - -const send_code = (s, c, tree) => { - - send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/); -}; - - -/* =========================================================================== - * Reverse the first len bits of a code, using straightforward code (a faster - * method would use a table) - * IN assertion: 1 <= len <= 15 - */ -const bi_reverse = (code, len) => { - - let res = 0; - do { - res |= code & 1; - code >>>= 1; - res <<= 1; - } while (--len > 0); - return res >>> 1; -}; - - -/* =========================================================================== - * Flush the bit buffer, keeping at most 7 bits in it. - */ -const bi_flush = (s) => { - - if (s.bi_valid === 16) { - put_short(s, s.bi_buf); - s.bi_buf = 0; - s.bi_valid = 0; - - } else if (s.bi_valid >= 8) { - s.pending_buf[s.pending++] = s.bi_buf & 0xff; - s.bi_buf >>= 8; - s.bi_valid -= 8; - } -}; - - -/* =========================================================================== - * Compute the optimal bit lengths for a tree and update the total bit length - * for the current block. - * IN assertion: the fields freq and dad are set, heap[heap_max] and - * above are the tree nodes sorted by increasing frequency. - * OUT assertions: the field len is set to the optimal bit length, the - * array bl_count contains the frequencies for each bit length. - * The length opt_len is updated; static_len is also updated if stree is - * not null. - */ -const gen_bitlen = (s, desc) => { -// deflate_state *s; -// tree_desc *desc; /* the tree descriptor */ - - const tree = desc.dyn_tree; - const max_code = desc.max_code; - const stree = desc.stat_desc.static_tree; - const has_stree = desc.stat_desc.has_stree; - const extra = desc.stat_desc.extra_bits; - const base = desc.stat_desc.extra_base; - const max_length = desc.stat_desc.max_length; - let h; /* heap index */ - let n, m; /* iterate over the tree elements */ - let bits; /* bit length */ - let xbits; /* extra bits */ - let f; /* frequency */ - let overflow = 0; /* number of elements with bit length too large */ - - for (bits = 0; bits <= MAX_BITS$1; bits++) { - s.bl_count[bits] = 0; - } - - /* In a first pass, compute the optimal bit lengths (which may - * overflow in the case of the bit length tree). - */ - tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */ - - for (h = s.heap_max + 1; h < HEAP_SIZE$1; h++) { - n = s.heap[h]; - bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1; - if (bits > max_length) { - bits = max_length; - overflow++; - } - tree[n * 2 + 1]/*.Len*/ = bits; - /* We overwrite tree[n].Dad which is no longer needed */ - - if (n > max_code) { continue; } /* not a leaf node */ - - s.bl_count[bits]++; - xbits = 0; - if (n >= base) { - xbits = extra[n - base]; - } - f = tree[n * 2]/*.Freq*/; - s.opt_len += f * (bits + xbits); - if (has_stree) { - s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits); - } - } - if (overflow === 0) { return; } - - // Tracev((stderr,"\nbit length overflow\n")); - /* This happens for example on obj2 and pic of the Calgary corpus */ - - /* Find the first bit length which could increase: */ - do { - bits = max_length - 1; - while (s.bl_count[bits] === 0) { bits--; } - s.bl_count[bits]--; /* move one leaf down the tree */ - s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */ - s.bl_count[max_length]--; - /* The brother of the overflow item also moves one step up, - * but this does not affect bl_count[max_length] - */ - overflow -= 2; - } while (overflow > 0); - - /* Now recompute all bit lengths, scanning in increasing frequency. - * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all - * lengths instead of fixing only the wrong ones. This idea is taken - * from 'ar' written by Haruhiko Okumura.) - */ - for (bits = max_length; bits !== 0; bits--) { - n = s.bl_count[bits]; - while (n !== 0) { - m = s.heap[--h]; - if (m > max_code) { continue; } - if (tree[m * 2 + 1]/*.Len*/ !== bits) { - // Tracev((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); - s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/; - tree[m * 2 + 1]/*.Len*/ = bits; - } - n--; - } - } -}; - - -/* =========================================================================== - * Generate the codes for a given tree and bit counts (which need not be - * optimal). - * IN assertion: the array bl_count contains the bit length statistics for - * the given tree and the field len is set for all tree elements. - * OUT assertion: the field code is set for all tree elements of non - * zero code length. - */ -const gen_codes = (tree, max_code, bl_count) => { -// ct_data *tree; /* the tree to decorate */ -// int max_code; /* largest code with non zero frequency */ -// ushf *bl_count; /* number of codes at each bit length */ - - const next_code = new Array(MAX_BITS$1 + 1); /* next code value for each bit length */ - let code = 0; /* running code value */ - let bits; /* bit index */ - let n; /* code index */ - - /* The distribution counts are first used to generate the code values - * without bit reversal. - */ - for (bits = 1; bits <= MAX_BITS$1; bits++) { - code = (code + bl_count[bits - 1]) << 1; - next_code[bits] = code; - } - /* Check that the bit counts in bl_count are consistent. The last code - * must be all ones. - */ - //Assert (code + bl_count[MAX_BITS]-1 == (1< { - - let n; /* iterates over tree elements */ - let bits; /* bit counter */ - let length; /* length value */ - let code; /* code value */ - let dist; /* distance index */ - const bl_count = new Array(MAX_BITS$1 + 1); - /* number of codes at each bit length for an optimal tree */ - - // do check in _tr_init() - //if (static_init_done) return; - - /* For some embedded targets, global variables are not initialized: */ -/*#ifdef NO_INIT_GLOBAL_POINTERS - static_l_desc.static_tree = static_ltree; - static_l_desc.extra_bits = extra_lbits; - static_d_desc.static_tree = static_dtree; - static_d_desc.extra_bits = extra_dbits; - static_bl_desc.extra_bits = extra_blbits; -#endif*/ - - /* Initialize the mapping length (0..255) -> length code (0..28) */ - length = 0; - for (code = 0; code < LENGTH_CODES$1 - 1; code++) { - base_length[code] = length; - for (n = 0; n < (1 << extra_lbits[code]); n++) { - _length_code[length++] = code; - } - } - //Assert (length == 256, "tr_static_init: length != 256"); - /* Note that the length 255 (match length 258) can be represented - * in two different ways: code 284 + 5 bits or code 285, so we - * overwrite length_code[255] to use the best encoding: - */ - _length_code[length - 1] = code; - - /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ - dist = 0; - for (code = 0; code < 16; code++) { - base_dist[code] = dist; - for (n = 0; n < (1 << extra_dbits[code]); n++) { - _dist_code[dist++] = code; - } - } - //Assert (dist == 256, "tr_static_init: dist != 256"); - dist >>= 7; /* from now on, all distances are divided by 128 */ - for (; code < D_CODES$1; code++) { - base_dist[code] = dist << 7; - for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) { - _dist_code[256 + dist++] = code; - } - } - //Assert (dist == 256, "tr_static_init: 256+dist != 512"); - - /* Construct the codes of the static literal tree */ - for (bits = 0; bits <= MAX_BITS$1; bits++) { - bl_count[bits] = 0; - } - - n = 0; - while (n <= 143) { - static_ltree[n * 2 + 1]/*.Len*/ = 8; - n++; - bl_count[8]++; - } - while (n <= 255) { - static_ltree[n * 2 + 1]/*.Len*/ = 9; - n++; - bl_count[9]++; - } - while (n <= 279) { - static_ltree[n * 2 + 1]/*.Len*/ = 7; - n++; - bl_count[7]++; - } - while (n <= 287) { - static_ltree[n * 2 + 1]/*.Len*/ = 8; - n++; - bl_count[8]++; - } - /* Codes 286 and 287 do not exist, but we must include them in the - * tree construction to get a canonical Huffman tree (longest code - * all ones) - */ - gen_codes(static_ltree, L_CODES$1 + 1, bl_count); - - /* The static distance tree is trivial: */ - for (n = 0; n < D_CODES$1; n++) { - static_dtree[n * 2 + 1]/*.Len*/ = 5; - static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5); - } - - // Now data ready and we can init static trees - static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS$1 + 1, L_CODES$1, MAX_BITS$1); - static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES$1, MAX_BITS$1); - static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES$1, MAX_BL_BITS); - - //static_init_done = true; -}; - - -/* =========================================================================== - * Initialize a new block. - */ -const init_block = (s) => { - - let n; /* iterates over tree elements */ - - /* Initialize the trees. */ - for (n = 0; n < L_CODES$1; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; } - for (n = 0; n < D_CODES$1; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; } - for (n = 0; n < BL_CODES$1; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; } - - s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1; - s.opt_len = s.static_len = 0; - s.sym_next = s.matches = 0; -}; - - -/* =========================================================================== - * Flush the bit buffer and align the output on a byte boundary - */ -const bi_windup = (s) => -{ - if (s.bi_valid > 8) { - put_short(s, s.bi_buf); - } else if (s.bi_valid > 0) { - //put_byte(s, (Byte)s->bi_buf); - s.pending_buf[s.pending++] = s.bi_buf; - } - s.bi_buf = 0; - s.bi_valid = 0; -}; - -/* =========================================================================== - * Compares to subtrees, using the tree depth as tie breaker when - * the subtrees have equal frequency. This minimizes the worst case length. - */ -const smaller = (tree, n, m, depth) => { - - const _n2 = n * 2; - const _m2 = m * 2; - return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ || - (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m])); -}; - -/* =========================================================================== - * Restore the heap property by moving down the tree starting at node k, - * exchanging a node with the smallest of its two sons if necessary, stopping - * when the heap property is re-established (each father smaller than its - * two sons). - */ -const pqdownheap = (s, tree, k) => { -// deflate_state *s; -// ct_data *tree; /* the tree to restore */ -// int k; /* node to move down */ - - const v = s.heap[k]; - let j = k << 1; /* left son of k */ - while (j <= s.heap_len) { - /* Set j to the smallest of the two sons: */ - if (j < s.heap_len && - smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) { - j++; - } - /* Exit if v is smaller than both sons */ - if (smaller(tree, v, s.heap[j], s.depth)) { break; } - - /* Exchange v with the smallest son */ - s.heap[k] = s.heap[j]; - k = j; - - /* And continue down the tree, setting j to the left son of k */ - j <<= 1; - } - s.heap[k] = v; -}; - - -// inlined manually -// const SMALLEST = 1; - -/* =========================================================================== - * Send the block data compressed using the given Huffman trees - */ -const compress_block = (s, ltree, dtree) => { -// deflate_state *s; -// const ct_data *ltree; /* literal tree */ -// const ct_data *dtree; /* distance tree */ - - let dist; /* distance of matched string */ - let lc; /* match length or unmatched char (if dist == 0) */ - let sx = 0; /* running index in sym_buf */ - let code; /* the code to send */ - let extra; /* number of extra bits to send */ - - if (s.sym_next !== 0) { - do { - dist = s.pending_buf[s.sym_buf + sx++] & 0xff; - dist += (s.pending_buf[s.sym_buf + sx++] & 0xff) << 8; - lc = s.pending_buf[s.sym_buf + sx++]; - if (dist === 0) { - send_code(s, lc, ltree); /* send a literal byte */ - //Tracecv(isgraph(lc), (stderr," '%c' ", lc)); - } else { - /* Here, lc is the match length - MIN_MATCH */ - code = _length_code[lc]; - send_code(s, code + LITERALS$1 + 1, ltree); /* send the length code */ - extra = extra_lbits[code]; - if (extra !== 0) { - lc -= base_length[code]; - send_bits(s, lc, extra); /* send the extra length bits */ - } - dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - //Assert (code < D_CODES, "bad d_code"); - - send_code(s, code, dtree); /* send the distance code */ - extra = extra_dbits[code]; - if (extra !== 0) { - dist -= base_dist[code]; - send_bits(s, dist, extra); /* send the extra distance bits */ - } - } /* literal or match pair ? */ - - /* Check that the overlay between pending_buf and sym_buf is ok: */ - //Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow"); - - } while (sx < s.sym_next); - } - - send_code(s, END_BLOCK, ltree); -}; - - -/* =========================================================================== - * Construct one Huffman tree and assigns the code bit strings and lengths. - * Update the total bit length for the current block. - * IN assertion: the field freq is set for all tree elements. - * OUT assertions: the fields len and code are set to the optimal bit length - * and corresponding code. The length opt_len is updated; static_len is - * also updated if stree is not null. The field max_code is set. - */ -const build_tree = (s, desc) => { -// deflate_state *s; -// tree_desc *desc; /* the tree descriptor */ - - const tree = desc.dyn_tree; - const stree = desc.stat_desc.static_tree; - const has_stree = desc.stat_desc.has_stree; - const elems = desc.stat_desc.elems; - let n, m; /* iterate over heap elements */ - let max_code = -1; /* largest code with non zero frequency */ - let node; /* new node being created */ - - /* Construct the initial heap, with least frequent element in - * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. - * heap[0] is not used. - */ - s.heap_len = 0; - s.heap_max = HEAP_SIZE$1; - - for (n = 0; n < elems; n++) { - if (tree[n * 2]/*.Freq*/ !== 0) { - s.heap[++s.heap_len] = max_code = n; - s.depth[n] = 0; - - } else { - tree[n * 2 + 1]/*.Len*/ = 0; - } - } - - /* The pkzip format requires that at least one distance code exists, - * and that at least one bit should be sent even if there is only one - * possible code. So to avoid special checks later on we force at least - * two codes of non zero frequency. - */ - while (s.heap_len < 2) { - node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0); - tree[node * 2]/*.Freq*/ = 1; - s.depth[node] = 0; - s.opt_len--; - - if (has_stree) { - s.static_len -= stree[node * 2 + 1]/*.Len*/; - } - /* node is 0 or 1 so it does not have extra bits */ - } - desc.max_code = max_code; - - /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, - * establish sub-heaps of increasing lengths: - */ - for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); } - - /* Construct the Huffman tree by repeatedly combining the least two - * frequent nodes. - */ - node = elems; /* next internal node of the tree */ - do { - //pqremove(s, tree, n); /* n = node of least frequency */ - /*** pqremove ***/ - n = s.heap[1/*SMALLEST*/]; - s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--]; - pqdownheap(s, tree, 1/*SMALLEST*/); - /***/ - - m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */ - - s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */ - s.heap[--s.heap_max] = m; - - /* Create a new node father of n and m */ - tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/; - s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1; - tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node; - - /* and insert the new node in the heap */ - s.heap[1/*SMALLEST*/] = node++; - pqdownheap(s, tree, 1/*SMALLEST*/); - - } while (s.heap_len >= 2); - - s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/]; - - /* At this point, the fields freq and dad are set. We can now - * generate the bit lengths. - */ - gen_bitlen(s, desc); - - /* The field len is now set, we can generate the bit codes */ - gen_codes(tree, max_code, s.bl_count); -}; - - -/* =========================================================================== - * Scan a literal or distance tree to determine the frequencies of the codes - * in the bit length tree. - */ -const scan_tree = (s, tree, max_code) => { -// deflate_state *s; -// ct_data *tree; /* the tree to be scanned */ -// int max_code; /* and its largest code of non zero frequency */ - - let n; /* iterates over all tree elements */ - let prevlen = -1; /* last emitted length */ - let curlen; /* length of current code */ - - let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ - - let count = 0; /* repeat count of the current code */ - let max_count = 7; /* max repeat count */ - let min_count = 4; /* min repeat count */ - - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } - tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */ - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; - - if (++count < max_count && curlen === nextlen) { - continue; - - } else if (count < min_count) { - s.bl_tree[curlen * 2]/*.Freq*/ += count; - - } else if (curlen !== 0) { - - if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; } - s.bl_tree[REP_3_6 * 2]/*.Freq*/++; - - } else if (count <= 10) { - s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++; - - } else { - s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++; - } - - count = 0; - prevlen = curlen; - - if (nextlen === 0) { - max_count = 138; - min_count = 3; - - } else if (curlen === nextlen) { - max_count = 6; - min_count = 3; - - } else { - max_count = 7; - min_count = 4; - } - } -}; - - -/* =========================================================================== - * Send a literal or distance tree in compressed form, using the codes in - * bl_tree. - */ -const send_tree = (s, tree, max_code) => { -// deflate_state *s; -// ct_data *tree; /* the tree to be scanned */ -// int max_code; /* and its largest code of non zero frequency */ - - let n; /* iterates over all tree elements */ - let prevlen = -1; /* last emitted length */ - let curlen; /* length of current code */ - - let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ - - let count = 0; /* repeat count of the current code */ - let max_count = 7; /* max repeat count */ - let min_count = 4; /* min repeat count */ - - /* tree[max_code+1].Len = -1; */ /* guard already set */ - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; - - if (++count < max_count && curlen === nextlen) { - continue; - - } else if (count < min_count) { - do { send_code(s, curlen, s.bl_tree); } while (--count !== 0); - - } else if (curlen !== 0) { - if (curlen !== prevlen) { - send_code(s, curlen, s.bl_tree); - count--; - } - //Assert(count >= 3 && count <= 6, " 3_6?"); - send_code(s, REP_3_6, s.bl_tree); - send_bits(s, count - 3, 2); - - } else if (count <= 10) { - send_code(s, REPZ_3_10, s.bl_tree); - send_bits(s, count - 3, 3); - - } else { - send_code(s, REPZ_11_138, s.bl_tree); - send_bits(s, count - 11, 7); - } - - count = 0; - prevlen = curlen; - if (nextlen === 0) { - max_count = 138; - min_count = 3; - - } else if (curlen === nextlen) { - max_count = 6; - min_count = 3; - - } else { - max_count = 7; - min_count = 4; - } - } -}; - - -/* =========================================================================== - * Construct the Huffman tree for the bit lengths and return the index in - * bl_order of the last bit length code to send. - */ -const build_bl_tree = (s) => { - - let max_blindex; /* index of last bit length code of non zero freq */ - - /* Determine the bit length frequencies for literal and distance trees */ - scan_tree(s, s.dyn_ltree, s.l_desc.max_code); - scan_tree(s, s.dyn_dtree, s.d_desc.max_code); - - /* Build the bit length tree: */ - build_tree(s, s.bl_desc); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - */ - - /* Determine the number of bit length codes to send. The pkzip format - * requires that at least 4 bit length codes be sent. (appnote.txt says - * 3 but the actual value used is 4.) - */ - for (max_blindex = BL_CODES$1 - 1; max_blindex >= 3; max_blindex--) { - if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) { - break; - } - } - /* Update opt_len to include the bit length tree and counts */ - s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; - //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", - // s->opt_len, s->static_len)); - - return max_blindex; -}; - - -/* =========================================================================== - * Send the header for a block using dynamic Huffman trees: the counts, the - * lengths of the bit length codes, the literal tree and the distance tree. - * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. - */ -const send_all_trees = (s, lcodes, dcodes, blcodes) => { -// deflate_state *s; -// int lcodes, dcodes, blcodes; /* number of codes for each tree */ - - let rank; /* index in bl_order */ - - //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); - //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, - // "too many codes"); - //Tracev((stderr, "\nbl counts: ")); - send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ - send_bits(s, dcodes - 1, 5); - send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ - for (rank = 0; rank < blcodes; rank++) { - //Tracev((stderr, "\nbl code %2d ", bl_order[rank])); - send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3); - } - //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); - - send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */ - //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); - - send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */ - //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); -}; - - -/* =========================================================================== - * Check if the data type is TEXT or BINARY, using the following algorithm: - * - TEXT if the two conditions below are satisfied: - * a) There are no non-portable control characters belonging to the - * "block list" (0..6, 14..25, 28..31). - * b) There is at least one printable character belonging to the - * "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). - * - BINARY otherwise. - * - The following partially-portable control characters form a - * "gray list" that is ignored in this detection algorithm: - * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). - * IN assertion: the fields Freq of dyn_ltree are set. - */ -const detect_data_type = (s) => { - /* block_mask is the bit mask of block-listed bytes - * set bits 0..6, 14..25, and 28..31 - * 0xf3ffc07f = binary 11110011111111111100000001111111 - */ - let block_mask = 0xf3ffc07f; - let n; - - /* Check for non-textual ("block-listed") bytes. */ - for (n = 0; n <= 31; n++, block_mask >>>= 1) { - if ((block_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) { - return Z_BINARY; - } - } - - /* Check for textual ("allow-listed") bytes. */ - if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 || - s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) { - return Z_TEXT; - } - for (n = 32; n < LITERALS$1; n++) { - if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) { - return Z_TEXT; - } - } - - /* There are no "block-listed" or "allow-listed" bytes: - * this stream either is empty or has tolerated ("gray-listed") bytes only. - */ - return Z_BINARY; -}; - - -let static_init_done = false; - -/* =========================================================================== - * Initialize the tree data structures for a new zlib stream. - */ -const _tr_init$1 = (s) => -{ - - if (!static_init_done) { - tr_static_init(); - static_init_done = true; - } - - s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc); - s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc); - s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc); - - s.bi_buf = 0; - s.bi_valid = 0; - - /* Initialize the first block of the first file: */ - init_block(s); -}; - - -/* =========================================================================== - * Send a stored block - */ -const _tr_stored_block$1 = (s, buf, stored_len, last) => { -//DeflateState *s; -//charf *buf; /* input block */ -//ulg stored_len; /* length of input block */ -//int last; /* one if this is the last block for a file */ - - send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */ - bi_windup(s); /* align on byte boundary */ - put_short(s, stored_len); - put_short(s, ~stored_len); - if (stored_len) { - s.pending_buf.set(s.window.subarray(buf, buf + stored_len), s.pending); - } - s.pending += stored_len; -}; - - -/* =========================================================================== - * Send one empty static block to give enough lookahead for inflate. - * This takes 10 bits, of which 7 may remain in the bit buffer. - */ -const _tr_align$1 = (s) => { - send_bits(s, STATIC_TREES << 1, 3); - send_code(s, END_BLOCK, static_ltree); - bi_flush(s); -}; - - -/* =========================================================================== - * Determine the best encoding for the current block: dynamic trees, static - * trees or store, and write out the encoded block. - */ -const _tr_flush_block$1 = (s, buf, stored_len, last) => { -//DeflateState *s; -//charf *buf; /* input block, or NULL if too old */ -//ulg stored_len; /* length of input block */ -//int last; /* one if this is the last block for a file */ - - let opt_lenb, static_lenb; /* opt_len and static_len in bytes */ - let max_blindex = 0; /* index of last bit length code of non zero freq */ - - /* Build the Huffman trees unless a stored block is forced */ - if (s.level > 0) { - - /* Check if the file is binary or text */ - if (s.strm.data_type === Z_UNKNOWN$1) { - s.strm.data_type = detect_data_type(s); - } - - /* Construct the literal and distance trees */ - build_tree(s, s.l_desc); - // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, - // s->static_len)); - - build_tree(s, s.d_desc); - // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, - // s->static_len)); - /* At this point, opt_len and static_len are the total bit lengths of - * the compressed block data, excluding the tree representations. - */ - - /* Build the bit length tree for the above two trees, and get the index - * in bl_order of the last bit length code to send. - */ - max_blindex = build_bl_tree(s); - - /* Determine the best encoding. Compute the block lengths in bytes. */ - opt_lenb = (s.opt_len + 3 + 7) >>> 3; - static_lenb = (s.static_len + 3 + 7) >>> 3; - - // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", - // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, - // s->sym_next / 3)); - - if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; } - - } else { - // Assert(buf != (char*)0, "lost buf"); - opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ - } - - if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) { - /* 4: two words for the lengths */ - - /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - * Otherwise we can't have processed more than WSIZE input bytes since - * the last block flush, because compression would have been - * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to - * transform a block into a stored block. - */ - _tr_stored_block$1(s, buf, stored_len, last); - - } else if (s.strategy === Z_FIXED$1 || static_lenb === opt_lenb) { - - send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3); - compress_block(s, static_ltree, static_dtree); - - } else { - send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3); - send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1); - compress_block(s, s.dyn_ltree, s.dyn_dtree); - } - // Assert (s->compressed_len == s->bits_sent, "bad compressed size"); - /* The above check is made mod 2^32, for files larger than 512 MB - * and uLong implemented on 32 bits. - */ - init_block(s); - - if (last) { - bi_windup(s); - } - // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, - // s->compressed_len-7*last)); -}; - -/* =========================================================================== - * Save the match info and tally the frequency counts. Return true if - * the current block must be flushed. - */ -const _tr_tally$1 = (s, dist, lc) => { -// deflate_state *s; -// unsigned dist; /* distance of matched string */ -// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ - - s.pending_buf[s.sym_buf + s.sym_next++] = dist; - s.pending_buf[s.sym_buf + s.sym_next++] = dist >> 8; - s.pending_buf[s.sym_buf + s.sym_next++] = lc; - if (dist === 0) { - /* lc is the unmatched char */ - s.dyn_ltree[lc * 2]/*.Freq*/++; - } else { - s.matches++; - /* Here, lc is the match length - MIN_MATCH */ - dist--; /* dist = match distance - 1 */ - //Assert((ush)dist < (ush)MAX_DIST(s) && - // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && - // (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); - - s.dyn_ltree[(_length_code[lc] + LITERALS$1 + 1) * 2]/*.Freq*/++; - s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++; - } - - return (s.sym_next === s.sym_end); -}; - -var _tr_init_1 = _tr_init$1; -var _tr_stored_block_1 = _tr_stored_block$1; -var _tr_flush_block_1 = _tr_flush_block$1; -var _tr_tally_1 = _tr_tally$1; -var _tr_align_1 = _tr_align$1; - -var trees = { - _tr_init: _tr_init_1, - _tr_stored_block: _tr_stored_block_1, - _tr_flush_block: _tr_flush_block_1, - _tr_tally: _tr_tally_1, - _tr_align: _tr_align_1 -}; - -// Note: adler32 takes 12% for level 0 and 2% for level 6. -// It isn't worth it to make additional optimizations as in original. -// Small size is preferable. - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -const adler32 = (adler, buf, len, pos) => { - let s1 = (adler & 0xffff) |0, - s2 = ((adler >>> 16) & 0xffff) |0, - n = 0; - - while (len !== 0) { - // Set limit ~ twice less than 5552, to keep - // s2 in 31-bits, because we force signed ints. - // in other case %= will fail. - n = len > 2000 ? 2000 : len; - len -= n; - - do { - s1 = (s1 + buf[pos++]) |0; - s2 = (s2 + s1) |0; - } while (--n); - - s1 %= 65521; - s2 %= 65521; - } - - return (s1 | (s2 << 16)) |0; -}; - - -var adler32_1 = adler32; - -// Note: we can't get significant speed boost here. -// So write code to minimize size - no pregenerated tables -// and array tools dependencies. - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -// Use ordinary array, since untyped makes no boost here -const makeTable = () => { - let c, table = []; - - for (var n = 0; n < 256; n++) { - c = n; - for (var k = 0; k < 8; k++) { - c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); - } - table[n] = c; - } - - return table; -}; - -// Create table on load. Just 255 signed longs. Not a problem. -const crcTable = new Uint32Array(makeTable()); - - -const crc32 = (crc, buf, len, pos) => { - const t = crcTable; - const end = pos + len; - - crc ^= -1; - - for (let i = pos; i < end; i++) { - crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF]; - } - - return (crc ^ (-1)); // >>> 0; -}; - - -var crc32_1 = crc32; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -var messages = { - 2: 'need dictionary', /* Z_NEED_DICT 2 */ - 1: 'stream end', /* Z_STREAM_END 1 */ - 0: '', /* Z_OK 0 */ - '-1': 'file error', /* Z_ERRNO (-1) */ - '-2': 'stream error', /* Z_STREAM_ERROR (-2) */ - '-3': 'data error', /* Z_DATA_ERROR (-3) */ - '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */ - '-5': 'buffer error', /* Z_BUF_ERROR (-5) */ - '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ -}; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -var constants$2 = { - - /* Allowed flush values; see deflate() and inflate() below for details */ - Z_NO_FLUSH: 0, - Z_PARTIAL_FLUSH: 1, - Z_SYNC_FLUSH: 2, - Z_FULL_FLUSH: 3, - Z_FINISH: 4, - Z_BLOCK: 5, - Z_TREES: 6, - - /* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ - Z_OK: 0, - Z_STREAM_END: 1, - Z_NEED_DICT: 2, - Z_ERRNO: -1, - Z_STREAM_ERROR: -2, - Z_DATA_ERROR: -3, - Z_MEM_ERROR: -4, - Z_BUF_ERROR: -5, - //Z_VERSION_ERROR: -6, - - /* compression levels */ - Z_NO_COMPRESSION: 0, - Z_BEST_SPEED: 1, - Z_BEST_COMPRESSION: 9, - Z_DEFAULT_COMPRESSION: -1, - - - Z_FILTERED: 1, - Z_HUFFMAN_ONLY: 2, - Z_RLE: 3, - Z_FIXED: 4, - Z_DEFAULT_STRATEGY: 0, - - /* Possible values of the data_type field (though see inflate()) */ - Z_BINARY: 0, - Z_TEXT: 1, - //Z_ASCII: 1, // = Z_TEXT (deprecated) - Z_UNKNOWN: 2, - - /* The deflate compression method */ - Z_DEFLATED: 8 - //Z_NULL: null // Use -1 or null inline, depending on var type -}; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -const { _tr_init, _tr_stored_block, _tr_flush_block, _tr_tally, _tr_align } = trees; - - - - -/* Public constants ==========================================================*/ -/* ===========================================================================*/ - -const { - Z_NO_FLUSH: Z_NO_FLUSH$2, Z_PARTIAL_FLUSH, Z_FULL_FLUSH: Z_FULL_FLUSH$1, Z_FINISH: Z_FINISH$3, Z_BLOCK: Z_BLOCK$1, - Z_OK: Z_OK$3, Z_STREAM_END: Z_STREAM_END$3, Z_STREAM_ERROR: Z_STREAM_ERROR$2, Z_DATA_ERROR: Z_DATA_ERROR$2, Z_BUF_ERROR: Z_BUF_ERROR$1, - Z_DEFAULT_COMPRESSION: Z_DEFAULT_COMPRESSION$1, - Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE, Z_FIXED, Z_DEFAULT_STRATEGY: Z_DEFAULT_STRATEGY$1, - Z_UNKNOWN, - Z_DEFLATED: Z_DEFLATED$2 -} = constants$2; - -/*============================================================================*/ - - -const MAX_MEM_LEVEL = 9; -/* Maximum value for memLevel in deflateInit2 */ -const MAX_WBITS$1 = 15; -/* 32K LZ77 window */ -const DEF_MEM_LEVEL = 8; - - -const LENGTH_CODES = 29; -/* number of length codes, not counting the special END_BLOCK code */ -const LITERALS = 256; -/* number of literal bytes 0..255 */ -const L_CODES = LITERALS + 1 + LENGTH_CODES; -/* number of Literal or Length codes, including the END_BLOCK code */ -const D_CODES = 30; -/* number of distance codes */ -const BL_CODES = 19; -/* number of codes used to transfer the bit lengths */ -const HEAP_SIZE = 2 * L_CODES + 1; -/* maximum heap size */ -const MAX_BITS = 15; -/* All codes must not exceed MAX_BITS bits */ - -const MIN_MATCH = 3; -const MAX_MATCH = 258; -const MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1); - -const PRESET_DICT = 0x20; - -const INIT_STATE = 42; /* zlib header -> BUSY_STATE */ -//#ifdef GZIP -const GZIP_STATE = 57; /* gzip header -> BUSY_STATE | EXTRA_STATE */ -//#endif -const EXTRA_STATE = 69; /* gzip extra block -> NAME_STATE */ -const NAME_STATE = 73; /* gzip file name -> COMMENT_STATE */ -const COMMENT_STATE = 91; /* gzip comment -> HCRC_STATE */ -const HCRC_STATE = 103; /* gzip header CRC -> BUSY_STATE */ -const BUSY_STATE = 113; /* deflate -> FINISH_STATE */ -const FINISH_STATE = 666; /* stream complete */ - -const BS_NEED_MORE = 1; /* block not completed, need more input or more output */ -const BS_BLOCK_DONE = 2; /* block flush performed */ -const BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */ -const BS_FINISH_DONE = 4; /* finish done, accept no more input or output */ - -const OS_CODE = 0x03; // Unix :) . Don't detect, use this default. - -const err = (strm, errorCode) => { - strm.msg = messages[errorCode]; - return errorCode; -}; - -const rank = (f) => { - return ((f) * 2) - ((f) > 4 ? 9 : 0); -}; - -const zero = (buf) => { - let len = buf.length; while (--len >= 0) { buf[len] = 0; } -}; - -/* =========================================================================== - * Slide the hash table when sliding the window down (could be avoided with 32 - * bit values at the expense of memory usage). We slide even when level == 0 to - * keep the hash table consistent if we switch back to level > 0 later. - */ -const slide_hash = (s) => { - let n, m; - let p; - let wsize = s.w_size; - - n = s.hash_size; - p = n; - do { - m = s.head[--p]; - s.head[p] = (m >= wsize ? m - wsize : 0); - } while (--n); - n = wsize; -//#ifndef FASTEST - p = n; - do { - m = s.prev[--p]; - s.prev[p] = (m >= wsize ? m - wsize : 0); - /* If n is not on any hash chain, prev[n] is garbage but - * its value will never be used. - */ - } while (--n); -//#endif -}; - -/* eslint-disable new-cap */ -let HASH_ZLIB = (s, prev, data) => ((prev << s.hash_shift) ^ data) & s.hash_mask; -// This hash causes less collisions, https://github.com/nodeca/pako/issues/135 -// But breaks binary compatibility -//let HASH_FAST = (s, prev, data) => ((prev << 8) + (prev >> 8) + (data << 4)) & s.hash_mask; -let HASH = HASH_ZLIB; - - -/* ========================================================================= - * Flush as much pending output as possible. All deflate() output, except for - * some deflate_stored() output, goes through this function so some - * applications may wish to modify it to avoid allocating a large - * strm->next_out buffer and copying into it. (See also read_buf()). - */ -const flush_pending = (strm) => { - const s = strm.state; - - //_tr_flush_bits(s); - let len = s.pending; - if (len > strm.avail_out) { - len = strm.avail_out; - } - if (len === 0) { return; } - - strm.output.set(s.pending_buf.subarray(s.pending_out, s.pending_out + len), strm.next_out); - strm.next_out += len; - s.pending_out += len; - strm.total_out += len; - strm.avail_out -= len; - s.pending -= len; - if (s.pending === 0) { - s.pending_out = 0; - } -}; - - -const flush_block_only = (s, last) => { - _tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last); - s.block_start = s.strstart; - flush_pending(s.strm); -}; - - -const put_byte = (s, b) => { - s.pending_buf[s.pending++] = b; -}; - - -/* ========================================================================= - * Put a short in the pending buffer. The 16-bit value is put in MSB order. - * IN assertion: the stream state is correct and there is enough room in - * pending_buf. - */ -const putShortMSB = (s, b) => { - - // put_byte(s, (Byte)(b >> 8)); -// put_byte(s, (Byte)(b & 0xff)); - s.pending_buf[s.pending++] = (b >>> 8) & 0xff; - s.pending_buf[s.pending++] = b & 0xff; -}; - - -/* =========================================================================== - * Read a new buffer from the current input stream, update the adler32 - * and total number of bytes read. All deflate() input goes through - * this function so some applications may wish to modify it to avoid - * allocating a large strm->input buffer and copying from it. - * (See also flush_pending()). - */ -const read_buf = (strm, buf, start, size) => { - - let len = strm.avail_in; - - if (len > size) { len = size; } - if (len === 0) { return 0; } - - strm.avail_in -= len; - - // zmemcpy(buf, strm->next_in, len); - buf.set(strm.input.subarray(strm.next_in, strm.next_in + len), start); - if (strm.state.wrap === 1) { - strm.adler = adler32_1(strm.adler, buf, len, start); - } - - else if (strm.state.wrap === 2) { - strm.adler = crc32_1(strm.adler, buf, len, start); - } - - strm.next_in += len; - strm.total_in += len; - - return len; -}; - - -/* =========================================================================== - * Set match_start to the longest match starting at the given string and - * return its length. Matches shorter or equal to prev_length are discarded, - * in which case the result is equal to prev_length and match_start is - * garbage. - * IN assertions: cur_match is the head of the hash chain for the current - * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 - * OUT assertion: the match length is not greater than s->lookahead. - */ -const longest_match = (s, cur_match) => { - - let chain_length = s.max_chain_length; /* max hash chain length */ - let scan = s.strstart; /* current string */ - let match; /* matched string */ - let len; /* length of current match */ - let best_len = s.prev_length; /* best match length so far */ - let nice_match = s.nice_match; /* stop if match long enough */ - const limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ? - s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/; - - const _win = s.window; // shortcut - - const wmask = s.w_mask; - const prev = s.prev; - - /* Stop when cur_match becomes <= limit. To simplify the code, - * we prevent matches with the string of window index 0. - */ - - const strend = s.strstart + MAX_MATCH; - let scan_end1 = _win[scan + best_len - 1]; - let scan_end = _win[scan + best_len]; - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - /* Do not waste too much time if we already have a good match: */ - if (s.prev_length >= s.good_match) { - chain_length >>= 2; - } - /* Do not look for matches beyond the end of the input. This is necessary - * to make deflate deterministic. - */ - if (nice_match > s.lookahead) { nice_match = s.lookahead; } - - // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); - - do { - // Assert(cur_match < s->strstart, "no future"); - match = cur_match; - - /* Skip to next match if the match length cannot increase - * or if the match length is less than 2. Note that the checks below - * for insufficient lookahead only occur occasionally for performance - * reasons. Therefore uninitialized memory will be accessed, and - * conditional jumps will be made that depend on those values. - * However the length of the match is limited to the lookahead, so - * the output of deflate is not affected by the uninitialized values. - */ - - if (_win[match + best_len] !== scan_end || - _win[match + best_len - 1] !== scan_end1 || - _win[match] !== _win[scan] || - _win[++match] !== _win[scan + 1]) { - continue; - } - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2; - match++; - // Assert(*scan == *match, "match[2]?"); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - /*jshint noempty:false*/ - } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && - _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && - _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && - _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && - scan < strend); - - // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - - len = MAX_MATCH - (strend - scan); - scan = strend - MAX_MATCH; - - if (len > best_len) { - s.match_start = cur_match; - best_len = len; - if (len >= nice_match) { - break; - } - scan_end1 = _win[scan + best_len - 1]; - scan_end = _win[scan + best_len]; - } - } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0); - - if (best_len <= s.lookahead) { - return best_len; - } - return s.lookahead; -}; - - -/* =========================================================================== - * Fill the window when the lookahead becomes insufficient. - * Updates strstart and lookahead. - * - * IN assertion: lookahead < MIN_LOOKAHEAD - * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD - * At least one byte has been read, or avail_in == 0; reads are - * performed for at least two bytes (required for the zip translate_eol - * option -- not supported here). - */ -const fill_window = (s) => { - - const _w_size = s.w_size; - let n, more, str; - - //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); - - do { - more = s.window_size - s.lookahead - s.strstart; - - // JS ints have 32 bit, block below not needed - /* Deal with !@#$% 64K limit: */ - //if (sizeof(int) <= 2) { - // if (more == 0 && s->strstart == 0 && s->lookahead == 0) { - // more = wsize; - // - // } else if (more == (unsigned)(-1)) { - // /* Very unlikely, but possible on 16 bit machine if - // * strstart == 0 && lookahead == 1 (input done a byte at time) - // */ - // more--; - // } - //} - - - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) { - - s.window.set(s.window.subarray(_w_size, _w_size + _w_size - more), 0); - s.match_start -= _w_size; - s.strstart -= _w_size; - /* we now have strstart >= MAX_DIST */ - s.block_start -= _w_size; - if (s.insert > s.strstart) { - s.insert = s.strstart; - } - slide_hash(s); - more += _w_size; - } - if (s.strm.avail_in === 0) { - break; - } - - /* If there was no sliding: - * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - * more == window_size - lookahead - strstart - * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - * => more >= window_size - 2*WSIZE + 2 - * In the BIG_MEM or MMAP case (not yet supported), - * window_size == input_size + MIN_LOOKAHEAD && - * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - * Otherwise, window_size == 2*WSIZE so more >= 2. - * If there was sliding, more >= WSIZE. So in all cases, more >= 2. - */ - //Assert(more >= 2, "more < 2"); - n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more); - s.lookahead += n; - - /* Initialize the hash value now that we have some input: */ - if (s.lookahead + s.insert >= MIN_MATCH) { - str = s.strstart - s.insert; - s.ins_h = s.window[str]; - - /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */ - s.ins_h = HASH(s, s.ins_h, s.window[str + 1]); -//#if MIN_MATCH != 3 -// Call update_hash() MIN_MATCH-3 more times -//#endif - while (s.insert) { - /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ - s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]); - - s.prev[str & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = str; - str++; - s.insert--; - if (s.lookahead + s.insert < MIN_MATCH) { - break; - } - } - } - /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - * but this is not important since only literal bytes will be emitted. - */ - - } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0); - - /* If the WIN_INIT bytes after the end of the current data have never been - * written, then zero those bytes in order to avoid memory check reports of - * the use of uninitialized (or uninitialised as Julian writes) bytes by - * the longest match routines. Update the high water mark for the next - * time through here. WIN_INIT is set to MAX_MATCH since the longest match - * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. - */ -// if (s.high_water < s.window_size) { -// const curr = s.strstart + s.lookahead; -// let init = 0; -// -// if (s.high_water < curr) { -// /* Previous high water mark below current data -- zero WIN_INIT -// * bytes or up to end of window, whichever is less. -// */ -// init = s.window_size - curr; -// if (init > WIN_INIT) -// init = WIN_INIT; -// zmemzero(s->window + curr, (unsigned)init); -// s->high_water = curr + init; -// } -// else if (s->high_water < (ulg)curr + WIN_INIT) { -// /* High water mark at or above current data, but below current data -// * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up -// * to end of window, whichever is less. -// */ -// init = (ulg)curr + WIN_INIT - s->high_water; -// if (init > s->window_size - s->high_water) -// init = s->window_size - s->high_water; -// zmemzero(s->window + s->high_water, (unsigned)init); -// s->high_water += init; -// } -// } -// -// Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, -// "not enough room for search"); -}; - -/* =========================================================================== - * Copy without compression as much as possible from the input stream, return - * the current block state. - * - * In case deflateParams() is used to later switch to a non-zero compression - * level, s->matches (otherwise unused when storing) keeps track of the number - * of hash table slides to perform. If s->matches is 1, then one hash table - * slide will be done when switching. If s->matches is 2, the maximum value - * allowed here, then the hash table will be cleared, since two or more slides - * is the same as a clear. - * - * deflate_stored() is written to minimize the number of times an input byte is - * copied. It is most efficient with large input and output buffers, which - * maximizes the opportunites to have a single copy from next_in to next_out. - */ -const deflate_stored = (s, flush) => { - - /* Smallest worthy block size when not flushing or finishing. By default - * this is 32K. This can be as small as 507 bytes for memLevel == 1. For - * large input and output buffers, the stored block size will be larger. - */ - let min_block = s.pending_buf_size - 5 > s.w_size ? s.w_size : s.pending_buf_size - 5; - - /* Copy as many min_block or larger stored blocks directly to next_out as - * possible. If flushing, copy the remaining available input to next_out as - * stored blocks, if there is enough space. - */ - let len, left, have, last = 0; - let used = s.strm.avail_in; - do { - /* Set len to the maximum size block that we can copy directly with the - * available input data and output space. Set left to how much of that - * would be copied from what's left in the window. - */ - len = 65535/* MAX_STORED */; /* maximum deflate stored block length */ - have = (s.bi_valid + 42) >> 3; /* number of header bytes */ - if (s.strm.avail_out < have) { /* need room for header */ - break; - } - /* maximum stored block length that will fit in avail_out: */ - have = s.strm.avail_out - have; - left = s.strstart - s.block_start; /* bytes left in window */ - if (len > left + s.strm.avail_in) { - len = left + s.strm.avail_in; /* limit len to the input */ - } - if (len > have) { - len = have; /* limit len to the output */ - } - - /* If the stored block would be less than min_block in length, or if - * unable to copy all of the available input when flushing, then try - * copying to the window and the pending buffer instead. Also don't - * write an empty block when flushing -- deflate() does that. - */ - if (len < min_block && ((len === 0 && flush !== Z_FINISH$3) || - flush === Z_NO_FLUSH$2 || - len !== left + s.strm.avail_in)) { - break; - } - - /* Make a dummy stored block in pending to get the header bytes, - * including any pending bits. This also updates the debugging counts. - */ - last = flush === Z_FINISH$3 && len === left + s.strm.avail_in ? 1 : 0; - _tr_stored_block(s, 0, 0, last); - - /* Replace the lengths in the dummy stored block with len. */ - s.pending_buf[s.pending - 4] = len; - s.pending_buf[s.pending - 3] = len >> 8; - s.pending_buf[s.pending - 2] = ~len; - s.pending_buf[s.pending - 1] = ~len >> 8; - - /* Write the stored block header bytes. */ - flush_pending(s.strm); - -//#ifdef ZLIB_DEBUG -// /* Update debugging counts for the data about to be copied. */ -// s->compressed_len += len << 3; -// s->bits_sent += len << 3; -//#endif - - /* Copy uncompressed bytes from the window to next_out. */ - if (left) { - if (left > len) { - left = len; - } - //zmemcpy(s->strm->next_out, s->window + s->block_start, left); - s.strm.output.set(s.window.subarray(s.block_start, s.block_start + left), s.strm.next_out); - s.strm.next_out += left; - s.strm.avail_out -= left; - s.strm.total_out += left; - s.block_start += left; - len -= left; - } - - /* Copy uncompressed bytes directly from next_in to next_out, updating - * the check value. - */ - if (len) { - read_buf(s.strm, s.strm.output, s.strm.next_out, len); - s.strm.next_out += len; - s.strm.avail_out -= len; - s.strm.total_out += len; - } - } while (last === 0); - - /* Update the sliding window with the last s->w_size bytes of the copied - * data, or append all of the copied data to the existing window if less - * than s->w_size bytes were copied. Also update the number of bytes to - * insert in the hash tables, in the event that deflateParams() switches to - * a non-zero compression level. - */ - used -= s.strm.avail_in; /* number of input bytes directly copied */ - if (used) { - /* If any input was used, then no unused input remains in the window, - * therefore s->block_start == s->strstart. - */ - if (used >= s.w_size) { /* supplant the previous history */ - s.matches = 2; /* clear hash */ - //zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size); - s.window.set(s.strm.input.subarray(s.strm.next_in - s.w_size, s.strm.next_in), 0); - s.strstart = s.w_size; - s.insert = s.strstart; - } - else { - if (s.window_size - s.strstart <= used) { - /* Slide the window down. */ - s.strstart -= s.w_size; - //zmemcpy(s->window, s->window + s->w_size, s->strstart); - s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0); - if (s.matches < 2) { - s.matches++; /* add a pending slide_hash() */ - } - if (s.insert > s.strstart) { - s.insert = s.strstart; - } - } - //zmemcpy(s->window + s->strstart, s->strm->next_in - used, used); - s.window.set(s.strm.input.subarray(s.strm.next_in - used, s.strm.next_in), s.strstart); - s.strstart += used; - s.insert += used > s.w_size - s.insert ? s.w_size - s.insert : used; - } - s.block_start = s.strstart; - } - if (s.high_water < s.strstart) { - s.high_water = s.strstart; - } - - /* If the last block was written to next_out, then done. */ - if (last) { - return BS_FINISH_DONE; - } - - /* If flushing and all input has been consumed, then done. */ - if (flush !== Z_NO_FLUSH$2 && flush !== Z_FINISH$3 && - s.strm.avail_in === 0 && s.strstart === s.block_start) { - return BS_BLOCK_DONE; - } - - /* Fill the window with any remaining input. */ - have = s.window_size - s.strstart; - if (s.strm.avail_in > have && s.block_start >= s.w_size) { - /* Slide the window down. */ - s.block_start -= s.w_size; - s.strstart -= s.w_size; - //zmemcpy(s->window, s->window + s->w_size, s->strstart); - s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0); - if (s.matches < 2) { - s.matches++; /* add a pending slide_hash() */ - } - have += s.w_size; /* more space now */ - if (s.insert > s.strstart) { - s.insert = s.strstart; - } - } - if (have > s.strm.avail_in) { - have = s.strm.avail_in; - } - if (have) { - read_buf(s.strm, s.window, s.strstart, have); - s.strstart += have; - s.insert += have > s.w_size - s.insert ? s.w_size - s.insert : have; - } - if (s.high_water < s.strstart) { - s.high_water = s.strstart; - } - - /* There was not enough avail_out to write a complete worthy or flushed - * stored block to next_out. Write a stored block to pending instead, if we - * have enough input for a worthy block, or if flushing and there is enough - * room for the remaining input as a stored block in the pending buffer. - */ - have = (s.bi_valid + 42) >> 3; /* number of header bytes */ - /* maximum stored block length that will fit in pending: */ - have = s.pending_buf_size - have > 65535/* MAX_STORED */ ? 65535/* MAX_STORED */ : s.pending_buf_size - have; - min_block = have > s.w_size ? s.w_size : have; - left = s.strstart - s.block_start; - if (left >= min_block || - ((left || flush === Z_FINISH$3) && flush !== Z_NO_FLUSH$2 && - s.strm.avail_in === 0 && left <= have)) { - len = left > have ? have : left; - last = flush === Z_FINISH$3 && s.strm.avail_in === 0 && - len === left ? 1 : 0; - _tr_stored_block(s, s.block_start, len, last); - s.block_start += len; - flush_pending(s.strm); - } - - /* We've done all we can with the available input and output. */ - return last ? BS_FINISH_STARTED : BS_NEED_MORE; -}; - - -/* =========================================================================== - * Compress as much as possible from the input stream, return the current - * block state. - * This function does not perform lazy evaluation of matches and inserts - * new strings in the dictionary only for unmatched strings or for short - * matches. It is used only for the fast compression options. - */ -const deflate_fast = (s, flush) => { - - let hash_head; /* head of the hash chain */ - let bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s.lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$2) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { - break; /* flush the current block */ - } - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = 0/*NIL*/; - if (s.lookahead >= MIN_MATCH) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]); - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - - /* Find the longest match, discarding those <= prev_length. - * At this point we have always match_length < MIN_MATCH - */ - if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s.match_length = longest_match(s, hash_head); - /* longest_match() sets match_start */ - } - if (s.match_length >= MIN_MATCH) { - // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only - - /*** _tr_tally_dist(s, s.strstart - s.match_start, - s.match_length - MIN_MATCH, bflush); ***/ - bflush = _tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH); - - s.lookahead -= s.match_length; - - /* Insert new strings in the hash table only if the match length - * is not too large. This saves time but degrades compression. - */ - if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) { - s.match_length--; /* string at strstart already in table */ - do { - s.strstart++; - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]); - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - /* strstart never exceeds WSIZE-MAX_MATCH, so there are - * always MIN_MATCH bytes ahead. - */ - } while (--s.match_length !== 0); - s.strstart++; - } else - { - s.strstart += s.match_length; - s.match_length = 0; - s.ins_h = s.window[s.strstart]; - /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + 1]); - -//#if MIN_MATCH != 3 -// Call UPDATE_HASH() MIN_MATCH-3 more times -//#endif - /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not - * matter since it will be recomputed at next deflate call. - */ - } - } else { - /* No match, output a literal byte */ - //Tracevv((stderr,"%c", s.window[s.strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart]); - - s.lookahead--; - s.strstart++; - } - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1); - if (flush === Z_FINISH$3) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.sym_next) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_BLOCK_DONE; -}; - -/* =========================================================================== - * Same as above, but achieves better compression. We use a lazy - * evaluation for matches: a match is finally adopted only if there is - * no better match at the next window position. - */ -const deflate_slow = (s, flush) => { - - let hash_head; /* head of hash chain */ - let bflush; /* set if current block must be flushed */ - - let max_insert; - - /* Process the input block. */ - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s.lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$2) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { break; } /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = 0/*NIL*/; - if (s.lookahead >= MIN_MATCH) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]); - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - - /* Find the longest match, discarding those <= prev_length. - */ - s.prev_length = s.match_length; - s.prev_match = s.match_start; - s.match_length = MIN_MATCH - 1; - - if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match && - s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s.match_length = longest_match(s, hash_head); - /* longest_match() sets match_start */ - - if (s.match_length <= 5 && - (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) { - - /* If prev_match is also MIN_MATCH, match_start is garbage - * but we will ignore the current match anyway. - */ - s.match_length = MIN_MATCH - 1; - } - } - /* If there was a match at the previous step and the current - * match is not better, output the previous match: - */ - if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) { - max_insert = s.strstart + s.lookahead - MIN_MATCH; - /* Do not insert strings in hash table beyond this. */ - - //check_match(s, s.strstart-1, s.prev_match, s.prev_length); - - /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match, - s.prev_length - MIN_MATCH, bflush);***/ - bflush = _tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH); - /* Insert in hash table all strings up to the end of the match. - * strstart-1 and strstart are already inserted. If there is not - * enough lookahead, the last two strings are not inserted in - * the hash table. - */ - s.lookahead -= s.prev_length - 1; - s.prev_length -= 2; - do { - if (++s.strstart <= max_insert) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]); - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - } while (--s.prev_length !== 0); - s.match_available = 0; - s.match_length = MIN_MATCH - 1; - s.strstart++; - - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - - } else if (s.match_available) { - /* If there was no match at the previous position, output a - * single literal. If there was a match but the current match - * is longer, truncate the previous match to a single literal. - */ - //Tracevv((stderr,"%c", s->window[s->strstart-1])); - /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart - 1]); - - if (bflush) { - /*** FLUSH_BLOCK_ONLY(s, 0) ***/ - flush_block_only(s, false); - /***/ - } - s.strstart++; - s.lookahead--; - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - } else { - /* There is no previous match to compare with, wait for - * the next step to decide. - */ - s.match_available = 1; - s.strstart++; - s.lookahead--; - } - } - //Assert (flush != Z_NO_FLUSH, "no flush?"); - if (s.match_available) { - //Tracevv((stderr,"%c", s->window[s->strstart-1])); - /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart - 1]); - - s.match_available = 0; - } - s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1; - if (flush === Z_FINISH$3) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.sym_next) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - - return BS_BLOCK_DONE; -}; - - -/* =========================================================================== - * For Z_RLE, simply look for runs of bytes, generate matches only of distance - * one. Do not maintain a hash table. (It will be regenerated if this run of - * deflate switches away from Z_RLE.) - */ -const deflate_rle = (s, flush) => { - - let bflush; /* set if current block must be flushed */ - let prev; /* byte at distance one to match */ - let scan, strend; /* scan goes up to strend for length of run */ - - const _win = s.window; - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the longest run, plus one for the unrolled loop. - */ - if (s.lookahead <= MAX_MATCH) { - fill_window(s); - if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH$2) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { break; } /* flush the current block */ - } - - /* See how many times the previous byte repeats */ - s.match_length = 0; - if (s.lookahead >= MIN_MATCH && s.strstart > 0) { - scan = s.strstart - 1; - prev = _win[scan]; - if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) { - strend = s.strstart + MAX_MATCH; - do { - /*jshint noempty:false*/ - } while (prev === _win[++scan] && prev === _win[++scan] && - prev === _win[++scan] && prev === _win[++scan] && - prev === _win[++scan] && prev === _win[++scan] && - prev === _win[++scan] && prev === _win[++scan] && - scan < strend); - s.match_length = MAX_MATCH - (strend - scan); - if (s.match_length > s.lookahead) { - s.match_length = s.lookahead; - } - } - //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); - } - - /* Emit match if have run of MIN_MATCH or longer, else emit literal */ - if (s.match_length >= MIN_MATCH) { - //check_match(s, s.strstart, s.strstart - 1, s.match_length); - - /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/ - bflush = _tr_tally(s, 1, s.match_length - MIN_MATCH); - - s.lookahead -= s.match_length; - s.strstart += s.match_length; - s.match_length = 0; - } else { - /* No match, output a literal byte */ - //Tracevv((stderr,"%c", s->window[s->strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart]); - - s.lookahead--; - s.strstart++; - } - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - s.insert = 0; - if (flush === Z_FINISH$3) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.sym_next) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_BLOCK_DONE; -}; - -/* =========================================================================== - * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. - * (It will be regenerated if this run of deflate switches away from Huffman.) - */ -const deflate_huff = (s, flush) => { - - let bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we have a literal to write. */ - if (s.lookahead === 0) { - fill_window(s); - if (s.lookahead === 0) { - if (flush === Z_NO_FLUSH$2) { - return BS_NEED_MORE; - } - break; /* flush the current block */ - } - } - - /* Output a literal byte */ - s.match_length = 0; - //Tracevv((stderr,"%c", s->window[s->strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart]); - s.lookahead--; - s.strstart++; - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - s.insert = 0; - if (flush === Z_FINISH$3) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.sym_next) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_BLOCK_DONE; -}; - -/* Values for max_lazy_match, good_match and max_chain_length, depending on - * the desired pack level (0..9). The values given below have been tuned to - * exclude worst case performance for pathological files. Better values may be - * found for specific files. - */ -function Config(good_length, max_lazy, nice_length, max_chain, func) { - - this.good_length = good_length; - this.max_lazy = max_lazy; - this.nice_length = nice_length; - this.max_chain = max_chain; - this.func = func; -} - -const configuration_table = [ - /* good lazy nice chain */ - new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */ - new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */ - new Config(4, 5, 16, 8, deflate_fast), /* 2 */ - new Config(4, 6, 32, 32, deflate_fast), /* 3 */ - - new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */ - new Config(8, 16, 32, 32, deflate_slow), /* 5 */ - new Config(8, 16, 128, 128, deflate_slow), /* 6 */ - new Config(8, 32, 128, 256, deflate_slow), /* 7 */ - new Config(32, 128, 258, 1024, deflate_slow), /* 8 */ - new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */ -]; - - -/* =========================================================================== - * Initialize the "longest match" routines for a new zlib stream - */ -const lm_init = (s) => { - - s.window_size = 2 * s.w_size; - - /*** CLEAR_HASH(s); ***/ - zero(s.head); // Fill with NIL (= 0); - - /* Set the default configuration parameters: - */ - s.max_lazy_match = configuration_table[s.level].max_lazy; - s.good_match = configuration_table[s.level].good_length; - s.nice_match = configuration_table[s.level].nice_length; - s.max_chain_length = configuration_table[s.level].max_chain; - - s.strstart = 0; - s.block_start = 0; - s.lookahead = 0; - s.insert = 0; - s.match_length = s.prev_length = MIN_MATCH - 1; - s.match_available = 0; - s.ins_h = 0; -}; - - -function DeflateState() { - this.strm = null; /* pointer back to this zlib stream */ - this.status = 0; /* as the name implies */ - this.pending_buf = null; /* output still pending */ - this.pending_buf_size = 0; /* size of pending_buf */ - this.pending_out = 0; /* next pending byte to output to the stream */ - this.pending = 0; /* nb of bytes in the pending buffer */ - this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ - this.gzhead = null; /* gzip header information to write */ - this.gzindex = 0; /* where in extra, name, or comment */ - this.method = Z_DEFLATED$2; /* can only be DEFLATED */ - this.last_flush = -1; /* value of flush param for previous deflate call */ - - this.w_size = 0; /* LZ77 window size (32K by default) */ - this.w_bits = 0; /* log2(w_size) (8..16) */ - this.w_mask = 0; /* w_size - 1 */ - - this.window = null; - /* Sliding window. Input bytes are read into the second half of the window, - * and move to the first half later to keep a dictionary of at least wSize - * bytes. With this organization, matches are limited to a distance of - * wSize-MAX_MATCH bytes, but this ensures that IO is always - * performed with a length multiple of the block size. - */ - - this.window_size = 0; - /* Actual size of window: 2*wSize, except when the user input buffer - * is directly used as sliding window. - */ - - this.prev = null; - /* Link to older string with same hash index. To limit the size of this - * array to 64K, this link is maintained only for the last 32K strings. - * An index in this array is thus a window index modulo 32K. - */ - - this.head = null; /* Heads of the hash chains or NIL. */ - - this.ins_h = 0; /* hash index of string to be inserted */ - this.hash_size = 0; /* number of elements in hash table */ - this.hash_bits = 0; /* log2(hash_size) */ - this.hash_mask = 0; /* hash_size-1 */ - - this.hash_shift = 0; - /* Number of bits by which ins_h must be shifted at each input - * step. It must be such that after MIN_MATCH steps, the oldest - * byte no longer takes part in the hash key, that is: - * hash_shift * MIN_MATCH >= hash_bits - */ - - this.block_start = 0; - /* Window position at the beginning of the current output block. Gets - * negative when the window is moved backwards. - */ - - this.match_length = 0; /* length of best match */ - this.prev_match = 0; /* previous match */ - this.match_available = 0; /* set if previous match exists */ - this.strstart = 0; /* start of string to insert */ - this.match_start = 0; /* start of matching string */ - this.lookahead = 0; /* number of valid bytes ahead in window */ - - this.prev_length = 0; - /* Length of the best match at previous step. Matches not greater than this - * are discarded. This is used in the lazy match evaluation. - */ - - this.max_chain_length = 0; - /* To speed up deflation, hash chains are never searched beyond this - * length. A higher limit improves compression ratio but degrades the - * speed. - */ - - this.max_lazy_match = 0; - /* Attempt to find a better match only when the current match is strictly - * smaller than this value. This mechanism is used only for compression - * levels >= 4. - */ - // That's alias to max_lazy_match, don't use directly - //this.max_insert_length = 0; - /* Insert new strings in the hash table only if the match length is not - * greater than this length. This saves time but degrades compression. - * max_insert_length is used only for compression levels <= 3. - */ - - this.level = 0; /* compression level (1..9) */ - this.strategy = 0; /* favor or force Huffman coding*/ - - this.good_match = 0; - /* Use a faster search when the previous match is longer than this */ - - this.nice_match = 0; /* Stop searching when current match exceeds this */ - - /* used by trees.c: */ - - /* Didn't use ct_data typedef below to suppress compiler warning */ - - // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ - // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ - // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ - - // Use flat array of DOUBLE size, with interleaved fata, - // because JS does not support effective - this.dyn_ltree = new Uint16Array(HEAP_SIZE * 2); - this.dyn_dtree = new Uint16Array((2 * D_CODES + 1) * 2); - this.bl_tree = new Uint16Array((2 * BL_CODES + 1) * 2); - zero(this.dyn_ltree); - zero(this.dyn_dtree); - zero(this.bl_tree); - - this.l_desc = null; /* desc. for literal tree */ - this.d_desc = null; /* desc. for distance tree */ - this.bl_desc = null; /* desc. for bit length tree */ - - //ush bl_count[MAX_BITS+1]; - this.bl_count = new Uint16Array(MAX_BITS + 1); - /* number of codes at each bit length for an optimal tree */ - - //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ - this.heap = new Uint16Array(2 * L_CODES + 1); /* heap used to build the Huffman trees */ - zero(this.heap); - - this.heap_len = 0; /* number of elements in the heap */ - this.heap_max = 0; /* element of largest frequency */ - /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. - * The same heap array is used to build all trees. - */ - - this.depth = new Uint16Array(2 * L_CODES + 1); //uch depth[2*L_CODES+1]; - zero(this.depth); - /* Depth of each subtree used as tie breaker for trees of equal frequency - */ - - this.sym_buf = 0; /* buffer for distances and literals/lengths */ - - this.lit_bufsize = 0; - /* Size of match buffer for literals/lengths. There are 4 reasons for - * limiting lit_bufsize to 64K: - * - frequencies can be kept in 16 bit counters - * - if compression is not successful for the first block, all input - * data is still in the window so we can still emit a stored block even - * when input comes from standard input. (This can also be done for - * all blocks if lit_bufsize is not greater than 32K.) - * - if compression is not successful for a file smaller than 64K, we can - * even emit a stored file instead of a stored block (saving 5 bytes). - * This is applicable only for zip (not gzip or zlib). - * - creating new Huffman trees less frequently may not provide fast - * adaptation to changes in the input data statistics. (Take for - * example a binary file with poorly compressible code followed by - * a highly compressible string table.) Smaller buffer sizes give - * fast adaptation but have of course the overhead of transmitting - * trees more frequently. - * - I can't count above 4 - */ - - this.sym_next = 0; /* running index in sym_buf */ - this.sym_end = 0; /* symbol table full when sym_next reaches this */ - - this.opt_len = 0; /* bit length of current block with optimal trees */ - this.static_len = 0; /* bit length of current block with static trees */ - this.matches = 0; /* number of string matches in current block */ - this.insert = 0; /* bytes at end of window left to insert */ - - - this.bi_buf = 0; - /* Output buffer. bits are inserted starting at the bottom (least - * significant bits). - */ - this.bi_valid = 0; - /* Number of valid bits in bi_buf. All bits above the last valid bit - * are always zero. - */ - - // Used for window memory init. We safely ignore it for JS. That makes - // sense only for pointers and memory check tools. - //this.high_water = 0; - /* High water mark offset in window for initialized bytes -- bytes above - * this are set to zero in order to avoid memory check warnings when - * longest match routines access bytes past the input. This is then - * updated to the new high water mark. - */ -} - - -/* ========================================================================= - * Check for a valid deflate stream state. Return 0 if ok, 1 if not. - */ -const deflateStateCheck = (strm) => { - - if (!strm) { - return 1; - } - const s = strm.state; - if (!s || s.strm !== strm || (s.status !== INIT_STATE && -//#ifdef GZIP - s.status !== GZIP_STATE && -//#endif - s.status !== EXTRA_STATE && - s.status !== NAME_STATE && - s.status !== COMMENT_STATE && - s.status !== HCRC_STATE && - s.status !== BUSY_STATE && - s.status !== FINISH_STATE)) { - return 1; - } - return 0; -}; - - -const deflateResetKeep = (strm) => { - - if (deflateStateCheck(strm)) { - return err(strm, Z_STREAM_ERROR$2); - } - - strm.total_in = strm.total_out = 0; - strm.data_type = Z_UNKNOWN; - - const s = strm.state; - s.pending = 0; - s.pending_out = 0; - - if (s.wrap < 0) { - s.wrap = -s.wrap; - /* was made negative by deflate(..., Z_FINISH); */ - } - s.status = -//#ifdef GZIP - s.wrap === 2 ? GZIP_STATE : -//#endif - s.wrap ? INIT_STATE : BUSY_STATE; - strm.adler = (s.wrap === 2) ? - 0 // crc32(0, Z_NULL, 0) - : - 1; // adler32(0, Z_NULL, 0) - s.last_flush = -2; - _tr_init(s); - return Z_OK$3; -}; - - -const deflateReset = (strm) => { - - const ret = deflateResetKeep(strm); - if (ret === Z_OK$3) { - lm_init(strm.state); - } - return ret; -}; - - -const deflateSetHeader = (strm, head) => { - - if (deflateStateCheck(strm) || strm.state.wrap !== 2) { - return Z_STREAM_ERROR$2; - } - strm.state.gzhead = head; - return Z_OK$3; -}; - - -const deflateInit2 = (strm, level, method, windowBits, memLevel, strategy) => { - - if (!strm) { // === Z_NULL - return Z_STREAM_ERROR$2; - } - let wrap = 1; - - if (level === Z_DEFAULT_COMPRESSION$1) { - level = 6; - } - - if (windowBits < 0) { /* suppress zlib wrapper */ - wrap = 0; - windowBits = -windowBits; - } - - else if (windowBits > 15) { - wrap = 2; /* write gzip wrapper instead */ - windowBits -= 16; - } - - - if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED$2 || - windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || - strategy < 0 || strategy > Z_FIXED || (windowBits === 8 && wrap !== 1)) { - return err(strm, Z_STREAM_ERROR$2); - } - - - if (windowBits === 8) { - windowBits = 9; - } - /* until 256-byte window bug fixed */ - - const s = new DeflateState(); - - strm.state = s; - s.strm = strm; - s.status = INIT_STATE; /* to pass state test in deflateReset() */ - - s.wrap = wrap; - s.gzhead = null; - s.w_bits = windowBits; - s.w_size = 1 << s.w_bits; - s.w_mask = s.w_size - 1; - - s.hash_bits = memLevel + 7; - s.hash_size = 1 << s.hash_bits; - s.hash_mask = s.hash_size - 1; - s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH); - - s.window = new Uint8Array(s.w_size * 2); - s.head = new Uint16Array(s.hash_size); - s.prev = new Uint16Array(s.w_size); - - // Don't need mem init magic for JS. - //s.high_water = 0; /* nothing written to s->window yet */ - - s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ - - /* We overlay pending_buf and sym_buf. This works since the average size - * for length/distance pairs over any compressed block is assured to be 31 - * bits or less. - * - * Analysis: The longest fixed codes are a length code of 8 bits plus 5 - * extra bits, for lengths 131 to 257. The longest fixed distance codes are - * 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest - * possible fixed-codes length/distance pair is then 31 bits total. - * - * sym_buf starts one-fourth of the way into pending_buf. So there are - * three bytes in sym_buf for every four bytes in pending_buf. Each symbol - * in sym_buf is three bytes -- two for the distance and one for the - * literal/length. As each symbol is consumed, the pointer to the next - * sym_buf value to read moves forward three bytes. From that symbol, up to - * 31 bits are written to pending_buf. The closest the written pending_buf - * bits gets to the next sym_buf symbol to read is just before the last - * code is written. At that time, 31*(n-2) bits have been written, just - * after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at - * 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1 - * symbols are written.) The closest the writing gets to what is unread is - * then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and - * can range from 128 to 32768. - * - * Therefore, at a minimum, there are 142 bits of space between what is - * written and what is read in the overlain buffers, so the symbols cannot - * be overwritten by the compressed data. That space is actually 139 bits, - * due to the three-bit fixed-code block header. - * - * That covers the case where either Z_FIXED is specified, forcing fixed - * codes, or when the use of fixed codes is chosen, because that choice - * results in a smaller compressed block than dynamic codes. That latter - * condition then assures that the above analysis also covers all dynamic - * blocks. A dynamic-code block will only be chosen to be emitted if it has - * fewer bits than a fixed-code block would for the same set of symbols. - * Therefore its average symbol length is assured to be less than 31. So - * the compressed data for a dynamic block also cannot overwrite the - * symbols from which it is being constructed. - */ - - s.pending_buf_size = s.lit_bufsize * 4; - s.pending_buf = new Uint8Array(s.pending_buf_size); - - // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`) - //s->sym_buf = s->pending_buf + s->lit_bufsize; - s.sym_buf = s.lit_bufsize; - - //s->sym_end = (s->lit_bufsize - 1) * 3; - s.sym_end = (s.lit_bufsize - 1) * 3; - /* We avoid equality with lit_bufsize*3 because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ - - s.level = level; - s.strategy = strategy; - s.method = method; - - return deflateReset(strm); -}; - -const deflateInit = (strm, level) => { - - return deflateInit2(strm, level, Z_DEFLATED$2, MAX_WBITS$1, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY$1); -}; - - -/* ========================================================================= */ -const deflate$2 = (strm, flush) => { - - if (deflateStateCheck(strm) || flush > Z_BLOCK$1 || flush < 0) { - return strm ? err(strm, Z_STREAM_ERROR$2) : Z_STREAM_ERROR$2; - } - - const s = strm.state; - - if (!strm.output || - (strm.avail_in !== 0 && !strm.input) || - (s.status === FINISH_STATE && flush !== Z_FINISH$3)) { - return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR$1 : Z_STREAM_ERROR$2); - } - - const old_flush = s.last_flush; - s.last_flush = flush; - - /* Flush as much pending output as possible */ - if (s.pending !== 0) { - flush_pending(strm); - if (strm.avail_out === 0) { - /* Since avail_out is 0, deflate will be called again with - * more output space, but possibly with both pending and - * avail_in equal to zero. There won't be anything to do, - * but this is not an error situation so make sure we - * return OK instead of BUF_ERROR at next call of deflate: - */ - s.last_flush = -1; - return Z_OK$3; - } - - /* Make sure there is something to do and avoid duplicate consecutive - * flushes. For repeated and useless calls with Z_FINISH, we keep - * returning Z_STREAM_END instead of Z_BUF_ERROR. - */ - } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) && - flush !== Z_FINISH$3) { - return err(strm, Z_BUF_ERROR$1); - } - - /* User must not provide more input after the first FINISH: */ - if (s.status === FINISH_STATE && strm.avail_in !== 0) { - return err(strm, Z_BUF_ERROR$1); - } - - /* Write the header */ - if (s.status === INIT_STATE && s.wrap === 0) { - s.status = BUSY_STATE; - } - if (s.status === INIT_STATE) { - /* zlib header */ - let header = (Z_DEFLATED$2 + ((s.w_bits - 8) << 4)) << 8; - let level_flags = -1; - - if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) { - level_flags = 0; - } else if (s.level < 6) { - level_flags = 1; - } else if (s.level === 6) { - level_flags = 2; - } else { - level_flags = 3; - } - header |= (level_flags << 6); - if (s.strstart !== 0) { header |= PRESET_DICT; } - header += 31 - (header % 31); - - putShortMSB(s, header); - - /* Save the adler32 of the preset dictionary: */ - if (s.strstart !== 0) { - putShortMSB(s, strm.adler >>> 16); - putShortMSB(s, strm.adler & 0xffff); - } - strm.adler = 1; // adler32(0L, Z_NULL, 0); - s.status = BUSY_STATE; - - /* Compression must start with an empty pending buffer */ - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$3; - } - } -//#ifdef GZIP - if (s.status === GZIP_STATE) { - /* gzip header */ - strm.adler = 0; //crc32(0L, Z_NULL, 0); - put_byte(s, 31); - put_byte(s, 139); - put_byte(s, 8); - if (!s.gzhead) { // s->gzhead == Z_NULL - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, s.level === 9 ? 2 : - (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? - 4 : 0)); - put_byte(s, OS_CODE); - s.status = BUSY_STATE; - - /* Compression must start with an empty pending buffer */ - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$3; - } - } - else { - put_byte(s, (s.gzhead.text ? 1 : 0) + - (s.gzhead.hcrc ? 2 : 0) + - (!s.gzhead.extra ? 0 : 4) + - (!s.gzhead.name ? 0 : 8) + - (!s.gzhead.comment ? 0 : 16) - ); - put_byte(s, s.gzhead.time & 0xff); - put_byte(s, (s.gzhead.time >> 8) & 0xff); - put_byte(s, (s.gzhead.time >> 16) & 0xff); - put_byte(s, (s.gzhead.time >> 24) & 0xff); - put_byte(s, s.level === 9 ? 2 : - (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? - 4 : 0)); - put_byte(s, s.gzhead.os & 0xff); - if (s.gzhead.extra && s.gzhead.extra.length) { - put_byte(s, s.gzhead.extra.length & 0xff); - put_byte(s, (s.gzhead.extra.length >> 8) & 0xff); - } - if (s.gzhead.hcrc) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending, 0); - } - s.gzindex = 0; - s.status = EXTRA_STATE; - } - } - if (s.status === EXTRA_STATE) { - if (s.gzhead.extra/* != Z_NULL*/) { - let beg = s.pending; /* start of bytes to update crc */ - let left = (s.gzhead.extra.length & 0xffff) - s.gzindex; - while (s.pending + left > s.pending_buf_size) { - let copy = s.pending_buf_size - s.pending; - // zmemcpy(s.pending_buf + s.pending, - // s.gzhead.extra + s.gzindex, copy); - s.pending_buf.set(s.gzhead.extra.subarray(s.gzindex, s.gzindex + copy), s.pending); - s.pending = s.pending_buf_size; - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - //---// - s.gzindex += copy; - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$3; - } - beg = 0; - left -= copy; - } - // JS specific: s.gzhead.extra may be TypedArray or Array for backward compatibility - // TypedArray.slice and TypedArray.from don't exist in IE10-IE11 - let gzhead_extra = new Uint8Array(s.gzhead.extra); - // zmemcpy(s->pending_buf + s->pending, - // s->gzhead->extra + s->gzindex, left); - s.pending_buf.set(gzhead_extra.subarray(s.gzindex, s.gzindex + left), s.pending); - s.pending += left; - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - //---// - s.gzindex = 0; - } - s.status = NAME_STATE; - } - if (s.status === NAME_STATE) { - if (s.gzhead.name/* != Z_NULL*/) { - let beg = s.pending; /* start of bytes to update crc */ - let val; - do { - if (s.pending === s.pending_buf_size) { - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - //---// - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$3; - } - beg = 0; - } - // JS specific: little magic to add zero terminator to end of string - if (s.gzindex < s.gzhead.name.length) { - val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff; - } else { - val = 0; - } - put_byte(s, val); - } while (val !== 0); - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - //---// - s.gzindex = 0; - } - s.status = COMMENT_STATE; - } - if (s.status === COMMENT_STATE) { - if (s.gzhead.comment/* != Z_NULL*/) { - let beg = s.pending; /* start of bytes to update crc */ - let val; - do { - if (s.pending === s.pending_buf_size) { - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - //---// - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$3; - } - beg = 0; - } - // JS specific: little magic to add zero terminator to end of string - if (s.gzindex < s.gzhead.comment.length) { - val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff; - } else { - val = 0; - } - put_byte(s, val); - } while (val !== 0); - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - //---// - } - s.status = HCRC_STATE; - } - if (s.status === HCRC_STATE) { - if (s.gzhead.hcrc) { - if (s.pending + 2 > s.pending_buf_size) { - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$3; - } - } - put_byte(s, strm.adler & 0xff); - put_byte(s, (strm.adler >> 8) & 0xff); - strm.adler = 0; //crc32(0L, Z_NULL, 0); - } - s.status = BUSY_STATE; - - /* Compression must start with an empty pending buffer */ - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$3; - } - } -//#endif - - /* Start a new block or continue the current one. - */ - if (strm.avail_in !== 0 || s.lookahead !== 0 || - (flush !== Z_NO_FLUSH$2 && s.status !== FINISH_STATE)) { - let bstate = s.level === 0 ? deflate_stored(s, flush) : - s.strategy === Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : - s.strategy === Z_RLE ? deflate_rle(s, flush) : - configuration_table[s.level].func(s, flush); - - if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) { - s.status = FINISH_STATE; - } - if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) { - if (strm.avail_out === 0) { - s.last_flush = -1; - /* avoid BUF_ERROR next call, see above */ - } - return Z_OK$3; - /* If flush != Z_NO_FLUSH && avail_out == 0, the next call - * of deflate should use the same flush parameter to make sure - * that the flush is complete. So we don't have to output an - * empty block here, this will be done at next call. This also - * ensures that for a very small output buffer, we emit at most - * one empty block. - */ - } - if (bstate === BS_BLOCK_DONE) { - if (flush === Z_PARTIAL_FLUSH) { - _tr_align(s); - } - else if (flush !== Z_BLOCK$1) { /* FULL_FLUSH or SYNC_FLUSH */ - - _tr_stored_block(s, 0, 0, false); - /* For a full flush, this empty block will be recognized - * as a special marker by inflate_sync(). - */ - if (flush === Z_FULL_FLUSH$1) { - /*** CLEAR_HASH(s); ***/ /* forget history */ - zero(s.head); // Fill with NIL (= 0); - - if (s.lookahead === 0) { - s.strstart = 0; - s.block_start = 0; - s.insert = 0; - } - } - } - flush_pending(strm); - if (strm.avail_out === 0) { - s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */ - return Z_OK$3; - } - } - } - - if (flush !== Z_FINISH$3) { return Z_OK$3; } - if (s.wrap <= 0) { return Z_STREAM_END$3; } - - /* Write the trailer */ - if (s.wrap === 2) { - put_byte(s, strm.adler & 0xff); - put_byte(s, (strm.adler >> 8) & 0xff); - put_byte(s, (strm.adler >> 16) & 0xff); - put_byte(s, (strm.adler >> 24) & 0xff); - put_byte(s, strm.total_in & 0xff); - put_byte(s, (strm.total_in >> 8) & 0xff); - put_byte(s, (strm.total_in >> 16) & 0xff); - put_byte(s, (strm.total_in >> 24) & 0xff); - } - else - { - putShortMSB(s, strm.adler >>> 16); - putShortMSB(s, strm.adler & 0xffff); - } - - flush_pending(strm); - /* If avail_out is zero, the application will call deflate again - * to flush the rest. - */ - if (s.wrap > 0) { s.wrap = -s.wrap; } - /* write the trailer only once! */ - return s.pending !== 0 ? Z_OK$3 : Z_STREAM_END$3; -}; - - -const deflateEnd = (strm) => { - - if (deflateStateCheck(strm)) { - return Z_STREAM_ERROR$2; - } - - const status = strm.state.status; - - strm.state = null; - - return status === BUSY_STATE ? err(strm, Z_DATA_ERROR$2) : Z_OK$3; -}; - - -/* ========================================================================= - * Initializes the compression dictionary from the given byte - * sequence without producing any compressed output. - */ -const deflateSetDictionary = (strm, dictionary) => { - - let dictLength = dictionary.length; - - if (deflateStateCheck(strm)) { - return Z_STREAM_ERROR$2; - } - - const s = strm.state; - const wrap = s.wrap; - - if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) { - return Z_STREAM_ERROR$2; - } - - /* when using zlib wrappers, compute Adler-32 for provided dictionary */ - if (wrap === 1) { - /* adler32(strm->adler, dictionary, dictLength); */ - strm.adler = adler32_1(strm.adler, dictionary, dictLength, 0); - } - - s.wrap = 0; /* avoid computing Adler-32 in read_buf */ - - /* if dictionary would fill window, just replace the history */ - if (dictLength >= s.w_size) { - if (wrap === 0) { /* already empty otherwise */ - /*** CLEAR_HASH(s); ***/ - zero(s.head); // Fill with NIL (= 0); - s.strstart = 0; - s.block_start = 0; - s.insert = 0; - } - /* use the tail */ - // dictionary = dictionary.slice(dictLength - s.w_size); - let tmpDict = new Uint8Array(s.w_size); - tmpDict.set(dictionary.subarray(dictLength - s.w_size, dictLength), 0); - dictionary = tmpDict; - dictLength = s.w_size; - } - /* insert dictionary into window and hash */ - const avail = strm.avail_in; - const next = strm.next_in; - const input = strm.input; - strm.avail_in = dictLength; - strm.next_in = 0; - strm.input = dictionary; - fill_window(s); - while (s.lookahead >= MIN_MATCH) { - let str = s.strstart; - let n = s.lookahead - (MIN_MATCH - 1); - do { - /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ - s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]); - - s.prev[str & s.w_mask] = s.head[s.ins_h]; - - s.head[s.ins_h] = str; - str++; - } while (--n); - s.strstart = str; - s.lookahead = MIN_MATCH - 1; - fill_window(s); - } - s.strstart += s.lookahead; - s.block_start = s.strstart; - s.insert = s.lookahead; - s.lookahead = 0; - s.match_length = s.prev_length = MIN_MATCH - 1; - s.match_available = 0; - strm.next_in = next; - strm.input = input; - strm.avail_in = avail; - s.wrap = wrap; - return Z_OK$3; -}; - - -var deflateInit_1 = deflateInit; -var deflateInit2_1 = deflateInit2; -var deflateReset_1 = deflateReset; -var deflateResetKeep_1 = deflateResetKeep; -var deflateSetHeader_1 = deflateSetHeader; -var deflate_2$1 = deflate$2; -var deflateEnd_1 = deflateEnd; -var deflateSetDictionary_1 = deflateSetDictionary; -var deflateInfo = 'pako deflate (from Nodeca project)'; - -/* Not implemented -module.exports.deflateBound = deflateBound; -module.exports.deflateCopy = deflateCopy; -module.exports.deflateGetDictionary = deflateGetDictionary; -module.exports.deflateParams = deflateParams; -module.exports.deflatePending = deflatePending; -module.exports.deflatePrime = deflatePrime; -module.exports.deflateTune = deflateTune; -*/ - -var deflate_1$2 = { - deflateInit: deflateInit_1, - deflateInit2: deflateInit2_1, - deflateReset: deflateReset_1, - deflateResetKeep: deflateResetKeep_1, - deflateSetHeader: deflateSetHeader_1, - deflate: deflate_2$1, - deflateEnd: deflateEnd_1, - deflateSetDictionary: deflateSetDictionary_1, - deflateInfo: deflateInfo -}; - -const _has = (obj, key) => { - return Object.prototype.hasOwnProperty.call(obj, key); -}; - -var assign = function (obj /*from1, from2, from3, ...*/) { - const sources = Array.prototype.slice.call(arguments, 1); - while (sources.length) { - const source = sources.shift(); - if (!source) { continue; } - - if (typeof source !== 'object') { - throw new TypeError(source + 'must be non-object'); - } - - for (const p in source) { - if (_has(source, p)) { - obj[p] = source[p]; - } - } - } - - return obj; -}; - - -// Join array of chunks to single array. -var flattenChunks = (chunks) => { - // calculate data length - let len = 0; - - for (let i = 0, l = chunks.length; i < l; i++) { - len += chunks[i].length; - } - - // join chunks - const result = new Uint8Array(len); - - for (let i = 0, pos = 0, l = chunks.length; i < l; i++) { - let chunk = chunks[i]; - result.set(chunk, pos); - pos += chunk.length; - } - - return result; -}; - -var common = { - assign: assign, - flattenChunks: flattenChunks -}; - -// String encode/decode helpers - - -// Quick check if we can use fast array to bin string conversion -// -// - apply(Array) can fail on Android 2.2 -// - apply(Uint8Array) can fail on iOS 5.1 Safari -// -let STR_APPLY_UIA_OK = true; - -try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; } - - -// Table with utf8 lengths (calculated by first byte of sequence) -// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS, -// because max possible codepoint is 0x10ffff -const _utf8len = new Uint8Array(256); -for (let q = 0; q < 256; q++) { - _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1); -} -_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start - - -// convert string to array (typed, when possible) -var string2buf = (str) => { - if (typeof TextEncoder === 'function' && TextEncoder.prototype.encode) { - return new TextEncoder().encode(str); - } - - let buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0; - - // count binary size - for (m_pos = 0; m_pos < str_len; m_pos++) { - c = str.charCodeAt(m_pos); - if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) { - c2 = str.charCodeAt(m_pos + 1); - if ((c2 & 0xfc00) === 0xdc00) { - c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); - m_pos++; - } - } - buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4; - } - - // allocate buffer - buf = new Uint8Array(buf_len); - - // convert - for (i = 0, m_pos = 0; i < buf_len; m_pos++) { - c = str.charCodeAt(m_pos); - if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) { - c2 = str.charCodeAt(m_pos + 1); - if ((c2 & 0xfc00) === 0xdc00) { - c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); - m_pos++; - } - } - if (c < 0x80) { - /* one byte */ - buf[i++] = c; - } else if (c < 0x800) { - /* two bytes */ - buf[i++] = 0xC0 | (c >>> 6); - buf[i++] = 0x80 | (c & 0x3f); - } else if (c < 0x10000) { - /* three bytes */ - buf[i++] = 0xE0 | (c >>> 12); - buf[i++] = 0x80 | (c >>> 6 & 0x3f); - buf[i++] = 0x80 | (c & 0x3f); - } else { - /* four bytes */ - buf[i++] = 0xf0 | (c >>> 18); - buf[i++] = 0x80 | (c >>> 12 & 0x3f); - buf[i++] = 0x80 | (c >>> 6 & 0x3f); - buf[i++] = 0x80 | (c & 0x3f); - } - } - - return buf; -}; - -// Helper -const buf2binstring = (buf, len) => { - // On Chrome, the arguments in a function call that are allowed is `65534`. - // If the length of the buffer is smaller than that, we can use this optimization, - // otherwise we will take a slower path. - if (len < 65534) { - if (buf.subarray && STR_APPLY_UIA_OK) { - return String.fromCharCode.apply(null, buf.length === len ? buf : buf.subarray(0, len)); - } - } - - let result = ''; - for (let i = 0; i < len; i++) { - result += String.fromCharCode(buf[i]); - } - return result; -}; - - -// convert array to string -var buf2string = (buf, max) => { - const len = max || buf.length; - - if (typeof TextDecoder === 'function' && TextDecoder.prototype.decode) { - return new TextDecoder().decode(buf.subarray(0, max)); - } - - let i, out; - - // Reserve max possible length (2 words per char) - // NB: by unknown reasons, Array is significantly faster for - // String.fromCharCode.apply than Uint16Array. - const utf16buf = new Array(len * 2); - - for (out = 0, i = 0; i < len;) { - let c = buf[i++]; - // quick process ascii - if (c < 0x80) { utf16buf[out++] = c; continue; } - - let c_len = _utf8len[c]; - // skip 5 & 6 byte codes - if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; } - - // apply mask on first byte - c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07; - // join the rest - while (c_len > 1 && i < len) { - c = (c << 6) | (buf[i++] & 0x3f); - c_len--; - } - - // terminated by end of string? - if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; } - - if (c < 0x10000) { - utf16buf[out++] = c; - } else { - c -= 0x10000; - utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff); - utf16buf[out++] = 0xdc00 | (c & 0x3ff); - } - } - - return buf2binstring(utf16buf, out); -}; - - -// Calculate max possible position in utf8 buffer, -// that will not break sequence. If that's not possible -// - (very small limits) return max size as is. -// -// buf[] - utf8 bytes array -// max - length limit (mandatory); -var utf8border = (buf, max) => { - - max = max || buf.length; - if (max > buf.length) { max = buf.length; } - - // go back from last position, until start of sequence found - let pos = max - 1; - while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; } - - // Very small and broken sequence, - // return max, because we should return something anyway. - if (pos < 0) { return max; } - - // If we came to start of buffer - that means buffer is too small, - // return max too. - if (pos === 0) { return max; } - - return (pos + _utf8len[buf[pos]] > max) ? pos : max; -}; - -var strings = { - string2buf: string2buf, - buf2string: buf2string, - utf8border: utf8border -}; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -function ZStream() { - /* next input byte */ - this.input = null; // JS specific, because we have no pointers - this.next_in = 0; - /* number of bytes available at input */ - this.avail_in = 0; - /* total number of input bytes read so far */ - this.total_in = 0; - /* next output byte should be put there */ - this.output = null; // JS specific, because we have no pointers - this.next_out = 0; - /* remaining free space at output */ - this.avail_out = 0; - /* total number of bytes output so far */ - this.total_out = 0; - /* last error message, NULL if no error */ - this.msg = ''/*Z_NULL*/; - /* not visible by applications */ - this.state = null; - /* best guess about the data type: binary or text */ - this.data_type = 2/*Z_UNKNOWN*/; - /* adler32 value of the uncompressed data */ - this.adler = 0; -} - -var zstream = ZStream; - -const toString$1 = Object.prototype.toString; - -/* Public constants ==========================================================*/ -/* ===========================================================================*/ - -const { - Z_NO_FLUSH: Z_NO_FLUSH$1, Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH: Z_FINISH$2, - Z_OK: Z_OK$2, Z_STREAM_END: Z_STREAM_END$2, - Z_DEFAULT_COMPRESSION, - Z_DEFAULT_STRATEGY, - Z_DEFLATED: Z_DEFLATED$1 -} = constants$2; - -/* ===========================================================================*/ - - -/** - * class Deflate - * - * Generic JS-style wrapper for zlib calls. If you don't need - * streaming behaviour - use more simple functions: [[deflate]], - * [[deflateRaw]] and [[gzip]]. - **/ - -/* internal - * Deflate.chunks -> Array - * - * Chunks of output data, if [[Deflate#onData]] not overridden. - **/ - -/** - * Deflate.result -> Uint8Array - * - * Compressed result, generated by default [[Deflate#onData]] - * and [[Deflate#onEnd]] handlers. Filled after you push last chunk - * (call [[Deflate#push]] with `Z_FINISH` / `true` param). - **/ - -/** - * Deflate.err -> Number - * - * Error code after deflate finished. 0 (Z_OK) on success. - * You will not need it in real life, because deflate errors - * are possible only on wrong options or bad `onData` / `onEnd` - * custom handlers. - **/ - -/** - * Deflate.msg -> String - * - * Error message, if [[Deflate.err]] != 0 - **/ - - -/** - * new Deflate(options) - * - options (Object): zlib deflate options. - * - * Creates new deflator instance with specified params. Throws exception - * on bad params. Supported options: - * - * - `level` - * - `windowBits` - * - `memLevel` - * - `strategy` - * - `dictionary` - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information on these. - * - * Additional options, for internal needs: - * - * - `chunkSize` - size of generated data chunks (16K by default) - * - `raw` (Boolean) - do raw deflate - * - `gzip` (Boolean) - create gzip wrapper - * - `header` (Object) - custom header for gzip - * - `text` (Boolean) - true if compressed data believed to be text - * - `time` (Number) - modification time, unix timestamp - * - `os` (Number) - operation system code - * - `extra` (Array) - array of bytes with extra data (max 65536) - * - `name` (String) - file name (binary string) - * - `comment` (String) - comment (binary string) - * - `hcrc` (Boolean) - true if header crc should be added - * - * ##### Example: - * - * ```javascript - * const pako = require('pako') - * , chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9]) - * , chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]); - * - * const deflate = new pako.Deflate({ level: 3}); - * - * deflate.push(chunk1, false); - * deflate.push(chunk2, true); // true -> last chunk - * - * if (deflate.err) { throw new Error(deflate.err); } - * - * console.log(deflate.result); - * ``` - **/ -function Deflate$1(options) { - this.options = common.assign({ - level: Z_DEFAULT_COMPRESSION, - method: Z_DEFLATED$1, - chunkSize: 16384, - windowBits: 15, - memLevel: 8, - strategy: Z_DEFAULT_STRATEGY - }, options || {}); - - let opt = this.options; - - if (opt.raw && (opt.windowBits > 0)) { - opt.windowBits = -opt.windowBits; - } - - else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) { - opt.windowBits += 16; - } - - this.err = 0; // error code, if happens (0 = Z_OK) - this.msg = ''; // error message - this.ended = false; // used to avoid multiple onEnd() calls - this.chunks = []; // chunks of compressed data - - this.strm = new zstream(); - this.strm.avail_out = 0; - - let status = deflate_1$2.deflateInit2( - this.strm, - opt.level, - opt.method, - opt.windowBits, - opt.memLevel, - opt.strategy - ); - - if (status !== Z_OK$2) { - throw new Error(messages[status]); - } - - if (opt.header) { - deflate_1$2.deflateSetHeader(this.strm, opt.header); - } - - if (opt.dictionary) { - let dict; - // Convert data if needed - if (typeof opt.dictionary === 'string') { - // If we need to compress text, change encoding to utf8. - dict = strings.string2buf(opt.dictionary); - } else if (toString$1.call(opt.dictionary) === '[object ArrayBuffer]') { - dict = new Uint8Array(opt.dictionary); - } else { - dict = opt.dictionary; - } - - status = deflate_1$2.deflateSetDictionary(this.strm, dict); - - if (status !== Z_OK$2) { - throw new Error(messages[status]); - } - - this._dict_set = true; - } -} - -/** - * Deflate#push(data[, flush_mode]) -> Boolean - * - data (Uint8Array|ArrayBuffer|String): input data. Strings will be - * converted to utf8 byte sequence. - * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes. - * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH. - * - * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with - * new compressed chunks. Returns `true` on success. The last data block must - * have `flush_mode` Z_FINISH (or `true`). That will flush internal pending - * buffers and call [[Deflate#onEnd]]. - * - * On fail call [[Deflate#onEnd]] with error code and return false. - * - * ##### Example - * - * ```javascript - * push(chunk, false); // push one of data chunks - * ... - * push(chunk, true); // push last chunk - * ``` - **/ -Deflate$1.prototype.push = function (data, flush_mode) { - const strm = this.strm; - const chunkSize = this.options.chunkSize; - let status, _flush_mode; - - if (this.ended) { return false; } - - if (flush_mode === ~~flush_mode) _flush_mode = flush_mode; - else _flush_mode = flush_mode === true ? Z_FINISH$2 : Z_NO_FLUSH$1; - - // Convert data if needed - if (typeof data === 'string') { - // If we need to compress text, change encoding to utf8. - strm.input = strings.string2buf(data); - } else if (toString$1.call(data) === '[object ArrayBuffer]') { - strm.input = new Uint8Array(data); - } else { - strm.input = data; - } - - strm.next_in = 0; - strm.avail_in = strm.input.length; - - for (;;) { - if (strm.avail_out === 0) { - strm.output = new Uint8Array(chunkSize); - strm.next_out = 0; - strm.avail_out = chunkSize; - } - - // Make sure avail_out > 6 to avoid repeating markers - if ((_flush_mode === Z_SYNC_FLUSH || _flush_mode === Z_FULL_FLUSH) && strm.avail_out <= 6) { - this.onData(strm.output.subarray(0, strm.next_out)); - strm.avail_out = 0; - continue; - } - - status = deflate_1$2.deflate(strm, _flush_mode); - - // Ended => flush and finish - if (status === Z_STREAM_END$2) { - if (strm.next_out > 0) { - this.onData(strm.output.subarray(0, strm.next_out)); - } - status = deflate_1$2.deflateEnd(this.strm); - this.onEnd(status); - this.ended = true; - return status === Z_OK$2; - } - - // Flush if out buffer full - if (strm.avail_out === 0) { - this.onData(strm.output); - continue; - } - - // Flush if requested and has data - if (_flush_mode > 0 && strm.next_out > 0) { - this.onData(strm.output.subarray(0, strm.next_out)); - strm.avail_out = 0; - continue; - } - - if (strm.avail_in === 0) break; - } - - return true; -}; - - -/** - * Deflate#onData(chunk) -> Void - * - chunk (Uint8Array): output data. - * - * By default, stores data blocks in `chunks[]` property and glue - * those in `onEnd`. Override this handler, if you need another behaviour. - **/ -Deflate$1.prototype.onData = function (chunk) { - this.chunks.push(chunk); -}; - - -/** - * Deflate#onEnd(status) -> Void - * - status (Number): deflate status. 0 (Z_OK) on success, - * other if not. - * - * Called once after you tell deflate that the input stream is - * complete (Z_FINISH). By default - join collected chunks, - * free memory and fill `results` / `err` properties. - **/ -Deflate$1.prototype.onEnd = function (status) { - // On success - join - if (status === Z_OK$2) { - this.result = common.flattenChunks(this.chunks); - } - this.chunks = []; - this.err = status; - this.msg = this.strm.msg; -}; - - -/** - * deflate(data[, options]) -> Uint8Array - * - data (Uint8Array|ArrayBuffer|String): input data to compress. - * - options (Object): zlib deflate options. - * - * Compress `data` with deflate algorithm and `options`. - * - * Supported options are: - * - * - level - * - windowBits - * - memLevel - * - strategy - * - dictionary - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information on these. - * - * Sugar (options): - * - * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify - * negative windowBits implicitly. - * - * ##### Example: - * - * ```javascript - * const pako = require('pako') - * const data = new Uint8Array([1,2,3,4,5,6,7,8,9]); - * - * console.log(pako.deflate(data)); - * ``` - **/ -function deflate$1(input, options) { - const deflator = new Deflate$1(options); - - deflator.push(input, true); - - // That will never happens, if you don't cheat with options :) - if (deflator.err) { throw deflator.msg || messages[deflator.err]; } - - return deflator.result; -} - - -/** - * deflateRaw(data[, options]) -> Uint8Array - * - data (Uint8Array|ArrayBuffer|String): input data to compress. - * - options (Object): zlib deflate options. - * - * The same as [[deflate]], but creates raw data, without wrapper - * (header and adler32 crc). - **/ -function deflateRaw$1(input, options) { - options = options || {}; - options.raw = true; - return deflate$1(input, options); -} - - -/** - * gzip(data[, options]) -> Uint8Array - * - data (Uint8Array|ArrayBuffer|String): input data to compress. - * - options (Object): zlib deflate options. - * - * The same as [[deflate]], but create gzip wrapper instead of - * deflate one. - **/ -function gzip$1(input, options) { - options = options || {}; - options.gzip = true; - return deflate$1(input, options); -} - - -var Deflate_1$1 = Deflate$1; -var deflate_2 = deflate$1; -var deflateRaw_1$1 = deflateRaw$1; -var gzip_1$1 = gzip$1; -var constants$1 = constants$2; - -var deflate_1$1 = { - Deflate: Deflate_1$1, - deflate: deflate_2, - deflateRaw: deflateRaw_1$1, - gzip: gzip_1$1, - constants: constants$1 -}; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -// See state defs from inflate.js -const BAD$1 = 16209; /* got a data error -- remain here until reset */ -const TYPE$1 = 16191; /* i: waiting for type bits, including last-flag bit */ - -/* - Decode literal, length, and distance codes and write out the resulting - literal and match bytes until either not enough input or output is - available, an end-of-block is encountered, or a data error is encountered. - When large enough input and output buffers are supplied to inflate(), for - example, a 16K input buffer and a 64K output buffer, more than 95% of the - inflate execution time is spent in this routine. - - Entry assumptions: - - state.mode === LEN - strm.avail_in >= 6 - strm.avail_out >= 258 - start >= strm.avail_out - state.bits < 8 - - On return, state.mode is one of: - - LEN -- ran out of enough output space or enough available input - TYPE -- reached end of block code, inflate() to interpret next block - BAD -- error in block data - - Notes: - - - The maximum input bits used by a length/distance pair is 15 bits for the - length code, 5 bits for the length extra, 15 bits for the distance code, - and 13 bits for the distance extra. This totals 48 bits, or six bytes. - Therefore if strm.avail_in >= 6, then there is enough input to avoid - checking for available input while decoding. - - - The maximum bytes that a single length/distance pair can output is 258 - bytes, which is the maximum length that can be coded. inflate_fast() - requires strm.avail_out >= 258 for each loop to avoid checking for - output space. - */ -var inffast = function inflate_fast(strm, start) { - let _in; /* local strm.input */ - let last; /* have enough input while in < last */ - let _out; /* local strm.output */ - let beg; /* inflate()'s initial strm.output */ - let end; /* while out < end, enough space available */ -//#ifdef INFLATE_STRICT - let dmax; /* maximum distance from zlib header */ -//#endif - let wsize; /* window size or zero if not using window */ - let whave; /* valid bytes in the window */ - let wnext; /* window write index */ - // Use `s_window` instead `window`, avoid conflict with instrumentation tools - let s_window; /* allocated sliding window, if wsize != 0 */ - let hold; /* local strm.hold */ - let bits; /* local strm.bits */ - let lcode; /* local strm.lencode */ - let dcode; /* local strm.distcode */ - let lmask; /* mask for first level of length codes */ - let dmask; /* mask for first level of distance codes */ - let here; /* retrieved table entry */ - let op; /* code bits, operation, extra bits, or */ - /* window position, window bytes to copy */ - let len; /* match length, unused bytes */ - let dist; /* match distance */ - let from; /* where to copy match from */ - let from_source; - - - let input, output; // JS specific, because we have no pointers - - /* copy state to local variables */ - const state = strm.state; - //here = state.here; - _in = strm.next_in; - input = strm.input; - last = _in + (strm.avail_in - 5); - _out = strm.next_out; - output = strm.output; - beg = _out - (start - strm.avail_out); - end = _out + (strm.avail_out - 257); -//#ifdef INFLATE_STRICT - dmax = state.dmax; -//#endif - wsize = state.wsize; - whave = state.whave; - wnext = state.wnext; - s_window = state.window; - hold = state.hold; - bits = state.bits; - lcode = state.lencode; - dcode = state.distcode; - lmask = (1 << state.lenbits) - 1; - dmask = (1 << state.distbits) - 1; - - - /* decode literals and length/distances until end-of-block or not enough - input data or output space */ - - top: - do { - if (bits < 15) { - hold += input[_in++] << bits; - bits += 8; - hold += input[_in++] << bits; - bits += 8; - } - - here = lcode[hold & lmask]; - - dolen: - for (;;) { // Goto emulation - op = here >>> 24/*here.bits*/; - hold >>>= op; - bits -= op; - op = (here >>> 16) & 0xff/*here.op*/; - if (op === 0) { /* literal */ - //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - // "inflate: literal '%c'\n" : - // "inflate: literal 0x%02x\n", here.val)); - output[_out++] = here & 0xffff/*here.val*/; - } - else if (op & 16) { /* length base */ - len = here & 0xffff/*here.val*/; - op &= 15; /* number of extra bits */ - if (op) { - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - } - len += hold & ((1 << op) - 1); - hold >>>= op; - bits -= op; - } - //Tracevv((stderr, "inflate: length %u\n", len)); - if (bits < 15) { - hold += input[_in++] << bits; - bits += 8; - hold += input[_in++] << bits; - bits += 8; - } - here = dcode[hold & dmask]; - - dodist: - for (;;) { // goto emulation - op = here >>> 24/*here.bits*/; - hold >>>= op; - bits -= op; - op = (here >>> 16) & 0xff/*here.op*/; - - if (op & 16) { /* distance base */ - dist = here & 0xffff/*here.val*/; - op &= 15; /* number of extra bits */ - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - } - } - dist += hold & ((1 << op) - 1); -//#ifdef INFLATE_STRICT - if (dist > dmax) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD$1; - break top; - } -//#endif - hold >>>= op; - bits -= op; - //Tracevv((stderr, "inflate: distance %u\n", dist)); - op = _out - beg; /* max distance in output */ - if (dist > op) { /* see if copy from window */ - op = dist - op; /* distance back in window */ - if (op > whave) { - if (state.sane) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD$1; - break top; - } - -// (!) This block is disabled in zlib defaults, -// don't enable it for binary compatibility -//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR -// if (len <= op - whave) { -// do { -// output[_out++] = 0; -// } while (--len); -// continue top; -// } -// len -= op - whave; -// do { -// output[_out++] = 0; -// } while (--op > whave); -// if (op === 0) { -// from = _out - dist; -// do { -// output[_out++] = output[from++]; -// } while (--len); -// continue top; -// } -//#endif - } - from = 0; // window index - from_source = s_window; - if (wnext === 0) { /* very common case */ - from += wsize - op; - if (op < len) { /* some from window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - else if (wnext < op) { /* wrap around window */ - from += wsize + wnext - op; - op -= wnext; - if (op < len) { /* some from end of window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = 0; - if (wnext < len) { /* some from start of window */ - op = wnext; - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - } - else { /* contiguous in window */ - from += wnext - op; - if (op < len) { /* some from window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - while (len > 2) { - output[_out++] = from_source[from++]; - output[_out++] = from_source[from++]; - output[_out++] = from_source[from++]; - len -= 3; - } - if (len) { - output[_out++] = from_source[from++]; - if (len > 1) { - output[_out++] = from_source[from++]; - } - } - } - else { - from = _out - dist; /* copy direct from output */ - do { /* minimum length is three */ - output[_out++] = output[from++]; - output[_out++] = output[from++]; - output[_out++] = output[from++]; - len -= 3; - } while (len > 2); - if (len) { - output[_out++] = output[from++]; - if (len > 1) { - output[_out++] = output[from++]; - } - } - } - } - else if ((op & 64) === 0) { /* 2nd level distance code */ - here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))]; - continue dodist; - } - else { - strm.msg = 'invalid distance code'; - state.mode = BAD$1; - break top; - } - - break; // need to emulate goto via "continue" - } - } - else if ((op & 64) === 0) { /* 2nd level length code */ - here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))]; - continue dolen; - } - else if (op & 32) { /* end-of-block */ - //Tracevv((stderr, "inflate: end of block\n")); - state.mode = TYPE$1; - break top; - } - else { - strm.msg = 'invalid literal/length code'; - state.mode = BAD$1; - break top; - } - - break; // need to emulate goto via "continue" - } - } while (_in < last && _out < end); - - /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ - len = bits >> 3; - _in -= len; - bits -= len << 3; - hold &= (1 << bits) - 1; - - /* update state and return */ - strm.next_in = _in; - strm.next_out = _out; - strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last)); - strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end)); - state.hold = hold; - state.bits = bits; - return; -}; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -const MAXBITS = 15; -const ENOUGH_LENS$1 = 852; -const ENOUGH_DISTS$1 = 592; -//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); - -const CODES$1 = 0; -const LENS$1 = 1; -const DISTS$1 = 2; - -const lbase = new Uint16Array([ /* Length codes 257..285 base */ - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 -]); - -const lext = new Uint8Array([ /* Length codes 257..285 extra */ - 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78 -]); - -const dbase = new Uint16Array([ /* Distance codes 0..29 base */ - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, - 8193, 12289, 16385, 24577, 0, 0 -]); - -const dext = new Uint8Array([ /* Distance codes 0..29 extra */ - 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, - 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, - 28, 28, 29, 29, 64, 64 -]); - -const inflate_table = (type, lens, lens_index, codes, table, table_index, work, opts) => -{ - const bits = opts.bits; - //here = opts.here; /* table entry for duplication */ - - let len = 0; /* a code's length in bits */ - let sym = 0; /* index of code symbols */ - let min = 0, max = 0; /* minimum and maximum code lengths */ - let root = 0; /* number of index bits for root table */ - let curr = 0; /* number of index bits for current table */ - let drop = 0; /* code bits to drop for sub-table */ - let left = 0; /* number of prefix codes available */ - let used = 0; /* code entries in table used */ - let huff = 0; /* Huffman code */ - let incr; /* for incrementing code, index */ - let fill; /* index for replicating entries */ - let low; /* low bits for current root entry */ - let mask; /* mask for low root bits */ - let next; /* next available space in table */ - let base = null; /* base value table to use */ -// let shoextra; /* extra bits table to use */ - let match; /* use base and extra for symbol >= match */ - const count = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */ - const offs = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */ - let extra = null; - - let here_bits, here_op, here_val; - - /* - Process a set of code lengths to create a canonical Huffman code. The - code lengths are lens[0..codes-1]. Each length corresponds to the - symbols 0..codes-1. The Huffman code is generated by first sorting the - symbols by length from short to long, and retaining the symbol order - for codes with equal lengths. Then the code starts with all zero bits - for the first code of the shortest length, and the codes are integer - increments for the same length, and zeros are appended as the length - increases. For the deflate format, these bits are stored backwards - from their more natural integer increment ordering, and so when the - decoding tables are built in the large loop below, the integer codes - are incremented backwards. - - This routine assumes, but does not check, that all of the entries in - lens[] are in the range 0..MAXBITS. The caller must assure this. - 1..MAXBITS is interpreted as that code length. zero means that that - symbol does not occur in this code. - - The codes are sorted by computing a count of codes for each length, - creating from that a table of starting indices for each length in the - sorted table, and then entering the symbols in order in the sorted - table. The sorted table is work[], with that space being provided by - the caller. - - The length counts are used for other purposes as well, i.e. finding - the minimum and maximum length codes, determining if there are any - codes at all, checking for a valid set of lengths, and looking ahead - at length counts to determine sub-table sizes when building the - decoding tables. - */ - - /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ - for (len = 0; len <= MAXBITS; len++) { - count[len] = 0; - } - for (sym = 0; sym < codes; sym++) { - count[lens[lens_index + sym]]++; - } - - /* bound code lengths, force root to be within code lengths */ - root = bits; - for (max = MAXBITS; max >= 1; max--) { - if (count[max] !== 0) { break; } - } - if (root > max) { - root = max; - } - if (max === 0) { /* no symbols to code at all */ - //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */ - //table.bits[opts.table_index] = 1; //here.bits = (var char)1; - //table.val[opts.table_index++] = 0; //here.val = (var short)0; - table[table_index++] = (1 << 24) | (64 << 16) | 0; - - - //table.op[opts.table_index] = 64; - //table.bits[opts.table_index] = 1; - //table.val[opts.table_index++] = 0; - table[table_index++] = (1 << 24) | (64 << 16) | 0; - - opts.bits = 1; - return 0; /* no symbols, but wait for decoding to report error */ - } - for (min = 1; min < max; min++) { - if (count[min] !== 0) { break; } - } - if (root < min) { - root = min; - } - - /* check for an over-subscribed or incomplete set of lengths */ - left = 1; - for (len = 1; len <= MAXBITS; len++) { - left <<= 1; - left -= count[len]; - if (left < 0) { - return -1; - } /* over-subscribed */ - } - if (left > 0 && (type === CODES$1 || max !== 1)) { - return -1; /* incomplete set */ - } - - /* generate offsets into symbol table for each length for sorting */ - offs[1] = 0; - for (len = 1; len < MAXBITS; len++) { - offs[len + 1] = offs[len] + count[len]; - } - - /* sort symbols by length, by symbol order within each length */ - for (sym = 0; sym < codes; sym++) { - if (lens[lens_index + sym] !== 0) { - work[offs[lens[lens_index + sym]]++] = sym; - } - } - - /* - Create and fill in decoding tables. In this loop, the table being - filled is at next and has curr index bits. The code being used is huff - with length len. That code is converted to an index by dropping drop - bits off of the bottom. For codes where len is less than drop + curr, - those top drop + curr - len bits are incremented through all values to - fill the table with replicated entries. - - root is the number of index bits for the root table. When len exceeds - root, sub-tables are created pointed to by the root entry with an index - of the low root bits of huff. This is saved in low to check for when a - new sub-table should be started. drop is zero when the root table is - being filled, and drop is root when sub-tables are being filled. - - When a new sub-table is needed, it is necessary to look ahead in the - code lengths to determine what size sub-table is needed. The length - counts are used for this, and so count[] is decremented as codes are - entered in the tables. - - used keeps track of how many table entries have been allocated from the - provided *table space. It is checked for LENS and DIST tables against - the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in - the initial root table size constants. See the comments in inftrees.h - for more information. - - sym increments through all symbols, and the loop terminates when - all codes of length max, i.e. all codes, have been processed. This - routine permits incomplete codes, so another loop after this one fills - in the rest of the decoding tables with invalid code markers. - */ - - /* set up for code type */ - // poor man optimization - use if-else instead of switch, - // to avoid deopts in old v8 - if (type === CODES$1) { - base = extra = work; /* dummy value--not used */ - match = 20; - - } else if (type === LENS$1) { - base = lbase; - extra = lext; - match = 257; - - } else { /* DISTS */ - base = dbase; - extra = dext; - match = 0; - } - - /* initialize opts for loop */ - huff = 0; /* starting code */ - sym = 0; /* starting code symbol */ - len = min; /* starting code length */ - next = table_index; /* current table to fill in */ - curr = root; /* current table index bits */ - drop = 0; /* current bits to drop from code for index */ - low = -1; /* trigger new sub-table when len > root */ - used = 1 << root; /* use root table entries */ - mask = used - 1; /* mask for comparing low */ - - /* check available table space */ - if ((type === LENS$1 && used > ENOUGH_LENS$1) || - (type === DISTS$1 && used > ENOUGH_DISTS$1)) { - return 1; - } - - /* process all codes and make table entries */ - for (;;) { - /* create table entry */ - here_bits = len - drop; - if (work[sym] + 1 < match) { - here_op = 0; - here_val = work[sym]; - } - else if (work[sym] >= match) { - here_op = extra[work[sym] - match]; - here_val = base[work[sym] - match]; - } - else { - here_op = 32 + 64; /* end of block */ - here_val = 0; - } - - /* replicate for those indices with low len bits equal to huff */ - incr = 1 << (len - drop); - fill = 1 << curr; - min = fill; /* save offset to next table */ - do { - fill -= incr; - table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0; - } while (fill !== 0); - - /* backwards increment the len-bit code huff */ - incr = 1 << (len - 1); - while (huff & incr) { - incr >>= 1; - } - if (incr !== 0) { - huff &= incr - 1; - huff += incr; - } else { - huff = 0; - } - - /* go to next symbol, update count, len */ - sym++; - if (--count[len] === 0) { - if (len === max) { break; } - len = lens[lens_index + work[sym]]; - } - - /* create new sub-table if needed */ - if (len > root && (huff & mask) !== low) { - /* if first time, transition to sub-tables */ - if (drop === 0) { - drop = root; - } - - /* increment past last table */ - next += min; /* here min is 1 << curr */ - - /* determine length of next table */ - curr = len - drop; - left = 1 << curr; - while (curr + drop < max) { - left -= count[curr + drop]; - if (left <= 0) { break; } - curr++; - left <<= 1; - } - - /* check for enough space */ - used += 1 << curr; - if ((type === LENS$1 && used > ENOUGH_LENS$1) || - (type === DISTS$1 && used > ENOUGH_DISTS$1)) { - return 1; - } - - /* point entry in root table to sub-table */ - low = huff & mask; - /*table.op[low] = curr; - table.bits[low] = root; - table.val[low] = next - opts.table_index;*/ - table[low] = (root << 24) | (curr << 16) | (next - table_index) |0; - } - } - - /* fill in remaining table entry if code is incomplete (guaranteed to have - at most one remaining entry, since if the code is incomplete, the - maximum code length that was allowed to get this far is one bit) */ - if (huff !== 0) { - //table.op[next + huff] = 64; /* invalid code marker */ - //table.bits[next + huff] = len - drop; - //table.val[next + huff] = 0; - table[next + huff] = ((len - drop) << 24) | (64 << 16) |0; - } - - /* set return parameters */ - //opts.table_index += used; - opts.bits = root; - return 0; -}; - - -var inftrees = inflate_table; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - - - - - - -const CODES = 0; -const LENS = 1; -const DISTS = 2; - -/* Public constants ==========================================================*/ -/* ===========================================================================*/ - -const { - Z_FINISH: Z_FINISH$1, Z_BLOCK, Z_TREES, - Z_OK: Z_OK$1, Z_STREAM_END: Z_STREAM_END$1, Z_NEED_DICT: Z_NEED_DICT$1, Z_STREAM_ERROR: Z_STREAM_ERROR$1, Z_DATA_ERROR: Z_DATA_ERROR$1, Z_MEM_ERROR: Z_MEM_ERROR$1, Z_BUF_ERROR, - Z_DEFLATED -} = constants$2; - - -/* STATES ====================================================================*/ -/* ===========================================================================*/ - - -const HEAD = 16180; /* i: waiting for magic header */ -const FLAGS = 16181; /* i: waiting for method and flags (gzip) */ -const TIME = 16182; /* i: waiting for modification time (gzip) */ -const OS = 16183; /* i: waiting for extra flags and operating system (gzip) */ -const EXLEN = 16184; /* i: waiting for extra length (gzip) */ -const EXTRA = 16185; /* i: waiting for extra bytes (gzip) */ -const NAME = 16186; /* i: waiting for end of file name (gzip) */ -const COMMENT = 16187; /* i: waiting for end of comment (gzip) */ -const HCRC = 16188; /* i: waiting for header crc (gzip) */ -const DICTID = 16189; /* i: waiting for dictionary check value */ -const DICT = 16190; /* waiting for inflateSetDictionary() call */ -const TYPE = 16191; /* i: waiting for type bits, including last-flag bit */ -const TYPEDO = 16192; /* i: same, but skip check to exit inflate on new block */ -const STORED = 16193; /* i: waiting for stored size (length and complement) */ -const COPY_ = 16194; /* i/o: same as COPY below, but only first time in */ -const COPY = 16195; /* i/o: waiting for input or output to copy stored block */ -const TABLE = 16196; /* i: waiting for dynamic block table lengths */ -const LENLENS = 16197; /* i: waiting for code length code lengths */ -const CODELENS = 16198; /* i: waiting for length/lit and distance code lengths */ -const LEN_ = 16199; /* i: same as LEN below, but only first time in */ -const LEN = 16200; /* i: waiting for length/lit/eob code */ -const LENEXT = 16201; /* i: waiting for length extra bits */ -const DIST = 16202; /* i: waiting for distance code */ -const DISTEXT = 16203; /* i: waiting for distance extra bits */ -const MATCH = 16204; /* o: waiting for output space to copy string */ -const LIT = 16205; /* o: waiting for output space to write literal */ -const CHECK = 16206; /* i: waiting for 32-bit check value */ -const LENGTH = 16207; /* i: waiting for 32-bit length (gzip) */ -const DONE = 16208; /* finished check, done -- remain here until reset */ -const BAD = 16209; /* got a data error -- remain here until reset */ -const MEM = 16210; /* got an inflate() memory error -- remain here until reset */ -const SYNC = 16211; /* looking for synchronization bytes to restart inflate() */ - -/* ===========================================================================*/ - - - -const ENOUGH_LENS = 852; -const ENOUGH_DISTS = 592; -//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); - -const MAX_WBITS = 15; -/* 32K LZ77 window */ -const DEF_WBITS = MAX_WBITS; - - -const zswap32 = (q) => { - - return (((q >>> 24) & 0xff) + - ((q >>> 8) & 0xff00) + - ((q & 0xff00) << 8) + - ((q & 0xff) << 24)); -}; - - -function InflateState() { - this.strm = null; /* pointer back to this zlib stream */ - this.mode = 0; /* current inflate mode */ - this.last = false; /* true if processing last block */ - this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip, - bit 2 true to validate check value */ - this.havedict = false; /* true if dictionary provided */ - this.flags = 0; /* gzip header method and flags (0 if zlib), or - -1 if raw or no header yet */ - this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */ - this.check = 0; /* protected copy of check value */ - this.total = 0; /* protected copy of output count */ - // TODO: may be {} - this.head = null; /* where to save gzip header information */ - - /* sliding window */ - this.wbits = 0; /* log base 2 of requested window size */ - this.wsize = 0; /* window size or zero if not using window */ - this.whave = 0; /* valid bytes in the window */ - this.wnext = 0; /* window write index */ - this.window = null; /* allocated sliding window, if needed */ - - /* bit accumulator */ - this.hold = 0; /* input bit accumulator */ - this.bits = 0; /* number of bits in "in" */ - - /* for string and stored block copying */ - this.length = 0; /* literal or length of data to copy */ - this.offset = 0; /* distance back to copy string from */ - - /* for table and code decoding */ - this.extra = 0; /* extra bits needed */ - - /* fixed and dynamic code tables */ - this.lencode = null; /* starting table for length/literal codes */ - this.distcode = null; /* starting table for distance codes */ - this.lenbits = 0; /* index bits for lencode */ - this.distbits = 0; /* index bits for distcode */ - - /* dynamic table building */ - this.ncode = 0; /* number of code length code lengths */ - this.nlen = 0; /* number of length code lengths */ - this.ndist = 0; /* number of distance code lengths */ - this.have = 0; /* number of code lengths in lens[] */ - this.next = null; /* next available space in codes[] */ - - this.lens = new Uint16Array(320); /* temporary storage for code lengths */ - this.work = new Uint16Array(288); /* work area for code table building */ - - /* - because we don't have pointers in js, we use lencode and distcode directly - as buffers so we don't need codes - */ - //this.codes = new Int32Array(ENOUGH); /* space for code tables */ - this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */ - this.distdyn = null; /* dynamic table for distance codes (JS specific) */ - this.sane = 0; /* if false, allow invalid distance too far */ - this.back = 0; /* bits back of last unprocessed length/lit */ - this.was = 0; /* initial length of match */ -} - - -const inflateStateCheck = (strm) => { - - if (!strm) { - return 1; - } - const state = strm.state; - if (!state || state.strm !== strm || - state.mode < HEAD || state.mode > SYNC) { - return 1; - } - return 0; -}; - - -const inflateResetKeep = (strm) => { - - if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; } - const state = strm.state; - strm.total_in = strm.total_out = state.total = 0; - strm.msg = ''; /*Z_NULL*/ - if (state.wrap) { /* to support ill-conceived Java test suite */ - strm.adler = state.wrap & 1; - } - state.mode = HEAD; - state.last = 0; - state.havedict = 0; - state.flags = -1; - state.dmax = 32768; - state.head = null/*Z_NULL*/; - state.hold = 0; - state.bits = 0; - //state.lencode = state.distcode = state.next = state.codes; - state.lencode = state.lendyn = new Int32Array(ENOUGH_LENS); - state.distcode = state.distdyn = new Int32Array(ENOUGH_DISTS); - - state.sane = 1; - state.back = -1; - //Tracev((stderr, "inflate: reset\n")); - return Z_OK$1; -}; - - -const inflateReset = (strm) => { - - if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; } - const state = strm.state; - state.wsize = 0; - state.whave = 0; - state.wnext = 0; - return inflateResetKeep(strm); - -}; - - -const inflateReset2 = (strm, windowBits) => { - let wrap; - - /* get the state */ - if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; } - const state = strm.state; - - /* extract wrap request from windowBits parameter */ - if (windowBits < 0) { - wrap = 0; - windowBits = -windowBits; - } - else { - wrap = (windowBits >> 4) + 5; - if (windowBits < 48) { - windowBits &= 15; - } - } - - /* set number of window bits, free window if different */ - if (windowBits && (windowBits < 8 || windowBits > 15)) { - return Z_STREAM_ERROR$1; - } - if (state.window !== null && state.wbits !== windowBits) { - state.window = null; - } - - /* update state and reset the rest of it */ - state.wrap = wrap; - state.wbits = windowBits; - return inflateReset(strm); -}; - - -const inflateInit2 = (strm, windowBits) => { - - if (!strm) { return Z_STREAM_ERROR$1; } - //strm.msg = Z_NULL; /* in case we return an error */ - - const state = new InflateState(); - - //if (state === Z_NULL) return Z_MEM_ERROR; - //Tracev((stderr, "inflate: allocated\n")); - strm.state = state; - state.strm = strm; - state.window = null/*Z_NULL*/; - state.mode = HEAD; /* to pass state test in inflateReset2() */ - const ret = inflateReset2(strm, windowBits); - if (ret !== Z_OK$1) { - strm.state = null/*Z_NULL*/; - } - return ret; -}; - - -const inflateInit = (strm) => { - - return inflateInit2(strm, DEF_WBITS); -}; - - -/* - Return state with length and distance decoding tables and index sizes set to - fixed code decoding. Normally this returns fixed tables from inffixed.h. - If BUILDFIXED is defined, then instead this routine builds the tables the - first time it's called, and returns those tables the first time and - thereafter. This reduces the size of the code by about 2K bytes, in - exchange for a little execution time. However, BUILDFIXED should not be - used for threaded applications, since the rewriting of the tables and virgin - may not be thread-safe. - */ -let virgin = true; - -let lenfix, distfix; // We have no pointers in JS, so keep tables separate - - -const fixedtables = (state) => { - - /* build fixed huffman tables if first call (may not be thread safe) */ - if (virgin) { - lenfix = new Int32Array(512); - distfix = new Int32Array(32); - - /* literal/length table */ - let sym = 0; - while (sym < 144) { state.lens[sym++] = 8; } - while (sym < 256) { state.lens[sym++] = 9; } - while (sym < 280) { state.lens[sym++] = 7; } - while (sym < 288) { state.lens[sym++] = 8; } - - inftrees(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 }); - - /* distance table */ - sym = 0; - while (sym < 32) { state.lens[sym++] = 5; } - - inftrees(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 }); - - /* do this just once */ - virgin = false; - } - - state.lencode = lenfix; - state.lenbits = 9; - state.distcode = distfix; - state.distbits = 5; -}; - - -/* - Update the window with the last wsize (normally 32K) bytes written before - returning. If window does not exist yet, create it. This is only called - when a window is already in use, or when output has been written during this - inflate call, but the end of the deflate stream has not been reached yet. - It is also called to create a window for dictionary data when a dictionary - is loaded. - - Providing output buffers larger than 32K to inflate() should provide a speed - advantage, since only the last 32K of output is copied to the sliding window - upon return from inflate(), and since all distances after the first 32K of - output will fall in the output data, making match copies simpler and faster. - The advantage may be dependent on the size of the processor's data caches. - */ -const updatewindow = (strm, src, end, copy) => { - - let dist; - const state = strm.state; - - /* if it hasn't been done already, allocate space for the window */ - if (state.window === null) { - state.wsize = 1 << state.wbits; - state.wnext = 0; - state.whave = 0; - - state.window = new Uint8Array(state.wsize); - } - - /* copy state->wsize or less output bytes into the circular window */ - if (copy >= state.wsize) { - state.window.set(src.subarray(end - state.wsize, end), 0); - state.wnext = 0; - state.whave = state.wsize; - } - else { - dist = state.wsize - state.wnext; - if (dist > copy) { - dist = copy; - } - //zmemcpy(state->window + state->wnext, end - copy, dist); - state.window.set(src.subarray(end - copy, end - copy + dist), state.wnext); - copy -= dist; - if (copy) { - //zmemcpy(state->window, end - copy, copy); - state.window.set(src.subarray(end - copy, end), 0); - state.wnext = copy; - state.whave = state.wsize; - } - else { - state.wnext += dist; - if (state.wnext === state.wsize) { state.wnext = 0; } - if (state.whave < state.wsize) { state.whave += dist; } - } - } - return 0; -}; - - -const inflate$2 = (strm, flush) => { - - let state; - let input, output; // input/output buffers - let next; /* next input INDEX */ - let put; /* next output INDEX */ - let have, left; /* available input and output */ - let hold; /* bit buffer */ - let bits; /* bits in bit buffer */ - let _in, _out; /* save starting available input and output */ - let copy; /* number of stored or match bytes to copy */ - let from; /* where to copy match bytes from */ - let from_source; - let here = 0; /* current decoding table entry */ - let here_bits, here_op, here_val; // paked "here" denormalized (JS specific) - //let last; /* parent table entry */ - let last_bits, last_op, last_val; // paked "last" denormalized (JS specific) - let len; /* length to copy for repeats, bits to drop */ - let ret; /* return code */ - const hbuf = new Uint8Array(4); /* buffer for gzip header crc calculation */ - let opts; - - let n; // temporary variable for NEED_BITS - - const order = /* permutation of code lengths */ - new Uint8Array([ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]); - - - if (inflateStateCheck(strm) || !strm.output || - (!strm.input && strm.avail_in !== 0)) { - return Z_STREAM_ERROR$1; - } - - state = strm.state; - if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */ - - - //--- LOAD() --- - put = strm.next_out; - output = strm.output; - left = strm.avail_out; - next = strm.next_in; - input = strm.input; - have = strm.avail_in; - hold = state.hold; - bits = state.bits; - //--- - - _in = have; - _out = left; - ret = Z_OK$1; - - inf_leave: // goto emulation - for (;;) { - switch (state.mode) { - case HEAD: - if (state.wrap === 0) { - state.mode = TYPEDO; - break; - } - //=== NEEDBITS(16); - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */ - if (state.wbits === 0) { - state.wbits = 15; - } - state.check = 0/*crc32(0L, Z_NULL, 0)*/; - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - state.check = crc32_1(state.check, hbuf, 2, 0); - //===// - - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = FLAGS; - break; - } - if (state.head) { - state.head.done = false; - } - if (!(state.wrap & 1) || /* check if zlib header allowed */ - (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) { - strm.msg = 'incorrect header check'; - state.mode = BAD; - break; - } - if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) { - strm.msg = 'unknown compression method'; - state.mode = BAD; - break; - } - //--- DROPBITS(4) ---// - hold >>>= 4; - bits -= 4; - //---// - len = (hold & 0x0f)/*BITS(4)*/ + 8; - if (state.wbits === 0) { - state.wbits = len; - } - if (len > 15 || len > state.wbits) { - strm.msg = 'invalid window size'; - state.mode = BAD; - break; - } - - // !!! pako patch. Force use `options.windowBits` if passed. - // Required to always use max window size by default. - state.dmax = 1 << state.wbits; - //state.dmax = 1 << len; - - state.flags = 0; /* indicate zlib header */ - //Tracev((stderr, "inflate: zlib header ok\n")); - strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; - state.mode = hold & 0x200 ? DICTID : TYPE; - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - break; - case FLAGS: - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.flags = hold; - if ((state.flags & 0xff) !== Z_DEFLATED) { - strm.msg = 'unknown compression method'; - state.mode = BAD; - break; - } - if (state.flags & 0xe000) { - strm.msg = 'unknown header flags set'; - state.mode = BAD; - break; - } - if (state.head) { - state.head.text = ((hold >> 8) & 1); - } - if ((state.flags & 0x0200) && (state.wrap & 4)) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - state.check = crc32_1(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = TIME; - /* falls through */ - case TIME: - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (state.head) { - state.head.time = hold; - } - if ((state.flags & 0x0200) && (state.wrap & 4)) { - //=== CRC4(state.check, hold) - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - hbuf[2] = (hold >>> 16) & 0xff; - hbuf[3] = (hold >>> 24) & 0xff; - state.check = crc32_1(state.check, hbuf, 4, 0); - //=== - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = OS; - /* falls through */ - case OS: - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (state.head) { - state.head.xflags = (hold & 0xff); - state.head.os = (hold >> 8); - } - if ((state.flags & 0x0200) && (state.wrap & 4)) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - state.check = crc32_1(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = EXLEN; - /* falls through */ - case EXLEN: - if (state.flags & 0x0400) { - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.length = hold; - if (state.head) { - state.head.extra_len = hold; - } - if ((state.flags & 0x0200) && (state.wrap & 4)) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - state.check = crc32_1(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - } - else if (state.head) { - state.head.extra = null/*Z_NULL*/; - } - state.mode = EXTRA; - /* falls through */ - case EXTRA: - if (state.flags & 0x0400) { - copy = state.length; - if (copy > have) { copy = have; } - if (copy) { - if (state.head) { - len = state.head.extra_len - state.length; - if (!state.head.extra) { - // Use untyped array for more convenient processing later - state.head.extra = new Uint8Array(state.head.extra_len); - } - state.head.extra.set( - input.subarray( - next, - // extra field is limited to 65536 bytes - // - no need for additional size check - next + copy - ), - /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/ - len - ); - //zmemcpy(state.head.extra + len, next, - // len + copy > state.head.extra_max ? - // state.head.extra_max - len : copy); - } - if ((state.flags & 0x0200) && (state.wrap & 4)) { - state.check = crc32_1(state.check, input, copy, next); - } - have -= copy; - next += copy; - state.length -= copy; - } - if (state.length) { break inf_leave; } - } - state.length = 0; - state.mode = NAME; - /* falls through */ - case NAME: - if (state.flags & 0x0800) { - if (have === 0) { break inf_leave; } - copy = 0; - do { - // TODO: 2 or 1 bytes? - len = input[next + copy++]; - /* use constant limit because in js we should not preallocate memory */ - if (state.head && len && - (state.length < 65536 /*state.head.name_max*/)) { - state.head.name += String.fromCharCode(len); - } - } while (len && copy < have); - - if ((state.flags & 0x0200) && (state.wrap & 4)) { - state.check = crc32_1(state.check, input, copy, next); - } - have -= copy; - next += copy; - if (len) { break inf_leave; } - } - else if (state.head) { - state.head.name = null; - } - state.length = 0; - state.mode = COMMENT; - /* falls through */ - case COMMENT: - if (state.flags & 0x1000) { - if (have === 0) { break inf_leave; } - copy = 0; - do { - len = input[next + copy++]; - /* use constant limit because in js we should not preallocate memory */ - if (state.head && len && - (state.length < 65536 /*state.head.comm_max*/)) { - state.head.comment += String.fromCharCode(len); - } - } while (len && copy < have); - if ((state.flags & 0x0200) && (state.wrap & 4)) { - state.check = crc32_1(state.check, input, copy, next); - } - have -= copy; - next += copy; - if (len) { break inf_leave; } - } - else if (state.head) { - state.head.comment = null; - } - state.mode = HCRC; - /* falls through */ - case HCRC: - if (state.flags & 0x0200) { - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if ((state.wrap & 4) && hold !== (state.check & 0xffff)) { - strm.msg = 'header crc mismatch'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - } - if (state.head) { - state.head.hcrc = ((state.flags >> 9) & 1); - state.head.done = true; - } - strm.adler = state.check = 0; - state.mode = TYPE; - break; - case DICTID: - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - strm.adler = state.check = zswap32(hold); - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = DICT; - /* falls through */ - case DICT: - if (state.havedict === 0) { - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - return Z_NEED_DICT$1; - } - strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; - state.mode = TYPE; - /* falls through */ - case TYPE: - if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; } - /* falls through */ - case TYPEDO: - if (state.last) { - //--- BYTEBITS() ---// - hold >>>= bits & 7; - bits -= bits & 7; - //---// - state.mode = CHECK; - break; - } - //=== NEEDBITS(3); */ - while (bits < 3) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.last = (hold & 0x01)/*BITS(1)*/; - //--- DROPBITS(1) ---// - hold >>>= 1; - bits -= 1; - //---// - - switch ((hold & 0x03)/*BITS(2)*/) { - case 0: /* stored block */ - //Tracev((stderr, "inflate: stored block%s\n", - // state.last ? " (last)" : "")); - state.mode = STORED; - break; - case 1: /* fixed block */ - fixedtables(state); - //Tracev((stderr, "inflate: fixed codes block%s\n", - // state.last ? " (last)" : "")); - state.mode = LEN_; /* decode codes */ - if (flush === Z_TREES) { - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - break inf_leave; - } - break; - case 2: /* dynamic block */ - //Tracev((stderr, "inflate: dynamic codes block%s\n", - // state.last ? " (last)" : "")); - state.mode = TABLE; - break; - case 3: - strm.msg = 'invalid block type'; - state.mode = BAD; - } - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - break; - case STORED: - //--- BYTEBITS() ---// /* go to byte boundary */ - hold >>>= bits & 7; - bits -= bits & 7; - //---// - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) { - strm.msg = 'invalid stored block lengths'; - state.mode = BAD; - break; - } - state.length = hold & 0xffff; - //Tracev((stderr, "inflate: stored length %u\n", - // state.length)); - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = COPY_; - if (flush === Z_TREES) { break inf_leave; } - /* falls through */ - case COPY_: - state.mode = COPY; - /* falls through */ - case COPY: - copy = state.length; - if (copy) { - if (copy > have) { copy = have; } - if (copy > left) { copy = left; } - if (copy === 0) { break inf_leave; } - //--- zmemcpy(put, next, copy); --- - output.set(input.subarray(next, next + copy), put); - //---// - have -= copy; - next += copy; - left -= copy; - put += copy; - state.length -= copy; - break; - } - //Tracev((stderr, "inflate: stored end\n")); - state.mode = TYPE; - break; - case TABLE: - //=== NEEDBITS(14); */ - while (bits < 14) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257; - //--- DROPBITS(5) ---// - hold >>>= 5; - bits -= 5; - //---// - state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1; - //--- DROPBITS(5) ---// - hold >>>= 5; - bits -= 5; - //---// - state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4; - //--- DROPBITS(4) ---// - hold >>>= 4; - bits -= 4; - //---// -//#ifndef PKZIP_BUG_WORKAROUND - if (state.nlen > 286 || state.ndist > 30) { - strm.msg = 'too many length or distance symbols'; - state.mode = BAD; - break; - } -//#endif - //Tracev((stderr, "inflate: table sizes ok\n")); - state.have = 0; - state.mode = LENLENS; - /* falls through */ - case LENLENS: - while (state.have < state.ncode) { - //=== NEEDBITS(3); - while (bits < 3) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.lens[order[state.have++]] = (hold & 0x07);//BITS(3); - //--- DROPBITS(3) ---// - hold >>>= 3; - bits -= 3; - //---// - } - while (state.have < 19) { - state.lens[order[state.have++]] = 0; - } - // We have separate tables & no pointers. 2 commented lines below not needed. - //state.next = state.codes; - //state.lencode = state.next; - // Switch to use dynamic table - state.lencode = state.lendyn; - state.lenbits = 7; - - opts = { bits: state.lenbits }; - ret = inftrees(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts); - state.lenbits = opts.bits; - - if (ret) { - strm.msg = 'invalid code lengths set'; - state.mode = BAD; - break; - } - //Tracev((stderr, "inflate: code lengths ok\n")); - state.have = 0; - state.mode = CODELENS; - /* falls through */ - case CODELENS: - while (state.have < state.nlen + state.ndist) { - for (;;) { - here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/ - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if ((here_bits) <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - if (here_val < 16) { - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.lens[state.have++] = here_val; - } - else { - if (here_val === 16) { - //=== NEEDBITS(here.bits + 2); - n = here_bits + 2; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - if (state.have === 0) { - strm.msg = 'invalid bit length repeat'; - state.mode = BAD; - break; - } - len = state.lens[state.have - 1]; - copy = 3 + (hold & 0x03);//BITS(2); - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - } - else if (here_val === 17) { - //=== NEEDBITS(here.bits + 3); - n = here_bits + 3; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - len = 0; - copy = 3 + (hold & 0x07);//BITS(3); - //--- DROPBITS(3) ---// - hold >>>= 3; - bits -= 3; - //---// - } - else { - //=== NEEDBITS(here.bits + 7); - n = here_bits + 7; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - len = 0; - copy = 11 + (hold & 0x7f);//BITS(7); - //--- DROPBITS(7) ---// - hold >>>= 7; - bits -= 7; - //---// - } - if (state.have + copy > state.nlen + state.ndist) { - strm.msg = 'invalid bit length repeat'; - state.mode = BAD; - break; - } - while (copy--) { - state.lens[state.have++] = len; - } - } - } - - /* handle error breaks in while */ - if (state.mode === BAD) { break; } - - /* check for end-of-block code (better have one) */ - if (state.lens[256] === 0) { - strm.msg = 'invalid code -- missing end-of-block'; - state.mode = BAD; - break; - } - - /* build code tables -- note: do not change the lenbits or distbits - values here (9 and 6) without reading the comments in inftrees.h - concerning the ENOUGH constants, which depend on those values */ - state.lenbits = 9; - - opts = { bits: state.lenbits }; - ret = inftrees(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts); - // We have separate tables & no pointers. 2 commented lines below not needed. - // state.next_index = opts.table_index; - state.lenbits = opts.bits; - // state.lencode = state.next; - - if (ret) { - strm.msg = 'invalid literal/lengths set'; - state.mode = BAD; - break; - } - - state.distbits = 6; - //state.distcode.copy(state.codes); - // Switch to use dynamic table - state.distcode = state.distdyn; - opts = { bits: state.distbits }; - ret = inftrees(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts); - // We have separate tables & no pointers. 2 commented lines below not needed. - // state.next_index = opts.table_index; - state.distbits = opts.bits; - // state.distcode = state.next; - - if (ret) { - strm.msg = 'invalid distances set'; - state.mode = BAD; - break; - } - //Tracev((stderr, 'inflate: codes ok\n')); - state.mode = LEN_; - if (flush === Z_TREES) { break inf_leave; } - /* falls through */ - case LEN_: - state.mode = LEN; - /* falls through */ - case LEN: - if (have >= 6 && left >= 258) { - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - inffast(strm, _out); - //--- LOAD() --- - put = strm.next_out; - output = strm.output; - left = strm.avail_out; - next = strm.next_in; - input = strm.input; - have = strm.avail_in; - hold = state.hold; - bits = state.bits; - //--- - - if (state.mode === TYPE) { - state.back = -1; - } - break; - } - state.back = 0; - for (;;) { - here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/ - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if (here_bits <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - if (here_op && (here_op & 0xf0) === 0) { - last_bits = here_bits; - last_op = here_op; - last_val = here_val; - for (;;) { - here = state.lencode[last_val + - ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)]; - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if ((last_bits + here_bits) <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - //--- DROPBITS(last.bits) ---// - hold >>>= last_bits; - bits -= last_bits; - //---// - state.back += last_bits; - } - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.back += here_bits; - state.length = here_val; - if (here_op === 0) { - //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - // "inflate: literal '%c'\n" : - // "inflate: literal 0x%02x\n", here.val)); - state.mode = LIT; - break; - } - if (here_op & 32) { - //Tracevv((stderr, "inflate: end of block\n")); - state.back = -1; - state.mode = TYPE; - break; - } - if (here_op & 64) { - strm.msg = 'invalid literal/length code'; - state.mode = BAD; - break; - } - state.extra = here_op & 15; - state.mode = LENEXT; - /* falls through */ - case LENEXT: - if (state.extra) { - //=== NEEDBITS(state.extra); - n = state.extra; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/; - //--- DROPBITS(state.extra) ---// - hold >>>= state.extra; - bits -= state.extra; - //---// - state.back += state.extra; - } - //Tracevv((stderr, "inflate: length %u\n", state.length)); - state.was = state.length; - state.mode = DIST; - /* falls through */ - case DIST: - for (;;) { - here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/ - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if ((here_bits) <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - if ((here_op & 0xf0) === 0) { - last_bits = here_bits; - last_op = here_op; - last_val = here_val; - for (;;) { - here = state.distcode[last_val + - ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)]; - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if ((last_bits + here_bits) <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - //--- DROPBITS(last.bits) ---// - hold >>>= last_bits; - bits -= last_bits; - //---// - state.back += last_bits; - } - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.back += here_bits; - if (here_op & 64) { - strm.msg = 'invalid distance code'; - state.mode = BAD; - break; - } - state.offset = here_val; - state.extra = (here_op) & 15; - state.mode = DISTEXT; - /* falls through */ - case DISTEXT: - if (state.extra) { - //=== NEEDBITS(state.extra); - n = state.extra; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/; - //--- DROPBITS(state.extra) ---// - hold >>>= state.extra; - bits -= state.extra; - //---// - state.back += state.extra; - } -//#ifdef INFLATE_STRICT - if (state.offset > state.dmax) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break; - } -//#endif - //Tracevv((stderr, "inflate: distance %u\n", state.offset)); - state.mode = MATCH; - /* falls through */ - case MATCH: - if (left === 0) { break inf_leave; } - copy = _out - left; - if (state.offset > copy) { /* copy from window */ - copy = state.offset - copy; - if (copy > state.whave) { - if (state.sane) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break; - } -// (!) This block is disabled in zlib defaults, -// don't enable it for binary compatibility -//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR -// Trace((stderr, "inflate.c too far\n")); -// copy -= state.whave; -// if (copy > state.length) { copy = state.length; } -// if (copy > left) { copy = left; } -// left -= copy; -// state.length -= copy; -// do { -// output[put++] = 0; -// } while (--copy); -// if (state.length === 0) { state.mode = LEN; } -// break; -//#endif - } - if (copy > state.wnext) { - copy -= state.wnext; - from = state.wsize - copy; - } - else { - from = state.wnext - copy; - } - if (copy > state.length) { copy = state.length; } - from_source = state.window; - } - else { /* copy from output */ - from_source = output; - from = put - state.offset; - copy = state.length; - } - if (copy > left) { copy = left; } - left -= copy; - state.length -= copy; - do { - output[put++] = from_source[from++]; - } while (--copy); - if (state.length === 0) { state.mode = LEN; } - break; - case LIT: - if (left === 0) { break inf_leave; } - output[put++] = state.length; - left--; - state.mode = LEN; - break; - case CHECK: - if (state.wrap) { - //=== NEEDBITS(32); - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - // Use '|' instead of '+' to make sure that result is signed - hold |= input[next++] << bits; - bits += 8; - } - //===// - _out -= left; - strm.total_out += _out; - state.total += _out; - if ((state.wrap & 4) && _out) { - strm.adler = state.check = - /*UPDATE_CHECK(state.check, put - _out, _out);*/ - (state.flags ? crc32_1(state.check, output, _out, put - _out) : adler32_1(state.check, output, _out, put - _out)); - - } - _out = left; - // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too - if ((state.wrap & 4) && (state.flags ? hold : zswap32(hold)) !== state.check) { - strm.msg = 'incorrect data check'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - //Tracev((stderr, "inflate: check matches trailer\n")); - } - state.mode = LENGTH; - /* falls through */ - case LENGTH: - if (state.wrap && state.flags) { - //=== NEEDBITS(32); - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if ((state.wrap & 4) && hold !== (state.total & 0xffffffff)) { - strm.msg = 'incorrect length check'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - //Tracev((stderr, "inflate: length matches trailer\n")); - } - state.mode = DONE; - /* falls through */ - case DONE: - ret = Z_STREAM_END$1; - break inf_leave; - case BAD: - ret = Z_DATA_ERROR$1; - break inf_leave; - case MEM: - return Z_MEM_ERROR$1; - case SYNC: - /* falls through */ - default: - return Z_STREAM_ERROR$1; - } - } - - // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave" - - /* - Return from inflate(), updating the total counts and the check value. - If there was no progress during the inflate() call, return a buffer - error. Call updatewindow() to create and/or update the window state. - Note: a memory error from inflate() is non-recoverable. - */ - - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - - if (state.wsize || (_out !== strm.avail_out && state.mode < BAD && - (state.mode < CHECK || flush !== Z_FINISH$1))) { - if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) ; - } - _in -= strm.avail_in; - _out -= strm.avail_out; - strm.total_in += _in; - strm.total_out += _out; - state.total += _out; - if ((state.wrap & 4) && _out) { - strm.adler = state.check = /*UPDATE_CHECK(state.check, strm.next_out - _out, _out);*/ - (state.flags ? crc32_1(state.check, output, _out, strm.next_out - _out) : adler32_1(state.check, output, _out, strm.next_out - _out)); - } - strm.data_type = state.bits + (state.last ? 64 : 0) + - (state.mode === TYPE ? 128 : 0) + - (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0); - if (((_in === 0 && _out === 0) || flush === Z_FINISH$1) && ret === Z_OK$1) { - ret = Z_BUF_ERROR; - } - return ret; -}; - - -const inflateEnd = (strm) => { - - if (inflateStateCheck(strm)) { - return Z_STREAM_ERROR$1; - } - - let state = strm.state; - if (state.window) { - state.window = null; - } - strm.state = null; - return Z_OK$1; -}; - - -const inflateGetHeader = (strm, head) => { - - /* check state */ - if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; } - const state = strm.state; - if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR$1; } - - /* save header structure */ - state.head = head; - head.done = false; - return Z_OK$1; -}; - - -const inflateSetDictionary = (strm, dictionary) => { - const dictLength = dictionary.length; - - let state; - let dictid; - let ret; - - /* check state */ - if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; } - state = strm.state; - - if (state.wrap !== 0 && state.mode !== DICT) { - return Z_STREAM_ERROR$1; - } - - /* check for correct dictionary identifier */ - if (state.mode === DICT) { - dictid = 1; /* adler32(0, null, 0)*/ - /* dictid = adler32(dictid, dictionary, dictLength); */ - dictid = adler32_1(dictid, dictionary, dictLength, 0); - if (dictid !== state.check) { - return Z_DATA_ERROR$1; - } - } - /* copy dictionary to window using updatewindow(), which will amend the - existing dictionary if appropriate */ - ret = updatewindow(strm, dictionary, dictLength, dictLength); - if (ret) { - state.mode = MEM; - return Z_MEM_ERROR$1; - } - state.havedict = 1; - // Tracev((stderr, "inflate: dictionary set\n")); - return Z_OK$1; -}; - - -var inflateReset_1 = inflateReset; -var inflateReset2_1 = inflateReset2; -var inflateResetKeep_1 = inflateResetKeep; -var inflateInit_1 = inflateInit; -var inflateInit2_1 = inflateInit2; -var inflate_2$1 = inflate$2; -var inflateEnd_1 = inflateEnd; -var inflateGetHeader_1 = inflateGetHeader; -var inflateSetDictionary_1 = inflateSetDictionary; -var inflateInfo = 'pako inflate (from Nodeca project)'; - -/* Not implemented -module.exports.inflateCodesUsed = inflateCodesUsed; -module.exports.inflateCopy = inflateCopy; -module.exports.inflateGetDictionary = inflateGetDictionary; -module.exports.inflateMark = inflateMark; -module.exports.inflatePrime = inflatePrime; -module.exports.inflateSync = inflateSync; -module.exports.inflateSyncPoint = inflateSyncPoint; -module.exports.inflateUndermine = inflateUndermine; -module.exports.inflateValidate = inflateValidate; -*/ - -var inflate_1$2 = { - inflateReset: inflateReset_1, - inflateReset2: inflateReset2_1, - inflateResetKeep: inflateResetKeep_1, - inflateInit: inflateInit_1, - inflateInit2: inflateInit2_1, - inflate: inflate_2$1, - inflateEnd: inflateEnd_1, - inflateGetHeader: inflateGetHeader_1, - inflateSetDictionary: inflateSetDictionary_1, - inflateInfo: inflateInfo -}; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -function GZheader() { - /* true if compressed data believed to be text */ - this.text = 0; - /* modification time */ - this.time = 0; - /* extra flags (not used when writing a gzip file) */ - this.xflags = 0; - /* operating system */ - this.os = 0; - /* pointer to extra field or Z_NULL if none */ - this.extra = null; - /* extra field length (valid if extra != Z_NULL) */ - this.extra_len = 0; // Actually, we don't need it in JS, - // but leave for few code modifications - - // - // Setup limits is not necessary because in js we should not preallocate memory - // for inflate use constant limit in 65536 bytes - // - - /* space at extra (only when reading header) */ - // this.extra_max = 0; - /* pointer to zero-terminated file name or Z_NULL */ - this.name = ''; - /* space at name (only when reading header) */ - // this.name_max = 0; - /* pointer to zero-terminated comment or Z_NULL */ - this.comment = ''; - /* space at comment (only when reading header) */ - // this.comm_max = 0; - /* true if there was or will be a header crc */ - this.hcrc = 0; - /* true when done reading gzip header (not used when writing a gzip file) */ - this.done = false; -} - -var gzheader = GZheader; - -const toString = Object.prototype.toString; - -/* Public constants ==========================================================*/ -/* ===========================================================================*/ - -const { - Z_NO_FLUSH, Z_FINISH, - Z_OK, Z_STREAM_END, Z_NEED_DICT, Z_STREAM_ERROR, Z_DATA_ERROR, Z_MEM_ERROR -} = constants$2; - -/* ===========================================================================*/ - - -/** - * class Inflate - * - * Generic JS-style wrapper for zlib calls. If you don't need - * streaming behaviour - use more simple functions: [[inflate]] - * and [[inflateRaw]]. - **/ - -/* internal - * inflate.chunks -> Array - * - * Chunks of output data, if [[Inflate#onData]] not overridden. - **/ - -/** - * Inflate.result -> Uint8Array|String - * - * Uncompressed result, generated by default [[Inflate#onData]] - * and [[Inflate#onEnd]] handlers. Filled after you push last chunk - * (call [[Inflate#push]] with `Z_FINISH` / `true` param). - **/ - -/** - * Inflate.err -> Number - * - * Error code after inflate finished. 0 (Z_OK) on success. - * Should be checked if broken data possible. - **/ - -/** - * Inflate.msg -> String - * - * Error message, if [[Inflate.err]] != 0 - **/ - - -/** - * new Inflate(options) - * - options (Object): zlib inflate options. - * - * Creates new inflator instance with specified params. Throws exception - * on bad params. Supported options: - * - * - `windowBits` - * - `dictionary` - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information on these. - * - * Additional options, for internal needs: - * - * - `chunkSize` - size of generated data chunks (16K by default) - * - `raw` (Boolean) - do raw inflate - * - `to` (String) - if equal to 'string', then result will be converted - * from utf8 to utf16 (javascript) string. When string output requested, - * chunk length can differ from `chunkSize`, depending on content. - * - * By default, when no options set, autodetect deflate/gzip data format via - * wrapper header. - * - * ##### Example: - * - * ```javascript - * const pako = require('pako') - * const chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9]) - * const chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]); - * - * const inflate = new pako.Inflate({ level: 3}); - * - * inflate.push(chunk1, false); - * inflate.push(chunk2, true); // true -> last chunk - * - * if (inflate.err) { throw new Error(inflate.err); } - * - * console.log(inflate.result); - * ``` - **/ -function Inflate$1(options) { - this.options = common.assign({ - chunkSize: 1024 * 64, - windowBits: 15, - to: '' - }, options || {}); - - const opt = this.options; - - // Force window size for `raw` data, if not set directly, - // because we have no header for autodetect. - if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) { - opt.windowBits = -opt.windowBits; - if (opt.windowBits === 0) { opt.windowBits = -15; } - } - - // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate - if ((opt.windowBits >= 0) && (opt.windowBits < 16) && - !(options && options.windowBits)) { - opt.windowBits += 32; - } - - // Gzip header has no info about windows size, we can do autodetect only - // for deflate. So, if window size not set, force it to max when gzip possible - if ((opt.windowBits > 15) && (opt.windowBits < 48)) { - // bit 3 (16) -> gzipped data - // bit 4 (32) -> autodetect gzip/deflate - if ((opt.windowBits & 15) === 0) { - opt.windowBits |= 15; - } - } - - this.err = 0; // error code, if happens (0 = Z_OK) - this.msg = ''; // error message - this.ended = false; // used to avoid multiple onEnd() calls - this.chunks = []; // chunks of compressed data - - this.strm = new zstream(); - this.strm.avail_out = 0; - - let status = inflate_1$2.inflateInit2( - this.strm, - opt.windowBits - ); - - if (status !== Z_OK) { - throw new Error(messages[status]); - } - - this.header = new gzheader(); - - inflate_1$2.inflateGetHeader(this.strm, this.header); - - // Setup dictionary - if (opt.dictionary) { - // Convert data if needed - if (typeof opt.dictionary === 'string') { - opt.dictionary = strings.string2buf(opt.dictionary); - } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') { - opt.dictionary = new Uint8Array(opt.dictionary); - } - if (opt.raw) { //In raw mode we need to set the dictionary early - status = inflate_1$2.inflateSetDictionary(this.strm, opt.dictionary); - if (status !== Z_OK) { - throw new Error(messages[status]); - } - } - } -} - -/** - * Inflate#push(data[, flush_mode]) -> Boolean - * - data (Uint8Array|ArrayBuffer): input data - * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE - * flush modes. See constants. Skipped or `false` means Z_NO_FLUSH, - * `true` means Z_FINISH. - * - * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with - * new output chunks. Returns `true` on success. If end of stream detected, - * [[Inflate#onEnd]] will be called. - * - * `flush_mode` is not needed for normal operation, because end of stream - * detected automatically. You may try to use it for advanced things, but - * this functionality was not tested. - * - * On fail call [[Inflate#onEnd]] with error code and return false. - * - * ##### Example - * - * ```javascript - * push(chunk, false); // push one of data chunks - * ... - * push(chunk, true); // push last chunk - * ``` - **/ -Inflate$1.prototype.push = function (data, flush_mode) { - const strm = this.strm; - const chunkSize = this.options.chunkSize; - const dictionary = this.options.dictionary; - let status, _flush_mode, last_avail_out; - - if (this.ended) return false; - - if (flush_mode === ~~flush_mode) _flush_mode = flush_mode; - else _flush_mode = flush_mode === true ? Z_FINISH : Z_NO_FLUSH; - - // Convert data if needed - if (toString.call(data) === '[object ArrayBuffer]') { - strm.input = new Uint8Array(data); - } else { - strm.input = data; - } - - strm.next_in = 0; - strm.avail_in = strm.input.length; - - for (;;) { - if (strm.avail_out === 0) { - strm.output = new Uint8Array(chunkSize); - strm.next_out = 0; - strm.avail_out = chunkSize; - } - - status = inflate_1$2.inflate(strm, _flush_mode); - - if (status === Z_NEED_DICT && dictionary) { - status = inflate_1$2.inflateSetDictionary(strm, dictionary); - - if (status === Z_OK) { - status = inflate_1$2.inflate(strm, _flush_mode); - } else if (status === Z_DATA_ERROR) { - // Replace code with more verbose - status = Z_NEED_DICT; - } - } - - // Skip snyc markers if more data follows and not raw mode - while (strm.avail_in > 0 && - status === Z_STREAM_END && - strm.state.wrap > 0 && - data[strm.next_in] !== 0) - { - inflate_1$2.inflateReset(strm); - status = inflate_1$2.inflate(strm, _flush_mode); - } - - switch (status) { - case Z_STREAM_ERROR: - case Z_DATA_ERROR: - case Z_NEED_DICT: - case Z_MEM_ERROR: - this.onEnd(status); - this.ended = true; - return false; - } - - // Remember real `avail_out` value, because we may patch out buffer content - // to align utf8 strings boundaries. - last_avail_out = strm.avail_out; - - if (strm.next_out) { - if (strm.avail_out === 0 || status === Z_STREAM_END) { - - if (this.options.to === 'string') { - - let next_out_utf8 = strings.utf8border(strm.output, strm.next_out); - - let tail = strm.next_out - next_out_utf8; - let utf8str = strings.buf2string(strm.output, next_out_utf8); - - // move tail & realign counters - strm.next_out = tail; - strm.avail_out = chunkSize - tail; - if (tail) strm.output.set(strm.output.subarray(next_out_utf8, next_out_utf8 + tail), 0); - - this.onData(utf8str); - - } else { - this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out)); - } - } - } - - // Must repeat iteration if out buffer is full - if (status === Z_OK && last_avail_out === 0) continue; - - // Finalize if end of stream reached. - if (status === Z_STREAM_END) { - status = inflate_1$2.inflateEnd(this.strm); - this.onEnd(status); - this.ended = true; - return true; - } - - if (strm.avail_in === 0) break; - } - - return true; -}; - - -/** - * Inflate#onData(chunk) -> Void - * - chunk (Uint8Array|String): output data. When string output requested, - * each chunk will be string. - * - * By default, stores data blocks in `chunks[]` property and glue - * those in `onEnd`. Override this handler, if you need another behaviour. - **/ -Inflate$1.prototype.onData = function (chunk) { - this.chunks.push(chunk); -}; - - -/** - * Inflate#onEnd(status) -> Void - * - status (Number): inflate status. 0 (Z_OK) on success, - * other if not. - * - * Called either after you tell inflate that the input stream is - * complete (Z_FINISH). By default - join collected chunks, - * free memory and fill `results` / `err` properties. - **/ -Inflate$1.prototype.onEnd = function (status) { - // On success - join - if (status === Z_OK) { - if (this.options.to === 'string') { - this.result = this.chunks.join(''); - } else { - this.result = common.flattenChunks(this.chunks); - } - } - this.chunks = []; - this.err = status; - this.msg = this.strm.msg; -}; - - -/** - * inflate(data[, options]) -> Uint8Array|String - * - data (Uint8Array|ArrayBuffer): input data to decompress. - * - options (Object): zlib inflate options. - * - * Decompress `data` with inflate/ungzip and `options`. Autodetect - * format via wrapper header by default. That's why we don't provide - * separate `ungzip` method. - * - * Supported options are: - * - * - windowBits - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information. - * - * Sugar (options): - * - * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify - * negative windowBits implicitly. - * - `to` (String) - if equal to 'string', then result will be converted - * from utf8 to utf16 (javascript) string. When string output requested, - * chunk length can differ from `chunkSize`, depending on content. - * - * - * ##### Example: - * - * ```javascript - * const pako = require('pako'); - * const input = pako.deflate(new Uint8Array([1,2,3,4,5,6,7,8,9])); - * let output; - * - * try { - * output = pako.inflate(input); - * } catch (err) { - * console.log(err); - * } - * ``` - **/ -function inflate$1(input, options) { - const inflator = new Inflate$1(options); - - inflator.push(input); - - // That will never happens, if you don't cheat with options :) - if (inflator.err) throw inflator.msg || messages[inflator.err]; - - return inflator.result; -} - - -/** - * inflateRaw(data[, options]) -> Uint8Array|String - * - data (Uint8Array|ArrayBuffer): input data to decompress. - * - options (Object): zlib inflate options. - * - * The same as [[inflate]], but creates raw data, without wrapper - * (header and adler32 crc). - **/ -function inflateRaw$1(input, options) { - options = options || {}; - options.raw = true; - return inflate$1(input, options); -} - - -/** - * ungzip(data[, options]) -> Uint8Array|String - * - data (Uint8Array|ArrayBuffer): input data to decompress. - * - options (Object): zlib inflate options. - * - * Just shortcut to [[inflate]], because it autodetects format - * by header.content. Done for convenience. - **/ - - -var Inflate_1$1 = Inflate$1; -var inflate_2 = inflate$1; -var inflateRaw_1$1 = inflateRaw$1; -var ungzip$1 = inflate$1; -var constants = constants$2; - -var inflate_1$1 = { - Inflate: Inflate_1$1, - inflate: inflate_2, - inflateRaw: inflateRaw_1$1, - ungzip: ungzip$1, - constants: constants -}; - -const { Deflate, deflate, deflateRaw, gzip } = deflate_1$1; - -const { Inflate, inflate, inflateRaw, ungzip } = inflate_1$1; - - - -var Deflate_1 = Deflate; -var deflate_1 = deflate; -var deflateRaw_1 = deflateRaw; -var gzip_1 = gzip; -var Inflate_1 = Inflate; -var inflate_1 = inflate; -var inflateRaw_1 = inflateRaw; -var ungzip_1 = ungzip; -var constants_1 = constants$2; - -var pako = { - Deflate: Deflate_1, - deflate: deflate_1, - deflateRaw: deflateRaw_1, - gzip: gzip_1, - Inflate: Inflate_1, - inflate: inflate_1, - inflateRaw: inflateRaw_1, - ungzip: ungzip_1, - constants: constants_1 -}; - -export { Deflate_1 as Deflate, Inflate_1 as Inflate, constants_1 as constants, pako as default, deflate_1 as deflate, deflateRaw_1 as deflateRaw, gzip_1 as gzip, inflate_1 as inflate, inflateRaw_1 as inflateRaw, ungzip_1 as ungzip }; diff --git a/node_modules/pako/dist/pako.js b/node_modules/pako/dist/pako.js deleted file mode 100644 index 0c4968d..0000000 --- a/node_modules/pako/dist/pako.js +++ /dev/null @@ -1,6896 +0,0 @@ - -/*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : - typeof define === 'function' && define.amd ? define(['exports'], factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.pako = {})); -})(this, (function (exports) { 'use strict'; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - /* eslint-disable space-unary-ops */ - - /* Public constants ==========================================================*/ - /* ===========================================================================*/ - - - //const Z_FILTERED = 1; - //const Z_HUFFMAN_ONLY = 2; - //const Z_RLE = 3; - const Z_FIXED$1 = 4; - //const Z_DEFAULT_STRATEGY = 0; - - /* Possible values of the data_type field (though see inflate()) */ - const Z_BINARY = 0; - const Z_TEXT = 1; - //const Z_ASCII = 1; // = Z_TEXT - const Z_UNKNOWN$1 = 2; - - /*============================================================================*/ - - - function zero$1(buf) { let len = buf.length; while (--len >= 0) { buf[len] = 0; } } - - // From zutil.h - - const STORED_BLOCK = 0; - const STATIC_TREES = 1; - const DYN_TREES = 2; - /* The three kinds of block type */ - - const MIN_MATCH$1 = 3; - const MAX_MATCH$1 = 258; - /* The minimum and maximum match lengths */ - - // From deflate.h - /* =========================================================================== - * Internal compression state. - */ - - const LENGTH_CODES$1 = 29; - /* number of length codes, not counting the special END_BLOCK code */ - - const LITERALS$1 = 256; - /* number of literal bytes 0..255 */ - - const L_CODES$1 = LITERALS$1 + 1 + LENGTH_CODES$1; - /* number of Literal or Length codes, including the END_BLOCK code */ - - const D_CODES$1 = 30; - /* number of distance codes */ - - const BL_CODES$1 = 19; - /* number of codes used to transfer the bit lengths */ - - const HEAP_SIZE$1 = 2 * L_CODES$1 + 1; - /* maximum heap size */ - - const MAX_BITS$1 = 15; - /* All codes must not exceed MAX_BITS bits */ - - const Buf_size = 16; - /* size of bit buffer in bi_buf */ - - - /* =========================================================================== - * Constants - */ - - const MAX_BL_BITS = 7; - /* Bit length codes must not exceed MAX_BL_BITS bits */ - - const END_BLOCK = 256; - /* end of block literal code */ - - const REP_3_6 = 16; - /* repeat previous bit length 3-6 times (2 bits of repeat count) */ - - const REPZ_3_10 = 17; - /* repeat a zero length 3-10 times (3 bits of repeat count) */ - - const REPZ_11_138 = 18; - /* repeat a zero length 11-138 times (7 bits of repeat count) */ - - /* eslint-disable comma-spacing,array-bracket-spacing */ - const extra_lbits = /* extra bits for each length code */ - new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]); - - const extra_dbits = /* extra bits for each distance code */ - new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]); - - const extra_blbits = /* extra bits for each bit length code */ - new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]); - - const bl_order = - new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]); - /* eslint-enable comma-spacing,array-bracket-spacing */ - - /* The lengths of the bit length codes are sent in order of decreasing - * probability, to avoid transmitting the lengths for unused bit length codes. - */ - - /* =========================================================================== - * Local data. These are initialized only once. - */ - - // We pre-fill arrays with 0 to avoid uninitialized gaps - - const DIST_CODE_LEN = 512; /* see definition of array dist_code below */ - - // !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1 - const static_ltree = new Array((L_CODES$1 + 2) * 2); - zero$1(static_ltree); - /* The static literal tree. Since the bit lengths are imposed, there is no - * need for the L_CODES extra codes used during heap construction. However - * The codes 286 and 287 are needed to build a canonical tree (see _tr_init - * below). - */ - - const static_dtree = new Array(D_CODES$1 * 2); - zero$1(static_dtree); - /* The static distance tree. (Actually a trivial tree since all codes use - * 5 bits.) - */ - - const _dist_code = new Array(DIST_CODE_LEN); - zero$1(_dist_code); - /* Distance codes. The first 256 values correspond to the distances - * 3 .. 258, the last 256 values correspond to the top 8 bits of - * the 15 bit distances. - */ - - const _length_code = new Array(MAX_MATCH$1 - MIN_MATCH$1 + 1); - zero$1(_length_code); - /* length code for each normalized match length (0 == MIN_MATCH) */ - - const base_length = new Array(LENGTH_CODES$1); - zero$1(base_length); - /* First normalized length for each code (0 = MIN_MATCH) */ - - const base_dist = new Array(D_CODES$1); - zero$1(base_dist); - /* First normalized distance for each code (0 = distance of 1) */ - - - function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) { - - this.static_tree = static_tree; /* static tree or NULL */ - this.extra_bits = extra_bits; /* extra bits for each code or NULL */ - this.extra_base = extra_base; /* base index for extra_bits */ - this.elems = elems; /* max number of elements in the tree */ - this.max_length = max_length; /* max bit length for the codes */ - - // show if `static_tree` has data or dummy - needed for monomorphic objects - this.has_stree = static_tree && static_tree.length; - } - - - let static_l_desc; - let static_d_desc; - let static_bl_desc; - - - function TreeDesc(dyn_tree, stat_desc) { - this.dyn_tree = dyn_tree; /* the dynamic tree */ - this.max_code = 0; /* largest code with non zero frequency */ - this.stat_desc = stat_desc; /* the corresponding static tree */ - } - - - - const d_code = (dist) => { - - return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)]; - }; - - - /* =========================================================================== - * Output a short LSB first on the stream. - * IN assertion: there is enough room in pendingBuf. - */ - const put_short = (s, w) => { - // put_byte(s, (uch)((w) & 0xff)); - // put_byte(s, (uch)((ush)(w) >> 8)); - s.pending_buf[s.pending++] = (w) & 0xff; - s.pending_buf[s.pending++] = (w >>> 8) & 0xff; - }; - - - /* =========================================================================== - * Send a value on a given number of bits. - * IN assertion: length <= 16 and value fits in length bits. - */ - const send_bits = (s, value, length) => { - - if (s.bi_valid > (Buf_size - length)) { - s.bi_buf |= (value << s.bi_valid) & 0xffff; - put_short(s, s.bi_buf); - s.bi_buf = value >> (Buf_size - s.bi_valid); - s.bi_valid += length - Buf_size; - } else { - s.bi_buf |= (value << s.bi_valid) & 0xffff; - s.bi_valid += length; - } - }; - - - const send_code = (s, c, tree) => { - - send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/); - }; - - - /* =========================================================================== - * Reverse the first len bits of a code, using straightforward code (a faster - * method would use a table) - * IN assertion: 1 <= len <= 15 - */ - const bi_reverse = (code, len) => { - - let res = 0; - do { - res |= code & 1; - code >>>= 1; - res <<= 1; - } while (--len > 0); - return res >>> 1; - }; - - - /* =========================================================================== - * Flush the bit buffer, keeping at most 7 bits in it. - */ - const bi_flush = (s) => { - - if (s.bi_valid === 16) { - put_short(s, s.bi_buf); - s.bi_buf = 0; - s.bi_valid = 0; - - } else if (s.bi_valid >= 8) { - s.pending_buf[s.pending++] = s.bi_buf & 0xff; - s.bi_buf >>= 8; - s.bi_valid -= 8; - } - }; - - - /* =========================================================================== - * Compute the optimal bit lengths for a tree and update the total bit length - * for the current block. - * IN assertion: the fields freq and dad are set, heap[heap_max] and - * above are the tree nodes sorted by increasing frequency. - * OUT assertions: the field len is set to the optimal bit length, the - * array bl_count contains the frequencies for each bit length. - * The length opt_len is updated; static_len is also updated if stree is - * not null. - */ - const gen_bitlen = (s, desc) => { - // deflate_state *s; - // tree_desc *desc; /* the tree descriptor */ - - const tree = desc.dyn_tree; - const max_code = desc.max_code; - const stree = desc.stat_desc.static_tree; - const has_stree = desc.stat_desc.has_stree; - const extra = desc.stat_desc.extra_bits; - const base = desc.stat_desc.extra_base; - const max_length = desc.stat_desc.max_length; - let h; /* heap index */ - let n, m; /* iterate over the tree elements */ - let bits; /* bit length */ - let xbits; /* extra bits */ - let f; /* frequency */ - let overflow = 0; /* number of elements with bit length too large */ - - for (bits = 0; bits <= MAX_BITS$1; bits++) { - s.bl_count[bits] = 0; - } - - /* In a first pass, compute the optimal bit lengths (which may - * overflow in the case of the bit length tree). - */ - tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */ - - for (h = s.heap_max + 1; h < HEAP_SIZE$1; h++) { - n = s.heap[h]; - bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1; - if (bits > max_length) { - bits = max_length; - overflow++; - } - tree[n * 2 + 1]/*.Len*/ = bits; - /* We overwrite tree[n].Dad which is no longer needed */ - - if (n > max_code) { continue; } /* not a leaf node */ - - s.bl_count[bits]++; - xbits = 0; - if (n >= base) { - xbits = extra[n - base]; - } - f = tree[n * 2]/*.Freq*/; - s.opt_len += f * (bits + xbits); - if (has_stree) { - s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits); - } - } - if (overflow === 0) { return; } - - // Tracev((stderr,"\nbit length overflow\n")); - /* This happens for example on obj2 and pic of the Calgary corpus */ - - /* Find the first bit length which could increase: */ - do { - bits = max_length - 1; - while (s.bl_count[bits] === 0) { bits--; } - s.bl_count[bits]--; /* move one leaf down the tree */ - s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */ - s.bl_count[max_length]--; - /* The brother of the overflow item also moves one step up, - * but this does not affect bl_count[max_length] - */ - overflow -= 2; - } while (overflow > 0); - - /* Now recompute all bit lengths, scanning in increasing frequency. - * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all - * lengths instead of fixing only the wrong ones. This idea is taken - * from 'ar' written by Haruhiko Okumura.) - */ - for (bits = max_length; bits !== 0; bits--) { - n = s.bl_count[bits]; - while (n !== 0) { - m = s.heap[--h]; - if (m > max_code) { continue; } - if (tree[m * 2 + 1]/*.Len*/ !== bits) { - // Tracev((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); - s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/; - tree[m * 2 + 1]/*.Len*/ = bits; - } - n--; - } - } - }; - - - /* =========================================================================== - * Generate the codes for a given tree and bit counts (which need not be - * optimal). - * IN assertion: the array bl_count contains the bit length statistics for - * the given tree and the field len is set for all tree elements. - * OUT assertion: the field code is set for all tree elements of non - * zero code length. - */ - const gen_codes = (tree, max_code, bl_count) => { - // ct_data *tree; /* the tree to decorate */ - // int max_code; /* largest code with non zero frequency */ - // ushf *bl_count; /* number of codes at each bit length */ - - const next_code = new Array(MAX_BITS$1 + 1); /* next code value for each bit length */ - let code = 0; /* running code value */ - let bits; /* bit index */ - let n; /* code index */ - - /* The distribution counts are first used to generate the code values - * without bit reversal. - */ - for (bits = 1; bits <= MAX_BITS$1; bits++) { - code = (code + bl_count[bits - 1]) << 1; - next_code[bits] = code; - } - /* Check that the bit counts in bl_count are consistent. The last code - * must be all ones. - */ - //Assert (code + bl_count[MAX_BITS]-1 == (1< { - - let n; /* iterates over tree elements */ - let bits; /* bit counter */ - let length; /* length value */ - let code; /* code value */ - let dist; /* distance index */ - const bl_count = new Array(MAX_BITS$1 + 1); - /* number of codes at each bit length for an optimal tree */ - - // do check in _tr_init() - //if (static_init_done) return; - - /* For some embedded targets, global variables are not initialized: */ - /*#ifdef NO_INIT_GLOBAL_POINTERS - static_l_desc.static_tree = static_ltree; - static_l_desc.extra_bits = extra_lbits; - static_d_desc.static_tree = static_dtree; - static_d_desc.extra_bits = extra_dbits; - static_bl_desc.extra_bits = extra_blbits; - #endif*/ - - /* Initialize the mapping length (0..255) -> length code (0..28) */ - length = 0; - for (code = 0; code < LENGTH_CODES$1 - 1; code++) { - base_length[code] = length; - for (n = 0; n < (1 << extra_lbits[code]); n++) { - _length_code[length++] = code; - } - } - //Assert (length == 256, "tr_static_init: length != 256"); - /* Note that the length 255 (match length 258) can be represented - * in two different ways: code 284 + 5 bits or code 285, so we - * overwrite length_code[255] to use the best encoding: - */ - _length_code[length - 1] = code; - - /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ - dist = 0; - for (code = 0; code < 16; code++) { - base_dist[code] = dist; - for (n = 0; n < (1 << extra_dbits[code]); n++) { - _dist_code[dist++] = code; - } - } - //Assert (dist == 256, "tr_static_init: dist != 256"); - dist >>= 7; /* from now on, all distances are divided by 128 */ - for (; code < D_CODES$1; code++) { - base_dist[code] = dist << 7; - for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) { - _dist_code[256 + dist++] = code; - } - } - //Assert (dist == 256, "tr_static_init: 256+dist != 512"); - - /* Construct the codes of the static literal tree */ - for (bits = 0; bits <= MAX_BITS$1; bits++) { - bl_count[bits] = 0; - } - - n = 0; - while (n <= 143) { - static_ltree[n * 2 + 1]/*.Len*/ = 8; - n++; - bl_count[8]++; - } - while (n <= 255) { - static_ltree[n * 2 + 1]/*.Len*/ = 9; - n++; - bl_count[9]++; - } - while (n <= 279) { - static_ltree[n * 2 + 1]/*.Len*/ = 7; - n++; - bl_count[7]++; - } - while (n <= 287) { - static_ltree[n * 2 + 1]/*.Len*/ = 8; - n++; - bl_count[8]++; - } - /* Codes 286 and 287 do not exist, but we must include them in the - * tree construction to get a canonical Huffman tree (longest code - * all ones) - */ - gen_codes(static_ltree, L_CODES$1 + 1, bl_count); - - /* The static distance tree is trivial: */ - for (n = 0; n < D_CODES$1; n++) { - static_dtree[n * 2 + 1]/*.Len*/ = 5; - static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5); - } - - // Now data ready and we can init static trees - static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS$1 + 1, L_CODES$1, MAX_BITS$1); - static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES$1, MAX_BITS$1); - static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES$1, MAX_BL_BITS); - - //static_init_done = true; - }; - - - /* =========================================================================== - * Initialize a new block. - */ - const init_block = (s) => { - - let n; /* iterates over tree elements */ - - /* Initialize the trees. */ - for (n = 0; n < L_CODES$1; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; } - for (n = 0; n < D_CODES$1; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; } - for (n = 0; n < BL_CODES$1; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; } - - s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1; - s.opt_len = s.static_len = 0; - s.sym_next = s.matches = 0; - }; - - - /* =========================================================================== - * Flush the bit buffer and align the output on a byte boundary - */ - const bi_windup = (s) => - { - if (s.bi_valid > 8) { - put_short(s, s.bi_buf); - } else if (s.bi_valid > 0) { - //put_byte(s, (Byte)s->bi_buf); - s.pending_buf[s.pending++] = s.bi_buf; - } - s.bi_buf = 0; - s.bi_valid = 0; - }; - - /* =========================================================================== - * Compares to subtrees, using the tree depth as tie breaker when - * the subtrees have equal frequency. This minimizes the worst case length. - */ - const smaller = (tree, n, m, depth) => { - - const _n2 = n * 2; - const _m2 = m * 2; - return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ || - (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m])); - }; - - /* =========================================================================== - * Restore the heap property by moving down the tree starting at node k, - * exchanging a node with the smallest of its two sons if necessary, stopping - * when the heap property is re-established (each father smaller than its - * two sons). - */ - const pqdownheap = (s, tree, k) => { - // deflate_state *s; - // ct_data *tree; /* the tree to restore */ - // int k; /* node to move down */ - - const v = s.heap[k]; - let j = k << 1; /* left son of k */ - while (j <= s.heap_len) { - /* Set j to the smallest of the two sons: */ - if (j < s.heap_len && - smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) { - j++; - } - /* Exit if v is smaller than both sons */ - if (smaller(tree, v, s.heap[j], s.depth)) { break; } - - /* Exchange v with the smallest son */ - s.heap[k] = s.heap[j]; - k = j; - - /* And continue down the tree, setting j to the left son of k */ - j <<= 1; - } - s.heap[k] = v; - }; - - - // inlined manually - // const SMALLEST = 1; - - /* =========================================================================== - * Send the block data compressed using the given Huffman trees - */ - const compress_block = (s, ltree, dtree) => { - // deflate_state *s; - // const ct_data *ltree; /* literal tree */ - // const ct_data *dtree; /* distance tree */ - - let dist; /* distance of matched string */ - let lc; /* match length or unmatched char (if dist == 0) */ - let sx = 0; /* running index in sym_buf */ - let code; /* the code to send */ - let extra; /* number of extra bits to send */ - - if (s.sym_next !== 0) { - do { - dist = s.pending_buf[s.sym_buf + sx++] & 0xff; - dist += (s.pending_buf[s.sym_buf + sx++] & 0xff) << 8; - lc = s.pending_buf[s.sym_buf + sx++]; - if (dist === 0) { - send_code(s, lc, ltree); /* send a literal byte */ - //Tracecv(isgraph(lc), (stderr," '%c' ", lc)); - } else { - /* Here, lc is the match length - MIN_MATCH */ - code = _length_code[lc]; - send_code(s, code + LITERALS$1 + 1, ltree); /* send the length code */ - extra = extra_lbits[code]; - if (extra !== 0) { - lc -= base_length[code]; - send_bits(s, lc, extra); /* send the extra length bits */ - } - dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - //Assert (code < D_CODES, "bad d_code"); - - send_code(s, code, dtree); /* send the distance code */ - extra = extra_dbits[code]; - if (extra !== 0) { - dist -= base_dist[code]; - send_bits(s, dist, extra); /* send the extra distance bits */ - } - } /* literal or match pair ? */ - - /* Check that the overlay between pending_buf and sym_buf is ok: */ - //Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow"); - - } while (sx < s.sym_next); - } - - send_code(s, END_BLOCK, ltree); - }; - - - /* =========================================================================== - * Construct one Huffman tree and assigns the code bit strings and lengths. - * Update the total bit length for the current block. - * IN assertion: the field freq is set for all tree elements. - * OUT assertions: the fields len and code are set to the optimal bit length - * and corresponding code. The length opt_len is updated; static_len is - * also updated if stree is not null. The field max_code is set. - */ - const build_tree = (s, desc) => { - // deflate_state *s; - // tree_desc *desc; /* the tree descriptor */ - - const tree = desc.dyn_tree; - const stree = desc.stat_desc.static_tree; - const has_stree = desc.stat_desc.has_stree; - const elems = desc.stat_desc.elems; - let n, m; /* iterate over heap elements */ - let max_code = -1; /* largest code with non zero frequency */ - let node; /* new node being created */ - - /* Construct the initial heap, with least frequent element in - * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. - * heap[0] is not used. - */ - s.heap_len = 0; - s.heap_max = HEAP_SIZE$1; - - for (n = 0; n < elems; n++) { - if (tree[n * 2]/*.Freq*/ !== 0) { - s.heap[++s.heap_len] = max_code = n; - s.depth[n] = 0; - - } else { - tree[n * 2 + 1]/*.Len*/ = 0; - } - } - - /* The pkzip format requires that at least one distance code exists, - * and that at least one bit should be sent even if there is only one - * possible code. So to avoid special checks later on we force at least - * two codes of non zero frequency. - */ - while (s.heap_len < 2) { - node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0); - tree[node * 2]/*.Freq*/ = 1; - s.depth[node] = 0; - s.opt_len--; - - if (has_stree) { - s.static_len -= stree[node * 2 + 1]/*.Len*/; - } - /* node is 0 or 1 so it does not have extra bits */ - } - desc.max_code = max_code; - - /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, - * establish sub-heaps of increasing lengths: - */ - for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); } - - /* Construct the Huffman tree by repeatedly combining the least two - * frequent nodes. - */ - node = elems; /* next internal node of the tree */ - do { - //pqremove(s, tree, n); /* n = node of least frequency */ - /*** pqremove ***/ - n = s.heap[1/*SMALLEST*/]; - s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--]; - pqdownheap(s, tree, 1/*SMALLEST*/); - /***/ - - m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */ - - s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */ - s.heap[--s.heap_max] = m; - - /* Create a new node father of n and m */ - tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/; - s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1; - tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node; - - /* and insert the new node in the heap */ - s.heap[1/*SMALLEST*/] = node++; - pqdownheap(s, tree, 1/*SMALLEST*/); - - } while (s.heap_len >= 2); - - s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/]; - - /* At this point, the fields freq and dad are set. We can now - * generate the bit lengths. - */ - gen_bitlen(s, desc); - - /* The field len is now set, we can generate the bit codes */ - gen_codes(tree, max_code, s.bl_count); - }; - - - /* =========================================================================== - * Scan a literal or distance tree to determine the frequencies of the codes - * in the bit length tree. - */ - const scan_tree = (s, tree, max_code) => { - // deflate_state *s; - // ct_data *tree; /* the tree to be scanned */ - // int max_code; /* and its largest code of non zero frequency */ - - let n; /* iterates over all tree elements */ - let prevlen = -1; /* last emitted length */ - let curlen; /* length of current code */ - - let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ - - let count = 0; /* repeat count of the current code */ - let max_count = 7; /* max repeat count */ - let min_count = 4; /* min repeat count */ - - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } - tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */ - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; - - if (++count < max_count && curlen === nextlen) { - continue; - - } else if (count < min_count) { - s.bl_tree[curlen * 2]/*.Freq*/ += count; - - } else if (curlen !== 0) { - - if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; } - s.bl_tree[REP_3_6 * 2]/*.Freq*/++; - - } else if (count <= 10) { - s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++; - - } else { - s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++; - } - - count = 0; - prevlen = curlen; - - if (nextlen === 0) { - max_count = 138; - min_count = 3; - - } else if (curlen === nextlen) { - max_count = 6; - min_count = 3; - - } else { - max_count = 7; - min_count = 4; - } - } - }; - - - /* =========================================================================== - * Send a literal or distance tree in compressed form, using the codes in - * bl_tree. - */ - const send_tree = (s, tree, max_code) => { - // deflate_state *s; - // ct_data *tree; /* the tree to be scanned */ - // int max_code; /* and its largest code of non zero frequency */ - - let n; /* iterates over all tree elements */ - let prevlen = -1; /* last emitted length */ - let curlen; /* length of current code */ - - let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ - - let count = 0; /* repeat count of the current code */ - let max_count = 7; /* max repeat count */ - let min_count = 4; /* min repeat count */ - - /* tree[max_code+1].Len = -1; */ /* guard already set */ - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; - - if (++count < max_count && curlen === nextlen) { - continue; - - } else if (count < min_count) { - do { send_code(s, curlen, s.bl_tree); } while (--count !== 0); - - } else if (curlen !== 0) { - if (curlen !== prevlen) { - send_code(s, curlen, s.bl_tree); - count--; - } - //Assert(count >= 3 && count <= 6, " 3_6?"); - send_code(s, REP_3_6, s.bl_tree); - send_bits(s, count - 3, 2); - - } else if (count <= 10) { - send_code(s, REPZ_3_10, s.bl_tree); - send_bits(s, count - 3, 3); - - } else { - send_code(s, REPZ_11_138, s.bl_tree); - send_bits(s, count - 11, 7); - } - - count = 0; - prevlen = curlen; - if (nextlen === 0) { - max_count = 138; - min_count = 3; - - } else if (curlen === nextlen) { - max_count = 6; - min_count = 3; - - } else { - max_count = 7; - min_count = 4; - } - } - }; - - - /* =========================================================================== - * Construct the Huffman tree for the bit lengths and return the index in - * bl_order of the last bit length code to send. - */ - const build_bl_tree = (s) => { - - let max_blindex; /* index of last bit length code of non zero freq */ - - /* Determine the bit length frequencies for literal and distance trees */ - scan_tree(s, s.dyn_ltree, s.l_desc.max_code); - scan_tree(s, s.dyn_dtree, s.d_desc.max_code); - - /* Build the bit length tree: */ - build_tree(s, s.bl_desc); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - */ - - /* Determine the number of bit length codes to send. The pkzip format - * requires that at least 4 bit length codes be sent. (appnote.txt says - * 3 but the actual value used is 4.) - */ - for (max_blindex = BL_CODES$1 - 1; max_blindex >= 3; max_blindex--) { - if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) { - break; - } - } - /* Update opt_len to include the bit length tree and counts */ - s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; - //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", - // s->opt_len, s->static_len)); - - return max_blindex; - }; - - - /* =========================================================================== - * Send the header for a block using dynamic Huffman trees: the counts, the - * lengths of the bit length codes, the literal tree and the distance tree. - * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. - */ - const send_all_trees = (s, lcodes, dcodes, blcodes) => { - // deflate_state *s; - // int lcodes, dcodes, blcodes; /* number of codes for each tree */ - - let rank; /* index in bl_order */ - - //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); - //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, - // "too many codes"); - //Tracev((stderr, "\nbl counts: ")); - send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ - send_bits(s, dcodes - 1, 5); - send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ - for (rank = 0; rank < blcodes; rank++) { - //Tracev((stderr, "\nbl code %2d ", bl_order[rank])); - send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3); - } - //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); - - send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */ - //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); - - send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */ - //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); - }; - - - /* =========================================================================== - * Check if the data type is TEXT or BINARY, using the following algorithm: - * - TEXT if the two conditions below are satisfied: - * a) There are no non-portable control characters belonging to the - * "block list" (0..6, 14..25, 28..31). - * b) There is at least one printable character belonging to the - * "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). - * - BINARY otherwise. - * - The following partially-portable control characters form a - * "gray list" that is ignored in this detection algorithm: - * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). - * IN assertion: the fields Freq of dyn_ltree are set. - */ - const detect_data_type = (s) => { - /* block_mask is the bit mask of block-listed bytes - * set bits 0..6, 14..25, and 28..31 - * 0xf3ffc07f = binary 11110011111111111100000001111111 - */ - let block_mask = 0xf3ffc07f; - let n; - - /* Check for non-textual ("block-listed") bytes. */ - for (n = 0; n <= 31; n++, block_mask >>>= 1) { - if ((block_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) { - return Z_BINARY; - } - } - - /* Check for textual ("allow-listed") bytes. */ - if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 || - s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) { - return Z_TEXT; - } - for (n = 32; n < LITERALS$1; n++) { - if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) { - return Z_TEXT; - } - } - - /* There are no "block-listed" or "allow-listed" bytes: - * this stream either is empty or has tolerated ("gray-listed") bytes only. - */ - return Z_BINARY; - }; - - - let static_init_done = false; - - /* =========================================================================== - * Initialize the tree data structures for a new zlib stream. - */ - const _tr_init$1 = (s) => - { - - if (!static_init_done) { - tr_static_init(); - static_init_done = true; - } - - s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc); - s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc); - s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc); - - s.bi_buf = 0; - s.bi_valid = 0; - - /* Initialize the first block of the first file: */ - init_block(s); - }; - - - /* =========================================================================== - * Send a stored block - */ - const _tr_stored_block$1 = (s, buf, stored_len, last) => { - //DeflateState *s; - //charf *buf; /* input block */ - //ulg stored_len; /* length of input block */ - //int last; /* one if this is the last block for a file */ - - send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */ - bi_windup(s); /* align on byte boundary */ - put_short(s, stored_len); - put_short(s, ~stored_len); - if (stored_len) { - s.pending_buf.set(s.window.subarray(buf, buf + stored_len), s.pending); - } - s.pending += stored_len; - }; - - - /* =========================================================================== - * Send one empty static block to give enough lookahead for inflate. - * This takes 10 bits, of which 7 may remain in the bit buffer. - */ - const _tr_align$1 = (s) => { - send_bits(s, STATIC_TREES << 1, 3); - send_code(s, END_BLOCK, static_ltree); - bi_flush(s); - }; - - - /* =========================================================================== - * Determine the best encoding for the current block: dynamic trees, static - * trees or store, and write out the encoded block. - */ - const _tr_flush_block$1 = (s, buf, stored_len, last) => { - //DeflateState *s; - //charf *buf; /* input block, or NULL if too old */ - //ulg stored_len; /* length of input block */ - //int last; /* one if this is the last block for a file */ - - let opt_lenb, static_lenb; /* opt_len and static_len in bytes */ - let max_blindex = 0; /* index of last bit length code of non zero freq */ - - /* Build the Huffman trees unless a stored block is forced */ - if (s.level > 0) { - - /* Check if the file is binary or text */ - if (s.strm.data_type === Z_UNKNOWN$1) { - s.strm.data_type = detect_data_type(s); - } - - /* Construct the literal and distance trees */ - build_tree(s, s.l_desc); - // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, - // s->static_len)); - - build_tree(s, s.d_desc); - // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, - // s->static_len)); - /* At this point, opt_len and static_len are the total bit lengths of - * the compressed block data, excluding the tree representations. - */ - - /* Build the bit length tree for the above two trees, and get the index - * in bl_order of the last bit length code to send. - */ - max_blindex = build_bl_tree(s); - - /* Determine the best encoding. Compute the block lengths in bytes. */ - opt_lenb = (s.opt_len + 3 + 7) >>> 3; - static_lenb = (s.static_len + 3 + 7) >>> 3; - - // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", - // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, - // s->sym_next / 3)); - - if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; } - - } else { - // Assert(buf != (char*)0, "lost buf"); - opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ - } - - if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) { - /* 4: two words for the lengths */ - - /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - * Otherwise we can't have processed more than WSIZE input bytes since - * the last block flush, because compression would have been - * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to - * transform a block into a stored block. - */ - _tr_stored_block$1(s, buf, stored_len, last); - - } else if (s.strategy === Z_FIXED$1 || static_lenb === opt_lenb) { - - send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3); - compress_block(s, static_ltree, static_dtree); - - } else { - send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3); - send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1); - compress_block(s, s.dyn_ltree, s.dyn_dtree); - } - // Assert (s->compressed_len == s->bits_sent, "bad compressed size"); - /* The above check is made mod 2^32, for files larger than 512 MB - * and uLong implemented on 32 bits. - */ - init_block(s); - - if (last) { - bi_windup(s); - } - // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, - // s->compressed_len-7*last)); - }; - - /* =========================================================================== - * Save the match info and tally the frequency counts. Return true if - * the current block must be flushed. - */ - const _tr_tally$1 = (s, dist, lc) => { - // deflate_state *s; - // unsigned dist; /* distance of matched string */ - // unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ - - s.pending_buf[s.sym_buf + s.sym_next++] = dist; - s.pending_buf[s.sym_buf + s.sym_next++] = dist >> 8; - s.pending_buf[s.sym_buf + s.sym_next++] = lc; - if (dist === 0) { - /* lc is the unmatched char */ - s.dyn_ltree[lc * 2]/*.Freq*/++; - } else { - s.matches++; - /* Here, lc is the match length - MIN_MATCH */ - dist--; /* dist = match distance - 1 */ - //Assert((ush)dist < (ush)MAX_DIST(s) && - // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && - // (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); - - s.dyn_ltree[(_length_code[lc] + LITERALS$1 + 1) * 2]/*.Freq*/++; - s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++; - } - - return (s.sym_next === s.sym_end); - }; - - var _tr_init_1 = _tr_init$1; - var _tr_stored_block_1 = _tr_stored_block$1; - var _tr_flush_block_1 = _tr_flush_block$1; - var _tr_tally_1 = _tr_tally$1; - var _tr_align_1 = _tr_align$1; - - var trees = { - _tr_init: _tr_init_1, - _tr_stored_block: _tr_stored_block_1, - _tr_flush_block: _tr_flush_block_1, - _tr_tally: _tr_tally_1, - _tr_align: _tr_align_1 - }; - - // Note: adler32 takes 12% for level 0 and 2% for level 6. - // It isn't worth it to make additional optimizations as in original. - // Small size is preferable. - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - const adler32 = (adler, buf, len, pos) => { - let s1 = (adler & 0xffff) |0, - s2 = ((adler >>> 16) & 0xffff) |0, - n = 0; - - while (len !== 0) { - // Set limit ~ twice less than 5552, to keep - // s2 in 31-bits, because we force signed ints. - // in other case %= will fail. - n = len > 2000 ? 2000 : len; - len -= n; - - do { - s1 = (s1 + buf[pos++]) |0; - s2 = (s2 + s1) |0; - } while (--n); - - s1 %= 65521; - s2 %= 65521; - } - - return (s1 | (s2 << 16)) |0; - }; - - - var adler32_1 = adler32; - - // Note: we can't get significant speed boost here. - // So write code to minimize size - no pregenerated tables - // and array tools dependencies. - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - // Use ordinary array, since untyped makes no boost here - const makeTable = () => { - let c, table = []; - - for (var n = 0; n < 256; n++) { - c = n; - for (var k = 0; k < 8; k++) { - c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); - } - table[n] = c; - } - - return table; - }; - - // Create table on load. Just 255 signed longs. Not a problem. - const crcTable = new Uint32Array(makeTable()); - - - const crc32 = (crc, buf, len, pos) => { - const t = crcTable; - const end = pos + len; - - crc ^= -1; - - for (let i = pos; i < end; i++) { - crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF]; - } - - return (crc ^ (-1)); // >>> 0; - }; - - - var crc32_1 = crc32; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - var messages = { - 2: 'need dictionary', /* Z_NEED_DICT 2 */ - 1: 'stream end', /* Z_STREAM_END 1 */ - 0: '', /* Z_OK 0 */ - '-1': 'file error', /* Z_ERRNO (-1) */ - '-2': 'stream error', /* Z_STREAM_ERROR (-2) */ - '-3': 'data error', /* Z_DATA_ERROR (-3) */ - '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */ - '-5': 'buffer error', /* Z_BUF_ERROR (-5) */ - '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ - }; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - var constants$2 = { - - /* Allowed flush values; see deflate() and inflate() below for details */ - Z_NO_FLUSH: 0, - Z_PARTIAL_FLUSH: 1, - Z_SYNC_FLUSH: 2, - Z_FULL_FLUSH: 3, - Z_FINISH: 4, - Z_BLOCK: 5, - Z_TREES: 6, - - /* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ - Z_OK: 0, - Z_STREAM_END: 1, - Z_NEED_DICT: 2, - Z_ERRNO: -1, - Z_STREAM_ERROR: -2, - Z_DATA_ERROR: -3, - Z_MEM_ERROR: -4, - Z_BUF_ERROR: -5, - //Z_VERSION_ERROR: -6, - - /* compression levels */ - Z_NO_COMPRESSION: 0, - Z_BEST_SPEED: 1, - Z_BEST_COMPRESSION: 9, - Z_DEFAULT_COMPRESSION: -1, - - - Z_FILTERED: 1, - Z_HUFFMAN_ONLY: 2, - Z_RLE: 3, - Z_FIXED: 4, - Z_DEFAULT_STRATEGY: 0, - - /* Possible values of the data_type field (though see inflate()) */ - Z_BINARY: 0, - Z_TEXT: 1, - //Z_ASCII: 1, // = Z_TEXT (deprecated) - Z_UNKNOWN: 2, - - /* The deflate compression method */ - Z_DEFLATED: 8 - //Z_NULL: null // Use -1 or null inline, depending on var type - }; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - const { _tr_init, _tr_stored_block, _tr_flush_block, _tr_tally, _tr_align } = trees; - - - - - /* Public constants ==========================================================*/ - /* ===========================================================================*/ - - const { - Z_NO_FLUSH: Z_NO_FLUSH$2, Z_PARTIAL_FLUSH, Z_FULL_FLUSH: Z_FULL_FLUSH$1, Z_FINISH: Z_FINISH$3, Z_BLOCK: Z_BLOCK$1, - Z_OK: Z_OK$3, Z_STREAM_END: Z_STREAM_END$3, Z_STREAM_ERROR: Z_STREAM_ERROR$2, Z_DATA_ERROR: Z_DATA_ERROR$2, Z_BUF_ERROR: Z_BUF_ERROR$1, - Z_DEFAULT_COMPRESSION: Z_DEFAULT_COMPRESSION$1, - Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE, Z_FIXED, Z_DEFAULT_STRATEGY: Z_DEFAULT_STRATEGY$1, - Z_UNKNOWN, - Z_DEFLATED: Z_DEFLATED$2 - } = constants$2; - - /*============================================================================*/ - - - const MAX_MEM_LEVEL = 9; - /* Maximum value for memLevel in deflateInit2 */ - const MAX_WBITS$1 = 15; - /* 32K LZ77 window */ - const DEF_MEM_LEVEL = 8; - - - const LENGTH_CODES = 29; - /* number of length codes, not counting the special END_BLOCK code */ - const LITERALS = 256; - /* number of literal bytes 0..255 */ - const L_CODES = LITERALS + 1 + LENGTH_CODES; - /* number of Literal or Length codes, including the END_BLOCK code */ - const D_CODES = 30; - /* number of distance codes */ - const BL_CODES = 19; - /* number of codes used to transfer the bit lengths */ - const HEAP_SIZE = 2 * L_CODES + 1; - /* maximum heap size */ - const MAX_BITS = 15; - /* All codes must not exceed MAX_BITS bits */ - - const MIN_MATCH = 3; - const MAX_MATCH = 258; - const MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1); - - const PRESET_DICT = 0x20; - - const INIT_STATE = 42; /* zlib header -> BUSY_STATE */ - //#ifdef GZIP - const GZIP_STATE = 57; /* gzip header -> BUSY_STATE | EXTRA_STATE */ - //#endif - const EXTRA_STATE = 69; /* gzip extra block -> NAME_STATE */ - const NAME_STATE = 73; /* gzip file name -> COMMENT_STATE */ - const COMMENT_STATE = 91; /* gzip comment -> HCRC_STATE */ - const HCRC_STATE = 103; /* gzip header CRC -> BUSY_STATE */ - const BUSY_STATE = 113; /* deflate -> FINISH_STATE */ - const FINISH_STATE = 666; /* stream complete */ - - const BS_NEED_MORE = 1; /* block not completed, need more input or more output */ - const BS_BLOCK_DONE = 2; /* block flush performed */ - const BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */ - const BS_FINISH_DONE = 4; /* finish done, accept no more input or output */ - - const OS_CODE = 0x03; // Unix :) . Don't detect, use this default. - - const err = (strm, errorCode) => { - strm.msg = messages[errorCode]; - return errorCode; - }; - - const rank = (f) => { - return ((f) * 2) - ((f) > 4 ? 9 : 0); - }; - - const zero = (buf) => { - let len = buf.length; while (--len >= 0) { buf[len] = 0; } - }; - - /* =========================================================================== - * Slide the hash table when sliding the window down (could be avoided with 32 - * bit values at the expense of memory usage). We slide even when level == 0 to - * keep the hash table consistent if we switch back to level > 0 later. - */ - const slide_hash = (s) => { - let n, m; - let p; - let wsize = s.w_size; - - n = s.hash_size; - p = n; - do { - m = s.head[--p]; - s.head[p] = (m >= wsize ? m - wsize : 0); - } while (--n); - n = wsize; - //#ifndef FASTEST - p = n; - do { - m = s.prev[--p]; - s.prev[p] = (m >= wsize ? m - wsize : 0); - /* If n is not on any hash chain, prev[n] is garbage but - * its value will never be used. - */ - } while (--n); - //#endif - }; - - /* eslint-disable new-cap */ - let HASH_ZLIB = (s, prev, data) => ((prev << s.hash_shift) ^ data) & s.hash_mask; - // This hash causes less collisions, https://github.com/nodeca/pako/issues/135 - // But breaks binary compatibility - //let HASH_FAST = (s, prev, data) => ((prev << 8) + (prev >> 8) + (data << 4)) & s.hash_mask; - let HASH = HASH_ZLIB; - - - /* ========================================================================= - * Flush as much pending output as possible. All deflate() output, except for - * some deflate_stored() output, goes through this function so some - * applications may wish to modify it to avoid allocating a large - * strm->next_out buffer and copying into it. (See also read_buf()). - */ - const flush_pending = (strm) => { - const s = strm.state; - - //_tr_flush_bits(s); - let len = s.pending; - if (len > strm.avail_out) { - len = strm.avail_out; - } - if (len === 0) { return; } - - strm.output.set(s.pending_buf.subarray(s.pending_out, s.pending_out + len), strm.next_out); - strm.next_out += len; - s.pending_out += len; - strm.total_out += len; - strm.avail_out -= len; - s.pending -= len; - if (s.pending === 0) { - s.pending_out = 0; - } - }; - - - const flush_block_only = (s, last) => { - _tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last); - s.block_start = s.strstart; - flush_pending(s.strm); - }; - - - const put_byte = (s, b) => { - s.pending_buf[s.pending++] = b; - }; - - - /* ========================================================================= - * Put a short in the pending buffer. The 16-bit value is put in MSB order. - * IN assertion: the stream state is correct and there is enough room in - * pending_buf. - */ - const putShortMSB = (s, b) => { - - // put_byte(s, (Byte)(b >> 8)); - // put_byte(s, (Byte)(b & 0xff)); - s.pending_buf[s.pending++] = (b >>> 8) & 0xff; - s.pending_buf[s.pending++] = b & 0xff; - }; - - - /* =========================================================================== - * Read a new buffer from the current input stream, update the adler32 - * and total number of bytes read. All deflate() input goes through - * this function so some applications may wish to modify it to avoid - * allocating a large strm->input buffer and copying from it. - * (See also flush_pending()). - */ - const read_buf = (strm, buf, start, size) => { - - let len = strm.avail_in; - - if (len > size) { len = size; } - if (len === 0) { return 0; } - - strm.avail_in -= len; - - // zmemcpy(buf, strm->next_in, len); - buf.set(strm.input.subarray(strm.next_in, strm.next_in + len), start); - if (strm.state.wrap === 1) { - strm.adler = adler32_1(strm.adler, buf, len, start); - } - - else if (strm.state.wrap === 2) { - strm.adler = crc32_1(strm.adler, buf, len, start); - } - - strm.next_in += len; - strm.total_in += len; - - return len; - }; - - - /* =========================================================================== - * Set match_start to the longest match starting at the given string and - * return its length. Matches shorter or equal to prev_length are discarded, - * in which case the result is equal to prev_length and match_start is - * garbage. - * IN assertions: cur_match is the head of the hash chain for the current - * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 - * OUT assertion: the match length is not greater than s->lookahead. - */ - const longest_match = (s, cur_match) => { - - let chain_length = s.max_chain_length; /* max hash chain length */ - let scan = s.strstart; /* current string */ - let match; /* matched string */ - let len; /* length of current match */ - let best_len = s.prev_length; /* best match length so far */ - let nice_match = s.nice_match; /* stop if match long enough */ - const limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ? - s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/; - - const _win = s.window; // shortcut - - const wmask = s.w_mask; - const prev = s.prev; - - /* Stop when cur_match becomes <= limit. To simplify the code, - * we prevent matches with the string of window index 0. - */ - - const strend = s.strstart + MAX_MATCH; - let scan_end1 = _win[scan + best_len - 1]; - let scan_end = _win[scan + best_len]; - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - /* Do not waste too much time if we already have a good match: */ - if (s.prev_length >= s.good_match) { - chain_length >>= 2; - } - /* Do not look for matches beyond the end of the input. This is necessary - * to make deflate deterministic. - */ - if (nice_match > s.lookahead) { nice_match = s.lookahead; } - - // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); - - do { - // Assert(cur_match < s->strstart, "no future"); - match = cur_match; - - /* Skip to next match if the match length cannot increase - * or if the match length is less than 2. Note that the checks below - * for insufficient lookahead only occur occasionally for performance - * reasons. Therefore uninitialized memory will be accessed, and - * conditional jumps will be made that depend on those values. - * However the length of the match is limited to the lookahead, so - * the output of deflate is not affected by the uninitialized values. - */ - - if (_win[match + best_len] !== scan_end || - _win[match + best_len - 1] !== scan_end1 || - _win[match] !== _win[scan] || - _win[++match] !== _win[scan + 1]) { - continue; - } - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2; - match++; - // Assert(*scan == *match, "match[2]?"); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - /*jshint noempty:false*/ - } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && - _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && - _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && - _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && - scan < strend); - - // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - - len = MAX_MATCH - (strend - scan); - scan = strend - MAX_MATCH; - - if (len > best_len) { - s.match_start = cur_match; - best_len = len; - if (len >= nice_match) { - break; - } - scan_end1 = _win[scan + best_len - 1]; - scan_end = _win[scan + best_len]; - } - } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0); - - if (best_len <= s.lookahead) { - return best_len; - } - return s.lookahead; - }; - - - /* =========================================================================== - * Fill the window when the lookahead becomes insufficient. - * Updates strstart and lookahead. - * - * IN assertion: lookahead < MIN_LOOKAHEAD - * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD - * At least one byte has been read, or avail_in == 0; reads are - * performed for at least two bytes (required for the zip translate_eol - * option -- not supported here). - */ - const fill_window = (s) => { - - const _w_size = s.w_size; - let n, more, str; - - //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); - - do { - more = s.window_size - s.lookahead - s.strstart; - - // JS ints have 32 bit, block below not needed - /* Deal with !@#$% 64K limit: */ - //if (sizeof(int) <= 2) { - // if (more == 0 && s->strstart == 0 && s->lookahead == 0) { - // more = wsize; - // - // } else if (more == (unsigned)(-1)) { - // /* Very unlikely, but possible on 16 bit machine if - // * strstart == 0 && lookahead == 1 (input done a byte at time) - // */ - // more--; - // } - //} - - - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) { - - s.window.set(s.window.subarray(_w_size, _w_size + _w_size - more), 0); - s.match_start -= _w_size; - s.strstart -= _w_size; - /* we now have strstart >= MAX_DIST */ - s.block_start -= _w_size; - if (s.insert > s.strstart) { - s.insert = s.strstart; - } - slide_hash(s); - more += _w_size; - } - if (s.strm.avail_in === 0) { - break; - } - - /* If there was no sliding: - * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - * more == window_size - lookahead - strstart - * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - * => more >= window_size - 2*WSIZE + 2 - * In the BIG_MEM or MMAP case (not yet supported), - * window_size == input_size + MIN_LOOKAHEAD && - * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - * Otherwise, window_size == 2*WSIZE so more >= 2. - * If there was sliding, more >= WSIZE. So in all cases, more >= 2. - */ - //Assert(more >= 2, "more < 2"); - n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more); - s.lookahead += n; - - /* Initialize the hash value now that we have some input: */ - if (s.lookahead + s.insert >= MIN_MATCH) { - str = s.strstart - s.insert; - s.ins_h = s.window[str]; - - /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */ - s.ins_h = HASH(s, s.ins_h, s.window[str + 1]); - //#if MIN_MATCH != 3 - // Call update_hash() MIN_MATCH-3 more times - //#endif - while (s.insert) { - /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ - s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]); - - s.prev[str & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = str; - str++; - s.insert--; - if (s.lookahead + s.insert < MIN_MATCH) { - break; - } - } - } - /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - * but this is not important since only literal bytes will be emitted. - */ - - } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0); - - /* If the WIN_INIT bytes after the end of the current data have never been - * written, then zero those bytes in order to avoid memory check reports of - * the use of uninitialized (or uninitialised as Julian writes) bytes by - * the longest match routines. Update the high water mark for the next - * time through here. WIN_INIT is set to MAX_MATCH since the longest match - * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. - */ - // if (s.high_water < s.window_size) { - // const curr = s.strstart + s.lookahead; - // let init = 0; - // - // if (s.high_water < curr) { - // /* Previous high water mark below current data -- zero WIN_INIT - // * bytes or up to end of window, whichever is less. - // */ - // init = s.window_size - curr; - // if (init > WIN_INIT) - // init = WIN_INIT; - // zmemzero(s->window + curr, (unsigned)init); - // s->high_water = curr + init; - // } - // else if (s->high_water < (ulg)curr + WIN_INIT) { - // /* High water mark at or above current data, but below current data - // * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up - // * to end of window, whichever is less. - // */ - // init = (ulg)curr + WIN_INIT - s->high_water; - // if (init > s->window_size - s->high_water) - // init = s->window_size - s->high_water; - // zmemzero(s->window + s->high_water, (unsigned)init); - // s->high_water += init; - // } - // } - // - // Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, - // "not enough room for search"); - }; - - /* =========================================================================== - * Copy without compression as much as possible from the input stream, return - * the current block state. - * - * In case deflateParams() is used to later switch to a non-zero compression - * level, s->matches (otherwise unused when storing) keeps track of the number - * of hash table slides to perform. If s->matches is 1, then one hash table - * slide will be done when switching. If s->matches is 2, the maximum value - * allowed here, then the hash table will be cleared, since two or more slides - * is the same as a clear. - * - * deflate_stored() is written to minimize the number of times an input byte is - * copied. It is most efficient with large input and output buffers, which - * maximizes the opportunites to have a single copy from next_in to next_out. - */ - const deflate_stored = (s, flush) => { - - /* Smallest worthy block size when not flushing or finishing. By default - * this is 32K. This can be as small as 507 bytes for memLevel == 1. For - * large input and output buffers, the stored block size will be larger. - */ - let min_block = s.pending_buf_size - 5 > s.w_size ? s.w_size : s.pending_buf_size - 5; - - /* Copy as many min_block or larger stored blocks directly to next_out as - * possible. If flushing, copy the remaining available input to next_out as - * stored blocks, if there is enough space. - */ - let len, left, have, last = 0; - let used = s.strm.avail_in; - do { - /* Set len to the maximum size block that we can copy directly with the - * available input data and output space. Set left to how much of that - * would be copied from what's left in the window. - */ - len = 65535/* MAX_STORED */; /* maximum deflate stored block length */ - have = (s.bi_valid + 42) >> 3; /* number of header bytes */ - if (s.strm.avail_out < have) { /* need room for header */ - break; - } - /* maximum stored block length that will fit in avail_out: */ - have = s.strm.avail_out - have; - left = s.strstart - s.block_start; /* bytes left in window */ - if (len > left + s.strm.avail_in) { - len = left + s.strm.avail_in; /* limit len to the input */ - } - if (len > have) { - len = have; /* limit len to the output */ - } - - /* If the stored block would be less than min_block in length, or if - * unable to copy all of the available input when flushing, then try - * copying to the window and the pending buffer instead. Also don't - * write an empty block when flushing -- deflate() does that. - */ - if (len < min_block && ((len === 0 && flush !== Z_FINISH$3) || - flush === Z_NO_FLUSH$2 || - len !== left + s.strm.avail_in)) { - break; - } - - /* Make a dummy stored block in pending to get the header bytes, - * including any pending bits. This also updates the debugging counts. - */ - last = flush === Z_FINISH$3 && len === left + s.strm.avail_in ? 1 : 0; - _tr_stored_block(s, 0, 0, last); - - /* Replace the lengths in the dummy stored block with len. */ - s.pending_buf[s.pending - 4] = len; - s.pending_buf[s.pending - 3] = len >> 8; - s.pending_buf[s.pending - 2] = ~len; - s.pending_buf[s.pending - 1] = ~len >> 8; - - /* Write the stored block header bytes. */ - flush_pending(s.strm); - - //#ifdef ZLIB_DEBUG - // /* Update debugging counts for the data about to be copied. */ - // s->compressed_len += len << 3; - // s->bits_sent += len << 3; - //#endif - - /* Copy uncompressed bytes from the window to next_out. */ - if (left) { - if (left > len) { - left = len; - } - //zmemcpy(s->strm->next_out, s->window + s->block_start, left); - s.strm.output.set(s.window.subarray(s.block_start, s.block_start + left), s.strm.next_out); - s.strm.next_out += left; - s.strm.avail_out -= left; - s.strm.total_out += left; - s.block_start += left; - len -= left; - } - - /* Copy uncompressed bytes directly from next_in to next_out, updating - * the check value. - */ - if (len) { - read_buf(s.strm, s.strm.output, s.strm.next_out, len); - s.strm.next_out += len; - s.strm.avail_out -= len; - s.strm.total_out += len; - } - } while (last === 0); - - /* Update the sliding window with the last s->w_size bytes of the copied - * data, or append all of the copied data to the existing window if less - * than s->w_size bytes were copied. Also update the number of bytes to - * insert in the hash tables, in the event that deflateParams() switches to - * a non-zero compression level. - */ - used -= s.strm.avail_in; /* number of input bytes directly copied */ - if (used) { - /* If any input was used, then no unused input remains in the window, - * therefore s->block_start == s->strstart. - */ - if (used >= s.w_size) { /* supplant the previous history */ - s.matches = 2; /* clear hash */ - //zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size); - s.window.set(s.strm.input.subarray(s.strm.next_in - s.w_size, s.strm.next_in), 0); - s.strstart = s.w_size; - s.insert = s.strstart; - } - else { - if (s.window_size - s.strstart <= used) { - /* Slide the window down. */ - s.strstart -= s.w_size; - //zmemcpy(s->window, s->window + s->w_size, s->strstart); - s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0); - if (s.matches < 2) { - s.matches++; /* add a pending slide_hash() */ - } - if (s.insert > s.strstart) { - s.insert = s.strstart; - } - } - //zmemcpy(s->window + s->strstart, s->strm->next_in - used, used); - s.window.set(s.strm.input.subarray(s.strm.next_in - used, s.strm.next_in), s.strstart); - s.strstart += used; - s.insert += used > s.w_size - s.insert ? s.w_size - s.insert : used; - } - s.block_start = s.strstart; - } - if (s.high_water < s.strstart) { - s.high_water = s.strstart; - } - - /* If the last block was written to next_out, then done. */ - if (last) { - return BS_FINISH_DONE; - } - - /* If flushing and all input has been consumed, then done. */ - if (flush !== Z_NO_FLUSH$2 && flush !== Z_FINISH$3 && - s.strm.avail_in === 0 && s.strstart === s.block_start) { - return BS_BLOCK_DONE; - } - - /* Fill the window with any remaining input. */ - have = s.window_size - s.strstart; - if (s.strm.avail_in > have && s.block_start >= s.w_size) { - /* Slide the window down. */ - s.block_start -= s.w_size; - s.strstart -= s.w_size; - //zmemcpy(s->window, s->window + s->w_size, s->strstart); - s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0); - if (s.matches < 2) { - s.matches++; /* add a pending slide_hash() */ - } - have += s.w_size; /* more space now */ - if (s.insert > s.strstart) { - s.insert = s.strstart; - } - } - if (have > s.strm.avail_in) { - have = s.strm.avail_in; - } - if (have) { - read_buf(s.strm, s.window, s.strstart, have); - s.strstart += have; - s.insert += have > s.w_size - s.insert ? s.w_size - s.insert : have; - } - if (s.high_water < s.strstart) { - s.high_water = s.strstart; - } - - /* There was not enough avail_out to write a complete worthy or flushed - * stored block to next_out. Write a stored block to pending instead, if we - * have enough input for a worthy block, or if flushing and there is enough - * room for the remaining input as a stored block in the pending buffer. - */ - have = (s.bi_valid + 42) >> 3; /* number of header bytes */ - /* maximum stored block length that will fit in pending: */ - have = s.pending_buf_size - have > 65535/* MAX_STORED */ ? 65535/* MAX_STORED */ : s.pending_buf_size - have; - min_block = have > s.w_size ? s.w_size : have; - left = s.strstart - s.block_start; - if (left >= min_block || - ((left || flush === Z_FINISH$3) && flush !== Z_NO_FLUSH$2 && - s.strm.avail_in === 0 && left <= have)) { - len = left > have ? have : left; - last = flush === Z_FINISH$3 && s.strm.avail_in === 0 && - len === left ? 1 : 0; - _tr_stored_block(s, s.block_start, len, last); - s.block_start += len; - flush_pending(s.strm); - } - - /* We've done all we can with the available input and output. */ - return last ? BS_FINISH_STARTED : BS_NEED_MORE; - }; - - - /* =========================================================================== - * Compress as much as possible from the input stream, return the current - * block state. - * This function does not perform lazy evaluation of matches and inserts - * new strings in the dictionary only for unmatched strings or for short - * matches. It is used only for the fast compression options. - */ - const deflate_fast = (s, flush) => { - - let hash_head; /* head of the hash chain */ - let bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s.lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$2) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { - break; /* flush the current block */ - } - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = 0/*NIL*/; - if (s.lookahead >= MIN_MATCH) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]); - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - - /* Find the longest match, discarding those <= prev_length. - * At this point we have always match_length < MIN_MATCH - */ - if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s.match_length = longest_match(s, hash_head); - /* longest_match() sets match_start */ - } - if (s.match_length >= MIN_MATCH) { - // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only - - /*** _tr_tally_dist(s, s.strstart - s.match_start, - s.match_length - MIN_MATCH, bflush); ***/ - bflush = _tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH); - - s.lookahead -= s.match_length; - - /* Insert new strings in the hash table only if the match length - * is not too large. This saves time but degrades compression. - */ - if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) { - s.match_length--; /* string at strstart already in table */ - do { - s.strstart++; - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]); - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - /* strstart never exceeds WSIZE-MAX_MATCH, so there are - * always MIN_MATCH bytes ahead. - */ - } while (--s.match_length !== 0); - s.strstart++; - } else - { - s.strstart += s.match_length; - s.match_length = 0; - s.ins_h = s.window[s.strstart]; - /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + 1]); - - //#if MIN_MATCH != 3 - // Call UPDATE_HASH() MIN_MATCH-3 more times - //#endif - /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not - * matter since it will be recomputed at next deflate call. - */ - } - } else { - /* No match, output a literal byte */ - //Tracevv((stderr,"%c", s.window[s.strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart]); - - s.lookahead--; - s.strstart++; - } - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1); - if (flush === Z_FINISH$3) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.sym_next) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_BLOCK_DONE; - }; - - /* =========================================================================== - * Same as above, but achieves better compression. We use a lazy - * evaluation for matches: a match is finally adopted only if there is - * no better match at the next window position. - */ - const deflate_slow = (s, flush) => { - - let hash_head; /* head of hash chain */ - let bflush; /* set if current block must be flushed */ - - let max_insert; - - /* Process the input block. */ - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s.lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$2) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { break; } /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = 0/*NIL*/; - if (s.lookahead >= MIN_MATCH) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]); - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - - /* Find the longest match, discarding those <= prev_length. - */ - s.prev_length = s.match_length; - s.prev_match = s.match_start; - s.match_length = MIN_MATCH - 1; - - if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match && - s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s.match_length = longest_match(s, hash_head); - /* longest_match() sets match_start */ - - if (s.match_length <= 5 && - (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) { - - /* If prev_match is also MIN_MATCH, match_start is garbage - * but we will ignore the current match anyway. - */ - s.match_length = MIN_MATCH - 1; - } - } - /* If there was a match at the previous step and the current - * match is not better, output the previous match: - */ - if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) { - max_insert = s.strstart + s.lookahead - MIN_MATCH; - /* Do not insert strings in hash table beyond this. */ - - //check_match(s, s.strstart-1, s.prev_match, s.prev_length); - - /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match, - s.prev_length - MIN_MATCH, bflush);***/ - bflush = _tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH); - /* Insert in hash table all strings up to the end of the match. - * strstart-1 and strstart are already inserted. If there is not - * enough lookahead, the last two strings are not inserted in - * the hash table. - */ - s.lookahead -= s.prev_length - 1; - s.prev_length -= 2; - do { - if (++s.strstart <= max_insert) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]); - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - } while (--s.prev_length !== 0); - s.match_available = 0; - s.match_length = MIN_MATCH - 1; - s.strstart++; - - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - - } else if (s.match_available) { - /* If there was no match at the previous position, output a - * single literal. If there was a match but the current match - * is longer, truncate the previous match to a single literal. - */ - //Tracevv((stderr,"%c", s->window[s->strstart-1])); - /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart - 1]); - - if (bflush) { - /*** FLUSH_BLOCK_ONLY(s, 0) ***/ - flush_block_only(s, false); - /***/ - } - s.strstart++; - s.lookahead--; - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - } else { - /* There is no previous match to compare with, wait for - * the next step to decide. - */ - s.match_available = 1; - s.strstart++; - s.lookahead--; - } - } - //Assert (flush != Z_NO_FLUSH, "no flush?"); - if (s.match_available) { - //Tracevv((stderr,"%c", s->window[s->strstart-1])); - /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart - 1]); - - s.match_available = 0; - } - s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1; - if (flush === Z_FINISH$3) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.sym_next) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - - return BS_BLOCK_DONE; - }; - - - /* =========================================================================== - * For Z_RLE, simply look for runs of bytes, generate matches only of distance - * one. Do not maintain a hash table. (It will be regenerated if this run of - * deflate switches away from Z_RLE.) - */ - const deflate_rle = (s, flush) => { - - let bflush; /* set if current block must be flushed */ - let prev; /* byte at distance one to match */ - let scan, strend; /* scan goes up to strend for length of run */ - - const _win = s.window; - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the longest run, plus one for the unrolled loop. - */ - if (s.lookahead <= MAX_MATCH) { - fill_window(s); - if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH$2) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { break; } /* flush the current block */ - } - - /* See how many times the previous byte repeats */ - s.match_length = 0; - if (s.lookahead >= MIN_MATCH && s.strstart > 0) { - scan = s.strstart - 1; - prev = _win[scan]; - if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) { - strend = s.strstart + MAX_MATCH; - do { - /*jshint noempty:false*/ - } while (prev === _win[++scan] && prev === _win[++scan] && - prev === _win[++scan] && prev === _win[++scan] && - prev === _win[++scan] && prev === _win[++scan] && - prev === _win[++scan] && prev === _win[++scan] && - scan < strend); - s.match_length = MAX_MATCH - (strend - scan); - if (s.match_length > s.lookahead) { - s.match_length = s.lookahead; - } - } - //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); - } - - /* Emit match if have run of MIN_MATCH or longer, else emit literal */ - if (s.match_length >= MIN_MATCH) { - //check_match(s, s.strstart, s.strstart - 1, s.match_length); - - /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/ - bflush = _tr_tally(s, 1, s.match_length - MIN_MATCH); - - s.lookahead -= s.match_length; - s.strstart += s.match_length; - s.match_length = 0; - } else { - /* No match, output a literal byte */ - //Tracevv((stderr,"%c", s->window[s->strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart]); - - s.lookahead--; - s.strstart++; - } - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - s.insert = 0; - if (flush === Z_FINISH$3) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.sym_next) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_BLOCK_DONE; - }; - - /* =========================================================================== - * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. - * (It will be regenerated if this run of deflate switches away from Huffman.) - */ - const deflate_huff = (s, flush) => { - - let bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we have a literal to write. */ - if (s.lookahead === 0) { - fill_window(s); - if (s.lookahead === 0) { - if (flush === Z_NO_FLUSH$2) { - return BS_NEED_MORE; - } - break; /* flush the current block */ - } - } - - /* Output a literal byte */ - s.match_length = 0; - //Tracevv((stderr,"%c", s->window[s->strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart]); - s.lookahead--; - s.strstart++; - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - s.insert = 0; - if (flush === Z_FINISH$3) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.sym_next) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_BLOCK_DONE; - }; - - /* Values for max_lazy_match, good_match and max_chain_length, depending on - * the desired pack level (0..9). The values given below have been tuned to - * exclude worst case performance for pathological files. Better values may be - * found for specific files. - */ - function Config(good_length, max_lazy, nice_length, max_chain, func) { - - this.good_length = good_length; - this.max_lazy = max_lazy; - this.nice_length = nice_length; - this.max_chain = max_chain; - this.func = func; - } - - const configuration_table = [ - /* good lazy nice chain */ - new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */ - new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */ - new Config(4, 5, 16, 8, deflate_fast), /* 2 */ - new Config(4, 6, 32, 32, deflate_fast), /* 3 */ - - new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */ - new Config(8, 16, 32, 32, deflate_slow), /* 5 */ - new Config(8, 16, 128, 128, deflate_slow), /* 6 */ - new Config(8, 32, 128, 256, deflate_slow), /* 7 */ - new Config(32, 128, 258, 1024, deflate_slow), /* 8 */ - new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */ - ]; - - - /* =========================================================================== - * Initialize the "longest match" routines for a new zlib stream - */ - const lm_init = (s) => { - - s.window_size = 2 * s.w_size; - - /*** CLEAR_HASH(s); ***/ - zero(s.head); // Fill with NIL (= 0); - - /* Set the default configuration parameters: - */ - s.max_lazy_match = configuration_table[s.level].max_lazy; - s.good_match = configuration_table[s.level].good_length; - s.nice_match = configuration_table[s.level].nice_length; - s.max_chain_length = configuration_table[s.level].max_chain; - - s.strstart = 0; - s.block_start = 0; - s.lookahead = 0; - s.insert = 0; - s.match_length = s.prev_length = MIN_MATCH - 1; - s.match_available = 0; - s.ins_h = 0; - }; - - - function DeflateState() { - this.strm = null; /* pointer back to this zlib stream */ - this.status = 0; /* as the name implies */ - this.pending_buf = null; /* output still pending */ - this.pending_buf_size = 0; /* size of pending_buf */ - this.pending_out = 0; /* next pending byte to output to the stream */ - this.pending = 0; /* nb of bytes in the pending buffer */ - this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ - this.gzhead = null; /* gzip header information to write */ - this.gzindex = 0; /* where in extra, name, or comment */ - this.method = Z_DEFLATED$2; /* can only be DEFLATED */ - this.last_flush = -1; /* value of flush param for previous deflate call */ - - this.w_size = 0; /* LZ77 window size (32K by default) */ - this.w_bits = 0; /* log2(w_size) (8..16) */ - this.w_mask = 0; /* w_size - 1 */ - - this.window = null; - /* Sliding window. Input bytes are read into the second half of the window, - * and move to the first half later to keep a dictionary of at least wSize - * bytes. With this organization, matches are limited to a distance of - * wSize-MAX_MATCH bytes, but this ensures that IO is always - * performed with a length multiple of the block size. - */ - - this.window_size = 0; - /* Actual size of window: 2*wSize, except when the user input buffer - * is directly used as sliding window. - */ - - this.prev = null; - /* Link to older string with same hash index. To limit the size of this - * array to 64K, this link is maintained only for the last 32K strings. - * An index in this array is thus a window index modulo 32K. - */ - - this.head = null; /* Heads of the hash chains or NIL. */ - - this.ins_h = 0; /* hash index of string to be inserted */ - this.hash_size = 0; /* number of elements in hash table */ - this.hash_bits = 0; /* log2(hash_size) */ - this.hash_mask = 0; /* hash_size-1 */ - - this.hash_shift = 0; - /* Number of bits by which ins_h must be shifted at each input - * step. It must be such that after MIN_MATCH steps, the oldest - * byte no longer takes part in the hash key, that is: - * hash_shift * MIN_MATCH >= hash_bits - */ - - this.block_start = 0; - /* Window position at the beginning of the current output block. Gets - * negative when the window is moved backwards. - */ - - this.match_length = 0; /* length of best match */ - this.prev_match = 0; /* previous match */ - this.match_available = 0; /* set if previous match exists */ - this.strstart = 0; /* start of string to insert */ - this.match_start = 0; /* start of matching string */ - this.lookahead = 0; /* number of valid bytes ahead in window */ - - this.prev_length = 0; - /* Length of the best match at previous step. Matches not greater than this - * are discarded. This is used in the lazy match evaluation. - */ - - this.max_chain_length = 0; - /* To speed up deflation, hash chains are never searched beyond this - * length. A higher limit improves compression ratio but degrades the - * speed. - */ - - this.max_lazy_match = 0; - /* Attempt to find a better match only when the current match is strictly - * smaller than this value. This mechanism is used only for compression - * levels >= 4. - */ - // That's alias to max_lazy_match, don't use directly - //this.max_insert_length = 0; - /* Insert new strings in the hash table only if the match length is not - * greater than this length. This saves time but degrades compression. - * max_insert_length is used only for compression levels <= 3. - */ - - this.level = 0; /* compression level (1..9) */ - this.strategy = 0; /* favor or force Huffman coding*/ - - this.good_match = 0; - /* Use a faster search when the previous match is longer than this */ - - this.nice_match = 0; /* Stop searching when current match exceeds this */ - - /* used by trees.c: */ - - /* Didn't use ct_data typedef below to suppress compiler warning */ - - // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ - // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ - // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ - - // Use flat array of DOUBLE size, with interleaved fata, - // because JS does not support effective - this.dyn_ltree = new Uint16Array(HEAP_SIZE * 2); - this.dyn_dtree = new Uint16Array((2 * D_CODES + 1) * 2); - this.bl_tree = new Uint16Array((2 * BL_CODES + 1) * 2); - zero(this.dyn_ltree); - zero(this.dyn_dtree); - zero(this.bl_tree); - - this.l_desc = null; /* desc. for literal tree */ - this.d_desc = null; /* desc. for distance tree */ - this.bl_desc = null; /* desc. for bit length tree */ - - //ush bl_count[MAX_BITS+1]; - this.bl_count = new Uint16Array(MAX_BITS + 1); - /* number of codes at each bit length for an optimal tree */ - - //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ - this.heap = new Uint16Array(2 * L_CODES + 1); /* heap used to build the Huffman trees */ - zero(this.heap); - - this.heap_len = 0; /* number of elements in the heap */ - this.heap_max = 0; /* element of largest frequency */ - /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. - * The same heap array is used to build all trees. - */ - - this.depth = new Uint16Array(2 * L_CODES + 1); //uch depth[2*L_CODES+1]; - zero(this.depth); - /* Depth of each subtree used as tie breaker for trees of equal frequency - */ - - this.sym_buf = 0; /* buffer for distances and literals/lengths */ - - this.lit_bufsize = 0; - /* Size of match buffer for literals/lengths. There are 4 reasons for - * limiting lit_bufsize to 64K: - * - frequencies can be kept in 16 bit counters - * - if compression is not successful for the first block, all input - * data is still in the window so we can still emit a stored block even - * when input comes from standard input. (This can also be done for - * all blocks if lit_bufsize is not greater than 32K.) - * - if compression is not successful for a file smaller than 64K, we can - * even emit a stored file instead of a stored block (saving 5 bytes). - * This is applicable only for zip (not gzip or zlib). - * - creating new Huffman trees less frequently may not provide fast - * adaptation to changes in the input data statistics. (Take for - * example a binary file with poorly compressible code followed by - * a highly compressible string table.) Smaller buffer sizes give - * fast adaptation but have of course the overhead of transmitting - * trees more frequently. - * - I can't count above 4 - */ - - this.sym_next = 0; /* running index in sym_buf */ - this.sym_end = 0; /* symbol table full when sym_next reaches this */ - - this.opt_len = 0; /* bit length of current block with optimal trees */ - this.static_len = 0; /* bit length of current block with static trees */ - this.matches = 0; /* number of string matches in current block */ - this.insert = 0; /* bytes at end of window left to insert */ - - - this.bi_buf = 0; - /* Output buffer. bits are inserted starting at the bottom (least - * significant bits). - */ - this.bi_valid = 0; - /* Number of valid bits in bi_buf. All bits above the last valid bit - * are always zero. - */ - - // Used for window memory init. We safely ignore it for JS. That makes - // sense only for pointers and memory check tools. - //this.high_water = 0; - /* High water mark offset in window for initialized bytes -- bytes above - * this are set to zero in order to avoid memory check warnings when - * longest match routines access bytes past the input. This is then - * updated to the new high water mark. - */ - } - - - /* ========================================================================= - * Check for a valid deflate stream state. Return 0 if ok, 1 if not. - */ - const deflateStateCheck = (strm) => { - - if (!strm) { - return 1; - } - const s = strm.state; - if (!s || s.strm !== strm || (s.status !== INIT_STATE && - //#ifdef GZIP - s.status !== GZIP_STATE && - //#endif - s.status !== EXTRA_STATE && - s.status !== NAME_STATE && - s.status !== COMMENT_STATE && - s.status !== HCRC_STATE && - s.status !== BUSY_STATE && - s.status !== FINISH_STATE)) { - return 1; - } - return 0; - }; - - - const deflateResetKeep = (strm) => { - - if (deflateStateCheck(strm)) { - return err(strm, Z_STREAM_ERROR$2); - } - - strm.total_in = strm.total_out = 0; - strm.data_type = Z_UNKNOWN; - - const s = strm.state; - s.pending = 0; - s.pending_out = 0; - - if (s.wrap < 0) { - s.wrap = -s.wrap; - /* was made negative by deflate(..., Z_FINISH); */ - } - s.status = - //#ifdef GZIP - s.wrap === 2 ? GZIP_STATE : - //#endif - s.wrap ? INIT_STATE : BUSY_STATE; - strm.adler = (s.wrap === 2) ? - 0 // crc32(0, Z_NULL, 0) - : - 1; // adler32(0, Z_NULL, 0) - s.last_flush = -2; - _tr_init(s); - return Z_OK$3; - }; - - - const deflateReset = (strm) => { - - const ret = deflateResetKeep(strm); - if (ret === Z_OK$3) { - lm_init(strm.state); - } - return ret; - }; - - - const deflateSetHeader = (strm, head) => { - - if (deflateStateCheck(strm) || strm.state.wrap !== 2) { - return Z_STREAM_ERROR$2; - } - strm.state.gzhead = head; - return Z_OK$3; - }; - - - const deflateInit2 = (strm, level, method, windowBits, memLevel, strategy) => { - - if (!strm) { // === Z_NULL - return Z_STREAM_ERROR$2; - } - let wrap = 1; - - if (level === Z_DEFAULT_COMPRESSION$1) { - level = 6; - } - - if (windowBits < 0) { /* suppress zlib wrapper */ - wrap = 0; - windowBits = -windowBits; - } - - else if (windowBits > 15) { - wrap = 2; /* write gzip wrapper instead */ - windowBits -= 16; - } - - - if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED$2 || - windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || - strategy < 0 || strategy > Z_FIXED || (windowBits === 8 && wrap !== 1)) { - return err(strm, Z_STREAM_ERROR$2); - } - - - if (windowBits === 8) { - windowBits = 9; - } - /* until 256-byte window bug fixed */ - - const s = new DeflateState(); - - strm.state = s; - s.strm = strm; - s.status = INIT_STATE; /* to pass state test in deflateReset() */ - - s.wrap = wrap; - s.gzhead = null; - s.w_bits = windowBits; - s.w_size = 1 << s.w_bits; - s.w_mask = s.w_size - 1; - - s.hash_bits = memLevel + 7; - s.hash_size = 1 << s.hash_bits; - s.hash_mask = s.hash_size - 1; - s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH); - - s.window = new Uint8Array(s.w_size * 2); - s.head = new Uint16Array(s.hash_size); - s.prev = new Uint16Array(s.w_size); - - // Don't need mem init magic for JS. - //s.high_water = 0; /* nothing written to s->window yet */ - - s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ - - /* We overlay pending_buf and sym_buf. This works since the average size - * for length/distance pairs over any compressed block is assured to be 31 - * bits or less. - * - * Analysis: The longest fixed codes are a length code of 8 bits plus 5 - * extra bits, for lengths 131 to 257. The longest fixed distance codes are - * 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest - * possible fixed-codes length/distance pair is then 31 bits total. - * - * sym_buf starts one-fourth of the way into pending_buf. So there are - * three bytes in sym_buf for every four bytes in pending_buf. Each symbol - * in sym_buf is three bytes -- two for the distance and one for the - * literal/length. As each symbol is consumed, the pointer to the next - * sym_buf value to read moves forward three bytes. From that symbol, up to - * 31 bits are written to pending_buf. The closest the written pending_buf - * bits gets to the next sym_buf symbol to read is just before the last - * code is written. At that time, 31*(n-2) bits have been written, just - * after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at - * 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1 - * symbols are written.) The closest the writing gets to what is unread is - * then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and - * can range from 128 to 32768. - * - * Therefore, at a minimum, there are 142 bits of space between what is - * written and what is read in the overlain buffers, so the symbols cannot - * be overwritten by the compressed data. That space is actually 139 bits, - * due to the three-bit fixed-code block header. - * - * That covers the case where either Z_FIXED is specified, forcing fixed - * codes, or when the use of fixed codes is chosen, because that choice - * results in a smaller compressed block than dynamic codes. That latter - * condition then assures that the above analysis also covers all dynamic - * blocks. A dynamic-code block will only be chosen to be emitted if it has - * fewer bits than a fixed-code block would for the same set of symbols. - * Therefore its average symbol length is assured to be less than 31. So - * the compressed data for a dynamic block also cannot overwrite the - * symbols from which it is being constructed. - */ - - s.pending_buf_size = s.lit_bufsize * 4; - s.pending_buf = new Uint8Array(s.pending_buf_size); - - // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`) - //s->sym_buf = s->pending_buf + s->lit_bufsize; - s.sym_buf = s.lit_bufsize; - - //s->sym_end = (s->lit_bufsize - 1) * 3; - s.sym_end = (s.lit_bufsize - 1) * 3; - /* We avoid equality with lit_bufsize*3 because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ - - s.level = level; - s.strategy = strategy; - s.method = method; - - return deflateReset(strm); - }; - - const deflateInit = (strm, level) => { - - return deflateInit2(strm, level, Z_DEFLATED$2, MAX_WBITS$1, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY$1); - }; - - - /* ========================================================================= */ - const deflate$2 = (strm, flush) => { - - if (deflateStateCheck(strm) || flush > Z_BLOCK$1 || flush < 0) { - return strm ? err(strm, Z_STREAM_ERROR$2) : Z_STREAM_ERROR$2; - } - - const s = strm.state; - - if (!strm.output || - (strm.avail_in !== 0 && !strm.input) || - (s.status === FINISH_STATE && flush !== Z_FINISH$3)) { - return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR$1 : Z_STREAM_ERROR$2); - } - - const old_flush = s.last_flush; - s.last_flush = flush; - - /* Flush as much pending output as possible */ - if (s.pending !== 0) { - flush_pending(strm); - if (strm.avail_out === 0) { - /* Since avail_out is 0, deflate will be called again with - * more output space, but possibly with both pending and - * avail_in equal to zero. There won't be anything to do, - * but this is not an error situation so make sure we - * return OK instead of BUF_ERROR at next call of deflate: - */ - s.last_flush = -1; - return Z_OK$3; - } - - /* Make sure there is something to do and avoid duplicate consecutive - * flushes. For repeated and useless calls with Z_FINISH, we keep - * returning Z_STREAM_END instead of Z_BUF_ERROR. - */ - } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) && - flush !== Z_FINISH$3) { - return err(strm, Z_BUF_ERROR$1); - } - - /* User must not provide more input after the first FINISH: */ - if (s.status === FINISH_STATE && strm.avail_in !== 0) { - return err(strm, Z_BUF_ERROR$1); - } - - /* Write the header */ - if (s.status === INIT_STATE && s.wrap === 0) { - s.status = BUSY_STATE; - } - if (s.status === INIT_STATE) { - /* zlib header */ - let header = (Z_DEFLATED$2 + ((s.w_bits - 8) << 4)) << 8; - let level_flags = -1; - - if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) { - level_flags = 0; - } else if (s.level < 6) { - level_flags = 1; - } else if (s.level === 6) { - level_flags = 2; - } else { - level_flags = 3; - } - header |= (level_flags << 6); - if (s.strstart !== 0) { header |= PRESET_DICT; } - header += 31 - (header % 31); - - putShortMSB(s, header); - - /* Save the adler32 of the preset dictionary: */ - if (s.strstart !== 0) { - putShortMSB(s, strm.adler >>> 16); - putShortMSB(s, strm.adler & 0xffff); - } - strm.adler = 1; // adler32(0L, Z_NULL, 0); - s.status = BUSY_STATE; - - /* Compression must start with an empty pending buffer */ - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$3; - } - } - //#ifdef GZIP - if (s.status === GZIP_STATE) { - /* gzip header */ - strm.adler = 0; //crc32(0L, Z_NULL, 0); - put_byte(s, 31); - put_byte(s, 139); - put_byte(s, 8); - if (!s.gzhead) { // s->gzhead == Z_NULL - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, s.level === 9 ? 2 : - (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? - 4 : 0)); - put_byte(s, OS_CODE); - s.status = BUSY_STATE; - - /* Compression must start with an empty pending buffer */ - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$3; - } - } - else { - put_byte(s, (s.gzhead.text ? 1 : 0) + - (s.gzhead.hcrc ? 2 : 0) + - (!s.gzhead.extra ? 0 : 4) + - (!s.gzhead.name ? 0 : 8) + - (!s.gzhead.comment ? 0 : 16) - ); - put_byte(s, s.gzhead.time & 0xff); - put_byte(s, (s.gzhead.time >> 8) & 0xff); - put_byte(s, (s.gzhead.time >> 16) & 0xff); - put_byte(s, (s.gzhead.time >> 24) & 0xff); - put_byte(s, s.level === 9 ? 2 : - (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? - 4 : 0)); - put_byte(s, s.gzhead.os & 0xff); - if (s.gzhead.extra && s.gzhead.extra.length) { - put_byte(s, s.gzhead.extra.length & 0xff); - put_byte(s, (s.gzhead.extra.length >> 8) & 0xff); - } - if (s.gzhead.hcrc) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending, 0); - } - s.gzindex = 0; - s.status = EXTRA_STATE; - } - } - if (s.status === EXTRA_STATE) { - if (s.gzhead.extra/* != Z_NULL*/) { - let beg = s.pending; /* start of bytes to update crc */ - let left = (s.gzhead.extra.length & 0xffff) - s.gzindex; - while (s.pending + left > s.pending_buf_size) { - let copy = s.pending_buf_size - s.pending; - // zmemcpy(s.pending_buf + s.pending, - // s.gzhead.extra + s.gzindex, copy); - s.pending_buf.set(s.gzhead.extra.subarray(s.gzindex, s.gzindex + copy), s.pending); - s.pending = s.pending_buf_size; - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - //---// - s.gzindex += copy; - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$3; - } - beg = 0; - left -= copy; - } - // JS specific: s.gzhead.extra may be TypedArray or Array for backward compatibility - // TypedArray.slice and TypedArray.from don't exist in IE10-IE11 - let gzhead_extra = new Uint8Array(s.gzhead.extra); - // zmemcpy(s->pending_buf + s->pending, - // s->gzhead->extra + s->gzindex, left); - s.pending_buf.set(gzhead_extra.subarray(s.gzindex, s.gzindex + left), s.pending); - s.pending += left; - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - //---// - s.gzindex = 0; - } - s.status = NAME_STATE; - } - if (s.status === NAME_STATE) { - if (s.gzhead.name/* != Z_NULL*/) { - let beg = s.pending; /* start of bytes to update crc */ - let val; - do { - if (s.pending === s.pending_buf_size) { - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - //---// - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$3; - } - beg = 0; - } - // JS specific: little magic to add zero terminator to end of string - if (s.gzindex < s.gzhead.name.length) { - val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff; - } else { - val = 0; - } - put_byte(s, val); - } while (val !== 0); - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - //---// - s.gzindex = 0; - } - s.status = COMMENT_STATE; - } - if (s.status === COMMENT_STATE) { - if (s.gzhead.comment/* != Z_NULL*/) { - let beg = s.pending; /* start of bytes to update crc */ - let val; - do { - if (s.pending === s.pending_buf_size) { - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - //---// - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$3; - } - beg = 0; - } - // JS specific: little magic to add zero terminator to end of string - if (s.gzindex < s.gzhead.comment.length) { - val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff; - } else { - val = 0; - } - put_byte(s, val); - } while (val !== 0); - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - //---// - } - s.status = HCRC_STATE; - } - if (s.status === HCRC_STATE) { - if (s.gzhead.hcrc) { - if (s.pending + 2 > s.pending_buf_size) { - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$3; - } - } - put_byte(s, strm.adler & 0xff); - put_byte(s, (strm.adler >> 8) & 0xff); - strm.adler = 0; //crc32(0L, Z_NULL, 0); - } - s.status = BUSY_STATE; - - /* Compression must start with an empty pending buffer */ - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$3; - } - } - //#endif - - /* Start a new block or continue the current one. - */ - if (strm.avail_in !== 0 || s.lookahead !== 0 || - (flush !== Z_NO_FLUSH$2 && s.status !== FINISH_STATE)) { - let bstate = s.level === 0 ? deflate_stored(s, flush) : - s.strategy === Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : - s.strategy === Z_RLE ? deflate_rle(s, flush) : - configuration_table[s.level].func(s, flush); - - if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) { - s.status = FINISH_STATE; - } - if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) { - if (strm.avail_out === 0) { - s.last_flush = -1; - /* avoid BUF_ERROR next call, see above */ - } - return Z_OK$3; - /* If flush != Z_NO_FLUSH && avail_out == 0, the next call - * of deflate should use the same flush parameter to make sure - * that the flush is complete. So we don't have to output an - * empty block here, this will be done at next call. This also - * ensures that for a very small output buffer, we emit at most - * one empty block. - */ - } - if (bstate === BS_BLOCK_DONE) { - if (flush === Z_PARTIAL_FLUSH) { - _tr_align(s); - } - else if (flush !== Z_BLOCK$1) { /* FULL_FLUSH or SYNC_FLUSH */ - - _tr_stored_block(s, 0, 0, false); - /* For a full flush, this empty block will be recognized - * as a special marker by inflate_sync(). - */ - if (flush === Z_FULL_FLUSH$1) { - /*** CLEAR_HASH(s); ***/ /* forget history */ - zero(s.head); // Fill with NIL (= 0); - - if (s.lookahead === 0) { - s.strstart = 0; - s.block_start = 0; - s.insert = 0; - } - } - } - flush_pending(strm); - if (strm.avail_out === 0) { - s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */ - return Z_OK$3; - } - } - } - - if (flush !== Z_FINISH$3) { return Z_OK$3; } - if (s.wrap <= 0) { return Z_STREAM_END$3; } - - /* Write the trailer */ - if (s.wrap === 2) { - put_byte(s, strm.adler & 0xff); - put_byte(s, (strm.adler >> 8) & 0xff); - put_byte(s, (strm.adler >> 16) & 0xff); - put_byte(s, (strm.adler >> 24) & 0xff); - put_byte(s, strm.total_in & 0xff); - put_byte(s, (strm.total_in >> 8) & 0xff); - put_byte(s, (strm.total_in >> 16) & 0xff); - put_byte(s, (strm.total_in >> 24) & 0xff); - } - else - { - putShortMSB(s, strm.adler >>> 16); - putShortMSB(s, strm.adler & 0xffff); - } - - flush_pending(strm); - /* If avail_out is zero, the application will call deflate again - * to flush the rest. - */ - if (s.wrap > 0) { s.wrap = -s.wrap; } - /* write the trailer only once! */ - return s.pending !== 0 ? Z_OK$3 : Z_STREAM_END$3; - }; - - - const deflateEnd = (strm) => { - - if (deflateStateCheck(strm)) { - return Z_STREAM_ERROR$2; - } - - const status = strm.state.status; - - strm.state = null; - - return status === BUSY_STATE ? err(strm, Z_DATA_ERROR$2) : Z_OK$3; - }; - - - /* ========================================================================= - * Initializes the compression dictionary from the given byte - * sequence without producing any compressed output. - */ - const deflateSetDictionary = (strm, dictionary) => { - - let dictLength = dictionary.length; - - if (deflateStateCheck(strm)) { - return Z_STREAM_ERROR$2; - } - - const s = strm.state; - const wrap = s.wrap; - - if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) { - return Z_STREAM_ERROR$2; - } - - /* when using zlib wrappers, compute Adler-32 for provided dictionary */ - if (wrap === 1) { - /* adler32(strm->adler, dictionary, dictLength); */ - strm.adler = adler32_1(strm.adler, dictionary, dictLength, 0); - } - - s.wrap = 0; /* avoid computing Adler-32 in read_buf */ - - /* if dictionary would fill window, just replace the history */ - if (dictLength >= s.w_size) { - if (wrap === 0) { /* already empty otherwise */ - /*** CLEAR_HASH(s); ***/ - zero(s.head); // Fill with NIL (= 0); - s.strstart = 0; - s.block_start = 0; - s.insert = 0; - } - /* use the tail */ - // dictionary = dictionary.slice(dictLength - s.w_size); - let tmpDict = new Uint8Array(s.w_size); - tmpDict.set(dictionary.subarray(dictLength - s.w_size, dictLength), 0); - dictionary = tmpDict; - dictLength = s.w_size; - } - /* insert dictionary into window and hash */ - const avail = strm.avail_in; - const next = strm.next_in; - const input = strm.input; - strm.avail_in = dictLength; - strm.next_in = 0; - strm.input = dictionary; - fill_window(s); - while (s.lookahead >= MIN_MATCH) { - let str = s.strstart; - let n = s.lookahead - (MIN_MATCH - 1); - do { - /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ - s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]); - - s.prev[str & s.w_mask] = s.head[s.ins_h]; - - s.head[s.ins_h] = str; - str++; - } while (--n); - s.strstart = str; - s.lookahead = MIN_MATCH - 1; - fill_window(s); - } - s.strstart += s.lookahead; - s.block_start = s.strstart; - s.insert = s.lookahead; - s.lookahead = 0; - s.match_length = s.prev_length = MIN_MATCH - 1; - s.match_available = 0; - strm.next_in = next; - strm.input = input; - strm.avail_in = avail; - s.wrap = wrap; - return Z_OK$3; - }; - - - var deflateInit_1 = deflateInit; - var deflateInit2_1 = deflateInit2; - var deflateReset_1 = deflateReset; - var deflateResetKeep_1 = deflateResetKeep; - var deflateSetHeader_1 = deflateSetHeader; - var deflate_2$1 = deflate$2; - var deflateEnd_1 = deflateEnd; - var deflateSetDictionary_1 = deflateSetDictionary; - var deflateInfo = 'pako deflate (from Nodeca project)'; - - /* Not implemented - module.exports.deflateBound = deflateBound; - module.exports.deflateCopy = deflateCopy; - module.exports.deflateGetDictionary = deflateGetDictionary; - module.exports.deflateParams = deflateParams; - module.exports.deflatePending = deflatePending; - module.exports.deflatePrime = deflatePrime; - module.exports.deflateTune = deflateTune; - */ - - var deflate_1$2 = { - deflateInit: deflateInit_1, - deflateInit2: deflateInit2_1, - deflateReset: deflateReset_1, - deflateResetKeep: deflateResetKeep_1, - deflateSetHeader: deflateSetHeader_1, - deflate: deflate_2$1, - deflateEnd: deflateEnd_1, - deflateSetDictionary: deflateSetDictionary_1, - deflateInfo: deflateInfo - }; - - const _has = (obj, key) => { - return Object.prototype.hasOwnProperty.call(obj, key); - }; - - var assign = function (obj /*from1, from2, from3, ...*/) { - const sources = Array.prototype.slice.call(arguments, 1); - while (sources.length) { - const source = sources.shift(); - if (!source) { continue; } - - if (typeof source !== 'object') { - throw new TypeError(source + 'must be non-object'); - } - - for (const p in source) { - if (_has(source, p)) { - obj[p] = source[p]; - } - } - } - - return obj; - }; - - - // Join array of chunks to single array. - var flattenChunks = (chunks) => { - // calculate data length - let len = 0; - - for (let i = 0, l = chunks.length; i < l; i++) { - len += chunks[i].length; - } - - // join chunks - const result = new Uint8Array(len); - - for (let i = 0, pos = 0, l = chunks.length; i < l; i++) { - let chunk = chunks[i]; - result.set(chunk, pos); - pos += chunk.length; - } - - return result; - }; - - var common = { - assign: assign, - flattenChunks: flattenChunks - }; - - // String encode/decode helpers - - - // Quick check if we can use fast array to bin string conversion - // - // - apply(Array) can fail on Android 2.2 - // - apply(Uint8Array) can fail on iOS 5.1 Safari - // - let STR_APPLY_UIA_OK = true; - - try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; } - - - // Table with utf8 lengths (calculated by first byte of sequence) - // Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS, - // because max possible codepoint is 0x10ffff - const _utf8len = new Uint8Array(256); - for (let q = 0; q < 256; q++) { - _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1); - } - _utf8len[254] = _utf8len[254] = 1; // Invalid sequence start - - - // convert string to array (typed, when possible) - var string2buf = (str) => { - if (typeof TextEncoder === 'function' && TextEncoder.prototype.encode) { - return new TextEncoder().encode(str); - } - - let buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0; - - // count binary size - for (m_pos = 0; m_pos < str_len; m_pos++) { - c = str.charCodeAt(m_pos); - if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) { - c2 = str.charCodeAt(m_pos + 1); - if ((c2 & 0xfc00) === 0xdc00) { - c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); - m_pos++; - } - } - buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4; - } - - // allocate buffer - buf = new Uint8Array(buf_len); - - // convert - for (i = 0, m_pos = 0; i < buf_len; m_pos++) { - c = str.charCodeAt(m_pos); - if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) { - c2 = str.charCodeAt(m_pos + 1); - if ((c2 & 0xfc00) === 0xdc00) { - c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); - m_pos++; - } - } - if (c < 0x80) { - /* one byte */ - buf[i++] = c; - } else if (c < 0x800) { - /* two bytes */ - buf[i++] = 0xC0 | (c >>> 6); - buf[i++] = 0x80 | (c & 0x3f); - } else if (c < 0x10000) { - /* three bytes */ - buf[i++] = 0xE0 | (c >>> 12); - buf[i++] = 0x80 | (c >>> 6 & 0x3f); - buf[i++] = 0x80 | (c & 0x3f); - } else { - /* four bytes */ - buf[i++] = 0xf0 | (c >>> 18); - buf[i++] = 0x80 | (c >>> 12 & 0x3f); - buf[i++] = 0x80 | (c >>> 6 & 0x3f); - buf[i++] = 0x80 | (c & 0x3f); - } - } - - return buf; - }; - - // Helper - const buf2binstring = (buf, len) => { - // On Chrome, the arguments in a function call that are allowed is `65534`. - // If the length of the buffer is smaller than that, we can use this optimization, - // otherwise we will take a slower path. - if (len < 65534) { - if (buf.subarray && STR_APPLY_UIA_OK) { - return String.fromCharCode.apply(null, buf.length === len ? buf : buf.subarray(0, len)); - } - } - - let result = ''; - for (let i = 0; i < len; i++) { - result += String.fromCharCode(buf[i]); - } - return result; - }; - - - // convert array to string - var buf2string = (buf, max) => { - const len = max || buf.length; - - if (typeof TextDecoder === 'function' && TextDecoder.prototype.decode) { - return new TextDecoder().decode(buf.subarray(0, max)); - } - - let i, out; - - // Reserve max possible length (2 words per char) - // NB: by unknown reasons, Array is significantly faster for - // String.fromCharCode.apply than Uint16Array. - const utf16buf = new Array(len * 2); - - for (out = 0, i = 0; i < len;) { - let c = buf[i++]; - // quick process ascii - if (c < 0x80) { utf16buf[out++] = c; continue; } - - let c_len = _utf8len[c]; - // skip 5 & 6 byte codes - if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; } - - // apply mask on first byte - c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07; - // join the rest - while (c_len > 1 && i < len) { - c = (c << 6) | (buf[i++] & 0x3f); - c_len--; - } - - // terminated by end of string? - if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; } - - if (c < 0x10000) { - utf16buf[out++] = c; - } else { - c -= 0x10000; - utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff); - utf16buf[out++] = 0xdc00 | (c & 0x3ff); - } - } - - return buf2binstring(utf16buf, out); - }; - - - // Calculate max possible position in utf8 buffer, - // that will not break sequence. If that's not possible - // - (very small limits) return max size as is. - // - // buf[] - utf8 bytes array - // max - length limit (mandatory); - var utf8border = (buf, max) => { - - max = max || buf.length; - if (max > buf.length) { max = buf.length; } - - // go back from last position, until start of sequence found - let pos = max - 1; - while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; } - - // Very small and broken sequence, - // return max, because we should return something anyway. - if (pos < 0) { return max; } - - // If we came to start of buffer - that means buffer is too small, - // return max too. - if (pos === 0) { return max; } - - return (pos + _utf8len[buf[pos]] > max) ? pos : max; - }; - - var strings = { - string2buf: string2buf, - buf2string: buf2string, - utf8border: utf8border - }; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - function ZStream() { - /* next input byte */ - this.input = null; // JS specific, because we have no pointers - this.next_in = 0; - /* number of bytes available at input */ - this.avail_in = 0; - /* total number of input bytes read so far */ - this.total_in = 0; - /* next output byte should be put there */ - this.output = null; // JS specific, because we have no pointers - this.next_out = 0; - /* remaining free space at output */ - this.avail_out = 0; - /* total number of bytes output so far */ - this.total_out = 0; - /* last error message, NULL if no error */ - this.msg = ''/*Z_NULL*/; - /* not visible by applications */ - this.state = null; - /* best guess about the data type: binary or text */ - this.data_type = 2/*Z_UNKNOWN*/; - /* adler32 value of the uncompressed data */ - this.adler = 0; - } - - var zstream = ZStream; - - const toString$1 = Object.prototype.toString; - - /* Public constants ==========================================================*/ - /* ===========================================================================*/ - - const { - Z_NO_FLUSH: Z_NO_FLUSH$1, Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH: Z_FINISH$2, - Z_OK: Z_OK$2, Z_STREAM_END: Z_STREAM_END$2, - Z_DEFAULT_COMPRESSION, - Z_DEFAULT_STRATEGY, - Z_DEFLATED: Z_DEFLATED$1 - } = constants$2; - - /* ===========================================================================*/ - - - /** - * class Deflate - * - * Generic JS-style wrapper for zlib calls. If you don't need - * streaming behaviour - use more simple functions: [[deflate]], - * [[deflateRaw]] and [[gzip]]. - **/ - - /* internal - * Deflate.chunks -> Array - * - * Chunks of output data, if [[Deflate#onData]] not overridden. - **/ - - /** - * Deflate.result -> Uint8Array - * - * Compressed result, generated by default [[Deflate#onData]] - * and [[Deflate#onEnd]] handlers. Filled after you push last chunk - * (call [[Deflate#push]] with `Z_FINISH` / `true` param). - **/ - - /** - * Deflate.err -> Number - * - * Error code after deflate finished. 0 (Z_OK) on success. - * You will not need it in real life, because deflate errors - * are possible only on wrong options or bad `onData` / `onEnd` - * custom handlers. - **/ - - /** - * Deflate.msg -> String - * - * Error message, if [[Deflate.err]] != 0 - **/ - - - /** - * new Deflate(options) - * - options (Object): zlib deflate options. - * - * Creates new deflator instance with specified params. Throws exception - * on bad params. Supported options: - * - * - `level` - * - `windowBits` - * - `memLevel` - * - `strategy` - * - `dictionary` - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information on these. - * - * Additional options, for internal needs: - * - * - `chunkSize` - size of generated data chunks (16K by default) - * - `raw` (Boolean) - do raw deflate - * - `gzip` (Boolean) - create gzip wrapper - * - `header` (Object) - custom header for gzip - * - `text` (Boolean) - true if compressed data believed to be text - * - `time` (Number) - modification time, unix timestamp - * - `os` (Number) - operation system code - * - `extra` (Array) - array of bytes with extra data (max 65536) - * - `name` (String) - file name (binary string) - * - `comment` (String) - comment (binary string) - * - `hcrc` (Boolean) - true if header crc should be added - * - * ##### Example: - * - * ```javascript - * const pako = require('pako') - * , chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9]) - * , chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]); - * - * const deflate = new pako.Deflate({ level: 3}); - * - * deflate.push(chunk1, false); - * deflate.push(chunk2, true); // true -> last chunk - * - * if (deflate.err) { throw new Error(deflate.err); } - * - * console.log(deflate.result); - * ``` - **/ - function Deflate$1(options) { - this.options = common.assign({ - level: Z_DEFAULT_COMPRESSION, - method: Z_DEFLATED$1, - chunkSize: 16384, - windowBits: 15, - memLevel: 8, - strategy: Z_DEFAULT_STRATEGY - }, options || {}); - - let opt = this.options; - - if (opt.raw && (opt.windowBits > 0)) { - opt.windowBits = -opt.windowBits; - } - - else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) { - opt.windowBits += 16; - } - - this.err = 0; // error code, if happens (0 = Z_OK) - this.msg = ''; // error message - this.ended = false; // used to avoid multiple onEnd() calls - this.chunks = []; // chunks of compressed data - - this.strm = new zstream(); - this.strm.avail_out = 0; - - let status = deflate_1$2.deflateInit2( - this.strm, - opt.level, - opt.method, - opt.windowBits, - opt.memLevel, - opt.strategy - ); - - if (status !== Z_OK$2) { - throw new Error(messages[status]); - } - - if (opt.header) { - deflate_1$2.deflateSetHeader(this.strm, opt.header); - } - - if (opt.dictionary) { - let dict; - // Convert data if needed - if (typeof opt.dictionary === 'string') { - // If we need to compress text, change encoding to utf8. - dict = strings.string2buf(opt.dictionary); - } else if (toString$1.call(opt.dictionary) === '[object ArrayBuffer]') { - dict = new Uint8Array(opt.dictionary); - } else { - dict = opt.dictionary; - } - - status = deflate_1$2.deflateSetDictionary(this.strm, dict); - - if (status !== Z_OK$2) { - throw new Error(messages[status]); - } - - this._dict_set = true; - } - } - - /** - * Deflate#push(data[, flush_mode]) -> Boolean - * - data (Uint8Array|ArrayBuffer|String): input data. Strings will be - * converted to utf8 byte sequence. - * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes. - * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH. - * - * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with - * new compressed chunks. Returns `true` on success. The last data block must - * have `flush_mode` Z_FINISH (or `true`). That will flush internal pending - * buffers and call [[Deflate#onEnd]]. - * - * On fail call [[Deflate#onEnd]] with error code and return false. - * - * ##### Example - * - * ```javascript - * push(chunk, false); // push one of data chunks - * ... - * push(chunk, true); // push last chunk - * ``` - **/ - Deflate$1.prototype.push = function (data, flush_mode) { - const strm = this.strm; - const chunkSize = this.options.chunkSize; - let status, _flush_mode; - - if (this.ended) { return false; } - - if (flush_mode === ~~flush_mode) _flush_mode = flush_mode; - else _flush_mode = flush_mode === true ? Z_FINISH$2 : Z_NO_FLUSH$1; - - // Convert data if needed - if (typeof data === 'string') { - // If we need to compress text, change encoding to utf8. - strm.input = strings.string2buf(data); - } else if (toString$1.call(data) === '[object ArrayBuffer]') { - strm.input = new Uint8Array(data); - } else { - strm.input = data; - } - - strm.next_in = 0; - strm.avail_in = strm.input.length; - - for (;;) { - if (strm.avail_out === 0) { - strm.output = new Uint8Array(chunkSize); - strm.next_out = 0; - strm.avail_out = chunkSize; - } - - // Make sure avail_out > 6 to avoid repeating markers - if ((_flush_mode === Z_SYNC_FLUSH || _flush_mode === Z_FULL_FLUSH) && strm.avail_out <= 6) { - this.onData(strm.output.subarray(0, strm.next_out)); - strm.avail_out = 0; - continue; - } - - status = deflate_1$2.deflate(strm, _flush_mode); - - // Ended => flush and finish - if (status === Z_STREAM_END$2) { - if (strm.next_out > 0) { - this.onData(strm.output.subarray(0, strm.next_out)); - } - status = deflate_1$2.deflateEnd(this.strm); - this.onEnd(status); - this.ended = true; - return status === Z_OK$2; - } - - // Flush if out buffer full - if (strm.avail_out === 0) { - this.onData(strm.output); - continue; - } - - // Flush if requested and has data - if (_flush_mode > 0 && strm.next_out > 0) { - this.onData(strm.output.subarray(0, strm.next_out)); - strm.avail_out = 0; - continue; - } - - if (strm.avail_in === 0) break; - } - - return true; - }; - - - /** - * Deflate#onData(chunk) -> Void - * - chunk (Uint8Array): output data. - * - * By default, stores data blocks in `chunks[]` property and glue - * those in `onEnd`. Override this handler, if you need another behaviour. - **/ - Deflate$1.prototype.onData = function (chunk) { - this.chunks.push(chunk); - }; - - - /** - * Deflate#onEnd(status) -> Void - * - status (Number): deflate status. 0 (Z_OK) on success, - * other if not. - * - * Called once after you tell deflate that the input stream is - * complete (Z_FINISH). By default - join collected chunks, - * free memory and fill `results` / `err` properties. - **/ - Deflate$1.prototype.onEnd = function (status) { - // On success - join - if (status === Z_OK$2) { - this.result = common.flattenChunks(this.chunks); - } - this.chunks = []; - this.err = status; - this.msg = this.strm.msg; - }; - - - /** - * deflate(data[, options]) -> Uint8Array - * - data (Uint8Array|ArrayBuffer|String): input data to compress. - * - options (Object): zlib deflate options. - * - * Compress `data` with deflate algorithm and `options`. - * - * Supported options are: - * - * - level - * - windowBits - * - memLevel - * - strategy - * - dictionary - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information on these. - * - * Sugar (options): - * - * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify - * negative windowBits implicitly. - * - * ##### Example: - * - * ```javascript - * const pako = require('pako') - * const data = new Uint8Array([1,2,3,4,5,6,7,8,9]); - * - * console.log(pako.deflate(data)); - * ``` - **/ - function deflate$1(input, options) { - const deflator = new Deflate$1(options); - - deflator.push(input, true); - - // That will never happens, if you don't cheat with options :) - if (deflator.err) { throw deflator.msg || messages[deflator.err]; } - - return deflator.result; - } - - - /** - * deflateRaw(data[, options]) -> Uint8Array - * - data (Uint8Array|ArrayBuffer|String): input data to compress. - * - options (Object): zlib deflate options. - * - * The same as [[deflate]], but creates raw data, without wrapper - * (header and adler32 crc). - **/ - function deflateRaw$1(input, options) { - options = options || {}; - options.raw = true; - return deflate$1(input, options); - } - - - /** - * gzip(data[, options]) -> Uint8Array - * - data (Uint8Array|ArrayBuffer|String): input data to compress. - * - options (Object): zlib deflate options. - * - * The same as [[deflate]], but create gzip wrapper instead of - * deflate one. - **/ - function gzip$1(input, options) { - options = options || {}; - options.gzip = true; - return deflate$1(input, options); - } - - - var Deflate_1$1 = Deflate$1; - var deflate_2 = deflate$1; - var deflateRaw_1$1 = deflateRaw$1; - var gzip_1$1 = gzip$1; - var constants$1 = constants$2; - - var deflate_1$1 = { - Deflate: Deflate_1$1, - deflate: deflate_2, - deflateRaw: deflateRaw_1$1, - gzip: gzip_1$1, - constants: constants$1 - }; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - // See state defs from inflate.js - const BAD$1 = 16209; /* got a data error -- remain here until reset */ - const TYPE$1 = 16191; /* i: waiting for type bits, including last-flag bit */ - - /* - Decode literal, length, and distance codes and write out the resulting - literal and match bytes until either not enough input or output is - available, an end-of-block is encountered, or a data error is encountered. - When large enough input and output buffers are supplied to inflate(), for - example, a 16K input buffer and a 64K output buffer, more than 95% of the - inflate execution time is spent in this routine. - - Entry assumptions: - - state.mode === LEN - strm.avail_in >= 6 - strm.avail_out >= 258 - start >= strm.avail_out - state.bits < 8 - - On return, state.mode is one of: - - LEN -- ran out of enough output space or enough available input - TYPE -- reached end of block code, inflate() to interpret next block - BAD -- error in block data - - Notes: - - - The maximum input bits used by a length/distance pair is 15 bits for the - length code, 5 bits for the length extra, 15 bits for the distance code, - and 13 bits for the distance extra. This totals 48 bits, or six bytes. - Therefore if strm.avail_in >= 6, then there is enough input to avoid - checking for available input while decoding. - - - The maximum bytes that a single length/distance pair can output is 258 - bytes, which is the maximum length that can be coded. inflate_fast() - requires strm.avail_out >= 258 for each loop to avoid checking for - output space. - */ - var inffast = function inflate_fast(strm, start) { - let _in; /* local strm.input */ - let last; /* have enough input while in < last */ - let _out; /* local strm.output */ - let beg; /* inflate()'s initial strm.output */ - let end; /* while out < end, enough space available */ - //#ifdef INFLATE_STRICT - let dmax; /* maximum distance from zlib header */ - //#endif - let wsize; /* window size or zero if not using window */ - let whave; /* valid bytes in the window */ - let wnext; /* window write index */ - // Use `s_window` instead `window`, avoid conflict with instrumentation tools - let s_window; /* allocated sliding window, if wsize != 0 */ - let hold; /* local strm.hold */ - let bits; /* local strm.bits */ - let lcode; /* local strm.lencode */ - let dcode; /* local strm.distcode */ - let lmask; /* mask for first level of length codes */ - let dmask; /* mask for first level of distance codes */ - let here; /* retrieved table entry */ - let op; /* code bits, operation, extra bits, or */ - /* window position, window bytes to copy */ - let len; /* match length, unused bytes */ - let dist; /* match distance */ - let from; /* where to copy match from */ - let from_source; - - - let input, output; // JS specific, because we have no pointers - - /* copy state to local variables */ - const state = strm.state; - //here = state.here; - _in = strm.next_in; - input = strm.input; - last = _in + (strm.avail_in - 5); - _out = strm.next_out; - output = strm.output; - beg = _out - (start - strm.avail_out); - end = _out + (strm.avail_out - 257); - //#ifdef INFLATE_STRICT - dmax = state.dmax; - //#endif - wsize = state.wsize; - whave = state.whave; - wnext = state.wnext; - s_window = state.window; - hold = state.hold; - bits = state.bits; - lcode = state.lencode; - dcode = state.distcode; - lmask = (1 << state.lenbits) - 1; - dmask = (1 << state.distbits) - 1; - - - /* decode literals and length/distances until end-of-block or not enough - input data or output space */ - - top: - do { - if (bits < 15) { - hold += input[_in++] << bits; - bits += 8; - hold += input[_in++] << bits; - bits += 8; - } - - here = lcode[hold & lmask]; - - dolen: - for (;;) { // Goto emulation - op = here >>> 24/*here.bits*/; - hold >>>= op; - bits -= op; - op = (here >>> 16) & 0xff/*here.op*/; - if (op === 0) { /* literal */ - //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - // "inflate: literal '%c'\n" : - // "inflate: literal 0x%02x\n", here.val)); - output[_out++] = here & 0xffff/*here.val*/; - } - else if (op & 16) { /* length base */ - len = here & 0xffff/*here.val*/; - op &= 15; /* number of extra bits */ - if (op) { - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - } - len += hold & ((1 << op) - 1); - hold >>>= op; - bits -= op; - } - //Tracevv((stderr, "inflate: length %u\n", len)); - if (bits < 15) { - hold += input[_in++] << bits; - bits += 8; - hold += input[_in++] << bits; - bits += 8; - } - here = dcode[hold & dmask]; - - dodist: - for (;;) { // goto emulation - op = here >>> 24/*here.bits*/; - hold >>>= op; - bits -= op; - op = (here >>> 16) & 0xff/*here.op*/; - - if (op & 16) { /* distance base */ - dist = here & 0xffff/*here.val*/; - op &= 15; /* number of extra bits */ - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - } - } - dist += hold & ((1 << op) - 1); - //#ifdef INFLATE_STRICT - if (dist > dmax) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD$1; - break top; - } - //#endif - hold >>>= op; - bits -= op; - //Tracevv((stderr, "inflate: distance %u\n", dist)); - op = _out - beg; /* max distance in output */ - if (dist > op) { /* see if copy from window */ - op = dist - op; /* distance back in window */ - if (op > whave) { - if (state.sane) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD$1; - break top; - } - - // (!) This block is disabled in zlib defaults, - // don't enable it for binary compatibility - //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR - // if (len <= op - whave) { - // do { - // output[_out++] = 0; - // } while (--len); - // continue top; - // } - // len -= op - whave; - // do { - // output[_out++] = 0; - // } while (--op > whave); - // if (op === 0) { - // from = _out - dist; - // do { - // output[_out++] = output[from++]; - // } while (--len); - // continue top; - // } - //#endif - } - from = 0; // window index - from_source = s_window; - if (wnext === 0) { /* very common case */ - from += wsize - op; - if (op < len) { /* some from window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - else if (wnext < op) { /* wrap around window */ - from += wsize + wnext - op; - op -= wnext; - if (op < len) { /* some from end of window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = 0; - if (wnext < len) { /* some from start of window */ - op = wnext; - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - } - else { /* contiguous in window */ - from += wnext - op; - if (op < len) { /* some from window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - while (len > 2) { - output[_out++] = from_source[from++]; - output[_out++] = from_source[from++]; - output[_out++] = from_source[from++]; - len -= 3; - } - if (len) { - output[_out++] = from_source[from++]; - if (len > 1) { - output[_out++] = from_source[from++]; - } - } - } - else { - from = _out - dist; /* copy direct from output */ - do { /* minimum length is three */ - output[_out++] = output[from++]; - output[_out++] = output[from++]; - output[_out++] = output[from++]; - len -= 3; - } while (len > 2); - if (len) { - output[_out++] = output[from++]; - if (len > 1) { - output[_out++] = output[from++]; - } - } - } - } - else if ((op & 64) === 0) { /* 2nd level distance code */ - here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))]; - continue dodist; - } - else { - strm.msg = 'invalid distance code'; - state.mode = BAD$1; - break top; - } - - break; // need to emulate goto via "continue" - } - } - else if ((op & 64) === 0) { /* 2nd level length code */ - here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))]; - continue dolen; - } - else if (op & 32) { /* end-of-block */ - //Tracevv((stderr, "inflate: end of block\n")); - state.mode = TYPE$1; - break top; - } - else { - strm.msg = 'invalid literal/length code'; - state.mode = BAD$1; - break top; - } - - break; // need to emulate goto via "continue" - } - } while (_in < last && _out < end); - - /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ - len = bits >> 3; - _in -= len; - bits -= len << 3; - hold &= (1 << bits) - 1; - - /* update state and return */ - strm.next_in = _in; - strm.next_out = _out; - strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last)); - strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end)); - state.hold = hold; - state.bits = bits; - return; - }; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - const MAXBITS = 15; - const ENOUGH_LENS$1 = 852; - const ENOUGH_DISTS$1 = 592; - //const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); - - const CODES$1 = 0; - const LENS$1 = 1; - const DISTS$1 = 2; - - const lbase = new Uint16Array([ /* Length codes 257..285 base */ - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 - ]); - - const lext = new Uint8Array([ /* Length codes 257..285 extra */ - 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78 - ]); - - const dbase = new Uint16Array([ /* Distance codes 0..29 base */ - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, - 8193, 12289, 16385, 24577, 0, 0 - ]); - - const dext = new Uint8Array([ /* Distance codes 0..29 extra */ - 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, - 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, - 28, 28, 29, 29, 64, 64 - ]); - - const inflate_table = (type, lens, lens_index, codes, table, table_index, work, opts) => - { - const bits = opts.bits; - //here = opts.here; /* table entry for duplication */ - - let len = 0; /* a code's length in bits */ - let sym = 0; /* index of code symbols */ - let min = 0, max = 0; /* minimum and maximum code lengths */ - let root = 0; /* number of index bits for root table */ - let curr = 0; /* number of index bits for current table */ - let drop = 0; /* code bits to drop for sub-table */ - let left = 0; /* number of prefix codes available */ - let used = 0; /* code entries in table used */ - let huff = 0; /* Huffman code */ - let incr; /* for incrementing code, index */ - let fill; /* index for replicating entries */ - let low; /* low bits for current root entry */ - let mask; /* mask for low root bits */ - let next; /* next available space in table */ - let base = null; /* base value table to use */ - // let shoextra; /* extra bits table to use */ - let match; /* use base and extra for symbol >= match */ - const count = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */ - const offs = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */ - let extra = null; - - let here_bits, here_op, here_val; - - /* - Process a set of code lengths to create a canonical Huffman code. The - code lengths are lens[0..codes-1]. Each length corresponds to the - symbols 0..codes-1. The Huffman code is generated by first sorting the - symbols by length from short to long, and retaining the symbol order - for codes with equal lengths. Then the code starts with all zero bits - for the first code of the shortest length, and the codes are integer - increments for the same length, and zeros are appended as the length - increases. For the deflate format, these bits are stored backwards - from their more natural integer increment ordering, and so when the - decoding tables are built in the large loop below, the integer codes - are incremented backwards. - - This routine assumes, but does not check, that all of the entries in - lens[] are in the range 0..MAXBITS. The caller must assure this. - 1..MAXBITS is interpreted as that code length. zero means that that - symbol does not occur in this code. - - The codes are sorted by computing a count of codes for each length, - creating from that a table of starting indices for each length in the - sorted table, and then entering the symbols in order in the sorted - table. The sorted table is work[], with that space being provided by - the caller. - - The length counts are used for other purposes as well, i.e. finding - the minimum and maximum length codes, determining if there are any - codes at all, checking for a valid set of lengths, and looking ahead - at length counts to determine sub-table sizes when building the - decoding tables. - */ - - /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ - for (len = 0; len <= MAXBITS; len++) { - count[len] = 0; - } - for (sym = 0; sym < codes; sym++) { - count[lens[lens_index + sym]]++; - } - - /* bound code lengths, force root to be within code lengths */ - root = bits; - for (max = MAXBITS; max >= 1; max--) { - if (count[max] !== 0) { break; } - } - if (root > max) { - root = max; - } - if (max === 0) { /* no symbols to code at all */ - //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */ - //table.bits[opts.table_index] = 1; //here.bits = (var char)1; - //table.val[opts.table_index++] = 0; //here.val = (var short)0; - table[table_index++] = (1 << 24) | (64 << 16) | 0; - - - //table.op[opts.table_index] = 64; - //table.bits[opts.table_index] = 1; - //table.val[opts.table_index++] = 0; - table[table_index++] = (1 << 24) | (64 << 16) | 0; - - opts.bits = 1; - return 0; /* no symbols, but wait for decoding to report error */ - } - for (min = 1; min < max; min++) { - if (count[min] !== 0) { break; } - } - if (root < min) { - root = min; - } - - /* check for an over-subscribed or incomplete set of lengths */ - left = 1; - for (len = 1; len <= MAXBITS; len++) { - left <<= 1; - left -= count[len]; - if (left < 0) { - return -1; - } /* over-subscribed */ - } - if (left > 0 && (type === CODES$1 || max !== 1)) { - return -1; /* incomplete set */ - } - - /* generate offsets into symbol table for each length for sorting */ - offs[1] = 0; - for (len = 1; len < MAXBITS; len++) { - offs[len + 1] = offs[len] + count[len]; - } - - /* sort symbols by length, by symbol order within each length */ - for (sym = 0; sym < codes; sym++) { - if (lens[lens_index + sym] !== 0) { - work[offs[lens[lens_index + sym]]++] = sym; - } - } - - /* - Create and fill in decoding tables. In this loop, the table being - filled is at next and has curr index bits. The code being used is huff - with length len. That code is converted to an index by dropping drop - bits off of the bottom. For codes where len is less than drop + curr, - those top drop + curr - len bits are incremented through all values to - fill the table with replicated entries. - - root is the number of index bits for the root table. When len exceeds - root, sub-tables are created pointed to by the root entry with an index - of the low root bits of huff. This is saved in low to check for when a - new sub-table should be started. drop is zero when the root table is - being filled, and drop is root when sub-tables are being filled. - - When a new sub-table is needed, it is necessary to look ahead in the - code lengths to determine what size sub-table is needed. The length - counts are used for this, and so count[] is decremented as codes are - entered in the tables. - - used keeps track of how many table entries have been allocated from the - provided *table space. It is checked for LENS and DIST tables against - the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in - the initial root table size constants. See the comments in inftrees.h - for more information. - - sym increments through all symbols, and the loop terminates when - all codes of length max, i.e. all codes, have been processed. This - routine permits incomplete codes, so another loop after this one fills - in the rest of the decoding tables with invalid code markers. - */ - - /* set up for code type */ - // poor man optimization - use if-else instead of switch, - // to avoid deopts in old v8 - if (type === CODES$1) { - base = extra = work; /* dummy value--not used */ - match = 20; - - } else if (type === LENS$1) { - base = lbase; - extra = lext; - match = 257; - - } else { /* DISTS */ - base = dbase; - extra = dext; - match = 0; - } - - /* initialize opts for loop */ - huff = 0; /* starting code */ - sym = 0; /* starting code symbol */ - len = min; /* starting code length */ - next = table_index; /* current table to fill in */ - curr = root; /* current table index bits */ - drop = 0; /* current bits to drop from code for index */ - low = -1; /* trigger new sub-table when len > root */ - used = 1 << root; /* use root table entries */ - mask = used - 1; /* mask for comparing low */ - - /* check available table space */ - if ((type === LENS$1 && used > ENOUGH_LENS$1) || - (type === DISTS$1 && used > ENOUGH_DISTS$1)) { - return 1; - } - - /* process all codes and make table entries */ - for (;;) { - /* create table entry */ - here_bits = len - drop; - if (work[sym] + 1 < match) { - here_op = 0; - here_val = work[sym]; - } - else if (work[sym] >= match) { - here_op = extra[work[sym] - match]; - here_val = base[work[sym] - match]; - } - else { - here_op = 32 + 64; /* end of block */ - here_val = 0; - } - - /* replicate for those indices with low len bits equal to huff */ - incr = 1 << (len - drop); - fill = 1 << curr; - min = fill; /* save offset to next table */ - do { - fill -= incr; - table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0; - } while (fill !== 0); - - /* backwards increment the len-bit code huff */ - incr = 1 << (len - 1); - while (huff & incr) { - incr >>= 1; - } - if (incr !== 0) { - huff &= incr - 1; - huff += incr; - } else { - huff = 0; - } - - /* go to next symbol, update count, len */ - sym++; - if (--count[len] === 0) { - if (len === max) { break; } - len = lens[lens_index + work[sym]]; - } - - /* create new sub-table if needed */ - if (len > root && (huff & mask) !== low) { - /* if first time, transition to sub-tables */ - if (drop === 0) { - drop = root; - } - - /* increment past last table */ - next += min; /* here min is 1 << curr */ - - /* determine length of next table */ - curr = len - drop; - left = 1 << curr; - while (curr + drop < max) { - left -= count[curr + drop]; - if (left <= 0) { break; } - curr++; - left <<= 1; - } - - /* check for enough space */ - used += 1 << curr; - if ((type === LENS$1 && used > ENOUGH_LENS$1) || - (type === DISTS$1 && used > ENOUGH_DISTS$1)) { - return 1; - } - - /* point entry in root table to sub-table */ - low = huff & mask; - /*table.op[low] = curr; - table.bits[low] = root; - table.val[low] = next - opts.table_index;*/ - table[low] = (root << 24) | (curr << 16) | (next - table_index) |0; - } - } - - /* fill in remaining table entry if code is incomplete (guaranteed to have - at most one remaining entry, since if the code is incomplete, the - maximum code length that was allowed to get this far is one bit) */ - if (huff !== 0) { - //table.op[next + huff] = 64; /* invalid code marker */ - //table.bits[next + huff] = len - drop; - //table.val[next + huff] = 0; - table[next + huff] = ((len - drop) << 24) | (64 << 16) |0; - } - - /* set return parameters */ - //opts.table_index += used; - opts.bits = root; - return 0; - }; - - - var inftrees = inflate_table; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - - - - - - const CODES = 0; - const LENS = 1; - const DISTS = 2; - - /* Public constants ==========================================================*/ - /* ===========================================================================*/ - - const { - Z_FINISH: Z_FINISH$1, Z_BLOCK, Z_TREES, - Z_OK: Z_OK$1, Z_STREAM_END: Z_STREAM_END$1, Z_NEED_DICT: Z_NEED_DICT$1, Z_STREAM_ERROR: Z_STREAM_ERROR$1, Z_DATA_ERROR: Z_DATA_ERROR$1, Z_MEM_ERROR: Z_MEM_ERROR$1, Z_BUF_ERROR, - Z_DEFLATED - } = constants$2; - - - /* STATES ====================================================================*/ - /* ===========================================================================*/ - - - const HEAD = 16180; /* i: waiting for magic header */ - const FLAGS = 16181; /* i: waiting for method and flags (gzip) */ - const TIME = 16182; /* i: waiting for modification time (gzip) */ - const OS = 16183; /* i: waiting for extra flags and operating system (gzip) */ - const EXLEN = 16184; /* i: waiting for extra length (gzip) */ - const EXTRA = 16185; /* i: waiting for extra bytes (gzip) */ - const NAME = 16186; /* i: waiting for end of file name (gzip) */ - const COMMENT = 16187; /* i: waiting for end of comment (gzip) */ - const HCRC = 16188; /* i: waiting for header crc (gzip) */ - const DICTID = 16189; /* i: waiting for dictionary check value */ - const DICT = 16190; /* waiting for inflateSetDictionary() call */ - const TYPE = 16191; /* i: waiting for type bits, including last-flag bit */ - const TYPEDO = 16192; /* i: same, but skip check to exit inflate on new block */ - const STORED = 16193; /* i: waiting for stored size (length and complement) */ - const COPY_ = 16194; /* i/o: same as COPY below, but only first time in */ - const COPY = 16195; /* i/o: waiting for input or output to copy stored block */ - const TABLE = 16196; /* i: waiting for dynamic block table lengths */ - const LENLENS = 16197; /* i: waiting for code length code lengths */ - const CODELENS = 16198; /* i: waiting for length/lit and distance code lengths */ - const LEN_ = 16199; /* i: same as LEN below, but only first time in */ - const LEN = 16200; /* i: waiting for length/lit/eob code */ - const LENEXT = 16201; /* i: waiting for length extra bits */ - const DIST = 16202; /* i: waiting for distance code */ - const DISTEXT = 16203; /* i: waiting for distance extra bits */ - const MATCH = 16204; /* o: waiting for output space to copy string */ - const LIT = 16205; /* o: waiting for output space to write literal */ - const CHECK = 16206; /* i: waiting for 32-bit check value */ - const LENGTH = 16207; /* i: waiting for 32-bit length (gzip) */ - const DONE = 16208; /* finished check, done -- remain here until reset */ - const BAD = 16209; /* got a data error -- remain here until reset */ - const MEM = 16210; /* got an inflate() memory error -- remain here until reset */ - const SYNC = 16211; /* looking for synchronization bytes to restart inflate() */ - - /* ===========================================================================*/ - - - - const ENOUGH_LENS = 852; - const ENOUGH_DISTS = 592; - //const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); - - const MAX_WBITS = 15; - /* 32K LZ77 window */ - const DEF_WBITS = MAX_WBITS; - - - const zswap32 = (q) => { - - return (((q >>> 24) & 0xff) + - ((q >>> 8) & 0xff00) + - ((q & 0xff00) << 8) + - ((q & 0xff) << 24)); - }; - - - function InflateState() { - this.strm = null; /* pointer back to this zlib stream */ - this.mode = 0; /* current inflate mode */ - this.last = false; /* true if processing last block */ - this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip, - bit 2 true to validate check value */ - this.havedict = false; /* true if dictionary provided */ - this.flags = 0; /* gzip header method and flags (0 if zlib), or - -1 if raw or no header yet */ - this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */ - this.check = 0; /* protected copy of check value */ - this.total = 0; /* protected copy of output count */ - // TODO: may be {} - this.head = null; /* where to save gzip header information */ - - /* sliding window */ - this.wbits = 0; /* log base 2 of requested window size */ - this.wsize = 0; /* window size or zero if not using window */ - this.whave = 0; /* valid bytes in the window */ - this.wnext = 0; /* window write index */ - this.window = null; /* allocated sliding window, if needed */ - - /* bit accumulator */ - this.hold = 0; /* input bit accumulator */ - this.bits = 0; /* number of bits in "in" */ - - /* for string and stored block copying */ - this.length = 0; /* literal or length of data to copy */ - this.offset = 0; /* distance back to copy string from */ - - /* for table and code decoding */ - this.extra = 0; /* extra bits needed */ - - /* fixed and dynamic code tables */ - this.lencode = null; /* starting table for length/literal codes */ - this.distcode = null; /* starting table for distance codes */ - this.lenbits = 0; /* index bits for lencode */ - this.distbits = 0; /* index bits for distcode */ - - /* dynamic table building */ - this.ncode = 0; /* number of code length code lengths */ - this.nlen = 0; /* number of length code lengths */ - this.ndist = 0; /* number of distance code lengths */ - this.have = 0; /* number of code lengths in lens[] */ - this.next = null; /* next available space in codes[] */ - - this.lens = new Uint16Array(320); /* temporary storage for code lengths */ - this.work = new Uint16Array(288); /* work area for code table building */ - - /* - because we don't have pointers in js, we use lencode and distcode directly - as buffers so we don't need codes - */ - //this.codes = new Int32Array(ENOUGH); /* space for code tables */ - this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */ - this.distdyn = null; /* dynamic table for distance codes (JS specific) */ - this.sane = 0; /* if false, allow invalid distance too far */ - this.back = 0; /* bits back of last unprocessed length/lit */ - this.was = 0; /* initial length of match */ - } - - - const inflateStateCheck = (strm) => { - - if (!strm) { - return 1; - } - const state = strm.state; - if (!state || state.strm !== strm || - state.mode < HEAD || state.mode > SYNC) { - return 1; - } - return 0; - }; - - - const inflateResetKeep = (strm) => { - - if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; } - const state = strm.state; - strm.total_in = strm.total_out = state.total = 0; - strm.msg = ''; /*Z_NULL*/ - if (state.wrap) { /* to support ill-conceived Java test suite */ - strm.adler = state.wrap & 1; - } - state.mode = HEAD; - state.last = 0; - state.havedict = 0; - state.flags = -1; - state.dmax = 32768; - state.head = null/*Z_NULL*/; - state.hold = 0; - state.bits = 0; - //state.lencode = state.distcode = state.next = state.codes; - state.lencode = state.lendyn = new Int32Array(ENOUGH_LENS); - state.distcode = state.distdyn = new Int32Array(ENOUGH_DISTS); - - state.sane = 1; - state.back = -1; - //Tracev((stderr, "inflate: reset\n")); - return Z_OK$1; - }; - - - const inflateReset = (strm) => { - - if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; } - const state = strm.state; - state.wsize = 0; - state.whave = 0; - state.wnext = 0; - return inflateResetKeep(strm); - - }; - - - const inflateReset2 = (strm, windowBits) => { - let wrap; - - /* get the state */ - if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; } - const state = strm.state; - - /* extract wrap request from windowBits parameter */ - if (windowBits < 0) { - wrap = 0; - windowBits = -windowBits; - } - else { - wrap = (windowBits >> 4) + 5; - if (windowBits < 48) { - windowBits &= 15; - } - } - - /* set number of window bits, free window if different */ - if (windowBits && (windowBits < 8 || windowBits > 15)) { - return Z_STREAM_ERROR$1; - } - if (state.window !== null && state.wbits !== windowBits) { - state.window = null; - } - - /* update state and reset the rest of it */ - state.wrap = wrap; - state.wbits = windowBits; - return inflateReset(strm); - }; - - - const inflateInit2 = (strm, windowBits) => { - - if (!strm) { return Z_STREAM_ERROR$1; } - //strm.msg = Z_NULL; /* in case we return an error */ - - const state = new InflateState(); - - //if (state === Z_NULL) return Z_MEM_ERROR; - //Tracev((stderr, "inflate: allocated\n")); - strm.state = state; - state.strm = strm; - state.window = null/*Z_NULL*/; - state.mode = HEAD; /* to pass state test in inflateReset2() */ - const ret = inflateReset2(strm, windowBits); - if (ret !== Z_OK$1) { - strm.state = null/*Z_NULL*/; - } - return ret; - }; - - - const inflateInit = (strm) => { - - return inflateInit2(strm, DEF_WBITS); - }; - - - /* - Return state with length and distance decoding tables and index sizes set to - fixed code decoding. Normally this returns fixed tables from inffixed.h. - If BUILDFIXED is defined, then instead this routine builds the tables the - first time it's called, and returns those tables the first time and - thereafter. This reduces the size of the code by about 2K bytes, in - exchange for a little execution time. However, BUILDFIXED should not be - used for threaded applications, since the rewriting of the tables and virgin - may not be thread-safe. - */ - let virgin = true; - - let lenfix, distfix; // We have no pointers in JS, so keep tables separate - - - const fixedtables = (state) => { - - /* build fixed huffman tables if first call (may not be thread safe) */ - if (virgin) { - lenfix = new Int32Array(512); - distfix = new Int32Array(32); - - /* literal/length table */ - let sym = 0; - while (sym < 144) { state.lens[sym++] = 8; } - while (sym < 256) { state.lens[sym++] = 9; } - while (sym < 280) { state.lens[sym++] = 7; } - while (sym < 288) { state.lens[sym++] = 8; } - - inftrees(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 }); - - /* distance table */ - sym = 0; - while (sym < 32) { state.lens[sym++] = 5; } - - inftrees(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 }); - - /* do this just once */ - virgin = false; - } - - state.lencode = lenfix; - state.lenbits = 9; - state.distcode = distfix; - state.distbits = 5; - }; - - - /* - Update the window with the last wsize (normally 32K) bytes written before - returning. If window does not exist yet, create it. This is only called - when a window is already in use, or when output has been written during this - inflate call, but the end of the deflate stream has not been reached yet. - It is also called to create a window for dictionary data when a dictionary - is loaded. - - Providing output buffers larger than 32K to inflate() should provide a speed - advantage, since only the last 32K of output is copied to the sliding window - upon return from inflate(), and since all distances after the first 32K of - output will fall in the output data, making match copies simpler and faster. - The advantage may be dependent on the size of the processor's data caches. - */ - const updatewindow = (strm, src, end, copy) => { - - let dist; - const state = strm.state; - - /* if it hasn't been done already, allocate space for the window */ - if (state.window === null) { - state.wsize = 1 << state.wbits; - state.wnext = 0; - state.whave = 0; - - state.window = new Uint8Array(state.wsize); - } - - /* copy state->wsize or less output bytes into the circular window */ - if (copy >= state.wsize) { - state.window.set(src.subarray(end - state.wsize, end), 0); - state.wnext = 0; - state.whave = state.wsize; - } - else { - dist = state.wsize - state.wnext; - if (dist > copy) { - dist = copy; - } - //zmemcpy(state->window + state->wnext, end - copy, dist); - state.window.set(src.subarray(end - copy, end - copy + dist), state.wnext); - copy -= dist; - if (copy) { - //zmemcpy(state->window, end - copy, copy); - state.window.set(src.subarray(end - copy, end), 0); - state.wnext = copy; - state.whave = state.wsize; - } - else { - state.wnext += dist; - if (state.wnext === state.wsize) { state.wnext = 0; } - if (state.whave < state.wsize) { state.whave += dist; } - } - } - return 0; - }; - - - const inflate$2 = (strm, flush) => { - - let state; - let input, output; // input/output buffers - let next; /* next input INDEX */ - let put; /* next output INDEX */ - let have, left; /* available input and output */ - let hold; /* bit buffer */ - let bits; /* bits in bit buffer */ - let _in, _out; /* save starting available input and output */ - let copy; /* number of stored or match bytes to copy */ - let from; /* where to copy match bytes from */ - let from_source; - let here = 0; /* current decoding table entry */ - let here_bits, here_op, here_val; // paked "here" denormalized (JS specific) - //let last; /* parent table entry */ - let last_bits, last_op, last_val; // paked "last" denormalized (JS specific) - let len; /* length to copy for repeats, bits to drop */ - let ret; /* return code */ - const hbuf = new Uint8Array(4); /* buffer for gzip header crc calculation */ - let opts; - - let n; // temporary variable for NEED_BITS - - const order = /* permutation of code lengths */ - new Uint8Array([ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]); - - - if (inflateStateCheck(strm) || !strm.output || - (!strm.input && strm.avail_in !== 0)) { - return Z_STREAM_ERROR$1; - } - - state = strm.state; - if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */ - - - //--- LOAD() --- - put = strm.next_out; - output = strm.output; - left = strm.avail_out; - next = strm.next_in; - input = strm.input; - have = strm.avail_in; - hold = state.hold; - bits = state.bits; - //--- - - _in = have; - _out = left; - ret = Z_OK$1; - - inf_leave: // goto emulation - for (;;) { - switch (state.mode) { - case HEAD: - if (state.wrap === 0) { - state.mode = TYPEDO; - break; - } - //=== NEEDBITS(16); - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */ - if (state.wbits === 0) { - state.wbits = 15; - } - state.check = 0/*crc32(0L, Z_NULL, 0)*/; - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - state.check = crc32_1(state.check, hbuf, 2, 0); - //===// - - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = FLAGS; - break; - } - if (state.head) { - state.head.done = false; - } - if (!(state.wrap & 1) || /* check if zlib header allowed */ - (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) { - strm.msg = 'incorrect header check'; - state.mode = BAD; - break; - } - if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) { - strm.msg = 'unknown compression method'; - state.mode = BAD; - break; - } - //--- DROPBITS(4) ---// - hold >>>= 4; - bits -= 4; - //---// - len = (hold & 0x0f)/*BITS(4)*/ + 8; - if (state.wbits === 0) { - state.wbits = len; - } - if (len > 15 || len > state.wbits) { - strm.msg = 'invalid window size'; - state.mode = BAD; - break; - } - - // !!! pako patch. Force use `options.windowBits` if passed. - // Required to always use max window size by default. - state.dmax = 1 << state.wbits; - //state.dmax = 1 << len; - - state.flags = 0; /* indicate zlib header */ - //Tracev((stderr, "inflate: zlib header ok\n")); - strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; - state.mode = hold & 0x200 ? DICTID : TYPE; - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - break; - case FLAGS: - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.flags = hold; - if ((state.flags & 0xff) !== Z_DEFLATED) { - strm.msg = 'unknown compression method'; - state.mode = BAD; - break; - } - if (state.flags & 0xe000) { - strm.msg = 'unknown header flags set'; - state.mode = BAD; - break; - } - if (state.head) { - state.head.text = ((hold >> 8) & 1); - } - if ((state.flags & 0x0200) && (state.wrap & 4)) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - state.check = crc32_1(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = TIME; - /* falls through */ - case TIME: - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (state.head) { - state.head.time = hold; - } - if ((state.flags & 0x0200) && (state.wrap & 4)) { - //=== CRC4(state.check, hold) - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - hbuf[2] = (hold >>> 16) & 0xff; - hbuf[3] = (hold >>> 24) & 0xff; - state.check = crc32_1(state.check, hbuf, 4, 0); - //=== - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = OS; - /* falls through */ - case OS: - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (state.head) { - state.head.xflags = (hold & 0xff); - state.head.os = (hold >> 8); - } - if ((state.flags & 0x0200) && (state.wrap & 4)) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - state.check = crc32_1(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = EXLEN; - /* falls through */ - case EXLEN: - if (state.flags & 0x0400) { - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.length = hold; - if (state.head) { - state.head.extra_len = hold; - } - if ((state.flags & 0x0200) && (state.wrap & 4)) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - state.check = crc32_1(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - } - else if (state.head) { - state.head.extra = null/*Z_NULL*/; - } - state.mode = EXTRA; - /* falls through */ - case EXTRA: - if (state.flags & 0x0400) { - copy = state.length; - if (copy > have) { copy = have; } - if (copy) { - if (state.head) { - len = state.head.extra_len - state.length; - if (!state.head.extra) { - // Use untyped array for more convenient processing later - state.head.extra = new Uint8Array(state.head.extra_len); - } - state.head.extra.set( - input.subarray( - next, - // extra field is limited to 65536 bytes - // - no need for additional size check - next + copy - ), - /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/ - len - ); - //zmemcpy(state.head.extra + len, next, - // len + copy > state.head.extra_max ? - // state.head.extra_max - len : copy); - } - if ((state.flags & 0x0200) && (state.wrap & 4)) { - state.check = crc32_1(state.check, input, copy, next); - } - have -= copy; - next += copy; - state.length -= copy; - } - if (state.length) { break inf_leave; } - } - state.length = 0; - state.mode = NAME; - /* falls through */ - case NAME: - if (state.flags & 0x0800) { - if (have === 0) { break inf_leave; } - copy = 0; - do { - // TODO: 2 or 1 bytes? - len = input[next + copy++]; - /* use constant limit because in js we should not preallocate memory */ - if (state.head && len && - (state.length < 65536 /*state.head.name_max*/)) { - state.head.name += String.fromCharCode(len); - } - } while (len && copy < have); - - if ((state.flags & 0x0200) && (state.wrap & 4)) { - state.check = crc32_1(state.check, input, copy, next); - } - have -= copy; - next += copy; - if (len) { break inf_leave; } - } - else if (state.head) { - state.head.name = null; - } - state.length = 0; - state.mode = COMMENT; - /* falls through */ - case COMMENT: - if (state.flags & 0x1000) { - if (have === 0) { break inf_leave; } - copy = 0; - do { - len = input[next + copy++]; - /* use constant limit because in js we should not preallocate memory */ - if (state.head && len && - (state.length < 65536 /*state.head.comm_max*/)) { - state.head.comment += String.fromCharCode(len); - } - } while (len && copy < have); - if ((state.flags & 0x0200) && (state.wrap & 4)) { - state.check = crc32_1(state.check, input, copy, next); - } - have -= copy; - next += copy; - if (len) { break inf_leave; } - } - else if (state.head) { - state.head.comment = null; - } - state.mode = HCRC; - /* falls through */ - case HCRC: - if (state.flags & 0x0200) { - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if ((state.wrap & 4) && hold !== (state.check & 0xffff)) { - strm.msg = 'header crc mismatch'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - } - if (state.head) { - state.head.hcrc = ((state.flags >> 9) & 1); - state.head.done = true; - } - strm.adler = state.check = 0; - state.mode = TYPE; - break; - case DICTID: - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - strm.adler = state.check = zswap32(hold); - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = DICT; - /* falls through */ - case DICT: - if (state.havedict === 0) { - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - return Z_NEED_DICT$1; - } - strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; - state.mode = TYPE; - /* falls through */ - case TYPE: - if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; } - /* falls through */ - case TYPEDO: - if (state.last) { - //--- BYTEBITS() ---// - hold >>>= bits & 7; - bits -= bits & 7; - //---// - state.mode = CHECK; - break; - } - //=== NEEDBITS(3); */ - while (bits < 3) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.last = (hold & 0x01)/*BITS(1)*/; - //--- DROPBITS(1) ---// - hold >>>= 1; - bits -= 1; - //---// - - switch ((hold & 0x03)/*BITS(2)*/) { - case 0: /* stored block */ - //Tracev((stderr, "inflate: stored block%s\n", - // state.last ? " (last)" : "")); - state.mode = STORED; - break; - case 1: /* fixed block */ - fixedtables(state); - //Tracev((stderr, "inflate: fixed codes block%s\n", - // state.last ? " (last)" : "")); - state.mode = LEN_; /* decode codes */ - if (flush === Z_TREES) { - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - break inf_leave; - } - break; - case 2: /* dynamic block */ - //Tracev((stderr, "inflate: dynamic codes block%s\n", - // state.last ? " (last)" : "")); - state.mode = TABLE; - break; - case 3: - strm.msg = 'invalid block type'; - state.mode = BAD; - } - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - break; - case STORED: - //--- BYTEBITS() ---// /* go to byte boundary */ - hold >>>= bits & 7; - bits -= bits & 7; - //---// - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) { - strm.msg = 'invalid stored block lengths'; - state.mode = BAD; - break; - } - state.length = hold & 0xffff; - //Tracev((stderr, "inflate: stored length %u\n", - // state.length)); - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = COPY_; - if (flush === Z_TREES) { break inf_leave; } - /* falls through */ - case COPY_: - state.mode = COPY; - /* falls through */ - case COPY: - copy = state.length; - if (copy) { - if (copy > have) { copy = have; } - if (copy > left) { copy = left; } - if (copy === 0) { break inf_leave; } - //--- zmemcpy(put, next, copy); --- - output.set(input.subarray(next, next + copy), put); - //---// - have -= copy; - next += copy; - left -= copy; - put += copy; - state.length -= copy; - break; - } - //Tracev((stderr, "inflate: stored end\n")); - state.mode = TYPE; - break; - case TABLE: - //=== NEEDBITS(14); */ - while (bits < 14) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257; - //--- DROPBITS(5) ---// - hold >>>= 5; - bits -= 5; - //---// - state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1; - //--- DROPBITS(5) ---// - hold >>>= 5; - bits -= 5; - //---// - state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4; - //--- DROPBITS(4) ---// - hold >>>= 4; - bits -= 4; - //---// - //#ifndef PKZIP_BUG_WORKAROUND - if (state.nlen > 286 || state.ndist > 30) { - strm.msg = 'too many length or distance symbols'; - state.mode = BAD; - break; - } - //#endif - //Tracev((stderr, "inflate: table sizes ok\n")); - state.have = 0; - state.mode = LENLENS; - /* falls through */ - case LENLENS: - while (state.have < state.ncode) { - //=== NEEDBITS(3); - while (bits < 3) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.lens[order[state.have++]] = (hold & 0x07);//BITS(3); - //--- DROPBITS(3) ---// - hold >>>= 3; - bits -= 3; - //---// - } - while (state.have < 19) { - state.lens[order[state.have++]] = 0; - } - // We have separate tables & no pointers. 2 commented lines below not needed. - //state.next = state.codes; - //state.lencode = state.next; - // Switch to use dynamic table - state.lencode = state.lendyn; - state.lenbits = 7; - - opts = { bits: state.lenbits }; - ret = inftrees(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts); - state.lenbits = opts.bits; - - if (ret) { - strm.msg = 'invalid code lengths set'; - state.mode = BAD; - break; - } - //Tracev((stderr, "inflate: code lengths ok\n")); - state.have = 0; - state.mode = CODELENS; - /* falls through */ - case CODELENS: - while (state.have < state.nlen + state.ndist) { - for (;;) { - here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/ - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if ((here_bits) <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - if (here_val < 16) { - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.lens[state.have++] = here_val; - } - else { - if (here_val === 16) { - //=== NEEDBITS(here.bits + 2); - n = here_bits + 2; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - if (state.have === 0) { - strm.msg = 'invalid bit length repeat'; - state.mode = BAD; - break; - } - len = state.lens[state.have - 1]; - copy = 3 + (hold & 0x03);//BITS(2); - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - } - else if (here_val === 17) { - //=== NEEDBITS(here.bits + 3); - n = here_bits + 3; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - len = 0; - copy = 3 + (hold & 0x07);//BITS(3); - //--- DROPBITS(3) ---// - hold >>>= 3; - bits -= 3; - //---// - } - else { - //=== NEEDBITS(here.bits + 7); - n = here_bits + 7; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - len = 0; - copy = 11 + (hold & 0x7f);//BITS(7); - //--- DROPBITS(7) ---// - hold >>>= 7; - bits -= 7; - //---// - } - if (state.have + copy > state.nlen + state.ndist) { - strm.msg = 'invalid bit length repeat'; - state.mode = BAD; - break; - } - while (copy--) { - state.lens[state.have++] = len; - } - } - } - - /* handle error breaks in while */ - if (state.mode === BAD) { break; } - - /* check for end-of-block code (better have one) */ - if (state.lens[256] === 0) { - strm.msg = 'invalid code -- missing end-of-block'; - state.mode = BAD; - break; - } - - /* build code tables -- note: do not change the lenbits or distbits - values here (9 and 6) without reading the comments in inftrees.h - concerning the ENOUGH constants, which depend on those values */ - state.lenbits = 9; - - opts = { bits: state.lenbits }; - ret = inftrees(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts); - // We have separate tables & no pointers. 2 commented lines below not needed. - // state.next_index = opts.table_index; - state.lenbits = opts.bits; - // state.lencode = state.next; - - if (ret) { - strm.msg = 'invalid literal/lengths set'; - state.mode = BAD; - break; - } - - state.distbits = 6; - //state.distcode.copy(state.codes); - // Switch to use dynamic table - state.distcode = state.distdyn; - opts = { bits: state.distbits }; - ret = inftrees(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts); - // We have separate tables & no pointers. 2 commented lines below not needed. - // state.next_index = opts.table_index; - state.distbits = opts.bits; - // state.distcode = state.next; - - if (ret) { - strm.msg = 'invalid distances set'; - state.mode = BAD; - break; - } - //Tracev((stderr, 'inflate: codes ok\n')); - state.mode = LEN_; - if (flush === Z_TREES) { break inf_leave; } - /* falls through */ - case LEN_: - state.mode = LEN; - /* falls through */ - case LEN: - if (have >= 6 && left >= 258) { - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - inffast(strm, _out); - //--- LOAD() --- - put = strm.next_out; - output = strm.output; - left = strm.avail_out; - next = strm.next_in; - input = strm.input; - have = strm.avail_in; - hold = state.hold; - bits = state.bits; - //--- - - if (state.mode === TYPE) { - state.back = -1; - } - break; - } - state.back = 0; - for (;;) { - here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/ - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if (here_bits <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - if (here_op && (here_op & 0xf0) === 0) { - last_bits = here_bits; - last_op = here_op; - last_val = here_val; - for (;;) { - here = state.lencode[last_val + - ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)]; - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if ((last_bits + here_bits) <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - //--- DROPBITS(last.bits) ---// - hold >>>= last_bits; - bits -= last_bits; - //---// - state.back += last_bits; - } - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.back += here_bits; - state.length = here_val; - if (here_op === 0) { - //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - // "inflate: literal '%c'\n" : - // "inflate: literal 0x%02x\n", here.val)); - state.mode = LIT; - break; - } - if (here_op & 32) { - //Tracevv((stderr, "inflate: end of block\n")); - state.back = -1; - state.mode = TYPE; - break; - } - if (here_op & 64) { - strm.msg = 'invalid literal/length code'; - state.mode = BAD; - break; - } - state.extra = here_op & 15; - state.mode = LENEXT; - /* falls through */ - case LENEXT: - if (state.extra) { - //=== NEEDBITS(state.extra); - n = state.extra; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/; - //--- DROPBITS(state.extra) ---// - hold >>>= state.extra; - bits -= state.extra; - //---// - state.back += state.extra; - } - //Tracevv((stderr, "inflate: length %u\n", state.length)); - state.was = state.length; - state.mode = DIST; - /* falls through */ - case DIST: - for (;;) { - here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/ - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if ((here_bits) <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - if ((here_op & 0xf0) === 0) { - last_bits = here_bits; - last_op = here_op; - last_val = here_val; - for (;;) { - here = state.distcode[last_val + - ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)]; - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if ((last_bits + here_bits) <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - //--- DROPBITS(last.bits) ---// - hold >>>= last_bits; - bits -= last_bits; - //---// - state.back += last_bits; - } - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.back += here_bits; - if (here_op & 64) { - strm.msg = 'invalid distance code'; - state.mode = BAD; - break; - } - state.offset = here_val; - state.extra = (here_op) & 15; - state.mode = DISTEXT; - /* falls through */ - case DISTEXT: - if (state.extra) { - //=== NEEDBITS(state.extra); - n = state.extra; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/; - //--- DROPBITS(state.extra) ---// - hold >>>= state.extra; - bits -= state.extra; - //---// - state.back += state.extra; - } - //#ifdef INFLATE_STRICT - if (state.offset > state.dmax) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break; - } - //#endif - //Tracevv((stderr, "inflate: distance %u\n", state.offset)); - state.mode = MATCH; - /* falls through */ - case MATCH: - if (left === 0) { break inf_leave; } - copy = _out - left; - if (state.offset > copy) { /* copy from window */ - copy = state.offset - copy; - if (copy > state.whave) { - if (state.sane) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break; - } - // (!) This block is disabled in zlib defaults, - // don't enable it for binary compatibility - //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR - // Trace((stderr, "inflate.c too far\n")); - // copy -= state.whave; - // if (copy > state.length) { copy = state.length; } - // if (copy > left) { copy = left; } - // left -= copy; - // state.length -= copy; - // do { - // output[put++] = 0; - // } while (--copy); - // if (state.length === 0) { state.mode = LEN; } - // break; - //#endif - } - if (copy > state.wnext) { - copy -= state.wnext; - from = state.wsize - copy; - } - else { - from = state.wnext - copy; - } - if (copy > state.length) { copy = state.length; } - from_source = state.window; - } - else { /* copy from output */ - from_source = output; - from = put - state.offset; - copy = state.length; - } - if (copy > left) { copy = left; } - left -= copy; - state.length -= copy; - do { - output[put++] = from_source[from++]; - } while (--copy); - if (state.length === 0) { state.mode = LEN; } - break; - case LIT: - if (left === 0) { break inf_leave; } - output[put++] = state.length; - left--; - state.mode = LEN; - break; - case CHECK: - if (state.wrap) { - //=== NEEDBITS(32); - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - // Use '|' instead of '+' to make sure that result is signed - hold |= input[next++] << bits; - bits += 8; - } - //===// - _out -= left; - strm.total_out += _out; - state.total += _out; - if ((state.wrap & 4) && _out) { - strm.adler = state.check = - /*UPDATE_CHECK(state.check, put - _out, _out);*/ - (state.flags ? crc32_1(state.check, output, _out, put - _out) : adler32_1(state.check, output, _out, put - _out)); - - } - _out = left; - // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too - if ((state.wrap & 4) && (state.flags ? hold : zswap32(hold)) !== state.check) { - strm.msg = 'incorrect data check'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - //Tracev((stderr, "inflate: check matches trailer\n")); - } - state.mode = LENGTH; - /* falls through */ - case LENGTH: - if (state.wrap && state.flags) { - //=== NEEDBITS(32); - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if ((state.wrap & 4) && hold !== (state.total & 0xffffffff)) { - strm.msg = 'incorrect length check'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - //Tracev((stderr, "inflate: length matches trailer\n")); - } - state.mode = DONE; - /* falls through */ - case DONE: - ret = Z_STREAM_END$1; - break inf_leave; - case BAD: - ret = Z_DATA_ERROR$1; - break inf_leave; - case MEM: - return Z_MEM_ERROR$1; - case SYNC: - /* falls through */ - default: - return Z_STREAM_ERROR$1; - } - } - - // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave" - - /* - Return from inflate(), updating the total counts and the check value. - If there was no progress during the inflate() call, return a buffer - error. Call updatewindow() to create and/or update the window state. - Note: a memory error from inflate() is non-recoverable. - */ - - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - - if (state.wsize || (_out !== strm.avail_out && state.mode < BAD && - (state.mode < CHECK || flush !== Z_FINISH$1))) { - if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) ; - } - _in -= strm.avail_in; - _out -= strm.avail_out; - strm.total_in += _in; - strm.total_out += _out; - state.total += _out; - if ((state.wrap & 4) && _out) { - strm.adler = state.check = /*UPDATE_CHECK(state.check, strm.next_out - _out, _out);*/ - (state.flags ? crc32_1(state.check, output, _out, strm.next_out - _out) : adler32_1(state.check, output, _out, strm.next_out - _out)); - } - strm.data_type = state.bits + (state.last ? 64 : 0) + - (state.mode === TYPE ? 128 : 0) + - (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0); - if (((_in === 0 && _out === 0) || flush === Z_FINISH$1) && ret === Z_OK$1) { - ret = Z_BUF_ERROR; - } - return ret; - }; - - - const inflateEnd = (strm) => { - - if (inflateStateCheck(strm)) { - return Z_STREAM_ERROR$1; - } - - let state = strm.state; - if (state.window) { - state.window = null; - } - strm.state = null; - return Z_OK$1; - }; - - - const inflateGetHeader = (strm, head) => { - - /* check state */ - if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; } - const state = strm.state; - if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR$1; } - - /* save header structure */ - state.head = head; - head.done = false; - return Z_OK$1; - }; - - - const inflateSetDictionary = (strm, dictionary) => { - const dictLength = dictionary.length; - - let state; - let dictid; - let ret; - - /* check state */ - if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; } - state = strm.state; - - if (state.wrap !== 0 && state.mode !== DICT) { - return Z_STREAM_ERROR$1; - } - - /* check for correct dictionary identifier */ - if (state.mode === DICT) { - dictid = 1; /* adler32(0, null, 0)*/ - /* dictid = adler32(dictid, dictionary, dictLength); */ - dictid = adler32_1(dictid, dictionary, dictLength, 0); - if (dictid !== state.check) { - return Z_DATA_ERROR$1; - } - } - /* copy dictionary to window using updatewindow(), which will amend the - existing dictionary if appropriate */ - ret = updatewindow(strm, dictionary, dictLength, dictLength); - if (ret) { - state.mode = MEM; - return Z_MEM_ERROR$1; - } - state.havedict = 1; - // Tracev((stderr, "inflate: dictionary set\n")); - return Z_OK$1; - }; - - - var inflateReset_1 = inflateReset; - var inflateReset2_1 = inflateReset2; - var inflateResetKeep_1 = inflateResetKeep; - var inflateInit_1 = inflateInit; - var inflateInit2_1 = inflateInit2; - var inflate_2$1 = inflate$2; - var inflateEnd_1 = inflateEnd; - var inflateGetHeader_1 = inflateGetHeader; - var inflateSetDictionary_1 = inflateSetDictionary; - var inflateInfo = 'pako inflate (from Nodeca project)'; - - /* Not implemented - module.exports.inflateCodesUsed = inflateCodesUsed; - module.exports.inflateCopy = inflateCopy; - module.exports.inflateGetDictionary = inflateGetDictionary; - module.exports.inflateMark = inflateMark; - module.exports.inflatePrime = inflatePrime; - module.exports.inflateSync = inflateSync; - module.exports.inflateSyncPoint = inflateSyncPoint; - module.exports.inflateUndermine = inflateUndermine; - module.exports.inflateValidate = inflateValidate; - */ - - var inflate_1$2 = { - inflateReset: inflateReset_1, - inflateReset2: inflateReset2_1, - inflateResetKeep: inflateResetKeep_1, - inflateInit: inflateInit_1, - inflateInit2: inflateInit2_1, - inflate: inflate_2$1, - inflateEnd: inflateEnd_1, - inflateGetHeader: inflateGetHeader_1, - inflateSetDictionary: inflateSetDictionary_1, - inflateInfo: inflateInfo - }; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - function GZheader() { - /* true if compressed data believed to be text */ - this.text = 0; - /* modification time */ - this.time = 0; - /* extra flags (not used when writing a gzip file) */ - this.xflags = 0; - /* operating system */ - this.os = 0; - /* pointer to extra field or Z_NULL if none */ - this.extra = null; - /* extra field length (valid if extra != Z_NULL) */ - this.extra_len = 0; // Actually, we don't need it in JS, - // but leave for few code modifications - - // - // Setup limits is not necessary because in js we should not preallocate memory - // for inflate use constant limit in 65536 bytes - // - - /* space at extra (only when reading header) */ - // this.extra_max = 0; - /* pointer to zero-terminated file name or Z_NULL */ - this.name = ''; - /* space at name (only when reading header) */ - // this.name_max = 0; - /* pointer to zero-terminated comment or Z_NULL */ - this.comment = ''; - /* space at comment (only when reading header) */ - // this.comm_max = 0; - /* true if there was or will be a header crc */ - this.hcrc = 0; - /* true when done reading gzip header (not used when writing a gzip file) */ - this.done = false; - } - - var gzheader = GZheader; - - const toString = Object.prototype.toString; - - /* Public constants ==========================================================*/ - /* ===========================================================================*/ - - const { - Z_NO_FLUSH, Z_FINISH, - Z_OK, Z_STREAM_END, Z_NEED_DICT, Z_STREAM_ERROR, Z_DATA_ERROR, Z_MEM_ERROR - } = constants$2; - - /* ===========================================================================*/ - - - /** - * class Inflate - * - * Generic JS-style wrapper for zlib calls. If you don't need - * streaming behaviour - use more simple functions: [[inflate]] - * and [[inflateRaw]]. - **/ - - /* internal - * inflate.chunks -> Array - * - * Chunks of output data, if [[Inflate#onData]] not overridden. - **/ - - /** - * Inflate.result -> Uint8Array|String - * - * Uncompressed result, generated by default [[Inflate#onData]] - * and [[Inflate#onEnd]] handlers. Filled after you push last chunk - * (call [[Inflate#push]] with `Z_FINISH` / `true` param). - **/ - - /** - * Inflate.err -> Number - * - * Error code after inflate finished. 0 (Z_OK) on success. - * Should be checked if broken data possible. - **/ - - /** - * Inflate.msg -> String - * - * Error message, if [[Inflate.err]] != 0 - **/ - - - /** - * new Inflate(options) - * - options (Object): zlib inflate options. - * - * Creates new inflator instance with specified params. Throws exception - * on bad params. Supported options: - * - * - `windowBits` - * - `dictionary` - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information on these. - * - * Additional options, for internal needs: - * - * - `chunkSize` - size of generated data chunks (16K by default) - * - `raw` (Boolean) - do raw inflate - * - `to` (String) - if equal to 'string', then result will be converted - * from utf8 to utf16 (javascript) string. When string output requested, - * chunk length can differ from `chunkSize`, depending on content. - * - * By default, when no options set, autodetect deflate/gzip data format via - * wrapper header. - * - * ##### Example: - * - * ```javascript - * const pako = require('pako') - * const chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9]) - * const chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]); - * - * const inflate = new pako.Inflate({ level: 3}); - * - * inflate.push(chunk1, false); - * inflate.push(chunk2, true); // true -> last chunk - * - * if (inflate.err) { throw new Error(inflate.err); } - * - * console.log(inflate.result); - * ``` - **/ - function Inflate$1(options) { - this.options = common.assign({ - chunkSize: 1024 * 64, - windowBits: 15, - to: '' - }, options || {}); - - const opt = this.options; - - // Force window size for `raw` data, if not set directly, - // because we have no header for autodetect. - if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) { - opt.windowBits = -opt.windowBits; - if (opt.windowBits === 0) { opt.windowBits = -15; } - } - - // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate - if ((opt.windowBits >= 0) && (opt.windowBits < 16) && - !(options && options.windowBits)) { - opt.windowBits += 32; - } - - // Gzip header has no info about windows size, we can do autodetect only - // for deflate. So, if window size not set, force it to max when gzip possible - if ((opt.windowBits > 15) && (opt.windowBits < 48)) { - // bit 3 (16) -> gzipped data - // bit 4 (32) -> autodetect gzip/deflate - if ((opt.windowBits & 15) === 0) { - opt.windowBits |= 15; - } - } - - this.err = 0; // error code, if happens (0 = Z_OK) - this.msg = ''; // error message - this.ended = false; // used to avoid multiple onEnd() calls - this.chunks = []; // chunks of compressed data - - this.strm = new zstream(); - this.strm.avail_out = 0; - - let status = inflate_1$2.inflateInit2( - this.strm, - opt.windowBits - ); - - if (status !== Z_OK) { - throw new Error(messages[status]); - } - - this.header = new gzheader(); - - inflate_1$2.inflateGetHeader(this.strm, this.header); - - // Setup dictionary - if (opt.dictionary) { - // Convert data if needed - if (typeof opt.dictionary === 'string') { - opt.dictionary = strings.string2buf(opt.dictionary); - } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') { - opt.dictionary = new Uint8Array(opt.dictionary); - } - if (opt.raw) { //In raw mode we need to set the dictionary early - status = inflate_1$2.inflateSetDictionary(this.strm, opt.dictionary); - if (status !== Z_OK) { - throw new Error(messages[status]); - } - } - } - } - - /** - * Inflate#push(data[, flush_mode]) -> Boolean - * - data (Uint8Array|ArrayBuffer): input data - * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE - * flush modes. See constants. Skipped or `false` means Z_NO_FLUSH, - * `true` means Z_FINISH. - * - * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with - * new output chunks. Returns `true` on success. If end of stream detected, - * [[Inflate#onEnd]] will be called. - * - * `flush_mode` is not needed for normal operation, because end of stream - * detected automatically. You may try to use it for advanced things, but - * this functionality was not tested. - * - * On fail call [[Inflate#onEnd]] with error code and return false. - * - * ##### Example - * - * ```javascript - * push(chunk, false); // push one of data chunks - * ... - * push(chunk, true); // push last chunk - * ``` - **/ - Inflate$1.prototype.push = function (data, flush_mode) { - const strm = this.strm; - const chunkSize = this.options.chunkSize; - const dictionary = this.options.dictionary; - let status, _flush_mode, last_avail_out; - - if (this.ended) return false; - - if (flush_mode === ~~flush_mode) _flush_mode = flush_mode; - else _flush_mode = flush_mode === true ? Z_FINISH : Z_NO_FLUSH; - - // Convert data if needed - if (toString.call(data) === '[object ArrayBuffer]') { - strm.input = new Uint8Array(data); - } else { - strm.input = data; - } - - strm.next_in = 0; - strm.avail_in = strm.input.length; - - for (;;) { - if (strm.avail_out === 0) { - strm.output = new Uint8Array(chunkSize); - strm.next_out = 0; - strm.avail_out = chunkSize; - } - - status = inflate_1$2.inflate(strm, _flush_mode); - - if (status === Z_NEED_DICT && dictionary) { - status = inflate_1$2.inflateSetDictionary(strm, dictionary); - - if (status === Z_OK) { - status = inflate_1$2.inflate(strm, _flush_mode); - } else if (status === Z_DATA_ERROR) { - // Replace code with more verbose - status = Z_NEED_DICT; - } - } - - // Skip snyc markers if more data follows and not raw mode - while (strm.avail_in > 0 && - status === Z_STREAM_END && - strm.state.wrap > 0 && - data[strm.next_in] !== 0) - { - inflate_1$2.inflateReset(strm); - status = inflate_1$2.inflate(strm, _flush_mode); - } - - switch (status) { - case Z_STREAM_ERROR: - case Z_DATA_ERROR: - case Z_NEED_DICT: - case Z_MEM_ERROR: - this.onEnd(status); - this.ended = true; - return false; - } - - // Remember real `avail_out` value, because we may patch out buffer content - // to align utf8 strings boundaries. - last_avail_out = strm.avail_out; - - if (strm.next_out) { - if (strm.avail_out === 0 || status === Z_STREAM_END) { - - if (this.options.to === 'string') { - - let next_out_utf8 = strings.utf8border(strm.output, strm.next_out); - - let tail = strm.next_out - next_out_utf8; - let utf8str = strings.buf2string(strm.output, next_out_utf8); - - // move tail & realign counters - strm.next_out = tail; - strm.avail_out = chunkSize - tail; - if (tail) strm.output.set(strm.output.subarray(next_out_utf8, next_out_utf8 + tail), 0); - - this.onData(utf8str); - - } else { - this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out)); - } - } - } - - // Must repeat iteration if out buffer is full - if (status === Z_OK && last_avail_out === 0) continue; - - // Finalize if end of stream reached. - if (status === Z_STREAM_END) { - status = inflate_1$2.inflateEnd(this.strm); - this.onEnd(status); - this.ended = true; - return true; - } - - if (strm.avail_in === 0) break; - } - - return true; - }; - - - /** - * Inflate#onData(chunk) -> Void - * - chunk (Uint8Array|String): output data. When string output requested, - * each chunk will be string. - * - * By default, stores data blocks in `chunks[]` property and glue - * those in `onEnd`. Override this handler, if you need another behaviour. - **/ - Inflate$1.prototype.onData = function (chunk) { - this.chunks.push(chunk); - }; - - - /** - * Inflate#onEnd(status) -> Void - * - status (Number): inflate status. 0 (Z_OK) on success, - * other if not. - * - * Called either after you tell inflate that the input stream is - * complete (Z_FINISH). By default - join collected chunks, - * free memory and fill `results` / `err` properties. - **/ - Inflate$1.prototype.onEnd = function (status) { - // On success - join - if (status === Z_OK) { - if (this.options.to === 'string') { - this.result = this.chunks.join(''); - } else { - this.result = common.flattenChunks(this.chunks); - } - } - this.chunks = []; - this.err = status; - this.msg = this.strm.msg; - }; - - - /** - * inflate(data[, options]) -> Uint8Array|String - * - data (Uint8Array|ArrayBuffer): input data to decompress. - * - options (Object): zlib inflate options. - * - * Decompress `data` with inflate/ungzip and `options`. Autodetect - * format via wrapper header by default. That's why we don't provide - * separate `ungzip` method. - * - * Supported options are: - * - * - windowBits - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information. - * - * Sugar (options): - * - * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify - * negative windowBits implicitly. - * - `to` (String) - if equal to 'string', then result will be converted - * from utf8 to utf16 (javascript) string. When string output requested, - * chunk length can differ from `chunkSize`, depending on content. - * - * - * ##### Example: - * - * ```javascript - * const pako = require('pako'); - * const input = pako.deflate(new Uint8Array([1,2,3,4,5,6,7,8,9])); - * let output; - * - * try { - * output = pako.inflate(input); - * } catch (err) { - * console.log(err); - * } - * ``` - **/ - function inflate$1(input, options) { - const inflator = new Inflate$1(options); - - inflator.push(input); - - // That will never happens, if you don't cheat with options :) - if (inflator.err) throw inflator.msg || messages[inflator.err]; - - return inflator.result; - } - - - /** - * inflateRaw(data[, options]) -> Uint8Array|String - * - data (Uint8Array|ArrayBuffer): input data to decompress. - * - options (Object): zlib inflate options. - * - * The same as [[inflate]], but creates raw data, without wrapper - * (header and adler32 crc). - **/ - function inflateRaw$1(input, options) { - options = options || {}; - options.raw = true; - return inflate$1(input, options); - } - - - /** - * ungzip(data[, options]) -> Uint8Array|String - * - data (Uint8Array|ArrayBuffer): input data to decompress. - * - options (Object): zlib inflate options. - * - * Just shortcut to [[inflate]], because it autodetects format - * by header.content. Done for convenience. - **/ - - - var Inflate_1$1 = Inflate$1; - var inflate_2 = inflate$1; - var inflateRaw_1$1 = inflateRaw$1; - var ungzip$1 = inflate$1; - var constants = constants$2; - - var inflate_1$1 = { - Inflate: Inflate_1$1, - inflate: inflate_2, - inflateRaw: inflateRaw_1$1, - ungzip: ungzip$1, - constants: constants - }; - - const { Deflate, deflate, deflateRaw, gzip } = deflate_1$1; - - const { Inflate, inflate, inflateRaw, ungzip } = inflate_1$1; - - - - var Deflate_1 = Deflate; - var deflate_1 = deflate; - var deflateRaw_1 = deflateRaw; - var gzip_1 = gzip; - var Inflate_1 = Inflate; - var inflate_1 = inflate; - var inflateRaw_1 = inflateRaw; - var ungzip_1 = ungzip; - var constants_1 = constants$2; - - var pako = { - Deflate: Deflate_1, - deflate: deflate_1, - deflateRaw: deflateRaw_1, - gzip: gzip_1, - Inflate: Inflate_1, - inflate: inflate_1, - inflateRaw: inflateRaw_1, - ungzip: ungzip_1, - constants: constants_1 - }; - - exports.Deflate = Deflate_1; - exports.Inflate = Inflate_1; - exports.constants = constants_1; - exports["default"] = pako; - exports.deflate = deflate_1; - exports.deflateRaw = deflateRaw_1; - exports.gzip = gzip_1; - exports.inflate = inflate_1; - exports.inflateRaw = inflateRaw_1; - exports.ungzip = ungzip_1; - - Object.defineProperty(exports, '__esModule', { value: true }); - -})); diff --git a/node_modules/pako/dist/pako.min.js b/node_modules/pako/dist/pako.min.js deleted file mode 100644 index 2535eaf..0000000 --- a/node_modules/pako/dist/pako.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).pako={})}(this,(function(t){"use strict";function e(t){let e=t.length;for(;--e>=0;)t[e]=0}const a=256,i=286,n=30,s=15,r=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]),o=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]),l=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),h=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),d=new Array(576);e(d);const _=new Array(60);e(_);const f=new Array(512);e(f);const c=new Array(256);e(c);const u=new Array(29);e(u);const w=new Array(n);function m(t,e,a,i,n){this.static_tree=t,this.extra_bits=e,this.extra_base=a,this.elems=i,this.max_length=n,this.has_stree=t&&t.length}let b,g,p;function k(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}e(w);const v=t=>t<256?f[t]:f[256+(t>>>7)],y=(t,e)=>{t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255},x=(t,e,a)=>{t.bi_valid>16-a?(t.bi_buf|=e<>16-t.bi_valid,t.bi_valid+=a-16):(t.bi_buf|=e<{x(t,a[2*e],a[2*e+1])},A=(t,e)=>{let a=0;do{a|=1&t,t>>>=1,a<<=1}while(--e>0);return a>>>1},E=(t,e,a)=>{const i=new Array(16);let n,r,o=0;for(n=1;n<=s;n++)o=o+a[n-1]<<1,i[n]=o;for(r=0;r<=e;r++){let e=t[2*r+1];0!==e&&(t[2*r]=A(i[e]++,e))}},R=t=>{let e;for(e=0;e{t.bi_valid>8?y(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0},U=(t,e,a,i)=>{const n=2*e,s=2*a;return t[n]{const i=t.heap[a];let n=a<<1;for(;n<=t.heap_len&&(n{let n,s,l,h,d=0;if(0!==t.sym_next)do{n=255&t.pending_buf[t.sym_buf+d++],n+=(255&t.pending_buf[t.sym_buf+d++])<<8,s=t.pending_buf[t.sym_buf+d++],0===n?z(t,s,e):(l=c[s],z(t,l+a+1,e),h=r[l],0!==h&&(s-=u[l],x(t,s,h)),n--,l=v(n),z(t,l,i),h=o[l],0!==h&&(n-=w[l],x(t,n,h)))}while(d{const a=e.dyn_tree,i=e.stat_desc.static_tree,n=e.stat_desc.has_stree,r=e.stat_desc.elems;let o,l,h,d=-1;for(t.heap_len=0,t.heap_max=573,o=0;o>1;o>=1;o--)S(t,a,o);h=r;do{o=t.heap[1],t.heap[1]=t.heap[t.heap_len--],S(t,a,1),l=t.heap[1],t.heap[--t.heap_max]=o,t.heap[--t.heap_max]=l,a[2*h]=a[2*o]+a[2*l],t.depth[h]=(t.depth[o]>=t.depth[l]?t.depth[o]:t.depth[l])+1,a[2*o+1]=a[2*l+1]=h,t.heap[1]=h++,S(t,a,1)}while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],((t,e)=>{const a=e.dyn_tree,i=e.max_code,n=e.stat_desc.static_tree,r=e.stat_desc.has_stree,o=e.stat_desc.extra_bits,l=e.stat_desc.extra_base,h=e.stat_desc.max_length;let d,_,f,c,u,w,m=0;for(c=0;c<=s;c++)t.bl_count[c]=0;for(a[2*t.heap[t.heap_max]+1]=0,d=t.heap_max+1;d<573;d++)_=t.heap[d],c=a[2*a[2*_+1]+1]+1,c>h&&(c=h,m++),a[2*_+1]=c,_>i||(t.bl_count[c]++,u=0,_>=l&&(u=o[_-l]),w=a[2*_],t.opt_len+=w*(c+u),r&&(t.static_len+=w*(n[2*_+1]+u)));if(0!==m){do{for(c=h-1;0===t.bl_count[c];)c--;t.bl_count[c]--,t.bl_count[c+1]+=2,t.bl_count[h]--,m-=2}while(m>0);for(c=h;0!==c;c--)for(_=t.bl_count[c];0!==_;)f=t.heap[--d],f>i||(a[2*f+1]!==c&&(t.opt_len+=(c-a[2*f+1])*a[2*f],a[2*f+1]=c),_--)}})(t,e),E(a,d,t.bl_count)},O=(t,e,a)=>{let i,n,s=-1,r=e[1],o=0,l=7,h=4;for(0===r&&(l=138,h=3),e[2*(a+1)+1]=65535,i=0;i<=a;i++)n=r,r=e[2*(i+1)+1],++o{let i,n,s=-1,r=e[1],o=0,l=7,h=4;for(0===r&&(l=138,h=3),i=0;i<=a;i++)if(n=r,r=e[2*(i+1)+1],!(++o{x(t,0+(i?1:0),3),Z(t),y(t,a),y(t,~a),a&&t.pending_buf.set(t.window.subarray(e,e+a),t.pending),t.pending+=a};var N=(t,e,i,n)=>{let s,r,o=0;t.level>0?(2===t.strm.data_type&&(t.strm.data_type=(t=>{let e,i=4093624447;for(e=0;e<=31;e++,i>>>=1)if(1&i&&0!==t.dyn_ltree[2*e])return 0;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return 1;for(e=32;e{let e;for(O(t,t.dyn_ltree,t.l_desc.max_code),O(t,t.dyn_dtree,t.d_desc.max_code),T(t,t.bl_desc),e=18;e>=3&&0===t.bl_tree[2*h[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e})(t),s=t.opt_len+3+7>>>3,r=t.static_len+3+7>>>3,r<=s&&(s=r)):s=r=i+5,i+4<=s&&-1!==e?L(t,e,i,n):4===t.strategy||r===s?(x(t,2+(n?1:0),3),D(t,d,_)):(x(t,4+(n?1:0),3),((t,e,a,i)=>{let n;for(x(t,e-257,5),x(t,a-1,5),x(t,i-4,4),n=0;n{F||((()=>{let t,e,a,h,k;const v=new Array(16);for(a=0,h=0;h<28;h++)for(u[h]=a,t=0;t<1<>=7;h(t.pending_buf[t.sym_buf+t.sym_next++]=e,t.pending_buf[t.sym_buf+t.sym_next++]=e>>8,t.pending_buf[t.sym_buf+t.sym_next++]=i,0===e?t.dyn_ltree[2*i]++:(t.matches++,e--,t.dyn_ltree[2*(c[i]+a+1)]++,t.dyn_dtree[2*v(e)]++),t.sym_next===t.sym_end),_tr_align:t=>{x(t,2,3),z(t,256,d),(t=>{16===t.bi_valid?(y(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)})(t)}};var C=(t,e,a,i)=>{let n=65535&t|0,s=t>>>16&65535|0,r=0;for(;0!==a;){r=a>2e3?2e3:a,a-=r;do{n=n+e[i++]|0,s=s+n|0}while(--r);n%=65521,s%=65521}return n|s<<16|0};const M=new Uint32Array((()=>{let t,e=[];for(var a=0;a<256;a++){t=a;for(var i=0;i<8;i++)t=1&t?3988292384^t>>>1:t>>>1;e[a]=t}return e})());var H=(t,e,a,i)=>{const n=M,s=i+a;t^=-1;for(let a=i;a>>8^n[255&(t^e[a])];return-1^t},j={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},K={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{_tr_init:P,_tr_stored_block:Y,_tr_flush_block:G,_tr_tally:X,_tr_align:W}=B,{Z_NO_FLUSH:q,Z_PARTIAL_FLUSH:J,Z_FULL_FLUSH:Q,Z_FINISH:V,Z_BLOCK:$,Z_OK:tt,Z_STREAM_END:et,Z_STREAM_ERROR:at,Z_DATA_ERROR:it,Z_BUF_ERROR:nt,Z_DEFAULT_COMPRESSION:st,Z_FILTERED:rt,Z_HUFFMAN_ONLY:ot,Z_RLE:lt,Z_FIXED:ht,Z_DEFAULT_STRATEGY:dt,Z_UNKNOWN:_t,Z_DEFLATED:ft}=K,ct=258,ut=262,wt=42,mt=113,bt=666,gt=(t,e)=>(t.msg=j[e],e),pt=t=>2*t-(t>4?9:0),kt=t=>{let e=t.length;for(;--e>=0;)t[e]=0},vt=t=>{let e,a,i,n=t.w_size;e=t.hash_size,i=e;do{a=t.head[--i],t.head[i]=a>=n?a-n:0}while(--e);e=n,i=e;do{a=t.prev[--i],t.prev[i]=a>=n?a-n:0}while(--e)};let yt=(t,e,a)=>(e<{const e=t.state;let a=e.pending;a>t.avail_out&&(a=t.avail_out),0!==a&&(t.output.set(e.pending_buf.subarray(e.pending_out,e.pending_out+a),t.next_out),t.next_out+=a,e.pending_out+=a,t.total_out+=a,t.avail_out-=a,e.pending-=a,0===e.pending&&(e.pending_out=0))},zt=(t,e)=>{G(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,xt(t.strm)},At=(t,e)=>{t.pending_buf[t.pending++]=e},Et=(t,e)=>{t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e},Rt=(t,e,a,i)=>{let n=t.avail_in;return n>i&&(n=i),0===n?0:(t.avail_in-=n,e.set(t.input.subarray(t.next_in,t.next_in+n),a),1===t.state.wrap?t.adler=C(t.adler,e,n,a):2===t.state.wrap&&(t.adler=H(t.adler,e,n,a)),t.next_in+=n,t.total_in+=n,n)},Zt=(t,e)=>{let a,i,n=t.max_chain_length,s=t.strstart,r=t.prev_length,o=t.nice_match;const l=t.strstart>t.w_size-ut?t.strstart-(t.w_size-ut):0,h=t.window,d=t.w_mask,_=t.prev,f=t.strstart+ct;let c=h[s+r-1],u=h[s+r];t.prev_length>=t.good_match&&(n>>=2),o>t.lookahead&&(o=t.lookahead);do{if(a=e,h[a+r]===u&&h[a+r-1]===c&&h[a]===h[s]&&h[++a]===h[s+1]){s+=2,a++;do{}while(h[++s]===h[++a]&&h[++s]===h[++a]&&h[++s]===h[++a]&&h[++s]===h[++a]&&h[++s]===h[++a]&&h[++s]===h[++a]&&h[++s]===h[++a]&&h[++s]===h[++a]&&sr){if(t.match_start=e,r=i,i>=o)break;c=h[s+r-1],u=h[s+r]}}}while((e=_[e&d])>l&&0!=--n);return r<=t.lookahead?r:t.lookahead},Ut=t=>{const e=t.w_size;let a,i,n;do{if(i=t.window_size-t.lookahead-t.strstart,t.strstart>=e+(e-ut)&&(t.window.set(t.window.subarray(e,e+e-i),0),t.match_start-=e,t.strstart-=e,t.block_start-=e,t.insert>t.strstart&&(t.insert=t.strstart),vt(t),i+=e),0===t.strm.avail_in)break;if(a=Rt(t.strm,t.window,t.strstart+t.lookahead,i),t.lookahead+=a,t.lookahead+t.insert>=3)for(n=t.strstart-t.insert,t.ins_h=t.window[n],t.ins_h=yt(t,t.ins_h,t.window[n+1]);t.insert&&(t.ins_h=yt(t,t.ins_h,t.window[n+3-1]),t.prev[n&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=n,n++,t.insert--,!(t.lookahead+t.insert<3)););}while(t.lookahead{let a,i,n,s=t.pending_buf_size-5>t.w_size?t.w_size:t.pending_buf_size-5,r=0,o=t.strm.avail_in;do{if(a=65535,n=t.bi_valid+42>>3,t.strm.avail_outi+t.strm.avail_in&&(a=i+t.strm.avail_in),a>n&&(a=n),a>8,t.pending_buf[t.pending-2]=~a,t.pending_buf[t.pending-1]=~a>>8,xt(t.strm),i&&(i>a&&(i=a),t.strm.output.set(t.window.subarray(t.block_start,t.block_start+i),t.strm.next_out),t.strm.next_out+=i,t.strm.avail_out-=i,t.strm.total_out+=i,t.block_start+=i,a-=i),a&&(Rt(t.strm,t.strm.output,t.strm.next_out,a),t.strm.next_out+=a,t.strm.avail_out-=a,t.strm.total_out+=a)}while(0===r);return o-=t.strm.avail_in,o&&(o>=t.w_size?(t.matches=2,t.window.set(t.strm.input.subarray(t.strm.next_in-t.w_size,t.strm.next_in),0),t.strstart=t.w_size,t.insert=t.strstart):(t.window_size-t.strstart<=o&&(t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,t.insert>t.strstart&&(t.insert=t.strstart)),t.window.set(t.strm.input.subarray(t.strm.next_in-o,t.strm.next_in),t.strstart),t.strstart+=o,t.insert+=o>t.w_size-t.insert?t.w_size-t.insert:o),t.block_start=t.strstart),t.high_watern&&t.block_start>=t.w_size&&(t.block_start-=t.w_size,t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,n+=t.w_size,t.insert>t.strstart&&(t.insert=t.strstart)),n>t.strm.avail_in&&(n=t.strm.avail_in),n&&(Rt(t.strm,t.window,t.strstart,n),t.strstart+=n,t.insert+=n>t.w_size-t.insert?t.w_size-t.insert:n),t.high_water>3,n=t.pending_buf_size-n>65535?65535:t.pending_buf_size-n,s=n>t.w_size?t.w_size:n,i=t.strstart-t.block_start,(i>=s||(i||e===V)&&e!==q&&0===t.strm.avail_in&&i<=n)&&(a=i>n?n:i,r=e===V&&0===t.strm.avail_in&&a===i?1:0,Y(t,t.block_start,a,r),t.block_start+=a,xt(t.strm)),r?3:1)},Dt=(t,e)=>{let a,i;for(;;){if(t.lookahead=3&&(t.ins_h=yt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),0!==a&&t.strstart-a<=t.w_size-ut&&(t.match_length=Zt(t,a)),t.match_length>=3)if(i=X(t,t.strstart-t.match_start,t.match_length-3),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=3){t.match_length--;do{t.strstart++,t.ins_h=yt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart}while(0!=--t.match_length);t.strstart++}else t.strstart+=t.match_length,t.match_length=0,t.ins_h=t.window[t.strstart],t.ins_h=yt(t,t.ins_h,t.window[t.strstart+1]);else i=X(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++;if(i&&(zt(t,!1),0===t.strm.avail_out))return 1}return t.insert=t.strstart<2?t.strstart:2,e===V?(zt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(zt(t,!1),0===t.strm.avail_out)?1:2},Tt=(t,e)=>{let a,i,n;for(;;){if(t.lookahead=3&&(t.ins_h=yt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),t.prev_length=t.match_length,t.prev_match=t.match_start,t.match_length=2,0!==a&&t.prev_length4096)&&(t.match_length=2)),t.prev_length>=3&&t.match_length<=t.prev_length){n=t.strstart+t.lookahead-3,i=X(t,t.strstart-1-t.prev_match,t.prev_length-3),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=n&&(t.ins_h=yt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart)}while(0!=--t.prev_length);if(t.match_available=0,t.match_length=2,t.strstart++,i&&(zt(t,!1),0===t.strm.avail_out))return 1}else if(t.match_available){if(i=X(t,0,t.window[t.strstart-1]),i&&zt(t,!1),t.strstart++,t.lookahead--,0===t.strm.avail_out)return 1}else t.match_available=1,t.strstart++,t.lookahead--}return t.match_available&&(i=X(t,0,t.window[t.strstart-1]),t.match_available=0),t.insert=t.strstart<2?t.strstart:2,e===V?(zt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(zt(t,!1),0===t.strm.avail_out)?1:2};function Ot(t,e,a,i,n){this.good_length=t,this.max_lazy=e,this.nice_length=a,this.max_chain=i,this.func=n}const It=[new Ot(0,0,0,0,St),new Ot(4,4,8,4,Dt),new Ot(4,5,16,8,Dt),new Ot(4,6,32,32,Dt),new Ot(4,4,16,16,Tt),new Ot(8,16,32,32,Tt),new Ot(8,16,128,128,Tt),new Ot(8,32,128,256,Tt),new Ot(32,128,258,1024,Tt),new Ot(32,258,258,4096,Tt)];function Ft(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=ft,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Uint16Array(1146),this.dyn_dtree=new Uint16Array(122),this.bl_tree=new Uint16Array(78),kt(this.dyn_ltree),kt(this.dyn_dtree),kt(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Uint16Array(16),this.heap=new Uint16Array(573),kt(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(573),kt(this.depth),this.sym_buf=0,this.lit_bufsize=0,this.sym_next=0,this.sym_end=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}const Lt=t=>{if(!t)return 1;const e=t.state;return!e||e.strm!==t||e.status!==wt&&57!==e.status&&69!==e.status&&73!==e.status&&91!==e.status&&103!==e.status&&e.status!==mt&&e.status!==bt?1:0},Nt=t=>{if(Lt(t))return gt(t,at);t.total_in=t.total_out=0,t.data_type=_t;const e=t.state;return e.pending=0,e.pending_out=0,e.wrap<0&&(e.wrap=-e.wrap),e.status=2===e.wrap?57:e.wrap?wt:mt,t.adler=2===e.wrap?0:1,e.last_flush=-2,P(e),tt},Bt=t=>{const e=Nt(t);var a;return e===tt&&((a=t.state).window_size=2*a.w_size,kt(a.head),a.max_lazy_match=It[a.level].max_lazy,a.good_match=It[a.level].good_length,a.nice_match=It[a.level].nice_length,a.max_chain_length=It[a.level].max_chain,a.strstart=0,a.block_start=0,a.lookahead=0,a.insert=0,a.match_length=a.prev_length=2,a.match_available=0,a.ins_h=0),e},Ct=(t,e,a,i,n,s)=>{if(!t)return at;let r=1;if(e===st&&(e=6),i<0?(r=0,i=-i):i>15&&(r=2,i-=16),n<1||n>9||a!==ft||i<8||i>15||e<0||e>9||s<0||s>ht||8===i&&1!==r)return gt(t,at);8===i&&(i=9);const o=new Ft;return t.state=o,o.strm=t,o.status=wt,o.wrap=r,o.gzhead=null,o.w_bits=i,o.w_size=1<Ct(t,e,ft,15,8,dt),deflateInit2:Ct,deflateReset:Bt,deflateResetKeep:Nt,deflateSetHeader:(t,e)=>Lt(t)||2!==t.state.wrap?at:(t.state.gzhead=e,tt),deflate:(t,e)=>{if(Lt(t)||e>$||e<0)return t?gt(t,at):at;const a=t.state;if(!t.output||0!==t.avail_in&&!t.input||a.status===bt&&e!==V)return gt(t,0===t.avail_out?nt:at);const i=a.last_flush;if(a.last_flush=e,0!==a.pending){if(xt(t),0===t.avail_out)return a.last_flush=-1,tt}else if(0===t.avail_in&&pt(e)<=pt(i)&&e!==V)return gt(t,nt);if(a.status===bt&&0!==t.avail_in)return gt(t,nt);if(a.status===wt&&0===a.wrap&&(a.status=mt),a.status===wt){let e=ft+(a.w_bits-8<<4)<<8,i=-1;if(i=a.strategy>=ot||a.level<2?0:a.level<6?1:6===a.level?2:3,e|=i<<6,0!==a.strstart&&(e|=32),e+=31-e%31,Et(a,e),0!==a.strstart&&(Et(a,t.adler>>>16),Et(a,65535&t.adler)),t.adler=1,a.status=mt,xt(t),0!==a.pending)return a.last_flush=-1,tt}if(57===a.status)if(t.adler=0,At(a,31),At(a,139),At(a,8),a.gzhead)At(a,(a.gzhead.text?1:0)+(a.gzhead.hcrc?2:0)+(a.gzhead.extra?4:0)+(a.gzhead.name?8:0)+(a.gzhead.comment?16:0)),At(a,255&a.gzhead.time),At(a,a.gzhead.time>>8&255),At(a,a.gzhead.time>>16&255),At(a,a.gzhead.time>>24&255),At(a,9===a.level?2:a.strategy>=ot||a.level<2?4:0),At(a,255&a.gzhead.os),a.gzhead.extra&&a.gzhead.extra.length&&(At(a,255&a.gzhead.extra.length),At(a,a.gzhead.extra.length>>8&255)),a.gzhead.hcrc&&(t.adler=H(t.adler,a.pending_buf,a.pending,0)),a.gzindex=0,a.status=69;else if(At(a,0),At(a,0),At(a,0),At(a,0),At(a,0),At(a,9===a.level?2:a.strategy>=ot||a.level<2?4:0),At(a,3),a.status=mt,xt(t),0!==a.pending)return a.last_flush=-1,tt;if(69===a.status){if(a.gzhead.extra){let e=a.pending,i=(65535&a.gzhead.extra.length)-a.gzindex;for(;a.pending+i>a.pending_buf_size;){let n=a.pending_buf_size-a.pending;if(a.pending_buf.set(a.gzhead.extra.subarray(a.gzindex,a.gzindex+n),a.pending),a.pending=a.pending_buf_size,a.gzhead.hcrc&&a.pending>e&&(t.adler=H(t.adler,a.pending_buf,a.pending-e,e)),a.gzindex+=n,xt(t),0!==a.pending)return a.last_flush=-1,tt;e=0,i-=n}let n=new Uint8Array(a.gzhead.extra);a.pending_buf.set(n.subarray(a.gzindex,a.gzindex+i),a.pending),a.pending+=i,a.gzhead.hcrc&&a.pending>e&&(t.adler=H(t.adler,a.pending_buf,a.pending-e,e)),a.gzindex=0}a.status=73}if(73===a.status){if(a.gzhead.name){let e,i=a.pending;do{if(a.pending===a.pending_buf_size){if(a.gzhead.hcrc&&a.pending>i&&(t.adler=H(t.adler,a.pending_buf,a.pending-i,i)),xt(t),0!==a.pending)return a.last_flush=-1,tt;i=0}e=a.gzindexi&&(t.adler=H(t.adler,a.pending_buf,a.pending-i,i)),a.gzindex=0}a.status=91}if(91===a.status){if(a.gzhead.comment){let e,i=a.pending;do{if(a.pending===a.pending_buf_size){if(a.gzhead.hcrc&&a.pending>i&&(t.adler=H(t.adler,a.pending_buf,a.pending-i,i)),xt(t),0!==a.pending)return a.last_flush=-1,tt;i=0}e=a.gzindexi&&(t.adler=H(t.adler,a.pending_buf,a.pending-i,i))}a.status=103}if(103===a.status){if(a.gzhead.hcrc){if(a.pending+2>a.pending_buf_size&&(xt(t),0!==a.pending))return a.last_flush=-1,tt;At(a,255&t.adler),At(a,t.adler>>8&255),t.adler=0}if(a.status=mt,xt(t),0!==a.pending)return a.last_flush=-1,tt}if(0!==t.avail_in||0!==a.lookahead||e!==q&&a.status!==bt){let i=0===a.level?St(a,e):a.strategy===ot?((t,e)=>{let a;for(;;){if(0===t.lookahead&&(Ut(t),0===t.lookahead)){if(e===q)return 1;break}if(t.match_length=0,a=X(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,a&&(zt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===V?(zt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(zt(t,!1),0===t.strm.avail_out)?1:2})(a,e):a.strategy===lt?((t,e)=>{let a,i,n,s;const r=t.window;for(;;){if(t.lookahead<=ct){if(Ut(t),t.lookahead<=ct&&e===q)return 1;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=3&&t.strstart>0&&(n=t.strstart-1,i=r[n],i===r[++n]&&i===r[++n]&&i===r[++n])){s=t.strstart+ct;do{}while(i===r[++n]&&i===r[++n]&&i===r[++n]&&i===r[++n]&&i===r[++n]&&i===r[++n]&&i===r[++n]&&i===r[++n]&&nt.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=3?(a=X(t,1,t.match_length-3),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(a=X(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),a&&(zt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===V?(zt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(zt(t,!1),0===t.strm.avail_out)?1:2})(a,e):It[a.level].func(a,e);if(3!==i&&4!==i||(a.status=bt),1===i||3===i)return 0===t.avail_out&&(a.last_flush=-1),tt;if(2===i&&(e===J?W(a):e!==$&&(Y(a,0,0,!1),e===Q&&(kt(a.head),0===a.lookahead&&(a.strstart=0,a.block_start=0,a.insert=0))),xt(t),0===t.avail_out))return a.last_flush=-1,tt}return e!==V?tt:a.wrap<=0?et:(2===a.wrap?(At(a,255&t.adler),At(a,t.adler>>8&255),At(a,t.adler>>16&255),At(a,t.adler>>24&255),At(a,255&t.total_in),At(a,t.total_in>>8&255),At(a,t.total_in>>16&255),At(a,t.total_in>>24&255)):(Et(a,t.adler>>>16),Et(a,65535&t.adler)),xt(t),a.wrap>0&&(a.wrap=-a.wrap),0!==a.pending?tt:et)},deflateEnd:t=>{if(Lt(t))return at;const e=t.state.status;return t.state=null,e===mt?gt(t,it):tt},deflateSetDictionary:(t,e)=>{let a=e.length;if(Lt(t))return at;const i=t.state,n=i.wrap;if(2===n||1===n&&i.status!==wt||i.lookahead)return at;if(1===n&&(t.adler=C(t.adler,e,a,0)),i.wrap=0,a>=i.w_size){0===n&&(kt(i.head),i.strstart=0,i.block_start=0,i.insert=0);let t=new Uint8Array(i.w_size);t.set(e.subarray(a-i.w_size,a),0),e=t,a=i.w_size}const s=t.avail_in,r=t.next_in,o=t.input;for(t.avail_in=a,t.next_in=0,t.input=e,Ut(i);i.lookahead>=3;){let t=i.strstart,e=i.lookahead-2;do{i.ins_h=yt(i,i.ins_h,i.window[t+3-1]),i.prev[t&i.w_mask]=i.head[i.ins_h],i.head[i.ins_h]=t,t++}while(--e);i.strstart=t,i.lookahead=2,Ut(i)}return i.strstart+=i.lookahead,i.block_start=i.strstart,i.insert=i.lookahead,i.lookahead=0,i.match_length=i.prev_length=2,i.match_available=0,t.next_in=r,t.input=o,t.avail_in=s,i.wrap=n,tt},deflateInfo:"pako deflate (from Nodeca project)"};const Ht=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var jt=function(t){const e=Array.prototype.slice.call(arguments,1);for(;e.length;){const a=e.shift();if(a){if("object"!=typeof a)throw new TypeError(a+"must be non-object");for(const e in a)Ht(a,e)&&(t[e]=a[e])}}return t},Kt=t=>{let e=0;for(let a=0,i=t.length;a=252?6:t>=248?5:t>=240?4:t>=224?3:t>=192?2:1;Yt[254]=Yt[254]=1;var Gt=t=>{if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(t);let e,a,i,n,s,r=t.length,o=0;for(n=0;n>>6,e[s++]=128|63&a):a<65536?(e[s++]=224|a>>>12,e[s++]=128|a>>>6&63,e[s++]=128|63&a):(e[s++]=240|a>>>18,e[s++]=128|a>>>12&63,e[s++]=128|a>>>6&63,e[s++]=128|63&a);return e},Xt=(t,e)=>{const a=e||t.length;if("function"==typeof TextDecoder&&TextDecoder.prototype.decode)return(new TextDecoder).decode(t.subarray(0,e));let i,n;const s=new Array(2*a);for(n=0,i=0;i4)s[n++]=65533,i+=r-1;else{for(e&=2===r?31:3===r?15:7;r>1&&i1?s[n++]=65533:e<65536?s[n++]=e:(e-=65536,s[n++]=55296|e>>10&1023,s[n++]=56320|1023&e)}}return((t,e)=>{if(e<65534&&t.subarray&&Pt)return String.fromCharCode.apply(null,t.length===e?t:t.subarray(0,e));let a="";for(let i=0;i{(e=e||t.length)>t.length&&(e=t.length);let a=e-1;for(;a>=0&&128==(192&t[a]);)a--;return a<0||0===a?e:a+Yt[t[a]]>e?a:e};var qt=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0};const Jt=Object.prototype.toString,{Z_NO_FLUSH:Qt,Z_SYNC_FLUSH:Vt,Z_FULL_FLUSH:$t,Z_FINISH:te,Z_OK:ee,Z_STREAM_END:ae,Z_DEFAULT_COMPRESSION:ie,Z_DEFAULT_STRATEGY:ne,Z_DEFLATED:se}=K;function re(t){this.options=jt({level:ie,method:se,chunkSize:16384,windowBits:15,memLevel:8,strategy:ne},t||{});let e=this.options;e.raw&&e.windowBits>0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new qt,this.strm.avail_out=0;let a=Mt.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(a!==ee)throw new Error(j[a]);if(e.header&&Mt.deflateSetHeader(this.strm,e.header),e.dictionary){let t;if(t="string"==typeof e.dictionary?Gt(e.dictionary):"[object ArrayBuffer]"===Jt.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,a=Mt.deflateSetDictionary(this.strm,t),a!==ee)throw new Error(j[a]);this._dict_set=!0}}function oe(t,e){const a=new re(e);if(a.push(t,!0),a.err)throw a.msg||j[a.err];return a.result}re.prototype.push=function(t,e){const a=this.strm,i=this.options.chunkSize;let n,s;if(this.ended)return!1;for(s=e===~~e?e:!0===e?te:Qt,"string"==typeof t?a.input=Gt(t):"[object ArrayBuffer]"===Jt.call(t)?a.input=new Uint8Array(t):a.input=t,a.next_in=0,a.avail_in=a.input.length;;)if(0===a.avail_out&&(a.output=new Uint8Array(i),a.next_out=0,a.avail_out=i),(s===Vt||s===$t)&&a.avail_out<=6)this.onData(a.output.subarray(0,a.next_out)),a.avail_out=0;else{if(n=Mt.deflate(a,s),n===ae)return a.next_out>0&&this.onData(a.output.subarray(0,a.next_out)),n=Mt.deflateEnd(this.strm),this.onEnd(n),this.ended=!0,n===ee;if(0!==a.avail_out){if(s>0&&a.next_out>0)this.onData(a.output.subarray(0,a.next_out)),a.avail_out=0;else if(0===a.avail_in)break}else this.onData(a.output)}return!0},re.prototype.onData=function(t){this.chunks.push(t)},re.prototype.onEnd=function(t){t===ee&&(this.result=Kt(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var le={Deflate:re,deflate:oe,deflateRaw:function(t,e){return(e=e||{}).raw=!0,oe(t,e)},gzip:function(t,e){return(e=e||{}).gzip=!0,oe(t,e)},constants:K};const he=16209;var de=function(t,e){let a,i,n,s,r,o,l,h,d,_,f,c,u,w,m,b,g,p,k,v,y,x,z,A;const E=t.state;a=t.next_in,z=t.input,i=a+(t.avail_in-5),n=t.next_out,A=t.output,s=n-(e-t.avail_out),r=n+(t.avail_out-257),o=E.dmax,l=E.wsize,h=E.whave,d=E.wnext,_=E.window,f=E.hold,c=E.bits,u=E.lencode,w=E.distcode,m=(1<>>24,f>>>=p,c-=p,p=g>>>16&255,0===p)A[n++]=65535&g;else{if(!(16&p)){if(0==(64&p)){g=u[(65535&g)+(f&(1<>>=p,c-=p),c<15&&(f+=z[a++]<>>24,f>>>=p,c-=p,p=g>>>16&255,!(16&p)){if(0==(64&p)){g=w[(65535&g)+(f&(1<o){t.msg="invalid distance too far back",E.mode=he;break t}if(f>>>=p,c-=p,p=n-s,v>p){if(p=v-p,p>h&&E.sane){t.msg="invalid distance too far back",E.mode=he;break t}if(y=0,x=_,0===d){if(y+=l-p,p2;)A[n++]=x[y++],A[n++]=x[y++],A[n++]=x[y++],k-=3;k&&(A[n++]=x[y++],k>1&&(A[n++]=x[y++]))}else{y=n-v;do{A[n++]=A[y++],A[n++]=A[y++],A[n++]=A[y++],k-=3}while(k>2);k&&(A[n++]=A[y++],k>1&&(A[n++]=A[y++]))}break}}break}}while(a>3,a-=k,c-=k<<3,f&=(1<{const l=o.bits;let h,d,_,f,c,u,w=0,m=0,b=0,g=0,p=0,k=0,v=0,y=0,x=0,z=0,A=null;const E=new Uint16Array(16),R=new Uint16Array(16);let Z,U,S,D=null;for(w=0;w<=_e;w++)E[w]=0;for(m=0;m=1&&0===E[g];g--);if(p>g&&(p=g),0===g)return n[s++]=20971520,n[s++]=20971520,o.bits=1,0;for(b=1;b0&&(0===t||1!==g))return-1;for(R[1]=0,w=1;w<_e;w++)R[w+1]=R[w]+E[w];for(m=0;m852||2===t&&x>592)return 1;for(;;){Z=w-v,r[m]+1=u?(U=D[r[m]-u],S=A[r[m]-u]):(U=96,S=0),h=1<>v)+d]=Z<<24|U<<16|S|0}while(0!==d);for(h=1<>=1;if(0!==h?(z&=h-1,z+=h):z=0,m++,0==--E[w]){if(w===g)break;w=e[a+r[m]]}if(w>p&&(z&f)!==_){for(0===v&&(v=p),c+=b,k=w-v,y=1<852||2===t&&x>592)return 1;_=z&f,n[_]=p<<24|k<<16|c-s|0}}return 0!==z&&(n[c+z]=w-v<<24|64<<16|0),o.bits=p,0};const{Z_FINISH:be,Z_BLOCK:ge,Z_TREES:pe,Z_OK:ke,Z_STREAM_END:ve,Z_NEED_DICT:ye,Z_STREAM_ERROR:xe,Z_DATA_ERROR:ze,Z_MEM_ERROR:Ae,Z_BUF_ERROR:Ee,Z_DEFLATED:Re}=K,Ze=16180,Ue=16190,Se=16191,De=16192,Te=16194,Oe=16199,Ie=16200,Fe=16206,Le=16209,Ne=t=>(t>>>24&255)+(t>>>8&65280)+((65280&t)<<8)+((255&t)<<24);function Be(){this.strm=null,this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const Ce=t=>{if(!t)return 1;const e=t.state;return!e||e.strm!==t||e.mode16211?1:0},Me=t=>{if(Ce(t))return xe;const e=t.state;return t.total_in=t.total_out=e.total=0,t.msg="",e.wrap&&(t.adler=1&e.wrap),e.mode=Ze,e.last=0,e.havedict=0,e.flags=-1,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new Int32Array(852),e.distcode=e.distdyn=new Int32Array(592),e.sane=1,e.back=-1,ke},He=t=>{if(Ce(t))return xe;const e=t.state;return e.wsize=0,e.whave=0,e.wnext=0,Me(t)},je=(t,e)=>{let a;if(Ce(t))return xe;const i=t.state;return e<0?(a=0,e=-e):(a=5+(e>>4),e<48&&(e&=15)),e&&(e<8||e>15)?xe:(null!==i.window&&i.wbits!==e&&(i.window=null),i.wrap=a,i.wbits=e,He(t))},Ke=(t,e)=>{if(!t)return xe;const a=new Be;t.state=a,a.strm=t,a.window=null,a.mode=Ze;const i=je(t,e);return i!==ke&&(t.state=null),i};let Pe,Ye,Ge=!0;const Xe=t=>{if(Ge){Pe=new Int32Array(512),Ye=new Int32Array(32);let e=0;for(;e<144;)t.lens[e++]=8;for(;e<256;)t.lens[e++]=9;for(;e<280;)t.lens[e++]=7;for(;e<288;)t.lens[e++]=8;for(me(1,t.lens,0,288,Pe,0,t.work,{bits:9}),e=0;e<32;)t.lens[e++]=5;me(2,t.lens,0,32,Ye,0,t.work,{bits:5}),Ge=!1}t.lencode=Pe,t.lenbits=9,t.distcode=Ye,t.distbits=5},We=(t,e,a,i)=>{let n;const s=t.state;return null===s.window&&(s.wsize=1<=s.wsize?(s.window.set(e.subarray(a-s.wsize,a),0),s.wnext=0,s.whave=s.wsize):(n=s.wsize-s.wnext,n>i&&(n=i),s.window.set(e.subarray(a-i,a-i+n),s.wnext),(i-=n)?(s.window.set(e.subarray(a-i,a),0),s.wnext=i,s.whave=s.wsize):(s.wnext+=n,s.wnext===s.wsize&&(s.wnext=0),s.whaveKe(t,15),inflateInit2:Ke,inflate:(t,e)=>{let a,i,n,s,r,o,l,h,d,_,f,c,u,w,m,b,g,p,k,v,y,x,z=0;const A=new Uint8Array(4);let E,R;const Z=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(Ce(t)||!t.output||!t.input&&0!==t.avail_in)return xe;a=t.state,a.mode===Se&&(a.mode=De),r=t.next_out,n=t.output,l=t.avail_out,s=t.next_in,i=t.input,o=t.avail_in,h=a.hold,d=a.bits,_=o,f=l,x=ke;t:for(;;)switch(a.mode){case Ze:if(0===a.wrap){a.mode=De;break}for(;d<16;){if(0===o)break t;o--,h+=i[s++]<>>8&255,a.check=H(a.check,A,2,0),h=0,d=0,a.mode=16181;break}if(a.head&&(a.head.done=!1),!(1&a.wrap)||(((255&h)<<8)+(h>>8))%31){t.msg="incorrect header check",a.mode=Le;break}if((15&h)!==Re){t.msg="unknown compression method",a.mode=Le;break}if(h>>>=4,d-=4,y=8+(15&h),0===a.wbits&&(a.wbits=y),y>15||y>a.wbits){t.msg="invalid window size",a.mode=Le;break}a.dmax=1<>8&1),512&a.flags&&4&a.wrap&&(A[0]=255&h,A[1]=h>>>8&255,a.check=H(a.check,A,2,0)),h=0,d=0,a.mode=16182;case 16182:for(;d<32;){if(0===o)break t;o--,h+=i[s++]<>>8&255,A[2]=h>>>16&255,A[3]=h>>>24&255,a.check=H(a.check,A,4,0)),h=0,d=0,a.mode=16183;case 16183:for(;d<16;){if(0===o)break t;o--,h+=i[s++]<>8),512&a.flags&&4&a.wrap&&(A[0]=255&h,A[1]=h>>>8&255,a.check=H(a.check,A,2,0)),h=0,d=0,a.mode=16184;case 16184:if(1024&a.flags){for(;d<16;){if(0===o)break t;o--,h+=i[s++]<>>8&255,a.check=H(a.check,A,2,0)),h=0,d=0}else a.head&&(a.head.extra=null);a.mode=16185;case 16185:if(1024&a.flags&&(c=a.length,c>o&&(c=o),c&&(a.head&&(y=a.head.extra_len-a.length,a.head.extra||(a.head.extra=new Uint8Array(a.head.extra_len)),a.head.extra.set(i.subarray(s,s+c),y)),512&a.flags&&4&a.wrap&&(a.check=H(a.check,i,c,s)),o-=c,s+=c,a.length-=c),a.length))break t;a.length=0,a.mode=16186;case 16186:if(2048&a.flags){if(0===o)break t;c=0;do{y=i[s+c++],a.head&&y&&a.length<65536&&(a.head.name+=String.fromCharCode(y))}while(y&&c>9&1,a.head.done=!0),t.adler=a.check=0,a.mode=Se;break;case 16189:for(;d<32;){if(0===o)break t;o--,h+=i[s++]<>>=7&d,d-=7&d,a.mode=Fe;break}for(;d<3;){if(0===o)break t;o--,h+=i[s++]<>>=1,d-=1,3&h){case 0:a.mode=16193;break;case 1:if(Xe(a),a.mode=Oe,e===pe){h>>>=2,d-=2;break t}break;case 2:a.mode=16196;break;case 3:t.msg="invalid block type",a.mode=Le}h>>>=2,d-=2;break;case 16193:for(h>>>=7&d,d-=7&d;d<32;){if(0===o)break t;o--,h+=i[s++]<>>16^65535)){t.msg="invalid stored block lengths",a.mode=Le;break}if(a.length=65535&h,h=0,d=0,a.mode=Te,e===pe)break t;case Te:a.mode=16195;case 16195:if(c=a.length,c){if(c>o&&(c=o),c>l&&(c=l),0===c)break t;n.set(i.subarray(s,s+c),r),o-=c,s+=c,l-=c,r+=c,a.length-=c;break}a.mode=Se;break;case 16196:for(;d<14;){if(0===o)break t;o--,h+=i[s++]<>>=5,d-=5,a.ndist=1+(31&h),h>>>=5,d-=5,a.ncode=4+(15&h),h>>>=4,d-=4,a.nlen>286||a.ndist>30){t.msg="too many length or distance symbols",a.mode=Le;break}a.have=0,a.mode=16197;case 16197:for(;a.have>>=3,d-=3}for(;a.have<19;)a.lens[Z[a.have++]]=0;if(a.lencode=a.lendyn,a.lenbits=7,E={bits:a.lenbits},x=me(0,a.lens,0,19,a.lencode,0,a.work,E),a.lenbits=E.bits,x){t.msg="invalid code lengths set",a.mode=Le;break}a.have=0,a.mode=16198;case 16198:for(;a.have>>24,b=z>>>16&255,g=65535&z,!(m<=d);){if(0===o)break t;o--,h+=i[s++]<>>=m,d-=m,a.lens[a.have++]=g;else{if(16===g){for(R=m+2;d>>=m,d-=m,0===a.have){t.msg="invalid bit length repeat",a.mode=Le;break}y=a.lens[a.have-1],c=3+(3&h),h>>>=2,d-=2}else if(17===g){for(R=m+3;d>>=m,d-=m,y=0,c=3+(7&h),h>>>=3,d-=3}else{for(R=m+7;d>>=m,d-=m,y=0,c=11+(127&h),h>>>=7,d-=7}if(a.have+c>a.nlen+a.ndist){t.msg="invalid bit length repeat",a.mode=Le;break}for(;c--;)a.lens[a.have++]=y}}if(a.mode===Le)break;if(0===a.lens[256]){t.msg="invalid code -- missing end-of-block",a.mode=Le;break}if(a.lenbits=9,E={bits:a.lenbits},x=me(1,a.lens,0,a.nlen,a.lencode,0,a.work,E),a.lenbits=E.bits,x){t.msg="invalid literal/lengths set",a.mode=Le;break}if(a.distbits=6,a.distcode=a.distdyn,E={bits:a.distbits},x=me(2,a.lens,a.nlen,a.ndist,a.distcode,0,a.work,E),a.distbits=E.bits,x){t.msg="invalid distances set",a.mode=Le;break}if(a.mode=Oe,e===pe)break t;case Oe:a.mode=Ie;case Ie:if(o>=6&&l>=258){t.next_out=r,t.avail_out=l,t.next_in=s,t.avail_in=o,a.hold=h,a.bits=d,de(t,f),r=t.next_out,n=t.output,l=t.avail_out,s=t.next_in,i=t.input,o=t.avail_in,h=a.hold,d=a.bits,a.mode===Se&&(a.back=-1);break}for(a.back=0;z=a.lencode[h&(1<>>24,b=z>>>16&255,g=65535&z,!(m<=d);){if(0===o)break t;o--,h+=i[s++]<>p)],m=z>>>24,b=z>>>16&255,g=65535&z,!(p+m<=d);){if(0===o)break t;o--,h+=i[s++]<>>=p,d-=p,a.back+=p}if(h>>>=m,d-=m,a.back+=m,a.length=g,0===b){a.mode=16205;break}if(32&b){a.back=-1,a.mode=Se;break}if(64&b){t.msg="invalid literal/length code",a.mode=Le;break}a.extra=15&b,a.mode=16201;case 16201:if(a.extra){for(R=a.extra;d>>=a.extra,d-=a.extra,a.back+=a.extra}a.was=a.length,a.mode=16202;case 16202:for(;z=a.distcode[h&(1<>>24,b=z>>>16&255,g=65535&z,!(m<=d);){if(0===o)break t;o--,h+=i[s++]<>p)],m=z>>>24,b=z>>>16&255,g=65535&z,!(p+m<=d);){if(0===o)break t;o--,h+=i[s++]<>>=p,d-=p,a.back+=p}if(h>>>=m,d-=m,a.back+=m,64&b){t.msg="invalid distance code",a.mode=Le;break}a.offset=g,a.extra=15&b,a.mode=16203;case 16203:if(a.extra){for(R=a.extra;d>>=a.extra,d-=a.extra,a.back+=a.extra}if(a.offset>a.dmax){t.msg="invalid distance too far back",a.mode=Le;break}a.mode=16204;case 16204:if(0===l)break t;if(c=f-l,a.offset>c){if(c=a.offset-c,c>a.whave&&a.sane){t.msg="invalid distance too far back",a.mode=Le;break}c>a.wnext?(c-=a.wnext,u=a.wsize-c):u=a.wnext-c,c>a.length&&(c=a.length),w=a.window}else w=n,u=r-a.offset,c=a.length;c>l&&(c=l),l-=c,a.length-=c;do{n[r++]=w[u++]}while(--c);0===a.length&&(a.mode=Ie);break;case 16205:if(0===l)break t;n[r++]=a.length,l--,a.mode=Ie;break;case Fe:if(a.wrap){for(;d<32;){if(0===o)break t;o--,h|=i[s++]<{if(Ce(t))return xe;let e=t.state;return e.window&&(e.window=null),t.state=null,ke},inflateGetHeader:(t,e)=>{if(Ce(t))return xe;const a=t.state;return 0==(2&a.wrap)?xe:(a.head=e,e.done=!1,ke)},inflateSetDictionary:(t,e)=>{const a=e.length;let i,n,s;return Ce(t)?xe:(i=t.state,0!==i.wrap&&i.mode!==Ue?xe:i.mode===Ue&&(n=1,n=C(n,e,a,0),n!==i.check)?ze:(s=We(t,e,a,a),s?(i.mode=16210,Ae):(i.havedict=1,ke)))},inflateInfo:"pako inflate (from Nodeca project)"};var Je=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1};const Qe=Object.prototype.toString,{Z_NO_FLUSH:Ve,Z_FINISH:$e,Z_OK:ta,Z_STREAM_END:ea,Z_NEED_DICT:aa,Z_STREAM_ERROR:ia,Z_DATA_ERROR:na,Z_MEM_ERROR:sa}=K;function ra(t){this.options=jt({chunkSize:65536,windowBits:15,to:""},t||{});const e=this.options;e.raw&&e.windowBits>=0&&e.windowBits<16&&(e.windowBits=-e.windowBits,0===e.windowBits&&(e.windowBits=-15)),!(e.windowBits>=0&&e.windowBits<16)||t&&t.windowBits||(e.windowBits+=32),e.windowBits>15&&e.windowBits<48&&0==(15&e.windowBits)&&(e.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new qt,this.strm.avail_out=0;let a=qe.inflateInit2(this.strm,e.windowBits);if(a!==ta)throw new Error(j[a]);if(this.header=new Je,qe.inflateGetHeader(this.strm,this.header),e.dictionary&&("string"==typeof e.dictionary?e.dictionary=Gt(e.dictionary):"[object ArrayBuffer]"===Qe.call(e.dictionary)&&(e.dictionary=new Uint8Array(e.dictionary)),e.raw&&(a=qe.inflateSetDictionary(this.strm,e.dictionary),a!==ta)))throw new Error(j[a])}function oa(t,e){const a=new ra(e);if(a.push(t),a.err)throw a.msg||j[a.err];return a.result}ra.prototype.push=function(t,e){const a=this.strm,i=this.options.chunkSize,n=this.options.dictionary;let s,r,o;if(this.ended)return!1;for(r=e===~~e?e:!0===e?$e:Ve,"[object ArrayBuffer]"===Qe.call(t)?a.input=new Uint8Array(t):a.input=t,a.next_in=0,a.avail_in=a.input.length;;){for(0===a.avail_out&&(a.output=new Uint8Array(i),a.next_out=0,a.avail_out=i),s=qe.inflate(a,r),s===aa&&n&&(s=qe.inflateSetDictionary(a,n),s===ta?s=qe.inflate(a,r):s===na&&(s=aa));a.avail_in>0&&s===ea&&a.state.wrap>0&&0!==t[a.next_in];)qe.inflateReset(a),s=qe.inflate(a,r);switch(s){case ia:case na:case aa:case sa:return this.onEnd(s),this.ended=!0,!1}if(o=a.avail_out,a.next_out&&(0===a.avail_out||s===ea))if("string"===this.options.to){let t=Wt(a.output,a.next_out),e=a.next_out-t,n=Xt(a.output,t);a.next_out=e,a.avail_out=i-e,e&&a.output.set(a.output.subarray(t,t+e),0),this.onData(n)}else this.onData(a.output.length===a.next_out?a.output:a.output.subarray(0,a.next_out));if(s!==ta||0!==o){if(s===ea)return s=qe.inflateEnd(this.strm),this.onEnd(s),this.ended=!0,!0;if(0===a.avail_in)break}}return!0},ra.prototype.onData=function(t){this.chunks.push(t)},ra.prototype.onEnd=function(t){t===ta&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=Kt(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var la={Inflate:ra,inflate:oa,inflateRaw:function(t,e){return(e=e||{}).raw=!0,oa(t,e)},ungzip:oa,constants:K};const{Deflate:ha,deflate:da,deflateRaw:_a,gzip:fa}=le,{Inflate:ca,inflate:ua,inflateRaw:wa,ungzip:ma}=la;var ba=ha,ga=da,pa=_a,ka=fa,va=ca,ya=ua,xa=wa,za=ma,Aa=K,Ea={Deflate:ba,deflate:ga,deflateRaw:pa,gzip:ka,Inflate:va,inflate:ya,inflateRaw:xa,ungzip:za,constants:Aa};t.Deflate=ba,t.Inflate=va,t.constants=Aa,t.default=Ea,t.deflate=ga,t.deflateRaw=pa,t.gzip=ka,t.inflate=ya,t.inflateRaw=xa,t.ungzip=za,Object.defineProperty(t,"__esModule",{value:!0})})); diff --git a/node_modules/pako/dist/pako_deflate.es5.js b/node_modules/pako/dist/pako_deflate.es5.js deleted file mode 100644 index fd129da..0000000 --- a/node_modules/pako/dist/pako_deflate.es5.js +++ /dev/null @@ -1,3924 +0,0 @@ - -/*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : - typeof define === 'function' && define.amd ? define(['exports'], factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.pako = {})); -})(this, (function (exports) { 'use strict'; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - /* eslint-disable space-unary-ops */ - - /* Public constants ==========================================================*/ - /* ===========================================================================*/ - - //const Z_FILTERED = 1; - //const Z_HUFFMAN_ONLY = 2; - //const Z_RLE = 3; - var Z_FIXED$1 = 4; - //const Z_DEFAULT_STRATEGY = 0; - - /* Possible values of the data_type field (though see inflate()) */ - var Z_BINARY = 0; - var Z_TEXT = 1; - //const Z_ASCII = 1; // = Z_TEXT - var Z_UNKNOWN$1 = 2; - - /*============================================================================*/ - - function zero$1(buf) { - var len = buf.length; - while (--len >= 0) { - buf[len] = 0; - } - } - - // From zutil.h - - var STORED_BLOCK = 0; - var STATIC_TREES = 1; - var DYN_TREES = 2; - /* The three kinds of block type */ - - var MIN_MATCH$1 = 3; - var MAX_MATCH$1 = 258; - /* The minimum and maximum match lengths */ - - // From deflate.h - /* =========================================================================== - * Internal compression state. - */ - - var LENGTH_CODES$1 = 29; - /* number of length codes, not counting the special END_BLOCK code */ - - var LITERALS$1 = 256; - /* number of literal bytes 0..255 */ - - var L_CODES$1 = LITERALS$1 + 1 + LENGTH_CODES$1; - /* number of Literal or Length codes, including the END_BLOCK code */ - - var D_CODES$1 = 30; - /* number of distance codes */ - - var BL_CODES$1 = 19; - /* number of codes used to transfer the bit lengths */ - - var HEAP_SIZE$1 = 2 * L_CODES$1 + 1; - /* maximum heap size */ - - var MAX_BITS$1 = 15; - /* All codes must not exceed MAX_BITS bits */ - - var Buf_size = 16; - /* size of bit buffer in bi_buf */ - - /* =========================================================================== - * Constants - */ - - var MAX_BL_BITS = 7; - /* Bit length codes must not exceed MAX_BL_BITS bits */ - - var END_BLOCK = 256; - /* end of block literal code */ - - var REP_3_6 = 16; - /* repeat previous bit length 3-6 times (2 bits of repeat count) */ - - var REPZ_3_10 = 17; - /* repeat a zero length 3-10 times (3 bits of repeat count) */ - - var REPZ_11_138 = 18; - /* repeat a zero length 11-138 times (7 bits of repeat count) */ - - /* eslint-disable comma-spacing,array-bracket-spacing */ - var extra_lbits = /* extra bits for each length code */ - new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0]); - var extra_dbits = /* extra bits for each distance code */ - new Uint8Array([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13]); - var extra_blbits = /* extra bits for each bit length code */ - new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7]); - var bl_order = new Uint8Array([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]); - /* eslint-enable comma-spacing,array-bracket-spacing */ - - /* The lengths of the bit length codes are sent in order of decreasing - * probability, to avoid transmitting the lengths for unused bit length codes. - */ - - /* =========================================================================== - * Local data. These are initialized only once. - */ - - // We pre-fill arrays with 0 to avoid uninitialized gaps - - var DIST_CODE_LEN = 512; /* see definition of array dist_code below */ - - // !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1 - var static_ltree = new Array((L_CODES$1 + 2) * 2); - zero$1(static_ltree); - /* The static literal tree. Since the bit lengths are imposed, there is no - * need for the L_CODES extra codes used during heap construction. However - * The codes 286 and 287 are needed to build a canonical tree (see _tr_init - * below). - */ - - var static_dtree = new Array(D_CODES$1 * 2); - zero$1(static_dtree); - /* The static distance tree. (Actually a trivial tree since all codes use - * 5 bits.) - */ - - var _dist_code = new Array(DIST_CODE_LEN); - zero$1(_dist_code); - /* Distance codes. The first 256 values correspond to the distances - * 3 .. 258, the last 256 values correspond to the top 8 bits of - * the 15 bit distances. - */ - - var _length_code = new Array(MAX_MATCH$1 - MIN_MATCH$1 + 1); - zero$1(_length_code); - /* length code for each normalized match length (0 == MIN_MATCH) */ - - var base_length = new Array(LENGTH_CODES$1); - zero$1(base_length); - /* First normalized length for each code (0 = MIN_MATCH) */ - - var base_dist = new Array(D_CODES$1); - zero$1(base_dist); - /* First normalized distance for each code (0 = distance of 1) */ - - function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) { - this.static_tree = static_tree; /* static tree or NULL */ - this.extra_bits = extra_bits; /* extra bits for each code or NULL */ - this.extra_base = extra_base; /* base index for extra_bits */ - this.elems = elems; /* max number of elements in the tree */ - this.max_length = max_length; /* max bit length for the codes */ - - // show if `static_tree` has data or dummy - needed for monomorphic objects - this.has_stree = static_tree && static_tree.length; - } - var static_l_desc; - var static_d_desc; - var static_bl_desc; - function TreeDesc(dyn_tree, stat_desc) { - this.dyn_tree = dyn_tree; /* the dynamic tree */ - this.max_code = 0; /* largest code with non zero frequency */ - this.stat_desc = stat_desc; /* the corresponding static tree */ - } - - var d_code = function d_code(dist) { - return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)]; - }; - - /* =========================================================================== - * Output a short LSB first on the stream. - * IN assertion: there is enough room in pendingBuf. - */ - var put_short = function put_short(s, w) { - // put_byte(s, (uch)((w) & 0xff)); - // put_byte(s, (uch)((ush)(w) >> 8)); - s.pending_buf[s.pending++] = w & 0xff; - s.pending_buf[s.pending++] = w >>> 8 & 0xff; - }; - - /* =========================================================================== - * Send a value on a given number of bits. - * IN assertion: length <= 16 and value fits in length bits. - */ - var send_bits = function send_bits(s, value, length) { - if (s.bi_valid > Buf_size - length) { - s.bi_buf |= value << s.bi_valid & 0xffff; - put_short(s, s.bi_buf); - s.bi_buf = value >> Buf_size - s.bi_valid; - s.bi_valid += length - Buf_size; - } else { - s.bi_buf |= value << s.bi_valid & 0xffff; - s.bi_valid += length; - } - }; - var send_code = function send_code(s, c, tree) { - send_bits(s, tree[c * 2] /*.Code*/, tree[c * 2 + 1] /*.Len*/); - }; - - /* =========================================================================== - * Reverse the first len bits of a code, using straightforward code (a faster - * method would use a table) - * IN assertion: 1 <= len <= 15 - */ - var bi_reverse = function bi_reverse(code, len) { - var res = 0; - do { - res |= code & 1; - code >>>= 1; - res <<= 1; - } while (--len > 0); - return res >>> 1; - }; - - /* =========================================================================== - * Flush the bit buffer, keeping at most 7 bits in it. - */ - var bi_flush = function bi_flush(s) { - if (s.bi_valid === 16) { - put_short(s, s.bi_buf); - s.bi_buf = 0; - s.bi_valid = 0; - } else if (s.bi_valid >= 8) { - s.pending_buf[s.pending++] = s.bi_buf & 0xff; - s.bi_buf >>= 8; - s.bi_valid -= 8; - } - }; - - /* =========================================================================== - * Compute the optimal bit lengths for a tree and update the total bit length - * for the current block. - * IN assertion: the fields freq and dad are set, heap[heap_max] and - * above are the tree nodes sorted by increasing frequency. - * OUT assertions: the field len is set to the optimal bit length, the - * array bl_count contains the frequencies for each bit length. - * The length opt_len is updated; static_len is also updated if stree is - * not null. - */ - var gen_bitlen = function gen_bitlen(s, desc) { - // deflate_state *s; - // tree_desc *desc; /* the tree descriptor */ - - var tree = desc.dyn_tree; - var max_code = desc.max_code; - var stree = desc.stat_desc.static_tree; - var has_stree = desc.stat_desc.has_stree; - var extra = desc.stat_desc.extra_bits; - var base = desc.stat_desc.extra_base; - var max_length = desc.stat_desc.max_length; - var h; /* heap index */ - var n, m; /* iterate over the tree elements */ - var bits; /* bit length */ - var xbits; /* extra bits */ - var f; /* frequency */ - var overflow = 0; /* number of elements with bit length too large */ - - for (bits = 0; bits <= MAX_BITS$1; bits++) { - s.bl_count[bits] = 0; - } - - /* In a first pass, compute the optimal bit lengths (which may - * overflow in the case of the bit length tree). - */ - tree[s.heap[s.heap_max] * 2 + 1] /*.Len*/ = 0; /* root of the heap */ - - for (h = s.heap_max + 1; h < HEAP_SIZE$1; h++) { - n = s.heap[h]; - bits = tree[tree[n * 2 + 1] /*.Dad*/ * 2 + 1] /*.Len*/ + 1; - if (bits > max_length) { - bits = max_length; - overflow++; - } - tree[n * 2 + 1] /*.Len*/ = bits; - /* We overwrite tree[n].Dad which is no longer needed */ - - if (n > max_code) { - continue; - } /* not a leaf node */ - - s.bl_count[bits]++; - xbits = 0; - if (n >= base) { - xbits = extra[n - base]; - } - f = tree[n * 2] /*.Freq*/; - s.opt_len += f * (bits + xbits); - if (has_stree) { - s.static_len += f * (stree[n * 2 + 1] /*.Len*/ + xbits); - } - } - if (overflow === 0) { - return; - } - - // Tracev((stderr,"\nbit length overflow\n")); - /* This happens for example on obj2 and pic of the Calgary corpus */ - - /* Find the first bit length which could increase: */ - do { - bits = max_length - 1; - while (s.bl_count[bits] === 0) { - bits--; - } - s.bl_count[bits]--; /* move one leaf down the tree */ - s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */ - s.bl_count[max_length]--; - /* The brother of the overflow item also moves one step up, - * but this does not affect bl_count[max_length] - */ - overflow -= 2; - } while (overflow > 0); - - /* Now recompute all bit lengths, scanning in increasing frequency. - * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all - * lengths instead of fixing only the wrong ones. This idea is taken - * from 'ar' written by Haruhiko Okumura.) - */ - for (bits = max_length; bits !== 0; bits--) { - n = s.bl_count[bits]; - while (n !== 0) { - m = s.heap[--h]; - if (m > max_code) { - continue; - } - if (tree[m * 2 + 1] /*.Len*/ !== bits) { - // Tracev((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); - s.opt_len += (bits - tree[m * 2 + 1] /*.Len*/) * tree[m * 2] /*.Freq*/; - tree[m * 2 + 1] /*.Len*/ = bits; - } - n--; - } - } - }; - - /* =========================================================================== - * Generate the codes for a given tree and bit counts (which need not be - * optimal). - * IN assertion: the array bl_count contains the bit length statistics for - * the given tree and the field len is set for all tree elements. - * OUT assertion: the field code is set for all tree elements of non - * zero code length. - */ - var gen_codes = function gen_codes(tree, max_code, bl_count) { - // ct_data *tree; /* the tree to decorate */ - // int max_code; /* largest code with non zero frequency */ - // ushf *bl_count; /* number of codes at each bit length */ - - var next_code = new Array(MAX_BITS$1 + 1); /* next code value for each bit length */ - var code = 0; /* running code value */ - var bits; /* bit index */ - var n; /* code index */ - - /* The distribution counts are first used to generate the code values - * without bit reversal. - */ - for (bits = 1; bits <= MAX_BITS$1; bits++) { - code = code + bl_count[bits - 1] << 1; - next_code[bits] = code; - } - /* Check that the bit counts in bl_count are consistent. The last code - * must be all ones. - */ - //Assert (code + bl_count[MAX_BITS]-1 == (1< length code (0..28) */ - length = 0; - for (code = 0; code < LENGTH_CODES$1 - 1; code++) { - base_length[code] = length; - for (n = 0; n < 1 << extra_lbits[code]; n++) { - _length_code[length++] = code; - } - } - //Assert (length == 256, "tr_static_init: length != 256"); - /* Note that the length 255 (match length 258) can be represented - * in two different ways: code 284 + 5 bits or code 285, so we - * overwrite length_code[255] to use the best encoding: - */ - _length_code[length - 1] = code; - - /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ - dist = 0; - for (code = 0; code < 16; code++) { - base_dist[code] = dist; - for (n = 0; n < 1 << extra_dbits[code]; n++) { - _dist_code[dist++] = code; - } - } - //Assert (dist == 256, "tr_static_init: dist != 256"); - dist >>= 7; /* from now on, all distances are divided by 128 */ - for (; code < D_CODES$1; code++) { - base_dist[code] = dist << 7; - for (n = 0; n < 1 << extra_dbits[code] - 7; n++) { - _dist_code[256 + dist++] = code; - } - } - //Assert (dist == 256, "tr_static_init: 256+dist != 512"); - - /* Construct the codes of the static literal tree */ - for (bits = 0; bits <= MAX_BITS$1; bits++) { - bl_count[bits] = 0; - } - n = 0; - while (n <= 143) { - static_ltree[n * 2 + 1] /*.Len*/ = 8; - n++; - bl_count[8]++; - } - while (n <= 255) { - static_ltree[n * 2 + 1] /*.Len*/ = 9; - n++; - bl_count[9]++; - } - while (n <= 279) { - static_ltree[n * 2 + 1] /*.Len*/ = 7; - n++; - bl_count[7]++; - } - while (n <= 287) { - static_ltree[n * 2 + 1] /*.Len*/ = 8; - n++; - bl_count[8]++; - } - /* Codes 286 and 287 do not exist, but we must include them in the - * tree construction to get a canonical Huffman tree (longest code - * all ones) - */ - gen_codes(static_ltree, L_CODES$1 + 1, bl_count); - - /* The static distance tree is trivial: */ - for (n = 0; n < D_CODES$1; n++) { - static_dtree[n * 2 + 1] /*.Len*/ = 5; - static_dtree[n * 2] /*.Code*/ = bi_reverse(n, 5); - } - - // Now data ready and we can init static trees - static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS$1 + 1, L_CODES$1, MAX_BITS$1); - static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES$1, MAX_BITS$1); - static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES$1, MAX_BL_BITS); - - //static_init_done = true; - }; - - /* =========================================================================== - * Initialize a new block. - */ - var init_block = function init_block(s) { - var n; /* iterates over tree elements */ - - /* Initialize the trees. */ - for (n = 0; n < L_CODES$1; n++) { - s.dyn_ltree[n * 2] /*.Freq*/ = 0; - } - for (n = 0; n < D_CODES$1; n++) { - s.dyn_dtree[n * 2] /*.Freq*/ = 0; - } - for (n = 0; n < BL_CODES$1; n++) { - s.bl_tree[n * 2] /*.Freq*/ = 0; - } - s.dyn_ltree[END_BLOCK * 2] /*.Freq*/ = 1; - s.opt_len = s.static_len = 0; - s.sym_next = s.matches = 0; - }; - - /* =========================================================================== - * Flush the bit buffer and align the output on a byte boundary - */ - var bi_windup = function bi_windup(s) { - if (s.bi_valid > 8) { - put_short(s, s.bi_buf); - } else if (s.bi_valid > 0) { - //put_byte(s, (Byte)s->bi_buf); - s.pending_buf[s.pending++] = s.bi_buf; - } - s.bi_buf = 0; - s.bi_valid = 0; - }; - - /* =========================================================================== - * Compares to subtrees, using the tree depth as tie breaker when - * the subtrees have equal frequency. This minimizes the worst case length. - */ - var smaller = function smaller(tree, n, m, depth) { - var _n2 = n * 2; - var _m2 = m * 2; - return tree[_n2] /*.Freq*/ < tree[_m2] /*.Freq*/ || tree[_n2] /*.Freq*/ === tree[_m2] /*.Freq*/ && depth[n] <= depth[m]; - }; - - /* =========================================================================== - * Restore the heap property by moving down the tree starting at node k, - * exchanging a node with the smallest of its two sons if necessary, stopping - * when the heap property is re-established (each father smaller than its - * two sons). - */ - var pqdownheap = function pqdownheap(s, tree, k) { - // deflate_state *s; - // ct_data *tree; /* the tree to restore */ - // int k; /* node to move down */ - - var v = s.heap[k]; - var j = k << 1; /* left son of k */ - while (j <= s.heap_len) { - /* Set j to the smallest of the two sons: */ - if (j < s.heap_len && smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) { - j++; - } - /* Exit if v is smaller than both sons */ - if (smaller(tree, v, s.heap[j], s.depth)) { - break; - } - - /* Exchange v with the smallest son */ - s.heap[k] = s.heap[j]; - k = j; - - /* And continue down the tree, setting j to the left son of k */ - j <<= 1; - } - s.heap[k] = v; - }; - - // inlined manually - // const SMALLEST = 1; - - /* =========================================================================== - * Send the block data compressed using the given Huffman trees - */ - var compress_block = function compress_block(s, ltree, dtree) { - // deflate_state *s; - // const ct_data *ltree; /* literal tree */ - // const ct_data *dtree; /* distance tree */ - - var dist; /* distance of matched string */ - var lc; /* match length or unmatched char (if dist == 0) */ - var sx = 0; /* running index in sym_buf */ - var code; /* the code to send */ - var extra; /* number of extra bits to send */ - - if (s.sym_next !== 0) { - do { - dist = s.pending_buf[s.sym_buf + sx++] & 0xff; - dist += (s.pending_buf[s.sym_buf + sx++] & 0xff) << 8; - lc = s.pending_buf[s.sym_buf + sx++]; - if (dist === 0) { - send_code(s, lc, ltree); /* send a literal byte */ - //Tracecv(isgraph(lc), (stderr," '%c' ", lc)); - } else { - /* Here, lc is the match length - MIN_MATCH */ - code = _length_code[lc]; - send_code(s, code + LITERALS$1 + 1, ltree); /* send the length code */ - extra = extra_lbits[code]; - if (extra !== 0) { - lc -= base_length[code]; - send_bits(s, lc, extra); /* send the extra length bits */ - } - - dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - //Assert (code < D_CODES, "bad d_code"); - - send_code(s, code, dtree); /* send the distance code */ - extra = extra_dbits[code]; - if (extra !== 0) { - dist -= base_dist[code]; - send_bits(s, dist, extra); /* send the extra distance bits */ - } - } /* literal or match pair ? */ - - /* Check that the overlay between pending_buf and sym_buf is ok: */ - //Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow"); - } while (sx < s.sym_next); - } - send_code(s, END_BLOCK, ltree); - }; - - /* =========================================================================== - * Construct one Huffman tree and assigns the code bit strings and lengths. - * Update the total bit length for the current block. - * IN assertion: the field freq is set for all tree elements. - * OUT assertions: the fields len and code are set to the optimal bit length - * and corresponding code. The length opt_len is updated; static_len is - * also updated if stree is not null. The field max_code is set. - */ - var build_tree = function build_tree(s, desc) { - // deflate_state *s; - // tree_desc *desc; /* the tree descriptor */ - - var tree = desc.dyn_tree; - var stree = desc.stat_desc.static_tree; - var has_stree = desc.stat_desc.has_stree; - var elems = desc.stat_desc.elems; - var n, m; /* iterate over heap elements */ - var max_code = -1; /* largest code with non zero frequency */ - var node; /* new node being created */ - - /* Construct the initial heap, with least frequent element in - * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. - * heap[0] is not used. - */ - s.heap_len = 0; - s.heap_max = HEAP_SIZE$1; - for (n = 0; n < elems; n++) { - if (tree[n * 2] /*.Freq*/ !== 0) { - s.heap[++s.heap_len] = max_code = n; - s.depth[n] = 0; - } else { - tree[n * 2 + 1] /*.Len*/ = 0; - } - } - - /* The pkzip format requires that at least one distance code exists, - * and that at least one bit should be sent even if there is only one - * possible code. So to avoid special checks later on we force at least - * two codes of non zero frequency. - */ - while (s.heap_len < 2) { - node = s.heap[++s.heap_len] = max_code < 2 ? ++max_code : 0; - tree[node * 2] /*.Freq*/ = 1; - s.depth[node] = 0; - s.opt_len--; - if (has_stree) { - s.static_len -= stree[node * 2 + 1] /*.Len*/; - } - /* node is 0 or 1 so it does not have extra bits */ - } - - desc.max_code = max_code; - - /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, - * establish sub-heaps of increasing lengths: - */ - for (n = s.heap_len >> 1 /*int /2*/; n >= 1; n--) { - pqdownheap(s, tree, n); - } - - /* Construct the Huffman tree by repeatedly combining the least two - * frequent nodes. - */ - node = elems; /* next internal node of the tree */ - do { - //pqremove(s, tree, n); /* n = node of least frequency */ - /*** pqremove ***/ - n = s.heap[1 /*SMALLEST*/]; - s.heap[1 /*SMALLEST*/] = s.heap[s.heap_len--]; - pqdownheap(s, tree, 1 /*SMALLEST*/); - /***/ - - m = s.heap[1 /*SMALLEST*/]; /* m = node of next least frequency */ - - s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */ - s.heap[--s.heap_max] = m; - - /* Create a new node father of n and m */ - tree[node * 2] /*.Freq*/ = tree[n * 2] /*.Freq*/ + tree[m * 2] /*.Freq*/; - s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1; - tree[n * 2 + 1] /*.Dad*/ = tree[m * 2 + 1] /*.Dad*/ = node; - - /* and insert the new node in the heap */ - s.heap[1 /*SMALLEST*/] = node++; - pqdownheap(s, tree, 1 /*SMALLEST*/); - } while (s.heap_len >= 2); - s.heap[--s.heap_max] = s.heap[1 /*SMALLEST*/]; - - /* At this point, the fields freq and dad are set. We can now - * generate the bit lengths. - */ - gen_bitlen(s, desc); - - /* The field len is now set, we can generate the bit codes */ - gen_codes(tree, max_code, s.bl_count); - }; - - /* =========================================================================== - * Scan a literal or distance tree to determine the frequencies of the codes - * in the bit length tree. - */ - var scan_tree = function scan_tree(s, tree, max_code) { - // deflate_state *s; - // ct_data *tree; /* the tree to be scanned */ - // int max_code; /* and its largest code of non zero frequency */ - - var n; /* iterates over all tree elements */ - var prevlen = -1; /* last emitted length */ - var curlen; /* length of current code */ - - var nextlen = tree[0 * 2 + 1] /*.Len*/; /* length of next code */ - - var count = 0; /* repeat count of the current code */ - var max_count = 7; /* max repeat count */ - var min_count = 4; /* min repeat count */ - - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } - tree[(max_code + 1) * 2 + 1] /*.Len*/ = 0xffff; /* guard */ - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[(n + 1) * 2 + 1] /*.Len*/; - - if (++count < max_count && curlen === nextlen) { - continue; - } else if (count < min_count) { - s.bl_tree[curlen * 2] /*.Freq*/ += count; - } else if (curlen !== 0) { - if (curlen !== prevlen) { - s.bl_tree[curlen * 2] /*.Freq*/++; - } - s.bl_tree[REP_3_6 * 2] /*.Freq*/++; - } else if (count <= 10) { - s.bl_tree[REPZ_3_10 * 2] /*.Freq*/++; - } else { - s.bl_tree[REPZ_11_138 * 2] /*.Freq*/++; - } - - count = 0; - prevlen = curlen; - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } else if (curlen === nextlen) { - max_count = 6; - min_count = 3; - } else { - max_count = 7; - min_count = 4; - } - } - }; - - /* =========================================================================== - * Send a literal or distance tree in compressed form, using the codes in - * bl_tree. - */ - var send_tree = function send_tree(s, tree, max_code) { - // deflate_state *s; - // ct_data *tree; /* the tree to be scanned */ - // int max_code; /* and its largest code of non zero frequency */ - - var n; /* iterates over all tree elements */ - var prevlen = -1; /* last emitted length */ - var curlen; /* length of current code */ - - var nextlen = tree[0 * 2 + 1] /*.Len*/; /* length of next code */ - - var count = 0; /* repeat count of the current code */ - var max_count = 7; /* max repeat count */ - var min_count = 4; /* min repeat count */ - - /* tree[max_code+1].Len = -1; */ /* guard already set */ - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[(n + 1) * 2 + 1] /*.Len*/; - - if (++count < max_count && curlen === nextlen) { - continue; - } else if (count < min_count) { - do { - send_code(s, curlen, s.bl_tree); - } while (--count !== 0); - } else if (curlen !== 0) { - if (curlen !== prevlen) { - send_code(s, curlen, s.bl_tree); - count--; - } - //Assert(count >= 3 && count <= 6, " 3_6?"); - send_code(s, REP_3_6, s.bl_tree); - send_bits(s, count - 3, 2); - } else if (count <= 10) { - send_code(s, REPZ_3_10, s.bl_tree); - send_bits(s, count - 3, 3); - } else { - send_code(s, REPZ_11_138, s.bl_tree); - send_bits(s, count - 11, 7); - } - count = 0; - prevlen = curlen; - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } else if (curlen === nextlen) { - max_count = 6; - min_count = 3; - } else { - max_count = 7; - min_count = 4; - } - } - }; - - /* =========================================================================== - * Construct the Huffman tree for the bit lengths and return the index in - * bl_order of the last bit length code to send. - */ - var build_bl_tree = function build_bl_tree(s) { - var max_blindex; /* index of last bit length code of non zero freq */ - - /* Determine the bit length frequencies for literal and distance trees */ - scan_tree(s, s.dyn_ltree, s.l_desc.max_code); - scan_tree(s, s.dyn_dtree, s.d_desc.max_code); - - /* Build the bit length tree: */ - build_tree(s, s.bl_desc); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - */ - - /* Determine the number of bit length codes to send. The pkzip format - * requires that at least 4 bit length codes be sent. (appnote.txt says - * 3 but the actual value used is 4.) - */ - for (max_blindex = BL_CODES$1 - 1; max_blindex >= 3; max_blindex--) { - if (s.bl_tree[bl_order[max_blindex] * 2 + 1] /*.Len*/ !== 0) { - break; - } - } - /* Update opt_len to include the bit length tree and counts */ - s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; - //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", - // s->opt_len, s->static_len)); - - return max_blindex; - }; - - /* =========================================================================== - * Send the header for a block using dynamic Huffman trees: the counts, the - * lengths of the bit length codes, the literal tree and the distance tree. - * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. - */ - var send_all_trees = function send_all_trees(s, lcodes, dcodes, blcodes) { - // deflate_state *s; - // int lcodes, dcodes, blcodes; /* number of codes for each tree */ - - var rank; /* index in bl_order */ - - //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); - //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, - // "too many codes"); - //Tracev((stderr, "\nbl counts: ")); - send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ - send_bits(s, dcodes - 1, 5); - send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ - for (rank = 0; rank < blcodes; rank++) { - //Tracev((stderr, "\nbl code %2d ", bl_order[rank])); - send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1] /*.Len*/, 3); - } - //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); - - send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */ - //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); - - send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */ - //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); - }; - - /* =========================================================================== - * Check if the data type is TEXT or BINARY, using the following algorithm: - * - TEXT if the two conditions below are satisfied: - * a) There are no non-portable control characters belonging to the - * "block list" (0..6, 14..25, 28..31). - * b) There is at least one printable character belonging to the - * "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). - * - BINARY otherwise. - * - The following partially-portable control characters form a - * "gray list" that is ignored in this detection algorithm: - * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). - * IN assertion: the fields Freq of dyn_ltree are set. - */ - var detect_data_type = function detect_data_type(s) { - /* block_mask is the bit mask of block-listed bytes - * set bits 0..6, 14..25, and 28..31 - * 0xf3ffc07f = binary 11110011111111111100000001111111 - */ - var block_mask = 0xf3ffc07f; - var n; - - /* Check for non-textual ("block-listed") bytes. */ - for (n = 0; n <= 31; n++, block_mask >>>= 1) { - if (block_mask & 1 && s.dyn_ltree[n * 2] /*.Freq*/ !== 0) { - return Z_BINARY; - } - } - - /* Check for textual ("allow-listed") bytes. */ - if (s.dyn_ltree[9 * 2] /*.Freq*/ !== 0 || s.dyn_ltree[10 * 2] /*.Freq*/ !== 0 || s.dyn_ltree[13 * 2] /*.Freq*/ !== 0) { - return Z_TEXT; - } - for (n = 32; n < LITERALS$1; n++) { - if (s.dyn_ltree[n * 2] /*.Freq*/ !== 0) { - return Z_TEXT; - } - } - - /* There are no "block-listed" or "allow-listed" bytes: - * this stream either is empty or has tolerated ("gray-listed") bytes only. - */ - return Z_BINARY; - }; - var static_init_done = false; - - /* =========================================================================== - * Initialize the tree data structures for a new zlib stream. - */ - var _tr_init$1 = function _tr_init(s) { - if (!static_init_done) { - tr_static_init(); - static_init_done = true; - } - s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc); - s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc); - s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc); - s.bi_buf = 0; - s.bi_valid = 0; - - /* Initialize the first block of the first file: */ - init_block(s); - }; - - /* =========================================================================== - * Send a stored block - */ - var _tr_stored_block$1 = function _tr_stored_block(s, buf, stored_len, last) { - //DeflateState *s; - //charf *buf; /* input block */ - //ulg stored_len; /* length of input block */ - //int last; /* one if this is the last block for a file */ - - send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */ - bi_windup(s); /* align on byte boundary */ - put_short(s, stored_len); - put_short(s, ~stored_len); - if (stored_len) { - s.pending_buf.set(s.window.subarray(buf, buf + stored_len), s.pending); - } - s.pending += stored_len; - }; - - /* =========================================================================== - * Send one empty static block to give enough lookahead for inflate. - * This takes 10 bits, of which 7 may remain in the bit buffer. - */ - var _tr_align$1 = function _tr_align(s) { - send_bits(s, STATIC_TREES << 1, 3); - send_code(s, END_BLOCK, static_ltree); - bi_flush(s); - }; - - /* =========================================================================== - * Determine the best encoding for the current block: dynamic trees, static - * trees or store, and write out the encoded block. - */ - var _tr_flush_block$1 = function _tr_flush_block(s, buf, stored_len, last) { - //DeflateState *s; - //charf *buf; /* input block, or NULL if too old */ - //ulg stored_len; /* length of input block */ - //int last; /* one if this is the last block for a file */ - - var opt_lenb, static_lenb; /* opt_len and static_len in bytes */ - var max_blindex = 0; /* index of last bit length code of non zero freq */ - - /* Build the Huffman trees unless a stored block is forced */ - if (s.level > 0) { - /* Check if the file is binary or text */ - if (s.strm.data_type === Z_UNKNOWN$1) { - s.strm.data_type = detect_data_type(s); - } - - /* Construct the literal and distance trees */ - build_tree(s, s.l_desc); - // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, - // s->static_len)); - - build_tree(s, s.d_desc); - // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, - // s->static_len)); - /* At this point, opt_len and static_len are the total bit lengths of - * the compressed block data, excluding the tree representations. - */ - - /* Build the bit length tree for the above two trees, and get the index - * in bl_order of the last bit length code to send. - */ - max_blindex = build_bl_tree(s); - - /* Determine the best encoding. Compute the block lengths in bytes. */ - opt_lenb = s.opt_len + 3 + 7 >>> 3; - static_lenb = s.static_len + 3 + 7 >>> 3; - - // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", - // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, - // s->sym_next / 3)); - - if (static_lenb <= opt_lenb) { - opt_lenb = static_lenb; - } - } else { - // Assert(buf != (char*)0, "lost buf"); - opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ - } - - if (stored_len + 4 <= opt_lenb && buf !== -1) { - /* 4: two words for the lengths */ - - /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - * Otherwise we can't have processed more than WSIZE input bytes since - * the last block flush, because compression would have been - * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to - * transform a block into a stored block. - */ - _tr_stored_block$1(s, buf, stored_len, last); - } else if (s.strategy === Z_FIXED$1 || static_lenb === opt_lenb) { - send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3); - compress_block(s, static_ltree, static_dtree); - } else { - send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3); - send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1); - compress_block(s, s.dyn_ltree, s.dyn_dtree); - } - // Assert (s->compressed_len == s->bits_sent, "bad compressed size"); - /* The above check is made mod 2^32, for files larger than 512 MB - * and uLong implemented on 32 bits. - */ - init_block(s); - if (last) { - bi_windup(s); - } - // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, - // s->compressed_len-7*last)); - }; - - /* =========================================================================== - * Save the match info and tally the frequency counts. Return true if - * the current block must be flushed. - */ - var _tr_tally$1 = function _tr_tally(s, dist, lc) { - // deflate_state *s; - // unsigned dist; /* distance of matched string */ - // unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ - - s.pending_buf[s.sym_buf + s.sym_next++] = dist; - s.pending_buf[s.sym_buf + s.sym_next++] = dist >> 8; - s.pending_buf[s.sym_buf + s.sym_next++] = lc; - if (dist === 0) { - /* lc is the unmatched char */ - s.dyn_ltree[lc * 2] /*.Freq*/++; - } else { - s.matches++; - /* Here, lc is the match length - MIN_MATCH */ - dist--; /* dist = match distance - 1 */ - //Assert((ush)dist < (ush)MAX_DIST(s) && - // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && - // (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); - - s.dyn_ltree[(_length_code[lc] + LITERALS$1 + 1) * 2] /*.Freq*/++; - s.dyn_dtree[d_code(dist) * 2] /*.Freq*/++; - } - - return s.sym_next === s.sym_end; - }; - var _tr_init_1 = _tr_init$1; - var _tr_stored_block_1 = _tr_stored_block$1; - var _tr_flush_block_1 = _tr_flush_block$1; - var _tr_tally_1 = _tr_tally$1; - var _tr_align_1 = _tr_align$1; - var trees = { - _tr_init: _tr_init_1, - _tr_stored_block: _tr_stored_block_1, - _tr_flush_block: _tr_flush_block_1, - _tr_tally: _tr_tally_1, - _tr_align: _tr_align_1 - }; - - // Note: adler32 takes 12% for level 0 and 2% for level 6. - // It isn't worth it to make additional optimizations as in original. - // Small size is preferable. - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - var adler32 = function adler32(adler, buf, len, pos) { - var s1 = adler & 0xffff | 0, - s2 = adler >>> 16 & 0xffff | 0, - n = 0; - while (len !== 0) { - // Set limit ~ twice less than 5552, to keep - // s2 in 31-bits, because we force signed ints. - // in other case %= will fail. - n = len > 2000 ? 2000 : len; - len -= n; - do { - s1 = s1 + buf[pos++] | 0; - s2 = s2 + s1 | 0; - } while (--n); - s1 %= 65521; - s2 %= 65521; - } - return s1 | s2 << 16 | 0; - }; - var adler32_1 = adler32; - - // Note: we can't get significant speed boost here. - // So write code to minimize size - no pregenerated tables - // and array tools dependencies. - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - // Use ordinary array, since untyped makes no boost here - var makeTable = function makeTable() { - var c, - table = []; - for (var n = 0; n < 256; n++) { - c = n; - for (var k = 0; k < 8; k++) { - c = c & 1 ? 0xEDB88320 ^ c >>> 1 : c >>> 1; - } - table[n] = c; - } - return table; - }; - - // Create table on load. Just 255 signed longs. Not a problem. - var crcTable = new Uint32Array(makeTable()); - var crc32 = function crc32(crc, buf, len, pos) { - var t = crcTable; - var end = pos + len; - crc ^= -1; - for (var i = pos; i < end; i++) { - crc = crc >>> 8 ^ t[(crc ^ buf[i]) & 0xFF]; - } - return crc ^ -1; // >>> 0; - }; - - var crc32_1 = crc32; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - var messages = { - 2: 'need dictionary', - /* Z_NEED_DICT 2 */ - 1: 'stream end', - /* Z_STREAM_END 1 */ - 0: '', - /* Z_OK 0 */ - '-1': 'file error', - /* Z_ERRNO (-1) */ - '-2': 'stream error', - /* Z_STREAM_ERROR (-2) */ - '-3': 'data error', - /* Z_DATA_ERROR (-3) */ - '-4': 'insufficient memory', - /* Z_MEM_ERROR (-4) */ - '-5': 'buffer error', - /* Z_BUF_ERROR (-5) */ - '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ - }; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - var constants$1 = { - /* Allowed flush values; see deflate() and inflate() below for details */ - Z_NO_FLUSH: 0, - Z_PARTIAL_FLUSH: 1, - Z_SYNC_FLUSH: 2, - Z_FULL_FLUSH: 3, - Z_FINISH: 4, - Z_BLOCK: 5, - Z_TREES: 6, - /* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ - Z_OK: 0, - Z_STREAM_END: 1, - Z_NEED_DICT: 2, - Z_ERRNO: -1, - Z_STREAM_ERROR: -2, - Z_DATA_ERROR: -3, - Z_MEM_ERROR: -4, - Z_BUF_ERROR: -5, - //Z_VERSION_ERROR: -6, - - /* compression levels */ - Z_NO_COMPRESSION: 0, - Z_BEST_SPEED: 1, - Z_BEST_COMPRESSION: 9, - Z_DEFAULT_COMPRESSION: -1, - Z_FILTERED: 1, - Z_HUFFMAN_ONLY: 2, - Z_RLE: 3, - Z_FIXED: 4, - Z_DEFAULT_STRATEGY: 0, - /* Possible values of the data_type field (though see inflate()) */ - Z_BINARY: 0, - Z_TEXT: 1, - //Z_ASCII: 1, // = Z_TEXT (deprecated) - Z_UNKNOWN: 2, - /* The deflate compression method */ - Z_DEFLATED: 8 - //Z_NULL: null // Use -1 or null inline, depending on var type - }; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - var _tr_init = trees._tr_init, - _tr_stored_block = trees._tr_stored_block, - _tr_flush_block = trees._tr_flush_block, - _tr_tally = trees._tr_tally, - _tr_align = trees._tr_align; - - /* Public constants ==========================================================*/ - /* ===========================================================================*/ - - var Z_NO_FLUSH$1 = constants$1.Z_NO_FLUSH, - Z_PARTIAL_FLUSH = constants$1.Z_PARTIAL_FLUSH, - Z_FULL_FLUSH$1 = constants$1.Z_FULL_FLUSH, - Z_FINISH$1 = constants$1.Z_FINISH, - Z_BLOCK = constants$1.Z_BLOCK, - Z_OK$1 = constants$1.Z_OK, - Z_STREAM_END$1 = constants$1.Z_STREAM_END, - Z_STREAM_ERROR = constants$1.Z_STREAM_ERROR, - Z_DATA_ERROR = constants$1.Z_DATA_ERROR, - Z_BUF_ERROR = constants$1.Z_BUF_ERROR, - Z_DEFAULT_COMPRESSION$1 = constants$1.Z_DEFAULT_COMPRESSION, - Z_FILTERED = constants$1.Z_FILTERED, - Z_HUFFMAN_ONLY = constants$1.Z_HUFFMAN_ONLY, - Z_RLE = constants$1.Z_RLE, - Z_FIXED = constants$1.Z_FIXED, - Z_DEFAULT_STRATEGY$1 = constants$1.Z_DEFAULT_STRATEGY, - Z_UNKNOWN = constants$1.Z_UNKNOWN, - Z_DEFLATED$1 = constants$1.Z_DEFLATED; - - /*============================================================================*/ - - var MAX_MEM_LEVEL = 9; - /* Maximum value for memLevel in deflateInit2 */ - var MAX_WBITS = 15; - /* 32K LZ77 window */ - var DEF_MEM_LEVEL = 8; - var LENGTH_CODES = 29; - /* number of length codes, not counting the special END_BLOCK code */ - var LITERALS = 256; - /* number of literal bytes 0..255 */ - var L_CODES = LITERALS + 1 + LENGTH_CODES; - /* number of Literal or Length codes, including the END_BLOCK code */ - var D_CODES = 30; - /* number of distance codes */ - var BL_CODES = 19; - /* number of codes used to transfer the bit lengths */ - var HEAP_SIZE = 2 * L_CODES + 1; - /* maximum heap size */ - var MAX_BITS = 15; - /* All codes must not exceed MAX_BITS bits */ - - var MIN_MATCH = 3; - var MAX_MATCH = 258; - var MIN_LOOKAHEAD = MAX_MATCH + MIN_MATCH + 1; - var PRESET_DICT = 0x20; - var INIT_STATE = 42; /* zlib header -> BUSY_STATE */ - //#ifdef GZIP - var GZIP_STATE = 57; /* gzip header -> BUSY_STATE | EXTRA_STATE */ - //#endif - var EXTRA_STATE = 69; /* gzip extra block -> NAME_STATE */ - var NAME_STATE = 73; /* gzip file name -> COMMENT_STATE */ - var COMMENT_STATE = 91; /* gzip comment -> HCRC_STATE */ - var HCRC_STATE = 103; /* gzip header CRC -> BUSY_STATE */ - var BUSY_STATE = 113; /* deflate -> FINISH_STATE */ - var FINISH_STATE = 666; /* stream complete */ - - var BS_NEED_MORE = 1; /* block not completed, need more input or more output */ - var BS_BLOCK_DONE = 2; /* block flush performed */ - var BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */ - var BS_FINISH_DONE = 4; /* finish done, accept no more input or output */ - - var OS_CODE = 0x03; // Unix :) . Don't detect, use this default. - - var err = function err(strm, errorCode) { - strm.msg = messages[errorCode]; - return errorCode; - }; - var rank = function rank(f) { - return f * 2 - (f > 4 ? 9 : 0); - }; - var zero = function zero(buf) { - var len = buf.length; - while (--len >= 0) { - buf[len] = 0; - } - }; - - /* =========================================================================== - * Slide the hash table when sliding the window down (could be avoided with 32 - * bit values at the expense of memory usage). We slide even when level == 0 to - * keep the hash table consistent if we switch back to level > 0 later. - */ - var slide_hash = function slide_hash(s) { - var n, m; - var p; - var wsize = s.w_size; - n = s.hash_size; - p = n; - do { - m = s.head[--p]; - s.head[p] = m >= wsize ? m - wsize : 0; - } while (--n); - n = wsize; - //#ifndef FASTEST - p = n; - do { - m = s.prev[--p]; - s.prev[p] = m >= wsize ? m - wsize : 0; - /* If n is not on any hash chain, prev[n] is garbage but - * its value will never be used. - */ - } while (--n); - //#endif - }; - - /* eslint-disable new-cap */ - var HASH_ZLIB = function HASH_ZLIB(s, prev, data) { - return (prev << s.hash_shift ^ data) & s.hash_mask; - }; - // This hash causes less collisions, https://github.com/nodeca/pako/issues/135 - // But breaks binary compatibility - //let HASH_FAST = (s, prev, data) => ((prev << 8) + (prev >> 8) + (data << 4)) & s.hash_mask; - var HASH = HASH_ZLIB; - - /* ========================================================================= - * Flush as much pending output as possible. All deflate() output, except for - * some deflate_stored() output, goes through this function so some - * applications may wish to modify it to avoid allocating a large - * strm->next_out buffer and copying into it. (See also read_buf()). - */ - var flush_pending = function flush_pending(strm) { - var s = strm.state; - - //_tr_flush_bits(s); - var len = s.pending; - if (len > strm.avail_out) { - len = strm.avail_out; - } - if (len === 0) { - return; - } - strm.output.set(s.pending_buf.subarray(s.pending_out, s.pending_out + len), strm.next_out); - strm.next_out += len; - s.pending_out += len; - strm.total_out += len; - strm.avail_out -= len; - s.pending -= len; - if (s.pending === 0) { - s.pending_out = 0; - } - }; - var flush_block_only = function flush_block_only(s, last) { - _tr_flush_block(s, s.block_start >= 0 ? s.block_start : -1, s.strstart - s.block_start, last); - s.block_start = s.strstart; - flush_pending(s.strm); - }; - var put_byte = function put_byte(s, b) { - s.pending_buf[s.pending++] = b; - }; - - /* ========================================================================= - * Put a short in the pending buffer. The 16-bit value is put in MSB order. - * IN assertion: the stream state is correct and there is enough room in - * pending_buf. - */ - var putShortMSB = function putShortMSB(s, b) { - // put_byte(s, (Byte)(b >> 8)); - // put_byte(s, (Byte)(b & 0xff)); - s.pending_buf[s.pending++] = b >>> 8 & 0xff; - s.pending_buf[s.pending++] = b & 0xff; - }; - - /* =========================================================================== - * Read a new buffer from the current input stream, update the adler32 - * and total number of bytes read. All deflate() input goes through - * this function so some applications may wish to modify it to avoid - * allocating a large strm->input buffer and copying from it. - * (See also flush_pending()). - */ - var read_buf = function read_buf(strm, buf, start, size) { - var len = strm.avail_in; - if (len > size) { - len = size; - } - if (len === 0) { - return 0; - } - strm.avail_in -= len; - - // zmemcpy(buf, strm->next_in, len); - buf.set(strm.input.subarray(strm.next_in, strm.next_in + len), start); - if (strm.state.wrap === 1) { - strm.adler = adler32_1(strm.adler, buf, len, start); - } else if (strm.state.wrap === 2) { - strm.adler = crc32_1(strm.adler, buf, len, start); - } - strm.next_in += len; - strm.total_in += len; - return len; - }; - - /* =========================================================================== - * Set match_start to the longest match starting at the given string and - * return its length. Matches shorter or equal to prev_length are discarded, - * in which case the result is equal to prev_length and match_start is - * garbage. - * IN assertions: cur_match is the head of the hash chain for the current - * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 - * OUT assertion: the match length is not greater than s->lookahead. - */ - var longest_match = function longest_match(s, cur_match) { - var chain_length = s.max_chain_length; /* max hash chain length */ - var scan = s.strstart; /* current string */ - var match; /* matched string */ - var len; /* length of current match */ - var best_len = s.prev_length; /* best match length so far */ - var nice_match = s.nice_match; /* stop if match long enough */ - var limit = s.strstart > s.w_size - MIN_LOOKAHEAD ? s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0 /*NIL*/; - - var _win = s.window; // shortcut - - var wmask = s.w_mask; - var prev = s.prev; - - /* Stop when cur_match becomes <= limit. To simplify the code, - * we prevent matches with the string of window index 0. - */ - - var strend = s.strstart + MAX_MATCH; - var scan_end1 = _win[scan + best_len - 1]; - var scan_end = _win[scan + best_len]; - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - /* Do not waste too much time if we already have a good match: */ - if (s.prev_length >= s.good_match) { - chain_length >>= 2; - } - /* Do not look for matches beyond the end of the input. This is necessary - * to make deflate deterministic. - */ - if (nice_match > s.lookahead) { - nice_match = s.lookahead; - } - - // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); - - do { - // Assert(cur_match < s->strstart, "no future"); - match = cur_match; - - /* Skip to next match if the match length cannot increase - * or if the match length is less than 2. Note that the checks below - * for insufficient lookahead only occur occasionally for performance - * reasons. Therefore uninitialized memory will be accessed, and - * conditional jumps will be made that depend on those values. - * However the length of the match is limited to the lookahead, so - * the output of deflate is not affected by the uninitialized values. - */ - - if (_win[match + best_len] !== scan_end || _win[match + best_len - 1] !== scan_end1 || _win[match] !== _win[scan] || _win[++match] !== _win[scan + 1]) { - continue; - } - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2; - match++; - // Assert(*scan == *match, "match[2]?"); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - /*jshint noempty:false*/ - } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && scan < strend); - - // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - - len = MAX_MATCH - (strend - scan); - scan = strend - MAX_MATCH; - if (len > best_len) { - s.match_start = cur_match; - best_len = len; - if (len >= nice_match) { - break; - } - scan_end1 = _win[scan + best_len - 1]; - scan_end = _win[scan + best_len]; - } - } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0); - if (best_len <= s.lookahead) { - return best_len; - } - return s.lookahead; - }; - - /* =========================================================================== - * Fill the window when the lookahead becomes insufficient. - * Updates strstart and lookahead. - * - * IN assertion: lookahead < MIN_LOOKAHEAD - * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD - * At least one byte has been read, or avail_in == 0; reads are - * performed for at least two bytes (required for the zip translate_eol - * option -- not supported here). - */ - var fill_window = function fill_window(s) { - var _w_size = s.w_size; - var n, more, str; - - //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); - - do { - more = s.window_size - s.lookahead - s.strstart; - - // JS ints have 32 bit, block below not needed - /* Deal with !@#$% 64K limit: */ - //if (sizeof(int) <= 2) { - // if (more == 0 && s->strstart == 0 && s->lookahead == 0) { - // more = wsize; - // - // } else if (more == (unsigned)(-1)) { - // /* Very unlikely, but possible on 16 bit machine if - // * strstart == 0 && lookahead == 1 (input done a byte at time) - // */ - // more--; - // } - //} - - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) { - s.window.set(s.window.subarray(_w_size, _w_size + _w_size - more), 0); - s.match_start -= _w_size; - s.strstart -= _w_size; - /* we now have strstart >= MAX_DIST */ - s.block_start -= _w_size; - if (s.insert > s.strstart) { - s.insert = s.strstart; - } - slide_hash(s); - more += _w_size; - } - if (s.strm.avail_in === 0) { - break; - } - - /* If there was no sliding: - * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - * more == window_size - lookahead - strstart - * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - * => more >= window_size - 2*WSIZE + 2 - * In the BIG_MEM or MMAP case (not yet supported), - * window_size == input_size + MIN_LOOKAHEAD && - * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - * Otherwise, window_size == 2*WSIZE so more >= 2. - * If there was sliding, more >= WSIZE. So in all cases, more >= 2. - */ - //Assert(more >= 2, "more < 2"); - n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more); - s.lookahead += n; - - /* Initialize the hash value now that we have some input: */ - if (s.lookahead + s.insert >= MIN_MATCH) { - str = s.strstart - s.insert; - s.ins_h = s.window[str]; - - /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */ - s.ins_h = HASH(s, s.ins_h, s.window[str + 1]); - //#if MIN_MATCH != 3 - // Call update_hash() MIN_MATCH-3 more times - //#endif - while (s.insert) { - /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ - s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]); - s.prev[str & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = str; - str++; - s.insert--; - if (s.lookahead + s.insert < MIN_MATCH) { - break; - } - } - } - /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - * but this is not important since only literal bytes will be emitted. - */ - } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0); - - /* If the WIN_INIT bytes after the end of the current data have never been - * written, then zero those bytes in order to avoid memory check reports of - * the use of uninitialized (or uninitialised as Julian writes) bytes by - * the longest match routines. Update the high water mark for the next - * time through here. WIN_INIT is set to MAX_MATCH since the longest match - * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. - */ - // if (s.high_water < s.window_size) { - // const curr = s.strstart + s.lookahead; - // let init = 0; - // - // if (s.high_water < curr) { - // /* Previous high water mark below current data -- zero WIN_INIT - // * bytes or up to end of window, whichever is less. - // */ - // init = s.window_size - curr; - // if (init > WIN_INIT) - // init = WIN_INIT; - // zmemzero(s->window + curr, (unsigned)init); - // s->high_water = curr + init; - // } - // else if (s->high_water < (ulg)curr + WIN_INIT) { - // /* High water mark at or above current data, but below current data - // * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up - // * to end of window, whichever is less. - // */ - // init = (ulg)curr + WIN_INIT - s->high_water; - // if (init > s->window_size - s->high_water) - // init = s->window_size - s->high_water; - // zmemzero(s->window + s->high_water, (unsigned)init); - // s->high_water += init; - // } - // } - // - // Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, - // "not enough room for search"); - }; - - /* =========================================================================== - * Copy without compression as much as possible from the input stream, return - * the current block state. - * - * In case deflateParams() is used to later switch to a non-zero compression - * level, s->matches (otherwise unused when storing) keeps track of the number - * of hash table slides to perform. If s->matches is 1, then one hash table - * slide will be done when switching. If s->matches is 2, the maximum value - * allowed here, then the hash table will be cleared, since two or more slides - * is the same as a clear. - * - * deflate_stored() is written to minimize the number of times an input byte is - * copied. It is most efficient with large input and output buffers, which - * maximizes the opportunites to have a single copy from next_in to next_out. - */ - var deflate_stored = function deflate_stored(s, flush) { - /* Smallest worthy block size when not flushing or finishing. By default - * this is 32K. This can be as small as 507 bytes for memLevel == 1. For - * large input and output buffers, the stored block size will be larger. - */ - var min_block = s.pending_buf_size - 5 > s.w_size ? s.w_size : s.pending_buf_size - 5; - - /* Copy as many min_block or larger stored blocks directly to next_out as - * possible. If flushing, copy the remaining available input to next_out as - * stored blocks, if there is enough space. - */ - var len, - left, - have, - last = 0; - var used = s.strm.avail_in; - do { - /* Set len to the maximum size block that we can copy directly with the - * available input data and output space. Set left to how much of that - * would be copied from what's left in the window. - */ - len = 65535 /* MAX_STORED */; /* maximum deflate stored block length */ - have = s.bi_valid + 42 >> 3; /* number of header bytes */ - if (s.strm.avail_out < have) { - /* need room for header */ - break; - } - /* maximum stored block length that will fit in avail_out: */ - have = s.strm.avail_out - have; - left = s.strstart - s.block_start; /* bytes left in window */ - if (len > left + s.strm.avail_in) { - len = left + s.strm.avail_in; /* limit len to the input */ - } - - if (len > have) { - len = have; /* limit len to the output */ - } - - /* If the stored block would be less than min_block in length, or if - * unable to copy all of the available input when flushing, then try - * copying to the window and the pending buffer instead. Also don't - * write an empty block when flushing -- deflate() does that. - */ - if (len < min_block && (len === 0 && flush !== Z_FINISH$1 || flush === Z_NO_FLUSH$1 || len !== left + s.strm.avail_in)) { - break; - } - - /* Make a dummy stored block in pending to get the header bytes, - * including any pending bits. This also updates the debugging counts. - */ - last = flush === Z_FINISH$1 && len === left + s.strm.avail_in ? 1 : 0; - _tr_stored_block(s, 0, 0, last); - - /* Replace the lengths in the dummy stored block with len. */ - s.pending_buf[s.pending - 4] = len; - s.pending_buf[s.pending - 3] = len >> 8; - s.pending_buf[s.pending - 2] = ~len; - s.pending_buf[s.pending - 1] = ~len >> 8; - - /* Write the stored block header bytes. */ - flush_pending(s.strm); - - //#ifdef ZLIB_DEBUG - // /* Update debugging counts for the data about to be copied. */ - // s->compressed_len += len << 3; - // s->bits_sent += len << 3; - //#endif - - /* Copy uncompressed bytes from the window to next_out. */ - if (left) { - if (left > len) { - left = len; - } - //zmemcpy(s->strm->next_out, s->window + s->block_start, left); - s.strm.output.set(s.window.subarray(s.block_start, s.block_start + left), s.strm.next_out); - s.strm.next_out += left; - s.strm.avail_out -= left; - s.strm.total_out += left; - s.block_start += left; - len -= left; - } - - /* Copy uncompressed bytes directly from next_in to next_out, updating - * the check value. - */ - if (len) { - read_buf(s.strm, s.strm.output, s.strm.next_out, len); - s.strm.next_out += len; - s.strm.avail_out -= len; - s.strm.total_out += len; - } - } while (last === 0); - - /* Update the sliding window with the last s->w_size bytes of the copied - * data, or append all of the copied data to the existing window if less - * than s->w_size bytes were copied. Also update the number of bytes to - * insert in the hash tables, in the event that deflateParams() switches to - * a non-zero compression level. - */ - used -= s.strm.avail_in; /* number of input bytes directly copied */ - if (used) { - /* If any input was used, then no unused input remains in the window, - * therefore s->block_start == s->strstart. - */ - if (used >= s.w_size) { - /* supplant the previous history */ - s.matches = 2; /* clear hash */ - //zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size); - s.window.set(s.strm.input.subarray(s.strm.next_in - s.w_size, s.strm.next_in), 0); - s.strstart = s.w_size; - s.insert = s.strstart; - } else { - if (s.window_size - s.strstart <= used) { - /* Slide the window down. */ - s.strstart -= s.w_size; - //zmemcpy(s->window, s->window + s->w_size, s->strstart); - s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0); - if (s.matches < 2) { - s.matches++; /* add a pending slide_hash() */ - } - - if (s.insert > s.strstart) { - s.insert = s.strstart; - } - } - //zmemcpy(s->window + s->strstart, s->strm->next_in - used, used); - s.window.set(s.strm.input.subarray(s.strm.next_in - used, s.strm.next_in), s.strstart); - s.strstart += used; - s.insert += used > s.w_size - s.insert ? s.w_size - s.insert : used; - } - s.block_start = s.strstart; - } - if (s.high_water < s.strstart) { - s.high_water = s.strstart; - } - - /* If the last block was written to next_out, then done. */ - if (last) { - return BS_FINISH_DONE; - } - - /* If flushing and all input has been consumed, then done. */ - if (flush !== Z_NO_FLUSH$1 && flush !== Z_FINISH$1 && s.strm.avail_in === 0 && s.strstart === s.block_start) { - return BS_BLOCK_DONE; - } - - /* Fill the window with any remaining input. */ - have = s.window_size - s.strstart; - if (s.strm.avail_in > have && s.block_start >= s.w_size) { - /* Slide the window down. */ - s.block_start -= s.w_size; - s.strstart -= s.w_size; - //zmemcpy(s->window, s->window + s->w_size, s->strstart); - s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0); - if (s.matches < 2) { - s.matches++; /* add a pending slide_hash() */ - } - - have += s.w_size; /* more space now */ - if (s.insert > s.strstart) { - s.insert = s.strstart; - } - } - if (have > s.strm.avail_in) { - have = s.strm.avail_in; - } - if (have) { - read_buf(s.strm, s.window, s.strstart, have); - s.strstart += have; - s.insert += have > s.w_size - s.insert ? s.w_size - s.insert : have; - } - if (s.high_water < s.strstart) { - s.high_water = s.strstart; - } - - /* There was not enough avail_out to write a complete worthy or flushed - * stored block to next_out. Write a stored block to pending instead, if we - * have enough input for a worthy block, or if flushing and there is enough - * room for the remaining input as a stored block in the pending buffer. - */ - have = s.bi_valid + 42 >> 3; /* number of header bytes */ - /* maximum stored block length that will fit in pending: */ - have = s.pending_buf_size - have > 65535 /* MAX_STORED */ ? 65535 /* MAX_STORED */ : s.pending_buf_size - have; - min_block = have > s.w_size ? s.w_size : have; - left = s.strstart - s.block_start; - if (left >= min_block || (left || flush === Z_FINISH$1) && flush !== Z_NO_FLUSH$1 && s.strm.avail_in === 0 && left <= have) { - len = left > have ? have : left; - last = flush === Z_FINISH$1 && s.strm.avail_in === 0 && len === left ? 1 : 0; - _tr_stored_block(s, s.block_start, len, last); - s.block_start += len; - flush_pending(s.strm); - } - - /* We've done all we can with the available input and output. */ - return last ? BS_FINISH_STARTED : BS_NEED_MORE; - }; - - /* =========================================================================== - * Compress as much as possible from the input stream, return the current - * block state. - * This function does not perform lazy evaluation of matches and inserts - * new strings in the dictionary only for unmatched strings or for short - * matches. It is used only for the fast compression options. - */ - var deflate_fast = function deflate_fast(s, flush) { - var hash_head; /* head of the hash chain */ - var bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s.lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$1) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { - break; /* flush the current block */ - } - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = 0 /*NIL*/; - if (s.lookahead >= MIN_MATCH) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]); - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - - /* Find the longest match, discarding those <= prev_length. - * At this point we have always match_length < MIN_MATCH - */ - if (hash_head !== 0 /*NIL*/ && s.strstart - hash_head <= s.w_size - MIN_LOOKAHEAD) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s.match_length = longest_match(s, hash_head); - /* longest_match() sets match_start */ - } - - if (s.match_length >= MIN_MATCH) { - // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only - - /*** _tr_tally_dist(s, s.strstart - s.match_start, - s.match_length - MIN_MATCH, bflush); ***/ - bflush = _tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH); - s.lookahead -= s.match_length; - - /* Insert new strings in the hash table only if the match length - * is not too large. This saves time but degrades compression. - */ - if (s.match_length <= s.max_lazy_match /*max_insert_length*/ && s.lookahead >= MIN_MATCH) { - s.match_length--; /* string at strstart already in table */ - do { - s.strstart++; - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]); - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - /* strstart never exceeds WSIZE-MAX_MATCH, so there are - * always MIN_MATCH bytes ahead. - */ - } while (--s.match_length !== 0); - s.strstart++; - } else { - s.strstart += s.match_length; - s.match_length = 0; - s.ins_h = s.window[s.strstart]; - /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + 1]); - - //#if MIN_MATCH != 3 - // Call UPDATE_HASH() MIN_MATCH-3 more times - //#endif - /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not - * matter since it will be recomputed at next deflate call. - */ - } - } else { - /* No match, output a literal byte */ - //Tracevv((stderr,"%c", s.window[s.strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart]); - s.lookahead--; - s.strstart++; - } - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - - s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1; - if (flush === Z_FINISH$1) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.sym_next) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - - return BS_BLOCK_DONE; - }; - - /* =========================================================================== - * Same as above, but achieves better compression. We use a lazy - * evaluation for matches: a match is finally adopted only if there is - * no better match at the next window position. - */ - var deflate_slow = function deflate_slow(s, flush) { - var hash_head; /* head of hash chain */ - var bflush; /* set if current block must be flushed */ - - var max_insert; - - /* Process the input block. */ - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s.lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$1) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { - break; - } /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = 0 /*NIL*/; - if (s.lookahead >= MIN_MATCH) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]); - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - - /* Find the longest match, discarding those <= prev_length. - */ - s.prev_length = s.match_length; - s.prev_match = s.match_start; - s.match_length = MIN_MATCH - 1; - if (hash_head !== 0 /*NIL*/ && s.prev_length < s.max_lazy_match && s.strstart - hash_head <= s.w_size - MIN_LOOKAHEAD /*MAX_DIST(s)*/) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s.match_length = longest_match(s, hash_head); - /* longest_match() sets match_start */ - - if (s.match_length <= 5 && (s.strategy === Z_FILTERED || s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096 /*TOO_FAR*/)) { - /* If prev_match is also MIN_MATCH, match_start is garbage - * but we will ignore the current match anyway. - */ - s.match_length = MIN_MATCH - 1; - } - } - /* If there was a match at the previous step and the current - * match is not better, output the previous match: - */ - if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) { - max_insert = s.strstart + s.lookahead - MIN_MATCH; - /* Do not insert strings in hash table beyond this. */ - - //check_match(s, s.strstart-1, s.prev_match, s.prev_length); - - /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match, - s.prev_length - MIN_MATCH, bflush);***/ - bflush = _tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH); - /* Insert in hash table all strings up to the end of the match. - * strstart-1 and strstart are already inserted. If there is not - * enough lookahead, the last two strings are not inserted in - * the hash table. - */ - s.lookahead -= s.prev_length - 1; - s.prev_length -= 2; - do { - if (++s.strstart <= max_insert) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]); - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - } while (--s.prev_length !== 0); - s.match_available = 0; - s.match_length = MIN_MATCH - 1; - s.strstart++; - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } else if (s.match_available) { - /* If there was no match at the previous position, output a - * single literal. If there was a match but the current match - * is longer, truncate the previous match to a single literal. - */ - //Tracevv((stderr,"%c", s->window[s->strstart-1])); - /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart - 1]); - if (bflush) { - /*** FLUSH_BLOCK_ONLY(s, 0) ***/ - flush_block_only(s, false); - /***/ - } - - s.strstart++; - s.lookahead--; - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - } else { - /* There is no previous match to compare with, wait for - * the next step to decide. - */ - s.match_available = 1; - s.strstart++; - s.lookahead--; - } - } - //Assert (flush != Z_NO_FLUSH, "no flush?"); - if (s.match_available) { - //Tracevv((stderr,"%c", s->window[s->strstart-1])); - /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart - 1]); - s.match_available = 0; - } - s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1; - if (flush === Z_FINISH$1) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.sym_next) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - - return BS_BLOCK_DONE; - }; - - /* =========================================================================== - * For Z_RLE, simply look for runs of bytes, generate matches only of distance - * one. Do not maintain a hash table. (It will be regenerated if this run of - * deflate switches away from Z_RLE.) - */ - var deflate_rle = function deflate_rle(s, flush) { - var bflush; /* set if current block must be flushed */ - var prev; /* byte at distance one to match */ - var scan, strend; /* scan goes up to strend for length of run */ - - var _win = s.window; - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the longest run, plus one for the unrolled loop. - */ - if (s.lookahead <= MAX_MATCH) { - fill_window(s); - if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH$1) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { - break; - } /* flush the current block */ - } - - /* See how many times the previous byte repeats */ - s.match_length = 0; - if (s.lookahead >= MIN_MATCH && s.strstart > 0) { - scan = s.strstart - 1; - prev = _win[scan]; - if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) { - strend = s.strstart + MAX_MATCH; - do { - /*jshint noempty:false*/ - } while (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && scan < strend); - s.match_length = MAX_MATCH - (strend - scan); - if (s.match_length > s.lookahead) { - s.match_length = s.lookahead; - } - } - //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); - } - - /* Emit match if have run of MIN_MATCH or longer, else emit literal */ - if (s.match_length >= MIN_MATCH) { - //check_match(s, s.strstart, s.strstart - 1, s.match_length); - - /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/ - bflush = _tr_tally(s, 1, s.match_length - MIN_MATCH); - s.lookahead -= s.match_length; - s.strstart += s.match_length; - s.match_length = 0; - } else { - /* No match, output a literal byte */ - //Tracevv((stderr,"%c", s->window[s->strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart]); - s.lookahead--; - s.strstart++; - } - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - - s.insert = 0; - if (flush === Z_FINISH$1) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.sym_next) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - - return BS_BLOCK_DONE; - }; - - /* =========================================================================== - * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. - * (It will be regenerated if this run of deflate switches away from Huffman.) - */ - var deflate_huff = function deflate_huff(s, flush) { - var bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we have a literal to write. */ - if (s.lookahead === 0) { - fill_window(s); - if (s.lookahead === 0) { - if (flush === Z_NO_FLUSH$1) { - return BS_NEED_MORE; - } - break; /* flush the current block */ - } - } - - /* Output a literal byte */ - s.match_length = 0; - //Tracevv((stderr,"%c", s->window[s->strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart]); - s.lookahead--; - s.strstart++; - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - - s.insert = 0; - if (flush === Z_FINISH$1) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.sym_next) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - - return BS_BLOCK_DONE; - }; - - /* Values for max_lazy_match, good_match and max_chain_length, depending on - * the desired pack level (0..9). The values given below have been tuned to - * exclude worst case performance for pathological files. Better values may be - * found for specific files. - */ - function Config(good_length, max_lazy, nice_length, max_chain, func) { - this.good_length = good_length; - this.max_lazy = max_lazy; - this.nice_length = nice_length; - this.max_chain = max_chain; - this.func = func; - } - var configuration_table = [/* good lazy nice chain */ - new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */ - new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */ - new Config(4, 5, 16, 8, deflate_fast), /* 2 */ - new Config(4, 6, 32, 32, deflate_fast), /* 3 */ - - new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */ - new Config(8, 16, 32, 32, deflate_slow), /* 5 */ - new Config(8, 16, 128, 128, deflate_slow), /* 6 */ - new Config(8, 32, 128, 256, deflate_slow), /* 7 */ - new Config(32, 128, 258, 1024, deflate_slow), /* 8 */ - new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */]; - - /* =========================================================================== - * Initialize the "longest match" routines for a new zlib stream - */ - var lm_init = function lm_init(s) { - s.window_size = 2 * s.w_size; - - /*** CLEAR_HASH(s); ***/ - zero(s.head); // Fill with NIL (= 0); - - /* Set the default configuration parameters: - */ - s.max_lazy_match = configuration_table[s.level].max_lazy; - s.good_match = configuration_table[s.level].good_length; - s.nice_match = configuration_table[s.level].nice_length; - s.max_chain_length = configuration_table[s.level].max_chain; - s.strstart = 0; - s.block_start = 0; - s.lookahead = 0; - s.insert = 0; - s.match_length = s.prev_length = MIN_MATCH - 1; - s.match_available = 0; - s.ins_h = 0; - }; - function DeflateState() { - this.strm = null; /* pointer back to this zlib stream */ - this.status = 0; /* as the name implies */ - this.pending_buf = null; /* output still pending */ - this.pending_buf_size = 0; /* size of pending_buf */ - this.pending_out = 0; /* next pending byte to output to the stream */ - this.pending = 0; /* nb of bytes in the pending buffer */ - this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ - this.gzhead = null; /* gzip header information to write */ - this.gzindex = 0; /* where in extra, name, or comment */ - this.method = Z_DEFLATED$1; /* can only be DEFLATED */ - this.last_flush = -1; /* value of flush param for previous deflate call */ - - this.w_size = 0; /* LZ77 window size (32K by default) */ - this.w_bits = 0; /* log2(w_size) (8..16) */ - this.w_mask = 0; /* w_size - 1 */ - - this.window = null; - /* Sliding window. Input bytes are read into the second half of the window, - * and move to the first half later to keep a dictionary of at least wSize - * bytes. With this organization, matches are limited to a distance of - * wSize-MAX_MATCH bytes, but this ensures that IO is always - * performed with a length multiple of the block size. - */ - - this.window_size = 0; - /* Actual size of window: 2*wSize, except when the user input buffer - * is directly used as sliding window. - */ - - this.prev = null; - /* Link to older string with same hash index. To limit the size of this - * array to 64K, this link is maintained only for the last 32K strings. - * An index in this array is thus a window index modulo 32K. - */ - - this.head = null; /* Heads of the hash chains or NIL. */ - - this.ins_h = 0; /* hash index of string to be inserted */ - this.hash_size = 0; /* number of elements in hash table */ - this.hash_bits = 0; /* log2(hash_size) */ - this.hash_mask = 0; /* hash_size-1 */ - - this.hash_shift = 0; - /* Number of bits by which ins_h must be shifted at each input - * step. It must be such that after MIN_MATCH steps, the oldest - * byte no longer takes part in the hash key, that is: - * hash_shift * MIN_MATCH >= hash_bits - */ - - this.block_start = 0; - /* Window position at the beginning of the current output block. Gets - * negative when the window is moved backwards. - */ - - this.match_length = 0; /* length of best match */ - this.prev_match = 0; /* previous match */ - this.match_available = 0; /* set if previous match exists */ - this.strstart = 0; /* start of string to insert */ - this.match_start = 0; /* start of matching string */ - this.lookahead = 0; /* number of valid bytes ahead in window */ - - this.prev_length = 0; - /* Length of the best match at previous step. Matches not greater than this - * are discarded. This is used in the lazy match evaluation. - */ - - this.max_chain_length = 0; - /* To speed up deflation, hash chains are never searched beyond this - * length. A higher limit improves compression ratio but degrades the - * speed. - */ - - this.max_lazy_match = 0; - /* Attempt to find a better match only when the current match is strictly - * smaller than this value. This mechanism is used only for compression - * levels >= 4. - */ - // That's alias to max_lazy_match, don't use directly - //this.max_insert_length = 0; - /* Insert new strings in the hash table only if the match length is not - * greater than this length. This saves time but degrades compression. - * max_insert_length is used only for compression levels <= 3. - */ - - this.level = 0; /* compression level (1..9) */ - this.strategy = 0; /* favor or force Huffman coding*/ - - this.good_match = 0; - /* Use a faster search when the previous match is longer than this */ - - this.nice_match = 0; /* Stop searching when current match exceeds this */ - - /* used by trees.c: */ - - /* Didn't use ct_data typedef below to suppress compiler warning */ - - // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ - // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ - // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ - - // Use flat array of DOUBLE size, with interleaved fata, - // because JS does not support effective - this.dyn_ltree = new Uint16Array(HEAP_SIZE * 2); - this.dyn_dtree = new Uint16Array((2 * D_CODES + 1) * 2); - this.bl_tree = new Uint16Array((2 * BL_CODES + 1) * 2); - zero(this.dyn_ltree); - zero(this.dyn_dtree); - zero(this.bl_tree); - this.l_desc = null; /* desc. for literal tree */ - this.d_desc = null; /* desc. for distance tree */ - this.bl_desc = null; /* desc. for bit length tree */ - - //ush bl_count[MAX_BITS+1]; - this.bl_count = new Uint16Array(MAX_BITS + 1); - /* number of codes at each bit length for an optimal tree */ - - //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ - this.heap = new Uint16Array(2 * L_CODES + 1); /* heap used to build the Huffman trees */ - zero(this.heap); - this.heap_len = 0; /* number of elements in the heap */ - this.heap_max = 0; /* element of largest frequency */ - /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. - * The same heap array is used to build all trees. - */ - - this.depth = new Uint16Array(2 * L_CODES + 1); //uch depth[2*L_CODES+1]; - zero(this.depth); - /* Depth of each subtree used as tie breaker for trees of equal frequency - */ - - this.sym_buf = 0; /* buffer for distances and literals/lengths */ - - this.lit_bufsize = 0; - /* Size of match buffer for literals/lengths. There are 4 reasons for - * limiting lit_bufsize to 64K: - * - frequencies can be kept in 16 bit counters - * - if compression is not successful for the first block, all input - * data is still in the window so we can still emit a stored block even - * when input comes from standard input. (This can also be done for - * all blocks if lit_bufsize is not greater than 32K.) - * - if compression is not successful for a file smaller than 64K, we can - * even emit a stored file instead of a stored block (saving 5 bytes). - * This is applicable only for zip (not gzip or zlib). - * - creating new Huffman trees less frequently may not provide fast - * adaptation to changes in the input data statistics. (Take for - * example a binary file with poorly compressible code followed by - * a highly compressible string table.) Smaller buffer sizes give - * fast adaptation but have of course the overhead of transmitting - * trees more frequently. - * - I can't count above 4 - */ - - this.sym_next = 0; /* running index in sym_buf */ - this.sym_end = 0; /* symbol table full when sym_next reaches this */ - - this.opt_len = 0; /* bit length of current block with optimal trees */ - this.static_len = 0; /* bit length of current block with static trees */ - this.matches = 0; /* number of string matches in current block */ - this.insert = 0; /* bytes at end of window left to insert */ - - this.bi_buf = 0; - /* Output buffer. bits are inserted starting at the bottom (least - * significant bits). - */ - this.bi_valid = 0; - /* Number of valid bits in bi_buf. All bits above the last valid bit - * are always zero. - */ - - // Used for window memory init. We safely ignore it for JS. That makes - // sense only for pointers and memory check tools. - //this.high_water = 0; - /* High water mark offset in window for initialized bytes -- bytes above - * this are set to zero in order to avoid memory check warnings when - * longest match routines access bytes past the input. This is then - * updated to the new high water mark. - */ - } - - /* ========================================================================= - * Check for a valid deflate stream state. Return 0 if ok, 1 if not. - */ - var deflateStateCheck = function deflateStateCheck(strm) { - if (!strm) { - return 1; - } - var s = strm.state; - if (!s || s.strm !== strm || s.status !== INIT_STATE && - //#ifdef GZIP - s.status !== GZIP_STATE && - //#endif - s.status !== EXTRA_STATE && s.status !== NAME_STATE && s.status !== COMMENT_STATE && s.status !== HCRC_STATE && s.status !== BUSY_STATE && s.status !== FINISH_STATE) { - return 1; - } - return 0; - }; - var deflateResetKeep = function deflateResetKeep(strm) { - if (deflateStateCheck(strm)) { - return err(strm, Z_STREAM_ERROR); - } - strm.total_in = strm.total_out = 0; - strm.data_type = Z_UNKNOWN; - var s = strm.state; - s.pending = 0; - s.pending_out = 0; - if (s.wrap < 0) { - s.wrap = -s.wrap; - /* was made negative by deflate(..., Z_FINISH); */ - } - - s.status = - //#ifdef GZIP - s.wrap === 2 ? GZIP_STATE : - //#endif - s.wrap ? INIT_STATE : BUSY_STATE; - strm.adler = s.wrap === 2 ? 0 // crc32(0, Z_NULL, 0) - : 1; // adler32(0, Z_NULL, 0) - s.last_flush = -2; - _tr_init(s); - return Z_OK$1; - }; - var deflateReset = function deflateReset(strm) { - var ret = deflateResetKeep(strm); - if (ret === Z_OK$1) { - lm_init(strm.state); - } - return ret; - }; - var deflateSetHeader = function deflateSetHeader(strm, head) { - if (deflateStateCheck(strm) || strm.state.wrap !== 2) { - return Z_STREAM_ERROR; - } - strm.state.gzhead = head; - return Z_OK$1; - }; - var deflateInit2 = function deflateInit2(strm, level, method, windowBits, memLevel, strategy) { - if (!strm) { - // === Z_NULL - return Z_STREAM_ERROR; - } - var wrap = 1; - if (level === Z_DEFAULT_COMPRESSION$1) { - level = 6; - } - if (windowBits < 0) { - /* suppress zlib wrapper */ - wrap = 0; - windowBits = -windowBits; - } else if (windowBits > 15) { - wrap = 2; /* write gzip wrapper instead */ - windowBits -= 16; - } - if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED$1 || windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED || windowBits === 8 && wrap !== 1) { - return err(strm, Z_STREAM_ERROR); - } - if (windowBits === 8) { - windowBits = 9; - } - /* until 256-byte window bug fixed */ - - var s = new DeflateState(); - strm.state = s; - s.strm = strm; - s.status = INIT_STATE; /* to pass state test in deflateReset() */ - - s.wrap = wrap; - s.gzhead = null; - s.w_bits = windowBits; - s.w_size = 1 << s.w_bits; - s.w_mask = s.w_size - 1; - s.hash_bits = memLevel + 7; - s.hash_size = 1 << s.hash_bits; - s.hash_mask = s.hash_size - 1; - s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH); - s.window = new Uint8Array(s.w_size * 2); - s.head = new Uint16Array(s.hash_size); - s.prev = new Uint16Array(s.w_size); - - // Don't need mem init magic for JS. - //s.high_water = 0; /* nothing written to s->window yet */ - - s.lit_bufsize = 1 << memLevel + 6; /* 16K elements by default */ - - /* We overlay pending_buf and sym_buf. This works since the average size - * for length/distance pairs over any compressed block is assured to be 31 - * bits or less. - * - * Analysis: The longest fixed codes are a length code of 8 bits plus 5 - * extra bits, for lengths 131 to 257. The longest fixed distance codes are - * 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest - * possible fixed-codes length/distance pair is then 31 bits total. - * - * sym_buf starts one-fourth of the way into pending_buf. So there are - * three bytes in sym_buf for every four bytes in pending_buf. Each symbol - * in sym_buf is three bytes -- two for the distance and one for the - * literal/length. As each symbol is consumed, the pointer to the next - * sym_buf value to read moves forward three bytes. From that symbol, up to - * 31 bits are written to pending_buf. The closest the written pending_buf - * bits gets to the next sym_buf symbol to read is just before the last - * code is written. At that time, 31*(n-2) bits have been written, just - * after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at - * 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1 - * symbols are written.) The closest the writing gets to what is unread is - * then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and - * can range from 128 to 32768. - * - * Therefore, at a minimum, there are 142 bits of space between what is - * written and what is read in the overlain buffers, so the symbols cannot - * be overwritten by the compressed data. That space is actually 139 bits, - * due to the three-bit fixed-code block header. - * - * That covers the case where either Z_FIXED is specified, forcing fixed - * codes, or when the use of fixed codes is chosen, because that choice - * results in a smaller compressed block than dynamic codes. That latter - * condition then assures that the above analysis also covers all dynamic - * blocks. A dynamic-code block will only be chosen to be emitted if it has - * fewer bits than a fixed-code block would for the same set of symbols. - * Therefore its average symbol length is assured to be less than 31. So - * the compressed data for a dynamic block also cannot overwrite the - * symbols from which it is being constructed. - */ - - s.pending_buf_size = s.lit_bufsize * 4; - s.pending_buf = new Uint8Array(s.pending_buf_size); - - // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`) - //s->sym_buf = s->pending_buf + s->lit_bufsize; - s.sym_buf = s.lit_bufsize; - - //s->sym_end = (s->lit_bufsize - 1) * 3; - s.sym_end = (s.lit_bufsize - 1) * 3; - /* We avoid equality with lit_bufsize*3 because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ - - s.level = level; - s.strategy = strategy; - s.method = method; - return deflateReset(strm); - }; - var deflateInit = function deflateInit(strm, level) { - return deflateInit2(strm, level, Z_DEFLATED$1, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY$1); - }; - - /* ========================================================================= */ - var deflate$1 = function deflate(strm, flush) { - if (deflateStateCheck(strm) || flush > Z_BLOCK || flush < 0) { - return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR; - } - var s = strm.state; - if (!strm.output || strm.avail_in !== 0 && !strm.input || s.status === FINISH_STATE && flush !== Z_FINISH$1) { - return err(strm, strm.avail_out === 0 ? Z_BUF_ERROR : Z_STREAM_ERROR); - } - var old_flush = s.last_flush; - s.last_flush = flush; - - /* Flush as much pending output as possible */ - if (s.pending !== 0) { - flush_pending(strm); - if (strm.avail_out === 0) { - /* Since avail_out is 0, deflate will be called again with - * more output space, but possibly with both pending and - * avail_in equal to zero. There won't be anything to do, - * but this is not an error situation so make sure we - * return OK instead of BUF_ERROR at next call of deflate: - */ - s.last_flush = -1; - return Z_OK$1; - } - - /* Make sure there is something to do and avoid duplicate consecutive - * flushes. For repeated and useless calls with Z_FINISH, we keep - * returning Z_STREAM_END instead of Z_BUF_ERROR. - */ - } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) && flush !== Z_FINISH$1) { - return err(strm, Z_BUF_ERROR); - } - - /* User must not provide more input after the first FINISH: */ - if (s.status === FINISH_STATE && strm.avail_in !== 0) { - return err(strm, Z_BUF_ERROR); - } - - /* Write the header */ - if (s.status === INIT_STATE && s.wrap === 0) { - s.status = BUSY_STATE; - } - if (s.status === INIT_STATE) { - /* zlib header */ - var header = Z_DEFLATED$1 + (s.w_bits - 8 << 4) << 8; - var level_flags = -1; - if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) { - level_flags = 0; - } else if (s.level < 6) { - level_flags = 1; - } else if (s.level === 6) { - level_flags = 2; - } else { - level_flags = 3; - } - header |= level_flags << 6; - if (s.strstart !== 0) { - header |= PRESET_DICT; - } - header += 31 - header % 31; - putShortMSB(s, header); - - /* Save the adler32 of the preset dictionary: */ - if (s.strstart !== 0) { - putShortMSB(s, strm.adler >>> 16); - putShortMSB(s, strm.adler & 0xffff); - } - strm.adler = 1; // adler32(0L, Z_NULL, 0); - s.status = BUSY_STATE; - - /* Compression must start with an empty pending buffer */ - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$1; - } - } - //#ifdef GZIP - if (s.status === GZIP_STATE) { - /* gzip header */ - strm.adler = 0; //crc32(0L, Z_NULL, 0); - put_byte(s, 31); - put_byte(s, 139); - put_byte(s, 8); - if (!s.gzhead) { - // s->gzhead == Z_NULL - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, s.level === 9 ? 2 : s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? 4 : 0); - put_byte(s, OS_CODE); - s.status = BUSY_STATE; - - /* Compression must start with an empty pending buffer */ - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$1; - } - } else { - put_byte(s, (s.gzhead.text ? 1 : 0) + (s.gzhead.hcrc ? 2 : 0) + (!s.gzhead.extra ? 0 : 4) + (!s.gzhead.name ? 0 : 8) + (!s.gzhead.comment ? 0 : 16)); - put_byte(s, s.gzhead.time & 0xff); - put_byte(s, s.gzhead.time >> 8 & 0xff); - put_byte(s, s.gzhead.time >> 16 & 0xff); - put_byte(s, s.gzhead.time >> 24 & 0xff); - put_byte(s, s.level === 9 ? 2 : s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? 4 : 0); - put_byte(s, s.gzhead.os & 0xff); - if (s.gzhead.extra && s.gzhead.extra.length) { - put_byte(s, s.gzhead.extra.length & 0xff); - put_byte(s, s.gzhead.extra.length >> 8 & 0xff); - } - if (s.gzhead.hcrc) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending, 0); - } - s.gzindex = 0; - s.status = EXTRA_STATE; - } - } - if (s.status === EXTRA_STATE) { - if (s.gzhead.extra /* != Z_NULL*/) { - var beg = s.pending; /* start of bytes to update crc */ - var left = (s.gzhead.extra.length & 0xffff) - s.gzindex; - while (s.pending + left > s.pending_buf_size) { - var copy = s.pending_buf_size - s.pending; - // zmemcpy(s.pending_buf + s.pending, - // s.gzhead.extra + s.gzindex, copy); - s.pending_buf.set(s.gzhead.extra.subarray(s.gzindex, s.gzindex + copy), s.pending); - s.pending = s.pending_buf_size; - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - //---// - s.gzindex += copy; - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$1; - } - beg = 0; - left -= copy; - } - // JS specific: s.gzhead.extra may be TypedArray or Array for backward compatibility - // TypedArray.slice and TypedArray.from don't exist in IE10-IE11 - var gzhead_extra = new Uint8Array(s.gzhead.extra); - // zmemcpy(s->pending_buf + s->pending, - // s->gzhead->extra + s->gzindex, left); - s.pending_buf.set(gzhead_extra.subarray(s.gzindex, s.gzindex + left), s.pending); - s.pending += left; - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - //---// - s.gzindex = 0; - } - s.status = NAME_STATE; - } - if (s.status === NAME_STATE) { - if (s.gzhead.name /* != Z_NULL*/) { - var _beg = s.pending; /* start of bytes to update crc */ - var val; - do { - if (s.pending === s.pending_buf_size) { - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > _beg) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - _beg, _beg); - } - //---// - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$1; - } - _beg = 0; - } - // JS specific: little magic to add zero terminator to end of string - if (s.gzindex < s.gzhead.name.length) { - val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff; - } else { - val = 0; - } - put_byte(s, val); - } while (val !== 0); - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > _beg) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - _beg, _beg); - } - //---// - s.gzindex = 0; - } - s.status = COMMENT_STATE; - } - if (s.status === COMMENT_STATE) { - if (s.gzhead.comment /* != Z_NULL*/) { - var _beg2 = s.pending; /* start of bytes to update crc */ - var _val; - do { - if (s.pending === s.pending_buf_size) { - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > _beg2) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - _beg2, _beg2); - } - //---// - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$1; - } - _beg2 = 0; - } - // JS specific: little magic to add zero terminator to end of string - if (s.gzindex < s.gzhead.comment.length) { - _val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff; - } else { - _val = 0; - } - put_byte(s, _val); - } while (_val !== 0); - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > _beg2) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - _beg2, _beg2); - } - //---// - } - - s.status = HCRC_STATE; - } - if (s.status === HCRC_STATE) { - if (s.gzhead.hcrc) { - if (s.pending + 2 > s.pending_buf_size) { - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$1; - } - } - put_byte(s, strm.adler & 0xff); - put_byte(s, strm.adler >> 8 & 0xff); - strm.adler = 0; //crc32(0L, Z_NULL, 0); - } - - s.status = BUSY_STATE; - - /* Compression must start with an empty pending buffer */ - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$1; - } - } - //#endif - - /* Start a new block or continue the current one. - */ - if (strm.avail_in !== 0 || s.lookahead !== 0 || flush !== Z_NO_FLUSH$1 && s.status !== FINISH_STATE) { - var bstate = s.level === 0 ? deflate_stored(s, flush) : s.strategy === Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : s.strategy === Z_RLE ? deflate_rle(s, flush) : configuration_table[s.level].func(s, flush); - if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) { - s.status = FINISH_STATE; - } - if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) { - if (strm.avail_out === 0) { - s.last_flush = -1; - /* avoid BUF_ERROR next call, see above */ - } - - return Z_OK$1; - /* If flush != Z_NO_FLUSH && avail_out == 0, the next call - * of deflate should use the same flush parameter to make sure - * that the flush is complete. So we don't have to output an - * empty block here, this will be done at next call. This also - * ensures that for a very small output buffer, we emit at most - * one empty block. - */ - } - - if (bstate === BS_BLOCK_DONE) { - if (flush === Z_PARTIAL_FLUSH) { - _tr_align(s); - } else if (flush !== Z_BLOCK) { - /* FULL_FLUSH or SYNC_FLUSH */ - - _tr_stored_block(s, 0, 0, false); - /* For a full flush, this empty block will be recognized - * as a special marker by inflate_sync(). - */ - if (flush === Z_FULL_FLUSH$1) { - /*** CLEAR_HASH(s); ***/ /* forget history */ - zero(s.head); // Fill with NIL (= 0); - - if (s.lookahead === 0) { - s.strstart = 0; - s.block_start = 0; - s.insert = 0; - } - } - } - flush_pending(strm); - if (strm.avail_out === 0) { - s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */ - return Z_OK$1; - } - } - } - if (flush !== Z_FINISH$1) { - return Z_OK$1; - } - if (s.wrap <= 0) { - return Z_STREAM_END$1; - } - - /* Write the trailer */ - if (s.wrap === 2) { - put_byte(s, strm.adler & 0xff); - put_byte(s, strm.adler >> 8 & 0xff); - put_byte(s, strm.adler >> 16 & 0xff); - put_byte(s, strm.adler >> 24 & 0xff); - put_byte(s, strm.total_in & 0xff); - put_byte(s, strm.total_in >> 8 & 0xff); - put_byte(s, strm.total_in >> 16 & 0xff); - put_byte(s, strm.total_in >> 24 & 0xff); - } else { - putShortMSB(s, strm.adler >>> 16); - putShortMSB(s, strm.adler & 0xffff); - } - flush_pending(strm); - /* If avail_out is zero, the application will call deflate again - * to flush the rest. - */ - if (s.wrap > 0) { - s.wrap = -s.wrap; - } - /* write the trailer only once! */ - return s.pending !== 0 ? Z_OK$1 : Z_STREAM_END$1; - }; - var deflateEnd = function deflateEnd(strm) { - if (deflateStateCheck(strm)) { - return Z_STREAM_ERROR; - } - var status = strm.state.status; - strm.state = null; - return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK$1; - }; - - /* ========================================================================= - * Initializes the compression dictionary from the given byte - * sequence without producing any compressed output. - */ - var deflateSetDictionary = function deflateSetDictionary(strm, dictionary) { - var dictLength = dictionary.length; - if (deflateStateCheck(strm)) { - return Z_STREAM_ERROR; - } - var s = strm.state; - var wrap = s.wrap; - if (wrap === 2 || wrap === 1 && s.status !== INIT_STATE || s.lookahead) { - return Z_STREAM_ERROR; - } - - /* when using zlib wrappers, compute Adler-32 for provided dictionary */ - if (wrap === 1) { - /* adler32(strm->adler, dictionary, dictLength); */ - strm.adler = adler32_1(strm.adler, dictionary, dictLength, 0); - } - s.wrap = 0; /* avoid computing Adler-32 in read_buf */ - - /* if dictionary would fill window, just replace the history */ - if (dictLength >= s.w_size) { - if (wrap === 0) { - /* already empty otherwise */ - /*** CLEAR_HASH(s); ***/ - zero(s.head); // Fill with NIL (= 0); - s.strstart = 0; - s.block_start = 0; - s.insert = 0; - } - /* use the tail */ - // dictionary = dictionary.slice(dictLength - s.w_size); - var tmpDict = new Uint8Array(s.w_size); - tmpDict.set(dictionary.subarray(dictLength - s.w_size, dictLength), 0); - dictionary = tmpDict; - dictLength = s.w_size; - } - /* insert dictionary into window and hash */ - var avail = strm.avail_in; - var next = strm.next_in; - var input = strm.input; - strm.avail_in = dictLength; - strm.next_in = 0; - strm.input = dictionary; - fill_window(s); - while (s.lookahead >= MIN_MATCH) { - var str = s.strstart; - var n = s.lookahead - (MIN_MATCH - 1); - do { - /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ - s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]); - s.prev[str & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = str; - str++; - } while (--n); - s.strstart = str; - s.lookahead = MIN_MATCH - 1; - fill_window(s); - } - s.strstart += s.lookahead; - s.block_start = s.strstart; - s.insert = s.lookahead; - s.lookahead = 0; - s.match_length = s.prev_length = MIN_MATCH - 1; - s.match_available = 0; - strm.next_in = next; - strm.input = input; - strm.avail_in = avail; - s.wrap = wrap; - return Z_OK$1; - }; - var deflateInit_1 = deflateInit; - var deflateInit2_1 = deflateInit2; - var deflateReset_1 = deflateReset; - var deflateResetKeep_1 = deflateResetKeep; - var deflateSetHeader_1 = deflateSetHeader; - var deflate_2$1 = deflate$1; - var deflateEnd_1 = deflateEnd; - var deflateSetDictionary_1 = deflateSetDictionary; - var deflateInfo = 'pako deflate (from Nodeca project)'; - - /* Not implemented - module.exports.deflateBound = deflateBound; - module.exports.deflateCopy = deflateCopy; - module.exports.deflateGetDictionary = deflateGetDictionary; - module.exports.deflateParams = deflateParams; - module.exports.deflatePending = deflatePending; - module.exports.deflatePrime = deflatePrime; - module.exports.deflateTune = deflateTune; - */ - - var deflate_1$1 = { - deflateInit: deflateInit_1, - deflateInit2: deflateInit2_1, - deflateReset: deflateReset_1, - deflateResetKeep: deflateResetKeep_1, - deflateSetHeader: deflateSetHeader_1, - deflate: deflate_2$1, - deflateEnd: deflateEnd_1, - deflateSetDictionary: deflateSetDictionary_1, - deflateInfo: deflateInfo - }; - - function _typeof(obj) { - "@babel/helpers - typeof"; - - return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { - return typeof obj; - } : function (obj) { - return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }, _typeof(obj); - } - - var _has = function _has(obj, key) { - return Object.prototype.hasOwnProperty.call(obj, key); - }; - var assign = function assign(obj /*from1, from2, from3, ...*/) { - var sources = Array.prototype.slice.call(arguments, 1); - while (sources.length) { - var source = sources.shift(); - if (!source) { - continue; - } - if (_typeof(source) !== 'object') { - throw new TypeError(source + 'must be non-object'); - } - for (var p in source) { - if (_has(source, p)) { - obj[p] = source[p]; - } - } - } - return obj; - }; - - // Join array of chunks to single array. - var flattenChunks = function flattenChunks(chunks) { - // calculate data length - var len = 0; - for (var i = 0, l = chunks.length; i < l; i++) { - len += chunks[i].length; - } - - // join chunks - var result = new Uint8Array(len); - for (var _i = 0, pos = 0, _l = chunks.length; _i < _l; _i++) { - var chunk = chunks[_i]; - result.set(chunk, pos); - pos += chunk.length; - } - return result; - }; - var common = { - assign: assign, - flattenChunks: flattenChunks - }; - - // String encode/decode helpers - - // Quick check if we can use fast array to bin string conversion - // - // - apply(Array) can fail on Android 2.2 - // - apply(Uint8Array) can fail on iOS 5.1 Safari - // - var STR_APPLY_UIA_OK = true; - try { - String.fromCharCode.apply(null, new Uint8Array(1)); - } catch (__) { - STR_APPLY_UIA_OK = false; - } - - // Table with utf8 lengths (calculated by first byte of sequence) - // Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS, - // because max possible codepoint is 0x10ffff - var _utf8len = new Uint8Array(256); - for (var q = 0; q < 256; q++) { - _utf8len[q] = q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1; - } - _utf8len[254] = _utf8len[254] = 1; // Invalid sequence start - - // convert string to array (typed, when possible) - var string2buf = function string2buf(str) { - if (typeof TextEncoder === 'function' && TextEncoder.prototype.encode) { - return new TextEncoder().encode(str); - } - var buf, - c, - c2, - m_pos, - i, - str_len = str.length, - buf_len = 0; - - // count binary size - for (m_pos = 0; m_pos < str_len; m_pos++) { - c = str.charCodeAt(m_pos); - if ((c & 0xfc00) === 0xd800 && m_pos + 1 < str_len) { - c2 = str.charCodeAt(m_pos + 1); - if ((c2 & 0xfc00) === 0xdc00) { - c = 0x10000 + (c - 0xd800 << 10) + (c2 - 0xdc00); - m_pos++; - } - } - buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4; - } - - // allocate buffer - buf = new Uint8Array(buf_len); - - // convert - for (i = 0, m_pos = 0; i < buf_len; m_pos++) { - c = str.charCodeAt(m_pos); - if ((c & 0xfc00) === 0xd800 && m_pos + 1 < str_len) { - c2 = str.charCodeAt(m_pos + 1); - if ((c2 & 0xfc00) === 0xdc00) { - c = 0x10000 + (c - 0xd800 << 10) + (c2 - 0xdc00); - m_pos++; - } - } - if (c < 0x80) { - /* one byte */ - buf[i++] = c; - } else if (c < 0x800) { - /* two bytes */ - buf[i++] = 0xC0 | c >>> 6; - buf[i++] = 0x80 | c & 0x3f; - } else if (c < 0x10000) { - /* three bytes */ - buf[i++] = 0xE0 | c >>> 12; - buf[i++] = 0x80 | c >>> 6 & 0x3f; - buf[i++] = 0x80 | c & 0x3f; - } else { - /* four bytes */ - buf[i++] = 0xf0 | c >>> 18; - buf[i++] = 0x80 | c >>> 12 & 0x3f; - buf[i++] = 0x80 | c >>> 6 & 0x3f; - buf[i++] = 0x80 | c & 0x3f; - } - } - return buf; - }; - - // Helper - var buf2binstring = function buf2binstring(buf, len) { - // On Chrome, the arguments in a function call that are allowed is `65534`. - // If the length of the buffer is smaller than that, we can use this optimization, - // otherwise we will take a slower path. - if (len < 65534) { - if (buf.subarray && STR_APPLY_UIA_OK) { - return String.fromCharCode.apply(null, buf.length === len ? buf : buf.subarray(0, len)); - } - } - var result = ''; - for (var i = 0; i < len; i++) { - result += String.fromCharCode(buf[i]); - } - return result; - }; - - // convert array to string - var buf2string = function buf2string(buf, max) { - var len = max || buf.length; - if (typeof TextDecoder === 'function' && TextDecoder.prototype.decode) { - return new TextDecoder().decode(buf.subarray(0, max)); - } - var i, out; - - // Reserve max possible length (2 words per char) - // NB: by unknown reasons, Array is significantly faster for - // String.fromCharCode.apply than Uint16Array. - var utf16buf = new Array(len * 2); - for (out = 0, i = 0; i < len;) { - var c = buf[i++]; - // quick process ascii - if (c < 0x80) { - utf16buf[out++] = c; - continue; - } - var c_len = _utf8len[c]; - // skip 5 & 6 byte codes - if (c_len > 4) { - utf16buf[out++] = 0xfffd; - i += c_len - 1; - continue; - } - - // apply mask on first byte - c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07; - // join the rest - while (c_len > 1 && i < len) { - c = c << 6 | buf[i++] & 0x3f; - c_len--; - } - - // terminated by end of string? - if (c_len > 1) { - utf16buf[out++] = 0xfffd; - continue; - } - if (c < 0x10000) { - utf16buf[out++] = c; - } else { - c -= 0x10000; - utf16buf[out++] = 0xd800 | c >> 10 & 0x3ff; - utf16buf[out++] = 0xdc00 | c & 0x3ff; - } - } - return buf2binstring(utf16buf, out); - }; - - // Calculate max possible position in utf8 buffer, - // that will not break sequence. If that's not possible - // - (very small limits) return max size as is. - // - // buf[] - utf8 bytes array - // max - length limit (mandatory); - var utf8border = function utf8border(buf, max) { - max = max || buf.length; - if (max > buf.length) { - max = buf.length; - } - - // go back from last position, until start of sequence found - var pos = max - 1; - while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { - pos--; - } - - // Very small and broken sequence, - // return max, because we should return something anyway. - if (pos < 0) { - return max; - } - - // If we came to start of buffer - that means buffer is too small, - // return max too. - if (pos === 0) { - return max; - } - return pos + _utf8len[buf[pos]] > max ? pos : max; - }; - var strings = { - string2buf: string2buf, - buf2string: buf2string, - utf8border: utf8border - }; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - function ZStream() { - /* next input byte */ - this.input = null; // JS specific, because we have no pointers - this.next_in = 0; - /* number of bytes available at input */ - this.avail_in = 0; - /* total number of input bytes read so far */ - this.total_in = 0; - /* next output byte should be put there */ - this.output = null; // JS specific, because we have no pointers - this.next_out = 0; - /* remaining free space at output */ - this.avail_out = 0; - /* total number of bytes output so far */ - this.total_out = 0; - /* last error message, NULL if no error */ - this.msg = '' /*Z_NULL*/; - /* not visible by applications */ - this.state = null; - /* best guess about the data type: binary or text */ - this.data_type = 2 /*Z_UNKNOWN*/; - /* adler32 value of the uncompressed data */ - this.adler = 0; - } - var zstream = ZStream; - - var toString = Object.prototype.toString; - - /* Public constants ==========================================================*/ - /* ===========================================================================*/ - - var Z_NO_FLUSH = constants$1.Z_NO_FLUSH, - Z_SYNC_FLUSH = constants$1.Z_SYNC_FLUSH, - Z_FULL_FLUSH = constants$1.Z_FULL_FLUSH, - Z_FINISH = constants$1.Z_FINISH, - Z_OK = constants$1.Z_OK, - Z_STREAM_END = constants$1.Z_STREAM_END, - Z_DEFAULT_COMPRESSION = constants$1.Z_DEFAULT_COMPRESSION, - Z_DEFAULT_STRATEGY = constants$1.Z_DEFAULT_STRATEGY, - Z_DEFLATED = constants$1.Z_DEFLATED; - - /* ===========================================================================*/ - - /** - * class Deflate - * - * Generic JS-style wrapper for zlib calls. If you don't need - * streaming behaviour - use more simple functions: [[deflate]], - * [[deflateRaw]] and [[gzip]]. - **/ - - /* internal - * Deflate.chunks -> Array - * - * Chunks of output data, if [[Deflate#onData]] not overridden. - **/ - - /** - * Deflate.result -> Uint8Array - * - * Compressed result, generated by default [[Deflate#onData]] - * and [[Deflate#onEnd]] handlers. Filled after you push last chunk - * (call [[Deflate#push]] with `Z_FINISH` / `true` param). - **/ - - /** - * Deflate.err -> Number - * - * Error code after deflate finished. 0 (Z_OK) on success. - * You will not need it in real life, because deflate errors - * are possible only on wrong options or bad `onData` / `onEnd` - * custom handlers. - **/ - - /** - * Deflate.msg -> String - * - * Error message, if [[Deflate.err]] != 0 - **/ - - /** - * new Deflate(options) - * - options (Object): zlib deflate options. - * - * Creates new deflator instance with specified params. Throws exception - * on bad params. Supported options: - * - * - `level` - * - `windowBits` - * - `memLevel` - * - `strategy` - * - `dictionary` - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information on these. - * - * Additional options, for internal needs: - * - * - `chunkSize` - size of generated data chunks (16K by default) - * - `raw` (Boolean) - do raw deflate - * - `gzip` (Boolean) - create gzip wrapper - * - `header` (Object) - custom header for gzip - * - `text` (Boolean) - true if compressed data believed to be text - * - `time` (Number) - modification time, unix timestamp - * - `os` (Number) - operation system code - * - `extra` (Array) - array of bytes with extra data (max 65536) - * - `name` (String) - file name (binary string) - * - `comment` (String) - comment (binary string) - * - `hcrc` (Boolean) - true if header crc should be added - * - * ##### Example: - * - * ```javascript - * const pako = require('pako') - * , chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9]) - * , chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]); - * - * const deflate = new pako.Deflate({ level: 3}); - * - * deflate.push(chunk1, false); - * deflate.push(chunk2, true); // true -> last chunk - * - * if (deflate.err) { throw new Error(deflate.err); } - * - * console.log(deflate.result); - * ``` - **/ - function Deflate(options) { - this.options = common.assign({ - level: Z_DEFAULT_COMPRESSION, - method: Z_DEFLATED, - chunkSize: 16384, - windowBits: 15, - memLevel: 8, - strategy: Z_DEFAULT_STRATEGY - }, options || {}); - var opt = this.options; - if (opt.raw && opt.windowBits > 0) { - opt.windowBits = -opt.windowBits; - } else if (opt.gzip && opt.windowBits > 0 && opt.windowBits < 16) { - opt.windowBits += 16; - } - this.err = 0; // error code, if happens (0 = Z_OK) - this.msg = ''; // error message - this.ended = false; // used to avoid multiple onEnd() calls - this.chunks = []; // chunks of compressed data - - this.strm = new zstream(); - this.strm.avail_out = 0; - var status = deflate_1$1.deflateInit2(this.strm, opt.level, opt.method, opt.windowBits, opt.memLevel, opt.strategy); - if (status !== Z_OK) { - throw new Error(messages[status]); - } - if (opt.header) { - deflate_1$1.deflateSetHeader(this.strm, opt.header); - } - if (opt.dictionary) { - var dict; - // Convert data if needed - if (typeof opt.dictionary === 'string') { - // If we need to compress text, change encoding to utf8. - dict = strings.string2buf(opt.dictionary); - } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') { - dict = new Uint8Array(opt.dictionary); - } else { - dict = opt.dictionary; - } - status = deflate_1$1.deflateSetDictionary(this.strm, dict); - if (status !== Z_OK) { - throw new Error(messages[status]); - } - this._dict_set = true; - } - } - - /** - * Deflate#push(data[, flush_mode]) -> Boolean - * - data (Uint8Array|ArrayBuffer|String): input data. Strings will be - * converted to utf8 byte sequence. - * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes. - * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH. - * - * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with - * new compressed chunks. Returns `true` on success. The last data block must - * have `flush_mode` Z_FINISH (or `true`). That will flush internal pending - * buffers and call [[Deflate#onEnd]]. - * - * On fail call [[Deflate#onEnd]] with error code and return false. - * - * ##### Example - * - * ```javascript - * push(chunk, false); // push one of data chunks - * ... - * push(chunk, true); // push last chunk - * ``` - **/ - Deflate.prototype.push = function (data, flush_mode) { - var strm = this.strm; - var chunkSize = this.options.chunkSize; - var status, _flush_mode; - if (this.ended) { - return false; - } - if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;else _flush_mode = flush_mode === true ? Z_FINISH : Z_NO_FLUSH; - - // Convert data if needed - if (typeof data === 'string') { - // If we need to compress text, change encoding to utf8. - strm.input = strings.string2buf(data); - } else if (toString.call(data) === '[object ArrayBuffer]') { - strm.input = new Uint8Array(data); - } else { - strm.input = data; - } - strm.next_in = 0; - strm.avail_in = strm.input.length; - for (;;) { - if (strm.avail_out === 0) { - strm.output = new Uint8Array(chunkSize); - strm.next_out = 0; - strm.avail_out = chunkSize; - } - - // Make sure avail_out > 6 to avoid repeating markers - if ((_flush_mode === Z_SYNC_FLUSH || _flush_mode === Z_FULL_FLUSH) && strm.avail_out <= 6) { - this.onData(strm.output.subarray(0, strm.next_out)); - strm.avail_out = 0; - continue; - } - status = deflate_1$1.deflate(strm, _flush_mode); - - // Ended => flush and finish - if (status === Z_STREAM_END) { - if (strm.next_out > 0) { - this.onData(strm.output.subarray(0, strm.next_out)); - } - status = deflate_1$1.deflateEnd(this.strm); - this.onEnd(status); - this.ended = true; - return status === Z_OK; - } - - // Flush if out buffer full - if (strm.avail_out === 0) { - this.onData(strm.output); - continue; - } - - // Flush if requested and has data - if (_flush_mode > 0 && strm.next_out > 0) { - this.onData(strm.output.subarray(0, strm.next_out)); - strm.avail_out = 0; - continue; - } - if (strm.avail_in === 0) break; - } - return true; - }; - - /** - * Deflate#onData(chunk) -> Void - * - chunk (Uint8Array): output data. - * - * By default, stores data blocks in `chunks[]` property and glue - * those in `onEnd`. Override this handler, if you need another behaviour. - **/ - Deflate.prototype.onData = function (chunk) { - this.chunks.push(chunk); - }; - - /** - * Deflate#onEnd(status) -> Void - * - status (Number): deflate status. 0 (Z_OK) on success, - * other if not. - * - * Called once after you tell deflate that the input stream is - * complete (Z_FINISH). By default - join collected chunks, - * free memory and fill `results` / `err` properties. - **/ - Deflate.prototype.onEnd = function (status) { - // On success - join - if (status === Z_OK) { - this.result = common.flattenChunks(this.chunks); - } - this.chunks = []; - this.err = status; - this.msg = this.strm.msg; - }; - - /** - * deflate(data[, options]) -> Uint8Array - * - data (Uint8Array|ArrayBuffer|String): input data to compress. - * - options (Object): zlib deflate options. - * - * Compress `data` with deflate algorithm and `options`. - * - * Supported options are: - * - * - level - * - windowBits - * - memLevel - * - strategy - * - dictionary - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information on these. - * - * Sugar (options): - * - * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify - * negative windowBits implicitly. - * - * ##### Example: - * - * ```javascript - * const pako = require('pako') - * const data = new Uint8Array([1,2,3,4,5,6,7,8,9]); - * - * console.log(pako.deflate(data)); - * ``` - **/ - function deflate(input, options) { - var deflator = new Deflate(options); - deflator.push(input, true); - - // That will never happens, if you don't cheat with options :) - if (deflator.err) { - throw deflator.msg || messages[deflator.err]; - } - return deflator.result; - } - - /** - * deflateRaw(data[, options]) -> Uint8Array - * - data (Uint8Array|ArrayBuffer|String): input data to compress. - * - options (Object): zlib deflate options. - * - * The same as [[deflate]], but creates raw data, without wrapper - * (header and adler32 crc). - **/ - function deflateRaw(input, options) { - options = options || {}; - options.raw = true; - return deflate(input, options); - } - - /** - * gzip(data[, options]) -> Uint8Array - * - data (Uint8Array|ArrayBuffer|String): input data to compress. - * - options (Object): zlib deflate options. - * - * The same as [[deflate]], but create gzip wrapper instead of - * deflate one. - **/ - function gzip(input, options) { - options = options || {}; - options.gzip = true; - return deflate(input, options); - } - var Deflate_1 = Deflate; - var deflate_2 = deflate; - var deflateRaw_1 = deflateRaw; - var gzip_1 = gzip; - var constants = constants$1; - var deflate_1 = { - Deflate: Deflate_1, - deflate: deflate_2, - deflateRaw: deflateRaw_1, - gzip: gzip_1, - constants: constants - }; - - exports.Deflate = Deflate_1; - exports.constants = constants; - exports["default"] = deflate_1; - exports.deflate = deflate_2; - exports.deflateRaw = deflateRaw_1; - exports.gzip = gzip_1; - - Object.defineProperty(exports, '__esModule', { value: true }); - -})); diff --git a/node_modules/pako/dist/pako_deflate.es5.min.js b/node_modules/pako/dist/pako_deflate.es5.min.js deleted file mode 100644 index 5ae38b6..0000000 --- a/node_modules/pako/dist/pako_deflate.es5.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).pako={})}(this,(function(t){"use strict";function e(t){for(var e=t.length;--e>=0;)t[e]=0}var a=256,r=286,n=30,i=15,s=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]),_=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]),h=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),o=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),l=new Array(576);e(l);var d=new Array(60);e(d);var u=new Array(512);e(u);var f=new Array(256);e(f);var c=new Array(29);e(c);var p,g,w,m=new Array(n);function b(t,e,a,r,n){this.static_tree=t,this.extra_bits=e,this.extra_base=a,this.elems=r,this.max_length=n,this.has_stree=t&&t.length}function v(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}e(m);var y=function(t){return t<256?u[t]:u[256+(t>>>7)]},z=function(t,e){t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255},k=function(t,e,a){t.bi_valid>16-a?(t.bi_buf|=e<>16-t.bi_valid,t.bi_valid+=a-16):(t.bi_buf|=e<>>=1,a<<=1}while(--e>0);return a>>>1},E=function(t,e,a){var r,n,s=new Array(16),_=0;for(r=1;r<=i;r++)_=_+a[r-1]<<1,s[r]=_;for(n=0;n<=e;n++){var h=t[2*n+1];0!==h&&(t[2*n]=A(s[h]++,h))}},Z=function(t){var e;for(e=0;e8?z(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0},U=function(t,e,a,r){var n=2*e,i=2*a;return t[n]>1;a>=1;a--)R(t,s,a);n=o;do{a=t.heap[1],t.heap[1]=t.heap[t.heap_len--],R(t,s,1),r=t.heap[1],t.heap[--t.heap_max]=a,t.heap[--t.heap_max]=r,s[2*n]=s[2*a]+s[2*r],t.depth[n]=(t.depth[a]>=t.depth[r]?t.depth[a]:t.depth[r])+1,s[2*a+1]=s[2*r+1]=n,t.heap[1]=n++,R(t,s,1)}while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],function(t,e){var a,r,n,s,_,h,o=e.dyn_tree,l=e.max_code,d=e.stat_desc.static_tree,u=e.stat_desc.has_stree,f=e.stat_desc.extra_bits,c=e.stat_desc.extra_base,p=e.stat_desc.max_length,g=0;for(s=0;s<=i;s++)t.bl_count[s]=0;for(o[2*t.heap[t.heap_max]+1]=0,a=t.heap_max+1;a<573;a++)(s=o[2*o[2*(r=t.heap[a])+1]+1]+1)>p&&(s=p,g++),o[2*r+1]=s,r>l||(t.bl_count[s]++,_=0,r>=c&&(_=f[r-c]),h=o[2*r],t.opt_len+=h*(s+_),u&&(t.static_len+=h*(d[2*r+1]+_)));if(0!==g){do{for(s=p-1;0===t.bl_count[s];)s--;t.bl_count[s]--,t.bl_count[s+1]+=2,t.bl_count[p]--,g-=2}while(g>0);for(s=p;0!==s;s--)for(r=t.bl_count[s];0!==r;)(n=t.heap[--a])>l||(o[2*n+1]!==s&&(t.opt_len+=(s-o[2*n+1])*o[2*n],o[2*n+1]=s),r--)}}(t,e),E(s,l,t.bl_count)},F=function(t,e,a){var r,n,i=-1,s=e[1],_=0,h=7,o=4;for(0===s&&(h=138,o=3),e[2*(a+1)+1]=65535,r=0;r<=a;r++)n=s,s=e[2*(r+1)+1],++_0?(2===t.strm.data_type&&(t.strm.data_type=function(t){var e,r=4093624447;for(e=0;e<=31;e++,r>>>=1)if(1&r&&0!==t.dyn_ltree[2*e])return 0;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return 1;for(e=32;e=3&&0===t.bl_tree[2*o[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e}(t),i=t.opt_len+3+7>>>3,(s=t.static_len+3+7>>>3)<=i&&(i=s)):i=s=r+5,r+4<=i&&-1!==e?N(t,e,r,n):4===t.strategy||s===i?(k(t,2+(n?1:0),3),T(t,l,d)):(k(t,4+(n?1:0),3),function(t,e,a,r){var n;for(k(t,e-257,5),k(t,a-1,5),k(t,r-4,4),n=0;n>=7;o>8,t.pending_buf[t.sym_buf+t.sym_next++]=r,0===e?t.dyn_ltree[2*r]++:(t.matches++,e--,t.dyn_ltree[2*(f[r]+a+1)]++,t.dyn_dtree[2*y(e)]++),t.sym_next===t.sym_end},_tr_align:function(t){k(t,2,3),x(t,256,l),function(t){16===t.bi_valid?(z(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)}(t)}},B=function(t,e,a,r){for(var n=65535&t|0,i=t>>>16&65535|0,s=0;0!==a;){a-=s=a>2e3?2e3:a;do{i=i+(n=n+e[r++]|0)|0}while(--s);n%=65521,i%=65521}return n|i<<16|0},H=new Uint32Array(function(){for(var t,e=[],a=0;a<256;a++){t=a;for(var r=0;r<8;r++)t=1&t?3988292384^t>>>1:t>>>1;e[a]=t}return e}()),M=function(t,e,a,r){var n=H,i=r+a;t^=-1;for(var s=r;s>>8^n[255&(t^e[s])];return-1^t},P={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},j={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8},K=C._tr_init,Y=C._tr_stored_block,G=C._tr_flush_block,X=C._tr_tally,W=C._tr_align,q=j.Z_NO_FLUSH,J=j.Z_PARTIAL_FLUSH,Q=j.Z_FULL_FLUSH,V=j.Z_FINISH,$=j.Z_BLOCK,tt=j.Z_OK,et=j.Z_STREAM_END,at=j.Z_STREAM_ERROR,rt=j.Z_DATA_ERROR,nt=j.Z_BUF_ERROR,it=j.Z_DEFAULT_COMPRESSION,st=j.Z_FILTERED,_t=j.Z_HUFFMAN_ONLY,ht=j.Z_RLE,ot=j.Z_FIXED,lt=j.Z_DEFAULT_STRATEGY,dt=j.Z_UNKNOWN,ut=j.Z_DEFLATED,ft=258,ct=262,pt=42,gt=113,wt=666,mt=function(t,e){return t.msg=P[e],e},bt=function(t){return 2*t-(t>4?9:0)},vt=function(t){for(var e=t.length;--e>=0;)t[e]=0},yt=function(t){var e,a,r,n=t.w_size;r=e=t.hash_size;do{a=t.head[--r],t.head[r]=a>=n?a-n:0}while(--e);r=e=n;do{a=t.prev[--r],t.prev[r]=a>=n?a-n:0}while(--e)},zt=function(t,e,a){return(e<t.avail_out&&(a=t.avail_out),0!==a&&(t.output.set(e.pending_buf.subarray(e.pending_out,e.pending_out+a),t.next_out),t.next_out+=a,e.pending_out+=a,t.total_out+=a,t.avail_out-=a,e.pending-=a,0===e.pending&&(e.pending_out=0))},xt=function(t,e){G(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,kt(t.strm)},At=function(t,e){t.pending_buf[t.pending++]=e},Et=function(t,e){t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e},Zt=function(t,e,a,r){var n=t.avail_in;return n>r&&(n=r),0===n?0:(t.avail_in-=n,e.set(t.input.subarray(t.next_in,t.next_in+n),a),1===t.state.wrap?t.adler=B(t.adler,e,n,a):2===t.state.wrap&&(t.adler=M(t.adler,e,n,a)),t.next_in+=n,t.total_in+=n,n)},St=function(t,e){var a,r,n=t.max_chain_length,i=t.strstart,s=t.prev_length,_=t.nice_match,h=t.strstart>t.w_size-ct?t.strstart-(t.w_size-ct):0,o=t.window,l=t.w_mask,d=t.prev,u=t.strstart+ft,f=o[i+s-1],c=o[i+s];t.prev_length>=t.good_match&&(n>>=2),_>t.lookahead&&(_=t.lookahead);do{if(o[(a=e)+s]===c&&o[a+s-1]===f&&o[a]===o[i]&&o[++a]===o[i+1]){i+=2,a++;do{}while(o[++i]===o[++a]&&o[++i]===o[++a]&&o[++i]===o[++a]&&o[++i]===o[++a]&&o[++i]===o[++a]&&o[++i]===o[++a]&&o[++i]===o[++a]&&o[++i]===o[++a]&&is){if(t.match_start=e,s=r,r>=_)break;f=o[i+s-1],c=o[i+s]}}}while((e=d[e&l])>h&&0!=--n);return s<=t.lookahead?s:t.lookahead},Ut=function(t){var e,a,r,n=t.w_size;do{if(a=t.window_size-t.lookahead-t.strstart,t.strstart>=n+(n-ct)&&(t.window.set(t.window.subarray(n,n+n-a),0),t.match_start-=n,t.strstart-=n,t.block_start-=n,t.insert>t.strstart&&(t.insert=t.strstart),yt(t),a+=n),0===t.strm.avail_in)break;if(e=Zt(t.strm,t.window,t.strstart+t.lookahead,a),t.lookahead+=e,t.lookahead+t.insert>=3)for(r=t.strstart-t.insert,t.ins_h=t.window[r],t.ins_h=zt(t,t.ins_h,t.window[r+1]);t.insert&&(t.ins_h=zt(t,t.ins_h,t.window[r+3-1]),t.prev[r&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=r,r++,t.insert--,!(t.lookahead+t.insert<3)););}while(t.lookaheadt.w_size?t.w_size:t.pending_buf_size-5,s=0,_=t.strm.avail_in;do{if(a=65535,n=t.bi_valid+42>>3,t.strm.avail_out(r=t.strstart-t.block_start)+t.strm.avail_in&&(a=r+t.strm.avail_in),a>n&&(a=n),a>8,t.pending_buf[t.pending-2]=~a,t.pending_buf[t.pending-1]=~a>>8,kt(t.strm),r&&(r>a&&(r=a),t.strm.output.set(t.window.subarray(t.block_start,t.block_start+r),t.strm.next_out),t.strm.next_out+=r,t.strm.avail_out-=r,t.strm.total_out+=r,t.block_start+=r,a-=r),a&&(Zt(t.strm,t.strm.output,t.strm.next_out,a),t.strm.next_out+=a,t.strm.avail_out-=a,t.strm.total_out+=a)}while(0===s);return(_-=t.strm.avail_in)&&(_>=t.w_size?(t.matches=2,t.window.set(t.strm.input.subarray(t.strm.next_in-t.w_size,t.strm.next_in),0),t.strstart=t.w_size,t.insert=t.strstart):(t.window_size-t.strstart<=_&&(t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,t.insert>t.strstart&&(t.insert=t.strstart)),t.window.set(t.strm.input.subarray(t.strm.next_in-_,t.strm.next_in),t.strstart),t.strstart+=_,t.insert+=_>t.w_size-t.insert?t.w_size-t.insert:_),t.block_start=t.strstart),t.high_watern&&t.block_start>=t.w_size&&(t.block_start-=t.w_size,t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,n+=t.w_size,t.insert>t.strstart&&(t.insert=t.strstart)),n>t.strm.avail_in&&(n=t.strm.avail_in),n&&(Zt(t.strm,t.window,t.strstart,n),t.strstart+=n,t.insert+=n>t.w_size-t.insert?t.w_size-t.insert:n),t.high_water>3,i=(n=t.pending_buf_size-n>65535?65535:t.pending_buf_size-n)>t.w_size?t.w_size:n,((r=t.strstart-t.block_start)>=i||(r||e===V)&&e!==q&&0===t.strm.avail_in&&r<=n)&&(a=r>n?n:r,s=e===V&&0===t.strm.avail_in&&a===r?1:0,Y(t,t.block_start,a,s),t.block_start+=a,kt(t.strm)),s?3:1)},Tt=function(t,e){for(var a,r;;){if(t.lookahead=3&&(t.ins_h=zt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),0!==a&&t.strstart-a<=t.w_size-ct&&(t.match_length=St(t,a)),t.match_length>=3)if(r=X(t,t.strstart-t.match_start,t.match_length-3),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=3){t.match_length--;do{t.strstart++,t.ins_h=zt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart}while(0!=--t.match_length);t.strstart++}else t.strstart+=t.match_length,t.match_length=0,t.ins_h=t.window[t.strstart],t.ins_h=zt(t,t.ins_h,t.window[t.strstart+1]);else r=X(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++;if(r&&(xt(t,!1),0===t.strm.avail_out))return 1}return t.insert=t.strstart<2?t.strstart:2,e===V?(xt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(xt(t,!1),0===t.strm.avail_out)?1:2},Lt=function(t,e){for(var a,r,n;;){if(t.lookahead=3&&(t.ins_h=zt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),t.prev_length=t.match_length,t.prev_match=t.match_start,t.match_length=2,0!==a&&t.prev_length4096)&&(t.match_length=2)),t.prev_length>=3&&t.match_length<=t.prev_length){n=t.strstart+t.lookahead-3,r=X(t,t.strstart-1-t.prev_match,t.prev_length-3),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=n&&(t.ins_h=zt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart)}while(0!=--t.prev_length);if(t.match_available=0,t.match_length=2,t.strstart++,r&&(xt(t,!1),0===t.strm.avail_out))return 1}else if(t.match_available){if((r=X(t,0,t.window[t.strstart-1]))&&xt(t,!1),t.strstart++,t.lookahead--,0===t.strm.avail_out)return 1}else t.match_available=1,t.strstart++,t.lookahead--}return t.match_available&&(r=X(t,0,t.window[t.strstart-1]),t.match_available=0),t.insert=t.strstart<2?t.strstart:2,e===V?(xt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(xt(t,!1),0===t.strm.avail_out)?1:2};function Ft(t,e,a,r,n){this.good_length=t,this.max_lazy=e,this.nice_length=a,this.max_chain=r,this.func=n}var Ot=[new Ft(0,0,0,0,Rt),new Ft(4,4,8,4,Tt),new Ft(4,5,16,8,Tt),new Ft(4,6,32,32,Tt),new Ft(4,4,16,16,Lt),new Ft(8,16,32,32,Lt),new Ft(8,16,128,128,Lt),new Ft(8,32,128,256,Lt),new Ft(32,128,258,1024,Lt),new Ft(32,258,258,4096,Lt)];function Dt(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=ut,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Uint16Array(1146),this.dyn_dtree=new Uint16Array(122),this.bl_tree=new Uint16Array(78),vt(this.dyn_ltree),vt(this.dyn_dtree),vt(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Uint16Array(16),this.heap=new Uint16Array(573),vt(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(573),vt(this.depth),this.sym_buf=0,this.lit_bufsize=0,this.sym_next=0,this.sym_end=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}var Nt=function(t){if(!t)return 1;var e=t.state;return!e||e.strm!==t||e.status!==pt&&57!==e.status&&69!==e.status&&73!==e.status&&91!==e.status&&103!==e.status&&e.status!==gt&&e.status!==wt?1:0},It=function(t){if(Nt(t))return mt(t,at);t.total_in=t.total_out=0,t.data_type=dt;var e=t.state;return e.pending=0,e.pending_out=0,e.wrap<0&&(e.wrap=-e.wrap),e.status=2===e.wrap?57:e.wrap?pt:gt,t.adler=2===e.wrap?0:1,e.last_flush=-2,K(e),tt},Ct=function(t){var e,a=It(t);return a===tt&&((e=t.state).window_size=2*e.w_size,vt(e.head),e.max_lazy_match=Ot[e.level].max_lazy,e.good_match=Ot[e.level].good_length,e.nice_match=Ot[e.level].nice_length,e.max_chain_length=Ot[e.level].max_chain,e.strstart=0,e.block_start=0,e.lookahead=0,e.insert=0,e.match_length=e.prev_length=2,e.match_available=0,e.ins_h=0),a},Bt=function(t,e,a,r,n,i){if(!t)return at;var s=1;if(e===it&&(e=6),r<0?(s=0,r=-r):r>15&&(s=2,r-=16),n<1||n>9||a!==ut||r<8||r>15||e<0||e>9||i<0||i>ot||8===r&&1!==s)return mt(t,at);8===r&&(r=9);var _=new Dt;return t.state=_,_.strm=t,_.status=pt,_.wrap=s,_.gzhead=null,_.w_bits=r,_.w_size=1<<_.w_bits,_.w_mask=_.w_size-1,_.hash_bits=n+7,_.hash_size=1<<_.hash_bits,_.hash_mask=_.hash_size-1,_.hash_shift=~~((_.hash_bits+3-1)/3),_.window=new Uint8Array(2*_.w_size),_.head=new Uint16Array(_.hash_size),_.prev=new Uint16Array(_.w_size),_.lit_bufsize=1<$||e<0)return t?mt(t,at):at;var a=t.state;if(!t.output||0!==t.avail_in&&!t.input||a.status===wt&&e!==V)return mt(t,0===t.avail_out?nt:at);var r=a.last_flush;if(a.last_flush=e,0!==a.pending){if(kt(t),0===t.avail_out)return a.last_flush=-1,tt}else if(0===t.avail_in&&bt(e)<=bt(r)&&e!==V)return mt(t,nt);if(a.status===wt&&0!==t.avail_in)return mt(t,nt);if(a.status===pt&&0===a.wrap&&(a.status=gt),a.status===pt){var n=ut+(a.w_bits-8<<4)<<8;if(n|=(a.strategy>=_t||a.level<2?0:a.level<6?1:6===a.level?2:3)<<6,0!==a.strstart&&(n|=32),Et(a,n+=31-n%31),0!==a.strstart&&(Et(a,t.adler>>>16),Et(a,65535&t.adler)),t.adler=1,a.status=gt,kt(t),0!==a.pending)return a.last_flush=-1,tt}if(57===a.status)if(t.adler=0,At(a,31),At(a,139),At(a,8),a.gzhead)At(a,(a.gzhead.text?1:0)+(a.gzhead.hcrc?2:0)+(a.gzhead.extra?4:0)+(a.gzhead.name?8:0)+(a.gzhead.comment?16:0)),At(a,255&a.gzhead.time),At(a,a.gzhead.time>>8&255),At(a,a.gzhead.time>>16&255),At(a,a.gzhead.time>>24&255),At(a,9===a.level?2:a.strategy>=_t||a.level<2?4:0),At(a,255&a.gzhead.os),a.gzhead.extra&&a.gzhead.extra.length&&(At(a,255&a.gzhead.extra.length),At(a,a.gzhead.extra.length>>8&255)),a.gzhead.hcrc&&(t.adler=M(t.adler,a.pending_buf,a.pending,0)),a.gzindex=0,a.status=69;else if(At(a,0),At(a,0),At(a,0),At(a,0),At(a,0),At(a,9===a.level?2:a.strategy>=_t||a.level<2?4:0),At(a,3),a.status=gt,kt(t),0!==a.pending)return a.last_flush=-1,tt;if(69===a.status){if(a.gzhead.extra){for(var i=a.pending,s=(65535&a.gzhead.extra.length)-a.gzindex;a.pending+s>a.pending_buf_size;){var _=a.pending_buf_size-a.pending;if(a.pending_buf.set(a.gzhead.extra.subarray(a.gzindex,a.gzindex+_),a.pending),a.pending=a.pending_buf_size,a.gzhead.hcrc&&a.pending>i&&(t.adler=M(t.adler,a.pending_buf,a.pending-i,i)),a.gzindex+=_,kt(t),0!==a.pending)return a.last_flush=-1,tt;i=0,s-=_}var h=new Uint8Array(a.gzhead.extra);a.pending_buf.set(h.subarray(a.gzindex,a.gzindex+s),a.pending),a.pending+=s,a.gzhead.hcrc&&a.pending>i&&(t.adler=M(t.adler,a.pending_buf,a.pending-i,i)),a.gzindex=0}a.status=73}if(73===a.status){if(a.gzhead.name){var o,l=a.pending;do{if(a.pending===a.pending_buf_size){if(a.gzhead.hcrc&&a.pending>l&&(t.adler=M(t.adler,a.pending_buf,a.pending-l,l)),kt(t),0!==a.pending)return a.last_flush=-1,tt;l=0}o=a.gzindexl&&(t.adler=M(t.adler,a.pending_buf,a.pending-l,l)),a.gzindex=0}a.status=91}if(91===a.status){if(a.gzhead.comment){var d,u=a.pending;do{if(a.pending===a.pending_buf_size){if(a.gzhead.hcrc&&a.pending>u&&(t.adler=M(t.adler,a.pending_buf,a.pending-u,u)),kt(t),0!==a.pending)return a.last_flush=-1,tt;u=0}d=a.gzindexu&&(t.adler=M(t.adler,a.pending_buf,a.pending-u,u))}a.status=103}if(103===a.status){if(a.gzhead.hcrc){if(a.pending+2>a.pending_buf_size&&(kt(t),0!==a.pending))return a.last_flush=-1,tt;At(a,255&t.adler),At(a,t.adler>>8&255),t.adler=0}if(a.status=gt,kt(t),0!==a.pending)return a.last_flush=-1,tt}if(0!==t.avail_in||0!==a.lookahead||e!==q&&a.status!==wt){var f=0===a.level?Rt(a,e):a.strategy===_t?function(t,e){for(var a;;){if(0===t.lookahead&&(Ut(t),0===t.lookahead)){if(e===q)return 1;break}if(t.match_length=0,a=X(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,a&&(xt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===V?(xt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(xt(t,!1),0===t.strm.avail_out)?1:2}(a,e):a.strategy===ht?function(t,e){for(var a,r,n,i,s=t.window;;){if(t.lookahead<=ft){if(Ut(t),t.lookahead<=ft&&e===q)return 1;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=3&&t.strstart>0&&(r=s[n=t.strstart-1])===s[++n]&&r===s[++n]&&r===s[++n]){i=t.strstart+ft;do{}while(r===s[++n]&&r===s[++n]&&r===s[++n]&&r===s[++n]&&r===s[++n]&&r===s[++n]&&r===s[++n]&&r===s[++n]&&nt.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=3?(a=X(t,1,t.match_length-3),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(a=X(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),a&&(xt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===V?(xt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(xt(t,!1),0===t.strm.avail_out)?1:2}(a,e):Ot[a.level].func(a,e);if(3!==f&&4!==f||(a.status=wt),1===f||3===f)return 0===t.avail_out&&(a.last_flush=-1),tt;if(2===f&&(e===J?W(a):e!==$&&(Y(a,0,0,!1),e===Q&&(vt(a.head),0===a.lookahead&&(a.strstart=0,a.block_start=0,a.insert=0))),kt(t),0===t.avail_out))return a.last_flush=-1,tt}return e!==V?tt:a.wrap<=0?et:(2===a.wrap?(At(a,255&t.adler),At(a,t.adler>>8&255),At(a,t.adler>>16&255),At(a,t.adler>>24&255),At(a,255&t.total_in),At(a,t.total_in>>8&255),At(a,t.total_in>>16&255),At(a,t.total_in>>24&255)):(Et(a,t.adler>>>16),Et(a,65535&t.adler)),kt(t),a.wrap>0&&(a.wrap=-a.wrap),0!==a.pending?tt:et)},deflateEnd:function(t){if(Nt(t))return at;var e=t.state.status;return t.state=null,e===gt?mt(t,rt):tt},deflateSetDictionary:function(t,e){var a=e.length;if(Nt(t))return at;var r=t.state,n=r.wrap;if(2===n||1===n&&r.status!==pt||r.lookahead)return at;if(1===n&&(t.adler=B(t.adler,e,a,0)),r.wrap=0,a>=r.w_size){0===n&&(vt(r.head),r.strstart=0,r.block_start=0,r.insert=0);var i=new Uint8Array(r.w_size);i.set(e.subarray(a-r.w_size,a),0),e=i,a=r.w_size}var s=t.avail_in,_=t.next_in,h=t.input;for(t.avail_in=a,t.next_in=0,t.input=e,Ut(r);r.lookahead>=3;){var o=r.strstart,l=r.lookahead-2;do{r.ins_h=zt(r,r.ins_h,r.window[o+3-1]),r.prev[o&r.w_mask]=r.head[r.ins_h],r.head[r.ins_h]=o,o++}while(--l);r.strstart=o,r.lookahead=2,Ut(r)}return r.strstart+=r.lookahead,r.block_start=r.strstart,r.insert=r.lookahead,r.lookahead=0,r.match_length=r.prev_length=2,r.match_available=0,t.next_in=_,t.input=h,t.avail_in=s,r.wrap=n,tt},deflateInfo:"pako deflate (from Nodeca project)"};function Mt(t){return Mt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Mt(t)}var Pt=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},jt=function(t){for(var e=Array.prototype.slice.call(arguments,1);e.length;){var a=e.shift();if(a){if("object"!==Mt(a))throw new TypeError(a+"must be non-object");for(var r in a)Pt(a,r)&&(t[r]=a[r])}}return t},Kt=function(t){for(var e=0,a=0,r=t.length;a=252?6:Gt>=248?5:Gt>=240?4:Gt>=224?3:Gt>=192?2:1;Yt[254]=Yt[254]=1;var Xt=function(t){if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(t);var e,a,r,n,i,s=t.length,_=0;for(n=0;n>>6,e[i++]=128|63&a):a<65536?(e[i++]=224|a>>>12,e[i++]=128|a>>>6&63,e[i++]=128|63&a):(e[i++]=240|a>>>18,e[i++]=128|a>>>12&63,e[i++]=128|a>>>6&63,e[i++]=128|63&a);return e};var Wt=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0},qt=Object.prototype.toString,Jt=j.Z_NO_FLUSH,Qt=j.Z_SYNC_FLUSH,Vt=j.Z_FULL_FLUSH,$t=j.Z_FINISH,te=j.Z_OK,ee=j.Z_STREAM_END,ae=j.Z_DEFAULT_COMPRESSION,re=j.Z_DEFAULT_STRATEGY,ne=j.Z_DEFLATED;function ie(t){this.options=jt({level:ae,method:ne,chunkSize:16384,windowBits:15,memLevel:8,strategy:re},t||{});var e=this.options;e.raw&&e.windowBits>0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new Wt,this.strm.avail_out=0;var a=Ht.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(a!==te)throw new Error(P[a]);if(e.header&&Ht.deflateSetHeader(this.strm,e.header),e.dictionary){var r;if(r="string"==typeof e.dictionary?Xt(e.dictionary):"[object ArrayBuffer]"===qt.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,(a=Ht.deflateSetDictionary(this.strm,r))!==te)throw new Error(P[a]);this._dict_set=!0}}function se(t,e){var a=new ie(e);if(a.push(t,!0),a.err)throw a.msg||P[a.err];return a.result}ie.prototype.push=function(t,e){var a,r,n=this.strm,i=this.options.chunkSize;if(this.ended)return!1;for(r=e===~~e?e:!0===e?$t:Jt,"string"==typeof t?n.input=Xt(t):"[object ArrayBuffer]"===qt.call(t)?n.input=new Uint8Array(t):n.input=t,n.next_in=0,n.avail_in=n.input.length;;)if(0===n.avail_out&&(n.output=new Uint8Array(i),n.next_out=0,n.avail_out=i),(r===Qt||r===Vt)&&n.avail_out<=6)this.onData(n.output.subarray(0,n.next_out)),n.avail_out=0;else{if((a=Ht.deflate(n,r))===ee)return n.next_out>0&&this.onData(n.output.subarray(0,n.next_out)),a=Ht.deflateEnd(this.strm),this.onEnd(a),this.ended=!0,a===te;if(0!==n.avail_out){if(r>0&&n.next_out>0)this.onData(n.output.subarray(0,n.next_out)),n.avail_out=0;else if(0===n.avail_in)break}else this.onData(n.output)}return!0},ie.prototype.onData=function(t){this.chunks.push(t)},ie.prototype.onEnd=function(t){t===te&&(this.result=Kt(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var _e=ie,he=se,oe=function(t,e){return(e=e||{}).raw=!0,se(t,e)},le=function(t,e){return(e=e||{}).gzip=!0,se(t,e)},de=j,ue={Deflate:_e,deflate:he,deflateRaw:oe,gzip:le,constants:de};t.Deflate=_e,t.constants=de,t.default=ue,t.deflate=he,t.deflateRaw=oe,t.gzip=le,Object.defineProperty(t,"__esModule",{value:!0})})); diff --git a/node_modules/pako/dist/pako_deflate.js b/node_modules/pako/dist/pako_deflate.js deleted file mode 100644 index 19c3e15..0000000 --- a/node_modules/pako/dist/pako_deflate.js +++ /dev/null @@ -1,4126 +0,0 @@ - -/*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : - typeof define === 'function' && define.amd ? define(['exports'], factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.pako = {})); -})(this, (function (exports) { 'use strict'; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - /* eslint-disable space-unary-ops */ - - /* Public constants ==========================================================*/ - /* ===========================================================================*/ - - - //const Z_FILTERED = 1; - //const Z_HUFFMAN_ONLY = 2; - //const Z_RLE = 3; - const Z_FIXED$1 = 4; - //const Z_DEFAULT_STRATEGY = 0; - - /* Possible values of the data_type field (though see inflate()) */ - const Z_BINARY = 0; - const Z_TEXT = 1; - //const Z_ASCII = 1; // = Z_TEXT - const Z_UNKNOWN$1 = 2; - - /*============================================================================*/ - - - function zero$1(buf) { let len = buf.length; while (--len >= 0) { buf[len] = 0; } } - - // From zutil.h - - const STORED_BLOCK = 0; - const STATIC_TREES = 1; - const DYN_TREES = 2; - /* The three kinds of block type */ - - const MIN_MATCH$1 = 3; - const MAX_MATCH$1 = 258; - /* The minimum and maximum match lengths */ - - // From deflate.h - /* =========================================================================== - * Internal compression state. - */ - - const LENGTH_CODES$1 = 29; - /* number of length codes, not counting the special END_BLOCK code */ - - const LITERALS$1 = 256; - /* number of literal bytes 0..255 */ - - const L_CODES$1 = LITERALS$1 + 1 + LENGTH_CODES$1; - /* number of Literal or Length codes, including the END_BLOCK code */ - - const D_CODES$1 = 30; - /* number of distance codes */ - - const BL_CODES$1 = 19; - /* number of codes used to transfer the bit lengths */ - - const HEAP_SIZE$1 = 2 * L_CODES$1 + 1; - /* maximum heap size */ - - const MAX_BITS$1 = 15; - /* All codes must not exceed MAX_BITS bits */ - - const Buf_size = 16; - /* size of bit buffer in bi_buf */ - - - /* =========================================================================== - * Constants - */ - - const MAX_BL_BITS = 7; - /* Bit length codes must not exceed MAX_BL_BITS bits */ - - const END_BLOCK = 256; - /* end of block literal code */ - - const REP_3_6 = 16; - /* repeat previous bit length 3-6 times (2 bits of repeat count) */ - - const REPZ_3_10 = 17; - /* repeat a zero length 3-10 times (3 bits of repeat count) */ - - const REPZ_11_138 = 18; - /* repeat a zero length 11-138 times (7 bits of repeat count) */ - - /* eslint-disable comma-spacing,array-bracket-spacing */ - const extra_lbits = /* extra bits for each length code */ - new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]); - - const extra_dbits = /* extra bits for each distance code */ - new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]); - - const extra_blbits = /* extra bits for each bit length code */ - new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]); - - const bl_order = - new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]); - /* eslint-enable comma-spacing,array-bracket-spacing */ - - /* The lengths of the bit length codes are sent in order of decreasing - * probability, to avoid transmitting the lengths for unused bit length codes. - */ - - /* =========================================================================== - * Local data. These are initialized only once. - */ - - // We pre-fill arrays with 0 to avoid uninitialized gaps - - const DIST_CODE_LEN = 512; /* see definition of array dist_code below */ - - // !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1 - const static_ltree = new Array((L_CODES$1 + 2) * 2); - zero$1(static_ltree); - /* The static literal tree. Since the bit lengths are imposed, there is no - * need for the L_CODES extra codes used during heap construction. However - * The codes 286 and 287 are needed to build a canonical tree (see _tr_init - * below). - */ - - const static_dtree = new Array(D_CODES$1 * 2); - zero$1(static_dtree); - /* The static distance tree. (Actually a trivial tree since all codes use - * 5 bits.) - */ - - const _dist_code = new Array(DIST_CODE_LEN); - zero$1(_dist_code); - /* Distance codes. The first 256 values correspond to the distances - * 3 .. 258, the last 256 values correspond to the top 8 bits of - * the 15 bit distances. - */ - - const _length_code = new Array(MAX_MATCH$1 - MIN_MATCH$1 + 1); - zero$1(_length_code); - /* length code for each normalized match length (0 == MIN_MATCH) */ - - const base_length = new Array(LENGTH_CODES$1); - zero$1(base_length); - /* First normalized length for each code (0 = MIN_MATCH) */ - - const base_dist = new Array(D_CODES$1); - zero$1(base_dist); - /* First normalized distance for each code (0 = distance of 1) */ - - - function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) { - - this.static_tree = static_tree; /* static tree or NULL */ - this.extra_bits = extra_bits; /* extra bits for each code or NULL */ - this.extra_base = extra_base; /* base index for extra_bits */ - this.elems = elems; /* max number of elements in the tree */ - this.max_length = max_length; /* max bit length for the codes */ - - // show if `static_tree` has data or dummy - needed for monomorphic objects - this.has_stree = static_tree && static_tree.length; - } - - - let static_l_desc; - let static_d_desc; - let static_bl_desc; - - - function TreeDesc(dyn_tree, stat_desc) { - this.dyn_tree = dyn_tree; /* the dynamic tree */ - this.max_code = 0; /* largest code with non zero frequency */ - this.stat_desc = stat_desc; /* the corresponding static tree */ - } - - - - const d_code = (dist) => { - - return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)]; - }; - - - /* =========================================================================== - * Output a short LSB first on the stream. - * IN assertion: there is enough room in pendingBuf. - */ - const put_short = (s, w) => { - // put_byte(s, (uch)((w) & 0xff)); - // put_byte(s, (uch)((ush)(w) >> 8)); - s.pending_buf[s.pending++] = (w) & 0xff; - s.pending_buf[s.pending++] = (w >>> 8) & 0xff; - }; - - - /* =========================================================================== - * Send a value on a given number of bits. - * IN assertion: length <= 16 and value fits in length bits. - */ - const send_bits = (s, value, length) => { - - if (s.bi_valid > (Buf_size - length)) { - s.bi_buf |= (value << s.bi_valid) & 0xffff; - put_short(s, s.bi_buf); - s.bi_buf = value >> (Buf_size - s.bi_valid); - s.bi_valid += length - Buf_size; - } else { - s.bi_buf |= (value << s.bi_valid) & 0xffff; - s.bi_valid += length; - } - }; - - - const send_code = (s, c, tree) => { - - send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/); - }; - - - /* =========================================================================== - * Reverse the first len bits of a code, using straightforward code (a faster - * method would use a table) - * IN assertion: 1 <= len <= 15 - */ - const bi_reverse = (code, len) => { - - let res = 0; - do { - res |= code & 1; - code >>>= 1; - res <<= 1; - } while (--len > 0); - return res >>> 1; - }; - - - /* =========================================================================== - * Flush the bit buffer, keeping at most 7 bits in it. - */ - const bi_flush = (s) => { - - if (s.bi_valid === 16) { - put_short(s, s.bi_buf); - s.bi_buf = 0; - s.bi_valid = 0; - - } else if (s.bi_valid >= 8) { - s.pending_buf[s.pending++] = s.bi_buf & 0xff; - s.bi_buf >>= 8; - s.bi_valid -= 8; - } - }; - - - /* =========================================================================== - * Compute the optimal bit lengths for a tree and update the total bit length - * for the current block. - * IN assertion: the fields freq and dad are set, heap[heap_max] and - * above are the tree nodes sorted by increasing frequency. - * OUT assertions: the field len is set to the optimal bit length, the - * array bl_count contains the frequencies for each bit length. - * The length opt_len is updated; static_len is also updated if stree is - * not null. - */ - const gen_bitlen = (s, desc) => { - // deflate_state *s; - // tree_desc *desc; /* the tree descriptor */ - - const tree = desc.dyn_tree; - const max_code = desc.max_code; - const stree = desc.stat_desc.static_tree; - const has_stree = desc.stat_desc.has_stree; - const extra = desc.stat_desc.extra_bits; - const base = desc.stat_desc.extra_base; - const max_length = desc.stat_desc.max_length; - let h; /* heap index */ - let n, m; /* iterate over the tree elements */ - let bits; /* bit length */ - let xbits; /* extra bits */ - let f; /* frequency */ - let overflow = 0; /* number of elements with bit length too large */ - - for (bits = 0; bits <= MAX_BITS$1; bits++) { - s.bl_count[bits] = 0; - } - - /* In a first pass, compute the optimal bit lengths (which may - * overflow in the case of the bit length tree). - */ - tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */ - - for (h = s.heap_max + 1; h < HEAP_SIZE$1; h++) { - n = s.heap[h]; - bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1; - if (bits > max_length) { - bits = max_length; - overflow++; - } - tree[n * 2 + 1]/*.Len*/ = bits; - /* We overwrite tree[n].Dad which is no longer needed */ - - if (n > max_code) { continue; } /* not a leaf node */ - - s.bl_count[bits]++; - xbits = 0; - if (n >= base) { - xbits = extra[n - base]; - } - f = tree[n * 2]/*.Freq*/; - s.opt_len += f * (bits + xbits); - if (has_stree) { - s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits); - } - } - if (overflow === 0) { return; } - - // Tracev((stderr,"\nbit length overflow\n")); - /* This happens for example on obj2 and pic of the Calgary corpus */ - - /* Find the first bit length which could increase: */ - do { - bits = max_length - 1; - while (s.bl_count[bits] === 0) { bits--; } - s.bl_count[bits]--; /* move one leaf down the tree */ - s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */ - s.bl_count[max_length]--; - /* The brother of the overflow item also moves one step up, - * but this does not affect bl_count[max_length] - */ - overflow -= 2; - } while (overflow > 0); - - /* Now recompute all bit lengths, scanning in increasing frequency. - * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all - * lengths instead of fixing only the wrong ones. This idea is taken - * from 'ar' written by Haruhiko Okumura.) - */ - for (bits = max_length; bits !== 0; bits--) { - n = s.bl_count[bits]; - while (n !== 0) { - m = s.heap[--h]; - if (m > max_code) { continue; } - if (tree[m * 2 + 1]/*.Len*/ !== bits) { - // Tracev((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); - s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/; - tree[m * 2 + 1]/*.Len*/ = bits; - } - n--; - } - } - }; - - - /* =========================================================================== - * Generate the codes for a given tree and bit counts (which need not be - * optimal). - * IN assertion: the array bl_count contains the bit length statistics for - * the given tree and the field len is set for all tree elements. - * OUT assertion: the field code is set for all tree elements of non - * zero code length. - */ - const gen_codes = (tree, max_code, bl_count) => { - // ct_data *tree; /* the tree to decorate */ - // int max_code; /* largest code with non zero frequency */ - // ushf *bl_count; /* number of codes at each bit length */ - - const next_code = new Array(MAX_BITS$1 + 1); /* next code value for each bit length */ - let code = 0; /* running code value */ - let bits; /* bit index */ - let n; /* code index */ - - /* The distribution counts are first used to generate the code values - * without bit reversal. - */ - for (bits = 1; bits <= MAX_BITS$1; bits++) { - code = (code + bl_count[bits - 1]) << 1; - next_code[bits] = code; - } - /* Check that the bit counts in bl_count are consistent. The last code - * must be all ones. - */ - //Assert (code + bl_count[MAX_BITS]-1 == (1< { - - let n; /* iterates over tree elements */ - let bits; /* bit counter */ - let length; /* length value */ - let code; /* code value */ - let dist; /* distance index */ - const bl_count = new Array(MAX_BITS$1 + 1); - /* number of codes at each bit length for an optimal tree */ - - // do check in _tr_init() - //if (static_init_done) return; - - /* For some embedded targets, global variables are not initialized: */ - /*#ifdef NO_INIT_GLOBAL_POINTERS - static_l_desc.static_tree = static_ltree; - static_l_desc.extra_bits = extra_lbits; - static_d_desc.static_tree = static_dtree; - static_d_desc.extra_bits = extra_dbits; - static_bl_desc.extra_bits = extra_blbits; - #endif*/ - - /* Initialize the mapping length (0..255) -> length code (0..28) */ - length = 0; - for (code = 0; code < LENGTH_CODES$1 - 1; code++) { - base_length[code] = length; - for (n = 0; n < (1 << extra_lbits[code]); n++) { - _length_code[length++] = code; - } - } - //Assert (length == 256, "tr_static_init: length != 256"); - /* Note that the length 255 (match length 258) can be represented - * in two different ways: code 284 + 5 bits or code 285, so we - * overwrite length_code[255] to use the best encoding: - */ - _length_code[length - 1] = code; - - /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ - dist = 0; - for (code = 0; code < 16; code++) { - base_dist[code] = dist; - for (n = 0; n < (1 << extra_dbits[code]); n++) { - _dist_code[dist++] = code; - } - } - //Assert (dist == 256, "tr_static_init: dist != 256"); - dist >>= 7; /* from now on, all distances are divided by 128 */ - for (; code < D_CODES$1; code++) { - base_dist[code] = dist << 7; - for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) { - _dist_code[256 + dist++] = code; - } - } - //Assert (dist == 256, "tr_static_init: 256+dist != 512"); - - /* Construct the codes of the static literal tree */ - for (bits = 0; bits <= MAX_BITS$1; bits++) { - bl_count[bits] = 0; - } - - n = 0; - while (n <= 143) { - static_ltree[n * 2 + 1]/*.Len*/ = 8; - n++; - bl_count[8]++; - } - while (n <= 255) { - static_ltree[n * 2 + 1]/*.Len*/ = 9; - n++; - bl_count[9]++; - } - while (n <= 279) { - static_ltree[n * 2 + 1]/*.Len*/ = 7; - n++; - bl_count[7]++; - } - while (n <= 287) { - static_ltree[n * 2 + 1]/*.Len*/ = 8; - n++; - bl_count[8]++; - } - /* Codes 286 and 287 do not exist, but we must include them in the - * tree construction to get a canonical Huffman tree (longest code - * all ones) - */ - gen_codes(static_ltree, L_CODES$1 + 1, bl_count); - - /* The static distance tree is trivial: */ - for (n = 0; n < D_CODES$1; n++) { - static_dtree[n * 2 + 1]/*.Len*/ = 5; - static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5); - } - - // Now data ready and we can init static trees - static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS$1 + 1, L_CODES$1, MAX_BITS$1); - static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES$1, MAX_BITS$1); - static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES$1, MAX_BL_BITS); - - //static_init_done = true; - }; - - - /* =========================================================================== - * Initialize a new block. - */ - const init_block = (s) => { - - let n; /* iterates over tree elements */ - - /* Initialize the trees. */ - for (n = 0; n < L_CODES$1; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; } - for (n = 0; n < D_CODES$1; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; } - for (n = 0; n < BL_CODES$1; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; } - - s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1; - s.opt_len = s.static_len = 0; - s.sym_next = s.matches = 0; - }; - - - /* =========================================================================== - * Flush the bit buffer and align the output on a byte boundary - */ - const bi_windup = (s) => - { - if (s.bi_valid > 8) { - put_short(s, s.bi_buf); - } else if (s.bi_valid > 0) { - //put_byte(s, (Byte)s->bi_buf); - s.pending_buf[s.pending++] = s.bi_buf; - } - s.bi_buf = 0; - s.bi_valid = 0; - }; - - /* =========================================================================== - * Compares to subtrees, using the tree depth as tie breaker when - * the subtrees have equal frequency. This minimizes the worst case length. - */ - const smaller = (tree, n, m, depth) => { - - const _n2 = n * 2; - const _m2 = m * 2; - return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ || - (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m])); - }; - - /* =========================================================================== - * Restore the heap property by moving down the tree starting at node k, - * exchanging a node with the smallest of its two sons if necessary, stopping - * when the heap property is re-established (each father smaller than its - * two sons). - */ - const pqdownheap = (s, tree, k) => { - // deflate_state *s; - // ct_data *tree; /* the tree to restore */ - // int k; /* node to move down */ - - const v = s.heap[k]; - let j = k << 1; /* left son of k */ - while (j <= s.heap_len) { - /* Set j to the smallest of the two sons: */ - if (j < s.heap_len && - smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) { - j++; - } - /* Exit if v is smaller than both sons */ - if (smaller(tree, v, s.heap[j], s.depth)) { break; } - - /* Exchange v with the smallest son */ - s.heap[k] = s.heap[j]; - k = j; - - /* And continue down the tree, setting j to the left son of k */ - j <<= 1; - } - s.heap[k] = v; - }; - - - // inlined manually - // const SMALLEST = 1; - - /* =========================================================================== - * Send the block data compressed using the given Huffman trees - */ - const compress_block = (s, ltree, dtree) => { - // deflate_state *s; - // const ct_data *ltree; /* literal tree */ - // const ct_data *dtree; /* distance tree */ - - let dist; /* distance of matched string */ - let lc; /* match length or unmatched char (if dist == 0) */ - let sx = 0; /* running index in sym_buf */ - let code; /* the code to send */ - let extra; /* number of extra bits to send */ - - if (s.sym_next !== 0) { - do { - dist = s.pending_buf[s.sym_buf + sx++] & 0xff; - dist += (s.pending_buf[s.sym_buf + sx++] & 0xff) << 8; - lc = s.pending_buf[s.sym_buf + sx++]; - if (dist === 0) { - send_code(s, lc, ltree); /* send a literal byte */ - //Tracecv(isgraph(lc), (stderr," '%c' ", lc)); - } else { - /* Here, lc is the match length - MIN_MATCH */ - code = _length_code[lc]; - send_code(s, code + LITERALS$1 + 1, ltree); /* send the length code */ - extra = extra_lbits[code]; - if (extra !== 0) { - lc -= base_length[code]; - send_bits(s, lc, extra); /* send the extra length bits */ - } - dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - //Assert (code < D_CODES, "bad d_code"); - - send_code(s, code, dtree); /* send the distance code */ - extra = extra_dbits[code]; - if (extra !== 0) { - dist -= base_dist[code]; - send_bits(s, dist, extra); /* send the extra distance bits */ - } - } /* literal or match pair ? */ - - /* Check that the overlay between pending_buf and sym_buf is ok: */ - //Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow"); - - } while (sx < s.sym_next); - } - - send_code(s, END_BLOCK, ltree); - }; - - - /* =========================================================================== - * Construct one Huffman tree and assigns the code bit strings and lengths. - * Update the total bit length for the current block. - * IN assertion: the field freq is set for all tree elements. - * OUT assertions: the fields len and code are set to the optimal bit length - * and corresponding code. The length opt_len is updated; static_len is - * also updated if stree is not null. The field max_code is set. - */ - const build_tree = (s, desc) => { - // deflate_state *s; - // tree_desc *desc; /* the tree descriptor */ - - const tree = desc.dyn_tree; - const stree = desc.stat_desc.static_tree; - const has_stree = desc.stat_desc.has_stree; - const elems = desc.stat_desc.elems; - let n, m; /* iterate over heap elements */ - let max_code = -1; /* largest code with non zero frequency */ - let node; /* new node being created */ - - /* Construct the initial heap, with least frequent element in - * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. - * heap[0] is not used. - */ - s.heap_len = 0; - s.heap_max = HEAP_SIZE$1; - - for (n = 0; n < elems; n++) { - if (tree[n * 2]/*.Freq*/ !== 0) { - s.heap[++s.heap_len] = max_code = n; - s.depth[n] = 0; - - } else { - tree[n * 2 + 1]/*.Len*/ = 0; - } - } - - /* The pkzip format requires that at least one distance code exists, - * and that at least one bit should be sent even if there is only one - * possible code. So to avoid special checks later on we force at least - * two codes of non zero frequency. - */ - while (s.heap_len < 2) { - node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0); - tree[node * 2]/*.Freq*/ = 1; - s.depth[node] = 0; - s.opt_len--; - - if (has_stree) { - s.static_len -= stree[node * 2 + 1]/*.Len*/; - } - /* node is 0 or 1 so it does not have extra bits */ - } - desc.max_code = max_code; - - /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, - * establish sub-heaps of increasing lengths: - */ - for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); } - - /* Construct the Huffman tree by repeatedly combining the least two - * frequent nodes. - */ - node = elems; /* next internal node of the tree */ - do { - //pqremove(s, tree, n); /* n = node of least frequency */ - /*** pqremove ***/ - n = s.heap[1/*SMALLEST*/]; - s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--]; - pqdownheap(s, tree, 1/*SMALLEST*/); - /***/ - - m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */ - - s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */ - s.heap[--s.heap_max] = m; - - /* Create a new node father of n and m */ - tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/; - s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1; - tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node; - - /* and insert the new node in the heap */ - s.heap[1/*SMALLEST*/] = node++; - pqdownheap(s, tree, 1/*SMALLEST*/); - - } while (s.heap_len >= 2); - - s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/]; - - /* At this point, the fields freq and dad are set. We can now - * generate the bit lengths. - */ - gen_bitlen(s, desc); - - /* The field len is now set, we can generate the bit codes */ - gen_codes(tree, max_code, s.bl_count); - }; - - - /* =========================================================================== - * Scan a literal or distance tree to determine the frequencies of the codes - * in the bit length tree. - */ - const scan_tree = (s, tree, max_code) => { - // deflate_state *s; - // ct_data *tree; /* the tree to be scanned */ - // int max_code; /* and its largest code of non zero frequency */ - - let n; /* iterates over all tree elements */ - let prevlen = -1; /* last emitted length */ - let curlen; /* length of current code */ - - let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ - - let count = 0; /* repeat count of the current code */ - let max_count = 7; /* max repeat count */ - let min_count = 4; /* min repeat count */ - - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } - tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */ - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; - - if (++count < max_count && curlen === nextlen) { - continue; - - } else if (count < min_count) { - s.bl_tree[curlen * 2]/*.Freq*/ += count; - - } else if (curlen !== 0) { - - if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; } - s.bl_tree[REP_3_6 * 2]/*.Freq*/++; - - } else if (count <= 10) { - s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++; - - } else { - s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++; - } - - count = 0; - prevlen = curlen; - - if (nextlen === 0) { - max_count = 138; - min_count = 3; - - } else if (curlen === nextlen) { - max_count = 6; - min_count = 3; - - } else { - max_count = 7; - min_count = 4; - } - } - }; - - - /* =========================================================================== - * Send a literal or distance tree in compressed form, using the codes in - * bl_tree. - */ - const send_tree = (s, tree, max_code) => { - // deflate_state *s; - // ct_data *tree; /* the tree to be scanned */ - // int max_code; /* and its largest code of non zero frequency */ - - let n; /* iterates over all tree elements */ - let prevlen = -1; /* last emitted length */ - let curlen; /* length of current code */ - - let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ - - let count = 0; /* repeat count of the current code */ - let max_count = 7; /* max repeat count */ - let min_count = 4; /* min repeat count */ - - /* tree[max_code+1].Len = -1; */ /* guard already set */ - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; - - if (++count < max_count && curlen === nextlen) { - continue; - - } else if (count < min_count) { - do { send_code(s, curlen, s.bl_tree); } while (--count !== 0); - - } else if (curlen !== 0) { - if (curlen !== prevlen) { - send_code(s, curlen, s.bl_tree); - count--; - } - //Assert(count >= 3 && count <= 6, " 3_6?"); - send_code(s, REP_3_6, s.bl_tree); - send_bits(s, count - 3, 2); - - } else if (count <= 10) { - send_code(s, REPZ_3_10, s.bl_tree); - send_bits(s, count - 3, 3); - - } else { - send_code(s, REPZ_11_138, s.bl_tree); - send_bits(s, count - 11, 7); - } - - count = 0; - prevlen = curlen; - if (nextlen === 0) { - max_count = 138; - min_count = 3; - - } else if (curlen === nextlen) { - max_count = 6; - min_count = 3; - - } else { - max_count = 7; - min_count = 4; - } - } - }; - - - /* =========================================================================== - * Construct the Huffman tree for the bit lengths and return the index in - * bl_order of the last bit length code to send. - */ - const build_bl_tree = (s) => { - - let max_blindex; /* index of last bit length code of non zero freq */ - - /* Determine the bit length frequencies for literal and distance trees */ - scan_tree(s, s.dyn_ltree, s.l_desc.max_code); - scan_tree(s, s.dyn_dtree, s.d_desc.max_code); - - /* Build the bit length tree: */ - build_tree(s, s.bl_desc); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - */ - - /* Determine the number of bit length codes to send. The pkzip format - * requires that at least 4 bit length codes be sent. (appnote.txt says - * 3 but the actual value used is 4.) - */ - for (max_blindex = BL_CODES$1 - 1; max_blindex >= 3; max_blindex--) { - if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) { - break; - } - } - /* Update opt_len to include the bit length tree and counts */ - s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; - //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", - // s->opt_len, s->static_len)); - - return max_blindex; - }; - - - /* =========================================================================== - * Send the header for a block using dynamic Huffman trees: the counts, the - * lengths of the bit length codes, the literal tree and the distance tree. - * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. - */ - const send_all_trees = (s, lcodes, dcodes, blcodes) => { - // deflate_state *s; - // int lcodes, dcodes, blcodes; /* number of codes for each tree */ - - let rank; /* index in bl_order */ - - //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); - //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, - // "too many codes"); - //Tracev((stderr, "\nbl counts: ")); - send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ - send_bits(s, dcodes - 1, 5); - send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ - for (rank = 0; rank < blcodes; rank++) { - //Tracev((stderr, "\nbl code %2d ", bl_order[rank])); - send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3); - } - //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); - - send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */ - //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); - - send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */ - //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); - }; - - - /* =========================================================================== - * Check if the data type is TEXT or BINARY, using the following algorithm: - * - TEXT if the two conditions below are satisfied: - * a) There are no non-portable control characters belonging to the - * "block list" (0..6, 14..25, 28..31). - * b) There is at least one printable character belonging to the - * "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). - * - BINARY otherwise. - * - The following partially-portable control characters form a - * "gray list" that is ignored in this detection algorithm: - * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). - * IN assertion: the fields Freq of dyn_ltree are set. - */ - const detect_data_type = (s) => { - /* block_mask is the bit mask of block-listed bytes - * set bits 0..6, 14..25, and 28..31 - * 0xf3ffc07f = binary 11110011111111111100000001111111 - */ - let block_mask = 0xf3ffc07f; - let n; - - /* Check for non-textual ("block-listed") bytes. */ - for (n = 0; n <= 31; n++, block_mask >>>= 1) { - if ((block_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) { - return Z_BINARY; - } - } - - /* Check for textual ("allow-listed") bytes. */ - if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 || - s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) { - return Z_TEXT; - } - for (n = 32; n < LITERALS$1; n++) { - if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) { - return Z_TEXT; - } - } - - /* There are no "block-listed" or "allow-listed" bytes: - * this stream either is empty or has tolerated ("gray-listed") bytes only. - */ - return Z_BINARY; - }; - - - let static_init_done = false; - - /* =========================================================================== - * Initialize the tree data structures for a new zlib stream. - */ - const _tr_init$1 = (s) => - { - - if (!static_init_done) { - tr_static_init(); - static_init_done = true; - } - - s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc); - s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc); - s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc); - - s.bi_buf = 0; - s.bi_valid = 0; - - /* Initialize the first block of the first file: */ - init_block(s); - }; - - - /* =========================================================================== - * Send a stored block - */ - const _tr_stored_block$1 = (s, buf, stored_len, last) => { - //DeflateState *s; - //charf *buf; /* input block */ - //ulg stored_len; /* length of input block */ - //int last; /* one if this is the last block for a file */ - - send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */ - bi_windup(s); /* align on byte boundary */ - put_short(s, stored_len); - put_short(s, ~stored_len); - if (stored_len) { - s.pending_buf.set(s.window.subarray(buf, buf + stored_len), s.pending); - } - s.pending += stored_len; - }; - - - /* =========================================================================== - * Send one empty static block to give enough lookahead for inflate. - * This takes 10 bits, of which 7 may remain in the bit buffer. - */ - const _tr_align$1 = (s) => { - send_bits(s, STATIC_TREES << 1, 3); - send_code(s, END_BLOCK, static_ltree); - bi_flush(s); - }; - - - /* =========================================================================== - * Determine the best encoding for the current block: dynamic trees, static - * trees or store, and write out the encoded block. - */ - const _tr_flush_block$1 = (s, buf, stored_len, last) => { - //DeflateState *s; - //charf *buf; /* input block, or NULL if too old */ - //ulg stored_len; /* length of input block */ - //int last; /* one if this is the last block for a file */ - - let opt_lenb, static_lenb; /* opt_len and static_len in bytes */ - let max_blindex = 0; /* index of last bit length code of non zero freq */ - - /* Build the Huffman trees unless a stored block is forced */ - if (s.level > 0) { - - /* Check if the file is binary or text */ - if (s.strm.data_type === Z_UNKNOWN$1) { - s.strm.data_type = detect_data_type(s); - } - - /* Construct the literal and distance trees */ - build_tree(s, s.l_desc); - // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, - // s->static_len)); - - build_tree(s, s.d_desc); - // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, - // s->static_len)); - /* At this point, opt_len and static_len are the total bit lengths of - * the compressed block data, excluding the tree representations. - */ - - /* Build the bit length tree for the above two trees, and get the index - * in bl_order of the last bit length code to send. - */ - max_blindex = build_bl_tree(s); - - /* Determine the best encoding. Compute the block lengths in bytes. */ - opt_lenb = (s.opt_len + 3 + 7) >>> 3; - static_lenb = (s.static_len + 3 + 7) >>> 3; - - // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", - // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, - // s->sym_next / 3)); - - if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; } - - } else { - // Assert(buf != (char*)0, "lost buf"); - opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ - } - - if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) { - /* 4: two words for the lengths */ - - /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - * Otherwise we can't have processed more than WSIZE input bytes since - * the last block flush, because compression would have been - * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to - * transform a block into a stored block. - */ - _tr_stored_block$1(s, buf, stored_len, last); - - } else if (s.strategy === Z_FIXED$1 || static_lenb === opt_lenb) { - - send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3); - compress_block(s, static_ltree, static_dtree); - - } else { - send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3); - send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1); - compress_block(s, s.dyn_ltree, s.dyn_dtree); - } - // Assert (s->compressed_len == s->bits_sent, "bad compressed size"); - /* The above check is made mod 2^32, for files larger than 512 MB - * and uLong implemented on 32 bits. - */ - init_block(s); - - if (last) { - bi_windup(s); - } - // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, - // s->compressed_len-7*last)); - }; - - /* =========================================================================== - * Save the match info and tally the frequency counts. Return true if - * the current block must be flushed. - */ - const _tr_tally$1 = (s, dist, lc) => { - // deflate_state *s; - // unsigned dist; /* distance of matched string */ - // unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ - - s.pending_buf[s.sym_buf + s.sym_next++] = dist; - s.pending_buf[s.sym_buf + s.sym_next++] = dist >> 8; - s.pending_buf[s.sym_buf + s.sym_next++] = lc; - if (dist === 0) { - /* lc is the unmatched char */ - s.dyn_ltree[lc * 2]/*.Freq*/++; - } else { - s.matches++; - /* Here, lc is the match length - MIN_MATCH */ - dist--; /* dist = match distance - 1 */ - //Assert((ush)dist < (ush)MAX_DIST(s) && - // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && - // (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); - - s.dyn_ltree[(_length_code[lc] + LITERALS$1 + 1) * 2]/*.Freq*/++; - s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++; - } - - return (s.sym_next === s.sym_end); - }; - - var _tr_init_1 = _tr_init$1; - var _tr_stored_block_1 = _tr_stored_block$1; - var _tr_flush_block_1 = _tr_flush_block$1; - var _tr_tally_1 = _tr_tally$1; - var _tr_align_1 = _tr_align$1; - - var trees = { - _tr_init: _tr_init_1, - _tr_stored_block: _tr_stored_block_1, - _tr_flush_block: _tr_flush_block_1, - _tr_tally: _tr_tally_1, - _tr_align: _tr_align_1 - }; - - // Note: adler32 takes 12% for level 0 and 2% for level 6. - // It isn't worth it to make additional optimizations as in original. - // Small size is preferable. - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - const adler32 = (adler, buf, len, pos) => { - let s1 = (adler & 0xffff) |0, - s2 = ((adler >>> 16) & 0xffff) |0, - n = 0; - - while (len !== 0) { - // Set limit ~ twice less than 5552, to keep - // s2 in 31-bits, because we force signed ints. - // in other case %= will fail. - n = len > 2000 ? 2000 : len; - len -= n; - - do { - s1 = (s1 + buf[pos++]) |0; - s2 = (s2 + s1) |0; - } while (--n); - - s1 %= 65521; - s2 %= 65521; - } - - return (s1 | (s2 << 16)) |0; - }; - - - var adler32_1 = adler32; - - // Note: we can't get significant speed boost here. - // So write code to minimize size - no pregenerated tables - // and array tools dependencies. - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - // Use ordinary array, since untyped makes no boost here - const makeTable = () => { - let c, table = []; - - for (var n = 0; n < 256; n++) { - c = n; - for (var k = 0; k < 8; k++) { - c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); - } - table[n] = c; - } - - return table; - }; - - // Create table on load. Just 255 signed longs. Not a problem. - const crcTable = new Uint32Array(makeTable()); - - - const crc32 = (crc, buf, len, pos) => { - const t = crcTable; - const end = pos + len; - - crc ^= -1; - - for (let i = pos; i < end; i++) { - crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF]; - } - - return (crc ^ (-1)); // >>> 0; - }; - - - var crc32_1 = crc32; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - var messages = { - 2: 'need dictionary', /* Z_NEED_DICT 2 */ - 1: 'stream end', /* Z_STREAM_END 1 */ - 0: '', /* Z_OK 0 */ - '-1': 'file error', /* Z_ERRNO (-1) */ - '-2': 'stream error', /* Z_STREAM_ERROR (-2) */ - '-3': 'data error', /* Z_DATA_ERROR (-3) */ - '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */ - '-5': 'buffer error', /* Z_BUF_ERROR (-5) */ - '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ - }; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - var constants$1 = { - - /* Allowed flush values; see deflate() and inflate() below for details */ - Z_NO_FLUSH: 0, - Z_PARTIAL_FLUSH: 1, - Z_SYNC_FLUSH: 2, - Z_FULL_FLUSH: 3, - Z_FINISH: 4, - Z_BLOCK: 5, - Z_TREES: 6, - - /* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ - Z_OK: 0, - Z_STREAM_END: 1, - Z_NEED_DICT: 2, - Z_ERRNO: -1, - Z_STREAM_ERROR: -2, - Z_DATA_ERROR: -3, - Z_MEM_ERROR: -4, - Z_BUF_ERROR: -5, - //Z_VERSION_ERROR: -6, - - /* compression levels */ - Z_NO_COMPRESSION: 0, - Z_BEST_SPEED: 1, - Z_BEST_COMPRESSION: 9, - Z_DEFAULT_COMPRESSION: -1, - - - Z_FILTERED: 1, - Z_HUFFMAN_ONLY: 2, - Z_RLE: 3, - Z_FIXED: 4, - Z_DEFAULT_STRATEGY: 0, - - /* Possible values of the data_type field (though see inflate()) */ - Z_BINARY: 0, - Z_TEXT: 1, - //Z_ASCII: 1, // = Z_TEXT (deprecated) - Z_UNKNOWN: 2, - - /* The deflate compression method */ - Z_DEFLATED: 8 - //Z_NULL: null // Use -1 or null inline, depending on var type - }; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - const { _tr_init, _tr_stored_block, _tr_flush_block, _tr_tally, _tr_align } = trees; - - - - - /* Public constants ==========================================================*/ - /* ===========================================================================*/ - - const { - Z_NO_FLUSH: Z_NO_FLUSH$1, Z_PARTIAL_FLUSH, Z_FULL_FLUSH: Z_FULL_FLUSH$1, Z_FINISH: Z_FINISH$1, Z_BLOCK, - Z_OK: Z_OK$1, Z_STREAM_END: Z_STREAM_END$1, Z_STREAM_ERROR, Z_DATA_ERROR, Z_BUF_ERROR, - Z_DEFAULT_COMPRESSION: Z_DEFAULT_COMPRESSION$1, - Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE, Z_FIXED, Z_DEFAULT_STRATEGY: Z_DEFAULT_STRATEGY$1, - Z_UNKNOWN, - Z_DEFLATED: Z_DEFLATED$1 - } = constants$1; - - /*============================================================================*/ - - - const MAX_MEM_LEVEL = 9; - /* Maximum value for memLevel in deflateInit2 */ - const MAX_WBITS = 15; - /* 32K LZ77 window */ - const DEF_MEM_LEVEL = 8; - - - const LENGTH_CODES = 29; - /* number of length codes, not counting the special END_BLOCK code */ - const LITERALS = 256; - /* number of literal bytes 0..255 */ - const L_CODES = LITERALS + 1 + LENGTH_CODES; - /* number of Literal or Length codes, including the END_BLOCK code */ - const D_CODES = 30; - /* number of distance codes */ - const BL_CODES = 19; - /* number of codes used to transfer the bit lengths */ - const HEAP_SIZE = 2 * L_CODES + 1; - /* maximum heap size */ - const MAX_BITS = 15; - /* All codes must not exceed MAX_BITS bits */ - - const MIN_MATCH = 3; - const MAX_MATCH = 258; - const MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1); - - const PRESET_DICT = 0x20; - - const INIT_STATE = 42; /* zlib header -> BUSY_STATE */ - //#ifdef GZIP - const GZIP_STATE = 57; /* gzip header -> BUSY_STATE | EXTRA_STATE */ - //#endif - const EXTRA_STATE = 69; /* gzip extra block -> NAME_STATE */ - const NAME_STATE = 73; /* gzip file name -> COMMENT_STATE */ - const COMMENT_STATE = 91; /* gzip comment -> HCRC_STATE */ - const HCRC_STATE = 103; /* gzip header CRC -> BUSY_STATE */ - const BUSY_STATE = 113; /* deflate -> FINISH_STATE */ - const FINISH_STATE = 666; /* stream complete */ - - const BS_NEED_MORE = 1; /* block not completed, need more input or more output */ - const BS_BLOCK_DONE = 2; /* block flush performed */ - const BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */ - const BS_FINISH_DONE = 4; /* finish done, accept no more input or output */ - - const OS_CODE = 0x03; // Unix :) . Don't detect, use this default. - - const err = (strm, errorCode) => { - strm.msg = messages[errorCode]; - return errorCode; - }; - - const rank = (f) => { - return ((f) * 2) - ((f) > 4 ? 9 : 0); - }; - - const zero = (buf) => { - let len = buf.length; while (--len >= 0) { buf[len] = 0; } - }; - - /* =========================================================================== - * Slide the hash table when sliding the window down (could be avoided with 32 - * bit values at the expense of memory usage). We slide even when level == 0 to - * keep the hash table consistent if we switch back to level > 0 later. - */ - const slide_hash = (s) => { - let n, m; - let p; - let wsize = s.w_size; - - n = s.hash_size; - p = n; - do { - m = s.head[--p]; - s.head[p] = (m >= wsize ? m - wsize : 0); - } while (--n); - n = wsize; - //#ifndef FASTEST - p = n; - do { - m = s.prev[--p]; - s.prev[p] = (m >= wsize ? m - wsize : 0); - /* If n is not on any hash chain, prev[n] is garbage but - * its value will never be used. - */ - } while (--n); - //#endif - }; - - /* eslint-disable new-cap */ - let HASH_ZLIB = (s, prev, data) => ((prev << s.hash_shift) ^ data) & s.hash_mask; - // This hash causes less collisions, https://github.com/nodeca/pako/issues/135 - // But breaks binary compatibility - //let HASH_FAST = (s, prev, data) => ((prev << 8) + (prev >> 8) + (data << 4)) & s.hash_mask; - let HASH = HASH_ZLIB; - - - /* ========================================================================= - * Flush as much pending output as possible. All deflate() output, except for - * some deflate_stored() output, goes through this function so some - * applications may wish to modify it to avoid allocating a large - * strm->next_out buffer and copying into it. (See also read_buf()). - */ - const flush_pending = (strm) => { - const s = strm.state; - - //_tr_flush_bits(s); - let len = s.pending; - if (len > strm.avail_out) { - len = strm.avail_out; - } - if (len === 0) { return; } - - strm.output.set(s.pending_buf.subarray(s.pending_out, s.pending_out + len), strm.next_out); - strm.next_out += len; - s.pending_out += len; - strm.total_out += len; - strm.avail_out -= len; - s.pending -= len; - if (s.pending === 0) { - s.pending_out = 0; - } - }; - - - const flush_block_only = (s, last) => { - _tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last); - s.block_start = s.strstart; - flush_pending(s.strm); - }; - - - const put_byte = (s, b) => { - s.pending_buf[s.pending++] = b; - }; - - - /* ========================================================================= - * Put a short in the pending buffer. The 16-bit value is put in MSB order. - * IN assertion: the stream state is correct and there is enough room in - * pending_buf. - */ - const putShortMSB = (s, b) => { - - // put_byte(s, (Byte)(b >> 8)); - // put_byte(s, (Byte)(b & 0xff)); - s.pending_buf[s.pending++] = (b >>> 8) & 0xff; - s.pending_buf[s.pending++] = b & 0xff; - }; - - - /* =========================================================================== - * Read a new buffer from the current input stream, update the adler32 - * and total number of bytes read. All deflate() input goes through - * this function so some applications may wish to modify it to avoid - * allocating a large strm->input buffer and copying from it. - * (See also flush_pending()). - */ - const read_buf = (strm, buf, start, size) => { - - let len = strm.avail_in; - - if (len > size) { len = size; } - if (len === 0) { return 0; } - - strm.avail_in -= len; - - // zmemcpy(buf, strm->next_in, len); - buf.set(strm.input.subarray(strm.next_in, strm.next_in + len), start); - if (strm.state.wrap === 1) { - strm.adler = adler32_1(strm.adler, buf, len, start); - } - - else if (strm.state.wrap === 2) { - strm.adler = crc32_1(strm.adler, buf, len, start); - } - - strm.next_in += len; - strm.total_in += len; - - return len; - }; - - - /* =========================================================================== - * Set match_start to the longest match starting at the given string and - * return its length. Matches shorter or equal to prev_length are discarded, - * in which case the result is equal to prev_length and match_start is - * garbage. - * IN assertions: cur_match is the head of the hash chain for the current - * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 - * OUT assertion: the match length is not greater than s->lookahead. - */ - const longest_match = (s, cur_match) => { - - let chain_length = s.max_chain_length; /* max hash chain length */ - let scan = s.strstart; /* current string */ - let match; /* matched string */ - let len; /* length of current match */ - let best_len = s.prev_length; /* best match length so far */ - let nice_match = s.nice_match; /* stop if match long enough */ - const limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ? - s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/; - - const _win = s.window; // shortcut - - const wmask = s.w_mask; - const prev = s.prev; - - /* Stop when cur_match becomes <= limit. To simplify the code, - * we prevent matches with the string of window index 0. - */ - - const strend = s.strstart + MAX_MATCH; - let scan_end1 = _win[scan + best_len - 1]; - let scan_end = _win[scan + best_len]; - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - /* Do not waste too much time if we already have a good match: */ - if (s.prev_length >= s.good_match) { - chain_length >>= 2; - } - /* Do not look for matches beyond the end of the input. This is necessary - * to make deflate deterministic. - */ - if (nice_match > s.lookahead) { nice_match = s.lookahead; } - - // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); - - do { - // Assert(cur_match < s->strstart, "no future"); - match = cur_match; - - /* Skip to next match if the match length cannot increase - * or if the match length is less than 2. Note that the checks below - * for insufficient lookahead only occur occasionally for performance - * reasons. Therefore uninitialized memory will be accessed, and - * conditional jumps will be made that depend on those values. - * However the length of the match is limited to the lookahead, so - * the output of deflate is not affected by the uninitialized values. - */ - - if (_win[match + best_len] !== scan_end || - _win[match + best_len - 1] !== scan_end1 || - _win[match] !== _win[scan] || - _win[++match] !== _win[scan + 1]) { - continue; - } - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2; - match++; - // Assert(*scan == *match, "match[2]?"); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - /*jshint noempty:false*/ - } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && - _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && - _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && - _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && - scan < strend); - - // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - - len = MAX_MATCH - (strend - scan); - scan = strend - MAX_MATCH; - - if (len > best_len) { - s.match_start = cur_match; - best_len = len; - if (len >= nice_match) { - break; - } - scan_end1 = _win[scan + best_len - 1]; - scan_end = _win[scan + best_len]; - } - } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0); - - if (best_len <= s.lookahead) { - return best_len; - } - return s.lookahead; - }; - - - /* =========================================================================== - * Fill the window when the lookahead becomes insufficient. - * Updates strstart and lookahead. - * - * IN assertion: lookahead < MIN_LOOKAHEAD - * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD - * At least one byte has been read, or avail_in == 0; reads are - * performed for at least two bytes (required for the zip translate_eol - * option -- not supported here). - */ - const fill_window = (s) => { - - const _w_size = s.w_size; - let n, more, str; - - //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); - - do { - more = s.window_size - s.lookahead - s.strstart; - - // JS ints have 32 bit, block below not needed - /* Deal with !@#$% 64K limit: */ - //if (sizeof(int) <= 2) { - // if (more == 0 && s->strstart == 0 && s->lookahead == 0) { - // more = wsize; - // - // } else if (more == (unsigned)(-1)) { - // /* Very unlikely, but possible on 16 bit machine if - // * strstart == 0 && lookahead == 1 (input done a byte at time) - // */ - // more--; - // } - //} - - - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) { - - s.window.set(s.window.subarray(_w_size, _w_size + _w_size - more), 0); - s.match_start -= _w_size; - s.strstart -= _w_size; - /* we now have strstart >= MAX_DIST */ - s.block_start -= _w_size; - if (s.insert > s.strstart) { - s.insert = s.strstart; - } - slide_hash(s); - more += _w_size; - } - if (s.strm.avail_in === 0) { - break; - } - - /* If there was no sliding: - * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - * more == window_size - lookahead - strstart - * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - * => more >= window_size - 2*WSIZE + 2 - * In the BIG_MEM or MMAP case (not yet supported), - * window_size == input_size + MIN_LOOKAHEAD && - * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - * Otherwise, window_size == 2*WSIZE so more >= 2. - * If there was sliding, more >= WSIZE. So in all cases, more >= 2. - */ - //Assert(more >= 2, "more < 2"); - n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more); - s.lookahead += n; - - /* Initialize the hash value now that we have some input: */ - if (s.lookahead + s.insert >= MIN_MATCH) { - str = s.strstart - s.insert; - s.ins_h = s.window[str]; - - /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */ - s.ins_h = HASH(s, s.ins_h, s.window[str + 1]); - //#if MIN_MATCH != 3 - // Call update_hash() MIN_MATCH-3 more times - //#endif - while (s.insert) { - /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ - s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]); - - s.prev[str & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = str; - str++; - s.insert--; - if (s.lookahead + s.insert < MIN_MATCH) { - break; - } - } - } - /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - * but this is not important since only literal bytes will be emitted. - */ - - } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0); - - /* If the WIN_INIT bytes after the end of the current data have never been - * written, then zero those bytes in order to avoid memory check reports of - * the use of uninitialized (or uninitialised as Julian writes) bytes by - * the longest match routines. Update the high water mark for the next - * time through here. WIN_INIT is set to MAX_MATCH since the longest match - * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. - */ - // if (s.high_water < s.window_size) { - // const curr = s.strstart + s.lookahead; - // let init = 0; - // - // if (s.high_water < curr) { - // /* Previous high water mark below current data -- zero WIN_INIT - // * bytes or up to end of window, whichever is less. - // */ - // init = s.window_size - curr; - // if (init > WIN_INIT) - // init = WIN_INIT; - // zmemzero(s->window + curr, (unsigned)init); - // s->high_water = curr + init; - // } - // else if (s->high_water < (ulg)curr + WIN_INIT) { - // /* High water mark at or above current data, but below current data - // * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up - // * to end of window, whichever is less. - // */ - // init = (ulg)curr + WIN_INIT - s->high_water; - // if (init > s->window_size - s->high_water) - // init = s->window_size - s->high_water; - // zmemzero(s->window + s->high_water, (unsigned)init); - // s->high_water += init; - // } - // } - // - // Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, - // "not enough room for search"); - }; - - /* =========================================================================== - * Copy without compression as much as possible from the input stream, return - * the current block state. - * - * In case deflateParams() is used to later switch to a non-zero compression - * level, s->matches (otherwise unused when storing) keeps track of the number - * of hash table slides to perform. If s->matches is 1, then one hash table - * slide will be done when switching. If s->matches is 2, the maximum value - * allowed here, then the hash table will be cleared, since two or more slides - * is the same as a clear. - * - * deflate_stored() is written to minimize the number of times an input byte is - * copied. It is most efficient with large input and output buffers, which - * maximizes the opportunites to have a single copy from next_in to next_out. - */ - const deflate_stored = (s, flush) => { - - /* Smallest worthy block size when not flushing or finishing. By default - * this is 32K. This can be as small as 507 bytes for memLevel == 1. For - * large input and output buffers, the stored block size will be larger. - */ - let min_block = s.pending_buf_size - 5 > s.w_size ? s.w_size : s.pending_buf_size - 5; - - /* Copy as many min_block or larger stored blocks directly to next_out as - * possible. If flushing, copy the remaining available input to next_out as - * stored blocks, if there is enough space. - */ - let len, left, have, last = 0; - let used = s.strm.avail_in; - do { - /* Set len to the maximum size block that we can copy directly with the - * available input data and output space. Set left to how much of that - * would be copied from what's left in the window. - */ - len = 65535/* MAX_STORED */; /* maximum deflate stored block length */ - have = (s.bi_valid + 42) >> 3; /* number of header bytes */ - if (s.strm.avail_out < have) { /* need room for header */ - break; - } - /* maximum stored block length that will fit in avail_out: */ - have = s.strm.avail_out - have; - left = s.strstart - s.block_start; /* bytes left in window */ - if (len > left + s.strm.avail_in) { - len = left + s.strm.avail_in; /* limit len to the input */ - } - if (len > have) { - len = have; /* limit len to the output */ - } - - /* If the stored block would be less than min_block in length, or if - * unable to copy all of the available input when flushing, then try - * copying to the window and the pending buffer instead. Also don't - * write an empty block when flushing -- deflate() does that. - */ - if (len < min_block && ((len === 0 && flush !== Z_FINISH$1) || - flush === Z_NO_FLUSH$1 || - len !== left + s.strm.avail_in)) { - break; - } - - /* Make a dummy stored block in pending to get the header bytes, - * including any pending bits. This also updates the debugging counts. - */ - last = flush === Z_FINISH$1 && len === left + s.strm.avail_in ? 1 : 0; - _tr_stored_block(s, 0, 0, last); - - /* Replace the lengths in the dummy stored block with len. */ - s.pending_buf[s.pending - 4] = len; - s.pending_buf[s.pending - 3] = len >> 8; - s.pending_buf[s.pending - 2] = ~len; - s.pending_buf[s.pending - 1] = ~len >> 8; - - /* Write the stored block header bytes. */ - flush_pending(s.strm); - - //#ifdef ZLIB_DEBUG - // /* Update debugging counts for the data about to be copied. */ - // s->compressed_len += len << 3; - // s->bits_sent += len << 3; - //#endif - - /* Copy uncompressed bytes from the window to next_out. */ - if (left) { - if (left > len) { - left = len; - } - //zmemcpy(s->strm->next_out, s->window + s->block_start, left); - s.strm.output.set(s.window.subarray(s.block_start, s.block_start + left), s.strm.next_out); - s.strm.next_out += left; - s.strm.avail_out -= left; - s.strm.total_out += left; - s.block_start += left; - len -= left; - } - - /* Copy uncompressed bytes directly from next_in to next_out, updating - * the check value. - */ - if (len) { - read_buf(s.strm, s.strm.output, s.strm.next_out, len); - s.strm.next_out += len; - s.strm.avail_out -= len; - s.strm.total_out += len; - } - } while (last === 0); - - /* Update the sliding window with the last s->w_size bytes of the copied - * data, or append all of the copied data to the existing window if less - * than s->w_size bytes were copied. Also update the number of bytes to - * insert in the hash tables, in the event that deflateParams() switches to - * a non-zero compression level. - */ - used -= s.strm.avail_in; /* number of input bytes directly copied */ - if (used) { - /* If any input was used, then no unused input remains in the window, - * therefore s->block_start == s->strstart. - */ - if (used >= s.w_size) { /* supplant the previous history */ - s.matches = 2; /* clear hash */ - //zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size); - s.window.set(s.strm.input.subarray(s.strm.next_in - s.w_size, s.strm.next_in), 0); - s.strstart = s.w_size; - s.insert = s.strstart; - } - else { - if (s.window_size - s.strstart <= used) { - /* Slide the window down. */ - s.strstart -= s.w_size; - //zmemcpy(s->window, s->window + s->w_size, s->strstart); - s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0); - if (s.matches < 2) { - s.matches++; /* add a pending slide_hash() */ - } - if (s.insert > s.strstart) { - s.insert = s.strstart; - } - } - //zmemcpy(s->window + s->strstart, s->strm->next_in - used, used); - s.window.set(s.strm.input.subarray(s.strm.next_in - used, s.strm.next_in), s.strstart); - s.strstart += used; - s.insert += used > s.w_size - s.insert ? s.w_size - s.insert : used; - } - s.block_start = s.strstart; - } - if (s.high_water < s.strstart) { - s.high_water = s.strstart; - } - - /* If the last block was written to next_out, then done. */ - if (last) { - return BS_FINISH_DONE; - } - - /* If flushing and all input has been consumed, then done. */ - if (flush !== Z_NO_FLUSH$1 && flush !== Z_FINISH$1 && - s.strm.avail_in === 0 && s.strstart === s.block_start) { - return BS_BLOCK_DONE; - } - - /* Fill the window with any remaining input. */ - have = s.window_size - s.strstart; - if (s.strm.avail_in > have && s.block_start >= s.w_size) { - /* Slide the window down. */ - s.block_start -= s.w_size; - s.strstart -= s.w_size; - //zmemcpy(s->window, s->window + s->w_size, s->strstart); - s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0); - if (s.matches < 2) { - s.matches++; /* add a pending slide_hash() */ - } - have += s.w_size; /* more space now */ - if (s.insert > s.strstart) { - s.insert = s.strstart; - } - } - if (have > s.strm.avail_in) { - have = s.strm.avail_in; - } - if (have) { - read_buf(s.strm, s.window, s.strstart, have); - s.strstart += have; - s.insert += have > s.w_size - s.insert ? s.w_size - s.insert : have; - } - if (s.high_water < s.strstart) { - s.high_water = s.strstart; - } - - /* There was not enough avail_out to write a complete worthy or flushed - * stored block to next_out. Write a stored block to pending instead, if we - * have enough input for a worthy block, or if flushing and there is enough - * room for the remaining input as a stored block in the pending buffer. - */ - have = (s.bi_valid + 42) >> 3; /* number of header bytes */ - /* maximum stored block length that will fit in pending: */ - have = s.pending_buf_size - have > 65535/* MAX_STORED */ ? 65535/* MAX_STORED */ : s.pending_buf_size - have; - min_block = have > s.w_size ? s.w_size : have; - left = s.strstart - s.block_start; - if (left >= min_block || - ((left || flush === Z_FINISH$1) && flush !== Z_NO_FLUSH$1 && - s.strm.avail_in === 0 && left <= have)) { - len = left > have ? have : left; - last = flush === Z_FINISH$1 && s.strm.avail_in === 0 && - len === left ? 1 : 0; - _tr_stored_block(s, s.block_start, len, last); - s.block_start += len; - flush_pending(s.strm); - } - - /* We've done all we can with the available input and output. */ - return last ? BS_FINISH_STARTED : BS_NEED_MORE; - }; - - - /* =========================================================================== - * Compress as much as possible from the input stream, return the current - * block state. - * This function does not perform lazy evaluation of matches and inserts - * new strings in the dictionary only for unmatched strings or for short - * matches. It is used only for the fast compression options. - */ - const deflate_fast = (s, flush) => { - - let hash_head; /* head of the hash chain */ - let bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s.lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$1) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { - break; /* flush the current block */ - } - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = 0/*NIL*/; - if (s.lookahead >= MIN_MATCH) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]); - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - - /* Find the longest match, discarding those <= prev_length. - * At this point we have always match_length < MIN_MATCH - */ - if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s.match_length = longest_match(s, hash_head); - /* longest_match() sets match_start */ - } - if (s.match_length >= MIN_MATCH) { - // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only - - /*** _tr_tally_dist(s, s.strstart - s.match_start, - s.match_length - MIN_MATCH, bflush); ***/ - bflush = _tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH); - - s.lookahead -= s.match_length; - - /* Insert new strings in the hash table only if the match length - * is not too large. This saves time but degrades compression. - */ - if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) { - s.match_length--; /* string at strstart already in table */ - do { - s.strstart++; - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]); - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - /* strstart never exceeds WSIZE-MAX_MATCH, so there are - * always MIN_MATCH bytes ahead. - */ - } while (--s.match_length !== 0); - s.strstart++; - } else - { - s.strstart += s.match_length; - s.match_length = 0; - s.ins_h = s.window[s.strstart]; - /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + 1]); - - //#if MIN_MATCH != 3 - // Call UPDATE_HASH() MIN_MATCH-3 more times - //#endif - /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not - * matter since it will be recomputed at next deflate call. - */ - } - } else { - /* No match, output a literal byte */ - //Tracevv((stderr,"%c", s.window[s.strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart]); - - s.lookahead--; - s.strstart++; - } - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1); - if (flush === Z_FINISH$1) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.sym_next) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_BLOCK_DONE; - }; - - /* =========================================================================== - * Same as above, but achieves better compression. We use a lazy - * evaluation for matches: a match is finally adopted only if there is - * no better match at the next window position. - */ - const deflate_slow = (s, flush) => { - - let hash_head; /* head of hash chain */ - let bflush; /* set if current block must be flushed */ - - let max_insert; - - /* Process the input block. */ - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s.lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$1) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { break; } /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = 0/*NIL*/; - if (s.lookahead >= MIN_MATCH) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]); - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - - /* Find the longest match, discarding those <= prev_length. - */ - s.prev_length = s.match_length; - s.prev_match = s.match_start; - s.match_length = MIN_MATCH - 1; - - if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match && - s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s.match_length = longest_match(s, hash_head); - /* longest_match() sets match_start */ - - if (s.match_length <= 5 && - (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) { - - /* If prev_match is also MIN_MATCH, match_start is garbage - * but we will ignore the current match anyway. - */ - s.match_length = MIN_MATCH - 1; - } - } - /* If there was a match at the previous step and the current - * match is not better, output the previous match: - */ - if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) { - max_insert = s.strstart + s.lookahead - MIN_MATCH; - /* Do not insert strings in hash table beyond this. */ - - //check_match(s, s.strstart-1, s.prev_match, s.prev_length); - - /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match, - s.prev_length - MIN_MATCH, bflush);***/ - bflush = _tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH); - /* Insert in hash table all strings up to the end of the match. - * strstart-1 and strstart are already inserted. If there is not - * enough lookahead, the last two strings are not inserted in - * the hash table. - */ - s.lookahead -= s.prev_length - 1; - s.prev_length -= 2; - do { - if (++s.strstart <= max_insert) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]); - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - } while (--s.prev_length !== 0); - s.match_available = 0; - s.match_length = MIN_MATCH - 1; - s.strstart++; - - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - - } else if (s.match_available) { - /* If there was no match at the previous position, output a - * single literal. If there was a match but the current match - * is longer, truncate the previous match to a single literal. - */ - //Tracevv((stderr,"%c", s->window[s->strstart-1])); - /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart - 1]); - - if (bflush) { - /*** FLUSH_BLOCK_ONLY(s, 0) ***/ - flush_block_only(s, false); - /***/ - } - s.strstart++; - s.lookahead--; - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - } else { - /* There is no previous match to compare with, wait for - * the next step to decide. - */ - s.match_available = 1; - s.strstart++; - s.lookahead--; - } - } - //Assert (flush != Z_NO_FLUSH, "no flush?"); - if (s.match_available) { - //Tracevv((stderr,"%c", s->window[s->strstart-1])); - /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart - 1]); - - s.match_available = 0; - } - s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1; - if (flush === Z_FINISH$1) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.sym_next) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - - return BS_BLOCK_DONE; - }; - - - /* =========================================================================== - * For Z_RLE, simply look for runs of bytes, generate matches only of distance - * one. Do not maintain a hash table. (It will be regenerated if this run of - * deflate switches away from Z_RLE.) - */ - const deflate_rle = (s, flush) => { - - let bflush; /* set if current block must be flushed */ - let prev; /* byte at distance one to match */ - let scan, strend; /* scan goes up to strend for length of run */ - - const _win = s.window; - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the longest run, plus one for the unrolled loop. - */ - if (s.lookahead <= MAX_MATCH) { - fill_window(s); - if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH$1) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { break; } /* flush the current block */ - } - - /* See how many times the previous byte repeats */ - s.match_length = 0; - if (s.lookahead >= MIN_MATCH && s.strstart > 0) { - scan = s.strstart - 1; - prev = _win[scan]; - if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) { - strend = s.strstart + MAX_MATCH; - do { - /*jshint noempty:false*/ - } while (prev === _win[++scan] && prev === _win[++scan] && - prev === _win[++scan] && prev === _win[++scan] && - prev === _win[++scan] && prev === _win[++scan] && - prev === _win[++scan] && prev === _win[++scan] && - scan < strend); - s.match_length = MAX_MATCH - (strend - scan); - if (s.match_length > s.lookahead) { - s.match_length = s.lookahead; - } - } - //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); - } - - /* Emit match if have run of MIN_MATCH or longer, else emit literal */ - if (s.match_length >= MIN_MATCH) { - //check_match(s, s.strstart, s.strstart - 1, s.match_length); - - /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/ - bflush = _tr_tally(s, 1, s.match_length - MIN_MATCH); - - s.lookahead -= s.match_length; - s.strstart += s.match_length; - s.match_length = 0; - } else { - /* No match, output a literal byte */ - //Tracevv((stderr,"%c", s->window[s->strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart]); - - s.lookahead--; - s.strstart++; - } - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - s.insert = 0; - if (flush === Z_FINISH$1) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.sym_next) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_BLOCK_DONE; - }; - - /* =========================================================================== - * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. - * (It will be regenerated if this run of deflate switches away from Huffman.) - */ - const deflate_huff = (s, flush) => { - - let bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we have a literal to write. */ - if (s.lookahead === 0) { - fill_window(s); - if (s.lookahead === 0) { - if (flush === Z_NO_FLUSH$1) { - return BS_NEED_MORE; - } - break; /* flush the current block */ - } - } - - /* Output a literal byte */ - s.match_length = 0; - //Tracevv((stderr,"%c", s->window[s->strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart]); - s.lookahead--; - s.strstart++; - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - s.insert = 0; - if (flush === Z_FINISH$1) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.sym_next) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_BLOCK_DONE; - }; - - /* Values for max_lazy_match, good_match and max_chain_length, depending on - * the desired pack level (0..9). The values given below have been tuned to - * exclude worst case performance for pathological files. Better values may be - * found for specific files. - */ - function Config(good_length, max_lazy, nice_length, max_chain, func) { - - this.good_length = good_length; - this.max_lazy = max_lazy; - this.nice_length = nice_length; - this.max_chain = max_chain; - this.func = func; - } - - const configuration_table = [ - /* good lazy nice chain */ - new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */ - new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */ - new Config(4, 5, 16, 8, deflate_fast), /* 2 */ - new Config(4, 6, 32, 32, deflate_fast), /* 3 */ - - new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */ - new Config(8, 16, 32, 32, deflate_slow), /* 5 */ - new Config(8, 16, 128, 128, deflate_slow), /* 6 */ - new Config(8, 32, 128, 256, deflate_slow), /* 7 */ - new Config(32, 128, 258, 1024, deflate_slow), /* 8 */ - new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */ - ]; - - - /* =========================================================================== - * Initialize the "longest match" routines for a new zlib stream - */ - const lm_init = (s) => { - - s.window_size = 2 * s.w_size; - - /*** CLEAR_HASH(s); ***/ - zero(s.head); // Fill with NIL (= 0); - - /* Set the default configuration parameters: - */ - s.max_lazy_match = configuration_table[s.level].max_lazy; - s.good_match = configuration_table[s.level].good_length; - s.nice_match = configuration_table[s.level].nice_length; - s.max_chain_length = configuration_table[s.level].max_chain; - - s.strstart = 0; - s.block_start = 0; - s.lookahead = 0; - s.insert = 0; - s.match_length = s.prev_length = MIN_MATCH - 1; - s.match_available = 0; - s.ins_h = 0; - }; - - - function DeflateState() { - this.strm = null; /* pointer back to this zlib stream */ - this.status = 0; /* as the name implies */ - this.pending_buf = null; /* output still pending */ - this.pending_buf_size = 0; /* size of pending_buf */ - this.pending_out = 0; /* next pending byte to output to the stream */ - this.pending = 0; /* nb of bytes in the pending buffer */ - this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ - this.gzhead = null; /* gzip header information to write */ - this.gzindex = 0; /* where in extra, name, or comment */ - this.method = Z_DEFLATED$1; /* can only be DEFLATED */ - this.last_flush = -1; /* value of flush param for previous deflate call */ - - this.w_size = 0; /* LZ77 window size (32K by default) */ - this.w_bits = 0; /* log2(w_size) (8..16) */ - this.w_mask = 0; /* w_size - 1 */ - - this.window = null; - /* Sliding window. Input bytes are read into the second half of the window, - * and move to the first half later to keep a dictionary of at least wSize - * bytes. With this organization, matches are limited to a distance of - * wSize-MAX_MATCH bytes, but this ensures that IO is always - * performed with a length multiple of the block size. - */ - - this.window_size = 0; - /* Actual size of window: 2*wSize, except when the user input buffer - * is directly used as sliding window. - */ - - this.prev = null; - /* Link to older string with same hash index. To limit the size of this - * array to 64K, this link is maintained only for the last 32K strings. - * An index in this array is thus a window index modulo 32K. - */ - - this.head = null; /* Heads of the hash chains or NIL. */ - - this.ins_h = 0; /* hash index of string to be inserted */ - this.hash_size = 0; /* number of elements in hash table */ - this.hash_bits = 0; /* log2(hash_size) */ - this.hash_mask = 0; /* hash_size-1 */ - - this.hash_shift = 0; - /* Number of bits by which ins_h must be shifted at each input - * step. It must be such that after MIN_MATCH steps, the oldest - * byte no longer takes part in the hash key, that is: - * hash_shift * MIN_MATCH >= hash_bits - */ - - this.block_start = 0; - /* Window position at the beginning of the current output block. Gets - * negative when the window is moved backwards. - */ - - this.match_length = 0; /* length of best match */ - this.prev_match = 0; /* previous match */ - this.match_available = 0; /* set if previous match exists */ - this.strstart = 0; /* start of string to insert */ - this.match_start = 0; /* start of matching string */ - this.lookahead = 0; /* number of valid bytes ahead in window */ - - this.prev_length = 0; - /* Length of the best match at previous step. Matches not greater than this - * are discarded. This is used in the lazy match evaluation. - */ - - this.max_chain_length = 0; - /* To speed up deflation, hash chains are never searched beyond this - * length. A higher limit improves compression ratio but degrades the - * speed. - */ - - this.max_lazy_match = 0; - /* Attempt to find a better match only when the current match is strictly - * smaller than this value. This mechanism is used only for compression - * levels >= 4. - */ - // That's alias to max_lazy_match, don't use directly - //this.max_insert_length = 0; - /* Insert new strings in the hash table only if the match length is not - * greater than this length. This saves time but degrades compression. - * max_insert_length is used only for compression levels <= 3. - */ - - this.level = 0; /* compression level (1..9) */ - this.strategy = 0; /* favor or force Huffman coding*/ - - this.good_match = 0; - /* Use a faster search when the previous match is longer than this */ - - this.nice_match = 0; /* Stop searching when current match exceeds this */ - - /* used by trees.c: */ - - /* Didn't use ct_data typedef below to suppress compiler warning */ - - // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ - // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ - // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ - - // Use flat array of DOUBLE size, with interleaved fata, - // because JS does not support effective - this.dyn_ltree = new Uint16Array(HEAP_SIZE * 2); - this.dyn_dtree = new Uint16Array((2 * D_CODES + 1) * 2); - this.bl_tree = new Uint16Array((2 * BL_CODES + 1) * 2); - zero(this.dyn_ltree); - zero(this.dyn_dtree); - zero(this.bl_tree); - - this.l_desc = null; /* desc. for literal tree */ - this.d_desc = null; /* desc. for distance tree */ - this.bl_desc = null; /* desc. for bit length tree */ - - //ush bl_count[MAX_BITS+1]; - this.bl_count = new Uint16Array(MAX_BITS + 1); - /* number of codes at each bit length for an optimal tree */ - - //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ - this.heap = new Uint16Array(2 * L_CODES + 1); /* heap used to build the Huffman trees */ - zero(this.heap); - - this.heap_len = 0; /* number of elements in the heap */ - this.heap_max = 0; /* element of largest frequency */ - /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. - * The same heap array is used to build all trees. - */ - - this.depth = new Uint16Array(2 * L_CODES + 1); //uch depth[2*L_CODES+1]; - zero(this.depth); - /* Depth of each subtree used as tie breaker for trees of equal frequency - */ - - this.sym_buf = 0; /* buffer for distances and literals/lengths */ - - this.lit_bufsize = 0; - /* Size of match buffer for literals/lengths. There are 4 reasons for - * limiting lit_bufsize to 64K: - * - frequencies can be kept in 16 bit counters - * - if compression is not successful for the first block, all input - * data is still in the window so we can still emit a stored block even - * when input comes from standard input. (This can also be done for - * all blocks if lit_bufsize is not greater than 32K.) - * - if compression is not successful for a file smaller than 64K, we can - * even emit a stored file instead of a stored block (saving 5 bytes). - * This is applicable only for zip (not gzip or zlib). - * - creating new Huffman trees less frequently may not provide fast - * adaptation to changes in the input data statistics. (Take for - * example a binary file with poorly compressible code followed by - * a highly compressible string table.) Smaller buffer sizes give - * fast adaptation but have of course the overhead of transmitting - * trees more frequently. - * - I can't count above 4 - */ - - this.sym_next = 0; /* running index in sym_buf */ - this.sym_end = 0; /* symbol table full when sym_next reaches this */ - - this.opt_len = 0; /* bit length of current block with optimal trees */ - this.static_len = 0; /* bit length of current block with static trees */ - this.matches = 0; /* number of string matches in current block */ - this.insert = 0; /* bytes at end of window left to insert */ - - - this.bi_buf = 0; - /* Output buffer. bits are inserted starting at the bottom (least - * significant bits). - */ - this.bi_valid = 0; - /* Number of valid bits in bi_buf. All bits above the last valid bit - * are always zero. - */ - - // Used for window memory init. We safely ignore it for JS. That makes - // sense only for pointers and memory check tools. - //this.high_water = 0; - /* High water mark offset in window for initialized bytes -- bytes above - * this are set to zero in order to avoid memory check warnings when - * longest match routines access bytes past the input. This is then - * updated to the new high water mark. - */ - } - - - /* ========================================================================= - * Check for a valid deflate stream state. Return 0 if ok, 1 if not. - */ - const deflateStateCheck = (strm) => { - - if (!strm) { - return 1; - } - const s = strm.state; - if (!s || s.strm !== strm || (s.status !== INIT_STATE && - //#ifdef GZIP - s.status !== GZIP_STATE && - //#endif - s.status !== EXTRA_STATE && - s.status !== NAME_STATE && - s.status !== COMMENT_STATE && - s.status !== HCRC_STATE && - s.status !== BUSY_STATE && - s.status !== FINISH_STATE)) { - return 1; - } - return 0; - }; - - - const deflateResetKeep = (strm) => { - - if (deflateStateCheck(strm)) { - return err(strm, Z_STREAM_ERROR); - } - - strm.total_in = strm.total_out = 0; - strm.data_type = Z_UNKNOWN; - - const s = strm.state; - s.pending = 0; - s.pending_out = 0; - - if (s.wrap < 0) { - s.wrap = -s.wrap; - /* was made negative by deflate(..., Z_FINISH); */ - } - s.status = - //#ifdef GZIP - s.wrap === 2 ? GZIP_STATE : - //#endif - s.wrap ? INIT_STATE : BUSY_STATE; - strm.adler = (s.wrap === 2) ? - 0 // crc32(0, Z_NULL, 0) - : - 1; // adler32(0, Z_NULL, 0) - s.last_flush = -2; - _tr_init(s); - return Z_OK$1; - }; - - - const deflateReset = (strm) => { - - const ret = deflateResetKeep(strm); - if (ret === Z_OK$1) { - lm_init(strm.state); - } - return ret; - }; - - - const deflateSetHeader = (strm, head) => { - - if (deflateStateCheck(strm) || strm.state.wrap !== 2) { - return Z_STREAM_ERROR; - } - strm.state.gzhead = head; - return Z_OK$1; - }; - - - const deflateInit2 = (strm, level, method, windowBits, memLevel, strategy) => { - - if (!strm) { // === Z_NULL - return Z_STREAM_ERROR; - } - let wrap = 1; - - if (level === Z_DEFAULT_COMPRESSION$1) { - level = 6; - } - - if (windowBits < 0) { /* suppress zlib wrapper */ - wrap = 0; - windowBits = -windowBits; - } - - else if (windowBits > 15) { - wrap = 2; /* write gzip wrapper instead */ - windowBits -= 16; - } - - - if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED$1 || - windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || - strategy < 0 || strategy > Z_FIXED || (windowBits === 8 && wrap !== 1)) { - return err(strm, Z_STREAM_ERROR); - } - - - if (windowBits === 8) { - windowBits = 9; - } - /* until 256-byte window bug fixed */ - - const s = new DeflateState(); - - strm.state = s; - s.strm = strm; - s.status = INIT_STATE; /* to pass state test in deflateReset() */ - - s.wrap = wrap; - s.gzhead = null; - s.w_bits = windowBits; - s.w_size = 1 << s.w_bits; - s.w_mask = s.w_size - 1; - - s.hash_bits = memLevel + 7; - s.hash_size = 1 << s.hash_bits; - s.hash_mask = s.hash_size - 1; - s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH); - - s.window = new Uint8Array(s.w_size * 2); - s.head = new Uint16Array(s.hash_size); - s.prev = new Uint16Array(s.w_size); - - // Don't need mem init magic for JS. - //s.high_water = 0; /* nothing written to s->window yet */ - - s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ - - /* We overlay pending_buf and sym_buf. This works since the average size - * for length/distance pairs over any compressed block is assured to be 31 - * bits or less. - * - * Analysis: The longest fixed codes are a length code of 8 bits plus 5 - * extra bits, for lengths 131 to 257. The longest fixed distance codes are - * 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest - * possible fixed-codes length/distance pair is then 31 bits total. - * - * sym_buf starts one-fourth of the way into pending_buf. So there are - * three bytes in sym_buf for every four bytes in pending_buf. Each symbol - * in sym_buf is three bytes -- two for the distance and one for the - * literal/length. As each symbol is consumed, the pointer to the next - * sym_buf value to read moves forward three bytes. From that symbol, up to - * 31 bits are written to pending_buf. The closest the written pending_buf - * bits gets to the next sym_buf symbol to read is just before the last - * code is written. At that time, 31*(n-2) bits have been written, just - * after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at - * 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1 - * symbols are written.) The closest the writing gets to what is unread is - * then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and - * can range from 128 to 32768. - * - * Therefore, at a minimum, there are 142 bits of space between what is - * written and what is read in the overlain buffers, so the symbols cannot - * be overwritten by the compressed data. That space is actually 139 bits, - * due to the three-bit fixed-code block header. - * - * That covers the case where either Z_FIXED is specified, forcing fixed - * codes, or when the use of fixed codes is chosen, because that choice - * results in a smaller compressed block than dynamic codes. That latter - * condition then assures that the above analysis also covers all dynamic - * blocks. A dynamic-code block will only be chosen to be emitted if it has - * fewer bits than a fixed-code block would for the same set of symbols. - * Therefore its average symbol length is assured to be less than 31. So - * the compressed data for a dynamic block also cannot overwrite the - * symbols from which it is being constructed. - */ - - s.pending_buf_size = s.lit_bufsize * 4; - s.pending_buf = new Uint8Array(s.pending_buf_size); - - // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`) - //s->sym_buf = s->pending_buf + s->lit_bufsize; - s.sym_buf = s.lit_bufsize; - - //s->sym_end = (s->lit_bufsize - 1) * 3; - s.sym_end = (s.lit_bufsize - 1) * 3; - /* We avoid equality with lit_bufsize*3 because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ - - s.level = level; - s.strategy = strategy; - s.method = method; - - return deflateReset(strm); - }; - - const deflateInit = (strm, level) => { - - return deflateInit2(strm, level, Z_DEFLATED$1, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY$1); - }; - - - /* ========================================================================= */ - const deflate$1 = (strm, flush) => { - - if (deflateStateCheck(strm) || flush > Z_BLOCK || flush < 0) { - return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR; - } - - const s = strm.state; - - if (!strm.output || - (strm.avail_in !== 0 && !strm.input) || - (s.status === FINISH_STATE && flush !== Z_FINISH$1)) { - return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR); - } - - const old_flush = s.last_flush; - s.last_flush = flush; - - /* Flush as much pending output as possible */ - if (s.pending !== 0) { - flush_pending(strm); - if (strm.avail_out === 0) { - /* Since avail_out is 0, deflate will be called again with - * more output space, but possibly with both pending and - * avail_in equal to zero. There won't be anything to do, - * but this is not an error situation so make sure we - * return OK instead of BUF_ERROR at next call of deflate: - */ - s.last_flush = -1; - return Z_OK$1; - } - - /* Make sure there is something to do and avoid duplicate consecutive - * flushes. For repeated and useless calls with Z_FINISH, we keep - * returning Z_STREAM_END instead of Z_BUF_ERROR. - */ - } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) && - flush !== Z_FINISH$1) { - return err(strm, Z_BUF_ERROR); - } - - /* User must not provide more input after the first FINISH: */ - if (s.status === FINISH_STATE && strm.avail_in !== 0) { - return err(strm, Z_BUF_ERROR); - } - - /* Write the header */ - if (s.status === INIT_STATE && s.wrap === 0) { - s.status = BUSY_STATE; - } - if (s.status === INIT_STATE) { - /* zlib header */ - let header = (Z_DEFLATED$1 + ((s.w_bits - 8) << 4)) << 8; - let level_flags = -1; - - if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) { - level_flags = 0; - } else if (s.level < 6) { - level_flags = 1; - } else if (s.level === 6) { - level_flags = 2; - } else { - level_flags = 3; - } - header |= (level_flags << 6); - if (s.strstart !== 0) { header |= PRESET_DICT; } - header += 31 - (header % 31); - - putShortMSB(s, header); - - /* Save the adler32 of the preset dictionary: */ - if (s.strstart !== 0) { - putShortMSB(s, strm.adler >>> 16); - putShortMSB(s, strm.adler & 0xffff); - } - strm.adler = 1; // adler32(0L, Z_NULL, 0); - s.status = BUSY_STATE; - - /* Compression must start with an empty pending buffer */ - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$1; - } - } - //#ifdef GZIP - if (s.status === GZIP_STATE) { - /* gzip header */ - strm.adler = 0; //crc32(0L, Z_NULL, 0); - put_byte(s, 31); - put_byte(s, 139); - put_byte(s, 8); - if (!s.gzhead) { // s->gzhead == Z_NULL - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, s.level === 9 ? 2 : - (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? - 4 : 0)); - put_byte(s, OS_CODE); - s.status = BUSY_STATE; - - /* Compression must start with an empty pending buffer */ - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$1; - } - } - else { - put_byte(s, (s.gzhead.text ? 1 : 0) + - (s.gzhead.hcrc ? 2 : 0) + - (!s.gzhead.extra ? 0 : 4) + - (!s.gzhead.name ? 0 : 8) + - (!s.gzhead.comment ? 0 : 16) - ); - put_byte(s, s.gzhead.time & 0xff); - put_byte(s, (s.gzhead.time >> 8) & 0xff); - put_byte(s, (s.gzhead.time >> 16) & 0xff); - put_byte(s, (s.gzhead.time >> 24) & 0xff); - put_byte(s, s.level === 9 ? 2 : - (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? - 4 : 0)); - put_byte(s, s.gzhead.os & 0xff); - if (s.gzhead.extra && s.gzhead.extra.length) { - put_byte(s, s.gzhead.extra.length & 0xff); - put_byte(s, (s.gzhead.extra.length >> 8) & 0xff); - } - if (s.gzhead.hcrc) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending, 0); - } - s.gzindex = 0; - s.status = EXTRA_STATE; - } - } - if (s.status === EXTRA_STATE) { - if (s.gzhead.extra/* != Z_NULL*/) { - let beg = s.pending; /* start of bytes to update crc */ - let left = (s.gzhead.extra.length & 0xffff) - s.gzindex; - while (s.pending + left > s.pending_buf_size) { - let copy = s.pending_buf_size - s.pending; - // zmemcpy(s.pending_buf + s.pending, - // s.gzhead.extra + s.gzindex, copy); - s.pending_buf.set(s.gzhead.extra.subarray(s.gzindex, s.gzindex + copy), s.pending); - s.pending = s.pending_buf_size; - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - //---// - s.gzindex += copy; - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$1; - } - beg = 0; - left -= copy; - } - // JS specific: s.gzhead.extra may be TypedArray or Array for backward compatibility - // TypedArray.slice and TypedArray.from don't exist in IE10-IE11 - let gzhead_extra = new Uint8Array(s.gzhead.extra); - // zmemcpy(s->pending_buf + s->pending, - // s->gzhead->extra + s->gzindex, left); - s.pending_buf.set(gzhead_extra.subarray(s.gzindex, s.gzindex + left), s.pending); - s.pending += left; - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - //---// - s.gzindex = 0; - } - s.status = NAME_STATE; - } - if (s.status === NAME_STATE) { - if (s.gzhead.name/* != Z_NULL*/) { - let beg = s.pending; /* start of bytes to update crc */ - let val; - do { - if (s.pending === s.pending_buf_size) { - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - //---// - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$1; - } - beg = 0; - } - // JS specific: little magic to add zero terminator to end of string - if (s.gzindex < s.gzhead.name.length) { - val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff; - } else { - val = 0; - } - put_byte(s, val); - } while (val !== 0); - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - //---// - s.gzindex = 0; - } - s.status = COMMENT_STATE; - } - if (s.status === COMMENT_STATE) { - if (s.gzhead.comment/* != Z_NULL*/) { - let beg = s.pending; /* start of bytes to update crc */ - let val; - do { - if (s.pending === s.pending_buf_size) { - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - //---// - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$1; - } - beg = 0; - } - // JS specific: little magic to add zero terminator to end of string - if (s.gzindex < s.gzhead.comment.length) { - val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff; - } else { - val = 0; - } - put_byte(s, val); - } while (val !== 0); - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - //---// - } - s.status = HCRC_STATE; - } - if (s.status === HCRC_STATE) { - if (s.gzhead.hcrc) { - if (s.pending + 2 > s.pending_buf_size) { - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$1; - } - } - put_byte(s, strm.adler & 0xff); - put_byte(s, (strm.adler >> 8) & 0xff); - strm.adler = 0; //crc32(0L, Z_NULL, 0); - } - s.status = BUSY_STATE; - - /* Compression must start with an empty pending buffer */ - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK$1; - } - } - //#endif - - /* Start a new block or continue the current one. - */ - if (strm.avail_in !== 0 || s.lookahead !== 0 || - (flush !== Z_NO_FLUSH$1 && s.status !== FINISH_STATE)) { - let bstate = s.level === 0 ? deflate_stored(s, flush) : - s.strategy === Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : - s.strategy === Z_RLE ? deflate_rle(s, flush) : - configuration_table[s.level].func(s, flush); - - if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) { - s.status = FINISH_STATE; - } - if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) { - if (strm.avail_out === 0) { - s.last_flush = -1; - /* avoid BUF_ERROR next call, see above */ - } - return Z_OK$1; - /* If flush != Z_NO_FLUSH && avail_out == 0, the next call - * of deflate should use the same flush parameter to make sure - * that the flush is complete. So we don't have to output an - * empty block here, this will be done at next call. This also - * ensures that for a very small output buffer, we emit at most - * one empty block. - */ - } - if (bstate === BS_BLOCK_DONE) { - if (flush === Z_PARTIAL_FLUSH) { - _tr_align(s); - } - else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ - - _tr_stored_block(s, 0, 0, false); - /* For a full flush, this empty block will be recognized - * as a special marker by inflate_sync(). - */ - if (flush === Z_FULL_FLUSH$1) { - /*** CLEAR_HASH(s); ***/ /* forget history */ - zero(s.head); // Fill with NIL (= 0); - - if (s.lookahead === 0) { - s.strstart = 0; - s.block_start = 0; - s.insert = 0; - } - } - } - flush_pending(strm); - if (strm.avail_out === 0) { - s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */ - return Z_OK$1; - } - } - } - - if (flush !== Z_FINISH$1) { return Z_OK$1; } - if (s.wrap <= 0) { return Z_STREAM_END$1; } - - /* Write the trailer */ - if (s.wrap === 2) { - put_byte(s, strm.adler & 0xff); - put_byte(s, (strm.adler >> 8) & 0xff); - put_byte(s, (strm.adler >> 16) & 0xff); - put_byte(s, (strm.adler >> 24) & 0xff); - put_byte(s, strm.total_in & 0xff); - put_byte(s, (strm.total_in >> 8) & 0xff); - put_byte(s, (strm.total_in >> 16) & 0xff); - put_byte(s, (strm.total_in >> 24) & 0xff); - } - else - { - putShortMSB(s, strm.adler >>> 16); - putShortMSB(s, strm.adler & 0xffff); - } - - flush_pending(strm); - /* If avail_out is zero, the application will call deflate again - * to flush the rest. - */ - if (s.wrap > 0) { s.wrap = -s.wrap; } - /* write the trailer only once! */ - return s.pending !== 0 ? Z_OK$1 : Z_STREAM_END$1; - }; - - - const deflateEnd = (strm) => { - - if (deflateStateCheck(strm)) { - return Z_STREAM_ERROR; - } - - const status = strm.state.status; - - strm.state = null; - - return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK$1; - }; - - - /* ========================================================================= - * Initializes the compression dictionary from the given byte - * sequence without producing any compressed output. - */ - const deflateSetDictionary = (strm, dictionary) => { - - let dictLength = dictionary.length; - - if (deflateStateCheck(strm)) { - return Z_STREAM_ERROR; - } - - const s = strm.state; - const wrap = s.wrap; - - if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) { - return Z_STREAM_ERROR; - } - - /* when using zlib wrappers, compute Adler-32 for provided dictionary */ - if (wrap === 1) { - /* adler32(strm->adler, dictionary, dictLength); */ - strm.adler = adler32_1(strm.adler, dictionary, dictLength, 0); - } - - s.wrap = 0; /* avoid computing Adler-32 in read_buf */ - - /* if dictionary would fill window, just replace the history */ - if (dictLength >= s.w_size) { - if (wrap === 0) { /* already empty otherwise */ - /*** CLEAR_HASH(s); ***/ - zero(s.head); // Fill with NIL (= 0); - s.strstart = 0; - s.block_start = 0; - s.insert = 0; - } - /* use the tail */ - // dictionary = dictionary.slice(dictLength - s.w_size); - let tmpDict = new Uint8Array(s.w_size); - tmpDict.set(dictionary.subarray(dictLength - s.w_size, dictLength), 0); - dictionary = tmpDict; - dictLength = s.w_size; - } - /* insert dictionary into window and hash */ - const avail = strm.avail_in; - const next = strm.next_in; - const input = strm.input; - strm.avail_in = dictLength; - strm.next_in = 0; - strm.input = dictionary; - fill_window(s); - while (s.lookahead >= MIN_MATCH) { - let str = s.strstart; - let n = s.lookahead - (MIN_MATCH - 1); - do { - /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ - s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]); - - s.prev[str & s.w_mask] = s.head[s.ins_h]; - - s.head[s.ins_h] = str; - str++; - } while (--n); - s.strstart = str; - s.lookahead = MIN_MATCH - 1; - fill_window(s); - } - s.strstart += s.lookahead; - s.block_start = s.strstart; - s.insert = s.lookahead; - s.lookahead = 0; - s.match_length = s.prev_length = MIN_MATCH - 1; - s.match_available = 0; - strm.next_in = next; - strm.input = input; - strm.avail_in = avail; - s.wrap = wrap; - return Z_OK$1; - }; - - - var deflateInit_1 = deflateInit; - var deflateInit2_1 = deflateInit2; - var deflateReset_1 = deflateReset; - var deflateResetKeep_1 = deflateResetKeep; - var deflateSetHeader_1 = deflateSetHeader; - var deflate_2$1 = deflate$1; - var deflateEnd_1 = deflateEnd; - var deflateSetDictionary_1 = deflateSetDictionary; - var deflateInfo = 'pako deflate (from Nodeca project)'; - - /* Not implemented - module.exports.deflateBound = deflateBound; - module.exports.deflateCopy = deflateCopy; - module.exports.deflateGetDictionary = deflateGetDictionary; - module.exports.deflateParams = deflateParams; - module.exports.deflatePending = deflatePending; - module.exports.deflatePrime = deflatePrime; - module.exports.deflateTune = deflateTune; - */ - - var deflate_1$1 = { - deflateInit: deflateInit_1, - deflateInit2: deflateInit2_1, - deflateReset: deflateReset_1, - deflateResetKeep: deflateResetKeep_1, - deflateSetHeader: deflateSetHeader_1, - deflate: deflate_2$1, - deflateEnd: deflateEnd_1, - deflateSetDictionary: deflateSetDictionary_1, - deflateInfo: deflateInfo - }; - - const _has = (obj, key) => { - return Object.prototype.hasOwnProperty.call(obj, key); - }; - - var assign = function (obj /*from1, from2, from3, ...*/) { - const sources = Array.prototype.slice.call(arguments, 1); - while (sources.length) { - const source = sources.shift(); - if (!source) { continue; } - - if (typeof source !== 'object') { - throw new TypeError(source + 'must be non-object'); - } - - for (const p in source) { - if (_has(source, p)) { - obj[p] = source[p]; - } - } - } - - return obj; - }; - - - // Join array of chunks to single array. - var flattenChunks = (chunks) => { - // calculate data length - let len = 0; - - for (let i = 0, l = chunks.length; i < l; i++) { - len += chunks[i].length; - } - - // join chunks - const result = new Uint8Array(len); - - for (let i = 0, pos = 0, l = chunks.length; i < l; i++) { - let chunk = chunks[i]; - result.set(chunk, pos); - pos += chunk.length; - } - - return result; - }; - - var common = { - assign: assign, - flattenChunks: flattenChunks - }; - - // String encode/decode helpers - - - // Quick check if we can use fast array to bin string conversion - // - // - apply(Array) can fail on Android 2.2 - // - apply(Uint8Array) can fail on iOS 5.1 Safari - // - let STR_APPLY_UIA_OK = true; - - try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; } - - - // Table with utf8 lengths (calculated by first byte of sequence) - // Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS, - // because max possible codepoint is 0x10ffff - const _utf8len = new Uint8Array(256); - for (let q = 0; q < 256; q++) { - _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1); - } - _utf8len[254] = _utf8len[254] = 1; // Invalid sequence start - - - // convert string to array (typed, when possible) - var string2buf = (str) => { - if (typeof TextEncoder === 'function' && TextEncoder.prototype.encode) { - return new TextEncoder().encode(str); - } - - let buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0; - - // count binary size - for (m_pos = 0; m_pos < str_len; m_pos++) { - c = str.charCodeAt(m_pos); - if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) { - c2 = str.charCodeAt(m_pos + 1); - if ((c2 & 0xfc00) === 0xdc00) { - c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); - m_pos++; - } - } - buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4; - } - - // allocate buffer - buf = new Uint8Array(buf_len); - - // convert - for (i = 0, m_pos = 0; i < buf_len; m_pos++) { - c = str.charCodeAt(m_pos); - if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) { - c2 = str.charCodeAt(m_pos + 1); - if ((c2 & 0xfc00) === 0xdc00) { - c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); - m_pos++; - } - } - if (c < 0x80) { - /* one byte */ - buf[i++] = c; - } else if (c < 0x800) { - /* two bytes */ - buf[i++] = 0xC0 | (c >>> 6); - buf[i++] = 0x80 | (c & 0x3f); - } else if (c < 0x10000) { - /* three bytes */ - buf[i++] = 0xE0 | (c >>> 12); - buf[i++] = 0x80 | (c >>> 6 & 0x3f); - buf[i++] = 0x80 | (c & 0x3f); - } else { - /* four bytes */ - buf[i++] = 0xf0 | (c >>> 18); - buf[i++] = 0x80 | (c >>> 12 & 0x3f); - buf[i++] = 0x80 | (c >>> 6 & 0x3f); - buf[i++] = 0x80 | (c & 0x3f); - } - } - - return buf; - }; - - // Helper - const buf2binstring = (buf, len) => { - // On Chrome, the arguments in a function call that are allowed is `65534`. - // If the length of the buffer is smaller than that, we can use this optimization, - // otherwise we will take a slower path. - if (len < 65534) { - if (buf.subarray && STR_APPLY_UIA_OK) { - return String.fromCharCode.apply(null, buf.length === len ? buf : buf.subarray(0, len)); - } - } - - let result = ''; - for (let i = 0; i < len; i++) { - result += String.fromCharCode(buf[i]); - } - return result; - }; - - - // convert array to string - var buf2string = (buf, max) => { - const len = max || buf.length; - - if (typeof TextDecoder === 'function' && TextDecoder.prototype.decode) { - return new TextDecoder().decode(buf.subarray(0, max)); - } - - let i, out; - - // Reserve max possible length (2 words per char) - // NB: by unknown reasons, Array is significantly faster for - // String.fromCharCode.apply than Uint16Array. - const utf16buf = new Array(len * 2); - - for (out = 0, i = 0; i < len;) { - let c = buf[i++]; - // quick process ascii - if (c < 0x80) { utf16buf[out++] = c; continue; } - - let c_len = _utf8len[c]; - // skip 5 & 6 byte codes - if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; } - - // apply mask on first byte - c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07; - // join the rest - while (c_len > 1 && i < len) { - c = (c << 6) | (buf[i++] & 0x3f); - c_len--; - } - - // terminated by end of string? - if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; } - - if (c < 0x10000) { - utf16buf[out++] = c; - } else { - c -= 0x10000; - utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff); - utf16buf[out++] = 0xdc00 | (c & 0x3ff); - } - } - - return buf2binstring(utf16buf, out); - }; - - - // Calculate max possible position in utf8 buffer, - // that will not break sequence. If that's not possible - // - (very small limits) return max size as is. - // - // buf[] - utf8 bytes array - // max - length limit (mandatory); - var utf8border = (buf, max) => { - - max = max || buf.length; - if (max > buf.length) { max = buf.length; } - - // go back from last position, until start of sequence found - let pos = max - 1; - while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; } - - // Very small and broken sequence, - // return max, because we should return something anyway. - if (pos < 0) { return max; } - - // If we came to start of buffer - that means buffer is too small, - // return max too. - if (pos === 0) { return max; } - - return (pos + _utf8len[buf[pos]] > max) ? pos : max; - }; - - var strings = { - string2buf: string2buf, - buf2string: buf2string, - utf8border: utf8border - }; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - function ZStream() { - /* next input byte */ - this.input = null; // JS specific, because we have no pointers - this.next_in = 0; - /* number of bytes available at input */ - this.avail_in = 0; - /* total number of input bytes read so far */ - this.total_in = 0; - /* next output byte should be put there */ - this.output = null; // JS specific, because we have no pointers - this.next_out = 0; - /* remaining free space at output */ - this.avail_out = 0; - /* total number of bytes output so far */ - this.total_out = 0; - /* last error message, NULL if no error */ - this.msg = ''/*Z_NULL*/; - /* not visible by applications */ - this.state = null; - /* best guess about the data type: binary or text */ - this.data_type = 2/*Z_UNKNOWN*/; - /* adler32 value of the uncompressed data */ - this.adler = 0; - } - - var zstream = ZStream; - - const toString = Object.prototype.toString; - - /* Public constants ==========================================================*/ - /* ===========================================================================*/ - - const { - Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH, - Z_OK, Z_STREAM_END, - Z_DEFAULT_COMPRESSION, - Z_DEFAULT_STRATEGY, - Z_DEFLATED - } = constants$1; - - /* ===========================================================================*/ - - - /** - * class Deflate - * - * Generic JS-style wrapper for zlib calls. If you don't need - * streaming behaviour - use more simple functions: [[deflate]], - * [[deflateRaw]] and [[gzip]]. - **/ - - /* internal - * Deflate.chunks -> Array - * - * Chunks of output data, if [[Deflate#onData]] not overridden. - **/ - - /** - * Deflate.result -> Uint8Array - * - * Compressed result, generated by default [[Deflate#onData]] - * and [[Deflate#onEnd]] handlers. Filled after you push last chunk - * (call [[Deflate#push]] with `Z_FINISH` / `true` param). - **/ - - /** - * Deflate.err -> Number - * - * Error code after deflate finished. 0 (Z_OK) on success. - * You will not need it in real life, because deflate errors - * are possible only on wrong options or bad `onData` / `onEnd` - * custom handlers. - **/ - - /** - * Deflate.msg -> String - * - * Error message, if [[Deflate.err]] != 0 - **/ - - - /** - * new Deflate(options) - * - options (Object): zlib deflate options. - * - * Creates new deflator instance with specified params. Throws exception - * on bad params. Supported options: - * - * - `level` - * - `windowBits` - * - `memLevel` - * - `strategy` - * - `dictionary` - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information on these. - * - * Additional options, for internal needs: - * - * - `chunkSize` - size of generated data chunks (16K by default) - * - `raw` (Boolean) - do raw deflate - * - `gzip` (Boolean) - create gzip wrapper - * - `header` (Object) - custom header for gzip - * - `text` (Boolean) - true if compressed data believed to be text - * - `time` (Number) - modification time, unix timestamp - * - `os` (Number) - operation system code - * - `extra` (Array) - array of bytes with extra data (max 65536) - * - `name` (String) - file name (binary string) - * - `comment` (String) - comment (binary string) - * - `hcrc` (Boolean) - true if header crc should be added - * - * ##### Example: - * - * ```javascript - * const pako = require('pako') - * , chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9]) - * , chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]); - * - * const deflate = new pako.Deflate({ level: 3}); - * - * deflate.push(chunk1, false); - * deflate.push(chunk2, true); // true -> last chunk - * - * if (deflate.err) { throw new Error(deflate.err); } - * - * console.log(deflate.result); - * ``` - **/ - function Deflate(options) { - this.options = common.assign({ - level: Z_DEFAULT_COMPRESSION, - method: Z_DEFLATED, - chunkSize: 16384, - windowBits: 15, - memLevel: 8, - strategy: Z_DEFAULT_STRATEGY - }, options || {}); - - let opt = this.options; - - if (opt.raw && (opt.windowBits > 0)) { - opt.windowBits = -opt.windowBits; - } - - else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) { - opt.windowBits += 16; - } - - this.err = 0; // error code, if happens (0 = Z_OK) - this.msg = ''; // error message - this.ended = false; // used to avoid multiple onEnd() calls - this.chunks = []; // chunks of compressed data - - this.strm = new zstream(); - this.strm.avail_out = 0; - - let status = deflate_1$1.deflateInit2( - this.strm, - opt.level, - opt.method, - opt.windowBits, - opt.memLevel, - opt.strategy - ); - - if (status !== Z_OK) { - throw new Error(messages[status]); - } - - if (opt.header) { - deflate_1$1.deflateSetHeader(this.strm, opt.header); - } - - if (opt.dictionary) { - let dict; - // Convert data if needed - if (typeof opt.dictionary === 'string') { - // If we need to compress text, change encoding to utf8. - dict = strings.string2buf(opt.dictionary); - } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') { - dict = new Uint8Array(opt.dictionary); - } else { - dict = opt.dictionary; - } - - status = deflate_1$1.deflateSetDictionary(this.strm, dict); - - if (status !== Z_OK) { - throw new Error(messages[status]); - } - - this._dict_set = true; - } - } - - /** - * Deflate#push(data[, flush_mode]) -> Boolean - * - data (Uint8Array|ArrayBuffer|String): input data. Strings will be - * converted to utf8 byte sequence. - * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes. - * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH. - * - * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with - * new compressed chunks. Returns `true` on success. The last data block must - * have `flush_mode` Z_FINISH (or `true`). That will flush internal pending - * buffers and call [[Deflate#onEnd]]. - * - * On fail call [[Deflate#onEnd]] with error code and return false. - * - * ##### Example - * - * ```javascript - * push(chunk, false); // push one of data chunks - * ... - * push(chunk, true); // push last chunk - * ``` - **/ - Deflate.prototype.push = function (data, flush_mode) { - const strm = this.strm; - const chunkSize = this.options.chunkSize; - let status, _flush_mode; - - if (this.ended) { return false; } - - if (flush_mode === ~~flush_mode) _flush_mode = flush_mode; - else _flush_mode = flush_mode === true ? Z_FINISH : Z_NO_FLUSH; - - // Convert data if needed - if (typeof data === 'string') { - // If we need to compress text, change encoding to utf8. - strm.input = strings.string2buf(data); - } else if (toString.call(data) === '[object ArrayBuffer]') { - strm.input = new Uint8Array(data); - } else { - strm.input = data; - } - - strm.next_in = 0; - strm.avail_in = strm.input.length; - - for (;;) { - if (strm.avail_out === 0) { - strm.output = new Uint8Array(chunkSize); - strm.next_out = 0; - strm.avail_out = chunkSize; - } - - // Make sure avail_out > 6 to avoid repeating markers - if ((_flush_mode === Z_SYNC_FLUSH || _flush_mode === Z_FULL_FLUSH) && strm.avail_out <= 6) { - this.onData(strm.output.subarray(0, strm.next_out)); - strm.avail_out = 0; - continue; - } - - status = deflate_1$1.deflate(strm, _flush_mode); - - // Ended => flush and finish - if (status === Z_STREAM_END) { - if (strm.next_out > 0) { - this.onData(strm.output.subarray(0, strm.next_out)); - } - status = deflate_1$1.deflateEnd(this.strm); - this.onEnd(status); - this.ended = true; - return status === Z_OK; - } - - // Flush if out buffer full - if (strm.avail_out === 0) { - this.onData(strm.output); - continue; - } - - // Flush if requested and has data - if (_flush_mode > 0 && strm.next_out > 0) { - this.onData(strm.output.subarray(0, strm.next_out)); - strm.avail_out = 0; - continue; - } - - if (strm.avail_in === 0) break; - } - - return true; - }; - - - /** - * Deflate#onData(chunk) -> Void - * - chunk (Uint8Array): output data. - * - * By default, stores data blocks in `chunks[]` property and glue - * those in `onEnd`. Override this handler, if you need another behaviour. - **/ - Deflate.prototype.onData = function (chunk) { - this.chunks.push(chunk); - }; - - - /** - * Deflate#onEnd(status) -> Void - * - status (Number): deflate status. 0 (Z_OK) on success, - * other if not. - * - * Called once after you tell deflate that the input stream is - * complete (Z_FINISH). By default - join collected chunks, - * free memory and fill `results` / `err` properties. - **/ - Deflate.prototype.onEnd = function (status) { - // On success - join - if (status === Z_OK) { - this.result = common.flattenChunks(this.chunks); - } - this.chunks = []; - this.err = status; - this.msg = this.strm.msg; - }; - - - /** - * deflate(data[, options]) -> Uint8Array - * - data (Uint8Array|ArrayBuffer|String): input data to compress. - * - options (Object): zlib deflate options. - * - * Compress `data` with deflate algorithm and `options`. - * - * Supported options are: - * - * - level - * - windowBits - * - memLevel - * - strategy - * - dictionary - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information on these. - * - * Sugar (options): - * - * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify - * negative windowBits implicitly. - * - * ##### Example: - * - * ```javascript - * const pako = require('pako') - * const data = new Uint8Array([1,2,3,4,5,6,7,8,9]); - * - * console.log(pako.deflate(data)); - * ``` - **/ - function deflate(input, options) { - const deflator = new Deflate(options); - - deflator.push(input, true); - - // That will never happens, if you don't cheat with options :) - if (deflator.err) { throw deflator.msg || messages[deflator.err]; } - - return deflator.result; - } - - - /** - * deflateRaw(data[, options]) -> Uint8Array - * - data (Uint8Array|ArrayBuffer|String): input data to compress. - * - options (Object): zlib deflate options. - * - * The same as [[deflate]], but creates raw data, without wrapper - * (header and adler32 crc). - **/ - function deflateRaw(input, options) { - options = options || {}; - options.raw = true; - return deflate(input, options); - } - - - /** - * gzip(data[, options]) -> Uint8Array - * - data (Uint8Array|ArrayBuffer|String): input data to compress. - * - options (Object): zlib deflate options. - * - * The same as [[deflate]], but create gzip wrapper instead of - * deflate one. - **/ - function gzip(input, options) { - options = options || {}; - options.gzip = true; - return deflate(input, options); - } - - - var Deflate_1 = Deflate; - var deflate_2 = deflate; - var deflateRaw_1 = deflateRaw; - var gzip_1 = gzip; - var constants = constants$1; - - var deflate_1 = { - Deflate: Deflate_1, - deflate: deflate_2, - deflateRaw: deflateRaw_1, - gzip: gzip_1, - constants: constants - }; - - exports.Deflate = Deflate_1; - exports.constants = constants; - exports["default"] = deflate_1; - exports.deflate = deflate_2; - exports.deflateRaw = deflateRaw_1; - exports.gzip = gzip_1; - - Object.defineProperty(exports, '__esModule', { value: true }); - -})); diff --git a/node_modules/pako/dist/pako_deflate.min.js b/node_modules/pako/dist/pako_deflate.min.js deleted file mode 100644 index b560534..0000000 --- a/node_modules/pako/dist/pako_deflate.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).pako={})}(this,(function(t){"use strict";function e(t){let e=t.length;for(;--e>=0;)t[e]=0}const a=256,s=286,n=30,r=15,i=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]),_=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]),l=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),h=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),o=new Array(576);e(o);const d=new Array(60);e(d);const u=new Array(512);e(u);const f=new Array(256);e(f);const c=new Array(29);e(c);const p=new Array(n);function g(t,e,a,s,n){this.static_tree=t,this.extra_bits=e,this.extra_base=a,this.elems=s,this.max_length=n,this.has_stree=t&&t.length}let w,m,b;function y(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}e(p);const v=t=>t<256?u[t]:u[256+(t>>>7)],z=(t,e)=>{t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255},k=(t,e,a)=>{t.bi_valid>16-a?(t.bi_buf|=e<>16-t.bi_valid,t.bi_valid+=a-16):(t.bi_buf|=e<{k(t,a[2*e],a[2*e+1])},A=(t,e)=>{let a=0;do{a|=1&t,t>>>=1,a<<=1}while(--e>0);return a>>>1},E=(t,e,a)=>{const s=new Array(16);let n,i,_=0;for(n=1;n<=r;n++)_=_+a[n-1]<<1,s[n]=_;for(i=0;i<=e;i++){let e=t[2*i+1];0!==e&&(t[2*i]=A(s[e]++,e))}},Z=t=>{let e;for(e=0;e{t.bi_valid>8?z(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0},R=(t,e,a,s)=>{const n=2*e,r=2*a;return t[n]{const s=t.heap[a];let n=a<<1;for(;n<=t.heap_len&&(n{let n,r,l,h,o=0;if(0!==t.sym_next)do{n=255&t.pending_buf[t.sym_buf+o++],n+=(255&t.pending_buf[t.sym_buf+o++])<<8,r=t.pending_buf[t.sym_buf+o++],0===n?x(t,r,e):(l=f[r],x(t,l+a+1,e),h=i[l],0!==h&&(r-=c[l],k(t,r,h)),n--,l=v(n),x(t,l,s),h=_[l],0!==h&&(n-=p[l],k(t,n,h)))}while(o{const a=e.dyn_tree,s=e.stat_desc.static_tree,n=e.stat_desc.has_stree,i=e.stat_desc.elems;let _,l,h,o=-1;for(t.heap_len=0,t.heap_max=573,_=0;_>1;_>=1;_--)S(t,a,_);h=i;do{_=t.heap[1],t.heap[1]=t.heap[t.heap_len--],S(t,a,1),l=t.heap[1],t.heap[--t.heap_max]=_,t.heap[--t.heap_max]=l,a[2*h]=a[2*_]+a[2*l],t.depth[h]=(t.depth[_]>=t.depth[l]?t.depth[_]:t.depth[l])+1,a[2*_+1]=a[2*l+1]=h,t.heap[1]=h++,S(t,a,1)}while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],((t,e)=>{const a=e.dyn_tree,s=e.max_code,n=e.stat_desc.static_tree,i=e.stat_desc.has_stree,_=e.stat_desc.extra_bits,l=e.stat_desc.extra_base,h=e.stat_desc.max_length;let o,d,u,f,c,p,g=0;for(f=0;f<=r;f++)t.bl_count[f]=0;for(a[2*t.heap[t.heap_max]+1]=0,o=t.heap_max+1;o<573;o++)d=t.heap[o],f=a[2*a[2*d+1]+1]+1,f>h&&(f=h,g++),a[2*d+1]=f,d>s||(t.bl_count[f]++,c=0,d>=l&&(c=_[d-l]),p=a[2*d],t.opt_len+=p*(f+c),i&&(t.static_len+=p*(n[2*d+1]+c)));if(0!==g){do{for(f=h-1;0===t.bl_count[f];)f--;t.bl_count[f]--,t.bl_count[f+1]+=2,t.bl_count[h]--,g-=2}while(g>0);for(f=h;0!==f;f--)for(d=t.bl_count[f];0!==d;)u=t.heap[--o],u>s||(a[2*u+1]!==f&&(t.opt_len+=(f-a[2*u+1])*a[2*u],a[2*u+1]=f),d--)}})(t,e),E(a,o,t.bl_count)},F=(t,e,a)=>{let s,n,r=-1,i=e[1],_=0,l=7,h=4;for(0===i&&(l=138,h=3),e[2*(a+1)+1]=65535,s=0;s<=a;s++)n=i,i=e[2*(s+1)+1],++_{let s,n,r=-1,i=e[1],_=0,l=7,h=4;for(0===i&&(l=138,h=3),s=0;s<=a;s++)if(n=i,i=e[2*(s+1)+1],!(++_{k(t,0+(s?1:0),3),U(t),z(t,a),z(t,~a),a&&t.pending_buf.set(t.window.subarray(e,e+a),t.pending),t.pending+=a};var I=(t,e,s,n)=>{let r,i,_=0;t.level>0?(2===t.strm.data_type&&(t.strm.data_type=(t=>{let e,s=4093624447;for(e=0;e<=31;e++,s>>>=1)if(1&s&&0!==t.dyn_ltree[2*e])return 0;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return 1;for(e=32;e{let e;for(F(t,t.dyn_ltree,t.l_desc.max_code),F(t,t.dyn_dtree,t.d_desc.max_code),L(t,t.bl_desc),e=18;e>=3&&0===t.bl_tree[2*h[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e})(t),r=t.opt_len+3+7>>>3,i=t.static_len+3+7>>>3,i<=r&&(r=i)):r=i=s+5,s+4<=r&&-1!==e?N(t,e,s,n):4===t.strategy||i===r?(k(t,2+(n?1:0),3),T(t,o,d)):(k(t,4+(n?1:0),3),((t,e,a,s)=>{let n;for(k(t,e-257,5),k(t,a-1,5),k(t,s-4,4),n=0;n{D||((()=>{let t,e,a,h,y;const v=new Array(16);for(a=0,h=0;h<28;h++)for(c[h]=a,t=0;t<1<>=7;h(t.pending_buf[t.sym_buf+t.sym_next++]=e,t.pending_buf[t.sym_buf+t.sym_next++]=e>>8,t.pending_buf[t.sym_buf+t.sym_next++]=s,0===e?t.dyn_ltree[2*s]++:(t.matches++,e--,t.dyn_ltree[2*(f[s]+a+1)]++,t.dyn_dtree[2*v(e)]++),t.sym_next===t.sym_end),_tr_align:t=>{k(t,2,3),x(t,256,o),(t=>{16===t.bi_valid?(z(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)})(t)}};var B=(t,e,a,s)=>{let n=65535&t|0,r=t>>>16&65535|0,i=0;for(;0!==a;){i=a>2e3?2e3:a,a-=i;do{n=n+e[s++]|0,r=r+n|0}while(--i);n%=65521,r%=65521}return n|r<<16|0};const H=new Uint32Array((()=>{let t,e=[];for(var a=0;a<256;a++){t=a;for(var s=0;s<8;s++)t=1&t?3988292384^t>>>1:t>>>1;e[a]=t}return e})());var M=(t,e,a,s)=>{const n=H,r=s+a;t^=-1;for(let a=s;a>>8^n[255&(t^e[a])];return-1^t},P={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},j={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{_tr_init:K,_tr_stored_block:Y,_tr_flush_block:G,_tr_tally:X,_tr_align:W}=C,{Z_NO_FLUSH:q,Z_PARTIAL_FLUSH:J,Z_FULL_FLUSH:Q,Z_FINISH:V,Z_BLOCK:$,Z_OK:tt,Z_STREAM_END:et,Z_STREAM_ERROR:at,Z_DATA_ERROR:st,Z_BUF_ERROR:nt,Z_DEFAULT_COMPRESSION:rt,Z_FILTERED:it,Z_HUFFMAN_ONLY:_t,Z_RLE:lt,Z_FIXED:ht,Z_DEFAULT_STRATEGY:ot,Z_UNKNOWN:dt,Z_DEFLATED:ut}=j,ft=258,ct=262,pt=42,gt=113,wt=666,mt=(t,e)=>(t.msg=P[e],e),bt=t=>2*t-(t>4?9:0),yt=t=>{let e=t.length;for(;--e>=0;)t[e]=0},vt=t=>{let e,a,s,n=t.w_size;e=t.hash_size,s=e;do{a=t.head[--s],t.head[s]=a>=n?a-n:0}while(--e);e=n,s=e;do{a=t.prev[--s],t.prev[s]=a>=n?a-n:0}while(--e)};let zt=(t,e,a)=>(e<{const e=t.state;let a=e.pending;a>t.avail_out&&(a=t.avail_out),0!==a&&(t.output.set(e.pending_buf.subarray(e.pending_out,e.pending_out+a),t.next_out),t.next_out+=a,e.pending_out+=a,t.total_out+=a,t.avail_out-=a,e.pending-=a,0===e.pending&&(e.pending_out=0))},xt=(t,e)=>{G(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,kt(t.strm)},At=(t,e)=>{t.pending_buf[t.pending++]=e},Et=(t,e)=>{t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e},Zt=(t,e,a,s)=>{let n=t.avail_in;return n>s&&(n=s),0===n?0:(t.avail_in-=n,e.set(t.input.subarray(t.next_in,t.next_in+n),a),1===t.state.wrap?t.adler=B(t.adler,e,n,a):2===t.state.wrap&&(t.adler=M(t.adler,e,n,a)),t.next_in+=n,t.total_in+=n,n)},Ut=(t,e)=>{let a,s,n=t.max_chain_length,r=t.strstart,i=t.prev_length,_=t.nice_match;const l=t.strstart>t.w_size-ct?t.strstart-(t.w_size-ct):0,h=t.window,o=t.w_mask,d=t.prev,u=t.strstart+ft;let f=h[r+i-1],c=h[r+i];t.prev_length>=t.good_match&&(n>>=2),_>t.lookahead&&(_=t.lookahead);do{if(a=e,h[a+i]===c&&h[a+i-1]===f&&h[a]===h[r]&&h[++a]===h[r+1]){r+=2,a++;do{}while(h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&ri){if(t.match_start=e,i=s,s>=_)break;f=h[r+i-1],c=h[r+i]}}}while((e=d[e&o])>l&&0!=--n);return i<=t.lookahead?i:t.lookahead},Rt=t=>{const e=t.w_size;let a,s,n;do{if(s=t.window_size-t.lookahead-t.strstart,t.strstart>=e+(e-ct)&&(t.window.set(t.window.subarray(e,e+e-s),0),t.match_start-=e,t.strstart-=e,t.block_start-=e,t.insert>t.strstart&&(t.insert=t.strstart),vt(t),s+=e),0===t.strm.avail_in)break;if(a=Zt(t.strm,t.window,t.strstart+t.lookahead,s),t.lookahead+=a,t.lookahead+t.insert>=3)for(n=t.strstart-t.insert,t.ins_h=t.window[n],t.ins_h=zt(t,t.ins_h,t.window[n+1]);t.insert&&(t.ins_h=zt(t,t.ins_h,t.window[n+3-1]),t.prev[n&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=n,n++,t.insert--,!(t.lookahead+t.insert<3)););}while(t.lookahead{let a,s,n,r=t.pending_buf_size-5>t.w_size?t.w_size:t.pending_buf_size-5,i=0,_=t.strm.avail_in;do{if(a=65535,n=t.bi_valid+42>>3,t.strm.avail_outs+t.strm.avail_in&&(a=s+t.strm.avail_in),a>n&&(a=n),a>8,t.pending_buf[t.pending-2]=~a,t.pending_buf[t.pending-1]=~a>>8,kt(t.strm),s&&(s>a&&(s=a),t.strm.output.set(t.window.subarray(t.block_start,t.block_start+s),t.strm.next_out),t.strm.next_out+=s,t.strm.avail_out-=s,t.strm.total_out+=s,t.block_start+=s,a-=s),a&&(Zt(t.strm,t.strm.output,t.strm.next_out,a),t.strm.next_out+=a,t.strm.avail_out-=a,t.strm.total_out+=a)}while(0===i);return _-=t.strm.avail_in,_&&(_>=t.w_size?(t.matches=2,t.window.set(t.strm.input.subarray(t.strm.next_in-t.w_size,t.strm.next_in),0),t.strstart=t.w_size,t.insert=t.strstart):(t.window_size-t.strstart<=_&&(t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,t.insert>t.strstart&&(t.insert=t.strstart)),t.window.set(t.strm.input.subarray(t.strm.next_in-_,t.strm.next_in),t.strstart),t.strstart+=_,t.insert+=_>t.w_size-t.insert?t.w_size-t.insert:_),t.block_start=t.strstart),t.high_watern&&t.block_start>=t.w_size&&(t.block_start-=t.w_size,t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,n+=t.w_size,t.insert>t.strstart&&(t.insert=t.strstart)),n>t.strm.avail_in&&(n=t.strm.avail_in),n&&(Zt(t.strm,t.window,t.strstart,n),t.strstart+=n,t.insert+=n>t.w_size-t.insert?t.w_size-t.insert:n),t.high_water>3,n=t.pending_buf_size-n>65535?65535:t.pending_buf_size-n,r=n>t.w_size?t.w_size:n,s=t.strstart-t.block_start,(s>=r||(s||e===V)&&e!==q&&0===t.strm.avail_in&&s<=n)&&(a=s>n?n:s,i=e===V&&0===t.strm.avail_in&&a===s?1:0,Y(t,t.block_start,a,i),t.block_start+=a,kt(t.strm)),i?3:1)},Tt=(t,e)=>{let a,s;for(;;){if(t.lookahead=3&&(t.ins_h=zt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),0!==a&&t.strstart-a<=t.w_size-ct&&(t.match_length=Ut(t,a)),t.match_length>=3)if(s=X(t,t.strstart-t.match_start,t.match_length-3),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=3){t.match_length--;do{t.strstart++,t.ins_h=zt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart}while(0!=--t.match_length);t.strstart++}else t.strstart+=t.match_length,t.match_length=0,t.ins_h=t.window[t.strstart],t.ins_h=zt(t,t.ins_h,t.window[t.strstart+1]);else s=X(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++;if(s&&(xt(t,!1),0===t.strm.avail_out))return 1}return t.insert=t.strstart<2?t.strstart:2,e===V?(xt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(xt(t,!1),0===t.strm.avail_out)?1:2},Lt=(t,e)=>{let a,s,n;for(;;){if(t.lookahead=3&&(t.ins_h=zt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),t.prev_length=t.match_length,t.prev_match=t.match_start,t.match_length=2,0!==a&&t.prev_length4096)&&(t.match_length=2)),t.prev_length>=3&&t.match_length<=t.prev_length){n=t.strstart+t.lookahead-3,s=X(t,t.strstart-1-t.prev_match,t.prev_length-3),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=n&&(t.ins_h=zt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart)}while(0!=--t.prev_length);if(t.match_available=0,t.match_length=2,t.strstart++,s&&(xt(t,!1),0===t.strm.avail_out))return 1}else if(t.match_available){if(s=X(t,0,t.window[t.strstart-1]),s&&xt(t,!1),t.strstart++,t.lookahead--,0===t.strm.avail_out)return 1}else t.match_available=1,t.strstart++,t.lookahead--}return t.match_available&&(s=X(t,0,t.window[t.strstart-1]),t.match_available=0),t.insert=t.strstart<2?t.strstart:2,e===V?(xt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(xt(t,!1),0===t.strm.avail_out)?1:2};function Ft(t,e,a,s,n){this.good_length=t,this.max_lazy=e,this.nice_length=a,this.max_chain=s,this.func=n}const Ot=[new Ft(0,0,0,0,St),new Ft(4,4,8,4,Tt),new Ft(4,5,16,8,Tt),new Ft(4,6,32,32,Tt),new Ft(4,4,16,16,Lt),new Ft(8,16,32,32,Lt),new Ft(8,16,128,128,Lt),new Ft(8,32,128,256,Lt),new Ft(32,128,258,1024,Lt),new Ft(32,258,258,4096,Lt)];function Dt(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=ut,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Uint16Array(1146),this.dyn_dtree=new Uint16Array(122),this.bl_tree=new Uint16Array(78),yt(this.dyn_ltree),yt(this.dyn_dtree),yt(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Uint16Array(16),this.heap=new Uint16Array(573),yt(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(573),yt(this.depth),this.sym_buf=0,this.lit_bufsize=0,this.sym_next=0,this.sym_end=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}const Nt=t=>{if(!t)return 1;const e=t.state;return!e||e.strm!==t||e.status!==pt&&57!==e.status&&69!==e.status&&73!==e.status&&91!==e.status&&103!==e.status&&e.status!==gt&&e.status!==wt?1:0},It=t=>{if(Nt(t))return mt(t,at);t.total_in=t.total_out=0,t.data_type=dt;const e=t.state;return e.pending=0,e.pending_out=0,e.wrap<0&&(e.wrap=-e.wrap),e.status=2===e.wrap?57:e.wrap?pt:gt,t.adler=2===e.wrap?0:1,e.last_flush=-2,K(e),tt},Ct=t=>{const e=It(t);var a;return e===tt&&((a=t.state).window_size=2*a.w_size,yt(a.head),a.max_lazy_match=Ot[a.level].max_lazy,a.good_match=Ot[a.level].good_length,a.nice_match=Ot[a.level].nice_length,a.max_chain_length=Ot[a.level].max_chain,a.strstart=0,a.block_start=0,a.lookahead=0,a.insert=0,a.match_length=a.prev_length=2,a.match_available=0,a.ins_h=0),e},Bt=(t,e,a,s,n,r)=>{if(!t)return at;let i=1;if(e===rt&&(e=6),s<0?(i=0,s=-s):s>15&&(i=2,s-=16),n<1||n>9||a!==ut||s<8||s>15||e<0||e>9||r<0||r>ht||8===s&&1!==i)return mt(t,at);8===s&&(s=9);const _=new Dt;return t.state=_,_.strm=t,_.status=pt,_.wrap=i,_.gzhead=null,_.w_bits=s,_.w_size=1<<_.w_bits,_.w_mask=_.w_size-1,_.hash_bits=n+7,_.hash_size=1<<_.hash_bits,_.hash_mask=_.hash_size-1,_.hash_shift=~~((_.hash_bits+3-1)/3),_.window=new Uint8Array(2*_.w_size),_.head=new Uint16Array(_.hash_size),_.prev=new Uint16Array(_.w_size),_.lit_bufsize=1<Bt(t,e,ut,15,8,ot),deflateInit2:Bt,deflateReset:Ct,deflateResetKeep:It,deflateSetHeader:(t,e)=>Nt(t)||2!==t.state.wrap?at:(t.state.gzhead=e,tt),deflate:(t,e)=>{if(Nt(t)||e>$||e<0)return t?mt(t,at):at;const a=t.state;if(!t.output||0!==t.avail_in&&!t.input||a.status===wt&&e!==V)return mt(t,0===t.avail_out?nt:at);const s=a.last_flush;if(a.last_flush=e,0!==a.pending){if(kt(t),0===t.avail_out)return a.last_flush=-1,tt}else if(0===t.avail_in&&bt(e)<=bt(s)&&e!==V)return mt(t,nt);if(a.status===wt&&0!==t.avail_in)return mt(t,nt);if(a.status===pt&&0===a.wrap&&(a.status=gt),a.status===pt){let e=ut+(a.w_bits-8<<4)<<8,s=-1;if(s=a.strategy>=_t||a.level<2?0:a.level<6?1:6===a.level?2:3,e|=s<<6,0!==a.strstart&&(e|=32),e+=31-e%31,Et(a,e),0!==a.strstart&&(Et(a,t.adler>>>16),Et(a,65535&t.adler)),t.adler=1,a.status=gt,kt(t),0!==a.pending)return a.last_flush=-1,tt}if(57===a.status)if(t.adler=0,At(a,31),At(a,139),At(a,8),a.gzhead)At(a,(a.gzhead.text?1:0)+(a.gzhead.hcrc?2:0)+(a.gzhead.extra?4:0)+(a.gzhead.name?8:0)+(a.gzhead.comment?16:0)),At(a,255&a.gzhead.time),At(a,a.gzhead.time>>8&255),At(a,a.gzhead.time>>16&255),At(a,a.gzhead.time>>24&255),At(a,9===a.level?2:a.strategy>=_t||a.level<2?4:0),At(a,255&a.gzhead.os),a.gzhead.extra&&a.gzhead.extra.length&&(At(a,255&a.gzhead.extra.length),At(a,a.gzhead.extra.length>>8&255)),a.gzhead.hcrc&&(t.adler=M(t.adler,a.pending_buf,a.pending,0)),a.gzindex=0,a.status=69;else if(At(a,0),At(a,0),At(a,0),At(a,0),At(a,0),At(a,9===a.level?2:a.strategy>=_t||a.level<2?4:0),At(a,3),a.status=gt,kt(t),0!==a.pending)return a.last_flush=-1,tt;if(69===a.status){if(a.gzhead.extra){let e=a.pending,s=(65535&a.gzhead.extra.length)-a.gzindex;for(;a.pending+s>a.pending_buf_size;){let n=a.pending_buf_size-a.pending;if(a.pending_buf.set(a.gzhead.extra.subarray(a.gzindex,a.gzindex+n),a.pending),a.pending=a.pending_buf_size,a.gzhead.hcrc&&a.pending>e&&(t.adler=M(t.adler,a.pending_buf,a.pending-e,e)),a.gzindex+=n,kt(t),0!==a.pending)return a.last_flush=-1,tt;e=0,s-=n}let n=new Uint8Array(a.gzhead.extra);a.pending_buf.set(n.subarray(a.gzindex,a.gzindex+s),a.pending),a.pending+=s,a.gzhead.hcrc&&a.pending>e&&(t.adler=M(t.adler,a.pending_buf,a.pending-e,e)),a.gzindex=0}a.status=73}if(73===a.status){if(a.gzhead.name){let e,s=a.pending;do{if(a.pending===a.pending_buf_size){if(a.gzhead.hcrc&&a.pending>s&&(t.adler=M(t.adler,a.pending_buf,a.pending-s,s)),kt(t),0!==a.pending)return a.last_flush=-1,tt;s=0}e=a.gzindexs&&(t.adler=M(t.adler,a.pending_buf,a.pending-s,s)),a.gzindex=0}a.status=91}if(91===a.status){if(a.gzhead.comment){let e,s=a.pending;do{if(a.pending===a.pending_buf_size){if(a.gzhead.hcrc&&a.pending>s&&(t.adler=M(t.adler,a.pending_buf,a.pending-s,s)),kt(t),0!==a.pending)return a.last_flush=-1,tt;s=0}e=a.gzindexs&&(t.adler=M(t.adler,a.pending_buf,a.pending-s,s))}a.status=103}if(103===a.status){if(a.gzhead.hcrc){if(a.pending+2>a.pending_buf_size&&(kt(t),0!==a.pending))return a.last_flush=-1,tt;At(a,255&t.adler),At(a,t.adler>>8&255),t.adler=0}if(a.status=gt,kt(t),0!==a.pending)return a.last_flush=-1,tt}if(0!==t.avail_in||0!==a.lookahead||e!==q&&a.status!==wt){let s=0===a.level?St(a,e):a.strategy===_t?((t,e)=>{let a;for(;;){if(0===t.lookahead&&(Rt(t),0===t.lookahead)){if(e===q)return 1;break}if(t.match_length=0,a=X(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,a&&(xt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===V?(xt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(xt(t,!1),0===t.strm.avail_out)?1:2})(a,e):a.strategy===lt?((t,e)=>{let a,s,n,r;const i=t.window;for(;;){if(t.lookahead<=ft){if(Rt(t),t.lookahead<=ft&&e===q)return 1;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=3&&t.strstart>0&&(n=t.strstart-1,s=i[n],s===i[++n]&&s===i[++n]&&s===i[++n])){r=t.strstart+ft;do{}while(s===i[++n]&&s===i[++n]&&s===i[++n]&&s===i[++n]&&s===i[++n]&&s===i[++n]&&s===i[++n]&&s===i[++n]&&nt.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=3?(a=X(t,1,t.match_length-3),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(a=X(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),a&&(xt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===V?(xt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(xt(t,!1),0===t.strm.avail_out)?1:2})(a,e):Ot[a.level].func(a,e);if(3!==s&&4!==s||(a.status=wt),1===s||3===s)return 0===t.avail_out&&(a.last_flush=-1),tt;if(2===s&&(e===J?W(a):e!==$&&(Y(a,0,0,!1),e===Q&&(yt(a.head),0===a.lookahead&&(a.strstart=0,a.block_start=0,a.insert=0))),kt(t),0===t.avail_out))return a.last_flush=-1,tt}return e!==V?tt:a.wrap<=0?et:(2===a.wrap?(At(a,255&t.adler),At(a,t.adler>>8&255),At(a,t.adler>>16&255),At(a,t.adler>>24&255),At(a,255&t.total_in),At(a,t.total_in>>8&255),At(a,t.total_in>>16&255),At(a,t.total_in>>24&255)):(Et(a,t.adler>>>16),Et(a,65535&t.adler)),kt(t),a.wrap>0&&(a.wrap=-a.wrap),0!==a.pending?tt:et)},deflateEnd:t=>{if(Nt(t))return at;const e=t.state.status;return t.state=null,e===gt?mt(t,st):tt},deflateSetDictionary:(t,e)=>{let a=e.length;if(Nt(t))return at;const s=t.state,n=s.wrap;if(2===n||1===n&&s.status!==pt||s.lookahead)return at;if(1===n&&(t.adler=B(t.adler,e,a,0)),s.wrap=0,a>=s.w_size){0===n&&(yt(s.head),s.strstart=0,s.block_start=0,s.insert=0);let t=new Uint8Array(s.w_size);t.set(e.subarray(a-s.w_size,a),0),e=t,a=s.w_size}const r=t.avail_in,i=t.next_in,_=t.input;for(t.avail_in=a,t.next_in=0,t.input=e,Rt(s);s.lookahead>=3;){let t=s.strstart,e=s.lookahead-2;do{s.ins_h=zt(s,s.ins_h,s.window[t+3-1]),s.prev[t&s.w_mask]=s.head[s.ins_h],s.head[s.ins_h]=t,t++}while(--e);s.strstart=t,s.lookahead=2,Rt(s)}return s.strstart+=s.lookahead,s.block_start=s.strstart,s.insert=s.lookahead,s.lookahead=0,s.match_length=s.prev_length=2,s.match_available=0,t.next_in=i,t.input=_,t.avail_in=r,s.wrap=n,tt},deflateInfo:"pako deflate (from Nodeca project)"};const Mt=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var Pt=function(t){const e=Array.prototype.slice.call(arguments,1);for(;e.length;){const a=e.shift();if(a){if("object"!=typeof a)throw new TypeError(a+"must be non-object");for(const e in a)Mt(a,e)&&(t[e]=a[e])}}return t},jt=t=>{let e=0;for(let a=0,s=t.length;a=252?6:t>=248?5:t>=240?4:t>=224?3:t>=192?2:1;Yt[254]=Yt[254]=1;var Gt=t=>{if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(t);let e,a,s,n,r,i=t.length,_=0;for(n=0;n>>6,e[r++]=128|63&a):a<65536?(e[r++]=224|a>>>12,e[r++]=128|a>>>6&63,e[r++]=128|63&a):(e[r++]=240|a>>>18,e[r++]=128|a>>>12&63,e[r++]=128|a>>>6&63,e[r++]=128|63&a);return e};var Xt=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0};const Wt=Object.prototype.toString,{Z_NO_FLUSH:qt,Z_SYNC_FLUSH:Jt,Z_FULL_FLUSH:Qt,Z_FINISH:Vt,Z_OK:$t,Z_STREAM_END:te,Z_DEFAULT_COMPRESSION:ee,Z_DEFAULT_STRATEGY:ae,Z_DEFLATED:se}=j;function ne(t){this.options=Pt({level:ee,method:se,chunkSize:16384,windowBits:15,memLevel:8,strategy:ae},t||{});let e=this.options;e.raw&&e.windowBits>0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new Xt,this.strm.avail_out=0;let a=Ht.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(a!==$t)throw new Error(P[a]);if(e.header&&Ht.deflateSetHeader(this.strm,e.header),e.dictionary){let t;if(t="string"==typeof e.dictionary?Gt(e.dictionary):"[object ArrayBuffer]"===Wt.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,a=Ht.deflateSetDictionary(this.strm,t),a!==$t)throw new Error(P[a]);this._dict_set=!0}}function re(t,e){const a=new ne(e);if(a.push(t,!0),a.err)throw a.msg||P[a.err];return a.result}ne.prototype.push=function(t,e){const a=this.strm,s=this.options.chunkSize;let n,r;if(this.ended)return!1;for(r=e===~~e?e:!0===e?Vt:qt,"string"==typeof t?a.input=Gt(t):"[object ArrayBuffer]"===Wt.call(t)?a.input=new Uint8Array(t):a.input=t,a.next_in=0,a.avail_in=a.input.length;;)if(0===a.avail_out&&(a.output=new Uint8Array(s),a.next_out=0,a.avail_out=s),(r===Jt||r===Qt)&&a.avail_out<=6)this.onData(a.output.subarray(0,a.next_out)),a.avail_out=0;else{if(n=Ht.deflate(a,r),n===te)return a.next_out>0&&this.onData(a.output.subarray(0,a.next_out)),n=Ht.deflateEnd(this.strm),this.onEnd(n),this.ended=!0,n===$t;if(0!==a.avail_out){if(r>0&&a.next_out>0)this.onData(a.output.subarray(0,a.next_out)),a.avail_out=0;else if(0===a.avail_in)break}else this.onData(a.output)}return!0},ne.prototype.onData=function(t){this.chunks.push(t)},ne.prototype.onEnd=function(t){t===$t&&(this.result=jt(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var ie=ne,_e=re,le=function(t,e){return(e=e||{}).raw=!0,re(t,e)},he=function(t,e){return(e=e||{}).gzip=!0,re(t,e)},oe=j,de={Deflate:ie,deflate:_e,deflateRaw:le,gzip:he,constants:oe};t.Deflate=ie,t.constants=oe,t.default=de,t.deflate=_e,t.deflateRaw=le,t.gzip=he,Object.defineProperty(t,"__esModule",{value:!0})})); diff --git a/node_modules/pako/dist/pako_inflate.es5.js b/node_modules/pako/dist/pako_inflate.es5.js deleted file mode 100644 index 5b51c3b..0000000 --- a/node_modules/pako/dist/pako_inflate.es5.js +++ /dev/null @@ -1,3229 +0,0 @@ - -/*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : - typeof define === 'function' && define.amd ? define(['exports'], factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.pako = {})); -})(this, (function (exports) { 'use strict'; - - // Note: adler32 takes 12% for level 0 and 2% for level 6. - // It isn't worth it to make additional optimizations as in original. - // Small size is preferable. - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - var adler32 = function adler32(adler, buf, len, pos) { - var s1 = adler & 0xffff | 0, - s2 = adler >>> 16 & 0xffff | 0, - n = 0; - while (len !== 0) { - // Set limit ~ twice less than 5552, to keep - // s2 in 31-bits, because we force signed ints. - // in other case %= will fail. - n = len > 2000 ? 2000 : len; - len -= n; - do { - s1 = s1 + buf[pos++] | 0; - s2 = s2 + s1 | 0; - } while (--n); - s1 %= 65521; - s2 %= 65521; - } - return s1 | s2 << 16 | 0; - }; - var adler32_1 = adler32; - - // Note: we can't get significant speed boost here. - // So write code to minimize size - no pregenerated tables - // and array tools dependencies. - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - // Use ordinary array, since untyped makes no boost here - var makeTable = function makeTable() { - var c, - table = []; - for (var n = 0; n < 256; n++) { - c = n; - for (var k = 0; k < 8; k++) { - c = c & 1 ? 0xEDB88320 ^ c >>> 1 : c >>> 1; - } - table[n] = c; - } - return table; - }; - - // Create table on load. Just 255 signed longs. Not a problem. - var crcTable = new Uint32Array(makeTable()); - var crc32 = function crc32(crc, buf, len, pos) { - var t = crcTable; - var end = pos + len; - crc ^= -1; - for (var i = pos; i < end; i++) { - crc = crc >>> 8 ^ t[(crc ^ buf[i]) & 0xFF]; - } - return crc ^ -1; // >>> 0; - }; - - var crc32_1 = crc32; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - // See state defs from inflate.js - var BAD$1 = 16209; /* got a data error -- remain here until reset */ - var TYPE$1 = 16191; /* i: waiting for type bits, including last-flag bit */ - - /* - Decode literal, length, and distance codes and write out the resulting - literal and match bytes until either not enough input or output is - available, an end-of-block is encountered, or a data error is encountered. - When large enough input and output buffers are supplied to inflate(), for - example, a 16K input buffer and a 64K output buffer, more than 95% of the - inflate execution time is spent in this routine. - - Entry assumptions: - - state.mode === LEN - strm.avail_in >= 6 - strm.avail_out >= 258 - start >= strm.avail_out - state.bits < 8 - - On return, state.mode is one of: - - LEN -- ran out of enough output space or enough available input - TYPE -- reached end of block code, inflate() to interpret next block - BAD -- error in block data - - Notes: - - - The maximum input bits used by a length/distance pair is 15 bits for the - length code, 5 bits for the length extra, 15 bits for the distance code, - and 13 bits for the distance extra. This totals 48 bits, or six bytes. - Therefore if strm.avail_in >= 6, then there is enough input to avoid - checking for available input while decoding. - - - The maximum bytes that a single length/distance pair can output is 258 - bytes, which is the maximum length that can be coded. inflate_fast() - requires strm.avail_out >= 258 for each loop to avoid checking for - output space. - */ - var inffast = function inflate_fast(strm, start) { - var _in; /* local strm.input */ - var last; /* have enough input while in < last */ - var _out; /* local strm.output */ - var beg; /* inflate()'s initial strm.output */ - var end; /* while out < end, enough space available */ - //#ifdef INFLATE_STRICT - var dmax; /* maximum distance from zlib header */ - //#endif - var wsize; /* window size or zero if not using window */ - var whave; /* valid bytes in the window */ - var wnext; /* window write index */ - // Use `s_window` instead `window`, avoid conflict with instrumentation tools - var s_window; /* allocated sliding window, if wsize != 0 */ - var hold; /* local strm.hold */ - var bits; /* local strm.bits */ - var lcode; /* local strm.lencode */ - var dcode; /* local strm.distcode */ - var lmask; /* mask for first level of length codes */ - var dmask; /* mask for first level of distance codes */ - var here; /* retrieved table entry */ - var op; /* code bits, operation, extra bits, or */ - /* window position, window bytes to copy */ - var len; /* match length, unused bytes */ - var dist; /* match distance */ - var from; /* where to copy match from */ - var from_source; - var input, output; // JS specific, because we have no pointers - - /* copy state to local variables */ - var state = strm.state; - //here = state.here; - _in = strm.next_in; - input = strm.input; - last = _in + (strm.avail_in - 5); - _out = strm.next_out; - output = strm.output; - beg = _out - (start - strm.avail_out); - end = _out + (strm.avail_out - 257); - //#ifdef INFLATE_STRICT - dmax = state.dmax; - //#endif - wsize = state.wsize; - whave = state.whave; - wnext = state.wnext; - s_window = state.window; - hold = state.hold; - bits = state.bits; - lcode = state.lencode; - dcode = state.distcode; - lmask = (1 << state.lenbits) - 1; - dmask = (1 << state.distbits) - 1; - - /* decode literals and length/distances until end-of-block or not enough - input data or output space */ - - top: do { - if (bits < 15) { - hold += input[_in++] << bits; - bits += 8; - hold += input[_in++] << bits; - bits += 8; - } - here = lcode[hold & lmask]; - dolen: for (;;) { - // Goto emulation - op = here >>> 24 /*here.bits*/; - hold >>>= op; - bits -= op; - op = here >>> 16 & 0xff /*here.op*/; - if (op === 0) { - /* literal */ - //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - // "inflate: literal '%c'\n" : - // "inflate: literal 0x%02x\n", here.val)); - output[_out++] = here & 0xffff /*here.val*/; - } else if (op & 16) { - /* length base */ - len = here & 0xffff /*here.val*/; - op &= 15; /* number of extra bits */ - if (op) { - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - } - len += hold & (1 << op) - 1; - hold >>>= op; - bits -= op; - } - //Tracevv((stderr, "inflate: length %u\n", len)); - if (bits < 15) { - hold += input[_in++] << bits; - bits += 8; - hold += input[_in++] << bits; - bits += 8; - } - here = dcode[hold & dmask]; - dodist: for (;;) { - // goto emulation - op = here >>> 24 /*here.bits*/; - hold >>>= op; - bits -= op; - op = here >>> 16 & 0xff /*here.op*/; - - if (op & 16) { - /* distance base */ - dist = here & 0xffff /*here.val*/; - op &= 15; /* number of extra bits */ - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - } - } - dist += hold & (1 << op) - 1; - //#ifdef INFLATE_STRICT - if (dist > dmax) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD$1; - break top; - } - //#endif - hold >>>= op; - bits -= op; - //Tracevv((stderr, "inflate: distance %u\n", dist)); - op = _out - beg; /* max distance in output */ - if (dist > op) { - /* see if copy from window */ - op = dist - op; /* distance back in window */ - if (op > whave) { - if (state.sane) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD$1; - break top; - } - - // (!) This block is disabled in zlib defaults, - // don't enable it for binary compatibility - //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR - // if (len <= op - whave) { - // do { - // output[_out++] = 0; - // } while (--len); - // continue top; - // } - // len -= op - whave; - // do { - // output[_out++] = 0; - // } while (--op > whave); - // if (op === 0) { - // from = _out - dist; - // do { - // output[_out++] = output[from++]; - // } while (--len); - // continue top; - // } - //#endif - } - - from = 0; // window index - from_source = s_window; - if (wnext === 0) { - /* very common case */ - from += wsize - op; - if (op < len) { - /* some from window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } else if (wnext < op) { - /* wrap around window */ - from += wsize + wnext - op; - op -= wnext; - if (op < len) { - /* some from end of window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = 0; - if (wnext < len) { - /* some from start of window */ - op = wnext; - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - } else { - /* contiguous in window */ - from += wnext - op; - if (op < len) { - /* some from window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - while (len > 2) { - output[_out++] = from_source[from++]; - output[_out++] = from_source[from++]; - output[_out++] = from_source[from++]; - len -= 3; - } - if (len) { - output[_out++] = from_source[from++]; - if (len > 1) { - output[_out++] = from_source[from++]; - } - } - } else { - from = _out - dist; /* copy direct from output */ - do { - /* minimum length is three */ - output[_out++] = output[from++]; - output[_out++] = output[from++]; - output[_out++] = output[from++]; - len -= 3; - } while (len > 2); - if (len) { - output[_out++] = output[from++]; - if (len > 1) { - output[_out++] = output[from++]; - } - } - } - } else if ((op & 64) === 0) { - /* 2nd level distance code */ - here = dcode[(here & 0xffff /*here.val*/) + (hold & (1 << op) - 1)]; - continue dodist; - } else { - strm.msg = 'invalid distance code'; - state.mode = BAD$1; - break top; - } - break; // need to emulate goto via "continue" - } - } else if ((op & 64) === 0) { - /* 2nd level length code */ - here = lcode[(here & 0xffff /*here.val*/) + (hold & (1 << op) - 1)]; - continue dolen; - } else if (op & 32) { - /* end-of-block */ - //Tracevv((stderr, "inflate: end of block\n")); - state.mode = TYPE$1; - break top; - } else { - strm.msg = 'invalid literal/length code'; - state.mode = BAD$1; - break top; - } - break; // need to emulate goto via "continue" - } - } while (_in < last && _out < end); - - /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ - len = bits >> 3; - _in -= len; - bits -= len << 3; - hold &= (1 << bits) - 1; - - /* update state and return */ - strm.next_in = _in; - strm.next_out = _out; - strm.avail_in = _in < last ? 5 + (last - _in) : 5 - (_in - last); - strm.avail_out = _out < end ? 257 + (end - _out) : 257 - (_out - end); - state.hold = hold; - state.bits = bits; - return; - }; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - var MAXBITS = 15; - var ENOUGH_LENS$1 = 852; - var ENOUGH_DISTS$1 = 592; - //const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); - - var CODES$1 = 0; - var LENS$1 = 1; - var DISTS$1 = 2; - var lbase = new Uint16Array([/* Length codes 257..285 base */ - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0]); - var lext = new Uint8Array([/* Length codes 257..285 extra */ - 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78]); - var dbase = new Uint16Array([/* Distance codes 0..29 base */ - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0]); - var dext = new Uint8Array([/* Distance codes 0..29 extra */ - 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64]); - var inflate_table = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts) { - var bits = opts.bits; - //here = opts.here; /* table entry for duplication */ - - var len = 0; /* a code's length in bits */ - var sym = 0; /* index of code symbols */ - var min = 0, - max = 0; /* minimum and maximum code lengths */ - var root = 0; /* number of index bits for root table */ - var curr = 0; /* number of index bits for current table */ - var drop = 0; /* code bits to drop for sub-table */ - var left = 0; /* number of prefix codes available */ - var used = 0; /* code entries in table used */ - var huff = 0; /* Huffman code */ - var incr; /* for incrementing code, index */ - var fill; /* index for replicating entries */ - var low; /* low bits for current root entry */ - var mask; /* mask for low root bits */ - var next; /* next available space in table */ - var base = null; /* base value table to use */ - // let shoextra; /* extra bits table to use */ - var match; /* use base and extra for symbol >= match */ - var count = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */ - var offs = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */ - var extra = null; - var here_bits, here_op, here_val; - - /* - Process a set of code lengths to create a canonical Huffman code. The - code lengths are lens[0..codes-1]. Each length corresponds to the - symbols 0..codes-1. The Huffman code is generated by first sorting the - symbols by length from short to long, and retaining the symbol order - for codes with equal lengths. Then the code starts with all zero bits - for the first code of the shortest length, and the codes are integer - increments for the same length, and zeros are appended as the length - increases. For the deflate format, these bits are stored backwards - from their more natural integer increment ordering, and so when the - decoding tables are built in the large loop below, the integer codes - are incremented backwards. - This routine assumes, but does not check, that all of the entries in - lens[] are in the range 0..MAXBITS. The caller must assure this. - 1..MAXBITS is interpreted as that code length. zero means that that - symbol does not occur in this code. - The codes are sorted by computing a count of codes for each length, - creating from that a table of starting indices for each length in the - sorted table, and then entering the symbols in order in the sorted - table. The sorted table is work[], with that space being provided by - the caller. - The length counts are used for other purposes as well, i.e. finding - the minimum and maximum length codes, determining if there are any - codes at all, checking for a valid set of lengths, and looking ahead - at length counts to determine sub-table sizes when building the - decoding tables. - */ - - /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ - for (len = 0; len <= MAXBITS; len++) { - count[len] = 0; - } - for (sym = 0; sym < codes; sym++) { - count[lens[lens_index + sym]]++; - } - - /* bound code lengths, force root to be within code lengths */ - root = bits; - for (max = MAXBITS; max >= 1; max--) { - if (count[max] !== 0) { - break; - } - } - if (root > max) { - root = max; - } - if (max === 0) { - /* no symbols to code at all */ - //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */ - //table.bits[opts.table_index] = 1; //here.bits = (var char)1; - //table.val[opts.table_index++] = 0; //here.val = (var short)0; - table[table_index++] = 1 << 24 | 64 << 16 | 0; - - //table.op[opts.table_index] = 64; - //table.bits[opts.table_index] = 1; - //table.val[opts.table_index++] = 0; - table[table_index++] = 1 << 24 | 64 << 16 | 0; - opts.bits = 1; - return 0; /* no symbols, but wait for decoding to report error */ - } - - for (min = 1; min < max; min++) { - if (count[min] !== 0) { - break; - } - } - if (root < min) { - root = min; - } - - /* check for an over-subscribed or incomplete set of lengths */ - left = 1; - for (len = 1; len <= MAXBITS; len++) { - left <<= 1; - left -= count[len]; - if (left < 0) { - return -1; - } /* over-subscribed */ - } - - if (left > 0 && (type === CODES$1 || max !== 1)) { - return -1; /* incomplete set */ - } - - /* generate offsets into symbol table for each length for sorting */ - offs[1] = 0; - for (len = 1; len < MAXBITS; len++) { - offs[len + 1] = offs[len] + count[len]; - } - - /* sort symbols by length, by symbol order within each length */ - for (sym = 0; sym < codes; sym++) { - if (lens[lens_index + sym] !== 0) { - work[offs[lens[lens_index + sym]]++] = sym; - } - } - - /* - Create and fill in decoding tables. In this loop, the table being - filled is at next and has curr index bits. The code being used is huff - with length len. That code is converted to an index by dropping drop - bits off of the bottom. For codes where len is less than drop + curr, - those top drop + curr - len bits are incremented through all values to - fill the table with replicated entries. - root is the number of index bits for the root table. When len exceeds - root, sub-tables are created pointed to by the root entry with an index - of the low root bits of huff. This is saved in low to check for when a - new sub-table should be started. drop is zero when the root table is - being filled, and drop is root when sub-tables are being filled. - When a new sub-table is needed, it is necessary to look ahead in the - code lengths to determine what size sub-table is needed. The length - counts are used for this, and so count[] is decremented as codes are - entered in the tables. - used keeps track of how many table entries have been allocated from the - provided *table space. It is checked for LENS and DIST tables against - the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in - the initial root table size constants. See the comments in inftrees.h - for more information. - sym increments through all symbols, and the loop terminates when - all codes of length max, i.e. all codes, have been processed. This - routine permits incomplete codes, so another loop after this one fills - in the rest of the decoding tables with invalid code markers. - */ - - /* set up for code type */ - // poor man optimization - use if-else instead of switch, - // to avoid deopts in old v8 - if (type === CODES$1) { - base = extra = work; /* dummy value--not used */ - match = 20; - } else if (type === LENS$1) { - base = lbase; - extra = lext; - match = 257; - } else { - /* DISTS */ - base = dbase; - extra = dext; - match = 0; - } - - /* initialize opts for loop */ - huff = 0; /* starting code */ - sym = 0; /* starting code symbol */ - len = min; /* starting code length */ - next = table_index; /* current table to fill in */ - curr = root; /* current table index bits */ - drop = 0; /* current bits to drop from code for index */ - low = -1; /* trigger new sub-table when len > root */ - used = 1 << root; /* use root table entries */ - mask = used - 1; /* mask for comparing low */ - - /* check available table space */ - if (type === LENS$1 && used > ENOUGH_LENS$1 || type === DISTS$1 && used > ENOUGH_DISTS$1) { - return 1; - } - - /* process all codes and make table entries */ - for (;;) { - /* create table entry */ - here_bits = len - drop; - if (work[sym] + 1 < match) { - here_op = 0; - here_val = work[sym]; - } else if (work[sym] >= match) { - here_op = extra[work[sym] - match]; - here_val = base[work[sym] - match]; - } else { - here_op = 32 + 64; /* end of block */ - here_val = 0; - } - - /* replicate for those indices with low len bits equal to huff */ - incr = 1 << len - drop; - fill = 1 << curr; - min = fill; /* save offset to next table */ - do { - fill -= incr; - table[next + (huff >> drop) + fill] = here_bits << 24 | here_op << 16 | here_val | 0; - } while (fill !== 0); - - /* backwards increment the len-bit code huff */ - incr = 1 << len - 1; - while (huff & incr) { - incr >>= 1; - } - if (incr !== 0) { - huff &= incr - 1; - huff += incr; - } else { - huff = 0; - } - - /* go to next symbol, update count, len */ - sym++; - if (--count[len] === 0) { - if (len === max) { - break; - } - len = lens[lens_index + work[sym]]; - } - - /* create new sub-table if needed */ - if (len > root && (huff & mask) !== low) { - /* if first time, transition to sub-tables */ - if (drop === 0) { - drop = root; - } - - /* increment past last table */ - next += min; /* here min is 1 << curr */ - - /* determine length of next table */ - curr = len - drop; - left = 1 << curr; - while (curr + drop < max) { - left -= count[curr + drop]; - if (left <= 0) { - break; - } - curr++; - left <<= 1; - } - - /* check for enough space */ - used += 1 << curr; - if (type === LENS$1 && used > ENOUGH_LENS$1 || type === DISTS$1 && used > ENOUGH_DISTS$1) { - return 1; - } - - /* point entry in root table to sub-table */ - low = huff & mask; - /*table.op[low] = curr; - table.bits[low] = root; - table.val[low] = next - opts.table_index;*/ - table[low] = root << 24 | curr << 16 | next - table_index | 0; - } - } - - /* fill in remaining table entry if code is incomplete (guaranteed to have - at most one remaining entry, since if the code is incomplete, the - maximum code length that was allowed to get this far is one bit) */ - if (huff !== 0) { - //table.op[next + huff] = 64; /* invalid code marker */ - //table.bits[next + huff] = len - drop; - //table.val[next + huff] = 0; - table[next + huff] = len - drop << 24 | 64 << 16 | 0; - } - - /* set return parameters */ - //opts.table_index += used; - opts.bits = root; - return 0; - }; - var inftrees = inflate_table; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - var constants$1 = { - /* Allowed flush values; see deflate() and inflate() below for details */ - Z_NO_FLUSH: 0, - Z_PARTIAL_FLUSH: 1, - Z_SYNC_FLUSH: 2, - Z_FULL_FLUSH: 3, - Z_FINISH: 4, - Z_BLOCK: 5, - Z_TREES: 6, - /* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ - Z_OK: 0, - Z_STREAM_END: 1, - Z_NEED_DICT: 2, - Z_ERRNO: -1, - Z_STREAM_ERROR: -2, - Z_DATA_ERROR: -3, - Z_MEM_ERROR: -4, - Z_BUF_ERROR: -5, - //Z_VERSION_ERROR: -6, - - /* compression levels */ - Z_NO_COMPRESSION: 0, - Z_BEST_SPEED: 1, - Z_BEST_COMPRESSION: 9, - Z_DEFAULT_COMPRESSION: -1, - Z_FILTERED: 1, - Z_HUFFMAN_ONLY: 2, - Z_RLE: 3, - Z_FIXED: 4, - Z_DEFAULT_STRATEGY: 0, - /* Possible values of the data_type field (though see inflate()) */ - Z_BINARY: 0, - Z_TEXT: 1, - //Z_ASCII: 1, // = Z_TEXT (deprecated) - Z_UNKNOWN: 2, - /* The deflate compression method */ - Z_DEFLATED: 8 - //Z_NULL: null // Use -1 or null inline, depending on var type - }; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - var CODES = 0; - var LENS = 1; - var DISTS = 2; - - /* Public constants ==========================================================*/ - /* ===========================================================================*/ - - var Z_FINISH$1 = constants$1.Z_FINISH, - Z_BLOCK = constants$1.Z_BLOCK, - Z_TREES = constants$1.Z_TREES, - Z_OK$1 = constants$1.Z_OK, - Z_STREAM_END$1 = constants$1.Z_STREAM_END, - Z_NEED_DICT$1 = constants$1.Z_NEED_DICT, - Z_STREAM_ERROR$1 = constants$1.Z_STREAM_ERROR, - Z_DATA_ERROR$1 = constants$1.Z_DATA_ERROR, - Z_MEM_ERROR$1 = constants$1.Z_MEM_ERROR, - Z_BUF_ERROR = constants$1.Z_BUF_ERROR, - Z_DEFLATED = constants$1.Z_DEFLATED; - - /* STATES ====================================================================*/ - /* ===========================================================================*/ - - var HEAD = 16180; /* i: waiting for magic header */ - var FLAGS = 16181; /* i: waiting for method and flags (gzip) */ - var TIME = 16182; /* i: waiting for modification time (gzip) */ - var OS = 16183; /* i: waiting for extra flags and operating system (gzip) */ - var EXLEN = 16184; /* i: waiting for extra length (gzip) */ - var EXTRA = 16185; /* i: waiting for extra bytes (gzip) */ - var NAME = 16186; /* i: waiting for end of file name (gzip) */ - var COMMENT = 16187; /* i: waiting for end of comment (gzip) */ - var HCRC = 16188; /* i: waiting for header crc (gzip) */ - var DICTID = 16189; /* i: waiting for dictionary check value */ - var DICT = 16190; /* waiting for inflateSetDictionary() call */ - var TYPE = 16191; /* i: waiting for type bits, including last-flag bit */ - var TYPEDO = 16192; /* i: same, but skip check to exit inflate on new block */ - var STORED = 16193; /* i: waiting for stored size (length and complement) */ - var COPY_ = 16194; /* i/o: same as COPY below, but only first time in */ - var COPY = 16195; /* i/o: waiting for input or output to copy stored block */ - var TABLE = 16196; /* i: waiting for dynamic block table lengths */ - var LENLENS = 16197; /* i: waiting for code length code lengths */ - var CODELENS = 16198; /* i: waiting for length/lit and distance code lengths */ - var LEN_ = 16199; /* i: same as LEN below, but only first time in */ - var LEN = 16200; /* i: waiting for length/lit/eob code */ - var LENEXT = 16201; /* i: waiting for length extra bits */ - var DIST = 16202; /* i: waiting for distance code */ - var DISTEXT = 16203; /* i: waiting for distance extra bits */ - var MATCH = 16204; /* o: waiting for output space to copy string */ - var LIT = 16205; /* o: waiting for output space to write literal */ - var CHECK = 16206; /* i: waiting for 32-bit check value */ - var LENGTH = 16207; /* i: waiting for 32-bit length (gzip) */ - var DONE = 16208; /* finished check, done -- remain here until reset */ - var BAD = 16209; /* got a data error -- remain here until reset */ - var MEM = 16210; /* got an inflate() memory error -- remain here until reset */ - var SYNC = 16211; /* looking for synchronization bytes to restart inflate() */ - - /* ===========================================================================*/ - - var ENOUGH_LENS = 852; - var ENOUGH_DISTS = 592; - //const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); - - var MAX_WBITS = 15; - /* 32K LZ77 window */ - var DEF_WBITS = MAX_WBITS; - var zswap32 = function zswap32(q) { - return (q >>> 24 & 0xff) + (q >>> 8 & 0xff00) + ((q & 0xff00) << 8) + ((q & 0xff) << 24); - }; - function InflateState() { - this.strm = null; /* pointer back to this zlib stream */ - this.mode = 0; /* current inflate mode */ - this.last = false; /* true if processing last block */ - this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip, - bit 2 true to validate check value */ - this.havedict = false; /* true if dictionary provided */ - this.flags = 0; /* gzip header method and flags (0 if zlib), or - -1 if raw or no header yet */ - this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */ - this.check = 0; /* protected copy of check value */ - this.total = 0; /* protected copy of output count */ - // TODO: may be {} - this.head = null; /* where to save gzip header information */ - - /* sliding window */ - this.wbits = 0; /* log base 2 of requested window size */ - this.wsize = 0; /* window size or zero if not using window */ - this.whave = 0; /* valid bytes in the window */ - this.wnext = 0; /* window write index */ - this.window = null; /* allocated sliding window, if needed */ - - /* bit accumulator */ - this.hold = 0; /* input bit accumulator */ - this.bits = 0; /* number of bits in "in" */ - - /* for string and stored block copying */ - this.length = 0; /* literal or length of data to copy */ - this.offset = 0; /* distance back to copy string from */ - - /* for table and code decoding */ - this.extra = 0; /* extra bits needed */ - - /* fixed and dynamic code tables */ - this.lencode = null; /* starting table for length/literal codes */ - this.distcode = null; /* starting table for distance codes */ - this.lenbits = 0; /* index bits for lencode */ - this.distbits = 0; /* index bits for distcode */ - - /* dynamic table building */ - this.ncode = 0; /* number of code length code lengths */ - this.nlen = 0; /* number of length code lengths */ - this.ndist = 0; /* number of distance code lengths */ - this.have = 0; /* number of code lengths in lens[] */ - this.next = null; /* next available space in codes[] */ - - this.lens = new Uint16Array(320); /* temporary storage for code lengths */ - this.work = new Uint16Array(288); /* work area for code table building */ - - /* - because we don't have pointers in js, we use lencode and distcode directly - as buffers so we don't need codes - */ - //this.codes = new Int32Array(ENOUGH); /* space for code tables */ - this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */ - this.distdyn = null; /* dynamic table for distance codes (JS specific) */ - this.sane = 0; /* if false, allow invalid distance too far */ - this.back = 0; /* bits back of last unprocessed length/lit */ - this.was = 0; /* initial length of match */ - } - - var inflateStateCheck = function inflateStateCheck(strm) { - if (!strm) { - return 1; - } - var state = strm.state; - if (!state || state.strm !== strm || state.mode < HEAD || state.mode > SYNC) { - return 1; - } - return 0; - }; - var inflateResetKeep = function inflateResetKeep(strm) { - if (inflateStateCheck(strm)) { - return Z_STREAM_ERROR$1; - } - var state = strm.state; - strm.total_in = strm.total_out = state.total = 0; - strm.msg = ''; /*Z_NULL*/ - if (state.wrap) { - /* to support ill-conceived Java test suite */ - strm.adler = state.wrap & 1; - } - state.mode = HEAD; - state.last = 0; - state.havedict = 0; - state.flags = -1; - state.dmax = 32768; - state.head = null /*Z_NULL*/; - state.hold = 0; - state.bits = 0; - //state.lencode = state.distcode = state.next = state.codes; - state.lencode = state.lendyn = new Int32Array(ENOUGH_LENS); - state.distcode = state.distdyn = new Int32Array(ENOUGH_DISTS); - state.sane = 1; - state.back = -1; - //Tracev((stderr, "inflate: reset\n")); - return Z_OK$1; - }; - var inflateReset = function inflateReset(strm) { - if (inflateStateCheck(strm)) { - return Z_STREAM_ERROR$1; - } - var state = strm.state; - state.wsize = 0; - state.whave = 0; - state.wnext = 0; - return inflateResetKeep(strm); - }; - var inflateReset2 = function inflateReset2(strm, windowBits) { - var wrap; - - /* get the state */ - if (inflateStateCheck(strm)) { - return Z_STREAM_ERROR$1; - } - var state = strm.state; - - /* extract wrap request from windowBits parameter */ - if (windowBits < 0) { - wrap = 0; - windowBits = -windowBits; - } else { - wrap = (windowBits >> 4) + 5; - if (windowBits < 48) { - windowBits &= 15; - } - } - - /* set number of window bits, free window if different */ - if (windowBits && (windowBits < 8 || windowBits > 15)) { - return Z_STREAM_ERROR$1; - } - if (state.window !== null && state.wbits !== windowBits) { - state.window = null; - } - - /* update state and reset the rest of it */ - state.wrap = wrap; - state.wbits = windowBits; - return inflateReset(strm); - }; - var inflateInit2 = function inflateInit2(strm, windowBits) { - if (!strm) { - return Z_STREAM_ERROR$1; - } - //strm.msg = Z_NULL; /* in case we return an error */ - - var state = new InflateState(); - - //if (state === Z_NULL) return Z_MEM_ERROR; - //Tracev((stderr, "inflate: allocated\n")); - strm.state = state; - state.strm = strm; - state.window = null /*Z_NULL*/; - state.mode = HEAD; /* to pass state test in inflateReset2() */ - var ret = inflateReset2(strm, windowBits); - if (ret !== Z_OK$1) { - strm.state = null /*Z_NULL*/; - } - - return ret; - }; - var inflateInit = function inflateInit(strm) { - return inflateInit2(strm, DEF_WBITS); - }; - - /* - Return state with length and distance decoding tables and index sizes set to - fixed code decoding. Normally this returns fixed tables from inffixed.h. - If BUILDFIXED is defined, then instead this routine builds the tables the - first time it's called, and returns those tables the first time and - thereafter. This reduces the size of the code by about 2K bytes, in - exchange for a little execution time. However, BUILDFIXED should not be - used for threaded applications, since the rewriting of the tables and virgin - may not be thread-safe. - */ - var virgin = true; - var lenfix, distfix; // We have no pointers in JS, so keep tables separate - - var fixedtables = function fixedtables(state) { - /* build fixed huffman tables if first call (may not be thread safe) */ - if (virgin) { - lenfix = new Int32Array(512); - distfix = new Int32Array(32); - - /* literal/length table */ - var sym = 0; - while (sym < 144) { - state.lens[sym++] = 8; - } - while (sym < 256) { - state.lens[sym++] = 9; - } - while (sym < 280) { - state.lens[sym++] = 7; - } - while (sym < 288) { - state.lens[sym++] = 8; - } - inftrees(LENS, state.lens, 0, 288, lenfix, 0, state.work, { - bits: 9 - }); - - /* distance table */ - sym = 0; - while (sym < 32) { - state.lens[sym++] = 5; - } - inftrees(DISTS, state.lens, 0, 32, distfix, 0, state.work, { - bits: 5 - }); - - /* do this just once */ - virgin = false; - } - state.lencode = lenfix; - state.lenbits = 9; - state.distcode = distfix; - state.distbits = 5; - }; - - /* - Update the window with the last wsize (normally 32K) bytes written before - returning. If window does not exist yet, create it. This is only called - when a window is already in use, or when output has been written during this - inflate call, but the end of the deflate stream has not been reached yet. - It is also called to create a window for dictionary data when a dictionary - is loaded. - - Providing output buffers larger than 32K to inflate() should provide a speed - advantage, since only the last 32K of output is copied to the sliding window - upon return from inflate(), and since all distances after the first 32K of - output will fall in the output data, making match copies simpler and faster. - The advantage may be dependent on the size of the processor's data caches. - */ - var updatewindow = function updatewindow(strm, src, end, copy) { - var dist; - var state = strm.state; - - /* if it hasn't been done already, allocate space for the window */ - if (state.window === null) { - state.wsize = 1 << state.wbits; - state.wnext = 0; - state.whave = 0; - state.window = new Uint8Array(state.wsize); - } - - /* copy state->wsize or less output bytes into the circular window */ - if (copy >= state.wsize) { - state.window.set(src.subarray(end - state.wsize, end), 0); - state.wnext = 0; - state.whave = state.wsize; - } else { - dist = state.wsize - state.wnext; - if (dist > copy) { - dist = copy; - } - //zmemcpy(state->window + state->wnext, end - copy, dist); - state.window.set(src.subarray(end - copy, end - copy + dist), state.wnext); - copy -= dist; - if (copy) { - //zmemcpy(state->window, end - copy, copy); - state.window.set(src.subarray(end - copy, end), 0); - state.wnext = copy; - state.whave = state.wsize; - } else { - state.wnext += dist; - if (state.wnext === state.wsize) { - state.wnext = 0; - } - if (state.whave < state.wsize) { - state.whave += dist; - } - } - } - return 0; - }; - var inflate$1 = function inflate(strm, flush) { - var state; - var input, output; // input/output buffers - var next; /* next input INDEX */ - var put; /* next output INDEX */ - var have, left; /* available input and output */ - var hold; /* bit buffer */ - var bits; /* bits in bit buffer */ - var _in, _out; /* save starting available input and output */ - var copy; /* number of stored or match bytes to copy */ - var from; /* where to copy match bytes from */ - var from_source; - var here = 0; /* current decoding table entry */ - var here_bits, here_op, here_val; // paked "here" denormalized (JS specific) - //let last; /* parent table entry */ - var last_bits, last_op, last_val; // paked "last" denormalized (JS specific) - var len; /* length to copy for repeats, bits to drop */ - var ret; /* return code */ - var hbuf = new Uint8Array(4); /* buffer for gzip header crc calculation */ - var opts; - var n; // temporary variable for NEED_BITS - - var order = /* permutation of code lengths */ - new Uint8Array([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]); - if (inflateStateCheck(strm) || !strm.output || !strm.input && strm.avail_in !== 0) { - return Z_STREAM_ERROR$1; - } - state = strm.state; - if (state.mode === TYPE) { - state.mode = TYPEDO; - } /* skip check */ - - //--- LOAD() --- - put = strm.next_out; - output = strm.output; - left = strm.avail_out; - next = strm.next_in; - input = strm.input; - have = strm.avail_in; - hold = state.hold; - bits = state.bits; - //--- - - _in = have; - _out = left; - ret = Z_OK$1; - inf_leave: - // goto emulation - for (;;) { - switch (state.mode) { - case HEAD: - if (state.wrap === 0) { - state.mode = TYPEDO; - break; - } - //=== NEEDBITS(16); - while (bits < 16) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (state.wrap & 2 && hold === 0x8b1f) { - /* gzip header */ - if (state.wbits === 0) { - state.wbits = 15; - } - state.check = 0 /*crc32(0L, Z_NULL, 0)*/; - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = hold >>> 8 & 0xff; - state.check = crc32_1(state.check, hbuf, 2, 0); - //===// - - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = FLAGS; - break; - } - if (state.head) { - state.head.done = false; - } - if (!(state.wrap & 1) || /* check if zlib header allowed */ - (((hold & 0xff /*BITS(8)*/) << 8) + (hold >> 8)) % 31) { - strm.msg = 'incorrect header check'; - state.mode = BAD; - break; - } - if ((hold & 0x0f /*BITS(4)*/) !== Z_DEFLATED) { - strm.msg = 'unknown compression method'; - state.mode = BAD; - break; - } - //--- DROPBITS(4) ---// - hold >>>= 4; - bits -= 4; - //---// - len = (hold & 0x0f /*BITS(4)*/) + 8; - if (state.wbits === 0) { - state.wbits = len; - } - if (len > 15 || len > state.wbits) { - strm.msg = 'invalid window size'; - state.mode = BAD; - break; - } - - // !!! pako patch. Force use `options.windowBits` if passed. - // Required to always use max window size by default. - state.dmax = 1 << state.wbits; - //state.dmax = 1 << len; - - state.flags = 0; /* indicate zlib header */ - //Tracev((stderr, "inflate: zlib header ok\n")); - strm.adler = state.check = 1 /*adler32(0L, Z_NULL, 0)*/; - state.mode = hold & 0x200 ? DICTID : TYPE; - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - break; - case FLAGS: - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.flags = hold; - if ((state.flags & 0xff) !== Z_DEFLATED) { - strm.msg = 'unknown compression method'; - state.mode = BAD; - break; - } - if (state.flags & 0xe000) { - strm.msg = 'unknown header flags set'; - state.mode = BAD; - break; - } - if (state.head) { - state.head.text = hold >> 8 & 1; - } - if (state.flags & 0x0200 && state.wrap & 4) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = hold >>> 8 & 0xff; - state.check = crc32_1(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = TIME; - /* falls through */ - case TIME: - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (state.head) { - state.head.time = hold; - } - if (state.flags & 0x0200 && state.wrap & 4) { - //=== CRC4(state.check, hold) - hbuf[0] = hold & 0xff; - hbuf[1] = hold >>> 8 & 0xff; - hbuf[2] = hold >>> 16 & 0xff; - hbuf[3] = hold >>> 24 & 0xff; - state.check = crc32_1(state.check, hbuf, 4, 0); - //=== - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = OS; - /* falls through */ - case OS: - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (state.head) { - state.head.xflags = hold & 0xff; - state.head.os = hold >> 8; - } - if (state.flags & 0x0200 && state.wrap & 4) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = hold >>> 8 & 0xff; - state.check = crc32_1(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = EXLEN; - /* falls through */ - case EXLEN: - if (state.flags & 0x0400) { - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.length = hold; - if (state.head) { - state.head.extra_len = hold; - } - if (state.flags & 0x0200 && state.wrap & 4) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = hold >>> 8 & 0xff; - state.check = crc32_1(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - } else if (state.head) { - state.head.extra = null /*Z_NULL*/; - } - - state.mode = EXTRA; - /* falls through */ - case EXTRA: - if (state.flags & 0x0400) { - copy = state.length; - if (copy > have) { - copy = have; - } - if (copy) { - if (state.head) { - len = state.head.extra_len - state.length; - if (!state.head.extra) { - // Use untyped array for more convenient processing later - state.head.extra = new Uint8Array(state.head.extra_len); - } - state.head.extra.set(input.subarray(next, - // extra field is limited to 65536 bytes - // - no need for additional size check - next + copy), /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/ - len); - //zmemcpy(state.head.extra + len, next, - // len + copy > state.head.extra_max ? - // state.head.extra_max - len : copy); - } - - if (state.flags & 0x0200 && state.wrap & 4) { - state.check = crc32_1(state.check, input, copy, next); - } - have -= copy; - next += copy; - state.length -= copy; - } - if (state.length) { - break inf_leave; - } - } - state.length = 0; - state.mode = NAME; - /* falls through */ - case NAME: - if (state.flags & 0x0800) { - if (have === 0) { - break inf_leave; - } - copy = 0; - do { - // TODO: 2 or 1 bytes? - len = input[next + copy++]; - /* use constant limit because in js we should not preallocate memory */ - if (state.head && len && state.length < 65536 /*state.head.name_max*/) { - state.head.name += String.fromCharCode(len); - } - } while (len && copy < have); - if (state.flags & 0x0200 && state.wrap & 4) { - state.check = crc32_1(state.check, input, copy, next); - } - have -= copy; - next += copy; - if (len) { - break inf_leave; - } - } else if (state.head) { - state.head.name = null; - } - state.length = 0; - state.mode = COMMENT; - /* falls through */ - case COMMENT: - if (state.flags & 0x1000) { - if (have === 0) { - break inf_leave; - } - copy = 0; - do { - len = input[next + copy++]; - /* use constant limit because in js we should not preallocate memory */ - if (state.head && len && state.length < 65536 /*state.head.comm_max*/) { - state.head.comment += String.fromCharCode(len); - } - } while (len && copy < have); - if (state.flags & 0x0200 && state.wrap & 4) { - state.check = crc32_1(state.check, input, copy, next); - } - have -= copy; - next += copy; - if (len) { - break inf_leave; - } - } else if (state.head) { - state.head.comment = null; - } - state.mode = HCRC; - /* falls through */ - case HCRC: - if (state.flags & 0x0200) { - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (state.wrap & 4 && hold !== (state.check & 0xffff)) { - strm.msg = 'header crc mismatch'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - } - - if (state.head) { - state.head.hcrc = state.flags >> 9 & 1; - state.head.done = true; - } - strm.adler = state.check = 0; - state.mode = TYPE; - break; - case DICTID: - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - strm.adler = state.check = zswap32(hold); - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = DICT; - /* falls through */ - case DICT: - if (state.havedict === 0) { - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - return Z_NEED_DICT$1; - } - strm.adler = state.check = 1 /*adler32(0L, Z_NULL, 0)*/; - state.mode = TYPE; - /* falls through */ - case TYPE: - if (flush === Z_BLOCK || flush === Z_TREES) { - break inf_leave; - } - /* falls through */ - case TYPEDO: - if (state.last) { - //--- BYTEBITS() ---// - hold >>>= bits & 7; - bits -= bits & 7; - //---// - state.mode = CHECK; - break; - } - //=== NEEDBITS(3); */ - while (bits < 3) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.last = hold & 0x01 /*BITS(1)*/; - //--- DROPBITS(1) ---// - hold >>>= 1; - bits -= 1; - //---// - - switch (hold & 0x03 /*BITS(2)*/) { - case 0: - /* stored block */ - //Tracev((stderr, "inflate: stored block%s\n", - // state.last ? " (last)" : "")); - state.mode = STORED; - break; - case 1: - /* fixed block */ - fixedtables(state); - //Tracev((stderr, "inflate: fixed codes block%s\n", - // state.last ? " (last)" : "")); - state.mode = LEN_; /* decode codes */ - if (flush === Z_TREES) { - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - break inf_leave; - } - break; - case 2: - /* dynamic block */ - //Tracev((stderr, "inflate: dynamic codes block%s\n", - // state.last ? " (last)" : "")); - state.mode = TABLE; - break; - case 3: - strm.msg = 'invalid block type'; - state.mode = BAD; - } - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - break; - case STORED: - //--- BYTEBITS() ---// /* go to byte boundary */ - hold >>>= bits & 7; - bits -= bits & 7; - //---// - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if ((hold & 0xffff) !== (hold >>> 16 ^ 0xffff)) { - strm.msg = 'invalid stored block lengths'; - state.mode = BAD; - break; - } - state.length = hold & 0xffff; - //Tracev((stderr, "inflate: stored length %u\n", - // state.length)); - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = COPY_; - if (flush === Z_TREES) { - break inf_leave; - } - /* falls through */ - case COPY_: - state.mode = COPY; - /* falls through */ - case COPY: - copy = state.length; - if (copy) { - if (copy > have) { - copy = have; - } - if (copy > left) { - copy = left; - } - if (copy === 0) { - break inf_leave; - } - //--- zmemcpy(put, next, copy); --- - output.set(input.subarray(next, next + copy), put); - //---// - have -= copy; - next += copy; - left -= copy; - put += copy; - state.length -= copy; - break; - } - //Tracev((stderr, "inflate: stored end\n")); - state.mode = TYPE; - break; - case TABLE: - //=== NEEDBITS(14); */ - while (bits < 14) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.nlen = (hold & 0x1f /*BITS(5)*/) + 257; - //--- DROPBITS(5) ---// - hold >>>= 5; - bits -= 5; - //---// - state.ndist = (hold & 0x1f /*BITS(5)*/) + 1; - //--- DROPBITS(5) ---// - hold >>>= 5; - bits -= 5; - //---// - state.ncode = (hold & 0x0f /*BITS(4)*/) + 4; - //--- DROPBITS(4) ---// - hold >>>= 4; - bits -= 4; - //---// - //#ifndef PKZIP_BUG_WORKAROUND - if (state.nlen > 286 || state.ndist > 30) { - strm.msg = 'too many length or distance symbols'; - state.mode = BAD; - break; - } - //#endif - //Tracev((stderr, "inflate: table sizes ok\n")); - state.have = 0; - state.mode = LENLENS; - /* falls through */ - case LENLENS: - while (state.have < state.ncode) { - //=== NEEDBITS(3); - while (bits < 3) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.lens[order[state.have++]] = hold & 0x07; //BITS(3); - //--- DROPBITS(3) ---// - hold >>>= 3; - bits -= 3; - //---// - } - - while (state.have < 19) { - state.lens[order[state.have++]] = 0; - } - // We have separate tables & no pointers. 2 commented lines below not needed. - //state.next = state.codes; - //state.lencode = state.next; - // Switch to use dynamic table - state.lencode = state.lendyn; - state.lenbits = 7; - opts = { - bits: state.lenbits - }; - ret = inftrees(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts); - state.lenbits = opts.bits; - if (ret) { - strm.msg = 'invalid code lengths set'; - state.mode = BAD; - break; - } - //Tracev((stderr, "inflate: code lengths ok\n")); - state.have = 0; - state.mode = CODELENS; - /* falls through */ - case CODELENS: - while (state.have < state.nlen + state.ndist) { - for (;;) { - here = state.lencode[hold & (1 << state.lenbits) - 1]; /*BITS(state.lenbits)*/ - here_bits = here >>> 24; - here_op = here >>> 16 & 0xff; - here_val = here & 0xffff; - if (here_bits <= bits) { - break; - } - //--- PULLBYTE() ---// - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - - if (here_val < 16) { - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.lens[state.have++] = here_val; - } else { - if (here_val === 16) { - //=== NEEDBITS(here.bits + 2); - n = here_bits + 2; - while (bits < n) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - if (state.have === 0) { - strm.msg = 'invalid bit length repeat'; - state.mode = BAD; - break; - } - len = state.lens[state.have - 1]; - copy = 3 + (hold & 0x03); //BITS(2); - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - } else if (here_val === 17) { - //=== NEEDBITS(here.bits + 3); - n = here_bits + 3; - while (bits < n) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - len = 0; - copy = 3 + (hold & 0x07); //BITS(3); - //--- DROPBITS(3) ---// - hold >>>= 3; - bits -= 3; - //---// - } else { - //=== NEEDBITS(here.bits + 7); - n = here_bits + 7; - while (bits < n) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - len = 0; - copy = 11 + (hold & 0x7f); //BITS(7); - //--- DROPBITS(7) ---// - hold >>>= 7; - bits -= 7; - //---// - } - - if (state.have + copy > state.nlen + state.ndist) { - strm.msg = 'invalid bit length repeat'; - state.mode = BAD; - break; - } - while (copy--) { - state.lens[state.have++] = len; - } - } - } - - /* handle error breaks in while */ - if (state.mode === BAD) { - break; - } - - /* check for end-of-block code (better have one) */ - if (state.lens[256] === 0) { - strm.msg = 'invalid code -- missing end-of-block'; - state.mode = BAD; - break; - } - - /* build code tables -- note: do not change the lenbits or distbits - values here (9 and 6) without reading the comments in inftrees.h - concerning the ENOUGH constants, which depend on those values */ - state.lenbits = 9; - opts = { - bits: state.lenbits - }; - ret = inftrees(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts); - // We have separate tables & no pointers. 2 commented lines below not needed. - // state.next_index = opts.table_index; - state.lenbits = opts.bits; - // state.lencode = state.next; - - if (ret) { - strm.msg = 'invalid literal/lengths set'; - state.mode = BAD; - break; - } - state.distbits = 6; - //state.distcode.copy(state.codes); - // Switch to use dynamic table - state.distcode = state.distdyn; - opts = { - bits: state.distbits - }; - ret = inftrees(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts); - // We have separate tables & no pointers. 2 commented lines below not needed. - // state.next_index = opts.table_index; - state.distbits = opts.bits; - // state.distcode = state.next; - - if (ret) { - strm.msg = 'invalid distances set'; - state.mode = BAD; - break; - } - //Tracev((stderr, 'inflate: codes ok\n')); - state.mode = LEN_; - if (flush === Z_TREES) { - break inf_leave; - } - /* falls through */ - case LEN_: - state.mode = LEN; - /* falls through */ - case LEN: - if (have >= 6 && left >= 258) { - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - inffast(strm, _out); - //--- LOAD() --- - put = strm.next_out; - output = strm.output; - left = strm.avail_out; - next = strm.next_in; - input = strm.input; - have = strm.avail_in; - hold = state.hold; - bits = state.bits; - //--- - - if (state.mode === TYPE) { - state.back = -1; - } - break; - } - state.back = 0; - for (;;) { - here = state.lencode[hold & (1 << state.lenbits) - 1]; /*BITS(state.lenbits)*/ - here_bits = here >>> 24; - here_op = here >>> 16 & 0xff; - here_val = here & 0xffff; - if (here_bits <= bits) { - break; - } - //--- PULLBYTE() ---// - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - - if (here_op && (here_op & 0xf0) === 0) { - last_bits = here_bits; - last_op = here_op; - last_val = here_val; - for (;;) { - here = state.lencode[last_val + ((hold & (1 << last_bits + last_op) - 1 /*BITS(last.bits + last.op)*/) >> last_bits)]; - here_bits = here >>> 24; - here_op = here >>> 16 & 0xff; - here_val = here & 0xffff; - if (last_bits + here_bits <= bits) { - break; - } - //--- PULLBYTE() ---// - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - //--- DROPBITS(last.bits) ---// - hold >>>= last_bits; - bits -= last_bits; - //---// - state.back += last_bits; - } - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.back += here_bits; - state.length = here_val; - if (here_op === 0) { - //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - // "inflate: literal '%c'\n" : - // "inflate: literal 0x%02x\n", here.val)); - state.mode = LIT; - break; - } - if (here_op & 32) { - //Tracevv((stderr, "inflate: end of block\n")); - state.back = -1; - state.mode = TYPE; - break; - } - if (here_op & 64) { - strm.msg = 'invalid literal/length code'; - state.mode = BAD; - break; - } - state.extra = here_op & 15; - state.mode = LENEXT; - /* falls through */ - case LENEXT: - if (state.extra) { - //=== NEEDBITS(state.extra); - n = state.extra; - while (bits < n) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.length += hold & (1 << state.extra) - 1 /*BITS(state.extra)*/; - //--- DROPBITS(state.extra) ---// - hold >>>= state.extra; - bits -= state.extra; - //---// - state.back += state.extra; - } - //Tracevv((stderr, "inflate: length %u\n", state.length)); - state.was = state.length; - state.mode = DIST; - /* falls through */ - case DIST: - for (;;) { - here = state.distcode[hold & (1 << state.distbits) - 1]; /*BITS(state.distbits)*/ - here_bits = here >>> 24; - here_op = here >>> 16 & 0xff; - here_val = here & 0xffff; - if (here_bits <= bits) { - break; - } - //--- PULLBYTE() ---// - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - - if ((here_op & 0xf0) === 0) { - last_bits = here_bits; - last_op = here_op; - last_val = here_val; - for (;;) { - here = state.distcode[last_val + ((hold & (1 << last_bits + last_op) - 1 /*BITS(last.bits + last.op)*/) >> last_bits)]; - here_bits = here >>> 24; - here_op = here >>> 16 & 0xff; - here_val = here & 0xffff; - if (last_bits + here_bits <= bits) { - break; - } - //--- PULLBYTE() ---// - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - //--- DROPBITS(last.bits) ---// - hold >>>= last_bits; - bits -= last_bits; - //---// - state.back += last_bits; - } - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.back += here_bits; - if (here_op & 64) { - strm.msg = 'invalid distance code'; - state.mode = BAD; - break; - } - state.offset = here_val; - state.extra = here_op & 15; - state.mode = DISTEXT; - /* falls through */ - case DISTEXT: - if (state.extra) { - //=== NEEDBITS(state.extra); - n = state.extra; - while (bits < n) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.offset += hold & (1 << state.extra) - 1 /*BITS(state.extra)*/; - //--- DROPBITS(state.extra) ---// - hold >>>= state.extra; - bits -= state.extra; - //---// - state.back += state.extra; - } - //#ifdef INFLATE_STRICT - if (state.offset > state.dmax) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break; - } - //#endif - //Tracevv((stderr, "inflate: distance %u\n", state.offset)); - state.mode = MATCH; - /* falls through */ - case MATCH: - if (left === 0) { - break inf_leave; - } - copy = _out - left; - if (state.offset > copy) { - /* copy from window */ - copy = state.offset - copy; - if (copy > state.whave) { - if (state.sane) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break; - } - // (!) This block is disabled in zlib defaults, - // don't enable it for binary compatibility - //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR - // Trace((stderr, "inflate.c too far\n")); - // copy -= state.whave; - // if (copy > state.length) { copy = state.length; } - // if (copy > left) { copy = left; } - // left -= copy; - // state.length -= copy; - // do { - // output[put++] = 0; - // } while (--copy); - // if (state.length === 0) { state.mode = LEN; } - // break; - //#endif - } - - if (copy > state.wnext) { - copy -= state.wnext; - from = state.wsize - copy; - } else { - from = state.wnext - copy; - } - if (copy > state.length) { - copy = state.length; - } - from_source = state.window; - } else { - /* copy from output */ - from_source = output; - from = put - state.offset; - copy = state.length; - } - if (copy > left) { - copy = left; - } - left -= copy; - state.length -= copy; - do { - output[put++] = from_source[from++]; - } while (--copy); - if (state.length === 0) { - state.mode = LEN; - } - break; - case LIT: - if (left === 0) { - break inf_leave; - } - output[put++] = state.length; - left--; - state.mode = LEN; - break; - case CHECK: - if (state.wrap) { - //=== NEEDBITS(32); - while (bits < 32) { - if (have === 0) { - break inf_leave; - } - have--; - // Use '|' instead of '+' to make sure that result is signed - hold |= input[next++] << bits; - bits += 8; - } - //===// - _out -= left; - strm.total_out += _out; - state.total += _out; - if (state.wrap & 4 && _out) { - strm.adler = state.check = /*UPDATE_CHECK(state.check, put - _out, _out);*/ - state.flags ? crc32_1(state.check, output, _out, put - _out) : adler32_1(state.check, output, _out, put - _out); - } - _out = left; - // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too - if (state.wrap & 4 && (state.flags ? hold : zswap32(hold)) !== state.check) { - strm.msg = 'incorrect data check'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - //Tracev((stderr, "inflate: check matches trailer\n")); - } - - state.mode = LENGTH; - /* falls through */ - case LENGTH: - if (state.wrap && state.flags) { - //=== NEEDBITS(32); - while (bits < 32) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (state.wrap & 4 && hold !== (state.total & 0xffffffff)) { - strm.msg = 'incorrect length check'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - //Tracev((stderr, "inflate: length matches trailer\n")); - } - - state.mode = DONE; - /* falls through */ - case DONE: - ret = Z_STREAM_END$1; - break inf_leave; - case BAD: - ret = Z_DATA_ERROR$1; - break inf_leave; - case MEM: - return Z_MEM_ERROR$1; - case SYNC: - /* falls through */ - default: - return Z_STREAM_ERROR$1; - } - } - - // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave" - - /* - Return from inflate(), updating the total counts and the check value. - If there was no progress during the inflate() call, return a buffer - error. Call updatewindow() to create and/or update the window state. - Note: a memory error from inflate() is non-recoverable. - */ - - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - - if (state.wsize || _out !== strm.avail_out && state.mode < BAD && (state.mode < CHECK || flush !== Z_FINISH$1)) { - if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) ; - } - _in -= strm.avail_in; - _out -= strm.avail_out; - strm.total_in += _in; - strm.total_out += _out; - state.total += _out; - if (state.wrap & 4 && _out) { - strm.adler = state.check = /*UPDATE_CHECK(state.check, strm.next_out - _out, _out);*/ - state.flags ? crc32_1(state.check, output, _out, strm.next_out - _out) : adler32_1(state.check, output, _out, strm.next_out - _out); - } - strm.data_type = state.bits + (state.last ? 64 : 0) + (state.mode === TYPE ? 128 : 0) + (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0); - if ((_in === 0 && _out === 0 || flush === Z_FINISH$1) && ret === Z_OK$1) { - ret = Z_BUF_ERROR; - } - return ret; - }; - var inflateEnd = function inflateEnd(strm) { - if (inflateStateCheck(strm)) { - return Z_STREAM_ERROR$1; - } - var state = strm.state; - if (state.window) { - state.window = null; - } - strm.state = null; - return Z_OK$1; - }; - var inflateGetHeader = function inflateGetHeader(strm, head) { - /* check state */ - if (inflateStateCheck(strm)) { - return Z_STREAM_ERROR$1; - } - var state = strm.state; - if ((state.wrap & 2) === 0) { - return Z_STREAM_ERROR$1; - } - - /* save header structure */ - state.head = head; - head.done = false; - return Z_OK$1; - }; - var inflateSetDictionary = function inflateSetDictionary(strm, dictionary) { - var dictLength = dictionary.length; - var state; - var dictid; - var ret; - - /* check state */ - if (inflateStateCheck(strm)) { - return Z_STREAM_ERROR$1; - } - state = strm.state; - if (state.wrap !== 0 && state.mode !== DICT) { - return Z_STREAM_ERROR$1; - } - - /* check for correct dictionary identifier */ - if (state.mode === DICT) { - dictid = 1; /* adler32(0, null, 0)*/ - /* dictid = adler32(dictid, dictionary, dictLength); */ - dictid = adler32_1(dictid, dictionary, dictLength, 0); - if (dictid !== state.check) { - return Z_DATA_ERROR$1; - } - } - /* copy dictionary to window using updatewindow(), which will amend the - existing dictionary if appropriate */ - ret = updatewindow(strm, dictionary, dictLength, dictLength); - if (ret) { - state.mode = MEM; - return Z_MEM_ERROR$1; - } - state.havedict = 1; - // Tracev((stderr, "inflate: dictionary set\n")); - return Z_OK$1; - }; - var inflateReset_1 = inflateReset; - var inflateReset2_1 = inflateReset2; - var inflateResetKeep_1 = inflateResetKeep; - var inflateInit_1 = inflateInit; - var inflateInit2_1 = inflateInit2; - var inflate_2$1 = inflate$1; - var inflateEnd_1 = inflateEnd; - var inflateGetHeader_1 = inflateGetHeader; - var inflateSetDictionary_1 = inflateSetDictionary; - var inflateInfo = 'pako inflate (from Nodeca project)'; - - /* Not implemented - module.exports.inflateCodesUsed = inflateCodesUsed; - module.exports.inflateCopy = inflateCopy; - module.exports.inflateGetDictionary = inflateGetDictionary; - module.exports.inflateMark = inflateMark; - module.exports.inflatePrime = inflatePrime; - module.exports.inflateSync = inflateSync; - module.exports.inflateSyncPoint = inflateSyncPoint; - module.exports.inflateUndermine = inflateUndermine; - module.exports.inflateValidate = inflateValidate; - */ - - var inflate_1$1 = { - inflateReset: inflateReset_1, - inflateReset2: inflateReset2_1, - inflateResetKeep: inflateResetKeep_1, - inflateInit: inflateInit_1, - inflateInit2: inflateInit2_1, - inflate: inflate_2$1, - inflateEnd: inflateEnd_1, - inflateGetHeader: inflateGetHeader_1, - inflateSetDictionary: inflateSetDictionary_1, - inflateInfo: inflateInfo - }; - - function _typeof(obj) { - "@babel/helpers - typeof"; - - return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { - return typeof obj; - } : function (obj) { - return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }, _typeof(obj); - } - - var _has = function _has(obj, key) { - return Object.prototype.hasOwnProperty.call(obj, key); - }; - var assign = function assign(obj /*from1, from2, from3, ...*/) { - var sources = Array.prototype.slice.call(arguments, 1); - while (sources.length) { - var source = sources.shift(); - if (!source) { - continue; - } - if (_typeof(source) !== 'object') { - throw new TypeError(source + 'must be non-object'); - } - for (var p in source) { - if (_has(source, p)) { - obj[p] = source[p]; - } - } - } - return obj; - }; - - // Join array of chunks to single array. - var flattenChunks = function flattenChunks(chunks) { - // calculate data length - var len = 0; - for (var i = 0, l = chunks.length; i < l; i++) { - len += chunks[i].length; - } - - // join chunks - var result = new Uint8Array(len); - for (var _i = 0, pos = 0, _l = chunks.length; _i < _l; _i++) { - var chunk = chunks[_i]; - result.set(chunk, pos); - pos += chunk.length; - } - return result; - }; - var common = { - assign: assign, - flattenChunks: flattenChunks - }; - - // String encode/decode helpers - - // Quick check if we can use fast array to bin string conversion - // - // - apply(Array) can fail on Android 2.2 - // - apply(Uint8Array) can fail on iOS 5.1 Safari - // - var STR_APPLY_UIA_OK = true; - try { - String.fromCharCode.apply(null, new Uint8Array(1)); - } catch (__) { - STR_APPLY_UIA_OK = false; - } - - // Table with utf8 lengths (calculated by first byte of sequence) - // Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS, - // because max possible codepoint is 0x10ffff - var _utf8len = new Uint8Array(256); - for (var q = 0; q < 256; q++) { - _utf8len[q] = q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1; - } - _utf8len[254] = _utf8len[254] = 1; // Invalid sequence start - - // convert string to array (typed, when possible) - var string2buf = function string2buf(str) { - if (typeof TextEncoder === 'function' && TextEncoder.prototype.encode) { - return new TextEncoder().encode(str); - } - var buf, - c, - c2, - m_pos, - i, - str_len = str.length, - buf_len = 0; - - // count binary size - for (m_pos = 0; m_pos < str_len; m_pos++) { - c = str.charCodeAt(m_pos); - if ((c & 0xfc00) === 0xd800 && m_pos + 1 < str_len) { - c2 = str.charCodeAt(m_pos + 1); - if ((c2 & 0xfc00) === 0xdc00) { - c = 0x10000 + (c - 0xd800 << 10) + (c2 - 0xdc00); - m_pos++; - } - } - buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4; - } - - // allocate buffer - buf = new Uint8Array(buf_len); - - // convert - for (i = 0, m_pos = 0; i < buf_len; m_pos++) { - c = str.charCodeAt(m_pos); - if ((c & 0xfc00) === 0xd800 && m_pos + 1 < str_len) { - c2 = str.charCodeAt(m_pos + 1); - if ((c2 & 0xfc00) === 0xdc00) { - c = 0x10000 + (c - 0xd800 << 10) + (c2 - 0xdc00); - m_pos++; - } - } - if (c < 0x80) { - /* one byte */ - buf[i++] = c; - } else if (c < 0x800) { - /* two bytes */ - buf[i++] = 0xC0 | c >>> 6; - buf[i++] = 0x80 | c & 0x3f; - } else if (c < 0x10000) { - /* three bytes */ - buf[i++] = 0xE0 | c >>> 12; - buf[i++] = 0x80 | c >>> 6 & 0x3f; - buf[i++] = 0x80 | c & 0x3f; - } else { - /* four bytes */ - buf[i++] = 0xf0 | c >>> 18; - buf[i++] = 0x80 | c >>> 12 & 0x3f; - buf[i++] = 0x80 | c >>> 6 & 0x3f; - buf[i++] = 0x80 | c & 0x3f; - } - } - return buf; - }; - - // Helper - var buf2binstring = function buf2binstring(buf, len) { - // On Chrome, the arguments in a function call that are allowed is `65534`. - // If the length of the buffer is smaller than that, we can use this optimization, - // otherwise we will take a slower path. - if (len < 65534) { - if (buf.subarray && STR_APPLY_UIA_OK) { - return String.fromCharCode.apply(null, buf.length === len ? buf : buf.subarray(0, len)); - } - } - var result = ''; - for (var i = 0; i < len; i++) { - result += String.fromCharCode(buf[i]); - } - return result; - }; - - // convert array to string - var buf2string = function buf2string(buf, max) { - var len = max || buf.length; - if (typeof TextDecoder === 'function' && TextDecoder.prototype.decode) { - return new TextDecoder().decode(buf.subarray(0, max)); - } - var i, out; - - // Reserve max possible length (2 words per char) - // NB: by unknown reasons, Array is significantly faster for - // String.fromCharCode.apply than Uint16Array. - var utf16buf = new Array(len * 2); - for (out = 0, i = 0; i < len;) { - var c = buf[i++]; - // quick process ascii - if (c < 0x80) { - utf16buf[out++] = c; - continue; - } - var c_len = _utf8len[c]; - // skip 5 & 6 byte codes - if (c_len > 4) { - utf16buf[out++] = 0xfffd; - i += c_len - 1; - continue; - } - - // apply mask on first byte - c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07; - // join the rest - while (c_len > 1 && i < len) { - c = c << 6 | buf[i++] & 0x3f; - c_len--; - } - - // terminated by end of string? - if (c_len > 1) { - utf16buf[out++] = 0xfffd; - continue; - } - if (c < 0x10000) { - utf16buf[out++] = c; - } else { - c -= 0x10000; - utf16buf[out++] = 0xd800 | c >> 10 & 0x3ff; - utf16buf[out++] = 0xdc00 | c & 0x3ff; - } - } - return buf2binstring(utf16buf, out); - }; - - // Calculate max possible position in utf8 buffer, - // that will not break sequence. If that's not possible - // - (very small limits) return max size as is. - // - // buf[] - utf8 bytes array - // max - length limit (mandatory); - var utf8border = function utf8border(buf, max) { - max = max || buf.length; - if (max > buf.length) { - max = buf.length; - } - - // go back from last position, until start of sequence found - var pos = max - 1; - while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { - pos--; - } - - // Very small and broken sequence, - // return max, because we should return something anyway. - if (pos < 0) { - return max; - } - - // If we came to start of buffer - that means buffer is too small, - // return max too. - if (pos === 0) { - return max; - } - return pos + _utf8len[buf[pos]] > max ? pos : max; - }; - var strings = { - string2buf: string2buf, - buf2string: buf2string, - utf8border: utf8border - }; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - var messages = { - 2: 'need dictionary', - /* Z_NEED_DICT 2 */ - 1: 'stream end', - /* Z_STREAM_END 1 */ - 0: '', - /* Z_OK 0 */ - '-1': 'file error', - /* Z_ERRNO (-1) */ - '-2': 'stream error', - /* Z_STREAM_ERROR (-2) */ - '-3': 'data error', - /* Z_DATA_ERROR (-3) */ - '-4': 'insufficient memory', - /* Z_MEM_ERROR (-4) */ - '-5': 'buffer error', - /* Z_BUF_ERROR (-5) */ - '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ - }; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - function ZStream() { - /* next input byte */ - this.input = null; // JS specific, because we have no pointers - this.next_in = 0; - /* number of bytes available at input */ - this.avail_in = 0; - /* total number of input bytes read so far */ - this.total_in = 0; - /* next output byte should be put there */ - this.output = null; // JS specific, because we have no pointers - this.next_out = 0; - /* remaining free space at output */ - this.avail_out = 0; - /* total number of bytes output so far */ - this.total_out = 0; - /* last error message, NULL if no error */ - this.msg = '' /*Z_NULL*/; - /* not visible by applications */ - this.state = null; - /* best guess about the data type: binary or text */ - this.data_type = 2 /*Z_UNKNOWN*/; - /* adler32 value of the uncompressed data */ - this.adler = 0; - } - var zstream = ZStream; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - function GZheader() { - /* true if compressed data believed to be text */ - this.text = 0; - /* modification time */ - this.time = 0; - /* extra flags (not used when writing a gzip file) */ - this.xflags = 0; - /* operating system */ - this.os = 0; - /* pointer to extra field or Z_NULL if none */ - this.extra = null; - /* extra field length (valid if extra != Z_NULL) */ - this.extra_len = 0; // Actually, we don't need it in JS, - // but leave for few code modifications - - // - // Setup limits is not necessary because in js we should not preallocate memory - // for inflate use constant limit in 65536 bytes - // - - /* space at extra (only when reading header) */ - // this.extra_max = 0; - /* pointer to zero-terminated file name or Z_NULL */ - this.name = ''; - /* space at name (only when reading header) */ - // this.name_max = 0; - /* pointer to zero-terminated comment or Z_NULL */ - this.comment = ''; - /* space at comment (only when reading header) */ - // this.comm_max = 0; - /* true if there was or will be a header crc */ - this.hcrc = 0; - /* true when done reading gzip header (not used when writing a gzip file) */ - this.done = false; - } - var gzheader = GZheader; - - var toString = Object.prototype.toString; - - /* Public constants ==========================================================*/ - /* ===========================================================================*/ - - var Z_NO_FLUSH = constants$1.Z_NO_FLUSH, - Z_FINISH = constants$1.Z_FINISH, - Z_OK = constants$1.Z_OK, - Z_STREAM_END = constants$1.Z_STREAM_END, - Z_NEED_DICT = constants$1.Z_NEED_DICT, - Z_STREAM_ERROR = constants$1.Z_STREAM_ERROR, - Z_DATA_ERROR = constants$1.Z_DATA_ERROR, - Z_MEM_ERROR = constants$1.Z_MEM_ERROR; - - /* ===========================================================================*/ - - /** - * class Inflate - * - * Generic JS-style wrapper for zlib calls. If you don't need - * streaming behaviour - use more simple functions: [[inflate]] - * and [[inflateRaw]]. - **/ - - /* internal - * inflate.chunks -> Array - * - * Chunks of output data, if [[Inflate#onData]] not overridden. - **/ - - /** - * Inflate.result -> Uint8Array|String - * - * Uncompressed result, generated by default [[Inflate#onData]] - * and [[Inflate#onEnd]] handlers. Filled after you push last chunk - * (call [[Inflate#push]] with `Z_FINISH` / `true` param). - **/ - - /** - * Inflate.err -> Number - * - * Error code after inflate finished. 0 (Z_OK) on success. - * Should be checked if broken data possible. - **/ - - /** - * Inflate.msg -> String - * - * Error message, if [[Inflate.err]] != 0 - **/ - - /** - * new Inflate(options) - * - options (Object): zlib inflate options. - * - * Creates new inflator instance with specified params. Throws exception - * on bad params. Supported options: - * - * - `windowBits` - * - `dictionary` - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information on these. - * - * Additional options, for internal needs: - * - * - `chunkSize` - size of generated data chunks (16K by default) - * - `raw` (Boolean) - do raw inflate - * - `to` (String) - if equal to 'string', then result will be converted - * from utf8 to utf16 (javascript) string. When string output requested, - * chunk length can differ from `chunkSize`, depending on content. - * - * By default, when no options set, autodetect deflate/gzip data format via - * wrapper header. - * - * ##### Example: - * - * ```javascript - * const pako = require('pako') - * const chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9]) - * const chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]); - * - * const inflate = new pako.Inflate({ level: 3}); - * - * inflate.push(chunk1, false); - * inflate.push(chunk2, true); // true -> last chunk - * - * if (inflate.err) { throw new Error(inflate.err); } - * - * console.log(inflate.result); - * ``` - **/ - function Inflate(options) { - this.options = common.assign({ - chunkSize: 1024 * 64, - windowBits: 15, - to: '' - }, options || {}); - var opt = this.options; - - // Force window size for `raw` data, if not set directly, - // because we have no header for autodetect. - if (opt.raw && opt.windowBits >= 0 && opt.windowBits < 16) { - opt.windowBits = -opt.windowBits; - if (opt.windowBits === 0) { - opt.windowBits = -15; - } - } - - // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate - if (opt.windowBits >= 0 && opt.windowBits < 16 && !(options && options.windowBits)) { - opt.windowBits += 32; - } - - // Gzip header has no info about windows size, we can do autodetect only - // for deflate. So, if window size not set, force it to max when gzip possible - if (opt.windowBits > 15 && opt.windowBits < 48) { - // bit 3 (16) -> gzipped data - // bit 4 (32) -> autodetect gzip/deflate - if ((opt.windowBits & 15) === 0) { - opt.windowBits |= 15; - } - } - this.err = 0; // error code, if happens (0 = Z_OK) - this.msg = ''; // error message - this.ended = false; // used to avoid multiple onEnd() calls - this.chunks = []; // chunks of compressed data - - this.strm = new zstream(); - this.strm.avail_out = 0; - var status = inflate_1$1.inflateInit2(this.strm, opt.windowBits); - if (status !== Z_OK) { - throw new Error(messages[status]); - } - this.header = new gzheader(); - inflate_1$1.inflateGetHeader(this.strm, this.header); - - // Setup dictionary - if (opt.dictionary) { - // Convert data if needed - if (typeof opt.dictionary === 'string') { - opt.dictionary = strings.string2buf(opt.dictionary); - } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') { - opt.dictionary = new Uint8Array(opt.dictionary); - } - if (opt.raw) { - //In raw mode we need to set the dictionary early - status = inflate_1$1.inflateSetDictionary(this.strm, opt.dictionary); - if (status !== Z_OK) { - throw new Error(messages[status]); - } - } - } - } - - /** - * Inflate#push(data[, flush_mode]) -> Boolean - * - data (Uint8Array|ArrayBuffer): input data - * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE - * flush modes. See constants. Skipped or `false` means Z_NO_FLUSH, - * `true` means Z_FINISH. - * - * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with - * new output chunks. Returns `true` on success. If end of stream detected, - * [[Inflate#onEnd]] will be called. - * - * `flush_mode` is not needed for normal operation, because end of stream - * detected automatically. You may try to use it for advanced things, but - * this functionality was not tested. - * - * On fail call [[Inflate#onEnd]] with error code and return false. - * - * ##### Example - * - * ```javascript - * push(chunk, false); // push one of data chunks - * ... - * push(chunk, true); // push last chunk - * ``` - **/ - Inflate.prototype.push = function (data, flush_mode) { - var strm = this.strm; - var chunkSize = this.options.chunkSize; - var dictionary = this.options.dictionary; - var status, _flush_mode, last_avail_out; - if (this.ended) return false; - if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;else _flush_mode = flush_mode === true ? Z_FINISH : Z_NO_FLUSH; - - // Convert data if needed - if (toString.call(data) === '[object ArrayBuffer]') { - strm.input = new Uint8Array(data); - } else { - strm.input = data; - } - strm.next_in = 0; - strm.avail_in = strm.input.length; - for (;;) { - if (strm.avail_out === 0) { - strm.output = new Uint8Array(chunkSize); - strm.next_out = 0; - strm.avail_out = chunkSize; - } - status = inflate_1$1.inflate(strm, _flush_mode); - if (status === Z_NEED_DICT && dictionary) { - status = inflate_1$1.inflateSetDictionary(strm, dictionary); - if (status === Z_OK) { - status = inflate_1$1.inflate(strm, _flush_mode); - } else if (status === Z_DATA_ERROR) { - // Replace code with more verbose - status = Z_NEED_DICT; - } - } - - // Skip snyc markers if more data follows and not raw mode - while (strm.avail_in > 0 && status === Z_STREAM_END && strm.state.wrap > 0 && data[strm.next_in] !== 0) { - inflate_1$1.inflateReset(strm); - status = inflate_1$1.inflate(strm, _flush_mode); - } - switch (status) { - case Z_STREAM_ERROR: - case Z_DATA_ERROR: - case Z_NEED_DICT: - case Z_MEM_ERROR: - this.onEnd(status); - this.ended = true; - return false; - } - - // Remember real `avail_out` value, because we may patch out buffer content - // to align utf8 strings boundaries. - last_avail_out = strm.avail_out; - if (strm.next_out) { - if (strm.avail_out === 0 || status === Z_STREAM_END) { - if (this.options.to === 'string') { - var next_out_utf8 = strings.utf8border(strm.output, strm.next_out); - var tail = strm.next_out - next_out_utf8; - var utf8str = strings.buf2string(strm.output, next_out_utf8); - - // move tail & realign counters - strm.next_out = tail; - strm.avail_out = chunkSize - tail; - if (tail) strm.output.set(strm.output.subarray(next_out_utf8, next_out_utf8 + tail), 0); - this.onData(utf8str); - } else { - this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out)); - } - } - } - - // Must repeat iteration if out buffer is full - if (status === Z_OK && last_avail_out === 0) continue; - - // Finalize if end of stream reached. - if (status === Z_STREAM_END) { - status = inflate_1$1.inflateEnd(this.strm); - this.onEnd(status); - this.ended = true; - return true; - } - if (strm.avail_in === 0) break; - } - return true; - }; - - /** - * Inflate#onData(chunk) -> Void - * - chunk (Uint8Array|String): output data. When string output requested, - * each chunk will be string. - * - * By default, stores data blocks in `chunks[]` property and glue - * those in `onEnd`. Override this handler, if you need another behaviour. - **/ - Inflate.prototype.onData = function (chunk) { - this.chunks.push(chunk); - }; - - /** - * Inflate#onEnd(status) -> Void - * - status (Number): inflate status. 0 (Z_OK) on success, - * other if not. - * - * Called either after you tell inflate that the input stream is - * complete (Z_FINISH). By default - join collected chunks, - * free memory and fill `results` / `err` properties. - **/ - Inflate.prototype.onEnd = function (status) { - // On success - join - if (status === Z_OK) { - if (this.options.to === 'string') { - this.result = this.chunks.join(''); - } else { - this.result = common.flattenChunks(this.chunks); - } - } - this.chunks = []; - this.err = status; - this.msg = this.strm.msg; - }; - - /** - * inflate(data[, options]) -> Uint8Array|String - * - data (Uint8Array|ArrayBuffer): input data to decompress. - * - options (Object): zlib inflate options. - * - * Decompress `data` with inflate/ungzip and `options`. Autodetect - * format via wrapper header by default. That's why we don't provide - * separate `ungzip` method. - * - * Supported options are: - * - * - windowBits - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information. - * - * Sugar (options): - * - * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify - * negative windowBits implicitly. - * - `to` (String) - if equal to 'string', then result will be converted - * from utf8 to utf16 (javascript) string. When string output requested, - * chunk length can differ from `chunkSize`, depending on content. - * - * - * ##### Example: - * - * ```javascript - * const pako = require('pako'); - * const input = pako.deflate(new Uint8Array([1,2,3,4,5,6,7,8,9])); - * let output; - * - * try { - * output = pako.inflate(input); - * } catch (err) { - * console.log(err); - * } - * ``` - **/ - function inflate(input, options) { - var inflator = new Inflate(options); - inflator.push(input); - - // That will never happens, if you don't cheat with options :) - if (inflator.err) throw inflator.msg || messages[inflator.err]; - return inflator.result; - } - - /** - * inflateRaw(data[, options]) -> Uint8Array|String - * - data (Uint8Array|ArrayBuffer): input data to decompress. - * - options (Object): zlib inflate options. - * - * The same as [[inflate]], but creates raw data, without wrapper - * (header and adler32 crc). - **/ - function inflateRaw(input, options) { - options = options || {}; - options.raw = true; - return inflate(input, options); - } - - /** - * ungzip(data[, options]) -> Uint8Array|String - * - data (Uint8Array|ArrayBuffer): input data to decompress. - * - options (Object): zlib inflate options. - * - * Just shortcut to [[inflate]], because it autodetects format - * by header.content. Done for convenience. - **/ - - var Inflate_1 = Inflate; - var inflate_2 = inflate; - var inflateRaw_1 = inflateRaw; - var ungzip = inflate; - var constants = constants$1; - var inflate_1 = { - Inflate: Inflate_1, - inflate: inflate_2, - inflateRaw: inflateRaw_1, - ungzip: ungzip, - constants: constants - }; - - exports.Inflate = Inflate_1; - exports.constants = constants; - exports["default"] = inflate_1; - exports.inflate = inflate_2; - exports.inflateRaw = inflateRaw_1; - exports.ungzip = ungzip; - - Object.defineProperty(exports, '__esModule', { value: true }); - -})); diff --git a/node_modules/pako/dist/pako_inflate.es5.min.js b/node_modules/pako/dist/pako_inflate.es5.min.js deleted file mode 100644 index 5afd037..0000000 --- a/node_modules/pako/dist/pako_inflate.es5.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).pako={})}(this,(function(e){"use strict";var t=function(e,t,i,n){for(var a=65535&e|0,r=e>>>16&65535|0,o=0;0!==i;){i-=o=i>2e3?2e3:i;do{r=r+(a=a+t[n++]|0)|0}while(--o);a%=65521,r%=65521}return a|r<<16|0},i=new Uint32Array(function(){for(var e,t=[],i=0;i<256;i++){e=i;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[i]=e}return t}()),n=function(e,t,n,a){var r=i,o=a+n;e^=-1;for(var s=a;s>>8^r[255&(e^t[s])];return-1^e},a=16209,r=function(e,t){var i,n,r,o,s,l,f,d,h,c,u,w,b,m,k,_,v,g,p,y,x,E,R,A,Z=e.state;i=e.next_in,R=e.input,n=i+(e.avail_in-5),r=e.next_out,A=e.output,o=r-(t-e.avail_out),s=r+(e.avail_out-257),l=Z.dmax,f=Z.wsize,d=Z.whave,h=Z.wnext,c=Z.window,u=Z.hold,w=Z.bits,b=Z.lencode,m=Z.distcode,k=(1<>>=g=v>>>24,w-=g,0===(g=v>>>16&255))A[r++]=65535&v;else{if(!(16&g)){if(0==(64&g)){v=b[(65535&v)+(u&(1<>>=g,w-=g),w<15&&(u+=R[i++]<>>=g=v>>>24,w-=g,!(16&(g=v>>>16&255))){if(0==(64&g)){v=m[(65535&v)+(u&(1<l){e.msg="invalid distance too far back",Z.mode=a;break e}if(u>>>=g,w-=g,y>(g=r-o)){if((g=y-g)>d&&Z.sane){e.msg="invalid distance too far back",Z.mode=a;break e}if(x=0,E=c,0===h){if(x+=f-g,g2;)A[r++]=E[x++],A[r++]=E[x++],A[r++]=E[x++],p-=3;p&&(A[r++]=E[x++],p>1&&(A[r++]=E[x++]))}else{x=r-y;do{A[r++]=A[x++],A[r++]=A[x++],A[r++]=A[x++],p-=3}while(p>2);p&&(A[r++]=A[x++],p>1&&(A[r++]=A[x++]))}break}}break}}while(i>3,u&=(1<<(w-=p<<3))-1,e.next_in=i,e.next_out=r,e.avail_in=i=1&&0===B[A];A--);if(Z>A&&(Z=A),0===A)return a[r++]=20971520,a[r++]=20971520,c.bits=1,0;for(R=1;R0&&(0===e||1!==A))return-1;for(N[1]=0,x=1;x852||2===e&&U>592)return 1;for(;;){v=x-T,h[E]+1<_?(g=0,p=h[E]):h[E]>=_?(g=C[h[E]-_],p=I[h[E]-_]):(g=96,p=0),u=1<>T)+(w-=u)]=v<<24|g<<16|p|0}while(0!==w);for(u=1<>=1;if(0!==u?(D&=u-1,D+=u):D=0,E++,0==--B[x]){if(x===A)break;x=t[i+h[E]]}if(x>Z&&(D&m)!==b){for(0===T&&(T=Z),k+=R,O=1<<(S=x-T);S+T852||2===e&&U>592)return 1;a[b=D&m]=Z<<24|S<<16|k-r|0}}return 0!==D&&(a[k+D]=x-T<<24|64<<16|0),c.bits=Z,0},c={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8},u=c.Z_FINISH,w=c.Z_BLOCK,b=c.Z_TREES,m=c.Z_OK,k=c.Z_STREAM_END,_=c.Z_NEED_DICT,v=c.Z_STREAM_ERROR,g=c.Z_DATA_ERROR,p=c.Z_MEM_ERROR,y=c.Z_BUF_ERROR,x=c.Z_DEFLATED,E=16180,R=16190,A=16191,Z=16192,S=16194,T=16199,O=16200,U=16206,D=16209,I=function(e){return(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)};function B(){this.strm=null,this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}var N,C,z=function(e){if(!e)return 1;var t=e.state;return!t||t.strm!==e||t.mode16211?1:0},F=function(e){if(z(e))return v;var t=e.state;return e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=E,t.last=0,t.havedict=0,t.flags=-1,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new Int32Array(852),t.distcode=t.distdyn=new Int32Array(592),t.sane=1,t.back=-1,m},L=function(e){if(z(e))return v;var t=e.state;return t.wsize=0,t.whave=0,t.wnext=0,F(e)},M=function(e,t){var i;if(z(e))return v;var n=e.state;return t<0?(i=0,t=-t):(i=5+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?v:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=i,n.wbits=t,L(e))},H=function(e,t){if(!e)return v;var i=new B;e.state=i,i.strm=e,i.window=null,i.mode=E;var n=M(e,t);return n!==m&&(e.state=null),n},j=!0,K=function(e){if(j){N=new Int32Array(512),C=new Int32Array(32);for(var t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(h(1,e.lens,0,288,N,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;h(2,e.lens,0,32,C,0,e.work,{bits:5}),j=!1}e.lencode=N,e.lenbits=9,e.distcode=C,e.distbits=5},P=function(e,t,i,n){var a,r=e.state;return null===r.window&&(r.wsize=1<=r.wsize?(r.window.set(t.subarray(i-r.wsize,i),0),r.wnext=0,r.whave=r.wsize):((a=r.wsize-r.wnext)>n&&(a=n),r.window.set(t.subarray(i-n,i-n+a),r.wnext),(n-=a)?(r.window.set(t.subarray(i-n,i),0),r.wnext=n,r.whave=r.wsize):(r.wnext+=a,r.wnext===r.wsize&&(r.wnext=0),r.whave>>8&255,a.check=n(a.check,te,2,0),B=0,N=0,a.mode=16181;break}if(a.head&&(a.head.done=!1),!(1&a.wrap)||(((255&B)<<8)+(B>>8))%31){e.msg="incorrect header check",a.mode=D;break}if((15&B)!==x){e.msg="unknown compression method",a.mode=D;break}if(N-=4,J=8+(15&(B>>>=4)),0===a.wbits&&(a.wbits=J),J>15||J>a.wbits){e.msg="invalid window size",a.mode=D;break}a.dmax=1<>8&1),512&a.flags&&4&a.wrap&&(te[0]=255&B,te[1]=B>>>8&255,a.check=n(a.check,te,2,0)),B=0,N=0,a.mode=16182;case 16182:for(;N<32;){if(0===d)break e;d--,B+=o[l++]<>>8&255,te[2]=B>>>16&255,te[3]=B>>>24&255,a.check=n(a.check,te,4,0)),B=0,N=0,a.mode=16183;case 16183:for(;N<16;){if(0===d)break e;d--,B+=o[l++]<>8),512&a.flags&&4&a.wrap&&(te[0]=255&B,te[1]=B>>>8&255,a.check=n(a.check,te,2,0)),B=0,N=0,a.mode=16184;case 16184:if(1024&a.flags){for(;N<16;){if(0===d)break e;d--,B+=o[l++]<>>8&255,a.check=n(a.check,te,2,0)),B=0,N=0}else a.head&&(a.head.extra=null);a.mode=16185;case 16185:if(1024&a.flags&&((L=a.length)>d&&(L=d),L&&(a.head&&(J=a.head.extra_len-a.length,a.head.extra||(a.head.extra=new Uint8Array(a.head.extra_len)),a.head.extra.set(o.subarray(l,l+L),J)),512&a.flags&&4&a.wrap&&(a.check=n(a.check,o,L,l)),d-=L,l+=L,a.length-=L),a.length))break e;a.length=0,a.mode=16186;case 16186:if(2048&a.flags){if(0===d)break e;L=0;do{J=o[l+L++],a.head&&J&&a.length<65536&&(a.head.name+=String.fromCharCode(J))}while(J&&L>9&1,a.head.done=!0),e.adler=a.check=0,a.mode=A;break;case 16189:for(;N<32;){if(0===d)break e;d--,B+=o[l++]<>>=7&N,N-=7&N,a.mode=U;break}for(;N<3;){if(0===d)break e;d--,B+=o[l++]<>>=1)){case 0:a.mode=16193;break;case 1:if(K(a),a.mode=T,i===b){B>>>=2,N-=2;break e}break;case 2:a.mode=16196;break;case 3:e.msg="invalid block type",a.mode=D}B>>>=2,N-=2;break;case 16193:for(B>>>=7&N,N-=7&N;N<32;){if(0===d)break e;d--,B+=o[l++]<>>16^65535)){e.msg="invalid stored block lengths",a.mode=D;break}if(a.length=65535&B,B=0,N=0,a.mode=S,i===b)break e;case S:a.mode=16195;case 16195:if(L=a.length){if(L>d&&(L=d),L>c&&(L=c),0===L)break e;s.set(o.subarray(l,l+L),f),d-=L,l+=L,c-=L,f+=L,a.length-=L;break}a.mode=A;break;case 16196:for(;N<14;){if(0===d)break e;d--,B+=o[l++]<>>=5,N-=5,a.ndist=1+(31&B),B>>>=5,N-=5,a.ncode=4+(15&B),B>>>=4,N-=4,a.nlen>286||a.ndist>30){e.msg="too many length or distance symbols",a.mode=D;break}a.have=0,a.mode=16197;case 16197:for(;a.have>>=3,N-=3}for(;a.have<19;)a.lens[ie[a.have++]]=0;if(a.lencode=a.lendyn,a.lenbits=7,V={bits:a.lenbits},Q=h(0,a.lens,0,19,a.lencode,0,a.work,V),a.lenbits=V.bits,Q){e.msg="invalid code lengths set",a.mode=D;break}a.have=0,a.mode=16198;case 16198:for(;a.have>>16&255,G=65535&ee,!((j=ee>>>24)<=N);){if(0===d)break e;d--,B+=o[l++]<>>=j,N-=j,a.lens[a.have++]=G;else{if(16===G){for($=j+2;N<$;){if(0===d)break e;d--,B+=o[l++]<>>=j,N-=j,0===a.have){e.msg="invalid bit length repeat",a.mode=D;break}J=a.lens[a.have-1],L=3+(3&B),B>>>=2,N-=2}else if(17===G){for($=j+3;N<$;){if(0===d)break e;d--,B+=o[l++]<>>=j)),B>>>=3,N-=3}else{for($=j+7;N<$;){if(0===d)break e;d--,B+=o[l++]<>>=j)),B>>>=7,N-=7}if(a.have+L>a.nlen+a.ndist){e.msg="invalid bit length repeat",a.mode=D;break}for(;L--;)a.lens[a.have++]=J}}if(a.mode===D)break;if(0===a.lens[256]){e.msg="invalid code -- missing end-of-block",a.mode=D;break}if(a.lenbits=9,V={bits:a.lenbits},Q=h(1,a.lens,0,a.nlen,a.lencode,0,a.work,V),a.lenbits=V.bits,Q){e.msg="invalid literal/lengths set",a.mode=D;break}if(a.distbits=6,a.distcode=a.distdyn,V={bits:a.distbits},Q=h(2,a.lens,a.nlen,a.ndist,a.distcode,0,a.work,V),a.distbits=V.bits,Q){e.msg="invalid distances set",a.mode=D;break}if(a.mode=T,i===b)break e;case T:a.mode=O;case O:if(d>=6&&c>=258){e.next_out=f,e.avail_out=c,e.next_in=l,e.avail_in=d,a.hold=B,a.bits=N,r(e,F),f=e.next_out,s=e.output,c=e.avail_out,l=e.next_in,o=e.input,d=e.avail_in,B=a.hold,N=a.bits,a.mode===A&&(a.back=-1);break}for(a.back=0;Y=(ee=a.lencode[B&(1<>>16&255,G=65535&ee,!((j=ee>>>24)<=N);){if(0===d)break e;d--,B+=o[l++]<>X)])>>>16&255,G=65535&ee,!(X+(j=ee>>>24)<=N);){if(0===d)break e;d--,B+=o[l++]<>>=X,N-=X,a.back+=X}if(B>>>=j,N-=j,a.back+=j,a.length=G,0===Y){a.mode=16205;break}if(32&Y){a.back=-1,a.mode=A;break}if(64&Y){e.msg="invalid literal/length code",a.mode=D;break}a.extra=15&Y,a.mode=16201;case 16201:if(a.extra){for($=a.extra;N<$;){if(0===d)break e;d--,B+=o[l++]<>>=a.extra,N-=a.extra,a.back+=a.extra}a.was=a.length,a.mode=16202;case 16202:for(;Y=(ee=a.distcode[B&(1<>>16&255,G=65535&ee,!((j=ee>>>24)<=N);){if(0===d)break e;d--,B+=o[l++]<>X)])>>>16&255,G=65535&ee,!(X+(j=ee>>>24)<=N);){if(0===d)break e;d--,B+=o[l++]<>>=X,N-=X,a.back+=X}if(B>>>=j,N-=j,a.back+=j,64&Y){e.msg="invalid distance code",a.mode=D;break}a.offset=G,a.extra=15&Y,a.mode=16203;case 16203:if(a.extra){for($=a.extra;N<$;){if(0===d)break e;d--,B+=o[l++]<>>=a.extra,N-=a.extra,a.back+=a.extra}if(a.offset>a.dmax){e.msg="invalid distance too far back",a.mode=D;break}a.mode=16204;case 16204:if(0===c)break e;if(L=F-c,a.offset>L){if((L=a.offset-L)>a.whave&&a.sane){e.msg="invalid distance too far back",a.mode=D;break}L>a.wnext?(L-=a.wnext,M=a.wsize-L):M=a.wnext-L,L>a.length&&(L=a.length),H=a.window}else H=s,M=f-a.offset,L=a.length;L>c&&(L=c),c-=L,a.length-=L;do{s[f++]=H[M++]}while(--L);0===a.length&&(a.mode=O);break;case 16205:if(0===c)break e;s[f++]=a.length,c--,a.mode=O;break;case U:if(a.wrap){for(;N<32;){if(0===d)break e;d--,B|=o[l++]<=252?6:V>=248?5:V>=240?4:V>=224?3:V>=192?2:1;Q[254]=Q[254]=1;var $=function(e){if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(e);var t,i,n,a,r,o=e.length,s=0;for(a=0;a>>6,t[r++]=128|63&i):i<65536?(t[r++]=224|i>>>12,t[r++]=128|i>>>6&63,t[r++]=128|63&i):(t[r++]=240|i>>>18,t[r++]=128|i>>>12&63,t[r++]=128|i>>>6&63,t[r++]=128|63&i);return t},ee=function(e,t){var i,n,a=t||e.length;if("function"==typeof TextDecoder&&TextDecoder.prototype.decode)return(new TextDecoder).decode(e.subarray(0,t));var r=new Array(2*a);for(n=0,i=0;i4)r[n++]=65533,i+=s-1;else{for(o&=2===s?31:3===s?15:7;s>1&&i1?r[n++]=65533:o<65536?r[n++]=o:(o-=65536,r[n++]=55296|o>>10&1023,r[n++]=56320|1023&o)}}}return function(e,t){if(t<65534&&e.subarray&&J)return String.fromCharCode.apply(null,e.length===t?e:e.subarray(0,t));for(var i="",n=0;ne.length&&(t=e.length);for(var i=t-1;i>=0&&128==(192&e[i]);)i--;return i<0||0===i?t:i+Q[e[i]]>t?i:t},ie={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"};var ne=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0};var ae=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1},re=Object.prototype.toString,oe=c.Z_NO_FLUSH,se=c.Z_FINISH,le=c.Z_OK,fe=c.Z_STREAM_END,de=c.Z_NEED_DICT,he=c.Z_STREAM_ERROR,ce=c.Z_DATA_ERROR,ue=c.Z_MEM_ERROR;function we(e){this.options=W({chunkSize:65536,windowBits:15,to:""},e||{});var t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new ne,this.strm.avail_out=0;var i=Y.inflateInit2(this.strm,t.windowBits);if(i!==le)throw new Error(ie[i]);if(this.header=new ae,Y.inflateGetHeader(this.strm,this.header),t.dictionary&&("string"==typeof t.dictionary?t.dictionary=$(t.dictionary):"[object ArrayBuffer]"===re.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(i=Y.inflateSetDictionary(this.strm,t.dictionary))!==le))throw new Error(ie[i])}function be(e,t){var i=new we(t);if(i.push(e),i.err)throw i.msg||ie[i.err];return i.result}we.prototype.push=function(e,t){var i,n,a,r=this.strm,o=this.options.chunkSize,s=this.options.dictionary;if(this.ended)return!1;for(n=t===~~t?t:!0===t?se:oe,"[object ArrayBuffer]"===re.call(e)?r.input=new Uint8Array(e):r.input=e,r.next_in=0,r.avail_in=r.input.length;;){for(0===r.avail_out&&(r.output=new Uint8Array(o),r.next_out=0,r.avail_out=o),(i=Y.inflate(r,n))===de&&s&&((i=Y.inflateSetDictionary(r,s))===le?i=Y.inflate(r,n):i===ce&&(i=de));r.avail_in>0&&i===fe&&r.state.wrap>0&&0!==e[r.next_in];)Y.inflateReset(r),i=Y.inflate(r,n);switch(i){case he:case ce:case de:case ue:return this.onEnd(i),this.ended=!0,!1}if(a=r.avail_out,r.next_out&&(0===r.avail_out||i===fe))if("string"===this.options.to){var l=te(r.output,r.next_out),f=r.next_out-l,d=ee(r.output,l);r.next_out=f,r.avail_out=o-f,f&&r.output.set(r.output.subarray(l,l+f),0),this.onData(d)}else this.onData(r.output.length===r.next_out?r.output:r.output.subarray(0,r.next_out));if(i!==le||0!==a){if(i===fe)return i=Y.inflateEnd(this.strm),this.onEnd(i),this.ended=!0,!0;if(0===r.avail_in)break}}return!0},we.prototype.onData=function(e){this.chunks.push(e)},we.prototype.onEnd=function(e){e===le&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=q(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg};var me=we,ke=be,_e=function(e,t){return(t=t||{}).raw=!0,be(e,t)},ve=be,ge=c,pe={Inflate:me,inflate:ke,inflateRaw:_e,ungzip:ve,constants:ge};e.Inflate=me,e.constants=ge,e.default=pe,e.inflate=ke,e.inflateRaw=_e,e.ungzip=ve,Object.defineProperty(e,"__esModule",{value:!0})})); diff --git a/node_modules/pako/dist/pako_inflate.js b/node_modules/pako/dist/pako_inflate.js deleted file mode 100644 index 1a98d50..0000000 --- a/node_modules/pako/dist/pako_inflate.js +++ /dev/null @@ -1,3239 +0,0 @@ - -/*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : - typeof define === 'function' && define.amd ? define(['exports'], factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.pako = {})); -})(this, (function (exports) { 'use strict'; - - // Note: adler32 takes 12% for level 0 and 2% for level 6. - // It isn't worth it to make additional optimizations as in original. - // Small size is preferable. - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - const adler32 = (adler, buf, len, pos) => { - let s1 = (adler & 0xffff) |0, - s2 = ((adler >>> 16) & 0xffff) |0, - n = 0; - - while (len !== 0) { - // Set limit ~ twice less than 5552, to keep - // s2 in 31-bits, because we force signed ints. - // in other case %= will fail. - n = len > 2000 ? 2000 : len; - len -= n; - - do { - s1 = (s1 + buf[pos++]) |0; - s2 = (s2 + s1) |0; - } while (--n); - - s1 %= 65521; - s2 %= 65521; - } - - return (s1 | (s2 << 16)) |0; - }; - - - var adler32_1 = adler32; - - // Note: we can't get significant speed boost here. - // So write code to minimize size - no pregenerated tables - // and array tools dependencies. - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - // Use ordinary array, since untyped makes no boost here - const makeTable = () => { - let c, table = []; - - for (var n = 0; n < 256; n++) { - c = n; - for (var k = 0; k < 8; k++) { - c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); - } - table[n] = c; - } - - return table; - }; - - // Create table on load. Just 255 signed longs. Not a problem. - const crcTable = new Uint32Array(makeTable()); - - - const crc32 = (crc, buf, len, pos) => { - const t = crcTable; - const end = pos + len; - - crc ^= -1; - - for (let i = pos; i < end; i++) { - crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF]; - } - - return (crc ^ (-1)); // >>> 0; - }; - - - var crc32_1 = crc32; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - // See state defs from inflate.js - const BAD$1 = 16209; /* got a data error -- remain here until reset */ - const TYPE$1 = 16191; /* i: waiting for type bits, including last-flag bit */ - - /* - Decode literal, length, and distance codes and write out the resulting - literal and match bytes until either not enough input or output is - available, an end-of-block is encountered, or a data error is encountered. - When large enough input and output buffers are supplied to inflate(), for - example, a 16K input buffer and a 64K output buffer, more than 95% of the - inflate execution time is spent in this routine. - - Entry assumptions: - - state.mode === LEN - strm.avail_in >= 6 - strm.avail_out >= 258 - start >= strm.avail_out - state.bits < 8 - - On return, state.mode is one of: - - LEN -- ran out of enough output space or enough available input - TYPE -- reached end of block code, inflate() to interpret next block - BAD -- error in block data - - Notes: - - - The maximum input bits used by a length/distance pair is 15 bits for the - length code, 5 bits for the length extra, 15 bits for the distance code, - and 13 bits for the distance extra. This totals 48 bits, or six bytes. - Therefore if strm.avail_in >= 6, then there is enough input to avoid - checking for available input while decoding. - - - The maximum bytes that a single length/distance pair can output is 258 - bytes, which is the maximum length that can be coded. inflate_fast() - requires strm.avail_out >= 258 for each loop to avoid checking for - output space. - */ - var inffast = function inflate_fast(strm, start) { - let _in; /* local strm.input */ - let last; /* have enough input while in < last */ - let _out; /* local strm.output */ - let beg; /* inflate()'s initial strm.output */ - let end; /* while out < end, enough space available */ - //#ifdef INFLATE_STRICT - let dmax; /* maximum distance from zlib header */ - //#endif - let wsize; /* window size or zero if not using window */ - let whave; /* valid bytes in the window */ - let wnext; /* window write index */ - // Use `s_window` instead `window`, avoid conflict with instrumentation tools - let s_window; /* allocated sliding window, if wsize != 0 */ - let hold; /* local strm.hold */ - let bits; /* local strm.bits */ - let lcode; /* local strm.lencode */ - let dcode; /* local strm.distcode */ - let lmask; /* mask for first level of length codes */ - let dmask; /* mask for first level of distance codes */ - let here; /* retrieved table entry */ - let op; /* code bits, operation, extra bits, or */ - /* window position, window bytes to copy */ - let len; /* match length, unused bytes */ - let dist; /* match distance */ - let from; /* where to copy match from */ - let from_source; - - - let input, output; // JS specific, because we have no pointers - - /* copy state to local variables */ - const state = strm.state; - //here = state.here; - _in = strm.next_in; - input = strm.input; - last = _in + (strm.avail_in - 5); - _out = strm.next_out; - output = strm.output; - beg = _out - (start - strm.avail_out); - end = _out + (strm.avail_out - 257); - //#ifdef INFLATE_STRICT - dmax = state.dmax; - //#endif - wsize = state.wsize; - whave = state.whave; - wnext = state.wnext; - s_window = state.window; - hold = state.hold; - bits = state.bits; - lcode = state.lencode; - dcode = state.distcode; - lmask = (1 << state.lenbits) - 1; - dmask = (1 << state.distbits) - 1; - - - /* decode literals and length/distances until end-of-block or not enough - input data or output space */ - - top: - do { - if (bits < 15) { - hold += input[_in++] << bits; - bits += 8; - hold += input[_in++] << bits; - bits += 8; - } - - here = lcode[hold & lmask]; - - dolen: - for (;;) { // Goto emulation - op = here >>> 24/*here.bits*/; - hold >>>= op; - bits -= op; - op = (here >>> 16) & 0xff/*here.op*/; - if (op === 0) { /* literal */ - //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - // "inflate: literal '%c'\n" : - // "inflate: literal 0x%02x\n", here.val)); - output[_out++] = here & 0xffff/*here.val*/; - } - else if (op & 16) { /* length base */ - len = here & 0xffff/*here.val*/; - op &= 15; /* number of extra bits */ - if (op) { - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - } - len += hold & ((1 << op) - 1); - hold >>>= op; - bits -= op; - } - //Tracevv((stderr, "inflate: length %u\n", len)); - if (bits < 15) { - hold += input[_in++] << bits; - bits += 8; - hold += input[_in++] << bits; - bits += 8; - } - here = dcode[hold & dmask]; - - dodist: - for (;;) { // goto emulation - op = here >>> 24/*here.bits*/; - hold >>>= op; - bits -= op; - op = (here >>> 16) & 0xff/*here.op*/; - - if (op & 16) { /* distance base */ - dist = here & 0xffff/*here.val*/; - op &= 15; /* number of extra bits */ - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - } - } - dist += hold & ((1 << op) - 1); - //#ifdef INFLATE_STRICT - if (dist > dmax) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD$1; - break top; - } - //#endif - hold >>>= op; - bits -= op; - //Tracevv((stderr, "inflate: distance %u\n", dist)); - op = _out - beg; /* max distance in output */ - if (dist > op) { /* see if copy from window */ - op = dist - op; /* distance back in window */ - if (op > whave) { - if (state.sane) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD$1; - break top; - } - - // (!) This block is disabled in zlib defaults, - // don't enable it for binary compatibility - //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR - // if (len <= op - whave) { - // do { - // output[_out++] = 0; - // } while (--len); - // continue top; - // } - // len -= op - whave; - // do { - // output[_out++] = 0; - // } while (--op > whave); - // if (op === 0) { - // from = _out - dist; - // do { - // output[_out++] = output[from++]; - // } while (--len); - // continue top; - // } - //#endif - } - from = 0; // window index - from_source = s_window; - if (wnext === 0) { /* very common case */ - from += wsize - op; - if (op < len) { /* some from window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - else if (wnext < op) { /* wrap around window */ - from += wsize + wnext - op; - op -= wnext; - if (op < len) { /* some from end of window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = 0; - if (wnext < len) { /* some from start of window */ - op = wnext; - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - } - else { /* contiguous in window */ - from += wnext - op; - if (op < len) { /* some from window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - while (len > 2) { - output[_out++] = from_source[from++]; - output[_out++] = from_source[from++]; - output[_out++] = from_source[from++]; - len -= 3; - } - if (len) { - output[_out++] = from_source[from++]; - if (len > 1) { - output[_out++] = from_source[from++]; - } - } - } - else { - from = _out - dist; /* copy direct from output */ - do { /* minimum length is three */ - output[_out++] = output[from++]; - output[_out++] = output[from++]; - output[_out++] = output[from++]; - len -= 3; - } while (len > 2); - if (len) { - output[_out++] = output[from++]; - if (len > 1) { - output[_out++] = output[from++]; - } - } - } - } - else if ((op & 64) === 0) { /* 2nd level distance code */ - here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))]; - continue dodist; - } - else { - strm.msg = 'invalid distance code'; - state.mode = BAD$1; - break top; - } - - break; // need to emulate goto via "continue" - } - } - else if ((op & 64) === 0) { /* 2nd level length code */ - here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))]; - continue dolen; - } - else if (op & 32) { /* end-of-block */ - //Tracevv((stderr, "inflate: end of block\n")); - state.mode = TYPE$1; - break top; - } - else { - strm.msg = 'invalid literal/length code'; - state.mode = BAD$1; - break top; - } - - break; // need to emulate goto via "continue" - } - } while (_in < last && _out < end); - - /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ - len = bits >> 3; - _in -= len; - bits -= len << 3; - hold &= (1 << bits) - 1; - - /* update state and return */ - strm.next_in = _in; - strm.next_out = _out; - strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last)); - strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end)); - state.hold = hold; - state.bits = bits; - return; - }; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - const MAXBITS = 15; - const ENOUGH_LENS$1 = 852; - const ENOUGH_DISTS$1 = 592; - //const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); - - const CODES$1 = 0; - const LENS$1 = 1; - const DISTS$1 = 2; - - const lbase = new Uint16Array([ /* Length codes 257..285 base */ - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 - ]); - - const lext = new Uint8Array([ /* Length codes 257..285 extra */ - 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78 - ]); - - const dbase = new Uint16Array([ /* Distance codes 0..29 base */ - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, - 8193, 12289, 16385, 24577, 0, 0 - ]); - - const dext = new Uint8Array([ /* Distance codes 0..29 extra */ - 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, - 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, - 28, 28, 29, 29, 64, 64 - ]); - - const inflate_table = (type, lens, lens_index, codes, table, table_index, work, opts) => - { - const bits = opts.bits; - //here = opts.here; /* table entry for duplication */ - - let len = 0; /* a code's length in bits */ - let sym = 0; /* index of code symbols */ - let min = 0, max = 0; /* minimum and maximum code lengths */ - let root = 0; /* number of index bits for root table */ - let curr = 0; /* number of index bits for current table */ - let drop = 0; /* code bits to drop for sub-table */ - let left = 0; /* number of prefix codes available */ - let used = 0; /* code entries in table used */ - let huff = 0; /* Huffman code */ - let incr; /* for incrementing code, index */ - let fill; /* index for replicating entries */ - let low; /* low bits for current root entry */ - let mask; /* mask for low root bits */ - let next; /* next available space in table */ - let base = null; /* base value table to use */ - // let shoextra; /* extra bits table to use */ - let match; /* use base and extra for symbol >= match */ - const count = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */ - const offs = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */ - let extra = null; - - let here_bits, here_op, here_val; - - /* - Process a set of code lengths to create a canonical Huffman code. The - code lengths are lens[0..codes-1]. Each length corresponds to the - symbols 0..codes-1. The Huffman code is generated by first sorting the - symbols by length from short to long, and retaining the symbol order - for codes with equal lengths. Then the code starts with all zero bits - for the first code of the shortest length, and the codes are integer - increments for the same length, and zeros are appended as the length - increases. For the deflate format, these bits are stored backwards - from their more natural integer increment ordering, and so when the - decoding tables are built in the large loop below, the integer codes - are incremented backwards. - - This routine assumes, but does not check, that all of the entries in - lens[] are in the range 0..MAXBITS. The caller must assure this. - 1..MAXBITS is interpreted as that code length. zero means that that - symbol does not occur in this code. - - The codes are sorted by computing a count of codes for each length, - creating from that a table of starting indices for each length in the - sorted table, and then entering the symbols in order in the sorted - table. The sorted table is work[], with that space being provided by - the caller. - - The length counts are used for other purposes as well, i.e. finding - the minimum and maximum length codes, determining if there are any - codes at all, checking for a valid set of lengths, and looking ahead - at length counts to determine sub-table sizes when building the - decoding tables. - */ - - /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ - for (len = 0; len <= MAXBITS; len++) { - count[len] = 0; - } - for (sym = 0; sym < codes; sym++) { - count[lens[lens_index + sym]]++; - } - - /* bound code lengths, force root to be within code lengths */ - root = bits; - for (max = MAXBITS; max >= 1; max--) { - if (count[max] !== 0) { break; } - } - if (root > max) { - root = max; - } - if (max === 0) { /* no symbols to code at all */ - //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */ - //table.bits[opts.table_index] = 1; //here.bits = (var char)1; - //table.val[opts.table_index++] = 0; //here.val = (var short)0; - table[table_index++] = (1 << 24) | (64 << 16) | 0; - - - //table.op[opts.table_index] = 64; - //table.bits[opts.table_index] = 1; - //table.val[opts.table_index++] = 0; - table[table_index++] = (1 << 24) | (64 << 16) | 0; - - opts.bits = 1; - return 0; /* no symbols, but wait for decoding to report error */ - } - for (min = 1; min < max; min++) { - if (count[min] !== 0) { break; } - } - if (root < min) { - root = min; - } - - /* check for an over-subscribed or incomplete set of lengths */ - left = 1; - for (len = 1; len <= MAXBITS; len++) { - left <<= 1; - left -= count[len]; - if (left < 0) { - return -1; - } /* over-subscribed */ - } - if (left > 0 && (type === CODES$1 || max !== 1)) { - return -1; /* incomplete set */ - } - - /* generate offsets into symbol table for each length for sorting */ - offs[1] = 0; - for (len = 1; len < MAXBITS; len++) { - offs[len + 1] = offs[len] + count[len]; - } - - /* sort symbols by length, by symbol order within each length */ - for (sym = 0; sym < codes; sym++) { - if (lens[lens_index + sym] !== 0) { - work[offs[lens[lens_index + sym]]++] = sym; - } - } - - /* - Create and fill in decoding tables. In this loop, the table being - filled is at next and has curr index bits. The code being used is huff - with length len. That code is converted to an index by dropping drop - bits off of the bottom. For codes where len is less than drop + curr, - those top drop + curr - len bits are incremented through all values to - fill the table with replicated entries. - - root is the number of index bits for the root table. When len exceeds - root, sub-tables are created pointed to by the root entry with an index - of the low root bits of huff. This is saved in low to check for when a - new sub-table should be started. drop is zero when the root table is - being filled, and drop is root when sub-tables are being filled. - - When a new sub-table is needed, it is necessary to look ahead in the - code lengths to determine what size sub-table is needed. The length - counts are used for this, and so count[] is decremented as codes are - entered in the tables. - - used keeps track of how many table entries have been allocated from the - provided *table space. It is checked for LENS and DIST tables against - the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in - the initial root table size constants. See the comments in inftrees.h - for more information. - - sym increments through all symbols, and the loop terminates when - all codes of length max, i.e. all codes, have been processed. This - routine permits incomplete codes, so another loop after this one fills - in the rest of the decoding tables with invalid code markers. - */ - - /* set up for code type */ - // poor man optimization - use if-else instead of switch, - // to avoid deopts in old v8 - if (type === CODES$1) { - base = extra = work; /* dummy value--not used */ - match = 20; - - } else if (type === LENS$1) { - base = lbase; - extra = lext; - match = 257; - - } else { /* DISTS */ - base = dbase; - extra = dext; - match = 0; - } - - /* initialize opts for loop */ - huff = 0; /* starting code */ - sym = 0; /* starting code symbol */ - len = min; /* starting code length */ - next = table_index; /* current table to fill in */ - curr = root; /* current table index bits */ - drop = 0; /* current bits to drop from code for index */ - low = -1; /* trigger new sub-table when len > root */ - used = 1 << root; /* use root table entries */ - mask = used - 1; /* mask for comparing low */ - - /* check available table space */ - if ((type === LENS$1 && used > ENOUGH_LENS$1) || - (type === DISTS$1 && used > ENOUGH_DISTS$1)) { - return 1; - } - - /* process all codes and make table entries */ - for (;;) { - /* create table entry */ - here_bits = len - drop; - if (work[sym] + 1 < match) { - here_op = 0; - here_val = work[sym]; - } - else if (work[sym] >= match) { - here_op = extra[work[sym] - match]; - here_val = base[work[sym] - match]; - } - else { - here_op = 32 + 64; /* end of block */ - here_val = 0; - } - - /* replicate for those indices with low len bits equal to huff */ - incr = 1 << (len - drop); - fill = 1 << curr; - min = fill; /* save offset to next table */ - do { - fill -= incr; - table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0; - } while (fill !== 0); - - /* backwards increment the len-bit code huff */ - incr = 1 << (len - 1); - while (huff & incr) { - incr >>= 1; - } - if (incr !== 0) { - huff &= incr - 1; - huff += incr; - } else { - huff = 0; - } - - /* go to next symbol, update count, len */ - sym++; - if (--count[len] === 0) { - if (len === max) { break; } - len = lens[lens_index + work[sym]]; - } - - /* create new sub-table if needed */ - if (len > root && (huff & mask) !== low) { - /* if first time, transition to sub-tables */ - if (drop === 0) { - drop = root; - } - - /* increment past last table */ - next += min; /* here min is 1 << curr */ - - /* determine length of next table */ - curr = len - drop; - left = 1 << curr; - while (curr + drop < max) { - left -= count[curr + drop]; - if (left <= 0) { break; } - curr++; - left <<= 1; - } - - /* check for enough space */ - used += 1 << curr; - if ((type === LENS$1 && used > ENOUGH_LENS$1) || - (type === DISTS$1 && used > ENOUGH_DISTS$1)) { - return 1; - } - - /* point entry in root table to sub-table */ - low = huff & mask; - /*table.op[low] = curr; - table.bits[low] = root; - table.val[low] = next - opts.table_index;*/ - table[low] = (root << 24) | (curr << 16) | (next - table_index) |0; - } - } - - /* fill in remaining table entry if code is incomplete (guaranteed to have - at most one remaining entry, since if the code is incomplete, the - maximum code length that was allowed to get this far is one bit) */ - if (huff !== 0) { - //table.op[next + huff] = 64; /* invalid code marker */ - //table.bits[next + huff] = len - drop; - //table.val[next + huff] = 0; - table[next + huff] = ((len - drop) << 24) | (64 << 16) |0; - } - - /* set return parameters */ - //opts.table_index += used; - opts.bits = root; - return 0; - }; - - - var inftrees = inflate_table; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - var constants$1 = { - - /* Allowed flush values; see deflate() and inflate() below for details */ - Z_NO_FLUSH: 0, - Z_PARTIAL_FLUSH: 1, - Z_SYNC_FLUSH: 2, - Z_FULL_FLUSH: 3, - Z_FINISH: 4, - Z_BLOCK: 5, - Z_TREES: 6, - - /* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ - Z_OK: 0, - Z_STREAM_END: 1, - Z_NEED_DICT: 2, - Z_ERRNO: -1, - Z_STREAM_ERROR: -2, - Z_DATA_ERROR: -3, - Z_MEM_ERROR: -4, - Z_BUF_ERROR: -5, - //Z_VERSION_ERROR: -6, - - /* compression levels */ - Z_NO_COMPRESSION: 0, - Z_BEST_SPEED: 1, - Z_BEST_COMPRESSION: 9, - Z_DEFAULT_COMPRESSION: -1, - - - Z_FILTERED: 1, - Z_HUFFMAN_ONLY: 2, - Z_RLE: 3, - Z_FIXED: 4, - Z_DEFAULT_STRATEGY: 0, - - /* Possible values of the data_type field (though see inflate()) */ - Z_BINARY: 0, - Z_TEXT: 1, - //Z_ASCII: 1, // = Z_TEXT (deprecated) - Z_UNKNOWN: 2, - - /* The deflate compression method */ - Z_DEFLATED: 8 - //Z_NULL: null // Use -1 or null inline, depending on var type - }; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - - - - - - const CODES = 0; - const LENS = 1; - const DISTS = 2; - - /* Public constants ==========================================================*/ - /* ===========================================================================*/ - - const { - Z_FINISH: Z_FINISH$1, Z_BLOCK, Z_TREES, - Z_OK: Z_OK$1, Z_STREAM_END: Z_STREAM_END$1, Z_NEED_DICT: Z_NEED_DICT$1, Z_STREAM_ERROR: Z_STREAM_ERROR$1, Z_DATA_ERROR: Z_DATA_ERROR$1, Z_MEM_ERROR: Z_MEM_ERROR$1, Z_BUF_ERROR, - Z_DEFLATED - } = constants$1; - - - /* STATES ====================================================================*/ - /* ===========================================================================*/ - - - const HEAD = 16180; /* i: waiting for magic header */ - const FLAGS = 16181; /* i: waiting for method and flags (gzip) */ - const TIME = 16182; /* i: waiting for modification time (gzip) */ - const OS = 16183; /* i: waiting for extra flags and operating system (gzip) */ - const EXLEN = 16184; /* i: waiting for extra length (gzip) */ - const EXTRA = 16185; /* i: waiting for extra bytes (gzip) */ - const NAME = 16186; /* i: waiting for end of file name (gzip) */ - const COMMENT = 16187; /* i: waiting for end of comment (gzip) */ - const HCRC = 16188; /* i: waiting for header crc (gzip) */ - const DICTID = 16189; /* i: waiting for dictionary check value */ - const DICT = 16190; /* waiting for inflateSetDictionary() call */ - const TYPE = 16191; /* i: waiting for type bits, including last-flag bit */ - const TYPEDO = 16192; /* i: same, but skip check to exit inflate on new block */ - const STORED = 16193; /* i: waiting for stored size (length and complement) */ - const COPY_ = 16194; /* i/o: same as COPY below, but only first time in */ - const COPY = 16195; /* i/o: waiting for input or output to copy stored block */ - const TABLE = 16196; /* i: waiting for dynamic block table lengths */ - const LENLENS = 16197; /* i: waiting for code length code lengths */ - const CODELENS = 16198; /* i: waiting for length/lit and distance code lengths */ - const LEN_ = 16199; /* i: same as LEN below, but only first time in */ - const LEN = 16200; /* i: waiting for length/lit/eob code */ - const LENEXT = 16201; /* i: waiting for length extra bits */ - const DIST = 16202; /* i: waiting for distance code */ - const DISTEXT = 16203; /* i: waiting for distance extra bits */ - const MATCH = 16204; /* o: waiting for output space to copy string */ - const LIT = 16205; /* o: waiting for output space to write literal */ - const CHECK = 16206; /* i: waiting for 32-bit check value */ - const LENGTH = 16207; /* i: waiting for 32-bit length (gzip) */ - const DONE = 16208; /* finished check, done -- remain here until reset */ - const BAD = 16209; /* got a data error -- remain here until reset */ - const MEM = 16210; /* got an inflate() memory error -- remain here until reset */ - const SYNC = 16211; /* looking for synchronization bytes to restart inflate() */ - - /* ===========================================================================*/ - - - - const ENOUGH_LENS = 852; - const ENOUGH_DISTS = 592; - //const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); - - const MAX_WBITS = 15; - /* 32K LZ77 window */ - const DEF_WBITS = MAX_WBITS; - - - const zswap32 = (q) => { - - return (((q >>> 24) & 0xff) + - ((q >>> 8) & 0xff00) + - ((q & 0xff00) << 8) + - ((q & 0xff) << 24)); - }; - - - function InflateState() { - this.strm = null; /* pointer back to this zlib stream */ - this.mode = 0; /* current inflate mode */ - this.last = false; /* true if processing last block */ - this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip, - bit 2 true to validate check value */ - this.havedict = false; /* true if dictionary provided */ - this.flags = 0; /* gzip header method and flags (0 if zlib), or - -1 if raw or no header yet */ - this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */ - this.check = 0; /* protected copy of check value */ - this.total = 0; /* protected copy of output count */ - // TODO: may be {} - this.head = null; /* where to save gzip header information */ - - /* sliding window */ - this.wbits = 0; /* log base 2 of requested window size */ - this.wsize = 0; /* window size or zero if not using window */ - this.whave = 0; /* valid bytes in the window */ - this.wnext = 0; /* window write index */ - this.window = null; /* allocated sliding window, if needed */ - - /* bit accumulator */ - this.hold = 0; /* input bit accumulator */ - this.bits = 0; /* number of bits in "in" */ - - /* for string and stored block copying */ - this.length = 0; /* literal or length of data to copy */ - this.offset = 0; /* distance back to copy string from */ - - /* for table and code decoding */ - this.extra = 0; /* extra bits needed */ - - /* fixed and dynamic code tables */ - this.lencode = null; /* starting table for length/literal codes */ - this.distcode = null; /* starting table for distance codes */ - this.lenbits = 0; /* index bits for lencode */ - this.distbits = 0; /* index bits for distcode */ - - /* dynamic table building */ - this.ncode = 0; /* number of code length code lengths */ - this.nlen = 0; /* number of length code lengths */ - this.ndist = 0; /* number of distance code lengths */ - this.have = 0; /* number of code lengths in lens[] */ - this.next = null; /* next available space in codes[] */ - - this.lens = new Uint16Array(320); /* temporary storage for code lengths */ - this.work = new Uint16Array(288); /* work area for code table building */ - - /* - because we don't have pointers in js, we use lencode and distcode directly - as buffers so we don't need codes - */ - //this.codes = new Int32Array(ENOUGH); /* space for code tables */ - this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */ - this.distdyn = null; /* dynamic table for distance codes (JS specific) */ - this.sane = 0; /* if false, allow invalid distance too far */ - this.back = 0; /* bits back of last unprocessed length/lit */ - this.was = 0; /* initial length of match */ - } - - - const inflateStateCheck = (strm) => { - - if (!strm) { - return 1; - } - const state = strm.state; - if (!state || state.strm !== strm || - state.mode < HEAD || state.mode > SYNC) { - return 1; - } - return 0; - }; - - - const inflateResetKeep = (strm) => { - - if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; } - const state = strm.state; - strm.total_in = strm.total_out = state.total = 0; - strm.msg = ''; /*Z_NULL*/ - if (state.wrap) { /* to support ill-conceived Java test suite */ - strm.adler = state.wrap & 1; - } - state.mode = HEAD; - state.last = 0; - state.havedict = 0; - state.flags = -1; - state.dmax = 32768; - state.head = null/*Z_NULL*/; - state.hold = 0; - state.bits = 0; - //state.lencode = state.distcode = state.next = state.codes; - state.lencode = state.lendyn = new Int32Array(ENOUGH_LENS); - state.distcode = state.distdyn = new Int32Array(ENOUGH_DISTS); - - state.sane = 1; - state.back = -1; - //Tracev((stderr, "inflate: reset\n")); - return Z_OK$1; - }; - - - const inflateReset = (strm) => { - - if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; } - const state = strm.state; - state.wsize = 0; - state.whave = 0; - state.wnext = 0; - return inflateResetKeep(strm); - - }; - - - const inflateReset2 = (strm, windowBits) => { - let wrap; - - /* get the state */ - if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; } - const state = strm.state; - - /* extract wrap request from windowBits parameter */ - if (windowBits < 0) { - wrap = 0; - windowBits = -windowBits; - } - else { - wrap = (windowBits >> 4) + 5; - if (windowBits < 48) { - windowBits &= 15; - } - } - - /* set number of window bits, free window if different */ - if (windowBits && (windowBits < 8 || windowBits > 15)) { - return Z_STREAM_ERROR$1; - } - if (state.window !== null && state.wbits !== windowBits) { - state.window = null; - } - - /* update state and reset the rest of it */ - state.wrap = wrap; - state.wbits = windowBits; - return inflateReset(strm); - }; - - - const inflateInit2 = (strm, windowBits) => { - - if (!strm) { return Z_STREAM_ERROR$1; } - //strm.msg = Z_NULL; /* in case we return an error */ - - const state = new InflateState(); - - //if (state === Z_NULL) return Z_MEM_ERROR; - //Tracev((stderr, "inflate: allocated\n")); - strm.state = state; - state.strm = strm; - state.window = null/*Z_NULL*/; - state.mode = HEAD; /* to pass state test in inflateReset2() */ - const ret = inflateReset2(strm, windowBits); - if (ret !== Z_OK$1) { - strm.state = null/*Z_NULL*/; - } - return ret; - }; - - - const inflateInit = (strm) => { - - return inflateInit2(strm, DEF_WBITS); - }; - - - /* - Return state with length and distance decoding tables and index sizes set to - fixed code decoding. Normally this returns fixed tables from inffixed.h. - If BUILDFIXED is defined, then instead this routine builds the tables the - first time it's called, and returns those tables the first time and - thereafter. This reduces the size of the code by about 2K bytes, in - exchange for a little execution time. However, BUILDFIXED should not be - used for threaded applications, since the rewriting of the tables and virgin - may not be thread-safe. - */ - let virgin = true; - - let lenfix, distfix; // We have no pointers in JS, so keep tables separate - - - const fixedtables = (state) => { - - /* build fixed huffman tables if first call (may not be thread safe) */ - if (virgin) { - lenfix = new Int32Array(512); - distfix = new Int32Array(32); - - /* literal/length table */ - let sym = 0; - while (sym < 144) { state.lens[sym++] = 8; } - while (sym < 256) { state.lens[sym++] = 9; } - while (sym < 280) { state.lens[sym++] = 7; } - while (sym < 288) { state.lens[sym++] = 8; } - - inftrees(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 }); - - /* distance table */ - sym = 0; - while (sym < 32) { state.lens[sym++] = 5; } - - inftrees(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 }); - - /* do this just once */ - virgin = false; - } - - state.lencode = lenfix; - state.lenbits = 9; - state.distcode = distfix; - state.distbits = 5; - }; - - - /* - Update the window with the last wsize (normally 32K) bytes written before - returning. If window does not exist yet, create it. This is only called - when a window is already in use, or when output has been written during this - inflate call, but the end of the deflate stream has not been reached yet. - It is also called to create a window for dictionary data when a dictionary - is loaded. - - Providing output buffers larger than 32K to inflate() should provide a speed - advantage, since only the last 32K of output is copied to the sliding window - upon return from inflate(), and since all distances after the first 32K of - output will fall in the output data, making match copies simpler and faster. - The advantage may be dependent on the size of the processor's data caches. - */ - const updatewindow = (strm, src, end, copy) => { - - let dist; - const state = strm.state; - - /* if it hasn't been done already, allocate space for the window */ - if (state.window === null) { - state.wsize = 1 << state.wbits; - state.wnext = 0; - state.whave = 0; - - state.window = new Uint8Array(state.wsize); - } - - /* copy state->wsize or less output bytes into the circular window */ - if (copy >= state.wsize) { - state.window.set(src.subarray(end - state.wsize, end), 0); - state.wnext = 0; - state.whave = state.wsize; - } - else { - dist = state.wsize - state.wnext; - if (dist > copy) { - dist = copy; - } - //zmemcpy(state->window + state->wnext, end - copy, dist); - state.window.set(src.subarray(end - copy, end - copy + dist), state.wnext); - copy -= dist; - if (copy) { - //zmemcpy(state->window, end - copy, copy); - state.window.set(src.subarray(end - copy, end), 0); - state.wnext = copy; - state.whave = state.wsize; - } - else { - state.wnext += dist; - if (state.wnext === state.wsize) { state.wnext = 0; } - if (state.whave < state.wsize) { state.whave += dist; } - } - } - return 0; - }; - - - const inflate$1 = (strm, flush) => { - - let state; - let input, output; // input/output buffers - let next; /* next input INDEX */ - let put; /* next output INDEX */ - let have, left; /* available input and output */ - let hold; /* bit buffer */ - let bits; /* bits in bit buffer */ - let _in, _out; /* save starting available input and output */ - let copy; /* number of stored or match bytes to copy */ - let from; /* where to copy match bytes from */ - let from_source; - let here = 0; /* current decoding table entry */ - let here_bits, here_op, here_val; // paked "here" denormalized (JS specific) - //let last; /* parent table entry */ - let last_bits, last_op, last_val; // paked "last" denormalized (JS specific) - let len; /* length to copy for repeats, bits to drop */ - let ret; /* return code */ - const hbuf = new Uint8Array(4); /* buffer for gzip header crc calculation */ - let opts; - - let n; // temporary variable for NEED_BITS - - const order = /* permutation of code lengths */ - new Uint8Array([ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]); - - - if (inflateStateCheck(strm) || !strm.output || - (!strm.input && strm.avail_in !== 0)) { - return Z_STREAM_ERROR$1; - } - - state = strm.state; - if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */ - - - //--- LOAD() --- - put = strm.next_out; - output = strm.output; - left = strm.avail_out; - next = strm.next_in; - input = strm.input; - have = strm.avail_in; - hold = state.hold; - bits = state.bits; - //--- - - _in = have; - _out = left; - ret = Z_OK$1; - - inf_leave: // goto emulation - for (;;) { - switch (state.mode) { - case HEAD: - if (state.wrap === 0) { - state.mode = TYPEDO; - break; - } - //=== NEEDBITS(16); - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */ - if (state.wbits === 0) { - state.wbits = 15; - } - state.check = 0/*crc32(0L, Z_NULL, 0)*/; - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - state.check = crc32_1(state.check, hbuf, 2, 0); - //===// - - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = FLAGS; - break; - } - if (state.head) { - state.head.done = false; - } - if (!(state.wrap & 1) || /* check if zlib header allowed */ - (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) { - strm.msg = 'incorrect header check'; - state.mode = BAD; - break; - } - if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) { - strm.msg = 'unknown compression method'; - state.mode = BAD; - break; - } - //--- DROPBITS(4) ---// - hold >>>= 4; - bits -= 4; - //---// - len = (hold & 0x0f)/*BITS(4)*/ + 8; - if (state.wbits === 0) { - state.wbits = len; - } - if (len > 15 || len > state.wbits) { - strm.msg = 'invalid window size'; - state.mode = BAD; - break; - } - - // !!! pako patch. Force use `options.windowBits` if passed. - // Required to always use max window size by default. - state.dmax = 1 << state.wbits; - //state.dmax = 1 << len; - - state.flags = 0; /* indicate zlib header */ - //Tracev((stderr, "inflate: zlib header ok\n")); - strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; - state.mode = hold & 0x200 ? DICTID : TYPE; - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - break; - case FLAGS: - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.flags = hold; - if ((state.flags & 0xff) !== Z_DEFLATED) { - strm.msg = 'unknown compression method'; - state.mode = BAD; - break; - } - if (state.flags & 0xe000) { - strm.msg = 'unknown header flags set'; - state.mode = BAD; - break; - } - if (state.head) { - state.head.text = ((hold >> 8) & 1); - } - if ((state.flags & 0x0200) && (state.wrap & 4)) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - state.check = crc32_1(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = TIME; - /* falls through */ - case TIME: - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (state.head) { - state.head.time = hold; - } - if ((state.flags & 0x0200) && (state.wrap & 4)) { - //=== CRC4(state.check, hold) - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - hbuf[2] = (hold >>> 16) & 0xff; - hbuf[3] = (hold >>> 24) & 0xff; - state.check = crc32_1(state.check, hbuf, 4, 0); - //=== - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = OS; - /* falls through */ - case OS: - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (state.head) { - state.head.xflags = (hold & 0xff); - state.head.os = (hold >> 8); - } - if ((state.flags & 0x0200) && (state.wrap & 4)) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - state.check = crc32_1(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = EXLEN; - /* falls through */ - case EXLEN: - if (state.flags & 0x0400) { - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.length = hold; - if (state.head) { - state.head.extra_len = hold; - } - if ((state.flags & 0x0200) && (state.wrap & 4)) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - state.check = crc32_1(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - } - else if (state.head) { - state.head.extra = null/*Z_NULL*/; - } - state.mode = EXTRA; - /* falls through */ - case EXTRA: - if (state.flags & 0x0400) { - copy = state.length; - if (copy > have) { copy = have; } - if (copy) { - if (state.head) { - len = state.head.extra_len - state.length; - if (!state.head.extra) { - // Use untyped array for more convenient processing later - state.head.extra = new Uint8Array(state.head.extra_len); - } - state.head.extra.set( - input.subarray( - next, - // extra field is limited to 65536 bytes - // - no need for additional size check - next + copy - ), - /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/ - len - ); - //zmemcpy(state.head.extra + len, next, - // len + copy > state.head.extra_max ? - // state.head.extra_max - len : copy); - } - if ((state.flags & 0x0200) && (state.wrap & 4)) { - state.check = crc32_1(state.check, input, copy, next); - } - have -= copy; - next += copy; - state.length -= copy; - } - if (state.length) { break inf_leave; } - } - state.length = 0; - state.mode = NAME; - /* falls through */ - case NAME: - if (state.flags & 0x0800) { - if (have === 0) { break inf_leave; } - copy = 0; - do { - // TODO: 2 or 1 bytes? - len = input[next + copy++]; - /* use constant limit because in js we should not preallocate memory */ - if (state.head && len && - (state.length < 65536 /*state.head.name_max*/)) { - state.head.name += String.fromCharCode(len); - } - } while (len && copy < have); - - if ((state.flags & 0x0200) && (state.wrap & 4)) { - state.check = crc32_1(state.check, input, copy, next); - } - have -= copy; - next += copy; - if (len) { break inf_leave; } - } - else if (state.head) { - state.head.name = null; - } - state.length = 0; - state.mode = COMMENT; - /* falls through */ - case COMMENT: - if (state.flags & 0x1000) { - if (have === 0) { break inf_leave; } - copy = 0; - do { - len = input[next + copy++]; - /* use constant limit because in js we should not preallocate memory */ - if (state.head && len && - (state.length < 65536 /*state.head.comm_max*/)) { - state.head.comment += String.fromCharCode(len); - } - } while (len && copy < have); - if ((state.flags & 0x0200) && (state.wrap & 4)) { - state.check = crc32_1(state.check, input, copy, next); - } - have -= copy; - next += copy; - if (len) { break inf_leave; } - } - else if (state.head) { - state.head.comment = null; - } - state.mode = HCRC; - /* falls through */ - case HCRC: - if (state.flags & 0x0200) { - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if ((state.wrap & 4) && hold !== (state.check & 0xffff)) { - strm.msg = 'header crc mismatch'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - } - if (state.head) { - state.head.hcrc = ((state.flags >> 9) & 1); - state.head.done = true; - } - strm.adler = state.check = 0; - state.mode = TYPE; - break; - case DICTID: - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - strm.adler = state.check = zswap32(hold); - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = DICT; - /* falls through */ - case DICT: - if (state.havedict === 0) { - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - return Z_NEED_DICT$1; - } - strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; - state.mode = TYPE; - /* falls through */ - case TYPE: - if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; } - /* falls through */ - case TYPEDO: - if (state.last) { - //--- BYTEBITS() ---// - hold >>>= bits & 7; - bits -= bits & 7; - //---// - state.mode = CHECK; - break; - } - //=== NEEDBITS(3); */ - while (bits < 3) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.last = (hold & 0x01)/*BITS(1)*/; - //--- DROPBITS(1) ---// - hold >>>= 1; - bits -= 1; - //---// - - switch ((hold & 0x03)/*BITS(2)*/) { - case 0: /* stored block */ - //Tracev((stderr, "inflate: stored block%s\n", - // state.last ? " (last)" : "")); - state.mode = STORED; - break; - case 1: /* fixed block */ - fixedtables(state); - //Tracev((stderr, "inflate: fixed codes block%s\n", - // state.last ? " (last)" : "")); - state.mode = LEN_; /* decode codes */ - if (flush === Z_TREES) { - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - break inf_leave; - } - break; - case 2: /* dynamic block */ - //Tracev((stderr, "inflate: dynamic codes block%s\n", - // state.last ? " (last)" : "")); - state.mode = TABLE; - break; - case 3: - strm.msg = 'invalid block type'; - state.mode = BAD; - } - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - break; - case STORED: - //--- BYTEBITS() ---// /* go to byte boundary */ - hold >>>= bits & 7; - bits -= bits & 7; - //---// - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) { - strm.msg = 'invalid stored block lengths'; - state.mode = BAD; - break; - } - state.length = hold & 0xffff; - //Tracev((stderr, "inflate: stored length %u\n", - // state.length)); - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = COPY_; - if (flush === Z_TREES) { break inf_leave; } - /* falls through */ - case COPY_: - state.mode = COPY; - /* falls through */ - case COPY: - copy = state.length; - if (copy) { - if (copy > have) { copy = have; } - if (copy > left) { copy = left; } - if (copy === 0) { break inf_leave; } - //--- zmemcpy(put, next, copy); --- - output.set(input.subarray(next, next + copy), put); - //---// - have -= copy; - next += copy; - left -= copy; - put += copy; - state.length -= copy; - break; - } - //Tracev((stderr, "inflate: stored end\n")); - state.mode = TYPE; - break; - case TABLE: - //=== NEEDBITS(14); */ - while (bits < 14) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257; - //--- DROPBITS(5) ---// - hold >>>= 5; - bits -= 5; - //---// - state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1; - //--- DROPBITS(5) ---// - hold >>>= 5; - bits -= 5; - //---// - state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4; - //--- DROPBITS(4) ---// - hold >>>= 4; - bits -= 4; - //---// - //#ifndef PKZIP_BUG_WORKAROUND - if (state.nlen > 286 || state.ndist > 30) { - strm.msg = 'too many length or distance symbols'; - state.mode = BAD; - break; - } - //#endif - //Tracev((stderr, "inflate: table sizes ok\n")); - state.have = 0; - state.mode = LENLENS; - /* falls through */ - case LENLENS: - while (state.have < state.ncode) { - //=== NEEDBITS(3); - while (bits < 3) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.lens[order[state.have++]] = (hold & 0x07);//BITS(3); - //--- DROPBITS(3) ---// - hold >>>= 3; - bits -= 3; - //---// - } - while (state.have < 19) { - state.lens[order[state.have++]] = 0; - } - // We have separate tables & no pointers. 2 commented lines below not needed. - //state.next = state.codes; - //state.lencode = state.next; - // Switch to use dynamic table - state.lencode = state.lendyn; - state.lenbits = 7; - - opts = { bits: state.lenbits }; - ret = inftrees(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts); - state.lenbits = opts.bits; - - if (ret) { - strm.msg = 'invalid code lengths set'; - state.mode = BAD; - break; - } - //Tracev((stderr, "inflate: code lengths ok\n")); - state.have = 0; - state.mode = CODELENS; - /* falls through */ - case CODELENS: - while (state.have < state.nlen + state.ndist) { - for (;;) { - here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/ - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if ((here_bits) <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - if (here_val < 16) { - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.lens[state.have++] = here_val; - } - else { - if (here_val === 16) { - //=== NEEDBITS(here.bits + 2); - n = here_bits + 2; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - if (state.have === 0) { - strm.msg = 'invalid bit length repeat'; - state.mode = BAD; - break; - } - len = state.lens[state.have - 1]; - copy = 3 + (hold & 0x03);//BITS(2); - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - } - else if (here_val === 17) { - //=== NEEDBITS(here.bits + 3); - n = here_bits + 3; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - len = 0; - copy = 3 + (hold & 0x07);//BITS(3); - //--- DROPBITS(3) ---// - hold >>>= 3; - bits -= 3; - //---// - } - else { - //=== NEEDBITS(here.bits + 7); - n = here_bits + 7; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - len = 0; - copy = 11 + (hold & 0x7f);//BITS(7); - //--- DROPBITS(7) ---// - hold >>>= 7; - bits -= 7; - //---// - } - if (state.have + copy > state.nlen + state.ndist) { - strm.msg = 'invalid bit length repeat'; - state.mode = BAD; - break; - } - while (copy--) { - state.lens[state.have++] = len; - } - } - } - - /* handle error breaks in while */ - if (state.mode === BAD) { break; } - - /* check for end-of-block code (better have one) */ - if (state.lens[256] === 0) { - strm.msg = 'invalid code -- missing end-of-block'; - state.mode = BAD; - break; - } - - /* build code tables -- note: do not change the lenbits or distbits - values here (9 and 6) without reading the comments in inftrees.h - concerning the ENOUGH constants, which depend on those values */ - state.lenbits = 9; - - opts = { bits: state.lenbits }; - ret = inftrees(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts); - // We have separate tables & no pointers. 2 commented lines below not needed. - // state.next_index = opts.table_index; - state.lenbits = opts.bits; - // state.lencode = state.next; - - if (ret) { - strm.msg = 'invalid literal/lengths set'; - state.mode = BAD; - break; - } - - state.distbits = 6; - //state.distcode.copy(state.codes); - // Switch to use dynamic table - state.distcode = state.distdyn; - opts = { bits: state.distbits }; - ret = inftrees(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts); - // We have separate tables & no pointers. 2 commented lines below not needed. - // state.next_index = opts.table_index; - state.distbits = opts.bits; - // state.distcode = state.next; - - if (ret) { - strm.msg = 'invalid distances set'; - state.mode = BAD; - break; - } - //Tracev((stderr, 'inflate: codes ok\n')); - state.mode = LEN_; - if (flush === Z_TREES) { break inf_leave; } - /* falls through */ - case LEN_: - state.mode = LEN; - /* falls through */ - case LEN: - if (have >= 6 && left >= 258) { - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - inffast(strm, _out); - //--- LOAD() --- - put = strm.next_out; - output = strm.output; - left = strm.avail_out; - next = strm.next_in; - input = strm.input; - have = strm.avail_in; - hold = state.hold; - bits = state.bits; - //--- - - if (state.mode === TYPE) { - state.back = -1; - } - break; - } - state.back = 0; - for (;;) { - here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/ - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if (here_bits <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - if (here_op && (here_op & 0xf0) === 0) { - last_bits = here_bits; - last_op = here_op; - last_val = here_val; - for (;;) { - here = state.lencode[last_val + - ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)]; - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if ((last_bits + here_bits) <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - //--- DROPBITS(last.bits) ---// - hold >>>= last_bits; - bits -= last_bits; - //---// - state.back += last_bits; - } - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.back += here_bits; - state.length = here_val; - if (here_op === 0) { - //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - // "inflate: literal '%c'\n" : - // "inflate: literal 0x%02x\n", here.val)); - state.mode = LIT; - break; - } - if (here_op & 32) { - //Tracevv((stderr, "inflate: end of block\n")); - state.back = -1; - state.mode = TYPE; - break; - } - if (here_op & 64) { - strm.msg = 'invalid literal/length code'; - state.mode = BAD; - break; - } - state.extra = here_op & 15; - state.mode = LENEXT; - /* falls through */ - case LENEXT: - if (state.extra) { - //=== NEEDBITS(state.extra); - n = state.extra; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/; - //--- DROPBITS(state.extra) ---// - hold >>>= state.extra; - bits -= state.extra; - //---// - state.back += state.extra; - } - //Tracevv((stderr, "inflate: length %u\n", state.length)); - state.was = state.length; - state.mode = DIST; - /* falls through */ - case DIST: - for (;;) { - here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/ - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if ((here_bits) <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - if ((here_op & 0xf0) === 0) { - last_bits = here_bits; - last_op = here_op; - last_val = here_val; - for (;;) { - here = state.distcode[last_val + - ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)]; - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if ((last_bits + here_bits) <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - //--- DROPBITS(last.bits) ---// - hold >>>= last_bits; - bits -= last_bits; - //---// - state.back += last_bits; - } - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.back += here_bits; - if (here_op & 64) { - strm.msg = 'invalid distance code'; - state.mode = BAD; - break; - } - state.offset = here_val; - state.extra = (here_op) & 15; - state.mode = DISTEXT; - /* falls through */ - case DISTEXT: - if (state.extra) { - //=== NEEDBITS(state.extra); - n = state.extra; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/; - //--- DROPBITS(state.extra) ---// - hold >>>= state.extra; - bits -= state.extra; - //---// - state.back += state.extra; - } - //#ifdef INFLATE_STRICT - if (state.offset > state.dmax) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break; - } - //#endif - //Tracevv((stderr, "inflate: distance %u\n", state.offset)); - state.mode = MATCH; - /* falls through */ - case MATCH: - if (left === 0) { break inf_leave; } - copy = _out - left; - if (state.offset > copy) { /* copy from window */ - copy = state.offset - copy; - if (copy > state.whave) { - if (state.sane) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break; - } - // (!) This block is disabled in zlib defaults, - // don't enable it for binary compatibility - //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR - // Trace((stderr, "inflate.c too far\n")); - // copy -= state.whave; - // if (copy > state.length) { copy = state.length; } - // if (copy > left) { copy = left; } - // left -= copy; - // state.length -= copy; - // do { - // output[put++] = 0; - // } while (--copy); - // if (state.length === 0) { state.mode = LEN; } - // break; - //#endif - } - if (copy > state.wnext) { - copy -= state.wnext; - from = state.wsize - copy; - } - else { - from = state.wnext - copy; - } - if (copy > state.length) { copy = state.length; } - from_source = state.window; - } - else { /* copy from output */ - from_source = output; - from = put - state.offset; - copy = state.length; - } - if (copy > left) { copy = left; } - left -= copy; - state.length -= copy; - do { - output[put++] = from_source[from++]; - } while (--copy); - if (state.length === 0) { state.mode = LEN; } - break; - case LIT: - if (left === 0) { break inf_leave; } - output[put++] = state.length; - left--; - state.mode = LEN; - break; - case CHECK: - if (state.wrap) { - //=== NEEDBITS(32); - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - // Use '|' instead of '+' to make sure that result is signed - hold |= input[next++] << bits; - bits += 8; - } - //===// - _out -= left; - strm.total_out += _out; - state.total += _out; - if ((state.wrap & 4) && _out) { - strm.adler = state.check = - /*UPDATE_CHECK(state.check, put - _out, _out);*/ - (state.flags ? crc32_1(state.check, output, _out, put - _out) : adler32_1(state.check, output, _out, put - _out)); - - } - _out = left; - // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too - if ((state.wrap & 4) && (state.flags ? hold : zswap32(hold)) !== state.check) { - strm.msg = 'incorrect data check'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - //Tracev((stderr, "inflate: check matches trailer\n")); - } - state.mode = LENGTH; - /* falls through */ - case LENGTH: - if (state.wrap && state.flags) { - //=== NEEDBITS(32); - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if ((state.wrap & 4) && hold !== (state.total & 0xffffffff)) { - strm.msg = 'incorrect length check'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - //Tracev((stderr, "inflate: length matches trailer\n")); - } - state.mode = DONE; - /* falls through */ - case DONE: - ret = Z_STREAM_END$1; - break inf_leave; - case BAD: - ret = Z_DATA_ERROR$1; - break inf_leave; - case MEM: - return Z_MEM_ERROR$1; - case SYNC: - /* falls through */ - default: - return Z_STREAM_ERROR$1; - } - } - - // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave" - - /* - Return from inflate(), updating the total counts and the check value. - If there was no progress during the inflate() call, return a buffer - error. Call updatewindow() to create and/or update the window state. - Note: a memory error from inflate() is non-recoverable. - */ - - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - - if (state.wsize || (_out !== strm.avail_out && state.mode < BAD && - (state.mode < CHECK || flush !== Z_FINISH$1))) { - if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) ; - } - _in -= strm.avail_in; - _out -= strm.avail_out; - strm.total_in += _in; - strm.total_out += _out; - state.total += _out; - if ((state.wrap & 4) && _out) { - strm.adler = state.check = /*UPDATE_CHECK(state.check, strm.next_out - _out, _out);*/ - (state.flags ? crc32_1(state.check, output, _out, strm.next_out - _out) : adler32_1(state.check, output, _out, strm.next_out - _out)); - } - strm.data_type = state.bits + (state.last ? 64 : 0) + - (state.mode === TYPE ? 128 : 0) + - (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0); - if (((_in === 0 && _out === 0) || flush === Z_FINISH$1) && ret === Z_OK$1) { - ret = Z_BUF_ERROR; - } - return ret; - }; - - - const inflateEnd = (strm) => { - - if (inflateStateCheck(strm)) { - return Z_STREAM_ERROR$1; - } - - let state = strm.state; - if (state.window) { - state.window = null; - } - strm.state = null; - return Z_OK$1; - }; - - - const inflateGetHeader = (strm, head) => { - - /* check state */ - if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; } - const state = strm.state; - if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR$1; } - - /* save header structure */ - state.head = head; - head.done = false; - return Z_OK$1; - }; - - - const inflateSetDictionary = (strm, dictionary) => { - const dictLength = dictionary.length; - - let state; - let dictid; - let ret; - - /* check state */ - if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; } - state = strm.state; - - if (state.wrap !== 0 && state.mode !== DICT) { - return Z_STREAM_ERROR$1; - } - - /* check for correct dictionary identifier */ - if (state.mode === DICT) { - dictid = 1; /* adler32(0, null, 0)*/ - /* dictid = adler32(dictid, dictionary, dictLength); */ - dictid = adler32_1(dictid, dictionary, dictLength, 0); - if (dictid !== state.check) { - return Z_DATA_ERROR$1; - } - } - /* copy dictionary to window using updatewindow(), which will amend the - existing dictionary if appropriate */ - ret = updatewindow(strm, dictionary, dictLength, dictLength); - if (ret) { - state.mode = MEM; - return Z_MEM_ERROR$1; - } - state.havedict = 1; - // Tracev((stderr, "inflate: dictionary set\n")); - return Z_OK$1; - }; - - - var inflateReset_1 = inflateReset; - var inflateReset2_1 = inflateReset2; - var inflateResetKeep_1 = inflateResetKeep; - var inflateInit_1 = inflateInit; - var inflateInit2_1 = inflateInit2; - var inflate_2$1 = inflate$1; - var inflateEnd_1 = inflateEnd; - var inflateGetHeader_1 = inflateGetHeader; - var inflateSetDictionary_1 = inflateSetDictionary; - var inflateInfo = 'pako inflate (from Nodeca project)'; - - /* Not implemented - module.exports.inflateCodesUsed = inflateCodesUsed; - module.exports.inflateCopy = inflateCopy; - module.exports.inflateGetDictionary = inflateGetDictionary; - module.exports.inflateMark = inflateMark; - module.exports.inflatePrime = inflatePrime; - module.exports.inflateSync = inflateSync; - module.exports.inflateSyncPoint = inflateSyncPoint; - module.exports.inflateUndermine = inflateUndermine; - module.exports.inflateValidate = inflateValidate; - */ - - var inflate_1$1 = { - inflateReset: inflateReset_1, - inflateReset2: inflateReset2_1, - inflateResetKeep: inflateResetKeep_1, - inflateInit: inflateInit_1, - inflateInit2: inflateInit2_1, - inflate: inflate_2$1, - inflateEnd: inflateEnd_1, - inflateGetHeader: inflateGetHeader_1, - inflateSetDictionary: inflateSetDictionary_1, - inflateInfo: inflateInfo - }; - - const _has = (obj, key) => { - return Object.prototype.hasOwnProperty.call(obj, key); - }; - - var assign = function (obj /*from1, from2, from3, ...*/) { - const sources = Array.prototype.slice.call(arguments, 1); - while (sources.length) { - const source = sources.shift(); - if (!source) { continue; } - - if (typeof source !== 'object') { - throw new TypeError(source + 'must be non-object'); - } - - for (const p in source) { - if (_has(source, p)) { - obj[p] = source[p]; - } - } - } - - return obj; - }; - - - // Join array of chunks to single array. - var flattenChunks = (chunks) => { - // calculate data length - let len = 0; - - for (let i = 0, l = chunks.length; i < l; i++) { - len += chunks[i].length; - } - - // join chunks - const result = new Uint8Array(len); - - for (let i = 0, pos = 0, l = chunks.length; i < l; i++) { - let chunk = chunks[i]; - result.set(chunk, pos); - pos += chunk.length; - } - - return result; - }; - - var common = { - assign: assign, - flattenChunks: flattenChunks - }; - - // String encode/decode helpers - - - // Quick check if we can use fast array to bin string conversion - // - // - apply(Array) can fail on Android 2.2 - // - apply(Uint8Array) can fail on iOS 5.1 Safari - // - let STR_APPLY_UIA_OK = true; - - try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; } - - - // Table with utf8 lengths (calculated by first byte of sequence) - // Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS, - // because max possible codepoint is 0x10ffff - const _utf8len = new Uint8Array(256); - for (let q = 0; q < 256; q++) { - _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1); - } - _utf8len[254] = _utf8len[254] = 1; // Invalid sequence start - - - // convert string to array (typed, when possible) - var string2buf = (str) => { - if (typeof TextEncoder === 'function' && TextEncoder.prototype.encode) { - return new TextEncoder().encode(str); - } - - let buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0; - - // count binary size - for (m_pos = 0; m_pos < str_len; m_pos++) { - c = str.charCodeAt(m_pos); - if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) { - c2 = str.charCodeAt(m_pos + 1); - if ((c2 & 0xfc00) === 0xdc00) { - c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); - m_pos++; - } - } - buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4; - } - - // allocate buffer - buf = new Uint8Array(buf_len); - - // convert - for (i = 0, m_pos = 0; i < buf_len; m_pos++) { - c = str.charCodeAt(m_pos); - if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) { - c2 = str.charCodeAt(m_pos + 1); - if ((c2 & 0xfc00) === 0xdc00) { - c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); - m_pos++; - } - } - if (c < 0x80) { - /* one byte */ - buf[i++] = c; - } else if (c < 0x800) { - /* two bytes */ - buf[i++] = 0xC0 | (c >>> 6); - buf[i++] = 0x80 | (c & 0x3f); - } else if (c < 0x10000) { - /* three bytes */ - buf[i++] = 0xE0 | (c >>> 12); - buf[i++] = 0x80 | (c >>> 6 & 0x3f); - buf[i++] = 0x80 | (c & 0x3f); - } else { - /* four bytes */ - buf[i++] = 0xf0 | (c >>> 18); - buf[i++] = 0x80 | (c >>> 12 & 0x3f); - buf[i++] = 0x80 | (c >>> 6 & 0x3f); - buf[i++] = 0x80 | (c & 0x3f); - } - } - - return buf; - }; - - // Helper - const buf2binstring = (buf, len) => { - // On Chrome, the arguments in a function call that are allowed is `65534`. - // If the length of the buffer is smaller than that, we can use this optimization, - // otherwise we will take a slower path. - if (len < 65534) { - if (buf.subarray && STR_APPLY_UIA_OK) { - return String.fromCharCode.apply(null, buf.length === len ? buf : buf.subarray(0, len)); - } - } - - let result = ''; - for (let i = 0; i < len; i++) { - result += String.fromCharCode(buf[i]); - } - return result; - }; - - - // convert array to string - var buf2string = (buf, max) => { - const len = max || buf.length; - - if (typeof TextDecoder === 'function' && TextDecoder.prototype.decode) { - return new TextDecoder().decode(buf.subarray(0, max)); - } - - let i, out; - - // Reserve max possible length (2 words per char) - // NB: by unknown reasons, Array is significantly faster for - // String.fromCharCode.apply than Uint16Array. - const utf16buf = new Array(len * 2); - - for (out = 0, i = 0; i < len;) { - let c = buf[i++]; - // quick process ascii - if (c < 0x80) { utf16buf[out++] = c; continue; } - - let c_len = _utf8len[c]; - // skip 5 & 6 byte codes - if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; } - - // apply mask on first byte - c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07; - // join the rest - while (c_len > 1 && i < len) { - c = (c << 6) | (buf[i++] & 0x3f); - c_len--; - } - - // terminated by end of string? - if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; } - - if (c < 0x10000) { - utf16buf[out++] = c; - } else { - c -= 0x10000; - utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff); - utf16buf[out++] = 0xdc00 | (c & 0x3ff); - } - } - - return buf2binstring(utf16buf, out); - }; - - - // Calculate max possible position in utf8 buffer, - // that will not break sequence. If that's not possible - // - (very small limits) return max size as is. - // - // buf[] - utf8 bytes array - // max - length limit (mandatory); - var utf8border = (buf, max) => { - - max = max || buf.length; - if (max > buf.length) { max = buf.length; } - - // go back from last position, until start of sequence found - let pos = max - 1; - while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; } - - // Very small and broken sequence, - // return max, because we should return something anyway. - if (pos < 0) { return max; } - - // If we came to start of buffer - that means buffer is too small, - // return max too. - if (pos === 0) { return max; } - - return (pos + _utf8len[buf[pos]] > max) ? pos : max; - }; - - var strings = { - string2buf: string2buf, - buf2string: buf2string, - utf8border: utf8border - }; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - var messages = { - 2: 'need dictionary', /* Z_NEED_DICT 2 */ - 1: 'stream end', /* Z_STREAM_END 1 */ - 0: '', /* Z_OK 0 */ - '-1': 'file error', /* Z_ERRNO (-1) */ - '-2': 'stream error', /* Z_STREAM_ERROR (-2) */ - '-3': 'data error', /* Z_DATA_ERROR (-3) */ - '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */ - '-5': 'buffer error', /* Z_BUF_ERROR (-5) */ - '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ - }; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - function ZStream() { - /* next input byte */ - this.input = null; // JS specific, because we have no pointers - this.next_in = 0; - /* number of bytes available at input */ - this.avail_in = 0; - /* total number of input bytes read so far */ - this.total_in = 0; - /* next output byte should be put there */ - this.output = null; // JS specific, because we have no pointers - this.next_out = 0; - /* remaining free space at output */ - this.avail_out = 0; - /* total number of bytes output so far */ - this.total_out = 0; - /* last error message, NULL if no error */ - this.msg = ''/*Z_NULL*/; - /* not visible by applications */ - this.state = null; - /* best guess about the data type: binary or text */ - this.data_type = 2/*Z_UNKNOWN*/; - /* adler32 value of the uncompressed data */ - this.adler = 0; - } - - var zstream = ZStream; - - // (C) 1995-2013 Jean-loup Gailly and Mark Adler - // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - // - // This software is provided 'as-is', without any express or implied - // warranty. In no event will the authors be held liable for any damages - // arising from the use of this software. - // - // Permission is granted to anyone to use this software for any purpose, - // including commercial applications, and to alter it and redistribute it - // freely, subject to the following restrictions: - // - // 1. The origin of this software must not be misrepresented; you must not - // claim that you wrote the original software. If you use this software - // in a product, an acknowledgment in the product documentation would be - // appreciated but is not required. - // 2. Altered source versions must be plainly marked as such, and must not be - // misrepresented as being the original software. - // 3. This notice may not be removed or altered from any source distribution. - - function GZheader() { - /* true if compressed data believed to be text */ - this.text = 0; - /* modification time */ - this.time = 0; - /* extra flags (not used when writing a gzip file) */ - this.xflags = 0; - /* operating system */ - this.os = 0; - /* pointer to extra field or Z_NULL if none */ - this.extra = null; - /* extra field length (valid if extra != Z_NULL) */ - this.extra_len = 0; // Actually, we don't need it in JS, - // but leave for few code modifications - - // - // Setup limits is not necessary because in js we should not preallocate memory - // for inflate use constant limit in 65536 bytes - // - - /* space at extra (only when reading header) */ - // this.extra_max = 0; - /* pointer to zero-terminated file name or Z_NULL */ - this.name = ''; - /* space at name (only when reading header) */ - // this.name_max = 0; - /* pointer to zero-terminated comment or Z_NULL */ - this.comment = ''; - /* space at comment (only when reading header) */ - // this.comm_max = 0; - /* true if there was or will be a header crc */ - this.hcrc = 0; - /* true when done reading gzip header (not used when writing a gzip file) */ - this.done = false; - } - - var gzheader = GZheader; - - const toString = Object.prototype.toString; - - /* Public constants ==========================================================*/ - /* ===========================================================================*/ - - const { - Z_NO_FLUSH, Z_FINISH, - Z_OK, Z_STREAM_END, Z_NEED_DICT, Z_STREAM_ERROR, Z_DATA_ERROR, Z_MEM_ERROR - } = constants$1; - - /* ===========================================================================*/ - - - /** - * class Inflate - * - * Generic JS-style wrapper for zlib calls. If you don't need - * streaming behaviour - use more simple functions: [[inflate]] - * and [[inflateRaw]]. - **/ - - /* internal - * inflate.chunks -> Array - * - * Chunks of output data, if [[Inflate#onData]] not overridden. - **/ - - /** - * Inflate.result -> Uint8Array|String - * - * Uncompressed result, generated by default [[Inflate#onData]] - * and [[Inflate#onEnd]] handlers. Filled after you push last chunk - * (call [[Inflate#push]] with `Z_FINISH` / `true` param). - **/ - - /** - * Inflate.err -> Number - * - * Error code after inflate finished. 0 (Z_OK) on success. - * Should be checked if broken data possible. - **/ - - /** - * Inflate.msg -> String - * - * Error message, if [[Inflate.err]] != 0 - **/ - - - /** - * new Inflate(options) - * - options (Object): zlib inflate options. - * - * Creates new inflator instance with specified params. Throws exception - * on bad params. Supported options: - * - * - `windowBits` - * - `dictionary` - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information on these. - * - * Additional options, for internal needs: - * - * - `chunkSize` - size of generated data chunks (16K by default) - * - `raw` (Boolean) - do raw inflate - * - `to` (String) - if equal to 'string', then result will be converted - * from utf8 to utf16 (javascript) string. When string output requested, - * chunk length can differ from `chunkSize`, depending on content. - * - * By default, when no options set, autodetect deflate/gzip data format via - * wrapper header. - * - * ##### Example: - * - * ```javascript - * const pako = require('pako') - * const chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9]) - * const chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]); - * - * const inflate = new pako.Inflate({ level: 3}); - * - * inflate.push(chunk1, false); - * inflate.push(chunk2, true); // true -> last chunk - * - * if (inflate.err) { throw new Error(inflate.err); } - * - * console.log(inflate.result); - * ``` - **/ - function Inflate(options) { - this.options = common.assign({ - chunkSize: 1024 * 64, - windowBits: 15, - to: '' - }, options || {}); - - const opt = this.options; - - // Force window size for `raw` data, if not set directly, - // because we have no header for autodetect. - if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) { - opt.windowBits = -opt.windowBits; - if (opt.windowBits === 0) { opt.windowBits = -15; } - } - - // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate - if ((opt.windowBits >= 0) && (opt.windowBits < 16) && - !(options && options.windowBits)) { - opt.windowBits += 32; - } - - // Gzip header has no info about windows size, we can do autodetect only - // for deflate. So, if window size not set, force it to max when gzip possible - if ((opt.windowBits > 15) && (opt.windowBits < 48)) { - // bit 3 (16) -> gzipped data - // bit 4 (32) -> autodetect gzip/deflate - if ((opt.windowBits & 15) === 0) { - opt.windowBits |= 15; - } - } - - this.err = 0; // error code, if happens (0 = Z_OK) - this.msg = ''; // error message - this.ended = false; // used to avoid multiple onEnd() calls - this.chunks = []; // chunks of compressed data - - this.strm = new zstream(); - this.strm.avail_out = 0; - - let status = inflate_1$1.inflateInit2( - this.strm, - opt.windowBits - ); - - if (status !== Z_OK) { - throw new Error(messages[status]); - } - - this.header = new gzheader(); - - inflate_1$1.inflateGetHeader(this.strm, this.header); - - // Setup dictionary - if (opt.dictionary) { - // Convert data if needed - if (typeof opt.dictionary === 'string') { - opt.dictionary = strings.string2buf(opt.dictionary); - } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') { - opt.dictionary = new Uint8Array(opt.dictionary); - } - if (opt.raw) { //In raw mode we need to set the dictionary early - status = inflate_1$1.inflateSetDictionary(this.strm, opt.dictionary); - if (status !== Z_OK) { - throw new Error(messages[status]); - } - } - } - } - - /** - * Inflate#push(data[, flush_mode]) -> Boolean - * - data (Uint8Array|ArrayBuffer): input data - * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE - * flush modes. See constants. Skipped or `false` means Z_NO_FLUSH, - * `true` means Z_FINISH. - * - * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with - * new output chunks. Returns `true` on success. If end of stream detected, - * [[Inflate#onEnd]] will be called. - * - * `flush_mode` is not needed for normal operation, because end of stream - * detected automatically. You may try to use it for advanced things, but - * this functionality was not tested. - * - * On fail call [[Inflate#onEnd]] with error code and return false. - * - * ##### Example - * - * ```javascript - * push(chunk, false); // push one of data chunks - * ... - * push(chunk, true); // push last chunk - * ``` - **/ - Inflate.prototype.push = function (data, flush_mode) { - const strm = this.strm; - const chunkSize = this.options.chunkSize; - const dictionary = this.options.dictionary; - let status, _flush_mode, last_avail_out; - - if (this.ended) return false; - - if (flush_mode === ~~flush_mode) _flush_mode = flush_mode; - else _flush_mode = flush_mode === true ? Z_FINISH : Z_NO_FLUSH; - - // Convert data if needed - if (toString.call(data) === '[object ArrayBuffer]') { - strm.input = new Uint8Array(data); - } else { - strm.input = data; - } - - strm.next_in = 0; - strm.avail_in = strm.input.length; - - for (;;) { - if (strm.avail_out === 0) { - strm.output = new Uint8Array(chunkSize); - strm.next_out = 0; - strm.avail_out = chunkSize; - } - - status = inflate_1$1.inflate(strm, _flush_mode); - - if (status === Z_NEED_DICT && dictionary) { - status = inflate_1$1.inflateSetDictionary(strm, dictionary); - - if (status === Z_OK) { - status = inflate_1$1.inflate(strm, _flush_mode); - } else if (status === Z_DATA_ERROR) { - // Replace code with more verbose - status = Z_NEED_DICT; - } - } - - // Skip snyc markers if more data follows and not raw mode - while (strm.avail_in > 0 && - status === Z_STREAM_END && - strm.state.wrap > 0 && - data[strm.next_in] !== 0) - { - inflate_1$1.inflateReset(strm); - status = inflate_1$1.inflate(strm, _flush_mode); - } - - switch (status) { - case Z_STREAM_ERROR: - case Z_DATA_ERROR: - case Z_NEED_DICT: - case Z_MEM_ERROR: - this.onEnd(status); - this.ended = true; - return false; - } - - // Remember real `avail_out` value, because we may patch out buffer content - // to align utf8 strings boundaries. - last_avail_out = strm.avail_out; - - if (strm.next_out) { - if (strm.avail_out === 0 || status === Z_STREAM_END) { - - if (this.options.to === 'string') { - - let next_out_utf8 = strings.utf8border(strm.output, strm.next_out); - - let tail = strm.next_out - next_out_utf8; - let utf8str = strings.buf2string(strm.output, next_out_utf8); - - // move tail & realign counters - strm.next_out = tail; - strm.avail_out = chunkSize - tail; - if (tail) strm.output.set(strm.output.subarray(next_out_utf8, next_out_utf8 + tail), 0); - - this.onData(utf8str); - - } else { - this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out)); - } - } - } - - // Must repeat iteration if out buffer is full - if (status === Z_OK && last_avail_out === 0) continue; - - // Finalize if end of stream reached. - if (status === Z_STREAM_END) { - status = inflate_1$1.inflateEnd(this.strm); - this.onEnd(status); - this.ended = true; - return true; - } - - if (strm.avail_in === 0) break; - } - - return true; - }; - - - /** - * Inflate#onData(chunk) -> Void - * - chunk (Uint8Array|String): output data. When string output requested, - * each chunk will be string. - * - * By default, stores data blocks in `chunks[]` property and glue - * those in `onEnd`. Override this handler, if you need another behaviour. - **/ - Inflate.prototype.onData = function (chunk) { - this.chunks.push(chunk); - }; - - - /** - * Inflate#onEnd(status) -> Void - * - status (Number): inflate status. 0 (Z_OK) on success, - * other if not. - * - * Called either after you tell inflate that the input stream is - * complete (Z_FINISH). By default - join collected chunks, - * free memory and fill `results` / `err` properties. - **/ - Inflate.prototype.onEnd = function (status) { - // On success - join - if (status === Z_OK) { - if (this.options.to === 'string') { - this.result = this.chunks.join(''); - } else { - this.result = common.flattenChunks(this.chunks); - } - } - this.chunks = []; - this.err = status; - this.msg = this.strm.msg; - }; - - - /** - * inflate(data[, options]) -> Uint8Array|String - * - data (Uint8Array|ArrayBuffer): input data to decompress. - * - options (Object): zlib inflate options. - * - * Decompress `data` with inflate/ungzip and `options`. Autodetect - * format via wrapper header by default. That's why we don't provide - * separate `ungzip` method. - * - * Supported options are: - * - * - windowBits - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information. - * - * Sugar (options): - * - * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify - * negative windowBits implicitly. - * - `to` (String) - if equal to 'string', then result will be converted - * from utf8 to utf16 (javascript) string. When string output requested, - * chunk length can differ from `chunkSize`, depending on content. - * - * - * ##### Example: - * - * ```javascript - * const pako = require('pako'); - * const input = pako.deflate(new Uint8Array([1,2,3,4,5,6,7,8,9])); - * let output; - * - * try { - * output = pako.inflate(input); - * } catch (err) { - * console.log(err); - * } - * ``` - **/ - function inflate(input, options) { - const inflator = new Inflate(options); - - inflator.push(input); - - // That will never happens, if you don't cheat with options :) - if (inflator.err) throw inflator.msg || messages[inflator.err]; - - return inflator.result; - } - - - /** - * inflateRaw(data[, options]) -> Uint8Array|String - * - data (Uint8Array|ArrayBuffer): input data to decompress. - * - options (Object): zlib inflate options. - * - * The same as [[inflate]], but creates raw data, without wrapper - * (header and adler32 crc). - **/ - function inflateRaw(input, options) { - options = options || {}; - options.raw = true; - return inflate(input, options); - } - - - /** - * ungzip(data[, options]) -> Uint8Array|String - * - data (Uint8Array|ArrayBuffer): input data to decompress. - * - options (Object): zlib inflate options. - * - * Just shortcut to [[inflate]], because it autodetects format - * by header.content. Done for convenience. - **/ - - - var Inflate_1 = Inflate; - var inflate_2 = inflate; - var inflateRaw_1 = inflateRaw; - var ungzip = inflate; - var constants = constants$1; - - var inflate_1 = { - Inflate: Inflate_1, - inflate: inflate_2, - inflateRaw: inflateRaw_1, - ungzip: ungzip, - constants: constants - }; - - exports.Inflate = Inflate_1; - exports.constants = constants; - exports["default"] = inflate_1; - exports.inflate = inflate_2; - exports.inflateRaw = inflateRaw_1; - exports.ungzip = ungzip; - - Object.defineProperty(exports, '__esModule', { value: true }); - -})); diff --git a/node_modules/pako/dist/pako_inflate.min.js b/node_modules/pako/dist/pako_inflate.min.js deleted file mode 100644 index 587fbdd..0000000 --- a/node_modules/pako/dist/pako_inflate.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).pako={})}(this,(function(e){"use strict";var t=(e,t,i,n)=>{let a=65535&e|0,r=e>>>16&65535|0,o=0;for(;0!==i;){o=i>2e3?2e3:i,i-=o;do{a=a+t[n++]|0,r=r+a|0}while(--o);a%=65521,r%=65521}return a|r<<16|0};const i=new Uint32Array((()=>{let e,t=[];for(var i=0;i<256;i++){e=i;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[i]=e}return t})());var n=(e,t,n,a)=>{const r=i,o=a+n;e^=-1;for(let i=a;i>>8^r[255&(e^t[i])];return-1^e};const a=16209;var r=function(e,t){let i,n,r,o,s,l,d,f,c,h,u,w,b,m,k,_,g,p,v,x,y,E,R,A;const Z=e.state;i=e.next_in,R=e.input,n=i+(e.avail_in-5),r=e.next_out,A=e.output,o=r-(t-e.avail_out),s=r+(e.avail_out-257),l=Z.dmax,d=Z.wsize,f=Z.whave,c=Z.wnext,h=Z.window,u=Z.hold,w=Z.bits,b=Z.lencode,m=Z.distcode,k=(1<>>24,u>>>=p,w-=p,p=g>>>16&255,0===p)A[r++]=65535&g;else{if(!(16&p)){if(0==(64&p)){g=b[(65535&g)+(u&(1<>>=p,w-=p),w<15&&(u+=R[i++]<>>24,u>>>=p,w-=p,p=g>>>16&255,!(16&p)){if(0==(64&p)){g=m[(65535&g)+(u&(1<l){e.msg="invalid distance too far back",Z.mode=a;break e}if(u>>>=p,w-=p,p=r-o,x>p){if(p=x-p,p>f&&Z.sane){e.msg="invalid distance too far back",Z.mode=a;break e}if(y=0,E=h,0===c){if(y+=d-p,p2;)A[r++]=E[y++],A[r++]=E[y++],A[r++]=E[y++],v-=3;v&&(A[r++]=E[y++],v>1&&(A[r++]=E[y++]))}else{y=r-x;do{A[r++]=A[y++],A[r++]=A[y++],A[r++]=A[y++],v-=3}while(v>2);v&&(A[r++]=A[y++],v>1&&(A[r++]=A[y++]))}break}}break}}while(i>3,i-=v,w-=v<<3,u&=(1<{const u=h.bits;let w,b,m,k,_,g,p=0,v=0,x=0,y=0,E=0,R=0,A=0,Z=0,S=0,T=0,O=null;const U=new Uint16Array(16),D=new Uint16Array(16);let I,B,N,C=null;for(p=0;p<=o;p++)U[p]=0;for(v=0;v=1&&0===U[y];y--);if(E>y&&(E=y),0===y)return a[r++]=20971520,a[r++]=20971520,h.bits=1,0;for(x=1;x0&&(0===e||1!==y))return-1;for(D[1]=0,p=1;p852||2===e&&S>592)return 1;for(;;){I=p-A,c[v]+1=g?(B=C[c[v]-g],N=O[c[v]-g]):(B=96,N=0),w=1<>A)+b]=I<<24|B<<16|N|0}while(0!==b);for(w=1<>=1;if(0!==w?(T&=w-1,T+=w):T=0,v++,0==--U[p]){if(p===y)break;p=t[i+c[v]]}if(p>E&&(T&k)!==m){for(0===A&&(A=E),_+=x,R=p-A,Z=1<852||2===e&&S>592)return 1;m=T&k,a[m]=E<<24|R<<16|_-r|0}}return 0!==T&&(a[_+T]=p-A<<24|64<<16|0),h.bits=E,0},h={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{Z_FINISH:u,Z_BLOCK:w,Z_TREES:b,Z_OK:m,Z_STREAM_END:k,Z_NEED_DICT:_,Z_STREAM_ERROR:g,Z_DATA_ERROR:p,Z_MEM_ERROR:v,Z_BUF_ERROR:x,Z_DEFLATED:y}=h,E=16180,R=16190,A=16191,Z=16192,S=16194,T=16199,O=16200,U=16206,D=16209,I=e=>(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24);function B(){this.strm=null,this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const N=e=>{if(!e)return 1;const t=e.state;return!t||t.strm!==e||t.mode16211?1:0},C=e=>{if(N(e))return g;const t=e.state;return e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=E,t.last=0,t.havedict=0,t.flags=-1,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new Int32Array(852),t.distcode=t.distdyn=new Int32Array(592),t.sane=1,t.back=-1,m},z=e=>{if(N(e))return g;const t=e.state;return t.wsize=0,t.whave=0,t.wnext=0,C(e)},F=(e,t)=>{let i;if(N(e))return g;const n=e.state;return t<0?(i=0,t=-t):(i=5+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?g:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=i,n.wbits=t,z(e))},L=(e,t)=>{if(!e)return g;const i=new B;e.state=i,i.strm=e,i.window=null,i.mode=E;const n=F(e,t);return n!==m&&(e.state=null),n};let M,H,j=!0;const K=e=>{if(j){M=new Int32Array(512),H=new Int32Array(32);let t=0;for(;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(c(1,e.lens,0,288,M,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;c(2,e.lens,0,32,H,0,e.work,{bits:5}),j=!1}e.lencode=M,e.lenbits=9,e.distcode=H,e.distbits=5},P=(e,t,i,n)=>{let a;const r=e.state;return null===r.window&&(r.wsize=1<=r.wsize?(r.window.set(t.subarray(i-r.wsize,i),0),r.wnext=0,r.whave=r.wsize):(a=r.wsize-r.wnext,a>n&&(a=n),r.window.set(t.subarray(i-n,i-n+a),r.wnext),(n-=a)?(r.window.set(t.subarray(i-n,i),0),r.wnext=n,r.whave=r.wsize):(r.wnext+=a,r.wnext===r.wsize&&(r.wnext=0),r.whaveL(e,15),inflateInit2:L,inflate:(e,i)=>{let a,o,s,l,d,f,h,B,C,z,F,L,M,H,j,Y,G,X,W,q,J,Q,V=0;const $=new Uint8Array(4);let ee,te;const ie=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(N(e)||!e.output||!e.input&&0!==e.avail_in)return g;a=e.state,a.mode===A&&(a.mode=Z),d=e.next_out,s=e.output,h=e.avail_out,l=e.next_in,o=e.input,f=e.avail_in,B=a.hold,C=a.bits,z=f,F=h,Q=m;e:for(;;)switch(a.mode){case E:if(0===a.wrap){a.mode=Z;break}for(;C<16;){if(0===f)break e;f--,B+=o[l++]<>>8&255,a.check=n(a.check,$,2,0),B=0,C=0,a.mode=16181;break}if(a.head&&(a.head.done=!1),!(1&a.wrap)||(((255&B)<<8)+(B>>8))%31){e.msg="incorrect header check",a.mode=D;break}if((15&B)!==y){e.msg="unknown compression method",a.mode=D;break}if(B>>>=4,C-=4,J=8+(15&B),0===a.wbits&&(a.wbits=J),J>15||J>a.wbits){e.msg="invalid window size",a.mode=D;break}a.dmax=1<>8&1),512&a.flags&&4&a.wrap&&($[0]=255&B,$[1]=B>>>8&255,a.check=n(a.check,$,2,0)),B=0,C=0,a.mode=16182;case 16182:for(;C<32;){if(0===f)break e;f--,B+=o[l++]<>>8&255,$[2]=B>>>16&255,$[3]=B>>>24&255,a.check=n(a.check,$,4,0)),B=0,C=0,a.mode=16183;case 16183:for(;C<16;){if(0===f)break e;f--,B+=o[l++]<>8),512&a.flags&&4&a.wrap&&($[0]=255&B,$[1]=B>>>8&255,a.check=n(a.check,$,2,0)),B=0,C=0,a.mode=16184;case 16184:if(1024&a.flags){for(;C<16;){if(0===f)break e;f--,B+=o[l++]<>>8&255,a.check=n(a.check,$,2,0)),B=0,C=0}else a.head&&(a.head.extra=null);a.mode=16185;case 16185:if(1024&a.flags&&(L=a.length,L>f&&(L=f),L&&(a.head&&(J=a.head.extra_len-a.length,a.head.extra||(a.head.extra=new Uint8Array(a.head.extra_len)),a.head.extra.set(o.subarray(l,l+L),J)),512&a.flags&&4&a.wrap&&(a.check=n(a.check,o,L,l)),f-=L,l+=L,a.length-=L),a.length))break e;a.length=0,a.mode=16186;case 16186:if(2048&a.flags){if(0===f)break e;L=0;do{J=o[l+L++],a.head&&J&&a.length<65536&&(a.head.name+=String.fromCharCode(J))}while(J&&L>9&1,a.head.done=!0),e.adler=a.check=0,a.mode=A;break;case 16189:for(;C<32;){if(0===f)break e;f--,B+=o[l++]<>>=7&C,C-=7&C,a.mode=U;break}for(;C<3;){if(0===f)break e;f--,B+=o[l++]<>>=1,C-=1,3&B){case 0:a.mode=16193;break;case 1:if(K(a),a.mode=T,i===b){B>>>=2,C-=2;break e}break;case 2:a.mode=16196;break;case 3:e.msg="invalid block type",a.mode=D}B>>>=2,C-=2;break;case 16193:for(B>>>=7&C,C-=7&C;C<32;){if(0===f)break e;f--,B+=o[l++]<>>16^65535)){e.msg="invalid stored block lengths",a.mode=D;break}if(a.length=65535&B,B=0,C=0,a.mode=S,i===b)break e;case S:a.mode=16195;case 16195:if(L=a.length,L){if(L>f&&(L=f),L>h&&(L=h),0===L)break e;s.set(o.subarray(l,l+L),d),f-=L,l+=L,h-=L,d+=L,a.length-=L;break}a.mode=A;break;case 16196:for(;C<14;){if(0===f)break e;f--,B+=o[l++]<>>=5,C-=5,a.ndist=1+(31&B),B>>>=5,C-=5,a.ncode=4+(15&B),B>>>=4,C-=4,a.nlen>286||a.ndist>30){e.msg="too many length or distance symbols",a.mode=D;break}a.have=0,a.mode=16197;case 16197:for(;a.have>>=3,C-=3}for(;a.have<19;)a.lens[ie[a.have++]]=0;if(a.lencode=a.lendyn,a.lenbits=7,ee={bits:a.lenbits},Q=c(0,a.lens,0,19,a.lencode,0,a.work,ee),a.lenbits=ee.bits,Q){e.msg="invalid code lengths set",a.mode=D;break}a.have=0,a.mode=16198;case 16198:for(;a.have>>24,Y=V>>>16&255,G=65535&V,!(j<=C);){if(0===f)break e;f--,B+=o[l++]<>>=j,C-=j,a.lens[a.have++]=G;else{if(16===G){for(te=j+2;C>>=j,C-=j,0===a.have){e.msg="invalid bit length repeat",a.mode=D;break}J=a.lens[a.have-1],L=3+(3&B),B>>>=2,C-=2}else if(17===G){for(te=j+3;C>>=j,C-=j,J=0,L=3+(7&B),B>>>=3,C-=3}else{for(te=j+7;C>>=j,C-=j,J=0,L=11+(127&B),B>>>=7,C-=7}if(a.have+L>a.nlen+a.ndist){e.msg="invalid bit length repeat",a.mode=D;break}for(;L--;)a.lens[a.have++]=J}}if(a.mode===D)break;if(0===a.lens[256]){e.msg="invalid code -- missing end-of-block",a.mode=D;break}if(a.lenbits=9,ee={bits:a.lenbits},Q=c(1,a.lens,0,a.nlen,a.lencode,0,a.work,ee),a.lenbits=ee.bits,Q){e.msg="invalid literal/lengths set",a.mode=D;break}if(a.distbits=6,a.distcode=a.distdyn,ee={bits:a.distbits},Q=c(2,a.lens,a.nlen,a.ndist,a.distcode,0,a.work,ee),a.distbits=ee.bits,Q){e.msg="invalid distances set",a.mode=D;break}if(a.mode=T,i===b)break e;case T:a.mode=O;case O:if(f>=6&&h>=258){e.next_out=d,e.avail_out=h,e.next_in=l,e.avail_in=f,a.hold=B,a.bits=C,r(e,F),d=e.next_out,s=e.output,h=e.avail_out,l=e.next_in,o=e.input,f=e.avail_in,B=a.hold,C=a.bits,a.mode===A&&(a.back=-1);break}for(a.back=0;V=a.lencode[B&(1<>>24,Y=V>>>16&255,G=65535&V,!(j<=C);){if(0===f)break e;f--,B+=o[l++]<>X)],j=V>>>24,Y=V>>>16&255,G=65535&V,!(X+j<=C);){if(0===f)break e;f--,B+=o[l++]<>>=X,C-=X,a.back+=X}if(B>>>=j,C-=j,a.back+=j,a.length=G,0===Y){a.mode=16205;break}if(32&Y){a.back=-1,a.mode=A;break}if(64&Y){e.msg="invalid literal/length code",a.mode=D;break}a.extra=15&Y,a.mode=16201;case 16201:if(a.extra){for(te=a.extra;C>>=a.extra,C-=a.extra,a.back+=a.extra}a.was=a.length,a.mode=16202;case 16202:for(;V=a.distcode[B&(1<>>24,Y=V>>>16&255,G=65535&V,!(j<=C);){if(0===f)break e;f--,B+=o[l++]<>X)],j=V>>>24,Y=V>>>16&255,G=65535&V,!(X+j<=C);){if(0===f)break e;f--,B+=o[l++]<>>=X,C-=X,a.back+=X}if(B>>>=j,C-=j,a.back+=j,64&Y){e.msg="invalid distance code",a.mode=D;break}a.offset=G,a.extra=15&Y,a.mode=16203;case 16203:if(a.extra){for(te=a.extra;C>>=a.extra,C-=a.extra,a.back+=a.extra}if(a.offset>a.dmax){e.msg="invalid distance too far back",a.mode=D;break}a.mode=16204;case 16204:if(0===h)break e;if(L=F-h,a.offset>L){if(L=a.offset-L,L>a.whave&&a.sane){e.msg="invalid distance too far back",a.mode=D;break}L>a.wnext?(L-=a.wnext,M=a.wsize-L):M=a.wnext-L,L>a.length&&(L=a.length),H=a.window}else H=s,M=d-a.offset,L=a.length;L>h&&(L=h),h-=L,a.length-=L;do{s[d++]=H[M++]}while(--L);0===a.length&&(a.mode=O);break;case 16205:if(0===h)break e;s[d++]=a.length,h--,a.mode=O;break;case U:if(a.wrap){for(;C<32;){if(0===f)break e;f--,B|=o[l++]<{if(N(e))return g;let t=e.state;return t.window&&(t.window=null),e.state=null,m},inflateGetHeader:(e,t)=>{if(N(e))return g;const i=e.state;return 0==(2&i.wrap)?g:(i.head=t,t.done=!1,m)},inflateSetDictionary:(e,i)=>{const n=i.length;let a,r,o;return N(e)?g:(a=e.state,0!==a.wrap&&a.mode!==R?g:a.mode===R&&(r=1,r=t(r,i,n,0),r!==a.check)?p:(o=P(e,i,n,n),o?(a.mode=16210,v):(a.havedict=1,m)))},inflateInfo:"pako inflate (from Nodeca project)"};const G=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var X=function(e){const t=Array.prototype.slice.call(arguments,1);for(;t.length;){const i=t.shift();if(i){if("object"!=typeof i)throw new TypeError(i+"must be non-object");for(const t in i)G(i,t)&&(e[t]=i[t])}}return e},W=e=>{let t=0;for(let i=0,n=e.length;i=252?6:e>=248?5:e>=240?4:e>=224?3:e>=192?2:1;J[254]=J[254]=1;var Q=e=>{if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(e);let t,i,n,a,r,o=e.length,s=0;for(a=0;a>>6,t[r++]=128|63&i):i<65536?(t[r++]=224|i>>>12,t[r++]=128|i>>>6&63,t[r++]=128|63&i):(t[r++]=240|i>>>18,t[r++]=128|i>>>12&63,t[r++]=128|i>>>6&63,t[r++]=128|63&i);return t},V=(e,t)=>{const i=t||e.length;if("function"==typeof TextDecoder&&TextDecoder.prototype.decode)return(new TextDecoder).decode(e.subarray(0,t));let n,a;const r=new Array(2*i);for(a=0,n=0;n4)r[a++]=65533,n+=o-1;else{for(t&=2===o?31:3===o?15:7;o>1&&n1?r[a++]=65533:t<65536?r[a++]=t:(t-=65536,r[a++]=55296|t>>10&1023,r[a++]=56320|1023&t)}}return((e,t)=>{if(t<65534&&e.subarray&&q)return String.fromCharCode.apply(null,e.length===t?e:e.subarray(0,t));let i="";for(let n=0;n{(t=t||e.length)>e.length&&(t=e.length);let i=t-1;for(;i>=0&&128==(192&e[i]);)i--;return i<0||0===i?t:i+J[e[i]]>t?i:t},ee={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"};var te=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0};var ie=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1};const ne=Object.prototype.toString,{Z_NO_FLUSH:ae,Z_FINISH:re,Z_OK:oe,Z_STREAM_END:se,Z_NEED_DICT:le,Z_STREAM_ERROR:de,Z_DATA_ERROR:fe,Z_MEM_ERROR:ce}=h;function he(e){this.options=X({chunkSize:65536,windowBits:15,to:""},e||{});const t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new te,this.strm.avail_out=0;let i=Y.inflateInit2(this.strm,t.windowBits);if(i!==oe)throw new Error(ee[i]);if(this.header=new ie,Y.inflateGetHeader(this.strm,this.header),t.dictionary&&("string"==typeof t.dictionary?t.dictionary=Q(t.dictionary):"[object ArrayBuffer]"===ne.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(i=Y.inflateSetDictionary(this.strm,t.dictionary),i!==oe)))throw new Error(ee[i])}function ue(e,t){const i=new he(t);if(i.push(e),i.err)throw i.msg||ee[i.err];return i.result}he.prototype.push=function(e,t){const i=this.strm,n=this.options.chunkSize,a=this.options.dictionary;let r,o,s;if(this.ended)return!1;for(o=t===~~t?t:!0===t?re:ae,"[object ArrayBuffer]"===ne.call(e)?i.input=new Uint8Array(e):i.input=e,i.next_in=0,i.avail_in=i.input.length;;){for(0===i.avail_out&&(i.output=new Uint8Array(n),i.next_out=0,i.avail_out=n),r=Y.inflate(i,o),r===le&&a&&(r=Y.inflateSetDictionary(i,a),r===oe?r=Y.inflate(i,o):r===fe&&(r=le));i.avail_in>0&&r===se&&i.state.wrap>0&&0!==e[i.next_in];)Y.inflateReset(i),r=Y.inflate(i,o);switch(r){case de:case fe:case le:case ce:return this.onEnd(r),this.ended=!0,!1}if(s=i.avail_out,i.next_out&&(0===i.avail_out||r===se))if("string"===this.options.to){let e=$(i.output,i.next_out),t=i.next_out-e,a=V(i.output,e);i.next_out=t,i.avail_out=n-t,t&&i.output.set(i.output.subarray(e,e+t),0),this.onData(a)}else this.onData(i.output.length===i.next_out?i.output:i.output.subarray(0,i.next_out));if(r!==oe||0!==s){if(r===se)return r=Y.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,!0;if(0===i.avail_in)break}}return!0},he.prototype.onData=function(e){this.chunks.push(e)},he.prototype.onEnd=function(e){e===oe&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=W(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg};var we=he,be=ue,me=function(e,t){return(t=t||{}).raw=!0,ue(e,t)},ke=ue,_e=h,ge={Inflate:we,inflate:be,inflateRaw:me,ungzip:ke,constants:_e};e.Inflate=we,e.constants=_e,e.default=ge,e.inflate=be,e.inflateRaw=me,e.ungzip=ke,Object.defineProperty(e,"__esModule",{value:!0})})); diff --git a/node_modules/pako/index.js b/node_modules/pako/index.js deleted file mode 100644 index 4fd9231..0000000 --- a/node_modules/pako/index.js +++ /dev/null @@ -1,18 +0,0 @@ -// Top level file is just a mixin of submodules & constants -'use strict'; - -const { Deflate, deflate, deflateRaw, gzip } = require('./lib/deflate'); - -const { Inflate, inflate, inflateRaw, ungzip } = require('./lib/inflate'); - -const constants = require('./lib/zlib/constants'); - -module.exports.Deflate = Deflate; -module.exports.deflate = deflate; -module.exports.deflateRaw = deflateRaw; -module.exports.gzip = gzip; -module.exports.Inflate = Inflate; -module.exports.inflate = inflate; -module.exports.inflateRaw = inflateRaw; -module.exports.ungzip = ungzip; -module.exports.constants = constants; diff --git a/node_modules/pako/lib/deflate.js b/node_modules/pako/lib/deflate.js deleted file mode 100644 index 9c6b88a..0000000 --- a/node_modules/pako/lib/deflate.js +++ /dev/null @@ -1,380 +0,0 @@ -'use strict'; - - -const zlib_deflate = require('./zlib/deflate'); -const utils = require('./utils/common'); -const strings = require('./utils/strings'); -const msg = require('./zlib/messages'); -const ZStream = require('./zlib/zstream'); - -const toString = Object.prototype.toString; - -/* Public constants ==========================================================*/ -/* ===========================================================================*/ - -const { - Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH, - Z_OK, Z_STREAM_END, - Z_DEFAULT_COMPRESSION, - Z_DEFAULT_STRATEGY, - Z_DEFLATED -} = require('./zlib/constants'); - -/* ===========================================================================*/ - - -/** - * class Deflate - * - * Generic JS-style wrapper for zlib calls. If you don't need - * streaming behaviour - use more simple functions: [[deflate]], - * [[deflateRaw]] and [[gzip]]. - **/ - -/* internal - * Deflate.chunks -> Array - * - * Chunks of output data, if [[Deflate#onData]] not overridden. - **/ - -/** - * Deflate.result -> Uint8Array - * - * Compressed result, generated by default [[Deflate#onData]] - * and [[Deflate#onEnd]] handlers. Filled after you push last chunk - * (call [[Deflate#push]] with `Z_FINISH` / `true` param). - **/ - -/** - * Deflate.err -> Number - * - * Error code after deflate finished. 0 (Z_OK) on success. - * You will not need it in real life, because deflate errors - * are possible only on wrong options or bad `onData` / `onEnd` - * custom handlers. - **/ - -/** - * Deflate.msg -> String - * - * Error message, if [[Deflate.err]] != 0 - **/ - - -/** - * new Deflate(options) - * - options (Object): zlib deflate options. - * - * Creates new deflator instance with specified params. Throws exception - * on bad params. Supported options: - * - * - `level` - * - `windowBits` - * - `memLevel` - * - `strategy` - * - `dictionary` - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information on these. - * - * Additional options, for internal needs: - * - * - `chunkSize` - size of generated data chunks (16K by default) - * - `raw` (Boolean) - do raw deflate - * - `gzip` (Boolean) - create gzip wrapper - * - `header` (Object) - custom header for gzip - * - `text` (Boolean) - true if compressed data believed to be text - * - `time` (Number) - modification time, unix timestamp - * - `os` (Number) - operation system code - * - `extra` (Array) - array of bytes with extra data (max 65536) - * - `name` (String) - file name (binary string) - * - `comment` (String) - comment (binary string) - * - `hcrc` (Boolean) - true if header crc should be added - * - * ##### Example: - * - * ```javascript - * const pako = require('pako') - * , chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9]) - * , chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]); - * - * const deflate = new pako.Deflate({ level: 3}); - * - * deflate.push(chunk1, false); - * deflate.push(chunk2, true); // true -> last chunk - * - * if (deflate.err) { throw new Error(deflate.err); } - * - * console.log(deflate.result); - * ``` - **/ -function Deflate(options) { - this.options = utils.assign({ - level: Z_DEFAULT_COMPRESSION, - method: Z_DEFLATED, - chunkSize: 16384, - windowBits: 15, - memLevel: 8, - strategy: Z_DEFAULT_STRATEGY - }, options || {}); - - let opt = this.options; - - if (opt.raw && (opt.windowBits > 0)) { - opt.windowBits = -opt.windowBits; - } - - else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) { - opt.windowBits += 16; - } - - this.err = 0; // error code, if happens (0 = Z_OK) - this.msg = ''; // error message - this.ended = false; // used to avoid multiple onEnd() calls - this.chunks = []; // chunks of compressed data - - this.strm = new ZStream(); - this.strm.avail_out = 0; - - let status = zlib_deflate.deflateInit2( - this.strm, - opt.level, - opt.method, - opt.windowBits, - opt.memLevel, - opt.strategy - ); - - if (status !== Z_OK) { - throw new Error(msg[status]); - } - - if (opt.header) { - zlib_deflate.deflateSetHeader(this.strm, opt.header); - } - - if (opt.dictionary) { - let dict; - // Convert data if needed - if (typeof opt.dictionary === 'string') { - // If we need to compress text, change encoding to utf8. - dict = strings.string2buf(opt.dictionary); - } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') { - dict = new Uint8Array(opt.dictionary); - } else { - dict = opt.dictionary; - } - - status = zlib_deflate.deflateSetDictionary(this.strm, dict); - - if (status !== Z_OK) { - throw new Error(msg[status]); - } - - this._dict_set = true; - } -} - -/** - * Deflate#push(data[, flush_mode]) -> Boolean - * - data (Uint8Array|ArrayBuffer|String): input data. Strings will be - * converted to utf8 byte sequence. - * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes. - * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH. - * - * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with - * new compressed chunks. Returns `true` on success. The last data block must - * have `flush_mode` Z_FINISH (or `true`). That will flush internal pending - * buffers and call [[Deflate#onEnd]]. - * - * On fail call [[Deflate#onEnd]] with error code and return false. - * - * ##### Example - * - * ```javascript - * push(chunk, false); // push one of data chunks - * ... - * push(chunk, true); // push last chunk - * ``` - **/ -Deflate.prototype.push = function (data, flush_mode) { - const strm = this.strm; - const chunkSize = this.options.chunkSize; - let status, _flush_mode; - - if (this.ended) { return false; } - - if (flush_mode === ~~flush_mode) _flush_mode = flush_mode; - else _flush_mode = flush_mode === true ? Z_FINISH : Z_NO_FLUSH; - - // Convert data if needed - if (typeof data === 'string') { - // If we need to compress text, change encoding to utf8. - strm.input = strings.string2buf(data); - } else if (toString.call(data) === '[object ArrayBuffer]') { - strm.input = new Uint8Array(data); - } else { - strm.input = data; - } - - strm.next_in = 0; - strm.avail_in = strm.input.length; - - for (;;) { - if (strm.avail_out === 0) { - strm.output = new Uint8Array(chunkSize); - strm.next_out = 0; - strm.avail_out = chunkSize; - } - - // Make sure avail_out > 6 to avoid repeating markers - if ((_flush_mode === Z_SYNC_FLUSH || _flush_mode === Z_FULL_FLUSH) && strm.avail_out <= 6) { - this.onData(strm.output.subarray(0, strm.next_out)); - strm.avail_out = 0; - continue; - } - - status = zlib_deflate.deflate(strm, _flush_mode); - - // Ended => flush and finish - if (status === Z_STREAM_END) { - if (strm.next_out > 0) { - this.onData(strm.output.subarray(0, strm.next_out)); - } - status = zlib_deflate.deflateEnd(this.strm); - this.onEnd(status); - this.ended = true; - return status === Z_OK; - } - - // Flush if out buffer full - if (strm.avail_out === 0) { - this.onData(strm.output); - continue; - } - - // Flush if requested and has data - if (_flush_mode > 0 && strm.next_out > 0) { - this.onData(strm.output.subarray(0, strm.next_out)); - strm.avail_out = 0; - continue; - } - - if (strm.avail_in === 0) break; - } - - return true; -}; - - -/** - * Deflate#onData(chunk) -> Void - * - chunk (Uint8Array): output data. - * - * By default, stores data blocks in `chunks[]` property and glue - * those in `onEnd`. Override this handler, if you need another behaviour. - **/ -Deflate.prototype.onData = function (chunk) { - this.chunks.push(chunk); -}; - - -/** - * Deflate#onEnd(status) -> Void - * - status (Number): deflate status. 0 (Z_OK) on success, - * other if not. - * - * Called once after you tell deflate that the input stream is - * complete (Z_FINISH). By default - join collected chunks, - * free memory and fill `results` / `err` properties. - **/ -Deflate.prototype.onEnd = function (status) { - // On success - join - if (status === Z_OK) { - this.result = utils.flattenChunks(this.chunks); - } - this.chunks = []; - this.err = status; - this.msg = this.strm.msg; -}; - - -/** - * deflate(data[, options]) -> Uint8Array - * - data (Uint8Array|ArrayBuffer|String): input data to compress. - * - options (Object): zlib deflate options. - * - * Compress `data` with deflate algorithm and `options`. - * - * Supported options are: - * - * - level - * - windowBits - * - memLevel - * - strategy - * - dictionary - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information on these. - * - * Sugar (options): - * - * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify - * negative windowBits implicitly. - * - * ##### Example: - * - * ```javascript - * const pako = require('pako') - * const data = new Uint8Array([1,2,3,4,5,6,7,8,9]); - * - * console.log(pako.deflate(data)); - * ``` - **/ -function deflate(input, options) { - const deflator = new Deflate(options); - - deflator.push(input, true); - - // That will never happens, if you don't cheat with options :) - if (deflator.err) { throw deflator.msg || msg[deflator.err]; } - - return deflator.result; -} - - -/** - * deflateRaw(data[, options]) -> Uint8Array - * - data (Uint8Array|ArrayBuffer|String): input data to compress. - * - options (Object): zlib deflate options. - * - * The same as [[deflate]], but creates raw data, without wrapper - * (header and adler32 crc). - **/ -function deflateRaw(input, options) { - options = options || {}; - options.raw = true; - return deflate(input, options); -} - - -/** - * gzip(data[, options]) -> Uint8Array - * - data (Uint8Array|ArrayBuffer|String): input data to compress. - * - options (Object): zlib deflate options. - * - * The same as [[deflate]], but create gzip wrapper instead of - * deflate one. - **/ -function gzip(input, options) { - options = options || {}; - options.gzip = true; - return deflate(input, options); -} - - -module.exports.Deflate = Deflate; -module.exports.deflate = deflate; -module.exports.deflateRaw = deflateRaw; -module.exports.gzip = gzip; -module.exports.constants = require('./zlib/constants'); diff --git a/node_modules/pako/lib/inflate.js b/node_modules/pako/lib/inflate.js deleted file mode 100644 index 96c9fb5..0000000 --- a/node_modules/pako/lib/inflate.js +++ /dev/null @@ -1,419 +0,0 @@ -'use strict'; - - -const zlib_inflate = require('./zlib/inflate'); -const utils = require('./utils/common'); -const strings = require('./utils/strings'); -const msg = require('./zlib/messages'); -const ZStream = require('./zlib/zstream'); -const GZheader = require('./zlib/gzheader'); - -const toString = Object.prototype.toString; - -/* Public constants ==========================================================*/ -/* ===========================================================================*/ - -const { - Z_NO_FLUSH, Z_FINISH, - Z_OK, Z_STREAM_END, Z_NEED_DICT, Z_STREAM_ERROR, Z_DATA_ERROR, Z_MEM_ERROR -} = require('./zlib/constants'); - -/* ===========================================================================*/ - - -/** - * class Inflate - * - * Generic JS-style wrapper for zlib calls. If you don't need - * streaming behaviour - use more simple functions: [[inflate]] - * and [[inflateRaw]]. - **/ - -/* internal - * inflate.chunks -> Array - * - * Chunks of output data, if [[Inflate#onData]] not overridden. - **/ - -/** - * Inflate.result -> Uint8Array|String - * - * Uncompressed result, generated by default [[Inflate#onData]] - * and [[Inflate#onEnd]] handlers. Filled after you push last chunk - * (call [[Inflate#push]] with `Z_FINISH` / `true` param). - **/ - -/** - * Inflate.err -> Number - * - * Error code after inflate finished. 0 (Z_OK) on success. - * Should be checked if broken data possible. - **/ - -/** - * Inflate.msg -> String - * - * Error message, if [[Inflate.err]] != 0 - **/ - - -/** - * new Inflate(options) - * - options (Object): zlib inflate options. - * - * Creates new inflator instance with specified params. Throws exception - * on bad params. Supported options: - * - * - `windowBits` - * - `dictionary` - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information on these. - * - * Additional options, for internal needs: - * - * - `chunkSize` - size of generated data chunks (16K by default) - * - `raw` (Boolean) - do raw inflate - * - `to` (String) - if equal to 'string', then result will be converted - * from utf8 to utf16 (javascript) string. When string output requested, - * chunk length can differ from `chunkSize`, depending on content. - * - * By default, when no options set, autodetect deflate/gzip data format via - * wrapper header. - * - * ##### Example: - * - * ```javascript - * const pako = require('pako') - * const chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9]) - * const chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]); - * - * const inflate = new pako.Inflate({ level: 3}); - * - * inflate.push(chunk1, false); - * inflate.push(chunk2, true); // true -> last chunk - * - * if (inflate.err) { throw new Error(inflate.err); } - * - * console.log(inflate.result); - * ``` - **/ -function Inflate(options) { - this.options = utils.assign({ - chunkSize: 1024 * 64, - windowBits: 15, - to: '' - }, options || {}); - - const opt = this.options; - - // Force window size for `raw` data, if not set directly, - // because we have no header for autodetect. - if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) { - opt.windowBits = -opt.windowBits; - if (opt.windowBits === 0) { opt.windowBits = -15; } - } - - // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate - if ((opt.windowBits >= 0) && (opt.windowBits < 16) && - !(options && options.windowBits)) { - opt.windowBits += 32; - } - - // Gzip header has no info about windows size, we can do autodetect only - // for deflate. So, if window size not set, force it to max when gzip possible - if ((opt.windowBits > 15) && (opt.windowBits < 48)) { - // bit 3 (16) -> gzipped data - // bit 4 (32) -> autodetect gzip/deflate - if ((opt.windowBits & 15) === 0) { - opt.windowBits |= 15; - } - } - - this.err = 0; // error code, if happens (0 = Z_OK) - this.msg = ''; // error message - this.ended = false; // used to avoid multiple onEnd() calls - this.chunks = []; // chunks of compressed data - - this.strm = new ZStream(); - this.strm.avail_out = 0; - - let status = zlib_inflate.inflateInit2( - this.strm, - opt.windowBits - ); - - if (status !== Z_OK) { - throw new Error(msg[status]); - } - - this.header = new GZheader(); - - zlib_inflate.inflateGetHeader(this.strm, this.header); - - // Setup dictionary - if (opt.dictionary) { - // Convert data if needed - if (typeof opt.dictionary === 'string') { - opt.dictionary = strings.string2buf(opt.dictionary); - } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') { - opt.dictionary = new Uint8Array(opt.dictionary); - } - if (opt.raw) { //In raw mode we need to set the dictionary early - status = zlib_inflate.inflateSetDictionary(this.strm, opt.dictionary); - if (status !== Z_OK) { - throw new Error(msg[status]); - } - } - } -} - -/** - * Inflate#push(data[, flush_mode]) -> Boolean - * - data (Uint8Array|ArrayBuffer): input data - * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE - * flush modes. See constants. Skipped or `false` means Z_NO_FLUSH, - * `true` means Z_FINISH. - * - * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with - * new output chunks. Returns `true` on success. If end of stream detected, - * [[Inflate#onEnd]] will be called. - * - * `flush_mode` is not needed for normal operation, because end of stream - * detected automatically. You may try to use it for advanced things, but - * this functionality was not tested. - * - * On fail call [[Inflate#onEnd]] with error code and return false. - * - * ##### Example - * - * ```javascript - * push(chunk, false); // push one of data chunks - * ... - * push(chunk, true); // push last chunk - * ``` - **/ -Inflate.prototype.push = function (data, flush_mode) { - const strm = this.strm; - const chunkSize = this.options.chunkSize; - const dictionary = this.options.dictionary; - let status, _flush_mode, last_avail_out; - - if (this.ended) return false; - - if (flush_mode === ~~flush_mode) _flush_mode = flush_mode; - else _flush_mode = flush_mode === true ? Z_FINISH : Z_NO_FLUSH; - - // Convert data if needed - if (toString.call(data) === '[object ArrayBuffer]') { - strm.input = new Uint8Array(data); - } else { - strm.input = data; - } - - strm.next_in = 0; - strm.avail_in = strm.input.length; - - for (;;) { - if (strm.avail_out === 0) { - strm.output = new Uint8Array(chunkSize); - strm.next_out = 0; - strm.avail_out = chunkSize; - } - - status = zlib_inflate.inflate(strm, _flush_mode); - - if (status === Z_NEED_DICT && dictionary) { - status = zlib_inflate.inflateSetDictionary(strm, dictionary); - - if (status === Z_OK) { - status = zlib_inflate.inflate(strm, _flush_mode); - } else if (status === Z_DATA_ERROR) { - // Replace code with more verbose - status = Z_NEED_DICT; - } - } - - // Skip snyc markers if more data follows and not raw mode - while (strm.avail_in > 0 && - status === Z_STREAM_END && - strm.state.wrap > 0 && - data[strm.next_in] !== 0) - { - zlib_inflate.inflateReset(strm); - status = zlib_inflate.inflate(strm, _flush_mode); - } - - switch (status) { - case Z_STREAM_ERROR: - case Z_DATA_ERROR: - case Z_NEED_DICT: - case Z_MEM_ERROR: - this.onEnd(status); - this.ended = true; - return false; - } - - // Remember real `avail_out` value, because we may patch out buffer content - // to align utf8 strings boundaries. - last_avail_out = strm.avail_out; - - if (strm.next_out) { - if (strm.avail_out === 0 || status === Z_STREAM_END) { - - if (this.options.to === 'string') { - - let next_out_utf8 = strings.utf8border(strm.output, strm.next_out); - - let tail = strm.next_out - next_out_utf8; - let utf8str = strings.buf2string(strm.output, next_out_utf8); - - // move tail & realign counters - strm.next_out = tail; - strm.avail_out = chunkSize - tail; - if (tail) strm.output.set(strm.output.subarray(next_out_utf8, next_out_utf8 + tail), 0); - - this.onData(utf8str); - - } else { - this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out)); - } - } - } - - // Must repeat iteration if out buffer is full - if (status === Z_OK && last_avail_out === 0) continue; - - // Finalize if end of stream reached. - if (status === Z_STREAM_END) { - status = zlib_inflate.inflateEnd(this.strm); - this.onEnd(status); - this.ended = true; - return true; - } - - if (strm.avail_in === 0) break; - } - - return true; -}; - - -/** - * Inflate#onData(chunk) -> Void - * - chunk (Uint8Array|String): output data. When string output requested, - * each chunk will be string. - * - * By default, stores data blocks in `chunks[]` property and glue - * those in `onEnd`. Override this handler, if you need another behaviour. - **/ -Inflate.prototype.onData = function (chunk) { - this.chunks.push(chunk); -}; - - -/** - * Inflate#onEnd(status) -> Void - * - status (Number): inflate status. 0 (Z_OK) on success, - * other if not. - * - * Called either after you tell inflate that the input stream is - * complete (Z_FINISH). By default - join collected chunks, - * free memory and fill `results` / `err` properties. - **/ -Inflate.prototype.onEnd = function (status) { - // On success - join - if (status === Z_OK) { - if (this.options.to === 'string') { - this.result = this.chunks.join(''); - } else { - this.result = utils.flattenChunks(this.chunks); - } - } - this.chunks = []; - this.err = status; - this.msg = this.strm.msg; -}; - - -/** - * inflate(data[, options]) -> Uint8Array|String - * - data (Uint8Array|ArrayBuffer): input data to decompress. - * - options (Object): zlib inflate options. - * - * Decompress `data` with inflate/ungzip and `options`. Autodetect - * format via wrapper header by default. That's why we don't provide - * separate `ungzip` method. - * - * Supported options are: - * - * - windowBits - * - * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) - * for more information. - * - * Sugar (options): - * - * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify - * negative windowBits implicitly. - * - `to` (String) - if equal to 'string', then result will be converted - * from utf8 to utf16 (javascript) string. When string output requested, - * chunk length can differ from `chunkSize`, depending on content. - * - * - * ##### Example: - * - * ```javascript - * const pako = require('pako'); - * const input = pako.deflate(new Uint8Array([1,2,3,4,5,6,7,8,9])); - * let output; - * - * try { - * output = pako.inflate(input); - * } catch (err) { - * console.log(err); - * } - * ``` - **/ -function inflate(input, options) { - const inflator = new Inflate(options); - - inflator.push(input); - - // That will never happens, if you don't cheat with options :) - if (inflator.err) throw inflator.msg || msg[inflator.err]; - - return inflator.result; -} - - -/** - * inflateRaw(data[, options]) -> Uint8Array|String - * - data (Uint8Array|ArrayBuffer): input data to decompress. - * - options (Object): zlib inflate options. - * - * The same as [[inflate]], but creates raw data, without wrapper - * (header and adler32 crc). - **/ -function inflateRaw(input, options) { - options = options || {}; - options.raw = true; - return inflate(input, options); -} - - -/** - * ungzip(data[, options]) -> Uint8Array|String - * - data (Uint8Array|ArrayBuffer): input data to decompress. - * - options (Object): zlib inflate options. - * - * Just shortcut to [[inflate]], because it autodetects format - * by header.content. Done for convenience. - **/ - - -module.exports.Inflate = Inflate; -module.exports.inflate = inflate; -module.exports.inflateRaw = inflateRaw; -module.exports.ungzip = inflate; -module.exports.constants = require('./zlib/constants'); diff --git a/node_modules/pako/lib/utils/common.js b/node_modules/pako/lib/utils/common.js deleted file mode 100644 index 9a6447a..0000000 --- a/node_modules/pako/lib/utils/common.js +++ /dev/null @@ -1,48 +0,0 @@ -'use strict'; - - -const _has = (obj, key) => { - return Object.prototype.hasOwnProperty.call(obj, key); -}; - -module.exports.assign = function (obj /*from1, from2, from3, ...*/) { - const sources = Array.prototype.slice.call(arguments, 1); - while (sources.length) { - const source = sources.shift(); - if (!source) { continue; } - - if (typeof source !== 'object') { - throw new TypeError(source + 'must be non-object'); - } - - for (const p in source) { - if (_has(source, p)) { - obj[p] = source[p]; - } - } - } - - return obj; -}; - - -// Join array of chunks to single array. -module.exports.flattenChunks = (chunks) => { - // calculate data length - let len = 0; - - for (let i = 0, l = chunks.length; i < l; i++) { - len += chunks[i].length; - } - - // join chunks - const result = new Uint8Array(len); - - for (let i = 0, pos = 0, l = chunks.length; i < l; i++) { - let chunk = chunks[i]; - result.set(chunk, pos); - pos += chunk.length; - } - - return result; -}; diff --git a/node_modules/pako/lib/utils/strings.js b/node_modules/pako/lib/utils/strings.js deleted file mode 100644 index c8f097c..0000000 --- a/node_modules/pako/lib/utils/strings.js +++ /dev/null @@ -1,174 +0,0 @@ -// String encode/decode helpers -'use strict'; - - -// Quick check if we can use fast array to bin string conversion -// -// - apply(Array) can fail on Android 2.2 -// - apply(Uint8Array) can fail on iOS 5.1 Safari -// -let STR_APPLY_UIA_OK = true; - -try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; } - - -// Table with utf8 lengths (calculated by first byte of sequence) -// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS, -// because max possible codepoint is 0x10ffff -const _utf8len = new Uint8Array(256); -for (let q = 0; q < 256; q++) { - _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1); -} -_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start - - -// convert string to array (typed, when possible) -module.exports.string2buf = (str) => { - if (typeof TextEncoder === 'function' && TextEncoder.prototype.encode) { - return new TextEncoder().encode(str); - } - - let buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0; - - // count binary size - for (m_pos = 0; m_pos < str_len; m_pos++) { - c = str.charCodeAt(m_pos); - if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) { - c2 = str.charCodeAt(m_pos + 1); - if ((c2 & 0xfc00) === 0xdc00) { - c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); - m_pos++; - } - } - buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4; - } - - // allocate buffer - buf = new Uint8Array(buf_len); - - // convert - for (i = 0, m_pos = 0; i < buf_len; m_pos++) { - c = str.charCodeAt(m_pos); - if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) { - c2 = str.charCodeAt(m_pos + 1); - if ((c2 & 0xfc00) === 0xdc00) { - c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); - m_pos++; - } - } - if (c < 0x80) { - /* one byte */ - buf[i++] = c; - } else if (c < 0x800) { - /* two bytes */ - buf[i++] = 0xC0 | (c >>> 6); - buf[i++] = 0x80 | (c & 0x3f); - } else if (c < 0x10000) { - /* three bytes */ - buf[i++] = 0xE0 | (c >>> 12); - buf[i++] = 0x80 | (c >>> 6 & 0x3f); - buf[i++] = 0x80 | (c & 0x3f); - } else { - /* four bytes */ - buf[i++] = 0xf0 | (c >>> 18); - buf[i++] = 0x80 | (c >>> 12 & 0x3f); - buf[i++] = 0x80 | (c >>> 6 & 0x3f); - buf[i++] = 0x80 | (c & 0x3f); - } - } - - return buf; -}; - -// Helper -const buf2binstring = (buf, len) => { - // On Chrome, the arguments in a function call that are allowed is `65534`. - // If the length of the buffer is smaller than that, we can use this optimization, - // otherwise we will take a slower path. - if (len < 65534) { - if (buf.subarray && STR_APPLY_UIA_OK) { - return String.fromCharCode.apply(null, buf.length === len ? buf : buf.subarray(0, len)); - } - } - - let result = ''; - for (let i = 0; i < len; i++) { - result += String.fromCharCode(buf[i]); - } - return result; -}; - - -// convert array to string -module.exports.buf2string = (buf, max) => { - const len = max || buf.length; - - if (typeof TextDecoder === 'function' && TextDecoder.prototype.decode) { - return new TextDecoder().decode(buf.subarray(0, max)); - } - - let i, out; - - // Reserve max possible length (2 words per char) - // NB: by unknown reasons, Array is significantly faster for - // String.fromCharCode.apply than Uint16Array. - const utf16buf = new Array(len * 2); - - for (out = 0, i = 0; i < len;) { - let c = buf[i++]; - // quick process ascii - if (c < 0x80) { utf16buf[out++] = c; continue; } - - let c_len = _utf8len[c]; - // skip 5 & 6 byte codes - if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; } - - // apply mask on first byte - c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07; - // join the rest - while (c_len > 1 && i < len) { - c = (c << 6) | (buf[i++] & 0x3f); - c_len--; - } - - // terminated by end of string? - if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; } - - if (c < 0x10000) { - utf16buf[out++] = c; - } else { - c -= 0x10000; - utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff); - utf16buf[out++] = 0xdc00 | (c & 0x3ff); - } - } - - return buf2binstring(utf16buf, out); -}; - - -// Calculate max possible position in utf8 buffer, -// that will not break sequence. If that's not possible -// - (very small limits) return max size as is. -// -// buf[] - utf8 bytes array -// max - length limit (mandatory); -module.exports.utf8border = (buf, max) => { - - max = max || buf.length; - if (max > buf.length) { max = buf.length; } - - // go back from last position, until start of sequence found - let pos = max - 1; - while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; } - - // Very small and broken sequence, - // return max, because we should return something anyway. - if (pos < 0) { return max; } - - // If we came to start of buffer - that means buffer is too small, - // return max too. - if (pos === 0) { return max; } - - return (pos + _utf8len[buf[pos]] > max) ? pos : max; -}; diff --git a/node_modules/pako/lib/zlib/README b/node_modules/pako/lib/zlib/README deleted file mode 100644 index 88a8752..0000000 --- a/node_modules/pako/lib/zlib/README +++ /dev/null @@ -1,59 +0,0 @@ -Content of this folder follows zlib C sources as close as possible. -That's intended to simplify maintainability and guarantee equal API -and result. - -Key differences: - -- Everything is in JavaScript. -- No platform-dependent blocks. -- Some things like crc32 rewritten to keep size small and make JIT - work better. -- Some code is different due missed features in JS (macros, pointers, - structures, header files) -- Specific API methods are not implemented (see notes in root readme) - -This port is based on zlib 1.2.8. - -This port is under zlib license (see below) with contribution and addition of javascript -port under expat license (see LICENSE at root of project) - -Copyright: -(C) 1995-2013 Jean-loup Gailly and Mark Adler -(C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin - - -From zlib's README -============================================================================= - -Acknowledgments: - - The deflate format used by zlib was defined by Phil Katz. The deflate and - zlib specifications were written by L. Peter Deutsch. Thanks to all the - people who reported problems and suggested various improvements in zlib; they - are too numerous to cite here. - -Copyright notice: - - (C) 1995-2013 Jean-loup Gailly and Mark Adler - -Copyright (c) <''year''> <''copyright holders''> - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu diff --git a/node_modules/pako/lib/zlib/adler32.js b/node_modules/pako/lib/zlib/adler32.js deleted file mode 100644 index d65072a..0000000 --- a/node_modules/pako/lib/zlib/adler32.js +++ /dev/null @@ -1,51 +0,0 @@ -'use strict'; - -// Note: adler32 takes 12% for level 0 and 2% for level 6. -// It isn't worth it to make additional optimizations as in original. -// Small size is preferable. - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -const adler32 = (adler, buf, len, pos) => { - let s1 = (adler & 0xffff) |0, - s2 = ((adler >>> 16) & 0xffff) |0, - n = 0; - - while (len !== 0) { - // Set limit ~ twice less than 5552, to keep - // s2 in 31-bits, because we force signed ints. - // in other case %= will fail. - n = len > 2000 ? 2000 : len; - len -= n; - - do { - s1 = (s1 + buf[pos++]) |0; - s2 = (s2 + s1) |0; - } while (--n); - - s1 %= 65521; - s2 %= 65521; - } - - return (s1 | (s2 << 16)) |0; -}; - - -module.exports = adler32; diff --git a/node_modules/pako/lib/zlib/constants.js b/node_modules/pako/lib/zlib/constants.js deleted file mode 100644 index b85cc01..0000000 --- a/node_modules/pako/lib/zlib/constants.js +++ /dev/null @@ -1,68 +0,0 @@ -'use strict'; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -module.exports = { - - /* Allowed flush values; see deflate() and inflate() below for details */ - Z_NO_FLUSH: 0, - Z_PARTIAL_FLUSH: 1, - Z_SYNC_FLUSH: 2, - Z_FULL_FLUSH: 3, - Z_FINISH: 4, - Z_BLOCK: 5, - Z_TREES: 6, - - /* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ - Z_OK: 0, - Z_STREAM_END: 1, - Z_NEED_DICT: 2, - Z_ERRNO: -1, - Z_STREAM_ERROR: -2, - Z_DATA_ERROR: -3, - Z_MEM_ERROR: -4, - Z_BUF_ERROR: -5, - //Z_VERSION_ERROR: -6, - - /* compression levels */ - Z_NO_COMPRESSION: 0, - Z_BEST_SPEED: 1, - Z_BEST_COMPRESSION: 9, - Z_DEFAULT_COMPRESSION: -1, - - - Z_FILTERED: 1, - Z_HUFFMAN_ONLY: 2, - Z_RLE: 3, - Z_FIXED: 4, - Z_DEFAULT_STRATEGY: 0, - - /* Possible values of the data_type field (though see inflate()) */ - Z_BINARY: 0, - Z_TEXT: 1, - //Z_ASCII: 1, // = Z_TEXT (deprecated) - Z_UNKNOWN: 2, - - /* The deflate compression method */ - Z_DEFLATED: 8 - //Z_NULL: null // Use -1 or null inline, depending on var type -}; diff --git a/node_modules/pako/lib/zlib/crc32.js b/node_modules/pako/lib/zlib/crc32.js deleted file mode 100644 index 60cbd51..0000000 --- a/node_modules/pako/lib/zlib/crc32.js +++ /dev/null @@ -1,59 +0,0 @@ -'use strict'; - -// Note: we can't get significant speed boost here. -// So write code to minimize size - no pregenerated tables -// and array tools dependencies. - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -// Use ordinary array, since untyped makes no boost here -const makeTable = () => { - let c, table = []; - - for (var n = 0; n < 256; n++) { - c = n; - for (var k = 0; k < 8; k++) { - c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); - } - table[n] = c; - } - - return table; -}; - -// Create table on load. Just 255 signed longs. Not a problem. -const crcTable = new Uint32Array(makeTable()); - - -const crc32 = (crc, buf, len, pos) => { - const t = crcTable; - const end = pos + len; - - crc ^= -1; - - for (let i = pos; i < end; i++) { - crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF]; - } - - return (crc ^ (-1)); // >>> 0; -}; - - -module.exports = crc32; diff --git a/node_modules/pako/lib/zlib/deflate.js b/node_modules/pako/lib/zlib/deflate.js deleted file mode 100644 index 00e056e..0000000 --- a/node_modules/pako/lib/zlib/deflate.js +++ /dev/null @@ -1,2048 +0,0 @@ -'use strict'; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -const { _tr_init, _tr_stored_block, _tr_flush_block, _tr_tally, _tr_align } = require('./trees'); -const adler32 = require('./adler32'); -const crc32 = require('./crc32'); -const msg = require('./messages'); - -/* Public constants ==========================================================*/ -/* ===========================================================================*/ - -const { - Z_NO_FLUSH, Z_PARTIAL_FLUSH, Z_FULL_FLUSH, Z_FINISH, Z_BLOCK, - Z_OK, Z_STREAM_END, Z_STREAM_ERROR, Z_DATA_ERROR, Z_BUF_ERROR, - Z_DEFAULT_COMPRESSION, - Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE, Z_FIXED, Z_DEFAULT_STRATEGY, - Z_UNKNOWN, - Z_DEFLATED -} = require('./constants'); - -/*============================================================================*/ - - -const MAX_MEM_LEVEL = 9; -/* Maximum value for memLevel in deflateInit2 */ -const MAX_WBITS = 15; -/* 32K LZ77 window */ -const DEF_MEM_LEVEL = 8; - - -const LENGTH_CODES = 29; -/* number of length codes, not counting the special END_BLOCK code */ -const LITERALS = 256; -/* number of literal bytes 0..255 */ -const L_CODES = LITERALS + 1 + LENGTH_CODES; -/* number of Literal or Length codes, including the END_BLOCK code */ -const D_CODES = 30; -/* number of distance codes */ -const BL_CODES = 19; -/* number of codes used to transfer the bit lengths */ -const HEAP_SIZE = 2 * L_CODES + 1; -/* maximum heap size */ -const MAX_BITS = 15; -/* All codes must not exceed MAX_BITS bits */ - -const MIN_MATCH = 3; -const MAX_MATCH = 258; -const MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1); - -const PRESET_DICT = 0x20; - -const INIT_STATE = 42; /* zlib header -> BUSY_STATE */ -//#ifdef GZIP -const GZIP_STATE = 57; /* gzip header -> BUSY_STATE | EXTRA_STATE */ -//#endif -const EXTRA_STATE = 69; /* gzip extra block -> NAME_STATE */ -const NAME_STATE = 73; /* gzip file name -> COMMENT_STATE */ -const COMMENT_STATE = 91; /* gzip comment -> HCRC_STATE */ -const HCRC_STATE = 103; /* gzip header CRC -> BUSY_STATE */ -const BUSY_STATE = 113; /* deflate -> FINISH_STATE */ -const FINISH_STATE = 666; /* stream complete */ - -const BS_NEED_MORE = 1; /* block not completed, need more input or more output */ -const BS_BLOCK_DONE = 2; /* block flush performed */ -const BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */ -const BS_FINISH_DONE = 4; /* finish done, accept no more input or output */ - -const OS_CODE = 0x03; // Unix :) . Don't detect, use this default. - -const err = (strm, errorCode) => { - strm.msg = msg[errorCode]; - return errorCode; -}; - -const rank = (f) => { - return ((f) * 2) - ((f) > 4 ? 9 : 0); -}; - -const zero = (buf) => { - let len = buf.length; while (--len >= 0) { buf[len] = 0; } -}; - -/* =========================================================================== - * Slide the hash table when sliding the window down (could be avoided with 32 - * bit values at the expense of memory usage). We slide even when level == 0 to - * keep the hash table consistent if we switch back to level > 0 later. - */ -const slide_hash = (s) => { - let n, m; - let p; - let wsize = s.w_size; - - n = s.hash_size; - p = n; - do { - m = s.head[--p]; - s.head[p] = (m >= wsize ? m - wsize : 0); - } while (--n); - n = wsize; -//#ifndef FASTEST - p = n; - do { - m = s.prev[--p]; - s.prev[p] = (m >= wsize ? m - wsize : 0); - /* If n is not on any hash chain, prev[n] is garbage but - * its value will never be used. - */ - } while (--n); -//#endif -}; - -/* eslint-disable new-cap */ -let HASH_ZLIB = (s, prev, data) => ((prev << s.hash_shift) ^ data) & s.hash_mask; -// This hash causes less collisions, https://github.com/nodeca/pako/issues/135 -// But breaks binary compatibility -//let HASH_FAST = (s, prev, data) => ((prev << 8) + (prev >> 8) + (data << 4)) & s.hash_mask; -let HASH = HASH_ZLIB; - - -/* ========================================================================= - * Flush as much pending output as possible. All deflate() output, except for - * some deflate_stored() output, goes through this function so some - * applications may wish to modify it to avoid allocating a large - * strm->next_out buffer and copying into it. (See also read_buf()). - */ -const flush_pending = (strm) => { - const s = strm.state; - - //_tr_flush_bits(s); - let len = s.pending; - if (len > strm.avail_out) { - len = strm.avail_out; - } - if (len === 0) { return; } - - strm.output.set(s.pending_buf.subarray(s.pending_out, s.pending_out + len), strm.next_out); - strm.next_out += len; - s.pending_out += len; - strm.total_out += len; - strm.avail_out -= len; - s.pending -= len; - if (s.pending === 0) { - s.pending_out = 0; - } -}; - - -const flush_block_only = (s, last) => { - _tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last); - s.block_start = s.strstart; - flush_pending(s.strm); -}; - - -const put_byte = (s, b) => { - s.pending_buf[s.pending++] = b; -}; - - -/* ========================================================================= - * Put a short in the pending buffer. The 16-bit value is put in MSB order. - * IN assertion: the stream state is correct and there is enough room in - * pending_buf. - */ -const putShortMSB = (s, b) => { - - // put_byte(s, (Byte)(b >> 8)); -// put_byte(s, (Byte)(b & 0xff)); - s.pending_buf[s.pending++] = (b >>> 8) & 0xff; - s.pending_buf[s.pending++] = b & 0xff; -}; - - -/* =========================================================================== - * Read a new buffer from the current input stream, update the adler32 - * and total number of bytes read. All deflate() input goes through - * this function so some applications may wish to modify it to avoid - * allocating a large strm->input buffer and copying from it. - * (See also flush_pending()). - */ -const read_buf = (strm, buf, start, size) => { - - let len = strm.avail_in; - - if (len > size) { len = size; } - if (len === 0) { return 0; } - - strm.avail_in -= len; - - // zmemcpy(buf, strm->next_in, len); - buf.set(strm.input.subarray(strm.next_in, strm.next_in + len), start); - if (strm.state.wrap === 1) { - strm.adler = adler32(strm.adler, buf, len, start); - } - - else if (strm.state.wrap === 2) { - strm.adler = crc32(strm.adler, buf, len, start); - } - - strm.next_in += len; - strm.total_in += len; - - return len; -}; - - -/* =========================================================================== - * Set match_start to the longest match starting at the given string and - * return its length. Matches shorter or equal to prev_length are discarded, - * in which case the result is equal to prev_length and match_start is - * garbage. - * IN assertions: cur_match is the head of the hash chain for the current - * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 - * OUT assertion: the match length is not greater than s->lookahead. - */ -const longest_match = (s, cur_match) => { - - let chain_length = s.max_chain_length; /* max hash chain length */ - let scan = s.strstart; /* current string */ - let match; /* matched string */ - let len; /* length of current match */ - let best_len = s.prev_length; /* best match length so far */ - let nice_match = s.nice_match; /* stop if match long enough */ - const limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ? - s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/; - - const _win = s.window; // shortcut - - const wmask = s.w_mask; - const prev = s.prev; - - /* Stop when cur_match becomes <= limit. To simplify the code, - * we prevent matches with the string of window index 0. - */ - - const strend = s.strstart + MAX_MATCH; - let scan_end1 = _win[scan + best_len - 1]; - let scan_end = _win[scan + best_len]; - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - /* Do not waste too much time if we already have a good match: */ - if (s.prev_length >= s.good_match) { - chain_length >>= 2; - } - /* Do not look for matches beyond the end of the input. This is necessary - * to make deflate deterministic. - */ - if (nice_match > s.lookahead) { nice_match = s.lookahead; } - - // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); - - do { - // Assert(cur_match < s->strstart, "no future"); - match = cur_match; - - /* Skip to next match if the match length cannot increase - * or if the match length is less than 2. Note that the checks below - * for insufficient lookahead only occur occasionally for performance - * reasons. Therefore uninitialized memory will be accessed, and - * conditional jumps will be made that depend on those values. - * However the length of the match is limited to the lookahead, so - * the output of deflate is not affected by the uninitialized values. - */ - - if (_win[match + best_len] !== scan_end || - _win[match + best_len - 1] !== scan_end1 || - _win[match] !== _win[scan] || - _win[++match] !== _win[scan + 1]) { - continue; - } - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2; - match++; - // Assert(*scan == *match, "match[2]?"); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - /*jshint noempty:false*/ - } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && - _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && - _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && - _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && - scan < strend); - - // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - - len = MAX_MATCH - (strend - scan); - scan = strend - MAX_MATCH; - - if (len > best_len) { - s.match_start = cur_match; - best_len = len; - if (len >= nice_match) { - break; - } - scan_end1 = _win[scan + best_len - 1]; - scan_end = _win[scan + best_len]; - } - } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0); - - if (best_len <= s.lookahead) { - return best_len; - } - return s.lookahead; -}; - - -/* =========================================================================== - * Fill the window when the lookahead becomes insufficient. - * Updates strstart and lookahead. - * - * IN assertion: lookahead < MIN_LOOKAHEAD - * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD - * At least one byte has been read, or avail_in == 0; reads are - * performed for at least two bytes (required for the zip translate_eol - * option -- not supported here). - */ -const fill_window = (s) => { - - const _w_size = s.w_size; - let n, more, str; - - //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); - - do { - more = s.window_size - s.lookahead - s.strstart; - - // JS ints have 32 bit, block below not needed - /* Deal with !@#$% 64K limit: */ - //if (sizeof(int) <= 2) { - // if (more == 0 && s->strstart == 0 && s->lookahead == 0) { - // more = wsize; - // - // } else if (more == (unsigned)(-1)) { - // /* Very unlikely, but possible on 16 bit machine if - // * strstart == 0 && lookahead == 1 (input done a byte at time) - // */ - // more--; - // } - //} - - - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) { - - s.window.set(s.window.subarray(_w_size, _w_size + _w_size - more), 0); - s.match_start -= _w_size; - s.strstart -= _w_size; - /* we now have strstart >= MAX_DIST */ - s.block_start -= _w_size; - if (s.insert > s.strstart) { - s.insert = s.strstart; - } - slide_hash(s); - more += _w_size; - } - if (s.strm.avail_in === 0) { - break; - } - - /* If there was no sliding: - * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - * more == window_size - lookahead - strstart - * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - * => more >= window_size - 2*WSIZE + 2 - * In the BIG_MEM or MMAP case (not yet supported), - * window_size == input_size + MIN_LOOKAHEAD && - * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - * Otherwise, window_size == 2*WSIZE so more >= 2. - * If there was sliding, more >= WSIZE. So in all cases, more >= 2. - */ - //Assert(more >= 2, "more < 2"); - n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more); - s.lookahead += n; - - /* Initialize the hash value now that we have some input: */ - if (s.lookahead + s.insert >= MIN_MATCH) { - str = s.strstart - s.insert; - s.ins_h = s.window[str]; - - /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */ - s.ins_h = HASH(s, s.ins_h, s.window[str + 1]); -//#if MIN_MATCH != 3 -// Call update_hash() MIN_MATCH-3 more times -//#endif - while (s.insert) { - /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ - s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]); - - s.prev[str & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = str; - str++; - s.insert--; - if (s.lookahead + s.insert < MIN_MATCH) { - break; - } - } - } - /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - * but this is not important since only literal bytes will be emitted. - */ - - } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0); - - /* If the WIN_INIT bytes after the end of the current data have never been - * written, then zero those bytes in order to avoid memory check reports of - * the use of uninitialized (or uninitialised as Julian writes) bytes by - * the longest match routines. Update the high water mark for the next - * time through here. WIN_INIT is set to MAX_MATCH since the longest match - * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. - */ -// if (s.high_water < s.window_size) { -// const curr = s.strstart + s.lookahead; -// let init = 0; -// -// if (s.high_water < curr) { -// /* Previous high water mark below current data -- zero WIN_INIT -// * bytes or up to end of window, whichever is less. -// */ -// init = s.window_size - curr; -// if (init > WIN_INIT) -// init = WIN_INIT; -// zmemzero(s->window + curr, (unsigned)init); -// s->high_water = curr + init; -// } -// else if (s->high_water < (ulg)curr + WIN_INIT) { -// /* High water mark at or above current data, but below current data -// * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up -// * to end of window, whichever is less. -// */ -// init = (ulg)curr + WIN_INIT - s->high_water; -// if (init > s->window_size - s->high_water) -// init = s->window_size - s->high_water; -// zmemzero(s->window + s->high_water, (unsigned)init); -// s->high_water += init; -// } -// } -// -// Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, -// "not enough room for search"); -}; - -/* =========================================================================== - * Copy without compression as much as possible from the input stream, return - * the current block state. - * - * In case deflateParams() is used to later switch to a non-zero compression - * level, s->matches (otherwise unused when storing) keeps track of the number - * of hash table slides to perform. If s->matches is 1, then one hash table - * slide will be done when switching. If s->matches is 2, the maximum value - * allowed here, then the hash table will be cleared, since two or more slides - * is the same as a clear. - * - * deflate_stored() is written to minimize the number of times an input byte is - * copied. It is most efficient with large input and output buffers, which - * maximizes the opportunites to have a single copy from next_in to next_out. - */ -const deflate_stored = (s, flush) => { - - /* Smallest worthy block size when not flushing or finishing. By default - * this is 32K. This can be as small as 507 bytes for memLevel == 1. For - * large input and output buffers, the stored block size will be larger. - */ - let min_block = s.pending_buf_size - 5 > s.w_size ? s.w_size : s.pending_buf_size - 5; - - /* Copy as many min_block or larger stored blocks directly to next_out as - * possible. If flushing, copy the remaining available input to next_out as - * stored blocks, if there is enough space. - */ - let len, left, have, last = 0; - let used = s.strm.avail_in; - do { - /* Set len to the maximum size block that we can copy directly with the - * available input data and output space. Set left to how much of that - * would be copied from what's left in the window. - */ - len = 65535/* MAX_STORED */; /* maximum deflate stored block length */ - have = (s.bi_valid + 42) >> 3; /* number of header bytes */ - if (s.strm.avail_out < have) { /* need room for header */ - break; - } - /* maximum stored block length that will fit in avail_out: */ - have = s.strm.avail_out - have; - left = s.strstart - s.block_start; /* bytes left in window */ - if (len > left + s.strm.avail_in) { - len = left + s.strm.avail_in; /* limit len to the input */ - } - if (len > have) { - len = have; /* limit len to the output */ - } - - /* If the stored block would be less than min_block in length, or if - * unable to copy all of the available input when flushing, then try - * copying to the window and the pending buffer instead. Also don't - * write an empty block when flushing -- deflate() does that. - */ - if (len < min_block && ((len === 0 && flush !== Z_FINISH) || - flush === Z_NO_FLUSH || - len !== left + s.strm.avail_in)) { - break; - } - - /* Make a dummy stored block in pending to get the header bytes, - * including any pending bits. This also updates the debugging counts. - */ - last = flush === Z_FINISH && len === left + s.strm.avail_in ? 1 : 0; - _tr_stored_block(s, 0, 0, last); - - /* Replace the lengths in the dummy stored block with len. */ - s.pending_buf[s.pending - 4] = len; - s.pending_buf[s.pending - 3] = len >> 8; - s.pending_buf[s.pending - 2] = ~len; - s.pending_buf[s.pending - 1] = ~len >> 8; - - /* Write the stored block header bytes. */ - flush_pending(s.strm); - -//#ifdef ZLIB_DEBUG -// /* Update debugging counts for the data about to be copied. */ -// s->compressed_len += len << 3; -// s->bits_sent += len << 3; -//#endif - - /* Copy uncompressed bytes from the window to next_out. */ - if (left) { - if (left > len) { - left = len; - } - //zmemcpy(s->strm->next_out, s->window + s->block_start, left); - s.strm.output.set(s.window.subarray(s.block_start, s.block_start + left), s.strm.next_out); - s.strm.next_out += left; - s.strm.avail_out -= left; - s.strm.total_out += left; - s.block_start += left; - len -= left; - } - - /* Copy uncompressed bytes directly from next_in to next_out, updating - * the check value. - */ - if (len) { - read_buf(s.strm, s.strm.output, s.strm.next_out, len); - s.strm.next_out += len; - s.strm.avail_out -= len; - s.strm.total_out += len; - } - } while (last === 0); - - /* Update the sliding window with the last s->w_size bytes of the copied - * data, or append all of the copied data to the existing window if less - * than s->w_size bytes were copied. Also update the number of bytes to - * insert in the hash tables, in the event that deflateParams() switches to - * a non-zero compression level. - */ - used -= s.strm.avail_in; /* number of input bytes directly copied */ - if (used) { - /* If any input was used, then no unused input remains in the window, - * therefore s->block_start == s->strstart. - */ - if (used >= s.w_size) { /* supplant the previous history */ - s.matches = 2; /* clear hash */ - //zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size); - s.window.set(s.strm.input.subarray(s.strm.next_in - s.w_size, s.strm.next_in), 0); - s.strstart = s.w_size; - s.insert = s.strstart; - } - else { - if (s.window_size - s.strstart <= used) { - /* Slide the window down. */ - s.strstart -= s.w_size; - //zmemcpy(s->window, s->window + s->w_size, s->strstart); - s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0); - if (s.matches < 2) { - s.matches++; /* add a pending slide_hash() */ - } - if (s.insert > s.strstart) { - s.insert = s.strstart; - } - } - //zmemcpy(s->window + s->strstart, s->strm->next_in - used, used); - s.window.set(s.strm.input.subarray(s.strm.next_in - used, s.strm.next_in), s.strstart); - s.strstart += used; - s.insert += used > s.w_size - s.insert ? s.w_size - s.insert : used; - } - s.block_start = s.strstart; - } - if (s.high_water < s.strstart) { - s.high_water = s.strstart; - } - - /* If the last block was written to next_out, then done. */ - if (last) { - return BS_FINISH_DONE; - } - - /* If flushing and all input has been consumed, then done. */ - if (flush !== Z_NO_FLUSH && flush !== Z_FINISH && - s.strm.avail_in === 0 && s.strstart === s.block_start) { - return BS_BLOCK_DONE; - } - - /* Fill the window with any remaining input. */ - have = s.window_size - s.strstart; - if (s.strm.avail_in > have && s.block_start >= s.w_size) { - /* Slide the window down. */ - s.block_start -= s.w_size; - s.strstart -= s.w_size; - //zmemcpy(s->window, s->window + s->w_size, s->strstart); - s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0); - if (s.matches < 2) { - s.matches++; /* add a pending slide_hash() */ - } - have += s.w_size; /* more space now */ - if (s.insert > s.strstart) { - s.insert = s.strstart; - } - } - if (have > s.strm.avail_in) { - have = s.strm.avail_in; - } - if (have) { - read_buf(s.strm, s.window, s.strstart, have); - s.strstart += have; - s.insert += have > s.w_size - s.insert ? s.w_size - s.insert : have; - } - if (s.high_water < s.strstart) { - s.high_water = s.strstart; - } - - /* There was not enough avail_out to write a complete worthy or flushed - * stored block to next_out. Write a stored block to pending instead, if we - * have enough input for a worthy block, or if flushing and there is enough - * room for the remaining input as a stored block in the pending buffer. - */ - have = (s.bi_valid + 42) >> 3; /* number of header bytes */ - /* maximum stored block length that will fit in pending: */ - have = s.pending_buf_size - have > 65535/* MAX_STORED */ ? 65535/* MAX_STORED */ : s.pending_buf_size - have; - min_block = have > s.w_size ? s.w_size : have; - left = s.strstart - s.block_start; - if (left >= min_block || - ((left || flush === Z_FINISH) && flush !== Z_NO_FLUSH && - s.strm.avail_in === 0 && left <= have)) { - len = left > have ? have : left; - last = flush === Z_FINISH && s.strm.avail_in === 0 && - len === left ? 1 : 0; - _tr_stored_block(s, s.block_start, len, last); - s.block_start += len; - flush_pending(s.strm); - } - - /* We've done all we can with the available input and output. */ - return last ? BS_FINISH_STARTED : BS_NEED_MORE; -}; - - -/* =========================================================================== - * Compress as much as possible from the input stream, return the current - * block state. - * This function does not perform lazy evaluation of matches and inserts - * new strings in the dictionary only for unmatched strings or for short - * matches. It is used only for the fast compression options. - */ -const deflate_fast = (s, flush) => { - - let hash_head; /* head of the hash chain */ - let bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s.lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { - break; /* flush the current block */ - } - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = 0/*NIL*/; - if (s.lookahead >= MIN_MATCH) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]); - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - - /* Find the longest match, discarding those <= prev_length. - * At this point we have always match_length < MIN_MATCH - */ - if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s.match_length = longest_match(s, hash_head); - /* longest_match() sets match_start */ - } - if (s.match_length >= MIN_MATCH) { - // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only - - /*** _tr_tally_dist(s, s.strstart - s.match_start, - s.match_length - MIN_MATCH, bflush); ***/ - bflush = _tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH); - - s.lookahead -= s.match_length; - - /* Insert new strings in the hash table only if the match length - * is not too large. This saves time but degrades compression. - */ - if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) { - s.match_length--; /* string at strstart already in table */ - do { - s.strstart++; - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]); - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - /* strstart never exceeds WSIZE-MAX_MATCH, so there are - * always MIN_MATCH bytes ahead. - */ - } while (--s.match_length !== 0); - s.strstart++; - } else - { - s.strstart += s.match_length; - s.match_length = 0; - s.ins_h = s.window[s.strstart]; - /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + 1]); - -//#if MIN_MATCH != 3 -// Call UPDATE_HASH() MIN_MATCH-3 more times -//#endif - /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not - * matter since it will be recomputed at next deflate call. - */ - } - } else { - /* No match, output a literal byte */ - //Tracevv((stderr,"%c", s.window[s.strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart]); - - s.lookahead--; - s.strstart++; - } - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1); - if (flush === Z_FINISH) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.sym_next) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_BLOCK_DONE; -}; - -/* =========================================================================== - * Same as above, but achieves better compression. We use a lazy - * evaluation for matches: a match is finally adopted only if there is - * no better match at the next window position. - */ -const deflate_slow = (s, flush) => { - - let hash_head; /* head of hash chain */ - let bflush; /* set if current block must be flushed */ - - let max_insert; - - /* Process the input block. */ - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s.lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { break; } /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = 0/*NIL*/; - if (s.lookahead >= MIN_MATCH) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]); - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - - /* Find the longest match, discarding those <= prev_length. - */ - s.prev_length = s.match_length; - s.prev_match = s.match_start; - s.match_length = MIN_MATCH - 1; - - if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match && - s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s.match_length = longest_match(s, hash_head); - /* longest_match() sets match_start */ - - if (s.match_length <= 5 && - (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) { - - /* If prev_match is also MIN_MATCH, match_start is garbage - * but we will ignore the current match anyway. - */ - s.match_length = MIN_MATCH - 1; - } - } - /* If there was a match at the previous step and the current - * match is not better, output the previous match: - */ - if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) { - max_insert = s.strstart + s.lookahead - MIN_MATCH; - /* Do not insert strings in hash table beyond this. */ - - //check_match(s, s.strstart-1, s.prev_match, s.prev_length); - - /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match, - s.prev_length - MIN_MATCH, bflush);***/ - bflush = _tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH); - /* Insert in hash table all strings up to the end of the match. - * strstart-1 and strstart are already inserted. If there is not - * enough lookahead, the last two strings are not inserted in - * the hash table. - */ - s.lookahead -= s.prev_length - 1; - s.prev_length -= 2; - do { - if (++s.strstart <= max_insert) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]); - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - } while (--s.prev_length !== 0); - s.match_available = 0; - s.match_length = MIN_MATCH - 1; - s.strstart++; - - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - - } else if (s.match_available) { - /* If there was no match at the previous position, output a - * single literal. If there was a match but the current match - * is longer, truncate the previous match to a single literal. - */ - //Tracevv((stderr,"%c", s->window[s->strstart-1])); - /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart - 1]); - - if (bflush) { - /*** FLUSH_BLOCK_ONLY(s, 0) ***/ - flush_block_only(s, false); - /***/ - } - s.strstart++; - s.lookahead--; - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - } else { - /* There is no previous match to compare with, wait for - * the next step to decide. - */ - s.match_available = 1; - s.strstart++; - s.lookahead--; - } - } - //Assert (flush != Z_NO_FLUSH, "no flush?"); - if (s.match_available) { - //Tracevv((stderr,"%c", s->window[s->strstart-1])); - /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart - 1]); - - s.match_available = 0; - } - s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1; - if (flush === Z_FINISH) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.sym_next) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - - return BS_BLOCK_DONE; -}; - - -/* =========================================================================== - * For Z_RLE, simply look for runs of bytes, generate matches only of distance - * one. Do not maintain a hash table. (It will be regenerated if this run of - * deflate switches away from Z_RLE.) - */ -const deflate_rle = (s, flush) => { - - let bflush; /* set if current block must be flushed */ - let prev; /* byte at distance one to match */ - let scan, strend; /* scan goes up to strend for length of run */ - - const _win = s.window; - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the longest run, plus one for the unrolled loop. - */ - if (s.lookahead <= MAX_MATCH) { - fill_window(s); - if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { break; } /* flush the current block */ - } - - /* See how many times the previous byte repeats */ - s.match_length = 0; - if (s.lookahead >= MIN_MATCH && s.strstart > 0) { - scan = s.strstart - 1; - prev = _win[scan]; - if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) { - strend = s.strstart + MAX_MATCH; - do { - /*jshint noempty:false*/ - } while (prev === _win[++scan] && prev === _win[++scan] && - prev === _win[++scan] && prev === _win[++scan] && - prev === _win[++scan] && prev === _win[++scan] && - prev === _win[++scan] && prev === _win[++scan] && - scan < strend); - s.match_length = MAX_MATCH - (strend - scan); - if (s.match_length > s.lookahead) { - s.match_length = s.lookahead; - } - } - //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); - } - - /* Emit match if have run of MIN_MATCH or longer, else emit literal */ - if (s.match_length >= MIN_MATCH) { - //check_match(s, s.strstart, s.strstart - 1, s.match_length); - - /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/ - bflush = _tr_tally(s, 1, s.match_length - MIN_MATCH); - - s.lookahead -= s.match_length; - s.strstart += s.match_length; - s.match_length = 0; - } else { - /* No match, output a literal byte */ - //Tracevv((stderr,"%c", s->window[s->strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart]); - - s.lookahead--; - s.strstart++; - } - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - s.insert = 0; - if (flush === Z_FINISH) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.sym_next) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_BLOCK_DONE; -}; - -/* =========================================================================== - * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. - * (It will be regenerated if this run of deflate switches away from Huffman.) - */ -const deflate_huff = (s, flush) => { - - let bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we have a literal to write. */ - if (s.lookahead === 0) { - fill_window(s); - if (s.lookahead === 0) { - if (flush === Z_NO_FLUSH) { - return BS_NEED_MORE; - } - break; /* flush the current block */ - } - } - - /* Output a literal byte */ - s.match_length = 0; - //Tracevv((stderr,"%c", s->window[s->strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = _tr_tally(s, 0, s.window[s.strstart]); - s.lookahead--; - s.strstart++; - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - s.insert = 0; - if (flush === Z_FINISH) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.sym_next) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_BLOCK_DONE; -}; - -/* Values for max_lazy_match, good_match and max_chain_length, depending on - * the desired pack level (0..9). The values given below have been tuned to - * exclude worst case performance for pathological files. Better values may be - * found for specific files. - */ -function Config(good_length, max_lazy, nice_length, max_chain, func) { - - this.good_length = good_length; - this.max_lazy = max_lazy; - this.nice_length = nice_length; - this.max_chain = max_chain; - this.func = func; -} - -const configuration_table = [ - /* good lazy nice chain */ - new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */ - new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */ - new Config(4, 5, 16, 8, deflate_fast), /* 2 */ - new Config(4, 6, 32, 32, deflate_fast), /* 3 */ - - new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */ - new Config(8, 16, 32, 32, deflate_slow), /* 5 */ - new Config(8, 16, 128, 128, deflate_slow), /* 6 */ - new Config(8, 32, 128, 256, deflate_slow), /* 7 */ - new Config(32, 128, 258, 1024, deflate_slow), /* 8 */ - new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */ -]; - - -/* =========================================================================== - * Initialize the "longest match" routines for a new zlib stream - */ -const lm_init = (s) => { - - s.window_size = 2 * s.w_size; - - /*** CLEAR_HASH(s); ***/ - zero(s.head); // Fill with NIL (= 0); - - /* Set the default configuration parameters: - */ - s.max_lazy_match = configuration_table[s.level].max_lazy; - s.good_match = configuration_table[s.level].good_length; - s.nice_match = configuration_table[s.level].nice_length; - s.max_chain_length = configuration_table[s.level].max_chain; - - s.strstart = 0; - s.block_start = 0; - s.lookahead = 0; - s.insert = 0; - s.match_length = s.prev_length = MIN_MATCH - 1; - s.match_available = 0; - s.ins_h = 0; -}; - - -function DeflateState() { - this.strm = null; /* pointer back to this zlib stream */ - this.status = 0; /* as the name implies */ - this.pending_buf = null; /* output still pending */ - this.pending_buf_size = 0; /* size of pending_buf */ - this.pending_out = 0; /* next pending byte to output to the stream */ - this.pending = 0; /* nb of bytes in the pending buffer */ - this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ - this.gzhead = null; /* gzip header information to write */ - this.gzindex = 0; /* where in extra, name, or comment */ - this.method = Z_DEFLATED; /* can only be DEFLATED */ - this.last_flush = -1; /* value of flush param for previous deflate call */ - - this.w_size = 0; /* LZ77 window size (32K by default) */ - this.w_bits = 0; /* log2(w_size) (8..16) */ - this.w_mask = 0; /* w_size - 1 */ - - this.window = null; - /* Sliding window. Input bytes are read into the second half of the window, - * and move to the first half later to keep a dictionary of at least wSize - * bytes. With this organization, matches are limited to a distance of - * wSize-MAX_MATCH bytes, but this ensures that IO is always - * performed with a length multiple of the block size. - */ - - this.window_size = 0; - /* Actual size of window: 2*wSize, except when the user input buffer - * is directly used as sliding window. - */ - - this.prev = null; - /* Link to older string with same hash index. To limit the size of this - * array to 64K, this link is maintained only for the last 32K strings. - * An index in this array is thus a window index modulo 32K. - */ - - this.head = null; /* Heads of the hash chains or NIL. */ - - this.ins_h = 0; /* hash index of string to be inserted */ - this.hash_size = 0; /* number of elements in hash table */ - this.hash_bits = 0; /* log2(hash_size) */ - this.hash_mask = 0; /* hash_size-1 */ - - this.hash_shift = 0; - /* Number of bits by which ins_h must be shifted at each input - * step. It must be such that after MIN_MATCH steps, the oldest - * byte no longer takes part in the hash key, that is: - * hash_shift * MIN_MATCH >= hash_bits - */ - - this.block_start = 0; - /* Window position at the beginning of the current output block. Gets - * negative when the window is moved backwards. - */ - - this.match_length = 0; /* length of best match */ - this.prev_match = 0; /* previous match */ - this.match_available = 0; /* set if previous match exists */ - this.strstart = 0; /* start of string to insert */ - this.match_start = 0; /* start of matching string */ - this.lookahead = 0; /* number of valid bytes ahead in window */ - - this.prev_length = 0; - /* Length of the best match at previous step. Matches not greater than this - * are discarded. This is used in the lazy match evaluation. - */ - - this.max_chain_length = 0; - /* To speed up deflation, hash chains are never searched beyond this - * length. A higher limit improves compression ratio but degrades the - * speed. - */ - - this.max_lazy_match = 0; - /* Attempt to find a better match only when the current match is strictly - * smaller than this value. This mechanism is used only for compression - * levels >= 4. - */ - // That's alias to max_lazy_match, don't use directly - //this.max_insert_length = 0; - /* Insert new strings in the hash table only if the match length is not - * greater than this length. This saves time but degrades compression. - * max_insert_length is used only for compression levels <= 3. - */ - - this.level = 0; /* compression level (1..9) */ - this.strategy = 0; /* favor or force Huffman coding*/ - - this.good_match = 0; - /* Use a faster search when the previous match is longer than this */ - - this.nice_match = 0; /* Stop searching when current match exceeds this */ - - /* used by trees.c: */ - - /* Didn't use ct_data typedef below to suppress compiler warning */ - - // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ - // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ - // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ - - // Use flat array of DOUBLE size, with interleaved fata, - // because JS does not support effective - this.dyn_ltree = new Uint16Array(HEAP_SIZE * 2); - this.dyn_dtree = new Uint16Array((2 * D_CODES + 1) * 2); - this.bl_tree = new Uint16Array((2 * BL_CODES + 1) * 2); - zero(this.dyn_ltree); - zero(this.dyn_dtree); - zero(this.bl_tree); - - this.l_desc = null; /* desc. for literal tree */ - this.d_desc = null; /* desc. for distance tree */ - this.bl_desc = null; /* desc. for bit length tree */ - - //ush bl_count[MAX_BITS+1]; - this.bl_count = new Uint16Array(MAX_BITS + 1); - /* number of codes at each bit length for an optimal tree */ - - //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ - this.heap = new Uint16Array(2 * L_CODES + 1); /* heap used to build the Huffman trees */ - zero(this.heap); - - this.heap_len = 0; /* number of elements in the heap */ - this.heap_max = 0; /* element of largest frequency */ - /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. - * The same heap array is used to build all trees. - */ - - this.depth = new Uint16Array(2 * L_CODES + 1); //uch depth[2*L_CODES+1]; - zero(this.depth); - /* Depth of each subtree used as tie breaker for trees of equal frequency - */ - - this.sym_buf = 0; /* buffer for distances and literals/lengths */ - - this.lit_bufsize = 0; - /* Size of match buffer for literals/lengths. There are 4 reasons for - * limiting lit_bufsize to 64K: - * - frequencies can be kept in 16 bit counters - * - if compression is not successful for the first block, all input - * data is still in the window so we can still emit a stored block even - * when input comes from standard input. (This can also be done for - * all blocks if lit_bufsize is not greater than 32K.) - * - if compression is not successful for a file smaller than 64K, we can - * even emit a stored file instead of a stored block (saving 5 bytes). - * This is applicable only for zip (not gzip or zlib). - * - creating new Huffman trees less frequently may not provide fast - * adaptation to changes in the input data statistics. (Take for - * example a binary file with poorly compressible code followed by - * a highly compressible string table.) Smaller buffer sizes give - * fast adaptation but have of course the overhead of transmitting - * trees more frequently. - * - I can't count above 4 - */ - - this.sym_next = 0; /* running index in sym_buf */ - this.sym_end = 0; /* symbol table full when sym_next reaches this */ - - this.opt_len = 0; /* bit length of current block with optimal trees */ - this.static_len = 0; /* bit length of current block with static trees */ - this.matches = 0; /* number of string matches in current block */ - this.insert = 0; /* bytes at end of window left to insert */ - - - this.bi_buf = 0; - /* Output buffer. bits are inserted starting at the bottom (least - * significant bits). - */ - this.bi_valid = 0; - /* Number of valid bits in bi_buf. All bits above the last valid bit - * are always zero. - */ - - // Used for window memory init. We safely ignore it for JS. That makes - // sense only for pointers and memory check tools. - //this.high_water = 0; - /* High water mark offset in window for initialized bytes -- bytes above - * this are set to zero in order to avoid memory check warnings when - * longest match routines access bytes past the input. This is then - * updated to the new high water mark. - */ -} - - -/* ========================================================================= - * Check for a valid deflate stream state. Return 0 if ok, 1 if not. - */ -const deflateStateCheck = (strm) => { - - if (!strm) { - return 1; - } - const s = strm.state; - if (!s || s.strm !== strm || (s.status !== INIT_STATE && -//#ifdef GZIP - s.status !== GZIP_STATE && -//#endif - s.status !== EXTRA_STATE && - s.status !== NAME_STATE && - s.status !== COMMENT_STATE && - s.status !== HCRC_STATE && - s.status !== BUSY_STATE && - s.status !== FINISH_STATE)) { - return 1; - } - return 0; -}; - - -const deflateResetKeep = (strm) => { - - if (deflateStateCheck(strm)) { - return err(strm, Z_STREAM_ERROR); - } - - strm.total_in = strm.total_out = 0; - strm.data_type = Z_UNKNOWN; - - const s = strm.state; - s.pending = 0; - s.pending_out = 0; - - if (s.wrap < 0) { - s.wrap = -s.wrap; - /* was made negative by deflate(..., Z_FINISH); */ - } - s.status = -//#ifdef GZIP - s.wrap === 2 ? GZIP_STATE : -//#endif - s.wrap ? INIT_STATE : BUSY_STATE; - strm.adler = (s.wrap === 2) ? - 0 // crc32(0, Z_NULL, 0) - : - 1; // adler32(0, Z_NULL, 0) - s.last_flush = -2; - _tr_init(s); - return Z_OK; -}; - - -const deflateReset = (strm) => { - - const ret = deflateResetKeep(strm); - if (ret === Z_OK) { - lm_init(strm.state); - } - return ret; -}; - - -const deflateSetHeader = (strm, head) => { - - if (deflateStateCheck(strm) || strm.state.wrap !== 2) { - return Z_STREAM_ERROR; - } - strm.state.gzhead = head; - return Z_OK; -}; - - -const deflateInit2 = (strm, level, method, windowBits, memLevel, strategy) => { - - if (!strm) { // === Z_NULL - return Z_STREAM_ERROR; - } - let wrap = 1; - - if (level === Z_DEFAULT_COMPRESSION) { - level = 6; - } - - if (windowBits < 0) { /* suppress zlib wrapper */ - wrap = 0; - windowBits = -windowBits; - } - - else if (windowBits > 15) { - wrap = 2; /* write gzip wrapper instead */ - windowBits -= 16; - } - - - if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED || - windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || - strategy < 0 || strategy > Z_FIXED || (windowBits === 8 && wrap !== 1)) { - return err(strm, Z_STREAM_ERROR); - } - - - if (windowBits === 8) { - windowBits = 9; - } - /* until 256-byte window bug fixed */ - - const s = new DeflateState(); - - strm.state = s; - s.strm = strm; - s.status = INIT_STATE; /* to pass state test in deflateReset() */ - - s.wrap = wrap; - s.gzhead = null; - s.w_bits = windowBits; - s.w_size = 1 << s.w_bits; - s.w_mask = s.w_size - 1; - - s.hash_bits = memLevel + 7; - s.hash_size = 1 << s.hash_bits; - s.hash_mask = s.hash_size - 1; - s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH); - - s.window = new Uint8Array(s.w_size * 2); - s.head = new Uint16Array(s.hash_size); - s.prev = new Uint16Array(s.w_size); - - // Don't need mem init magic for JS. - //s.high_water = 0; /* nothing written to s->window yet */ - - s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ - - /* We overlay pending_buf and sym_buf. This works since the average size - * for length/distance pairs over any compressed block is assured to be 31 - * bits or less. - * - * Analysis: The longest fixed codes are a length code of 8 bits plus 5 - * extra bits, for lengths 131 to 257. The longest fixed distance codes are - * 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest - * possible fixed-codes length/distance pair is then 31 bits total. - * - * sym_buf starts one-fourth of the way into pending_buf. So there are - * three bytes in sym_buf for every four bytes in pending_buf. Each symbol - * in sym_buf is three bytes -- two for the distance and one for the - * literal/length. As each symbol is consumed, the pointer to the next - * sym_buf value to read moves forward three bytes. From that symbol, up to - * 31 bits are written to pending_buf. The closest the written pending_buf - * bits gets to the next sym_buf symbol to read is just before the last - * code is written. At that time, 31*(n-2) bits have been written, just - * after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at - * 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1 - * symbols are written.) The closest the writing gets to what is unread is - * then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and - * can range from 128 to 32768. - * - * Therefore, at a minimum, there are 142 bits of space between what is - * written and what is read in the overlain buffers, so the symbols cannot - * be overwritten by the compressed data. That space is actually 139 bits, - * due to the three-bit fixed-code block header. - * - * That covers the case where either Z_FIXED is specified, forcing fixed - * codes, or when the use of fixed codes is chosen, because that choice - * results in a smaller compressed block than dynamic codes. That latter - * condition then assures that the above analysis also covers all dynamic - * blocks. A dynamic-code block will only be chosen to be emitted if it has - * fewer bits than a fixed-code block would for the same set of symbols. - * Therefore its average symbol length is assured to be less than 31. So - * the compressed data for a dynamic block also cannot overwrite the - * symbols from which it is being constructed. - */ - - s.pending_buf_size = s.lit_bufsize * 4; - s.pending_buf = new Uint8Array(s.pending_buf_size); - - // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`) - //s->sym_buf = s->pending_buf + s->lit_bufsize; - s.sym_buf = s.lit_bufsize; - - //s->sym_end = (s->lit_bufsize - 1) * 3; - s.sym_end = (s.lit_bufsize - 1) * 3; - /* We avoid equality with lit_bufsize*3 because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ - - s.level = level; - s.strategy = strategy; - s.method = method; - - return deflateReset(strm); -}; - -const deflateInit = (strm, level) => { - - return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY); -}; - - -/* ========================================================================= */ -const deflate = (strm, flush) => { - - if (deflateStateCheck(strm) || flush > Z_BLOCK || flush < 0) { - return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR; - } - - const s = strm.state; - - if (!strm.output || - (strm.avail_in !== 0 && !strm.input) || - (s.status === FINISH_STATE && flush !== Z_FINISH)) { - return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR); - } - - const old_flush = s.last_flush; - s.last_flush = flush; - - /* Flush as much pending output as possible */ - if (s.pending !== 0) { - flush_pending(strm); - if (strm.avail_out === 0) { - /* Since avail_out is 0, deflate will be called again with - * more output space, but possibly with both pending and - * avail_in equal to zero. There won't be anything to do, - * but this is not an error situation so make sure we - * return OK instead of BUF_ERROR at next call of deflate: - */ - s.last_flush = -1; - return Z_OK; - } - - /* Make sure there is something to do and avoid duplicate consecutive - * flushes. For repeated and useless calls with Z_FINISH, we keep - * returning Z_STREAM_END instead of Z_BUF_ERROR. - */ - } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) && - flush !== Z_FINISH) { - return err(strm, Z_BUF_ERROR); - } - - /* User must not provide more input after the first FINISH: */ - if (s.status === FINISH_STATE && strm.avail_in !== 0) { - return err(strm, Z_BUF_ERROR); - } - - /* Write the header */ - if (s.status === INIT_STATE && s.wrap === 0) { - s.status = BUSY_STATE; - } - if (s.status === INIT_STATE) { - /* zlib header */ - let header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8; - let level_flags = -1; - - if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) { - level_flags = 0; - } else if (s.level < 6) { - level_flags = 1; - } else if (s.level === 6) { - level_flags = 2; - } else { - level_flags = 3; - } - header |= (level_flags << 6); - if (s.strstart !== 0) { header |= PRESET_DICT; } - header += 31 - (header % 31); - - putShortMSB(s, header); - - /* Save the adler32 of the preset dictionary: */ - if (s.strstart !== 0) { - putShortMSB(s, strm.adler >>> 16); - putShortMSB(s, strm.adler & 0xffff); - } - strm.adler = 1; // adler32(0L, Z_NULL, 0); - s.status = BUSY_STATE; - - /* Compression must start with an empty pending buffer */ - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK; - } - } -//#ifdef GZIP - if (s.status === GZIP_STATE) { - /* gzip header */ - strm.adler = 0; //crc32(0L, Z_NULL, 0); - put_byte(s, 31); - put_byte(s, 139); - put_byte(s, 8); - if (!s.gzhead) { // s->gzhead == Z_NULL - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, s.level === 9 ? 2 : - (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? - 4 : 0)); - put_byte(s, OS_CODE); - s.status = BUSY_STATE; - - /* Compression must start with an empty pending buffer */ - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK; - } - } - else { - put_byte(s, (s.gzhead.text ? 1 : 0) + - (s.gzhead.hcrc ? 2 : 0) + - (!s.gzhead.extra ? 0 : 4) + - (!s.gzhead.name ? 0 : 8) + - (!s.gzhead.comment ? 0 : 16) - ); - put_byte(s, s.gzhead.time & 0xff); - put_byte(s, (s.gzhead.time >> 8) & 0xff); - put_byte(s, (s.gzhead.time >> 16) & 0xff); - put_byte(s, (s.gzhead.time >> 24) & 0xff); - put_byte(s, s.level === 9 ? 2 : - (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? - 4 : 0)); - put_byte(s, s.gzhead.os & 0xff); - if (s.gzhead.extra && s.gzhead.extra.length) { - put_byte(s, s.gzhead.extra.length & 0xff); - put_byte(s, (s.gzhead.extra.length >> 8) & 0xff); - } - if (s.gzhead.hcrc) { - strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0); - } - s.gzindex = 0; - s.status = EXTRA_STATE; - } - } - if (s.status === EXTRA_STATE) { - if (s.gzhead.extra/* != Z_NULL*/) { - let beg = s.pending; /* start of bytes to update crc */ - let left = (s.gzhead.extra.length & 0xffff) - s.gzindex; - while (s.pending + left > s.pending_buf_size) { - let copy = s.pending_buf_size - s.pending; - // zmemcpy(s.pending_buf + s.pending, - // s.gzhead.extra + s.gzindex, copy); - s.pending_buf.set(s.gzhead.extra.subarray(s.gzindex, s.gzindex + copy), s.pending); - s.pending = s.pending_buf_size; - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); - } - //---// - s.gzindex += copy; - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK; - } - beg = 0; - left -= copy; - } - // JS specific: s.gzhead.extra may be TypedArray or Array for backward compatibility - // TypedArray.slice and TypedArray.from don't exist in IE10-IE11 - let gzhead_extra = new Uint8Array(s.gzhead.extra); - // zmemcpy(s->pending_buf + s->pending, - // s->gzhead->extra + s->gzindex, left); - s.pending_buf.set(gzhead_extra.subarray(s.gzindex, s.gzindex + left), s.pending); - s.pending += left; - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); - } - //---// - s.gzindex = 0; - } - s.status = NAME_STATE; - } - if (s.status === NAME_STATE) { - if (s.gzhead.name/* != Z_NULL*/) { - let beg = s.pending; /* start of bytes to update crc */ - let val; - do { - if (s.pending === s.pending_buf_size) { - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); - } - //---// - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK; - } - beg = 0; - } - // JS specific: little magic to add zero terminator to end of string - if (s.gzindex < s.gzhead.name.length) { - val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff; - } else { - val = 0; - } - put_byte(s, val); - } while (val !== 0); - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); - } - //---// - s.gzindex = 0; - } - s.status = COMMENT_STATE; - } - if (s.status === COMMENT_STATE) { - if (s.gzhead.comment/* != Z_NULL*/) { - let beg = s.pending; /* start of bytes to update crc */ - let val; - do { - if (s.pending === s.pending_buf_size) { - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); - } - //---// - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK; - } - beg = 0; - } - // JS specific: little magic to add zero terminator to end of string - if (s.gzindex < s.gzhead.comment.length) { - val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff; - } else { - val = 0; - } - put_byte(s, val); - } while (val !== 0); - //--- HCRC_UPDATE(beg) ---// - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); - } - //---// - } - s.status = HCRC_STATE; - } - if (s.status === HCRC_STATE) { - if (s.gzhead.hcrc) { - if (s.pending + 2 > s.pending_buf_size) { - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK; - } - } - put_byte(s, strm.adler & 0xff); - put_byte(s, (strm.adler >> 8) & 0xff); - strm.adler = 0; //crc32(0L, Z_NULL, 0); - } - s.status = BUSY_STATE; - - /* Compression must start with an empty pending buffer */ - flush_pending(strm); - if (s.pending !== 0) { - s.last_flush = -1; - return Z_OK; - } - } -//#endif - - /* Start a new block or continue the current one. - */ - if (strm.avail_in !== 0 || s.lookahead !== 0 || - (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) { - let bstate = s.level === 0 ? deflate_stored(s, flush) : - s.strategy === Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : - s.strategy === Z_RLE ? deflate_rle(s, flush) : - configuration_table[s.level].func(s, flush); - - if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) { - s.status = FINISH_STATE; - } - if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) { - if (strm.avail_out === 0) { - s.last_flush = -1; - /* avoid BUF_ERROR next call, see above */ - } - return Z_OK; - /* If flush != Z_NO_FLUSH && avail_out == 0, the next call - * of deflate should use the same flush parameter to make sure - * that the flush is complete. So we don't have to output an - * empty block here, this will be done at next call. This also - * ensures that for a very small output buffer, we emit at most - * one empty block. - */ - } - if (bstate === BS_BLOCK_DONE) { - if (flush === Z_PARTIAL_FLUSH) { - _tr_align(s); - } - else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ - - _tr_stored_block(s, 0, 0, false); - /* For a full flush, this empty block will be recognized - * as a special marker by inflate_sync(). - */ - if (flush === Z_FULL_FLUSH) { - /*** CLEAR_HASH(s); ***/ /* forget history */ - zero(s.head); // Fill with NIL (= 0); - - if (s.lookahead === 0) { - s.strstart = 0; - s.block_start = 0; - s.insert = 0; - } - } - } - flush_pending(strm); - if (strm.avail_out === 0) { - s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */ - return Z_OK; - } - } - } - - if (flush !== Z_FINISH) { return Z_OK; } - if (s.wrap <= 0) { return Z_STREAM_END; } - - /* Write the trailer */ - if (s.wrap === 2) { - put_byte(s, strm.adler & 0xff); - put_byte(s, (strm.adler >> 8) & 0xff); - put_byte(s, (strm.adler >> 16) & 0xff); - put_byte(s, (strm.adler >> 24) & 0xff); - put_byte(s, strm.total_in & 0xff); - put_byte(s, (strm.total_in >> 8) & 0xff); - put_byte(s, (strm.total_in >> 16) & 0xff); - put_byte(s, (strm.total_in >> 24) & 0xff); - } - else - { - putShortMSB(s, strm.adler >>> 16); - putShortMSB(s, strm.adler & 0xffff); - } - - flush_pending(strm); - /* If avail_out is zero, the application will call deflate again - * to flush the rest. - */ - if (s.wrap > 0) { s.wrap = -s.wrap; } - /* write the trailer only once! */ - return s.pending !== 0 ? Z_OK : Z_STREAM_END; -}; - - -const deflateEnd = (strm) => { - - if (deflateStateCheck(strm)) { - return Z_STREAM_ERROR; - } - - const status = strm.state.status; - - strm.state = null; - - return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK; -}; - - -/* ========================================================================= - * Initializes the compression dictionary from the given byte - * sequence without producing any compressed output. - */ -const deflateSetDictionary = (strm, dictionary) => { - - let dictLength = dictionary.length; - - if (deflateStateCheck(strm)) { - return Z_STREAM_ERROR; - } - - const s = strm.state; - const wrap = s.wrap; - - if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) { - return Z_STREAM_ERROR; - } - - /* when using zlib wrappers, compute Adler-32 for provided dictionary */ - if (wrap === 1) { - /* adler32(strm->adler, dictionary, dictLength); */ - strm.adler = adler32(strm.adler, dictionary, dictLength, 0); - } - - s.wrap = 0; /* avoid computing Adler-32 in read_buf */ - - /* if dictionary would fill window, just replace the history */ - if (dictLength >= s.w_size) { - if (wrap === 0) { /* already empty otherwise */ - /*** CLEAR_HASH(s); ***/ - zero(s.head); // Fill with NIL (= 0); - s.strstart = 0; - s.block_start = 0; - s.insert = 0; - } - /* use the tail */ - // dictionary = dictionary.slice(dictLength - s.w_size); - let tmpDict = new Uint8Array(s.w_size); - tmpDict.set(dictionary.subarray(dictLength - s.w_size, dictLength), 0); - dictionary = tmpDict; - dictLength = s.w_size; - } - /* insert dictionary into window and hash */ - const avail = strm.avail_in; - const next = strm.next_in; - const input = strm.input; - strm.avail_in = dictLength; - strm.next_in = 0; - strm.input = dictionary; - fill_window(s); - while (s.lookahead >= MIN_MATCH) { - let str = s.strstart; - let n = s.lookahead - (MIN_MATCH - 1); - do { - /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ - s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]); - - s.prev[str & s.w_mask] = s.head[s.ins_h]; - - s.head[s.ins_h] = str; - str++; - } while (--n); - s.strstart = str; - s.lookahead = MIN_MATCH - 1; - fill_window(s); - } - s.strstart += s.lookahead; - s.block_start = s.strstart; - s.insert = s.lookahead; - s.lookahead = 0; - s.match_length = s.prev_length = MIN_MATCH - 1; - s.match_available = 0; - strm.next_in = next; - strm.input = input; - strm.avail_in = avail; - s.wrap = wrap; - return Z_OK; -}; - - -module.exports.deflateInit = deflateInit; -module.exports.deflateInit2 = deflateInit2; -module.exports.deflateReset = deflateReset; -module.exports.deflateResetKeep = deflateResetKeep; -module.exports.deflateSetHeader = deflateSetHeader; -module.exports.deflate = deflate; -module.exports.deflateEnd = deflateEnd; -module.exports.deflateSetDictionary = deflateSetDictionary; -module.exports.deflateInfo = 'pako deflate (from Nodeca project)'; - -/* Not implemented -module.exports.deflateBound = deflateBound; -module.exports.deflateCopy = deflateCopy; -module.exports.deflateGetDictionary = deflateGetDictionary; -module.exports.deflateParams = deflateParams; -module.exports.deflatePending = deflatePending; -module.exports.deflatePrime = deflatePrime; -module.exports.deflateTune = deflateTune; -*/ diff --git a/node_modules/pako/lib/zlib/gzheader.js b/node_modules/pako/lib/zlib/gzheader.js deleted file mode 100644 index 9582cba..0000000 --- a/node_modules/pako/lib/zlib/gzheader.js +++ /dev/null @@ -1,58 +0,0 @@ -'use strict'; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -function GZheader() { - /* true if compressed data believed to be text */ - this.text = 0; - /* modification time */ - this.time = 0; - /* extra flags (not used when writing a gzip file) */ - this.xflags = 0; - /* operating system */ - this.os = 0; - /* pointer to extra field or Z_NULL if none */ - this.extra = null; - /* extra field length (valid if extra != Z_NULL) */ - this.extra_len = 0; // Actually, we don't need it in JS, - // but leave for few code modifications - - // - // Setup limits is not necessary because in js we should not preallocate memory - // for inflate use constant limit in 65536 bytes - // - - /* space at extra (only when reading header) */ - // this.extra_max = 0; - /* pointer to zero-terminated file name or Z_NULL */ - this.name = ''; - /* space at name (only when reading header) */ - // this.name_max = 0; - /* pointer to zero-terminated comment or Z_NULL */ - this.comment = ''; - /* space at comment (only when reading header) */ - // this.comm_max = 0; - /* true if there was or will be a header crc */ - this.hcrc = 0; - /* true when done reading gzip header (not used when writing a gzip file) */ - this.done = false; -} - -module.exports = GZheader; diff --git a/node_modules/pako/lib/zlib/inffast.js b/node_modules/pako/lib/zlib/inffast.js deleted file mode 100644 index f4d6e7e..0000000 --- a/node_modules/pako/lib/zlib/inffast.js +++ /dev/null @@ -1,344 +0,0 @@ -'use strict'; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -// See state defs from inflate.js -const BAD = 16209; /* got a data error -- remain here until reset */ -const TYPE = 16191; /* i: waiting for type bits, including last-flag bit */ - -/* - Decode literal, length, and distance codes and write out the resulting - literal and match bytes until either not enough input or output is - available, an end-of-block is encountered, or a data error is encountered. - When large enough input and output buffers are supplied to inflate(), for - example, a 16K input buffer and a 64K output buffer, more than 95% of the - inflate execution time is spent in this routine. - - Entry assumptions: - - state.mode === LEN - strm.avail_in >= 6 - strm.avail_out >= 258 - start >= strm.avail_out - state.bits < 8 - - On return, state.mode is one of: - - LEN -- ran out of enough output space or enough available input - TYPE -- reached end of block code, inflate() to interpret next block - BAD -- error in block data - - Notes: - - - The maximum input bits used by a length/distance pair is 15 bits for the - length code, 5 bits for the length extra, 15 bits for the distance code, - and 13 bits for the distance extra. This totals 48 bits, or six bytes. - Therefore if strm.avail_in >= 6, then there is enough input to avoid - checking for available input while decoding. - - - The maximum bytes that a single length/distance pair can output is 258 - bytes, which is the maximum length that can be coded. inflate_fast() - requires strm.avail_out >= 258 for each loop to avoid checking for - output space. - */ -module.exports = function inflate_fast(strm, start) { - let _in; /* local strm.input */ - let last; /* have enough input while in < last */ - let _out; /* local strm.output */ - let beg; /* inflate()'s initial strm.output */ - let end; /* while out < end, enough space available */ -//#ifdef INFLATE_STRICT - let dmax; /* maximum distance from zlib header */ -//#endif - let wsize; /* window size or zero if not using window */ - let whave; /* valid bytes in the window */ - let wnext; /* window write index */ - // Use `s_window` instead `window`, avoid conflict with instrumentation tools - let s_window; /* allocated sliding window, if wsize != 0 */ - let hold; /* local strm.hold */ - let bits; /* local strm.bits */ - let lcode; /* local strm.lencode */ - let dcode; /* local strm.distcode */ - let lmask; /* mask for first level of length codes */ - let dmask; /* mask for first level of distance codes */ - let here; /* retrieved table entry */ - let op; /* code bits, operation, extra bits, or */ - /* window position, window bytes to copy */ - let len; /* match length, unused bytes */ - let dist; /* match distance */ - let from; /* where to copy match from */ - let from_source; - - - let input, output; // JS specific, because we have no pointers - - /* copy state to local variables */ - const state = strm.state; - //here = state.here; - _in = strm.next_in; - input = strm.input; - last = _in + (strm.avail_in - 5); - _out = strm.next_out; - output = strm.output; - beg = _out - (start - strm.avail_out); - end = _out + (strm.avail_out - 257); -//#ifdef INFLATE_STRICT - dmax = state.dmax; -//#endif - wsize = state.wsize; - whave = state.whave; - wnext = state.wnext; - s_window = state.window; - hold = state.hold; - bits = state.bits; - lcode = state.lencode; - dcode = state.distcode; - lmask = (1 << state.lenbits) - 1; - dmask = (1 << state.distbits) - 1; - - - /* decode literals and length/distances until end-of-block or not enough - input data or output space */ - - top: - do { - if (bits < 15) { - hold += input[_in++] << bits; - bits += 8; - hold += input[_in++] << bits; - bits += 8; - } - - here = lcode[hold & lmask]; - - dolen: - for (;;) { // Goto emulation - op = here >>> 24/*here.bits*/; - hold >>>= op; - bits -= op; - op = (here >>> 16) & 0xff/*here.op*/; - if (op === 0) { /* literal */ - //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - // "inflate: literal '%c'\n" : - // "inflate: literal 0x%02x\n", here.val)); - output[_out++] = here & 0xffff/*here.val*/; - } - else if (op & 16) { /* length base */ - len = here & 0xffff/*here.val*/; - op &= 15; /* number of extra bits */ - if (op) { - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - } - len += hold & ((1 << op) - 1); - hold >>>= op; - bits -= op; - } - //Tracevv((stderr, "inflate: length %u\n", len)); - if (bits < 15) { - hold += input[_in++] << bits; - bits += 8; - hold += input[_in++] << bits; - bits += 8; - } - here = dcode[hold & dmask]; - - dodist: - for (;;) { // goto emulation - op = here >>> 24/*here.bits*/; - hold >>>= op; - bits -= op; - op = (here >>> 16) & 0xff/*here.op*/; - - if (op & 16) { /* distance base */ - dist = here & 0xffff/*here.val*/; - op &= 15; /* number of extra bits */ - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - } - } - dist += hold & ((1 << op) - 1); -//#ifdef INFLATE_STRICT - if (dist > dmax) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break top; - } -//#endif - hold >>>= op; - bits -= op; - //Tracevv((stderr, "inflate: distance %u\n", dist)); - op = _out - beg; /* max distance in output */ - if (dist > op) { /* see if copy from window */ - op = dist - op; /* distance back in window */ - if (op > whave) { - if (state.sane) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break top; - } - -// (!) This block is disabled in zlib defaults, -// don't enable it for binary compatibility -//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR -// if (len <= op - whave) { -// do { -// output[_out++] = 0; -// } while (--len); -// continue top; -// } -// len -= op - whave; -// do { -// output[_out++] = 0; -// } while (--op > whave); -// if (op === 0) { -// from = _out - dist; -// do { -// output[_out++] = output[from++]; -// } while (--len); -// continue top; -// } -//#endif - } - from = 0; // window index - from_source = s_window; - if (wnext === 0) { /* very common case */ - from += wsize - op; - if (op < len) { /* some from window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - else if (wnext < op) { /* wrap around window */ - from += wsize + wnext - op; - op -= wnext; - if (op < len) { /* some from end of window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = 0; - if (wnext < len) { /* some from start of window */ - op = wnext; - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - } - else { /* contiguous in window */ - from += wnext - op; - if (op < len) { /* some from window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - while (len > 2) { - output[_out++] = from_source[from++]; - output[_out++] = from_source[from++]; - output[_out++] = from_source[from++]; - len -= 3; - } - if (len) { - output[_out++] = from_source[from++]; - if (len > 1) { - output[_out++] = from_source[from++]; - } - } - } - else { - from = _out - dist; /* copy direct from output */ - do { /* minimum length is three */ - output[_out++] = output[from++]; - output[_out++] = output[from++]; - output[_out++] = output[from++]; - len -= 3; - } while (len > 2); - if (len) { - output[_out++] = output[from++]; - if (len > 1) { - output[_out++] = output[from++]; - } - } - } - } - else if ((op & 64) === 0) { /* 2nd level distance code */ - here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))]; - continue dodist; - } - else { - strm.msg = 'invalid distance code'; - state.mode = BAD; - break top; - } - - break; // need to emulate goto via "continue" - } - } - else if ((op & 64) === 0) { /* 2nd level length code */ - here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))]; - continue dolen; - } - else if (op & 32) { /* end-of-block */ - //Tracevv((stderr, "inflate: end of block\n")); - state.mode = TYPE; - break top; - } - else { - strm.msg = 'invalid literal/length code'; - state.mode = BAD; - break top; - } - - break; // need to emulate goto via "continue" - } - } while (_in < last && _out < end); - - /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ - len = bits >> 3; - _in -= len; - bits -= len << 3; - hold &= (1 << bits) - 1; - - /* update state and return */ - strm.next_in = _in; - strm.next_out = _out; - strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last)); - strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end)); - state.hold = hold; - state.bits = bits; - return; -}; diff --git a/node_modules/pako/lib/zlib/inflate.js b/node_modules/pako/lib/zlib/inflate.js deleted file mode 100644 index f5db4be..0000000 --- a/node_modules/pako/lib/zlib/inflate.js +++ /dev/null @@ -1,1572 +0,0 @@ -'use strict'; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -const adler32 = require('./adler32'); -const crc32 = require('./crc32'); -const inflate_fast = require('./inffast'); -const inflate_table = require('./inftrees'); - -const CODES = 0; -const LENS = 1; -const DISTS = 2; - -/* Public constants ==========================================================*/ -/* ===========================================================================*/ - -const { - Z_FINISH, Z_BLOCK, Z_TREES, - Z_OK, Z_STREAM_END, Z_NEED_DICT, Z_STREAM_ERROR, Z_DATA_ERROR, Z_MEM_ERROR, Z_BUF_ERROR, - Z_DEFLATED -} = require('./constants'); - - -/* STATES ====================================================================*/ -/* ===========================================================================*/ - - -const HEAD = 16180; /* i: waiting for magic header */ -const FLAGS = 16181; /* i: waiting for method and flags (gzip) */ -const TIME = 16182; /* i: waiting for modification time (gzip) */ -const OS = 16183; /* i: waiting for extra flags and operating system (gzip) */ -const EXLEN = 16184; /* i: waiting for extra length (gzip) */ -const EXTRA = 16185; /* i: waiting for extra bytes (gzip) */ -const NAME = 16186; /* i: waiting for end of file name (gzip) */ -const COMMENT = 16187; /* i: waiting for end of comment (gzip) */ -const HCRC = 16188; /* i: waiting for header crc (gzip) */ -const DICTID = 16189; /* i: waiting for dictionary check value */ -const DICT = 16190; /* waiting for inflateSetDictionary() call */ -const TYPE = 16191; /* i: waiting for type bits, including last-flag bit */ -const TYPEDO = 16192; /* i: same, but skip check to exit inflate on new block */ -const STORED = 16193; /* i: waiting for stored size (length and complement) */ -const COPY_ = 16194; /* i/o: same as COPY below, but only first time in */ -const COPY = 16195; /* i/o: waiting for input or output to copy stored block */ -const TABLE = 16196; /* i: waiting for dynamic block table lengths */ -const LENLENS = 16197; /* i: waiting for code length code lengths */ -const CODELENS = 16198; /* i: waiting for length/lit and distance code lengths */ -const LEN_ = 16199; /* i: same as LEN below, but only first time in */ -const LEN = 16200; /* i: waiting for length/lit/eob code */ -const LENEXT = 16201; /* i: waiting for length extra bits */ -const DIST = 16202; /* i: waiting for distance code */ -const DISTEXT = 16203; /* i: waiting for distance extra bits */ -const MATCH = 16204; /* o: waiting for output space to copy string */ -const LIT = 16205; /* o: waiting for output space to write literal */ -const CHECK = 16206; /* i: waiting for 32-bit check value */ -const LENGTH = 16207; /* i: waiting for 32-bit length (gzip) */ -const DONE = 16208; /* finished check, done -- remain here until reset */ -const BAD = 16209; /* got a data error -- remain here until reset */ -const MEM = 16210; /* got an inflate() memory error -- remain here until reset */ -const SYNC = 16211; /* looking for synchronization bytes to restart inflate() */ - -/* ===========================================================================*/ - - - -const ENOUGH_LENS = 852; -const ENOUGH_DISTS = 592; -//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); - -const MAX_WBITS = 15; -/* 32K LZ77 window */ -const DEF_WBITS = MAX_WBITS; - - -const zswap32 = (q) => { - - return (((q >>> 24) & 0xff) + - ((q >>> 8) & 0xff00) + - ((q & 0xff00) << 8) + - ((q & 0xff) << 24)); -}; - - -function InflateState() { - this.strm = null; /* pointer back to this zlib stream */ - this.mode = 0; /* current inflate mode */ - this.last = false; /* true if processing last block */ - this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip, - bit 2 true to validate check value */ - this.havedict = false; /* true if dictionary provided */ - this.flags = 0; /* gzip header method and flags (0 if zlib), or - -1 if raw or no header yet */ - this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */ - this.check = 0; /* protected copy of check value */ - this.total = 0; /* protected copy of output count */ - // TODO: may be {} - this.head = null; /* where to save gzip header information */ - - /* sliding window */ - this.wbits = 0; /* log base 2 of requested window size */ - this.wsize = 0; /* window size or zero if not using window */ - this.whave = 0; /* valid bytes in the window */ - this.wnext = 0; /* window write index */ - this.window = null; /* allocated sliding window, if needed */ - - /* bit accumulator */ - this.hold = 0; /* input bit accumulator */ - this.bits = 0; /* number of bits in "in" */ - - /* for string and stored block copying */ - this.length = 0; /* literal or length of data to copy */ - this.offset = 0; /* distance back to copy string from */ - - /* for table and code decoding */ - this.extra = 0; /* extra bits needed */ - - /* fixed and dynamic code tables */ - this.lencode = null; /* starting table for length/literal codes */ - this.distcode = null; /* starting table for distance codes */ - this.lenbits = 0; /* index bits for lencode */ - this.distbits = 0; /* index bits for distcode */ - - /* dynamic table building */ - this.ncode = 0; /* number of code length code lengths */ - this.nlen = 0; /* number of length code lengths */ - this.ndist = 0; /* number of distance code lengths */ - this.have = 0; /* number of code lengths in lens[] */ - this.next = null; /* next available space in codes[] */ - - this.lens = new Uint16Array(320); /* temporary storage for code lengths */ - this.work = new Uint16Array(288); /* work area for code table building */ - - /* - because we don't have pointers in js, we use lencode and distcode directly - as buffers so we don't need codes - */ - //this.codes = new Int32Array(ENOUGH); /* space for code tables */ - this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */ - this.distdyn = null; /* dynamic table for distance codes (JS specific) */ - this.sane = 0; /* if false, allow invalid distance too far */ - this.back = 0; /* bits back of last unprocessed length/lit */ - this.was = 0; /* initial length of match */ -} - - -const inflateStateCheck = (strm) => { - - if (!strm) { - return 1; - } - const state = strm.state; - if (!state || state.strm !== strm || - state.mode < HEAD || state.mode > SYNC) { - return 1; - } - return 0; -}; - - -const inflateResetKeep = (strm) => { - - if (inflateStateCheck(strm)) { return Z_STREAM_ERROR; } - const state = strm.state; - strm.total_in = strm.total_out = state.total = 0; - strm.msg = ''; /*Z_NULL*/ - if (state.wrap) { /* to support ill-conceived Java test suite */ - strm.adler = state.wrap & 1; - } - state.mode = HEAD; - state.last = 0; - state.havedict = 0; - state.flags = -1; - state.dmax = 32768; - state.head = null/*Z_NULL*/; - state.hold = 0; - state.bits = 0; - //state.lencode = state.distcode = state.next = state.codes; - state.lencode = state.lendyn = new Int32Array(ENOUGH_LENS); - state.distcode = state.distdyn = new Int32Array(ENOUGH_DISTS); - - state.sane = 1; - state.back = -1; - //Tracev((stderr, "inflate: reset\n")); - return Z_OK; -}; - - -const inflateReset = (strm) => { - - if (inflateStateCheck(strm)) { return Z_STREAM_ERROR; } - const state = strm.state; - state.wsize = 0; - state.whave = 0; - state.wnext = 0; - return inflateResetKeep(strm); - -}; - - -const inflateReset2 = (strm, windowBits) => { - let wrap; - - /* get the state */ - if (inflateStateCheck(strm)) { return Z_STREAM_ERROR; } - const state = strm.state; - - /* extract wrap request from windowBits parameter */ - if (windowBits < 0) { - wrap = 0; - windowBits = -windowBits; - } - else { - wrap = (windowBits >> 4) + 5; - if (windowBits < 48) { - windowBits &= 15; - } - } - - /* set number of window bits, free window if different */ - if (windowBits && (windowBits < 8 || windowBits > 15)) { - return Z_STREAM_ERROR; - } - if (state.window !== null && state.wbits !== windowBits) { - state.window = null; - } - - /* update state and reset the rest of it */ - state.wrap = wrap; - state.wbits = windowBits; - return inflateReset(strm); -}; - - -const inflateInit2 = (strm, windowBits) => { - - if (!strm) { return Z_STREAM_ERROR; } - //strm.msg = Z_NULL; /* in case we return an error */ - - const state = new InflateState(); - - //if (state === Z_NULL) return Z_MEM_ERROR; - //Tracev((stderr, "inflate: allocated\n")); - strm.state = state; - state.strm = strm; - state.window = null/*Z_NULL*/; - state.mode = HEAD; /* to pass state test in inflateReset2() */ - const ret = inflateReset2(strm, windowBits); - if (ret !== Z_OK) { - strm.state = null/*Z_NULL*/; - } - return ret; -}; - - -const inflateInit = (strm) => { - - return inflateInit2(strm, DEF_WBITS); -}; - - -/* - Return state with length and distance decoding tables and index sizes set to - fixed code decoding. Normally this returns fixed tables from inffixed.h. - If BUILDFIXED is defined, then instead this routine builds the tables the - first time it's called, and returns those tables the first time and - thereafter. This reduces the size of the code by about 2K bytes, in - exchange for a little execution time. However, BUILDFIXED should not be - used for threaded applications, since the rewriting of the tables and virgin - may not be thread-safe. - */ -let virgin = true; - -let lenfix, distfix; // We have no pointers in JS, so keep tables separate - - -const fixedtables = (state) => { - - /* build fixed huffman tables if first call (may not be thread safe) */ - if (virgin) { - lenfix = new Int32Array(512); - distfix = new Int32Array(32); - - /* literal/length table */ - let sym = 0; - while (sym < 144) { state.lens[sym++] = 8; } - while (sym < 256) { state.lens[sym++] = 9; } - while (sym < 280) { state.lens[sym++] = 7; } - while (sym < 288) { state.lens[sym++] = 8; } - - inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 }); - - /* distance table */ - sym = 0; - while (sym < 32) { state.lens[sym++] = 5; } - - inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 }); - - /* do this just once */ - virgin = false; - } - - state.lencode = lenfix; - state.lenbits = 9; - state.distcode = distfix; - state.distbits = 5; -}; - - -/* - Update the window with the last wsize (normally 32K) bytes written before - returning. If window does not exist yet, create it. This is only called - when a window is already in use, or when output has been written during this - inflate call, but the end of the deflate stream has not been reached yet. - It is also called to create a window for dictionary data when a dictionary - is loaded. - - Providing output buffers larger than 32K to inflate() should provide a speed - advantage, since only the last 32K of output is copied to the sliding window - upon return from inflate(), and since all distances after the first 32K of - output will fall in the output data, making match copies simpler and faster. - The advantage may be dependent on the size of the processor's data caches. - */ -const updatewindow = (strm, src, end, copy) => { - - let dist; - const state = strm.state; - - /* if it hasn't been done already, allocate space for the window */ - if (state.window === null) { - state.wsize = 1 << state.wbits; - state.wnext = 0; - state.whave = 0; - - state.window = new Uint8Array(state.wsize); - } - - /* copy state->wsize or less output bytes into the circular window */ - if (copy >= state.wsize) { - state.window.set(src.subarray(end - state.wsize, end), 0); - state.wnext = 0; - state.whave = state.wsize; - } - else { - dist = state.wsize - state.wnext; - if (dist > copy) { - dist = copy; - } - //zmemcpy(state->window + state->wnext, end - copy, dist); - state.window.set(src.subarray(end - copy, end - copy + dist), state.wnext); - copy -= dist; - if (copy) { - //zmemcpy(state->window, end - copy, copy); - state.window.set(src.subarray(end - copy, end), 0); - state.wnext = copy; - state.whave = state.wsize; - } - else { - state.wnext += dist; - if (state.wnext === state.wsize) { state.wnext = 0; } - if (state.whave < state.wsize) { state.whave += dist; } - } - } - return 0; -}; - - -const inflate = (strm, flush) => { - - let state; - let input, output; // input/output buffers - let next; /* next input INDEX */ - let put; /* next output INDEX */ - let have, left; /* available input and output */ - let hold; /* bit buffer */ - let bits; /* bits in bit buffer */ - let _in, _out; /* save starting available input and output */ - let copy; /* number of stored or match bytes to copy */ - let from; /* where to copy match bytes from */ - let from_source; - let here = 0; /* current decoding table entry */ - let here_bits, here_op, here_val; // paked "here" denormalized (JS specific) - //let last; /* parent table entry */ - let last_bits, last_op, last_val; // paked "last" denormalized (JS specific) - let len; /* length to copy for repeats, bits to drop */ - let ret; /* return code */ - const hbuf = new Uint8Array(4); /* buffer for gzip header crc calculation */ - let opts; - - let n; // temporary variable for NEED_BITS - - const order = /* permutation of code lengths */ - new Uint8Array([ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]); - - - if (inflateStateCheck(strm) || !strm.output || - (!strm.input && strm.avail_in !== 0)) { - return Z_STREAM_ERROR; - } - - state = strm.state; - if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */ - - - //--- LOAD() --- - put = strm.next_out; - output = strm.output; - left = strm.avail_out; - next = strm.next_in; - input = strm.input; - have = strm.avail_in; - hold = state.hold; - bits = state.bits; - //--- - - _in = have; - _out = left; - ret = Z_OK; - - inf_leave: // goto emulation - for (;;) { - switch (state.mode) { - case HEAD: - if (state.wrap === 0) { - state.mode = TYPEDO; - break; - } - //=== NEEDBITS(16); - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */ - if (state.wbits === 0) { - state.wbits = 15; - } - state.check = 0/*crc32(0L, Z_NULL, 0)*/; - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - state.check = crc32(state.check, hbuf, 2, 0); - //===// - - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = FLAGS; - break; - } - if (state.head) { - state.head.done = false; - } - if (!(state.wrap & 1) || /* check if zlib header allowed */ - (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) { - strm.msg = 'incorrect header check'; - state.mode = BAD; - break; - } - if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) { - strm.msg = 'unknown compression method'; - state.mode = BAD; - break; - } - //--- DROPBITS(4) ---// - hold >>>= 4; - bits -= 4; - //---// - len = (hold & 0x0f)/*BITS(4)*/ + 8; - if (state.wbits === 0) { - state.wbits = len; - } - if (len > 15 || len > state.wbits) { - strm.msg = 'invalid window size'; - state.mode = BAD; - break; - } - - // !!! pako patch. Force use `options.windowBits` if passed. - // Required to always use max window size by default. - state.dmax = 1 << state.wbits; - //state.dmax = 1 << len; - - state.flags = 0; /* indicate zlib header */ - //Tracev((stderr, "inflate: zlib header ok\n")); - strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; - state.mode = hold & 0x200 ? DICTID : TYPE; - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - break; - case FLAGS: - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.flags = hold; - if ((state.flags & 0xff) !== Z_DEFLATED) { - strm.msg = 'unknown compression method'; - state.mode = BAD; - break; - } - if (state.flags & 0xe000) { - strm.msg = 'unknown header flags set'; - state.mode = BAD; - break; - } - if (state.head) { - state.head.text = ((hold >> 8) & 1); - } - if ((state.flags & 0x0200) && (state.wrap & 4)) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - state.check = crc32(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = TIME; - /* falls through */ - case TIME: - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (state.head) { - state.head.time = hold; - } - if ((state.flags & 0x0200) && (state.wrap & 4)) { - //=== CRC4(state.check, hold) - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - hbuf[2] = (hold >>> 16) & 0xff; - hbuf[3] = (hold >>> 24) & 0xff; - state.check = crc32(state.check, hbuf, 4, 0); - //=== - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = OS; - /* falls through */ - case OS: - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (state.head) { - state.head.xflags = (hold & 0xff); - state.head.os = (hold >> 8); - } - if ((state.flags & 0x0200) && (state.wrap & 4)) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - state.check = crc32(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = EXLEN; - /* falls through */ - case EXLEN: - if (state.flags & 0x0400) { - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.length = hold; - if (state.head) { - state.head.extra_len = hold; - } - if ((state.flags & 0x0200) && (state.wrap & 4)) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - state.check = crc32(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - } - else if (state.head) { - state.head.extra = null/*Z_NULL*/; - } - state.mode = EXTRA; - /* falls through */ - case EXTRA: - if (state.flags & 0x0400) { - copy = state.length; - if (copy > have) { copy = have; } - if (copy) { - if (state.head) { - len = state.head.extra_len - state.length; - if (!state.head.extra) { - // Use untyped array for more convenient processing later - state.head.extra = new Uint8Array(state.head.extra_len); - } - state.head.extra.set( - input.subarray( - next, - // extra field is limited to 65536 bytes - // - no need for additional size check - next + copy - ), - /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/ - len - ); - //zmemcpy(state.head.extra + len, next, - // len + copy > state.head.extra_max ? - // state.head.extra_max - len : copy); - } - if ((state.flags & 0x0200) && (state.wrap & 4)) { - state.check = crc32(state.check, input, copy, next); - } - have -= copy; - next += copy; - state.length -= copy; - } - if (state.length) { break inf_leave; } - } - state.length = 0; - state.mode = NAME; - /* falls through */ - case NAME: - if (state.flags & 0x0800) { - if (have === 0) { break inf_leave; } - copy = 0; - do { - // TODO: 2 or 1 bytes? - len = input[next + copy++]; - /* use constant limit because in js we should not preallocate memory */ - if (state.head && len && - (state.length < 65536 /*state.head.name_max*/)) { - state.head.name += String.fromCharCode(len); - } - } while (len && copy < have); - - if ((state.flags & 0x0200) && (state.wrap & 4)) { - state.check = crc32(state.check, input, copy, next); - } - have -= copy; - next += copy; - if (len) { break inf_leave; } - } - else if (state.head) { - state.head.name = null; - } - state.length = 0; - state.mode = COMMENT; - /* falls through */ - case COMMENT: - if (state.flags & 0x1000) { - if (have === 0) { break inf_leave; } - copy = 0; - do { - len = input[next + copy++]; - /* use constant limit because in js we should not preallocate memory */ - if (state.head && len && - (state.length < 65536 /*state.head.comm_max*/)) { - state.head.comment += String.fromCharCode(len); - } - } while (len && copy < have); - if ((state.flags & 0x0200) && (state.wrap & 4)) { - state.check = crc32(state.check, input, copy, next); - } - have -= copy; - next += copy; - if (len) { break inf_leave; } - } - else if (state.head) { - state.head.comment = null; - } - state.mode = HCRC; - /* falls through */ - case HCRC: - if (state.flags & 0x0200) { - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if ((state.wrap & 4) && hold !== (state.check & 0xffff)) { - strm.msg = 'header crc mismatch'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - } - if (state.head) { - state.head.hcrc = ((state.flags >> 9) & 1); - state.head.done = true; - } - strm.adler = state.check = 0; - state.mode = TYPE; - break; - case DICTID: - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - strm.adler = state.check = zswap32(hold); - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = DICT; - /* falls through */ - case DICT: - if (state.havedict === 0) { - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - return Z_NEED_DICT; - } - strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; - state.mode = TYPE; - /* falls through */ - case TYPE: - if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; } - /* falls through */ - case TYPEDO: - if (state.last) { - //--- BYTEBITS() ---// - hold >>>= bits & 7; - bits -= bits & 7; - //---// - state.mode = CHECK; - break; - } - //=== NEEDBITS(3); */ - while (bits < 3) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.last = (hold & 0x01)/*BITS(1)*/; - //--- DROPBITS(1) ---// - hold >>>= 1; - bits -= 1; - //---// - - switch ((hold & 0x03)/*BITS(2)*/) { - case 0: /* stored block */ - //Tracev((stderr, "inflate: stored block%s\n", - // state.last ? " (last)" : "")); - state.mode = STORED; - break; - case 1: /* fixed block */ - fixedtables(state); - //Tracev((stderr, "inflate: fixed codes block%s\n", - // state.last ? " (last)" : "")); - state.mode = LEN_; /* decode codes */ - if (flush === Z_TREES) { - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - break inf_leave; - } - break; - case 2: /* dynamic block */ - //Tracev((stderr, "inflate: dynamic codes block%s\n", - // state.last ? " (last)" : "")); - state.mode = TABLE; - break; - case 3: - strm.msg = 'invalid block type'; - state.mode = BAD; - } - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - break; - case STORED: - //--- BYTEBITS() ---// /* go to byte boundary */ - hold >>>= bits & 7; - bits -= bits & 7; - //---// - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) { - strm.msg = 'invalid stored block lengths'; - state.mode = BAD; - break; - } - state.length = hold & 0xffff; - //Tracev((stderr, "inflate: stored length %u\n", - // state.length)); - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = COPY_; - if (flush === Z_TREES) { break inf_leave; } - /* falls through */ - case COPY_: - state.mode = COPY; - /* falls through */ - case COPY: - copy = state.length; - if (copy) { - if (copy > have) { copy = have; } - if (copy > left) { copy = left; } - if (copy === 0) { break inf_leave; } - //--- zmemcpy(put, next, copy); --- - output.set(input.subarray(next, next + copy), put); - //---// - have -= copy; - next += copy; - left -= copy; - put += copy; - state.length -= copy; - break; - } - //Tracev((stderr, "inflate: stored end\n")); - state.mode = TYPE; - break; - case TABLE: - //=== NEEDBITS(14); */ - while (bits < 14) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257; - //--- DROPBITS(5) ---// - hold >>>= 5; - bits -= 5; - //---// - state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1; - //--- DROPBITS(5) ---// - hold >>>= 5; - bits -= 5; - //---// - state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4; - //--- DROPBITS(4) ---// - hold >>>= 4; - bits -= 4; - //---// -//#ifndef PKZIP_BUG_WORKAROUND - if (state.nlen > 286 || state.ndist > 30) { - strm.msg = 'too many length or distance symbols'; - state.mode = BAD; - break; - } -//#endif - //Tracev((stderr, "inflate: table sizes ok\n")); - state.have = 0; - state.mode = LENLENS; - /* falls through */ - case LENLENS: - while (state.have < state.ncode) { - //=== NEEDBITS(3); - while (bits < 3) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.lens[order[state.have++]] = (hold & 0x07);//BITS(3); - //--- DROPBITS(3) ---// - hold >>>= 3; - bits -= 3; - //---// - } - while (state.have < 19) { - state.lens[order[state.have++]] = 0; - } - // We have separate tables & no pointers. 2 commented lines below not needed. - //state.next = state.codes; - //state.lencode = state.next; - // Switch to use dynamic table - state.lencode = state.lendyn; - state.lenbits = 7; - - opts = { bits: state.lenbits }; - ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts); - state.lenbits = opts.bits; - - if (ret) { - strm.msg = 'invalid code lengths set'; - state.mode = BAD; - break; - } - //Tracev((stderr, "inflate: code lengths ok\n")); - state.have = 0; - state.mode = CODELENS; - /* falls through */ - case CODELENS: - while (state.have < state.nlen + state.ndist) { - for (;;) { - here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/ - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if ((here_bits) <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - if (here_val < 16) { - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.lens[state.have++] = here_val; - } - else { - if (here_val === 16) { - //=== NEEDBITS(here.bits + 2); - n = here_bits + 2; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - if (state.have === 0) { - strm.msg = 'invalid bit length repeat'; - state.mode = BAD; - break; - } - len = state.lens[state.have - 1]; - copy = 3 + (hold & 0x03);//BITS(2); - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - } - else if (here_val === 17) { - //=== NEEDBITS(here.bits + 3); - n = here_bits + 3; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - len = 0; - copy = 3 + (hold & 0x07);//BITS(3); - //--- DROPBITS(3) ---// - hold >>>= 3; - bits -= 3; - //---// - } - else { - //=== NEEDBITS(here.bits + 7); - n = here_bits + 7; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - len = 0; - copy = 11 + (hold & 0x7f);//BITS(7); - //--- DROPBITS(7) ---// - hold >>>= 7; - bits -= 7; - //---// - } - if (state.have + copy > state.nlen + state.ndist) { - strm.msg = 'invalid bit length repeat'; - state.mode = BAD; - break; - } - while (copy--) { - state.lens[state.have++] = len; - } - } - } - - /* handle error breaks in while */ - if (state.mode === BAD) { break; } - - /* check for end-of-block code (better have one) */ - if (state.lens[256] === 0) { - strm.msg = 'invalid code -- missing end-of-block'; - state.mode = BAD; - break; - } - - /* build code tables -- note: do not change the lenbits or distbits - values here (9 and 6) without reading the comments in inftrees.h - concerning the ENOUGH constants, which depend on those values */ - state.lenbits = 9; - - opts = { bits: state.lenbits }; - ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts); - // We have separate tables & no pointers. 2 commented lines below not needed. - // state.next_index = opts.table_index; - state.lenbits = opts.bits; - // state.lencode = state.next; - - if (ret) { - strm.msg = 'invalid literal/lengths set'; - state.mode = BAD; - break; - } - - state.distbits = 6; - //state.distcode.copy(state.codes); - // Switch to use dynamic table - state.distcode = state.distdyn; - opts = { bits: state.distbits }; - ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts); - // We have separate tables & no pointers. 2 commented lines below not needed. - // state.next_index = opts.table_index; - state.distbits = opts.bits; - // state.distcode = state.next; - - if (ret) { - strm.msg = 'invalid distances set'; - state.mode = BAD; - break; - } - //Tracev((stderr, 'inflate: codes ok\n')); - state.mode = LEN_; - if (flush === Z_TREES) { break inf_leave; } - /* falls through */ - case LEN_: - state.mode = LEN; - /* falls through */ - case LEN: - if (have >= 6 && left >= 258) { - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - inflate_fast(strm, _out); - //--- LOAD() --- - put = strm.next_out; - output = strm.output; - left = strm.avail_out; - next = strm.next_in; - input = strm.input; - have = strm.avail_in; - hold = state.hold; - bits = state.bits; - //--- - - if (state.mode === TYPE) { - state.back = -1; - } - break; - } - state.back = 0; - for (;;) { - here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/ - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if (here_bits <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - if (here_op && (here_op & 0xf0) === 0) { - last_bits = here_bits; - last_op = here_op; - last_val = here_val; - for (;;) { - here = state.lencode[last_val + - ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)]; - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if ((last_bits + here_bits) <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - //--- DROPBITS(last.bits) ---// - hold >>>= last_bits; - bits -= last_bits; - //---// - state.back += last_bits; - } - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.back += here_bits; - state.length = here_val; - if (here_op === 0) { - //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - // "inflate: literal '%c'\n" : - // "inflate: literal 0x%02x\n", here.val)); - state.mode = LIT; - break; - } - if (here_op & 32) { - //Tracevv((stderr, "inflate: end of block\n")); - state.back = -1; - state.mode = TYPE; - break; - } - if (here_op & 64) { - strm.msg = 'invalid literal/length code'; - state.mode = BAD; - break; - } - state.extra = here_op & 15; - state.mode = LENEXT; - /* falls through */ - case LENEXT: - if (state.extra) { - //=== NEEDBITS(state.extra); - n = state.extra; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/; - //--- DROPBITS(state.extra) ---// - hold >>>= state.extra; - bits -= state.extra; - //---// - state.back += state.extra; - } - //Tracevv((stderr, "inflate: length %u\n", state.length)); - state.was = state.length; - state.mode = DIST; - /* falls through */ - case DIST: - for (;;) { - here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/ - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if ((here_bits) <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - if ((here_op & 0xf0) === 0) { - last_bits = here_bits; - last_op = here_op; - last_val = here_val; - for (;;) { - here = state.distcode[last_val + - ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)]; - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if ((last_bits + here_bits) <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - //--- DROPBITS(last.bits) ---// - hold >>>= last_bits; - bits -= last_bits; - //---// - state.back += last_bits; - } - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.back += here_bits; - if (here_op & 64) { - strm.msg = 'invalid distance code'; - state.mode = BAD; - break; - } - state.offset = here_val; - state.extra = (here_op) & 15; - state.mode = DISTEXT; - /* falls through */ - case DISTEXT: - if (state.extra) { - //=== NEEDBITS(state.extra); - n = state.extra; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/; - //--- DROPBITS(state.extra) ---// - hold >>>= state.extra; - bits -= state.extra; - //---// - state.back += state.extra; - } -//#ifdef INFLATE_STRICT - if (state.offset > state.dmax) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break; - } -//#endif - //Tracevv((stderr, "inflate: distance %u\n", state.offset)); - state.mode = MATCH; - /* falls through */ - case MATCH: - if (left === 0) { break inf_leave; } - copy = _out - left; - if (state.offset > copy) { /* copy from window */ - copy = state.offset - copy; - if (copy > state.whave) { - if (state.sane) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break; - } -// (!) This block is disabled in zlib defaults, -// don't enable it for binary compatibility -//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR -// Trace((stderr, "inflate.c too far\n")); -// copy -= state.whave; -// if (copy > state.length) { copy = state.length; } -// if (copy > left) { copy = left; } -// left -= copy; -// state.length -= copy; -// do { -// output[put++] = 0; -// } while (--copy); -// if (state.length === 0) { state.mode = LEN; } -// break; -//#endif - } - if (copy > state.wnext) { - copy -= state.wnext; - from = state.wsize - copy; - } - else { - from = state.wnext - copy; - } - if (copy > state.length) { copy = state.length; } - from_source = state.window; - } - else { /* copy from output */ - from_source = output; - from = put - state.offset; - copy = state.length; - } - if (copy > left) { copy = left; } - left -= copy; - state.length -= copy; - do { - output[put++] = from_source[from++]; - } while (--copy); - if (state.length === 0) { state.mode = LEN; } - break; - case LIT: - if (left === 0) { break inf_leave; } - output[put++] = state.length; - left--; - state.mode = LEN; - break; - case CHECK: - if (state.wrap) { - //=== NEEDBITS(32); - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - // Use '|' instead of '+' to make sure that result is signed - hold |= input[next++] << bits; - bits += 8; - } - //===// - _out -= left; - strm.total_out += _out; - state.total += _out; - if ((state.wrap & 4) && _out) { - strm.adler = state.check = - /*UPDATE_CHECK(state.check, put - _out, _out);*/ - (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out)); - - } - _out = left; - // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too - if ((state.wrap & 4) && (state.flags ? hold : zswap32(hold)) !== state.check) { - strm.msg = 'incorrect data check'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - //Tracev((stderr, "inflate: check matches trailer\n")); - } - state.mode = LENGTH; - /* falls through */ - case LENGTH: - if (state.wrap && state.flags) { - //=== NEEDBITS(32); - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if ((state.wrap & 4) && hold !== (state.total & 0xffffffff)) { - strm.msg = 'incorrect length check'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - //Tracev((stderr, "inflate: length matches trailer\n")); - } - state.mode = DONE; - /* falls through */ - case DONE: - ret = Z_STREAM_END; - break inf_leave; - case BAD: - ret = Z_DATA_ERROR; - break inf_leave; - case MEM: - return Z_MEM_ERROR; - case SYNC: - /* falls through */ - default: - return Z_STREAM_ERROR; - } - } - - // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave" - - /* - Return from inflate(), updating the total counts and the check value. - If there was no progress during the inflate() call, return a buffer - error. Call updatewindow() to create and/or update the window state. - Note: a memory error from inflate() is non-recoverable. - */ - - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - - if (state.wsize || (_out !== strm.avail_out && state.mode < BAD && - (state.mode < CHECK || flush !== Z_FINISH))) { - if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) { - state.mode = MEM; - return Z_MEM_ERROR; - } - } - _in -= strm.avail_in; - _out -= strm.avail_out; - strm.total_in += _in; - strm.total_out += _out; - state.total += _out; - if ((state.wrap & 4) && _out) { - strm.adler = state.check = /*UPDATE_CHECK(state.check, strm.next_out - _out, _out);*/ - (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out)); - } - strm.data_type = state.bits + (state.last ? 64 : 0) + - (state.mode === TYPE ? 128 : 0) + - (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0); - if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) { - ret = Z_BUF_ERROR; - } - return ret; -}; - - -const inflateEnd = (strm) => { - - if (inflateStateCheck(strm)) { - return Z_STREAM_ERROR; - } - - let state = strm.state; - if (state.window) { - state.window = null; - } - strm.state = null; - return Z_OK; -}; - - -const inflateGetHeader = (strm, head) => { - - /* check state */ - if (inflateStateCheck(strm)) { return Z_STREAM_ERROR; } - const state = strm.state; - if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; } - - /* save header structure */ - state.head = head; - head.done = false; - return Z_OK; -}; - - -const inflateSetDictionary = (strm, dictionary) => { - const dictLength = dictionary.length; - - let state; - let dictid; - let ret; - - /* check state */ - if (inflateStateCheck(strm)) { return Z_STREAM_ERROR; } - state = strm.state; - - if (state.wrap !== 0 && state.mode !== DICT) { - return Z_STREAM_ERROR; - } - - /* check for correct dictionary identifier */ - if (state.mode === DICT) { - dictid = 1; /* adler32(0, null, 0)*/ - /* dictid = adler32(dictid, dictionary, dictLength); */ - dictid = adler32(dictid, dictionary, dictLength, 0); - if (dictid !== state.check) { - return Z_DATA_ERROR; - } - } - /* copy dictionary to window using updatewindow(), which will amend the - existing dictionary if appropriate */ - ret = updatewindow(strm, dictionary, dictLength, dictLength); - if (ret) { - state.mode = MEM; - return Z_MEM_ERROR; - } - state.havedict = 1; - // Tracev((stderr, "inflate: dictionary set\n")); - return Z_OK; -}; - - -module.exports.inflateReset = inflateReset; -module.exports.inflateReset2 = inflateReset2; -module.exports.inflateResetKeep = inflateResetKeep; -module.exports.inflateInit = inflateInit; -module.exports.inflateInit2 = inflateInit2; -module.exports.inflate = inflate; -module.exports.inflateEnd = inflateEnd; -module.exports.inflateGetHeader = inflateGetHeader; -module.exports.inflateSetDictionary = inflateSetDictionary; -module.exports.inflateInfo = 'pako inflate (from Nodeca project)'; - -/* Not implemented -module.exports.inflateCodesUsed = inflateCodesUsed; -module.exports.inflateCopy = inflateCopy; -module.exports.inflateGetDictionary = inflateGetDictionary; -module.exports.inflateMark = inflateMark; -module.exports.inflatePrime = inflatePrime; -module.exports.inflateSync = inflateSync; -module.exports.inflateSyncPoint = inflateSyncPoint; -module.exports.inflateUndermine = inflateUndermine; -module.exports.inflateValidate = inflateValidate; -*/ diff --git a/node_modules/pako/lib/zlib/inftrees.js b/node_modules/pako/lib/zlib/inftrees.js deleted file mode 100644 index eee389e..0000000 --- a/node_modules/pako/lib/zlib/inftrees.js +++ /dev/null @@ -1,340 +0,0 @@ -'use strict'; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -const MAXBITS = 15; -const ENOUGH_LENS = 852; -const ENOUGH_DISTS = 592; -//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); - -const CODES = 0; -const LENS = 1; -const DISTS = 2; - -const lbase = new Uint16Array([ /* Length codes 257..285 base */ - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 -]); - -const lext = new Uint8Array([ /* Length codes 257..285 extra */ - 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78 -]); - -const dbase = new Uint16Array([ /* Distance codes 0..29 base */ - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, - 8193, 12289, 16385, 24577, 0, 0 -]); - -const dext = new Uint8Array([ /* Distance codes 0..29 extra */ - 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, - 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, - 28, 28, 29, 29, 64, 64 -]); - -const inflate_table = (type, lens, lens_index, codes, table, table_index, work, opts) => -{ - const bits = opts.bits; - //here = opts.here; /* table entry for duplication */ - - let len = 0; /* a code's length in bits */ - let sym = 0; /* index of code symbols */ - let min = 0, max = 0; /* minimum and maximum code lengths */ - let root = 0; /* number of index bits for root table */ - let curr = 0; /* number of index bits for current table */ - let drop = 0; /* code bits to drop for sub-table */ - let left = 0; /* number of prefix codes available */ - let used = 0; /* code entries in table used */ - let huff = 0; /* Huffman code */ - let incr; /* for incrementing code, index */ - let fill; /* index for replicating entries */ - let low; /* low bits for current root entry */ - let mask; /* mask for low root bits */ - let next; /* next available space in table */ - let base = null; /* base value table to use */ -// let shoextra; /* extra bits table to use */ - let match; /* use base and extra for symbol >= match */ - const count = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */ - const offs = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */ - let extra = null; - - let here_bits, here_op, here_val; - - /* - Process a set of code lengths to create a canonical Huffman code. The - code lengths are lens[0..codes-1]. Each length corresponds to the - symbols 0..codes-1. The Huffman code is generated by first sorting the - symbols by length from short to long, and retaining the symbol order - for codes with equal lengths. Then the code starts with all zero bits - for the first code of the shortest length, and the codes are integer - increments for the same length, and zeros are appended as the length - increases. For the deflate format, these bits are stored backwards - from their more natural integer increment ordering, and so when the - decoding tables are built in the large loop below, the integer codes - are incremented backwards. - - This routine assumes, but does not check, that all of the entries in - lens[] are in the range 0..MAXBITS. The caller must assure this. - 1..MAXBITS is interpreted as that code length. zero means that that - symbol does not occur in this code. - - The codes are sorted by computing a count of codes for each length, - creating from that a table of starting indices for each length in the - sorted table, and then entering the symbols in order in the sorted - table. The sorted table is work[], with that space being provided by - the caller. - - The length counts are used for other purposes as well, i.e. finding - the minimum and maximum length codes, determining if there are any - codes at all, checking for a valid set of lengths, and looking ahead - at length counts to determine sub-table sizes when building the - decoding tables. - */ - - /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ - for (len = 0; len <= MAXBITS; len++) { - count[len] = 0; - } - for (sym = 0; sym < codes; sym++) { - count[lens[lens_index + sym]]++; - } - - /* bound code lengths, force root to be within code lengths */ - root = bits; - for (max = MAXBITS; max >= 1; max--) { - if (count[max] !== 0) { break; } - } - if (root > max) { - root = max; - } - if (max === 0) { /* no symbols to code at all */ - //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */ - //table.bits[opts.table_index] = 1; //here.bits = (var char)1; - //table.val[opts.table_index++] = 0; //here.val = (var short)0; - table[table_index++] = (1 << 24) | (64 << 16) | 0; - - - //table.op[opts.table_index] = 64; - //table.bits[opts.table_index] = 1; - //table.val[opts.table_index++] = 0; - table[table_index++] = (1 << 24) | (64 << 16) | 0; - - opts.bits = 1; - return 0; /* no symbols, but wait for decoding to report error */ - } - for (min = 1; min < max; min++) { - if (count[min] !== 0) { break; } - } - if (root < min) { - root = min; - } - - /* check for an over-subscribed or incomplete set of lengths */ - left = 1; - for (len = 1; len <= MAXBITS; len++) { - left <<= 1; - left -= count[len]; - if (left < 0) { - return -1; - } /* over-subscribed */ - } - if (left > 0 && (type === CODES || max !== 1)) { - return -1; /* incomplete set */ - } - - /* generate offsets into symbol table for each length for sorting */ - offs[1] = 0; - for (len = 1; len < MAXBITS; len++) { - offs[len + 1] = offs[len] + count[len]; - } - - /* sort symbols by length, by symbol order within each length */ - for (sym = 0; sym < codes; sym++) { - if (lens[lens_index + sym] !== 0) { - work[offs[lens[lens_index + sym]]++] = sym; - } - } - - /* - Create and fill in decoding tables. In this loop, the table being - filled is at next and has curr index bits. The code being used is huff - with length len. That code is converted to an index by dropping drop - bits off of the bottom. For codes where len is less than drop + curr, - those top drop + curr - len bits are incremented through all values to - fill the table with replicated entries. - - root is the number of index bits for the root table. When len exceeds - root, sub-tables are created pointed to by the root entry with an index - of the low root bits of huff. This is saved in low to check for when a - new sub-table should be started. drop is zero when the root table is - being filled, and drop is root when sub-tables are being filled. - - When a new sub-table is needed, it is necessary to look ahead in the - code lengths to determine what size sub-table is needed. The length - counts are used for this, and so count[] is decremented as codes are - entered in the tables. - - used keeps track of how many table entries have been allocated from the - provided *table space. It is checked for LENS and DIST tables against - the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in - the initial root table size constants. See the comments in inftrees.h - for more information. - - sym increments through all symbols, and the loop terminates when - all codes of length max, i.e. all codes, have been processed. This - routine permits incomplete codes, so another loop after this one fills - in the rest of the decoding tables with invalid code markers. - */ - - /* set up for code type */ - // poor man optimization - use if-else instead of switch, - // to avoid deopts in old v8 - if (type === CODES) { - base = extra = work; /* dummy value--not used */ - match = 20; - - } else if (type === LENS) { - base = lbase; - extra = lext; - match = 257; - - } else { /* DISTS */ - base = dbase; - extra = dext; - match = 0; - } - - /* initialize opts for loop */ - huff = 0; /* starting code */ - sym = 0; /* starting code symbol */ - len = min; /* starting code length */ - next = table_index; /* current table to fill in */ - curr = root; /* current table index bits */ - drop = 0; /* current bits to drop from code for index */ - low = -1; /* trigger new sub-table when len > root */ - used = 1 << root; /* use root table entries */ - mask = used - 1; /* mask for comparing low */ - - /* check available table space */ - if ((type === LENS && used > ENOUGH_LENS) || - (type === DISTS && used > ENOUGH_DISTS)) { - return 1; - } - - /* process all codes and make table entries */ - for (;;) { - /* create table entry */ - here_bits = len - drop; - if (work[sym] + 1 < match) { - here_op = 0; - here_val = work[sym]; - } - else if (work[sym] >= match) { - here_op = extra[work[sym] - match]; - here_val = base[work[sym] - match]; - } - else { - here_op = 32 + 64; /* end of block */ - here_val = 0; - } - - /* replicate for those indices with low len bits equal to huff */ - incr = 1 << (len - drop); - fill = 1 << curr; - min = fill; /* save offset to next table */ - do { - fill -= incr; - table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0; - } while (fill !== 0); - - /* backwards increment the len-bit code huff */ - incr = 1 << (len - 1); - while (huff & incr) { - incr >>= 1; - } - if (incr !== 0) { - huff &= incr - 1; - huff += incr; - } else { - huff = 0; - } - - /* go to next symbol, update count, len */ - sym++; - if (--count[len] === 0) { - if (len === max) { break; } - len = lens[lens_index + work[sym]]; - } - - /* create new sub-table if needed */ - if (len > root && (huff & mask) !== low) { - /* if first time, transition to sub-tables */ - if (drop === 0) { - drop = root; - } - - /* increment past last table */ - next += min; /* here min is 1 << curr */ - - /* determine length of next table */ - curr = len - drop; - left = 1 << curr; - while (curr + drop < max) { - left -= count[curr + drop]; - if (left <= 0) { break; } - curr++; - left <<= 1; - } - - /* check for enough space */ - used += 1 << curr; - if ((type === LENS && used > ENOUGH_LENS) || - (type === DISTS && used > ENOUGH_DISTS)) { - return 1; - } - - /* point entry in root table to sub-table */ - low = huff & mask; - /*table.op[low] = curr; - table.bits[low] = root; - table.val[low] = next - opts.table_index;*/ - table[low] = (root << 24) | (curr << 16) | (next - table_index) |0; - } - } - - /* fill in remaining table entry if code is incomplete (guaranteed to have - at most one remaining entry, since if the code is incomplete, the - maximum code length that was allowed to get this far is one bit) */ - if (huff !== 0) { - //table.op[next + huff] = 64; /* invalid code marker */ - //table.bits[next + huff] = len - drop; - //table.val[next + huff] = 0; - table[next + huff] = ((len - drop) << 24) | (64 << 16) |0; - } - - /* set return parameters */ - //opts.table_index += used; - opts.bits = root; - return 0; -}; - - -module.exports = inflate_table; diff --git a/node_modules/pako/lib/zlib/messages.js b/node_modules/pako/lib/zlib/messages.js deleted file mode 100644 index 426daec..0000000 --- a/node_modules/pako/lib/zlib/messages.js +++ /dev/null @@ -1,32 +0,0 @@ -'use strict'; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -module.exports = { - 2: 'need dictionary', /* Z_NEED_DICT 2 */ - 1: 'stream end', /* Z_STREAM_END 1 */ - 0: '', /* Z_OK 0 */ - '-1': 'file error', /* Z_ERRNO (-1) */ - '-2': 'stream error', /* Z_STREAM_ERROR (-2) */ - '-3': 'data error', /* Z_DATA_ERROR (-3) */ - '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */ - '-5': 'buffer error', /* Z_BUF_ERROR (-5) */ - '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ -}; diff --git a/node_modules/pako/lib/zlib/trees.js b/node_modules/pako/lib/zlib/trees.js deleted file mode 100644 index 300f1d8..0000000 --- a/node_modules/pako/lib/zlib/trees.js +++ /dev/null @@ -1,1179 +0,0 @@ -'use strict'; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -/* eslint-disable space-unary-ops */ - -/* Public constants ==========================================================*/ -/* ===========================================================================*/ - - -//const Z_FILTERED = 1; -//const Z_HUFFMAN_ONLY = 2; -//const Z_RLE = 3; -const Z_FIXED = 4; -//const Z_DEFAULT_STRATEGY = 0; - -/* Possible values of the data_type field (though see inflate()) */ -const Z_BINARY = 0; -const Z_TEXT = 1; -//const Z_ASCII = 1; // = Z_TEXT -const Z_UNKNOWN = 2; - -/*============================================================================*/ - - -function zero(buf) { let len = buf.length; while (--len >= 0) { buf[len] = 0; } } - -// From zutil.h - -const STORED_BLOCK = 0; -const STATIC_TREES = 1; -const DYN_TREES = 2; -/* The three kinds of block type */ - -const MIN_MATCH = 3; -const MAX_MATCH = 258; -/* The minimum and maximum match lengths */ - -// From deflate.h -/* =========================================================================== - * Internal compression state. - */ - -const LENGTH_CODES = 29; -/* number of length codes, not counting the special END_BLOCK code */ - -const LITERALS = 256; -/* number of literal bytes 0..255 */ - -const L_CODES = LITERALS + 1 + LENGTH_CODES; -/* number of Literal or Length codes, including the END_BLOCK code */ - -const D_CODES = 30; -/* number of distance codes */ - -const BL_CODES = 19; -/* number of codes used to transfer the bit lengths */ - -const HEAP_SIZE = 2 * L_CODES + 1; -/* maximum heap size */ - -const MAX_BITS = 15; -/* All codes must not exceed MAX_BITS bits */ - -const Buf_size = 16; -/* size of bit buffer in bi_buf */ - - -/* =========================================================================== - * Constants - */ - -const MAX_BL_BITS = 7; -/* Bit length codes must not exceed MAX_BL_BITS bits */ - -const END_BLOCK = 256; -/* end of block literal code */ - -const REP_3_6 = 16; -/* repeat previous bit length 3-6 times (2 bits of repeat count) */ - -const REPZ_3_10 = 17; -/* repeat a zero length 3-10 times (3 bits of repeat count) */ - -const REPZ_11_138 = 18; -/* repeat a zero length 11-138 times (7 bits of repeat count) */ - -/* eslint-disable comma-spacing,array-bracket-spacing */ -const extra_lbits = /* extra bits for each length code */ - new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]); - -const extra_dbits = /* extra bits for each distance code */ - new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]); - -const extra_blbits = /* extra bits for each bit length code */ - new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]); - -const bl_order = - new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]); -/* eslint-enable comma-spacing,array-bracket-spacing */ - -/* The lengths of the bit length codes are sent in order of decreasing - * probability, to avoid transmitting the lengths for unused bit length codes. - */ - -/* =========================================================================== - * Local data. These are initialized only once. - */ - -// We pre-fill arrays with 0 to avoid uninitialized gaps - -const DIST_CODE_LEN = 512; /* see definition of array dist_code below */ - -// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1 -const static_ltree = new Array((L_CODES + 2) * 2); -zero(static_ltree); -/* The static literal tree. Since the bit lengths are imposed, there is no - * need for the L_CODES extra codes used during heap construction. However - * The codes 286 and 287 are needed to build a canonical tree (see _tr_init - * below). - */ - -const static_dtree = new Array(D_CODES * 2); -zero(static_dtree); -/* The static distance tree. (Actually a trivial tree since all codes use - * 5 bits.) - */ - -const _dist_code = new Array(DIST_CODE_LEN); -zero(_dist_code); -/* Distance codes. The first 256 values correspond to the distances - * 3 .. 258, the last 256 values correspond to the top 8 bits of - * the 15 bit distances. - */ - -const _length_code = new Array(MAX_MATCH - MIN_MATCH + 1); -zero(_length_code); -/* length code for each normalized match length (0 == MIN_MATCH) */ - -const base_length = new Array(LENGTH_CODES); -zero(base_length); -/* First normalized length for each code (0 = MIN_MATCH) */ - -const base_dist = new Array(D_CODES); -zero(base_dist); -/* First normalized distance for each code (0 = distance of 1) */ - - -function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) { - - this.static_tree = static_tree; /* static tree or NULL */ - this.extra_bits = extra_bits; /* extra bits for each code or NULL */ - this.extra_base = extra_base; /* base index for extra_bits */ - this.elems = elems; /* max number of elements in the tree */ - this.max_length = max_length; /* max bit length for the codes */ - - // show if `static_tree` has data or dummy - needed for monomorphic objects - this.has_stree = static_tree && static_tree.length; -} - - -let static_l_desc; -let static_d_desc; -let static_bl_desc; - - -function TreeDesc(dyn_tree, stat_desc) { - this.dyn_tree = dyn_tree; /* the dynamic tree */ - this.max_code = 0; /* largest code with non zero frequency */ - this.stat_desc = stat_desc; /* the corresponding static tree */ -} - - - -const d_code = (dist) => { - - return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)]; -}; - - -/* =========================================================================== - * Output a short LSB first on the stream. - * IN assertion: there is enough room in pendingBuf. - */ -const put_short = (s, w) => { -// put_byte(s, (uch)((w) & 0xff)); -// put_byte(s, (uch)((ush)(w) >> 8)); - s.pending_buf[s.pending++] = (w) & 0xff; - s.pending_buf[s.pending++] = (w >>> 8) & 0xff; -}; - - -/* =========================================================================== - * Send a value on a given number of bits. - * IN assertion: length <= 16 and value fits in length bits. - */ -const send_bits = (s, value, length) => { - - if (s.bi_valid > (Buf_size - length)) { - s.bi_buf |= (value << s.bi_valid) & 0xffff; - put_short(s, s.bi_buf); - s.bi_buf = value >> (Buf_size - s.bi_valid); - s.bi_valid += length - Buf_size; - } else { - s.bi_buf |= (value << s.bi_valid) & 0xffff; - s.bi_valid += length; - } -}; - - -const send_code = (s, c, tree) => { - - send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/); -}; - - -/* =========================================================================== - * Reverse the first len bits of a code, using straightforward code (a faster - * method would use a table) - * IN assertion: 1 <= len <= 15 - */ -const bi_reverse = (code, len) => { - - let res = 0; - do { - res |= code & 1; - code >>>= 1; - res <<= 1; - } while (--len > 0); - return res >>> 1; -}; - - -/* =========================================================================== - * Flush the bit buffer, keeping at most 7 bits in it. - */ -const bi_flush = (s) => { - - if (s.bi_valid === 16) { - put_short(s, s.bi_buf); - s.bi_buf = 0; - s.bi_valid = 0; - - } else if (s.bi_valid >= 8) { - s.pending_buf[s.pending++] = s.bi_buf & 0xff; - s.bi_buf >>= 8; - s.bi_valid -= 8; - } -}; - - -/* =========================================================================== - * Compute the optimal bit lengths for a tree and update the total bit length - * for the current block. - * IN assertion: the fields freq and dad are set, heap[heap_max] and - * above are the tree nodes sorted by increasing frequency. - * OUT assertions: the field len is set to the optimal bit length, the - * array bl_count contains the frequencies for each bit length. - * The length opt_len is updated; static_len is also updated if stree is - * not null. - */ -const gen_bitlen = (s, desc) => { -// deflate_state *s; -// tree_desc *desc; /* the tree descriptor */ - - const tree = desc.dyn_tree; - const max_code = desc.max_code; - const stree = desc.stat_desc.static_tree; - const has_stree = desc.stat_desc.has_stree; - const extra = desc.stat_desc.extra_bits; - const base = desc.stat_desc.extra_base; - const max_length = desc.stat_desc.max_length; - let h; /* heap index */ - let n, m; /* iterate over the tree elements */ - let bits; /* bit length */ - let xbits; /* extra bits */ - let f; /* frequency */ - let overflow = 0; /* number of elements with bit length too large */ - - for (bits = 0; bits <= MAX_BITS; bits++) { - s.bl_count[bits] = 0; - } - - /* In a first pass, compute the optimal bit lengths (which may - * overflow in the case of the bit length tree). - */ - tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */ - - for (h = s.heap_max + 1; h < HEAP_SIZE; h++) { - n = s.heap[h]; - bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1; - if (bits > max_length) { - bits = max_length; - overflow++; - } - tree[n * 2 + 1]/*.Len*/ = bits; - /* We overwrite tree[n].Dad which is no longer needed */ - - if (n > max_code) { continue; } /* not a leaf node */ - - s.bl_count[bits]++; - xbits = 0; - if (n >= base) { - xbits = extra[n - base]; - } - f = tree[n * 2]/*.Freq*/; - s.opt_len += f * (bits + xbits); - if (has_stree) { - s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits); - } - } - if (overflow === 0) { return; } - - // Tracev((stderr,"\nbit length overflow\n")); - /* This happens for example on obj2 and pic of the Calgary corpus */ - - /* Find the first bit length which could increase: */ - do { - bits = max_length - 1; - while (s.bl_count[bits] === 0) { bits--; } - s.bl_count[bits]--; /* move one leaf down the tree */ - s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */ - s.bl_count[max_length]--; - /* The brother of the overflow item also moves one step up, - * but this does not affect bl_count[max_length] - */ - overflow -= 2; - } while (overflow > 0); - - /* Now recompute all bit lengths, scanning in increasing frequency. - * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all - * lengths instead of fixing only the wrong ones. This idea is taken - * from 'ar' written by Haruhiko Okumura.) - */ - for (bits = max_length; bits !== 0; bits--) { - n = s.bl_count[bits]; - while (n !== 0) { - m = s.heap[--h]; - if (m > max_code) { continue; } - if (tree[m * 2 + 1]/*.Len*/ !== bits) { - // Tracev((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); - s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/; - tree[m * 2 + 1]/*.Len*/ = bits; - } - n--; - } - } -}; - - -/* =========================================================================== - * Generate the codes for a given tree and bit counts (which need not be - * optimal). - * IN assertion: the array bl_count contains the bit length statistics for - * the given tree and the field len is set for all tree elements. - * OUT assertion: the field code is set for all tree elements of non - * zero code length. - */ -const gen_codes = (tree, max_code, bl_count) => { -// ct_data *tree; /* the tree to decorate */ -// int max_code; /* largest code with non zero frequency */ -// ushf *bl_count; /* number of codes at each bit length */ - - const next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */ - let code = 0; /* running code value */ - let bits; /* bit index */ - let n; /* code index */ - - /* The distribution counts are first used to generate the code values - * without bit reversal. - */ - for (bits = 1; bits <= MAX_BITS; bits++) { - code = (code + bl_count[bits - 1]) << 1; - next_code[bits] = code; - } - /* Check that the bit counts in bl_count are consistent. The last code - * must be all ones. - */ - //Assert (code + bl_count[MAX_BITS]-1 == (1< { - - let n; /* iterates over tree elements */ - let bits; /* bit counter */ - let length; /* length value */ - let code; /* code value */ - let dist; /* distance index */ - const bl_count = new Array(MAX_BITS + 1); - /* number of codes at each bit length for an optimal tree */ - - // do check in _tr_init() - //if (static_init_done) return; - - /* For some embedded targets, global variables are not initialized: */ -/*#ifdef NO_INIT_GLOBAL_POINTERS - static_l_desc.static_tree = static_ltree; - static_l_desc.extra_bits = extra_lbits; - static_d_desc.static_tree = static_dtree; - static_d_desc.extra_bits = extra_dbits; - static_bl_desc.extra_bits = extra_blbits; -#endif*/ - - /* Initialize the mapping length (0..255) -> length code (0..28) */ - length = 0; - for (code = 0; code < LENGTH_CODES - 1; code++) { - base_length[code] = length; - for (n = 0; n < (1 << extra_lbits[code]); n++) { - _length_code[length++] = code; - } - } - //Assert (length == 256, "tr_static_init: length != 256"); - /* Note that the length 255 (match length 258) can be represented - * in two different ways: code 284 + 5 bits or code 285, so we - * overwrite length_code[255] to use the best encoding: - */ - _length_code[length - 1] = code; - - /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ - dist = 0; - for (code = 0; code < 16; code++) { - base_dist[code] = dist; - for (n = 0; n < (1 << extra_dbits[code]); n++) { - _dist_code[dist++] = code; - } - } - //Assert (dist == 256, "tr_static_init: dist != 256"); - dist >>= 7; /* from now on, all distances are divided by 128 */ - for (; code < D_CODES; code++) { - base_dist[code] = dist << 7; - for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) { - _dist_code[256 + dist++] = code; - } - } - //Assert (dist == 256, "tr_static_init: 256+dist != 512"); - - /* Construct the codes of the static literal tree */ - for (bits = 0; bits <= MAX_BITS; bits++) { - bl_count[bits] = 0; - } - - n = 0; - while (n <= 143) { - static_ltree[n * 2 + 1]/*.Len*/ = 8; - n++; - bl_count[8]++; - } - while (n <= 255) { - static_ltree[n * 2 + 1]/*.Len*/ = 9; - n++; - bl_count[9]++; - } - while (n <= 279) { - static_ltree[n * 2 + 1]/*.Len*/ = 7; - n++; - bl_count[7]++; - } - while (n <= 287) { - static_ltree[n * 2 + 1]/*.Len*/ = 8; - n++; - bl_count[8]++; - } - /* Codes 286 and 287 do not exist, but we must include them in the - * tree construction to get a canonical Huffman tree (longest code - * all ones) - */ - gen_codes(static_ltree, L_CODES + 1, bl_count); - - /* The static distance tree is trivial: */ - for (n = 0; n < D_CODES; n++) { - static_dtree[n * 2 + 1]/*.Len*/ = 5; - static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5); - } - - // Now data ready and we can init static trees - static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS); - static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS); - static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS); - - //static_init_done = true; -}; - - -/* =========================================================================== - * Initialize a new block. - */ -const init_block = (s) => { - - let n; /* iterates over tree elements */ - - /* Initialize the trees. */ - for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; } - for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; } - for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; } - - s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1; - s.opt_len = s.static_len = 0; - s.sym_next = s.matches = 0; -}; - - -/* =========================================================================== - * Flush the bit buffer and align the output on a byte boundary - */ -const bi_windup = (s) => -{ - if (s.bi_valid > 8) { - put_short(s, s.bi_buf); - } else if (s.bi_valid > 0) { - //put_byte(s, (Byte)s->bi_buf); - s.pending_buf[s.pending++] = s.bi_buf; - } - s.bi_buf = 0; - s.bi_valid = 0; -}; - -/* =========================================================================== - * Compares to subtrees, using the tree depth as tie breaker when - * the subtrees have equal frequency. This minimizes the worst case length. - */ -const smaller = (tree, n, m, depth) => { - - const _n2 = n * 2; - const _m2 = m * 2; - return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ || - (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m])); -}; - -/* =========================================================================== - * Restore the heap property by moving down the tree starting at node k, - * exchanging a node with the smallest of its two sons if necessary, stopping - * when the heap property is re-established (each father smaller than its - * two sons). - */ -const pqdownheap = (s, tree, k) => { -// deflate_state *s; -// ct_data *tree; /* the tree to restore */ -// int k; /* node to move down */ - - const v = s.heap[k]; - let j = k << 1; /* left son of k */ - while (j <= s.heap_len) { - /* Set j to the smallest of the two sons: */ - if (j < s.heap_len && - smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) { - j++; - } - /* Exit if v is smaller than both sons */ - if (smaller(tree, v, s.heap[j], s.depth)) { break; } - - /* Exchange v with the smallest son */ - s.heap[k] = s.heap[j]; - k = j; - - /* And continue down the tree, setting j to the left son of k */ - j <<= 1; - } - s.heap[k] = v; -}; - - -// inlined manually -// const SMALLEST = 1; - -/* =========================================================================== - * Send the block data compressed using the given Huffman trees - */ -const compress_block = (s, ltree, dtree) => { -// deflate_state *s; -// const ct_data *ltree; /* literal tree */ -// const ct_data *dtree; /* distance tree */ - - let dist; /* distance of matched string */ - let lc; /* match length or unmatched char (if dist == 0) */ - let sx = 0; /* running index in sym_buf */ - let code; /* the code to send */ - let extra; /* number of extra bits to send */ - - if (s.sym_next !== 0) { - do { - dist = s.pending_buf[s.sym_buf + sx++] & 0xff; - dist += (s.pending_buf[s.sym_buf + sx++] & 0xff) << 8; - lc = s.pending_buf[s.sym_buf + sx++]; - if (dist === 0) { - send_code(s, lc, ltree); /* send a literal byte */ - //Tracecv(isgraph(lc), (stderr," '%c' ", lc)); - } else { - /* Here, lc is the match length - MIN_MATCH */ - code = _length_code[lc]; - send_code(s, code + LITERALS + 1, ltree); /* send the length code */ - extra = extra_lbits[code]; - if (extra !== 0) { - lc -= base_length[code]; - send_bits(s, lc, extra); /* send the extra length bits */ - } - dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - //Assert (code < D_CODES, "bad d_code"); - - send_code(s, code, dtree); /* send the distance code */ - extra = extra_dbits[code]; - if (extra !== 0) { - dist -= base_dist[code]; - send_bits(s, dist, extra); /* send the extra distance bits */ - } - } /* literal or match pair ? */ - - /* Check that the overlay between pending_buf and sym_buf is ok: */ - //Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow"); - - } while (sx < s.sym_next); - } - - send_code(s, END_BLOCK, ltree); -}; - - -/* =========================================================================== - * Construct one Huffman tree and assigns the code bit strings and lengths. - * Update the total bit length for the current block. - * IN assertion: the field freq is set for all tree elements. - * OUT assertions: the fields len and code are set to the optimal bit length - * and corresponding code. The length opt_len is updated; static_len is - * also updated if stree is not null. The field max_code is set. - */ -const build_tree = (s, desc) => { -// deflate_state *s; -// tree_desc *desc; /* the tree descriptor */ - - const tree = desc.dyn_tree; - const stree = desc.stat_desc.static_tree; - const has_stree = desc.stat_desc.has_stree; - const elems = desc.stat_desc.elems; - let n, m; /* iterate over heap elements */ - let max_code = -1; /* largest code with non zero frequency */ - let node; /* new node being created */ - - /* Construct the initial heap, with least frequent element in - * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. - * heap[0] is not used. - */ - s.heap_len = 0; - s.heap_max = HEAP_SIZE; - - for (n = 0; n < elems; n++) { - if (tree[n * 2]/*.Freq*/ !== 0) { - s.heap[++s.heap_len] = max_code = n; - s.depth[n] = 0; - - } else { - tree[n * 2 + 1]/*.Len*/ = 0; - } - } - - /* The pkzip format requires that at least one distance code exists, - * and that at least one bit should be sent even if there is only one - * possible code. So to avoid special checks later on we force at least - * two codes of non zero frequency. - */ - while (s.heap_len < 2) { - node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0); - tree[node * 2]/*.Freq*/ = 1; - s.depth[node] = 0; - s.opt_len--; - - if (has_stree) { - s.static_len -= stree[node * 2 + 1]/*.Len*/; - } - /* node is 0 or 1 so it does not have extra bits */ - } - desc.max_code = max_code; - - /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, - * establish sub-heaps of increasing lengths: - */ - for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); } - - /* Construct the Huffman tree by repeatedly combining the least two - * frequent nodes. - */ - node = elems; /* next internal node of the tree */ - do { - //pqremove(s, tree, n); /* n = node of least frequency */ - /*** pqremove ***/ - n = s.heap[1/*SMALLEST*/]; - s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--]; - pqdownheap(s, tree, 1/*SMALLEST*/); - /***/ - - m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */ - - s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */ - s.heap[--s.heap_max] = m; - - /* Create a new node father of n and m */ - tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/; - s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1; - tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node; - - /* and insert the new node in the heap */ - s.heap[1/*SMALLEST*/] = node++; - pqdownheap(s, tree, 1/*SMALLEST*/); - - } while (s.heap_len >= 2); - - s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/]; - - /* At this point, the fields freq and dad are set. We can now - * generate the bit lengths. - */ - gen_bitlen(s, desc); - - /* The field len is now set, we can generate the bit codes */ - gen_codes(tree, max_code, s.bl_count); -}; - - -/* =========================================================================== - * Scan a literal or distance tree to determine the frequencies of the codes - * in the bit length tree. - */ -const scan_tree = (s, tree, max_code) => { -// deflate_state *s; -// ct_data *tree; /* the tree to be scanned */ -// int max_code; /* and its largest code of non zero frequency */ - - let n; /* iterates over all tree elements */ - let prevlen = -1; /* last emitted length */ - let curlen; /* length of current code */ - - let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ - - let count = 0; /* repeat count of the current code */ - let max_count = 7; /* max repeat count */ - let min_count = 4; /* min repeat count */ - - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } - tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */ - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; - - if (++count < max_count && curlen === nextlen) { - continue; - - } else if (count < min_count) { - s.bl_tree[curlen * 2]/*.Freq*/ += count; - - } else if (curlen !== 0) { - - if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; } - s.bl_tree[REP_3_6 * 2]/*.Freq*/++; - - } else if (count <= 10) { - s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++; - - } else { - s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++; - } - - count = 0; - prevlen = curlen; - - if (nextlen === 0) { - max_count = 138; - min_count = 3; - - } else if (curlen === nextlen) { - max_count = 6; - min_count = 3; - - } else { - max_count = 7; - min_count = 4; - } - } -}; - - -/* =========================================================================== - * Send a literal or distance tree in compressed form, using the codes in - * bl_tree. - */ -const send_tree = (s, tree, max_code) => { -// deflate_state *s; -// ct_data *tree; /* the tree to be scanned */ -// int max_code; /* and its largest code of non zero frequency */ - - let n; /* iterates over all tree elements */ - let prevlen = -1; /* last emitted length */ - let curlen; /* length of current code */ - - let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ - - let count = 0; /* repeat count of the current code */ - let max_count = 7; /* max repeat count */ - let min_count = 4; /* min repeat count */ - - /* tree[max_code+1].Len = -1; */ /* guard already set */ - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; - - if (++count < max_count && curlen === nextlen) { - continue; - - } else if (count < min_count) { - do { send_code(s, curlen, s.bl_tree); } while (--count !== 0); - - } else if (curlen !== 0) { - if (curlen !== prevlen) { - send_code(s, curlen, s.bl_tree); - count--; - } - //Assert(count >= 3 && count <= 6, " 3_6?"); - send_code(s, REP_3_6, s.bl_tree); - send_bits(s, count - 3, 2); - - } else if (count <= 10) { - send_code(s, REPZ_3_10, s.bl_tree); - send_bits(s, count - 3, 3); - - } else { - send_code(s, REPZ_11_138, s.bl_tree); - send_bits(s, count - 11, 7); - } - - count = 0; - prevlen = curlen; - if (nextlen === 0) { - max_count = 138; - min_count = 3; - - } else if (curlen === nextlen) { - max_count = 6; - min_count = 3; - - } else { - max_count = 7; - min_count = 4; - } - } -}; - - -/* =========================================================================== - * Construct the Huffman tree for the bit lengths and return the index in - * bl_order of the last bit length code to send. - */ -const build_bl_tree = (s) => { - - let max_blindex; /* index of last bit length code of non zero freq */ - - /* Determine the bit length frequencies for literal and distance trees */ - scan_tree(s, s.dyn_ltree, s.l_desc.max_code); - scan_tree(s, s.dyn_dtree, s.d_desc.max_code); - - /* Build the bit length tree: */ - build_tree(s, s.bl_desc); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - */ - - /* Determine the number of bit length codes to send. The pkzip format - * requires that at least 4 bit length codes be sent. (appnote.txt says - * 3 but the actual value used is 4.) - */ - for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) { - if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) { - break; - } - } - /* Update opt_len to include the bit length tree and counts */ - s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; - //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", - // s->opt_len, s->static_len)); - - return max_blindex; -}; - - -/* =========================================================================== - * Send the header for a block using dynamic Huffman trees: the counts, the - * lengths of the bit length codes, the literal tree and the distance tree. - * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. - */ -const send_all_trees = (s, lcodes, dcodes, blcodes) => { -// deflate_state *s; -// int lcodes, dcodes, blcodes; /* number of codes for each tree */ - - let rank; /* index in bl_order */ - - //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); - //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, - // "too many codes"); - //Tracev((stderr, "\nbl counts: ")); - send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ - send_bits(s, dcodes - 1, 5); - send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ - for (rank = 0; rank < blcodes; rank++) { - //Tracev((stderr, "\nbl code %2d ", bl_order[rank])); - send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3); - } - //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); - - send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */ - //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); - - send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */ - //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); -}; - - -/* =========================================================================== - * Check if the data type is TEXT or BINARY, using the following algorithm: - * - TEXT if the two conditions below are satisfied: - * a) There are no non-portable control characters belonging to the - * "block list" (0..6, 14..25, 28..31). - * b) There is at least one printable character belonging to the - * "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). - * - BINARY otherwise. - * - The following partially-portable control characters form a - * "gray list" that is ignored in this detection algorithm: - * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). - * IN assertion: the fields Freq of dyn_ltree are set. - */ -const detect_data_type = (s) => { - /* block_mask is the bit mask of block-listed bytes - * set bits 0..6, 14..25, and 28..31 - * 0xf3ffc07f = binary 11110011111111111100000001111111 - */ - let block_mask = 0xf3ffc07f; - let n; - - /* Check for non-textual ("block-listed") bytes. */ - for (n = 0; n <= 31; n++, block_mask >>>= 1) { - if ((block_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) { - return Z_BINARY; - } - } - - /* Check for textual ("allow-listed") bytes. */ - if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 || - s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) { - return Z_TEXT; - } - for (n = 32; n < LITERALS; n++) { - if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) { - return Z_TEXT; - } - } - - /* There are no "block-listed" or "allow-listed" bytes: - * this stream either is empty or has tolerated ("gray-listed") bytes only. - */ - return Z_BINARY; -}; - - -let static_init_done = false; - -/* =========================================================================== - * Initialize the tree data structures for a new zlib stream. - */ -const _tr_init = (s) => -{ - - if (!static_init_done) { - tr_static_init(); - static_init_done = true; - } - - s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc); - s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc); - s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc); - - s.bi_buf = 0; - s.bi_valid = 0; - - /* Initialize the first block of the first file: */ - init_block(s); -}; - - -/* =========================================================================== - * Send a stored block - */ -const _tr_stored_block = (s, buf, stored_len, last) => { -//DeflateState *s; -//charf *buf; /* input block */ -//ulg stored_len; /* length of input block */ -//int last; /* one if this is the last block for a file */ - - send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */ - bi_windup(s); /* align on byte boundary */ - put_short(s, stored_len); - put_short(s, ~stored_len); - if (stored_len) { - s.pending_buf.set(s.window.subarray(buf, buf + stored_len), s.pending); - } - s.pending += stored_len; -}; - - -/* =========================================================================== - * Send one empty static block to give enough lookahead for inflate. - * This takes 10 bits, of which 7 may remain in the bit buffer. - */ -const _tr_align = (s) => { - send_bits(s, STATIC_TREES << 1, 3); - send_code(s, END_BLOCK, static_ltree); - bi_flush(s); -}; - - -/* =========================================================================== - * Determine the best encoding for the current block: dynamic trees, static - * trees or store, and write out the encoded block. - */ -const _tr_flush_block = (s, buf, stored_len, last) => { -//DeflateState *s; -//charf *buf; /* input block, or NULL if too old */ -//ulg stored_len; /* length of input block */ -//int last; /* one if this is the last block for a file */ - - let opt_lenb, static_lenb; /* opt_len and static_len in bytes */ - let max_blindex = 0; /* index of last bit length code of non zero freq */ - - /* Build the Huffman trees unless a stored block is forced */ - if (s.level > 0) { - - /* Check if the file is binary or text */ - if (s.strm.data_type === Z_UNKNOWN) { - s.strm.data_type = detect_data_type(s); - } - - /* Construct the literal and distance trees */ - build_tree(s, s.l_desc); - // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, - // s->static_len)); - - build_tree(s, s.d_desc); - // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, - // s->static_len)); - /* At this point, opt_len and static_len are the total bit lengths of - * the compressed block data, excluding the tree representations. - */ - - /* Build the bit length tree for the above two trees, and get the index - * in bl_order of the last bit length code to send. - */ - max_blindex = build_bl_tree(s); - - /* Determine the best encoding. Compute the block lengths in bytes. */ - opt_lenb = (s.opt_len + 3 + 7) >>> 3; - static_lenb = (s.static_len + 3 + 7) >>> 3; - - // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", - // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, - // s->sym_next / 3)); - - if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; } - - } else { - // Assert(buf != (char*)0, "lost buf"); - opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ - } - - if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) { - /* 4: two words for the lengths */ - - /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - * Otherwise we can't have processed more than WSIZE input bytes since - * the last block flush, because compression would have been - * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to - * transform a block into a stored block. - */ - _tr_stored_block(s, buf, stored_len, last); - - } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) { - - send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3); - compress_block(s, static_ltree, static_dtree); - - } else { - send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3); - send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1); - compress_block(s, s.dyn_ltree, s.dyn_dtree); - } - // Assert (s->compressed_len == s->bits_sent, "bad compressed size"); - /* The above check is made mod 2^32, for files larger than 512 MB - * and uLong implemented on 32 bits. - */ - init_block(s); - - if (last) { - bi_windup(s); - } - // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, - // s->compressed_len-7*last)); -}; - -/* =========================================================================== - * Save the match info and tally the frequency counts. Return true if - * the current block must be flushed. - */ -const _tr_tally = (s, dist, lc) => { -// deflate_state *s; -// unsigned dist; /* distance of matched string */ -// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ - - s.pending_buf[s.sym_buf + s.sym_next++] = dist; - s.pending_buf[s.sym_buf + s.sym_next++] = dist >> 8; - s.pending_buf[s.sym_buf + s.sym_next++] = lc; - if (dist === 0) { - /* lc is the unmatched char */ - s.dyn_ltree[lc * 2]/*.Freq*/++; - } else { - s.matches++; - /* Here, lc is the match length - MIN_MATCH */ - dist--; /* dist = match distance - 1 */ - //Assert((ush)dist < (ush)MAX_DIST(s) && - // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && - // (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); - - s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++; - s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++; - } - - return (s.sym_next === s.sym_end); -}; - -module.exports._tr_init = _tr_init; -module.exports._tr_stored_block = _tr_stored_block; -module.exports._tr_flush_block = _tr_flush_block; -module.exports._tr_tally = _tr_tally; -module.exports._tr_align = _tr_align; diff --git a/node_modules/pako/lib/zlib/zstream.js b/node_modules/pako/lib/zlib/zstream.js deleted file mode 100644 index 122acfe..0000000 --- a/node_modules/pako/lib/zlib/zstream.js +++ /dev/null @@ -1,47 +0,0 @@ -'use strict'; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -function ZStream() { - /* next input byte */ - this.input = null; // JS specific, because we have no pointers - this.next_in = 0; - /* number of bytes available at input */ - this.avail_in = 0; - /* total number of input bytes read so far */ - this.total_in = 0; - /* next output byte should be put there */ - this.output = null; // JS specific, because we have no pointers - this.next_out = 0; - /* remaining free space at output */ - this.avail_out = 0; - /* total number of bytes output so far */ - this.total_out = 0; - /* last error message, NULL if no error */ - this.msg = ''/*Z_NULL*/; - /* not visible by applications */ - this.state = null; - /* best guess about the data type: binary or text */ - this.data_type = 2/*Z_UNKNOWN*/; - /* adler32 value of the uncompressed data */ - this.adler = 0; -} - -module.exports = ZStream; diff --git a/node_modules/pako/package.json b/node_modules/pako/package.json deleted file mode 100644 index f23b8ef..0000000 --- a/node_modules/pako/package.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "name": "pako", - "description": "zlib port to javascript - fast, modularized, with browser support", - "version": "2.1.0", - "keywords": [ - "zlib", - "deflate", - "inflate", - "gzip" - ], - "contributors": [ - "Andrei Tuputcyn (https://github.com/andr83)", - "Vitaly Puzrin (https://github.com/puzrin)", - "Friedel Ziegelmayer (https://github.com/dignifiedquire)", - "Kirill Efimov (https://github.com/Kirill89)", - "Jean-loup Gailly", - "Mark Adler" - ], - "files": [ - "index.js", - "dist/", - "lib/" - ], - "license": "(MIT AND Zlib)", - "repository": "nodeca/pako", - "module": "./dist/pako.esm.mjs", - "exports": { - ".": { - "import": "./dist/pako.esm.mjs", - "require": "./index.js" - }, - "./package.json": "./package.json", - "./dist/*": "./dist/*", - "./lib/*": "./lib/*", - "./lib/zlib/*": "./lib/zlib/*", - "./lib/utils/*": "./lib/utils/*" - }, - "scripts": { - "lint": "eslint .", - "test": "npm run lint && mocha", - "coverage": "npm run lint && nyc mocha && nyc report --reporter html", - "build": "rollup -c", - "build_fixtures": "node support/build_fixtures.js", - "doc": "node support/build_doc.js", - "gh-doc": "npm run doc && gh-pages -d doc -f", - "prepublishOnly": "npm run gh-doc" - }, - "devDependencies": { - "@babel/preset-env": "^7.12.1", - "@rollup/plugin-babel": "^5.2.1", - "@rollup/plugin-commonjs": "^16.0.0", - "@rollup/plugin-node-resolve": "^10.0.0", - "eslint": "^7.13.0", - "gh-pages": "^3.1.0", - "mocha": "^8.2.1", - "multiparty": "^4.1.3", - "ndoc": "^6.0.0", - "nyc": "^15.1.0", - "rollup": "^2.33.1", - "rollup-plugin-terser": "^7.0.2", - "shelljs": "^0.8.4" - }, - "dependencies": {} -} diff --git a/node_modules/path-exists/index.d.ts b/node_modules/path-exists/index.d.ts deleted file mode 100644 index 54b7ab8..0000000 --- a/node_modules/path-exists/index.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -declare const pathExists: { - /** - Check if a path exists. - - @returns Whether the path exists. - - @example - ``` - // foo.ts - import pathExists = require('path-exists'); - - (async () => { - console.log(await pathExists('foo.ts')); - //=> true - })(); - ``` - */ - (path: string): Promise; - - /** - Synchronously check if a path exists. - - @returns Whether the path exists. - */ - sync(path: string): boolean; -}; - -export = pathExists; diff --git a/node_modules/path-exists/index.js b/node_modules/path-exists/index.js deleted file mode 100644 index 1943921..0000000 --- a/node_modules/path-exists/index.js +++ /dev/null @@ -1,23 +0,0 @@ -'use strict'; -const fs = require('fs'); -const {promisify} = require('util'); - -const pAccess = promisify(fs.access); - -module.exports = async path => { - try { - await pAccess(path); - return true; - } catch (_) { - return false; - } -}; - -module.exports.sync = path => { - try { - fs.accessSync(path); - return true; - } catch (_) { - return false; - } -}; diff --git a/node_modules/path-exists/license b/node_modules/path-exists/license deleted file mode 100644 index e7af2f7..0000000 --- a/node_modules/path-exists/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/path-exists/package.json b/node_modules/path-exists/package.json deleted file mode 100644 index 0755256..0000000 --- a/node_modules/path-exists/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "path-exists", - "version": "4.0.0", - "description": "Check if a path exists", - "license": "MIT", - "repository": "sindresorhus/path-exists", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=8" - }, - "scripts": { - "test": "xo && ava && tsd" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "path", - "exists", - "exist", - "file", - "filepath", - "fs", - "filesystem", - "file-system", - "access", - "stat" - ], - "devDependencies": { - "ava": "^1.4.1", - "tsd": "^0.7.2", - "xo": "^0.24.0" - } -} diff --git a/node_modules/path-exists/readme.md b/node_modules/path-exists/readme.md deleted file mode 100644 index 81f9845..0000000 --- a/node_modules/path-exists/readme.md +++ /dev/null @@ -1,52 +0,0 @@ -# path-exists [![Build Status](https://travis-ci.org/sindresorhus/path-exists.svg?branch=master)](https://travis-ci.org/sindresorhus/path-exists) - -> Check if a path exists - -NOTE: `fs.existsSync` has been un-deprecated in Node.js since 6.8.0. If you only need to check synchronously, this module is not needed. - -While [`fs.exists()`](https://nodejs.org/api/fs.html#fs_fs_exists_path_callback) is being [deprecated](https://github.com/iojs/io.js/issues/103), there's still a genuine use-case of being able to check if a path exists for other purposes than doing IO with it. - -Never use this before handling a file though: - -> In particular, checking if a file exists before opening it is an anti-pattern that leaves you vulnerable to race conditions: another process may remove the file between the calls to `fs.exists()` and `fs.open()`. Just open the file and handle the error when it's not there. - - -## Install - -``` -$ npm install path-exists -``` - - -## Usage - -```js -// foo.js -const pathExists = require('path-exists'); - -(async () => { - console.log(await pathExists('foo.js')); - //=> true -})(); -``` - - -## API - -### pathExists(path) - -Returns a `Promise` of whether the path exists. - -### pathExists.sync(path) - -Returns a `boolean` of whether the path exists. - - -## Related - -- [path-exists-cli](https://github.com/sindresorhus/path-exists-cli) - CLI for this module - - -## License - -MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/path-key/index.d.ts b/node_modules/path-key/index.d.ts deleted file mode 100644 index 7c575d1..0000000 --- a/node_modules/path-key/index.d.ts +++ /dev/null @@ -1,40 +0,0 @@ -/// - -declare namespace pathKey { - interface Options { - /** - Use a custom environment variables object. Default: [`process.env`](https://nodejs.org/api/process.html#process_process_env). - */ - readonly env?: {[key: string]: string | undefined}; - - /** - Get the PATH key for a specific platform. Default: [`process.platform`](https://nodejs.org/api/process.html#process_process_platform). - */ - readonly platform?: NodeJS.Platform; - } -} - -declare const pathKey: { - /** - Get the [PATH](https://en.wikipedia.org/wiki/PATH_(variable)) environment variable key cross-platform. - - @example - ``` - import pathKey = require('path-key'); - - const key = pathKey(); - //=> 'PATH' - - const PATH = process.env[key]; - //=> '/usr/local/bin:/usr/bin:/bin' - ``` - */ - (options?: pathKey.Options): string; - - // TODO: Remove this for the next major release, refactor the whole definition to: - // declare function pathKey(options?: pathKey.Options): string; - // export = pathKey; - default: typeof pathKey; -}; - -export = pathKey; diff --git a/node_modules/path-key/index.js b/node_modules/path-key/index.js deleted file mode 100644 index 0cf6415..0000000 --- a/node_modules/path-key/index.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict'; - -const pathKey = (options = {}) => { - const environment = options.env || process.env; - const platform = options.platform || process.platform; - - if (platform !== 'win32') { - return 'PATH'; - } - - return Object.keys(environment).reverse().find(key => key.toUpperCase() === 'PATH') || 'Path'; -}; - -module.exports = pathKey; -// TODO: Remove this for the next major release -module.exports.default = pathKey; diff --git a/node_modules/path-key/license b/node_modules/path-key/license deleted file mode 100644 index e7af2f7..0000000 --- a/node_modules/path-key/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/path-key/package.json b/node_modules/path-key/package.json deleted file mode 100644 index c8cbd38..0000000 --- a/node_modules/path-key/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "path-key", - "version": "3.1.1", - "description": "Get the PATH environment variable key cross-platform", - "license": "MIT", - "repository": "sindresorhus/path-key", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=8" - }, - "scripts": { - "test": "xo && ava && tsd" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "path", - "key", - "environment", - "env", - "variable", - "var", - "get", - "cross-platform", - "windows" - ], - "devDependencies": { - "@types/node": "^11.13.0", - "ava": "^1.4.1", - "tsd": "^0.7.2", - "xo": "^0.24.0" - } -} diff --git a/node_modules/path-key/readme.md b/node_modules/path-key/readme.md deleted file mode 100644 index a9052d7..0000000 --- a/node_modules/path-key/readme.md +++ /dev/null @@ -1,61 +0,0 @@ -# path-key [![Build Status](https://travis-ci.org/sindresorhus/path-key.svg?branch=master)](https://travis-ci.org/sindresorhus/path-key) - -> Get the [PATH](https://en.wikipedia.org/wiki/PATH_(variable)) environment variable key cross-platform - -It's usually `PATH`, but on Windows it can be any casing like `Path`... - - -## Install - -``` -$ npm install path-key -``` - - -## Usage - -```js -const pathKey = require('path-key'); - -const key = pathKey(); -//=> 'PATH' - -const PATH = process.env[key]; -//=> '/usr/local/bin:/usr/bin:/bin' -``` - - -## API - -### pathKey(options?) - -#### options - -Type: `object` - -##### env - -Type: `object`
    -Default: [`process.env`](https://nodejs.org/api/process.html#process_process_env) - -Use a custom environment variables object. - -#### platform - -Type: `string`
    -Default: [`process.platform`](https://nodejs.org/api/process.html#process_process_platform) - -Get the PATH key for a specific platform. - - ---- - -
    - - Get professional support for this package with a Tidelift subscription - -
    - - Tidelift helps make open source sustainable for maintainers while giving companies
    assurances about security, maintenance, and licensing for their dependencies. -
    -
    diff --git a/node_modules/path-parse/LICENSE b/node_modules/path-parse/LICENSE deleted file mode 100644 index 810f3db..0000000 --- a/node_modules/path-parse/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 Javier Blanco - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/node_modules/path-parse/README.md b/node_modules/path-parse/README.md deleted file mode 100644 index 05097f8..0000000 --- a/node_modules/path-parse/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# path-parse [![Build Status](https://travis-ci.org/jbgutierrez/path-parse.svg?branch=master)](https://travis-ci.org/jbgutierrez/path-parse) - -> Node.js [`path.parse(pathString)`](https://nodejs.org/api/path.html#path_path_parse_pathstring) [ponyfill](https://ponyfill.com). - -## Install - -``` -$ npm install --save path-parse -``` - -## Usage - -```js -var pathParse = require('path-parse'); - -pathParse('/home/user/dir/file.txt'); -//=> { -// root : "/", -// dir : "/home/user/dir", -// base : "file.txt", -// ext : ".txt", -// name : "file" -// } -``` - -## API - -See [`path.parse(pathString)`](https://nodejs.org/api/path.html#path_path_parse_pathstring) docs. - -### pathParse(path) - -### pathParse.posix(path) - -The Posix specific version. - -### pathParse.win32(path) - -The Windows specific version. - -## License - -MIT © [Javier Blanco](http://jbgutierrez.info) diff --git a/node_modules/path-parse/index.js b/node_modules/path-parse/index.js deleted file mode 100644 index f062d0a..0000000 --- a/node_modules/path-parse/index.js +++ /dev/null @@ -1,75 +0,0 @@ -'use strict'; - -var isWindows = process.platform === 'win32'; - -// Regex to split a windows path into into [dir, root, basename, name, ext] -var splitWindowsRe = - /^(((?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?[\\\/]?)(?:[^\\\/]*[\\\/])*)((\.{1,2}|[^\\\/]+?|)(\.[^.\/\\]*|))[\\\/]*$/; - -var win32 = {}; - -function win32SplitPath(filename) { - return splitWindowsRe.exec(filename).slice(1); -} - -win32.parse = function(pathString) { - if (typeof pathString !== 'string') { - throw new TypeError( - "Parameter 'pathString' must be a string, not " + typeof pathString - ); - } - var allParts = win32SplitPath(pathString); - if (!allParts || allParts.length !== 5) { - throw new TypeError("Invalid path '" + pathString + "'"); - } - return { - root: allParts[1], - dir: allParts[0] === allParts[1] ? allParts[0] : allParts[0].slice(0, -1), - base: allParts[2], - ext: allParts[4], - name: allParts[3] - }; -}; - - - -// Split a filename into [dir, root, basename, name, ext], unix version -// 'root' is just a slash, or nothing. -var splitPathRe = - /^((\/?)(?:[^\/]*\/)*)((\.{1,2}|[^\/]+?|)(\.[^.\/]*|))[\/]*$/; -var posix = {}; - - -function posixSplitPath(filename) { - return splitPathRe.exec(filename).slice(1); -} - - -posix.parse = function(pathString) { - if (typeof pathString !== 'string') { - throw new TypeError( - "Parameter 'pathString' must be a string, not " + typeof pathString - ); - } - var allParts = posixSplitPath(pathString); - if (!allParts || allParts.length !== 5) { - throw new TypeError("Invalid path '" + pathString + "'"); - } - - return { - root: allParts[1], - dir: allParts[0].slice(0, -1), - base: allParts[2], - ext: allParts[4], - name: allParts[3], - }; -}; - - -if (isWindows) - module.exports = win32.parse; -else /* posix */ - module.exports = posix.parse; - -module.exports.posix = posix.parse; -module.exports.win32 = win32.parse; diff --git a/node_modules/path-parse/package.json b/node_modules/path-parse/package.json deleted file mode 100644 index 36c23f8..0000000 --- a/node_modules/path-parse/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "path-parse", - "version": "1.0.7", - "description": "Node.js path.parse() ponyfill", - "main": "index.js", - "scripts": { - "test": "node test.js" - }, - "repository": { - "type": "git", - "url": "https://github.com/jbgutierrez/path-parse.git" - }, - "keywords": [ - "path", - "paths", - "file", - "dir", - "parse", - "built-in", - "util", - "utils", - "core", - "ponyfill", - "polyfill", - "shim" - ], - "author": "Javier Blanco ", - "license": "MIT", - "bugs": { - "url": "https://github.com/jbgutierrez/path-parse/issues" - }, - "homepage": "https://github.com/jbgutierrez/path-parse#readme" -} diff --git a/node_modules/path-scurry/LICENSE.md b/node_modules/path-scurry/LICENSE.md deleted file mode 100644 index c5402b9..0000000 --- a/node_modules/path-scurry/LICENSE.md +++ /dev/null @@ -1,55 +0,0 @@ -# Blue Oak Model License - -Version 1.0.0 - -## Purpose - -This license gives everyone as much permission to work with -this software as possible, while protecting contributors -from liability. - -## Acceptance - -In order to receive this license, you must agree to its -rules. The rules of this license are both obligations -under that agreement and conditions to your license. -You must not do anything with this software that triggers -a rule that you cannot or will not follow. - -## Copyright - -Each contributor licenses you to do everything with this -software that would otherwise infringe that contributor's -copyright in it. - -## Notices - -You must ensure that everyone who gets a copy of -any part of this software from you, with or without -changes, also gets the text of this license or a link to -. - -## Excuse - -If anyone notifies you in writing that you have not -complied with [Notices](#notices), you can keep your -license by taking all practical steps to comply within 30 -days after the notice. If you do not do so, your license -ends immediately. - -## Patent - -Each contributor licenses you to do everything with this -software that would otherwise infringe any patent claims -they can license or become able to license. - -## Reliability - -No contributor can revoke this license. - -## No Liability - -***As far as the law allows, this software comes as is, -without any warranty or condition, and no contributor -will be liable to anyone for any damages related to this -software or this license, under any kind of legal claim.*** diff --git a/node_modules/path-scurry/README.md b/node_modules/path-scurry/README.md deleted file mode 100644 index b5cb495..0000000 --- a/node_modules/path-scurry/README.md +++ /dev/null @@ -1,636 +0,0 @@ -# path-scurry - -Extremely high performant utility for building tools that read -the file system, minimizing filesystem and path string munging -operations to the greatest degree possible. - -## Ugh, yet another file traversal thing on npm? - -Yes. None of the existing ones gave me exactly what I wanted. - -## Well what is it you wanted? - -While working on [glob](http://npm.im/glob), I found that I -needed a module to very efficiently manage the traversal over a -folder tree, such that: - -1. No `readdir()` or `stat()` would ever be called on the same - file or directory more than one time. -2. No `readdir()` calls would be made if we can be reasonably - sure that the path is not a directory. (Ie, a previous - `readdir()` or `stat()` covered the path, and - `ent.isDirectory()` is false.) -3. `path.resolve()`, `dirname()`, `basename()`, and other - string-parsing/munging operations are be minimized. This means - it has to track "provisional" child nodes that may not exist - (and if we find that they _don't_ exist, store that - information as well, so we don't have to ever check again). -4. The API is not limited to use as a stream/iterator/etc. There - are many cases where an API like node's `fs` is preferrable. -5. It's more important to prevent excess syscalls than to be up - to date, but it should be smart enough to know what it - _doesn't_ know, and go get it seamlessly when requested. -6. Do not blow up the JS heap allocation if operating on a - directory with a huge number of entries. -7. Handle all the weird aspects of Windows paths, like UNC paths - and drive letters and wrongway slashes, so that the consumer - can return canonical platform-specific paths without having to - parse or join or do any error-prone string munging. - -## PERFORMANCE - -JavaScript people throw around the word "blazing" a lot. I hope -that this module doesn't blaze anyone. But it does go very fast, -in the cases it's optimized for, if used properly. - -PathScurry provides ample opportunities to get extremely good -performance, as well as several options to trade performance for -convenience. - -Benchmarks can be run by executing `npm run bench`. - -As is always the case, doing more means going slower, doing less -means going faster, and there are trade offs between speed and -memory usage. - -PathScurry makes heavy use of [LRUCache](http://npm.im/lru-cache) -to efficiently cache whatever it can, and `Path` objects remain -in the graph for the lifetime of the walker, so repeated calls -with a single PathScurry object will be extremely fast. However, -adding items to a cold cache means "doing more", so in those -cases, we pay a price. Nothing is free, but every effort has been -made to reduce costs wherever possible. - -Also, note that a "cache as long as possible" approach means that -changes to the filesystem may not be reflected in the results of -repeated PathScurry operations. - -For resolving string paths, `PathScurry` ranges from 5-50 times -faster than `path.resolve` on repeated resolutions, but around -100 to 1000 times _slower_ on the first resolution. If your -program is spending a lot of time resolving the _same_ paths -repeatedly (like, thousands or millions of times), then this can -be beneficial. But both implementations are pretty fast, and -speeding up an infrequent operation from 4µs to 400ns is not -going to move the needle on your app's performance. - -For walking file system directory trees, a lot depends on how -often a given PathScurry object will be used, and also on the -walk method used. - -With default settings on a folder tree of 100,000 items, -consisting of around a 10-to-1 ratio of normal files to -directories, PathScurry performs comparably to -[@nodelib/fs.walk](http://npm.im/@nodelib/fs.walk), which is the -fastest and most reliable file system walker I could find. As far -as I can tell, it's almost impossible to go much faster in a -Node.js program, just based on how fast you can push syscalls out -to the fs thread pool. - -On my machine, that is about 1000-1200 completed walks per second -for async or stream walks, and around 500-600 walks per second -synchronously. - -In the warm cache state, PathScurry's performance increases -around 4x for async `for await` iteration, 10-15x faster for -streams and synchronous `for of` iteration, and anywhere from 30x -to 80x faster for the rest. - -``` -# walk 100,000 fs entries, 10/1 file/dir ratio -# operations / ms - New PathScurry object | Reuse PathScurry object - stream: 1112.589 | 13974.917 -sync stream: 492.718 | 15028.343 - async walk: 1095.648 | 32706.395 - sync walk: 527.632 | 46129.772 - async iter: 1288.821 | 5045.510 - sync iter: 498.496 | 17920.746 -``` - -A hand-rolled walk calling `entry.readdir()` and recursing -through the entries can benefit even more from caching, with -greater flexibility and without the overhead of streams or -generators. - -The cold cache state is still limited by the costs of file system -operations, but with a warm cache, the only bottleneck is CPU -speed and VM optimizations. Of course, in that case, some care -must be taken to ensure that you don't lose performance as a -result of silly mistakes, like calling `readdir()` on entries -that you know are not directories. - -``` -# manual recursive iteration functions - cold cache | warm cache -async: 1164.901 | 17923.320 - cb: 1101.127 | 40999.344 -zalgo: 1082.240 | 66689.936 - sync: 526.935 | 87097.591 -``` - -In this case, the speed improves by around 10-20x in the async -case, 40x in the case of using `entry.readdirCB` with protections -against synchronous callbacks, and 50-100x with callback -deferrals disabled, and _several hundred times faster_ for -synchronous iteration. - -If you can think of a case that is not covered in these -benchmarks, or an implementation that performs significantly -better than PathScurry, please [let me -know](https://github.com/isaacs/path-scurry/issues). - -## USAGE - -```ts -// hybrid module, load with either method -import { PathScurry, Path } from 'path-scurry' -// or: -const { PathScurry, Path } = require('path-scurry') - -// very simple example, say we want to find and -// delete all the .DS_Store files in a given path -// note that the API is very similar to just a -// naive walk with fs.readdir() -import { unlink } from 'fs/promises' - -// easy way, iterate over the directory and do the thing -const pw = new PathScurry(process.cwd()) -for await (const entry of pw) { - if (entry.isFile() && entry.name === '.DS_Store') { - unlink(entry.fullpath()) - } -} - -// here it is as a manual recursive method -const walk = async (entry: Path) => { - const promises: Promise = [] - // readdir doesn't throw on non-directories, it just doesn't - // return any entries, to save stack trace costs. - // Items are returned in arbitrary unsorted order - for (const child of await pw.readdir(entry)) { - // each child is a Path object - if (child.name === '.DS_Store' && child.isFile()) { - // could also do pw.resolve(entry, child.name), - // just like fs.readdir walking, but .fullpath is - // a *slightly* more efficient shorthand. - promises.push(unlink(child.fullpath())) - } else if (child.isDirectory()) { - promises.push(walk(child)) - } - } - return Promise.all(promises) -} - -walk(pw.cwd).then(() => { - console.log('all .DS_Store files removed') -}) - -const pw2 = new PathScurry('/a/b/c') // pw2.cwd is the Path for /a/b/c -const relativeDir = pw2.cwd.resolve('../x') // Path entry for '/a/b/x' -const relative2 = pw2.cwd.resolve('/a/b/d/../x') // same path, same entry -assert.equal(relativeDir, relative2) -``` - -## API - -[Full TypeDoc API](https://isaacs.github.io/path-scurry) - -There are platform-specific classes exported, but for the most -part, the default `PathScurry` and `Path` exports are what you -most likely need, unless you are testing behavior for other -platforms. - -Intended public API is documented here, but the full -documentation does include internal types, which should not be -accessed directly. - -### Interface `PathScurryOpts` - -The type of the `options` argument passed to the `PathScurry` -constructor. - -- `nocase`: Boolean indicating that file names should be compared - case-insensitively. Defaults to `true` on darwin and win32 - implementations, `false` elsewhere. - - **Warning** Performing case-insensitive matching on a - case-sensitive filesystem will result in occasionally very - bizarre behavior. Performing case-sensitive matching on a - case-insensitive filesystem may negatively impact performance. - -- `childrenCacheSize`: Number of child entries to cache, in order - to speed up `resolve()` and `readdir()` calls. Defaults to - `16 * 1024` (ie, `16384`). - - Setting it to a higher value will run the risk of JS heap - allocation errors on large directory trees. Setting it to `256` - or smaller will significantly reduce the construction time and - data consumption overhead, but with the downside of operations - being slower on large directory trees. Setting it to `0` will - mean that effectively no operations are cached, and this module - will be roughly the same speed as `fs` for file system - operations, and _much_ slower than `path.resolve()` for - repeated path resolution. - -- `fs` An object that will be used to override the default `fs` - methods. Any methods that are not overridden will use Node's - built-in implementations. - - - lstatSync - - readdir (callback `withFileTypes` Dirent variant, used for - readdirCB and most walks) - - readdirSync - - readlinkSync - - realpathSync - - promises: Object containing the following async methods: - - lstat - - readdir (Dirent variant only) - - readlink - - realpath - -### Interface `WalkOptions` - -The options object that may be passed to all walk methods. - -- `withFileTypes`: Boolean, default true. Indicates that `Path` - objects should be returned. Set to `false` to get string paths - instead. -- `follow`: Boolean, default false. Attempt to read directory - entries from symbolic links. Otherwise, only actual directories - are traversed. Regardless of this setting, a given target path - will only ever be walked once, meaning that a symbolic link to - a previously traversed directory will never be followed. - - Setting this imposes a slight performance penalty, because - `readlink` must be called on all symbolic links encountered, in - order to avoid infinite cycles. - -- `filter`: Function `(entry: Path) => boolean`. If provided, - will prevent the inclusion of any entry for which it returns a - falsey value. This will not prevent directories from being - traversed if they do not pass the filter, though it will - prevent the directories themselves from being included in the - results. By default, if no filter is provided, then all entries - are included in the results. -- `walkFilter`: Function `(entry: Path) => boolean`. If provided, - will prevent the traversal of any directory (or in the case of - `follow:true` symbolic links to directories) for which the - function returns false. This will not prevent the directories - themselves from being included in the result set. Use `filter` - for that. - -Note that TypeScript return types will only be inferred properly -from static analysis if the `withFileTypes` option is omitted, or -a constant `true` or `false` value. - -### Class `PathScurry` - -The main interface. Defaults to an appropriate class based on the -current platform. - -Use `PathScurryWin32`, `PathScurryDarwin`, or `PathScurryPosix` -if implementation-specific behavior is desired. - -All walk methods may be called with a `WalkOptions` argument to -walk over the object's current working directory with the -supplied options. - -#### `async pw.walk(entry?: string | Path | WalkOptions, opts?: WalkOptions)` - -Walk the directory tree according to the options provided, -resolving to an array of all entries found. - -#### `pw.walkSync(entry?: string | Path | WalkOptions, opts?: WalkOptions)` - -Walk the directory tree according to the options provided, -returning an array of all entries found. - -#### `pw.iterate(entry?: string | Path | WalkOptions, opts?: WalkOptions)` - -Iterate over the directory asynchronously, for use with `for -await of`. This is also the default async iterator method. - -#### `pw.iterateSync(entry?: string | Path | WalkOptions, opts?: WalkOptions)` - -Iterate over the directory synchronously, for use with `for of`. -This is also the default sync iterator method. - -#### `pw.stream(entry?: string | Path | WalkOptions, opts?: WalkOptions)` - -Return a [Minipass](http://npm.im/minipass) stream that emits -each entry or path string in the walk. Results are made available -asynchronously. - -#### `pw.streamSync(entry?: string | Path | WalkOptions, opts?: WalkOptions)` - -Return a [Minipass](http://npm.im/minipass) stream that emits -each entry or path string in the walk. Results are made available -synchronously, meaning that the walk will complete in a single -tick if the stream is fully consumed. - -#### `pw.cwd` - -Path object representing the current working directory for the -PathScurry. - -#### `pw.chdir(path: string)` - -Set the new effective current working directory for the scurry -object, so that `path.relative()` and `path.relativePosix()` -return values relative to the new cwd path. - -#### `pw.depth(path?: Path | string): number` - -Return the depth of the specified path (or the PathScurry cwd) -within the directory tree. - -Root entries have a depth of `0`. - -#### `pw.resolve(...paths: string[])` - -Caching `path.resolve()`. - -Significantly faster than `path.resolve()` if called repeatedly -with the same paths. Significantly slower otherwise, as it builds -out the cached Path entries. - -To get a `Path` object resolved from the `PathScurry`, use -`pw.cwd.resolve(path)`. Note that `Path.resolve` only takes a -single string argument, not multiple. - -#### `pw.resolvePosix(...paths: string[])` - -Caching `path.resolve()`, but always using posix style paths. - -This is identical to `pw.resolve(...paths)` on posix systems (ie, -everywhere except Windows). - -On Windows, it returns the full absolute UNC path using `/` -separators. Ie, instead of `'C:\\foo\\bar`, it would return -`//?/C:/foo/bar`. - -#### `pw.relative(path: string | Path): string` - -Return the relative path from the PathWalker cwd to the supplied -path string or entry. - -If the nearest common ancestor is the root, then an absolute path -is returned. - -#### `pw.relativePosix(path: string | Path): string` - -Return the relative path from the PathWalker cwd to the supplied -path string or entry, using `/` path separators. - -If the nearest common ancestor is the root, then an absolute path -is returned. - -On posix platforms (ie, all platforms except Windows), this is -identical to `pw.relative(path)`. - -On Windows systems, it returns the resulting string as a -`/`-delimited path. If an absolute path is returned (because the -target does not share a common ancestor with `pw.cwd`), then a -full absolute UNC path will be returned. Ie, instead of -`'C:\\foo\\bar`, it would return `//?/C:/foo/bar`. - -#### `pw.basename(path: string | Path): string` - -Return the basename of the provided string or Path. - -#### `pw.dirname(path: string | Path): string` - -Return the parent directory of the supplied string or Path. - -#### `async pw.readdir(dir = pw.cwd, opts = { withFileTypes: true })` - -Read the directory and resolve to an array of strings if -`withFileTypes` is explicitly set to `false` or Path objects -otherwise. - -Can be called as `pw.readdir({ withFileTypes: boolean })` as -well. - -Returns `[]` if no entries are found, or if any error occurs. - -Note that TypeScript return types will only be inferred properly -from static analysis if the `withFileTypes` option is omitted, or -a constant `true` or `false` value. - -#### `pw.readdirSync(dir = pw.cwd, opts = { withFileTypes: true })` - -Synchronous `pw.readdir()` - -#### `async pw.readlink(link = pw.cwd, opts = { withFileTypes: false })` - -Call `fs.readlink` on the supplied string or Path object, and -return the result. - -Can be called as `pw.readlink({ withFileTypes: boolean })` as -well. - -Returns `undefined` if any error occurs (for example, if the -argument is not a symbolic link), or a `Path` object if -`withFileTypes` is explicitly set to `true`, or a string -otherwise. - -Note that TypeScript return types will only be inferred properly -from static analysis if the `withFileTypes` option is omitted, or -a constant `true` or `false` value. - -#### `pw.readlinkSync(link = pw.cwd, opts = { withFileTypes: false })` - -Synchronous `pw.readlink()` - -#### `async pw.lstat(entry = pw.cwd)` - -Call `fs.lstat` on the supplied string or Path object, and fill -in as much information as possible, returning the updated `Path` -object. - -Returns `undefined` if the entry does not exist, or if any error -is encountered. - -Note that some `Stats` data (such as `ino`, `dev`, and `mode`) -will not be supplied. For those things, you'll need to call -`fs.lstat` yourself. - -#### `pw.lstatSync(entry = pw.cwd)` - -Synchronous `pw.lstat()` - -#### `pw.realpath(entry = pw.cwd, opts = { withFileTypes: false })` - -Call `fs.realpath` on the supplied string or Path object, and -return the realpath if available. - -Returns `undefined` if any error occurs. - -May be called as `pw.realpath({ withFileTypes: boolean })` to run -on `pw.cwd`. - -#### `pw.realpathSync(entry = pw.cwd, opts = { withFileTypes: false })` - -Synchronous `pw.realpath()` - -### Class `Path` implements [fs.Dirent](https://nodejs.org/docs/latest/api/fs.html#class-fsdirent) - -Object representing a given path on the filesystem, which may or -may not exist. - -Note that the actual class in use will be either `PathWin32` or -`PathPosix`, depending on the implementation of `PathScurry` in -use. They differ in the separators used to split and join path -strings, and the handling of root paths. - -In `PathPosix` implementations, paths are split and joined using -the `'/'` character, and `'/'` is the only root path ever in use. - -In `PathWin32` implementations, paths are split using either -`'/'` or `'\\'` and joined using `'\\'`, and multiple roots may -be in use based on the drives and UNC paths encountered. UNC -paths such as `//?/C:/` that identify a drive letter, will be -treated as an alias for the same root entry as their associated -drive letter (in this case `'C:\\'`). - -#### `path.name` - -Name of this file system entry. - -**Important**: _always_ test the path name against any test -string using the `isNamed` method, and not by directly comparing -this string. Otherwise, unicode path strings that the system sees -as identical will not be properly treated as the same path, -leading to incorrect behavior and possible security issues. - -#### `path.isNamed(name: string): boolean` - -Return true if the path is a match for the given path name. This -handles case sensitivity and unicode normalization. - -Note: even on case-sensitive systems, it is **not** safe to test -the equality of the `.name` property to determine whether a given -pathname matches, due to unicode normalization mismatches. - -Always use this method instead of testing the `path.name` -property directly. - -#### `path.isCWD` - -Set to true if this `Path` object is the current working -directory of the `PathScurry` collection that contains it. - -#### `path.getType()` - -Returns the type of the Path object, `'File'`, `'Directory'`, -etc. - -#### `path.isType(t: type)` - -Returns true if `is{t}()` returns true. - -For example, `path.isType('Directory')` is equivalent to -`path.isDirectory()`. - -#### `path.depth()` - -Return the depth of the Path entry within the directory tree. -Root paths have a depth of `0`. - -#### `path.fullpath()` - -The fully resolved path to the entry. - -#### `path.fullpathPosix()` - -The fully resolved path to the entry, using `/` separators. - -On posix systems, this is identical to `path.fullpath()`. On -windows, this will return a fully resolved absolute UNC path -using `/` separators. Eg, instead of `'C:\\foo\\bar'`, it will -return `'//?/C:/foo/bar'`. - -#### `path.isFile()`, `path.isDirectory()`, etc. - -Same as the identical `fs.Dirent.isX()` methods. - -#### `path.isUnknown()` - -Returns true if the path's type is unknown. Always returns true -when the path is known to not exist. - -#### `path.resolve(p: string)` - -Return a `Path` object associated with the provided path string -as resolved from the current Path object. - -#### `path.relative(): string` - -Return the relative path from the PathWalker cwd to the supplied -path string or entry. - -If the nearest common ancestor is the root, then an absolute path -is returned. - -#### `path.relativePosix(): string` - -Return the relative path from the PathWalker cwd to the supplied -path string or entry, using `/` path separators. - -If the nearest common ancestor is the root, then an absolute path -is returned. - -On posix platforms (ie, all platforms except Windows), this is -identical to `pw.relative(path)`. - -On Windows systems, it returns the resulting string as a -`/`-delimited path. If an absolute path is returned (because the -target does not share a common ancestor with `pw.cwd`), then a -full absolute UNC path will be returned. Ie, instead of -`'C:\\foo\\bar`, it would return `//?/C:/foo/bar`. - -#### `async path.readdir()` - -Return an array of `Path` objects found by reading the associated -path entry. - -If path is not a directory, or if any error occurs, returns `[]`, -and marks all children as provisional and non-existent. - -#### `path.readdirSync()` - -Synchronous `path.readdir()` - -#### `async path.readlink()` - -Return the `Path` object referenced by the `path` as a symbolic -link. - -If the `path` is not a symbolic link, or any error occurs, -returns `undefined`. - -#### `path.readlinkSync()` - -Synchronous `path.readlink()` - -#### `async path.lstat()` - -Call `lstat` on the path object, and fill it in with details -determined. - -If path does not exist, or any other error occurs, returns -`undefined`, and marks the path as "unknown" type. - -#### `path.lstatSync()` - -Synchronous `path.lstat()` - -#### `async path.realpath()` - -Call `realpath` on the path, and return a Path object -corresponding to the result, or `undefined` if any error occurs. - -#### `path.realpathSync()` - -Synchornous `path.realpath()` diff --git a/node_modules/path-scurry/dist/commonjs/index.d.ts b/node_modules/path-scurry/dist/commonjs/index.d.ts deleted file mode 100644 index 3ad4aa5..0000000 --- a/node_modules/path-scurry/dist/commonjs/index.d.ts +++ /dev/null @@ -1,1116 +0,0 @@ -/// -/// -/// -import { LRUCache } from 'lru-cache'; -import { posix, win32 } from 'node:path'; -import { Minipass } from 'minipass'; -import type { Dirent, Stats } from 'node:fs'; -/** - * An object that will be used to override the default `fs` - * methods. Any methods that are not overridden will use Node's - * built-in implementations. - * - * - lstatSync - * - readdir (callback `withFileTypes` Dirent variant, used for - * readdirCB and most walks) - * - readdirSync - * - readlinkSync - * - realpathSync - * - promises: Object containing the following async methods: - * - lstat - * - readdir (Dirent variant only) - * - readlink - * - realpath - */ -export interface FSOption { - lstatSync?: (path: string) => Stats; - readdir?: (path: string, options: { - withFileTypes: true; - }, cb: (er: NodeJS.ErrnoException | null, entries?: Dirent[]) => any) => void; - readdirSync?: (path: string, options: { - withFileTypes: true; - }) => Dirent[]; - readlinkSync?: (path: string) => string; - realpathSync?: (path: string) => string; - promises?: { - lstat?: (path: string) => Promise; - readdir?: (path: string, options: { - withFileTypes: true; - }) => Promise; - readlink?: (path: string) => Promise; - realpath?: (path: string) => Promise; - [k: string]: any; - }; - [k: string]: any; -} -interface FSValue { - lstatSync: (path: string) => Stats; - readdir: (path: string, options: { - withFileTypes: true; - }, cb: (er: NodeJS.ErrnoException | null, entries?: Dirent[]) => any) => void; - readdirSync: (path: string, options: { - withFileTypes: true; - }) => Dirent[]; - readlinkSync: (path: string) => string; - realpathSync: (path: string) => string; - promises: { - lstat: (path: string) => Promise; - readdir: (path: string, options: { - withFileTypes: true; - }) => Promise; - readlink: (path: string) => Promise; - realpath: (path: string) => Promise; - [k: string]: any; - }; - [k: string]: any; -} -export type Type = 'Unknown' | 'FIFO' | 'CharacterDevice' | 'Directory' | 'BlockDevice' | 'File' | 'SymbolicLink' | 'Socket'; -/** - * Options that may be provided to the Path constructor - */ -export interface PathOpts { - fullpath?: string; - relative?: string; - relativePosix?: string; - parent?: PathBase; - /** - * See {@link FSOption} - */ - fs?: FSOption; -} -/** - * An LRUCache for storing resolved path strings or Path objects. - * @internal - */ -export declare class ResolveCache extends LRUCache { - constructor(); -} -/** - * an LRUCache for storing child entries. - * @internal - */ -export declare class ChildrenCache extends LRUCache { - constructor(maxSize?: number); -} -/** - * Array of Path objects, plus a marker indicating the first provisional entry - * - * @internal - */ -export type Children = PathBase[] & { - provisional: number; -}; -declare const setAsCwd: unique symbol; -/** - * Path objects are sort of like a super-powered - * {@link https://nodejs.org/docs/latest/api/fs.html#class-fsdirent fs.Dirent} - * - * Each one represents a single filesystem entry on disk, which may or may not - * exist. It includes methods for reading various types of information via - * lstat, readlink, and readdir, and caches all information to the greatest - * degree possible. - * - * Note that fs operations that would normally throw will instead return an - * "empty" value. This is in order to prevent excessive overhead from error - * stack traces. - */ -export declare abstract class PathBase implements Dirent { - #private; - /** - * the basename of this path - * - * **Important**: *always* test the path name against any test string - * usingthe {@link isNamed} method, and not by directly comparing this - * string. Otherwise, unicode path strings that the system sees as identical - * will not be properly treated as the same path, leading to incorrect - * behavior and possible security issues. - */ - name: string; - /** - * the Path entry corresponding to the path root. - * - * @internal - */ - root: PathBase; - /** - * All roots found within the current PathScurry family - * - * @internal - */ - roots: { - [k: string]: PathBase; - }; - /** - * a reference to the parent path, or undefined in the case of root entries - * - * @internal - */ - parent?: PathBase; - /** - * boolean indicating whether paths are compared case-insensitively - * @internal - */ - nocase: boolean; - /** - * boolean indicating that this path is the current working directory - * of the PathScurry collection that contains it. - */ - isCWD: boolean; - /** - * the string or regexp used to split paths. On posix, it is `'/'`, and on - * windows it is a RegExp matching either `'/'` or `'\\'` - */ - abstract splitSep: string | RegExp; - /** - * The path separator string to use when joining paths - */ - abstract sep: string; - get dev(): number | undefined; - get mode(): number | undefined; - get nlink(): number | undefined; - get uid(): number | undefined; - get gid(): number | undefined; - get rdev(): number | undefined; - get blksize(): number | undefined; - get ino(): number | undefined; - get size(): number | undefined; - get blocks(): number | undefined; - get atimeMs(): number | undefined; - get mtimeMs(): number | undefined; - get ctimeMs(): number | undefined; - get birthtimeMs(): number | undefined; - get atime(): Date | undefined; - get mtime(): Date | undefined; - get ctime(): Date | undefined; - get birthtime(): Date | undefined; - /** - * This property is for compatibility with the Dirent class as of - * Node v20, where Dirent['parentPath'] refers to the path of the - * directory that was passed to readdir. For root entries, it's the path - * to the entry itself. - */ - get parentPath(): string; - /** - * Deprecated alias for Dirent['parentPath'] Somewhat counterintuitively, - * this property refers to the *parent* path, not the path object itself. - */ - get path(): string; - /** - * Do not create new Path objects directly. They should always be accessed - * via the PathScurry class or other methods on the Path class. - * - * @internal - */ - constructor(name: string, type: number | undefined, root: PathBase | undefined, roots: { - [k: string]: PathBase; - }, nocase: boolean, children: ChildrenCache, opts: PathOpts); - /** - * Returns the depth of the Path object from its root. - * - * For example, a path at `/foo/bar` would have a depth of 2. - */ - depth(): number; - /** - * @internal - */ - abstract getRootString(path: string): string; - /** - * @internal - */ - abstract getRoot(rootPath: string): PathBase; - /** - * @internal - */ - abstract newChild(name: string, type?: number, opts?: PathOpts): PathBase; - /** - * @internal - */ - childrenCache(): ChildrenCache; - /** - * Get the Path object referenced by the string path, resolved from this Path - */ - resolve(path?: string): PathBase; - /** - * Returns the cached children Path objects, if still available. If they - * have fallen out of the cache, then returns an empty array, and resets the - * READDIR_CALLED bit, so that future calls to readdir() will require an fs - * lookup. - * - * @internal - */ - children(): Children; - /** - * Resolves a path portion and returns or creates the child Path. - * - * Returns `this` if pathPart is `''` or `'.'`, or `parent` if pathPart is - * `'..'`. - * - * This should not be called directly. If `pathPart` contains any path - * separators, it will lead to unsafe undefined behavior. - * - * Use `Path.resolve()` instead. - * - * @internal - */ - child(pathPart: string, opts?: PathOpts): PathBase; - /** - * The relative path from the cwd. If it does not share an ancestor with - * the cwd, then this ends up being equivalent to the fullpath() - */ - relative(): string; - /** - * The relative path from the cwd, using / as the path separator. - * If it does not share an ancestor with - * the cwd, then this ends up being equivalent to the fullpathPosix() - * On posix systems, this is identical to relative(). - */ - relativePosix(): string; - /** - * The fully resolved path string for this Path entry - */ - fullpath(): string; - /** - * On platforms other than windows, this is identical to fullpath. - * - * On windows, this is overridden to return the forward-slash form of the - * full UNC path. - */ - fullpathPosix(): string; - /** - * Is the Path of an unknown type? - * - * Note that we might know *something* about it if there has been a previous - * filesystem operation, for example that it does not exist, or is not a - * link, or whether it has child entries. - */ - isUnknown(): boolean; - isType(type: Type): boolean; - getType(): Type; - /** - * Is the Path a regular file? - */ - isFile(): boolean; - /** - * Is the Path a directory? - */ - isDirectory(): boolean; - /** - * Is the path a character device? - */ - isCharacterDevice(): boolean; - /** - * Is the path a block device? - */ - isBlockDevice(): boolean; - /** - * Is the path a FIFO pipe? - */ - isFIFO(): boolean; - /** - * Is the path a socket? - */ - isSocket(): boolean; - /** - * Is the path a symbolic link? - */ - isSymbolicLink(): boolean; - /** - * Return the entry if it has been subject of a successful lstat, or - * undefined otherwise. - * - * Does not read the filesystem, so an undefined result *could* simply - * mean that we haven't called lstat on it. - */ - lstatCached(): PathBase | undefined; - /** - * Return the cached link target if the entry has been the subject of a - * successful readlink, or undefined otherwise. - * - * Does not read the filesystem, so an undefined result *could* just mean we - * don't have any cached data. Only use it if you are very sure that a - * readlink() has been called at some point. - */ - readlinkCached(): PathBase | undefined; - /** - * Returns the cached realpath target if the entry has been the subject - * of a successful realpath, or undefined otherwise. - * - * Does not read the filesystem, so an undefined result *could* just mean we - * don't have any cached data. Only use it if you are very sure that a - * realpath() has been called at some point. - */ - realpathCached(): PathBase | undefined; - /** - * Returns the cached child Path entries array if the entry has been the - * subject of a successful readdir(), or [] otherwise. - * - * Does not read the filesystem, so an empty array *could* just mean we - * don't have any cached data. Only use it if you are very sure that a - * readdir() has been called recently enough to still be valid. - */ - readdirCached(): PathBase[]; - /** - * Return true if it's worth trying to readlink. Ie, we don't (yet) have - * any indication that readlink will definitely fail. - * - * Returns false if the path is known to not be a symlink, if a previous - * readlink failed, or if the entry does not exist. - */ - canReadlink(): boolean; - /** - * Return true if readdir has previously been successfully called on this - * path, indicating that cachedReaddir() is likely valid. - */ - calledReaddir(): boolean; - /** - * Returns true if the path is known to not exist. That is, a previous lstat - * or readdir failed to verify its existence when that would have been - * expected, or a parent entry was marked either enoent or enotdir. - */ - isENOENT(): boolean; - /** - * Return true if the path is a match for the given path name. This handles - * case sensitivity and unicode normalization. - * - * Note: even on case-sensitive systems, it is **not** safe to test the - * equality of the `.name` property to determine whether a given pathname - * matches, due to unicode normalization mismatches. - * - * Always use this method instead of testing the `path.name` property - * directly. - */ - isNamed(n: string): boolean; - /** - * Return the Path object corresponding to the target of a symbolic link. - * - * If the Path is not a symbolic link, or if the readlink call fails for any - * reason, `undefined` is returned. - * - * Result is cached, and thus may be outdated if the filesystem is mutated. - */ - readlink(): Promise; - /** - * Synchronous {@link PathBase.readlink} - */ - readlinkSync(): PathBase | undefined; - /** - * Call lstat() on this Path, and update all known information that can be - * determined. - * - * Note that unlike `fs.lstat()`, the returned value does not contain some - * information, such as `mode`, `dev`, `nlink`, and `ino`. If that - * information is required, you will need to call `fs.lstat` yourself. - * - * If the Path refers to a nonexistent file, or if the lstat call fails for - * any reason, `undefined` is returned. Otherwise the updated Path object is - * returned. - * - * Results are cached, and thus may be out of date if the filesystem is - * mutated. - */ - lstat(): Promise; - /** - * synchronous {@link PathBase.lstat} - */ - lstatSync(): PathBase | undefined; - /** - * Standard node-style callback interface to get list of directory entries. - * - * If the Path cannot or does not contain any children, then an empty array - * is returned. - * - * Results are cached, and thus may be out of date if the filesystem is - * mutated. - * - * @param cb The callback called with (er, entries). Note that the `er` - * param is somewhat extraneous, as all readdir() errors are handled and - * simply result in an empty set of entries being returned. - * @param allowZalgo Boolean indicating that immediately known results should - * *not* be deferred with `queueMicrotask`. Defaults to `false`. Release - * zalgo at your peril, the dark pony lord is devious and unforgiving. - */ - readdirCB(cb: (er: NodeJS.ErrnoException | null, entries: PathBase[]) => any, allowZalgo?: boolean): void; - /** - * Return an array of known child entries. - * - * If the Path cannot or does not contain any children, then an empty array - * is returned. - * - * Results are cached, and thus may be out of date if the filesystem is - * mutated. - */ - readdir(): Promise; - /** - * synchronous {@link PathBase.readdir} - */ - readdirSync(): PathBase[]; - canReaddir(): boolean; - shouldWalk(dirs: Set, walkFilter?: (e: PathBase) => boolean): boolean; - /** - * Return the Path object corresponding to path as resolved - * by realpath(3). - * - * If the realpath call fails for any reason, `undefined` is returned. - * - * Result is cached, and thus may be outdated if the filesystem is mutated. - * On success, returns a Path object. - */ - realpath(): Promise; - /** - * Synchronous {@link realpath} - */ - realpathSync(): PathBase | undefined; - /** - * Internal method to mark this Path object as the scurry cwd, - * called by {@link PathScurry#chdir} - * - * @internal - */ - [setAsCwd](oldCwd: PathBase): void; -} -/** - * Path class used on win32 systems - * - * Uses `'\\'` as the path separator for returned paths, either `'\\'` or `'/'` - * as the path separator for parsing paths. - */ -export declare class PathWin32 extends PathBase { - /** - * Separator for generating path strings. - */ - sep: '\\'; - /** - * Separator for parsing path strings. - */ - splitSep: RegExp; - /** - * Do not create new Path objects directly. They should always be accessed - * via the PathScurry class or other methods on the Path class. - * - * @internal - */ - constructor(name: string, type: number | undefined, root: PathBase | undefined, roots: { - [k: string]: PathBase; - }, nocase: boolean, children: ChildrenCache, opts: PathOpts); - /** - * @internal - */ - newChild(name: string, type?: number, opts?: PathOpts): PathWin32; - /** - * @internal - */ - getRootString(path: string): string; - /** - * @internal - */ - getRoot(rootPath: string): PathBase; - /** - * @internal - */ - sameRoot(rootPath: string, compare?: string): boolean; -} -/** - * Path class used on all posix systems. - * - * Uses `'/'` as the path separator. - */ -export declare class PathPosix extends PathBase { - /** - * separator for parsing path strings - */ - splitSep: '/'; - /** - * separator for generating path strings - */ - sep: '/'; - /** - * Do not create new Path objects directly. They should always be accessed - * via the PathScurry class or other methods on the Path class. - * - * @internal - */ - constructor(name: string, type: number | undefined, root: PathBase | undefined, roots: { - [k: string]: PathBase; - }, nocase: boolean, children: ChildrenCache, opts: PathOpts); - /** - * @internal - */ - getRootString(path: string): string; - /** - * @internal - */ - getRoot(_rootPath: string): PathBase; - /** - * @internal - */ - newChild(name: string, type?: number, opts?: PathOpts): PathPosix; -} -/** - * Options that may be provided to the PathScurry constructor - */ -export interface PathScurryOpts { - /** - * perform case-insensitive path matching. Default based on platform - * subclass. - */ - nocase?: boolean; - /** - * Number of Path entries to keep in the cache of Path child references. - * - * Setting this higher than 65536 will dramatically increase the data - * consumption and construction time overhead of each PathScurry. - * - * Setting this value to 256 or lower will significantly reduce the data - * consumption and construction time overhead, but may also reduce resolve() - * and readdir() performance on large filesystems. - * - * Default `16384`. - */ - childrenCacheSize?: number; - /** - * An object that overrides the built-in functions from the fs and - * fs/promises modules. - * - * See {@link FSOption} - */ - fs?: FSOption; -} -/** - * The base class for all PathScurry classes, providing the interface for path - * resolution and filesystem operations. - * - * Typically, you should *not* instantiate this class directly, but rather one - * of the platform-specific classes, or the exported {@link PathScurry} which - * defaults to the current platform. - */ -export declare abstract class PathScurryBase { - #private; - /** - * The root Path entry for the current working directory of this Scurry - */ - root: PathBase; - /** - * The string path for the root of this Scurry's current working directory - */ - rootPath: string; - /** - * A collection of all roots encountered, referenced by rootPath - */ - roots: { - [k: string]: PathBase; - }; - /** - * The Path entry corresponding to this PathScurry's current working directory. - */ - cwd: PathBase; - /** - * Perform path comparisons case-insensitively. - * - * Defaults true on Darwin and Windows systems, false elsewhere. - */ - nocase: boolean; - /** - * The path separator used for parsing paths - * - * `'/'` on Posix systems, either `'/'` or `'\\'` on Windows - */ - abstract sep: string | RegExp; - /** - * This class should not be instantiated directly. - * - * Use PathScurryWin32, PathScurryDarwin, PathScurryPosix, or PathScurry - * - * @internal - */ - constructor(cwd: string | URL | undefined, pathImpl: typeof win32 | typeof posix, sep: string | RegExp, { nocase, childrenCacheSize, fs, }?: PathScurryOpts); - /** - * Get the depth of a provided path, string, or the cwd - */ - depth(path?: Path | string): number; - /** - * Parse the root portion of a path string - * - * @internal - */ - abstract parseRootPath(dir: string): string; - /** - * create a new Path to use as root during construction. - * - * @internal - */ - abstract newRoot(fs: FSValue): PathBase; - /** - * Determine whether a given path string is absolute - */ - abstract isAbsolute(p: string): boolean; - /** - * Return the cache of child entries. Exposed so subclasses can create - * child Path objects in a platform-specific way. - * - * @internal - */ - childrenCache(): ChildrenCache; - /** - * Resolve one or more path strings to a resolved string - * - * Same interface as require('path').resolve. - * - * Much faster than path.resolve() when called multiple times for the same - * path, because the resolved Path objects are cached. Much slower - * otherwise. - */ - resolve(...paths: string[]): string; - /** - * Resolve one or more path strings to a resolved string, returning - * the posix path. Identical to .resolve() on posix systems, but on - * windows will return a forward-slash separated UNC path. - * - * Same interface as require('path').resolve. - * - * Much faster than path.resolve() when called multiple times for the same - * path, because the resolved Path objects are cached. Much slower - * otherwise. - */ - resolvePosix(...paths: string[]): string; - /** - * find the relative path from the cwd to the supplied path string or entry - */ - relative(entry?: PathBase | string): string; - /** - * find the relative path from the cwd to the supplied path string or - * entry, using / as the path delimiter, even on Windows. - */ - relativePosix(entry?: PathBase | string): string; - /** - * Return the basename for the provided string or Path object - */ - basename(entry?: PathBase | string): string; - /** - * Return the dirname for the provided string or Path object - */ - dirname(entry?: PathBase | string): string; - /** - * Return an array of known child entries. - * - * First argument may be either a string, or a Path object. - * - * If the Path cannot or does not contain any children, then an empty array - * is returned. - * - * Results are cached, and thus may be out of date if the filesystem is - * mutated. - * - * Unlike `fs.readdir()`, the `withFileTypes` option defaults to `true`. Set - * `{ withFileTypes: false }` to return strings. - */ - readdir(): Promise; - readdir(opts: { - withFileTypes: true; - }): Promise; - readdir(opts: { - withFileTypes: false; - }): Promise; - readdir(opts: { - withFileTypes: boolean; - }): Promise; - readdir(entry: PathBase | string): Promise; - readdir(entry: PathBase | string, opts: { - withFileTypes: true; - }): Promise; - readdir(entry: PathBase | string, opts: { - withFileTypes: false; - }): Promise; - readdir(entry: PathBase | string, opts: { - withFileTypes: boolean; - }): Promise; - /** - * synchronous {@link PathScurryBase.readdir} - */ - readdirSync(): PathBase[]; - readdirSync(opts: { - withFileTypes: true; - }): PathBase[]; - readdirSync(opts: { - withFileTypes: false; - }): string[]; - readdirSync(opts: { - withFileTypes: boolean; - }): PathBase[] | string[]; - readdirSync(entry: PathBase | string): PathBase[]; - readdirSync(entry: PathBase | string, opts: { - withFileTypes: true; - }): PathBase[]; - readdirSync(entry: PathBase | string, opts: { - withFileTypes: false; - }): string[]; - readdirSync(entry: PathBase | string, opts: { - withFileTypes: boolean; - }): PathBase[] | string[]; - /** - * Call lstat() on the string or Path object, and update all known - * information that can be determined. - * - * Note that unlike `fs.lstat()`, the returned value does not contain some - * information, such as `mode`, `dev`, `nlink`, and `ino`. If that - * information is required, you will need to call `fs.lstat` yourself. - * - * If the Path refers to a nonexistent file, or if the lstat call fails for - * any reason, `undefined` is returned. Otherwise the updated Path object is - * returned. - * - * Results are cached, and thus may be out of date if the filesystem is - * mutated. - */ - lstat(entry?: string | PathBase): Promise; - /** - * synchronous {@link PathScurryBase.lstat} - */ - lstatSync(entry?: string | PathBase): PathBase | undefined; - /** - * Return the Path object or string path corresponding to the target of a - * symbolic link. - * - * If the path is not a symbolic link, or if the readlink call fails for any - * reason, `undefined` is returned. - * - * Result is cached, and thus may be outdated if the filesystem is mutated. - * - * `{withFileTypes}` option defaults to `false`. - * - * On success, returns a Path object if `withFileTypes` option is true, - * otherwise a string. - */ - readlink(): Promise; - readlink(opt: { - withFileTypes: false; - }): Promise; - readlink(opt: { - withFileTypes: true; - }): Promise; - readlink(opt: { - withFileTypes: boolean; - }): Promise; - readlink(entry: string | PathBase, opt?: { - withFileTypes: false; - }): Promise; - readlink(entry: string | PathBase, opt: { - withFileTypes: true; - }): Promise; - readlink(entry: string | PathBase, opt: { - withFileTypes: boolean; - }): Promise; - /** - * synchronous {@link PathScurryBase.readlink} - */ - readlinkSync(): string | undefined; - readlinkSync(opt: { - withFileTypes: false; - }): string | undefined; - readlinkSync(opt: { - withFileTypes: true; - }): PathBase | undefined; - readlinkSync(opt: { - withFileTypes: boolean; - }): PathBase | string | undefined; - readlinkSync(entry: string | PathBase, opt?: { - withFileTypes: false; - }): string | undefined; - readlinkSync(entry: string | PathBase, opt: { - withFileTypes: true; - }): PathBase | undefined; - readlinkSync(entry: string | PathBase, opt: { - withFileTypes: boolean; - }): string | PathBase | undefined; - /** - * Return the Path object or string path corresponding to path as resolved - * by realpath(3). - * - * If the realpath call fails for any reason, `undefined` is returned. - * - * Result is cached, and thus may be outdated if the filesystem is mutated. - * - * `{withFileTypes}` option defaults to `false`. - * - * On success, returns a Path object if `withFileTypes` option is true, - * otherwise a string. - */ - realpath(): Promise; - realpath(opt: { - withFileTypes: false; - }): Promise; - realpath(opt: { - withFileTypes: true; - }): Promise; - realpath(opt: { - withFileTypes: boolean; - }): Promise; - realpath(entry: string | PathBase, opt?: { - withFileTypes: false; - }): Promise; - realpath(entry: string | PathBase, opt: { - withFileTypes: true; - }): Promise; - realpath(entry: string | PathBase, opt: { - withFileTypes: boolean; - }): Promise; - realpathSync(): string | undefined; - realpathSync(opt: { - withFileTypes: false; - }): string | undefined; - realpathSync(opt: { - withFileTypes: true; - }): PathBase | undefined; - realpathSync(opt: { - withFileTypes: boolean; - }): PathBase | string | undefined; - realpathSync(entry: string | PathBase, opt?: { - withFileTypes: false; - }): string | undefined; - realpathSync(entry: string | PathBase, opt: { - withFileTypes: true; - }): PathBase | undefined; - realpathSync(entry: string | PathBase, opt: { - withFileTypes: boolean; - }): string | PathBase | undefined; - /** - * Asynchronously walk the directory tree, returning an array of - * all path strings or Path objects found. - * - * Note that this will be extremely memory-hungry on large filesystems. - * In such cases, it may be better to use the stream or async iterator - * walk implementation. - */ - walk(): Promise; - walk(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Promise; - walk(opts: WalkOptionsWithFileTypesFalse): Promise; - walk(opts: WalkOptions): Promise; - walk(entry: string | PathBase): Promise; - walk(entry: string | PathBase, opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Promise; - walk(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): Promise; - walk(entry: string | PathBase, opts: WalkOptions): Promise; - /** - * Synchronously walk the directory tree, returning an array of - * all path strings or Path objects found. - * - * Note that this will be extremely memory-hungry on large filesystems. - * In such cases, it may be better to use the stream or async iterator - * walk implementation. - */ - walkSync(): PathBase[]; - walkSync(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): PathBase[]; - walkSync(opts: WalkOptionsWithFileTypesFalse): string[]; - walkSync(opts: WalkOptions): string[] | PathBase[]; - walkSync(entry: string | PathBase): PathBase[]; - walkSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesUnset | WalkOptionsWithFileTypesTrue): PathBase[]; - walkSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): string[]; - walkSync(entry: string | PathBase, opts: WalkOptions): PathBase[] | string[]; - /** - * Support for `for await` - * - * Alias for {@link PathScurryBase.iterate} - * - * Note: As of Node 19, this is very slow, compared to other methods of - * walking. Consider using {@link PathScurryBase.stream} if memory overhead - * and backpressure are concerns, or {@link PathScurryBase.walk} if not. - */ - [Symbol.asyncIterator](): AsyncGenerator; - /** - * Async generator form of {@link PathScurryBase.walk} - * - * Note: As of Node 19, this is very slow, compared to other methods of - * walking, especially if most/all of the directory tree has been previously - * walked. Consider using {@link PathScurryBase.stream} if memory overhead - * and backpressure are concerns, or {@link PathScurryBase.walk} if not. - */ - iterate(): AsyncGenerator; - iterate(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): AsyncGenerator; - iterate(opts: WalkOptionsWithFileTypesFalse): AsyncGenerator; - iterate(opts: WalkOptions): AsyncGenerator; - iterate(entry: string | PathBase): AsyncGenerator; - iterate(entry: string | PathBase, opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): AsyncGenerator; - iterate(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): AsyncGenerator; - iterate(entry: string | PathBase, opts: WalkOptions): AsyncGenerator; - /** - * Iterating over a PathScurry performs a synchronous walk. - * - * Alias for {@link PathScurryBase.iterateSync} - */ - [Symbol.iterator](): Generator; - iterateSync(): Generator; - iterateSync(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Generator; - iterateSync(opts: WalkOptionsWithFileTypesFalse): Generator; - iterateSync(opts: WalkOptions): Generator; - iterateSync(entry: string | PathBase): Generator; - iterateSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Generator; - iterateSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): Generator; - iterateSync(entry: string | PathBase, opts: WalkOptions): Generator; - /** - * Stream form of {@link PathScurryBase.walk} - * - * Returns a Minipass stream that emits {@link PathBase} objects by default, - * or strings if `{ withFileTypes: false }` is set in the options. - */ - stream(): Minipass; - stream(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Minipass; - stream(opts: WalkOptionsWithFileTypesFalse): Minipass; - stream(opts: WalkOptions): Minipass; - stream(entry: string | PathBase): Minipass; - stream(entry: string | PathBase, opts: WalkOptionsWithFileTypesUnset | WalkOptionsWithFileTypesTrue): Minipass; - stream(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): Minipass; - stream(entry: string | PathBase, opts: WalkOptions): Minipass | Minipass; - /** - * Synchronous form of {@link PathScurryBase.stream} - * - * Returns a Minipass stream that emits {@link PathBase} objects by default, - * or strings if `{ withFileTypes: false }` is set in the options. - * - * Will complete the walk in a single tick if the stream is consumed fully. - * Otherwise, will pause as needed for stream backpressure. - */ - streamSync(): Minipass; - streamSync(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Minipass; - streamSync(opts: WalkOptionsWithFileTypesFalse): Minipass; - streamSync(opts: WalkOptions): Minipass; - streamSync(entry: string | PathBase): Minipass; - streamSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesUnset | WalkOptionsWithFileTypesTrue): Minipass; - streamSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): Minipass; - streamSync(entry: string | PathBase, opts: WalkOptions): Minipass | Minipass; - chdir(path?: string | Path): void; -} -/** - * Options provided to all walk methods. - */ -export interface WalkOptions { - /** - * Return results as {@link PathBase} objects rather than strings. - * When set to false, results are fully resolved paths, as returned by - * {@link PathBase.fullpath}. - * @default true - */ - withFileTypes?: boolean; - /** - * Attempt to read directory entries from symbolic links. Otherwise, only - * actual directories are traversed. Regardless of this setting, a given - * target path will only ever be walked once, meaning that a symbolic link - * to a previously traversed directory will never be followed. - * - * Setting this imposes a slight performance penalty, because `readlink` - * must be called on all symbolic links encountered, in order to avoid - * infinite cycles. - * @default false - */ - follow?: boolean; - /** - * Only return entries where the provided function returns true. - * - * This will not prevent directories from being traversed, even if they do - * not pass the filter, though it will prevent directories themselves from - * being included in the result set. See {@link walkFilter} - * - * Asynchronous functions are not supported here. - * - * By default, if no filter is provided, all entries and traversed - * directories are included. - */ - filter?: (entry: PathBase) => boolean; - /** - * Only traverse directories (and in the case of {@link follow} being set to - * true, symbolic links to directories) if the provided function returns - * true. - * - * This will not prevent directories from being included in the result set, - * even if they do not pass the supplied filter function. See {@link filter} - * to do that. - * - * Asynchronous functions are not supported here. - */ - walkFilter?: (entry: PathBase) => boolean; -} -export type WalkOptionsWithFileTypesUnset = WalkOptions & { - withFileTypes?: undefined; -}; -export type WalkOptionsWithFileTypesTrue = WalkOptions & { - withFileTypes: true; -}; -export type WalkOptionsWithFileTypesFalse = WalkOptions & { - withFileTypes: false; -}; -/** - * Windows implementation of {@link PathScurryBase} - * - * Defaults to case insensitve, uses `'\\'` to generate path strings. Uses - * {@link PathWin32} for Path objects. - */ -export declare class PathScurryWin32 extends PathScurryBase { - /** - * separator for generating path strings - */ - sep: '\\'; - constructor(cwd?: URL | string, opts?: PathScurryOpts); - /** - * @internal - */ - parseRootPath(dir: string): string; - /** - * @internal - */ - newRoot(fs: FSValue): PathWin32; - /** - * Return true if the provided path string is an absolute path - */ - isAbsolute(p: string): boolean; -} -/** - * {@link PathScurryBase} implementation for all posix systems other than Darwin. - * - * Defaults to case-sensitive matching, uses `'/'` to generate path strings. - * - * Uses {@link PathPosix} for Path objects. - */ -export declare class PathScurryPosix extends PathScurryBase { - /** - * separator for generating path strings - */ - sep: '/'; - constructor(cwd?: URL | string, opts?: PathScurryOpts); - /** - * @internal - */ - parseRootPath(_dir: string): string; - /** - * @internal - */ - newRoot(fs: FSValue): PathPosix; - /** - * Return true if the provided path string is an absolute path - */ - isAbsolute(p: string): boolean; -} -/** - * {@link PathScurryBase} implementation for Darwin (macOS) systems. - * - * Defaults to case-insensitive matching, uses `'/'` for generating path - * strings. - * - * Uses {@link PathPosix} for Path objects. - */ -export declare class PathScurryDarwin extends PathScurryPosix { - constructor(cwd?: URL | string, opts?: PathScurryOpts); -} -/** - * Default {@link PathBase} implementation for the current platform. - * - * {@link PathWin32} on Windows systems, {@link PathPosix} on all others. - */ -export declare const Path: typeof PathWin32 | typeof PathPosix; -export type Path = PathBase | InstanceType; -/** - * Default {@link PathScurryBase} implementation for the current platform. - * - * {@link PathScurryWin32} on Windows systems, {@link PathScurryDarwin} on - * Darwin (macOS) systems, {@link PathScurryPosix} on all others. - */ -export declare const PathScurry: typeof PathScurryWin32 | typeof PathScurryDarwin | typeof PathScurryPosix; -export type PathScurry = PathScurryBase | InstanceType; -export {}; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/path-scurry/dist/commonjs/index.d.ts.map b/node_modules/path-scurry/dist/commonjs/index.d.ts.map deleted file mode 100644 index 1f59f8f..0000000 --- a/node_modules/path-scurry/dist/commonjs/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/path-scurry/dist/commonjs/index.js b/node_modules/path-scurry/dist/commonjs/index.js deleted file mode 100644 index 555de62..0000000 --- a/node_modules/path-scurry/dist/commonjs/index.js +++ /dev/null @@ -1,2014 +0,0 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.PathScurry = exports.Path = exports.PathScurryDarwin = exports.PathScurryPosix = exports.PathScurryWin32 = exports.PathScurryBase = exports.PathPosix = exports.PathWin32 = exports.PathBase = exports.ChildrenCache = exports.ResolveCache = void 0; -const lru_cache_1 = require("lru-cache"); -const node_path_1 = require("node:path"); -const node_url_1 = require("node:url"); -const fs_1 = require("fs"); -const actualFS = __importStar(require("node:fs")); -const realpathSync = fs_1.realpathSync.native; -// TODO: test perf of fs/promises realpath vs realpathCB, -// since the promises one uses realpath.native -const promises_1 = require("node:fs/promises"); -const minipass_1 = require("minipass"); -const defaultFS = { - lstatSync: fs_1.lstatSync, - readdir: fs_1.readdir, - readdirSync: fs_1.readdirSync, - readlinkSync: fs_1.readlinkSync, - realpathSync, - promises: { - lstat: promises_1.lstat, - readdir: promises_1.readdir, - readlink: promises_1.readlink, - realpath: promises_1.realpath, - }, -}; -// if they just gave us require('fs') then use our default -const fsFromOption = (fsOption) => !fsOption || fsOption === defaultFS || fsOption === actualFS ? - defaultFS - : { - ...defaultFS, - ...fsOption, - promises: { - ...defaultFS.promises, - ...(fsOption.promises || {}), - }, - }; -// turn something like //?/c:/ into c:\ -const uncDriveRegexp = /^\\\\\?\\([a-z]:)\\?$/i; -const uncToDrive = (rootPath) => rootPath.replace(/\//g, '\\').replace(uncDriveRegexp, '$1\\'); -// windows paths are separated by either / or \ -const eitherSep = /[\\\/]/; -const UNKNOWN = 0; // may not even exist, for all we know -const IFIFO = 0b0001; -const IFCHR = 0b0010; -const IFDIR = 0b0100; -const IFBLK = 0b0110; -const IFREG = 0b1000; -const IFLNK = 0b1010; -const IFSOCK = 0b1100; -const IFMT = 0b1111; -// mask to unset low 4 bits -const IFMT_UNKNOWN = ~IFMT; -// set after successfully calling readdir() and getting entries. -const READDIR_CALLED = 0b0000_0001_0000; -// set after a successful lstat() -const LSTAT_CALLED = 0b0000_0010_0000; -// set if an entry (or one of its parents) is definitely not a dir -const ENOTDIR = 0b0000_0100_0000; -// set if an entry (or one of its parents) does not exist -// (can also be set on lstat errors like EACCES or ENAMETOOLONG) -const ENOENT = 0b0000_1000_0000; -// cannot have child entries -- also verify &IFMT is either IFDIR or IFLNK -// set if we fail to readlink -const ENOREADLINK = 0b0001_0000_0000; -// set if we know realpath() will fail -const ENOREALPATH = 0b0010_0000_0000; -const ENOCHILD = ENOTDIR | ENOENT | ENOREALPATH; -const TYPEMASK = 0b0011_1111_1111; -const entToType = (s) => s.isFile() ? IFREG - : s.isDirectory() ? IFDIR - : s.isSymbolicLink() ? IFLNK - : s.isCharacterDevice() ? IFCHR - : s.isBlockDevice() ? IFBLK - : s.isSocket() ? IFSOCK - : s.isFIFO() ? IFIFO - : UNKNOWN; -// normalize unicode path names -const normalizeCache = new Map(); -const normalize = (s) => { - const c = normalizeCache.get(s); - if (c) - return c; - const n = s.normalize('NFKD'); - normalizeCache.set(s, n); - return n; -}; -const normalizeNocaseCache = new Map(); -const normalizeNocase = (s) => { - const c = normalizeNocaseCache.get(s); - if (c) - return c; - const n = normalize(s.toLowerCase()); - normalizeNocaseCache.set(s, n); - return n; -}; -/** - * An LRUCache for storing resolved path strings or Path objects. - * @internal - */ -class ResolveCache extends lru_cache_1.LRUCache { - constructor() { - super({ max: 256 }); - } -} -exports.ResolveCache = ResolveCache; -// In order to prevent blowing out the js heap by allocating hundreds of -// thousands of Path entries when walking extremely large trees, the "children" -// in this tree are represented by storing an array of Path entries in an -// LRUCache, indexed by the parent. At any time, Path.children() may return an -// empty array, indicating that it doesn't know about any of its children, and -// thus has to rebuild that cache. This is fine, it just means that we don't -// benefit as much from having the cached entries, but huge directory walks -// don't blow out the stack, and smaller ones are still as fast as possible. -// -//It does impose some complexity when building up the readdir data, because we -//need to pass a reference to the children array that we started with. -/** - * an LRUCache for storing child entries. - * @internal - */ -class ChildrenCache extends lru_cache_1.LRUCache { - constructor(maxSize = 16 * 1024) { - super({ - maxSize, - // parent + children - sizeCalculation: a => a.length + 1, - }); - } -} -exports.ChildrenCache = ChildrenCache; -const setAsCwd = Symbol('PathScurry setAsCwd'); -/** - * Path objects are sort of like a super-powered - * {@link https://nodejs.org/docs/latest/api/fs.html#class-fsdirent fs.Dirent} - * - * Each one represents a single filesystem entry on disk, which may or may not - * exist. It includes methods for reading various types of information via - * lstat, readlink, and readdir, and caches all information to the greatest - * degree possible. - * - * Note that fs operations that would normally throw will instead return an - * "empty" value. This is in order to prevent excessive overhead from error - * stack traces. - */ -class PathBase { - /** - * the basename of this path - * - * **Important**: *always* test the path name against any test string - * usingthe {@link isNamed} method, and not by directly comparing this - * string. Otherwise, unicode path strings that the system sees as identical - * will not be properly treated as the same path, leading to incorrect - * behavior and possible security issues. - */ - name; - /** - * the Path entry corresponding to the path root. - * - * @internal - */ - root; - /** - * All roots found within the current PathScurry family - * - * @internal - */ - roots; - /** - * a reference to the parent path, or undefined in the case of root entries - * - * @internal - */ - parent; - /** - * boolean indicating whether paths are compared case-insensitively - * @internal - */ - nocase; - /** - * boolean indicating that this path is the current working directory - * of the PathScurry collection that contains it. - */ - isCWD = false; - // potential default fs override - #fs; - // Stats fields - #dev; - get dev() { - return this.#dev; - } - #mode; - get mode() { - return this.#mode; - } - #nlink; - get nlink() { - return this.#nlink; - } - #uid; - get uid() { - return this.#uid; - } - #gid; - get gid() { - return this.#gid; - } - #rdev; - get rdev() { - return this.#rdev; - } - #blksize; - get blksize() { - return this.#blksize; - } - #ino; - get ino() { - return this.#ino; - } - #size; - get size() { - return this.#size; - } - #blocks; - get blocks() { - return this.#blocks; - } - #atimeMs; - get atimeMs() { - return this.#atimeMs; - } - #mtimeMs; - get mtimeMs() { - return this.#mtimeMs; - } - #ctimeMs; - get ctimeMs() { - return this.#ctimeMs; - } - #birthtimeMs; - get birthtimeMs() { - return this.#birthtimeMs; - } - #atime; - get atime() { - return this.#atime; - } - #mtime; - get mtime() { - return this.#mtime; - } - #ctime; - get ctime() { - return this.#ctime; - } - #birthtime; - get birthtime() { - return this.#birthtime; - } - #matchName; - #depth; - #fullpath; - #fullpathPosix; - #relative; - #relativePosix; - #type; - #children; - #linkTarget; - #realpath; - /** - * This property is for compatibility with the Dirent class as of - * Node v20, where Dirent['parentPath'] refers to the path of the - * directory that was passed to readdir. For root entries, it's the path - * to the entry itself. - */ - get parentPath() { - return (this.parent || this).fullpath(); - } - /** - * Deprecated alias for Dirent['parentPath'] Somewhat counterintuitively, - * this property refers to the *parent* path, not the path object itself. - */ - get path() { - return this.parentPath; - } - /** - * Do not create new Path objects directly. They should always be accessed - * via the PathScurry class or other methods on the Path class. - * - * @internal - */ - constructor(name, type = UNKNOWN, root, roots, nocase, children, opts) { - this.name = name; - this.#matchName = nocase ? normalizeNocase(name) : normalize(name); - this.#type = type & TYPEMASK; - this.nocase = nocase; - this.roots = roots; - this.root = root || this; - this.#children = children; - this.#fullpath = opts.fullpath; - this.#relative = opts.relative; - this.#relativePosix = opts.relativePosix; - this.parent = opts.parent; - if (this.parent) { - this.#fs = this.parent.#fs; - } - else { - this.#fs = fsFromOption(opts.fs); - } - } - /** - * Returns the depth of the Path object from its root. - * - * For example, a path at `/foo/bar` would have a depth of 2. - */ - depth() { - if (this.#depth !== undefined) - return this.#depth; - if (!this.parent) - return (this.#depth = 0); - return (this.#depth = this.parent.depth() + 1); - } - /** - * @internal - */ - childrenCache() { - return this.#children; - } - /** - * Get the Path object referenced by the string path, resolved from this Path - */ - resolve(path) { - if (!path) { - return this; - } - const rootPath = this.getRootString(path); - const dir = path.substring(rootPath.length); - const dirParts = dir.split(this.splitSep); - const result = rootPath ? - this.getRoot(rootPath).#resolveParts(dirParts) - : this.#resolveParts(dirParts); - return result; - } - #resolveParts(dirParts) { - let p = this; - for (const part of dirParts) { - p = p.child(part); - } - return p; - } - /** - * Returns the cached children Path objects, if still available. If they - * have fallen out of the cache, then returns an empty array, and resets the - * READDIR_CALLED bit, so that future calls to readdir() will require an fs - * lookup. - * - * @internal - */ - children() { - const cached = this.#children.get(this); - if (cached) { - return cached; - } - const children = Object.assign([], { provisional: 0 }); - this.#children.set(this, children); - this.#type &= ~READDIR_CALLED; - return children; - } - /** - * Resolves a path portion and returns or creates the child Path. - * - * Returns `this` if pathPart is `''` or `'.'`, or `parent` if pathPart is - * `'..'`. - * - * This should not be called directly. If `pathPart` contains any path - * separators, it will lead to unsafe undefined behavior. - * - * Use `Path.resolve()` instead. - * - * @internal - */ - child(pathPart, opts) { - if (pathPart === '' || pathPart === '.') { - return this; - } - if (pathPart === '..') { - return this.parent || this; - } - // find the child - const children = this.children(); - const name = this.nocase ? normalizeNocase(pathPart) : normalize(pathPart); - for (const p of children) { - if (p.#matchName === name) { - return p; - } - } - // didn't find it, create provisional child, since it might not - // actually exist. If we know the parent isn't a dir, then - // in fact it CAN'T exist. - const s = this.parent ? this.sep : ''; - const fullpath = this.#fullpath ? this.#fullpath + s + pathPart : undefined; - const pchild = this.newChild(pathPart, UNKNOWN, { - ...opts, - parent: this, - fullpath, - }); - if (!this.canReaddir()) { - pchild.#type |= ENOENT; - } - // don't have to update provisional, because if we have real children, - // then provisional is set to children.length, otherwise a lower number - children.push(pchild); - return pchild; - } - /** - * The relative path from the cwd. If it does not share an ancestor with - * the cwd, then this ends up being equivalent to the fullpath() - */ - relative() { - if (this.isCWD) - return ''; - if (this.#relative !== undefined) { - return this.#relative; - } - const name = this.name; - const p = this.parent; - if (!p) { - return (this.#relative = this.name); - } - const pv = p.relative(); - return pv + (!pv || !p.parent ? '' : this.sep) + name; - } - /** - * The relative path from the cwd, using / as the path separator. - * If it does not share an ancestor with - * the cwd, then this ends up being equivalent to the fullpathPosix() - * On posix systems, this is identical to relative(). - */ - relativePosix() { - if (this.sep === '/') - return this.relative(); - if (this.isCWD) - return ''; - if (this.#relativePosix !== undefined) - return this.#relativePosix; - const name = this.name; - const p = this.parent; - if (!p) { - return (this.#relativePosix = this.fullpathPosix()); - } - const pv = p.relativePosix(); - return pv + (!pv || !p.parent ? '' : '/') + name; - } - /** - * The fully resolved path string for this Path entry - */ - fullpath() { - if (this.#fullpath !== undefined) { - return this.#fullpath; - } - const name = this.name; - const p = this.parent; - if (!p) { - return (this.#fullpath = this.name); - } - const pv = p.fullpath(); - const fp = pv + (!p.parent ? '' : this.sep) + name; - return (this.#fullpath = fp); - } - /** - * On platforms other than windows, this is identical to fullpath. - * - * On windows, this is overridden to return the forward-slash form of the - * full UNC path. - */ - fullpathPosix() { - if (this.#fullpathPosix !== undefined) - return this.#fullpathPosix; - if (this.sep === '/') - return (this.#fullpathPosix = this.fullpath()); - if (!this.parent) { - const p = this.fullpath().replace(/\\/g, '/'); - if (/^[a-z]:\//i.test(p)) { - return (this.#fullpathPosix = `//?/${p}`); - } - else { - return (this.#fullpathPosix = p); - } - } - const p = this.parent; - const pfpp = p.fullpathPosix(); - const fpp = pfpp + (!pfpp || !p.parent ? '' : '/') + this.name; - return (this.#fullpathPosix = fpp); - } - /** - * Is the Path of an unknown type? - * - * Note that we might know *something* about it if there has been a previous - * filesystem operation, for example that it does not exist, or is not a - * link, or whether it has child entries. - */ - isUnknown() { - return (this.#type & IFMT) === UNKNOWN; - } - isType(type) { - return this[`is${type}`](); - } - getType() { - return (this.isUnknown() ? 'Unknown' - : this.isDirectory() ? 'Directory' - : this.isFile() ? 'File' - : this.isSymbolicLink() ? 'SymbolicLink' - : this.isFIFO() ? 'FIFO' - : this.isCharacterDevice() ? 'CharacterDevice' - : this.isBlockDevice() ? 'BlockDevice' - : /* c8 ignore start */ this.isSocket() ? 'Socket' - : 'Unknown'); - /* c8 ignore stop */ - } - /** - * Is the Path a regular file? - */ - isFile() { - return (this.#type & IFMT) === IFREG; - } - /** - * Is the Path a directory? - */ - isDirectory() { - return (this.#type & IFMT) === IFDIR; - } - /** - * Is the path a character device? - */ - isCharacterDevice() { - return (this.#type & IFMT) === IFCHR; - } - /** - * Is the path a block device? - */ - isBlockDevice() { - return (this.#type & IFMT) === IFBLK; - } - /** - * Is the path a FIFO pipe? - */ - isFIFO() { - return (this.#type & IFMT) === IFIFO; - } - /** - * Is the path a socket? - */ - isSocket() { - return (this.#type & IFMT) === IFSOCK; - } - /** - * Is the path a symbolic link? - */ - isSymbolicLink() { - return (this.#type & IFLNK) === IFLNK; - } - /** - * Return the entry if it has been subject of a successful lstat, or - * undefined otherwise. - * - * Does not read the filesystem, so an undefined result *could* simply - * mean that we haven't called lstat on it. - */ - lstatCached() { - return this.#type & LSTAT_CALLED ? this : undefined; - } - /** - * Return the cached link target if the entry has been the subject of a - * successful readlink, or undefined otherwise. - * - * Does not read the filesystem, so an undefined result *could* just mean we - * don't have any cached data. Only use it if you are very sure that a - * readlink() has been called at some point. - */ - readlinkCached() { - return this.#linkTarget; - } - /** - * Returns the cached realpath target if the entry has been the subject - * of a successful realpath, or undefined otherwise. - * - * Does not read the filesystem, so an undefined result *could* just mean we - * don't have any cached data. Only use it if you are very sure that a - * realpath() has been called at some point. - */ - realpathCached() { - return this.#realpath; - } - /** - * Returns the cached child Path entries array if the entry has been the - * subject of a successful readdir(), or [] otherwise. - * - * Does not read the filesystem, so an empty array *could* just mean we - * don't have any cached data. Only use it if you are very sure that a - * readdir() has been called recently enough to still be valid. - */ - readdirCached() { - const children = this.children(); - return children.slice(0, children.provisional); - } - /** - * Return true if it's worth trying to readlink. Ie, we don't (yet) have - * any indication that readlink will definitely fail. - * - * Returns false if the path is known to not be a symlink, if a previous - * readlink failed, or if the entry does not exist. - */ - canReadlink() { - if (this.#linkTarget) - return true; - if (!this.parent) - return false; - // cases where it cannot possibly succeed - const ifmt = this.#type & IFMT; - return !((ifmt !== UNKNOWN && ifmt !== IFLNK) || - this.#type & ENOREADLINK || - this.#type & ENOENT); - } - /** - * Return true if readdir has previously been successfully called on this - * path, indicating that cachedReaddir() is likely valid. - */ - calledReaddir() { - return !!(this.#type & READDIR_CALLED); - } - /** - * Returns true if the path is known to not exist. That is, a previous lstat - * or readdir failed to verify its existence when that would have been - * expected, or a parent entry was marked either enoent or enotdir. - */ - isENOENT() { - return !!(this.#type & ENOENT); - } - /** - * Return true if the path is a match for the given path name. This handles - * case sensitivity and unicode normalization. - * - * Note: even on case-sensitive systems, it is **not** safe to test the - * equality of the `.name` property to determine whether a given pathname - * matches, due to unicode normalization mismatches. - * - * Always use this method instead of testing the `path.name` property - * directly. - */ - isNamed(n) { - return !this.nocase ? - this.#matchName === normalize(n) - : this.#matchName === normalizeNocase(n); - } - /** - * Return the Path object corresponding to the target of a symbolic link. - * - * If the Path is not a symbolic link, or if the readlink call fails for any - * reason, `undefined` is returned. - * - * Result is cached, and thus may be outdated if the filesystem is mutated. - */ - async readlink() { - const target = this.#linkTarget; - if (target) { - return target; - } - if (!this.canReadlink()) { - return undefined; - } - /* c8 ignore start */ - // already covered by the canReadlink test, here for ts grumples - if (!this.parent) { - return undefined; - } - /* c8 ignore stop */ - try { - const read = await this.#fs.promises.readlink(this.fullpath()); - const linkTarget = (await this.parent.realpath())?.resolve(read); - if (linkTarget) { - return (this.#linkTarget = linkTarget); - } - } - catch (er) { - this.#readlinkFail(er.code); - return undefined; - } - } - /** - * Synchronous {@link PathBase.readlink} - */ - readlinkSync() { - const target = this.#linkTarget; - if (target) { - return target; - } - if (!this.canReadlink()) { - return undefined; - } - /* c8 ignore start */ - // already covered by the canReadlink test, here for ts grumples - if (!this.parent) { - return undefined; - } - /* c8 ignore stop */ - try { - const read = this.#fs.readlinkSync(this.fullpath()); - const linkTarget = this.parent.realpathSync()?.resolve(read); - if (linkTarget) { - return (this.#linkTarget = linkTarget); - } - } - catch (er) { - this.#readlinkFail(er.code); - return undefined; - } - } - #readdirSuccess(children) { - // succeeded, mark readdir called bit - this.#type |= READDIR_CALLED; - // mark all remaining provisional children as ENOENT - for (let p = children.provisional; p < children.length; p++) { - const c = children[p]; - if (c) - c.#markENOENT(); - } - } - #markENOENT() { - // mark as UNKNOWN and ENOENT - if (this.#type & ENOENT) - return; - this.#type = (this.#type | ENOENT) & IFMT_UNKNOWN; - this.#markChildrenENOENT(); - } - #markChildrenENOENT() { - // all children are provisional and do not exist - const children = this.children(); - children.provisional = 0; - for (const p of children) { - p.#markENOENT(); - } - } - #markENOREALPATH() { - this.#type |= ENOREALPATH; - this.#markENOTDIR(); - } - // save the information when we know the entry is not a dir - #markENOTDIR() { - // entry is not a directory, so any children can't exist. - // this *should* be impossible, since any children created - // after it's been marked ENOTDIR should be marked ENOENT, - // so it won't even get to this point. - /* c8 ignore start */ - if (this.#type & ENOTDIR) - return; - /* c8 ignore stop */ - let t = this.#type; - // this could happen if we stat a dir, then delete it, - // then try to read it or one of its children. - if ((t & IFMT) === IFDIR) - t &= IFMT_UNKNOWN; - this.#type = t | ENOTDIR; - this.#markChildrenENOENT(); - } - #readdirFail(code = '') { - // markENOTDIR and markENOENT also set provisional=0 - if (code === 'ENOTDIR' || code === 'EPERM') { - this.#markENOTDIR(); - } - else if (code === 'ENOENT') { - this.#markENOENT(); - } - else { - this.children().provisional = 0; - } - } - #lstatFail(code = '') { - // Windows just raises ENOENT in this case, disable for win CI - /* c8 ignore start */ - if (code === 'ENOTDIR') { - // already know it has a parent by this point - const p = this.parent; - p.#markENOTDIR(); - } - else if (code === 'ENOENT') { - /* c8 ignore stop */ - this.#markENOENT(); - } - } - #readlinkFail(code = '') { - let ter = this.#type; - ter |= ENOREADLINK; - if (code === 'ENOENT') - ter |= ENOENT; - // windows gets a weird error when you try to readlink a file - if (code === 'EINVAL' || code === 'UNKNOWN') { - // exists, but not a symlink, we don't know WHAT it is, so remove - // all IFMT bits. - ter &= IFMT_UNKNOWN; - } - this.#type = ter; - // windows just gets ENOENT in this case. We do cover the case, - // just disabled because it's impossible on Windows CI - /* c8 ignore start */ - if (code === 'ENOTDIR' && this.parent) { - this.parent.#markENOTDIR(); - } - /* c8 ignore stop */ - } - #readdirAddChild(e, c) { - return (this.#readdirMaybePromoteChild(e, c) || - this.#readdirAddNewChild(e, c)); - } - #readdirAddNewChild(e, c) { - // alloc new entry at head, so it's never provisional - const type = entToType(e); - const child = this.newChild(e.name, type, { parent: this }); - const ifmt = child.#type & IFMT; - if (ifmt !== IFDIR && ifmt !== IFLNK && ifmt !== UNKNOWN) { - child.#type |= ENOTDIR; - } - c.unshift(child); - c.provisional++; - return child; - } - #readdirMaybePromoteChild(e, c) { - for (let p = c.provisional; p < c.length; p++) { - const pchild = c[p]; - const name = this.nocase ? normalizeNocase(e.name) : normalize(e.name); - if (name !== pchild.#matchName) { - continue; - } - return this.#readdirPromoteChild(e, pchild, p, c); - } - } - #readdirPromoteChild(e, p, index, c) { - const v = p.name; - // retain any other flags, but set ifmt from dirent - p.#type = (p.#type & IFMT_UNKNOWN) | entToType(e); - // case sensitivity fixing when we learn the true name. - if (v !== e.name) - p.name = e.name; - // just advance provisional index (potentially off the list), - // otherwise we have to splice/pop it out and re-insert at head - if (index !== c.provisional) { - if (index === c.length - 1) - c.pop(); - else - c.splice(index, 1); - c.unshift(p); - } - c.provisional++; - return p; - } - /** - * Call lstat() on this Path, and update all known information that can be - * determined. - * - * Note that unlike `fs.lstat()`, the returned value does not contain some - * information, such as `mode`, `dev`, `nlink`, and `ino`. If that - * information is required, you will need to call `fs.lstat` yourself. - * - * If the Path refers to a nonexistent file, or if the lstat call fails for - * any reason, `undefined` is returned. Otherwise the updated Path object is - * returned. - * - * Results are cached, and thus may be out of date if the filesystem is - * mutated. - */ - async lstat() { - if ((this.#type & ENOENT) === 0) { - try { - this.#applyStat(await this.#fs.promises.lstat(this.fullpath())); - return this; - } - catch (er) { - this.#lstatFail(er.code); - } - } - } - /** - * synchronous {@link PathBase.lstat} - */ - lstatSync() { - if ((this.#type & ENOENT) === 0) { - try { - this.#applyStat(this.#fs.lstatSync(this.fullpath())); - return this; - } - catch (er) { - this.#lstatFail(er.code); - } - } - } - #applyStat(st) { - const { atime, atimeMs, birthtime, birthtimeMs, blksize, blocks, ctime, ctimeMs, dev, gid, ino, mode, mtime, mtimeMs, nlink, rdev, size, uid, } = st; - this.#atime = atime; - this.#atimeMs = atimeMs; - this.#birthtime = birthtime; - this.#birthtimeMs = birthtimeMs; - this.#blksize = blksize; - this.#blocks = blocks; - this.#ctime = ctime; - this.#ctimeMs = ctimeMs; - this.#dev = dev; - this.#gid = gid; - this.#ino = ino; - this.#mode = mode; - this.#mtime = mtime; - this.#mtimeMs = mtimeMs; - this.#nlink = nlink; - this.#rdev = rdev; - this.#size = size; - this.#uid = uid; - const ifmt = entToType(st); - // retain any other flags, but set the ifmt - this.#type = (this.#type & IFMT_UNKNOWN) | ifmt | LSTAT_CALLED; - if (ifmt !== UNKNOWN && ifmt !== IFDIR && ifmt !== IFLNK) { - this.#type |= ENOTDIR; - } - } - #onReaddirCB = []; - #readdirCBInFlight = false; - #callOnReaddirCB(children) { - this.#readdirCBInFlight = false; - const cbs = this.#onReaddirCB.slice(); - this.#onReaddirCB.length = 0; - cbs.forEach(cb => cb(null, children)); - } - /** - * Standard node-style callback interface to get list of directory entries. - * - * If the Path cannot or does not contain any children, then an empty array - * is returned. - * - * Results are cached, and thus may be out of date if the filesystem is - * mutated. - * - * @param cb The callback called with (er, entries). Note that the `er` - * param is somewhat extraneous, as all readdir() errors are handled and - * simply result in an empty set of entries being returned. - * @param allowZalgo Boolean indicating that immediately known results should - * *not* be deferred with `queueMicrotask`. Defaults to `false`. Release - * zalgo at your peril, the dark pony lord is devious and unforgiving. - */ - readdirCB(cb, allowZalgo = false) { - if (!this.canReaddir()) { - if (allowZalgo) - cb(null, []); - else - queueMicrotask(() => cb(null, [])); - return; - } - const children = this.children(); - if (this.calledReaddir()) { - const c = children.slice(0, children.provisional); - if (allowZalgo) - cb(null, c); - else - queueMicrotask(() => cb(null, c)); - return; - } - // don't have to worry about zalgo at this point. - this.#onReaddirCB.push(cb); - if (this.#readdirCBInFlight) { - return; - } - this.#readdirCBInFlight = true; - // else read the directory, fill up children - // de-provisionalize any provisional children. - const fullpath = this.fullpath(); - this.#fs.readdir(fullpath, { withFileTypes: true }, (er, entries) => { - if (er) { - this.#readdirFail(er.code); - children.provisional = 0; - } - else { - // if we didn't get an error, we always get entries. - //@ts-ignore - for (const e of entries) { - this.#readdirAddChild(e, children); - } - this.#readdirSuccess(children); - } - this.#callOnReaddirCB(children.slice(0, children.provisional)); - return; - }); - } - #asyncReaddirInFlight; - /** - * Return an array of known child entries. - * - * If the Path cannot or does not contain any children, then an empty array - * is returned. - * - * Results are cached, and thus may be out of date if the filesystem is - * mutated. - */ - async readdir() { - if (!this.canReaddir()) { - return []; - } - const children = this.children(); - if (this.calledReaddir()) { - return children.slice(0, children.provisional); - } - // else read the directory, fill up children - // de-provisionalize any provisional children. - const fullpath = this.fullpath(); - if (this.#asyncReaddirInFlight) { - await this.#asyncReaddirInFlight; - } - else { - /* c8 ignore start */ - let resolve = () => { }; - /* c8 ignore stop */ - this.#asyncReaddirInFlight = new Promise(res => (resolve = res)); - try { - for (const e of await this.#fs.promises.readdir(fullpath, { - withFileTypes: true, - })) { - this.#readdirAddChild(e, children); - } - this.#readdirSuccess(children); - } - catch (er) { - this.#readdirFail(er.code); - children.provisional = 0; - } - this.#asyncReaddirInFlight = undefined; - resolve(); - } - return children.slice(0, children.provisional); - } - /** - * synchronous {@link PathBase.readdir} - */ - readdirSync() { - if (!this.canReaddir()) { - return []; - } - const children = this.children(); - if (this.calledReaddir()) { - return children.slice(0, children.provisional); - } - // else read the directory, fill up children - // de-provisionalize any provisional children. - const fullpath = this.fullpath(); - try { - for (const e of this.#fs.readdirSync(fullpath, { - withFileTypes: true, - })) { - this.#readdirAddChild(e, children); - } - this.#readdirSuccess(children); - } - catch (er) { - this.#readdirFail(er.code); - children.provisional = 0; - } - return children.slice(0, children.provisional); - } - canReaddir() { - if (this.#type & ENOCHILD) - return false; - const ifmt = IFMT & this.#type; - // we always set ENOTDIR when setting IFMT, so should be impossible - /* c8 ignore start */ - if (!(ifmt === UNKNOWN || ifmt === IFDIR || ifmt === IFLNK)) { - return false; - } - /* c8 ignore stop */ - return true; - } - shouldWalk(dirs, walkFilter) { - return ((this.#type & IFDIR) === IFDIR && - !(this.#type & ENOCHILD) && - !dirs.has(this) && - (!walkFilter || walkFilter(this))); - } - /** - * Return the Path object corresponding to path as resolved - * by realpath(3). - * - * If the realpath call fails for any reason, `undefined` is returned. - * - * Result is cached, and thus may be outdated if the filesystem is mutated. - * On success, returns a Path object. - */ - async realpath() { - if (this.#realpath) - return this.#realpath; - if ((ENOREALPATH | ENOREADLINK | ENOENT) & this.#type) - return undefined; - try { - const rp = await this.#fs.promises.realpath(this.fullpath()); - return (this.#realpath = this.resolve(rp)); - } - catch (_) { - this.#markENOREALPATH(); - } - } - /** - * Synchronous {@link realpath} - */ - realpathSync() { - if (this.#realpath) - return this.#realpath; - if ((ENOREALPATH | ENOREADLINK | ENOENT) & this.#type) - return undefined; - try { - const rp = this.#fs.realpathSync(this.fullpath()); - return (this.#realpath = this.resolve(rp)); - } - catch (_) { - this.#markENOREALPATH(); - } - } - /** - * Internal method to mark this Path object as the scurry cwd, - * called by {@link PathScurry#chdir} - * - * @internal - */ - [setAsCwd](oldCwd) { - if (oldCwd === this) - return; - oldCwd.isCWD = false; - this.isCWD = true; - const changed = new Set([]); - let rp = []; - let p = this; - while (p && p.parent) { - changed.add(p); - p.#relative = rp.join(this.sep); - p.#relativePosix = rp.join('/'); - p = p.parent; - rp.push('..'); - } - // now un-memoize parents of old cwd - p = oldCwd; - while (p && p.parent && !changed.has(p)) { - p.#relative = undefined; - p.#relativePosix = undefined; - p = p.parent; - } - } -} -exports.PathBase = PathBase; -/** - * Path class used on win32 systems - * - * Uses `'\\'` as the path separator for returned paths, either `'\\'` or `'/'` - * as the path separator for parsing paths. - */ -class PathWin32 extends PathBase { - /** - * Separator for generating path strings. - */ - sep = '\\'; - /** - * Separator for parsing path strings. - */ - splitSep = eitherSep; - /** - * Do not create new Path objects directly. They should always be accessed - * via the PathScurry class or other methods on the Path class. - * - * @internal - */ - constructor(name, type = UNKNOWN, root, roots, nocase, children, opts) { - super(name, type, root, roots, nocase, children, opts); - } - /** - * @internal - */ - newChild(name, type = UNKNOWN, opts = {}) { - return new PathWin32(name, type, this.root, this.roots, this.nocase, this.childrenCache(), opts); - } - /** - * @internal - */ - getRootString(path) { - return node_path_1.win32.parse(path).root; - } - /** - * @internal - */ - getRoot(rootPath) { - rootPath = uncToDrive(rootPath.toUpperCase()); - if (rootPath === this.root.name) { - return this.root; - } - // ok, not that one, check if it matches another we know about - for (const [compare, root] of Object.entries(this.roots)) { - if (this.sameRoot(rootPath, compare)) { - return (this.roots[rootPath] = root); - } - } - // otherwise, have to create a new one. - return (this.roots[rootPath] = new PathScurryWin32(rootPath, this).root); - } - /** - * @internal - */ - sameRoot(rootPath, compare = this.root.name) { - // windows can (rarely) have case-sensitive filesystem, but - // UNC and drive letters are always case-insensitive, and canonically - // represented uppercase. - rootPath = rootPath - .toUpperCase() - .replace(/\//g, '\\') - .replace(uncDriveRegexp, '$1\\'); - return rootPath === compare; - } -} -exports.PathWin32 = PathWin32; -/** - * Path class used on all posix systems. - * - * Uses `'/'` as the path separator. - */ -class PathPosix extends PathBase { - /** - * separator for parsing path strings - */ - splitSep = '/'; - /** - * separator for generating path strings - */ - sep = '/'; - /** - * Do not create new Path objects directly. They should always be accessed - * via the PathScurry class or other methods on the Path class. - * - * @internal - */ - constructor(name, type = UNKNOWN, root, roots, nocase, children, opts) { - super(name, type, root, roots, nocase, children, opts); - } - /** - * @internal - */ - getRootString(path) { - return path.startsWith('/') ? '/' : ''; - } - /** - * @internal - */ - getRoot(_rootPath) { - return this.root; - } - /** - * @internal - */ - newChild(name, type = UNKNOWN, opts = {}) { - return new PathPosix(name, type, this.root, this.roots, this.nocase, this.childrenCache(), opts); - } -} -exports.PathPosix = PathPosix; -/** - * The base class for all PathScurry classes, providing the interface for path - * resolution and filesystem operations. - * - * Typically, you should *not* instantiate this class directly, but rather one - * of the platform-specific classes, or the exported {@link PathScurry} which - * defaults to the current platform. - */ -class PathScurryBase { - /** - * The root Path entry for the current working directory of this Scurry - */ - root; - /** - * The string path for the root of this Scurry's current working directory - */ - rootPath; - /** - * A collection of all roots encountered, referenced by rootPath - */ - roots; - /** - * The Path entry corresponding to this PathScurry's current working directory. - */ - cwd; - #resolveCache; - #resolvePosixCache; - #children; - /** - * Perform path comparisons case-insensitively. - * - * Defaults true on Darwin and Windows systems, false elsewhere. - */ - nocase; - #fs; - /** - * This class should not be instantiated directly. - * - * Use PathScurryWin32, PathScurryDarwin, PathScurryPosix, or PathScurry - * - * @internal - */ - constructor(cwd = process.cwd(), pathImpl, sep, { nocase, childrenCacheSize = 16 * 1024, fs = defaultFS, } = {}) { - this.#fs = fsFromOption(fs); - if (cwd instanceof URL || cwd.startsWith('file://')) { - cwd = (0, node_url_1.fileURLToPath)(cwd); - } - // resolve and split root, and then add to the store. - // this is the only time we call path.resolve() - const cwdPath = pathImpl.resolve(cwd); - this.roots = Object.create(null); - this.rootPath = this.parseRootPath(cwdPath); - this.#resolveCache = new ResolveCache(); - this.#resolvePosixCache = new ResolveCache(); - this.#children = new ChildrenCache(childrenCacheSize); - const split = cwdPath.substring(this.rootPath.length).split(sep); - // resolve('/') leaves '', splits to [''], we don't want that. - if (split.length === 1 && !split[0]) { - split.pop(); - } - /* c8 ignore start */ - if (nocase === undefined) { - throw new TypeError('must provide nocase setting to PathScurryBase ctor'); - } - /* c8 ignore stop */ - this.nocase = nocase; - this.root = this.newRoot(this.#fs); - this.roots[this.rootPath] = this.root; - let prev = this.root; - let len = split.length - 1; - const joinSep = pathImpl.sep; - let abs = this.rootPath; - let sawFirst = false; - for (const part of split) { - const l = len--; - prev = prev.child(part, { - relative: new Array(l).fill('..').join(joinSep), - relativePosix: new Array(l).fill('..').join('/'), - fullpath: (abs += (sawFirst ? '' : joinSep) + part), - }); - sawFirst = true; - } - this.cwd = prev; - } - /** - * Get the depth of a provided path, string, or the cwd - */ - depth(path = this.cwd) { - if (typeof path === 'string') { - path = this.cwd.resolve(path); - } - return path.depth(); - } - /** - * Return the cache of child entries. Exposed so subclasses can create - * child Path objects in a platform-specific way. - * - * @internal - */ - childrenCache() { - return this.#children; - } - /** - * Resolve one or more path strings to a resolved string - * - * Same interface as require('path').resolve. - * - * Much faster than path.resolve() when called multiple times for the same - * path, because the resolved Path objects are cached. Much slower - * otherwise. - */ - resolve(...paths) { - // first figure out the minimum number of paths we have to test - // we always start at cwd, but any absolutes will bump the start - let r = ''; - for (let i = paths.length - 1; i >= 0; i--) { - const p = paths[i]; - if (!p || p === '.') - continue; - r = r ? `${p}/${r}` : p; - if (this.isAbsolute(p)) { - break; - } - } - const cached = this.#resolveCache.get(r); - if (cached !== undefined) { - return cached; - } - const result = this.cwd.resolve(r).fullpath(); - this.#resolveCache.set(r, result); - return result; - } - /** - * Resolve one or more path strings to a resolved string, returning - * the posix path. Identical to .resolve() on posix systems, but on - * windows will return a forward-slash separated UNC path. - * - * Same interface as require('path').resolve. - * - * Much faster than path.resolve() when called multiple times for the same - * path, because the resolved Path objects are cached. Much slower - * otherwise. - */ - resolvePosix(...paths) { - // first figure out the minimum number of paths we have to test - // we always start at cwd, but any absolutes will bump the start - let r = ''; - for (let i = paths.length - 1; i >= 0; i--) { - const p = paths[i]; - if (!p || p === '.') - continue; - r = r ? `${p}/${r}` : p; - if (this.isAbsolute(p)) { - break; - } - } - const cached = this.#resolvePosixCache.get(r); - if (cached !== undefined) { - return cached; - } - const result = this.cwd.resolve(r).fullpathPosix(); - this.#resolvePosixCache.set(r, result); - return result; - } - /** - * find the relative path from the cwd to the supplied path string or entry - */ - relative(entry = this.cwd) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - return entry.relative(); - } - /** - * find the relative path from the cwd to the supplied path string or - * entry, using / as the path delimiter, even on Windows. - */ - relativePosix(entry = this.cwd) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - return entry.relativePosix(); - } - /** - * Return the basename for the provided string or Path object - */ - basename(entry = this.cwd) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - return entry.name; - } - /** - * Return the dirname for the provided string or Path object - */ - dirname(entry = this.cwd) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - return (entry.parent || entry).fullpath(); - } - async readdir(entry = this.cwd, opts = { - withFileTypes: true, - }) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - else if (!(entry instanceof PathBase)) { - opts = entry; - entry = this.cwd; - } - const { withFileTypes } = opts; - if (!entry.canReaddir()) { - return []; - } - else { - const p = await entry.readdir(); - return withFileTypes ? p : p.map(e => e.name); - } - } - readdirSync(entry = this.cwd, opts = { - withFileTypes: true, - }) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - else if (!(entry instanceof PathBase)) { - opts = entry; - entry = this.cwd; - } - const { withFileTypes = true } = opts; - if (!entry.canReaddir()) { - return []; - } - else if (withFileTypes) { - return entry.readdirSync(); - } - else { - return entry.readdirSync().map(e => e.name); - } - } - /** - * Call lstat() on the string or Path object, and update all known - * information that can be determined. - * - * Note that unlike `fs.lstat()`, the returned value does not contain some - * information, such as `mode`, `dev`, `nlink`, and `ino`. If that - * information is required, you will need to call `fs.lstat` yourself. - * - * If the Path refers to a nonexistent file, or if the lstat call fails for - * any reason, `undefined` is returned. Otherwise the updated Path object is - * returned. - * - * Results are cached, and thus may be out of date if the filesystem is - * mutated. - */ - async lstat(entry = this.cwd) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - return entry.lstat(); - } - /** - * synchronous {@link PathScurryBase.lstat} - */ - lstatSync(entry = this.cwd) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - return entry.lstatSync(); - } - async readlink(entry = this.cwd, { withFileTypes } = { - withFileTypes: false, - }) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - else if (!(entry instanceof PathBase)) { - withFileTypes = entry.withFileTypes; - entry = this.cwd; - } - const e = await entry.readlink(); - return withFileTypes ? e : e?.fullpath(); - } - readlinkSync(entry = this.cwd, { withFileTypes } = { - withFileTypes: false, - }) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - else if (!(entry instanceof PathBase)) { - withFileTypes = entry.withFileTypes; - entry = this.cwd; - } - const e = entry.readlinkSync(); - return withFileTypes ? e : e?.fullpath(); - } - async realpath(entry = this.cwd, { withFileTypes } = { - withFileTypes: false, - }) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - else if (!(entry instanceof PathBase)) { - withFileTypes = entry.withFileTypes; - entry = this.cwd; - } - const e = await entry.realpath(); - return withFileTypes ? e : e?.fullpath(); - } - realpathSync(entry = this.cwd, { withFileTypes } = { - withFileTypes: false, - }) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - else if (!(entry instanceof PathBase)) { - withFileTypes = entry.withFileTypes; - entry = this.cwd; - } - const e = entry.realpathSync(); - return withFileTypes ? e : e?.fullpath(); - } - async walk(entry = this.cwd, opts = {}) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - else if (!(entry instanceof PathBase)) { - opts = entry; - entry = this.cwd; - } - const { withFileTypes = true, follow = false, filter, walkFilter, } = opts; - const results = []; - if (!filter || filter(entry)) { - results.push(withFileTypes ? entry : entry.fullpath()); - } - const dirs = new Set(); - const walk = (dir, cb) => { - dirs.add(dir); - dir.readdirCB((er, entries) => { - /* c8 ignore start */ - if (er) { - return cb(er); - } - /* c8 ignore stop */ - let len = entries.length; - if (!len) - return cb(); - const next = () => { - if (--len === 0) { - cb(); - } - }; - for (const e of entries) { - if (!filter || filter(e)) { - results.push(withFileTypes ? e : e.fullpath()); - } - if (follow && e.isSymbolicLink()) { - e.realpath() - .then(r => (r?.isUnknown() ? r.lstat() : r)) - .then(r => r?.shouldWalk(dirs, walkFilter) ? walk(r, next) : next()); - } - else { - if (e.shouldWalk(dirs, walkFilter)) { - walk(e, next); - } - else { - next(); - } - } - } - }, true); // zalgooooooo - }; - const start = entry; - return new Promise((res, rej) => { - walk(start, er => { - /* c8 ignore start */ - if (er) - return rej(er); - /* c8 ignore stop */ - res(results); - }); - }); - } - walkSync(entry = this.cwd, opts = {}) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - else if (!(entry instanceof PathBase)) { - opts = entry; - entry = this.cwd; - } - const { withFileTypes = true, follow = false, filter, walkFilter, } = opts; - const results = []; - if (!filter || filter(entry)) { - results.push(withFileTypes ? entry : entry.fullpath()); - } - const dirs = new Set([entry]); - for (const dir of dirs) { - const entries = dir.readdirSync(); - for (const e of entries) { - if (!filter || filter(e)) { - results.push(withFileTypes ? e : e.fullpath()); - } - let r = e; - if (e.isSymbolicLink()) { - if (!(follow && (r = e.realpathSync()))) - continue; - if (r.isUnknown()) - r.lstatSync(); - } - if (r.shouldWalk(dirs, walkFilter)) { - dirs.add(r); - } - } - } - return results; - } - /** - * Support for `for await` - * - * Alias for {@link PathScurryBase.iterate} - * - * Note: As of Node 19, this is very slow, compared to other methods of - * walking. Consider using {@link PathScurryBase.stream} if memory overhead - * and backpressure are concerns, or {@link PathScurryBase.walk} if not. - */ - [Symbol.asyncIterator]() { - return this.iterate(); - } - iterate(entry = this.cwd, options = {}) { - // iterating async over the stream is significantly more performant, - // especially in the warm-cache scenario, because it buffers up directory - // entries in the background instead of waiting for a yield for each one. - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - else if (!(entry instanceof PathBase)) { - options = entry; - entry = this.cwd; - } - return this.stream(entry, options)[Symbol.asyncIterator](); - } - /** - * Iterating over a PathScurry performs a synchronous walk. - * - * Alias for {@link PathScurryBase.iterateSync} - */ - [Symbol.iterator]() { - return this.iterateSync(); - } - *iterateSync(entry = this.cwd, opts = {}) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - else if (!(entry instanceof PathBase)) { - opts = entry; - entry = this.cwd; - } - const { withFileTypes = true, follow = false, filter, walkFilter, } = opts; - if (!filter || filter(entry)) { - yield withFileTypes ? entry : entry.fullpath(); - } - const dirs = new Set([entry]); - for (const dir of dirs) { - const entries = dir.readdirSync(); - for (const e of entries) { - if (!filter || filter(e)) { - yield withFileTypes ? e : e.fullpath(); - } - let r = e; - if (e.isSymbolicLink()) { - if (!(follow && (r = e.realpathSync()))) - continue; - if (r.isUnknown()) - r.lstatSync(); - } - if (r.shouldWalk(dirs, walkFilter)) { - dirs.add(r); - } - } - } - } - stream(entry = this.cwd, opts = {}) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - else if (!(entry instanceof PathBase)) { - opts = entry; - entry = this.cwd; - } - const { withFileTypes = true, follow = false, filter, walkFilter, } = opts; - const results = new minipass_1.Minipass({ objectMode: true }); - if (!filter || filter(entry)) { - results.write(withFileTypes ? entry : entry.fullpath()); - } - const dirs = new Set(); - const queue = [entry]; - let processing = 0; - const process = () => { - let paused = false; - while (!paused) { - const dir = queue.shift(); - if (!dir) { - if (processing === 0) - results.end(); - return; - } - processing++; - dirs.add(dir); - const onReaddir = (er, entries, didRealpaths = false) => { - /* c8 ignore start */ - if (er) - return results.emit('error', er); - /* c8 ignore stop */ - if (follow && !didRealpaths) { - const promises = []; - for (const e of entries) { - if (e.isSymbolicLink()) { - promises.push(e - .realpath() - .then((r) => r?.isUnknown() ? r.lstat() : r)); - } - } - if (promises.length) { - Promise.all(promises).then(() => onReaddir(null, entries, true)); - return; - } - } - for (const e of entries) { - if (e && (!filter || filter(e))) { - if (!results.write(withFileTypes ? e : e.fullpath())) { - paused = true; - } - } - } - processing--; - for (const e of entries) { - const r = e.realpathCached() || e; - if (r.shouldWalk(dirs, walkFilter)) { - queue.push(r); - } - } - if (paused && !results.flowing) { - results.once('drain', process); - } - else if (!sync) { - process(); - } - }; - // zalgo containment - let sync = true; - dir.readdirCB(onReaddir, true); - sync = false; - } - }; - process(); - return results; - } - streamSync(entry = this.cwd, opts = {}) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - else if (!(entry instanceof PathBase)) { - opts = entry; - entry = this.cwd; - } - const { withFileTypes = true, follow = false, filter, walkFilter, } = opts; - const results = new minipass_1.Minipass({ objectMode: true }); - const dirs = new Set(); - if (!filter || filter(entry)) { - results.write(withFileTypes ? entry : entry.fullpath()); - } - const queue = [entry]; - let processing = 0; - const process = () => { - let paused = false; - while (!paused) { - const dir = queue.shift(); - if (!dir) { - if (processing === 0) - results.end(); - return; - } - processing++; - dirs.add(dir); - const entries = dir.readdirSync(); - for (const e of entries) { - if (!filter || filter(e)) { - if (!results.write(withFileTypes ? e : e.fullpath())) { - paused = true; - } - } - } - processing--; - for (const e of entries) { - let r = e; - if (e.isSymbolicLink()) { - if (!(follow && (r = e.realpathSync()))) - continue; - if (r.isUnknown()) - r.lstatSync(); - } - if (r.shouldWalk(dirs, walkFilter)) { - queue.push(r); - } - } - } - if (paused && !results.flowing) - results.once('drain', process); - }; - process(); - return results; - } - chdir(path = this.cwd) { - const oldCwd = this.cwd; - this.cwd = typeof path === 'string' ? this.cwd.resolve(path) : path; - this.cwd[setAsCwd](oldCwd); - } -} -exports.PathScurryBase = PathScurryBase; -/** - * Windows implementation of {@link PathScurryBase} - * - * Defaults to case insensitve, uses `'\\'` to generate path strings. Uses - * {@link PathWin32} for Path objects. - */ -class PathScurryWin32 extends PathScurryBase { - /** - * separator for generating path strings - */ - sep = '\\'; - constructor(cwd = process.cwd(), opts = {}) { - const { nocase = true } = opts; - super(cwd, node_path_1.win32, '\\', { ...opts, nocase }); - this.nocase = nocase; - for (let p = this.cwd; p; p = p.parent) { - p.nocase = this.nocase; - } - } - /** - * @internal - */ - parseRootPath(dir) { - // if the path starts with a single separator, it's not a UNC, and we'll - // just get separator as the root, and driveFromUNC will return \ - // In that case, mount \ on the root from the cwd. - return node_path_1.win32.parse(dir).root.toUpperCase(); - } - /** - * @internal - */ - newRoot(fs) { - return new PathWin32(this.rootPath, IFDIR, undefined, this.roots, this.nocase, this.childrenCache(), { fs }); - } - /** - * Return true if the provided path string is an absolute path - */ - isAbsolute(p) { - return (p.startsWith('/') || p.startsWith('\\') || /^[a-z]:(\/|\\)/i.test(p)); - } -} -exports.PathScurryWin32 = PathScurryWin32; -/** - * {@link PathScurryBase} implementation for all posix systems other than Darwin. - * - * Defaults to case-sensitive matching, uses `'/'` to generate path strings. - * - * Uses {@link PathPosix} for Path objects. - */ -class PathScurryPosix extends PathScurryBase { - /** - * separator for generating path strings - */ - sep = '/'; - constructor(cwd = process.cwd(), opts = {}) { - const { nocase = false } = opts; - super(cwd, node_path_1.posix, '/', { ...opts, nocase }); - this.nocase = nocase; - } - /** - * @internal - */ - parseRootPath(_dir) { - return '/'; - } - /** - * @internal - */ - newRoot(fs) { - return new PathPosix(this.rootPath, IFDIR, undefined, this.roots, this.nocase, this.childrenCache(), { fs }); - } - /** - * Return true if the provided path string is an absolute path - */ - isAbsolute(p) { - return p.startsWith('/'); - } -} -exports.PathScurryPosix = PathScurryPosix; -/** - * {@link PathScurryBase} implementation for Darwin (macOS) systems. - * - * Defaults to case-insensitive matching, uses `'/'` for generating path - * strings. - * - * Uses {@link PathPosix} for Path objects. - */ -class PathScurryDarwin extends PathScurryPosix { - constructor(cwd = process.cwd(), opts = {}) { - const { nocase = true } = opts; - super(cwd, { ...opts, nocase }); - } -} -exports.PathScurryDarwin = PathScurryDarwin; -/** - * Default {@link PathBase} implementation for the current platform. - * - * {@link PathWin32} on Windows systems, {@link PathPosix} on all others. - */ -exports.Path = process.platform === 'win32' ? PathWin32 : PathPosix; -/** - * Default {@link PathScurryBase} implementation for the current platform. - * - * {@link PathScurryWin32} on Windows systems, {@link PathScurryDarwin} on - * Darwin (macOS) systems, {@link PathScurryPosix} on all others. - */ -exports.PathScurry = process.platform === 'win32' ? PathScurryWin32 - : process.platform === 'darwin' ? PathScurryDarwin - : PathScurryPosix; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/path-scurry/dist/commonjs/index.js.map b/node_modules/path-scurry/dist/commonjs/index.js.map deleted file mode 100644 index fdeca21..0000000 --- a/node_modules/path-scurry/dist/commonjs/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAAoC;AACpC,yCAAwC;AAExC,uCAAwC;AAExC,2BAMW;AACX,kDAAmC;AAEnC,MAAM,YAAY,GAAG,iBAAG,CAAC,MAAM,CAAA;AAC/B,yDAAyD;AACzD,8CAA8C;AAE9C,+CAAqE;AAErE,uCAAmC;AAqEnC,MAAM,SAAS,GAAY;IACzB,SAAS,EAAT,cAAS;IACT,OAAO,EAAE,YAAS;IAClB,WAAW,EAAX,gBAAW;IACX,YAAY,EAAZ,iBAAY;IACZ,YAAY;IACZ,QAAQ,EAAE;QACR,KAAK,EAAL,gBAAK;QACL,OAAO,EAAP,kBAAO;QACP,QAAQ,EAAR,mBAAQ;QACR,QAAQ,EAAR,mBAAQ;KACT;CACF,CAAA;AAED,0DAA0D;AAC1D,MAAM,YAAY,GAAG,CAAC,QAAmB,EAAW,EAAE,CACpD,CAAC,QAAQ,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC5D,SAAS;IACX,CAAC,CAAC;QACE,GAAG,SAAS;QACZ,GAAG,QAAQ;QACX,QAAQ,EAAE;YACR,GAAG,SAAS,CAAC,QAAQ;YACrB,GAAG,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;SAC7B;KACF,CAAA;AAEL,uCAAuC;AACvC,MAAM,cAAc,GAAG,wBAAwB,CAAA;AAC/C,MAAM,UAAU,GAAG,CAAC,QAAgB,EAAU,EAAE,CAC9C,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;AAE/D,+CAA+C;AAC/C,MAAM,SAAS,GAAG,QAAQ,CAAA;AAE1B,MAAM,OAAO,GAAG,CAAC,CAAA,CAAC,sCAAsC;AACxD,MAAM,KAAK,GAAG,MAAM,CAAA;AACpB,MAAM,KAAK,GAAG,MAAM,CAAA;AACpB,MAAM,KAAK,GAAG,MAAM,CAAA;AACpB,MAAM,KAAK,GAAG,MAAM,CAAA;AACpB,MAAM,KAAK,GAAG,MAAM,CAAA;AACpB,MAAM,KAAK,GAAG,MAAM,CAAA;AACpB,MAAM,MAAM,GAAG,MAAM,CAAA;AACrB,MAAM,IAAI,GAAG,MAAM,CAAA;AAYnB,2BAA2B;AAC3B,MAAM,YAAY,GAAG,CAAC,IAAI,CAAA;AAE1B,gEAAgE;AAChE,MAAM,cAAc,GAAG,gBAAgB,CAAA;AACvC,iCAAiC;AACjC,MAAM,YAAY,GAAG,gBAAgB,CAAA;AACrC,kEAAkE;AAClE,MAAM,OAAO,GAAG,gBAAgB,CAAA;AAChC,yDAAyD;AACzD,gEAAgE;AAChE,MAAM,MAAM,GAAG,gBAAgB,CAAA;AAC/B,0EAA0E;AAC1E,6BAA6B;AAC7B,MAAM,WAAW,GAAG,gBAAgB,CAAA;AACpC,sCAAsC;AACtC,MAAM,WAAW,GAAG,gBAAgB,CAAA;AAEpC,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,CAAA;AAC/C,MAAM,QAAQ,GAAG,gBAAgB,CAAA;AAEjC,MAAM,SAAS,GAAG,CAAC,CAAiB,EAAE,EAAE,CACtC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK;IAClB,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK;QACzB,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,KAAK;YAC5B,CAAC,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,KAAK;gBAC/B,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,KAAK;oBAC3B,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM;wBACvB,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK;4BACpB,CAAC,CAAC,OAAO,CAAA;AAEX,+BAA+B;AAC/B,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAA;AAChD,MAAM,SAAS,GAAG,CAAC,CAAS,EAAE,EAAE;IAC9B,MAAM,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAC/B,IAAI,CAAC;QAAE,OAAO,CAAC,CAAA;IACf,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IAC7B,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACxB,OAAO,CAAC,CAAA;AACV,CAAC,CAAA;AAED,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAkB,CAAA;AACtD,MAAM,eAAe,GAAG,CAAC,CAAS,EAAE,EAAE;IACpC,MAAM,CAAC,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IACrC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAA;IACf,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;IACpC,oBAAoB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC9B,OAAO,CAAC,CAAA;AACV,CAAC,CAAA;AAgBD;;;GAGG;AACH,MAAa,YAAa,SAAQ,oBAAwB;IACxD;QACE,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAA;IACrB,CAAC;CACF;AAJD,oCAIC;AAED,wEAAwE;AACxE,+EAA+E;AAC/E,yEAAyE;AACzE,+EAA+E;AAC/E,8EAA8E;AAC9E,6EAA6E;AAC7E,2EAA2E;AAC3E,4EAA4E;AAC5E,EAAE;AACF,8EAA8E;AAC9E,sEAAsE;AAEtE;;;GAGG;AACH,MAAa,aAAc,SAAQ,oBAA4B;IAC7D,YAAY,UAAkB,EAAE,GAAG,IAAI;QACrC,KAAK,CAAC;YACJ,OAAO;YACP,oBAAoB;YACpB,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC;SACnC,CAAC,CAAA;IACJ,CAAC;CACF;AARD,sCAQC;AASD,MAAM,QAAQ,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAA;AAE9C;;;;;;;;;;;;GAYG;AACH,MAAsB,QAAQ;IAC5B;;;;;;;;OAQG;IACH,IAAI,CAAQ;IACZ;;;;OAIG;IACH,IAAI,CAAU;IACd;;;;OAIG;IACH,KAAK,CAA2B;IAChC;;;;OAIG;IACH,MAAM,CAAW;IACjB;;;OAGG;IACH,MAAM,CAAS;IAEf;;;OAGG;IACH,KAAK,GAAY,KAAK,CAAA;IAYtB,gCAAgC;IAChC,GAAG,CAAS;IAEZ,eAAe;IACf,IAAI,CAAS;IACb,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IACD,KAAK,CAAS;IACd,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IACD,MAAM,CAAS;IACf,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IACD,IAAI,CAAS;IACb,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IACD,IAAI,CAAS;IACb,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IACD,KAAK,CAAS;IACd,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IACD,QAAQ,CAAS;IACjB,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IACD,IAAI,CAAS;IACb,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IACD,KAAK,CAAS;IACd,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IACD,OAAO,CAAS;IAChB,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IACD,QAAQ,CAAS;IACjB,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IACD,QAAQ,CAAS;IACjB,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IACD,QAAQ,CAAS;IACjB,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IACD,YAAY,CAAS;IACrB,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IACD,MAAM,CAAO;IACb,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IACD,MAAM,CAAO;IACb,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IACD,MAAM,CAAO;IACb,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IACD,UAAU,CAAO;IACjB,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAA;IACxB,CAAC;IAED,UAAU,CAAQ;IAClB,MAAM,CAAS;IACf,SAAS,CAAS;IAClB,cAAc,CAAS;IACvB,SAAS,CAAS;IAClB,cAAc,CAAS;IACvB,KAAK,CAAQ;IACb,SAAS,CAAe;IACxB,WAAW,CAAW;IACtB,SAAS,CAAW;IAEpB;;;;;OAKG;IACH,IAAI,UAAU;QACZ,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAA;IACzC,CAAC;IAED;;;OAGG;IACH,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,UAAU,CAAA;IACxB,CAAC;IAED;;;;;OAKG;IACH,YACE,IAAY,EACZ,OAAe,OAAO,EACtB,IAA0B,EAC1B,KAAgC,EAChC,MAAe,EACf,QAAuB,EACvB,IAAc;QAEd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAClE,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,QAAQ,CAAA;QAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,IAAI,CAAA;QACxB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QACzB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC9B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC9B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAA;QACxC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QACzB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAA;QAC5B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAClC,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,MAAM,CAAA;QACjD,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAC1C,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAA;IAChD,CAAC;IAeD;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,IAAa;QACnB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QAC3C,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACzC,MAAM,MAAM,GACV,QAAQ,CAAC,CAAC;YACR,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC;YAChD,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;QAChC,OAAO,MAAM,CAAA;IACf,CAAC;IAED,aAAa,CAAC,QAAkB;QAC9B,IAAI,CAAC,GAAa,IAAI,CAAA;QACtB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACnB,CAAC;QACD,OAAO,CAAC,CAAA;IACV,CAAC;IAED;;;;;;;OAOG;IACH,QAAQ;QACN,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACvC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAA;QACf,CAAC;QACD,MAAM,QAAQ,GAAa,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAA;QAChE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QAClC,IAAI,CAAC,KAAK,IAAI,CAAC,cAAc,CAAA;QAC7B,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,QAAgB,EAAE,IAAe;QACrC,IAAI,QAAQ,KAAK,EAAE,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;YACxC,OAAO,IAAI,CAAA;QACb,CAAC;QACD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,MAAM,IAAI,IAAI,CAAA;QAC5B,CAAC;QAED,iBAAiB;QACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAChC,MAAM,IAAI,GACR,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QAC/D,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,IAAI,CAAC,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;gBAC1B,OAAO,CAAC,CAAA;YACV,CAAC;QACH,CAAC;QAED,+DAA+D;QAC/D,2DAA2D;QAC3D,0BAA0B;QAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;QACrC,MAAM,QAAQ,GACZ,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAA;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE;YAC9C,GAAG,IAAI;YACP,MAAM,EAAE,IAAI;YACZ,QAAQ;SACT,CAAC,CAAA;QAEF,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACvB,MAAM,CAAC,KAAK,IAAI,MAAM,CAAA;QACxB,CAAC;QAED,sEAAsE;QACtE,uEAAuE;QACvE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACrB,OAAO,MAAM,CAAA;IACf,CAAC;IAED;;;OAGG;IACH,QAAQ;QACN,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAA;QACzB,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,SAAS,CAAA;QACvB,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACtB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAA;QACrB,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,OAAO,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;QACrC,CAAC;QACD,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAA;QACvB,OAAO,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;IACvD,CAAC;IAED;;;;;OAKG;IACH,aAAa;QACX,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAA;QAC5C,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAA;QACzB,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,cAAc,CAAA;QACjE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACtB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAA;QACrB,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,OAAO,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,CAAA;QACrD,CAAC;QACD,MAAM,EAAE,GAAG,CAAC,CAAC,aAAa,EAAE,CAAA;QAC5B,OAAO,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;IAClD,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,SAAS,CAAA;QACvB,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACtB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAA;QACrB,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,OAAO,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;QACrC,CAAC;QACD,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAA;QACvB,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;QAClD,OAAO,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,CAAA;IAC9B,CAAC;IAED;;;;;OAKG;IACH,aAAa;QACX,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,cAAc,CAAA;QACjE,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG;YAAE,OAAO,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;QACpE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YAC7C,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,EAAE,CAAC,CAAA;YAC3C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAA;YAClC,CAAC;QACH,CAAC;QACD,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAA;QACrB,MAAM,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,CAAA;QAC9B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAA;QAC9D,OAAO,CAAC,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,CAAA;IACpC,CAAC;IAED;;;;;;OAMG;IACH,SAAS;QACP,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,OAAO,CAAA;IACxC,CAAC;IAED,MAAM,CAAC,IAAU;QACf,OAAO,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAA;IAC5B,CAAC;IAED,OAAO;QACL,OAAO,CACL,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS;YAC5B,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW;gBAClC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM;oBACxB,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,cAAc;wBACxC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM;4BACxB,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,iBAAiB;gCAC9C,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,aAAa;oCACtC,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ;wCAClD,CAAC,CAAC,SAAS,CACZ,CAAA;QACD,oBAAoB;IACtB,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,CAAA;IACtC,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,CAAA;IACtC,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,CAAA;IACtC,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,CAAA;IACtC,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,CAAA;IACtC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,MAAM,CAAA;IACvC,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,KAAK,CAAA;IACvC,CAAC;IAED;;;;;;OAMG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;IACrD,CAAC;IAED;;;;;;;OAOG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAA;IACzB,CAAC;IAED;;;;;;;OAOG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IAED;;;;;;;OAOG;IACH,aAAa;QACX,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAChC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAA;IAChD,CAAC;IAED;;;;;;OAMG;IACH,WAAW;QACT,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAA;QACjC,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAA;QAC9B,yCAAyC;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;QAC9B,OAAO,CAAC,CACN,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK,CAAC;YACpC,IAAI,CAAC,KAAK,GAAG,WAAW;YACxB,IAAI,CAAC,KAAK,GAAG,MAAM,CACpB,CAAA;IACH,CAAC;IAED;;;OAGG;IACH,aAAa;QACX,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,cAAc,CAAC,CAAA;IACxC,CAAC;IAED;;;;OAIG;IACH,QAAQ;QACN,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,CAAA;IAChC,CAAC;IAED;;;;;;;;;;OAUG;IACH,OAAO,CAAC,CAAS;QACf,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjB,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC;YAClC,CAAC,CAAC,IAAI,CAAC,UAAU,KAAK,eAAe,CAAC,CAAC,CAAC,CAAA;IAC5C,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,QAAQ;QACZ,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAA;QAC/B,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAA;QACf,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,qBAAqB;QACrB,gEAAgE;QAChE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,oBAAoB;QACpB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;YAC9D,MAAM,UAAU,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;YAChE,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,CAAA;YACxC,CAAC;QACH,CAAC;QAAC,OAAO,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,aAAa,CAAE,EAA4B,CAAC,IAAI,CAAC,CAAA;YACtD,OAAO,SAAS,CAAA;QAClB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,YAAY;QACV,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAA;QAC/B,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAA;QACf,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,qBAAqB;QACrB,gEAAgE;QAChE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,oBAAoB;QACpB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;YACnD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;YAC5D,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,CAAA;YACxC,CAAC;QACH,CAAC;QAAC,OAAO,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,aAAa,CAAE,EAA4B,CAAC,IAAI,CAAC,CAAA;YACtD,OAAO,SAAS,CAAA;QAClB,CAAC;IACH,CAAC;IAED,eAAe,CAAC,QAAkB;QAChC,qCAAqC;QACrC,IAAI,CAAC,KAAK,IAAI,cAAc,CAAA;QAC5B,oDAAoD;QACpD,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5D,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;YACrB,IAAI,CAAC;gBAAE,CAAC,CAAC,WAAW,EAAE,CAAA;QACxB,CAAC;IACH,CAAC;IAED,WAAW;QACT,6BAA6B;QAC7B,IAAI,IAAI,CAAC,KAAK,GAAG,MAAM;YAAE,OAAM;QAC/B,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,YAAY,CAAA;QACjD,IAAI,CAAC,mBAAmB,EAAE,CAAA;IAC5B,CAAC;IAED,mBAAmB;QACjB,gDAAgD;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAChC,QAAQ,CAAC,WAAW,GAAG,CAAC,CAAA;QACxB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,CAAC,CAAC,WAAW,EAAE,CAAA;QACjB,CAAC;IACH,CAAC;IAED,gBAAgB;QACd,IAAI,CAAC,KAAK,IAAI,WAAW,CAAA;QACzB,IAAI,CAAC,YAAY,EAAE,CAAA;IACrB,CAAC;IAED,2DAA2D;IAC3D,YAAY;QACV,yDAAyD;QACzD,0DAA0D;QAC1D,0DAA0D;QAC1D,sCAAsC;QACtC,qBAAqB;QACrB,IAAI,IAAI,CAAC,KAAK,GAAG,OAAO;YAAE,OAAM;QAChC,oBAAoB;QACpB,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAA;QAClB,sDAAsD;QACtD,8CAA8C;QAC9C,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,KAAK;YAAE,CAAC,IAAI,YAAY,CAAA;QAC3C,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,OAAO,CAAA;QACxB,IAAI,CAAC,mBAAmB,EAAE,CAAA;IAC5B,CAAC;IAED,YAAY,CAAC,OAAe,EAAE;QAC5B,oDAAoD;QACpD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YAC3C,IAAI,CAAC,YAAY,EAAE,CAAA;QACrB,CAAC;aAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,WAAW,EAAE,CAAA;QACpB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,EAAE,CAAC,WAAW,GAAG,CAAC,CAAA;QACjC,CAAC;IACH,CAAC;IAED,UAAU,CAAC,OAAe,EAAE;QAC1B,8DAA8D;QAC9D,qBAAqB;QACrB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,6CAA6C;YAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,MAAkB,CAAA;YACjC,CAAC,CAAC,YAAY,EAAE,CAAA;QAClB,CAAC;aAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,oBAAoB;YACpB,IAAI,CAAC,WAAW,EAAE,CAAA;QACpB,CAAC;IACH,CAAC;IAED,aAAa,CAAC,OAAe,EAAE;QAC7B,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAA;QACpB,GAAG,IAAI,WAAW,CAAA;QAClB,IAAI,IAAI,KAAK,QAAQ;YAAE,GAAG,IAAI,MAAM,CAAA;QACpC,6DAA6D;QAC7D,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5C,iEAAiE;YACjE,iBAAiB;YACjB,GAAG,IAAI,YAAY,CAAA;QACrB,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,GAAG,CAAA;QAChB,gEAAgE;QAChE,sDAAsD;QACtD,qBAAqB;QACrB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAA;QAC5B,CAAC;QACD,oBAAoB;IACtB,CAAC;IAED,gBAAgB,CAAC,CAAS,EAAE,CAAW;QACrC,OAAO,CACL,IAAI,CAAC,yBAAyB,CAAC,CAAC,EAAE,CAAC,CAAC;YACpC,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAC/B,CAAA;IACH,CAAC;IAED,mBAAmB,CAAC,CAAS,EAAE,CAAW;QACxC,qDAAqD;QACrD,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QAC3D,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,GAAG,IAAI,CAAA;QAC/B,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACzD,KAAK,CAAC,KAAK,IAAI,OAAO,CAAA;QACxB,CAAC;QACD,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAChB,CAAC,CAAC,WAAW,EAAE,CAAA;QACf,OAAO,KAAK,CAAA;IACd,CAAC;IAED,yBAAyB,CAAC,CAAS,EAAE,CAAW;QAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YACnB,MAAM,IAAI,GACR,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;YAC3D,IAAI,IAAI,KAAK,MAAO,CAAC,UAAU,EAAE,CAAC;gBAChC,SAAQ;YACV,CAAC;YAED,OAAO,IAAI,CAAC,oBAAoB,CAAC,CAAC,EAAE,MAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QACpD,CAAC;IACH,CAAC;IAED,oBAAoB,CAClB,CAAS,EACT,CAAW,EACX,KAAa,EACb,CAAW;QAEX,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAA;QAChB,mDAAmD;QACnD,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,YAAY,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;QACjD,uDAAuD;QACvD,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI;YAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAA;QAEjC,6DAA6D;QAC7D,+DAA+D;QAC/D,IAAI,KAAK,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YAC5B,IAAI,KAAK,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;gBAAE,CAAC,CAAC,GAAG,EAAE,CAAA;;gBAC9B,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;YACvB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QACd,CAAC;QACD,CAAC,CAAC,WAAW,EAAE,CAAA;QACf,OAAO,CAAC,CAAA;IACV,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;gBAC/D,OAAO,IAAI,CAAA;YACb,CAAC;YAAC,OAAO,EAAE,EAAE,CAAC;gBACZ,IAAI,CAAC,UAAU,CAAE,EAA4B,CAAC,IAAI,CAAC,CAAA;YACrD,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,SAAS;QACP,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;gBACpD,OAAO,IAAI,CAAA;YACb,CAAC;YAAC,OAAO,EAAE,EAAE,CAAC;gBACZ,IAAI,CAAC,UAAU,CAAE,EAA4B,CAAC,IAAI,CAAC,CAAA;YACrD,CAAC;QACH,CAAC;IACH,CAAC;IAED,UAAU,CAAC,EAAS;QAClB,MAAM,EACJ,KAAK,EACL,OAAO,EACP,SAAS,EACT,WAAW,EACX,OAAO,EACP,MAAM,EACN,KAAK,EACL,OAAO,EACP,GAAG,EACH,GAAG,EACH,GAAG,EACH,IAAI,EACJ,KAAK,EACL,OAAO,EACP,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,GAAG,GACJ,GAAG,EAAE,CAAA;QACN,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;QACvB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAA;QAC3B,IAAI,CAAC,YAAY,GAAG,WAAW,CAAA;QAC/B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;QACvB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;QACrB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;QACvB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;QACf,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;QACf,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;QACf,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;QACjB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;QACvB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;QACjB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;QACjB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;QACf,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAA;QAC1B,2CAA2C;QAC3C,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC,GAAG,IAAI,GAAG,YAAY,CAAA;QAC9D,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACzD,IAAI,CAAC,KAAK,IAAI,OAAO,CAAA;QACvB,CAAC;IACH,CAAC;IAED,YAAY,GAGE,EAAE,CAAA;IAChB,kBAAkB,GAAY,KAAK,CAAA;IACnC,gBAAgB,CAAC,QAAgB;QAC/B,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAA;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAA;QACrC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAA;QAC5B,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;IACvC,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACH,SAAS,CACP,EAAkE,EAClE,aAAsB,KAAK;QAE3B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACvB,IAAI,UAAU;gBAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;;gBACvB,cAAc,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAA;YACvC,OAAM;QACR,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAChC,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAA;YACjD,IAAI,UAAU;gBAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;;gBACtB,cAAc,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YACtC,OAAM;QACR,CAAC;QAED,iDAAiD;QACjD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC1B,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,OAAM;QACR,CAAC;QACD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAA;QAE9B,4CAA4C;QAC5C,8CAA8C;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAChC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE;YAClE,IAAI,EAAE,EAAE,CAAC;gBACP,IAAI,CAAC,YAAY,CAAE,EAA4B,CAAC,IAAI,CAAC,CAAA;gBACrD,QAAQ,CAAC,WAAW,GAAG,CAAC,CAAA;YAC1B,CAAC;iBAAM,CAAC;gBACN,oDAAoD;gBACpD,YAAY;gBACZ,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;oBACxB,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;gBACpC,CAAC;gBACD,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;YAChC,CAAC;YACD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAA;YAC9D,OAAM;QACR,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,qBAAqB,CAAgB;IAErC;;;;;;;;OAQG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACvB,OAAO,EAAE,CAAA;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAChC,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YACzB,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAA;QAChD,CAAC;QAED,4CAA4C;QAC5C,8CAA8C;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAChC,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,qBAAqB,CAAA;QAClC,CAAC;aAAM,CAAC;YACN,qBAAqB;YACrB,IAAI,OAAO,GAAe,GAAG,EAAE,GAAE,CAAC,CAAA;YAClC,oBAAoB;YACpB,IAAI,CAAC,qBAAqB,GAAG,IAAI,OAAO,CACtC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,CACvB,CAAA;YACD,IAAI,CAAC;gBACH,KAAK,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE;oBACxD,aAAa,EAAE,IAAI;iBACpB,CAAC,EAAE,CAAC;oBACH,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;gBACpC,CAAC;gBACD,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;YAChC,CAAC;YAAC,OAAO,EAAE,EAAE,CAAC;gBACZ,IAAI,CAAC,YAAY,CAAE,EAA4B,CAAC,IAAI,CAAC,CAAA;gBACrD,QAAQ,CAAC,WAAW,GAAG,CAAC,CAAA;YAC1B,CAAC;YACD,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAA;YACtC,OAAO,EAAE,CAAA;QACX,CAAC;QACD,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAA;IAChD,CAAC;IAED;;OAEG;IACH,WAAW;QACT,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACvB,OAAO,EAAE,CAAA;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAChC,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YACzB,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAA;QAChD,CAAC;QAED,4CAA4C;QAC5C,8CAA8C;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAChC,IAAI,CAAC;YACH,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,EAAE;gBAC7C,aAAa,EAAE,IAAI;aACpB,CAAC,EAAE,CAAC;gBACH,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;YACpC,CAAC;YACD,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;QAChC,CAAC;QAAC,OAAO,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,YAAY,CAAE,EAA4B,CAAC,IAAI,CAAC,CAAA;YACrD,QAAQ,CAAC,WAAW,GAAG,CAAC,CAAA;QAC1B,CAAC;QACD,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAA;IAChD,CAAC;IAED,UAAU;QACR,IAAI,IAAI,CAAC,KAAK,GAAG,QAAQ;YAAE,OAAO,KAAK,CAAA;QACvC,MAAM,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,CAAA;QAC9B,mEAAmE;QACnE,qBAAqB;QACrB,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAC5D,OAAO,KAAK,CAAA;QACd,CAAC;QACD,oBAAoB;QACpB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,UAAU,CACR,IAA+B,EAC/B,UAAqC;QAErC,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,KAAK;YAC9B,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;YACxB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YACf,CAAC,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAClC,CAAA;IACH,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC,SAAS,CAAA;QACzC,IAAI,CAAC,WAAW,GAAG,WAAW,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAA;QACvE,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;YAC5D,OAAO,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAA;QAC5C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,gBAAgB,EAAE,CAAA;QACzB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,YAAY;QACV,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC,SAAS,CAAA;QACzC,IAAI,CAAC,WAAW,GAAG,WAAW,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAA;QACvE,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;YACjD,OAAO,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAA;QAC5C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,gBAAgB,EAAE,CAAA;QACzB,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,CAAC,QAAQ,CAAC,CAAC,MAAgB;QACzB,IAAI,MAAM,KAAK,IAAI;YAAE,OAAM;QAC3B,MAAM,CAAC,KAAK,GAAG,KAAK,CAAA;QACpB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;QAEjB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAW,EAAE,CAAC,CAAA;QACrC,IAAI,EAAE,GAAG,EAAE,CAAA;QACX,IAAI,CAAC,GAAa,IAAI,CAAA;QACtB,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACd,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC/B,CAAC,CAAC,cAAc,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC/B,CAAC,GAAG,CAAC,CAAC,MAAM,CAAA;YACZ,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACf,CAAC;QACD,oCAAoC;QACpC,CAAC,GAAG,MAAM,CAAA;QACV,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACxC,CAAC,CAAC,SAAS,GAAG,SAAS,CAAA;YACvB,CAAC,CAAC,cAAc,GAAG,SAAS,CAAA;YAC5B,CAAC,GAAG,CAAC,CAAC,MAAM,CAAA;QACd,CAAC;IACH,CAAC;CACF;AAzlCD,4BAylCC;AAED;;;;;GAKG;AACH,MAAa,SAAU,SAAQ,QAAQ;IACrC;;OAEG;IACH,GAAG,GAAS,IAAI,CAAA;IAChB;;OAEG;IACH,QAAQ,GAAW,SAAS,CAAA;IAE5B;;;;;OAKG;IACH,YACE,IAAY,EACZ,OAAe,OAAO,EACtB,IAA0B,EAC1B,KAAgC,EAChC,MAAe,EACf,QAAuB,EACvB,IAAc;QAEd,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;IACxD,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,IAAY,EAAE,OAAe,OAAO,EAAE,OAAiB,EAAE;QAChE,OAAO,IAAI,SAAS,CAClB,IAAI,EACJ,IAAI,EACJ,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CACL,CAAA;IACH,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,IAAY;QACxB,OAAO,iBAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAA;IAC/B,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,QAAgB;QACtB,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAA;QAC7C,IAAI,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,IAAI,CAAA;QAClB,CAAC;QACD,8DAA8D;QAC9D,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACzD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;gBACrC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAA;YACtC,CAAC;QACH,CAAC;QACD,uCAAuC;QACvC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,eAAe,CAChD,QAAQ,EACR,IAAI,CACL,CAAC,IAAI,CAAC,CAAA;IACT,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,QAAgB,EAAE,UAAkB,IAAI,CAAC,IAAI,CAAC,IAAI;QACzD,2DAA2D;QAC3D,qEAAqE;QACrE,yBAAyB;QACzB,QAAQ,GAAG,QAAQ;aAChB,WAAW,EAAE;aACb,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;aACpB,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;QAClC,OAAO,QAAQ,KAAK,OAAO,CAAA;IAC7B,CAAC;CACF;AApFD,8BAoFC;AAED;;;;GAIG;AACH,MAAa,SAAU,SAAQ,QAAQ;IACrC;;OAEG;IACH,QAAQ,GAAQ,GAAG,CAAA;IACnB;;OAEG;IACH,GAAG,GAAQ,GAAG,CAAA;IAEd;;;;;OAKG;IACH,YACE,IAAY,EACZ,OAAe,OAAO,EACtB,IAA0B,EAC1B,KAAgC,EAChC,MAAe,EACf,QAAuB,EACvB,IAAc;QAEd,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;IACxD,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,IAAY;QACxB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;IACxC,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,SAAiB;QACvB,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,IAAY,EAAE,OAAe,OAAO,EAAE,OAAiB,EAAE;QAChE,OAAO,IAAI,SAAS,CAClB,IAAI,EACJ,IAAI,EACJ,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CACL,CAAA;IACH,CAAC;CACF;AAxDD,8BAwDC;AAiCD;;;;;;;GAOG;AACH,MAAsB,cAAc;IAClC;;OAEG;IACH,IAAI,CAAU;IACd;;OAEG;IACH,QAAQ,CAAQ;IAChB;;OAEG;IACH,KAAK,CAA2B;IAChC;;OAEG;IACH,GAAG,CAAU;IACb,aAAa,CAAc;IAC3B,kBAAkB,CAAc;IAChC,SAAS,CAAe;IACxB;;;;OAIG;IACH,MAAM,CAAS;IASf,GAAG,CAAS;IAEZ;;;;;;OAMG;IACH,YACE,MAAoB,OAAO,CAAC,GAAG,EAAE,EACjC,QAAqC,EACrC,GAAoB,EACpB,EACE,MAAM,EACN,iBAAiB,GAAG,EAAE,GAAG,IAAI,EAC7B,EAAE,GAAG,SAAS,MACI,EAAE;QAEtB,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC,EAAE,CAAC,CAAA;QAC3B,IAAI,GAAG,YAAY,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACpD,GAAG,GAAG,IAAA,wBAAa,EAAC,GAAG,CAAC,CAAA;QAC1B,CAAC;QACD,qDAAqD;QACrD,+CAA+C;QAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACrC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAChC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;QAC3C,IAAI,CAAC,aAAa,GAAG,IAAI,YAAY,EAAE,CAAA;QACvC,IAAI,CAAC,kBAAkB,GAAG,IAAI,YAAY,EAAE,CAAA;QAC5C,IAAI,CAAC,SAAS,GAAG,IAAI,aAAa,CAAC,iBAAiB,CAAC,CAAA;QAErD,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAChE,8DAA8D;QAC9D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACpC,KAAK,CAAC,GAAG,EAAE,CAAA;QACb,CAAC;QACD,qBAAqB;QACrB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,IAAI,SAAS,CACjB,oDAAoD,CACrD,CAAA;QACH,CAAC;QACD,oBAAoB;QACpB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAClC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,IAAI,CAAA;QACrC,IAAI,IAAI,GAAa,IAAI,CAAC,IAAI,CAAA;QAC9B,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAA;QAC1B,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAA;QAC5B,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAA;QACvB,IAAI,QAAQ,GAAG,KAAK,CAAA;QACpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,GAAG,EAAE,CAAA;YACf,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;gBACtB,QAAQ,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;gBAC/C,aAAa,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBAChD,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;aACpD,CAAC,CAAA;YACF,QAAQ,GAAG,IAAI,CAAA;QACjB,CAAC;QACD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAA;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAsB,IAAI,CAAC,GAAG;QAClC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAC/B,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,EAAE,CAAA;IACrB,CAAC;IAmBD;;;;;OAKG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IAED;;;;;;;;OAQG;IACH,OAAO,CAAC,GAAG,KAAe;QACxB,+DAA+D;QAC/D,gEAAgE;QAChE,IAAI,CAAC,GAAG,EAAE,CAAA;QACV,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;YAClB,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG;gBAAE,SAAQ;YAC7B,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YACvB,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvB,MAAK;YACP,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACxC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,MAAM,CAAA;QACf,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC7C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;QACjC,OAAO,MAAM,CAAA;IACf,CAAC;IAED;;;;;;;;;;OAUG;IACH,YAAY,CAAC,GAAG,KAAe;QAC7B,+DAA+D;QAC/D,gEAAgE;QAChE,IAAI,CAAC,GAAG,EAAE,CAAA;QACV,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;YAClB,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG;gBAAE,SAAQ;YAC7B,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YACvB,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvB,MAAK;YACP,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC7C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,MAAM,CAAA;QACf,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;QAClD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;QACtC,OAAO,MAAM,CAAA;IACf,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,QAA2B,IAAI,CAAC,GAAG;QAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;QACD,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAA;IACzB,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,QAA2B,IAAI,CAAC,GAAG;QAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;QACD,OAAO,KAAK,CAAC,aAAa,EAAE,CAAA;IAC9B,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,QAA2B,IAAI,CAAC,GAAG;QAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAA;IACnB,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,QAA2B,IAAI,CAAC,GAAG;QACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAA;IAC3C,CAAC;IAkCD,KAAK,CAAC,OAAO,CACX,QAAwD,IAAI,CAAC,GAAG,EAChE,OAAmC;QACjC,aAAa,EAAE,IAAI;KACpB;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,EAAE,CAAC;YACxC,IAAI,GAAG,KAAK,CAAA;YACZ,KAAK,GAAG,IAAI,CAAC,GAAG,CAAA;QAClB,CAAC;QACD,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,CAAA;QAC9B,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;YACxB,OAAO,EAAE,CAAA;QACX,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,CAAA;YAC/B,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAC/C,CAAC;IACH,CAAC;IAsBD,WAAW,CACT,QAAwD,IAAI,CAAC,GAAG,EAChE,OAAmC;QACjC,aAAa,EAAE,IAAI;KACpB;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,EAAE,CAAC;YACxC,IAAI,GAAG,KAAK,CAAA;YACZ,KAAK,GAAG,IAAI,CAAC,GAAG,CAAA;QAClB,CAAC;QACD,MAAM,EAAE,aAAa,GAAG,IAAI,EAAE,GAAG,IAAI,CAAA;QACrC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;YACxB,OAAO,EAAE,CAAA;QACX,CAAC;aAAM,IAAI,aAAa,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC,WAAW,EAAE,CAAA;QAC5B,CAAC;aAAM,CAAC;YACN,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAC7C,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,KAAK,CACT,QAA2B,IAAI,CAAC,GAAG;QAEnC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;QACD,OAAO,KAAK,CAAC,KAAK,EAAE,CAAA;IACtB,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,QAA2B,IAAI,CAAC,GAAG;QAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;QACD,OAAO,KAAK,CAAC,SAAS,EAAE,CAAA;IAC1B,CAAC;IAkCD,KAAK,CAAC,QAAQ,CACZ,QAAwD,IAAI,CAAC,GAAG,EAChE,EAAE,aAAa,KAAiC;QAC9C,aAAa,EAAE,KAAK;KACrB;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,EAAE,CAAC;YACxC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAA;YACnC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAA;QAClB,CAAC;QACD,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAA;QAChC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAA;IAC1C,CAAC;IAuBD,YAAY,CACV,QAAwD,IAAI,CAAC,GAAG,EAChE,EAAE,aAAa,KAAiC;QAC9C,aAAa,EAAE,KAAK;KACrB;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,EAAE,CAAC;YACxC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAA;YACnC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAA;QAClB,CAAC;QACD,MAAM,CAAC,GAAG,KAAK,CAAC,YAAY,EAAE,CAAA;QAC9B,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAA;IAC1C,CAAC;IAiCD,KAAK,CAAC,QAAQ,CACZ,QAAwD,IAAI,CAAC,GAAG,EAChE,EAAE,aAAa,KAAiC;QAC9C,aAAa,EAAE,KAAK;KACrB;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,EAAE,CAAC;YACxC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAA;YACnC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAA;QAClB,CAAC;QACD,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAA;QAChC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAA;IAC1C,CAAC;IAoBD,YAAY,CACV,QAAwD,IAAI,CAAC,GAAG,EAChE,EAAE,aAAa,KAAiC;QAC9C,aAAa,EAAE,KAAK;KACrB;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,EAAE,CAAC;YACxC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAA;YACnC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAA;QAClB,CAAC;QACD,MAAM,CAAC,GAAG,KAAK,CAAC,YAAY,EAAE,CAAA;QAC9B,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAA;IAC1C,CAAC;IA6BD,KAAK,CAAC,IAAI,CACR,QAAyC,IAAI,CAAC,GAAG,EACjD,OAAoB,EAAE;QAEtB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,EAAE,CAAC;YACxC,IAAI,GAAG,KAAK,CAAA;YACZ,KAAK,GAAG,IAAI,CAAC,GAAG,CAAA;QAClB,CAAC;QACD,MAAM,EACJ,aAAa,GAAG,IAAI,EACpB,MAAM,GAAG,KAAK,EACd,MAAM,EACN,UAAU,GACX,GAAG,IAAI,CAAA;QACR,MAAM,OAAO,GAA0B,EAAE,CAAA;QACzC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;QACxD,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAY,CAAA;QAChC,MAAM,IAAI,GAAG,CACX,GAAa,EACb,EAAwC,EACxC,EAAE;YACF,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACb,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE;gBAC5B,qBAAqB;gBACrB,IAAI,EAAE,EAAE,CAAC;oBACP,OAAO,EAAE,CAAC,EAAE,CAAC,CAAA;gBACf,CAAC;gBACD,oBAAoB;gBACpB,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,CAAA;gBACxB,IAAI,CAAC,GAAG;oBAAE,OAAO,EAAE,EAAE,CAAA;gBACrB,MAAM,IAAI,GAAG,GAAG,EAAE;oBAChB,IAAI,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;wBAChB,EAAE,EAAE,CAAA;oBACN,CAAC;gBACH,CAAC,CAAA;gBACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;oBACxB,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;wBACzB,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;oBAChD,CAAC;oBACD,IAAI,MAAM,IAAI,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC;wBACjC,CAAC,CAAC,QAAQ,EAAE;6BACT,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;6BAC3C,IAAI,CAAC,CAAC,CAAC,EAAE,CACR,CAAC,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CACzD,CAAA;oBACL,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;4BACnC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;wBACf,CAAC;6BAAM,CAAC;4BACN,IAAI,EAAE,CAAA;wBACR,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC,EAAE,IAAI,CAAC,CAAA,CAAC,cAAc;QACzB,CAAC,CAAA;QAED,MAAM,KAAK,GAAG,KAAK,CAAA;QACnB,OAAO,IAAI,OAAO,CAAwB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACrD,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE;gBACf,qBAAqB;gBACrB,IAAI,EAAE;oBAAE,OAAO,GAAG,CAAC,EAAE,CAAC,CAAA;gBACtB,oBAAoB;gBACpB,GAAG,CAAC,OAAgC,CAAC,CAAA;YACvC,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IA6BD,QAAQ,CACN,QAAyC,IAAI,CAAC,GAAG,EACjD,OAAoB,EAAE;QAEtB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,EAAE,CAAC;YACxC,IAAI,GAAG,KAAK,CAAA;YACZ,KAAK,GAAG,IAAI,CAAC,GAAG,CAAA;QAClB,CAAC;QACD,MAAM,EACJ,aAAa,GAAG,IAAI,EACpB,MAAM,GAAG,KAAK,EACd,MAAM,EACN,UAAU,GACX,GAAG,IAAI,CAAA;QACR,MAAM,OAAO,GAA0B,EAAE,CAAA;QACzC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;QACxD,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAW,CAAC,KAAK,CAAC,CAAC,CAAA;QACvC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;YACjC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzB,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;gBAChD,CAAC;gBACD,IAAI,CAAC,GAAyB,CAAC,CAAA;gBAC/B,IAAI,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC;oBACvB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;wBAAE,SAAQ;oBACjD,IAAI,CAAC,CAAC,SAAS,EAAE;wBAAE,CAAC,CAAC,SAAS,EAAE,CAAA;gBAClC,CAAC;gBACD,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;oBACnC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;gBACb,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,OAAgC,CAAA;IACzC,CAAC;IAED;;;;;;;;OAQG;IACH,CAAC,MAAM,CAAC,aAAa,CAAC;QACpB,OAAO,IAAI,CAAC,OAAO,EAAE,CAAA;IACvB,CAAC;IA+BD,OAAO,CACL,QAAyC,IAAI,CAAC,GAAG,EACjD,UAAuB,EAAE;QAEzB,oEAAoE;QACpE,yEAAyE;QACzE,yEAAyE;QACzE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,EAAE,CAAC;YACxC,OAAO,GAAG,KAAK,CAAA;YACf,KAAK,GAAG,IAAI,CAAC,GAAG,CAAA;QAClB,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAA;IAC5D,CAAC;IAED;;;;OAIG;IACH,CAAC,MAAM,CAAC,QAAQ,CAAC;QACf,OAAO,IAAI,CAAC,WAAW,EAAE,CAAA;IAC3B,CAAC;IAuBD,CAAC,WAAW,CACV,QAAyC,IAAI,CAAC,GAAG,EACjD,OAAoB,EAAE;QAEtB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,EAAE,CAAC;YACxC,IAAI,GAAG,KAAK,CAAA;YACZ,KAAK,GAAG,IAAI,CAAC,GAAG,CAAA;QAClB,CAAC;QACD,MAAM,EACJ,aAAa,GAAG,IAAI,EACpB,MAAM,GAAG,KAAK,EACd,MAAM,EACN,UAAU,GACX,GAAG,IAAI,CAAA;QACR,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAA;QAChD,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAW,CAAC,KAAK,CAAC,CAAC,CAAA;QACvC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;YACjC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzB,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;gBACxC,CAAC;gBACD,IAAI,CAAC,GAAyB,CAAC,CAAA;gBAC/B,IAAI,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC;oBACvB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;wBAAE,SAAQ;oBACjD,IAAI,CAAC,CAAC,SAAS,EAAE;wBAAE,CAAC,CAAC,SAAS,EAAE,CAAA;gBAClC,CAAC;gBACD,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;oBACnC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;gBACb,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IA2BD,MAAM,CACJ,QAAyC,IAAI,CAAC,GAAG,EACjD,OAAoB,EAAE;QAEtB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,EAAE,CAAC;YACxC,IAAI,GAAG,KAAK,CAAA;YACZ,KAAK,GAAG,IAAI,CAAC,GAAG,CAAA;QAClB,CAAC;QACD,MAAM,EACJ,aAAa,GAAG,IAAI,EACpB,MAAM,GAAG,KAAK,EACd,MAAM,EACN,UAAU,GACX,GAAG,IAAI,CAAA;QACR,MAAM,OAAO,GAAG,IAAI,mBAAQ,CAAoB,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;QACrE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;QACzD,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAY,CAAA;QAChC,MAAM,KAAK,GAAe,CAAC,KAAK,CAAC,CAAA;QACjC,IAAI,UAAU,GAAG,CAAC,CAAA;QAClB,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,IAAI,MAAM,GAAG,KAAK,CAAA;YAClB,OAAO,CAAC,MAAM,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,CAAA;gBACzB,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,IAAI,UAAU,KAAK,CAAC;wBAAE,OAAO,CAAC,GAAG,EAAE,CAAA;oBACnC,OAAM;gBACR,CAAC;gBAED,UAAU,EAAE,CAAA;gBACZ,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBAEb,MAAM,SAAS,GAAG,CAChB,EAAgC,EAChC,OAAmB,EACnB,eAAwB,KAAK,EAC7B,EAAE;oBACF,qBAAqB;oBACrB,IAAI,EAAE;wBAAE,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;oBACxC,oBAAoB;oBACpB,IAAI,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;wBAC5B,MAAM,QAAQ,GAAoC,EAAE,CAAA;wBACpD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;4BACxB,IAAI,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC;gCACvB,QAAQ,CAAC,IAAI,CACX,CAAC;qCACE,QAAQ,EAAE;qCACV,IAAI,CAAC,CAAC,CAAuB,EAAE,EAAE,CAChC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAC/B,CACJ,CAAA;4BACH,CAAC;wBACH,CAAC;wBACD,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;4BACpB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAC9B,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAC/B,CAAA;4BACD,OAAM;wBACR,CAAC;oBACH,CAAC;oBAED,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;wBACxB,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;4BAChC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;gCACrD,MAAM,GAAG,IAAI,CAAA;4BACf,CAAC;wBACH,CAAC;oBACH,CAAC;oBAED,UAAU,EAAE,CAAA;oBACZ,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;wBACxB,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;wBACjC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;4BACnC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;wBACf,CAAC;oBACH,CAAC;oBACD,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;wBAC/B,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;oBAChC,CAAC;yBAAM,IAAI,CAAC,IAAI,EAAE,CAAC;wBACjB,OAAO,EAAE,CAAA;oBACX,CAAC;gBACH,CAAC,CAAA;gBAED,oBAAoB;gBACpB,IAAI,IAAI,GAAG,IAAI,CAAA;gBACf,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;gBAC9B,IAAI,GAAG,KAAK,CAAA;YACd,CAAC;QACH,CAAC,CAAA;QACD,OAAO,EAAE,CAAA;QACT,OAAO,OAAgD,CAAA;IACzD,CAAC;IA8BD,UAAU,CACR,QAAyC,IAAI,CAAC,GAAG,EACjD,OAAoB,EAAE;QAEtB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,EAAE,CAAC;YACxC,IAAI,GAAG,KAAK,CAAA;YACZ,KAAK,GAAG,IAAI,CAAC,GAAG,CAAA;QAClB,CAAC;QACD,MAAM,EACJ,aAAa,GAAG,IAAI,EACpB,MAAM,GAAG,KAAK,EACd,MAAM,EACN,UAAU,GACX,GAAG,IAAI,CAAA;QACR,MAAM,OAAO,GAAG,IAAI,mBAAQ,CAAoB,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;QACrE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAY,CAAA;QAChC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;QACzD,CAAC;QACD,MAAM,KAAK,GAAe,CAAC,KAAK,CAAC,CAAA;QACjC,IAAI,UAAU,GAAG,CAAC,CAAA;QAClB,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,IAAI,MAAM,GAAG,KAAK,CAAA;YAClB,OAAO,CAAC,MAAM,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,CAAA;gBACzB,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,IAAI,UAAU,KAAK,CAAC;wBAAE,OAAO,CAAC,GAAG,EAAE,CAAA;oBACnC,OAAM;gBACR,CAAC;gBACD,UAAU,EAAE,CAAA;gBACZ,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBAEb,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;gBACjC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;oBACxB,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;wBACzB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;4BACrD,MAAM,GAAG,IAAI,CAAA;wBACf,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,UAAU,EAAE,CAAA;gBACZ,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;oBACxB,IAAI,CAAC,GAAyB,CAAC,CAAA;oBAC/B,IAAI,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC;wBACvB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;4BAAE,SAAQ;wBACjD,IAAI,CAAC,CAAC,SAAS,EAAE;4BAAE,CAAC,CAAC,SAAS,EAAE,CAAA;oBAClC,CAAC;oBACD,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;wBACnC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;oBACf,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO;gBAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAChE,CAAC,CAAA;QACD,OAAO,EAAE,CAAA;QACT,OAAO,OAAgD,CAAA;IACzD,CAAC;IAED,KAAK,CAAC,OAAsB,IAAI,CAAC,GAAG;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAA;QACvB,IAAI,CAAC,GAAG,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QACnE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAA;IAC5B,CAAC;CACF;AA9gCD,wCA8gCC;AAiED;;;;;GAKG;AACH,MAAa,eAAgB,SAAQ,cAAc;IACjD;;OAEG;IACH,GAAG,GAAS,IAAI,CAAA;IAEhB,YACE,MAAoB,OAAO,CAAC,GAAG,EAAE,EACjC,OAAuB,EAAE;QAEzB,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,IAAI,CAAA;QAC9B,KAAK,CAAC,GAAG,EAAE,iBAAK,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;QAC5C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,KAAK,IAAI,CAAC,GAAyB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;YAC7D,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QACxB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,GAAW;QACvB,wEAAwE;QACxE,iEAAiE;QACjE,kDAAkD;QAClD,OAAO,iBAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA;IAC5C,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,EAAW;QACjB,OAAO,IAAI,SAAS,CAClB,IAAI,CAAC,QAAQ,EACb,KAAK,EACL,SAAS,EACT,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,aAAa,EAAE,EACpB,EAAE,EAAE,EAAE,CACP,CAAA;IACH,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,CAAS;QAClB,OAAO,CACL,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CACrE,CAAA;IACH,CAAC;CACF;AAnDD,0CAmDC;AAED;;;;;;GAMG;AACH,MAAa,eAAgB,SAAQ,cAAc;IACjD;;OAEG;IACH,GAAG,GAAQ,GAAG,CAAA;IACd,YACE,MAAoB,OAAO,CAAC,GAAG,EAAE,EACjC,OAAuB,EAAE;QAEzB,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,IAAI,CAAA;QAC/B,KAAK,CAAC,GAAG,EAAE,iBAAK,EAAE,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;QAC3C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,IAAY;QACxB,OAAO,GAAG,CAAA;IACZ,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,EAAW;QACjB,OAAO,IAAI,SAAS,CAClB,IAAI,CAAC,QAAQ,EACb,KAAK,EACL,SAAS,EACT,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,aAAa,EAAE,EACpB,EAAE,EAAE,EAAE,CACP,CAAA;IACH,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,CAAS;QAClB,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;IAC1B,CAAC;CACF;AA1CD,0CA0CC;AAED;;;;;;;GAOG;AACH,MAAa,gBAAiB,SAAQ,eAAe;IACnD,YACE,MAAoB,OAAO,CAAC,GAAG,EAAE,EACjC,OAAuB,EAAE;QAEzB,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,IAAI,CAAA;QAC9B,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;IACjC,CAAC;CACF;AARD,4CAQC;AAED;;;;GAIG;AACU,QAAA,IAAI,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAA;AAGxE;;;;;GAKG;AACU,QAAA,UAAU,GAIrB,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe;IAC9C,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB;QAClD,CAAC,CAAC,eAAe,CAAA","sourcesContent":["import { LRUCache } from 'lru-cache'\nimport { posix, win32 } from 'node:path'\n\nimport { fileURLToPath } from 'node:url'\n\nimport {\n lstatSync,\n readdir as readdirCB,\n readdirSync,\n readlinkSync,\n realpathSync as rps,\n} from 'fs'\nimport * as actualFS from 'node:fs'\n\nconst realpathSync = rps.native\n// TODO: test perf of fs/promises realpath vs realpathCB,\n// since the promises one uses realpath.native\n\nimport { lstat, readdir, readlink, realpath } from 'node:fs/promises'\n\nimport { Minipass } from 'minipass'\nimport type { Dirent, Stats } from 'node:fs'\n\n/**\n * An object that will be used to override the default `fs`\n * methods. Any methods that are not overridden will use Node's\n * built-in implementations.\n *\n * - lstatSync\n * - readdir (callback `withFileTypes` Dirent variant, used for\n * readdirCB and most walks)\n * - readdirSync\n * - readlinkSync\n * - realpathSync\n * - promises: Object containing the following async methods:\n * - lstat\n * - readdir (Dirent variant only)\n * - readlink\n * - realpath\n */\nexport interface FSOption {\n lstatSync?: (path: string) => Stats\n readdir?: (\n path: string,\n options: { withFileTypes: true },\n cb: (er: NodeJS.ErrnoException | null, entries?: Dirent[]) => any,\n ) => void\n readdirSync?: (\n path: string,\n options: { withFileTypes: true },\n ) => Dirent[]\n readlinkSync?: (path: string) => string\n realpathSync?: (path: string) => string\n promises?: {\n lstat?: (path: string) => Promise\n readdir?: (\n path: string,\n options: { withFileTypes: true },\n ) => Promise\n readlink?: (path: string) => Promise\n realpath?: (path: string) => Promise\n [k: string]: any\n }\n [k: string]: any\n}\n\ninterface FSValue {\n lstatSync: (path: string) => Stats\n readdir: (\n path: string,\n options: { withFileTypes: true },\n cb: (er: NodeJS.ErrnoException | null, entries?: Dirent[]) => any,\n ) => void\n readdirSync: (path: string, options: { withFileTypes: true }) => Dirent[]\n readlinkSync: (path: string) => string\n realpathSync: (path: string) => string\n promises: {\n lstat: (path: string) => Promise\n readdir: (\n path: string,\n options: { withFileTypes: true },\n ) => Promise\n readlink: (path: string) => Promise\n realpath: (path: string) => Promise\n [k: string]: any\n }\n [k: string]: any\n}\n\nconst defaultFS: FSValue = {\n lstatSync,\n readdir: readdirCB,\n readdirSync,\n readlinkSync,\n realpathSync,\n promises: {\n lstat,\n readdir,\n readlink,\n realpath,\n },\n}\n\n// if they just gave us require('fs') then use our default\nconst fsFromOption = (fsOption?: FSOption): FSValue =>\n !fsOption || fsOption === defaultFS || fsOption === actualFS ?\n defaultFS\n : {\n ...defaultFS,\n ...fsOption,\n promises: {\n ...defaultFS.promises,\n ...(fsOption.promises || {}),\n },\n }\n\n// turn something like //?/c:/ into c:\\\nconst uncDriveRegexp = /^\\\\\\\\\\?\\\\([a-z]:)\\\\?$/i\nconst uncToDrive = (rootPath: string): string =>\n rootPath.replace(/\\//g, '\\\\').replace(uncDriveRegexp, '$1\\\\')\n\n// windows paths are separated by either / or \\\nconst eitherSep = /[\\\\\\/]/\n\nconst UNKNOWN = 0 // may not even exist, for all we know\nconst IFIFO = 0b0001\nconst IFCHR = 0b0010\nconst IFDIR = 0b0100\nconst IFBLK = 0b0110\nconst IFREG = 0b1000\nconst IFLNK = 0b1010\nconst IFSOCK = 0b1100\nconst IFMT = 0b1111\n\nexport type Type =\n | 'Unknown'\n | 'FIFO'\n | 'CharacterDevice'\n | 'Directory'\n | 'BlockDevice'\n | 'File'\n | 'SymbolicLink'\n | 'Socket'\n\n// mask to unset low 4 bits\nconst IFMT_UNKNOWN = ~IFMT\n\n// set after successfully calling readdir() and getting entries.\nconst READDIR_CALLED = 0b0000_0001_0000\n// set after a successful lstat()\nconst LSTAT_CALLED = 0b0000_0010_0000\n// set if an entry (or one of its parents) is definitely not a dir\nconst ENOTDIR = 0b0000_0100_0000\n// set if an entry (or one of its parents) does not exist\n// (can also be set on lstat errors like EACCES or ENAMETOOLONG)\nconst ENOENT = 0b0000_1000_0000\n// cannot have child entries -- also verify &IFMT is either IFDIR or IFLNK\n// set if we fail to readlink\nconst ENOREADLINK = 0b0001_0000_0000\n// set if we know realpath() will fail\nconst ENOREALPATH = 0b0010_0000_0000\n\nconst ENOCHILD = ENOTDIR | ENOENT | ENOREALPATH\nconst TYPEMASK = 0b0011_1111_1111\n\nconst entToType = (s: Dirent | Stats) =>\n s.isFile() ? IFREG\n : s.isDirectory() ? IFDIR\n : s.isSymbolicLink() ? IFLNK\n : s.isCharacterDevice() ? IFCHR\n : s.isBlockDevice() ? IFBLK\n : s.isSocket() ? IFSOCK\n : s.isFIFO() ? IFIFO\n : UNKNOWN\n\n// normalize unicode path names\nconst normalizeCache = new Map()\nconst normalize = (s: string) => {\n const c = normalizeCache.get(s)\n if (c) return c\n const n = s.normalize('NFKD')\n normalizeCache.set(s, n)\n return n\n}\n\nconst normalizeNocaseCache = new Map()\nconst normalizeNocase = (s: string) => {\n const c = normalizeNocaseCache.get(s)\n if (c) return c\n const n = normalize(s.toLowerCase())\n normalizeNocaseCache.set(s, n)\n return n\n}\n\n/**\n * Options that may be provided to the Path constructor\n */\nexport interface PathOpts {\n fullpath?: string\n relative?: string\n relativePosix?: string\n parent?: PathBase\n /**\n * See {@link FSOption}\n */\n fs?: FSOption\n}\n\n/**\n * An LRUCache for storing resolved path strings or Path objects.\n * @internal\n */\nexport class ResolveCache extends LRUCache {\n constructor() {\n super({ max: 256 })\n }\n}\n\n// In order to prevent blowing out the js heap by allocating hundreds of\n// thousands of Path entries when walking extremely large trees, the \"children\"\n// in this tree are represented by storing an array of Path entries in an\n// LRUCache, indexed by the parent. At any time, Path.children() may return an\n// empty array, indicating that it doesn't know about any of its children, and\n// thus has to rebuild that cache. This is fine, it just means that we don't\n// benefit as much from having the cached entries, but huge directory walks\n// don't blow out the stack, and smaller ones are still as fast as possible.\n//\n//It does impose some complexity when building up the readdir data, because we\n//need to pass a reference to the children array that we started with.\n\n/**\n * an LRUCache for storing child entries.\n * @internal\n */\nexport class ChildrenCache extends LRUCache {\n constructor(maxSize: number = 16 * 1024) {\n super({\n maxSize,\n // parent + children\n sizeCalculation: a => a.length + 1,\n })\n }\n}\n\n/**\n * Array of Path objects, plus a marker indicating the first provisional entry\n *\n * @internal\n */\nexport type Children = PathBase[] & { provisional: number }\n\nconst setAsCwd = Symbol('PathScurry setAsCwd')\n\n/**\n * Path objects are sort of like a super-powered\n * {@link https://nodejs.org/docs/latest/api/fs.html#class-fsdirent fs.Dirent}\n *\n * Each one represents a single filesystem entry on disk, which may or may not\n * exist. It includes methods for reading various types of information via\n * lstat, readlink, and readdir, and caches all information to the greatest\n * degree possible.\n *\n * Note that fs operations that would normally throw will instead return an\n * \"empty\" value. This is in order to prevent excessive overhead from error\n * stack traces.\n */\nexport abstract class PathBase implements Dirent {\n /**\n * the basename of this path\n *\n * **Important**: *always* test the path name against any test string\n * usingthe {@link isNamed} method, and not by directly comparing this\n * string. Otherwise, unicode path strings that the system sees as identical\n * will not be properly treated as the same path, leading to incorrect\n * behavior and possible security issues.\n */\n name: string\n /**\n * the Path entry corresponding to the path root.\n *\n * @internal\n */\n root: PathBase\n /**\n * All roots found within the current PathScurry family\n *\n * @internal\n */\n roots: { [k: string]: PathBase }\n /**\n * a reference to the parent path, or undefined in the case of root entries\n *\n * @internal\n */\n parent?: PathBase\n /**\n * boolean indicating whether paths are compared case-insensitively\n * @internal\n */\n nocase: boolean\n\n /**\n * boolean indicating that this path is the current working directory\n * of the PathScurry collection that contains it.\n */\n isCWD: boolean = false\n\n /**\n * the string or regexp used to split paths. On posix, it is `'/'`, and on\n * windows it is a RegExp matching either `'/'` or `'\\\\'`\n */\n abstract splitSep: string | RegExp\n /**\n * The path separator string to use when joining paths\n */\n abstract sep: string\n\n // potential default fs override\n #fs: FSValue\n\n // Stats fields\n #dev?: number\n get dev() {\n return this.#dev\n }\n #mode?: number\n get mode() {\n return this.#mode\n }\n #nlink?: number\n get nlink() {\n return this.#nlink\n }\n #uid?: number\n get uid() {\n return this.#uid\n }\n #gid?: number\n get gid() {\n return this.#gid\n }\n #rdev?: number\n get rdev() {\n return this.#rdev\n }\n #blksize?: number\n get blksize() {\n return this.#blksize\n }\n #ino?: number\n get ino() {\n return this.#ino\n }\n #size?: number\n get size() {\n return this.#size\n }\n #blocks?: number\n get blocks() {\n return this.#blocks\n }\n #atimeMs?: number\n get atimeMs() {\n return this.#atimeMs\n }\n #mtimeMs?: number\n get mtimeMs() {\n return this.#mtimeMs\n }\n #ctimeMs?: number\n get ctimeMs() {\n return this.#ctimeMs\n }\n #birthtimeMs?: number\n get birthtimeMs() {\n return this.#birthtimeMs\n }\n #atime?: Date\n get atime() {\n return this.#atime\n }\n #mtime?: Date\n get mtime() {\n return this.#mtime\n }\n #ctime?: Date\n get ctime() {\n return this.#ctime\n }\n #birthtime?: Date\n get birthtime() {\n return this.#birthtime\n }\n\n #matchName: string\n #depth?: number\n #fullpath?: string\n #fullpathPosix?: string\n #relative?: string\n #relativePosix?: string\n #type: number\n #children: ChildrenCache\n #linkTarget?: PathBase\n #realpath?: PathBase\n\n /**\n * This property is for compatibility with the Dirent class as of\n * Node v20, where Dirent['parentPath'] refers to the path of the\n * directory that was passed to readdir. For root entries, it's the path\n * to the entry itself.\n */\n get parentPath(): string {\n return (this.parent || this).fullpath()\n }\n\n /**\n * Deprecated alias for Dirent['parentPath'] Somewhat counterintuitively,\n * this property refers to the *parent* path, not the path object itself.\n */\n get path(): string {\n return this.parentPath\n }\n\n /**\n * Do not create new Path objects directly. They should always be accessed\n * via the PathScurry class or other methods on the Path class.\n *\n * @internal\n */\n constructor(\n name: string,\n type: number = UNKNOWN,\n root: PathBase | undefined,\n roots: { [k: string]: PathBase },\n nocase: boolean,\n children: ChildrenCache,\n opts: PathOpts,\n ) {\n this.name = name\n this.#matchName = nocase ? normalizeNocase(name) : normalize(name)\n this.#type = type & TYPEMASK\n this.nocase = nocase\n this.roots = roots\n this.root = root || this\n this.#children = children\n this.#fullpath = opts.fullpath\n this.#relative = opts.relative\n this.#relativePosix = opts.relativePosix\n this.parent = opts.parent\n if (this.parent) {\n this.#fs = this.parent.#fs\n } else {\n this.#fs = fsFromOption(opts.fs)\n }\n }\n\n /**\n * Returns the depth of the Path object from its root.\n *\n * For example, a path at `/foo/bar` would have a depth of 2.\n */\n depth(): number {\n if (this.#depth !== undefined) return this.#depth\n if (!this.parent) return (this.#depth = 0)\n return (this.#depth = this.parent.depth() + 1)\n }\n\n /**\n * @internal\n */\n abstract getRootString(path: string): string\n /**\n * @internal\n */\n abstract getRoot(rootPath: string): PathBase\n /**\n * @internal\n */\n abstract newChild(name: string, type?: number, opts?: PathOpts): PathBase\n\n /**\n * @internal\n */\n childrenCache() {\n return this.#children\n }\n\n /**\n * Get the Path object referenced by the string path, resolved from this Path\n */\n resolve(path?: string): PathBase {\n if (!path) {\n return this\n }\n const rootPath = this.getRootString(path)\n const dir = path.substring(rootPath.length)\n const dirParts = dir.split(this.splitSep)\n const result: PathBase =\n rootPath ?\n this.getRoot(rootPath).#resolveParts(dirParts)\n : this.#resolveParts(dirParts)\n return result\n }\n\n #resolveParts(dirParts: string[]) {\n let p: PathBase = this\n for (const part of dirParts) {\n p = p.child(part)\n }\n return p\n }\n\n /**\n * Returns the cached children Path objects, if still available. If they\n * have fallen out of the cache, then returns an empty array, and resets the\n * READDIR_CALLED bit, so that future calls to readdir() will require an fs\n * lookup.\n *\n * @internal\n */\n children(): Children {\n const cached = this.#children.get(this)\n if (cached) {\n return cached\n }\n const children: Children = Object.assign([], { provisional: 0 })\n this.#children.set(this, children)\n this.#type &= ~READDIR_CALLED\n return children\n }\n\n /**\n * Resolves a path portion and returns or creates the child Path.\n *\n * Returns `this` if pathPart is `''` or `'.'`, or `parent` if pathPart is\n * `'..'`.\n *\n * This should not be called directly. If `pathPart` contains any path\n * separators, it will lead to unsafe undefined behavior.\n *\n * Use `Path.resolve()` instead.\n *\n * @internal\n */\n child(pathPart: string, opts?: PathOpts): PathBase {\n if (pathPart === '' || pathPart === '.') {\n return this\n }\n if (pathPart === '..') {\n return this.parent || this\n }\n\n // find the child\n const children = this.children()\n const name =\n this.nocase ? normalizeNocase(pathPart) : normalize(pathPart)\n for (const p of children) {\n if (p.#matchName === name) {\n return p\n }\n }\n\n // didn't find it, create provisional child, since it might not\n // actually exist. If we know the parent isn't a dir, then\n // in fact it CAN'T exist.\n const s = this.parent ? this.sep : ''\n const fullpath =\n this.#fullpath ? this.#fullpath + s + pathPart : undefined\n const pchild = this.newChild(pathPart, UNKNOWN, {\n ...opts,\n parent: this,\n fullpath,\n })\n\n if (!this.canReaddir()) {\n pchild.#type |= ENOENT\n }\n\n // don't have to update provisional, because if we have real children,\n // then provisional is set to children.length, otherwise a lower number\n children.push(pchild)\n return pchild\n }\n\n /**\n * The relative path from the cwd. If it does not share an ancestor with\n * the cwd, then this ends up being equivalent to the fullpath()\n */\n relative(): string {\n if (this.isCWD) return ''\n if (this.#relative !== undefined) {\n return this.#relative\n }\n const name = this.name\n const p = this.parent\n if (!p) {\n return (this.#relative = this.name)\n }\n const pv = p.relative()\n return pv + (!pv || !p.parent ? '' : this.sep) + name\n }\n\n /**\n * The relative path from the cwd, using / as the path separator.\n * If it does not share an ancestor with\n * the cwd, then this ends up being equivalent to the fullpathPosix()\n * On posix systems, this is identical to relative().\n */\n relativePosix(): string {\n if (this.sep === '/') return this.relative()\n if (this.isCWD) return ''\n if (this.#relativePosix !== undefined) return this.#relativePosix\n const name = this.name\n const p = this.parent\n if (!p) {\n return (this.#relativePosix = this.fullpathPosix())\n }\n const pv = p.relativePosix()\n return pv + (!pv || !p.parent ? '' : '/') + name\n }\n\n /**\n * The fully resolved path string for this Path entry\n */\n fullpath(): string {\n if (this.#fullpath !== undefined) {\n return this.#fullpath\n }\n const name = this.name\n const p = this.parent\n if (!p) {\n return (this.#fullpath = this.name)\n }\n const pv = p.fullpath()\n const fp = pv + (!p.parent ? '' : this.sep) + name\n return (this.#fullpath = fp)\n }\n\n /**\n * On platforms other than windows, this is identical to fullpath.\n *\n * On windows, this is overridden to return the forward-slash form of the\n * full UNC path.\n */\n fullpathPosix(): string {\n if (this.#fullpathPosix !== undefined) return this.#fullpathPosix\n if (this.sep === '/') return (this.#fullpathPosix = this.fullpath())\n if (!this.parent) {\n const p = this.fullpath().replace(/\\\\/g, '/')\n if (/^[a-z]:\\//i.test(p)) {\n return (this.#fullpathPosix = `//?/${p}`)\n } else {\n return (this.#fullpathPosix = p)\n }\n }\n const p = this.parent\n const pfpp = p.fullpathPosix()\n const fpp = pfpp + (!pfpp || !p.parent ? '' : '/') + this.name\n return (this.#fullpathPosix = fpp)\n }\n\n /**\n * Is the Path of an unknown type?\n *\n * Note that we might know *something* about it if there has been a previous\n * filesystem operation, for example that it does not exist, or is not a\n * link, or whether it has child entries.\n */\n isUnknown(): boolean {\n return (this.#type & IFMT) === UNKNOWN\n }\n\n isType(type: Type): boolean {\n return this[`is${type}`]()\n }\n\n getType(): Type {\n return (\n this.isUnknown() ? 'Unknown'\n : this.isDirectory() ? 'Directory'\n : this.isFile() ? 'File'\n : this.isSymbolicLink() ? 'SymbolicLink'\n : this.isFIFO() ? 'FIFO'\n : this.isCharacterDevice() ? 'CharacterDevice'\n : this.isBlockDevice() ? 'BlockDevice'\n : /* c8 ignore start */ this.isSocket() ? 'Socket'\n : 'Unknown'\n )\n /* c8 ignore stop */\n }\n\n /**\n * Is the Path a regular file?\n */\n isFile(): boolean {\n return (this.#type & IFMT) === IFREG\n }\n\n /**\n * Is the Path a directory?\n */\n isDirectory(): boolean {\n return (this.#type & IFMT) === IFDIR\n }\n\n /**\n * Is the path a character device?\n */\n isCharacterDevice(): boolean {\n return (this.#type & IFMT) === IFCHR\n }\n\n /**\n * Is the path a block device?\n */\n isBlockDevice(): boolean {\n return (this.#type & IFMT) === IFBLK\n }\n\n /**\n * Is the path a FIFO pipe?\n */\n isFIFO(): boolean {\n return (this.#type & IFMT) === IFIFO\n }\n\n /**\n * Is the path a socket?\n */\n isSocket(): boolean {\n return (this.#type & IFMT) === IFSOCK\n }\n\n /**\n * Is the path a symbolic link?\n */\n isSymbolicLink(): boolean {\n return (this.#type & IFLNK) === IFLNK\n }\n\n /**\n * Return the entry if it has been subject of a successful lstat, or\n * undefined otherwise.\n *\n * Does not read the filesystem, so an undefined result *could* simply\n * mean that we haven't called lstat on it.\n */\n lstatCached(): PathBase | undefined {\n return this.#type & LSTAT_CALLED ? this : undefined\n }\n\n /**\n * Return the cached link target if the entry has been the subject of a\n * successful readlink, or undefined otherwise.\n *\n * Does not read the filesystem, so an undefined result *could* just mean we\n * don't have any cached data. Only use it if you are very sure that a\n * readlink() has been called at some point.\n */\n readlinkCached(): PathBase | undefined {\n return this.#linkTarget\n }\n\n /**\n * Returns the cached realpath target if the entry has been the subject\n * of a successful realpath, or undefined otherwise.\n *\n * Does not read the filesystem, so an undefined result *could* just mean we\n * don't have any cached data. Only use it if you are very sure that a\n * realpath() has been called at some point.\n */\n realpathCached(): PathBase | undefined {\n return this.#realpath\n }\n\n /**\n * Returns the cached child Path entries array if the entry has been the\n * subject of a successful readdir(), or [] otherwise.\n *\n * Does not read the filesystem, so an empty array *could* just mean we\n * don't have any cached data. Only use it if you are very sure that a\n * readdir() has been called recently enough to still be valid.\n */\n readdirCached(): PathBase[] {\n const children = this.children()\n return children.slice(0, children.provisional)\n }\n\n /**\n * Return true if it's worth trying to readlink. Ie, we don't (yet) have\n * any indication that readlink will definitely fail.\n *\n * Returns false if the path is known to not be a symlink, if a previous\n * readlink failed, or if the entry does not exist.\n */\n canReadlink(): boolean {\n if (this.#linkTarget) return true\n if (!this.parent) return false\n // cases where it cannot possibly succeed\n const ifmt = this.#type & IFMT\n return !(\n (ifmt !== UNKNOWN && ifmt !== IFLNK) ||\n this.#type & ENOREADLINK ||\n this.#type & ENOENT\n )\n }\n\n /**\n * Return true if readdir has previously been successfully called on this\n * path, indicating that cachedReaddir() is likely valid.\n */\n calledReaddir(): boolean {\n return !!(this.#type & READDIR_CALLED)\n }\n\n /**\n * Returns true if the path is known to not exist. That is, a previous lstat\n * or readdir failed to verify its existence when that would have been\n * expected, or a parent entry was marked either enoent or enotdir.\n */\n isENOENT(): boolean {\n return !!(this.#type & ENOENT)\n }\n\n /**\n * Return true if the path is a match for the given path name. This handles\n * case sensitivity and unicode normalization.\n *\n * Note: even on case-sensitive systems, it is **not** safe to test the\n * equality of the `.name` property to determine whether a given pathname\n * matches, due to unicode normalization mismatches.\n *\n * Always use this method instead of testing the `path.name` property\n * directly.\n */\n isNamed(n: string): boolean {\n return !this.nocase ?\n this.#matchName === normalize(n)\n : this.#matchName === normalizeNocase(n)\n }\n\n /**\n * Return the Path object corresponding to the target of a symbolic link.\n *\n * If the Path is not a symbolic link, or if the readlink call fails for any\n * reason, `undefined` is returned.\n *\n * Result is cached, and thus may be outdated if the filesystem is mutated.\n */\n async readlink(): Promise {\n const target = this.#linkTarget\n if (target) {\n return target\n }\n if (!this.canReadlink()) {\n return undefined\n }\n /* c8 ignore start */\n // already covered by the canReadlink test, here for ts grumples\n if (!this.parent) {\n return undefined\n }\n /* c8 ignore stop */\n try {\n const read = await this.#fs.promises.readlink(this.fullpath())\n const linkTarget = (await this.parent.realpath())?.resolve(read)\n if (linkTarget) {\n return (this.#linkTarget = linkTarget)\n }\n } catch (er) {\n this.#readlinkFail((er as NodeJS.ErrnoException).code)\n return undefined\n }\n }\n\n /**\n * Synchronous {@link PathBase.readlink}\n */\n readlinkSync(): PathBase | undefined {\n const target = this.#linkTarget\n if (target) {\n return target\n }\n if (!this.canReadlink()) {\n return undefined\n }\n /* c8 ignore start */\n // already covered by the canReadlink test, here for ts grumples\n if (!this.parent) {\n return undefined\n }\n /* c8 ignore stop */\n try {\n const read = this.#fs.readlinkSync(this.fullpath())\n const linkTarget = this.parent.realpathSync()?.resolve(read)\n if (linkTarget) {\n return (this.#linkTarget = linkTarget)\n }\n } catch (er) {\n this.#readlinkFail((er as NodeJS.ErrnoException).code)\n return undefined\n }\n }\n\n #readdirSuccess(children: Children) {\n // succeeded, mark readdir called bit\n this.#type |= READDIR_CALLED\n // mark all remaining provisional children as ENOENT\n for (let p = children.provisional; p < children.length; p++) {\n const c = children[p]\n if (c) c.#markENOENT()\n }\n }\n\n #markENOENT() {\n // mark as UNKNOWN and ENOENT\n if (this.#type & ENOENT) return\n this.#type = (this.#type | ENOENT) & IFMT_UNKNOWN\n this.#markChildrenENOENT()\n }\n\n #markChildrenENOENT() {\n // all children are provisional and do not exist\n const children = this.children()\n children.provisional = 0\n for (const p of children) {\n p.#markENOENT()\n }\n }\n\n #markENOREALPATH() {\n this.#type |= ENOREALPATH\n this.#markENOTDIR()\n }\n\n // save the information when we know the entry is not a dir\n #markENOTDIR() {\n // entry is not a directory, so any children can't exist.\n // this *should* be impossible, since any children created\n // after it's been marked ENOTDIR should be marked ENOENT,\n // so it won't even get to this point.\n /* c8 ignore start */\n if (this.#type & ENOTDIR) return\n /* c8 ignore stop */\n let t = this.#type\n // this could happen if we stat a dir, then delete it,\n // then try to read it or one of its children.\n if ((t & IFMT) === IFDIR) t &= IFMT_UNKNOWN\n this.#type = t | ENOTDIR\n this.#markChildrenENOENT()\n }\n\n #readdirFail(code: string = '') {\n // markENOTDIR and markENOENT also set provisional=0\n if (code === 'ENOTDIR' || code === 'EPERM') {\n this.#markENOTDIR()\n } else if (code === 'ENOENT') {\n this.#markENOENT()\n } else {\n this.children().provisional = 0\n }\n }\n\n #lstatFail(code: string = '') {\n // Windows just raises ENOENT in this case, disable for win CI\n /* c8 ignore start */\n if (code === 'ENOTDIR') {\n // already know it has a parent by this point\n const p = this.parent as PathBase\n p.#markENOTDIR()\n } else if (code === 'ENOENT') {\n /* c8 ignore stop */\n this.#markENOENT()\n }\n }\n\n #readlinkFail(code: string = '') {\n let ter = this.#type\n ter |= ENOREADLINK\n if (code === 'ENOENT') ter |= ENOENT\n // windows gets a weird error when you try to readlink a file\n if (code === 'EINVAL' || code === 'UNKNOWN') {\n // exists, but not a symlink, we don't know WHAT it is, so remove\n // all IFMT bits.\n ter &= IFMT_UNKNOWN\n }\n this.#type = ter\n // windows just gets ENOENT in this case. We do cover the case,\n // just disabled because it's impossible on Windows CI\n /* c8 ignore start */\n if (code === 'ENOTDIR' && this.parent) {\n this.parent.#markENOTDIR()\n }\n /* c8 ignore stop */\n }\n\n #readdirAddChild(e: Dirent, c: Children) {\n return (\n this.#readdirMaybePromoteChild(e, c) ||\n this.#readdirAddNewChild(e, c)\n )\n }\n\n #readdirAddNewChild(e: Dirent, c: Children): PathBase {\n // alloc new entry at head, so it's never provisional\n const type = entToType(e)\n const child = this.newChild(e.name, type, { parent: this })\n const ifmt = child.#type & IFMT\n if (ifmt !== IFDIR && ifmt !== IFLNK && ifmt !== UNKNOWN) {\n child.#type |= ENOTDIR\n }\n c.unshift(child)\n c.provisional++\n return child\n }\n\n #readdirMaybePromoteChild(e: Dirent, c: Children): PathBase | undefined {\n for (let p = c.provisional; p < c.length; p++) {\n const pchild = c[p]\n const name =\n this.nocase ? normalizeNocase(e.name) : normalize(e.name)\n if (name !== pchild!.#matchName) {\n continue\n }\n\n return this.#readdirPromoteChild(e, pchild!, p, c)\n }\n }\n\n #readdirPromoteChild(\n e: Dirent,\n p: PathBase,\n index: number,\n c: Children,\n ): PathBase {\n const v = p.name\n // retain any other flags, but set ifmt from dirent\n p.#type = (p.#type & IFMT_UNKNOWN) | entToType(e)\n // case sensitivity fixing when we learn the true name.\n if (v !== e.name) p.name = e.name\n\n // just advance provisional index (potentially off the list),\n // otherwise we have to splice/pop it out and re-insert at head\n if (index !== c.provisional) {\n if (index === c.length - 1) c.pop()\n else c.splice(index, 1)\n c.unshift(p)\n }\n c.provisional++\n return p\n }\n\n /**\n * Call lstat() on this Path, and update all known information that can be\n * determined.\n *\n * Note that unlike `fs.lstat()`, the returned value does not contain some\n * information, such as `mode`, `dev`, `nlink`, and `ino`. If that\n * information is required, you will need to call `fs.lstat` yourself.\n *\n * If the Path refers to a nonexistent file, or if the lstat call fails for\n * any reason, `undefined` is returned. Otherwise the updated Path object is\n * returned.\n *\n * Results are cached, and thus may be out of date if the filesystem is\n * mutated.\n */\n async lstat(): Promise {\n if ((this.#type & ENOENT) === 0) {\n try {\n this.#applyStat(await this.#fs.promises.lstat(this.fullpath()))\n return this\n } catch (er) {\n this.#lstatFail((er as NodeJS.ErrnoException).code)\n }\n }\n }\n\n /**\n * synchronous {@link PathBase.lstat}\n */\n lstatSync(): PathBase | undefined {\n if ((this.#type & ENOENT) === 0) {\n try {\n this.#applyStat(this.#fs.lstatSync(this.fullpath()))\n return this\n } catch (er) {\n this.#lstatFail((er as NodeJS.ErrnoException).code)\n }\n }\n }\n\n #applyStat(st: Stats) {\n const {\n atime,\n atimeMs,\n birthtime,\n birthtimeMs,\n blksize,\n blocks,\n ctime,\n ctimeMs,\n dev,\n gid,\n ino,\n mode,\n mtime,\n mtimeMs,\n nlink,\n rdev,\n size,\n uid,\n } = st\n this.#atime = atime\n this.#atimeMs = atimeMs\n this.#birthtime = birthtime\n this.#birthtimeMs = birthtimeMs\n this.#blksize = blksize\n this.#blocks = blocks\n this.#ctime = ctime\n this.#ctimeMs = ctimeMs\n this.#dev = dev\n this.#gid = gid\n this.#ino = ino\n this.#mode = mode\n this.#mtime = mtime\n this.#mtimeMs = mtimeMs\n this.#nlink = nlink\n this.#rdev = rdev\n this.#size = size\n this.#uid = uid\n const ifmt = entToType(st)\n // retain any other flags, but set the ifmt\n this.#type = (this.#type & IFMT_UNKNOWN) | ifmt | LSTAT_CALLED\n if (ifmt !== UNKNOWN && ifmt !== IFDIR && ifmt !== IFLNK) {\n this.#type |= ENOTDIR\n }\n }\n\n #onReaddirCB: ((\n er: NodeJS.ErrnoException | null,\n entries: Path[],\n ) => any)[] = []\n #readdirCBInFlight: boolean = false\n #callOnReaddirCB(children: Path[]) {\n this.#readdirCBInFlight = false\n const cbs = this.#onReaddirCB.slice()\n this.#onReaddirCB.length = 0\n cbs.forEach(cb => cb(null, children))\n }\n\n /**\n * Standard node-style callback interface to get list of directory entries.\n *\n * If the Path cannot or does not contain any children, then an empty array\n * is returned.\n *\n * Results are cached, and thus may be out of date if the filesystem is\n * mutated.\n *\n * @param cb The callback called with (er, entries). Note that the `er`\n * param is somewhat extraneous, as all readdir() errors are handled and\n * simply result in an empty set of entries being returned.\n * @param allowZalgo Boolean indicating that immediately known results should\n * *not* be deferred with `queueMicrotask`. Defaults to `false`. Release\n * zalgo at your peril, the dark pony lord is devious and unforgiving.\n */\n readdirCB(\n cb: (er: NodeJS.ErrnoException | null, entries: PathBase[]) => any,\n allowZalgo: boolean = false,\n ): void {\n if (!this.canReaddir()) {\n if (allowZalgo) cb(null, [])\n else queueMicrotask(() => cb(null, []))\n return\n }\n\n const children = this.children()\n if (this.calledReaddir()) {\n const c = children.slice(0, children.provisional)\n if (allowZalgo) cb(null, c)\n else queueMicrotask(() => cb(null, c))\n return\n }\n\n // don't have to worry about zalgo at this point.\n this.#onReaddirCB.push(cb)\n if (this.#readdirCBInFlight) {\n return\n }\n this.#readdirCBInFlight = true\n\n // else read the directory, fill up children\n // de-provisionalize any provisional children.\n const fullpath = this.fullpath()\n this.#fs.readdir(fullpath, { withFileTypes: true }, (er, entries) => {\n if (er) {\n this.#readdirFail((er as NodeJS.ErrnoException).code)\n children.provisional = 0\n } else {\n // if we didn't get an error, we always get entries.\n //@ts-ignore\n for (const e of entries) {\n this.#readdirAddChild(e, children)\n }\n this.#readdirSuccess(children)\n }\n this.#callOnReaddirCB(children.slice(0, children.provisional))\n return\n })\n }\n\n #asyncReaddirInFlight?: Promise\n\n /**\n * Return an array of known child entries.\n *\n * If the Path cannot or does not contain any children, then an empty array\n * is returned.\n *\n * Results are cached, and thus may be out of date if the filesystem is\n * mutated.\n */\n async readdir(): Promise {\n if (!this.canReaddir()) {\n return []\n }\n\n const children = this.children()\n if (this.calledReaddir()) {\n return children.slice(0, children.provisional)\n }\n\n // else read the directory, fill up children\n // de-provisionalize any provisional children.\n const fullpath = this.fullpath()\n if (this.#asyncReaddirInFlight) {\n await this.#asyncReaddirInFlight\n } else {\n /* c8 ignore start */\n let resolve: () => void = () => {}\n /* c8 ignore stop */\n this.#asyncReaddirInFlight = new Promise(\n res => (resolve = res),\n )\n try {\n for (const e of await this.#fs.promises.readdir(fullpath, {\n withFileTypes: true,\n })) {\n this.#readdirAddChild(e, children)\n }\n this.#readdirSuccess(children)\n } catch (er) {\n this.#readdirFail((er as NodeJS.ErrnoException).code)\n children.provisional = 0\n }\n this.#asyncReaddirInFlight = undefined\n resolve()\n }\n return children.slice(0, children.provisional)\n }\n\n /**\n * synchronous {@link PathBase.readdir}\n */\n readdirSync(): PathBase[] {\n if (!this.canReaddir()) {\n return []\n }\n\n const children = this.children()\n if (this.calledReaddir()) {\n return children.slice(0, children.provisional)\n }\n\n // else read the directory, fill up children\n // de-provisionalize any provisional children.\n const fullpath = this.fullpath()\n try {\n for (const e of this.#fs.readdirSync(fullpath, {\n withFileTypes: true,\n })) {\n this.#readdirAddChild(e, children)\n }\n this.#readdirSuccess(children)\n } catch (er) {\n this.#readdirFail((er as NodeJS.ErrnoException).code)\n children.provisional = 0\n }\n return children.slice(0, children.provisional)\n }\n\n canReaddir() {\n if (this.#type & ENOCHILD) return false\n const ifmt = IFMT & this.#type\n // we always set ENOTDIR when setting IFMT, so should be impossible\n /* c8 ignore start */\n if (!(ifmt === UNKNOWN || ifmt === IFDIR || ifmt === IFLNK)) {\n return false\n }\n /* c8 ignore stop */\n return true\n }\n\n shouldWalk(\n dirs: Set,\n walkFilter?: (e: PathBase) => boolean,\n ): boolean {\n return (\n (this.#type & IFDIR) === IFDIR &&\n !(this.#type & ENOCHILD) &&\n !dirs.has(this) &&\n (!walkFilter || walkFilter(this))\n )\n }\n\n /**\n * Return the Path object corresponding to path as resolved\n * by realpath(3).\n *\n * If the realpath call fails for any reason, `undefined` is returned.\n *\n * Result is cached, and thus may be outdated if the filesystem is mutated.\n * On success, returns a Path object.\n */\n async realpath(): Promise {\n if (this.#realpath) return this.#realpath\n if ((ENOREALPATH | ENOREADLINK | ENOENT) & this.#type) return undefined\n try {\n const rp = await this.#fs.promises.realpath(this.fullpath())\n return (this.#realpath = this.resolve(rp))\n } catch (_) {\n this.#markENOREALPATH()\n }\n }\n\n /**\n * Synchronous {@link realpath}\n */\n realpathSync(): PathBase | undefined {\n if (this.#realpath) return this.#realpath\n if ((ENOREALPATH | ENOREADLINK | ENOENT) & this.#type) return undefined\n try {\n const rp = this.#fs.realpathSync(this.fullpath())\n return (this.#realpath = this.resolve(rp))\n } catch (_) {\n this.#markENOREALPATH()\n }\n }\n\n /**\n * Internal method to mark this Path object as the scurry cwd,\n * called by {@link PathScurry#chdir}\n *\n * @internal\n */\n [setAsCwd](oldCwd: PathBase): void {\n if (oldCwd === this) return\n oldCwd.isCWD = false\n this.isCWD = true\n\n const changed = new Set([])\n let rp = []\n let p: PathBase = this\n while (p && p.parent) {\n changed.add(p)\n p.#relative = rp.join(this.sep)\n p.#relativePosix = rp.join('/')\n p = p.parent\n rp.push('..')\n }\n // now un-memoize parents of old cwd\n p = oldCwd\n while (p && p.parent && !changed.has(p)) {\n p.#relative = undefined\n p.#relativePosix = undefined\n p = p.parent\n }\n }\n}\n\n/**\n * Path class used on win32 systems\n *\n * Uses `'\\\\'` as the path separator for returned paths, either `'\\\\'` or `'/'`\n * as the path separator for parsing paths.\n */\nexport class PathWin32 extends PathBase {\n /**\n * Separator for generating path strings.\n */\n sep: '\\\\' = '\\\\'\n /**\n * Separator for parsing path strings.\n */\n splitSep: RegExp = eitherSep\n\n /**\n * Do not create new Path objects directly. They should always be accessed\n * via the PathScurry class or other methods on the Path class.\n *\n * @internal\n */\n constructor(\n name: string,\n type: number = UNKNOWN,\n root: PathBase | undefined,\n roots: { [k: string]: PathBase },\n nocase: boolean,\n children: ChildrenCache,\n opts: PathOpts,\n ) {\n super(name, type, root, roots, nocase, children, opts)\n }\n\n /**\n * @internal\n */\n newChild(name: string, type: number = UNKNOWN, opts: PathOpts = {}) {\n return new PathWin32(\n name,\n type,\n this.root,\n this.roots,\n this.nocase,\n this.childrenCache(),\n opts,\n )\n }\n\n /**\n * @internal\n */\n getRootString(path: string): string {\n return win32.parse(path).root\n }\n\n /**\n * @internal\n */\n getRoot(rootPath: string): PathBase {\n rootPath = uncToDrive(rootPath.toUpperCase())\n if (rootPath === this.root.name) {\n return this.root\n }\n // ok, not that one, check if it matches another we know about\n for (const [compare, root] of Object.entries(this.roots)) {\n if (this.sameRoot(rootPath, compare)) {\n return (this.roots[rootPath] = root)\n }\n }\n // otherwise, have to create a new one.\n return (this.roots[rootPath] = new PathScurryWin32(\n rootPath,\n this,\n ).root)\n }\n\n /**\n * @internal\n */\n sameRoot(rootPath: string, compare: string = this.root.name): boolean {\n // windows can (rarely) have case-sensitive filesystem, but\n // UNC and drive letters are always case-insensitive, and canonically\n // represented uppercase.\n rootPath = rootPath\n .toUpperCase()\n .replace(/\\//g, '\\\\')\n .replace(uncDriveRegexp, '$1\\\\')\n return rootPath === compare\n }\n}\n\n/**\n * Path class used on all posix systems.\n *\n * Uses `'/'` as the path separator.\n */\nexport class PathPosix extends PathBase {\n /**\n * separator for parsing path strings\n */\n splitSep: '/' = '/'\n /**\n * separator for generating path strings\n */\n sep: '/' = '/'\n\n /**\n * Do not create new Path objects directly. They should always be accessed\n * via the PathScurry class or other methods on the Path class.\n *\n * @internal\n */\n constructor(\n name: string,\n type: number = UNKNOWN,\n root: PathBase | undefined,\n roots: { [k: string]: PathBase },\n nocase: boolean,\n children: ChildrenCache,\n opts: PathOpts,\n ) {\n super(name, type, root, roots, nocase, children, opts)\n }\n\n /**\n * @internal\n */\n getRootString(path: string): string {\n return path.startsWith('/') ? '/' : ''\n }\n\n /**\n * @internal\n */\n getRoot(_rootPath: string): PathBase {\n return this.root\n }\n\n /**\n * @internal\n */\n newChild(name: string, type: number = UNKNOWN, opts: PathOpts = {}) {\n return new PathPosix(\n name,\n type,\n this.root,\n this.roots,\n this.nocase,\n this.childrenCache(),\n opts,\n )\n }\n}\n\n/**\n * Options that may be provided to the PathScurry constructor\n */\nexport interface PathScurryOpts {\n /**\n * perform case-insensitive path matching. Default based on platform\n * subclass.\n */\n nocase?: boolean\n /**\n * Number of Path entries to keep in the cache of Path child references.\n *\n * Setting this higher than 65536 will dramatically increase the data\n * consumption and construction time overhead of each PathScurry.\n *\n * Setting this value to 256 or lower will significantly reduce the data\n * consumption and construction time overhead, but may also reduce resolve()\n * and readdir() performance on large filesystems.\n *\n * Default `16384`.\n */\n childrenCacheSize?: number\n /**\n * An object that overrides the built-in functions from the fs and\n * fs/promises modules.\n *\n * See {@link FSOption}\n */\n fs?: FSOption\n}\n\n/**\n * The base class for all PathScurry classes, providing the interface for path\n * resolution and filesystem operations.\n *\n * Typically, you should *not* instantiate this class directly, but rather one\n * of the platform-specific classes, or the exported {@link PathScurry} which\n * defaults to the current platform.\n */\nexport abstract class PathScurryBase {\n /**\n * The root Path entry for the current working directory of this Scurry\n */\n root: PathBase\n /**\n * The string path for the root of this Scurry's current working directory\n */\n rootPath: string\n /**\n * A collection of all roots encountered, referenced by rootPath\n */\n roots: { [k: string]: PathBase }\n /**\n * The Path entry corresponding to this PathScurry's current working directory.\n */\n cwd: PathBase\n #resolveCache: ResolveCache\n #resolvePosixCache: ResolveCache\n #children: ChildrenCache\n /**\n * Perform path comparisons case-insensitively.\n *\n * Defaults true on Darwin and Windows systems, false elsewhere.\n */\n nocase: boolean\n\n /**\n * The path separator used for parsing paths\n *\n * `'/'` on Posix systems, either `'/'` or `'\\\\'` on Windows\n */\n abstract sep: string | RegExp\n\n #fs: FSValue\n\n /**\n * This class should not be instantiated directly.\n *\n * Use PathScurryWin32, PathScurryDarwin, PathScurryPosix, or PathScurry\n *\n * @internal\n */\n constructor(\n cwd: URL | string = process.cwd(),\n pathImpl: typeof win32 | typeof posix,\n sep: string | RegExp,\n {\n nocase,\n childrenCacheSize = 16 * 1024,\n fs = defaultFS,\n }: PathScurryOpts = {},\n ) {\n this.#fs = fsFromOption(fs)\n if (cwd instanceof URL || cwd.startsWith('file://')) {\n cwd = fileURLToPath(cwd)\n }\n // resolve and split root, and then add to the store.\n // this is the only time we call path.resolve()\n const cwdPath = pathImpl.resolve(cwd)\n this.roots = Object.create(null)\n this.rootPath = this.parseRootPath(cwdPath)\n this.#resolveCache = new ResolveCache()\n this.#resolvePosixCache = new ResolveCache()\n this.#children = new ChildrenCache(childrenCacheSize)\n\n const split = cwdPath.substring(this.rootPath.length).split(sep)\n // resolve('/') leaves '', splits to [''], we don't want that.\n if (split.length === 1 && !split[0]) {\n split.pop()\n }\n /* c8 ignore start */\n if (nocase === undefined) {\n throw new TypeError(\n 'must provide nocase setting to PathScurryBase ctor',\n )\n }\n /* c8 ignore stop */\n this.nocase = nocase\n this.root = this.newRoot(this.#fs)\n this.roots[this.rootPath] = this.root\n let prev: PathBase = this.root\n let len = split.length - 1\n const joinSep = pathImpl.sep\n let abs = this.rootPath\n let sawFirst = false\n for (const part of split) {\n const l = len--\n prev = prev.child(part, {\n relative: new Array(l).fill('..').join(joinSep),\n relativePosix: new Array(l).fill('..').join('/'),\n fullpath: (abs += (sawFirst ? '' : joinSep) + part),\n })\n sawFirst = true\n }\n this.cwd = prev\n }\n\n /**\n * Get the depth of a provided path, string, or the cwd\n */\n depth(path: Path | string = this.cwd): number {\n if (typeof path === 'string') {\n path = this.cwd.resolve(path)\n }\n return path.depth()\n }\n\n /**\n * Parse the root portion of a path string\n *\n * @internal\n */\n abstract parseRootPath(dir: string): string\n /**\n * create a new Path to use as root during construction.\n *\n * @internal\n */\n abstract newRoot(fs: FSValue): PathBase\n /**\n * Determine whether a given path string is absolute\n */\n abstract isAbsolute(p: string): boolean\n\n /**\n * Return the cache of child entries. Exposed so subclasses can create\n * child Path objects in a platform-specific way.\n *\n * @internal\n */\n childrenCache() {\n return this.#children\n }\n\n /**\n * Resolve one or more path strings to a resolved string\n *\n * Same interface as require('path').resolve.\n *\n * Much faster than path.resolve() when called multiple times for the same\n * path, because the resolved Path objects are cached. Much slower\n * otherwise.\n */\n resolve(...paths: string[]): string {\n // first figure out the minimum number of paths we have to test\n // we always start at cwd, but any absolutes will bump the start\n let r = ''\n for (let i = paths.length - 1; i >= 0; i--) {\n const p = paths[i]\n if (!p || p === '.') continue\n r = r ? `${p}/${r}` : p\n if (this.isAbsolute(p)) {\n break\n }\n }\n const cached = this.#resolveCache.get(r)\n if (cached !== undefined) {\n return cached\n }\n const result = this.cwd.resolve(r).fullpath()\n this.#resolveCache.set(r, result)\n return result\n }\n\n /**\n * Resolve one or more path strings to a resolved string, returning\n * the posix path. Identical to .resolve() on posix systems, but on\n * windows will return a forward-slash separated UNC path.\n *\n * Same interface as require('path').resolve.\n *\n * Much faster than path.resolve() when called multiple times for the same\n * path, because the resolved Path objects are cached. Much slower\n * otherwise.\n */\n resolvePosix(...paths: string[]): string {\n // first figure out the minimum number of paths we have to test\n // we always start at cwd, but any absolutes will bump the start\n let r = ''\n for (let i = paths.length - 1; i >= 0; i--) {\n const p = paths[i]\n if (!p || p === '.') continue\n r = r ? `${p}/${r}` : p\n if (this.isAbsolute(p)) {\n break\n }\n }\n const cached = this.#resolvePosixCache.get(r)\n if (cached !== undefined) {\n return cached\n }\n const result = this.cwd.resolve(r).fullpathPosix()\n this.#resolvePosixCache.set(r, result)\n return result\n }\n\n /**\n * find the relative path from the cwd to the supplied path string or entry\n */\n relative(entry: PathBase | string = this.cwd): string {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n }\n return entry.relative()\n }\n\n /**\n * find the relative path from the cwd to the supplied path string or\n * entry, using / as the path delimiter, even on Windows.\n */\n relativePosix(entry: PathBase | string = this.cwd): string {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n }\n return entry.relativePosix()\n }\n\n /**\n * Return the basename for the provided string or Path object\n */\n basename(entry: PathBase | string = this.cwd): string {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n }\n return entry.name\n }\n\n /**\n * Return the dirname for the provided string or Path object\n */\n dirname(entry: PathBase | string = this.cwd): string {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n }\n return (entry.parent || entry).fullpath()\n }\n\n /**\n * Return an array of known child entries.\n *\n * First argument may be either a string, or a Path object.\n *\n * If the Path cannot or does not contain any children, then an empty array\n * is returned.\n *\n * Results are cached, and thus may be out of date if the filesystem is\n * mutated.\n *\n * Unlike `fs.readdir()`, the `withFileTypes` option defaults to `true`. Set\n * `{ withFileTypes: false }` to return strings.\n */\n\n readdir(): Promise\n readdir(opts: { withFileTypes: true }): Promise\n readdir(opts: { withFileTypes: false }): Promise\n readdir(opts: { withFileTypes: boolean }): Promise\n readdir(entry: PathBase | string): Promise\n readdir(\n entry: PathBase | string,\n opts: { withFileTypes: true },\n ): Promise\n readdir(\n entry: PathBase | string,\n opts: { withFileTypes: false },\n ): Promise\n readdir(\n entry: PathBase | string,\n opts: { withFileTypes: boolean },\n ): Promise\n async readdir(\n entry: PathBase | string | { withFileTypes: boolean } = this.cwd,\n opts: { withFileTypes: boolean } = {\n withFileTypes: true,\n },\n ): Promise {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n } else if (!(entry instanceof PathBase)) {\n opts = entry\n entry = this.cwd\n }\n const { withFileTypes } = opts\n if (!entry.canReaddir()) {\n return []\n } else {\n const p = await entry.readdir()\n return withFileTypes ? p : p.map(e => e.name)\n }\n }\n\n /**\n * synchronous {@link PathScurryBase.readdir}\n */\n readdirSync(): PathBase[]\n readdirSync(opts: { withFileTypes: true }): PathBase[]\n readdirSync(opts: { withFileTypes: false }): string[]\n readdirSync(opts: { withFileTypes: boolean }): PathBase[] | string[]\n readdirSync(entry: PathBase | string): PathBase[]\n readdirSync(\n entry: PathBase | string,\n opts: { withFileTypes: true },\n ): PathBase[]\n readdirSync(\n entry: PathBase | string,\n opts: { withFileTypes: false },\n ): string[]\n readdirSync(\n entry: PathBase | string,\n opts: { withFileTypes: boolean },\n ): PathBase[] | string[]\n readdirSync(\n entry: PathBase | string | { withFileTypes: boolean } = this.cwd,\n opts: { withFileTypes: boolean } = {\n withFileTypes: true,\n },\n ): PathBase[] | string[] {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n } else if (!(entry instanceof PathBase)) {\n opts = entry\n entry = this.cwd\n }\n const { withFileTypes = true } = opts\n if (!entry.canReaddir()) {\n return []\n } else if (withFileTypes) {\n return entry.readdirSync()\n } else {\n return entry.readdirSync().map(e => e.name)\n }\n }\n\n /**\n * Call lstat() on the string or Path object, and update all known\n * information that can be determined.\n *\n * Note that unlike `fs.lstat()`, the returned value does not contain some\n * information, such as `mode`, `dev`, `nlink`, and `ino`. If that\n * information is required, you will need to call `fs.lstat` yourself.\n *\n * If the Path refers to a nonexistent file, or if the lstat call fails for\n * any reason, `undefined` is returned. Otherwise the updated Path object is\n * returned.\n *\n * Results are cached, and thus may be out of date if the filesystem is\n * mutated.\n */\n async lstat(\n entry: string | PathBase = this.cwd,\n ): Promise {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n }\n return entry.lstat()\n }\n\n /**\n * synchronous {@link PathScurryBase.lstat}\n */\n lstatSync(entry: string | PathBase = this.cwd): PathBase | undefined {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n }\n return entry.lstatSync()\n }\n\n /**\n * Return the Path object or string path corresponding to the target of a\n * symbolic link.\n *\n * If the path is not a symbolic link, or if the readlink call fails for any\n * reason, `undefined` is returned.\n *\n * Result is cached, and thus may be outdated if the filesystem is mutated.\n *\n * `{withFileTypes}` option defaults to `false`.\n *\n * On success, returns a Path object if `withFileTypes` option is true,\n * otherwise a string.\n */\n readlink(): Promise\n readlink(opt: { withFileTypes: false }): Promise\n readlink(opt: { withFileTypes: true }): Promise\n readlink(opt: {\n withFileTypes: boolean\n }): Promise\n readlink(\n entry: string | PathBase,\n opt?: { withFileTypes: false },\n ): Promise\n readlink(\n entry: string | PathBase,\n opt: { withFileTypes: true },\n ): Promise\n readlink(\n entry: string | PathBase,\n opt: { withFileTypes: boolean },\n ): Promise\n async readlink(\n entry: string | PathBase | { withFileTypes: boolean } = this.cwd,\n { withFileTypes }: { withFileTypes: boolean } = {\n withFileTypes: false,\n },\n ): Promise {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n } else if (!(entry instanceof PathBase)) {\n withFileTypes = entry.withFileTypes\n entry = this.cwd\n }\n const e = await entry.readlink()\n return withFileTypes ? e : e?.fullpath()\n }\n\n /**\n * synchronous {@link PathScurryBase.readlink}\n */\n readlinkSync(): string | undefined\n readlinkSync(opt: { withFileTypes: false }): string | undefined\n readlinkSync(opt: { withFileTypes: true }): PathBase | undefined\n readlinkSync(opt: {\n withFileTypes: boolean\n }): PathBase | string | undefined\n readlinkSync(\n entry: string | PathBase,\n opt?: { withFileTypes: false },\n ): string | undefined\n readlinkSync(\n entry: string | PathBase,\n opt: { withFileTypes: true },\n ): PathBase | undefined\n readlinkSync(\n entry: string | PathBase,\n opt: { withFileTypes: boolean },\n ): string | PathBase | undefined\n readlinkSync(\n entry: string | PathBase | { withFileTypes: boolean } = this.cwd,\n { withFileTypes }: { withFileTypes: boolean } = {\n withFileTypes: false,\n },\n ): string | PathBase | undefined {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n } else if (!(entry instanceof PathBase)) {\n withFileTypes = entry.withFileTypes\n entry = this.cwd\n }\n const e = entry.readlinkSync()\n return withFileTypes ? e : e?.fullpath()\n }\n\n /**\n * Return the Path object or string path corresponding to path as resolved\n * by realpath(3).\n *\n * If the realpath call fails for any reason, `undefined` is returned.\n *\n * Result is cached, and thus may be outdated if the filesystem is mutated.\n *\n * `{withFileTypes}` option defaults to `false`.\n *\n * On success, returns a Path object if `withFileTypes` option is true,\n * otherwise a string.\n */\n realpath(): Promise\n realpath(opt: { withFileTypes: false }): Promise\n realpath(opt: { withFileTypes: true }): Promise\n realpath(opt: {\n withFileTypes: boolean\n }): Promise\n realpath(\n entry: string | PathBase,\n opt?: { withFileTypes: false },\n ): Promise\n realpath(\n entry: string | PathBase,\n opt: { withFileTypes: true },\n ): Promise\n realpath(\n entry: string | PathBase,\n opt: { withFileTypes: boolean },\n ): Promise\n async realpath(\n entry: string | PathBase | { withFileTypes: boolean } = this.cwd,\n { withFileTypes }: { withFileTypes: boolean } = {\n withFileTypes: false,\n },\n ): Promise {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n } else if (!(entry instanceof PathBase)) {\n withFileTypes = entry.withFileTypes\n entry = this.cwd\n }\n const e = await entry.realpath()\n return withFileTypes ? e : e?.fullpath()\n }\n\n realpathSync(): string | undefined\n realpathSync(opt: { withFileTypes: false }): string | undefined\n realpathSync(opt: { withFileTypes: true }): PathBase | undefined\n realpathSync(opt: {\n withFileTypes: boolean\n }): PathBase | string | undefined\n realpathSync(\n entry: string | PathBase,\n opt?: { withFileTypes: false },\n ): string | undefined\n realpathSync(\n entry: string | PathBase,\n opt: { withFileTypes: true },\n ): PathBase | undefined\n realpathSync(\n entry: string | PathBase,\n opt: { withFileTypes: boolean },\n ): string | PathBase | undefined\n realpathSync(\n entry: string | PathBase | { withFileTypes: boolean } = this.cwd,\n { withFileTypes }: { withFileTypes: boolean } = {\n withFileTypes: false,\n },\n ): string | PathBase | undefined {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n } else if (!(entry instanceof PathBase)) {\n withFileTypes = entry.withFileTypes\n entry = this.cwd\n }\n const e = entry.realpathSync()\n return withFileTypes ? e : e?.fullpath()\n }\n\n /**\n * Asynchronously walk the directory tree, returning an array of\n * all path strings or Path objects found.\n *\n * Note that this will be extremely memory-hungry on large filesystems.\n * In such cases, it may be better to use the stream or async iterator\n * walk implementation.\n */\n walk(): Promise\n walk(\n opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n ): Promise\n walk(opts: WalkOptionsWithFileTypesFalse): Promise\n walk(opts: WalkOptions): Promise\n walk(entry: string | PathBase): Promise\n walk(\n entry: string | PathBase,\n opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n ): Promise\n walk(\n entry: string | PathBase,\n opts: WalkOptionsWithFileTypesFalse,\n ): Promise\n walk(\n entry: string | PathBase,\n opts: WalkOptions,\n ): Promise\n async walk(\n entry: string | PathBase | WalkOptions = this.cwd,\n opts: WalkOptions = {},\n ): Promise {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n } else if (!(entry instanceof PathBase)) {\n opts = entry\n entry = this.cwd\n }\n const {\n withFileTypes = true,\n follow = false,\n filter,\n walkFilter,\n } = opts\n const results: (string | PathBase)[] = []\n if (!filter || filter(entry)) {\n results.push(withFileTypes ? entry : entry.fullpath())\n }\n const dirs = new Set()\n const walk = (\n dir: PathBase,\n cb: (er?: NodeJS.ErrnoException) => void,\n ) => {\n dirs.add(dir)\n dir.readdirCB((er, entries) => {\n /* c8 ignore start */\n if (er) {\n return cb(er)\n }\n /* c8 ignore stop */\n let len = entries.length\n if (!len) return cb()\n const next = () => {\n if (--len === 0) {\n cb()\n }\n }\n for (const e of entries) {\n if (!filter || filter(e)) {\n results.push(withFileTypes ? e : e.fullpath())\n }\n if (follow && e.isSymbolicLink()) {\n e.realpath()\n .then(r => (r?.isUnknown() ? r.lstat() : r))\n .then(r =>\n r?.shouldWalk(dirs, walkFilter) ? walk(r, next) : next(),\n )\n } else {\n if (e.shouldWalk(dirs, walkFilter)) {\n walk(e, next)\n } else {\n next()\n }\n }\n }\n }, true) // zalgooooooo\n }\n\n const start = entry\n return new Promise((res, rej) => {\n walk(start, er => {\n /* c8 ignore start */\n if (er) return rej(er)\n /* c8 ignore stop */\n res(results as PathBase[] | string[])\n })\n })\n }\n\n /**\n * Synchronously walk the directory tree, returning an array of\n * all path strings or Path objects found.\n *\n * Note that this will be extremely memory-hungry on large filesystems.\n * In such cases, it may be better to use the stream or async iterator\n * walk implementation.\n */\n walkSync(): PathBase[]\n walkSync(\n opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n ): PathBase[]\n walkSync(opts: WalkOptionsWithFileTypesFalse): string[]\n walkSync(opts: WalkOptions): string[] | PathBase[]\n walkSync(entry: string | PathBase): PathBase[]\n walkSync(\n entry: string | PathBase,\n opts: WalkOptionsWithFileTypesUnset | WalkOptionsWithFileTypesTrue,\n ): PathBase[]\n walkSync(\n entry: string | PathBase,\n opts: WalkOptionsWithFileTypesFalse,\n ): string[]\n walkSync(\n entry: string | PathBase,\n opts: WalkOptions,\n ): PathBase[] | string[]\n walkSync(\n entry: string | PathBase | WalkOptions = this.cwd,\n opts: WalkOptions = {},\n ): PathBase[] | string[] {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n } else if (!(entry instanceof PathBase)) {\n opts = entry\n entry = this.cwd\n }\n const {\n withFileTypes = true,\n follow = false,\n filter,\n walkFilter,\n } = opts\n const results: (string | PathBase)[] = []\n if (!filter || filter(entry)) {\n results.push(withFileTypes ? entry : entry.fullpath())\n }\n const dirs = new Set([entry])\n for (const dir of dirs) {\n const entries = dir.readdirSync()\n for (const e of entries) {\n if (!filter || filter(e)) {\n results.push(withFileTypes ? e : e.fullpath())\n }\n let r: PathBase | undefined = e\n if (e.isSymbolicLink()) {\n if (!(follow && (r = e.realpathSync()))) continue\n if (r.isUnknown()) r.lstatSync()\n }\n if (r.shouldWalk(dirs, walkFilter)) {\n dirs.add(r)\n }\n }\n }\n return results as string[] | PathBase[]\n }\n\n /**\n * Support for `for await`\n *\n * Alias for {@link PathScurryBase.iterate}\n *\n * Note: As of Node 19, this is very slow, compared to other methods of\n * walking. Consider using {@link PathScurryBase.stream} if memory overhead\n * and backpressure are concerns, or {@link PathScurryBase.walk} if not.\n */\n [Symbol.asyncIterator]() {\n return this.iterate()\n }\n\n /**\n * Async generator form of {@link PathScurryBase.walk}\n *\n * Note: As of Node 19, this is very slow, compared to other methods of\n * walking, especially if most/all of the directory tree has been previously\n * walked. Consider using {@link PathScurryBase.stream} if memory overhead\n * and backpressure are concerns, or {@link PathScurryBase.walk} if not.\n */\n iterate(): AsyncGenerator\n iterate(\n opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n ): AsyncGenerator\n iterate(\n opts: WalkOptionsWithFileTypesFalse,\n ): AsyncGenerator\n iterate(opts: WalkOptions): AsyncGenerator\n iterate(entry: string | PathBase): AsyncGenerator\n iterate(\n entry: string | PathBase,\n opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n ): AsyncGenerator\n iterate(\n entry: string | PathBase,\n opts: WalkOptionsWithFileTypesFalse,\n ): AsyncGenerator\n iterate(\n entry: string | PathBase,\n opts: WalkOptions,\n ): AsyncGenerator\n iterate(\n entry: string | PathBase | WalkOptions = this.cwd,\n options: WalkOptions = {},\n ): AsyncGenerator {\n // iterating async over the stream is significantly more performant,\n // especially in the warm-cache scenario, because it buffers up directory\n // entries in the background instead of waiting for a yield for each one.\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n } else if (!(entry instanceof PathBase)) {\n options = entry\n entry = this.cwd\n }\n return this.stream(entry, options)[Symbol.asyncIterator]()\n }\n\n /**\n * Iterating over a PathScurry performs a synchronous walk.\n *\n * Alias for {@link PathScurryBase.iterateSync}\n */\n [Symbol.iterator]() {\n return this.iterateSync()\n }\n\n iterateSync(): Generator\n iterateSync(\n opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n ): Generator\n iterateSync(\n opts: WalkOptionsWithFileTypesFalse,\n ): Generator\n iterateSync(opts: WalkOptions): Generator\n iterateSync(entry: string | PathBase): Generator\n iterateSync(\n entry: string | PathBase,\n opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n ): Generator\n iterateSync(\n entry: string | PathBase,\n opts: WalkOptionsWithFileTypesFalse,\n ): Generator\n iterateSync(\n entry: string | PathBase,\n opts: WalkOptions,\n ): Generator\n *iterateSync(\n entry: string | PathBase | WalkOptions = this.cwd,\n opts: WalkOptions = {},\n ): Generator {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n } else if (!(entry instanceof PathBase)) {\n opts = entry\n entry = this.cwd\n }\n const {\n withFileTypes = true,\n follow = false,\n filter,\n walkFilter,\n } = opts\n if (!filter || filter(entry)) {\n yield withFileTypes ? entry : entry.fullpath()\n }\n const dirs = new Set([entry])\n for (const dir of dirs) {\n const entries = dir.readdirSync()\n for (const e of entries) {\n if (!filter || filter(e)) {\n yield withFileTypes ? e : e.fullpath()\n }\n let r: PathBase | undefined = e\n if (e.isSymbolicLink()) {\n if (!(follow && (r = e.realpathSync()))) continue\n if (r.isUnknown()) r.lstatSync()\n }\n if (r.shouldWalk(dirs, walkFilter)) {\n dirs.add(r)\n }\n }\n }\n }\n\n /**\n * Stream form of {@link PathScurryBase.walk}\n *\n * Returns a Minipass stream that emits {@link PathBase} objects by default,\n * or strings if `{ withFileTypes: false }` is set in the options.\n */\n stream(): Minipass\n stream(\n opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n ): Minipass\n stream(opts: WalkOptionsWithFileTypesFalse): Minipass\n stream(opts: WalkOptions): Minipass\n stream(entry: string | PathBase): Minipass\n stream(\n entry: string | PathBase,\n opts: WalkOptionsWithFileTypesUnset | WalkOptionsWithFileTypesTrue,\n ): Minipass\n stream(\n entry: string | PathBase,\n opts: WalkOptionsWithFileTypesFalse,\n ): Minipass\n stream(\n entry: string | PathBase,\n opts: WalkOptions,\n ): Minipass | Minipass\n stream(\n entry: string | PathBase | WalkOptions = this.cwd,\n opts: WalkOptions = {},\n ): Minipass | Minipass {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n } else if (!(entry instanceof PathBase)) {\n opts = entry\n entry = this.cwd\n }\n const {\n withFileTypes = true,\n follow = false,\n filter,\n walkFilter,\n } = opts\n const results = new Minipass({ objectMode: true })\n if (!filter || filter(entry)) {\n results.write(withFileTypes ? entry : entry.fullpath())\n }\n const dirs = new Set()\n const queue: PathBase[] = [entry]\n let processing = 0\n const process = () => {\n let paused = false\n while (!paused) {\n const dir = queue.shift()\n if (!dir) {\n if (processing === 0) results.end()\n return\n }\n\n processing++\n dirs.add(dir)\n\n const onReaddir = (\n er: null | NodeJS.ErrnoException,\n entries: PathBase[],\n didRealpaths: boolean = false,\n ) => {\n /* c8 ignore start */\n if (er) return results.emit('error', er)\n /* c8 ignore stop */\n if (follow && !didRealpaths) {\n const promises: Promise[] = []\n for (const e of entries) {\n if (e.isSymbolicLink()) {\n promises.push(\n e\n .realpath()\n .then((r: PathBase | undefined) =>\n r?.isUnknown() ? r.lstat() : r,\n ),\n )\n }\n }\n if (promises.length) {\n Promise.all(promises).then(() =>\n onReaddir(null, entries, true),\n )\n return\n }\n }\n\n for (const e of entries) {\n if (e && (!filter || filter(e))) {\n if (!results.write(withFileTypes ? e : e.fullpath())) {\n paused = true\n }\n }\n }\n\n processing--\n for (const e of entries) {\n const r = e.realpathCached() || e\n if (r.shouldWalk(dirs, walkFilter)) {\n queue.push(r)\n }\n }\n if (paused && !results.flowing) {\n results.once('drain', process)\n } else if (!sync) {\n process()\n }\n }\n\n // zalgo containment\n let sync = true\n dir.readdirCB(onReaddir, true)\n sync = false\n }\n }\n process()\n return results as Minipass | Minipass\n }\n\n /**\n * Synchronous form of {@link PathScurryBase.stream}\n *\n * Returns a Minipass stream that emits {@link PathBase} objects by default,\n * or strings if `{ withFileTypes: false }` is set in the options.\n *\n * Will complete the walk in a single tick if the stream is consumed fully.\n * Otherwise, will pause as needed for stream backpressure.\n */\n streamSync(): Minipass\n streamSync(\n opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n ): Minipass\n streamSync(opts: WalkOptionsWithFileTypesFalse): Minipass\n streamSync(opts: WalkOptions): Minipass\n streamSync(entry: string | PathBase): Minipass\n streamSync(\n entry: string | PathBase,\n opts: WalkOptionsWithFileTypesUnset | WalkOptionsWithFileTypesTrue,\n ): Minipass\n streamSync(\n entry: string | PathBase,\n opts: WalkOptionsWithFileTypesFalse,\n ): Minipass\n streamSync(\n entry: string | PathBase,\n opts: WalkOptions,\n ): Minipass | Minipass\n streamSync(\n entry: string | PathBase | WalkOptions = this.cwd,\n opts: WalkOptions = {},\n ): Minipass | Minipass {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n } else if (!(entry instanceof PathBase)) {\n opts = entry\n entry = this.cwd\n }\n const {\n withFileTypes = true,\n follow = false,\n filter,\n walkFilter,\n } = opts\n const results = new Minipass({ objectMode: true })\n const dirs = new Set()\n if (!filter || filter(entry)) {\n results.write(withFileTypes ? entry : entry.fullpath())\n }\n const queue: PathBase[] = [entry]\n let processing = 0\n const process = () => {\n let paused = false\n while (!paused) {\n const dir = queue.shift()\n if (!dir) {\n if (processing === 0) results.end()\n return\n }\n processing++\n dirs.add(dir)\n\n const entries = dir.readdirSync()\n for (const e of entries) {\n if (!filter || filter(e)) {\n if (!results.write(withFileTypes ? e : e.fullpath())) {\n paused = true\n }\n }\n }\n processing--\n for (const e of entries) {\n let r: PathBase | undefined = e\n if (e.isSymbolicLink()) {\n if (!(follow && (r = e.realpathSync()))) continue\n if (r.isUnknown()) r.lstatSync()\n }\n if (r.shouldWalk(dirs, walkFilter)) {\n queue.push(r)\n }\n }\n }\n if (paused && !results.flowing) results.once('drain', process)\n }\n process()\n return results as Minipass | Minipass\n }\n\n chdir(path: string | Path = this.cwd) {\n const oldCwd = this.cwd\n this.cwd = typeof path === 'string' ? this.cwd.resolve(path) : path\n this.cwd[setAsCwd](oldCwd)\n }\n}\n\n/**\n * Options provided to all walk methods.\n */\nexport interface WalkOptions {\n /**\n * Return results as {@link PathBase} objects rather than strings.\n * When set to false, results are fully resolved paths, as returned by\n * {@link PathBase.fullpath}.\n * @default true\n */\n withFileTypes?: boolean\n\n /**\n * Attempt to read directory entries from symbolic links. Otherwise, only\n * actual directories are traversed. Regardless of this setting, a given\n * target path will only ever be walked once, meaning that a symbolic link\n * to a previously traversed directory will never be followed.\n *\n * Setting this imposes a slight performance penalty, because `readlink`\n * must be called on all symbolic links encountered, in order to avoid\n * infinite cycles.\n * @default false\n */\n follow?: boolean\n\n /**\n * Only return entries where the provided function returns true.\n *\n * This will not prevent directories from being traversed, even if they do\n * not pass the filter, though it will prevent directories themselves from\n * being included in the result set. See {@link walkFilter}\n *\n * Asynchronous functions are not supported here.\n *\n * By default, if no filter is provided, all entries and traversed\n * directories are included.\n */\n filter?: (entry: PathBase) => boolean\n\n /**\n * Only traverse directories (and in the case of {@link follow} being set to\n * true, symbolic links to directories) if the provided function returns\n * true.\n *\n * This will not prevent directories from being included in the result set,\n * even if they do not pass the supplied filter function. See {@link filter}\n * to do that.\n *\n * Asynchronous functions are not supported here.\n */\n walkFilter?: (entry: PathBase) => boolean\n}\n\nexport type WalkOptionsWithFileTypesUnset = WalkOptions & {\n withFileTypes?: undefined\n}\nexport type WalkOptionsWithFileTypesTrue = WalkOptions & {\n withFileTypes: true\n}\nexport type WalkOptionsWithFileTypesFalse = WalkOptions & {\n withFileTypes: false\n}\n\n/**\n * Windows implementation of {@link PathScurryBase}\n *\n * Defaults to case insensitve, uses `'\\\\'` to generate path strings. Uses\n * {@link PathWin32} for Path objects.\n */\nexport class PathScurryWin32 extends PathScurryBase {\n /**\n * separator for generating path strings\n */\n sep: '\\\\' = '\\\\'\n\n constructor(\n cwd: URL | string = process.cwd(),\n opts: PathScurryOpts = {},\n ) {\n const { nocase = true } = opts\n super(cwd, win32, '\\\\', { ...opts, nocase })\n this.nocase = nocase\n for (let p: PathBase | undefined = this.cwd; p; p = p.parent) {\n p.nocase = this.nocase\n }\n }\n\n /**\n * @internal\n */\n parseRootPath(dir: string): string {\n // if the path starts with a single separator, it's not a UNC, and we'll\n // just get separator as the root, and driveFromUNC will return \\\n // In that case, mount \\ on the root from the cwd.\n return win32.parse(dir).root.toUpperCase()\n }\n\n /**\n * @internal\n */\n newRoot(fs: FSValue) {\n return new PathWin32(\n this.rootPath,\n IFDIR,\n undefined,\n this.roots,\n this.nocase,\n this.childrenCache(),\n { fs },\n )\n }\n\n /**\n * Return true if the provided path string is an absolute path\n */\n isAbsolute(p: string): boolean {\n return (\n p.startsWith('/') || p.startsWith('\\\\') || /^[a-z]:(\\/|\\\\)/i.test(p)\n )\n }\n}\n\n/**\n * {@link PathScurryBase} implementation for all posix systems other than Darwin.\n *\n * Defaults to case-sensitive matching, uses `'/'` to generate path strings.\n *\n * Uses {@link PathPosix} for Path objects.\n */\nexport class PathScurryPosix extends PathScurryBase {\n /**\n * separator for generating path strings\n */\n sep: '/' = '/'\n constructor(\n cwd: URL | string = process.cwd(),\n opts: PathScurryOpts = {},\n ) {\n const { nocase = false } = opts\n super(cwd, posix, '/', { ...opts, nocase })\n this.nocase = nocase\n }\n\n /**\n * @internal\n */\n parseRootPath(_dir: string): string {\n return '/'\n }\n\n /**\n * @internal\n */\n newRoot(fs: FSValue) {\n return new PathPosix(\n this.rootPath,\n IFDIR,\n undefined,\n this.roots,\n this.nocase,\n this.childrenCache(),\n { fs },\n )\n }\n\n /**\n * Return true if the provided path string is an absolute path\n */\n isAbsolute(p: string): boolean {\n return p.startsWith('/')\n }\n}\n\n/**\n * {@link PathScurryBase} implementation for Darwin (macOS) systems.\n *\n * Defaults to case-insensitive matching, uses `'/'` for generating path\n * strings.\n *\n * Uses {@link PathPosix} for Path objects.\n */\nexport class PathScurryDarwin extends PathScurryPosix {\n constructor(\n cwd: URL | string = process.cwd(),\n opts: PathScurryOpts = {},\n ) {\n const { nocase = true } = opts\n super(cwd, { ...opts, nocase })\n }\n}\n\n/**\n * Default {@link PathBase} implementation for the current platform.\n *\n * {@link PathWin32} on Windows systems, {@link PathPosix} on all others.\n */\nexport const Path = process.platform === 'win32' ? PathWin32 : PathPosix\nexport type Path = PathBase | InstanceType\n\n/**\n * Default {@link PathScurryBase} implementation for the current platform.\n *\n * {@link PathScurryWin32} on Windows systems, {@link PathScurryDarwin} on\n * Darwin (macOS) systems, {@link PathScurryPosix} on all others.\n */\nexport const PathScurry:\n | typeof PathScurryWin32\n | typeof PathScurryDarwin\n | typeof PathScurryPosix =\n process.platform === 'win32' ? PathScurryWin32\n : process.platform === 'darwin' ? PathScurryDarwin\n : PathScurryPosix\nexport type PathScurry = PathScurryBase | InstanceType\n"]} \ No newline at end of file diff --git a/node_modules/path-scurry/dist/commonjs/package.json b/node_modules/path-scurry/dist/commonjs/package.json deleted file mode 100644 index 5bbefff..0000000 --- a/node_modules/path-scurry/dist/commonjs/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "commonjs" -} diff --git a/node_modules/path-scurry/dist/esm/index.d.ts b/node_modules/path-scurry/dist/esm/index.d.ts deleted file mode 100644 index 33b3edb..0000000 --- a/node_modules/path-scurry/dist/esm/index.d.ts +++ /dev/null @@ -1,1116 +0,0 @@ -/// -/// -/// -import { LRUCache } from 'lru-cache'; -import { posix, win32 } from 'node:path'; -import { Minipass } from 'minipass'; -import type { Dirent, Stats } from 'node:fs'; -/** - * An object that will be used to override the default `fs` - * methods. Any methods that are not overridden will use Node's - * built-in implementations. - * - * - lstatSync - * - readdir (callback `withFileTypes` Dirent variant, used for - * readdirCB and most walks) - * - readdirSync - * - readlinkSync - * - realpathSync - * - promises: Object containing the following async methods: - * - lstat - * - readdir (Dirent variant only) - * - readlink - * - realpath - */ -export interface FSOption { - lstatSync?: (path: string) => Stats; - readdir?: (path: string, options: { - withFileTypes: true; - }, cb: (er: NodeJS.ErrnoException | null, entries?: Dirent[]) => any) => void; - readdirSync?: (path: string, options: { - withFileTypes: true; - }) => Dirent[]; - readlinkSync?: (path: string) => string; - realpathSync?: (path: string) => string; - promises?: { - lstat?: (path: string) => Promise; - readdir?: (path: string, options: { - withFileTypes: true; - }) => Promise; - readlink?: (path: string) => Promise; - realpath?: (path: string) => Promise; - [k: string]: any; - }; - [k: string]: any; -} -interface FSValue { - lstatSync: (path: string) => Stats; - readdir: (path: string, options: { - withFileTypes: true; - }, cb: (er: NodeJS.ErrnoException | null, entries?: Dirent[]) => any) => void; - readdirSync: (path: string, options: { - withFileTypes: true; - }) => Dirent[]; - readlinkSync: (path: string) => string; - realpathSync: (path: string) => string; - promises: { - lstat: (path: string) => Promise; - readdir: (path: string, options: { - withFileTypes: true; - }) => Promise; - readlink: (path: string) => Promise; - realpath: (path: string) => Promise; - [k: string]: any; - }; - [k: string]: any; -} -export type Type = 'Unknown' | 'FIFO' | 'CharacterDevice' | 'Directory' | 'BlockDevice' | 'File' | 'SymbolicLink' | 'Socket'; -/** - * Options that may be provided to the Path constructor - */ -export interface PathOpts { - fullpath?: string; - relative?: string; - relativePosix?: string; - parent?: PathBase; - /** - * See {@link FSOption} - */ - fs?: FSOption; -} -/** - * An LRUCache for storing resolved path strings or Path objects. - * @internal - */ -export declare class ResolveCache extends LRUCache { - constructor(); -} -/** - * an LRUCache for storing child entries. - * @internal - */ -export declare class ChildrenCache extends LRUCache { - constructor(maxSize?: number); -} -/** - * Array of Path objects, plus a marker indicating the first provisional entry - * - * @internal - */ -export type Children = PathBase[] & { - provisional: number; -}; -declare const setAsCwd: unique symbol; -/** - * Path objects are sort of like a super-powered - * {@link https://nodejs.org/docs/latest/api/fs.html#class-fsdirent fs.Dirent} - * - * Each one represents a single filesystem entry on disk, which may or may not - * exist. It includes methods for reading various types of information via - * lstat, readlink, and readdir, and caches all information to the greatest - * degree possible. - * - * Note that fs operations that would normally throw will instead return an - * "empty" value. This is in order to prevent excessive overhead from error - * stack traces. - */ -export declare abstract class PathBase implements Dirent { - #private; - /** - * the basename of this path - * - * **Important**: *always* test the path name against any test string - * usingthe {@link isNamed} method, and not by directly comparing this - * string. Otherwise, unicode path strings that the system sees as identical - * will not be properly treated as the same path, leading to incorrect - * behavior and possible security issues. - */ - name: string; - /** - * the Path entry corresponding to the path root. - * - * @internal - */ - root: PathBase; - /** - * All roots found within the current PathScurry family - * - * @internal - */ - roots: { - [k: string]: PathBase; - }; - /** - * a reference to the parent path, or undefined in the case of root entries - * - * @internal - */ - parent?: PathBase; - /** - * boolean indicating whether paths are compared case-insensitively - * @internal - */ - nocase: boolean; - /** - * boolean indicating that this path is the current working directory - * of the PathScurry collection that contains it. - */ - isCWD: boolean; - /** - * the string or regexp used to split paths. On posix, it is `'/'`, and on - * windows it is a RegExp matching either `'/'` or `'\\'` - */ - abstract splitSep: string | RegExp; - /** - * The path separator string to use when joining paths - */ - abstract sep: string; - get dev(): number | undefined; - get mode(): number | undefined; - get nlink(): number | undefined; - get uid(): number | undefined; - get gid(): number | undefined; - get rdev(): number | undefined; - get blksize(): number | undefined; - get ino(): number | undefined; - get size(): number | undefined; - get blocks(): number | undefined; - get atimeMs(): number | undefined; - get mtimeMs(): number | undefined; - get ctimeMs(): number | undefined; - get birthtimeMs(): number | undefined; - get atime(): Date | undefined; - get mtime(): Date | undefined; - get ctime(): Date | undefined; - get birthtime(): Date | undefined; - /** - * This property is for compatibility with the Dirent class as of - * Node v20, where Dirent['parentPath'] refers to the path of the - * directory that was passed to readdir. For root entries, it's the path - * to the entry itself. - */ - get parentPath(): string; - /** - * Deprecated alias for Dirent['parentPath'] Somewhat counterintuitively, - * this property refers to the *parent* path, not the path object itself. - */ - get path(): string; - /** - * Do not create new Path objects directly. They should always be accessed - * via the PathScurry class or other methods on the Path class. - * - * @internal - */ - constructor(name: string, type: number | undefined, root: PathBase | undefined, roots: { - [k: string]: PathBase; - }, nocase: boolean, children: ChildrenCache, opts: PathOpts); - /** - * Returns the depth of the Path object from its root. - * - * For example, a path at `/foo/bar` would have a depth of 2. - */ - depth(): number; - /** - * @internal - */ - abstract getRootString(path: string): string; - /** - * @internal - */ - abstract getRoot(rootPath: string): PathBase; - /** - * @internal - */ - abstract newChild(name: string, type?: number, opts?: PathOpts): PathBase; - /** - * @internal - */ - childrenCache(): ChildrenCache; - /** - * Get the Path object referenced by the string path, resolved from this Path - */ - resolve(path?: string): PathBase; - /** - * Returns the cached children Path objects, if still available. If they - * have fallen out of the cache, then returns an empty array, and resets the - * READDIR_CALLED bit, so that future calls to readdir() will require an fs - * lookup. - * - * @internal - */ - children(): Children; - /** - * Resolves a path portion and returns or creates the child Path. - * - * Returns `this` if pathPart is `''` or `'.'`, or `parent` if pathPart is - * `'..'`. - * - * This should not be called directly. If `pathPart` contains any path - * separators, it will lead to unsafe undefined behavior. - * - * Use `Path.resolve()` instead. - * - * @internal - */ - child(pathPart: string, opts?: PathOpts): PathBase; - /** - * The relative path from the cwd. If it does not share an ancestor with - * the cwd, then this ends up being equivalent to the fullpath() - */ - relative(): string; - /** - * The relative path from the cwd, using / as the path separator. - * If it does not share an ancestor with - * the cwd, then this ends up being equivalent to the fullpathPosix() - * On posix systems, this is identical to relative(). - */ - relativePosix(): string; - /** - * The fully resolved path string for this Path entry - */ - fullpath(): string; - /** - * On platforms other than windows, this is identical to fullpath. - * - * On windows, this is overridden to return the forward-slash form of the - * full UNC path. - */ - fullpathPosix(): string; - /** - * Is the Path of an unknown type? - * - * Note that we might know *something* about it if there has been a previous - * filesystem operation, for example that it does not exist, or is not a - * link, or whether it has child entries. - */ - isUnknown(): boolean; - isType(type: Type): boolean; - getType(): Type; - /** - * Is the Path a regular file? - */ - isFile(): boolean; - /** - * Is the Path a directory? - */ - isDirectory(): boolean; - /** - * Is the path a character device? - */ - isCharacterDevice(): boolean; - /** - * Is the path a block device? - */ - isBlockDevice(): boolean; - /** - * Is the path a FIFO pipe? - */ - isFIFO(): boolean; - /** - * Is the path a socket? - */ - isSocket(): boolean; - /** - * Is the path a symbolic link? - */ - isSymbolicLink(): boolean; - /** - * Return the entry if it has been subject of a successful lstat, or - * undefined otherwise. - * - * Does not read the filesystem, so an undefined result *could* simply - * mean that we haven't called lstat on it. - */ - lstatCached(): PathBase | undefined; - /** - * Return the cached link target if the entry has been the subject of a - * successful readlink, or undefined otherwise. - * - * Does not read the filesystem, so an undefined result *could* just mean we - * don't have any cached data. Only use it if you are very sure that a - * readlink() has been called at some point. - */ - readlinkCached(): PathBase | undefined; - /** - * Returns the cached realpath target if the entry has been the subject - * of a successful realpath, or undefined otherwise. - * - * Does not read the filesystem, so an undefined result *could* just mean we - * don't have any cached data. Only use it if you are very sure that a - * realpath() has been called at some point. - */ - realpathCached(): PathBase | undefined; - /** - * Returns the cached child Path entries array if the entry has been the - * subject of a successful readdir(), or [] otherwise. - * - * Does not read the filesystem, so an empty array *could* just mean we - * don't have any cached data. Only use it if you are very sure that a - * readdir() has been called recently enough to still be valid. - */ - readdirCached(): PathBase[]; - /** - * Return true if it's worth trying to readlink. Ie, we don't (yet) have - * any indication that readlink will definitely fail. - * - * Returns false if the path is known to not be a symlink, if a previous - * readlink failed, or if the entry does not exist. - */ - canReadlink(): boolean; - /** - * Return true if readdir has previously been successfully called on this - * path, indicating that cachedReaddir() is likely valid. - */ - calledReaddir(): boolean; - /** - * Returns true if the path is known to not exist. That is, a previous lstat - * or readdir failed to verify its existence when that would have been - * expected, or a parent entry was marked either enoent or enotdir. - */ - isENOENT(): boolean; - /** - * Return true if the path is a match for the given path name. This handles - * case sensitivity and unicode normalization. - * - * Note: even on case-sensitive systems, it is **not** safe to test the - * equality of the `.name` property to determine whether a given pathname - * matches, due to unicode normalization mismatches. - * - * Always use this method instead of testing the `path.name` property - * directly. - */ - isNamed(n: string): boolean; - /** - * Return the Path object corresponding to the target of a symbolic link. - * - * If the Path is not a symbolic link, or if the readlink call fails for any - * reason, `undefined` is returned. - * - * Result is cached, and thus may be outdated if the filesystem is mutated. - */ - readlink(): Promise; - /** - * Synchronous {@link PathBase.readlink} - */ - readlinkSync(): PathBase | undefined; - /** - * Call lstat() on this Path, and update all known information that can be - * determined. - * - * Note that unlike `fs.lstat()`, the returned value does not contain some - * information, such as `mode`, `dev`, `nlink`, and `ino`. If that - * information is required, you will need to call `fs.lstat` yourself. - * - * If the Path refers to a nonexistent file, or if the lstat call fails for - * any reason, `undefined` is returned. Otherwise the updated Path object is - * returned. - * - * Results are cached, and thus may be out of date if the filesystem is - * mutated. - */ - lstat(): Promise; - /** - * synchronous {@link PathBase.lstat} - */ - lstatSync(): PathBase | undefined; - /** - * Standard node-style callback interface to get list of directory entries. - * - * If the Path cannot or does not contain any children, then an empty array - * is returned. - * - * Results are cached, and thus may be out of date if the filesystem is - * mutated. - * - * @param cb The callback called with (er, entries). Note that the `er` - * param is somewhat extraneous, as all readdir() errors are handled and - * simply result in an empty set of entries being returned. - * @param allowZalgo Boolean indicating that immediately known results should - * *not* be deferred with `queueMicrotask`. Defaults to `false`. Release - * zalgo at your peril, the dark pony lord is devious and unforgiving. - */ - readdirCB(cb: (er: NodeJS.ErrnoException | null, entries: PathBase[]) => any, allowZalgo?: boolean): void; - /** - * Return an array of known child entries. - * - * If the Path cannot or does not contain any children, then an empty array - * is returned. - * - * Results are cached, and thus may be out of date if the filesystem is - * mutated. - */ - readdir(): Promise; - /** - * synchronous {@link PathBase.readdir} - */ - readdirSync(): PathBase[]; - canReaddir(): boolean; - shouldWalk(dirs: Set, walkFilter?: (e: PathBase) => boolean): boolean; - /** - * Return the Path object corresponding to path as resolved - * by realpath(3). - * - * If the realpath call fails for any reason, `undefined` is returned. - * - * Result is cached, and thus may be outdated if the filesystem is mutated. - * On success, returns a Path object. - */ - realpath(): Promise; - /** - * Synchronous {@link realpath} - */ - realpathSync(): PathBase | undefined; - /** - * Internal method to mark this Path object as the scurry cwd, - * called by {@link PathScurry#chdir} - * - * @internal - */ - [setAsCwd](oldCwd: PathBase): void; -} -/** - * Path class used on win32 systems - * - * Uses `'\\'` as the path separator for returned paths, either `'\\'` or `'/'` - * as the path separator for parsing paths. - */ -export declare class PathWin32 extends PathBase { - /** - * Separator for generating path strings. - */ - sep: '\\'; - /** - * Separator for parsing path strings. - */ - splitSep: RegExp; - /** - * Do not create new Path objects directly. They should always be accessed - * via the PathScurry class or other methods on the Path class. - * - * @internal - */ - constructor(name: string, type: number | undefined, root: PathBase | undefined, roots: { - [k: string]: PathBase; - }, nocase: boolean, children: ChildrenCache, opts: PathOpts); - /** - * @internal - */ - newChild(name: string, type?: number, opts?: PathOpts): PathWin32; - /** - * @internal - */ - getRootString(path: string): string; - /** - * @internal - */ - getRoot(rootPath: string): PathBase; - /** - * @internal - */ - sameRoot(rootPath: string, compare?: string): boolean; -} -/** - * Path class used on all posix systems. - * - * Uses `'/'` as the path separator. - */ -export declare class PathPosix extends PathBase { - /** - * separator for parsing path strings - */ - splitSep: '/'; - /** - * separator for generating path strings - */ - sep: '/'; - /** - * Do not create new Path objects directly. They should always be accessed - * via the PathScurry class or other methods on the Path class. - * - * @internal - */ - constructor(name: string, type: number | undefined, root: PathBase | undefined, roots: { - [k: string]: PathBase; - }, nocase: boolean, children: ChildrenCache, opts: PathOpts); - /** - * @internal - */ - getRootString(path: string): string; - /** - * @internal - */ - getRoot(_rootPath: string): PathBase; - /** - * @internal - */ - newChild(name: string, type?: number, opts?: PathOpts): PathPosix; -} -/** - * Options that may be provided to the PathScurry constructor - */ -export interface PathScurryOpts { - /** - * perform case-insensitive path matching. Default based on platform - * subclass. - */ - nocase?: boolean; - /** - * Number of Path entries to keep in the cache of Path child references. - * - * Setting this higher than 65536 will dramatically increase the data - * consumption and construction time overhead of each PathScurry. - * - * Setting this value to 256 or lower will significantly reduce the data - * consumption and construction time overhead, but may also reduce resolve() - * and readdir() performance on large filesystems. - * - * Default `16384`. - */ - childrenCacheSize?: number; - /** - * An object that overrides the built-in functions from the fs and - * fs/promises modules. - * - * See {@link FSOption} - */ - fs?: FSOption; -} -/** - * The base class for all PathScurry classes, providing the interface for path - * resolution and filesystem operations. - * - * Typically, you should *not* instantiate this class directly, but rather one - * of the platform-specific classes, or the exported {@link PathScurry} which - * defaults to the current platform. - */ -export declare abstract class PathScurryBase { - #private; - /** - * The root Path entry for the current working directory of this Scurry - */ - root: PathBase; - /** - * The string path for the root of this Scurry's current working directory - */ - rootPath: string; - /** - * A collection of all roots encountered, referenced by rootPath - */ - roots: { - [k: string]: PathBase; - }; - /** - * The Path entry corresponding to this PathScurry's current working directory. - */ - cwd: PathBase; - /** - * Perform path comparisons case-insensitively. - * - * Defaults true on Darwin and Windows systems, false elsewhere. - */ - nocase: boolean; - /** - * The path separator used for parsing paths - * - * `'/'` on Posix systems, either `'/'` or `'\\'` on Windows - */ - abstract sep: string | RegExp; - /** - * This class should not be instantiated directly. - * - * Use PathScurryWin32, PathScurryDarwin, PathScurryPosix, or PathScurry - * - * @internal - */ - constructor(cwd: string | URL | undefined, pathImpl: typeof win32 | typeof posix, sep: string | RegExp, { nocase, childrenCacheSize, fs, }?: PathScurryOpts); - /** - * Get the depth of a provided path, string, or the cwd - */ - depth(path?: Path | string): number; - /** - * Parse the root portion of a path string - * - * @internal - */ - abstract parseRootPath(dir: string): string; - /** - * create a new Path to use as root during construction. - * - * @internal - */ - abstract newRoot(fs: FSValue): PathBase; - /** - * Determine whether a given path string is absolute - */ - abstract isAbsolute(p: string): boolean; - /** - * Return the cache of child entries. Exposed so subclasses can create - * child Path objects in a platform-specific way. - * - * @internal - */ - childrenCache(): ChildrenCache; - /** - * Resolve one or more path strings to a resolved string - * - * Same interface as require('path').resolve. - * - * Much faster than path.resolve() when called multiple times for the same - * path, because the resolved Path objects are cached. Much slower - * otherwise. - */ - resolve(...paths: string[]): string; - /** - * Resolve one or more path strings to a resolved string, returning - * the posix path. Identical to .resolve() on posix systems, but on - * windows will return a forward-slash separated UNC path. - * - * Same interface as require('path').resolve. - * - * Much faster than path.resolve() when called multiple times for the same - * path, because the resolved Path objects are cached. Much slower - * otherwise. - */ - resolvePosix(...paths: string[]): string; - /** - * find the relative path from the cwd to the supplied path string or entry - */ - relative(entry?: PathBase | string): string; - /** - * find the relative path from the cwd to the supplied path string or - * entry, using / as the path delimiter, even on Windows. - */ - relativePosix(entry?: PathBase | string): string; - /** - * Return the basename for the provided string or Path object - */ - basename(entry?: PathBase | string): string; - /** - * Return the dirname for the provided string or Path object - */ - dirname(entry?: PathBase | string): string; - /** - * Return an array of known child entries. - * - * First argument may be either a string, or a Path object. - * - * If the Path cannot or does not contain any children, then an empty array - * is returned. - * - * Results are cached, and thus may be out of date if the filesystem is - * mutated. - * - * Unlike `fs.readdir()`, the `withFileTypes` option defaults to `true`. Set - * `{ withFileTypes: false }` to return strings. - */ - readdir(): Promise; - readdir(opts: { - withFileTypes: true; - }): Promise; - readdir(opts: { - withFileTypes: false; - }): Promise; - readdir(opts: { - withFileTypes: boolean; - }): Promise; - readdir(entry: PathBase | string): Promise; - readdir(entry: PathBase | string, opts: { - withFileTypes: true; - }): Promise; - readdir(entry: PathBase | string, opts: { - withFileTypes: false; - }): Promise; - readdir(entry: PathBase | string, opts: { - withFileTypes: boolean; - }): Promise; - /** - * synchronous {@link PathScurryBase.readdir} - */ - readdirSync(): PathBase[]; - readdirSync(opts: { - withFileTypes: true; - }): PathBase[]; - readdirSync(opts: { - withFileTypes: false; - }): string[]; - readdirSync(opts: { - withFileTypes: boolean; - }): PathBase[] | string[]; - readdirSync(entry: PathBase | string): PathBase[]; - readdirSync(entry: PathBase | string, opts: { - withFileTypes: true; - }): PathBase[]; - readdirSync(entry: PathBase | string, opts: { - withFileTypes: false; - }): string[]; - readdirSync(entry: PathBase | string, opts: { - withFileTypes: boolean; - }): PathBase[] | string[]; - /** - * Call lstat() on the string or Path object, and update all known - * information that can be determined. - * - * Note that unlike `fs.lstat()`, the returned value does not contain some - * information, such as `mode`, `dev`, `nlink`, and `ino`. If that - * information is required, you will need to call `fs.lstat` yourself. - * - * If the Path refers to a nonexistent file, or if the lstat call fails for - * any reason, `undefined` is returned. Otherwise the updated Path object is - * returned. - * - * Results are cached, and thus may be out of date if the filesystem is - * mutated. - */ - lstat(entry?: string | PathBase): Promise; - /** - * synchronous {@link PathScurryBase.lstat} - */ - lstatSync(entry?: string | PathBase): PathBase | undefined; - /** - * Return the Path object or string path corresponding to the target of a - * symbolic link. - * - * If the path is not a symbolic link, or if the readlink call fails for any - * reason, `undefined` is returned. - * - * Result is cached, and thus may be outdated if the filesystem is mutated. - * - * `{withFileTypes}` option defaults to `false`. - * - * On success, returns a Path object if `withFileTypes` option is true, - * otherwise a string. - */ - readlink(): Promise; - readlink(opt: { - withFileTypes: false; - }): Promise; - readlink(opt: { - withFileTypes: true; - }): Promise; - readlink(opt: { - withFileTypes: boolean; - }): Promise; - readlink(entry: string | PathBase, opt?: { - withFileTypes: false; - }): Promise; - readlink(entry: string | PathBase, opt: { - withFileTypes: true; - }): Promise; - readlink(entry: string | PathBase, opt: { - withFileTypes: boolean; - }): Promise; - /** - * synchronous {@link PathScurryBase.readlink} - */ - readlinkSync(): string | undefined; - readlinkSync(opt: { - withFileTypes: false; - }): string | undefined; - readlinkSync(opt: { - withFileTypes: true; - }): PathBase | undefined; - readlinkSync(opt: { - withFileTypes: boolean; - }): PathBase | string | undefined; - readlinkSync(entry: string | PathBase, opt?: { - withFileTypes: false; - }): string | undefined; - readlinkSync(entry: string | PathBase, opt: { - withFileTypes: true; - }): PathBase | undefined; - readlinkSync(entry: string | PathBase, opt: { - withFileTypes: boolean; - }): string | PathBase | undefined; - /** - * Return the Path object or string path corresponding to path as resolved - * by realpath(3). - * - * If the realpath call fails for any reason, `undefined` is returned. - * - * Result is cached, and thus may be outdated if the filesystem is mutated. - * - * `{withFileTypes}` option defaults to `false`. - * - * On success, returns a Path object if `withFileTypes` option is true, - * otherwise a string. - */ - realpath(): Promise; - realpath(opt: { - withFileTypes: false; - }): Promise; - realpath(opt: { - withFileTypes: true; - }): Promise; - realpath(opt: { - withFileTypes: boolean; - }): Promise; - realpath(entry: string | PathBase, opt?: { - withFileTypes: false; - }): Promise; - realpath(entry: string | PathBase, opt: { - withFileTypes: true; - }): Promise; - realpath(entry: string | PathBase, opt: { - withFileTypes: boolean; - }): Promise; - realpathSync(): string | undefined; - realpathSync(opt: { - withFileTypes: false; - }): string | undefined; - realpathSync(opt: { - withFileTypes: true; - }): PathBase | undefined; - realpathSync(opt: { - withFileTypes: boolean; - }): PathBase | string | undefined; - realpathSync(entry: string | PathBase, opt?: { - withFileTypes: false; - }): string | undefined; - realpathSync(entry: string | PathBase, opt: { - withFileTypes: true; - }): PathBase | undefined; - realpathSync(entry: string | PathBase, opt: { - withFileTypes: boolean; - }): string | PathBase | undefined; - /** - * Asynchronously walk the directory tree, returning an array of - * all path strings or Path objects found. - * - * Note that this will be extremely memory-hungry on large filesystems. - * In such cases, it may be better to use the stream or async iterator - * walk implementation. - */ - walk(): Promise; - walk(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Promise; - walk(opts: WalkOptionsWithFileTypesFalse): Promise; - walk(opts: WalkOptions): Promise; - walk(entry: string | PathBase): Promise; - walk(entry: string | PathBase, opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Promise; - walk(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): Promise; - walk(entry: string | PathBase, opts: WalkOptions): Promise; - /** - * Synchronously walk the directory tree, returning an array of - * all path strings or Path objects found. - * - * Note that this will be extremely memory-hungry on large filesystems. - * In such cases, it may be better to use the stream or async iterator - * walk implementation. - */ - walkSync(): PathBase[]; - walkSync(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): PathBase[]; - walkSync(opts: WalkOptionsWithFileTypesFalse): string[]; - walkSync(opts: WalkOptions): string[] | PathBase[]; - walkSync(entry: string | PathBase): PathBase[]; - walkSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesUnset | WalkOptionsWithFileTypesTrue): PathBase[]; - walkSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): string[]; - walkSync(entry: string | PathBase, opts: WalkOptions): PathBase[] | string[]; - /** - * Support for `for await` - * - * Alias for {@link PathScurryBase.iterate} - * - * Note: As of Node 19, this is very slow, compared to other methods of - * walking. Consider using {@link PathScurryBase.stream} if memory overhead - * and backpressure are concerns, or {@link PathScurryBase.walk} if not. - */ - [Symbol.asyncIterator](): AsyncGenerator; - /** - * Async generator form of {@link PathScurryBase.walk} - * - * Note: As of Node 19, this is very slow, compared to other methods of - * walking, especially if most/all of the directory tree has been previously - * walked. Consider using {@link PathScurryBase.stream} if memory overhead - * and backpressure are concerns, or {@link PathScurryBase.walk} if not. - */ - iterate(): AsyncGenerator; - iterate(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): AsyncGenerator; - iterate(opts: WalkOptionsWithFileTypesFalse): AsyncGenerator; - iterate(opts: WalkOptions): AsyncGenerator; - iterate(entry: string | PathBase): AsyncGenerator; - iterate(entry: string | PathBase, opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): AsyncGenerator; - iterate(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): AsyncGenerator; - iterate(entry: string | PathBase, opts: WalkOptions): AsyncGenerator; - /** - * Iterating over a PathScurry performs a synchronous walk. - * - * Alias for {@link PathScurryBase.iterateSync} - */ - [Symbol.iterator](): Generator; - iterateSync(): Generator; - iterateSync(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Generator; - iterateSync(opts: WalkOptionsWithFileTypesFalse): Generator; - iterateSync(opts: WalkOptions): Generator; - iterateSync(entry: string | PathBase): Generator; - iterateSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Generator; - iterateSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): Generator; - iterateSync(entry: string | PathBase, opts: WalkOptions): Generator; - /** - * Stream form of {@link PathScurryBase.walk} - * - * Returns a Minipass stream that emits {@link PathBase} objects by default, - * or strings if `{ withFileTypes: false }` is set in the options. - */ - stream(): Minipass; - stream(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Minipass; - stream(opts: WalkOptionsWithFileTypesFalse): Minipass; - stream(opts: WalkOptions): Minipass; - stream(entry: string | PathBase): Minipass; - stream(entry: string | PathBase, opts: WalkOptionsWithFileTypesUnset | WalkOptionsWithFileTypesTrue): Minipass; - stream(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): Minipass; - stream(entry: string | PathBase, opts: WalkOptions): Minipass | Minipass; - /** - * Synchronous form of {@link PathScurryBase.stream} - * - * Returns a Minipass stream that emits {@link PathBase} objects by default, - * or strings if `{ withFileTypes: false }` is set in the options. - * - * Will complete the walk in a single tick if the stream is consumed fully. - * Otherwise, will pause as needed for stream backpressure. - */ - streamSync(): Minipass; - streamSync(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Minipass; - streamSync(opts: WalkOptionsWithFileTypesFalse): Minipass; - streamSync(opts: WalkOptions): Minipass; - streamSync(entry: string | PathBase): Minipass; - streamSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesUnset | WalkOptionsWithFileTypesTrue): Minipass; - streamSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): Minipass; - streamSync(entry: string | PathBase, opts: WalkOptions): Minipass | Minipass; - chdir(path?: string | Path): void; -} -/** - * Options provided to all walk methods. - */ -export interface WalkOptions { - /** - * Return results as {@link PathBase} objects rather than strings. - * When set to false, results are fully resolved paths, as returned by - * {@link PathBase.fullpath}. - * @default true - */ - withFileTypes?: boolean; - /** - * Attempt to read directory entries from symbolic links. Otherwise, only - * actual directories are traversed. Regardless of this setting, a given - * target path will only ever be walked once, meaning that a symbolic link - * to a previously traversed directory will never be followed. - * - * Setting this imposes a slight performance penalty, because `readlink` - * must be called on all symbolic links encountered, in order to avoid - * infinite cycles. - * @default false - */ - follow?: boolean; - /** - * Only return entries where the provided function returns true. - * - * This will not prevent directories from being traversed, even if they do - * not pass the filter, though it will prevent directories themselves from - * being included in the result set. See {@link walkFilter} - * - * Asynchronous functions are not supported here. - * - * By default, if no filter is provided, all entries and traversed - * directories are included. - */ - filter?: (entry: PathBase) => boolean; - /** - * Only traverse directories (and in the case of {@link follow} being set to - * true, symbolic links to directories) if the provided function returns - * true. - * - * This will not prevent directories from being included in the result set, - * even if they do not pass the supplied filter function. See {@link filter} - * to do that. - * - * Asynchronous functions are not supported here. - */ - walkFilter?: (entry: PathBase) => boolean; -} -export type WalkOptionsWithFileTypesUnset = WalkOptions & { - withFileTypes?: undefined; -}; -export type WalkOptionsWithFileTypesTrue = WalkOptions & { - withFileTypes: true; -}; -export type WalkOptionsWithFileTypesFalse = WalkOptions & { - withFileTypes: false; -}; -/** - * Windows implementation of {@link PathScurryBase} - * - * Defaults to case insensitve, uses `'\\'` to generate path strings. Uses - * {@link PathWin32} for Path objects. - */ -export declare class PathScurryWin32 extends PathScurryBase { - /** - * separator for generating path strings - */ - sep: '\\'; - constructor(cwd?: URL | string, opts?: PathScurryOpts); - /** - * @internal - */ - parseRootPath(dir: string): string; - /** - * @internal - */ - newRoot(fs: FSValue): PathWin32; - /** - * Return true if the provided path string is an absolute path - */ - isAbsolute(p: string): boolean; -} -/** - * {@link PathScurryBase} implementation for all posix systems other than Darwin. - * - * Defaults to case-sensitive matching, uses `'/'` to generate path strings. - * - * Uses {@link PathPosix} for Path objects. - */ -export declare class PathScurryPosix extends PathScurryBase { - /** - * separator for generating path strings - */ - sep: '/'; - constructor(cwd?: URL | string, opts?: PathScurryOpts); - /** - * @internal - */ - parseRootPath(_dir: string): string; - /** - * @internal - */ - newRoot(fs: FSValue): PathPosix; - /** - * Return true if the provided path string is an absolute path - */ - isAbsolute(p: string): boolean; -} -/** - * {@link PathScurryBase} implementation for Darwin (macOS) systems. - * - * Defaults to case-insensitive matching, uses `'/'` for generating path - * strings. - * - * Uses {@link PathPosix} for Path objects. - */ -export declare class PathScurryDarwin extends PathScurryPosix { - constructor(cwd?: URL | string, opts?: PathScurryOpts); -} -/** - * Default {@link PathBase} implementation for the current platform. - * - * {@link PathWin32} on Windows systems, {@link PathPosix} on all others. - */ -export declare const Path: typeof PathWin32 | typeof PathPosix; -export type Path = PathBase | InstanceType; -/** - * Default {@link PathScurryBase} implementation for the current platform. - * - * {@link PathScurryWin32} on Windows systems, {@link PathScurryDarwin} on - * Darwin (macOS) systems, {@link PathScurryPosix} on all others. - */ -export declare const PathScurry: typeof PathScurryWin32 | typeof PathScurryDarwin | typeof PathScurryPosix; -export type PathScurry = PathScurryBase | InstanceType; -export {}; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/path-scurry/dist/esm/index.d.ts.map b/node_modules/path-scurry/dist/esm/index.d.ts.map deleted file mode 100644 index 1f59f8f..0000000 --- a/node_modules/path-scurry/dist/esm/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/path-scurry/dist/esm/index.js b/node_modules/path-scurry/dist/esm/index.js deleted file mode 100644 index 3b11b81..0000000 --- a/node_modules/path-scurry/dist/esm/index.js +++ /dev/null @@ -1,1979 +0,0 @@ -import { LRUCache } from 'lru-cache'; -import { posix, win32 } from 'node:path'; -import { fileURLToPath } from 'node:url'; -import { lstatSync, readdir as readdirCB, readdirSync, readlinkSync, realpathSync as rps, } from 'fs'; -import * as actualFS from 'node:fs'; -const realpathSync = rps.native; -// TODO: test perf of fs/promises realpath vs realpathCB, -// since the promises one uses realpath.native -import { lstat, readdir, readlink, realpath } from 'node:fs/promises'; -import { Minipass } from 'minipass'; -const defaultFS = { - lstatSync, - readdir: readdirCB, - readdirSync, - readlinkSync, - realpathSync, - promises: { - lstat, - readdir, - readlink, - realpath, - }, -}; -// if they just gave us require('fs') then use our default -const fsFromOption = (fsOption) => !fsOption || fsOption === defaultFS || fsOption === actualFS ? - defaultFS - : { - ...defaultFS, - ...fsOption, - promises: { - ...defaultFS.promises, - ...(fsOption.promises || {}), - }, - }; -// turn something like //?/c:/ into c:\ -const uncDriveRegexp = /^\\\\\?\\([a-z]:)\\?$/i; -const uncToDrive = (rootPath) => rootPath.replace(/\//g, '\\').replace(uncDriveRegexp, '$1\\'); -// windows paths are separated by either / or \ -const eitherSep = /[\\\/]/; -const UNKNOWN = 0; // may not even exist, for all we know -const IFIFO = 0b0001; -const IFCHR = 0b0010; -const IFDIR = 0b0100; -const IFBLK = 0b0110; -const IFREG = 0b1000; -const IFLNK = 0b1010; -const IFSOCK = 0b1100; -const IFMT = 0b1111; -// mask to unset low 4 bits -const IFMT_UNKNOWN = ~IFMT; -// set after successfully calling readdir() and getting entries. -const READDIR_CALLED = 0b0000_0001_0000; -// set after a successful lstat() -const LSTAT_CALLED = 0b0000_0010_0000; -// set if an entry (or one of its parents) is definitely not a dir -const ENOTDIR = 0b0000_0100_0000; -// set if an entry (or one of its parents) does not exist -// (can also be set on lstat errors like EACCES or ENAMETOOLONG) -const ENOENT = 0b0000_1000_0000; -// cannot have child entries -- also verify &IFMT is either IFDIR or IFLNK -// set if we fail to readlink -const ENOREADLINK = 0b0001_0000_0000; -// set if we know realpath() will fail -const ENOREALPATH = 0b0010_0000_0000; -const ENOCHILD = ENOTDIR | ENOENT | ENOREALPATH; -const TYPEMASK = 0b0011_1111_1111; -const entToType = (s) => s.isFile() ? IFREG - : s.isDirectory() ? IFDIR - : s.isSymbolicLink() ? IFLNK - : s.isCharacterDevice() ? IFCHR - : s.isBlockDevice() ? IFBLK - : s.isSocket() ? IFSOCK - : s.isFIFO() ? IFIFO - : UNKNOWN; -// normalize unicode path names -const normalizeCache = new Map(); -const normalize = (s) => { - const c = normalizeCache.get(s); - if (c) - return c; - const n = s.normalize('NFKD'); - normalizeCache.set(s, n); - return n; -}; -const normalizeNocaseCache = new Map(); -const normalizeNocase = (s) => { - const c = normalizeNocaseCache.get(s); - if (c) - return c; - const n = normalize(s.toLowerCase()); - normalizeNocaseCache.set(s, n); - return n; -}; -/** - * An LRUCache for storing resolved path strings or Path objects. - * @internal - */ -export class ResolveCache extends LRUCache { - constructor() { - super({ max: 256 }); - } -} -// In order to prevent blowing out the js heap by allocating hundreds of -// thousands of Path entries when walking extremely large trees, the "children" -// in this tree are represented by storing an array of Path entries in an -// LRUCache, indexed by the parent. At any time, Path.children() may return an -// empty array, indicating that it doesn't know about any of its children, and -// thus has to rebuild that cache. This is fine, it just means that we don't -// benefit as much from having the cached entries, but huge directory walks -// don't blow out the stack, and smaller ones are still as fast as possible. -// -//It does impose some complexity when building up the readdir data, because we -//need to pass a reference to the children array that we started with. -/** - * an LRUCache for storing child entries. - * @internal - */ -export class ChildrenCache extends LRUCache { - constructor(maxSize = 16 * 1024) { - super({ - maxSize, - // parent + children - sizeCalculation: a => a.length + 1, - }); - } -} -const setAsCwd = Symbol('PathScurry setAsCwd'); -/** - * Path objects are sort of like a super-powered - * {@link https://nodejs.org/docs/latest/api/fs.html#class-fsdirent fs.Dirent} - * - * Each one represents a single filesystem entry on disk, which may or may not - * exist. It includes methods for reading various types of information via - * lstat, readlink, and readdir, and caches all information to the greatest - * degree possible. - * - * Note that fs operations that would normally throw will instead return an - * "empty" value. This is in order to prevent excessive overhead from error - * stack traces. - */ -export class PathBase { - /** - * the basename of this path - * - * **Important**: *always* test the path name against any test string - * usingthe {@link isNamed} method, and not by directly comparing this - * string. Otherwise, unicode path strings that the system sees as identical - * will not be properly treated as the same path, leading to incorrect - * behavior and possible security issues. - */ - name; - /** - * the Path entry corresponding to the path root. - * - * @internal - */ - root; - /** - * All roots found within the current PathScurry family - * - * @internal - */ - roots; - /** - * a reference to the parent path, or undefined in the case of root entries - * - * @internal - */ - parent; - /** - * boolean indicating whether paths are compared case-insensitively - * @internal - */ - nocase; - /** - * boolean indicating that this path is the current working directory - * of the PathScurry collection that contains it. - */ - isCWD = false; - // potential default fs override - #fs; - // Stats fields - #dev; - get dev() { - return this.#dev; - } - #mode; - get mode() { - return this.#mode; - } - #nlink; - get nlink() { - return this.#nlink; - } - #uid; - get uid() { - return this.#uid; - } - #gid; - get gid() { - return this.#gid; - } - #rdev; - get rdev() { - return this.#rdev; - } - #blksize; - get blksize() { - return this.#blksize; - } - #ino; - get ino() { - return this.#ino; - } - #size; - get size() { - return this.#size; - } - #blocks; - get blocks() { - return this.#blocks; - } - #atimeMs; - get atimeMs() { - return this.#atimeMs; - } - #mtimeMs; - get mtimeMs() { - return this.#mtimeMs; - } - #ctimeMs; - get ctimeMs() { - return this.#ctimeMs; - } - #birthtimeMs; - get birthtimeMs() { - return this.#birthtimeMs; - } - #atime; - get atime() { - return this.#atime; - } - #mtime; - get mtime() { - return this.#mtime; - } - #ctime; - get ctime() { - return this.#ctime; - } - #birthtime; - get birthtime() { - return this.#birthtime; - } - #matchName; - #depth; - #fullpath; - #fullpathPosix; - #relative; - #relativePosix; - #type; - #children; - #linkTarget; - #realpath; - /** - * This property is for compatibility with the Dirent class as of - * Node v20, where Dirent['parentPath'] refers to the path of the - * directory that was passed to readdir. For root entries, it's the path - * to the entry itself. - */ - get parentPath() { - return (this.parent || this).fullpath(); - } - /** - * Deprecated alias for Dirent['parentPath'] Somewhat counterintuitively, - * this property refers to the *parent* path, not the path object itself. - */ - get path() { - return this.parentPath; - } - /** - * Do not create new Path objects directly. They should always be accessed - * via the PathScurry class or other methods on the Path class. - * - * @internal - */ - constructor(name, type = UNKNOWN, root, roots, nocase, children, opts) { - this.name = name; - this.#matchName = nocase ? normalizeNocase(name) : normalize(name); - this.#type = type & TYPEMASK; - this.nocase = nocase; - this.roots = roots; - this.root = root || this; - this.#children = children; - this.#fullpath = opts.fullpath; - this.#relative = opts.relative; - this.#relativePosix = opts.relativePosix; - this.parent = opts.parent; - if (this.parent) { - this.#fs = this.parent.#fs; - } - else { - this.#fs = fsFromOption(opts.fs); - } - } - /** - * Returns the depth of the Path object from its root. - * - * For example, a path at `/foo/bar` would have a depth of 2. - */ - depth() { - if (this.#depth !== undefined) - return this.#depth; - if (!this.parent) - return (this.#depth = 0); - return (this.#depth = this.parent.depth() + 1); - } - /** - * @internal - */ - childrenCache() { - return this.#children; - } - /** - * Get the Path object referenced by the string path, resolved from this Path - */ - resolve(path) { - if (!path) { - return this; - } - const rootPath = this.getRootString(path); - const dir = path.substring(rootPath.length); - const dirParts = dir.split(this.splitSep); - const result = rootPath ? - this.getRoot(rootPath).#resolveParts(dirParts) - : this.#resolveParts(dirParts); - return result; - } - #resolveParts(dirParts) { - let p = this; - for (const part of dirParts) { - p = p.child(part); - } - return p; - } - /** - * Returns the cached children Path objects, if still available. If they - * have fallen out of the cache, then returns an empty array, and resets the - * READDIR_CALLED bit, so that future calls to readdir() will require an fs - * lookup. - * - * @internal - */ - children() { - const cached = this.#children.get(this); - if (cached) { - return cached; - } - const children = Object.assign([], { provisional: 0 }); - this.#children.set(this, children); - this.#type &= ~READDIR_CALLED; - return children; - } - /** - * Resolves a path portion and returns or creates the child Path. - * - * Returns `this` if pathPart is `''` or `'.'`, or `parent` if pathPart is - * `'..'`. - * - * This should not be called directly. If `pathPart` contains any path - * separators, it will lead to unsafe undefined behavior. - * - * Use `Path.resolve()` instead. - * - * @internal - */ - child(pathPart, opts) { - if (pathPart === '' || pathPart === '.') { - return this; - } - if (pathPart === '..') { - return this.parent || this; - } - // find the child - const children = this.children(); - const name = this.nocase ? normalizeNocase(pathPart) : normalize(pathPart); - for (const p of children) { - if (p.#matchName === name) { - return p; - } - } - // didn't find it, create provisional child, since it might not - // actually exist. If we know the parent isn't a dir, then - // in fact it CAN'T exist. - const s = this.parent ? this.sep : ''; - const fullpath = this.#fullpath ? this.#fullpath + s + pathPart : undefined; - const pchild = this.newChild(pathPart, UNKNOWN, { - ...opts, - parent: this, - fullpath, - }); - if (!this.canReaddir()) { - pchild.#type |= ENOENT; - } - // don't have to update provisional, because if we have real children, - // then provisional is set to children.length, otherwise a lower number - children.push(pchild); - return pchild; - } - /** - * The relative path from the cwd. If it does not share an ancestor with - * the cwd, then this ends up being equivalent to the fullpath() - */ - relative() { - if (this.isCWD) - return ''; - if (this.#relative !== undefined) { - return this.#relative; - } - const name = this.name; - const p = this.parent; - if (!p) { - return (this.#relative = this.name); - } - const pv = p.relative(); - return pv + (!pv || !p.parent ? '' : this.sep) + name; - } - /** - * The relative path from the cwd, using / as the path separator. - * If it does not share an ancestor with - * the cwd, then this ends up being equivalent to the fullpathPosix() - * On posix systems, this is identical to relative(). - */ - relativePosix() { - if (this.sep === '/') - return this.relative(); - if (this.isCWD) - return ''; - if (this.#relativePosix !== undefined) - return this.#relativePosix; - const name = this.name; - const p = this.parent; - if (!p) { - return (this.#relativePosix = this.fullpathPosix()); - } - const pv = p.relativePosix(); - return pv + (!pv || !p.parent ? '' : '/') + name; - } - /** - * The fully resolved path string for this Path entry - */ - fullpath() { - if (this.#fullpath !== undefined) { - return this.#fullpath; - } - const name = this.name; - const p = this.parent; - if (!p) { - return (this.#fullpath = this.name); - } - const pv = p.fullpath(); - const fp = pv + (!p.parent ? '' : this.sep) + name; - return (this.#fullpath = fp); - } - /** - * On platforms other than windows, this is identical to fullpath. - * - * On windows, this is overridden to return the forward-slash form of the - * full UNC path. - */ - fullpathPosix() { - if (this.#fullpathPosix !== undefined) - return this.#fullpathPosix; - if (this.sep === '/') - return (this.#fullpathPosix = this.fullpath()); - if (!this.parent) { - const p = this.fullpath().replace(/\\/g, '/'); - if (/^[a-z]:\//i.test(p)) { - return (this.#fullpathPosix = `//?/${p}`); - } - else { - return (this.#fullpathPosix = p); - } - } - const p = this.parent; - const pfpp = p.fullpathPosix(); - const fpp = pfpp + (!pfpp || !p.parent ? '' : '/') + this.name; - return (this.#fullpathPosix = fpp); - } - /** - * Is the Path of an unknown type? - * - * Note that we might know *something* about it if there has been a previous - * filesystem operation, for example that it does not exist, or is not a - * link, or whether it has child entries. - */ - isUnknown() { - return (this.#type & IFMT) === UNKNOWN; - } - isType(type) { - return this[`is${type}`](); - } - getType() { - return (this.isUnknown() ? 'Unknown' - : this.isDirectory() ? 'Directory' - : this.isFile() ? 'File' - : this.isSymbolicLink() ? 'SymbolicLink' - : this.isFIFO() ? 'FIFO' - : this.isCharacterDevice() ? 'CharacterDevice' - : this.isBlockDevice() ? 'BlockDevice' - : /* c8 ignore start */ this.isSocket() ? 'Socket' - : 'Unknown'); - /* c8 ignore stop */ - } - /** - * Is the Path a regular file? - */ - isFile() { - return (this.#type & IFMT) === IFREG; - } - /** - * Is the Path a directory? - */ - isDirectory() { - return (this.#type & IFMT) === IFDIR; - } - /** - * Is the path a character device? - */ - isCharacterDevice() { - return (this.#type & IFMT) === IFCHR; - } - /** - * Is the path a block device? - */ - isBlockDevice() { - return (this.#type & IFMT) === IFBLK; - } - /** - * Is the path a FIFO pipe? - */ - isFIFO() { - return (this.#type & IFMT) === IFIFO; - } - /** - * Is the path a socket? - */ - isSocket() { - return (this.#type & IFMT) === IFSOCK; - } - /** - * Is the path a symbolic link? - */ - isSymbolicLink() { - return (this.#type & IFLNK) === IFLNK; - } - /** - * Return the entry if it has been subject of a successful lstat, or - * undefined otherwise. - * - * Does not read the filesystem, so an undefined result *could* simply - * mean that we haven't called lstat on it. - */ - lstatCached() { - return this.#type & LSTAT_CALLED ? this : undefined; - } - /** - * Return the cached link target if the entry has been the subject of a - * successful readlink, or undefined otherwise. - * - * Does not read the filesystem, so an undefined result *could* just mean we - * don't have any cached data. Only use it if you are very sure that a - * readlink() has been called at some point. - */ - readlinkCached() { - return this.#linkTarget; - } - /** - * Returns the cached realpath target if the entry has been the subject - * of a successful realpath, or undefined otherwise. - * - * Does not read the filesystem, so an undefined result *could* just mean we - * don't have any cached data. Only use it if you are very sure that a - * realpath() has been called at some point. - */ - realpathCached() { - return this.#realpath; - } - /** - * Returns the cached child Path entries array if the entry has been the - * subject of a successful readdir(), or [] otherwise. - * - * Does not read the filesystem, so an empty array *could* just mean we - * don't have any cached data. Only use it if you are very sure that a - * readdir() has been called recently enough to still be valid. - */ - readdirCached() { - const children = this.children(); - return children.slice(0, children.provisional); - } - /** - * Return true if it's worth trying to readlink. Ie, we don't (yet) have - * any indication that readlink will definitely fail. - * - * Returns false if the path is known to not be a symlink, if a previous - * readlink failed, or if the entry does not exist. - */ - canReadlink() { - if (this.#linkTarget) - return true; - if (!this.parent) - return false; - // cases where it cannot possibly succeed - const ifmt = this.#type & IFMT; - return !((ifmt !== UNKNOWN && ifmt !== IFLNK) || - this.#type & ENOREADLINK || - this.#type & ENOENT); - } - /** - * Return true if readdir has previously been successfully called on this - * path, indicating that cachedReaddir() is likely valid. - */ - calledReaddir() { - return !!(this.#type & READDIR_CALLED); - } - /** - * Returns true if the path is known to not exist. That is, a previous lstat - * or readdir failed to verify its existence when that would have been - * expected, or a parent entry was marked either enoent or enotdir. - */ - isENOENT() { - return !!(this.#type & ENOENT); - } - /** - * Return true if the path is a match for the given path name. This handles - * case sensitivity and unicode normalization. - * - * Note: even on case-sensitive systems, it is **not** safe to test the - * equality of the `.name` property to determine whether a given pathname - * matches, due to unicode normalization mismatches. - * - * Always use this method instead of testing the `path.name` property - * directly. - */ - isNamed(n) { - return !this.nocase ? - this.#matchName === normalize(n) - : this.#matchName === normalizeNocase(n); - } - /** - * Return the Path object corresponding to the target of a symbolic link. - * - * If the Path is not a symbolic link, or if the readlink call fails for any - * reason, `undefined` is returned. - * - * Result is cached, and thus may be outdated if the filesystem is mutated. - */ - async readlink() { - const target = this.#linkTarget; - if (target) { - return target; - } - if (!this.canReadlink()) { - return undefined; - } - /* c8 ignore start */ - // already covered by the canReadlink test, here for ts grumples - if (!this.parent) { - return undefined; - } - /* c8 ignore stop */ - try { - const read = await this.#fs.promises.readlink(this.fullpath()); - const linkTarget = (await this.parent.realpath())?.resolve(read); - if (linkTarget) { - return (this.#linkTarget = linkTarget); - } - } - catch (er) { - this.#readlinkFail(er.code); - return undefined; - } - } - /** - * Synchronous {@link PathBase.readlink} - */ - readlinkSync() { - const target = this.#linkTarget; - if (target) { - return target; - } - if (!this.canReadlink()) { - return undefined; - } - /* c8 ignore start */ - // already covered by the canReadlink test, here for ts grumples - if (!this.parent) { - return undefined; - } - /* c8 ignore stop */ - try { - const read = this.#fs.readlinkSync(this.fullpath()); - const linkTarget = this.parent.realpathSync()?.resolve(read); - if (linkTarget) { - return (this.#linkTarget = linkTarget); - } - } - catch (er) { - this.#readlinkFail(er.code); - return undefined; - } - } - #readdirSuccess(children) { - // succeeded, mark readdir called bit - this.#type |= READDIR_CALLED; - // mark all remaining provisional children as ENOENT - for (let p = children.provisional; p < children.length; p++) { - const c = children[p]; - if (c) - c.#markENOENT(); - } - } - #markENOENT() { - // mark as UNKNOWN and ENOENT - if (this.#type & ENOENT) - return; - this.#type = (this.#type | ENOENT) & IFMT_UNKNOWN; - this.#markChildrenENOENT(); - } - #markChildrenENOENT() { - // all children are provisional and do not exist - const children = this.children(); - children.provisional = 0; - for (const p of children) { - p.#markENOENT(); - } - } - #markENOREALPATH() { - this.#type |= ENOREALPATH; - this.#markENOTDIR(); - } - // save the information when we know the entry is not a dir - #markENOTDIR() { - // entry is not a directory, so any children can't exist. - // this *should* be impossible, since any children created - // after it's been marked ENOTDIR should be marked ENOENT, - // so it won't even get to this point. - /* c8 ignore start */ - if (this.#type & ENOTDIR) - return; - /* c8 ignore stop */ - let t = this.#type; - // this could happen if we stat a dir, then delete it, - // then try to read it or one of its children. - if ((t & IFMT) === IFDIR) - t &= IFMT_UNKNOWN; - this.#type = t | ENOTDIR; - this.#markChildrenENOENT(); - } - #readdirFail(code = '') { - // markENOTDIR and markENOENT also set provisional=0 - if (code === 'ENOTDIR' || code === 'EPERM') { - this.#markENOTDIR(); - } - else if (code === 'ENOENT') { - this.#markENOENT(); - } - else { - this.children().provisional = 0; - } - } - #lstatFail(code = '') { - // Windows just raises ENOENT in this case, disable for win CI - /* c8 ignore start */ - if (code === 'ENOTDIR') { - // already know it has a parent by this point - const p = this.parent; - p.#markENOTDIR(); - } - else if (code === 'ENOENT') { - /* c8 ignore stop */ - this.#markENOENT(); - } - } - #readlinkFail(code = '') { - let ter = this.#type; - ter |= ENOREADLINK; - if (code === 'ENOENT') - ter |= ENOENT; - // windows gets a weird error when you try to readlink a file - if (code === 'EINVAL' || code === 'UNKNOWN') { - // exists, but not a symlink, we don't know WHAT it is, so remove - // all IFMT bits. - ter &= IFMT_UNKNOWN; - } - this.#type = ter; - // windows just gets ENOENT in this case. We do cover the case, - // just disabled because it's impossible on Windows CI - /* c8 ignore start */ - if (code === 'ENOTDIR' && this.parent) { - this.parent.#markENOTDIR(); - } - /* c8 ignore stop */ - } - #readdirAddChild(e, c) { - return (this.#readdirMaybePromoteChild(e, c) || - this.#readdirAddNewChild(e, c)); - } - #readdirAddNewChild(e, c) { - // alloc new entry at head, so it's never provisional - const type = entToType(e); - const child = this.newChild(e.name, type, { parent: this }); - const ifmt = child.#type & IFMT; - if (ifmt !== IFDIR && ifmt !== IFLNK && ifmt !== UNKNOWN) { - child.#type |= ENOTDIR; - } - c.unshift(child); - c.provisional++; - return child; - } - #readdirMaybePromoteChild(e, c) { - for (let p = c.provisional; p < c.length; p++) { - const pchild = c[p]; - const name = this.nocase ? normalizeNocase(e.name) : normalize(e.name); - if (name !== pchild.#matchName) { - continue; - } - return this.#readdirPromoteChild(e, pchild, p, c); - } - } - #readdirPromoteChild(e, p, index, c) { - const v = p.name; - // retain any other flags, but set ifmt from dirent - p.#type = (p.#type & IFMT_UNKNOWN) | entToType(e); - // case sensitivity fixing when we learn the true name. - if (v !== e.name) - p.name = e.name; - // just advance provisional index (potentially off the list), - // otherwise we have to splice/pop it out and re-insert at head - if (index !== c.provisional) { - if (index === c.length - 1) - c.pop(); - else - c.splice(index, 1); - c.unshift(p); - } - c.provisional++; - return p; - } - /** - * Call lstat() on this Path, and update all known information that can be - * determined. - * - * Note that unlike `fs.lstat()`, the returned value does not contain some - * information, such as `mode`, `dev`, `nlink`, and `ino`. If that - * information is required, you will need to call `fs.lstat` yourself. - * - * If the Path refers to a nonexistent file, or if the lstat call fails for - * any reason, `undefined` is returned. Otherwise the updated Path object is - * returned. - * - * Results are cached, and thus may be out of date if the filesystem is - * mutated. - */ - async lstat() { - if ((this.#type & ENOENT) === 0) { - try { - this.#applyStat(await this.#fs.promises.lstat(this.fullpath())); - return this; - } - catch (er) { - this.#lstatFail(er.code); - } - } - } - /** - * synchronous {@link PathBase.lstat} - */ - lstatSync() { - if ((this.#type & ENOENT) === 0) { - try { - this.#applyStat(this.#fs.lstatSync(this.fullpath())); - return this; - } - catch (er) { - this.#lstatFail(er.code); - } - } - } - #applyStat(st) { - const { atime, atimeMs, birthtime, birthtimeMs, blksize, blocks, ctime, ctimeMs, dev, gid, ino, mode, mtime, mtimeMs, nlink, rdev, size, uid, } = st; - this.#atime = atime; - this.#atimeMs = atimeMs; - this.#birthtime = birthtime; - this.#birthtimeMs = birthtimeMs; - this.#blksize = blksize; - this.#blocks = blocks; - this.#ctime = ctime; - this.#ctimeMs = ctimeMs; - this.#dev = dev; - this.#gid = gid; - this.#ino = ino; - this.#mode = mode; - this.#mtime = mtime; - this.#mtimeMs = mtimeMs; - this.#nlink = nlink; - this.#rdev = rdev; - this.#size = size; - this.#uid = uid; - const ifmt = entToType(st); - // retain any other flags, but set the ifmt - this.#type = (this.#type & IFMT_UNKNOWN) | ifmt | LSTAT_CALLED; - if (ifmt !== UNKNOWN && ifmt !== IFDIR && ifmt !== IFLNK) { - this.#type |= ENOTDIR; - } - } - #onReaddirCB = []; - #readdirCBInFlight = false; - #callOnReaddirCB(children) { - this.#readdirCBInFlight = false; - const cbs = this.#onReaddirCB.slice(); - this.#onReaddirCB.length = 0; - cbs.forEach(cb => cb(null, children)); - } - /** - * Standard node-style callback interface to get list of directory entries. - * - * If the Path cannot or does not contain any children, then an empty array - * is returned. - * - * Results are cached, and thus may be out of date if the filesystem is - * mutated. - * - * @param cb The callback called with (er, entries). Note that the `er` - * param is somewhat extraneous, as all readdir() errors are handled and - * simply result in an empty set of entries being returned. - * @param allowZalgo Boolean indicating that immediately known results should - * *not* be deferred with `queueMicrotask`. Defaults to `false`. Release - * zalgo at your peril, the dark pony lord is devious and unforgiving. - */ - readdirCB(cb, allowZalgo = false) { - if (!this.canReaddir()) { - if (allowZalgo) - cb(null, []); - else - queueMicrotask(() => cb(null, [])); - return; - } - const children = this.children(); - if (this.calledReaddir()) { - const c = children.slice(0, children.provisional); - if (allowZalgo) - cb(null, c); - else - queueMicrotask(() => cb(null, c)); - return; - } - // don't have to worry about zalgo at this point. - this.#onReaddirCB.push(cb); - if (this.#readdirCBInFlight) { - return; - } - this.#readdirCBInFlight = true; - // else read the directory, fill up children - // de-provisionalize any provisional children. - const fullpath = this.fullpath(); - this.#fs.readdir(fullpath, { withFileTypes: true }, (er, entries) => { - if (er) { - this.#readdirFail(er.code); - children.provisional = 0; - } - else { - // if we didn't get an error, we always get entries. - //@ts-ignore - for (const e of entries) { - this.#readdirAddChild(e, children); - } - this.#readdirSuccess(children); - } - this.#callOnReaddirCB(children.slice(0, children.provisional)); - return; - }); - } - #asyncReaddirInFlight; - /** - * Return an array of known child entries. - * - * If the Path cannot or does not contain any children, then an empty array - * is returned. - * - * Results are cached, and thus may be out of date if the filesystem is - * mutated. - */ - async readdir() { - if (!this.canReaddir()) { - return []; - } - const children = this.children(); - if (this.calledReaddir()) { - return children.slice(0, children.provisional); - } - // else read the directory, fill up children - // de-provisionalize any provisional children. - const fullpath = this.fullpath(); - if (this.#asyncReaddirInFlight) { - await this.#asyncReaddirInFlight; - } - else { - /* c8 ignore start */ - let resolve = () => { }; - /* c8 ignore stop */ - this.#asyncReaddirInFlight = new Promise(res => (resolve = res)); - try { - for (const e of await this.#fs.promises.readdir(fullpath, { - withFileTypes: true, - })) { - this.#readdirAddChild(e, children); - } - this.#readdirSuccess(children); - } - catch (er) { - this.#readdirFail(er.code); - children.provisional = 0; - } - this.#asyncReaddirInFlight = undefined; - resolve(); - } - return children.slice(0, children.provisional); - } - /** - * synchronous {@link PathBase.readdir} - */ - readdirSync() { - if (!this.canReaddir()) { - return []; - } - const children = this.children(); - if (this.calledReaddir()) { - return children.slice(0, children.provisional); - } - // else read the directory, fill up children - // de-provisionalize any provisional children. - const fullpath = this.fullpath(); - try { - for (const e of this.#fs.readdirSync(fullpath, { - withFileTypes: true, - })) { - this.#readdirAddChild(e, children); - } - this.#readdirSuccess(children); - } - catch (er) { - this.#readdirFail(er.code); - children.provisional = 0; - } - return children.slice(0, children.provisional); - } - canReaddir() { - if (this.#type & ENOCHILD) - return false; - const ifmt = IFMT & this.#type; - // we always set ENOTDIR when setting IFMT, so should be impossible - /* c8 ignore start */ - if (!(ifmt === UNKNOWN || ifmt === IFDIR || ifmt === IFLNK)) { - return false; - } - /* c8 ignore stop */ - return true; - } - shouldWalk(dirs, walkFilter) { - return ((this.#type & IFDIR) === IFDIR && - !(this.#type & ENOCHILD) && - !dirs.has(this) && - (!walkFilter || walkFilter(this))); - } - /** - * Return the Path object corresponding to path as resolved - * by realpath(3). - * - * If the realpath call fails for any reason, `undefined` is returned. - * - * Result is cached, and thus may be outdated if the filesystem is mutated. - * On success, returns a Path object. - */ - async realpath() { - if (this.#realpath) - return this.#realpath; - if ((ENOREALPATH | ENOREADLINK | ENOENT) & this.#type) - return undefined; - try { - const rp = await this.#fs.promises.realpath(this.fullpath()); - return (this.#realpath = this.resolve(rp)); - } - catch (_) { - this.#markENOREALPATH(); - } - } - /** - * Synchronous {@link realpath} - */ - realpathSync() { - if (this.#realpath) - return this.#realpath; - if ((ENOREALPATH | ENOREADLINK | ENOENT) & this.#type) - return undefined; - try { - const rp = this.#fs.realpathSync(this.fullpath()); - return (this.#realpath = this.resolve(rp)); - } - catch (_) { - this.#markENOREALPATH(); - } - } - /** - * Internal method to mark this Path object as the scurry cwd, - * called by {@link PathScurry#chdir} - * - * @internal - */ - [setAsCwd](oldCwd) { - if (oldCwd === this) - return; - oldCwd.isCWD = false; - this.isCWD = true; - const changed = new Set([]); - let rp = []; - let p = this; - while (p && p.parent) { - changed.add(p); - p.#relative = rp.join(this.sep); - p.#relativePosix = rp.join('/'); - p = p.parent; - rp.push('..'); - } - // now un-memoize parents of old cwd - p = oldCwd; - while (p && p.parent && !changed.has(p)) { - p.#relative = undefined; - p.#relativePosix = undefined; - p = p.parent; - } - } -} -/** - * Path class used on win32 systems - * - * Uses `'\\'` as the path separator for returned paths, either `'\\'` or `'/'` - * as the path separator for parsing paths. - */ -export class PathWin32 extends PathBase { - /** - * Separator for generating path strings. - */ - sep = '\\'; - /** - * Separator for parsing path strings. - */ - splitSep = eitherSep; - /** - * Do not create new Path objects directly. They should always be accessed - * via the PathScurry class or other methods on the Path class. - * - * @internal - */ - constructor(name, type = UNKNOWN, root, roots, nocase, children, opts) { - super(name, type, root, roots, nocase, children, opts); - } - /** - * @internal - */ - newChild(name, type = UNKNOWN, opts = {}) { - return new PathWin32(name, type, this.root, this.roots, this.nocase, this.childrenCache(), opts); - } - /** - * @internal - */ - getRootString(path) { - return win32.parse(path).root; - } - /** - * @internal - */ - getRoot(rootPath) { - rootPath = uncToDrive(rootPath.toUpperCase()); - if (rootPath === this.root.name) { - return this.root; - } - // ok, not that one, check if it matches another we know about - for (const [compare, root] of Object.entries(this.roots)) { - if (this.sameRoot(rootPath, compare)) { - return (this.roots[rootPath] = root); - } - } - // otherwise, have to create a new one. - return (this.roots[rootPath] = new PathScurryWin32(rootPath, this).root); - } - /** - * @internal - */ - sameRoot(rootPath, compare = this.root.name) { - // windows can (rarely) have case-sensitive filesystem, but - // UNC and drive letters are always case-insensitive, and canonically - // represented uppercase. - rootPath = rootPath - .toUpperCase() - .replace(/\//g, '\\') - .replace(uncDriveRegexp, '$1\\'); - return rootPath === compare; - } -} -/** - * Path class used on all posix systems. - * - * Uses `'/'` as the path separator. - */ -export class PathPosix extends PathBase { - /** - * separator for parsing path strings - */ - splitSep = '/'; - /** - * separator for generating path strings - */ - sep = '/'; - /** - * Do not create new Path objects directly. They should always be accessed - * via the PathScurry class or other methods on the Path class. - * - * @internal - */ - constructor(name, type = UNKNOWN, root, roots, nocase, children, opts) { - super(name, type, root, roots, nocase, children, opts); - } - /** - * @internal - */ - getRootString(path) { - return path.startsWith('/') ? '/' : ''; - } - /** - * @internal - */ - getRoot(_rootPath) { - return this.root; - } - /** - * @internal - */ - newChild(name, type = UNKNOWN, opts = {}) { - return new PathPosix(name, type, this.root, this.roots, this.nocase, this.childrenCache(), opts); - } -} -/** - * The base class for all PathScurry classes, providing the interface for path - * resolution and filesystem operations. - * - * Typically, you should *not* instantiate this class directly, but rather one - * of the platform-specific classes, or the exported {@link PathScurry} which - * defaults to the current platform. - */ -export class PathScurryBase { - /** - * The root Path entry for the current working directory of this Scurry - */ - root; - /** - * The string path for the root of this Scurry's current working directory - */ - rootPath; - /** - * A collection of all roots encountered, referenced by rootPath - */ - roots; - /** - * The Path entry corresponding to this PathScurry's current working directory. - */ - cwd; - #resolveCache; - #resolvePosixCache; - #children; - /** - * Perform path comparisons case-insensitively. - * - * Defaults true on Darwin and Windows systems, false elsewhere. - */ - nocase; - #fs; - /** - * This class should not be instantiated directly. - * - * Use PathScurryWin32, PathScurryDarwin, PathScurryPosix, or PathScurry - * - * @internal - */ - constructor(cwd = process.cwd(), pathImpl, sep, { nocase, childrenCacheSize = 16 * 1024, fs = defaultFS, } = {}) { - this.#fs = fsFromOption(fs); - if (cwd instanceof URL || cwd.startsWith('file://')) { - cwd = fileURLToPath(cwd); - } - // resolve and split root, and then add to the store. - // this is the only time we call path.resolve() - const cwdPath = pathImpl.resolve(cwd); - this.roots = Object.create(null); - this.rootPath = this.parseRootPath(cwdPath); - this.#resolveCache = new ResolveCache(); - this.#resolvePosixCache = new ResolveCache(); - this.#children = new ChildrenCache(childrenCacheSize); - const split = cwdPath.substring(this.rootPath.length).split(sep); - // resolve('/') leaves '', splits to [''], we don't want that. - if (split.length === 1 && !split[0]) { - split.pop(); - } - /* c8 ignore start */ - if (nocase === undefined) { - throw new TypeError('must provide nocase setting to PathScurryBase ctor'); - } - /* c8 ignore stop */ - this.nocase = nocase; - this.root = this.newRoot(this.#fs); - this.roots[this.rootPath] = this.root; - let prev = this.root; - let len = split.length - 1; - const joinSep = pathImpl.sep; - let abs = this.rootPath; - let sawFirst = false; - for (const part of split) { - const l = len--; - prev = prev.child(part, { - relative: new Array(l).fill('..').join(joinSep), - relativePosix: new Array(l).fill('..').join('/'), - fullpath: (abs += (sawFirst ? '' : joinSep) + part), - }); - sawFirst = true; - } - this.cwd = prev; - } - /** - * Get the depth of a provided path, string, or the cwd - */ - depth(path = this.cwd) { - if (typeof path === 'string') { - path = this.cwd.resolve(path); - } - return path.depth(); - } - /** - * Return the cache of child entries. Exposed so subclasses can create - * child Path objects in a platform-specific way. - * - * @internal - */ - childrenCache() { - return this.#children; - } - /** - * Resolve one or more path strings to a resolved string - * - * Same interface as require('path').resolve. - * - * Much faster than path.resolve() when called multiple times for the same - * path, because the resolved Path objects are cached. Much slower - * otherwise. - */ - resolve(...paths) { - // first figure out the minimum number of paths we have to test - // we always start at cwd, but any absolutes will bump the start - let r = ''; - for (let i = paths.length - 1; i >= 0; i--) { - const p = paths[i]; - if (!p || p === '.') - continue; - r = r ? `${p}/${r}` : p; - if (this.isAbsolute(p)) { - break; - } - } - const cached = this.#resolveCache.get(r); - if (cached !== undefined) { - return cached; - } - const result = this.cwd.resolve(r).fullpath(); - this.#resolveCache.set(r, result); - return result; - } - /** - * Resolve one or more path strings to a resolved string, returning - * the posix path. Identical to .resolve() on posix systems, but on - * windows will return a forward-slash separated UNC path. - * - * Same interface as require('path').resolve. - * - * Much faster than path.resolve() when called multiple times for the same - * path, because the resolved Path objects are cached. Much slower - * otherwise. - */ - resolvePosix(...paths) { - // first figure out the minimum number of paths we have to test - // we always start at cwd, but any absolutes will bump the start - let r = ''; - for (let i = paths.length - 1; i >= 0; i--) { - const p = paths[i]; - if (!p || p === '.') - continue; - r = r ? `${p}/${r}` : p; - if (this.isAbsolute(p)) { - break; - } - } - const cached = this.#resolvePosixCache.get(r); - if (cached !== undefined) { - return cached; - } - const result = this.cwd.resolve(r).fullpathPosix(); - this.#resolvePosixCache.set(r, result); - return result; - } - /** - * find the relative path from the cwd to the supplied path string or entry - */ - relative(entry = this.cwd) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - return entry.relative(); - } - /** - * find the relative path from the cwd to the supplied path string or - * entry, using / as the path delimiter, even on Windows. - */ - relativePosix(entry = this.cwd) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - return entry.relativePosix(); - } - /** - * Return the basename for the provided string or Path object - */ - basename(entry = this.cwd) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - return entry.name; - } - /** - * Return the dirname for the provided string or Path object - */ - dirname(entry = this.cwd) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - return (entry.parent || entry).fullpath(); - } - async readdir(entry = this.cwd, opts = { - withFileTypes: true, - }) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - else if (!(entry instanceof PathBase)) { - opts = entry; - entry = this.cwd; - } - const { withFileTypes } = opts; - if (!entry.canReaddir()) { - return []; - } - else { - const p = await entry.readdir(); - return withFileTypes ? p : p.map(e => e.name); - } - } - readdirSync(entry = this.cwd, opts = { - withFileTypes: true, - }) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - else if (!(entry instanceof PathBase)) { - opts = entry; - entry = this.cwd; - } - const { withFileTypes = true } = opts; - if (!entry.canReaddir()) { - return []; - } - else if (withFileTypes) { - return entry.readdirSync(); - } - else { - return entry.readdirSync().map(e => e.name); - } - } - /** - * Call lstat() on the string or Path object, and update all known - * information that can be determined. - * - * Note that unlike `fs.lstat()`, the returned value does not contain some - * information, such as `mode`, `dev`, `nlink`, and `ino`. If that - * information is required, you will need to call `fs.lstat` yourself. - * - * If the Path refers to a nonexistent file, or if the lstat call fails for - * any reason, `undefined` is returned. Otherwise the updated Path object is - * returned. - * - * Results are cached, and thus may be out of date if the filesystem is - * mutated. - */ - async lstat(entry = this.cwd) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - return entry.lstat(); - } - /** - * synchronous {@link PathScurryBase.lstat} - */ - lstatSync(entry = this.cwd) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - return entry.lstatSync(); - } - async readlink(entry = this.cwd, { withFileTypes } = { - withFileTypes: false, - }) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - else if (!(entry instanceof PathBase)) { - withFileTypes = entry.withFileTypes; - entry = this.cwd; - } - const e = await entry.readlink(); - return withFileTypes ? e : e?.fullpath(); - } - readlinkSync(entry = this.cwd, { withFileTypes } = { - withFileTypes: false, - }) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - else if (!(entry instanceof PathBase)) { - withFileTypes = entry.withFileTypes; - entry = this.cwd; - } - const e = entry.readlinkSync(); - return withFileTypes ? e : e?.fullpath(); - } - async realpath(entry = this.cwd, { withFileTypes } = { - withFileTypes: false, - }) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - else if (!(entry instanceof PathBase)) { - withFileTypes = entry.withFileTypes; - entry = this.cwd; - } - const e = await entry.realpath(); - return withFileTypes ? e : e?.fullpath(); - } - realpathSync(entry = this.cwd, { withFileTypes } = { - withFileTypes: false, - }) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - else if (!(entry instanceof PathBase)) { - withFileTypes = entry.withFileTypes; - entry = this.cwd; - } - const e = entry.realpathSync(); - return withFileTypes ? e : e?.fullpath(); - } - async walk(entry = this.cwd, opts = {}) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - else if (!(entry instanceof PathBase)) { - opts = entry; - entry = this.cwd; - } - const { withFileTypes = true, follow = false, filter, walkFilter, } = opts; - const results = []; - if (!filter || filter(entry)) { - results.push(withFileTypes ? entry : entry.fullpath()); - } - const dirs = new Set(); - const walk = (dir, cb) => { - dirs.add(dir); - dir.readdirCB((er, entries) => { - /* c8 ignore start */ - if (er) { - return cb(er); - } - /* c8 ignore stop */ - let len = entries.length; - if (!len) - return cb(); - const next = () => { - if (--len === 0) { - cb(); - } - }; - for (const e of entries) { - if (!filter || filter(e)) { - results.push(withFileTypes ? e : e.fullpath()); - } - if (follow && e.isSymbolicLink()) { - e.realpath() - .then(r => (r?.isUnknown() ? r.lstat() : r)) - .then(r => r?.shouldWalk(dirs, walkFilter) ? walk(r, next) : next()); - } - else { - if (e.shouldWalk(dirs, walkFilter)) { - walk(e, next); - } - else { - next(); - } - } - } - }, true); // zalgooooooo - }; - const start = entry; - return new Promise((res, rej) => { - walk(start, er => { - /* c8 ignore start */ - if (er) - return rej(er); - /* c8 ignore stop */ - res(results); - }); - }); - } - walkSync(entry = this.cwd, opts = {}) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - else if (!(entry instanceof PathBase)) { - opts = entry; - entry = this.cwd; - } - const { withFileTypes = true, follow = false, filter, walkFilter, } = opts; - const results = []; - if (!filter || filter(entry)) { - results.push(withFileTypes ? entry : entry.fullpath()); - } - const dirs = new Set([entry]); - for (const dir of dirs) { - const entries = dir.readdirSync(); - for (const e of entries) { - if (!filter || filter(e)) { - results.push(withFileTypes ? e : e.fullpath()); - } - let r = e; - if (e.isSymbolicLink()) { - if (!(follow && (r = e.realpathSync()))) - continue; - if (r.isUnknown()) - r.lstatSync(); - } - if (r.shouldWalk(dirs, walkFilter)) { - dirs.add(r); - } - } - } - return results; - } - /** - * Support for `for await` - * - * Alias for {@link PathScurryBase.iterate} - * - * Note: As of Node 19, this is very slow, compared to other methods of - * walking. Consider using {@link PathScurryBase.stream} if memory overhead - * and backpressure are concerns, or {@link PathScurryBase.walk} if not. - */ - [Symbol.asyncIterator]() { - return this.iterate(); - } - iterate(entry = this.cwd, options = {}) { - // iterating async over the stream is significantly more performant, - // especially in the warm-cache scenario, because it buffers up directory - // entries in the background instead of waiting for a yield for each one. - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - else if (!(entry instanceof PathBase)) { - options = entry; - entry = this.cwd; - } - return this.stream(entry, options)[Symbol.asyncIterator](); - } - /** - * Iterating over a PathScurry performs a synchronous walk. - * - * Alias for {@link PathScurryBase.iterateSync} - */ - [Symbol.iterator]() { - return this.iterateSync(); - } - *iterateSync(entry = this.cwd, opts = {}) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - else if (!(entry instanceof PathBase)) { - opts = entry; - entry = this.cwd; - } - const { withFileTypes = true, follow = false, filter, walkFilter, } = opts; - if (!filter || filter(entry)) { - yield withFileTypes ? entry : entry.fullpath(); - } - const dirs = new Set([entry]); - for (const dir of dirs) { - const entries = dir.readdirSync(); - for (const e of entries) { - if (!filter || filter(e)) { - yield withFileTypes ? e : e.fullpath(); - } - let r = e; - if (e.isSymbolicLink()) { - if (!(follow && (r = e.realpathSync()))) - continue; - if (r.isUnknown()) - r.lstatSync(); - } - if (r.shouldWalk(dirs, walkFilter)) { - dirs.add(r); - } - } - } - } - stream(entry = this.cwd, opts = {}) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - else if (!(entry instanceof PathBase)) { - opts = entry; - entry = this.cwd; - } - const { withFileTypes = true, follow = false, filter, walkFilter, } = opts; - const results = new Minipass({ objectMode: true }); - if (!filter || filter(entry)) { - results.write(withFileTypes ? entry : entry.fullpath()); - } - const dirs = new Set(); - const queue = [entry]; - let processing = 0; - const process = () => { - let paused = false; - while (!paused) { - const dir = queue.shift(); - if (!dir) { - if (processing === 0) - results.end(); - return; - } - processing++; - dirs.add(dir); - const onReaddir = (er, entries, didRealpaths = false) => { - /* c8 ignore start */ - if (er) - return results.emit('error', er); - /* c8 ignore stop */ - if (follow && !didRealpaths) { - const promises = []; - for (const e of entries) { - if (e.isSymbolicLink()) { - promises.push(e - .realpath() - .then((r) => r?.isUnknown() ? r.lstat() : r)); - } - } - if (promises.length) { - Promise.all(promises).then(() => onReaddir(null, entries, true)); - return; - } - } - for (const e of entries) { - if (e && (!filter || filter(e))) { - if (!results.write(withFileTypes ? e : e.fullpath())) { - paused = true; - } - } - } - processing--; - for (const e of entries) { - const r = e.realpathCached() || e; - if (r.shouldWalk(dirs, walkFilter)) { - queue.push(r); - } - } - if (paused && !results.flowing) { - results.once('drain', process); - } - else if (!sync) { - process(); - } - }; - // zalgo containment - let sync = true; - dir.readdirCB(onReaddir, true); - sync = false; - } - }; - process(); - return results; - } - streamSync(entry = this.cwd, opts = {}) { - if (typeof entry === 'string') { - entry = this.cwd.resolve(entry); - } - else if (!(entry instanceof PathBase)) { - opts = entry; - entry = this.cwd; - } - const { withFileTypes = true, follow = false, filter, walkFilter, } = opts; - const results = new Minipass({ objectMode: true }); - const dirs = new Set(); - if (!filter || filter(entry)) { - results.write(withFileTypes ? entry : entry.fullpath()); - } - const queue = [entry]; - let processing = 0; - const process = () => { - let paused = false; - while (!paused) { - const dir = queue.shift(); - if (!dir) { - if (processing === 0) - results.end(); - return; - } - processing++; - dirs.add(dir); - const entries = dir.readdirSync(); - for (const e of entries) { - if (!filter || filter(e)) { - if (!results.write(withFileTypes ? e : e.fullpath())) { - paused = true; - } - } - } - processing--; - for (const e of entries) { - let r = e; - if (e.isSymbolicLink()) { - if (!(follow && (r = e.realpathSync()))) - continue; - if (r.isUnknown()) - r.lstatSync(); - } - if (r.shouldWalk(dirs, walkFilter)) { - queue.push(r); - } - } - } - if (paused && !results.flowing) - results.once('drain', process); - }; - process(); - return results; - } - chdir(path = this.cwd) { - const oldCwd = this.cwd; - this.cwd = typeof path === 'string' ? this.cwd.resolve(path) : path; - this.cwd[setAsCwd](oldCwd); - } -} -/** - * Windows implementation of {@link PathScurryBase} - * - * Defaults to case insensitve, uses `'\\'` to generate path strings. Uses - * {@link PathWin32} for Path objects. - */ -export class PathScurryWin32 extends PathScurryBase { - /** - * separator for generating path strings - */ - sep = '\\'; - constructor(cwd = process.cwd(), opts = {}) { - const { nocase = true } = opts; - super(cwd, win32, '\\', { ...opts, nocase }); - this.nocase = nocase; - for (let p = this.cwd; p; p = p.parent) { - p.nocase = this.nocase; - } - } - /** - * @internal - */ - parseRootPath(dir) { - // if the path starts with a single separator, it's not a UNC, and we'll - // just get separator as the root, and driveFromUNC will return \ - // In that case, mount \ on the root from the cwd. - return win32.parse(dir).root.toUpperCase(); - } - /** - * @internal - */ - newRoot(fs) { - return new PathWin32(this.rootPath, IFDIR, undefined, this.roots, this.nocase, this.childrenCache(), { fs }); - } - /** - * Return true if the provided path string is an absolute path - */ - isAbsolute(p) { - return (p.startsWith('/') || p.startsWith('\\') || /^[a-z]:(\/|\\)/i.test(p)); - } -} -/** - * {@link PathScurryBase} implementation for all posix systems other than Darwin. - * - * Defaults to case-sensitive matching, uses `'/'` to generate path strings. - * - * Uses {@link PathPosix} for Path objects. - */ -export class PathScurryPosix extends PathScurryBase { - /** - * separator for generating path strings - */ - sep = '/'; - constructor(cwd = process.cwd(), opts = {}) { - const { nocase = false } = opts; - super(cwd, posix, '/', { ...opts, nocase }); - this.nocase = nocase; - } - /** - * @internal - */ - parseRootPath(_dir) { - return '/'; - } - /** - * @internal - */ - newRoot(fs) { - return new PathPosix(this.rootPath, IFDIR, undefined, this.roots, this.nocase, this.childrenCache(), { fs }); - } - /** - * Return true if the provided path string is an absolute path - */ - isAbsolute(p) { - return p.startsWith('/'); - } -} -/** - * {@link PathScurryBase} implementation for Darwin (macOS) systems. - * - * Defaults to case-insensitive matching, uses `'/'` for generating path - * strings. - * - * Uses {@link PathPosix} for Path objects. - */ -export class PathScurryDarwin extends PathScurryPosix { - constructor(cwd = process.cwd(), opts = {}) { - const { nocase = true } = opts; - super(cwd, { ...opts, nocase }); - } -} -/** - * Default {@link PathBase} implementation for the current platform. - * - * {@link PathWin32} on Windows systems, {@link PathPosix} on all others. - */ -export const Path = process.platform === 'win32' ? PathWin32 : PathPosix; -/** - * Default {@link PathScurryBase} implementation for the current platform. - * - * {@link PathScurryWin32} on Windows systems, {@link PathScurryDarwin} on - * Darwin (macOS) systems, {@link PathScurryPosix} on all others. - */ -export const PathScurry = process.platform === 'win32' ? PathScurryWin32 - : process.platform === 'darwin' ? PathScurryDarwin - : PathScurryPosix; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/path-scurry/dist/esm/index.js.map b/node_modules/path-scurry/dist/esm/index.js.map deleted file mode 100644 index 7e01bd2..0000000 --- a/node_modules/path-scurry/dist/esm/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EACL,SAAS,EACT,OAAO,IAAI,SAAS,EACpB,WAAW,EACX,YAAY,EACZ,YAAY,IAAI,GAAG,GACpB,MAAM,IAAI,CAAA;AACX,OAAO,KAAK,QAAQ,MAAM,SAAS,CAAA;AAEnC,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,CAAA;AAC/B,yDAAyD;AACzD,8CAA8C;AAE9C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAErE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAqEnC,MAAM,SAAS,GAAY;IACzB,SAAS;IACT,OAAO,EAAE,SAAS;IAClB,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,QAAQ,EAAE;QACR,KAAK;QACL,OAAO;QACP,QAAQ;QACR,QAAQ;KACT;CACF,CAAA;AAED,0DAA0D;AAC1D,MAAM,YAAY,GAAG,CAAC,QAAmB,EAAW,EAAE,CACpD,CAAC,QAAQ,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC5D,SAAS;IACX,CAAC,CAAC;QACE,GAAG,SAAS;QACZ,GAAG,QAAQ;QACX,QAAQ,EAAE;YACR,GAAG,SAAS,CAAC,QAAQ;YACrB,GAAG,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;SAC7B;KACF,CAAA;AAEL,uCAAuC;AACvC,MAAM,cAAc,GAAG,wBAAwB,CAAA;AAC/C,MAAM,UAAU,GAAG,CAAC,QAAgB,EAAU,EAAE,CAC9C,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;AAE/D,+CAA+C;AAC/C,MAAM,SAAS,GAAG,QAAQ,CAAA;AAE1B,MAAM,OAAO,GAAG,CAAC,CAAA,CAAC,sCAAsC;AACxD,MAAM,KAAK,GAAG,MAAM,CAAA;AACpB,MAAM,KAAK,GAAG,MAAM,CAAA;AACpB,MAAM,KAAK,GAAG,MAAM,CAAA;AACpB,MAAM,KAAK,GAAG,MAAM,CAAA;AACpB,MAAM,KAAK,GAAG,MAAM,CAAA;AACpB,MAAM,KAAK,GAAG,MAAM,CAAA;AACpB,MAAM,MAAM,GAAG,MAAM,CAAA;AACrB,MAAM,IAAI,GAAG,MAAM,CAAA;AAYnB,2BAA2B;AAC3B,MAAM,YAAY,GAAG,CAAC,IAAI,CAAA;AAE1B,gEAAgE;AAChE,MAAM,cAAc,GAAG,gBAAgB,CAAA;AACvC,iCAAiC;AACjC,MAAM,YAAY,GAAG,gBAAgB,CAAA;AACrC,kEAAkE;AAClE,MAAM,OAAO,GAAG,gBAAgB,CAAA;AAChC,yDAAyD;AACzD,gEAAgE;AAChE,MAAM,MAAM,GAAG,gBAAgB,CAAA;AAC/B,0EAA0E;AAC1E,6BAA6B;AAC7B,MAAM,WAAW,GAAG,gBAAgB,CAAA;AACpC,sCAAsC;AACtC,MAAM,WAAW,GAAG,gBAAgB,CAAA;AAEpC,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,CAAA;AAC/C,MAAM,QAAQ,GAAG,gBAAgB,CAAA;AAEjC,MAAM,SAAS,GAAG,CAAC,CAAiB,EAAE,EAAE,CACtC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK;IAClB,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK;QACzB,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,KAAK;YAC5B,CAAC,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,KAAK;gBAC/B,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,KAAK;oBAC3B,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM;wBACvB,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK;4BACpB,CAAC,CAAC,OAAO,CAAA;AAEX,+BAA+B;AAC/B,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAA;AAChD,MAAM,SAAS,GAAG,CAAC,CAAS,EAAE,EAAE;IAC9B,MAAM,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAC/B,IAAI,CAAC;QAAE,OAAO,CAAC,CAAA;IACf,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IAC7B,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACxB,OAAO,CAAC,CAAA;AACV,CAAC,CAAA;AAED,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAkB,CAAA;AACtD,MAAM,eAAe,GAAG,CAAC,CAAS,EAAE,EAAE;IACpC,MAAM,CAAC,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IACrC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAA;IACf,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;IACpC,oBAAoB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC9B,OAAO,CAAC,CAAA;AACV,CAAC,CAAA;AAgBD;;;GAGG;AACH,MAAM,OAAO,YAAa,SAAQ,QAAwB;IACxD;QACE,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAA;IACrB,CAAC;CACF;AAED,wEAAwE;AACxE,+EAA+E;AAC/E,yEAAyE;AACzE,+EAA+E;AAC/E,8EAA8E;AAC9E,6EAA6E;AAC7E,2EAA2E;AAC3E,4EAA4E;AAC5E,EAAE;AACF,8EAA8E;AAC9E,sEAAsE;AAEtE;;;GAGG;AACH,MAAM,OAAO,aAAc,SAAQ,QAA4B;IAC7D,YAAY,UAAkB,EAAE,GAAG,IAAI;QACrC,KAAK,CAAC;YACJ,OAAO;YACP,oBAAoB;YACpB,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC;SACnC,CAAC,CAAA;IACJ,CAAC;CACF;AASD,MAAM,QAAQ,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAA;AAE9C;;;;;;;;;;;;GAYG;AACH,MAAM,OAAgB,QAAQ;IAC5B;;;;;;;;OAQG;IACH,IAAI,CAAQ;IACZ;;;;OAIG;IACH,IAAI,CAAU;IACd;;;;OAIG;IACH,KAAK,CAA2B;IAChC;;;;OAIG;IACH,MAAM,CAAW;IACjB;;;OAGG;IACH,MAAM,CAAS;IAEf;;;OAGG;IACH,KAAK,GAAY,KAAK,CAAA;IAYtB,gCAAgC;IAChC,GAAG,CAAS;IAEZ,eAAe;IACf,IAAI,CAAS;IACb,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IACD,KAAK,CAAS;IACd,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IACD,MAAM,CAAS;IACf,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IACD,IAAI,CAAS;IACb,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IACD,IAAI,CAAS;IACb,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IACD,KAAK,CAAS;IACd,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IACD,QAAQ,CAAS;IACjB,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IACD,IAAI,CAAS;IACb,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IACD,KAAK,CAAS;IACd,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IACD,OAAO,CAAS;IAChB,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IACD,QAAQ,CAAS;IACjB,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IACD,QAAQ,CAAS;IACjB,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IACD,QAAQ,CAAS;IACjB,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IACD,YAAY,CAAS;IACrB,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IACD,MAAM,CAAO;IACb,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IACD,MAAM,CAAO;IACb,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IACD,MAAM,CAAO;IACb,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IACD,UAAU,CAAO;IACjB,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAA;IACxB,CAAC;IAED,UAAU,CAAQ;IAClB,MAAM,CAAS;IACf,SAAS,CAAS;IAClB,cAAc,CAAS;IACvB,SAAS,CAAS;IAClB,cAAc,CAAS;IACvB,KAAK,CAAQ;IACb,SAAS,CAAe;IACxB,WAAW,CAAW;IACtB,SAAS,CAAW;IAEpB;;;;;OAKG;IACH,IAAI,UAAU;QACZ,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAA;IACzC,CAAC;IAED;;;OAGG;IACH,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,UAAU,CAAA;IACxB,CAAC;IAED;;;;;OAKG;IACH,YACE,IAAY,EACZ,OAAe,OAAO,EACtB,IAA0B,EAC1B,KAAgC,EAChC,MAAe,EACf,QAAuB,EACvB,IAAc;QAEd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAClE,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,QAAQ,CAAA;QAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,IAAI,CAAA;QACxB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QACzB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC9B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC9B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAA;QACxC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QACzB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAA;QAC5B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAClC,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,MAAM,CAAA;QACjD,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAC1C,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAA;IAChD,CAAC;IAeD;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,IAAa;QACnB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QAC3C,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACzC,MAAM,MAAM,GACV,QAAQ,CAAC,CAAC;YACR,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC;YAChD,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;QAChC,OAAO,MAAM,CAAA;IACf,CAAC;IAED,aAAa,CAAC,QAAkB;QAC9B,IAAI,CAAC,GAAa,IAAI,CAAA;QACtB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACnB,CAAC;QACD,OAAO,CAAC,CAAA;IACV,CAAC;IAED;;;;;;;OAOG;IACH,QAAQ;QACN,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACvC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAA;QACf,CAAC;QACD,MAAM,QAAQ,GAAa,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAA;QAChE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QAClC,IAAI,CAAC,KAAK,IAAI,CAAC,cAAc,CAAA;QAC7B,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,QAAgB,EAAE,IAAe;QACrC,IAAI,QAAQ,KAAK,EAAE,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;YACxC,OAAO,IAAI,CAAA;QACb,CAAC;QACD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,MAAM,IAAI,IAAI,CAAA;QAC5B,CAAC;QAED,iBAAiB;QACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAChC,MAAM,IAAI,GACR,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QAC/D,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,IAAI,CAAC,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;gBAC1B,OAAO,CAAC,CAAA;YACV,CAAC;QACH,CAAC;QAED,+DAA+D;QAC/D,2DAA2D;QAC3D,0BAA0B;QAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;QACrC,MAAM,QAAQ,GACZ,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAA;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE;YAC9C,GAAG,IAAI;YACP,MAAM,EAAE,IAAI;YACZ,QAAQ;SACT,CAAC,CAAA;QAEF,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACvB,MAAM,CAAC,KAAK,IAAI,MAAM,CAAA;QACxB,CAAC;QAED,sEAAsE;QACtE,uEAAuE;QACvE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACrB,OAAO,MAAM,CAAA;IACf,CAAC;IAED;;;OAGG;IACH,QAAQ;QACN,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAA;QACzB,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,SAAS,CAAA;QACvB,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACtB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAA;QACrB,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,OAAO,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;QACrC,CAAC;QACD,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAA;QACvB,OAAO,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;IACvD,CAAC;IAED;;;;;OAKG;IACH,aAAa;QACX,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAA;QAC5C,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAA;QACzB,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,cAAc,CAAA;QACjE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACtB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAA;QACrB,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,OAAO,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,CAAA;QACrD,CAAC;QACD,MAAM,EAAE,GAAG,CAAC,CAAC,aAAa,EAAE,CAAA;QAC5B,OAAO,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;IAClD,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,SAAS,CAAA;QACvB,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACtB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAA;QACrB,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,OAAO,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;QACrC,CAAC;QACD,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAA;QACvB,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;QAClD,OAAO,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,CAAA;IAC9B,CAAC;IAED;;;;;OAKG;IACH,aAAa;QACX,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,cAAc,CAAA;QACjE,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG;YAAE,OAAO,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;QACpE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YAC7C,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,EAAE,CAAC,CAAA;YAC3C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAA;YAClC,CAAC;QACH,CAAC;QACD,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAA;QACrB,MAAM,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,CAAA;QAC9B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAA;QAC9D,OAAO,CAAC,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,CAAA;IACpC,CAAC;IAED;;;;;;OAMG;IACH,SAAS;QACP,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,OAAO,CAAA;IACxC,CAAC;IAED,MAAM,CAAC,IAAU;QACf,OAAO,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAA;IAC5B,CAAC;IAED,OAAO;QACL,OAAO,CACL,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS;YAC5B,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW;gBAClC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM;oBACxB,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,cAAc;wBACxC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM;4BACxB,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,iBAAiB;gCAC9C,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,aAAa;oCACtC,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ;wCAClD,CAAC,CAAC,SAAS,CACZ,CAAA;QACD,oBAAoB;IACtB,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,CAAA;IACtC,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,CAAA;IACtC,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,CAAA;IACtC,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,CAAA;IACtC,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,CAAA;IACtC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,MAAM,CAAA;IACvC,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,KAAK,CAAA;IACvC,CAAC;IAED;;;;;;OAMG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;IACrD,CAAC;IAED;;;;;;;OAOG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAA;IACzB,CAAC;IAED;;;;;;;OAOG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IAED;;;;;;;OAOG;IACH,aAAa;QACX,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAChC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAA;IAChD,CAAC;IAED;;;;;;OAMG;IACH,WAAW;QACT,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAA;QACjC,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAA;QAC9B,yCAAyC;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;QAC9B,OAAO,CAAC,CACN,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK,CAAC;YACpC,IAAI,CAAC,KAAK,GAAG,WAAW;YACxB,IAAI,CAAC,KAAK,GAAG,MAAM,CACpB,CAAA;IACH,CAAC;IAED;;;OAGG;IACH,aAAa;QACX,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,cAAc,CAAC,CAAA;IACxC,CAAC;IAED;;;;OAIG;IACH,QAAQ;QACN,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,CAAA;IAChC,CAAC;IAED;;;;;;;;;;OAUG;IACH,OAAO,CAAC,CAAS;QACf,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjB,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC;YAClC,CAAC,CAAC,IAAI,CAAC,UAAU,KAAK,eAAe,CAAC,CAAC,CAAC,CAAA;IAC5C,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,QAAQ;QACZ,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAA;QAC/B,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAA;QACf,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,qBAAqB;QACrB,gEAAgE;QAChE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,oBAAoB;QACpB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;YAC9D,MAAM,UAAU,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;YAChE,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,CAAA;YACxC,CAAC;QACH,CAAC;QAAC,OAAO,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,aAAa,CAAE,EAA4B,CAAC,IAAI,CAAC,CAAA;YACtD,OAAO,SAAS,CAAA;QAClB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,YAAY;QACV,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAA;QAC/B,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAA;QACf,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,qBAAqB;QACrB,gEAAgE;QAChE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,oBAAoB;QACpB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;YACnD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;YAC5D,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,CAAA;YACxC,CAAC;QACH,CAAC;QAAC,OAAO,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,aAAa,CAAE,EAA4B,CAAC,IAAI,CAAC,CAAA;YACtD,OAAO,SAAS,CAAA;QAClB,CAAC;IACH,CAAC;IAED,eAAe,CAAC,QAAkB;QAChC,qCAAqC;QACrC,IAAI,CAAC,KAAK,IAAI,cAAc,CAAA;QAC5B,oDAAoD;QACpD,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5D,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;YACrB,IAAI,CAAC;gBAAE,CAAC,CAAC,WAAW,EAAE,CAAA;QACxB,CAAC;IACH,CAAC;IAED,WAAW;QACT,6BAA6B;QAC7B,IAAI,IAAI,CAAC,KAAK,GAAG,MAAM;YAAE,OAAM;QAC/B,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,YAAY,CAAA;QACjD,IAAI,CAAC,mBAAmB,EAAE,CAAA;IAC5B,CAAC;IAED,mBAAmB;QACjB,gDAAgD;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAChC,QAAQ,CAAC,WAAW,GAAG,CAAC,CAAA;QACxB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,CAAC,CAAC,WAAW,EAAE,CAAA;QACjB,CAAC;IACH,CAAC;IAED,gBAAgB;QACd,IAAI,CAAC,KAAK,IAAI,WAAW,CAAA;QACzB,IAAI,CAAC,YAAY,EAAE,CAAA;IACrB,CAAC;IAED,2DAA2D;IAC3D,YAAY;QACV,yDAAyD;QACzD,0DAA0D;QAC1D,0DAA0D;QAC1D,sCAAsC;QACtC,qBAAqB;QACrB,IAAI,IAAI,CAAC,KAAK,GAAG,OAAO;YAAE,OAAM;QAChC,oBAAoB;QACpB,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAA;QAClB,sDAAsD;QACtD,8CAA8C;QAC9C,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,KAAK;YAAE,CAAC,IAAI,YAAY,CAAA;QAC3C,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,OAAO,CAAA;QACxB,IAAI,CAAC,mBAAmB,EAAE,CAAA;IAC5B,CAAC;IAED,YAAY,CAAC,OAAe,EAAE;QAC5B,oDAAoD;QACpD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YAC3C,IAAI,CAAC,YAAY,EAAE,CAAA;QACrB,CAAC;aAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,WAAW,EAAE,CAAA;QACpB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,EAAE,CAAC,WAAW,GAAG,CAAC,CAAA;QACjC,CAAC;IACH,CAAC;IAED,UAAU,CAAC,OAAe,EAAE;QAC1B,8DAA8D;QAC9D,qBAAqB;QACrB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,6CAA6C;YAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,MAAkB,CAAA;YACjC,CAAC,CAAC,YAAY,EAAE,CAAA;QAClB,CAAC;aAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,oBAAoB;YACpB,IAAI,CAAC,WAAW,EAAE,CAAA;QACpB,CAAC;IACH,CAAC;IAED,aAAa,CAAC,OAAe,EAAE;QAC7B,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAA;QACpB,GAAG,IAAI,WAAW,CAAA;QAClB,IAAI,IAAI,KAAK,QAAQ;YAAE,GAAG,IAAI,MAAM,CAAA;QACpC,6DAA6D;QAC7D,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5C,iEAAiE;YACjE,iBAAiB;YACjB,GAAG,IAAI,YAAY,CAAA;QACrB,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,GAAG,CAAA;QAChB,gEAAgE;QAChE,sDAAsD;QACtD,qBAAqB;QACrB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAA;QAC5B,CAAC;QACD,oBAAoB;IACtB,CAAC;IAED,gBAAgB,CAAC,CAAS,EAAE,CAAW;QACrC,OAAO,CACL,IAAI,CAAC,yBAAyB,CAAC,CAAC,EAAE,CAAC,CAAC;YACpC,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAC/B,CAAA;IACH,CAAC;IAED,mBAAmB,CAAC,CAAS,EAAE,CAAW;QACxC,qDAAqD;QACrD,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QAC3D,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,GAAG,IAAI,CAAA;QAC/B,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACzD,KAAK,CAAC,KAAK,IAAI,OAAO,CAAA;QACxB,CAAC;QACD,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAChB,CAAC,CAAC,WAAW,EAAE,CAAA;QACf,OAAO,KAAK,CAAA;IACd,CAAC;IAED,yBAAyB,CAAC,CAAS,EAAE,CAAW;QAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YACnB,MAAM,IAAI,GACR,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;YAC3D,IAAI,IAAI,KAAK,MAAO,CAAC,UAAU,EAAE,CAAC;gBAChC,SAAQ;YACV,CAAC;YAED,OAAO,IAAI,CAAC,oBAAoB,CAAC,CAAC,EAAE,MAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QACpD,CAAC;IACH,CAAC;IAED,oBAAoB,CAClB,CAAS,EACT,CAAW,EACX,KAAa,EACb,CAAW;QAEX,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAA;QAChB,mDAAmD;QACnD,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,YAAY,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;QACjD,uDAAuD;QACvD,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI;YAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAA;QAEjC,6DAA6D;QAC7D,+DAA+D;QAC/D,IAAI,KAAK,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YAC5B,IAAI,KAAK,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;gBAAE,CAAC,CAAC,GAAG,EAAE,CAAA;;gBAC9B,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;YACvB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QACd,CAAC;QACD,CAAC,CAAC,WAAW,EAAE,CAAA;QACf,OAAO,CAAC,CAAA;IACV,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;gBAC/D,OAAO,IAAI,CAAA;YACb,CAAC;YAAC,OAAO,EAAE,EAAE,CAAC;gBACZ,IAAI,CAAC,UAAU,CAAE,EAA4B,CAAC,IAAI,CAAC,CAAA;YACrD,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,SAAS;QACP,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;gBACpD,OAAO,IAAI,CAAA;YACb,CAAC;YAAC,OAAO,EAAE,EAAE,CAAC;gBACZ,IAAI,CAAC,UAAU,CAAE,EAA4B,CAAC,IAAI,CAAC,CAAA;YACrD,CAAC;QACH,CAAC;IACH,CAAC;IAED,UAAU,CAAC,EAAS;QAClB,MAAM,EACJ,KAAK,EACL,OAAO,EACP,SAAS,EACT,WAAW,EACX,OAAO,EACP,MAAM,EACN,KAAK,EACL,OAAO,EACP,GAAG,EACH,GAAG,EACH,GAAG,EACH,IAAI,EACJ,KAAK,EACL,OAAO,EACP,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,GAAG,GACJ,GAAG,EAAE,CAAA;QACN,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;QACvB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAA;QAC3B,IAAI,CAAC,YAAY,GAAG,WAAW,CAAA;QAC/B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;QACvB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;QACrB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;QACvB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;QACf,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;QACf,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;QACf,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;QACjB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;QACvB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;QACjB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;QACjB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;QACf,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAA;QAC1B,2CAA2C;QAC3C,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC,GAAG,IAAI,GAAG,YAAY,CAAA;QAC9D,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACzD,IAAI,CAAC,KAAK,IAAI,OAAO,CAAA;QACvB,CAAC;IACH,CAAC;IAED,YAAY,GAGE,EAAE,CAAA;IAChB,kBAAkB,GAAY,KAAK,CAAA;IACnC,gBAAgB,CAAC,QAAgB;QAC/B,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAA;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAA;QACrC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAA;QAC5B,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;IACvC,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACH,SAAS,CACP,EAAkE,EAClE,aAAsB,KAAK;QAE3B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACvB,IAAI,UAAU;gBAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;;gBACvB,cAAc,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAA;YACvC,OAAM;QACR,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAChC,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAA;YACjD,IAAI,UAAU;gBAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;;gBACtB,cAAc,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YACtC,OAAM;QACR,CAAC;QAED,iDAAiD;QACjD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC1B,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,OAAM;QACR,CAAC;QACD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAA;QAE9B,4CAA4C;QAC5C,8CAA8C;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAChC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE;YAClE,IAAI,EAAE,EAAE,CAAC;gBACP,IAAI,CAAC,YAAY,CAAE,EAA4B,CAAC,IAAI,CAAC,CAAA;gBACrD,QAAQ,CAAC,WAAW,GAAG,CAAC,CAAA;YAC1B,CAAC;iBAAM,CAAC;gBACN,oDAAoD;gBACpD,YAAY;gBACZ,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;oBACxB,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;gBACpC,CAAC;gBACD,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;YAChC,CAAC;YACD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAA;YAC9D,OAAM;QACR,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,qBAAqB,CAAgB;IAErC;;;;;;;;OAQG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACvB,OAAO,EAAE,CAAA;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAChC,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YACzB,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAA;QAChD,CAAC;QAED,4CAA4C;QAC5C,8CAA8C;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAChC,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,qBAAqB,CAAA;QAClC,CAAC;aAAM,CAAC;YACN,qBAAqB;YACrB,IAAI,OAAO,GAAe,GAAG,EAAE,GAAE,CAAC,CAAA;YAClC,oBAAoB;YACpB,IAAI,CAAC,qBAAqB,GAAG,IAAI,OAAO,CACtC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,CACvB,CAAA;YACD,IAAI,CAAC;gBACH,KAAK,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE;oBACxD,aAAa,EAAE,IAAI;iBACpB,CAAC,EAAE,CAAC;oBACH,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;gBACpC,CAAC;gBACD,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;YAChC,CAAC;YAAC,OAAO,EAAE,EAAE,CAAC;gBACZ,IAAI,CAAC,YAAY,CAAE,EAA4B,CAAC,IAAI,CAAC,CAAA;gBACrD,QAAQ,CAAC,WAAW,GAAG,CAAC,CAAA;YAC1B,CAAC;YACD,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAA;YACtC,OAAO,EAAE,CAAA;QACX,CAAC;QACD,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAA;IAChD,CAAC;IAED;;OAEG;IACH,WAAW;QACT,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACvB,OAAO,EAAE,CAAA;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAChC,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YACzB,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAA;QAChD,CAAC;QAED,4CAA4C;QAC5C,8CAA8C;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAChC,IAAI,CAAC;YACH,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,EAAE;gBAC7C,aAAa,EAAE,IAAI;aACpB,CAAC,EAAE,CAAC;gBACH,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;YACpC,CAAC;YACD,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;QAChC,CAAC;QAAC,OAAO,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,YAAY,CAAE,EAA4B,CAAC,IAAI,CAAC,CAAA;YACrD,QAAQ,CAAC,WAAW,GAAG,CAAC,CAAA;QAC1B,CAAC;QACD,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAA;IAChD,CAAC;IAED,UAAU;QACR,IAAI,IAAI,CAAC,KAAK,GAAG,QAAQ;YAAE,OAAO,KAAK,CAAA;QACvC,MAAM,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,CAAA;QAC9B,mEAAmE;QACnE,qBAAqB;QACrB,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAC5D,OAAO,KAAK,CAAA;QACd,CAAC;QACD,oBAAoB;QACpB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,UAAU,CACR,IAA+B,EAC/B,UAAqC;QAErC,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,KAAK;YAC9B,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;YACxB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YACf,CAAC,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAClC,CAAA;IACH,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC,SAAS,CAAA;QACzC,IAAI,CAAC,WAAW,GAAG,WAAW,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAA;QACvE,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;YAC5D,OAAO,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAA;QAC5C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,gBAAgB,EAAE,CAAA;QACzB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,YAAY;QACV,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC,SAAS,CAAA;QACzC,IAAI,CAAC,WAAW,GAAG,WAAW,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAA;QACvE,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;YACjD,OAAO,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAA;QAC5C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,gBAAgB,EAAE,CAAA;QACzB,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,CAAC,QAAQ,CAAC,CAAC,MAAgB;QACzB,IAAI,MAAM,KAAK,IAAI;YAAE,OAAM;QAC3B,MAAM,CAAC,KAAK,GAAG,KAAK,CAAA;QACpB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;QAEjB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAW,EAAE,CAAC,CAAA;QACrC,IAAI,EAAE,GAAG,EAAE,CAAA;QACX,IAAI,CAAC,GAAa,IAAI,CAAA;QACtB,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACd,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC/B,CAAC,CAAC,cAAc,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC/B,CAAC,GAAG,CAAC,CAAC,MAAM,CAAA;YACZ,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACf,CAAC;QACD,oCAAoC;QACpC,CAAC,GAAG,MAAM,CAAA;QACV,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACxC,CAAC,CAAC,SAAS,GAAG,SAAS,CAAA;YACvB,CAAC,CAAC,cAAc,GAAG,SAAS,CAAA;YAC5B,CAAC,GAAG,CAAC,CAAC,MAAM,CAAA;QACd,CAAC;IACH,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,SAAU,SAAQ,QAAQ;IACrC;;OAEG;IACH,GAAG,GAAS,IAAI,CAAA;IAChB;;OAEG;IACH,QAAQ,GAAW,SAAS,CAAA;IAE5B;;;;;OAKG;IACH,YACE,IAAY,EACZ,OAAe,OAAO,EACtB,IAA0B,EAC1B,KAAgC,EAChC,MAAe,EACf,QAAuB,EACvB,IAAc;QAEd,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;IACxD,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,IAAY,EAAE,OAAe,OAAO,EAAE,OAAiB,EAAE;QAChE,OAAO,IAAI,SAAS,CAClB,IAAI,EACJ,IAAI,EACJ,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CACL,CAAA;IACH,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,IAAY;QACxB,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAA;IAC/B,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,QAAgB;QACtB,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAA;QAC7C,IAAI,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,IAAI,CAAA;QAClB,CAAC;QACD,8DAA8D;QAC9D,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACzD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;gBACrC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAA;YACtC,CAAC;QACH,CAAC;QACD,uCAAuC;QACvC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,eAAe,CAChD,QAAQ,EACR,IAAI,CACL,CAAC,IAAI,CAAC,CAAA;IACT,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,QAAgB,EAAE,UAAkB,IAAI,CAAC,IAAI,CAAC,IAAI;QACzD,2DAA2D;QAC3D,qEAAqE;QACrE,yBAAyB;QACzB,QAAQ,GAAG,QAAQ;aAChB,WAAW,EAAE;aACb,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;aACpB,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;QAClC,OAAO,QAAQ,KAAK,OAAO,CAAA;IAC7B,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,SAAU,SAAQ,QAAQ;IACrC;;OAEG;IACH,QAAQ,GAAQ,GAAG,CAAA;IACnB;;OAEG;IACH,GAAG,GAAQ,GAAG,CAAA;IAEd;;;;;OAKG;IACH,YACE,IAAY,EACZ,OAAe,OAAO,EACtB,IAA0B,EAC1B,KAAgC,EAChC,MAAe,EACf,QAAuB,EACvB,IAAc;QAEd,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;IACxD,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,IAAY;QACxB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;IACxC,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,SAAiB;QACvB,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,IAAY,EAAE,OAAe,OAAO,EAAE,OAAiB,EAAE;QAChE,OAAO,IAAI,SAAS,CAClB,IAAI,EACJ,IAAI,EACJ,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CACL,CAAA;IACH,CAAC;CACF;AAiCD;;;;;;;GAOG;AACH,MAAM,OAAgB,cAAc;IAClC;;OAEG;IACH,IAAI,CAAU;IACd;;OAEG;IACH,QAAQ,CAAQ;IAChB;;OAEG;IACH,KAAK,CAA2B;IAChC;;OAEG;IACH,GAAG,CAAU;IACb,aAAa,CAAc;IAC3B,kBAAkB,CAAc;IAChC,SAAS,CAAe;IACxB;;;;OAIG;IACH,MAAM,CAAS;IASf,GAAG,CAAS;IAEZ;;;;;;OAMG;IACH,YACE,MAAoB,OAAO,CAAC,GAAG,EAAE,EACjC,QAAqC,EACrC,GAAoB,EACpB,EACE,MAAM,EACN,iBAAiB,GAAG,EAAE,GAAG,IAAI,EAC7B,EAAE,GAAG,SAAS,MACI,EAAE;QAEtB,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC,EAAE,CAAC,CAAA;QAC3B,IAAI,GAAG,YAAY,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACpD,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;QAC1B,CAAC;QACD,qDAAqD;QACrD,+CAA+C;QAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACrC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAChC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;QAC3C,IAAI,CAAC,aAAa,GAAG,IAAI,YAAY,EAAE,CAAA;QACvC,IAAI,CAAC,kBAAkB,GAAG,IAAI,YAAY,EAAE,CAAA;QAC5C,IAAI,CAAC,SAAS,GAAG,IAAI,aAAa,CAAC,iBAAiB,CAAC,CAAA;QAErD,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAChE,8DAA8D;QAC9D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACpC,KAAK,CAAC,GAAG,EAAE,CAAA;QACb,CAAC;QACD,qBAAqB;QACrB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,IAAI,SAAS,CACjB,oDAAoD,CACrD,CAAA;QACH,CAAC;QACD,oBAAoB;QACpB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAClC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,IAAI,CAAA;QACrC,IAAI,IAAI,GAAa,IAAI,CAAC,IAAI,CAAA;QAC9B,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAA;QAC1B,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAA;QAC5B,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAA;QACvB,IAAI,QAAQ,GAAG,KAAK,CAAA;QACpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,GAAG,EAAE,CAAA;YACf,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;gBACtB,QAAQ,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;gBAC/C,aAAa,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBAChD,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;aACpD,CAAC,CAAA;YACF,QAAQ,GAAG,IAAI,CAAA;QACjB,CAAC;QACD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAA;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAsB,IAAI,CAAC,GAAG;QAClC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAC/B,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,EAAE,CAAA;IACrB,CAAC;IAmBD;;;;;OAKG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IAED;;;;;;;;OAQG;IACH,OAAO,CAAC,GAAG,KAAe;QACxB,+DAA+D;QAC/D,gEAAgE;QAChE,IAAI,CAAC,GAAG,EAAE,CAAA;QACV,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;YAClB,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG;gBAAE,SAAQ;YAC7B,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YACvB,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvB,MAAK;YACP,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACxC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,MAAM,CAAA;QACf,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC7C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;QACjC,OAAO,MAAM,CAAA;IACf,CAAC;IAED;;;;;;;;;;OAUG;IACH,YAAY,CAAC,GAAG,KAAe;QAC7B,+DAA+D;QAC/D,gEAAgE;QAChE,IAAI,CAAC,GAAG,EAAE,CAAA;QACV,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;YAClB,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG;gBAAE,SAAQ;YAC7B,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YACvB,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvB,MAAK;YACP,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC7C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,MAAM,CAAA;QACf,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;QAClD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;QACtC,OAAO,MAAM,CAAA;IACf,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,QAA2B,IAAI,CAAC,GAAG;QAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;QACD,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAA;IACzB,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,QAA2B,IAAI,CAAC,GAAG;QAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;QACD,OAAO,KAAK,CAAC,aAAa,EAAE,CAAA;IAC9B,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,QAA2B,IAAI,CAAC,GAAG;QAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAA;IACnB,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,QAA2B,IAAI,CAAC,GAAG;QACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAA;IAC3C,CAAC;IAkCD,KAAK,CAAC,OAAO,CACX,QAAwD,IAAI,CAAC,GAAG,EAChE,OAAmC;QACjC,aAAa,EAAE,IAAI;KACpB;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,EAAE,CAAC;YACxC,IAAI,GAAG,KAAK,CAAA;YACZ,KAAK,GAAG,IAAI,CAAC,GAAG,CAAA;QAClB,CAAC;QACD,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,CAAA;QAC9B,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;YACxB,OAAO,EAAE,CAAA;QACX,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,CAAA;YAC/B,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAC/C,CAAC;IACH,CAAC;IAsBD,WAAW,CACT,QAAwD,IAAI,CAAC,GAAG,EAChE,OAAmC;QACjC,aAAa,EAAE,IAAI;KACpB;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,EAAE,CAAC;YACxC,IAAI,GAAG,KAAK,CAAA;YACZ,KAAK,GAAG,IAAI,CAAC,GAAG,CAAA;QAClB,CAAC;QACD,MAAM,EAAE,aAAa,GAAG,IAAI,EAAE,GAAG,IAAI,CAAA;QACrC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;YACxB,OAAO,EAAE,CAAA;QACX,CAAC;aAAM,IAAI,aAAa,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC,WAAW,EAAE,CAAA;QAC5B,CAAC;aAAM,CAAC;YACN,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAC7C,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,KAAK,CACT,QAA2B,IAAI,CAAC,GAAG;QAEnC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;QACD,OAAO,KAAK,CAAC,KAAK,EAAE,CAAA;IACtB,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,QAA2B,IAAI,CAAC,GAAG;QAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;QACD,OAAO,KAAK,CAAC,SAAS,EAAE,CAAA;IAC1B,CAAC;IAkCD,KAAK,CAAC,QAAQ,CACZ,QAAwD,IAAI,CAAC,GAAG,EAChE,EAAE,aAAa,KAAiC;QAC9C,aAAa,EAAE,KAAK;KACrB;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,EAAE,CAAC;YACxC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAA;YACnC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAA;QAClB,CAAC;QACD,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAA;QAChC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAA;IAC1C,CAAC;IAuBD,YAAY,CACV,QAAwD,IAAI,CAAC,GAAG,EAChE,EAAE,aAAa,KAAiC;QAC9C,aAAa,EAAE,KAAK;KACrB;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,EAAE,CAAC;YACxC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAA;YACnC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAA;QAClB,CAAC;QACD,MAAM,CAAC,GAAG,KAAK,CAAC,YAAY,EAAE,CAAA;QAC9B,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAA;IAC1C,CAAC;IAiCD,KAAK,CAAC,QAAQ,CACZ,QAAwD,IAAI,CAAC,GAAG,EAChE,EAAE,aAAa,KAAiC;QAC9C,aAAa,EAAE,KAAK;KACrB;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,EAAE,CAAC;YACxC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAA;YACnC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAA;QAClB,CAAC;QACD,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAA;QAChC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAA;IAC1C,CAAC;IAoBD,YAAY,CACV,QAAwD,IAAI,CAAC,GAAG,EAChE,EAAE,aAAa,KAAiC;QAC9C,aAAa,EAAE,KAAK;KACrB;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,EAAE,CAAC;YACxC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAA;YACnC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAA;QAClB,CAAC;QACD,MAAM,CAAC,GAAG,KAAK,CAAC,YAAY,EAAE,CAAA;QAC9B,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAA;IAC1C,CAAC;IA6BD,KAAK,CAAC,IAAI,CACR,QAAyC,IAAI,CAAC,GAAG,EACjD,OAAoB,EAAE;QAEtB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,EAAE,CAAC;YACxC,IAAI,GAAG,KAAK,CAAA;YACZ,KAAK,GAAG,IAAI,CAAC,GAAG,CAAA;QAClB,CAAC;QACD,MAAM,EACJ,aAAa,GAAG,IAAI,EACpB,MAAM,GAAG,KAAK,EACd,MAAM,EACN,UAAU,GACX,GAAG,IAAI,CAAA;QACR,MAAM,OAAO,GAA0B,EAAE,CAAA;QACzC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;QACxD,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAY,CAAA;QAChC,MAAM,IAAI,GAAG,CACX,GAAa,EACb,EAAwC,EACxC,EAAE;YACF,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACb,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE;gBAC5B,qBAAqB;gBACrB,IAAI,EAAE,EAAE,CAAC;oBACP,OAAO,EAAE,CAAC,EAAE,CAAC,CAAA;gBACf,CAAC;gBACD,oBAAoB;gBACpB,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,CAAA;gBACxB,IAAI,CAAC,GAAG;oBAAE,OAAO,EAAE,EAAE,CAAA;gBACrB,MAAM,IAAI,GAAG,GAAG,EAAE;oBAChB,IAAI,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;wBAChB,EAAE,EAAE,CAAA;oBACN,CAAC;gBACH,CAAC,CAAA;gBACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;oBACxB,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;wBACzB,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;oBAChD,CAAC;oBACD,IAAI,MAAM,IAAI,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC;wBACjC,CAAC,CAAC,QAAQ,EAAE;6BACT,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;6BAC3C,IAAI,CAAC,CAAC,CAAC,EAAE,CACR,CAAC,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CACzD,CAAA;oBACL,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;4BACnC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;wBACf,CAAC;6BAAM,CAAC;4BACN,IAAI,EAAE,CAAA;wBACR,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC,EAAE,IAAI,CAAC,CAAA,CAAC,cAAc;QACzB,CAAC,CAAA;QAED,MAAM,KAAK,GAAG,KAAK,CAAA;QACnB,OAAO,IAAI,OAAO,CAAwB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACrD,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE;gBACf,qBAAqB;gBACrB,IAAI,EAAE;oBAAE,OAAO,GAAG,CAAC,EAAE,CAAC,CAAA;gBACtB,oBAAoB;gBACpB,GAAG,CAAC,OAAgC,CAAC,CAAA;YACvC,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IA6BD,QAAQ,CACN,QAAyC,IAAI,CAAC,GAAG,EACjD,OAAoB,EAAE;QAEtB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,EAAE,CAAC;YACxC,IAAI,GAAG,KAAK,CAAA;YACZ,KAAK,GAAG,IAAI,CAAC,GAAG,CAAA;QAClB,CAAC;QACD,MAAM,EACJ,aAAa,GAAG,IAAI,EACpB,MAAM,GAAG,KAAK,EACd,MAAM,EACN,UAAU,GACX,GAAG,IAAI,CAAA;QACR,MAAM,OAAO,GAA0B,EAAE,CAAA;QACzC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;QACxD,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAW,CAAC,KAAK,CAAC,CAAC,CAAA;QACvC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;YACjC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzB,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;gBAChD,CAAC;gBACD,IAAI,CAAC,GAAyB,CAAC,CAAA;gBAC/B,IAAI,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC;oBACvB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;wBAAE,SAAQ;oBACjD,IAAI,CAAC,CAAC,SAAS,EAAE;wBAAE,CAAC,CAAC,SAAS,EAAE,CAAA;gBAClC,CAAC;gBACD,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;oBACnC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;gBACb,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,OAAgC,CAAA;IACzC,CAAC;IAED;;;;;;;;OAQG;IACH,CAAC,MAAM,CAAC,aAAa,CAAC;QACpB,OAAO,IAAI,CAAC,OAAO,EAAE,CAAA;IACvB,CAAC;IA+BD,OAAO,CACL,QAAyC,IAAI,CAAC,GAAG,EACjD,UAAuB,EAAE;QAEzB,oEAAoE;QACpE,yEAAyE;QACzE,yEAAyE;QACzE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,EAAE,CAAC;YACxC,OAAO,GAAG,KAAK,CAAA;YACf,KAAK,GAAG,IAAI,CAAC,GAAG,CAAA;QAClB,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAA;IAC5D,CAAC;IAED;;;;OAIG;IACH,CAAC,MAAM,CAAC,QAAQ,CAAC;QACf,OAAO,IAAI,CAAC,WAAW,EAAE,CAAA;IAC3B,CAAC;IAuBD,CAAC,WAAW,CACV,QAAyC,IAAI,CAAC,GAAG,EACjD,OAAoB,EAAE;QAEtB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,EAAE,CAAC;YACxC,IAAI,GAAG,KAAK,CAAA;YACZ,KAAK,GAAG,IAAI,CAAC,GAAG,CAAA;QAClB,CAAC;QACD,MAAM,EACJ,aAAa,GAAG,IAAI,EACpB,MAAM,GAAG,KAAK,EACd,MAAM,EACN,UAAU,GACX,GAAG,IAAI,CAAA;QACR,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAA;QAChD,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAW,CAAC,KAAK,CAAC,CAAC,CAAA;QACvC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;YACjC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzB,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;gBACxC,CAAC;gBACD,IAAI,CAAC,GAAyB,CAAC,CAAA;gBAC/B,IAAI,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC;oBACvB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;wBAAE,SAAQ;oBACjD,IAAI,CAAC,CAAC,SAAS,EAAE;wBAAE,CAAC,CAAC,SAAS,EAAE,CAAA;gBAClC,CAAC;gBACD,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;oBACnC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;gBACb,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IA2BD,MAAM,CACJ,QAAyC,IAAI,CAAC,GAAG,EACjD,OAAoB,EAAE;QAEtB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,EAAE,CAAC;YACxC,IAAI,GAAG,KAAK,CAAA;YACZ,KAAK,GAAG,IAAI,CAAC,GAAG,CAAA;QAClB,CAAC;QACD,MAAM,EACJ,aAAa,GAAG,IAAI,EACpB,MAAM,GAAG,KAAK,EACd,MAAM,EACN,UAAU,GACX,GAAG,IAAI,CAAA;QACR,MAAM,OAAO,GAAG,IAAI,QAAQ,CAAoB,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;QACrE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;QACzD,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAY,CAAA;QAChC,MAAM,KAAK,GAAe,CAAC,KAAK,CAAC,CAAA;QACjC,IAAI,UAAU,GAAG,CAAC,CAAA;QAClB,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,IAAI,MAAM,GAAG,KAAK,CAAA;YAClB,OAAO,CAAC,MAAM,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,CAAA;gBACzB,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,IAAI,UAAU,KAAK,CAAC;wBAAE,OAAO,CAAC,GAAG,EAAE,CAAA;oBACnC,OAAM;gBACR,CAAC;gBAED,UAAU,EAAE,CAAA;gBACZ,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBAEb,MAAM,SAAS,GAAG,CAChB,EAAgC,EAChC,OAAmB,EACnB,eAAwB,KAAK,EAC7B,EAAE;oBACF,qBAAqB;oBACrB,IAAI,EAAE;wBAAE,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;oBACxC,oBAAoB;oBACpB,IAAI,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;wBAC5B,MAAM,QAAQ,GAAoC,EAAE,CAAA;wBACpD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;4BACxB,IAAI,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC;gCACvB,QAAQ,CAAC,IAAI,CACX,CAAC;qCACE,QAAQ,EAAE;qCACV,IAAI,CAAC,CAAC,CAAuB,EAAE,EAAE,CAChC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAC/B,CACJ,CAAA;4BACH,CAAC;wBACH,CAAC;wBACD,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;4BACpB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAC9B,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAC/B,CAAA;4BACD,OAAM;wBACR,CAAC;oBACH,CAAC;oBAED,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;wBACxB,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;4BAChC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;gCACrD,MAAM,GAAG,IAAI,CAAA;4BACf,CAAC;wBACH,CAAC;oBACH,CAAC;oBAED,UAAU,EAAE,CAAA;oBACZ,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;wBACxB,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;wBACjC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;4BACnC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;wBACf,CAAC;oBACH,CAAC;oBACD,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;wBAC/B,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;oBAChC,CAAC;yBAAM,IAAI,CAAC,IAAI,EAAE,CAAC;wBACjB,OAAO,EAAE,CAAA;oBACX,CAAC;gBACH,CAAC,CAAA;gBAED,oBAAoB;gBACpB,IAAI,IAAI,GAAG,IAAI,CAAA;gBACf,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;gBAC9B,IAAI,GAAG,KAAK,CAAA;YACd,CAAC;QACH,CAAC,CAAA;QACD,OAAO,EAAE,CAAA;QACT,OAAO,OAAgD,CAAA;IACzD,CAAC;IA8BD,UAAU,CACR,QAAyC,IAAI,CAAC,GAAG,EACjD,OAAoB,EAAE;QAEtB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,EAAE,CAAC;YACxC,IAAI,GAAG,KAAK,CAAA;YACZ,KAAK,GAAG,IAAI,CAAC,GAAG,CAAA;QAClB,CAAC;QACD,MAAM,EACJ,aAAa,GAAG,IAAI,EACpB,MAAM,GAAG,KAAK,EACd,MAAM,EACN,UAAU,GACX,GAAG,IAAI,CAAA;QACR,MAAM,OAAO,GAAG,IAAI,QAAQ,CAAoB,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;QACrE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAY,CAAA;QAChC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;QACzD,CAAC;QACD,MAAM,KAAK,GAAe,CAAC,KAAK,CAAC,CAAA;QACjC,IAAI,UAAU,GAAG,CAAC,CAAA;QAClB,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,IAAI,MAAM,GAAG,KAAK,CAAA;YAClB,OAAO,CAAC,MAAM,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,CAAA;gBACzB,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,IAAI,UAAU,KAAK,CAAC;wBAAE,OAAO,CAAC,GAAG,EAAE,CAAA;oBACnC,OAAM;gBACR,CAAC;gBACD,UAAU,EAAE,CAAA;gBACZ,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBAEb,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;gBACjC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;oBACxB,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;wBACzB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;4BACrD,MAAM,GAAG,IAAI,CAAA;wBACf,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,UAAU,EAAE,CAAA;gBACZ,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;oBACxB,IAAI,CAAC,GAAyB,CAAC,CAAA;oBAC/B,IAAI,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC;wBACvB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;4BAAE,SAAQ;wBACjD,IAAI,CAAC,CAAC,SAAS,EAAE;4BAAE,CAAC,CAAC,SAAS,EAAE,CAAA;oBAClC,CAAC;oBACD,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;wBACnC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;oBACf,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO;gBAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAChE,CAAC,CAAA;QACD,OAAO,EAAE,CAAA;QACT,OAAO,OAAgD,CAAA;IACzD,CAAC;IAED,KAAK,CAAC,OAAsB,IAAI,CAAC,GAAG;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAA;QACvB,IAAI,CAAC,GAAG,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QACnE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAA;IAC5B,CAAC;CACF;AAiED;;;;;GAKG;AACH,MAAM,OAAO,eAAgB,SAAQ,cAAc;IACjD;;OAEG;IACH,GAAG,GAAS,IAAI,CAAA;IAEhB,YACE,MAAoB,OAAO,CAAC,GAAG,EAAE,EACjC,OAAuB,EAAE;QAEzB,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,IAAI,CAAA;QAC9B,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;QAC5C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,KAAK,IAAI,CAAC,GAAyB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;YAC7D,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QACxB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,GAAW;QACvB,wEAAwE;QACxE,iEAAiE;QACjE,kDAAkD;QAClD,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA;IAC5C,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,EAAW;QACjB,OAAO,IAAI,SAAS,CAClB,IAAI,CAAC,QAAQ,EACb,KAAK,EACL,SAAS,EACT,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,aAAa,EAAE,EACpB,EAAE,EAAE,EAAE,CACP,CAAA;IACH,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,CAAS;QAClB,OAAO,CACL,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CACrE,CAAA;IACH,CAAC;CACF;AAED;;;;;;GAMG;AACH,MAAM,OAAO,eAAgB,SAAQ,cAAc;IACjD;;OAEG;IACH,GAAG,GAAQ,GAAG,CAAA;IACd,YACE,MAAoB,OAAO,CAAC,GAAG,EAAE,EACjC,OAAuB,EAAE;QAEzB,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,IAAI,CAAA;QAC/B,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;QAC3C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,IAAY;QACxB,OAAO,GAAG,CAAA;IACZ,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,EAAW;QACjB,OAAO,IAAI,SAAS,CAClB,IAAI,CAAC,QAAQ,EACb,KAAK,EACL,SAAS,EACT,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,aAAa,EAAE,EACpB,EAAE,EAAE,EAAE,CACP,CAAA;IACH,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,CAAS;QAClB,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;IAC1B,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,gBAAiB,SAAQ,eAAe;IACnD,YACE,MAAoB,OAAO,CAAC,GAAG,EAAE,EACjC,OAAuB,EAAE;QAEzB,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,IAAI,CAAA;QAC9B,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;IACjC,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAA;AAGxE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAIrB,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe;IAC9C,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB;QAClD,CAAC,CAAC,eAAe,CAAA","sourcesContent":["import { LRUCache } from 'lru-cache'\nimport { posix, win32 } from 'node:path'\n\nimport { fileURLToPath } from 'node:url'\n\nimport {\n lstatSync,\n readdir as readdirCB,\n readdirSync,\n readlinkSync,\n realpathSync as rps,\n} from 'fs'\nimport * as actualFS from 'node:fs'\n\nconst realpathSync = rps.native\n// TODO: test perf of fs/promises realpath vs realpathCB,\n// since the promises one uses realpath.native\n\nimport { lstat, readdir, readlink, realpath } from 'node:fs/promises'\n\nimport { Minipass } from 'minipass'\nimport type { Dirent, Stats } from 'node:fs'\n\n/**\n * An object that will be used to override the default `fs`\n * methods. Any methods that are not overridden will use Node's\n * built-in implementations.\n *\n * - lstatSync\n * - readdir (callback `withFileTypes` Dirent variant, used for\n * readdirCB and most walks)\n * - readdirSync\n * - readlinkSync\n * - realpathSync\n * - promises: Object containing the following async methods:\n * - lstat\n * - readdir (Dirent variant only)\n * - readlink\n * - realpath\n */\nexport interface FSOption {\n lstatSync?: (path: string) => Stats\n readdir?: (\n path: string,\n options: { withFileTypes: true },\n cb: (er: NodeJS.ErrnoException | null, entries?: Dirent[]) => any,\n ) => void\n readdirSync?: (\n path: string,\n options: { withFileTypes: true },\n ) => Dirent[]\n readlinkSync?: (path: string) => string\n realpathSync?: (path: string) => string\n promises?: {\n lstat?: (path: string) => Promise\n readdir?: (\n path: string,\n options: { withFileTypes: true },\n ) => Promise\n readlink?: (path: string) => Promise\n realpath?: (path: string) => Promise\n [k: string]: any\n }\n [k: string]: any\n}\n\ninterface FSValue {\n lstatSync: (path: string) => Stats\n readdir: (\n path: string,\n options: { withFileTypes: true },\n cb: (er: NodeJS.ErrnoException | null, entries?: Dirent[]) => any,\n ) => void\n readdirSync: (path: string, options: { withFileTypes: true }) => Dirent[]\n readlinkSync: (path: string) => string\n realpathSync: (path: string) => string\n promises: {\n lstat: (path: string) => Promise\n readdir: (\n path: string,\n options: { withFileTypes: true },\n ) => Promise\n readlink: (path: string) => Promise\n realpath: (path: string) => Promise\n [k: string]: any\n }\n [k: string]: any\n}\n\nconst defaultFS: FSValue = {\n lstatSync,\n readdir: readdirCB,\n readdirSync,\n readlinkSync,\n realpathSync,\n promises: {\n lstat,\n readdir,\n readlink,\n realpath,\n },\n}\n\n// if they just gave us require('fs') then use our default\nconst fsFromOption = (fsOption?: FSOption): FSValue =>\n !fsOption || fsOption === defaultFS || fsOption === actualFS ?\n defaultFS\n : {\n ...defaultFS,\n ...fsOption,\n promises: {\n ...defaultFS.promises,\n ...(fsOption.promises || {}),\n },\n }\n\n// turn something like //?/c:/ into c:\\\nconst uncDriveRegexp = /^\\\\\\\\\\?\\\\([a-z]:)\\\\?$/i\nconst uncToDrive = (rootPath: string): string =>\n rootPath.replace(/\\//g, '\\\\').replace(uncDriveRegexp, '$1\\\\')\n\n// windows paths are separated by either / or \\\nconst eitherSep = /[\\\\\\/]/\n\nconst UNKNOWN = 0 // may not even exist, for all we know\nconst IFIFO = 0b0001\nconst IFCHR = 0b0010\nconst IFDIR = 0b0100\nconst IFBLK = 0b0110\nconst IFREG = 0b1000\nconst IFLNK = 0b1010\nconst IFSOCK = 0b1100\nconst IFMT = 0b1111\n\nexport type Type =\n | 'Unknown'\n | 'FIFO'\n | 'CharacterDevice'\n | 'Directory'\n | 'BlockDevice'\n | 'File'\n | 'SymbolicLink'\n | 'Socket'\n\n// mask to unset low 4 bits\nconst IFMT_UNKNOWN = ~IFMT\n\n// set after successfully calling readdir() and getting entries.\nconst READDIR_CALLED = 0b0000_0001_0000\n// set after a successful lstat()\nconst LSTAT_CALLED = 0b0000_0010_0000\n// set if an entry (or one of its parents) is definitely not a dir\nconst ENOTDIR = 0b0000_0100_0000\n// set if an entry (or one of its parents) does not exist\n// (can also be set on lstat errors like EACCES or ENAMETOOLONG)\nconst ENOENT = 0b0000_1000_0000\n// cannot have child entries -- also verify &IFMT is either IFDIR or IFLNK\n// set if we fail to readlink\nconst ENOREADLINK = 0b0001_0000_0000\n// set if we know realpath() will fail\nconst ENOREALPATH = 0b0010_0000_0000\n\nconst ENOCHILD = ENOTDIR | ENOENT | ENOREALPATH\nconst TYPEMASK = 0b0011_1111_1111\n\nconst entToType = (s: Dirent | Stats) =>\n s.isFile() ? IFREG\n : s.isDirectory() ? IFDIR\n : s.isSymbolicLink() ? IFLNK\n : s.isCharacterDevice() ? IFCHR\n : s.isBlockDevice() ? IFBLK\n : s.isSocket() ? IFSOCK\n : s.isFIFO() ? IFIFO\n : UNKNOWN\n\n// normalize unicode path names\nconst normalizeCache = new Map()\nconst normalize = (s: string) => {\n const c = normalizeCache.get(s)\n if (c) return c\n const n = s.normalize('NFKD')\n normalizeCache.set(s, n)\n return n\n}\n\nconst normalizeNocaseCache = new Map()\nconst normalizeNocase = (s: string) => {\n const c = normalizeNocaseCache.get(s)\n if (c) return c\n const n = normalize(s.toLowerCase())\n normalizeNocaseCache.set(s, n)\n return n\n}\n\n/**\n * Options that may be provided to the Path constructor\n */\nexport interface PathOpts {\n fullpath?: string\n relative?: string\n relativePosix?: string\n parent?: PathBase\n /**\n * See {@link FSOption}\n */\n fs?: FSOption\n}\n\n/**\n * An LRUCache for storing resolved path strings or Path objects.\n * @internal\n */\nexport class ResolveCache extends LRUCache {\n constructor() {\n super({ max: 256 })\n }\n}\n\n// In order to prevent blowing out the js heap by allocating hundreds of\n// thousands of Path entries when walking extremely large trees, the \"children\"\n// in this tree are represented by storing an array of Path entries in an\n// LRUCache, indexed by the parent. At any time, Path.children() may return an\n// empty array, indicating that it doesn't know about any of its children, and\n// thus has to rebuild that cache. This is fine, it just means that we don't\n// benefit as much from having the cached entries, but huge directory walks\n// don't blow out the stack, and smaller ones are still as fast as possible.\n//\n//It does impose some complexity when building up the readdir data, because we\n//need to pass a reference to the children array that we started with.\n\n/**\n * an LRUCache for storing child entries.\n * @internal\n */\nexport class ChildrenCache extends LRUCache {\n constructor(maxSize: number = 16 * 1024) {\n super({\n maxSize,\n // parent + children\n sizeCalculation: a => a.length + 1,\n })\n }\n}\n\n/**\n * Array of Path objects, plus a marker indicating the first provisional entry\n *\n * @internal\n */\nexport type Children = PathBase[] & { provisional: number }\n\nconst setAsCwd = Symbol('PathScurry setAsCwd')\n\n/**\n * Path objects are sort of like a super-powered\n * {@link https://nodejs.org/docs/latest/api/fs.html#class-fsdirent fs.Dirent}\n *\n * Each one represents a single filesystem entry on disk, which may or may not\n * exist. It includes methods for reading various types of information via\n * lstat, readlink, and readdir, and caches all information to the greatest\n * degree possible.\n *\n * Note that fs operations that would normally throw will instead return an\n * \"empty\" value. This is in order to prevent excessive overhead from error\n * stack traces.\n */\nexport abstract class PathBase implements Dirent {\n /**\n * the basename of this path\n *\n * **Important**: *always* test the path name against any test string\n * usingthe {@link isNamed} method, and not by directly comparing this\n * string. Otherwise, unicode path strings that the system sees as identical\n * will not be properly treated as the same path, leading to incorrect\n * behavior and possible security issues.\n */\n name: string\n /**\n * the Path entry corresponding to the path root.\n *\n * @internal\n */\n root: PathBase\n /**\n * All roots found within the current PathScurry family\n *\n * @internal\n */\n roots: { [k: string]: PathBase }\n /**\n * a reference to the parent path, or undefined in the case of root entries\n *\n * @internal\n */\n parent?: PathBase\n /**\n * boolean indicating whether paths are compared case-insensitively\n * @internal\n */\n nocase: boolean\n\n /**\n * boolean indicating that this path is the current working directory\n * of the PathScurry collection that contains it.\n */\n isCWD: boolean = false\n\n /**\n * the string or regexp used to split paths. On posix, it is `'/'`, and on\n * windows it is a RegExp matching either `'/'` or `'\\\\'`\n */\n abstract splitSep: string | RegExp\n /**\n * The path separator string to use when joining paths\n */\n abstract sep: string\n\n // potential default fs override\n #fs: FSValue\n\n // Stats fields\n #dev?: number\n get dev() {\n return this.#dev\n }\n #mode?: number\n get mode() {\n return this.#mode\n }\n #nlink?: number\n get nlink() {\n return this.#nlink\n }\n #uid?: number\n get uid() {\n return this.#uid\n }\n #gid?: number\n get gid() {\n return this.#gid\n }\n #rdev?: number\n get rdev() {\n return this.#rdev\n }\n #blksize?: number\n get blksize() {\n return this.#blksize\n }\n #ino?: number\n get ino() {\n return this.#ino\n }\n #size?: number\n get size() {\n return this.#size\n }\n #blocks?: number\n get blocks() {\n return this.#blocks\n }\n #atimeMs?: number\n get atimeMs() {\n return this.#atimeMs\n }\n #mtimeMs?: number\n get mtimeMs() {\n return this.#mtimeMs\n }\n #ctimeMs?: number\n get ctimeMs() {\n return this.#ctimeMs\n }\n #birthtimeMs?: number\n get birthtimeMs() {\n return this.#birthtimeMs\n }\n #atime?: Date\n get atime() {\n return this.#atime\n }\n #mtime?: Date\n get mtime() {\n return this.#mtime\n }\n #ctime?: Date\n get ctime() {\n return this.#ctime\n }\n #birthtime?: Date\n get birthtime() {\n return this.#birthtime\n }\n\n #matchName: string\n #depth?: number\n #fullpath?: string\n #fullpathPosix?: string\n #relative?: string\n #relativePosix?: string\n #type: number\n #children: ChildrenCache\n #linkTarget?: PathBase\n #realpath?: PathBase\n\n /**\n * This property is for compatibility with the Dirent class as of\n * Node v20, where Dirent['parentPath'] refers to the path of the\n * directory that was passed to readdir. For root entries, it's the path\n * to the entry itself.\n */\n get parentPath(): string {\n return (this.parent || this).fullpath()\n }\n\n /**\n * Deprecated alias for Dirent['parentPath'] Somewhat counterintuitively,\n * this property refers to the *parent* path, not the path object itself.\n */\n get path(): string {\n return this.parentPath\n }\n\n /**\n * Do not create new Path objects directly. They should always be accessed\n * via the PathScurry class or other methods on the Path class.\n *\n * @internal\n */\n constructor(\n name: string,\n type: number = UNKNOWN,\n root: PathBase | undefined,\n roots: { [k: string]: PathBase },\n nocase: boolean,\n children: ChildrenCache,\n opts: PathOpts,\n ) {\n this.name = name\n this.#matchName = nocase ? normalizeNocase(name) : normalize(name)\n this.#type = type & TYPEMASK\n this.nocase = nocase\n this.roots = roots\n this.root = root || this\n this.#children = children\n this.#fullpath = opts.fullpath\n this.#relative = opts.relative\n this.#relativePosix = opts.relativePosix\n this.parent = opts.parent\n if (this.parent) {\n this.#fs = this.parent.#fs\n } else {\n this.#fs = fsFromOption(opts.fs)\n }\n }\n\n /**\n * Returns the depth of the Path object from its root.\n *\n * For example, a path at `/foo/bar` would have a depth of 2.\n */\n depth(): number {\n if (this.#depth !== undefined) return this.#depth\n if (!this.parent) return (this.#depth = 0)\n return (this.#depth = this.parent.depth() + 1)\n }\n\n /**\n * @internal\n */\n abstract getRootString(path: string): string\n /**\n * @internal\n */\n abstract getRoot(rootPath: string): PathBase\n /**\n * @internal\n */\n abstract newChild(name: string, type?: number, opts?: PathOpts): PathBase\n\n /**\n * @internal\n */\n childrenCache() {\n return this.#children\n }\n\n /**\n * Get the Path object referenced by the string path, resolved from this Path\n */\n resolve(path?: string): PathBase {\n if (!path) {\n return this\n }\n const rootPath = this.getRootString(path)\n const dir = path.substring(rootPath.length)\n const dirParts = dir.split(this.splitSep)\n const result: PathBase =\n rootPath ?\n this.getRoot(rootPath).#resolveParts(dirParts)\n : this.#resolveParts(dirParts)\n return result\n }\n\n #resolveParts(dirParts: string[]) {\n let p: PathBase = this\n for (const part of dirParts) {\n p = p.child(part)\n }\n return p\n }\n\n /**\n * Returns the cached children Path objects, if still available. If they\n * have fallen out of the cache, then returns an empty array, and resets the\n * READDIR_CALLED bit, so that future calls to readdir() will require an fs\n * lookup.\n *\n * @internal\n */\n children(): Children {\n const cached = this.#children.get(this)\n if (cached) {\n return cached\n }\n const children: Children = Object.assign([], { provisional: 0 })\n this.#children.set(this, children)\n this.#type &= ~READDIR_CALLED\n return children\n }\n\n /**\n * Resolves a path portion and returns or creates the child Path.\n *\n * Returns `this` if pathPart is `''` or `'.'`, or `parent` if pathPart is\n * `'..'`.\n *\n * This should not be called directly. If `pathPart` contains any path\n * separators, it will lead to unsafe undefined behavior.\n *\n * Use `Path.resolve()` instead.\n *\n * @internal\n */\n child(pathPart: string, opts?: PathOpts): PathBase {\n if (pathPart === '' || pathPart === '.') {\n return this\n }\n if (pathPart === '..') {\n return this.parent || this\n }\n\n // find the child\n const children = this.children()\n const name =\n this.nocase ? normalizeNocase(pathPart) : normalize(pathPart)\n for (const p of children) {\n if (p.#matchName === name) {\n return p\n }\n }\n\n // didn't find it, create provisional child, since it might not\n // actually exist. If we know the parent isn't a dir, then\n // in fact it CAN'T exist.\n const s = this.parent ? this.sep : ''\n const fullpath =\n this.#fullpath ? this.#fullpath + s + pathPart : undefined\n const pchild = this.newChild(pathPart, UNKNOWN, {\n ...opts,\n parent: this,\n fullpath,\n })\n\n if (!this.canReaddir()) {\n pchild.#type |= ENOENT\n }\n\n // don't have to update provisional, because if we have real children,\n // then provisional is set to children.length, otherwise a lower number\n children.push(pchild)\n return pchild\n }\n\n /**\n * The relative path from the cwd. If it does not share an ancestor with\n * the cwd, then this ends up being equivalent to the fullpath()\n */\n relative(): string {\n if (this.isCWD) return ''\n if (this.#relative !== undefined) {\n return this.#relative\n }\n const name = this.name\n const p = this.parent\n if (!p) {\n return (this.#relative = this.name)\n }\n const pv = p.relative()\n return pv + (!pv || !p.parent ? '' : this.sep) + name\n }\n\n /**\n * The relative path from the cwd, using / as the path separator.\n * If it does not share an ancestor with\n * the cwd, then this ends up being equivalent to the fullpathPosix()\n * On posix systems, this is identical to relative().\n */\n relativePosix(): string {\n if (this.sep === '/') return this.relative()\n if (this.isCWD) return ''\n if (this.#relativePosix !== undefined) return this.#relativePosix\n const name = this.name\n const p = this.parent\n if (!p) {\n return (this.#relativePosix = this.fullpathPosix())\n }\n const pv = p.relativePosix()\n return pv + (!pv || !p.parent ? '' : '/') + name\n }\n\n /**\n * The fully resolved path string for this Path entry\n */\n fullpath(): string {\n if (this.#fullpath !== undefined) {\n return this.#fullpath\n }\n const name = this.name\n const p = this.parent\n if (!p) {\n return (this.#fullpath = this.name)\n }\n const pv = p.fullpath()\n const fp = pv + (!p.parent ? '' : this.sep) + name\n return (this.#fullpath = fp)\n }\n\n /**\n * On platforms other than windows, this is identical to fullpath.\n *\n * On windows, this is overridden to return the forward-slash form of the\n * full UNC path.\n */\n fullpathPosix(): string {\n if (this.#fullpathPosix !== undefined) return this.#fullpathPosix\n if (this.sep === '/') return (this.#fullpathPosix = this.fullpath())\n if (!this.parent) {\n const p = this.fullpath().replace(/\\\\/g, '/')\n if (/^[a-z]:\\//i.test(p)) {\n return (this.#fullpathPosix = `//?/${p}`)\n } else {\n return (this.#fullpathPosix = p)\n }\n }\n const p = this.parent\n const pfpp = p.fullpathPosix()\n const fpp = pfpp + (!pfpp || !p.parent ? '' : '/') + this.name\n return (this.#fullpathPosix = fpp)\n }\n\n /**\n * Is the Path of an unknown type?\n *\n * Note that we might know *something* about it if there has been a previous\n * filesystem operation, for example that it does not exist, or is not a\n * link, or whether it has child entries.\n */\n isUnknown(): boolean {\n return (this.#type & IFMT) === UNKNOWN\n }\n\n isType(type: Type): boolean {\n return this[`is${type}`]()\n }\n\n getType(): Type {\n return (\n this.isUnknown() ? 'Unknown'\n : this.isDirectory() ? 'Directory'\n : this.isFile() ? 'File'\n : this.isSymbolicLink() ? 'SymbolicLink'\n : this.isFIFO() ? 'FIFO'\n : this.isCharacterDevice() ? 'CharacterDevice'\n : this.isBlockDevice() ? 'BlockDevice'\n : /* c8 ignore start */ this.isSocket() ? 'Socket'\n : 'Unknown'\n )\n /* c8 ignore stop */\n }\n\n /**\n * Is the Path a regular file?\n */\n isFile(): boolean {\n return (this.#type & IFMT) === IFREG\n }\n\n /**\n * Is the Path a directory?\n */\n isDirectory(): boolean {\n return (this.#type & IFMT) === IFDIR\n }\n\n /**\n * Is the path a character device?\n */\n isCharacterDevice(): boolean {\n return (this.#type & IFMT) === IFCHR\n }\n\n /**\n * Is the path a block device?\n */\n isBlockDevice(): boolean {\n return (this.#type & IFMT) === IFBLK\n }\n\n /**\n * Is the path a FIFO pipe?\n */\n isFIFO(): boolean {\n return (this.#type & IFMT) === IFIFO\n }\n\n /**\n * Is the path a socket?\n */\n isSocket(): boolean {\n return (this.#type & IFMT) === IFSOCK\n }\n\n /**\n * Is the path a symbolic link?\n */\n isSymbolicLink(): boolean {\n return (this.#type & IFLNK) === IFLNK\n }\n\n /**\n * Return the entry if it has been subject of a successful lstat, or\n * undefined otherwise.\n *\n * Does not read the filesystem, so an undefined result *could* simply\n * mean that we haven't called lstat on it.\n */\n lstatCached(): PathBase | undefined {\n return this.#type & LSTAT_CALLED ? this : undefined\n }\n\n /**\n * Return the cached link target if the entry has been the subject of a\n * successful readlink, or undefined otherwise.\n *\n * Does not read the filesystem, so an undefined result *could* just mean we\n * don't have any cached data. Only use it if you are very sure that a\n * readlink() has been called at some point.\n */\n readlinkCached(): PathBase | undefined {\n return this.#linkTarget\n }\n\n /**\n * Returns the cached realpath target if the entry has been the subject\n * of a successful realpath, or undefined otherwise.\n *\n * Does not read the filesystem, so an undefined result *could* just mean we\n * don't have any cached data. Only use it if you are very sure that a\n * realpath() has been called at some point.\n */\n realpathCached(): PathBase | undefined {\n return this.#realpath\n }\n\n /**\n * Returns the cached child Path entries array if the entry has been the\n * subject of a successful readdir(), or [] otherwise.\n *\n * Does not read the filesystem, so an empty array *could* just mean we\n * don't have any cached data. Only use it if you are very sure that a\n * readdir() has been called recently enough to still be valid.\n */\n readdirCached(): PathBase[] {\n const children = this.children()\n return children.slice(0, children.provisional)\n }\n\n /**\n * Return true if it's worth trying to readlink. Ie, we don't (yet) have\n * any indication that readlink will definitely fail.\n *\n * Returns false if the path is known to not be a symlink, if a previous\n * readlink failed, or if the entry does not exist.\n */\n canReadlink(): boolean {\n if (this.#linkTarget) return true\n if (!this.parent) return false\n // cases where it cannot possibly succeed\n const ifmt = this.#type & IFMT\n return !(\n (ifmt !== UNKNOWN && ifmt !== IFLNK) ||\n this.#type & ENOREADLINK ||\n this.#type & ENOENT\n )\n }\n\n /**\n * Return true if readdir has previously been successfully called on this\n * path, indicating that cachedReaddir() is likely valid.\n */\n calledReaddir(): boolean {\n return !!(this.#type & READDIR_CALLED)\n }\n\n /**\n * Returns true if the path is known to not exist. That is, a previous lstat\n * or readdir failed to verify its existence when that would have been\n * expected, or a parent entry was marked either enoent or enotdir.\n */\n isENOENT(): boolean {\n return !!(this.#type & ENOENT)\n }\n\n /**\n * Return true if the path is a match for the given path name. This handles\n * case sensitivity and unicode normalization.\n *\n * Note: even on case-sensitive systems, it is **not** safe to test the\n * equality of the `.name` property to determine whether a given pathname\n * matches, due to unicode normalization mismatches.\n *\n * Always use this method instead of testing the `path.name` property\n * directly.\n */\n isNamed(n: string): boolean {\n return !this.nocase ?\n this.#matchName === normalize(n)\n : this.#matchName === normalizeNocase(n)\n }\n\n /**\n * Return the Path object corresponding to the target of a symbolic link.\n *\n * If the Path is not a symbolic link, or if the readlink call fails for any\n * reason, `undefined` is returned.\n *\n * Result is cached, and thus may be outdated if the filesystem is mutated.\n */\n async readlink(): Promise {\n const target = this.#linkTarget\n if (target) {\n return target\n }\n if (!this.canReadlink()) {\n return undefined\n }\n /* c8 ignore start */\n // already covered by the canReadlink test, here for ts grumples\n if (!this.parent) {\n return undefined\n }\n /* c8 ignore stop */\n try {\n const read = await this.#fs.promises.readlink(this.fullpath())\n const linkTarget = (await this.parent.realpath())?.resolve(read)\n if (linkTarget) {\n return (this.#linkTarget = linkTarget)\n }\n } catch (er) {\n this.#readlinkFail((er as NodeJS.ErrnoException).code)\n return undefined\n }\n }\n\n /**\n * Synchronous {@link PathBase.readlink}\n */\n readlinkSync(): PathBase | undefined {\n const target = this.#linkTarget\n if (target) {\n return target\n }\n if (!this.canReadlink()) {\n return undefined\n }\n /* c8 ignore start */\n // already covered by the canReadlink test, here for ts grumples\n if (!this.parent) {\n return undefined\n }\n /* c8 ignore stop */\n try {\n const read = this.#fs.readlinkSync(this.fullpath())\n const linkTarget = this.parent.realpathSync()?.resolve(read)\n if (linkTarget) {\n return (this.#linkTarget = linkTarget)\n }\n } catch (er) {\n this.#readlinkFail((er as NodeJS.ErrnoException).code)\n return undefined\n }\n }\n\n #readdirSuccess(children: Children) {\n // succeeded, mark readdir called bit\n this.#type |= READDIR_CALLED\n // mark all remaining provisional children as ENOENT\n for (let p = children.provisional; p < children.length; p++) {\n const c = children[p]\n if (c) c.#markENOENT()\n }\n }\n\n #markENOENT() {\n // mark as UNKNOWN and ENOENT\n if (this.#type & ENOENT) return\n this.#type = (this.#type | ENOENT) & IFMT_UNKNOWN\n this.#markChildrenENOENT()\n }\n\n #markChildrenENOENT() {\n // all children are provisional and do not exist\n const children = this.children()\n children.provisional = 0\n for (const p of children) {\n p.#markENOENT()\n }\n }\n\n #markENOREALPATH() {\n this.#type |= ENOREALPATH\n this.#markENOTDIR()\n }\n\n // save the information when we know the entry is not a dir\n #markENOTDIR() {\n // entry is not a directory, so any children can't exist.\n // this *should* be impossible, since any children created\n // after it's been marked ENOTDIR should be marked ENOENT,\n // so it won't even get to this point.\n /* c8 ignore start */\n if (this.#type & ENOTDIR) return\n /* c8 ignore stop */\n let t = this.#type\n // this could happen if we stat a dir, then delete it,\n // then try to read it or one of its children.\n if ((t & IFMT) === IFDIR) t &= IFMT_UNKNOWN\n this.#type = t | ENOTDIR\n this.#markChildrenENOENT()\n }\n\n #readdirFail(code: string = '') {\n // markENOTDIR and markENOENT also set provisional=0\n if (code === 'ENOTDIR' || code === 'EPERM') {\n this.#markENOTDIR()\n } else if (code === 'ENOENT') {\n this.#markENOENT()\n } else {\n this.children().provisional = 0\n }\n }\n\n #lstatFail(code: string = '') {\n // Windows just raises ENOENT in this case, disable for win CI\n /* c8 ignore start */\n if (code === 'ENOTDIR') {\n // already know it has a parent by this point\n const p = this.parent as PathBase\n p.#markENOTDIR()\n } else if (code === 'ENOENT') {\n /* c8 ignore stop */\n this.#markENOENT()\n }\n }\n\n #readlinkFail(code: string = '') {\n let ter = this.#type\n ter |= ENOREADLINK\n if (code === 'ENOENT') ter |= ENOENT\n // windows gets a weird error when you try to readlink a file\n if (code === 'EINVAL' || code === 'UNKNOWN') {\n // exists, but not a symlink, we don't know WHAT it is, so remove\n // all IFMT bits.\n ter &= IFMT_UNKNOWN\n }\n this.#type = ter\n // windows just gets ENOENT in this case. We do cover the case,\n // just disabled because it's impossible on Windows CI\n /* c8 ignore start */\n if (code === 'ENOTDIR' && this.parent) {\n this.parent.#markENOTDIR()\n }\n /* c8 ignore stop */\n }\n\n #readdirAddChild(e: Dirent, c: Children) {\n return (\n this.#readdirMaybePromoteChild(e, c) ||\n this.#readdirAddNewChild(e, c)\n )\n }\n\n #readdirAddNewChild(e: Dirent, c: Children): PathBase {\n // alloc new entry at head, so it's never provisional\n const type = entToType(e)\n const child = this.newChild(e.name, type, { parent: this })\n const ifmt = child.#type & IFMT\n if (ifmt !== IFDIR && ifmt !== IFLNK && ifmt !== UNKNOWN) {\n child.#type |= ENOTDIR\n }\n c.unshift(child)\n c.provisional++\n return child\n }\n\n #readdirMaybePromoteChild(e: Dirent, c: Children): PathBase | undefined {\n for (let p = c.provisional; p < c.length; p++) {\n const pchild = c[p]\n const name =\n this.nocase ? normalizeNocase(e.name) : normalize(e.name)\n if (name !== pchild!.#matchName) {\n continue\n }\n\n return this.#readdirPromoteChild(e, pchild!, p, c)\n }\n }\n\n #readdirPromoteChild(\n e: Dirent,\n p: PathBase,\n index: number,\n c: Children,\n ): PathBase {\n const v = p.name\n // retain any other flags, but set ifmt from dirent\n p.#type = (p.#type & IFMT_UNKNOWN) | entToType(e)\n // case sensitivity fixing when we learn the true name.\n if (v !== e.name) p.name = e.name\n\n // just advance provisional index (potentially off the list),\n // otherwise we have to splice/pop it out and re-insert at head\n if (index !== c.provisional) {\n if (index === c.length - 1) c.pop()\n else c.splice(index, 1)\n c.unshift(p)\n }\n c.provisional++\n return p\n }\n\n /**\n * Call lstat() on this Path, and update all known information that can be\n * determined.\n *\n * Note that unlike `fs.lstat()`, the returned value does not contain some\n * information, such as `mode`, `dev`, `nlink`, and `ino`. If that\n * information is required, you will need to call `fs.lstat` yourself.\n *\n * If the Path refers to a nonexistent file, or if the lstat call fails for\n * any reason, `undefined` is returned. Otherwise the updated Path object is\n * returned.\n *\n * Results are cached, and thus may be out of date if the filesystem is\n * mutated.\n */\n async lstat(): Promise {\n if ((this.#type & ENOENT) === 0) {\n try {\n this.#applyStat(await this.#fs.promises.lstat(this.fullpath()))\n return this\n } catch (er) {\n this.#lstatFail((er as NodeJS.ErrnoException).code)\n }\n }\n }\n\n /**\n * synchronous {@link PathBase.lstat}\n */\n lstatSync(): PathBase | undefined {\n if ((this.#type & ENOENT) === 0) {\n try {\n this.#applyStat(this.#fs.lstatSync(this.fullpath()))\n return this\n } catch (er) {\n this.#lstatFail((er as NodeJS.ErrnoException).code)\n }\n }\n }\n\n #applyStat(st: Stats) {\n const {\n atime,\n atimeMs,\n birthtime,\n birthtimeMs,\n blksize,\n blocks,\n ctime,\n ctimeMs,\n dev,\n gid,\n ino,\n mode,\n mtime,\n mtimeMs,\n nlink,\n rdev,\n size,\n uid,\n } = st\n this.#atime = atime\n this.#atimeMs = atimeMs\n this.#birthtime = birthtime\n this.#birthtimeMs = birthtimeMs\n this.#blksize = blksize\n this.#blocks = blocks\n this.#ctime = ctime\n this.#ctimeMs = ctimeMs\n this.#dev = dev\n this.#gid = gid\n this.#ino = ino\n this.#mode = mode\n this.#mtime = mtime\n this.#mtimeMs = mtimeMs\n this.#nlink = nlink\n this.#rdev = rdev\n this.#size = size\n this.#uid = uid\n const ifmt = entToType(st)\n // retain any other flags, but set the ifmt\n this.#type = (this.#type & IFMT_UNKNOWN) | ifmt | LSTAT_CALLED\n if (ifmt !== UNKNOWN && ifmt !== IFDIR && ifmt !== IFLNK) {\n this.#type |= ENOTDIR\n }\n }\n\n #onReaddirCB: ((\n er: NodeJS.ErrnoException | null,\n entries: Path[],\n ) => any)[] = []\n #readdirCBInFlight: boolean = false\n #callOnReaddirCB(children: Path[]) {\n this.#readdirCBInFlight = false\n const cbs = this.#onReaddirCB.slice()\n this.#onReaddirCB.length = 0\n cbs.forEach(cb => cb(null, children))\n }\n\n /**\n * Standard node-style callback interface to get list of directory entries.\n *\n * If the Path cannot or does not contain any children, then an empty array\n * is returned.\n *\n * Results are cached, and thus may be out of date if the filesystem is\n * mutated.\n *\n * @param cb The callback called with (er, entries). Note that the `er`\n * param is somewhat extraneous, as all readdir() errors are handled and\n * simply result in an empty set of entries being returned.\n * @param allowZalgo Boolean indicating that immediately known results should\n * *not* be deferred with `queueMicrotask`. Defaults to `false`. Release\n * zalgo at your peril, the dark pony lord is devious and unforgiving.\n */\n readdirCB(\n cb: (er: NodeJS.ErrnoException | null, entries: PathBase[]) => any,\n allowZalgo: boolean = false,\n ): void {\n if (!this.canReaddir()) {\n if (allowZalgo) cb(null, [])\n else queueMicrotask(() => cb(null, []))\n return\n }\n\n const children = this.children()\n if (this.calledReaddir()) {\n const c = children.slice(0, children.provisional)\n if (allowZalgo) cb(null, c)\n else queueMicrotask(() => cb(null, c))\n return\n }\n\n // don't have to worry about zalgo at this point.\n this.#onReaddirCB.push(cb)\n if (this.#readdirCBInFlight) {\n return\n }\n this.#readdirCBInFlight = true\n\n // else read the directory, fill up children\n // de-provisionalize any provisional children.\n const fullpath = this.fullpath()\n this.#fs.readdir(fullpath, { withFileTypes: true }, (er, entries) => {\n if (er) {\n this.#readdirFail((er as NodeJS.ErrnoException).code)\n children.provisional = 0\n } else {\n // if we didn't get an error, we always get entries.\n //@ts-ignore\n for (const e of entries) {\n this.#readdirAddChild(e, children)\n }\n this.#readdirSuccess(children)\n }\n this.#callOnReaddirCB(children.slice(0, children.provisional))\n return\n })\n }\n\n #asyncReaddirInFlight?: Promise\n\n /**\n * Return an array of known child entries.\n *\n * If the Path cannot or does not contain any children, then an empty array\n * is returned.\n *\n * Results are cached, and thus may be out of date if the filesystem is\n * mutated.\n */\n async readdir(): Promise {\n if (!this.canReaddir()) {\n return []\n }\n\n const children = this.children()\n if (this.calledReaddir()) {\n return children.slice(0, children.provisional)\n }\n\n // else read the directory, fill up children\n // de-provisionalize any provisional children.\n const fullpath = this.fullpath()\n if (this.#asyncReaddirInFlight) {\n await this.#asyncReaddirInFlight\n } else {\n /* c8 ignore start */\n let resolve: () => void = () => {}\n /* c8 ignore stop */\n this.#asyncReaddirInFlight = new Promise(\n res => (resolve = res),\n )\n try {\n for (const e of await this.#fs.promises.readdir(fullpath, {\n withFileTypes: true,\n })) {\n this.#readdirAddChild(e, children)\n }\n this.#readdirSuccess(children)\n } catch (er) {\n this.#readdirFail((er as NodeJS.ErrnoException).code)\n children.provisional = 0\n }\n this.#asyncReaddirInFlight = undefined\n resolve()\n }\n return children.slice(0, children.provisional)\n }\n\n /**\n * synchronous {@link PathBase.readdir}\n */\n readdirSync(): PathBase[] {\n if (!this.canReaddir()) {\n return []\n }\n\n const children = this.children()\n if (this.calledReaddir()) {\n return children.slice(0, children.provisional)\n }\n\n // else read the directory, fill up children\n // de-provisionalize any provisional children.\n const fullpath = this.fullpath()\n try {\n for (const e of this.#fs.readdirSync(fullpath, {\n withFileTypes: true,\n })) {\n this.#readdirAddChild(e, children)\n }\n this.#readdirSuccess(children)\n } catch (er) {\n this.#readdirFail((er as NodeJS.ErrnoException).code)\n children.provisional = 0\n }\n return children.slice(0, children.provisional)\n }\n\n canReaddir() {\n if (this.#type & ENOCHILD) return false\n const ifmt = IFMT & this.#type\n // we always set ENOTDIR when setting IFMT, so should be impossible\n /* c8 ignore start */\n if (!(ifmt === UNKNOWN || ifmt === IFDIR || ifmt === IFLNK)) {\n return false\n }\n /* c8 ignore stop */\n return true\n }\n\n shouldWalk(\n dirs: Set,\n walkFilter?: (e: PathBase) => boolean,\n ): boolean {\n return (\n (this.#type & IFDIR) === IFDIR &&\n !(this.#type & ENOCHILD) &&\n !dirs.has(this) &&\n (!walkFilter || walkFilter(this))\n )\n }\n\n /**\n * Return the Path object corresponding to path as resolved\n * by realpath(3).\n *\n * If the realpath call fails for any reason, `undefined` is returned.\n *\n * Result is cached, and thus may be outdated if the filesystem is mutated.\n * On success, returns a Path object.\n */\n async realpath(): Promise {\n if (this.#realpath) return this.#realpath\n if ((ENOREALPATH | ENOREADLINK | ENOENT) & this.#type) return undefined\n try {\n const rp = await this.#fs.promises.realpath(this.fullpath())\n return (this.#realpath = this.resolve(rp))\n } catch (_) {\n this.#markENOREALPATH()\n }\n }\n\n /**\n * Synchronous {@link realpath}\n */\n realpathSync(): PathBase | undefined {\n if (this.#realpath) return this.#realpath\n if ((ENOREALPATH | ENOREADLINK | ENOENT) & this.#type) return undefined\n try {\n const rp = this.#fs.realpathSync(this.fullpath())\n return (this.#realpath = this.resolve(rp))\n } catch (_) {\n this.#markENOREALPATH()\n }\n }\n\n /**\n * Internal method to mark this Path object as the scurry cwd,\n * called by {@link PathScurry#chdir}\n *\n * @internal\n */\n [setAsCwd](oldCwd: PathBase): void {\n if (oldCwd === this) return\n oldCwd.isCWD = false\n this.isCWD = true\n\n const changed = new Set([])\n let rp = []\n let p: PathBase = this\n while (p && p.parent) {\n changed.add(p)\n p.#relative = rp.join(this.sep)\n p.#relativePosix = rp.join('/')\n p = p.parent\n rp.push('..')\n }\n // now un-memoize parents of old cwd\n p = oldCwd\n while (p && p.parent && !changed.has(p)) {\n p.#relative = undefined\n p.#relativePosix = undefined\n p = p.parent\n }\n }\n}\n\n/**\n * Path class used on win32 systems\n *\n * Uses `'\\\\'` as the path separator for returned paths, either `'\\\\'` or `'/'`\n * as the path separator for parsing paths.\n */\nexport class PathWin32 extends PathBase {\n /**\n * Separator for generating path strings.\n */\n sep: '\\\\' = '\\\\'\n /**\n * Separator for parsing path strings.\n */\n splitSep: RegExp = eitherSep\n\n /**\n * Do not create new Path objects directly. They should always be accessed\n * via the PathScurry class or other methods on the Path class.\n *\n * @internal\n */\n constructor(\n name: string,\n type: number = UNKNOWN,\n root: PathBase | undefined,\n roots: { [k: string]: PathBase },\n nocase: boolean,\n children: ChildrenCache,\n opts: PathOpts,\n ) {\n super(name, type, root, roots, nocase, children, opts)\n }\n\n /**\n * @internal\n */\n newChild(name: string, type: number = UNKNOWN, opts: PathOpts = {}) {\n return new PathWin32(\n name,\n type,\n this.root,\n this.roots,\n this.nocase,\n this.childrenCache(),\n opts,\n )\n }\n\n /**\n * @internal\n */\n getRootString(path: string): string {\n return win32.parse(path).root\n }\n\n /**\n * @internal\n */\n getRoot(rootPath: string): PathBase {\n rootPath = uncToDrive(rootPath.toUpperCase())\n if (rootPath === this.root.name) {\n return this.root\n }\n // ok, not that one, check if it matches another we know about\n for (const [compare, root] of Object.entries(this.roots)) {\n if (this.sameRoot(rootPath, compare)) {\n return (this.roots[rootPath] = root)\n }\n }\n // otherwise, have to create a new one.\n return (this.roots[rootPath] = new PathScurryWin32(\n rootPath,\n this,\n ).root)\n }\n\n /**\n * @internal\n */\n sameRoot(rootPath: string, compare: string = this.root.name): boolean {\n // windows can (rarely) have case-sensitive filesystem, but\n // UNC and drive letters are always case-insensitive, and canonically\n // represented uppercase.\n rootPath = rootPath\n .toUpperCase()\n .replace(/\\//g, '\\\\')\n .replace(uncDriveRegexp, '$1\\\\')\n return rootPath === compare\n }\n}\n\n/**\n * Path class used on all posix systems.\n *\n * Uses `'/'` as the path separator.\n */\nexport class PathPosix extends PathBase {\n /**\n * separator for parsing path strings\n */\n splitSep: '/' = '/'\n /**\n * separator for generating path strings\n */\n sep: '/' = '/'\n\n /**\n * Do not create new Path objects directly. They should always be accessed\n * via the PathScurry class or other methods on the Path class.\n *\n * @internal\n */\n constructor(\n name: string,\n type: number = UNKNOWN,\n root: PathBase | undefined,\n roots: { [k: string]: PathBase },\n nocase: boolean,\n children: ChildrenCache,\n opts: PathOpts,\n ) {\n super(name, type, root, roots, nocase, children, opts)\n }\n\n /**\n * @internal\n */\n getRootString(path: string): string {\n return path.startsWith('/') ? '/' : ''\n }\n\n /**\n * @internal\n */\n getRoot(_rootPath: string): PathBase {\n return this.root\n }\n\n /**\n * @internal\n */\n newChild(name: string, type: number = UNKNOWN, opts: PathOpts = {}) {\n return new PathPosix(\n name,\n type,\n this.root,\n this.roots,\n this.nocase,\n this.childrenCache(),\n opts,\n )\n }\n}\n\n/**\n * Options that may be provided to the PathScurry constructor\n */\nexport interface PathScurryOpts {\n /**\n * perform case-insensitive path matching. Default based on platform\n * subclass.\n */\n nocase?: boolean\n /**\n * Number of Path entries to keep in the cache of Path child references.\n *\n * Setting this higher than 65536 will dramatically increase the data\n * consumption and construction time overhead of each PathScurry.\n *\n * Setting this value to 256 or lower will significantly reduce the data\n * consumption and construction time overhead, but may also reduce resolve()\n * and readdir() performance on large filesystems.\n *\n * Default `16384`.\n */\n childrenCacheSize?: number\n /**\n * An object that overrides the built-in functions from the fs and\n * fs/promises modules.\n *\n * See {@link FSOption}\n */\n fs?: FSOption\n}\n\n/**\n * The base class for all PathScurry classes, providing the interface for path\n * resolution and filesystem operations.\n *\n * Typically, you should *not* instantiate this class directly, but rather one\n * of the platform-specific classes, or the exported {@link PathScurry} which\n * defaults to the current platform.\n */\nexport abstract class PathScurryBase {\n /**\n * The root Path entry for the current working directory of this Scurry\n */\n root: PathBase\n /**\n * The string path for the root of this Scurry's current working directory\n */\n rootPath: string\n /**\n * A collection of all roots encountered, referenced by rootPath\n */\n roots: { [k: string]: PathBase }\n /**\n * The Path entry corresponding to this PathScurry's current working directory.\n */\n cwd: PathBase\n #resolveCache: ResolveCache\n #resolvePosixCache: ResolveCache\n #children: ChildrenCache\n /**\n * Perform path comparisons case-insensitively.\n *\n * Defaults true on Darwin and Windows systems, false elsewhere.\n */\n nocase: boolean\n\n /**\n * The path separator used for parsing paths\n *\n * `'/'` on Posix systems, either `'/'` or `'\\\\'` on Windows\n */\n abstract sep: string | RegExp\n\n #fs: FSValue\n\n /**\n * This class should not be instantiated directly.\n *\n * Use PathScurryWin32, PathScurryDarwin, PathScurryPosix, or PathScurry\n *\n * @internal\n */\n constructor(\n cwd: URL | string = process.cwd(),\n pathImpl: typeof win32 | typeof posix,\n sep: string | RegExp,\n {\n nocase,\n childrenCacheSize = 16 * 1024,\n fs = defaultFS,\n }: PathScurryOpts = {},\n ) {\n this.#fs = fsFromOption(fs)\n if (cwd instanceof URL || cwd.startsWith('file://')) {\n cwd = fileURLToPath(cwd)\n }\n // resolve and split root, and then add to the store.\n // this is the only time we call path.resolve()\n const cwdPath = pathImpl.resolve(cwd)\n this.roots = Object.create(null)\n this.rootPath = this.parseRootPath(cwdPath)\n this.#resolveCache = new ResolveCache()\n this.#resolvePosixCache = new ResolveCache()\n this.#children = new ChildrenCache(childrenCacheSize)\n\n const split = cwdPath.substring(this.rootPath.length).split(sep)\n // resolve('/') leaves '', splits to [''], we don't want that.\n if (split.length === 1 && !split[0]) {\n split.pop()\n }\n /* c8 ignore start */\n if (nocase === undefined) {\n throw new TypeError(\n 'must provide nocase setting to PathScurryBase ctor',\n )\n }\n /* c8 ignore stop */\n this.nocase = nocase\n this.root = this.newRoot(this.#fs)\n this.roots[this.rootPath] = this.root\n let prev: PathBase = this.root\n let len = split.length - 1\n const joinSep = pathImpl.sep\n let abs = this.rootPath\n let sawFirst = false\n for (const part of split) {\n const l = len--\n prev = prev.child(part, {\n relative: new Array(l).fill('..').join(joinSep),\n relativePosix: new Array(l).fill('..').join('/'),\n fullpath: (abs += (sawFirst ? '' : joinSep) + part),\n })\n sawFirst = true\n }\n this.cwd = prev\n }\n\n /**\n * Get the depth of a provided path, string, or the cwd\n */\n depth(path: Path | string = this.cwd): number {\n if (typeof path === 'string') {\n path = this.cwd.resolve(path)\n }\n return path.depth()\n }\n\n /**\n * Parse the root portion of a path string\n *\n * @internal\n */\n abstract parseRootPath(dir: string): string\n /**\n * create a new Path to use as root during construction.\n *\n * @internal\n */\n abstract newRoot(fs: FSValue): PathBase\n /**\n * Determine whether a given path string is absolute\n */\n abstract isAbsolute(p: string): boolean\n\n /**\n * Return the cache of child entries. Exposed so subclasses can create\n * child Path objects in a platform-specific way.\n *\n * @internal\n */\n childrenCache() {\n return this.#children\n }\n\n /**\n * Resolve one or more path strings to a resolved string\n *\n * Same interface as require('path').resolve.\n *\n * Much faster than path.resolve() when called multiple times for the same\n * path, because the resolved Path objects are cached. Much slower\n * otherwise.\n */\n resolve(...paths: string[]): string {\n // first figure out the minimum number of paths we have to test\n // we always start at cwd, but any absolutes will bump the start\n let r = ''\n for (let i = paths.length - 1; i >= 0; i--) {\n const p = paths[i]\n if (!p || p === '.') continue\n r = r ? `${p}/${r}` : p\n if (this.isAbsolute(p)) {\n break\n }\n }\n const cached = this.#resolveCache.get(r)\n if (cached !== undefined) {\n return cached\n }\n const result = this.cwd.resolve(r).fullpath()\n this.#resolveCache.set(r, result)\n return result\n }\n\n /**\n * Resolve one or more path strings to a resolved string, returning\n * the posix path. Identical to .resolve() on posix systems, but on\n * windows will return a forward-slash separated UNC path.\n *\n * Same interface as require('path').resolve.\n *\n * Much faster than path.resolve() when called multiple times for the same\n * path, because the resolved Path objects are cached. Much slower\n * otherwise.\n */\n resolvePosix(...paths: string[]): string {\n // first figure out the minimum number of paths we have to test\n // we always start at cwd, but any absolutes will bump the start\n let r = ''\n for (let i = paths.length - 1; i >= 0; i--) {\n const p = paths[i]\n if (!p || p === '.') continue\n r = r ? `${p}/${r}` : p\n if (this.isAbsolute(p)) {\n break\n }\n }\n const cached = this.#resolvePosixCache.get(r)\n if (cached !== undefined) {\n return cached\n }\n const result = this.cwd.resolve(r).fullpathPosix()\n this.#resolvePosixCache.set(r, result)\n return result\n }\n\n /**\n * find the relative path from the cwd to the supplied path string or entry\n */\n relative(entry: PathBase | string = this.cwd): string {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n }\n return entry.relative()\n }\n\n /**\n * find the relative path from the cwd to the supplied path string or\n * entry, using / as the path delimiter, even on Windows.\n */\n relativePosix(entry: PathBase | string = this.cwd): string {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n }\n return entry.relativePosix()\n }\n\n /**\n * Return the basename for the provided string or Path object\n */\n basename(entry: PathBase | string = this.cwd): string {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n }\n return entry.name\n }\n\n /**\n * Return the dirname for the provided string or Path object\n */\n dirname(entry: PathBase | string = this.cwd): string {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n }\n return (entry.parent || entry).fullpath()\n }\n\n /**\n * Return an array of known child entries.\n *\n * First argument may be either a string, or a Path object.\n *\n * If the Path cannot or does not contain any children, then an empty array\n * is returned.\n *\n * Results are cached, and thus may be out of date if the filesystem is\n * mutated.\n *\n * Unlike `fs.readdir()`, the `withFileTypes` option defaults to `true`. Set\n * `{ withFileTypes: false }` to return strings.\n */\n\n readdir(): Promise\n readdir(opts: { withFileTypes: true }): Promise\n readdir(opts: { withFileTypes: false }): Promise\n readdir(opts: { withFileTypes: boolean }): Promise\n readdir(entry: PathBase | string): Promise\n readdir(\n entry: PathBase | string,\n opts: { withFileTypes: true },\n ): Promise\n readdir(\n entry: PathBase | string,\n opts: { withFileTypes: false },\n ): Promise\n readdir(\n entry: PathBase | string,\n opts: { withFileTypes: boolean },\n ): Promise\n async readdir(\n entry: PathBase | string | { withFileTypes: boolean } = this.cwd,\n opts: { withFileTypes: boolean } = {\n withFileTypes: true,\n },\n ): Promise {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n } else if (!(entry instanceof PathBase)) {\n opts = entry\n entry = this.cwd\n }\n const { withFileTypes } = opts\n if (!entry.canReaddir()) {\n return []\n } else {\n const p = await entry.readdir()\n return withFileTypes ? p : p.map(e => e.name)\n }\n }\n\n /**\n * synchronous {@link PathScurryBase.readdir}\n */\n readdirSync(): PathBase[]\n readdirSync(opts: { withFileTypes: true }): PathBase[]\n readdirSync(opts: { withFileTypes: false }): string[]\n readdirSync(opts: { withFileTypes: boolean }): PathBase[] | string[]\n readdirSync(entry: PathBase | string): PathBase[]\n readdirSync(\n entry: PathBase | string,\n opts: { withFileTypes: true },\n ): PathBase[]\n readdirSync(\n entry: PathBase | string,\n opts: { withFileTypes: false },\n ): string[]\n readdirSync(\n entry: PathBase | string,\n opts: { withFileTypes: boolean },\n ): PathBase[] | string[]\n readdirSync(\n entry: PathBase | string | { withFileTypes: boolean } = this.cwd,\n opts: { withFileTypes: boolean } = {\n withFileTypes: true,\n },\n ): PathBase[] | string[] {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n } else if (!(entry instanceof PathBase)) {\n opts = entry\n entry = this.cwd\n }\n const { withFileTypes = true } = opts\n if (!entry.canReaddir()) {\n return []\n } else if (withFileTypes) {\n return entry.readdirSync()\n } else {\n return entry.readdirSync().map(e => e.name)\n }\n }\n\n /**\n * Call lstat() on the string or Path object, and update all known\n * information that can be determined.\n *\n * Note that unlike `fs.lstat()`, the returned value does not contain some\n * information, such as `mode`, `dev`, `nlink`, and `ino`. If that\n * information is required, you will need to call `fs.lstat` yourself.\n *\n * If the Path refers to a nonexistent file, or if the lstat call fails for\n * any reason, `undefined` is returned. Otherwise the updated Path object is\n * returned.\n *\n * Results are cached, and thus may be out of date if the filesystem is\n * mutated.\n */\n async lstat(\n entry: string | PathBase = this.cwd,\n ): Promise {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n }\n return entry.lstat()\n }\n\n /**\n * synchronous {@link PathScurryBase.lstat}\n */\n lstatSync(entry: string | PathBase = this.cwd): PathBase | undefined {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n }\n return entry.lstatSync()\n }\n\n /**\n * Return the Path object or string path corresponding to the target of a\n * symbolic link.\n *\n * If the path is not a symbolic link, or if the readlink call fails for any\n * reason, `undefined` is returned.\n *\n * Result is cached, and thus may be outdated if the filesystem is mutated.\n *\n * `{withFileTypes}` option defaults to `false`.\n *\n * On success, returns a Path object if `withFileTypes` option is true,\n * otherwise a string.\n */\n readlink(): Promise\n readlink(opt: { withFileTypes: false }): Promise\n readlink(opt: { withFileTypes: true }): Promise\n readlink(opt: {\n withFileTypes: boolean\n }): Promise\n readlink(\n entry: string | PathBase,\n opt?: { withFileTypes: false },\n ): Promise\n readlink(\n entry: string | PathBase,\n opt: { withFileTypes: true },\n ): Promise\n readlink(\n entry: string | PathBase,\n opt: { withFileTypes: boolean },\n ): Promise\n async readlink(\n entry: string | PathBase | { withFileTypes: boolean } = this.cwd,\n { withFileTypes }: { withFileTypes: boolean } = {\n withFileTypes: false,\n },\n ): Promise {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n } else if (!(entry instanceof PathBase)) {\n withFileTypes = entry.withFileTypes\n entry = this.cwd\n }\n const e = await entry.readlink()\n return withFileTypes ? e : e?.fullpath()\n }\n\n /**\n * synchronous {@link PathScurryBase.readlink}\n */\n readlinkSync(): string | undefined\n readlinkSync(opt: { withFileTypes: false }): string | undefined\n readlinkSync(opt: { withFileTypes: true }): PathBase | undefined\n readlinkSync(opt: {\n withFileTypes: boolean\n }): PathBase | string | undefined\n readlinkSync(\n entry: string | PathBase,\n opt?: { withFileTypes: false },\n ): string | undefined\n readlinkSync(\n entry: string | PathBase,\n opt: { withFileTypes: true },\n ): PathBase | undefined\n readlinkSync(\n entry: string | PathBase,\n opt: { withFileTypes: boolean },\n ): string | PathBase | undefined\n readlinkSync(\n entry: string | PathBase | { withFileTypes: boolean } = this.cwd,\n { withFileTypes }: { withFileTypes: boolean } = {\n withFileTypes: false,\n },\n ): string | PathBase | undefined {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n } else if (!(entry instanceof PathBase)) {\n withFileTypes = entry.withFileTypes\n entry = this.cwd\n }\n const e = entry.readlinkSync()\n return withFileTypes ? e : e?.fullpath()\n }\n\n /**\n * Return the Path object or string path corresponding to path as resolved\n * by realpath(3).\n *\n * If the realpath call fails for any reason, `undefined` is returned.\n *\n * Result is cached, and thus may be outdated if the filesystem is mutated.\n *\n * `{withFileTypes}` option defaults to `false`.\n *\n * On success, returns a Path object if `withFileTypes` option is true,\n * otherwise a string.\n */\n realpath(): Promise\n realpath(opt: { withFileTypes: false }): Promise\n realpath(opt: { withFileTypes: true }): Promise\n realpath(opt: {\n withFileTypes: boolean\n }): Promise\n realpath(\n entry: string | PathBase,\n opt?: { withFileTypes: false },\n ): Promise\n realpath(\n entry: string | PathBase,\n opt: { withFileTypes: true },\n ): Promise\n realpath(\n entry: string | PathBase,\n opt: { withFileTypes: boolean },\n ): Promise\n async realpath(\n entry: string | PathBase | { withFileTypes: boolean } = this.cwd,\n { withFileTypes }: { withFileTypes: boolean } = {\n withFileTypes: false,\n },\n ): Promise {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n } else if (!(entry instanceof PathBase)) {\n withFileTypes = entry.withFileTypes\n entry = this.cwd\n }\n const e = await entry.realpath()\n return withFileTypes ? e : e?.fullpath()\n }\n\n realpathSync(): string | undefined\n realpathSync(opt: { withFileTypes: false }): string | undefined\n realpathSync(opt: { withFileTypes: true }): PathBase | undefined\n realpathSync(opt: {\n withFileTypes: boolean\n }): PathBase | string | undefined\n realpathSync(\n entry: string | PathBase,\n opt?: { withFileTypes: false },\n ): string | undefined\n realpathSync(\n entry: string | PathBase,\n opt: { withFileTypes: true },\n ): PathBase | undefined\n realpathSync(\n entry: string | PathBase,\n opt: { withFileTypes: boolean },\n ): string | PathBase | undefined\n realpathSync(\n entry: string | PathBase | { withFileTypes: boolean } = this.cwd,\n { withFileTypes }: { withFileTypes: boolean } = {\n withFileTypes: false,\n },\n ): string | PathBase | undefined {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n } else if (!(entry instanceof PathBase)) {\n withFileTypes = entry.withFileTypes\n entry = this.cwd\n }\n const e = entry.realpathSync()\n return withFileTypes ? e : e?.fullpath()\n }\n\n /**\n * Asynchronously walk the directory tree, returning an array of\n * all path strings or Path objects found.\n *\n * Note that this will be extremely memory-hungry on large filesystems.\n * In such cases, it may be better to use the stream or async iterator\n * walk implementation.\n */\n walk(): Promise\n walk(\n opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n ): Promise\n walk(opts: WalkOptionsWithFileTypesFalse): Promise\n walk(opts: WalkOptions): Promise\n walk(entry: string | PathBase): Promise\n walk(\n entry: string | PathBase,\n opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n ): Promise\n walk(\n entry: string | PathBase,\n opts: WalkOptionsWithFileTypesFalse,\n ): Promise\n walk(\n entry: string | PathBase,\n opts: WalkOptions,\n ): Promise\n async walk(\n entry: string | PathBase | WalkOptions = this.cwd,\n opts: WalkOptions = {},\n ): Promise {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n } else if (!(entry instanceof PathBase)) {\n opts = entry\n entry = this.cwd\n }\n const {\n withFileTypes = true,\n follow = false,\n filter,\n walkFilter,\n } = opts\n const results: (string | PathBase)[] = []\n if (!filter || filter(entry)) {\n results.push(withFileTypes ? entry : entry.fullpath())\n }\n const dirs = new Set()\n const walk = (\n dir: PathBase,\n cb: (er?: NodeJS.ErrnoException) => void,\n ) => {\n dirs.add(dir)\n dir.readdirCB((er, entries) => {\n /* c8 ignore start */\n if (er) {\n return cb(er)\n }\n /* c8 ignore stop */\n let len = entries.length\n if (!len) return cb()\n const next = () => {\n if (--len === 0) {\n cb()\n }\n }\n for (const e of entries) {\n if (!filter || filter(e)) {\n results.push(withFileTypes ? e : e.fullpath())\n }\n if (follow && e.isSymbolicLink()) {\n e.realpath()\n .then(r => (r?.isUnknown() ? r.lstat() : r))\n .then(r =>\n r?.shouldWalk(dirs, walkFilter) ? walk(r, next) : next(),\n )\n } else {\n if (e.shouldWalk(dirs, walkFilter)) {\n walk(e, next)\n } else {\n next()\n }\n }\n }\n }, true) // zalgooooooo\n }\n\n const start = entry\n return new Promise((res, rej) => {\n walk(start, er => {\n /* c8 ignore start */\n if (er) return rej(er)\n /* c8 ignore stop */\n res(results as PathBase[] | string[])\n })\n })\n }\n\n /**\n * Synchronously walk the directory tree, returning an array of\n * all path strings or Path objects found.\n *\n * Note that this will be extremely memory-hungry on large filesystems.\n * In such cases, it may be better to use the stream or async iterator\n * walk implementation.\n */\n walkSync(): PathBase[]\n walkSync(\n opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n ): PathBase[]\n walkSync(opts: WalkOptionsWithFileTypesFalse): string[]\n walkSync(opts: WalkOptions): string[] | PathBase[]\n walkSync(entry: string | PathBase): PathBase[]\n walkSync(\n entry: string | PathBase,\n opts: WalkOptionsWithFileTypesUnset | WalkOptionsWithFileTypesTrue,\n ): PathBase[]\n walkSync(\n entry: string | PathBase,\n opts: WalkOptionsWithFileTypesFalse,\n ): string[]\n walkSync(\n entry: string | PathBase,\n opts: WalkOptions,\n ): PathBase[] | string[]\n walkSync(\n entry: string | PathBase | WalkOptions = this.cwd,\n opts: WalkOptions = {},\n ): PathBase[] | string[] {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n } else if (!(entry instanceof PathBase)) {\n opts = entry\n entry = this.cwd\n }\n const {\n withFileTypes = true,\n follow = false,\n filter,\n walkFilter,\n } = opts\n const results: (string | PathBase)[] = []\n if (!filter || filter(entry)) {\n results.push(withFileTypes ? entry : entry.fullpath())\n }\n const dirs = new Set([entry])\n for (const dir of dirs) {\n const entries = dir.readdirSync()\n for (const e of entries) {\n if (!filter || filter(e)) {\n results.push(withFileTypes ? e : e.fullpath())\n }\n let r: PathBase | undefined = e\n if (e.isSymbolicLink()) {\n if (!(follow && (r = e.realpathSync()))) continue\n if (r.isUnknown()) r.lstatSync()\n }\n if (r.shouldWalk(dirs, walkFilter)) {\n dirs.add(r)\n }\n }\n }\n return results as string[] | PathBase[]\n }\n\n /**\n * Support for `for await`\n *\n * Alias for {@link PathScurryBase.iterate}\n *\n * Note: As of Node 19, this is very slow, compared to other methods of\n * walking. Consider using {@link PathScurryBase.stream} if memory overhead\n * and backpressure are concerns, or {@link PathScurryBase.walk} if not.\n */\n [Symbol.asyncIterator]() {\n return this.iterate()\n }\n\n /**\n * Async generator form of {@link PathScurryBase.walk}\n *\n * Note: As of Node 19, this is very slow, compared to other methods of\n * walking, especially if most/all of the directory tree has been previously\n * walked. Consider using {@link PathScurryBase.stream} if memory overhead\n * and backpressure are concerns, or {@link PathScurryBase.walk} if not.\n */\n iterate(): AsyncGenerator\n iterate(\n opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n ): AsyncGenerator\n iterate(\n opts: WalkOptionsWithFileTypesFalse,\n ): AsyncGenerator\n iterate(opts: WalkOptions): AsyncGenerator\n iterate(entry: string | PathBase): AsyncGenerator\n iterate(\n entry: string | PathBase,\n opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n ): AsyncGenerator\n iterate(\n entry: string | PathBase,\n opts: WalkOptionsWithFileTypesFalse,\n ): AsyncGenerator\n iterate(\n entry: string | PathBase,\n opts: WalkOptions,\n ): AsyncGenerator\n iterate(\n entry: string | PathBase | WalkOptions = this.cwd,\n options: WalkOptions = {},\n ): AsyncGenerator {\n // iterating async over the stream is significantly more performant,\n // especially in the warm-cache scenario, because it buffers up directory\n // entries in the background instead of waiting for a yield for each one.\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n } else if (!(entry instanceof PathBase)) {\n options = entry\n entry = this.cwd\n }\n return this.stream(entry, options)[Symbol.asyncIterator]()\n }\n\n /**\n * Iterating over a PathScurry performs a synchronous walk.\n *\n * Alias for {@link PathScurryBase.iterateSync}\n */\n [Symbol.iterator]() {\n return this.iterateSync()\n }\n\n iterateSync(): Generator\n iterateSync(\n opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n ): Generator\n iterateSync(\n opts: WalkOptionsWithFileTypesFalse,\n ): Generator\n iterateSync(opts: WalkOptions): Generator\n iterateSync(entry: string | PathBase): Generator\n iterateSync(\n entry: string | PathBase,\n opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n ): Generator\n iterateSync(\n entry: string | PathBase,\n opts: WalkOptionsWithFileTypesFalse,\n ): Generator\n iterateSync(\n entry: string | PathBase,\n opts: WalkOptions,\n ): Generator\n *iterateSync(\n entry: string | PathBase | WalkOptions = this.cwd,\n opts: WalkOptions = {},\n ): Generator {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n } else if (!(entry instanceof PathBase)) {\n opts = entry\n entry = this.cwd\n }\n const {\n withFileTypes = true,\n follow = false,\n filter,\n walkFilter,\n } = opts\n if (!filter || filter(entry)) {\n yield withFileTypes ? entry : entry.fullpath()\n }\n const dirs = new Set([entry])\n for (const dir of dirs) {\n const entries = dir.readdirSync()\n for (const e of entries) {\n if (!filter || filter(e)) {\n yield withFileTypes ? e : e.fullpath()\n }\n let r: PathBase | undefined = e\n if (e.isSymbolicLink()) {\n if (!(follow && (r = e.realpathSync()))) continue\n if (r.isUnknown()) r.lstatSync()\n }\n if (r.shouldWalk(dirs, walkFilter)) {\n dirs.add(r)\n }\n }\n }\n }\n\n /**\n * Stream form of {@link PathScurryBase.walk}\n *\n * Returns a Minipass stream that emits {@link PathBase} objects by default,\n * or strings if `{ withFileTypes: false }` is set in the options.\n */\n stream(): Minipass\n stream(\n opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n ): Minipass\n stream(opts: WalkOptionsWithFileTypesFalse): Minipass\n stream(opts: WalkOptions): Minipass\n stream(entry: string | PathBase): Minipass\n stream(\n entry: string | PathBase,\n opts: WalkOptionsWithFileTypesUnset | WalkOptionsWithFileTypesTrue,\n ): Minipass\n stream(\n entry: string | PathBase,\n opts: WalkOptionsWithFileTypesFalse,\n ): Minipass\n stream(\n entry: string | PathBase,\n opts: WalkOptions,\n ): Minipass | Minipass\n stream(\n entry: string | PathBase | WalkOptions = this.cwd,\n opts: WalkOptions = {},\n ): Minipass | Minipass {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n } else if (!(entry instanceof PathBase)) {\n opts = entry\n entry = this.cwd\n }\n const {\n withFileTypes = true,\n follow = false,\n filter,\n walkFilter,\n } = opts\n const results = new Minipass({ objectMode: true })\n if (!filter || filter(entry)) {\n results.write(withFileTypes ? entry : entry.fullpath())\n }\n const dirs = new Set()\n const queue: PathBase[] = [entry]\n let processing = 0\n const process = () => {\n let paused = false\n while (!paused) {\n const dir = queue.shift()\n if (!dir) {\n if (processing === 0) results.end()\n return\n }\n\n processing++\n dirs.add(dir)\n\n const onReaddir = (\n er: null | NodeJS.ErrnoException,\n entries: PathBase[],\n didRealpaths: boolean = false,\n ) => {\n /* c8 ignore start */\n if (er) return results.emit('error', er)\n /* c8 ignore stop */\n if (follow && !didRealpaths) {\n const promises: Promise[] = []\n for (const e of entries) {\n if (e.isSymbolicLink()) {\n promises.push(\n e\n .realpath()\n .then((r: PathBase | undefined) =>\n r?.isUnknown() ? r.lstat() : r,\n ),\n )\n }\n }\n if (promises.length) {\n Promise.all(promises).then(() =>\n onReaddir(null, entries, true),\n )\n return\n }\n }\n\n for (const e of entries) {\n if (e && (!filter || filter(e))) {\n if (!results.write(withFileTypes ? e : e.fullpath())) {\n paused = true\n }\n }\n }\n\n processing--\n for (const e of entries) {\n const r = e.realpathCached() || e\n if (r.shouldWalk(dirs, walkFilter)) {\n queue.push(r)\n }\n }\n if (paused && !results.flowing) {\n results.once('drain', process)\n } else if (!sync) {\n process()\n }\n }\n\n // zalgo containment\n let sync = true\n dir.readdirCB(onReaddir, true)\n sync = false\n }\n }\n process()\n return results as Minipass | Minipass\n }\n\n /**\n * Synchronous form of {@link PathScurryBase.stream}\n *\n * Returns a Minipass stream that emits {@link PathBase} objects by default,\n * or strings if `{ withFileTypes: false }` is set in the options.\n *\n * Will complete the walk in a single tick if the stream is consumed fully.\n * Otherwise, will pause as needed for stream backpressure.\n */\n streamSync(): Minipass\n streamSync(\n opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset,\n ): Minipass\n streamSync(opts: WalkOptionsWithFileTypesFalse): Minipass\n streamSync(opts: WalkOptions): Minipass\n streamSync(entry: string | PathBase): Minipass\n streamSync(\n entry: string | PathBase,\n opts: WalkOptionsWithFileTypesUnset | WalkOptionsWithFileTypesTrue,\n ): Minipass\n streamSync(\n entry: string | PathBase,\n opts: WalkOptionsWithFileTypesFalse,\n ): Minipass\n streamSync(\n entry: string | PathBase,\n opts: WalkOptions,\n ): Minipass | Minipass\n streamSync(\n entry: string | PathBase | WalkOptions = this.cwd,\n opts: WalkOptions = {},\n ): Minipass | Minipass {\n if (typeof entry === 'string') {\n entry = this.cwd.resolve(entry)\n } else if (!(entry instanceof PathBase)) {\n opts = entry\n entry = this.cwd\n }\n const {\n withFileTypes = true,\n follow = false,\n filter,\n walkFilter,\n } = opts\n const results = new Minipass({ objectMode: true })\n const dirs = new Set()\n if (!filter || filter(entry)) {\n results.write(withFileTypes ? entry : entry.fullpath())\n }\n const queue: PathBase[] = [entry]\n let processing = 0\n const process = () => {\n let paused = false\n while (!paused) {\n const dir = queue.shift()\n if (!dir) {\n if (processing === 0) results.end()\n return\n }\n processing++\n dirs.add(dir)\n\n const entries = dir.readdirSync()\n for (const e of entries) {\n if (!filter || filter(e)) {\n if (!results.write(withFileTypes ? e : e.fullpath())) {\n paused = true\n }\n }\n }\n processing--\n for (const e of entries) {\n let r: PathBase | undefined = e\n if (e.isSymbolicLink()) {\n if (!(follow && (r = e.realpathSync()))) continue\n if (r.isUnknown()) r.lstatSync()\n }\n if (r.shouldWalk(dirs, walkFilter)) {\n queue.push(r)\n }\n }\n }\n if (paused && !results.flowing) results.once('drain', process)\n }\n process()\n return results as Minipass | Minipass\n }\n\n chdir(path: string | Path = this.cwd) {\n const oldCwd = this.cwd\n this.cwd = typeof path === 'string' ? this.cwd.resolve(path) : path\n this.cwd[setAsCwd](oldCwd)\n }\n}\n\n/**\n * Options provided to all walk methods.\n */\nexport interface WalkOptions {\n /**\n * Return results as {@link PathBase} objects rather than strings.\n * When set to false, results are fully resolved paths, as returned by\n * {@link PathBase.fullpath}.\n * @default true\n */\n withFileTypes?: boolean\n\n /**\n * Attempt to read directory entries from symbolic links. Otherwise, only\n * actual directories are traversed. Regardless of this setting, a given\n * target path will only ever be walked once, meaning that a symbolic link\n * to a previously traversed directory will never be followed.\n *\n * Setting this imposes a slight performance penalty, because `readlink`\n * must be called on all symbolic links encountered, in order to avoid\n * infinite cycles.\n * @default false\n */\n follow?: boolean\n\n /**\n * Only return entries where the provided function returns true.\n *\n * This will not prevent directories from being traversed, even if they do\n * not pass the filter, though it will prevent directories themselves from\n * being included in the result set. See {@link walkFilter}\n *\n * Asynchronous functions are not supported here.\n *\n * By default, if no filter is provided, all entries and traversed\n * directories are included.\n */\n filter?: (entry: PathBase) => boolean\n\n /**\n * Only traverse directories (and in the case of {@link follow} being set to\n * true, symbolic links to directories) if the provided function returns\n * true.\n *\n * This will not prevent directories from being included in the result set,\n * even if they do not pass the supplied filter function. See {@link filter}\n * to do that.\n *\n * Asynchronous functions are not supported here.\n */\n walkFilter?: (entry: PathBase) => boolean\n}\n\nexport type WalkOptionsWithFileTypesUnset = WalkOptions & {\n withFileTypes?: undefined\n}\nexport type WalkOptionsWithFileTypesTrue = WalkOptions & {\n withFileTypes: true\n}\nexport type WalkOptionsWithFileTypesFalse = WalkOptions & {\n withFileTypes: false\n}\n\n/**\n * Windows implementation of {@link PathScurryBase}\n *\n * Defaults to case insensitve, uses `'\\\\'` to generate path strings. Uses\n * {@link PathWin32} for Path objects.\n */\nexport class PathScurryWin32 extends PathScurryBase {\n /**\n * separator for generating path strings\n */\n sep: '\\\\' = '\\\\'\n\n constructor(\n cwd: URL | string = process.cwd(),\n opts: PathScurryOpts = {},\n ) {\n const { nocase = true } = opts\n super(cwd, win32, '\\\\', { ...opts, nocase })\n this.nocase = nocase\n for (let p: PathBase | undefined = this.cwd; p; p = p.parent) {\n p.nocase = this.nocase\n }\n }\n\n /**\n * @internal\n */\n parseRootPath(dir: string): string {\n // if the path starts with a single separator, it's not a UNC, and we'll\n // just get separator as the root, and driveFromUNC will return \\\n // In that case, mount \\ on the root from the cwd.\n return win32.parse(dir).root.toUpperCase()\n }\n\n /**\n * @internal\n */\n newRoot(fs: FSValue) {\n return new PathWin32(\n this.rootPath,\n IFDIR,\n undefined,\n this.roots,\n this.nocase,\n this.childrenCache(),\n { fs },\n )\n }\n\n /**\n * Return true if the provided path string is an absolute path\n */\n isAbsolute(p: string): boolean {\n return (\n p.startsWith('/') || p.startsWith('\\\\') || /^[a-z]:(\\/|\\\\)/i.test(p)\n )\n }\n}\n\n/**\n * {@link PathScurryBase} implementation for all posix systems other than Darwin.\n *\n * Defaults to case-sensitive matching, uses `'/'` to generate path strings.\n *\n * Uses {@link PathPosix} for Path objects.\n */\nexport class PathScurryPosix extends PathScurryBase {\n /**\n * separator for generating path strings\n */\n sep: '/' = '/'\n constructor(\n cwd: URL | string = process.cwd(),\n opts: PathScurryOpts = {},\n ) {\n const { nocase = false } = opts\n super(cwd, posix, '/', { ...opts, nocase })\n this.nocase = nocase\n }\n\n /**\n * @internal\n */\n parseRootPath(_dir: string): string {\n return '/'\n }\n\n /**\n * @internal\n */\n newRoot(fs: FSValue) {\n return new PathPosix(\n this.rootPath,\n IFDIR,\n undefined,\n this.roots,\n this.nocase,\n this.childrenCache(),\n { fs },\n )\n }\n\n /**\n * Return true if the provided path string is an absolute path\n */\n isAbsolute(p: string): boolean {\n return p.startsWith('/')\n }\n}\n\n/**\n * {@link PathScurryBase} implementation for Darwin (macOS) systems.\n *\n * Defaults to case-insensitive matching, uses `'/'` for generating path\n * strings.\n *\n * Uses {@link PathPosix} for Path objects.\n */\nexport class PathScurryDarwin extends PathScurryPosix {\n constructor(\n cwd: URL | string = process.cwd(),\n opts: PathScurryOpts = {},\n ) {\n const { nocase = true } = opts\n super(cwd, { ...opts, nocase })\n }\n}\n\n/**\n * Default {@link PathBase} implementation for the current platform.\n *\n * {@link PathWin32} on Windows systems, {@link PathPosix} on all others.\n */\nexport const Path = process.platform === 'win32' ? PathWin32 : PathPosix\nexport type Path = PathBase | InstanceType\n\n/**\n * Default {@link PathScurryBase} implementation for the current platform.\n *\n * {@link PathScurryWin32} on Windows systems, {@link PathScurryDarwin} on\n * Darwin (macOS) systems, {@link PathScurryPosix} on all others.\n */\nexport const PathScurry:\n | typeof PathScurryWin32\n | typeof PathScurryDarwin\n | typeof PathScurryPosix =\n process.platform === 'win32' ? PathScurryWin32\n : process.platform === 'darwin' ? PathScurryDarwin\n : PathScurryPosix\nexport type PathScurry = PathScurryBase | InstanceType\n"]} \ No newline at end of file diff --git a/node_modules/path-scurry/dist/esm/package.json b/node_modules/path-scurry/dist/esm/package.json deleted file mode 100644 index 3dbc1ca..0000000 --- a/node_modules/path-scurry/dist/esm/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "module" -} diff --git a/node_modules/path-scurry/package.json b/node_modules/path-scurry/package.json deleted file mode 100644 index e176615..0000000 --- a/node_modules/path-scurry/package.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "name": "path-scurry", - "version": "1.11.1", - "description": "walk paths fast and efficiently", - "author": "Isaac Z. Schlueter (https://blog.izs.me)", - "main": "./dist/commonjs/index.js", - "type": "module", - "exports": { - "./package.json": "./package.json", - ".": { - "import": { - "types": "./dist/esm/index.d.ts", - "default": "./dist/esm/index.js" - }, - "require": { - "types": "./dist/commonjs/index.d.ts", - "default": "./dist/commonjs/index.js" - } - } - }, - "files": [ - "dist" - ], - "license": "BlueOak-1.0.0", - "scripts": { - "preversion": "npm test", - "postversion": "npm publish", - "prepublishOnly": "git push origin --follow-tags", - "prepare": "tshy", - "pretest": "npm run prepare", - "presnap": "npm run prepare", - "test": "tap", - "snap": "tap", - "format": "prettier --write . --loglevel warn", - "typedoc": "typedoc --tsconfig tsconfig-esm.json ./src/*.ts", - "bench": "bash ./scripts/bench.sh" - }, - "prettier": { - "experimentalTernaries": true, - "semi": false, - "printWidth": 75, - "tabWidth": 2, - "useTabs": false, - "singleQuote": true, - "jsxSingleQuote": false, - "bracketSameLine": true, - "arrowParens": "avoid", - "endOfLine": "lf" - }, - "devDependencies": { - "@nodelib/fs.walk": "^1.2.8", - "@types/node": "^20.12.11", - "c8": "^7.12.0", - "eslint-config-prettier": "^8.6.0", - "mkdirp": "^3.0.0", - "prettier": "^3.2.5", - "rimraf": "^5.0.1", - "tap": "^18.7.2", - "ts-node": "^10.9.2", - "tshy": "^1.14.0", - "typedoc": "^0.25.12", - "typescript": "^5.4.3" - }, - "tap": { - "typecheck": true - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/isaacs/path-scurry" - }, - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "tshy": { - "selfLink": false, - "exports": { - "./package.json": "./package.json", - ".": "./src/index.ts" - } - }, - "types": "./dist/commonjs/index.d.ts" -} diff --git a/node_modules/picocolors/LICENSE b/node_modules/picocolors/LICENSE deleted file mode 100644 index 46c9b95..0000000 --- a/node_modules/picocolors/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -ISC License - -Copyright (c) 2021-2024 Oleksii Raspopov, Kostiantyn Denysov, Anton Verinov - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/picocolors/README.md b/node_modules/picocolors/README.md deleted file mode 100644 index 8e47aa8..0000000 --- a/node_modules/picocolors/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# picocolors - -The tiniest and the fastest library for terminal output formatting with ANSI colors. - -```javascript -import pc from "picocolors" - -console.log( - pc.green(`How are ${pc.italic(`you`)} doing?`) -) -``` - -- **No dependencies.** -- **14 times** smaller and **2 times** faster than chalk. -- Used by popular tools like PostCSS, SVGO, Stylelint, and Browserslist. -- Node.js v6+ & browsers support. Support for both CJS and ESM projects. -- TypeScript type declarations included. -- [`NO_COLOR`](https://no-color.org/) friendly. - -## Docs -Read **[full docs](https://github.com/alexeyraspopov/picocolors#readme)** on GitHub. diff --git a/node_modules/picocolors/package.json b/node_modules/picocolors/package.json deleted file mode 100644 index 372d4b6..0000000 --- a/node_modules/picocolors/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "picocolors", - "version": "1.1.1", - "main": "./picocolors.js", - "types": "./picocolors.d.ts", - "browser": { - "./picocolors.js": "./picocolors.browser.js" - }, - "sideEffects": false, - "description": "The tiniest and the fastest library for terminal output formatting with ANSI colors", - "files": [ - "picocolors.*", - "types.d.ts" - ], - "keywords": [ - "terminal", - "colors", - "formatting", - "cli", - "console" - ], - "author": "Alexey Raspopov", - "repository": "alexeyraspopov/picocolors", - "license": "ISC" -} diff --git a/node_modules/picocolors/picocolors.browser.js b/node_modules/picocolors/picocolors.browser.js deleted file mode 100644 index 9dcf637..0000000 --- a/node_modules/picocolors/picocolors.browser.js +++ /dev/null @@ -1,4 +0,0 @@ -var x=String; -var create=function() {return {isColorSupported:false,reset:x,bold:x,dim:x,italic:x,underline:x,inverse:x,hidden:x,strikethrough:x,black:x,red:x,green:x,yellow:x,blue:x,magenta:x,cyan:x,white:x,gray:x,bgBlack:x,bgRed:x,bgGreen:x,bgYellow:x,bgBlue:x,bgMagenta:x,bgCyan:x,bgWhite:x,blackBright:x,redBright:x,greenBright:x,yellowBright:x,blueBright:x,magentaBright:x,cyanBright:x,whiteBright:x,bgBlackBright:x,bgRedBright:x,bgGreenBright:x,bgYellowBright:x,bgBlueBright:x,bgMagentaBright:x,bgCyanBright:x,bgWhiteBright:x}}; -module.exports=create(); -module.exports.createColors = create; diff --git a/node_modules/picocolors/picocolors.d.ts b/node_modules/picocolors/picocolors.d.ts deleted file mode 100644 index 94e146a..0000000 --- a/node_modules/picocolors/picocolors.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Colors } from "./types" - -declare const picocolors: Colors & { createColors: (enabled?: boolean) => Colors } - -export = picocolors diff --git a/node_modules/picocolors/picocolors.js b/node_modules/picocolors/picocolors.js deleted file mode 100644 index e32df85..0000000 --- a/node_modules/picocolors/picocolors.js +++ /dev/null @@ -1,75 +0,0 @@ -let p = process || {}, argv = p.argv || [], env = p.env || {} -let isColorSupported = - !(!!env.NO_COLOR || argv.includes("--no-color")) && - (!!env.FORCE_COLOR || argv.includes("--color") || p.platform === "win32" || ((p.stdout || {}).isTTY && env.TERM !== "dumb") || !!env.CI) - -let formatter = (open, close, replace = open) => - input => { - let string = "" + input, index = string.indexOf(close, open.length) - return ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close - } - -let replaceClose = (string, close, replace, index) => { - let result = "", cursor = 0 - do { - result += string.substring(cursor, index) + replace - cursor = index + close.length - index = string.indexOf(close, cursor) - } while (~index) - return result + string.substring(cursor) -} - -let createColors = (enabled = isColorSupported) => { - let f = enabled ? formatter : () => String - return { - isColorSupported: enabled, - reset: f("\x1b[0m", "\x1b[0m"), - bold: f("\x1b[1m", "\x1b[22m", "\x1b[22m\x1b[1m"), - dim: f("\x1b[2m", "\x1b[22m", "\x1b[22m\x1b[2m"), - italic: f("\x1b[3m", "\x1b[23m"), - underline: f("\x1b[4m", "\x1b[24m"), - inverse: f("\x1b[7m", "\x1b[27m"), - hidden: f("\x1b[8m", "\x1b[28m"), - strikethrough: f("\x1b[9m", "\x1b[29m"), - - black: f("\x1b[30m", "\x1b[39m"), - red: f("\x1b[31m", "\x1b[39m"), - green: f("\x1b[32m", "\x1b[39m"), - yellow: f("\x1b[33m", "\x1b[39m"), - blue: f("\x1b[34m", "\x1b[39m"), - magenta: f("\x1b[35m", "\x1b[39m"), - cyan: f("\x1b[36m", "\x1b[39m"), - white: f("\x1b[37m", "\x1b[39m"), - gray: f("\x1b[90m", "\x1b[39m"), - - bgBlack: f("\x1b[40m", "\x1b[49m"), - bgRed: f("\x1b[41m", "\x1b[49m"), - bgGreen: f("\x1b[42m", "\x1b[49m"), - bgYellow: f("\x1b[43m", "\x1b[49m"), - bgBlue: f("\x1b[44m", "\x1b[49m"), - bgMagenta: f("\x1b[45m", "\x1b[49m"), - bgCyan: f("\x1b[46m", "\x1b[49m"), - bgWhite: f("\x1b[47m", "\x1b[49m"), - - blackBright: f("\x1b[90m", "\x1b[39m"), - redBright: f("\x1b[91m", "\x1b[39m"), - greenBright: f("\x1b[92m", "\x1b[39m"), - yellowBright: f("\x1b[93m", "\x1b[39m"), - blueBright: f("\x1b[94m", "\x1b[39m"), - magentaBright: f("\x1b[95m", "\x1b[39m"), - cyanBright: f("\x1b[96m", "\x1b[39m"), - whiteBright: f("\x1b[97m", "\x1b[39m"), - - bgBlackBright: f("\x1b[100m", "\x1b[49m"), - bgRedBright: f("\x1b[101m", "\x1b[49m"), - bgGreenBright: f("\x1b[102m", "\x1b[49m"), - bgYellowBright: f("\x1b[103m", "\x1b[49m"), - bgBlueBright: f("\x1b[104m", "\x1b[49m"), - bgMagentaBright: f("\x1b[105m", "\x1b[49m"), - bgCyanBright: f("\x1b[106m", "\x1b[49m"), - bgWhiteBright: f("\x1b[107m", "\x1b[49m"), - } -} - -module.exports = createColors() -module.exports.createColors = createColors diff --git a/node_modules/picocolors/types.d.ts b/node_modules/picocolors/types.d.ts deleted file mode 100644 index cd1aec4..0000000 --- a/node_modules/picocolors/types.d.ts +++ /dev/null @@ -1,51 +0,0 @@ -export type Formatter = (input: string | number | null | undefined) => string - -export interface Colors { - isColorSupported: boolean - - reset: Formatter - bold: Formatter - dim: Formatter - italic: Formatter - underline: Formatter - inverse: Formatter - hidden: Formatter - strikethrough: Formatter - - black: Formatter - red: Formatter - green: Formatter - yellow: Formatter - blue: Formatter - magenta: Formatter - cyan: Formatter - white: Formatter - gray: Formatter - - bgBlack: Formatter - bgRed: Formatter - bgGreen: Formatter - bgYellow: Formatter - bgBlue: Formatter - bgMagenta: Formatter - bgCyan: Formatter - bgWhite: Formatter - - blackBright: Formatter - redBright: Formatter - greenBright: Formatter - yellowBright: Formatter - blueBright: Formatter - magentaBright: Formatter - cyanBright: Formatter - whiteBright: Formatter - - bgBlackBright: Formatter - bgRedBright: Formatter - bgGreenBright: Formatter - bgYellowBright: Formatter - bgBlueBright: Formatter - bgMagentaBright: Formatter - bgCyanBright: Formatter - bgWhiteBright: Formatter -} diff --git a/node_modules/picomatch/CHANGELOG.md b/node_modules/picomatch/CHANGELOG.md deleted file mode 100644 index 8ccc6c1..0000000 --- a/node_modules/picomatch/CHANGELOG.md +++ /dev/null @@ -1,136 +0,0 @@ -# Release history - -**All notable changes to this project will be documented in this file.** - -The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) -and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). - -
    - Guiding Principles - -- Changelogs are for humans, not machines. -- There should be an entry for every single version. -- The same types of changes should be grouped. -- Versions and sections should be linkable. -- The latest version comes first. -- The release date of each versions is displayed. -- Mention whether you follow Semantic Versioning. - -
    - -
    - Types of changes - -Changelog entries are classified using the following labels _(from [keep-a-changelog](http://keepachangelog.com/)_): - -- `Added` for new features. -- `Changed` for changes in existing functionality. -- `Deprecated` for soon-to-be removed features. -- `Removed` for now removed features. -- `Fixed` for any bug fixes. -- `Security` in case of vulnerabilities. - -
    - -## 2.3.1 (2022-01-02) - -### Fixed - -* Fixes bug when a pattern containing an expression after the closing parenthesis (`/!(*.d).{ts,tsx}`) was incorrectly converted to regexp ([9f241ef](https://github.com/micromatch/picomatch/commit/9f241ef)). - -### Changed - -* Some documentation improvements ([f81d236](https://github.com/micromatch/picomatch/commit/f81d236), [421e0e7](https://github.com/micromatch/picomatch/commit/421e0e7)). - -## 2.3.0 (2021-05-21) - -### Fixed - -* Fixes bug where file names with two dots were not being matched consistently with negation extglobs containing a star ([56083ef](https://github.com/micromatch/picomatch/commit/56083ef)) - -## 2.2.3 (2021-04-10) - -### Fixed - -* Do not skip pattern seperator for square brackets ([fb08a30](https://github.com/micromatch/picomatch/commit/fb08a30)). -* Set negatedExtGlob also if it does not span the whole pattern ([032e3f5](https://github.com/micromatch/picomatch/commit/032e3f5)). - -## 2.2.2 (2020-03-21) - -### Fixed - -* Correctly handle parts of the pattern after parentheses in the `scan` method ([e15b920](https://github.com/micromatch/picomatch/commit/e15b920)). - -## 2.2.1 (2020-01-04) - -* Fixes [#49](https://github.com/micromatch/picomatch/issues/49), so that braces with no sets or ranges are now propertly treated as literals. - -## 2.2.0 (2020-01-04) - -* Disable fastpaths mode for the parse method ([5b8d33f](https://github.com/micromatch/picomatch/commit/5b8d33f)) -* Add `tokens`, `slashes`, and `parts` to the object returned by `picomatch.scan()`. - -## 2.1.0 (2019-10-31) - -* add benchmarks for scan ([4793b92](https://github.com/micromatch/picomatch/commit/4793b92)) -* Add eslint object-curly-spacing rule ([707c650](https://github.com/micromatch/picomatch/commit/707c650)) -* Add prefer-const eslint rule ([5c7501c](https://github.com/micromatch/picomatch/commit/5c7501c)) -* Add support for nonegate in scan API ([275c9b9](https://github.com/micromatch/picomatch/commit/275c9b9)) -* Change lets to consts. Move root import up. ([4840625](https://github.com/micromatch/picomatch/commit/4840625)) -* closes https://github.com/micromatch/picomatch/issues/21 ([766bcb0](https://github.com/micromatch/picomatch/commit/766bcb0)) -* Fix "Extglobs" table in readme ([eb19da8](https://github.com/micromatch/picomatch/commit/eb19da8)) -* fixes https://github.com/micromatch/picomatch/issues/20 ([9caca07](https://github.com/micromatch/picomatch/commit/9caca07)) -* fixes https://github.com/micromatch/picomatch/issues/26 ([fa58f45](https://github.com/micromatch/picomatch/commit/fa58f45)) -* Lint test ([d433a34](https://github.com/micromatch/picomatch/commit/d433a34)) -* lint unit tests ([0159b55](https://github.com/micromatch/picomatch/commit/0159b55)) -* Make scan work with noext ([6c02e03](https://github.com/micromatch/picomatch/commit/6c02e03)) -* minor linting ([c2a2b87](https://github.com/micromatch/picomatch/commit/c2a2b87)) -* minor parser improvements ([197671d](https://github.com/micromatch/picomatch/commit/197671d)) -* remove eslint since it... ([07876fa](https://github.com/micromatch/picomatch/commit/07876fa)) -* remove funding file ([8ebe96d](https://github.com/micromatch/picomatch/commit/8ebe96d)) -* Remove unused funks ([cbc6d54](https://github.com/micromatch/picomatch/commit/cbc6d54)) -* Run eslint during pretest, fix existing eslint findings ([0682367](https://github.com/micromatch/picomatch/commit/0682367)) -* support `noparen` in scan ([3d37569](https://github.com/micromatch/picomatch/commit/3d37569)) -* update changelog ([7b34e77](https://github.com/micromatch/picomatch/commit/7b34e77)) -* update travis ([777f038](https://github.com/micromatch/picomatch/commit/777f038)) -* Use eslint-disable-next-line instead of eslint-disable ([4e7c1fd](https://github.com/micromatch/picomatch/commit/4e7c1fd)) - -## 2.0.7 (2019-05-14) - -* 2.0.7 ([9eb9a71](https://github.com/micromatch/picomatch/commit/9eb9a71)) -* supports lookbehinds ([1f63f7e](https://github.com/micromatch/picomatch/commit/1f63f7e)) -* update .verb.md file with typo change ([2741279](https://github.com/micromatch/picomatch/commit/2741279)) -* fix: typo in README ([0753e44](https://github.com/micromatch/picomatch/commit/0753e44)) - -## 2.0.4 (2019-04-10) - -### Fixed - -- Readme link [fixed](https://github.com/micromatch/picomatch/pull/13/commits/a96ab3aa2b11b6861c23289964613d85563b05df) by @danez. -- `options.capture` now works as expected when fastpaths are enabled. See https://github.com/micromatch/picomatch/pull/12/commits/26aefd71f1cfaf95c37f1c1fcab68a693b037304. Thanks to @DrPizza. - -## 2.0.0 (2019-04-10) - -### Added - -- Adds support for `options.onIgnore`. See the readme for details -- Adds support for `options.onResult`. See the readme for details - -### Breaking changes - -- The unixify option was renamed to `windows` -- caching and all related options and methods have been removed - -## 1.0.0 (2018-11-05) - -- adds `.onMatch` option -- improvements to `.scan` method -- numerous improvements and optimizations for matching and parsing -- better windows path handling - -## 0.1.0 - 2017-04-13 - -First release. - - -[keep-a-changelog]: https://github.com/olivierlacan/keep-a-changelog diff --git a/node_modules/picomatch/LICENSE b/node_modules/picomatch/LICENSE deleted file mode 100644 index 3608dca..0000000 --- a/node_modules/picomatch/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2017-present, Jon Schlinkert. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/node_modules/picomatch/README.md b/node_modules/picomatch/README.md deleted file mode 100644 index b0526e2..0000000 --- a/node_modules/picomatch/README.md +++ /dev/null @@ -1,708 +0,0 @@ -

    Picomatch

    - -

    - -version - - -test status - - -coverage status - - -downloads - -

    - -
    -
    - -

    -Blazing fast and accurate glob matcher written in JavaScript.
    -No dependencies and full support for standard and extended Bash glob features, including braces, extglobs, POSIX brackets, and regular expressions. -

    - -
    -
    - -## Why picomatch? - -* **Lightweight** - No dependencies -* **Minimal** - Tiny API surface. Main export is a function that takes a glob pattern and returns a matcher function. -* **Fast** - Loads in about 2ms (that's several times faster than a [single frame of a HD movie](http://www.endmemo.com/sconvert/framespersecondframespermillisecond.php) at 60fps) -* **Performant** - Use the returned matcher function to speed up repeat matching (like when watching files) -* **Accurate matching** - Using wildcards (`*` and `?`), globstars (`**`) for nested directories, [advanced globbing](#advanced-globbing) with extglobs, braces, and POSIX brackets, and support for escaping special characters with `\` or quotes. -* **Well tested** - Thousands of unit tests - -See the [library comparison](#library-comparisons) to other libraries. - -
    -
    - -## Table of Contents - -
    Click to expand - -- [Install](#install) -- [Usage](#usage) -- [API](#api) - * [picomatch](#picomatch) - * [.test](#test) - * [.matchBase](#matchbase) - * [.isMatch](#ismatch) - * [.parse](#parse) - * [.scan](#scan) - * [.compileRe](#compilere) - * [.makeRe](#makere) - * [.toRegex](#toregex) -- [Options](#options) - * [Picomatch options](#picomatch-options) - * [Scan Options](#scan-options) - * [Options Examples](#options-examples) -- [Globbing features](#globbing-features) - * [Basic globbing](#basic-globbing) - * [Advanced globbing](#advanced-globbing) - * [Braces](#braces) - * [Matching special characters as literals](#matching-special-characters-as-literals) -- [Library Comparisons](#library-comparisons) -- [Benchmarks](#benchmarks) -- [Philosophies](#philosophies) -- [About](#about) - * [Author](#author) - * [License](#license) - -_(TOC generated by [verb](https://github.com/verbose/verb) using [markdown-toc](https://github.com/jonschlinkert/markdown-toc))_ - -
    - -
    -
    - -## Install - -Install with [npm](https://www.npmjs.com/): - -```sh -npm install --save picomatch -``` - -
    - -## Usage - -The main export is a function that takes a glob pattern and an options object and returns a function for matching strings. - -```js -const pm = require('picomatch'); -const isMatch = pm('*.js'); - -console.log(isMatch('abcd')); //=> false -console.log(isMatch('a.js')); //=> true -console.log(isMatch('a.md')); //=> false -console.log(isMatch('a/b.js')); //=> false -``` - -
    - -## API - -### [picomatch](lib/picomatch.js#L32) - -Creates a matcher function from one or more glob patterns. The returned function takes a string to match as its first argument, and returns true if the string is a match. The returned matcher function also takes a boolean as the second argument that, when true, returns an object with additional information. - -**Params** - -* `globs` **{String|Array}**: One or more glob patterns. -* `options` **{Object=}** -* `returns` **{Function=}**: Returns a matcher function. - -**Example** - -```js -const picomatch = require('picomatch'); -// picomatch(glob[, options]); - -const isMatch = picomatch('*.!(*a)'); -console.log(isMatch('a.a')); //=> false -console.log(isMatch('a.b')); //=> true -``` - -### [.test](lib/picomatch.js#L117) - -Test `input` with the given `regex`. This is used by the main `picomatch()` function to test the input string. - -**Params** - -* `input` **{String}**: String to test. -* `regex` **{RegExp}** -* `returns` **{Object}**: Returns an object with matching info. - -**Example** - -```js -const picomatch = require('picomatch'); -// picomatch.test(input, regex[, options]); - -console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\/([^/]*?))$/)); -// { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' } -``` - -### [.matchBase](lib/picomatch.js#L161) - -Match the basename of a filepath. - -**Params** - -* `input` **{String}**: String to test. -* `glob` **{RegExp|String}**: Glob pattern or regex created by [.makeRe](#makeRe). -* `returns` **{Boolean}** - -**Example** - -```js -const picomatch = require('picomatch'); -// picomatch.matchBase(input, glob[, options]); -console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true -``` - -### [.isMatch](lib/picomatch.js#L183) - -Returns true if **any** of the given glob `patterns` match the specified `string`. - -**Params** - -* **{String|Array}**: str The string to test. -* **{String|Array}**: patterns One or more glob patterns to use for matching. -* **{Object}**: See available [options](#options). -* `returns` **{Boolean}**: Returns true if any patterns match `str` - -**Example** - -```js -const picomatch = require('picomatch'); -// picomatch.isMatch(string, patterns[, options]); - -console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true -console.log(picomatch.isMatch('a.a', 'b.*')); //=> false -``` - -### [.parse](lib/picomatch.js#L199) - -Parse a glob pattern to create the source string for a regular expression. - -**Params** - -* `pattern` **{String}** -* `options` **{Object}** -* `returns` **{Object}**: Returns an object with useful properties and output to be used as a regex source string. - -**Example** - -```js -const picomatch = require('picomatch'); -const result = picomatch.parse(pattern[, options]); -``` - -### [.scan](lib/picomatch.js#L231) - -Scan a glob pattern to separate the pattern into segments. - -**Params** - -* `input` **{String}**: Glob pattern to scan. -* `options` **{Object}** -* `returns` **{Object}**: Returns an object with - -**Example** - -```js -const picomatch = require('picomatch'); -// picomatch.scan(input[, options]); - -const result = picomatch.scan('!./foo/*.js'); -console.log(result); -{ prefix: '!./', - input: '!./foo/*.js', - start: 3, - base: 'foo', - glob: '*.js', - isBrace: false, - isBracket: false, - isGlob: true, - isExtglob: false, - isGlobstar: false, - negated: true } -``` - -### [.compileRe](lib/picomatch.js#L245) - -Compile a regular expression from the `state` object returned by the -[parse()](#parse) method. - -**Params** - -* `state` **{Object}** -* `options` **{Object}** -* `returnOutput` **{Boolean}**: Intended for implementors, this argument allows you to return the raw output from the parser. -* `returnState` **{Boolean}**: Adds the state to a `state` property on the returned regex. Useful for implementors and debugging. -* `returns` **{RegExp}** - -### [.makeRe](lib/picomatch.js#L286) - -Create a regular expression from a parsed glob pattern. - -**Params** - -* `state` **{String}**: The object returned from the `.parse` method. -* `options` **{Object}** -* `returnOutput` **{Boolean}**: Implementors may use this argument to return the compiled output, instead of a regular expression. This is not exposed on the options to prevent end-users from mutating the result. -* `returnState` **{Boolean}**: Implementors may use this argument to return the state from the parsed glob with the returned regular expression. -* `returns` **{RegExp}**: Returns a regex created from the given pattern. - -**Example** - -```js -const picomatch = require('picomatch'); -const state = picomatch.parse('*.js'); -// picomatch.compileRe(state[, options]); - -console.log(picomatch.compileRe(state)); -//=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ -``` - -### [.toRegex](lib/picomatch.js#L321) - -Create a regular expression from the given regex source string. - -**Params** - -* `source` **{String}**: Regular expression source string. -* `options` **{Object}** -* `returns` **{RegExp}** - -**Example** - -```js -const picomatch = require('picomatch'); -// picomatch.toRegex(source[, options]); - -const { output } = picomatch.parse('*.js'); -console.log(picomatch.toRegex(output)); -//=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ -``` - -
    - -## Options - -### Picomatch options - -The following options may be used with the main `picomatch()` function or any of the methods on the picomatch API. - -| **Option** | **Type** | **Default value** | **Description** | -| --- | --- | --- | --- | -| `basename` | `boolean` | `false` | If set, then patterns without slashes will be matched against the basename of the path if it contains slashes. For example, `a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`. | -| `bash` | `boolean` | `false` | Follow bash matching rules more strictly - disallows backslashes as escape characters, and treats single stars as globstars (`**`). | -| `capture` | `boolean` | `undefined` | Return regex matches in supporting methods. | -| `contains` | `boolean` | `undefined` | Allows glob to match any part of the given string(s). | -| `cwd` | `string` | `process.cwd()` | Current working directory. Used by `picomatch.split()` | -| `debug` | `boolean` | `undefined` | Debug regular expressions when an error is thrown. | -| `dot` | `boolean` | `false` | Enable dotfile matching. By default, dotfiles are ignored unless a `.` is explicitly defined in the pattern, or `options.dot` is true | -| `expandRange` | `function` | `undefined` | Custom function for expanding ranges in brace patterns, such as `{a..z}`. The function receives the range values as two arguments, and it must return a string to be used in the generated regex. It's recommended that returned strings be wrapped in parentheses. | -| `failglob` | `boolean` | `false` | Throws an error if no matches are found. Based on the bash option of the same name. | -| `fastpaths` | `boolean` | `true` | To speed up processing, full parsing is skipped for a handful common glob patterns. Disable this behavior by setting this option to `false`. | -| `flags` | `string` | `undefined` | Regex flags to use in the generated regex. If defined, the `nocase` option will be overridden. | -| [format](#optionsformat) | `function` | `undefined` | Custom function for formatting the returned string. This is useful for removing leading slashes, converting Windows paths to Posix paths, etc. | -| `ignore` | `array\|string` | `undefined` | One or more glob patterns for excluding strings that should not be matched from the result. | -| `keepQuotes` | `boolean` | `false` | Retain quotes in the generated regex, since quotes may also be used as an alternative to backslashes. | -| `literalBrackets` | `boolean` | `undefined` | When `true`, brackets in the glob pattern will be escaped so that only literal brackets will be matched. | -| `matchBase` | `boolean` | `false` | Alias for `basename` | -| `maxLength` | `boolean` | `65536` | Limit the max length of the input string. An error is thrown if the input string is longer than this value. | -| `nobrace` | `boolean` | `false` | Disable brace matching, so that `{a,b}` and `{1..3}` would be treated as literal characters. | -| `nobracket` | `boolean` | `undefined` | Disable matching with regex brackets. | -| `nocase` | `boolean` | `false` | Make matching case-insensitive. Equivalent to the regex `i` flag. Note that this option is overridden by the `flags` option. | -| `nodupes` | `boolean` | `true` | Deprecated, use `nounique` instead. This option will be removed in a future major release. By default duplicates are removed. Disable uniquification by setting this option to false. | -| `noext` | `boolean` | `false` | Alias for `noextglob` | -| `noextglob` | `boolean` | `false` | Disable support for matching with extglobs (like `+(a\|b)`) | -| `noglobstar` | `boolean` | `false` | Disable support for matching nested directories with globstars (`**`) | -| `nonegate` | `boolean` | `false` | Disable support for negating with leading `!` | -| `noquantifiers` | `boolean` | `false` | Disable support for regex quantifiers (like `a{1,2}`) and treat them as brace patterns to be expanded. | -| [onIgnore](#optionsonIgnore) | `function` | `undefined` | Function to be called on ignored items. | -| [onMatch](#optionsonMatch) | `function` | `undefined` | Function to be called on matched items. | -| [onResult](#optionsonResult) | `function` | `undefined` | Function to be called on all items, regardless of whether or not they are matched or ignored. | -| `posix` | `boolean` | `false` | Support POSIX character classes ("posix brackets"). | -| `posixSlashes` | `boolean` | `undefined` | Convert all slashes in file paths to forward slashes. This does not convert slashes in the glob pattern itself | -| `prepend` | `boolean` | `undefined` | String to prepend to the generated regex used for matching. | -| `regex` | `boolean` | `false` | Use regular expression rules for `+` (instead of matching literal `+`), and for stars that follow closing parentheses or brackets (as in `)*` and `]*`). | -| `strictBrackets` | `boolean` | `undefined` | Throw an error if brackets, braces, or parens are imbalanced. | -| `strictSlashes` | `boolean` | `undefined` | When true, picomatch won't match trailing slashes with single stars. | -| `unescape` | `boolean` | `undefined` | Remove backslashes preceding escaped characters in the glob pattern. By default, backslashes are retained. | -| `unixify` | `boolean` | `undefined` | Alias for `posixSlashes`, for backwards compatibility. | - -picomatch has automatic detection for regex positive and negative lookbehinds. If the pattern contains a negative lookbehind, you must be using Node.js >= 8.10 or else picomatch will throw an error. - -### Scan Options - -In addition to the main [picomatch options](#picomatch-options), the following options may also be used with the [.scan](#scan) method. - -| **Option** | **Type** | **Default value** | **Description** | -| --- | --- | --- | --- | -| `tokens` | `boolean` | `false` | When `true`, the returned object will include an array of tokens (objects), representing each path "segment" in the scanned glob pattern | -| `parts` | `boolean` | `false` | When `true`, the returned object will include an array of strings representing each path "segment" in the scanned glob pattern. This is automatically enabled when `options.tokens` is true | - -**Example** - -```js -const picomatch = require('picomatch'); -const result = picomatch.scan('!./foo/*.js', { tokens: true }); -console.log(result); -// { -// prefix: '!./', -// input: '!./foo/*.js', -// start: 3, -// base: 'foo', -// glob: '*.js', -// isBrace: false, -// isBracket: false, -// isGlob: true, -// isExtglob: false, -// isGlobstar: false, -// negated: true, -// maxDepth: 2, -// tokens: [ -// { value: '!./', depth: 0, isGlob: false, negated: true, isPrefix: true }, -// { value: 'foo', depth: 1, isGlob: false }, -// { value: '*.js', depth: 1, isGlob: true } -// ], -// slashes: [ 2, 6 ], -// parts: [ 'foo', '*.js' ] -// } -``` - -
    - -### Options Examples - -#### options.expandRange - -**Type**: `function` - -**Default**: `undefined` - -Custom function for expanding ranges in brace patterns. The [fill-range](https://github.com/jonschlinkert/fill-range) library is ideal for this purpose, or you can use custom code to do whatever you need. - -**Example** - -The following example shows how to create a glob that matches a folder - -```js -const fill = require('fill-range'); -const regex = pm.makeRe('foo/{01..25}/bar', { - expandRange(a, b) { - return `(${fill(a, b, { toRegex: true })})`; - } -}); - -console.log(regex); -//=> /^(?:foo\/((?:0[1-9]|1[0-9]|2[0-5]))\/bar)$/ - -console.log(regex.test('foo/00/bar')) // false -console.log(regex.test('foo/01/bar')) // true -console.log(regex.test('foo/10/bar')) // true -console.log(regex.test('foo/22/bar')) // true -console.log(regex.test('foo/25/bar')) // true -console.log(regex.test('foo/26/bar')) // false -``` - -#### options.format - -**Type**: `function` - -**Default**: `undefined` - -Custom function for formatting strings before they're matched. - -**Example** - -```js -// strip leading './' from strings -const format = str => str.replace(/^\.\//, ''); -const isMatch = picomatch('foo/*.js', { format }); -console.log(isMatch('./foo/bar.js')); //=> true -``` - -#### options.onMatch - -```js -const onMatch = ({ glob, regex, input, output }) => { - console.log({ glob, regex, input, output }); -}; - -const isMatch = picomatch('*', { onMatch }); -isMatch('foo'); -isMatch('bar'); -isMatch('baz'); -``` - -#### options.onIgnore - -```js -const onIgnore = ({ glob, regex, input, output }) => { - console.log({ glob, regex, input, output }); -}; - -const isMatch = picomatch('*', { onIgnore, ignore: 'f*' }); -isMatch('foo'); -isMatch('bar'); -isMatch('baz'); -``` - -#### options.onResult - -```js -const onResult = ({ glob, regex, input, output }) => { - console.log({ glob, regex, input, output }); -}; - -const isMatch = picomatch('*', { onResult, ignore: 'f*' }); -isMatch('foo'); -isMatch('bar'); -isMatch('baz'); -``` - -
    -
    - -## Globbing features - -* [Basic globbing](#basic-globbing) (Wildcard matching) -* [Advanced globbing](#advanced-globbing) (extglobs, posix brackets, brace matching) - -### Basic globbing - -| **Character** | **Description** | -| --- | --- | -| `*` | Matches any character zero or more times, excluding path separators. Does _not match_ path separators or hidden files or directories ("dotfiles"), unless explicitly enabled by setting the `dot` option to `true`. | -| `**` | Matches any character zero or more times, including path separators. Note that `**` will only match path separators (`/`, and `\\` on Windows) when they are the only characters in a path segment. Thus, `foo**/bar` is equivalent to `foo*/bar`, and `foo/a**b/bar` is equivalent to `foo/a*b/bar`, and _more than two_ consecutive stars in a glob path segment are regarded as _a single star_. Thus, `foo/***/bar` is equivalent to `foo/*/bar`. | -| `?` | Matches any character excluding path separators one time. Does _not match_ path separators or leading dots. | -| `[abc]` | Matches any characters inside the brackets. For example, `[abc]` would match the characters `a`, `b` or `c`, and nothing else. | - -#### Matching behavior vs. Bash - -Picomatch's matching features and expected results in unit tests are based on Bash's unit tests and the Bash 4.3 specification, with the following exceptions: - -* Bash will match `foo/bar/baz` with `*`. Picomatch only matches nested directories with `**`. -* Bash greedily matches with negated extglobs. For example, Bash 4.3 says that `!(foo)*` should match `foo` and `foobar`, since the trailing `*` bracktracks to match the preceding pattern. This is very memory-inefficient, and IMHO, also incorrect. Picomatch would return `false` for both `foo` and `foobar`. - -
    - -### Advanced globbing - -* [extglobs](#extglobs) -* [POSIX brackets](#posix-brackets) -* [Braces](#brace-expansion) - -#### Extglobs - -| **Pattern** | **Description** | -| --- | --- | -| `@(pattern)` | Match _only one_ consecutive occurrence of `pattern` | -| `*(pattern)` | Match _zero or more_ consecutive occurrences of `pattern` | -| `+(pattern)` | Match _one or more_ consecutive occurrences of `pattern` | -| `?(pattern)` | Match _zero or **one**_ consecutive occurrences of `pattern` | -| `!(pattern)` | Match _anything but_ `pattern` | - -**Examples** - -```js -const pm = require('picomatch'); - -// *(pattern) matches ZERO or more of "pattern" -console.log(pm.isMatch('a', 'a*(z)')); // true -console.log(pm.isMatch('az', 'a*(z)')); // true -console.log(pm.isMatch('azzz', 'a*(z)')); // true - -// +(pattern) matches ONE or more of "pattern" -console.log(pm.isMatch('a', 'a*(z)')); // true -console.log(pm.isMatch('az', 'a*(z)')); // true -console.log(pm.isMatch('azzz', 'a*(z)')); // true - -// supports multiple extglobs -console.log(pm.isMatch('foo.bar', '!(foo).!(bar)')); // false - -// supports nested extglobs -console.log(pm.isMatch('foo.bar', '!(!(foo)).!(!(bar))')); // true -``` - -#### POSIX brackets - -POSIX classes are disabled by default. Enable this feature by setting the `posix` option to true. - -**Enable POSIX bracket support** - -```js -console.log(pm.makeRe('[[:word:]]+', { posix: true })); -//=> /^(?:(?=.)[A-Za-z0-9_]+\/?)$/ -``` - -**Supported POSIX classes** - -The following named POSIX bracket expressions are supported: - -* `[:alnum:]` - Alphanumeric characters, equ `[a-zA-Z0-9]` -* `[:alpha:]` - Alphabetical characters, equivalent to `[a-zA-Z]`. -* `[:ascii:]` - ASCII characters, equivalent to `[\\x00-\\x7F]`. -* `[:blank:]` - Space and tab characters, equivalent to `[ \\t]`. -* `[:cntrl:]` - Control characters, equivalent to `[\\x00-\\x1F\\x7F]`. -* `[:digit:]` - Numerical digits, equivalent to `[0-9]`. -* `[:graph:]` - Graph characters, equivalent to `[\\x21-\\x7E]`. -* `[:lower:]` - Lowercase letters, equivalent to `[a-z]`. -* `[:print:]` - Print characters, equivalent to `[\\x20-\\x7E ]`. -* `[:punct:]` - Punctuation and symbols, equivalent to `[\\-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~]`. -* `[:space:]` - Extended space characters, equivalent to `[ \\t\\r\\n\\v\\f]`. -* `[:upper:]` - Uppercase letters, equivalent to `[A-Z]`. -* `[:word:]` - Word characters (letters, numbers and underscores), equivalent to `[A-Za-z0-9_]`. -* `[:xdigit:]` - Hexadecimal digits, equivalent to `[A-Fa-f0-9]`. - -See the [Bash Reference Manual](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html) for more information. - -### Braces - -Picomatch does not do brace expansion. For [brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html) and advanced matching with braces, use [micromatch](https://github.com/micromatch/micromatch) instead. Picomatch has very basic support for braces. - -### Matching special characters as literals - -If you wish to match the following special characters in a filepath, and you want to use these characters in your glob pattern, they must be escaped with backslashes or quotes: - -**Special Characters** - -Some characters that are used for matching in regular expressions are also regarded as valid file path characters on some platforms. - -To match any of the following characters as literals: `$^*+?()[] - -Examples: - -```js -console.log(pm.makeRe('foo/bar \\(1\\)')); -console.log(pm.makeRe('foo/bar \\(1\\)')); -``` - -
    -
    - -## Library Comparisons - -The following table shows which features are supported by [minimatch](https://github.com/isaacs/minimatch), [micromatch](https://github.com/micromatch/micromatch), [picomatch](https://github.com/micromatch/picomatch), [nanomatch](https://github.com/micromatch/nanomatch), [extglob](https://github.com/micromatch/extglob), [braces](https://github.com/micromatch/braces), and [expand-brackets](https://github.com/micromatch/expand-brackets). - -| **Feature** | `minimatch` | `micromatch` | `picomatch` | `nanomatch` | `extglob` | `braces` | `expand-brackets` | -| --- | --- | --- | --- | --- | --- | --- | --- | -| Wildcard matching (`*?+`) | ✔ | ✔ | ✔ | ✔ | - | - | - | -| Advancing globbing | ✔ | ✔ | ✔ | - | - | - | - | -| Brace _matching_ | ✔ | ✔ | ✔ | - | - | ✔ | - | -| Brace _expansion_ | ✔ | ✔ | - | - | - | ✔ | - | -| Extglobs | partial | ✔ | ✔ | - | ✔ | - | - | -| Posix brackets | - | ✔ | ✔ | - | - | - | ✔ | -| Regular expression syntax | - | ✔ | ✔ | ✔ | ✔ | - | ✔ | -| File system operations | - | - | - | - | - | - | - | - -
    -
    - -## Benchmarks - -Performance comparison of picomatch and minimatch. - -``` -# .makeRe star - picomatch x 1,993,050 ops/sec ±0.51% (91 runs sampled) - minimatch x 627,206 ops/sec ±1.96% (87 runs sampled)) - -# .makeRe star; dot=true - picomatch x 1,436,640 ops/sec ±0.62% (91 runs sampled) - minimatch x 525,876 ops/sec ±0.60% (88 runs sampled) - -# .makeRe globstar - picomatch x 1,592,742 ops/sec ±0.42% (90 runs sampled) - minimatch x 962,043 ops/sec ±1.76% (91 runs sampled)d) - -# .makeRe globstars - picomatch x 1,615,199 ops/sec ±0.35% (94 runs sampled) - minimatch x 477,179 ops/sec ±1.33% (91 runs sampled) - -# .makeRe with leading star - picomatch x 1,220,856 ops/sec ±0.40% (92 runs sampled) - minimatch x 453,564 ops/sec ±1.43% (94 runs sampled) - -# .makeRe - basic braces - picomatch x 392,067 ops/sec ±0.70% (90 runs sampled) - minimatch x 99,532 ops/sec ±2.03% (87 runs sampled)) -``` - -
    -
    - -## Philosophies - -The goal of this library is to be blazing fast, without compromising on accuracy. - -**Accuracy** - -The number one of goal of this library is accuracy. However, it's not unusual for different glob implementations to have different rules for matching behavior, even with simple wildcard matching. It gets increasingly more complicated when combinations of different features are combined, like when extglobs are combined with globstars, braces, slashes, and so on: `!(**/{a,b,*/c})`. - -Thus, given that there is no canonical glob specification to use as a single source of truth when differences of opinion arise regarding behavior, sometimes we have to implement our best judgement and rely on feedback from users to make improvements. - -**Performance** - -Although this library performs well in benchmarks, and in most cases it's faster than other popular libraries we benchmarked against, we will always choose accuracy over performance. It's not helpful to anyone if our library is faster at returning the wrong answer. - -
    -
    - -## About - -
    -Contributing - -Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). - -Please read the [contributing guide](.github/contributing.md) for advice on opening issues, pull requests, and coding standards. - -
    - -
    -Running Tests - -Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: - -```sh -npm install && npm test -``` - -
    - -
    -Building docs - -_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ - -To generate the readme, run the following command: - -```sh -npm install -g verbose/verb#dev verb-generate-readme && verb -``` - -
    - -### Author - -**Jon Schlinkert** - -* [GitHub Profile](https://github.com/jonschlinkert) -* [Twitter Profile](https://twitter.com/jonschlinkert) -* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) - -### License - -Copyright © 2017-present, [Jon Schlinkert](https://github.com/jonschlinkert). -Released under the [MIT License](LICENSE). diff --git a/node_modules/picomatch/index.js b/node_modules/picomatch/index.js deleted file mode 100644 index d2f2bc5..0000000 --- a/node_modules/picomatch/index.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -module.exports = require('./lib/picomatch'); diff --git a/node_modules/picomatch/lib/constants.js b/node_modules/picomatch/lib/constants.js deleted file mode 100644 index a62ef38..0000000 --- a/node_modules/picomatch/lib/constants.js +++ /dev/null @@ -1,179 +0,0 @@ -'use strict'; - -const path = require('path'); -const WIN_SLASH = '\\\\/'; -const WIN_NO_SLASH = `[^${WIN_SLASH}]`; - -/** - * Posix glob regex - */ - -const DOT_LITERAL = '\\.'; -const PLUS_LITERAL = '\\+'; -const QMARK_LITERAL = '\\?'; -const SLASH_LITERAL = '\\/'; -const ONE_CHAR = '(?=.)'; -const QMARK = '[^/]'; -const END_ANCHOR = `(?:${SLASH_LITERAL}|$)`; -const START_ANCHOR = `(?:^|${SLASH_LITERAL})`; -const DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`; -const NO_DOT = `(?!${DOT_LITERAL})`; -const NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`; -const NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`; -const NO_DOTS_SLASH = `(?!${DOTS_SLASH})`; -const QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`; -const STAR = `${QMARK}*?`; - -const POSIX_CHARS = { - DOT_LITERAL, - PLUS_LITERAL, - QMARK_LITERAL, - SLASH_LITERAL, - ONE_CHAR, - QMARK, - END_ANCHOR, - DOTS_SLASH, - NO_DOT, - NO_DOTS, - NO_DOT_SLASH, - NO_DOTS_SLASH, - QMARK_NO_DOT, - STAR, - START_ANCHOR -}; - -/** - * Windows glob regex - */ - -const WINDOWS_CHARS = { - ...POSIX_CHARS, - - SLASH_LITERAL: `[${WIN_SLASH}]`, - QMARK: WIN_NO_SLASH, - STAR: `${WIN_NO_SLASH}*?`, - DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`, - NO_DOT: `(?!${DOT_LITERAL})`, - NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`, - NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`, - NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`, - QMARK_NO_DOT: `[^.${WIN_SLASH}]`, - START_ANCHOR: `(?:^|[${WIN_SLASH}])`, - END_ANCHOR: `(?:[${WIN_SLASH}]|$)` -}; - -/** - * POSIX Bracket Regex - */ - -const POSIX_REGEX_SOURCE = { - alnum: 'a-zA-Z0-9', - alpha: 'a-zA-Z', - ascii: '\\x00-\\x7F', - blank: ' \\t', - cntrl: '\\x00-\\x1F\\x7F', - digit: '0-9', - graph: '\\x21-\\x7E', - lower: 'a-z', - print: '\\x20-\\x7E ', - punct: '\\-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~', - space: ' \\t\\r\\n\\v\\f', - upper: 'A-Z', - word: 'A-Za-z0-9_', - xdigit: 'A-Fa-f0-9' -}; - -module.exports = { - MAX_LENGTH: 1024 * 64, - POSIX_REGEX_SOURCE, - - // regular expressions - REGEX_BACKSLASH: /\\(?![*+?^${}(|)[\]])/g, - REGEX_NON_SPECIAL_CHARS: /^[^@![\].,$*+?^{}()|\\/]+/, - REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\]]/, - REGEX_SPECIAL_CHARS_BACKREF: /(\\?)((\W)(\3*))/g, - REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\]])/g, - REGEX_REMOVE_BACKSLASH: /(?:\[.*?[^\\]\]|\\(?=.))/g, - - // Replace globs with equivalent patterns to reduce parsing time. - REPLACEMENTS: { - '***': '*', - '**/**': '**', - '**/**/**': '**' - }, - - // Digits - CHAR_0: 48, /* 0 */ - CHAR_9: 57, /* 9 */ - - // Alphabet chars. - CHAR_UPPERCASE_A: 65, /* A */ - CHAR_LOWERCASE_A: 97, /* a */ - CHAR_UPPERCASE_Z: 90, /* Z */ - CHAR_LOWERCASE_Z: 122, /* z */ - - CHAR_LEFT_PARENTHESES: 40, /* ( */ - CHAR_RIGHT_PARENTHESES: 41, /* ) */ - - CHAR_ASTERISK: 42, /* * */ - - // Non-alphabetic chars. - CHAR_AMPERSAND: 38, /* & */ - CHAR_AT: 64, /* @ */ - CHAR_BACKWARD_SLASH: 92, /* \ */ - CHAR_CARRIAGE_RETURN: 13, /* \r */ - CHAR_CIRCUMFLEX_ACCENT: 94, /* ^ */ - CHAR_COLON: 58, /* : */ - CHAR_COMMA: 44, /* , */ - CHAR_DOT: 46, /* . */ - CHAR_DOUBLE_QUOTE: 34, /* " */ - CHAR_EQUAL: 61, /* = */ - CHAR_EXCLAMATION_MARK: 33, /* ! */ - CHAR_FORM_FEED: 12, /* \f */ - CHAR_FORWARD_SLASH: 47, /* / */ - CHAR_GRAVE_ACCENT: 96, /* ` */ - CHAR_HASH: 35, /* # */ - CHAR_HYPHEN_MINUS: 45, /* - */ - CHAR_LEFT_ANGLE_BRACKET: 60, /* < */ - CHAR_LEFT_CURLY_BRACE: 123, /* { */ - CHAR_LEFT_SQUARE_BRACKET: 91, /* [ */ - CHAR_LINE_FEED: 10, /* \n */ - CHAR_NO_BREAK_SPACE: 160, /* \u00A0 */ - CHAR_PERCENT: 37, /* % */ - CHAR_PLUS: 43, /* + */ - CHAR_QUESTION_MARK: 63, /* ? */ - CHAR_RIGHT_ANGLE_BRACKET: 62, /* > */ - CHAR_RIGHT_CURLY_BRACE: 125, /* } */ - CHAR_RIGHT_SQUARE_BRACKET: 93, /* ] */ - CHAR_SEMICOLON: 59, /* ; */ - CHAR_SINGLE_QUOTE: 39, /* ' */ - CHAR_SPACE: 32, /* */ - CHAR_TAB: 9, /* \t */ - CHAR_UNDERSCORE: 95, /* _ */ - CHAR_VERTICAL_LINE: 124, /* | */ - CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, /* \uFEFF */ - - SEP: path.sep, - - /** - * Create EXTGLOB_CHARS - */ - - extglobChars(chars) { - return { - '!': { type: 'negate', open: '(?:(?!(?:', close: `))${chars.STAR})` }, - '?': { type: 'qmark', open: '(?:', close: ')?' }, - '+': { type: 'plus', open: '(?:', close: ')+' }, - '*': { type: 'star', open: '(?:', close: ')*' }, - '@': { type: 'at', open: '(?:', close: ')' } - }; - }, - - /** - * Create GLOB_CHARS - */ - - globChars(win32) { - return win32 === true ? WINDOWS_CHARS : POSIX_CHARS; - } -}; diff --git a/node_modules/picomatch/lib/parse.js b/node_modules/picomatch/lib/parse.js deleted file mode 100644 index 58269d0..0000000 --- a/node_modules/picomatch/lib/parse.js +++ /dev/null @@ -1,1091 +0,0 @@ -'use strict'; - -const constants = require('./constants'); -const utils = require('./utils'); - -/** - * Constants - */ - -const { - MAX_LENGTH, - POSIX_REGEX_SOURCE, - REGEX_NON_SPECIAL_CHARS, - REGEX_SPECIAL_CHARS_BACKREF, - REPLACEMENTS -} = constants; - -/** - * Helpers - */ - -const expandRange = (args, options) => { - if (typeof options.expandRange === 'function') { - return options.expandRange(...args, options); - } - - args.sort(); - const value = `[${args.join('-')}]`; - - try { - /* eslint-disable-next-line no-new */ - new RegExp(value); - } catch (ex) { - return args.map(v => utils.escapeRegex(v)).join('..'); - } - - return value; -}; - -/** - * Create the message for a syntax error - */ - -const syntaxError = (type, char) => { - return `Missing ${type}: "${char}" - use "\\\\${char}" to match literal characters`; -}; - -/** - * Parse the given input string. - * @param {String} input - * @param {Object} options - * @return {Object} - */ - -const parse = (input, options) => { - if (typeof input !== 'string') { - throw new TypeError('Expected a string'); - } - - input = REPLACEMENTS[input] || input; - - const opts = { ...options }; - const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; - - let len = input.length; - if (len > max) { - throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); - } - - const bos = { type: 'bos', value: '', output: opts.prepend || '' }; - const tokens = [bos]; - - const capture = opts.capture ? '' : '?:'; - const win32 = utils.isWindows(options); - - // create constants based on platform, for windows or posix - const PLATFORM_CHARS = constants.globChars(win32); - const EXTGLOB_CHARS = constants.extglobChars(PLATFORM_CHARS); - - const { - DOT_LITERAL, - PLUS_LITERAL, - SLASH_LITERAL, - ONE_CHAR, - DOTS_SLASH, - NO_DOT, - NO_DOT_SLASH, - NO_DOTS_SLASH, - QMARK, - QMARK_NO_DOT, - STAR, - START_ANCHOR - } = PLATFORM_CHARS; - - const globstar = opts => { - return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`; - }; - - const nodot = opts.dot ? '' : NO_DOT; - const qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT; - let star = opts.bash === true ? globstar(opts) : STAR; - - if (opts.capture) { - star = `(${star})`; - } - - // minimatch options support - if (typeof opts.noext === 'boolean') { - opts.noextglob = opts.noext; - } - - const state = { - input, - index: -1, - start: 0, - dot: opts.dot === true, - consumed: '', - output: '', - prefix: '', - backtrack: false, - negated: false, - brackets: 0, - braces: 0, - parens: 0, - quotes: 0, - globstar: false, - tokens - }; - - input = utils.removePrefix(input, state); - len = input.length; - - const extglobs = []; - const braces = []; - const stack = []; - let prev = bos; - let value; - - /** - * Tokenizing helpers - */ - - const eos = () => state.index === len - 1; - const peek = state.peek = (n = 1) => input[state.index + n]; - const advance = state.advance = () => input[++state.index] || ''; - const remaining = () => input.slice(state.index + 1); - const consume = (value = '', num = 0) => { - state.consumed += value; - state.index += num; - }; - - const append = token => { - state.output += token.output != null ? token.output : token.value; - consume(token.value); - }; - - const negate = () => { - let count = 1; - - while (peek() === '!' && (peek(2) !== '(' || peek(3) === '?')) { - advance(); - state.start++; - count++; - } - - if (count % 2 === 0) { - return false; - } - - state.negated = true; - state.start++; - return true; - }; - - const increment = type => { - state[type]++; - stack.push(type); - }; - - const decrement = type => { - state[type]--; - stack.pop(); - }; - - /** - * Push tokens onto the tokens array. This helper speeds up - * tokenizing by 1) helping us avoid backtracking as much as possible, - * and 2) helping us avoid creating extra tokens when consecutive - * characters are plain text. This improves performance and simplifies - * lookbehinds. - */ - - const push = tok => { - if (prev.type === 'globstar') { - const isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace'); - const isExtglob = tok.extglob === true || (extglobs.length && (tok.type === 'pipe' || tok.type === 'paren')); - - if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) { - state.output = state.output.slice(0, -prev.output.length); - prev.type = 'star'; - prev.value = '*'; - prev.output = star; - state.output += prev.output; - } - } - - if (extglobs.length && tok.type !== 'paren') { - extglobs[extglobs.length - 1].inner += tok.value; - } - - if (tok.value || tok.output) append(tok); - if (prev && prev.type === 'text' && tok.type === 'text') { - prev.value += tok.value; - prev.output = (prev.output || '') + tok.value; - return; - } - - tok.prev = prev; - tokens.push(tok); - prev = tok; - }; - - const extglobOpen = (type, value) => { - const token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' }; - - token.prev = prev; - token.parens = state.parens; - token.output = state.output; - const output = (opts.capture ? '(' : '') + token.open; - - increment('parens'); - push({ type, value, output: state.output ? '' : ONE_CHAR }); - push({ type: 'paren', extglob: true, value: advance(), output }); - extglobs.push(token); - }; - - const extglobClose = token => { - let output = token.close + (opts.capture ? ')' : ''); - let rest; - - if (token.type === 'negate') { - let extglobStar = star; - - if (token.inner && token.inner.length > 1 && token.inner.includes('/')) { - extglobStar = globstar(opts); - } - - if (extglobStar !== star || eos() || /^\)+$/.test(remaining())) { - output = token.close = `)$))${extglobStar}`; - } - - if (token.inner.includes('*') && (rest = remaining()) && /^\.[^\\/.]+$/.test(rest)) { - // Any non-magical string (`.ts`) or even nested expression (`.{ts,tsx}`) can follow after the closing parenthesis. - // In this case, we need to parse the string and use it in the output of the original pattern. - // Suitable patterns: `/!(*.d).ts`, `/!(*.d).{ts,tsx}`, `**/!(*-dbg).@(js)`. - // - // Disabling the `fastpaths` option due to a problem with parsing strings as `.ts` in the pattern like `**/!(*.d).ts`. - const expression = parse(rest, { ...options, fastpaths: false }).output; - - output = token.close = `)${expression})${extglobStar})`; - } - - if (token.prev.type === 'bos') { - state.negatedExtglob = true; - } - } - - push({ type: 'paren', extglob: true, value, output }); - decrement('parens'); - }; - - /** - * Fast paths - */ - - if (opts.fastpaths !== false && !/(^[*!]|[/()[\]{}"])/.test(input)) { - let backslashes = false; - - let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => { - if (first === '\\') { - backslashes = true; - return m; - } - - if (first === '?') { - if (esc) { - return esc + first + (rest ? QMARK.repeat(rest.length) : ''); - } - if (index === 0) { - return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : ''); - } - return QMARK.repeat(chars.length); - } - - if (first === '.') { - return DOT_LITERAL.repeat(chars.length); - } - - if (first === '*') { - if (esc) { - return esc + first + (rest ? star : ''); - } - return star; - } - return esc ? m : `\\${m}`; - }); - - if (backslashes === true) { - if (opts.unescape === true) { - output = output.replace(/\\/g, ''); - } else { - output = output.replace(/\\+/g, m => { - return m.length % 2 === 0 ? '\\\\' : (m ? '\\' : ''); - }); - } - } - - if (output === input && opts.contains === true) { - state.output = input; - return state; - } - - state.output = utils.wrapOutput(output, state, options); - return state; - } - - /** - * Tokenize input until we reach end-of-string - */ - - while (!eos()) { - value = advance(); - - if (value === '\u0000') { - continue; - } - - /** - * Escaped characters - */ - - if (value === '\\') { - const next = peek(); - - if (next === '/' && opts.bash !== true) { - continue; - } - - if (next === '.' || next === ';') { - continue; - } - - if (!next) { - value += '\\'; - push({ type: 'text', value }); - continue; - } - - // collapse slashes to reduce potential for exploits - const match = /^\\+/.exec(remaining()); - let slashes = 0; - - if (match && match[0].length > 2) { - slashes = match[0].length; - state.index += slashes; - if (slashes % 2 !== 0) { - value += '\\'; - } - } - - if (opts.unescape === true) { - value = advance(); - } else { - value += advance(); - } - - if (state.brackets === 0) { - push({ type: 'text', value }); - continue; - } - } - - /** - * If we're inside a regex character class, continue - * until we reach the closing bracket. - */ - - if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) { - if (opts.posix !== false && value === ':') { - const inner = prev.value.slice(1); - if (inner.includes('[')) { - prev.posix = true; - - if (inner.includes(':')) { - const idx = prev.value.lastIndexOf('['); - const pre = prev.value.slice(0, idx); - const rest = prev.value.slice(idx + 2); - const posix = POSIX_REGEX_SOURCE[rest]; - if (posix) { - prev.value = pre + posix; - state.backtrack = true; - advance(); - - if (!bos.output && tokens.indexOf(prev) === 1) { - bos.output = ONE_CHAR; - } - continue; - } - } - } - } - - if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) { - value = `\\${value}`; - } - - if (value === ']' && (prev.value === '[' || prev.value === '[^')) { - value = `\\${value}`; - } - - if (opts.posix === true && value === '!' && prev.value === '[') { - value = '^'; - } - - prev.value += value; - append({ value }); - continue; - } - - /** - * If we're inside a quoted string, continue - * until we reach the closing double quote. - */ - - if (state.quotes === 1 && value !== '"') { - value = utils.escapeRegex(value); - prev.value += value; - append({ value }); - continue; - } - - /** - * Double quotes - */ - - if (value === '"') { - state.quotes = state.quotes === 1 ? 0 : 1; - if (opts.keepQuotes === true) { - push({ type: 'text', value }); - } - continue; - } - - /** - * Parentheses - */ - - if (value === '(') { - increment('parens'); - push({ type: 'paren', value }); - continue; - } - - if (value === ')') { - if (state.parens === 0 && opts.strictBrackets === true) { - throw new SyntaxError(syntaxError('opening', '(')); - } - - const extglob = extglobs[extglobs.length - 1]; - if (extglob && state.parens === extglob.parens + 1) { - extglobClose(extglobs.pop()); - continue; - } - - push({ type: 'paren', value, output: state.parens ? ')' : '\\)' }); - decrement('parens'); - continue; - } - - /** - * Square brackets - */ - - if (value === '[') { - if (opts.nobracket === true || !remaining().includes(']')) { - if (opts.nobracket !== true && opts.strictBrackets === true) { - throw new SyntaxError(syntaxError('closing', ']')); - } - - value = `\\${value}`; - } else { - increment('brackets'); - } - - push({ type: 'bracket', value }); - continue; - } - - if (value === ']') { - if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) { - push({ type: 'text', value, output: `\\${value}` }); - continue; - } - - if (state.brackets === 0) { - if (opts.strictBrackets === true) { - throw new SyntaxError(syntaxError('opening', '[')); - } - - push({ type: 'text', value, output: `\\${value}` }); - continue; - } - - decrement('brackets'); - - const prevValue = prev.value.slice(1); - if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) { - value = `/${value}`; - } - - prev.value += value; - append({ value }); - - // when literal brackets are explicitly disabled - // assume we should match with a regex character class - if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) { - continue; - } - - const escaped = utils.escapeRegex(prev.value); - state.output = state.output.slice(0, -prev.value.length); - - // when literal brackets are explicitly enabled - // assume we should escape the brackets to match literal characters - if (opts.literalBrackets === true) { - state.output += escaped; - prev.value = escaped; - continue; - } - - // when the user specifies nothing, try to match both - prev.value = `(${capture}${escaped}|${prev.value})`; - state.output += prev.value; - continue; - } - - /** - * Braces - */ - - if (value === '{' && opts.nobrace !== true) { - increment('braces'); - - const open = { - type: 'brace', - value, - output: '(', - outputIndex: state.output.length, - tokensIndex: state.tokens.length - }; - - braces.push(open); - push(open); - continue; - } - - if (value === '}') { - const brace = braces[braces.length - 1]; - - if (opts.nobrace === true || !brace) { - push({ type: 'text', value, output: value }); - continue; - } - - let output = ')'; - - if (brace.dots === true) { - const arr = tokens.slice(); - const range = []; - - for (let i = arr.length - 1; i >= 0; i--) { - tokens.pop(); - if (arr[i].type === 'brace') { - break; - } - if (arr[i].type !== 'dots') { - range.unshift(arr[i].value); - } - } - - output = expandRange(range, opts); - state.backtrack = true; - } - - if (brace.comma !== true && brace.dots !== true) { - const out = state.output.slice(0, brace.outputIndex); - const toks = state.tokens.slice(brace.tokensIndex); - brace.value = brace.output = '\\{'; - value = output = '\\}'; - state.output = out; - for (const t of toks) { - state.output += (t.output || t.value); - } - } - - push({ type: 'brace', value, output }); - decrement('braces'); - braces.pop(); - continue; - } - - /** - * Pipes - */ - - if (value === '|') { - if (extglobs.length > 0) { - extglobs[extglobs.length - 1].conditions++; - } - push({ type: 'text', value }); - continue; - } - - /** - * Commas - */ - - if (value === ',') { - let output = value; - - const brace = braces[braces.length - 1]; - if (brace && stack[stack.length - 1] === 'braces') { - brace.comma = true; - output = '|'; - } - - push({ type: 'comma', value, output }); - continue; - } - - /** - * Slashes - */ - - if (value === '/') { - // if the beginning of the glob is "./", advance the start - // to the current index, and don't add the "./" characters - // to the state. This greatly simplifies lookbehinds when - // checking for BOS characters like "!" and "." (not "./") - if (prev.type === 'dot' && state.index === state.start + 1) { - state.start = state.index + 1; - state.consumed = ''; - state.output = ''; - tokens.pop(); - prev = bos; // reset "prev" to the first token - continue; - } - - push({ type: 'slash', value, output: SLASH_LITERAL }); - continue; - } - - /** - * Dots - */ - - if (value === '.') { - if (state.braces > 0 && prev.type === 'dot') { - if (prev.value === '.') prev.output = DOT_LITERAL; - const brace = braces[braces.length - 1]; - prev.type = 'dots'; - prev.output += value; - prev.value += value; - brace.dots = true; - continue; - } - - if ((state.braces + state.parens) === 0 && prev.type !== 'bos' && prev.type !== 'slash') { - push({ type: 'text', value, output: DOT_LITERAL }); - continue; - } - - push({ type: 'dot', value, output: DOT_LITERAL }); - continue; - } - - /** - * Question marks - */ - - if (value === '?') { - const isGroup = prev && prev.value === '('; - if (!isGroup && opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { - extglobOpen('qmark', value); - continue; - } - - if (prev && prev.type === 'paren') { - const next = peek(); - let output = value; - - if (next === '<' && !utils.supportsLookbehinds()) { - throw new Error('Node.js v10 or higher is required for regex lookbehinds'); - } - - if ((prev.value === '(' && !/[!=<:]/.test(next)) || (next === '<' && !/<([!=]|\w+>)/.test(remaining()))) { - output = `\\${value}`; - } - - push({ type: 'text', value, output }); - continue; - } - - if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) { - push({ type: 'qmark', value, output: QMARK_NO_DOT }); - continue; - } - - push({ type: 'qmark', value, output: QMARK }); - continue; - } - - /** - * Exclamation - */ - - if (value === '!') { - if (opts.noextglob !== true && peek() === '(') { - if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) { - extglobOpen('negate', value); - continue; - } - } - - if (opts.nonegate !== true && state.index === 0) { - negate(); - continue; - } - } - - /** - * Plus - */ - - if (value === '+') { - if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { - extglobOpen('plus', value); - continue; - } - - if ((prev && prev.value === '(') || opts.regex === false) { - push({ type: 'plus', value, output: PLUS_LITERAL }); - continue; - } - - if ((prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) || state.parens > 0) { - push({ type: 'plus', value }); - continue; - } - - push({ type: 'plus', value: PLUS_LITERAL }); - continue; - } - - /** - * Plain text - */ - - if (value === '@') { - if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { - push({ type: 'at', extglob: true, value, output: '' }); - continue; - } - - push({ type: 'text', value }); - continue; - } - - /** - * Plain text - */ - - if (value !== '*') { - if (value === '$' || value === '^') { - value = `\\${value}`; - } - - const match = REGEX_NON_SPECIAL_CHARS.exec(remaining()); - if (match) { - value += match[0]; - state.index += match[0].length; - } - - push({ type: 'text', value }); - continue; - } - - /** - * Stars - */ - - if (prev && (prev.type === 'globstar' || prev.star === true)) { - prev.type = 'star'; - prev.star = true; - prev.value += value; - prev.output = star; - state.backtrack = true; - state.globstar = true; - consume(value); - continue; - } - - let rest = remaining(); - if (opts.noextglob !== true && /^\([^?]/.test(rest)) { - extglobOpen('star', value); - continue; - } - - if (prev.type === 'star') { - if (opts.noglobstar === true) { - consume(value); - continue; - } - - const prior = prev.prev; - const before = prior.prev; - const isStart = prior.type === 'slash' || prior.type === 'bos'; - const afterStar = before && (before.type === 'star' || before.type === 'globstar'); - - if (opts.bash === true && (!isStart || (rest[0] && rest[0] !== '/'))) { - push({ type: 'star', value, output: '' }); - continue; - } - - const isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace'); - const isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren'); - if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) { - push({ type: 'star', value, output: '' }); - continue; - } - - // strip consecutive `/**/` - while (rest.slice(0, 3) === '/**') { - const after = input[state.index + 4]; - if (after && after !== '/') { - break; - } - rest = rest.slice(3); - consume('/**', 3); - } - - if (prior.type === 'bos' && eos()) { - prev.type = 'globstar'; - prev.value += value; - prev.output = globstar(opts); - state.output = prev.output; - state.globstar = true; - consume(value); - continue; - } - - if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) { - state.output = state.output.slice(0, -(prior.output + prev.output).length); - prior.output = `(?:${prior.output}`; - - prev.type = 'globstar'; - prev.output = globstar(opts) + (opts.strictSlashes ? ')' : '|$)'); - prev.value += value; - state.globstar = true; - state.output += prior.output + prev.output; - consume(value); - continue; - } - - if (prior.type === 'slash' && prior.prev.type !== 'bos' && rest[0] === '/') { - const end = rest[1] !== void 0 ? '|$' : ''; - - state.output = state.output.slice(0, -(prior.output + prev.output).length); - prior.output = `(?:${prior.output}`; - - prev.type = 'globstar'; - prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`; - prev.value += value; - - state.output += prior.output + prev.output; - state.globstar = true; - - consume(value + advance()); - - push({ type: 'slash', value: '/', output: '' }); - continue; - } - - if (prior.type === 'bos' && rest[0] === '/') { - prev.type = 'globstar'; - prev.value += value; - prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`; - state.output = prev.output; - state.globstar = true; - consume(value + advance()); - push({ type: 'slash', value: '/', output: '' }); - continue; - } - - // remove single star from output - state.output = state.output.slice(0, -prev.output.length); - - // reset previous token to globstar - prev.type = 'globstar'; - prev.output = globstar(opts); - prev.value += value; - - // reset output with globstar - state.output += prev.output; - state.globstar = true; - consume(value); - continue; - } - - const token = { type: 'star', value, output: star }; - - if (opts.bash === true) { - token.output = '.*?'; - if (prev.type === 'bos' || prev.type === 'slash') { - token.output = nodot + token.output; - } - push(token); - continue; - } - - if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) { - token.output = value; - push(token); - continue; - } - - if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') { - if (prev.type === 'dot') { - state.output += NO_DOT_SLASH; - prev.output += NO_DOT_SLASH; - - } else if (opts.dot === true) { - state.output += NO_DOTS_SLASH; - prev.output += NO_DOTS_SLASH; - - } else { - state.output += nodot; - prev.output += nodot; - } - - if (peek() !== '*') { - state.output += ONE_CHAR; - prev.output += ONE_CHAR; - } - } - - push(token); - } - - while (state.brackets > 0) { - if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ']')); - state.output = utils.escapeLast(state.output, '['); - decrement('brackets'); - } - - while (state.parens > 0) { - if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ')')); - state.output = utils.escapeLast(state.output, '('); - decrement('parens'); - } - - while (state.braces > 0) { - if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', '}')); - state.output = utils.escapeLast(state.output, '{'); - decrement('braces'); - } - - if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) { - push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` }); - } - - // rebuild the output if we had to backtrack at any point - if (state.backtrack === true) { - state.output = ''; - - for (const token of state.tokens) { - state.output += token.output != null ? token.output : token.value; - - if (token.suffix) { - state.output += token.suffix; - } - } - } - - return state; -}; - -/** - * Fast paths for creating regular expressions for common glob patterns. - * This can significantly speed up processing and has very little downside - * impact when none of the fast paths match. - */ - -parse.fastpaths = (input, options) => { - const opts = { ...options }; - const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; - const len = input.length; - if (len > max) { - throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); - } - - input = REPLACEMENTS[input] || input; - const win32 = utils.isWindows(options); - - // create constants based on platform, for windows or posix - const { - DOT_LITERAL, - SLASH_LITERAL, - ONE_CHAR, - DOTS_SLASH, - NO_DOT, - NO_DOTS, - NO_DOTS_SLASH, - STAR, - START_ANCHOR - } = constants.globChars(win32); - - const nodot = opts.dot ? NO_DOTS : NO_DOT; - const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT; - const capture = opts.capture ? '' : '?:'; - const state = { negated: false, prefix: '' }; - let star = opts.bash === true ? '.*?' : STAR; - - if (opts.capture) { - star = `(${star})`; - } - - const globstar = opts => { - if (opts.noglobstar === true) return star; - return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`; - }; - - const create = str => { - switch (str) { - case '*': - return `${nodot}${ONE_CHAR}${star}`; - - case '.*': - return `${DOT_LITERAL}${ONE_CHAR}${star}`; - - case '*.*': - return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; - - case '*/*': - return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`; - - case '**': - return nodot + globstar(opts); - - case '**/*': - return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`; - - case '**/*.*': - return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; - - case '**/.*': - return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`; - - default: { - const match = /^(.*?)\.(\w+)$/.exec(str); - if (!match) return; - - const source = create(match[1]); - if (!source) return; - - return source + DOT_LITERAL + match[2]; - } - } - }; - - const output = utils.removePrefix(input, state); - let source = create(output); - - if (source && opts.strictSlashes !== true) { - source += `${SLASH_LITERAL}?`; - } - - return source; -}; - -module.exports = parse; diff --git a/node_modules/picomatch/lib/picomatch.js b/node_modules/picomatch/lib/picomatch.js deleted file mode 100644 index 782d809..0000000 --- a/node_modules/picomatch/lib/picomatch.js +++ /dev/null @@ -1,342 +0,0 @@ -'use strict'; - -const path = require('path'); -const scan = require('./scan'); -const parse = require('./parse'); -const utils = require('./utils'); -const constants = require('./constants'); -const isObject = val => val && typeof val === 'object' && !Array.isArray(val); - -/** - * Creates a matcher function from one or more glob patterns. The - * returned function takes a string to match as its first argument, - * and returns true if the string is a match. The returned matcher - * function also takes a boolean as the second argument that, when true, - * returns an object with additional information. - * - * ```js - * const picomatch = require('picomatch'); - * // picomatch(glob[, options]); - * - * const isMatch = picomatch('*.!(*a)'); - * console.log(isMatch('a.a')); //=> false - * console.log(isMatch('a.b')); //=> true - * ``` - * @name picomatch - * @param {String|Array} `globs` One or more glob patterns. - * @param {Object=} `options` - * @return {Function=} Returns a matcher function. - * @api public - */ - -const picomatch = (glob, options, returnState = false) => { - if (Array.isArray(glob)) { - const fns = glob.map(input => picomatch(input, options, returnState)); - const arrayMatcher = str => { - for (const isMatch of fns) { - const state = isMatch(str); - if (state) return state; - } - return false; - }; - return arrayMatcher; - } - - const isState = isObject(glob) && glob.tokens && glob.input; - - if (glob === '' || (typeof glob !== 'string' && !isState)) { - throw new TypeError('Expected pattern to be a non-empty string'); - } - - const opts = options || {}; - const posix = utils.isWindows(options); - const regex = isState - ? picomatch.compileRe(glob, options) - : picomatch.makeRe(glob, options, false, true); - - const state = regex.state; - delete regex.state; - - let isIgnored = () => false; - if (opts.ignore) { - const ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null }; - isIgnored = picomatch(opts.ignore, ignoreOpts, returnState); - } - - const matcher = (input, returnObject = false) => { - const { isMatch, match, output } = picomatch.test(input, regex, options, { glob, posix }); - const result = { glob, state, regex, posix, input, output, match, isMatch }; - - if (typeof opts.onResult === 'function') { - opts.onResult(result); - } - - if (isMatch === false) { - result.isMatch = false; - return returnObject ? result : false; - } - - if (isIgnored(input)) { - if (typeof opts.onIgnore === 'function') { - opts.onIgnore(result); - } - result.isMatch = false; - return returnObject ? result : false; - } - - if (typeof opts.onMatch === 'function') { - opts.onMatch(result); - } - return returnObject ? result : true; - }; - - if (returnState) { - matcher.state = state; - } - - return matcher; -}; - -/** - * Test `input` with the given `regex`. This is used by the main - * `picomatch()` function to test the input string. - * - * ```js - * const picomatch = require('picomatch'); - * // picomatch.test(input, regex[, options]); - * - * console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\/([^/]*?))$/)); - * // { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' } - * ``` - * @param {String} `input` String to test. - * @param {RegExp} `regex` - * @return {Object} Returns an object with matching info. - * @api public - */ - -picomatch.test = (input, regex, options, { glob, posix } = {}) => { - if (typeof input !== 'string') { - throw new TypeError('Expected input to be a string'); - } - - if (input === '') { - return { isMatch: false, output: '' }; - } - - const opts = options || {}; - const format = opts.format || (posix ? utils.toPosixSlashes : null); - let match = input === glob; - let output = (match && format) ? format(input) : input; - - if (match === false) { - output = format ? format(input) : input; - match = output === glob; - } - - if (match === false || opts.capture === true) { - if (opts.matchBase === true || opts.basename === true) { - match = picomatch.matchBase(input, regex, options, posix); - } else { - match = regex.exec(output); - } - } - - return { isMatch: Boolean(match), match, output }; -}; - -/** - * Match the basename of a filepath. - * - * ```js - * const picomatch = require('picomatch'); - * // picomatch.matchBase(input, glob[, options]); - * console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true - * ``` - * @param {String} `input` String to test. - * @param {RegExp|String} `glob` Glob pattern or regex created by [.makeRe](#makeRe). - * @return {Boolean} - * @api public - */ - -picomatch.matchBase = (input, glob, options, posix = utils.isWindows(options)) => { - const regex = glob instanceof RegExp ? glob : picomatch.makeRe(glob, options); - return regex.test(path.basename(input)); -}; - -/** - * Returns true if **any** of the given glob `patterns` match the specified `string`. - * - * ```js - * const picomatch = require('picomatch'); - * // picomatch.isMatch(string, patterns[, options]); - * - * console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true - * console.log(picomatch.isMatch('a.a', 'b.*')); //=> false - * ``` - * @param {String|Array} str The string to test. - * @param {String|Array} patterns One or more glob patterns to use for matching. - * @param {Object} [options] See available [options](#options). - * @return {Boolean} Returns true if any patterns match `str` - * @api public - */ - -picomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str); - -/** - * Parse a glob pattern to create the source string for a regular - * expression. - * - * ```js - * const picomatch = require('picomatch'); - * const result = picomatch.parse(pattern[, options]); - * ``` - * @param {String} `pattern` - * @param {Object} `options` - * @return {Object} Returns an object with useful properties and output to be used as a regex source string. - * @api public - */ - -picomatch.parse = (pattern, options) => { - if (Array.isArray(pattern)) return pattern.map(p => picomatch.parse(p, options)); - return parse(pattern, { ...options, fastpaths: false }); -}; - -/** - * Scan a glob pattern to separate the pattern into segments. - * - * ```js - * const picomatch = require('picomatch'); - * // picomatch.scan(input[, options]); - * - * const result = picomatch.scan('!./foo/*.js'); - * console.log(result); - * { prefix: '!./', - * input: '!./foo/*.js', - * start: 3, - * base: 'foo', - * glob: '*.js', - * isBrace: false, - * isBracket: false, - * isGlob: true, - * isExtglob: false, - * isGlobstar: false, - * negated: true } - * ``` - * @param {String} `input` Glob pattern to scan. - * @param {Object} `options` - * @return {Object} Returns an object with - * @api public - */ - -picomatch.scan = (input, options) => scan(input, options); - -/** - * Compile a regular expression from the `state` object returned by the - * [parse()](#parse) method. - * - * @param {Object} `state` - * @param {Object} `options` - * @param {Boolean} `returnOutput` Intended for implementors, this argument allows you to return the raw output from the parser. - * @param {Boolean} `returnState` Adds the state to a `state` property on the returned regex. Useful for implementors and debugging. - * @return {RegExp} - * @api public - */ - -picomatch.compileRe = (state, options, returnOutput = false, returnState = false) => { - if (returnOutput === true) { - return state.output; - } - - const opts = options || {}; - const prepend = opts.contains ? '' : '^'; - const append = opts.contains ? '' : '$'; - - let source = `${prepend}(?:${state.output})${append}`; - if (state && state.negated === true) { - source = `^(?!${source}).*$`; - } - - const regex = picomatch.toRegex(source, options); - if (returnState === true) { - regex.state = state; - } - - return regex; -}; - -/** - * Create a regular expression from a parsed glob pattern. - * - * ```js - * const picomatch = require('picomatch'); - * const state = picomatch.parse('*.js'); - * // picomatch.compileRe(state[, options]); - * - * console.log(picomatch.compileRe(state)); - * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ - * ``` - * @param {String} `state` The object returned from the `.parse` method. - * @param {Object} `options` - * @param {Boolean} `returnOutput` Implementors may use this argument to return the compiled output, instead of a regular expression. This is not exposed on the options to prevent end-users from mutating the result. - * @param {Boolean} `returnState` Implementors may use this argument to return the state from the parsed glob with the returned regular expression. - * @return {RegExp} Returns a regex created from the given pattern. - * @api public - */ - -picomatch.makeRe = (input, options = {}, returnOutput = false, returnState = false) => { - if (!input || typeof input !== 'string') { - throw new TypeError('Expected a non-empty string'); - } - - let parsed = { negated: false, fastpaths: true }; - - if (options.fastpaths !== false && (input[0] === '.' || input[0] === '*')) { - parsed.output = parse.fastpaths(input, options); - } - - if (!parsed.output) { - parsed = parse(input, options); - } - - return picomatch.compileRe(parsed, options, returnOutput, returnState); -}; - -/** - * Create a regular expression from the given regex source string. - * - * ```js - * const picomatch = require('picomatch'); - * // picomatch.toRegex(source[, options]); - * - * const { output } = picomatch.parse('*.js'); - * console.log(picomatch.toRegex(output)); - * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ - * ``` - * @param {String} `source` Regular expression source string. - * @param {Object} `options` - * @return {RegExp} - * @api public - */ - -picomatch.toRegex = (source, options) => { - try { - const opts = options || {}; - return new RegExp(source, opts.flags || (opts.nocase ? 'i' : '')); - } catch (err) { - if (options && options.debug === true) throw err; - return /$^/; - } -}; - -/** - * Picomatch constants. - * @return {Object} - */ - -picomatch.constants = constants; - -/** - * Expose "picomatch" - */ - -module.exports = picomatch; diff --git a/node_modules/picomatch/lib/scan.js b/node_modules/picomatch/lib/scan.js deleted file mode 100644 index e59cd7a..0000000 --- a/node_modules/picomatch/lib/scan.js +++ /dev/null @@ -1,391 +0,0 @@ -'use strict'; - -const utils = require('./utils'); -const { - CHAR_ASTERISK, /* * */ - CHAR_AT, /* @ */ - CHAR_BACKWARD_SLASH, /* \ */ - CHAR_COMMA, /* , */ - CHAR_DOT, /* . */ - CHAR_EXCLAMATION_MARK, /* ! */ - CHAR_FORWARD_SLASH, /* / */ - CHAR_LEFT_CURLY_BRACE, /* { */ - CHAR_LEFT_PARENTHESES, /* ( */ - CHAR_LEFT_SQUARE_BRACKET, /* [ */ - CHAR_PLUS, /* + */ - CHAR_QUESTION_MARK, /* ? */ - CHAR_RIGHT_CURLY_BRACE, /* } */ - CHAR_RIGHT_PARENTHESES, /* ) */ - CHAR_RIGHT_SQUARE_BRACKET /* ] */ -} = require('./constants'); - -const isPathSeparator = code => { - return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH; -}; - -const depth = token => { - if (token.isPrefix !== true) { - token.depth = token.isGlobstar ? Infinity : 1; - } -}; - -/** - * Quickly scans a glob pattern and returns an object with a handful of - * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists), - * `glob` (the actual pattern), `negated` (true if the path starts with `!` but not - * with `!(`) and `negatedExtglob` (true if the path starts with `!(`). - * - * ```js - * const pm = require('picomatch'); - * console.log(pm.scan('foo/bar/*.js')); - * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' } - * ``` - * @param {String} `str` - * @param {Object} `options` - * @return {Object} Returns an object with tokens and regex source string. - * @api public - */ - -const scan = (input, options) => { - const opts = options || {}; - - const length = input.length - 1; - const scanToEnd = opts.parts === true || opts.scanToEnd === true; - const slashes = []; - const tokens = []; - const parts = []; - - let str = input; - let index = -1; - let start = 0; - let lastIndex = 0; - let isBrace = false; - let isBracket = false; - let isGlob = false; - let isExtglob = false; - let isGlobstar = false; - let braceEscaped = false; - let backslashes = false; - let negated = false; - let negatedExtglob = false; - let finished = false; - let braces = 0; - let prev; - let code; - let token = { value: '', depth: 0, isGlob: false }; - - const eos = () => index >= length; - const peek = () => str.charCodeAt(index + 1); - const advance = () => { - prev = code; - return str.charCodeAt(++index); - }; - - while (index < length) { - code = advance(); - let next; - - if (code === CHAR_BACKWARD_SLASH) { - backslashes = token.backslashes = true; - code = advance(); - - if (code === CHAR_LEFT_CURLY_BRACE) { - braceEscaped = true; - } - continue; - } - - if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) { - braces++; - - while (eos() !== true && (code = advance())) { - if (code === CHAR_BACKWARD_SLASH) { - backslashes = token.backslashes = true; - advance(); - continue; - } - - if (code === CHAR_LEFT_CURLY_BRACE) { - braces++; - continue; - } - - if (braceEscaped !== true && code === CHAR_DOT && (code = advance()) === CHAR_DOT) { - isBrace = token.isBrace = true; - isGlob = token.isGlob = true; - finished = true; - - if (scanToEnd === true) { - continue; - } - - break; - } - - if (braceEscaped !== true && code === CHAR_COMMA) { - isBrace = token.isBrace = true; - isGlob = token.isGlob = true; - finished = true; - - if (scanToEnd === true) { - continue; - } - - break; - } - - if (code === CHAR_RIGHT_CURLY_BRACE) { - braces--; - - if (braces === 0) { - braceEscaped = false; - isBrace = token.isBrace = true; - finished = true; - break; - } - } - } - - if (scanToEnd === true) { - continue; - } - - break; - } - - if (code === CHAR_FORWARD_SLASH) { - slashes.push(index); - tokens.push(token); - token = { value: '', depth: 0, isGlob: false }; - - if (finished === true) continue; - if (prev === CHAR_DOT && index === (start + 1)) { - start += 2; - continue; - } - - lastIndex = index + 1; - continue; - } - - if (opts.noext !== true) { - const isExtglobChar = code === CHAR_PLUS - || code === CHAR_AT - || code === CHAR_ASTERISK - || code === CHAR_QUESTION_MARK - || code === CHAR_EXCLAMATION_MARK; - - if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES) { - isGlob = token.isGlob = true; - isExtglob = token.isExtglob = true; - finished = true; - if (code === CHAR_EXCLAMATION_MARK && index === start) { - negatedExtglob = true; - } - - if (scanToEnd === true) { - while (eos() !== true && (code = advance())) { - if (code === CHAR_BACKWARD_SLASH) { - backslashes = token.backslashes = true; - code = advance(); - continue; - } - - if (code === CHAR_RIGHT_PARENTHESES) { - isGlob = token.isGlob = true; - finished = true; - break; - } - } - continue; - } - break; - } - } - - if (code === CHAR_ASTERISK) { - if (prev === CHAR_ASTERISK) isGlobstar = token.isGlobstar = true; - isGlob = token.isGlob = true; - finished = true; - - if (scanToEnd === true) { - continue; - } - break; - } - - if (code === CHAR_QUESTION_MARK) { - isGlob = token.isGlob = true; - finished = true; - - if (scanToEnd === true) { - continue; - } - break; - } - - if (code === CHAR_LEFT_SQUARE_BRACKET) { - while (eos() !== true && (next = advance())) { - if (next === CHAR_BACKWARD_SLASH) { - backslashes = token.backslashes = true; - advance(); - continue; - } - - if (next === CHAR_RIGHT_SQUARE_BRACKET) { - isBracket = token.isBracket = true; - isGlob = token.isGlob = true; - finished = true; - break; - } - } - - if (scanToEnd === true) { - continue; - } - - break; - } - - if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) { - negated = token.negated = true; - start++; - continue; - } - - if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES) { - isGlob = token.isGlob = true; - - if (scanToEnd === true) { - while (eos() !== true && (code = advance())) { - if (code === CHAR_LEFT_PARENTHESES) { - backslashes = token.backslashes = true; - code = advance(); - continue; - } - - if (code === CHAR_RIGHT_PARENTHESES) { - finished = true; - break; - } - } - continue; - } - break; - } - - if (isGlob === true) { - finished = true; - - if (scanToEnd === true) { - continue; - } - - break; - } - } - - if (opts.noext === true) { - isExtglob = false; - isGlob = false; - } - - let base = str; - let prefix = ''; - let glob = ''; - - if (start > 0) { - prefix = str.slice(0, start); - str = str.slice(start); - lastIndex -= start; - } - - if (base && isGlob === true && lastIndex > 0) { - base = str.slice(0, lastIndex); - glob = str.slice(lastIndex); - } else if (isGlob === true) { - base = ''; - glob = str; - } else { - base = str; - } - - if (base && base !== '' && base !== '/' && base !== str) { - if (isPathSeparator(base.charCodeAt(base.length - 1))) { - base = base.slice(0, -1); - } - } - - if (opts.unescape === true) { - if (glob) glob = utils.removeBackslashes(glob); - - if (base && backslashes === true) { - base = utils.removeBackslashes(base); - } - } - - const state = { - prefix, - input, - start, - base, - glob, - isBrace, - isBracket, - isGlob, - isExtglob, - isGlobstar, - negated, - negatedExtglob - }; - - if (opts.tokens === true) { - state.maxDepth = 0; - if (!isPathSeparator(code)) { - tokens.push(token); - } - state.tokens = tokens; - } - - if (opts.parts === true || opts.tokens === true) { - let prevIndex; - - for (let idx = 0; idx < slashes.length; idx++) { - const n = prevIndex ? prevIndex + 1 : start; - const i = slashes[idx]; - const value = input.slice(n, i); - if (opts.tokens) { - if (idx === 0 && start !== 0) { - tokens[idx].isPrefix = true; - tokens[idx].value = prefix; - } else { - tokens[idx].value = value; - } - depth(tokens[idx]); - state.maxDepth += tokens[idx].depth; - } - if (idx !== 0 || value !== '') { - parts.push(value); - } - prevIndex = i; - } - - if (prevIndex && prevIndex + 1 < input.length) { - const value = input.slice(prevIndex + 1); - parts.push(value); - - if (opts.tokens) { - tokens[tokens.length - 1].value = value; - depth(tokens[tokens.length - 1]); - state.maxDepth += tokens[tokens.length - 1].depth; - } - } - - state.slashes = slashes; - state.parts = parts; - } - - return state; -}; - -module.exports = scan; diff --git a/node_modules/picomatch/lib/utils.js b/node_modules/picomatch/lib/utils.js deleted file mode 100644 index c3ca766..0000000 --- a/node_modules/picomatch/lib/utils.js +++ /dev/null @@ -1,64 +0,0 @@ -'use strict'; - -const path = require('path'); -const win32 = process.platform === 'win32'; -const { - REGEX_BACKSLASH, - REGEX_REMOVE_BACKSLASH, - REGEX_SPECIAL_CHARS, - REGEX_SPECIAL_CHARS_GLOBAL -} = require('./constants'); - -exports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val); -exports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str); -exports.isRegexChar = str => str.length === 1 && exports.hasRegexChars(str); -exports.escapeRegex = str => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, '\\$1'); -exports.toPosixSlashes = str => str.replace(REGEX_BACKSLASH, '/'); - -exports.removeBackslashes = str => { - return str.replace(REGEX_REMOVE_BACKSLASH, match => { - return match === '\\' ? '' : match; - }); -}; - -exports.supportsLookbehinds = () => { - const segs = process.version.slice(1).split('.').map(Number); - if (segs.length === 3 && segs[0] >= 9 || (segs[0] === 8 && segs[1] >= 10)) { - return true; - } - return false; -}; - -exports.isWindows = options => { - if (options && typeof options.windows === 'boolean') { - return options.windows; - } - return win32 === true || path.sep === '\\'; -}; - -exports.escapeLast = (input, char, lastIdx) => { - const idx = input.lastIndexOf(char, lastIdx); - if (idx === -1) return input; - if (input[idx - 1] === '\\') return exports.escapeLast(input, char, idx - 1); - return `${input.slice(0, idx)}\\${input.slice(idx)}`; -}; - -exports.removePrefix = (input, state = {}) => { - let output = input; - if (output.startsWith('./')) { - output = output.slice(2); - state.prefix = './'; - } - return output; -}; - -exports.wrapOutput = (input, state = {}, options = {}) => { - const prepend = options.contains ? '' : '^'; - const append = options.contains ? '' : '$'; - - let output = `${prepend}(?:${input})${append}`; - if (state.negated === true) { - output = `(?:^(?!${output}).*$)`; - } - return output; -}; diff --git a/node_modules/picomatch/package.json b/node_modules/picomatch/package.json deleted file mode 100644 index 3db22d4..0000000 --- a/node_modules/picomatch/package.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "name": "picomatch", - "description": "Blazing fast and accurate glob matcher written in JavaScript, with no dependencies and full support for standard and extended Bash glob features, including braces, extglobs, POSIX brackets, and regular expressions.", - "version": "2.3.1", - "homepage": "https://github.com/micromatch/picomatch", - "author": "Jon Schlinkert (https://github.com/jonschlinkert)", - "funding": "https://github.com/sponsors/jonschlinkert", - "repository": "micromatch/picomatch", - "bugs": { - "url": "https://github.com/micromatch/picomatch/issues" - }, - "license": "MIT", - "files": [ - "index.js", - "lib" - ], - "main": "index.js", - "engines": { - "node": ">=8.6" - }, - "scripts": { - "lint": "eslint --cache --cache-location node_modules/.cache/.eslintcache --report-unused-disable-directives --ignore-path .gitignore .", - "mocha": "mocha --reporter dot", - "test": "npm run lint && npm run mocha", - "test:ci": "npm run test:cover", - "test:cover": "nyc npm run mocha" - }, - "devDependencies": { - "eslint": "^6.8.0", - "fill-range": "^7.0.1", - "gulp-format-md": "^2.0.0", - "mocha": "^6.2.2", - "nyc": "^15.0.0", - "time-require": "github:jonschlinkert/time-require" - }, - "keywords": [ - "glob", - "match", - "picomatch" - ], - "nyc": { - "reporter": [ - "html", - "lcov", - "text-summary" - ] - }, - "verb": { - "toc": { - "render": true, - "method": "preWrite", - "maxdepth": 3 - }, - "layout": "empty", - "tasks": [ - "readme" - ], - "plugins": [ - "gulp-format-md" - ], - "lint": { - "reflinks": true - }, - "related": { - "list": [ - "braces", - "micromatch" - ] - }, - "reflinks": [ - "braces", - "expand-brackets", - "extglob", - "fill-range", - "micromatch", - "minimatch", - "nanomatch", - "picomatch" - ] - } -} diff --git a/node_modules/pify/index.js b/node_modules/pify/index.js deleted file mode 100644 index 7c720eb..0000000 --- a/node_modules/pify/index.js +++ /dev/null @@ -1,68 +0,0 @@ -'use strict'; - -var processFn = function (fn, P, opts) { - return function () { - var that = this; - var args = new Array(arguments.length); - - for (var i = 0; i < arguments.length; i++) { - args[i] = arguments[i]; - } - - return new P(function (resolve, reject) { - args.push(function (err, result) { - if (err) { - reject(err); - } else if (opts.multiArgs) { - var results = new Array(arguments.length - 1); - - for (var i = 1; i < arguments.length; i++) { - results[i - 1] = arguments[i]; - } - - resolve(results); - } else { - resolve(result); - } - }); - - fn.apply(that, args); - }); - }; -}; - -var pify = module.exports = function (obj, P, opts) { - if (typeof P !== 'function') { - opts = P; - P = Promise; - } - - opts = opts || {}; - opts.exclude = opts.exclude || [/.+Sync$/]; - - var filter = function (key) { - var match = function (pattern) { - return typeof pattern === 'string' ? key === pattern : pattern.test(key); - }; - - return opts.include ? opts.include.some(match) : !opts.exclude.some(match); - }; - - var ret = typeof obj === 'function' ? function () { - if (opts.excludeMain) { - return obj.apply(this, arguments); - } - - return processFn(obj, P, opts).apply(this, arguments); - } : {}; - - return Object.keys(obj).reduce(function (ret, key) { - var x = obj[key]; - - ret[key] = typeof x === 'function' && filter(key) ? processFn(x, P, opts) : x; - - return ret; - }, ret); -}; - -pify.all = pify; diff --git a/node_modules/pify/license b/node_modules/pify/license deleted file mode 100644 index 654d0bf..0000000 --- a/node_modules/pify/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/node_modules/pify/package.json b/node_modules/pify/package.json deleted file mode 100644 index 311d198..0000000 --- a/node_modules/pify/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "pify", - "version": "2.3.0", - "description": "Promisify a callback-style function", - "license": "MIT", - "repository": "sindresorhus/pify", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=0.10.0" - }, - "scripts": { - "test": "xo && ava && npm run optimization-test", - "optimization-test": "node --allow-natives-syntax optimization-test.js" - }, - "files": [ - "index.js" - ], - "keywords": [ - "promise", - "promises", - "promisify", - "denodify", - "denodeify", - "callback", - "cb", - "node", - "then", - "thenify", - "convert", - "transform", - "wrap", - "wrapper", - "bind", - "to", - "async", - "es2015" - ], - "devDependencies": { - "ava": "*", - "pinkie-promise": "^1.0.0", - "v8-natives": "0.0.2", - "xo": "*" - } -} diff --git a/node_modules/pify/readme.md b/node_modules/pify/readme.md deleted file mode 100644 index c79ca8b..0000000 --- a/node_modules/pify/readme.md +++ /dev/null @@ -1,119 +0,0 @@ -# pify [![Build Status](https://travis-ci.org/sindresorhus/pify.svg?branch=master)](https://travis-ci.org/sindresorhus/pify) - -> Promisify a callback-style function - - -## Install - -``` -$ npm install --save pify -``` - - -## Usage - -```js -const fs = require('fs'); -const pify = require('pify'); - -// promisify a single function - -pify(fs.readFile)('package.json', 'utf8').then(data => { - console.log(JSON.parse(data).name); - //=> 'pify' -}); - -// or promisify all methods in a module - -pify(fs).readFile('package.json', 'utf8').then(data => { - console.log(JSON.parse(data).name); - //=> 'pify' -}); -``` - - -## API - -### pify(input, [promiseModule], [options]) - -Returns a promise wrapped version of the supplied function or module. - -#### input - -Type: `function`, `object` - -Callback-style function or module whose methods you want to promisify. - -#### promiseModule - -Type: `function` - -Custom promise module to use instead of the native one. - -Check out [`pinkie-promise`](https://github.com/floatdrop/pinkie-promise) if you need a tiny promise polyfill. - -#### options - -##### multiArgs - -Type: `boolean` -Default: `false` - -By default, the promisified function will only return the second argument from the callback, which works fine for most APIs. This option can be useful for modules like `request` that return multiple arguments. Turning this on will make it return an array of all arguments from the callback, excluding the error argument, instead of just the second argument. - -```js -const request = require('request'); -const pify = require('pify'); - -pify(request, {multiArgs: true})('https://sindresorhus.com').then(result => { - const [httpResponse, body] = result; -}); -``` - -##### include - -Type: `array` of (`string`|`regex`) - -Methods in a module to promisify. Remaining methods will be left untouched. - -##### exclude - -Type: `array` of (`string`|`regex`) -Default: `[/.+Sync$/]` - -Methods in a module **not** to promisify. Methods with names ending with `'Sync'` are excluded by default. - -##### excludeMain - -Type: `boolean` -Default: `false` - -By default, if given module is a function itself, this function will be promisified. Turn this option on if you want to promisify only methods of the module. - -```js -const pify = require('pify'); - -function fn() { - return true; -} - -fn.method = (data, callback) => { - setImmediate(() => { - callback(data, null); - }); -}; - -// promisify methods but not fn() -const promiseFn = pify(fn, {excludeMain: true}); - -if (promiseFn()) { - promiseFn.method('hi').then(data => { - console.log(data); - }); -} -``` - - -## License - -MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/pirates/LICENSE b/node_modules/pirates/LICENSE deleted file mode 100644 index acc7a0e..0000000 --- a/node_modules/pirates/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2016-2018 Ari Porad - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/node_modules/pirates/README.md b/node_modules/pirates/README.md deleted file mode 100644 index f36bc5a..0000000 --- a/node_modules/pirates/README.md +++ /dev/null @@ -1,73 +0,0 @@ -# Pirates [![Coverage][codecov-badge]][codecov-link] - -### Properly hijack require - -This library allows to add custom require hooks, which do not interfere with other require hooks. - -This library only works with commonJS. - -[codecov-badge]: https://img.shields.io/codecov/c/github/danez/pirates/master.svg?style=flat "codecov" -[codecov-link]: https://codecov.io/gh/danez/pirates "codecov" - -## Why? - -Two reasons: -1. Babel and istanbul were breaking each other. -2. Everyone seemed to re-invent the wheel on this, and everyone wanted a solution that was DRY, simple, easy to use, -and made everything Just Work™, while allowing multiple require hooks, in a fashion similar to calling `super`. - -For some context, see [the Babel issue thread][] which started this all, then [the nyc issue thread][], where -discussion was moved (as we began to discuss just using the code nyc had developed), and finally to [#1][issue-1] -where discussion was finally moved. - -[the Babel issue thread]: https://github.com/babel/babel/pull/3062 "Babel Issue Thread" -[the nyc issue thread]: https://github.com/bcoe/nyc/issues/70 "NYC Issue Thread" -[issue-1]: https://github.com/danez/pirates/issues/1 "Issue #1" - -## Installation - - npm install --save pirates - -## Usage - -Using pirates is really easy: -```javascript -// my-module/register.js -const addHook = require('pirates').addHook; -// Or if you use ES modules -// import { addHook } from 'pirates'; - -function matcher(filename) { - // Here, you can inspect the filename to determine if it should be hooked or - // not. Just return a truthy/falsey. Files in node_modules are automatically ignored, - // unless otherwise specified in options (see below). - - // TODO: Implement your logic here - return true; -} - -const revert = addHook( - (code, filename) => code.replace('@@foo', 'console.log(\'foo\');'), - { exts: ['.js'], matcher } -); - -// And later, if you want to un-hook require, you can just do: -revert(); -``` - -## API - -### pirates.addHook(hook, [opts={ [matcher: true], [exts: ['.js']], [ignoreNodeModules: true] }]); -Add a require hook. `hook` must be a function that takes `(code, filename)`, and returns the modified code. `opts` is -an optional options object. Available options are: `matcher`, which is a function that accepts a filename, and -returns a truthy value if the file should be hooked (defaults to a function that always returns true), falsey if -otherwise; `exts`, which is an array of extensions to hook, they should begin with `.` (defaults to `['.js']`); -`ignoreNodeModules`, if true, any file in a `node_modules` folder wont be hooked (the matcher also wont be called), -if false, then the matcher will be called for any files in `node_modules` (defaults to true). - - -## Projects that use Pirates - -See the [wiki page](https://github.com/danez/pirates/wiki/Projects-using-Pirates). If you add Pirates to your project, -(And you should! It works best if everyone uses it. Then we can have a happy world full of happy require hooks!), please -add yourself to the wiki. diff --git a/node_modules/pirates/index.d.ts b/node_modules/pirates/index.d.ts deleted file mode 100644 index b2d8ce6..0000000 --- a/node_modules/pirates/index.d.ts +++ /dev/null @@ -1,82 +0,0 @@ -/* (c) 2015 Ari Porad (@ariporad) . License: ariporad.mit-license.org */ - -/** - * The hook. Accepts the code of the module and the filename. - */ -declare type Hook = (code: string, filename: string) => string; - -/** - * A matcher function, will be called with path to a file. - * - * Should return truthy if the file should be hooked, falsy otherwise. - */ -declare type Matcher = (path: string) => boolean; - -/** - * Reverts the hook when called. - */ -declare type RevertFunction = () => void; -interface Options { - /** - * The extensions to hook. Should start with '.' (ex. ['.js']). - * - * Takes precedence over `exts`, `extension` and `ext`. - * - * @alias exts - * @alias extension - * @alias ext - * @default ['.js'] - */ - extensions?: ReadonlyArray | string; - - /** - * The extensions to hook. Should start with '.' (ex. ['.js']). - * - * Takes precedence over `extension` and `ext`. - * - * @alias extension - * @alias ext - * @default ['.js'] - */ - exts?: ReadonlyArray | string; - - /** - * The extensions to hook. Should start with '.' (ex. ['.js']). - * - * Takes precedence over `ext`. - * - * @alias ext - * @default ['.js'] - */ - extension?: ReadonlyArray | string; - - /** - * The extensions to hook. Should start with '.' (ex. ['.js']). - * - * @default ['.js'] - */ - ext?: ReadonlyArray | string; - - /** - * A matcher function, will be called with path to a file. - * - * Should return truthy if the file should be hooked, falsy otherwise. - */ - matcher?: Matcher | null; - - /** - * Auto-ignore node_modules. Independent of any matcher. - * - * @default true - */ - ignoreNodeModules?: boolean; -} - -/** - * Add a require hook. - * - * @param hook The hook. Accepts the code of the module and the filename. Required. - * @returns The `revert` function. Reverts the hook when called. - */ -export declare function addHook(hook: Hook, opts?: Options): RevertFunction; -export {}; diff --git a/node_modules/pirates/lib/index.js b/node_modules/pirates/lib/index.js deleted file mode 100644 index 5b76163..0000000 --- a/node_modules/pirates/lib/index.js +++ /dev/null @@ -1,155 +0,0 @@ -'use strict'; - -/* (c) 2015 Ari Porad (@ariporad) . License: ariporad.mit-license.org */ -const BuiltinModule = require('module'); -const path = require('path'); - -const nodeModulesRegex = /^(?:.*[\\/])?node_modules(?:[\\/].*)?$/; -// Guard against poorly-mocked module constructors. -const Module = - module.constructor.length > 1 ? module.constructor : BuiltinModule; - -const HOOK_RETURNED_NOTHING_ERROR_MESSAGE = - '[Pirates] A hook returned a non-string, or nothing at all! This is a' + - ' violation of intergalactic law!\n' + - '--------------------\n' + - 'If you have no idea what this means or what Pirates is, let me explain: ' + - 'Pirates is a module that makes it easy to implement require hooks. One of' + - " the require hooks you're using uses it. One of these require hooks" + - " didn't return anything from it's handler, so we don't know what to" + - ' do. You might want to debug this.'; - -/** - * @param {string} filename The filename to check. - * @param {string[]} exts The extensions to hook. Should start with '.' (ex. ['.js']). - * @param {Matcher|null} matcher A matcher function, will be called with path to a file. Should return truthy if the file should be hooked, falsy otherwise. - * @param {boolean} ignoreNodeModules Auto-ignore node_modules. Independent of any matcher. - */ -function shouldCompile(filename, exts, matcher, ignoreNodeModules) { - if (typeof filename !== 'string') { - return false; - } - if (exts.indexOf(path.extname(filename)) === -1) { - return false; - } - - const resolvedFilename = path.resolve(filename); - - if (ignoreNodeModules && nodeModulesRegex.test(resolvedFilename)) { - return false; - } - if (matcher && typeof matcher === 'function') { - return !!matcher(resolvedFilename); - } - - return true; -} - -/** - * @callback Hook The hook. Accepts the code of the module and the filename. - * @param {string} code - * @param {string} filename - * @returns {string} - */ -/** - * @callback Matcher A matcher function, will be called with path to a file. - * - * Should return truthy if the file should be hooked, falsy otherwise. - * @param {string} path - * @returns {boolean} - */ -/** - * @callback RevertFunction Reverts the hook when called. - * @returns {void} - */ -/** - * @typedef {object} Options - * @property {Matcher|null} [matcher=null] A matcher function, will be called with path to a file. - * - * Should return truthy if the file should be hooked, falsy otherwise. - * - * @property {string[]} [extensions=['.js']] The extensions to hook. Should start with '.' (ex. ['.js']). - * @property {string[]} [exts=['.js']] The extensions to hook. Should start with '.' (ex. ['.js']). - * - * @property {string[]} [extension=['.js']] The extensions to hook. Should start with '.' (ex. ['.js']). - * @property {string[]} [ext=['.js']] The extensions to hook. Should start with '.' (ex. ['.js']). - * - * @property {boolean} [ignoreNodeModules=true] Auto-ignore node_modules. Independent of any matcher. - */ - -/** - * Add a require hook. - * - * @param {Hook} hook The hook. Accepts the code of the module and the filename. Required. - * @param {Options} [opts] Options - * @returns {RevertFunction} The `revert` function. Reverts the hook when called. - */ -function addHook(hook, opts = {}) { - let reverted = false; - const loaders = []; - const oldLoaders = []; - let exts; - - // We need to do this to fix #15. Basically, if you use a non-standard extension (ie. .jsx), then - // We modify the .js loader, then use the modified .js loader for as the base for .jsx. - // This prevents that. - const originalJSLoader = Module._extensions['.js']; - - const matcher = opts.matcher || null; - const ignoreNodeModules = opts.ignoreNodeModules !== false; - exts = opts.extensions || opts.exts || opts.extension || opts.ext || ['.js']; - if (!Array.isArray(exts)) { - exts = [exts]; - } - - exts.forEach((ext) => { - if (typeof ext !== 'string') { - throw new TypeError(`Invalid Extension: ${ext}`); - } - const oldLoader = Module._extensions[ext] || originalJSLoader; - oldLoaders[ext] = Module._extensions[ext]; - - loaders[ext] = Module._extensions[ext] = function newLoader(mod, filename) { - let compile; - if (!reverted) { - if (shouldCompile(filename, exts, matcher, ignoreNodeModules)) { - compile = mod._compile; - mod._compile = function _compile(code) { - // reset the compile immediately as otherwise we end up having the - // compile function being changed even though this loader might be reverted - // Not reverting it here leads to long useless compile chains when doing - // addHook -> revert -> addHook -> revert -> ... - // The compile function is also anyway created new when the loader is called a second time. - mod._compile = compile; - const newCode = hook(code, filename); - if (typeof newCode !== 'string') { - throw new Error(HOOK_RETURNED_NOTHING_ERROR_MESSAGE); - } - - return mod._compile(newCode, filename); - }; - } - } - - oldLoader(mod, filename); - }; - }); - return function revert() { - if (reverted) return; - reverted = true; - - exts.forEach((ext) => { - // if the current loader for the extension is our loader then unregister it and set the oldLoader again - // if not we cannot do anything as we cannot remove a loader from within the loader-chain - if (Module._extensions[ext] === loaders[ext]) { - if (!oldLoaders[ext]) { - delete Module._extensions[ext]; - } else { - Module._extensions[ext] = oldLoaders[ext]; - } - } - }); - }; -} - -exports.addHook = addHook; diff --git a/node_modules/pirates/package.json b/node_modules/pirates/package.json deleted file mode 100644 index 131277c..0000000 --- a/node_modules/pirates/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "pirates", - "description": "Properly hijack require, i.e., properly define require hooks and customizations", - "main": "lib/index.js", - "types": "index.d.ts", - "scripts": { - "test": "ava" - }, - "files": [ - "lib", - "index.d.ts" - ], - "repository": { - "type": "git", - "url": "https://github.com/danez/pirates.git" - }, - "engines": { - "node": ">= 6" - }, - "author": { - "name": "Ari Porad", - "email": "ari@ariporad.com", - "url": "http://ariporad.com" - }, - "devDependencies": { - "ava": "1.4.1", - "decache": "4.6.2" - }, - "license": "MIT", - "bugs": { - "url": "https://github.com/danez/pirates/issues" - }, - "homepage": "https://github.com/danez/pirates#readme", - "ava": { - "files": [ - "test/*.js" - ], - "sources": [ - "lib/**/*.js" - ] - }, - "version": "4.0.7" -} diff --git a/node_modules/pngjs/.eslintignore b/node_modules/pngjs/.eslintignore deleted file mode 100644 index 188bbcf..0000000 --- a/node_modules/pngjs/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -/browser.js -/test/imagediff.js diff --git a/node_modules/pngjs/.eslintrc.json b/node_modules/pngjs/.eslintrc.json deleted file mode 100644 index a66e018..0000000 --- a/node_modules/pngjs/.eslintrc.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "parserOptions": { "ecmaVersion": 2018 }, - "extends": ["eslint:recommended", "prettier"], - "env": { - "node": true, - "es6": true - }, - "rules": { - "no-var": "error" - }, - "overrides": [ - { - "files": ["test/*.js", "examples/*.js"], - "rules": { - "no-console": "off" - } - } - ] -} diff --git a/node_modules/pngjs/.prettierignore b/node_modules/pngjs/.prettierignore deleted file mode 100644 index 8af2c5d..0000000 --- a/node_modules/pngjs/.prettierignore +++ /dev/null @@ -1,3 +0,0 @@ -/browser.js -/test/imagediff.js -.nyc_output diff --git a/node_modules/pngjs/LICENSE b/node_modules/pngjs/LICENSE deleted file mode 100644 index 6942e25..0000000 --- a/node_modules/pngjs/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -pngjs2 original work Copyright (c) 2015 Luke Page & Original Contributors -pngjs derived work Copyright (c) 2012 Kuba Niegowski - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/node_modules/pngjs/README.md b/node_modules/pngjs/README.md deleted file mode 100644 index 1b07d33..0000000 --- a/node_modules/pngjs/README.md +++ /dev/null @@ -1,429 +0,0 @@ -[![Build Status](https://travis-ci.com/lukeapage/pngjs.svg?branch=master)](https://travis-ci.com/lukeapage/pngjs) [![Build status](https://ci.appveyor.com/api/projects/status/qo5x8ayutr028108/branch/master?svg=true)](https://ci.appveyor.com/project/lukeapage/pngjs/branch/master) [![codecov](https://codecov.io/gh/lukeapage/pngjs/branch/master/graph/badge.svg)](https://codecov.io/gh/lukeapage/pngjs) [![npm version](https://badge.fury.io/js/pngjs.svg)](http://badge.fury.io/js/pngjs) - -# pngjs - -Simple PNG encoder/decoder for Node.js with no dependencies. - -Based on the original [pngjs](https://github.com/niegowski/node-pngjs) with the follow enhancements. - -- Support for reading 1,2,4 & 16 bit files -- Support for reading interlace files -- Support for reading `tTRNS` transparent colours -- Support for writing colortype 0 (grayscale), colortype 2 (RGB), colortype 4 (grayscale alpha) and colortype 6 (RGBA) -- Sync interface as well as async -- API compatible with pngjs and node-pngjs - -Known lack of support for: - -- Extended PNG e.g. Animation -- Writing in colortype 3 (indexed color) - -# Table of Contents - -- [Requirements](#requirements) -- [Comparison Table](#comparison-table) -- [Tests](#tests) -- [Installation](#installation) -- [Browser](#browser) -- [Example](#example) -- [Async API](#async-api) -- [Sync API](#sync-api) -- [Changelog](#changelog) - -# Requirements - -- Node.js v4 (use older v2.3.0 for 0.10/0.12/iojs support) - -# Comparison Table - -| Name | Forked From | Sync | Async | 16 Bit | 1/2/4 Bit | Interlace | Gamma | Encodes | Tested | -| ------------- | ----------- | ---- | ----- | ------ | --------- | --------- | ------ | ------- | ------ | -| pngjs | | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | -| node-png | pngjs | No | Yes | No | No | No | Hidden | Yes | Manual | -| png-coder | pngjs | No | Yes | Yes | No | No | Hidden | Yes | Manual | -| pngparse | | No | Yes | No | Yes | No | No | No | Yes | -| pngparse-sync | pngparse | Yes | No | No | Yes | No | No | No | Yes | -| png-async | | No | Yes | No | No | No | No | Yes | Yes | -| png-js | | No | Yes | No | No | No | No | No | No | - -Native C++ node decoders: - -- png -- png-sync (sync version of above) -- pixel-png -- png-img - -# Tests - -Tested using [PNG Suite](http://www.schaik.com/pngsuite/). We read every file into pngjs, output it in standard 8bit colour, synchronously and asynchronously, then compare the original with the newly saved images. - -To run the tests, fetch the repo (tests are not distributed via npm) and install with `npm i`, run `npm test`. - -The only thing not converted is gamma correction - this is because multiple vendors will do gamma correction differently, so the tests will have different results on different browsers. - -In addition we use a tolerance of 3 for 16 bit images in PhantomJS because PhantomJS seems to have non-compliant rules for downscaling 16 bit images. - -# Installation - -``` -$ npm install pngjs --save -``` - -# Browser - -The package has been build with a [Browserify](browserify.org) version (`npm run browserify`) and you can use the browser version by including in your code: - -``` -import { PNG } from 'pngjs/browser'; -``` - -# Example - -```js -var fs = require("fs"), - PNG = require("pngjs").PNG; - -fs.createReadStream("in.png") - .pipe( - new PNG({ - filterType: 4, - }) - ) - .on("parsed", function () { - for (var y = 0; y < this.height; y++) { - for (var x = 0; x < this.width; x++) { - var idx = (this.width * y + x) << 2; - - // invert color - this.data[idx] = 255 - this.data[idx]; - this.data[idx + 1] = 255 - this.data[idx + 1]; - this.data[idx + 2] = 255 - this.data[idx + 2]; - - // and reduce opacity - this.data[idx + 3] = this.data[idx + 3] >> 1; - } - } - - this.pack().pipe(fs.createWriteStream("out.png")); - }); -``` - -For more examples see `examples` folder. - -# Async API - -As input any color type is accepted (grayscale, rgb, palette, grayscale with alpha, rgb with alpha) but 8 bit per sample (channel) is the only supported bit depth. Interlaced mode is not supported. - -## Class: PNG - -`PNG` is readable and writable `Stream`. - -### Options - -- `width` - use this with `height` if you want to create png from scratch -- `height` - as above -- `checkCRC` - whether parser should be strict about checksums in source stream (default: `true`) -- `deflateChunkSize` - chunk size used for deflating data chunks, this should be power of 2 and must not be less than 256 and more than 32\*1024 (default: 32 kB) -- `deflateLevel` - compression level for deflate (default: 9) -- `deflateStrategy` - compression strategy for deflate (default: 3) -- `deflateFactory` - deflate stream factory (default: `zlib.createDeflate`) -- `filterType` - png filtering method for scanlines (default: -1 => auto, accepts array of numbers 0-4) -- `colorType` - the output colorType - see constants. 0 = grayscale, no alpha, 2 = color, no alpha, 4 = grayscale & alpha, 6 = color & alpha. Default currently 6, but in the future may calculate best mode. -- `inputColorType` - the input colorType - see constants. Default is 6 (RGBA) -- `bitDepth` - the bitDepth of the output, 8 or 16 bits. Input data is expected to have this bit depth. - 16 bit data is expected in the system endianness (Default: 8) -- `inputHasAlpha` - whether the input bitmap has 4 bytes per pixel (rgb and alpha) or 3 (rgb - no alpha). -- `bgColor` - an object containing red, green, and blue values between 0 and 255 - that is used when packing a PNG if alpha is not to be included (default: 255,255,255) - -### Event "metadata" - -`function(metadata) { }` -Image's header has been parsed, metadata contains this information: - -- `width` image size in pixels -- `height` image size in pixels -- `palette` image is paletted -- `color` image is not grayscale -- `alpha` image contains alpha channel -- `interlace` image is interlaced - -### Event: "parsed" - -`function(data) { }` -Input image has been completely parsed, `data` is complete and ready for modification. - -### Event: "error" - -`function(error) { }` - -### png.parse(data, [callback]) - -Parses PNG file data. Can be `String` or `Buffer`. Alternatively you can stream data to instance of PNG. - -Optional `callback` is once called on `error` or `parsed`. The callback gets -two arguments `(err, data)`. - -Returns `this` for method chaining. - -#### Example - -```js -new PNG({ filterType: 4 }).parse(imageData, function (error, data) { - console.log(error, data); -}); -``` - -### png.pack() - -Starts converting data to PNG file Stream. - -Returns `this` for method chaining. - -### png.bitblt(dst, sx, sy, w, h, dx, dy) - -Helper for image manipulation, copies a rectangle of pixels from current (i.e. the source) image (`sx`, `sy`, `w`, `h`) to `dst` image (at `dx`, `dy`). - -Returns `this` for method chaining. - -For example, the following code copies the top-left 100x50 px of `in.png` into dst and writes it to `out.png`: - -```js -var dst = new PNG({ width: 100, height: 50 }); -fs.createReadStream("in.png") - .pipe(new PNG()) - .on("parsed", function () { - this.bitblt(dst, 0, 0, 100, 50, 0, 0); - dst.pack().pipe(fs.createWriteStream("out.png")); - }); -``` - -### Property: adjustGamma() - -Helper that takes data and adjusts it to be gamma corrected. Note that it is not 100% reliable with transparent colours because that requires knowing the background colour the bitmap is rendered on to. - -In tests against PNG suite it compared 100% with chrome on all 8 bit and below images. On IE there were some differences. - -The following example reads a file, adjusts the gamma (which sets the gamma to 0) and writes it out again, effectively removing any gamma correction from the image. - -```js -fs.createReadStream("in.png") - .pipe(new PNG()) - .on("parsed", function () { - this.adjustGamma(); - this.pack().pipe(fs.createWriteStream("out.png")); - }); -``` - -### Property: width - -Width of image in pixels - -### Property: height - -Height of image in pixels - -### Property: data - -Buffer of image pixel data. Every pixel consists 4 bytes: R, G, B, A (opacity). - -### Property: gamma - -Gamma of image (0 if not specified) - -## Packing a PNG and removing alpha (RGBA to RGB) - -When removing the alpha channel from an image, there needs to be a background color to correctly -convert each pixel's transparency to the appropriate RGB value. By default, pngjs will flatten -the image against a white background. You can override this in the options: - -```js -var fs = require("fs"), - PNG = require("pngjs").PNG; - -fs.createReadStream("in.png") - .pipe( - new PNG({ - colorType: 2, - bgColor: { - red: 0, - green: 255, - blue: 0, - }, - }) - ) - .on("parsed", function () { - this.pack().pipe(fs.createWriteStream("out.png")); - }); -``` - -# Sync API - -## PNG.sync - -### PNG.sync.read(buffer) - -Take a buffer and returns a PNG image. The properties on the image include the meta data and `data` as per the async API above. - -``` -var data = fs.readFileSync('in.png'); -var png = PNG.sync.read(data); -``` - -### PNG.sync.write(png) - -Take a PNG image and returns a buffer. The properties on the image include the meta data and `data` as per the async API above. - -``` -var data = fs.readFileSync('in.png'); -var png = PNG.sync.read(data); -var options = { colorType: 6 }; -var buffer = PNG.sync.write(png, options); -fs.writeFileSync('out.png', buffer); -``` - -### PNG.adjustGamma(src) - -Adjusts the gamma of a sync image. See the async adjustGamma. - -``` -var data = fs.readFileSync('in.png'); -var png = PNG.sync.read(data); -PNG.adjustGamma(png); -``` - -# Changelog - -### 5.0.0 - 15/04/2020 - -- Drop support for Node 8 -- Browserified bundle may now contain ES20(15-20) code if the supported node version supports it. Please run the browserified version through babel if you need to support older browsers. - -### 4.0.1 - 15/04/2020 - -- Fix to possible null reference in nextTick of async method - -### 4.0.0 - 09/04/2020 - -- Fix issue in newer nodes with using Buffer -- Fix async issue with some png files -- Drop support for Node 4 & 6 - -### 3.4.0 - 09/03/2019 - -- Include whether the png has alpha in the meta data -- emit an error if the image is truncated instead of hanging -- Add a browserified version -- speed up some mapping functions - -### 3.3.3 - 19/04/2018 - -- Real fix for node 9 - -### 3.3.2 - 16/02/2018 - -- Fix for node 9 - -### 3.3.1 - 15/11/2017 - -- Bugfixes and removal of es6 - -### 3.3.0 - -- Add writing 16 bit channels and support for grayscale input - -### 3.2.0 - 30/04/2017 - -- Support for encoding 8-bit grayscale images - -### 3.1.0 - 30/04/2017 - -- Support for pngs with zlib chunks that are malformed after valid data - -### 3.0.1 - 16/02/2017 - -- Fix single pixel pngs - -### 3.0.0 - 03/08/2016 - -- Drop support for node below v4 and iojs. Pin to 2.3.0 to use with old, unsupported or patched node versions. - -### 2.3.0 - 22/04/2016 - -- Support for sync in node 0.10 - -### 2.2.0 - 04/12/2015 - -- Add sync write api -- Fix newfile example -- Correct comparison table - -### 2.1.0 - 28/10/2015 - -- rename package to pngjs -- added 'bgColor' option - -### 2.0.0 - 08/10/2015 - -- fixes to readme -- _breaking change_ - bitblt on the png prototype now doesn't take a unused, unnecessary src first argument - -### 1.2.0 - 13/09/2015 - -- support passing colorType to write PNG's and writing bitmaps without alpha information - -### 1.1.0 - 07/09/2015 - -- support passing a deflate factory for controlled compression - -### 1.0.2 - 22/08/2015 - -- Expose all PNG creation info - -### 1.0.1 - 21/08/2015 - -- Fix non square interlaced files - -### 1.0.0 - 08/08/2015 - -- More tests -- source linted -- maintainability refactorings -- async API - exceptions in reading now emit warnings -- documentation improvement - sync api now documented, adjustGamma documented -- breaking change - gamma chunk is now written. previously a read then write would destroy gamma information, now it is persisted. - -### 0.0.3 - 03/08/2015 - -- Error handling fixes -- ignore files for smaller npm footprint - -### 0.0.2 - 02/08/2015 - -- Bugfixes to interlacing, support for transparent colours - -### 0.0.1 - 02/08/2015 - -- Initial release, see pngjs for older changelog. - -# License - -(The MIT License) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/node_modules/pngjs/browser.js b/node_modules/pngjs/browser.js deleted file mode 100644 index 9daae91..0000000 --- a/node_modules/pngjs/browser.js +++ /dev/null @@ -1,16096 +0,0 @@ -(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.png = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= data.length) { - throw new Error("Ran out of data"); - } - - let pixel = data[rawPos]; - pxData[pxPos] = pixel; - pxData[pxPos + 1] = pixel; - pxData[pxPos + 2] = pixel; - pxData[pxPos + 3] = data[rawPos + 1]; - }, - - // 3 - RGB - // 0: 0, 1: 1, 2: 2, 3: 0xff - function (pxData, data, pxPos, rawPos) { - if (rawPos + 2 >= data.length) { - throw new Error("Ran out of data"); - } - - pxData[pxPos] = data[rawPos]; - pxData[pxPos + 1] = data[rawPos + 1]; - pxData[pxPos + 2] = data[rawPos + 2]; - pxData[pxPos + 3] = 0xff; - }, - - // 4 - RGBA - // 0: 0, 1: 1, 2: 2, 3: 3 - function (pxData, data, pxPos, rawPos) { - if (rawPos + 3 >= data.length) { - throw new Error("Ran out of data"); - } - - pxData[pxPos] = data[rawPos]; - pxData[pxPos + 1] = data[rawPos + 1]; - pxData[pxPos + 2] = data[rawPos + 2]; - pxData[pxPos + 3] = data[rawPos + 3]; - }, -]; - -let pixelBppCustomMapper = [ - // 0 - dummy entry - function () {}, - - // 1 - L - // 0: 0, 1: 0, 2: 0, 3: 0xff - function (pxData, pixelData, pxPos, maxBit) { - let pixel = pixelData[0]; - pxData[pxPos] = pixel; - pxData[pxPos + 1] = pixel; - pxData[pxPos + 2] = pixel; - pxData[pxPos + 3] = maxBit; - }, - - // 2 - LA - // 0: 0, 1: 0, 2: 0, 3: 1 - function (pxData, pixelData, pxPos) { - let pixel = pixelData[0]; - pxData[pxPos] = pixel; - pxData[pxPos + 1] = pixel; - pxData[pxPos + 2] = pixel; - pxData[pxPos + 3] = pixelData[1]; - }, - - // 3 - RGB - // 0: 0, 1: 1, 2: 2, 3: 0xff - function (pxData, pixelData, pxPos, maxBit) { - pxData[pxPos] = pixelData[0]; - pxData[pxPos + 1] = pixelData[1]; - pxData[pxPos + 2] = pixelData[2]; - pxData[pxPos + 3] = maxBit; - }, - - // 4 - RGBA - // 0: 0, 1: 1, 2: 2, 3: 3 - function (pxData, pixelData, pxPos) { - pxData[pxPos] = pixelData[0]; - pxData[pxPos + 1] = pixelData[1]; - pxData[pxPos + 2] = pixelData[2]; - pxData[pxPos + 3] = pixelData[3]; - }, -]; - -function bitRetriever(data, depth) { - let leftOver = []; - let i = 0; - - function split() { - if (i === data.length) { - throw new Error("Ran out of data"); - } - let byte = data[i]; - i++; - let byte8, byte7, byte6, byte5, byte4, byte3, byte2, byte1; - switch (depth) { - default: - throw new Error("unrecognised depth"); - case 16: - byte2 = data[i]; - i++; - leftOver.push((byte << 8) + byte2); - break; - case 4: - byte2 = byte & 0x0f; - byte1 = byte >> 4; - leftOver.push(byte1, byte2); - break; - case 2: - byte4 = byte & 3; - byte3 = (byte >> 2) & 3; - byte2 = (byte >> 4) & 3; - byte1 = (byte >> 6) & 3; - leftOver.push(byte1, byte2, byte3, byte4); - break; - case 1: - byte8 = byte & 1; - byte7 = (byte >> 1) & 1; - byte6 = (byte >> 2) & 1; - byte5 = (byte >> 3) & 1; - byte4 = (byte >> 4) & 1; - byte3 = (byte >> 5) & 1; - byte2 = (byte >> 6) & 1; - byte1 = (byte >> 7) & 1; - leftOver.push(byte1, byte2, byte3, byte4, byte5, byte6, byte7, byte8); - break; - } - } - - return { - get: function (count) { - while (leftOver.length < count) { - split(); - } - let returner = leftOver.slice(0, count); - leftOver = leftOver.slice(count); - return returner; - }, - resetAfterLine: function () { - leftOver.length = 0; - }, - end: function () { - if (i !== data.length) { - throw new Error("extra data found"); - } - }, - }; -} - -function mapImage8Bit(image, pxData, getPxPos, bpp, data, rawPos) { - // eslint-disable-line max-params - let imageWidth = image.width; - let imageHeight = image.height; - let imagePass = image.index; - for (let y = 0; y < imageHeight; y++) { - for (let x = 0; x < imageWidth; x++) { - let pxPos = getPxPos(x, y, imagePass); - pixelBppMapper[bpp](pxData, data, pxPos, rawPos); - rawPos += bpp; //eslint-disable-line no-param-reassign - } - } - return rawPos; -} - -function mapImageCustomBit(image, pxData, getPxPos, bpp, bits, maxBit) { - // eslint-disable-line max-params - let imageWidth = image.width; - let imageHeight = image.height; - let imagePass = image.index; - for (let y = 0; y < imageHeight; y++) { - for (let x = 0; x < imageWidth; x++) { - let pixelData = bits.get(bpp); - let pxPos = getPxPos(x, y, imagePass); - pixelBppCustomMapper[bpp](pxData, pixelData, pxPos, maxBit); - } - bits.resetAfterLine(); - } -} - -exports.dataToBitMap = function (data, bitmapInfo) { - let width = bitmapInfo.width; - let height = bitmapInfo.height; - let depth = bitmapInfo.depth; - let bpp = bitmapInfo.bpp; - let interlace = bitmapInfo.interlace; - let bits; - - if (depth !== 8) { - bits = bitRetriever(data, depth); - } - let pxData; - if (depth <= 8) { - pxData = Buffer.alloc(width * height * 4); - } else { - pxData = new Uint16Array(width * height * 4); - } - let maxBit = Math.pow(2, depth) - 1; - let rawPos = 0; - let images; - let getPxPos; - - if (interlace) { - images = interlaceUtils.getImagePasses(width, height); - getPxPos = interlaceUtils.getInterlaceIterator(width, height); - } else { - let nonInterlacedPxPos = 0; - getPxPos = function () { - let returner = nonInterlacedPxPos; - nonInterlacedPxPos += 4; - return returner; - }; - images = [{ width: width, height: height }]; - } - - for (let imageIndex = 0; imageIndex < images.length; imageIndex++) { - if (depth === 8) { - rawPos = mapImage8Bit( - images[imageIndex], - pxData, - getPxPos, - bpp, - data, - rawPos - ); - } else { - mapImageCustomBit( - images[imageIndex], - pxData, - getPxPos, - bpp, - bits, - maxBit - ); - } - } - if (depth === 8) { - if (rawPos !== data.length) { - throw new Error("extra data found"); - } - } else { - bits.end(); - } - - return pxData; -}; - -}).call(this,require("buffer").Buffer) -},{"./interlace":11,"buffer":28}],2:[function(require,module,exports){ -(function (Buffer){ -"use strict"; - -let constants = require("./constants"); - -module.exports = function (dataIn, width, height, options) { - let outHasAlpha = - [constants.COLORTYPE_COLOR_ALPHA, constants.COLORTYPE_ALPHA].indexOf( - options.colorType - ) !== -1; - if (options.colorType === options.inputColorType) { - let bigEndian = (function () { - let buffer = new ArrayBuffer(2); - new DataView(buffer).setInt16(0, 256, true /* littleEndian */); - // Int16Array uses the platform's endianness. - return new Int16Array(buffer)[0] !== 256; - })(); - // If no need to convert to grayscale and alpha is present/absent in both, take a fast route - if (options.bitDepth === 8 || (options.bitDepth === 16 && bigEndian)) { - return dataIn; - } - } - - // map to a UInt16 array if data is 16bit, fix endianness below - let data = options.bitDepth !== 16 ? dataIn : new Uint16Array(dataIn.buffer); - - let maxValue = 255; - let inBpp = constants.COLORTYPE_TO_BPP_MAP[options.inputColorType]; - if (inBpp === 4 && !options.inputHasAlpha) { - inBpp = 3; - } - let outBpp = constants.COLORTYPE_TO_BPP_MAP[options.colorType]; - if (options.bitDepth === 16) { - maxValue = 65535; - outBpp *= 2; - } - let outData = Buffer.alloc(width * height * outBpp); - - let inIndex = 0; - let outIndex = 0; - - let bgColor = options.bgColor || {}; - if (bgColor.red === undefined) { - bgColor.red = maxValue; - } - if (bgColor.green === undefined) { - bgColor.green = maxValue; - } - if (bgColor.blue === undefined) { - bgColor.blue = maxValue; - } - - function getRGBA() { - let red; - let green; - let blue; - let alpha = maxValue; - switch (options.inputColorType) { - case constants.COLORTYPE_COLOR_ALPHA: - alpha = data[inIndex + 3]; - red = data[inIndex]; - green = data[inIndex + 1]; - blue = data[inIndex + 2]; - break; - case constants.COLORTYPE_COLOR: - red = data[inIndex]; - green = data[inIndex + 1]; - blue = data[inIndex + 2]; - break; - case constants.COLORTYPE_ALPHA: - alpha = data[inIndex + 1]; - red = data[inIndex]; - green = red; - blue = red; - break; - case constants.COLORTYPE_GRAYSCALE: - red = data[inIndex]; - green = red; - blue = red; - break; - default: - throw new Error( - "input color type:" + - options.inputColorType + - " is not supported at present" - ); - } - - if (options.inputHasAlpha) { - if (!outHasAlpha) { - alpha /= maxValue; - red = Math.min( - Math.max(Math.round((1 - alpha) * bgColor.red + alpha * red), 0), - maxValue - ); - green = Math.min( - Math.max(Math.round((1 - alpha) * bgColor.green + alpha * green), 0), - maxValue - ); - blue = Math.min( - Math.max(Math.round((1 - alpha) * bgColor.blue + alpha * blue), 0), - maxValue - ); - } - } - return { red: red, green: green, blue: blue, alpha: alpha }; - } - - for (let y = 0; y < height; y++) { - for (let x = 0; x < width; x++) { - let rgba = getRGBA(data, inIndex); - - switch (options.colorType) { - case constants.COLORTYPE_COLOR_ALPHA: - case constants.COLORTYPE_COLOR: - if (options.bitDepth === 8) { - outData[outIndex] = rgba.red; - outData[outIndex + 1] = rgba.green; - outData[outIndex + 2] = rgba.blue; - if (outHasAlpha) { - outData[outIndex + 3] = rgba.alpha; - } - } else { - outData.writeUInt16BE(rgba.red, outIndex); - outData.writeUInt16BE(rgba.green, outIndex + 2); - outData.writeUInt16BE(rgba.blue, outIndex + 4); - if (outHasAlpha) { - outData.writeUInt16BE(rgba.alpha, outIndex + 6); - } - } - break; - case constants.COLORTYPE_ALPHA: - case constants.COLORTYPE_GRAYSCALE: { - // Convert to grayscale and alpha - let grayscale = (rgba.red + rgba.green + rgba.blue) / 3; - if (options.bitDepth === 8) { - outData[outIndex] = grayscale; - if (outHasAlpha) { - outData[outIndex + 1] = rgba.alpha; - } - } else { - outData.writeUInt16BE(grayscale, outIndex); - if (outHasAlpha) { - outData.writeUInt16BE(rgba.alpha, outIndex + 2); - } - } - break; - } - default: - throw new Error("unrecognised color Type " + options.colorType); - } - - inIndex += inBpp; - outIndex += outBpp; - } - } - - return outData; -}; - -}).call(this,require("buffer").Buffer) -},{"./constants":4,"buffer":28}],3:[function(require,module,exports){ -(function (process,Buffer){ -"use strict"; - -let util = require("util"); -let Stream = require("stream"); - -let ChunkStream = (module.exports = function () { - Stream.call(this); - - this._buffers = []; - this._buffered = 0; - - this._reads = []; - this._paused = false; - - this._encoding = "utf8"; - this.writable = true; -}); -util.inherits(ChunkStream, Stream); - -ChunkStream.prototype.read = function (length, callback) { - this._reads.push({ - length: Math.abs(length), // if length < 0 then at most this length - allowLess: length < 0, - func: callback, - }); - - process.nextTick( - function () { - this._process(); - - // its paused and there is not enought data then ask for more - if (this._paused && this._reads && this._reads.length > 0) { - this._paused = false; - - this.emit("drain"); - } - }.bind(this) - ); -}; - -ChunkStream.prototype.write = function (data, encoding) { - if (!this.writable) { - this.emit("error", new Error("Stream not writable")); - return false; - } - - let dataBuffer; - if (Buffer.isBuffer(data)) { - dataBuffer = data; - } else { - dataBuffer = Buffer.from(data, encoding || this._encoding); - } - - this._buffers.push(dataBuffer); - this._buffered += dataBuffer.length; - - this._process(); - - // ok if there are no more read requests - if (this._reads && this._reads.length === 0) { - this._paused = true; - } - - return this.writable && !this._paused; -}; - -ChunkStream.prototype.end = function (data, encoding) { - if (data) { - this.write(data, encoding); - } - - this.writable = false; - - // already destroyed - if (!this._buffers) { - return; - } - - // enqueue or handle end - if (this._buffers.length === 0) { - this._end(); - } else { - this._buffers.push(null); - this._process(); - } -}; - -ChunkStream.prototype.destroySoon = ChunkStream.prototype.end; - -ChunkStream.prototype._end = function () { - if (this._reads.length > 0) { - this.emit("error", new Error("Unexpected end of input")); - } - - this.destroy(); -}; - -ChunkStream.prototype.destroy = function () { - if (!this._buffers) { - return; - } - - this.writable = false; - this._reads = null; - this._buffers = null; - - this.emit("close"); -}; - -ChunkStream.prototype._processReadAllowingLess = function (read) { - // ok there is any data so that we can satisfy this request - this._reads.shift(); // == read - - // first we need to peek into first buffer - let smallerBuf = this._buffers[0]; - - // ok there is more data than we need - if (smallerBuf.length > read.length) { - this._buffered -= read.length; - this._buffers[0] = smallerBuf.slice(read.length); - - read.func.call(this, smallerBuf.slice(0, read.length)); - } else { - // ok this is less than maximum length so use it all - this._buffered -= smallerBuf.length; - this._buffers.shift(); // == smallerBuf - - read.func.call(this, smallerBuf); - } -}; - -ChunkStream.prototype._processRead = function (read) { - this._reads.shift(); // == read - - let pos = 0; - let count = 0; - let data = Buffer.alloc(read.length); - - // create buffer for all data - while (pos < read.length) { - let buf = this._buffers[count++]; - let len = Math.min(buf.length, read.length - pos); - - buf.copy(data, pos, 0, len); - pos += len; - - // last buffer wasn't used all so just slice it and leave - if (len !== buf.length) { - this._buffers[--count] = buf.slice(len); - } - } - - // remove all used buffers - if (count > 0) { - this._buffers.splice(0, count); - } - - this._buffered -= read.length; - - read.func.call(this, data); -}; - -ChunkStream.prototype._process = function () { - try { - // as long as there is any data and read requests - while (this._buffered > 0 && this._reads && this._reads.length > 0) { - let read = this._reads[0]; - - // read any data (but no more than length) - if (read.allowLess) { - this._processReadAllowingLess(read); - } else if (this._buffered >= read.length) { - // ok we can meet some expectations - - this._processRead(read); - } else { - // not enought data to satisfy first request in queue - // so we need to wait for more - break; - } - } - - if (this._buffers && !this.writable) { - this._end(); - } - } catch (ex) { - this.emit("error", ex); - } -}; - -}).call(this,require('_process'),require("buffer").Buffer) -},{"_process":47,"buffer":28,"stream":63,"util":67}],4:[function(require,module,exports){ -"use strict"; - -module.exports = { - PNG_SIGNATURE: [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a], - - TYPE_IHDR: 0x49484452, - TYPE_IEND: 0x49454e44, - TYPE_IDAT: 0x49444154, - TYPE_PLTE: 0x504c5445, - TYPE_tRNS: 0x74524e53, // eslint-disable-line camelcase - TYPE_gAMA: 0x67414d41, // eslint-disable-line camelcase - - // color-type bits - COLORTYPE_GRAYSCALE: 0, - COLORTYPE_PALETTE: 1, - COLORTYPE_COLOR: 2, - COLORTYPE_ALPHA: 4, // e.g. grayscale and alpha - - // color-type combinations - COLORTYPE_PALETTE_COLOR: 3, - COLORTYPE_COLOR_ALPHA: 6, - - COLORTYPE_TO_BPP_MAP: { - 0: 1, - 2: 3, - 3: 1, - 4: 2, - 6: 4, - }, - - GAMMA_DIVISION: 100000, -}; - -},{}],5:[function(require,module,exports){ -"use strict"; - -let crcTable = []; - -(function () { - for (let i = 0; i < 256; i++) { - let currentCrc = i; - for (let j = 0; j < 8; j++) { - if (currentCrc & 1) { - currentCrc = 0xedb88320 ^ (currentCrc >>> 1); - } else { - currentCrc = currentCrc >>> 1; - } - } - crcTable[i] = currentCrc; - } -})(); - -let CrcCalculator = (module.exports = function () { - this._crc = -1; -}); - -CrcCalculator.prototype.write = function (data) { - for (let i = 0; i < data.length; i++) { - this._crc = crcTable[(this._crc ^ data[i]) & 0xff] ^ (this._crc >>> 8); - } - return true; -}; - -CrcCalculator.prototype.crc32 = function () { - return this._crc ^ -1; -}; - -CrcCalculator.crc32 = function (buf) { - let crc = -1; - for (let i = 0; i < buf.length; i++) { - crc = crcTable[(crc ^ buf[i]) & 0xff] ^ (crc >>> 8); - } - return crc ^ -1; -}; - -},{}],6:[function(require,module,exports){ -(function (Buffer){ -"use strict"; - -let paethPredictor = require("./paeth-predictor"); - -function filterNone(pxData, pxPos, byteWidth, rawData, rawPos) { - for (let x = 0; x < byteWidth; x++) { - rawData[rawPos + x] = pxData[pxPos + x]; - } -} - -function filterSumNone(pxData, pxPos, byteWidth) { - let sum = 0; - let length = pxPos + byteWidth; - - for (let i = pxPos; i < length; i++) { - sum += Math.abs(pxData[i]); - } - return sum; -} - -function filterSub(pxData, pxPos, byteWidth, rawData, rawPos, bpp) { - for (let x = 0; x < byteWidth; x++) { - let left = x >= bpp ? pxData[pxPos + x - bpp] : 0; - let val = pxData[pxPos + x] - left; - - rawData[rawPos + x] = val; - } -} - -function filterSumSub(pxData, pxPos, byteWidth, bpp) { - let sum = 0; - for (let x = 0; x < byteWidth; x++) { - let left = x >= bpp ? pxData[pxPos + x - bpp] : 0; - let val = pxData[pxPos + x] - left; - - sum += Math.abs(val); - } - - return sum; -} - -function filterUp(pxData, pxPos, byteWidth, rawData, rawPos) { - for (let x = 0; x < byteWidth; x++) { - let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0; - let val = pxData[pxPos + x] - up; - - rawData[rawPos + x] = val; - } -} - -function filterSumUp(pxData, pxPos, byteWidth) { - let sum = 0; - let length = pxPos + byteWidth; - for (let x = pxPos; x < length; x++) { - let up = pxPos > 0 ? pxData[x - byteWidth] : 0; - let val = pxData[x] - up; - - sum += Math.abs(val); - } - - return sum; -} - -function filterAvg(pxData, pxPos, byteWidth, rawData, rawPos, bpp) { - for (let x = 0; x < byteWidth; x++) { - let left = x >= bpp ? pxData[pxPos + x - bpp] : 0; - let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0; - let val = pxData[pxPos + x] - ((left + up) >> 1); - - rawData[rawPos + x] = val; - } -} - -function filterSumAvg(pxData, pxPos, byteWidth, bpp) { - let sum = 0; - for (let x = 0; x < byteWidth; x++) { - let left = x >= bpp ? pxData[pxPos + x - bpp] : 0; - let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0; - let val = pxData[pxPos + x] - ((left + up) >> 1); - - sum += Math.abs(val); - } - - return sum; -} - -function filterPaeth(pxData, pxPos, byteWidth, rawData, rawPos, bpp) { - for (let x = 0; x < byteWidth; x++) { - let left = x >= bpp ? pxData[pxPos + x - bpp] : 0; - let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0; - let upleft = - pxPos > 0 && x >= bpp ? pxData[pxPos + x - (byteWidth + bpp)] : 0; - let val = pxData[pxPos + x] - paethPredictor(left, up, upleft); - - rawData[rawPos + x] = val; - } -} - -function filterSumPaeth(pxData, pxPos, byteWidth, bpp) { - let sum = 0; - for (let x = 0; x < byteWidth; x++) { - let left = x >= bpp ? pxData[pxPos + x - bpp] : 0; - let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0; - let upleft = - pxPos > 0 && x >= bpp ? pxData[pxPos + x - (byteWidth + bpp)] : 0; - let val = pxData[pxPos + x] - paethPredictor(left, up, upleft); - - sum += Math.abs(val); - } - - return sum; -} - -let filters = { - 0: filterNone, - 1: filterSub, - 2: filterUp, - 3: filterAvg, - 4: filterPaeth, -}; - -let filterSums = { - 0: filterSumNone, - 1: filterSumSub, - 2: filterSumUp, - 3: filterSumAvg, - 4: filterSumPaeth, -}; - -module.exports = function (pxData, width, height, options, bpp) { - let filterTypes; - if (!("filterType" in options) || options.filterType === -1) { - filterTypes = [0, 1, 2, 3, 4]; - } else if (typeof options.filterType === "number") { - filterTypes = [options.filterType]; - } else { - throw new Error("unrecognised filter types"); - } - - if (options.bitDepth === 16) { - bpp *= 2; - } - let byteWidth = width * bpp; - let rawPos = 0; - let pxPos = 0; - let rawData = Buffer.alloc((byteWidth + 1) * height); - - let sel = filterTypes[0]; - - for (let y = 0; y < height; y++) { - if (filterTypes.length > 1) { - // find best filter for this line (with lowest sum of values) - let min = Infinity; - - for (let i = 0; i < filterTypes.length; i++) { - let sum = filterSums[filterTypes[i]](pxData, pxPos, byteWidth, bpp); - if (sum < min) { - sel = filterTypes[i]; - min = sum; - } - } - } - - rawData[rawPos] = sel; - rawPos++; - filters[sel](pxData, pxPos, byteWidth, rawData, rawPos, bpp); - rawPos += byteWidth; - pxPos += byteWidth; - } - return rawData; -}; - -}).call(this,require("buffer").Buffer) -},{"./paeth-predictor":15,"buffer":28}],7:[function(require,module,exports){ -(function (Buffer){ -"use strict"; - -let util = require("util"); -let ChunkStream = require("./chunkstream"); -let Filter = require("./filter-parse"); - -let FilterAsync = (module.exports = function (bitmapInfo) { - ChunkStream.call(this); - - let buffers = []; - let that = this; - this._filter = new Filter(bitmapInfo, { - read: this.read.bind(this), - write: function (buffer) { - buffers.push(buffer); - }, - complete: function () { - that.emit("complete", Buffer.concat(buffers)); - }, - }); - - this._filter.start(); -}); -util.inherits(FilterAsync, ChunkStream); - -}).call(this,require("buffer").Buffer) -},{"./chunkstream":3,"./filter-parse":9,"buffer":28,"util":67}],8:[function(require,module,exports){ -(function (Buffer){ -"use strict"; - -let SyncReader = require("./sync-reader"); -let Filter = require("./filter-parse"); - -exports.process = function (inBuffer, bitmapInfo) { - let outBuffers = []; - let reader = new SyncReader(inBuffer); - let filter = new Filter(bitmapInfo, { - read: reader.read.bind(reader), - write: function (bufferPart) { - outBuffers.push(bufferPart); - }, - complete: function () {}, - }); - - filter.start(); - reader.process(); - - return Buffer.concat(outBuffers); -}; - -}).call(this,require("buffer").Buffer) -},{"./filter-parse":9,"./sync-reader":22,"buffer":28}],9:[function(require,module,exports){ -(function (Buffer){ -"use strict"; - -let interlaceUtils = require("./interlace"); -let paethPredictor = require("./paeth-predictor"); - -function getByteWidth(width, bpp, depth) { - let byteWidth = width * bpp; - if (depth !== 8) { - byteWidth = Math.ceil(byteWidth / (8 / depth)); - } - return byteWidth; -} - -let Filter = (module.exports = function (bitmapInfo, dependencies) { - let width = bitmapInfo.width; - let height = bitmapInfo.height; - let interlace = bitmapInfo.interlace; - let bpp = bitmapInfo.bpp; - let depth = bitmapInfo.depth; - - this.read = dependencies.read; - this.write = dependencies.write; - this.complete = dependencies.complete; - - this._imageIndex = 0; - this._images = []; - if (interlace) { - let passes = interlaceUtils.getImagePasses(width, height); - for (let i = 0; i < passes.length; i++) { - this._images.push({ - byteWidth: getByteWidth(passes[i].width, bpp, depth), - height: passes[i].height, - lineIndex: 0, - }); - } - } else { - this._images.push({ - byteWidth: getByteWidth(width, bpp, depth), - height: height, - lineIndex: 0, - }); - } - - // when filtering the line we look at the pixel to the left - // the spec also says it is done on a byte level regardless of the number of pixels - // so if the depth is byte compatible (8 or 16) we subtract the bpp in order to compare back - // a pixel rather than just a different byte part. However if we are sub byte, we ignore. - if (depth === 8) { - this._xComparison = bpp; - } else if (depth === 16) { - this._xComparison = bpp * 2; - } else { - this._xComparison = 1; - } -}); - -Filter.prototype.start = function () { - this.read( - this._images[this._imageIndex].byteWidth + 1, - this._reverseFilterLine.bind(this) - ); -}; - -Filter.prototype._unFilterType1 = function ( - rawData, - unfilteredLine, - byteWidth -) { - let xComparison = this._xComparison; - let xBiggerThan = xComparison - 1; - - for (let x = 0; x < byteWidth; x++) { - let rawByte = rawData[1 + x]; - let f1Left = x > xBiggerThan ? unfilteredLine[x - xComparison] : 0; - unfilteredLine[x] = rawByte + f1Left; - } -}; - -Filter.prototype._unFilterType2 = function ( - rawData, - unfilteredLine, - byteWidth -) { - let lastLine = this._lastLine; - - for (let x = 0; x < byteWidth; x++) { - let rawByte = rawData[1 + x]; - let f2Up = lastLine ? lastLine[x] : 0; - unfilteredLine[x] = rawByte + f2Up; - } -}; - -Filter.prototype._unFilterType3 = function ( - rawData, - unfilteredLine, - byteWidth -) { - let xComparison = this._xComparison; - let xBiggerThan = xComparison - 1; - let lastLine = this._lastLine; - - for (let x = 0; x < byteWidth; x++) { - let rawByte = rawData[1 + x]; - let f3Up = lastLine ? lastLine[x] : 0; - let f3Left = x > xBiggerThan ? unfilteredLine[x - xComparison] : 0; - let f3Add = Math.floor((f3Left + f3Up) / 2); - unfilteredLine[x] = rawByte + f3Add; - } -}; - -Filter.prototype._unFilterType4 = function ( - rawData, - unfilteredLine, - byteWidth -) { - let xComparison = this._xComparison; - let xBiggerThan = xComparison - 1; - let lastLine = this._lastLine; - - for (let x = 0; x < byteWidth; x++) { - let rawByte = rawData[1 + x]; - let f4Up = lastLine ? lastLine[x] : 0; - let f4Left = x > xBiggerThan ? unfilteredLine[x - xComparison] : 0; - let f4UpLeft = x > xBiggerThan && lastLine ? lastLine[x - xComparison] : 0; - let f4Add = paethPredictor(f4Left, f4Up, f4UpLeft); - unfilteredLine[x] = rawByte + f4Add; - } -}; - -Filter.prototype._reverseFilterLine = function (rawData) { - let filter = rawData[0]; - let unfilteredLine; - let currentImage = this._images[this._imageIndex]; - let byteWidth = currentImage.byteWidth; - - if (filter === 0) { - unfilteredLine = rawData.slice(1, byteWidth + 1); - } else { - unfilteredLine = Buffer.alloc(byteWidth); - - switch (filter) { - case 1: - this._unFilterType1(rawData, unfilteredLine, byteWidth); - break; - case 2: - this._unFilterType2(rawData, unfilteredLine, byteWidth); - break; - case 3: - this._unFilterType3(rawData, unfilteredLine, byteWidth); - break; - case 4: - this._unFilterType4(rawData, unfilteredLine, byteWidth); - break; - default: - throw new Error("Unrecognised filter type - " + filter); - } - } - - this.write(unfilteredLine); - - currentImage.lineIndex++; - if (currentImage.lineIndex >= currentImage.height) { - this._lastLine = null; - this._imageIndex++; - currentImage = this._images[this._imageIndex]; - } else { - this._lastLine = unfilteredLine; - } - - if (currentImage) { - // read, using the byte width that may be from the new current image - this.read(currentImage.byteWidth + 1, this._reverseFilterLine.bind(this)); - } else { - this._lastLine = null; - this.complete(); - } -}; - -}).call(this,require("buffer").Buffer) -},{"./interlace":11,"./paeth-predictor":15,"buffer":28}],10:[function(require,module,exports){ -(function (Buffer){ -"use strict"; - -function dePalette(indata, outdata, width, height, palette) { - let pxPos = 0; - // use values from palette - for (let y = 0; y < height; y++) { - for (let x = 0; x < width; x++) { - let color = palette[indata[pxPos]]; - - if (!color) { - throw new Error("index " + indata[pxPos] + " not in palette"); - } - - for (let i = 0; i < 4; i++) { - outdata[pxPos + i] = color[i]; - } - pxPos += 4; - } - } -} - -function replaceTransparentColor(indata, outdata, width, height, transColor) { - let pxPos = 0; - for (let y = 0; y < height; y++) { - for (let x = 0; x < width; x++) { - let makeTrans = false; - - if (transColor.length === 1) { - if (transColor[0] === indata[pxPos]) { - makeTrans = true; - } - } else if ( - transColor[0] === indata[pxPos] && - transColor[1] === indata[pxPos + 1] && - transColor[2] === indata[pxPos + 2] - ) { - makeTrans = true; - } - if (makeTrans) { - for (let i = 0; i < 4; i++) { - outdata[pxPos + i] = 0; - } - } - pxPos += 4; - } - } -} - -function scaleDepth(indata, outdata, width, height, depth) { - let maxOutSample = 255; - let maxInSample = Math.pow(2, depth) - 1; - let pxPos = 0; - - for (let y = 0; y < height; y++) { - for (let x = 0; x < width; x++) { - for (let i = 0; i < 4; i++) { - outdata[pxPos + i] = Math.floor( - (indata[pxPos + i] * maxOutSample) / maxInSample + 0.5 - ); - } - pxPos += 4; - } - } -} - -module.exports = function (indata, imageData) { - let depth = imageData.depth; - let width = imageData.width; - let height = imageData.height; - let colorType = imageData.colorType; - let transColor = imageData.transColor; - let palette = imageData.palette; - - let outdata = indata; // only different for 16 bits - - if (colorType === 3) { - // paletted - dePalette(indata, outdata, width, height, palette); - } else { - if (transColor) { - replaceTransparentColor(indata, outdata, width, height, transColor); - } - // if it needs scaling - if (depth !== 8) { - // if we need to change the buffer size - if (depth === 16) { - outdata = Buffer.alloc(width * height * 4); - } - scaleDepth(indata, outdata, width, height, depth); - } - } - return outdata; -}; - -}).call(this,require("buffer").Buffer) -},{"buffer":28}],11:[function(require,module,exports){ -"use strict"; - -// Adam 7 -// 0 1 2 3 4 5 6 7 -// 0 x 6 4 6 x 6 4 6 -// 1 7 7 7 7 7 7 7 7 -// 2 5 6 5 6 5 6 5 6 -// 3 7 7 7 7 7 7 7 7 -// 4 3 6 4 6 3 6 4 6 -// 5 7 7 7 7 7 7 7 7 -// 6 5 6 5 6 5 6 5 6 -// 7 7 7 7 7 7 7 7 7 - -let imagePasses = [ - { - // pass 1 - 1px - x: [0], - y: [0], - }, - { - // pass 2 - 1px - x: [4], - y: [0], - }, - { - // pass 3 - 2px - x: [0, 4], - y: [4], - }, - { - // pass 4 - 4px - x: [2, 6], - y: [0, 4], - }, - { - // pass 5 - 8px - x: [0, 2, 4, 6], - y: [2, 6], - }, - { - // pass 6 - 16px - x: [1, 3, 5, 7], - y: [0, 2, 4, 6], - }, - { - // pass 7 - 32px - x: [0, 1, 2, 3, 4, 5, 6, 7], - y: [1, 3, 5, 7], - }, -]; - -exports.getImagePasses = function (width, height) { - let images = []; - let xLeftOver = width % 8; - let yLeftOver = height % 8; - let xRepeats = (width - xLeftOver) / 8; - let yRepeats = (height - yLeftOver) / 8; - for (let i = 0; i < imagePasses.length; i++) { - let pass = imagePasses[i]; - let passWidth = xRepeats * pass.x.length; - let passHeight = yRepeats * pass.y.length; - for (let j = 0; j < pass.x.length; j++) { - if (pass.x[j] < xLeftOver) { - passWidth++; - } else { - break; - } - } - for (let j = 0; j < pass.y.length; j++) { - if (pass.y[j] < yLeftOver) { - passHeight++; - } else { - break; - } - } - if (passWidth > 0 && passHeight > 0) { - images.push({ width: passWidth, height: passHeight, index: i }); - } - } - return images; -}; - -exports.getInterlaceIterator = function (width) { - return function (x, y, pass) { - let outerXLeftOver = x % imagePasses[pass].x.length; - let outerX = - ((x - outerXLeftOver) / imagePasses[pass].x.length) * 8 + - imagePasses[pass].x[outerXLeftOver]; - let outerYLeftOver = y % imagePasses[pass].y.length; - let outerY = - ((y - outerYLeftOver) / imagePasses[pass].y.length) * 8 + - imagePasses[pass].y[outerYLeftOver]; - return outerX * 4 + outerY * width * 4; - }; -}; - -},{}],12:[function(require,module,exports){ -(function (Buffer){ -"use strict"; - -let util = require("util"); -let Stream = require("stream"); -let constants = require("./constants"); -let Packer = require("./packer"); - -let PackerAsync = (module.exports = function (opt) { - Stream.call(this); - - let options = opt || {}; - - this._packer = new Packer(options); - this._deflate = this._packer.createDeflate(); - - this.readable = true; -}); -util.inherits(PackerAsync, Stream); - -PackerAsync.prototype.pack = function (data, width, height, gamma) { - // Signature - this.emit("data", Buffer.from(constants.PNG_SIGNATURE)); - this.emit("data", this._packer.packIHDR(width, height)); - - if (gamma) { - this.emit("data", this._packer.packGAMA(gamma)); - } - - let filteredData = this._packer.filterData(data, width, height); - - // compress it - this._deflate.on("error", this.emit.bind(this, "error")); - - this._deflate.on( - "data", - function (compressedData) { - this.emit("data", this._packer.packIDAT(compressedData)); - }.bind(this) - ); - - this._deflate.on( - "end", - function () { - this.emit("data", this._packer.packIEND()); - this.emit("end"); - }.bind(this) - ); - - this._deflate.end(filteredData); -}; - -}).call(this,require("buffer").Buffer) -},{"./constants":4,"./packer":14,"buffer":28,"stream":63,"util":67}],13:[function(require,module,exports){ -(function (Buffer){ -"use strict"; - -let hasSyncZlib = true; -let zlib = require("zlib"); -if (!zlib.deflateSync) { - hasSyncZlib = false; -} -let constants = require("./constants"); -let Packer = require("./packer"); - -module.exports = function (metaData, opt) { - if (!hasSyncZlib) { - throw new Error( - "To use the sync capability of this library in old node versions, please pin pngjs to v2.3.0" - ); - } - - let options = opt || {}; - - let packer = new Packer(options); - - let chunks = []; - - // Signature - chunks.push(Buffer.from(constants.PNG_SIGNATURE)); - - // Header - chunks.push(packer.packIHDR(metaData.width, metaData.height)); - - if (metaData.gamma) { - chunks.push(packer.packGAMA(metaData.gamma)); - } - - let filteredData = packer.filterData( - metaData.data, - metaData.width, - metaData.height - ); - - // compress it - let compressedData = zlib.deflateSync( - filteredData, - packer.getDeflateOptions() - ); - filteredData = null; - - if (!compressedData || !compressedData.length) { - throw new Error("bad png - invalid compressed data response"); - } - chunks.push(packer.packIDAT(compressedData)); - - // End - chunks.push(packer.packIEND()); - - return Buffer.concat(chunks); -}; - -}).call(this,require("buffer").Buffer) -},{"./constants":4,"./packer":14,"buffer":28,"zlib":27}],14:[function(require,module,exports){ -(function (Buffer){ -"use strict"; - -let constants = require("./constants"); -let CrcStream = require("./crc"); -let bitPacker = require("./bitpacker"); -let filter = require("./filter-pack"); -let zlib = require("zlib"); - -let Packer = (module.exports = function (options) { - this._options = options; - - options.deflateChunkSize = options.deflateChunkSize || 32 * 1024; - options.deflateLevel = - options.deflateLevel != null ? options.deflateLevel : 9; - options.deflateStrategy = - options.deflateStrategy != null ? options.deflateStrategy : 3; - options.inputHasAlpha = - options.inputHasAlpha != null ? options.inputHasAlpha : true; - options.deflateFactory = options.deflateFactory || zlib.createDeflate; - options.bitDepth = options.bitDepth || 8; - // This is outputColorType - options.colorType = - typeof options.colorType === "number" - ? options.colorType - : constants.COLORTYPE_COLOR_ALPHA; - options.inputColorType = - typeof options.inputColorType === "number" - ? options.inputColorType - : constants.COLORTYPE_COLOR_ALPHA; - - if ( - [ - constants.COLORTYPE_GRAYSCALE, - constants.COLORTYPE_COLOR, - constants.COLORTYPE_COLOR_ALPHA, - constants.COLORTYPE_ALPHA, - ].indexOf(options.colorType) === -1 - ) { - throw new Error( - "option color type:" + options.colorType + " is not supported at present" - ); - } - if ( - [ - constants.COLORTYPE_GRAYSCALE, - constants.COLORTYPE_COLOR, - constants.COLORTYPE_COLOR_ALPHA, - constants.COLORTYPE_ALPHA, - ].indexOf(options.inputColorType) === -1 - ) { - throw new Error( - "option input color type:" + - options.inputColorType + - " is not supported at present" - ); - } - if (options.bitDepth !== 8 && options.bitDepth !== 16) { - throw new Error( - "option bit depth:" + options.bitDepth + " is not supported at present" - ); - } -}); - -Packer.prototype.getDeflateOptions = function () { - return { - chunkSize: this._options.deflateChunkSize, - level: this._options.deflateLevel, - strategy: this._options.deflateStrategy, - }; -}; - -Packer.prototype.createDeflate = function () { - return this._options.deflateFactory(this.getDeflateOptions()); -}; - -Packer.prototype.filterData = function (data, width, height) { - // convert to correct format for filtering (e.g. right bpp and bit depth) - let packedData = bitPacker(data, width, height, this._options); - - // filter pixel data - let bpp = constants.COLORTYPE_TO_BPP_MAP[this._options.colorType]; - let filteredData = filter(packedData, width, height, this._options, bpp); - return filteredData; -}; - -Packer.prototype._packChunk = function (type, data) { - let len = data ? data.length : 0; - let buf = Buffer.alloc(len + 12); - - buf.writeUInt32BE(len, 0); - buf.writeUInt32BE(type, 4); - - if (data) { - data.copy(buf, 8); - } - - buf.writeInt32BE( - CrcStream.crc32(buf.slice(4, buf.length - 4)), - buf.length - 4 - ); - return buf; -}; - -Packer.prototype.packGAMA = function (gamma) { - let buf = Buffer.alloc(4); - buf.writeUInt32BE(Math.floor(gamma * constants.GAMMA_DIVISION), 0); - return this._packChunk(constants.TYPE_gAMA, buf); -}; - -Packer.prototype.packIHDR = function (width, height) { - let buf = Buffer.alloc(13); - buf.writeUInt32BE(width, 0); - buf.writeUInt32BE(height, 4); - buf[8] = this._options.bitDepth; // Bit depth - buf[9] = this._options.colorType; // colorType - buf[10] = 0; // compression - buf[11] = 0; // filter - buf[12] = 0; // interlace - - return this._packChunk(constants.TYPE_IHDR, buf); -}; - -Packer.prototype.packIDAT = function (data) { - return this._packChunk(constants.TYPE_IDAT, data); -}; - -Packer.prototype.packIEND = function () { - return this._packChunk(constants.TYPE_IEND, null); -}; - -}).call(this,require("buffer").Buffer) -},{"./bitpacker":2,"./constants":4,"./crc":5,"./filter-pack":6,"buffer":28,"zlib":27}],15:[function(require,module,exports){ -"use strict"; - -module.exports = function paethPredictor(left, above, upLeft) { - let paeth = left + above - upLeft; - let pLeft = Math.abs(paeth - left); - let pAbove = Math.abs(paeth - above); - let pUpLeft = Math.abs(paeth - upLeft); - - if (pLeft <= pAbove && pLeft <= pUpLeft) { - return left; - } - if (pAbove <= pUpLeft) { - return above; - } - return upLeft; -}; - -},{}],16:[function(require,module,exports){ -"use strict"; - -let util = require("util"); -let zlib = require("zlib"); -let ChunkStream = require("./chunkstream"); -let FilterAsync = require("./filter-parse-async"); -let Parser = require("./parser"); -let bitmapper = require("./bitmapper"); -let formatNormaliser = require("./format-normaliser"); - -let ParserAsync = (module.exports = function (options) { - ChunkStream.call(this); - - this._parser = new Parser(options, { - read: this.read.bind(this), - error: this._handleError.bind(this), - metadata: this._handleMetaData.bind(this), - gamma: this.emit.bind(this, "gamma"), - palette: this._handlePalette.bind(this), - transColor: this._handleTransColor.bind(this), - finished: this._finished.bind(this), - inflateData: this._inflateData.bind(this), - simpleTransparency: this._simpleTransparency.bind(this), - headersFinished: this._headersFinished.bind(this), - }); - this._options = options; - this.writable = true; - - this._parser.start(); -}); -util.inherits(ParserAsync, ChunkStream); - -ParserAsync.prototype._handleError = function (err) { - this.emit("error", err); - - this.writable = false; - - this.destroy(); - - if (this._inflate && this._inflate.destroy) { - this._inflate.destroy(); - } - - if (this._filter) { - this._filter.destroy(); - // For backward compatibility with Node 7 and below. - // Suppress errors due to _inflate calling write() even after - // it's destroy()'ed. - this._filter.on("error", function () {}); - } - - this.errord = true; -}; - -ParserAsync.prototype._inflateData = function (data) { - if (!this._inflate) { - if (this._bitmapInfo.interlace) { - this._inflate = zlib.createInflate(); - - this._inflate.on("error", this.emit.bind(this, "error")); - this._filter.on("complete", this._complete.bind(this)); - - this._inflate.pipe(this._filter); - } else { - let rowSize = - ((this._bitmapInfo.width * - this._bitmapInfo.bpp * - this._bitmapInfo.depth + - 7) >> - 3) + - 1; - let imageSize = rowSize * this._bitmapInfo.height; - let chunkSize = Math.max(imageSize, zlib.Z_MIN_CHUNK); - - this._inflate = zlib.createInflate({ chunkSize: chunkSize }); - let leftToInflate = imageSize; - - let emitError = this.emit.bind(this, "error"); - this._inflate.on("error", function (err) { - if (!leftToInflate) { - return; - } - - emitError(err); - }); - this._filter.on("complete", this._complete.bind(this)); - - let filterWrite = this._filter.write.bind(this._filter); - this._inflate.on("data", function (chunk) { - if (!leftToInflate) { - return; - } - - if (chunk.length > leftToInflate) { - chunk = chunk.slice(0, leftToInflate); - } - - leftToInflate -= chunk.length; - - filterWrite(chunk); - }); - - this._inflate.on("end", this._filter.end.bind(this._filter)); - } - } - this._inflate.write(data); -}; - -ParserAsync.prototype._handleMetaData = function (metaData) { - this._metaData = metaData; - this._bitmapInfo = Object.create(metaData); - - this._filter = new FilterAsync(this._bitmapInfo); -}; - -ParserAsync.prototype._handleTransColor = function (transColor) { - this._bitmapInfo.transColor = transColor; -}; - -ParserAsync.prototype._handlePalette = function (palette) { - this._bitmapInfo.palette = palette; -}; - -ParserAsync.prototype._simpleTransparency = function () { - this._metaData.alpha = true; -}; - -ParserAsync.prototype._headersFinished = function () { - // Up until this point, we don't know if we have a tRNS chunk (alpha) - // so we can't emit metadata any earlier - this.emit("metadata", this._metaData); -}; - -ParserAsync.prototype._finished = function () { - if (this.errord) { - return; - } - - if (!this._inflate) { - this.emit("error", "No Inflate block"); - } else { - // no more data to inflate - this._inflate.end(); - } -}; - -ParserAsync.prototype._complete = function (filteredData) { - if (this.errord) { - return; - } - - let normalisedBitmapData; - - try { - let bitmapData = bitmapper.dataToBitMap(filteredData, this._bitmapInfo); - - normalisedBitmapData = formatNormaliser(bitmapData, this._bitmapInfo); - bitmapData = null; - } catch (ex) { - this._handleError(ex); - return; - } - - this.emit("parsed", normalisedBitmapData); -}; - -},{"./bitmapper":1,"./chunkstream":3,"./filter-parse-async":7,"./format-normaliser":10,"./parser":18,"util":67,"zlib":27}],17:[function(require,module,exports){ -(function (Buffer){ -"use strict"; - -let hasSyncZlib = true; -let zlib = require("zlib"); -let inflateSync = require("./sync-inflate"); -if (!zlib.deflateSync) { - hasSyncZlib = false; -} -let SyncReader = require("./sync-reader"); -let FilterSync = require("./filter-parse-sync"); -let Parser = require("./parser"); -let bitmapper = require("./bitmapper"); -let formatNormaliser = require("./format-normaliser"); - -module.exports = function (buffer, options) { - if (!hasSyncZlib) { - throw new Error( - "To use the sync capability of this library in old node versions, please pin pngjs to v2.3.0" - ); - } - - let err; - function handleError(_err_) { - err = _err_; - } - - let metaData; - function handleMetaData(_metaData_) { - metaData = _metaData_; - } - - function handleTransColor(transColor) { - metaData.transColor = transColor; - } - - function handlePalette(palette) { - metaData.palette = palette; - } - - function handleSimpleTransparency() { - metaData.alpha = true; - } - - let gamma; - function handleGamma(_gamma_) { - gamma = _gamma_; - } - - let inflateDataList = []; - function handleInflateData(inflatedData) { - inflateDataList.push(inflatedData); - } - - let reader = new SyncReader(buffer); - - let parser = new Parser(options, { - read: reader.read.bind(reader), - error: handleError, - metadata: handleMetaData, - gamma: handleGamma, - palette: handlePalette, - transColor: handleTransColor, - inflateData: handleInflateData, - simpleTransparency: handleSimpleTransparency, - }); - - parser.start(); - reader.process(); - - if (err) { - throw err; - } - - //join together the inflate datas - let inflateData = Buffer.concat(inflateDataList); - inflateDataList.length = 0; - - let inflatedData; - if (metaData.interlace) { - inflatedData = zlib.inflateSync(inflateData); - } else { - let rowSize = - ((metaData.width * metaData.bpp * metaData.depth + 7) >> 3) + 1; - let imageSize = rowSize * metaData.height; - inflatedData = inflateSync(inflateData, { - chunkSize: imageSize, - maxLength: imageSize, - }); - } - inflateData = null; - - if (!inflatedData || !inflatedData.length) { - throw new Error("bad png - invalid inflate data response"); - } - - let unfilteredData = FilterSync.process(inflatedData, metaData); - inflateData = null; - - let bitmapData = bitmapper.dataToBitMap(unfilteredData, metaData); - unfilteredData = null; - - let normalisedBitmapData = formatNormaliser(bitmapData, metaData); - - metaData.data = normalisedBitmapData; - metaData.gamma = gamma || 0; - - return metaData; -}; - -}).call(this,require("buffer").Buffer) -},{"./bitmapper":1,"./filter-parse-sync":8,"./format-normaliser":10,"./parser":18,"./sync-inflate":21,"./sync-reader":22,"buffer":28,"zlib":27}],18:[function(require,module,exports){ -(function (Buffer){ -"use strict"; - -let constants = require("./constants"); -let CrcCalculator = require("./crc"); - -let Parser = (module.exports = function (options, dependencies) { - this._options = options; - options.checkCRC = options.checkCRC !== false; - - this._hasIHDR = false; - this._hasIEND = false; - this._emittedHeadersFinished = false; - - // input flags/metadata - this._palette = []; - this._colorType = 0; - - this._chunks = {}; - this._chunks[constants.TYPE_IHDR] = this._handleIHDR.bind(this); - this._chunks[constants.TYPE_IEND] = this._handleIEND.bind(this); - this._chunks[constants.TYPE_IDAT] = this._handleIDAT.bind(this); - this._chunks[constants.TYPE_PLTE] = this._handlePLTE.bind(this); - this._chunks[constants.TYPE_tRNS] = this._handleTRNS.bind(this); - this._chunks[constants.TYPE_gAMA] = this._handleGAMA.bind(this); - - this.read = dependencies.read; - this.error = dependencies.error; - this.metadata = dependencies.metadata; - this.gamma = dependencies.gamma; - this.transColor = dependencies.transColor; - this.palette = dependencies.palette; - this.parsed = dependencies.parsed; - this.inflateData = dependencies.inflateData; - this.finished = dependencies.finished; - this.simpleTransparency = dependencies.simpleTransparency; - this.headersFinished = dependencies.headersFinished || function () {}; -}); - -Parser.prototype.start = function () { - this.read(constants.PNG_SIGNATURE.length, this._parseSignature.bind(this)); -}; - -Parser.prototype._parseSignature = function (data) { - let signature = constants.PNG_SIGNATURE; - - for (let i = 0; i < signature.length; i++) { - if (data[i] !== signature[i]) { - this.error(new Error("Invalid file signature")); - return; - } - } - this.read(8, this._parseChunkBegin.bind(this)); -}; - -Parser.prototype._parseChunkBegin = function (data) { - // chunk content length - let length = data.readUInt32BE(0); - - // chunk type - let type = data.readUInt32BE(4); - let name = ""; - for (let i = 4; i < 8; i++) { - name += String.fromCharCode(data[i]); - } - - //console.log('chunk ', name, length); - - // chunk flags - let ancillary = Boolean(data[4] & 0x20); // or critical - // priv = Boolean(data[5] & 0x20), // or public - // safeToCopy = Boolean(data[7] & 0x20); // or unsafe - - if (!this._hasIHDR && type !== constants.TYPE_IHDR) { - this.error(new Error("Expected IHDR on beggining")); - return; - } - - this._crc = new CrcCalculator(); - this._crc.write(Buffer.from(name)); - - if (this._chunks[type]) { - return this._chunks[type](length); - } - - if (!ancillary) { - this.error(new Error("Unsupported critical chunk type " + name)); - return; - } - - this.read(length + 4, this._skipChunk.bind(this)); -}; - -Parser.prototype._skipChunk = function (/*data*/) { - this.read(8, this._parseChunkBegin.bind(this)); -}; - -Parser.prototype._handleChunkEnd = function () { - this.read(4, this._parseChunkEnd.bind(this)); -}; - -Parser.prototype._parseChunkEnd = function (data) { - let fileCrc = data.readInt32BE(0); - let calcCrc = this._crc.crc32(); - - // check CRC - if (this._options.checkCRC && calcCrc !== fileCrc) { - this.error(new Error("Crc error - " + fileCrc + " - " + calcCrc)); - return; - } - - if (!this._hasIEND) { - this.read(8, this._parseChunkBegin.bind(this)); - } -}; - -Parser.prototype._handleIHDR = function (length) { - this.read(length, this._parseIHDR.bind(this)); -}; -Parser.prototype._parseIHDR = function (data) { - this._crc.write(data); - - let width = data.readUInt32BE(0); - let height = data.readUInt32BE(4); - let depth = data[8]; - let colorType = data[9]; // bits: 1 palette, 2 color, 4 alpha - let compr = data[10]; - let filter = data[11]; - let interlace = data[12]; - - // console.log(' width', width, 'height', height, - // 'depth', depth, 'colorType', colorType, - // 'compr', compr, 'filter', filter, 'interlace', interlace - // ); - - if ( - depth !== 8 && - depth !== 4 && - depth !== 2 && - depth !== 1 && - depth !== 16 - ) { - this.error(new Error("Unsupported bit depth " + depth)); - return; - } - if (!(colorType in constants.COLORTYPE_TO_BPP_MAP)) { - this.error(new Error("Unsupported color type")); - return; - } - if (compr !== 0) { - this.error(new Error("Unsupported compression method")); - return; - } - if (filter !== 0) { - this.error(new Error("Unsupported filter method")); - return; - } - if (interlace !== 0 && interlace !== 1) { - this.error(new Error("Unsupported interlace method")); - return; - } - - this._colorType = colorType; - - let bpp = constants.COLORTYPE_TO_BPP_MAP[this._colorType]; - - this._hasIHDR = true; - - this.metadata({ - width: width, - height: height, - depth: depth, - interlace: Boolean(interlace), - palette: Boolean(colorType & constants.COLORTYPE_PALETTE), - color: Boolean(colorType & constants.COLORTYPE_COLOR), - alpha: Boolean(colorType & constants.COLORTYPE_ALPHA), - bpp: bpp, - colorType: colorType, - }); - - this._handleChunkEnd(); -}; - -Parser.prototype._handlePLTE = function (length) { - this.read(length, this._parsePLTE.bind(this)); -}; -Parser.prototype._parsePLTE = function (data) { - this._crc.write(data); - - let entries = Math.floor(data.length / 3); - // console.log('Palette:', entries); - - for (let i = 0; i < entries; i++) { - this._palette.push([data[i * 3], data[i * 3 + 1], data[i * 3 + 2], 0xff]); - } - - this.palette(this._palette); - - this._handleChunkEnd(); -}; - -Parser.prototype._handleTRNS = function (length) { - this.simpleTransparency(); - this.read(length, this._parseTRNS.bind(this)); -}; -Parser.prototype._parseTRNS = function (data) { - this._crc.write(data); - - // palette - if (this._colorType === constants.COLORTYPE_PALETTE_COLOR) { - if (this._palette.length === 0) { - this.error(new Error("Transparency chunk must be after palette")); - return; - } - if (data.length > this._palette.length) { - this.error(new Error("More transparent colors than palette size")); - return; - } - for (let i = 0; i < data.length; i++) { - this._palette[i][3] = data[i]; - } - this.palette(this._palette); - } - - // for colorType 0 (grayscale) and 2 (rgb) - // there might be one gray/color defined as transparent - if (this._colorType === constants.COLORTYPE_GRAYSCALE) { - // grey, 2 bytes - this.transColor([data.readUInt16BE(0)]); - } - if (this._colorType === constants.COLORTYPE_COLOR) { - this.transColor([ - data.readUInt16BE(0), - data.readUInt16BE(2), - data.readUInt16BE(4), - ]); - } - - this._handleChunkEnd(); -}; - -Parser.prototype._handleGAMA = function (length) { - this.read(length, this._parseGAMA.bind(this)); -}; -Parser.prototype._parseGAMA = function (data) { - this._crc.write(data); - this.gamma(data.readUInt32BE(0) / constants.GAMMA_DIVISION); - - this._handleChunkEnd(); -}; - -Parser.prototype._handleIDAT = function (length) { - if (!this._emittedHeadersFinished) { - this._emittedHeadersFinished = true; - this.headersFinished(); - } - this.read(-length, this._parseIDAT.bind(this, length)); -}; -Parser.prototype._parseIDAT = function (length, data) { - this._crc.write(data); - - if ( - this._colorType === constants.COLORTYPE_PALETTE_COLOR && - this._palette.length === 0 - ) { - throw new Error("Expected palette not found"); - } - - this.inflateData(data); - let leftOverLength = length - data.length; - - if (leftOverLength > 0) { - this._handleIDAT(leftOverLength); - } else { - this._handleChunkEnd(); - } -}; - -Parser.prototype._handleIEND = function (length) { - this.read(length, this._parseIEND.bind(this)); -}; -Parser.prototype._parseIEND = function (data) { - this._crc.write(data); - - this._hasIEND = true; - this._handleChunkEnd(); - - if (this.finished) { - this.finished(); - } -}; - -}).call(this,require("buffer").Buffer) -},{"./constants":4,"./crc":5,"buffer":28}],19:[function(require,module,exports){ -"use strict"; - -let parse = require("./parser-sync"); -let pack = require("./packer-sync"); - -exports.read = function (buffer, options) { - return parse(buffer, options || {}); -}; - -exports.write = function (png, options) { - return pack(png, options); -}; - -},{"./packer-sync":13,"./parser-sync":17}],20:[function(require,module,exports){ -(function (process,Buffer){ -"use strict"; - -let util = require("util"); -let Stream = require("stream"); -let Parser = require("./parser-async"); -let Packer = require("./packer-async"); -let PNGSync = require("./png-sync"); - -let PNG = (exports.PNG = function (options) { - Stream.call(this); - - options = options || {}; // eslint-disable-line no-param-reassign - - // coerce pixel dimensions to integers (also coerces undefined -> 0): - this.width = options.width | 0; - this.height = options.height | 0; - - this.data = - this.width > 0 && this.height > 0 - ? Buffer.alloc(4 * this.width * this.height) - : null; - - if (options.fill && this.data) { - this.data.fill(0); - } - - this.gamma = 0; - this.readable = this.writable = true; - - this._parser = new Parser(options); - - this._parser.on("error", this.emit.bind(this, "error")); - this._parser.on("close", this._handleClose.bind(this)); - this._parser.on("metadata", this._metadata.bind(this)); - this._parser.on("gamma", this._gamma.bind(this)); - this._parser.on( - "parsed", - function (data) { - this.data = data; - this.emit("parsed", data); - }.bind(this) - ); - - this._packer = new Packer(options); - this._packer.on("data", this.emit.bind(this, "data")); - this._packer.on("end", this.emit.bind(this, "end")); - this._parser.on("close", this._handleClose.bind(this)); - this._packer.on("error", this.emit.bind(this, "error")); -}); -util.inherits(PNG, Stream); - -PNG.sync = PNGSync; - -PNG.prototype.pack = function () { - if (!this.data || !this.data.length) { - this.emit("error", "No data provided"); - return this; - } - - process.nextTick( - function () { - this._packer.pack(this.data, this.width, this.height, this.gamma); - }.bind(this) - ); - - return this; -}; - -PNG.prototype.parse = function (data, callback) { - if (callback) { - let onParsed, onError; - - onParsed = function (parsedData) { - this.removeListener("error", onError); - - this.data = parsedData; - callback(null, this); - }.bind(this); - - onError = function (err) { - this.removeListener("parsed", onParsed); - - callback(err, null); - }.bind(this); - - this.once("parsed", onParsed); - this.once("error", onError); - } - - this.end(data); - return this; -}; - -PNG.prototype.write = function (data) { - this._parser.write(data); - return true; -}; - -PNG.prototype.end = function (data) { - this._parser.end(data); -}; - -PNG.prototype._metadata = function (metadata) { - this.width = metadata.width; - this.height = metadata.height; - - this.emit("metadata", metadata); -}; - -PNG.prototype._gamma = function (gamma) { - this.gamma = gamma; -}; - -PNG.prototype._handleClose = function () { - if (!this._parser.writable && !this._packer.readable) { - this.emit("close"); - } -}; - -PNG.bitblt = function (src, dst, srcX, srcY, width, height, deltaX, deltaY) { - // eslint-disable-line max-params - // coerce pixel dimensions to integers (also coerces undefined -> 0): - /* eslint-disable no-param-reassign */ - srcX |= 0; - srcY |= 0; - width |= 0; - height |= 0; - deltaX |= 0; - deltaY |= 0; - /* eslint-enable no-param-reassign */ - - if ( - srcX > src.width || - srcY > src.height || - srcX + width > src.width || - srcY + height > src.height - ) { - throw new Error("bitblt reading outside image"); - } - - if ( - deltaX > dst.width || - deltaY > dst.height || - deltaX + width > dst.width || - deltaY + height > dst.height - ) { - throw new Error("bitblt writing outside image"); - } - - for (let y = 0; y < height; y++) { - src.data.copy( - dst.data, - ((deltaY + y) * dst.width + deltaX) << 2, - ((srcY + y) * src.width + srcX) << 2, - ((srcY + y) * src.width + srcX + width) << 2 - ); - } -}; - -PNG.prototype.bitblt = function ( - dst, - srcX, - srcY, - width, - height, - deltaX, - deltaY -) { - // eslint-disable-line max-params - - PNG.bitblt(this, dst, srcX, srcY, width, height, deltaX, deltaY); - return this; -}; - -PNG.adjustGamma = function (src) { - if (src.gamma) { - for (let y = 0; y < src.height; y++) { - for (let x = 0; x < src.width; x++) { - let idx = (src.width * y + x) << 2; - - for (let i = 0; i < 3; i++) { - let sample = src.data[idx + i] / 255; - sample = Math.pow(sample, 1 / 2.2 / src.gamma); - src.data[idx + i] = Math.round(sample * 255); - } - } - } - src.gamma = 0; - } -}; - -PNG.prototype.adjustGamma = function () { - PNG.adjustGamma(this); -}; - -}).call(this,require('_process'),require("buffer").Buffer) -},{"./packer-async":12,"./parser-async":16,"./png-sync":19,"_process":47,"buffer":28,"stream":63,"util":67}],21:[function(require,module,exports){ -(function (process,Buffer){ -"use strict"; - -let assert = require("assert").ok; -let zlib = require("zlib"); -let util = require("util"); - -let kMaxLength = require("buffer").kMaxLength; - -function Inflate(opts) { - if (!(this instanceof Inflate)) { - return new Inflate(opts); - } - - if (opts && opts.chunkSize < zlib.Z_MIN_CHUNK) { - opts.chunkSize = zlib.Z_MIN_CHUNK; - } - - zlib.Inflate.call(this, opts); - - // Node 8 --> 9 compatibility check - this._offset = this._offset === undefined ? this._outOffset : this._offset; - this._buffer = this._buffer || this._outBuffer; - - if (opts && opts.maxLength != null) { - this._maxLength = opts.maxLength; - } -} - -function createInflate(opts) { - return new Inflate(opts); -} - -function _close(engine, callback) { - if (callback) { - process.nextTick(callback); - } - - // Caller may invoke .close after a zlib error (which will null _handle). - if (!engine._handle) { - return; - } - - engine._handle.close(); - engine._handle = null; -} - -Inflate.prototype._processChunk = function (chunk, flushFlag, asyncCb) { - if (typeof asyncCb === "function") { - return zlib.Inflate._processChunk.call(this, chunk, flushFlag, asyncCb); - } - - let self = this; - - let availInBefore = chunk && chunk.length; - let availOutBefore = this._chunkSize - this._offset; - let leftToInflate = this._maxLength; - let inOff = 0; - - let buffers = []; - let nread = 0; - - let error; - this.on("error", function (err) { - error = err; - }); - - function handleChunk(availInAfter, availOutAfter) { - if (self._hadError) { - return; - } - - let have = availOutBefore - availOutAfter; - assert(have >= 0, "have should not go down"); - - if (have > 0) { - let out = self._buffer.slice(self._offset, self._offset + have); - self._offset += have; - - if (out.length > leftToInflate) { - out = out.slice(0, leftToInflate); - } - - buffers.push(out); - nread += out.length; - leftToInflate -= out.length; - - if (leftToInflate === 0) { - return false; - } - } - - if (availOutAfter === 0 || self._offset >= self._chunkSize) { - availOutBefore = self._chunkSize; - self._offset = 0; - self._buffer = Buffer.allocUnsafe(self._chunkSize); - } - - if (availOutAfter === 0) { - inOff += availInBefore - availInAfter; - availInBefore = availInAfter; - - return true; - } - - return false; - } - - assert(this._handle, "zlib binding closed"); - let res; - do { - res = this._handle.writeSync( - flushFlag, - chunk, // in - inOff, // in_off - availInBefore, // in_len - this._buffer, // out - this._offset, //out_off - availOutBefore - ); // out_len - // Node 8 --> 9 compatibility check - res = res || this._writeState; - } while (!this._hadError && handleChunk(res[0], res[1])); - - if (this._hadError) { - throw error; - } - - if (nread >= kMaxLength) { - _close(this); - throw new RangeError( - "Cannot create final Buffer. It would be larger than 0x" + - kMaxLength.toString(16) + - " bytes" - ); - } - - let buf = Buffer.concat(buffers, nread); - _close(this); - - return buf; -}; - -util.inherits(Inflate, zlib.Inflate); - -function zlibBufferSync(engine, buffer) { - if (typeof buffer === "string") { - buffer = Buffer.from(buffer); - } - if (!(buffer instanceof Buffer)) { - throw new TypeError("Not a string or buffer"); - } - - let flushFlag = engine._finishFlushFlag; - if (flushFlag == null) { - flushFlag = zlib.Z_FINISH; - } - - return engine._processChunk(buffer, flushFlag); -} - -function inflateSync(buffer, opts) { - return zlibBufferSync(new Inflate(opts), buffer); -} - -module.exports = exports = inflateSync; -exports.Inflate = Inflate; -exports.createInflate = createInflate; -exports.inflateSync = inflateSync; - -}).call(this,require('_process'),require("buffer").Buffer) -},{"_process":47,"assert":23,"buffer":28,"util":67,"zlib":27}],22:[function(require,module,exports){ -"use strict"; - -let SyncReader = (module.exports = function (buffer) { - this._buffer = buffer; - this._reads = []; -}); - -SyncReader.prototype.read = function (length, callback) { - this._reads.push({ - length: Math.abs(length), // if length < 0 then at most this length - allowLess: length < 0, - func: callback, - }); -}; - -SyncReader.prototype.process = function () { - // as long as there is any data and read requests - while (this._reads.length > 0 && this._buffer.length) { - let read = this._reads[0]; - - if ( - this._buffer.length && - (this._buffer.length >= read.length || read.allowLess) - ) { - // ok there is any data so that we can satisfy this request - this._reads.shift(); // == read - - let buf = this._buffer; - - this._buffer = buf.slice(read.length); - - read.func.call(this, buf.slice(0, read.length)); - } else { - break; - } - } - - if (this._reads.length > 0) { - return new Error("There are some read requests waitng on finished stream"); - } - - if (this._buffer.length > 0) { - return new Error("unrecognised content at end of stream"); - } -}; - -},{}],23:[function(require,module,exports){ -(function (global){ -'use strict'; - -// compare and isBuffer taken from https://github.com/feross/buffer/blob/680e9e5e488f22aac27599a57dc844a6315928dd/index.js -// original notice: - -/*! - * The buffer module from node.js, for the browser. - * - * @author Feross Aboukhadijeh - * @license MIT - */ -function compare(a, b) { - if (a === b) { - return 0; - } - - var x = a.length; - var y = b.length; - - for (var i = 0, len = Math.min(x, y); i < len; ++i) { - if (a[i] !== b[i]) { - x = a[i]; - y = b[i]; - break; - } - } - - if (x < y) { - return -1; - } - if (y < x) { - return 1; - } - return 0; -} -function isBuffer(b) { - if (global.Buffer && typeof global.Buffer.isBuffer === 'function') { - return global.Buffer.isBuffer(b); - } - return !!(b != null && b._isBuffer); -} - -// based on node assert, original notice: - -// http://wiki.commonjs.org/wiki/Unit_Testing/1.0 -// -// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! -// -// Originally from narwhal.js (http://narwhaljs.org) -// Copyright (c) 2009 Thomas Robinson <280north.com> -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the 'Software'), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -var util = require('util/'); -var hasOwn = Object.prototype.hasOwnProperty; -var pSlice = Array.prototype.slice; -var functionsHaveNames = (function () { - return function foo() {}.name === 'foo'; -}()); -function pToString (obj) { - return Object.prototype.toString.call(obj); -} -function isView(arrbuf) { - if (isBuffer(arrbuf)) { - return false; - } - if (typeof global.ArrayBuffer !== 'function') { - return false; - } - if (typeof ArrayBuffer.isView === 'function') { - return ArrayBuffer.isView(arrbuf); - } - if (!arrbuf) { - return false; - } - if (arrbuf instanceof DataView) { - return true; - } - if (arrbuf.buffer && arrbuf.buffer instanceof ArrayBuffer) { - return true; - } - return false; -} -// 1. The assert module provides functions that throw -// AssertionError's when particular conditions are not met. The -// assert module must conform to the following interface. - -var assert = module.exports = ok; - -// 2. The AssertionError is defined in assert. -// new assert.AssertionError({ message: message, -// actual: actual, -// expected: expected }) - -var regex = /\s*function\s+([^\(\s]*)\s*/; -// based on https://github.com/ljharb/function.prototype.name/blob/adeeeec8bfcc6068b187d7d9fb3d5bb1d3a30899/implementation.js -function getName(func) { - if (!util.isFunction(func)) { - return; - } - if (functionsHaveNames) { - return func.name; - } - var str = func.toString(); - var match = str.match(regex); - return match && match[1]; -} -assert.AssertionError = function AssertionError(options) { - this.name = 'AssertionError'; - this.actual = options.actual; - this.expected = options.expected; - this.operator = options.operator; - if (options.message) { - this.message = options.message; - this.generatedMessage = false; - } else { - this.message = getMessage(this); - this.generatedMessage = true; - } - var stackStartFunction = options.stackStartFunction || fail; - if (Error.captureStackTrace) { - Error.captureStackTrace(this, stackStartFunction); - } else { - // non v8 browsers so we can have a stacktrace - var err = new Error(); - if (err.stack) { - var out = err.stack; - - // try to strip useless frames - var fn_name = getName(stackStartFunction); - var idx = out.indexOf('\n' + fn_name); - if (idx >= 0) { - // once we have located the function frame - // we need to strip out everything before it (and its line) - var next_line = out.indexOf('\n', idx + 1); - out = out.substring(next_line + 1); - } - - this.stack = out; - } - } -}; - -// assert.AssertionError instanceof Error -util.inherits(assert.AssertionError, Error); - -function truncate(s, n) { - if (typeof s === 'string') { - return s.length < n ? s : s.slice(0, n); - } else { - return s; - } -} -function inspect(something) { - if (functionsHaveNames || !util.isFunction(something)) { - return util.inspect(something); - } - var rawname = getName(something); - var name = rawname ? ': ' + rawname : ''; - return '[Function' + name + ']'; -} -function getMessage(self) { - return truncate(inspect(self.actual), 128) + ' ' + - self.operator + ' ' + - truncate(inspect(self.expected), 128); -} - -// At present only the three keys mentioned above are used and -// understood by the spec. Implementations or sub modules can pass -// other keys to the AssertionError's constructor - they will be -// ignored. - -// 3. All of the following functions must throw an AssertionError -// when a corresponding condition is not met, with a message that -// may be undefined if not provided. All assertion methods provide -// both the actual and expected values to the assertion error for -// display purposes. - -function fail(actual, expected, message, operator, stackStartFunction) { - throw new assert.AssertionError({ - message: message, - actual: actual, - expected: expected, - operator: operator, - stackStartFunction: stackStartFunction - }); -} - -// EXTENSION! allows for well behaved errors defined elsewhere. -assert.fail = fail; - -// 4. Pure assertion tests whether a value is truthy, as determined -// by !!guard. -// assert.ok(guard, message_opt); -// This statement is equivalent to assert.equal(true, !!guard, -// message_opt);. To test strictly for the value true, use -// assert.strictEqual(true, guard, message_opt);. - -function ok(value, message) { - if (!value) fail(value, true, message, '==', assert.ok); -} -assert.ok = ok; - -// 5. The equality assertion tests shallow, coercive equality with -// ==. -// assert.equal(actual, expected, message_opt); - -assert.equal = function equal(actual, expected, message) { - if (actual != expected) fail(actual, expected, message, '==', assert.equal); -}; - -// 6. The non-equality assertion tests for whether two objects are not equal -// with != assert.notEqual(actual, expected, message_opt); - -assert.notEqual = function notEqual(actual, expected, message) { - if (actual == expected) { - fail(actual, expected, message, '!=', assert.notEqual); - } -}; - -// 7. The equivalence assertion tests a deep equality relation. -// assert.deepEqual(actual, expected, message_opt); - -assert.deepEqual = function deepEqual(actual, expected, message) { - if (!_deepEqual(actual, expected, false)) { - fail(actual, expected, message, 'deepEqual', assert.deepEqual); - } -}; - -assert.deepStrictEqual = function deepStrictEqual(actual, expected, message) { - if (!_deepEqual(actual, expected, true)) { - fail(actual, expected, message, 'deepStrictEqual', assert.deepStrictEqual); - } -}; - -function _deepEqual(actual, expected, strict, memos) { - // 7.1. All identical values are equivalent, as determined by ===. - if (actual === expected) { - return true; - } else if (isBuffer(actual) && isBuffer(expected)) { - return compare(actual, expected) === 0; - - // 7.2. If the expected value is a Date object, the actual value is - // equivalent if it is also a Date object that refers to the same time. - } else if (util.isDate(actual) && util.isDate(expected)) { - return actual.getTime() === expected.getTime(); - - // 7.3 If the expected value is a RegExp object, the actual value is - // equivalent if it is also a RegExp object with the same source and - // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`). - } else if (util.isRegExp(actual) && util.isRegExp(expected)) { - return actual.source === expected.source && - actual.global === expected.global && - actual.multiline === expected.multiline && - actual.lastIndex === expected.lastIndex && - actual.ignoreCase === expected.ignoreCase; - - // 7.4. Other pairs that do not both pass typeof value == 'object', - // equivalence is determined by ==. - } else if ((actual === null || typeof actual !== 'object') && - (expected === null || typeof expected !== 'object')) { - return strict ? actual === expected : actual == expected; - - // If both values are instances of typed arrays, wrap their underlying - // ArrayBuffers in a Buffer each to increase performance - // This optimization requires the arrays to have the same type as checked by - // Object.prototype.toString (aka pToString). Never perform binary - // comparisons for Float*Arrays, though, since e.g. +0 === -0 but their - // bit patterns are not identical. - } else if (isView(actual) && isView(expected) && - pToString(actual) === pToString(expected) && - !(actual instanceof Float32Array || - actual instanceof Float64Array)) { - return compare(new Uint8Array(actual.buffer), - new Uint8Array(expected.buffer)) === 0; - - // 7.5 For all other Object pairs, including Array objects, equivalence is - // determined by having the same number of owned properties (as verified - // with Object.prototype.hasOwnProperty.call), the same set of keys - // (although not necessarily the same order), equivalent values for every - // corresponding key, and an identical 'prototype' property. Note: this - // accounts for both named and indexed properties on Arrays. - } else if (isBuffer(actual) !== isBuffer(expected)) { - return false; - } else { - memos = memos || {actual: [], expected: []}; - - var actualIndex = memos.actual.indexOf(actual); - if (actualIndex !== -1) { - if (actualIndex === memos.expected.indexOf(expected)) { - return true; - } - } - - memos.actual.push(actual); - memos.expected.push(expected); - - return objEquiv(actual, expected, strict, memos); - } -} - -function isArguments(object) { - return Object.prototype.toString.call(object) == '[object Arguments]'; -} - -function objEquiv(a, b, strict, actualVisitedObjects) { - if (a === null || a === undefined || b === null || b === undefined) - return false; - // if one is a primitive, the other must be same - if (util.isPrimitive(a) || util.isPrimitive(b)) - return a === b; - if (strict && Object.getPrototypeOf(a) !== Object.getPrototypeOf(b)) - return false; - var aIsArgs = isArguments(a); - var bIsArgs = isArguments(b); - if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs)) - return false; - if (aIsArgs) { - a = pSlice.call(a); - b = pSlice.call(b); - return _deepEqual(a, b, strict); - } - var ka = objectKeys(a); - var kb = objectKeys(b); - var key, i; - // having the same number of owned properties (keys incorporates - // hasOwnProperty) - if (ka.length !== kb.length) - return false; - //the same set of keys (although not necessarily the same order), - ka.sort(); - kb.sort(); - //~~~cheap key test - for (i = ka.length - 1; i >= 0; i--) { - if (ka[i] !== kb[i]) - return false; - } - //equivalent values for every corresponding key, and - //~~~possibly expensive deep test - for (i = ka.length - 1; i >= 0; i--) { - key = ka[i]; - if (!_deepEqual(a[key], b[key], strict, actualVisitedObjects)) - return false; - } - return true; -} - -// 8. The non-equivalence assertion tests for any deep inequality. -// assert.notDeepEqual(actual, expected, message_opt); - -assert.notDeepEqual = function notDeepEqual(actual, expected, message) { - if (_deepEqual(actual, expected, false)) { - fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual); - } -}; - -assert.notDeepStrictEqual = notDeepStrictEqual; -function notDeepStrictEqual(actual, expected, message) { - if (_deepEqual(actual, expected, true)) { - fail(actual, expected, message, 'notDeepStrictEqual', notDeepStrictEqual); - } -} - - -// 9. The strict equality assertion tests strict equality, as determined by ===. -// assert.strictEqual(actual, expected, message_opt); - -assert.strictEqual = function strictEqual(actual, expected, message) { - if (actual !== expected) { - fail(actual, expected, message, '===', assert.strictEqual); - } -}; - -// 10. The strict non-equality assertion tests for strict inequality, as -// determined by !==. assert.notStrictEqual(actual, expected, message_opt); - -assert.notStrictEqual = function notStrictEqual(actual, expected, message) { - if (actual === expected) { - fail(actual, expected, message, '!==', assert.notStrictEqual); - } -}; - -function expectedException(actual, expected) { - if (!actual || !expected) { - return false; - } - - if (Object.prototype.toString.call(expected) == '[object RegExp]') { - return expected.test(actual); - } - - try { - if (actual instanceof expected) { - return true; - } - } catch (e) { - // Ignore. The instanceof check doesn't work for arrow functions. - } - - if (Error.isPrototypeOf(expected)) { - return false; - } - - return expected.call({}, actual) === true; -} - -function _tryBlock(block) { - var error; - try { - block(); - } catch (e) { - error = e; - } - return error; -} - -function _throws(shouldThrow, block, expected, message) { - var actual; - - if (typeof block !== 'function') { - throw new TypeError('"block" argument must be a function'); - } - - if (typeof expected === 'string') { - message = expected; - expected = null; - } - - actual = _tryBlock(block); - - message = (expected && expected.name ? ' (' + expected.name + ').' : '.') + - (message ? ' ' + message : '.'); - - if (shouldThrow && !actual) { - fail(actual, expected, 'Missing expected exception' + message); - } - - var userProvidedMessage = typeof message === 'string'; - var isUnwantedException = !shouldThrow && util.isError(actual); - var isUnexpectedException = !shouldThrow && actual && !expected; - - if ((isUnwantedException && - userProvidedMessage && - expectedException(actual, expected)) || - isUnexpectedException) { - fail(actual, expected, 'Got unwanted exception' + message); - } - - if ((shouldThrow && actual && expected && - !expectedException(actual, expected)) || (!shouldThrow && actual)) { - throw actual; - } -} - -// 11. Expected to throw an error: -// assert.throws(block, Error_opt, message_opt); - -assert.throws = function(block, /*optional*/error, /*optional*/message) { - _throws(true, block, error, message); -}; - -// EXTENSION! This is annoying to write outside this module. -assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) { - _throws(false, block, error, message); -}; - -assert.ifError = function(err) { if (err) throw err; }; - -var objectKeys = Object.keys || function (obj) { - var keys = []; - for (var key in obj) { - if (hasOwn.call(obj, key)) keys.push(key); - } - return keys; -}; - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"util/":67}],24:[function(require,module,exports){ -'use strict' - -exports.byteLength = byteLength -exports.toByteArray = toByteArray -exports.fromByteArray = fromByteArray - -var lookup = [] -var revLookup = [] -var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array - -var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' -for (var i = 0, len = code.length; i < len; ++i) { - lookup[i] = code[i] - revLookup[code.charCodeAt(i)] = i -} - -revLookup['-'.charCodeAt(0)] = 62 -revLookup['_'.charCodeAt(0)] = 63 - -function placeHoldersCount (b64) { - var len = b64.length - if (len % 4 > 0) { - throw new Error('Invalid string. Length must be a multiple of 4') - } - - // the number of equal signs (place holders) - // if there are two placeholders, than the two characters before it - // represent one byte - // if there is only one, then the three characters before it represent 2 bytes - // this is just a cheap hack to not do indexOf twice - return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0 -} - -function byteLength (b64) { - // base64 is 4/3 + up to two characters of the original data - return (b64.length * 3 / 4) - placeHoldersCount(b64) -} - -function toByteArray (b64) { - var i, l, tmp, placeHolders, arr - var len = b64.length - placeHolders = placeHoldersCount(b64) - - arr = new Arr((len * 3 / 4) - placeHolders) - - // if there are placeholders, only get up to the last complete 4 chars - l = placeHolders > 0 ? len - 4 : len - - var L = 0 - - for (i = 0; i < l; i += 4) { - tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)] - arr[L++] = (tmp >> 16) & 0xFF - arr[L++] = (tmp >> 8) & 0xFF - arr[L++] = tmp & 0xFF - } - - if (placeHolders === 2) { - tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4) - arr[L++] = tmp & 0xFF - } else if (placeHolders === 1) { - tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2) - arr[L++] = (tmp >> 8) & 0xFF - arr[L++] = tmp & 0xFF - } - - return arr -} - -function tripletToBase64 (num) { - return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] -} - -function encodeChunk (uint8, start, end) { - var tmp - var output = [] - for (var i = start; i < end; i += 3) { - tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) - output.push(tripletToBase64(tmp)) - } - return output.join('') -} - -function fromByteArray (uint8) { - var tmp - var len = uint8.length - var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes - var output = '' - var parts = [] - var maxChunkLength = 16383 // must be multiple of 3 - - // go through the array every three bytes, we'll deal with trailing stuff later - for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { - parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) - } - - // pad the end with zeros, but make sure to not forget the extra bytes - if (extraBytes === 1) { - tmp = uint8[len - 1] - output += lookup[tmp >> 2] - output += lookup[(tmp << 4) & 0x3F] - output += '==' - } else if (extraBytes === 2) { - tmp = (uint8[len - 2] << 8) + (uint8[len - 1]) - output += lookup[tmp >> 10] - output += lookup[(tmp >> 4) & 0x3F] - output += lookup[(tmp << 2) & 0x3F] - output += '=' - } - - parts.push(output) - - return parts.join('') -} - -},{}],25:[function(require,module,exports){ - -},{}],26:[function(require,module,exports){ -(function (process,Buffer){ -'use strict'; -/* eslint camelcase: "off" */ - -var assert = require('assert'); - -var Zstream = require('pako/lib/zlib/zstream'); -var zlib_deflate = require('pako/lib/zlib/deflate.js'); -var zlib_inflate = require('pako/lib/zlib/inflate.js'); -var constants = require('pako/lib/zlib/constants'); - -for (var key in constants) { - exports[key] = constants[key]; -} - -// zlib modes -exports.NONE = 0; -exports.DEFLATE = 1; -exports.INFLATE = 2; -exports.GZIP = 3; -exports.GUNZIP = 4; -exports.DEFLATERAW = 5; -exports.INFLATERAW = 6; -exports.UNZIP = 7; - -var GZIP_HEADER_ID1 = 0x1f; -var GZIP_HEADER_ID2 = 0x8b; - -/** - * Emulate Node's zlib C++ layer for use by the JS layer in index.js - */ -function Zlib(mode) { - if (typeof mode !== 'number' || mode < exports.DEFLATE || mode > exports.UNZIP) { - throw new TypeError('Bad argument'); - } - - this.dictionary = null; - this.err = 0; - this.flush = 0; - this.init_done = false; - this.level = 0; - this.memLevel = 0; - this.mode = mode; - this.strategy = 0; - this.windowBits = 0; - this.write_in_progress = false; - this.pending_close = false; - this.gzip_id_bytes_read = 0; -} - -Zlib.prototype.close = function () { - if (this.write_in_progress) { - this.pending_close = true; - return; - } - - this.pending_close = false; - - assert(this.init_done, 'close before init'); - assert(this.mode <= exports.UNZIP); - - if (this.mode === exports.DEFLATE || this.mode === exports.GZIP || this.mode === exports.DEFLATERAW) { - zlib_deflate.deflateEnd(this.strm); - } else if (this.mode === exports.INFLATE || this.mode === exports.GUNZIP || this.mode === exports.INFLATERAW || this.mode === exports.UNZIP) { - zlib_inflate.inflateEnd(this.strm); - } - - this.mode = exports.NONE; - - this.dictionary = null; -}; - -Zlib.prototype.write = function (flush, input, in_off, in_len, out, out_off, out_len) { - return this._write(true, flush, input, in_off, in_len, out, out_off, out_len); -}; - -Zlib.prototype.writeSync = function (flush, input, in_off, in_len, out, out_off, out_len) { - return this._write(false, flush, input, in_off, in_len, out, out_off, out_len); -}; - -Zlib.prototype._write = function (async, flush, input, in_off, in_len, out, out_off, out_len) { - assert.equal(arguments.length, 8); - - assert(this.init_done, 'write before init'); - assert(this.mode !== exports.NONE, 'already finalized'); - assert.equal(false, this.write_in_progress, 'write already in progress'); - assert.equal(false, this.pending_close, 'close is pending'); - - this.write_in_progress = true; - - assert.equal(false, flush === undefined, 'must provide flush value'); - - this.write_in_progress = true; - - if (flush !== exports.Z_NO_FLUSH && flush !== exports.Z_PARTIAL_FLUSH && flush !== exports.Z_SYNC_FLUSH && flush !== exports.Z_FULL_FLUSH && flush !== exports.Z_FINISH && flush !== exports.Z_BLOCK) { - throw new Error('Invalid flush value'); - } - - if (input == null) { - input = Buffer.alloc(0); - in_len = 0; - in_off = 0; - } - - this.strm.avail_in = in_len; - this.strm.input = input; - this.strm.next_in = in_off; - this.strm.avail_out = out_len; - this.strm.output = out; - this.strm.next_out = out_off; - this.flush = flush; - - if (!async) { - // sync version - this._process(); - - if (this._checkError()) { - return this._afterSync(); - } - return; - } - - // async version - var self = this; - process.nextTick(function () { - self._process(); - self._after(); - }); - - return this; -}; - -Zlib.prototype._afterSync = function () { - var avail_out = this.strm.avail_out; - var avail_in = this.strm.avail_in; - - this.write_in_progress = false; - - return [avail_in, avail_out]; -}; - -Zlib.prototype._process = function () { - var next_expected_header_byte = null; - - // If the avail_out is left at 0, then it means that it ran out - // of room. If there was avail_out left over, then it means - // that all of the input was consumed. - switch (this.mode) { - case exports.DEFLATE: - case exports.GZIP: - case exports.DEFLATERAW: - this.err = zlib_deflate.deflate(this.strm, this.flush); - break; - case exports.UNZIP: - if (this.strm.avail_in > 0) { - next_expected_header_byte = this.strm.next_in; - } - - switch (this.gzip_id_bytes_read) { - case 0: - if (next_expected_header_byte === null) { - break; - } - - if (this.strm.input[next_expected_header_byte] === GZIP_HEADER_ID1) { - this.gzip_id_bytes_read = 1; - next_expected_header_byte++; - - if (this.strm.avail_in === 1) { - // The only available byte was already read. - break; - } - } else { - this.mode = exports.INFLATE; - break; - } - - // fallthrough - case 1: - if (next_expected_header_byte === null) { - break; - } - - if (this.strm.input[next_expected_header_byte] === GZIP_HEADER_ID2) { - this.gzip_id_bytes_read = 2; - this.mode = exports.GUNZIP; - } else { - // There is no actual difference between INFLATE and INFLATERAW - // (after initialization). - this.mode = exports.INFLATE; - } - - break; - default: - throw new Error('invalid number of gzip magic number bytes read'); - } - - // fallthrough - case exports.INFLATE: - case exports.GUNZIP: - case exports.INFLATERAW: - this.err = zlib_inflate.inflate(this.strm, this.flush - - // If data was encoded with dictionary - );if (this.err === exports.Z_NEED_DICT && this.dictionary) { - // Load it - this.err = zlib_inflate.inflateSetDictionary(this.strm, this.dictionary); - if (this.err === exports.Z_OK) { - // And try to decode again - this.err = zlib_inflate.inflate(this.strm, this.flush); - } else if (this.err === exports.Z_DATA_ERROR) { - // Both inflateSetDictionary() and inflate() return Z_DATA_ERROR. - // Make it possible for After() to tell a bad dictionary from bad - // input. - this.err = exports.Z_NEED_DICT; - } - } - while (this.strm.avail_in > 0 && this.mode === exports.GUNZIP && this.err === exports.Z_STREAM_END && this.strm.next_in[0] !== 0x00) { - // Bytes remain in input buffer. Perhaps this is another compressed - // member in the same archive, or just trailing garbage. - // Trailing zero bytes are okay, though, since they are frequently - // used for padding. - - this.reset(); - this.err = zlib_inflate.inflate(this.strm, this.flush); - } - break; - default: - throw new Error('Unknown mode ' + this.mode); - } -}; - -Zlib.prototype._checkError = function () { - // Acceptable error states depend on the type of zlib stream. - switch (this.err) { - case exports.Z_OK: - case exports.Z_BUF_ERROR: - if (this.strm.avail_out !== 0 && this.flush === exports.Z_FINISH) { - this._error('unexpected end of file'); - return false; - } - break; - case exports.Z_STREAM_END: - // normal statuses, not fatal - break; - case exports.Z_NEED_DICT: - if (this.dictionary == null) { - this._error('Missing dictionary'); - } else { - this._error('Bad dictionary'); - } - return false; - default: - // something else. - this._error('Zlib error'); - return false; - } - - return true; -}; - -Zlib.prototype._after = function () { - if (!this._checkError()) { - return; - } - - var avail_out = this.strm.avail_out; - var avail_in = this.strm.avail_in; - - this.write_in_progress = false; - - // call the write() cb - this.callback(avail_in, avail_out); - - if (this.pending_close) { - this.close(); - } -}; - -Zlib.prototype._error = function (message) { - if (this.strm.msg) { - message = this.strm.msg; - } - this.onerror(message, this.err - - // no hope of rescue. - );this.write_in_progress = false; - if (this.pending_close) { - this.close(); - } -}; - -Zlib.prototype.init = function (windowBits, level, memLevel, strategy, dictionary) { - assert(arguments.length === 4 || arguments.length === 5, 'init(windowBits, level, memLevel, strategy, [dictionary])'); - - assert(windowBits >= 8 && windowBits <= 15, 'invalid windowBits'); - assert(level >= -1 && level <= 9, 'invalid compression level'); - - assert(memLevel >= 1 && memLevel <= 9, 'invalid memlevel'); - - assert(strategy === exports.Z_FILTERED || strategy === exports.Z_HUFFMAN_ONLY || strategy === exports.Z_RLE || strategy === exports.Z_FIXED || strategy === exports.Z_DEFAULT_STRATEGY, 'invalid strategy'); - - this._init(level, windowBits, memLevel, strategy, dictionary); - this._setDictionary(); -}; - -Zlib.prototype.params = function () { - throw new Error('deflateParams Not supported'); -}; - -Zlib.prototype.reset = function () { - this._reset(); - this._setDictionary(); -}; - -Zlib.prototype._init = function (level, windowBits, memLevel, strategy, dictionary) { - this.level = level; - this.windowBits = windowBits; - this.memLevel = memLevel; - this.strategy = strategy; - - this.flush = exports.Z_NO_FLUSH; - - this.err = exports.Z_OK; - - if (this.mode === exports.GZIP || this.mode === exports.GUNZIP) { - this.windowBits += 16; - } - - if (this.mode === exports.UNZIP) { - this.windowBits += 32; - } - - if (this.mode === exports.DEFLATERAW || this.mode === exports.INFLATERAW) { - this.windowBits = -1 * this.windowBits; - } - - this.strm = new Zstream(); - - switch (this.mode) { - case exports.DEFLATE: - case exports.GZIP: - case exports.DEFLATERAW: - this.err = zlib_deflate.deflateInit2(this.strm, this.level, exports.Z_DEFLATED, this.windowBits, this.memLevel, this.strategy); - break; - case exports.INFLATE: - case exports.GUNZIP: - case exports.INFLATERAW: - case exports.UNZIP: - this.err = zlib_inflate.inflateInit2(this.strm, this.windowBits); - break; - default: - throw new Error('Unknown mode ' + this.mode); - } - - if (this.err !== exports.Z_OK) { - this._error('Init error'); - } - - this.dictionary = dictionary; - - this.write_in_progress = false; - this.init_done = true; -}; - -Zlib.prototype._setDictionary = function () { - if (this.dictionary == null) { - return; - } - - this.err = exports.Z_OK; - - switch (this.mode) { - case exports.DEFLATE: - case exports.DEFLATERAW: - this.err = zlib_deflate.deflateSetDictionary(this.strm, this.dictionary); - break; - default: - break; - } - - if (this.err !== exports.Z_OK) { - this._error('Failed to set dictionary'); - } -}; - -Zlib.prototype._reset = function () { - this.err = exports.Z_OK; - - switch (this.mode) { - case exports.DEFLATE: - case exports.DEFLATERAW: - case exports.GZIP: - this.err = zlib_deflate.deflateReset(this.strm); - break; - case exports.INFLATE: - case exports.INFLATERAW: - case exports.GUNZIP: - this.err = zlib_inflate.inflateReset(this.strm); - break; - default: - break; - } - - if (this.err !== exports.Z_OK) { - this._error('Failed to reset stream'); - } -}; - -exports.Zlib = Zlib; -}).call(this,require('_process'),require("buffer").Buffer) -},{"_process":47,"assert":23,"buffer":28,"pako/lib/zlib/constants":37,"pako/lib/zlib/deflate.js":39,"pako/lib/zlib/inflate.js":41,"pako/lib/zlib/zstream":45}],27:[function(require,module,exports){ -(function (process){ -'use strict'; - -var Buffer = require('buffer').Buffer; -var Transform = require('stream').Transform; -var binding = require('./binding'); -var util = require('util'); -var assert = require('assert').ok; -var kMaxLength = require('buffer').kMaxLength; -var kRangeErrorMessage = 'Cannot create final Buffer. It would be larger ' + 'than 0x' + kMaxLength.toString(16) + ' bytes'; - -// zlib doesn't provide these, so kludge them in following the same -// const naming scheme zlib uses. -binding.Z_MIN_WINDOWBITS = 8; -binding.Z_MAX_WINDOWBITS = 15; -binding.Z_DEFAULT_WINDOWBITS = 15; - -// fewer than 64 bytes per chunk is stupid. -// technically it could work with as few as 8, but even 64 bytes -// is absurdly low. Usually a MB or more is best. -binding.Z_MIN_CHUNK = 64; -binding.Z_MAX_CHUNK = Infinity; -binding.Z_DEFAULT_CHUNK = 16 * 1024; - -binding.Z_MIN_MEMLEVEL = 1; -binding.Z_MAX_MEMLEVEL = 9; -binding.Z_DEFAULT_MEMLEVEL = 8; - -binding.Z_MIN_LEVEL = -1; -binding.Z_MAX_LEVEL = 9; -binding.Z_DEFAULT_LEVEL = binding.Z_DEFAULT_COMPRESSION; - -// expose all the zlib constants -var bkeys = Object.keys(binding); -for (var bk = 0; bk < bkeys.length; bk++) { - var bkey = bkeys[bk]; - if (bkey.match(/^Z/)) { - Object.defineProperty(exports, bkey, { - enumerable: true, value: binding[bkey], writable: false - }); - } -} - -// translation table for return codes. -var codes = { - Z_OK: binding.Z_OK, - Z_STREAM_END: binding.Z_STREAM_END, - Z_NEED_DICT: binding.Z_NEED_DICT, - Z_ERRNO: binding.Z_ERRNO, - Z_STREAM_ERROR: binding.Z_STREAM_ERROR, - Z_DATA_ERROR: binding.Z_DATA_ERROR, - Z_MEM_ERROR: binding.Z_MEM_ERROR, - Z_BUF_ERROR: binding.Z_BUF_ERROR, - Z_VERSION_ERROR: binding.Z_VERSION_ERROR -}; - -var ckeys = Object.keys(codes); -for (var ck = 0; ck < ckeys.length; ck++) { - var ckey = ckeys[ck]; - codes[codes[ckey]] = ckey; -} - -Object.defineProperty(exports, 'codes', { - enumerable: true, value: Object.freeze(codes), writable: false -}); - -exports.Deflate = Deflate; -exports.Inflate = Inflate; -exports.Gzip = Gzip; -exports.Gunzip = Gunzip; -exports.DeflateRaw = DeflateRaw; -exports.InflateRaw = InflateRaw; -exports.Unzip = Unzip; - -exports.createDeflate = function (o) { - return new Deflate(o); -}; - -exports.createInflate = function (o) { - return new Inflate(o); -}; - -exports.createDeflateRaw = function (o) { - return new DeflateRaw(o); -}; - -exports.createInflateRaw = function (o) { - return new InflateRaw(o); -}; - -exports.createGzip = function (o) { - return new Gzip(o); -}; - -exports.createGunzip = function (o) { - return new Gunzip(o); -}; - -exports.createUnzip = function (o) { - return new Unzip(o); -}; - -// Convenience methods. -// compress/decompress a string or buffer in one step. -exports.deflate = function (buffer, opts, callback) { - if (typeof opts === 'function') { - callback = opts; - opts = {}; - } - return zlibBuffer(new Deflate(opts), buffer, callback); -}; - -exports.deflateSync = function (buffer, opts) { - return zlibBufferSync(new Deflate(opts), buffer); -}; - -exports.gzip = function (buffer, opts, callback) { - if (typeof opts === 'function') { - callback = opts; - opts = {}; - } - return zlibBuffer(new Gzip(opts), buffer, callback); -}; - -exports.gzipSync = function (buffer, opts) { - return zlibBufferSync(new Gzip(opts), buffer); -}; - -exports.deflateRaw = function (buffer, opts, callback) { - if (typeof opts === 'function') { - callback = opts; - opts = {}; - } - return zlibBuffer(new DeflateRaw(opts), buffer, callback); -}; - -exports.deflateRawSync = function (buffer, opts) { - return zlibBufferSync(new DeflateRaw(opts), buffer); -}; - -exports.unzip = function (buffer, opts, callback) { - if (typeof opts === 'function') { - callback = opts; - opts = {}; - } - return zlibBuffer(new Unzip(opts), buffer, callback); -}; - -exports.unzipSync = function (buffer, opts) { - return zlibBufferSync(new Unzip(opts), buffer); -}; - -exports.inflate = function (buffer, opts, callback) { - if (typeof opts === 'function') { - callback = opts; - opts = {}; - } - return zlibBuffer(new Inflate(opts), buffer, callback); -}; - -exports.inflateSync = function (buffer, opts) { - return zlibBufferSync(new Inflate(opts), buffer); -}; - -exports.gunzip = function (buffer, opts, callback) { - if (typeof opts === 'function') { - callback = opts; - opts = {}; - } - return zlibBuffer(new Gunzip(opts), buffer, callback); -}; - -exports.gunzipSync = function (buffer, opts) { - return zlibBufferSync(new Gunzip(opts), buffer); -}; - -exports.inflateRaw = function (buffer, opts, callback) { - if (typeof opts === 'function') { - callback = opts; - opts = {}; - } - return zlibBuffer(new InflateRaw(opts), buffer, callback); -}; - -exports.inflateRawSync = function (buffer, opts) { - return zlibBufferSync(new InflateRaw(opts), buffer); -}; - -function zlibBuffer(engine, buffer, callback) { - var buffers = []; - var nread = 0; - - engine.on('error', onError); - engine.on('end', onEnd); - - engine.end(buffer); - flow(); - - function flow() { - var chunk; - while (null !== (chunk = engine.read())) { - buffers.push(chunk); - nread += chunk.length; - } - engine.once('readable', flow); - } - - function onError(err) { - engine.removeListener('end', onEnd); - engine.removeListener('readable', flow); - callback(err); - } - - function onEnd() { - var buf; - var err = null; - - if (nread >= kMaxLength) { - err = new RangeError(kRangeErrorMessage); - } else { - buf = Buffer.concat(buffers, nread); - } - - buffers = []; - engine.close(); - callback(err, buf); - } -} - -function zlibBufferSync(engine, buffer) { - if (typeof buffer === 'string') buffer = Buffer.from(buffer); - - if (!Buffer.isBuffer(buffer)) throw new TypeError('Not a string or buffer'); - - var flushFlag = engine._finishFlushFlag; - - return engine._processChunk(buffer, flushFlag); -} - -// generic zlib -// minimal 2-byte header -function Deflate(opts) { - if (!(this instanceof Deflate)) return new Deflate(opts); - Zlib.call(this, opts, binding.DEFLATE); -} - -function Inflate(opts) { - if (!(this instanceof Inflate)) return new Inflate(opts); - Zlib.call(this, opts, binding.INFLATE); -} - -// gzip - bigger header, same deflate compression -function Gzip(opts) { - if (!(this instanceof Gzip)) return new Gzip(opts); - Zlib.call(this, opts, binding.GZIP); -} - -function Gunzip(opts) { - if (!(this instanceof Gunzip)) return new Gunzip(opts); - Zlib.call(this, opts, binding.GUNZIP); -} - -// raw - no header -function DeflateRaw(opts) { - if (!(this instanceof DeflateRaw)) return new DeflateRaw(opts); - Zlib.call(this, opts, binding.DEFLATERAW); -} - -function InflateRaw(opts) { - if (!(this instanceof InflateRaw)) return new InflateRaw(opts); - Zlib.call(this, opts, binding.INFLATERAW); -} - -// auto-detect header. -function Unzip(opts) { - if (!(this instanceof Unzip)) return new Unzip(opts); - Zlib.call(this, opts, binding.UNZIP); -} - -function isValidFlushFlag(flag) { - return flag === binding.Z_NO_FLUSH || flag === binding.Z_PARTIAL_FLUSH || flag === binding.Z_SYNC_FLUSH || flag === binding.Z_FULL_FLUSH || flag === binding.Z_FINISH || flag === binding.Z_BLOCK; -} - -// the Zlib class they all inherit from -// This thing manages the queue of requests, and returns -// true or false if there is anything in the queue when -// you call the .write() method. - -function Zlib(opts, mode) { - var _this = this; - - this._opts = opts = opts || {}; - this._chunkSize = opts.chunkSize || exports.Z_DEFAULT_CHUNK; - - Transform.call(this, opts); - - if (opts.flush && !isValidFlushFlag(opts.flush)) { - throw new Error('Invalid flush flag: ' + opts.flush); - } - if (opts.finishFlush && !isValidFlushFlag(opts.finishFlush)) { - throw new Error('Invalid flush flag: ' + opts.finishFlush); - } - - this._flushFlag = opts.flush || binding.Z_NO_FLUSH; - this._finishFlushFlag = typeof opts.finishFlush !== 'undefined' ? opts.finishFlush : binding.Z_FINISH; - - if (opts.chunkSize) { - if (opts.chunkSize < exports.Z_MIN_CHUNK || opts.chunkSize > exports.Z_MAX_CHUNK) { - throw new Error('Invalid chunk size: ' + opts.chunkSize); - } - } - - if (opts.windowBits) { - if (opts.windowBits < exports.Z_MIN_WINDOWBITS || opts.windowBits > exports.Z_MAX_WINDOWBITS) { - throw new Error('Invalid windowBits: ' + opts.windowBits); - } - } - - if (opts.level) { - if (opts.level < exports.Z_MIN_LEVEL || opts.level > exports.Z_MAX_LEVEL) { - throw new Error('Invalid compression level: ' + opts.level); - } - } - - if (opts.memLevel) { - if (opts.memLevel < exports.Z_MIN_MEMLEVEL || opts.memLevel > exports.Z_MAX_MEMLEVEL) { - throw new Error('Invalid memLevel: ' + opts.memLevel); - } - } - - if (opts.strategy) { - if (opts.strategy != exports.Z_FILTERED && opts.strategy != exports.Z_HUFFMAN_ONLY && opts.strategy != exports.Z_RLE && opts.strategy != exports.Z_FIXED && opts.strategy != exports.Z_DEFAULT_STRATEGY) { - throw new Error('Invalid strategy: ' + opts.strategy); - } - } - - if (opts.dictionary) { - if (!Buffer.isBuffer(opts.dictionary)) { - throw new Error('Invalid dictionary: it should be a Buffer instance'); - } - } - - this._handle = new binding.Zlib(mode); - - var self = this; - this._hadError = false; - this._handle.onerror = function (message, errno) { - // there is no way to cleanly recover. - // continuing only obscures problems. - _close(self); - self._hadError = true; - - var error = new Error(message); - error.errno = errno; - error.code = exports.codes[errno]; - self.emit('error', error); - }; - - var level = exports.Z_DEFAULT_COMPRESSION; - if (typeof opts.level === 'number') level = opts.level; - - var strategy = exports.Z_DEFAULT_STRATEGY; - if (typeof opts.strategy === 'number') strategy = opts.strategy; - - this._handle.init(opts.windowBits || exports.Z_DEFAULT_WINDOWBITS, level, opts.memLevel || exports.Z_DEFAULT_MEMLEVEL, strategy, opts.dictionary); - - this._buffer = Buffer.allocUnsafe(this._chunkSize); - this._offset = 0; - this._level = level; - this._strategy = strategy; - - this.once('end', this.close); - - Object.defineProperty(this, '_closed', { - get: function () { - return !_this._handle; - }, - configurable: true, - enumerable: true - }); -} - -util.inherits(Zlib, Transform); - -Zlib.prototype.params = function (level, strategy, callback) { - if (level < exports.Z_MIN_LEVEL || level > exports.Z_MAX_LEVEL) { - throw new RangeError('Invalid compression level: ' + level); - } - if (strategy != exports.Z_FILTERED && strategy != exports.Z_HUFFMAN_ONLY && strategy != exports.Z_RLE && strategy != exports.Z_FIXED && strategy != exports.Z_DEFAULT_STRATEGY) { - throw new TypeError('Invalid strategy: ' + strategy); - } - - if (this._level !== level || this._strategy !== strategy) { - var self = this; - this.flush(binding.Z_SYNC_FLUSH, function () { - assert(self._handle, 'zlib binding closed'); - self._handle.params(level, strategy); - if (!self._hadError) { - self._level = level; - self._strategy = strategy; - if (callback) callback(); - } - }); - } else { - process.nextTick(callback); - } -}; - -Zlib.prototype.reset = function () { - assert(this._handle, 'zlib binding closed'); - return this._handle.reset(); -}; - -// This is the _flush function called by the transform class, -// internally, when the last chunk has been written. -Zlib.prototype._flush = function (callback) { - this._transform(Buffer.alloc(0), '', callback); -}; - -Zlib.prototype.flush = function (kind, callback) { - var _this2 = this; - - var ws = this._writableState; - - if (typeof kind === 'function' || kind === undefined && !callback) { - callback = kind; - kind = binding.Z_FULL_FLUSH; - } - - if (ws.ended) { - if (callback) process.nextTick(callback); - } else if (ws.ending) { - if (callback) this.once('end', callback); - } else if (ws.needDrain) { - if (callback) { - this.once('drain', function () { - return _this2.flush(kind, callback); - }); - } - } else { - this._flushFlag = kind; - this.write(Buffer.alloc(0), '', callback); - } -}; - -Zlib.prototype.close = function (callback) { - _close(this, callback); - process.nextTick(emitCloseNT, this); -}; - -function _close(engine, callback) { - if (callback) process.nextTick(callback); - - // Caller may invoke .close after a zlib error (which will null _handle). - if (!engine._handle) return; - - engine._handle.close(); - engine._handle = null; -} - -function emitCloseNT(self) { - self.emit('close'); -} - -Zlib.prototype._transform = function (chunk, encoding, cb) { - var flushFlag; - var ws = this._writableState; - var ending = ws.ending || ws.ended; - var last = ending && (!chunk || ws.length === chunk.length); - - if (chunk !== null && !Buffer.isBuffer(chunk)) return cb(new Error('invalid input')); - - if (!this._handle) return cb(new Error('zlib binding closed')); - - // If it's the last chunk, or a final flush, we use the Z_FINISH flush flag - // (or whatever flag was provided using opts.finishFlush). - // If it's explicitly flushing at some other time, then we use - // Z_FULL_FLUSH. Otherwise, use Z_NO_FLUSH for maximum compression - // goodness. - if (last) flushFlag = this._finishFlushFlag;else { - flushFlag = this._flushFlag; - // once we've flushed the last of the queue, stop flushing and - // go back to the normal behavior. - if (chunk.length >= ws.length) { - this._flushFlag = this._opts.flush || binding.Z_NO_FLUSH; - } - } - - this._processChunk(chunk, flushFlag, cb); -}; - -Zlib.prototype._processChunk = function (chunk, flushFlag, cb) { - var availInBefore = chunk && chunk.length; - var availOutBefore = this._chunkSize - this._offset; - var inOff = 0; - - var self = this; - - var async = typeof cb === 'function'; - - if (!async) { - var buffers = []; - var nread = 0; - - var error; - this.on('error', function (er) { - error = er; - }); - - assert(this._handle, 'zlib binding closed'); - do { - var res = this._handle.writeSync(flushFlag, chunk, // in - inOff, // in_off - availInBefore, // in_len - this._buffer, // out - this._offset, //out_off - availOutBefore); // out_len - } while (!this._hadError && callback(res[0], res[1])); - - if (this._hadError) { - throw error; - } - - if (nread >= kMaxLength) { - _close(this); - throw new RangeError(kRangeErrorMessage); - } - - var buf = Buffer.concat(buffers, nread); - _close(this); - - return buf; - } - - assert(this._handle, 'zlib binding closed'); - var req = this._handle.write(flushFlag, chunk, // in - inOff, // in_off - availInBefore, // in_len - this._buffer, // out - this._offset, //out_off - availOutBefore); // out_len - - req.buffer = chunk; - req.callback = callback; - - function callback(availInAfter, availOutAfter) { - // When the callback is used in an async write, the callback's - // context is the `req` object that was created. The req object - // is === this._handle, and that's why it's important to null - // out the values after they are done being used. `this._handle` - // can stay in memory longer than the callback and buffer are needed. - if (this) { - this.buffer = null; - this.callback = null; - } - - if (self._hadError) return; - - var have = availOutBefore - availOutAfter; - assert(have >= 0, 'have should not go down'); - - if (have > 0) { - var out = self._buffer.slice(self._offset, self._offset + have); - self._offset += have; - // serve some output to the consumer. - if (async) { - self.push(out); - } else { - buffers.push(out); - nread += out.length; - } - } - - // exhausted the output buffer, or used all the input create a new one. - if (availOutAfter === 0 || self._offset >= self._chunkSize) { - availOutBefore = self._chunkSize; - self._offset = 0; - self._buffer = Buffer.allocUnsafe(self._chunkSize); - } - - if (availOutAfter === 0) { - // Not actually done. Need to reprocess. - // Also, update the availInBefore to the availInAfter value, - // so that if we have to hit it a third (fourth, etc.) time, - // it'll have the correct byte counts. - inOff += availInBefore - availInAfter; - availInBefore = availInAfter; - - if (!async) return true; - - var newReq = self._handle.write(flushFlag, chunk, inOff, availInBefore, self._buffer, self._offset, self._chunkSize); - newReq.callback = callback; // this same function - newReq.buffer = chunk; - return; - } - - if (!async) return false; - - // finished with the chunk. - cb(); - } -}; - -util.inherits(Deflate, Zlib); -util.inherits(Inflate, Zlib); -util.inherits(Gzip, Zlib); -util.inherits(Gunzip, Zlib); -util.inherits(DeflateRaw, Zlib); -util.inherits(InflateRaw, Zlib); -util.inherits(Unzip, Zlib); -}).call(this,require('_process')) -},{"./binding":26,"_process":47,"assert":23,"buffer":28,"stream":63,"util":67}],28:[function(require,module,exports){ -/*! - * The buffer module from node.js, for the browser. - * - * @author Feross Aboukhadijeh - * @license MIT - */ -/* eslint-disable no-proto */ - -'use strict' - -var base64 = require('base64-js') -var ieee754 = require('ieee754') - -exports.Buffer = Buffer -exports.SlowBuffer = SlowBuffer -exports.INSPECT_MAX_BYTES = 50 - -var K_MAX_LENGTH = 0x7fffffff -exports.kMaxLength = K_MAX_LENGTH - -/** - * If `Buffer.TYPED_ARRAY_SUPPORT`: - * === true Use Uint8Array implementation (fastest) - * === false Print warning and recommend using `buffer` v4.x which has an Object - * implementation (most compatible, even IE6) - * - * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, - * Opera 11.6+, iOS 4.2+. - * - * We report that the browser does not support typed arrays if the are not subclassable - * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array` - * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support - * for __proto__ and has a buggy typed array implementation. - */ -Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport() - -if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' && - typeof console.error === 'function') { - console.error( - 'This browser lacks typed array (Uint8Array) support which is required by ' + - '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.' - ) -} - -function typedArraySupport () { - // Can typed array instances can be augmented? - try { - var arr = new Uint8Array(1) - arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } } - return arr.foo() === 42 - } catch (e) { - return false - } -} - -Object.defineProperty(Buffer.prototype, 'parent', { - enumerable: true, - get: function () { - if (!Buffer.isBuffer(this)) return undefined - return this.buffer - } -}) - -Object.defineProperty(Buffer.prototype, 'offset', { - enumerable: true, - get: function () { - if (!Buffer.isBuffer(this)) return undefined - return this.byteOffset - } -}) - -function createBuffer (length) { - if (length > K_MAX_LENGTH) { - throw new RangeError('The value "' + length + '" is invalid for option "size"') - } - // Return an augmented `Uint8Array` instance - var buf = new Uint8Array(length) - buf.__proto__ = Buffer.prototype - return buf -} - -/** - * The Buffer constructor returns instances of `Uint8Array` that have their - * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of - * `Uint8Array`, so the returned instances will have all the node `Buffer` methods - * and the `Uint8Array` methods. Square bracket notation works as expected -- it - * returns a single octet. - * - * The `Uint8Array` prototype remains unmodified. - */ - -function Buffer (arg, encodingOrOffset, length) { - // Common case. - if (typeof arg === 'number') { - if (typeof encodingOrOffset === 'string') { - throw new TypeError( - 'The "string" argument must be of type string. Received type number' - ) - } - return allocUnsafe(arg) - } - return from(arg, encodingOrOffset, length) -} - -// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 -if (typeof Symbol !== 'undefined' && Symbol.species != null && - Buffer[Symbol.species] === Buffer) { - Object.defineProperty(Buffer, Symbol.species, { - value: null, - configurable: true, - enumerable: false, - writable: false - }) -} - -Buffer.poolSize = 8192 // not used by this implementation - -function from (value, encodingOrOffset, length) { - if (typeof value === 'string') { - return fromString(value, encodingOrOffset) - } - - if (ArrayBuffer.isView(value)) { - return fromArrayLike(value) - } - - if (value == null) { - throw TypeError( - 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + - 'or Array-like Object. Received type ' + (typeof value) - ) - } - - if (isInstance(value, ArrayBuffer) || - (value && isInstance(value.buffer, ArrayBuffer))) { - return fromArrayBuffer(value, encodingOrOffset, length) - } - - if (typeof value === 'number') { - throw new TypeError( - 'The "value" argument must not be of type number. Received type number' - ) - } - - var valueOf = value.valueOf && value.valueOf() - if (valueOf != null && valueOf !== value) { - return Buffer.from(valueOf, encodingOrOffset, length) - } - - var b = fromObject(value) - if (b) return b - - if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null && - typeof value[Symbol.toPrimitive] === 'function') { - return Buffer.from( - value[Symbol.toPrimitive]('string'), encodingOrOffset, length - ) - } - - throw new TypeError( - 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + - 'or Array-like Object. Received type ' + (typeof value) - ) -} - -/** - * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError - * if value is a number. - * Buffer.from(str[, encoding]) - * Buffer.from(array) - * Buffer.from(buffer) - * Buffer.from(arrayBuffer[, byteOffset[, length]]) - **/ -Buffer.from = function (value, encodingOrOffset, length) { - return from(value, encodingOrOffset, length) -} - -// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug: -// https://github.com/feross/buffer/pull/148 -Buffer.prototype.__proto__ = Uint8Array.prototype -Buffer.__proto__ = Uint8Array - -function assertSize (size) { - if (typeof size !== 'number') { - throw new TypeError('"size" argument must be of type number') - } else if (size < 0) { - throw new RangeError('The value "' + size + '" is invalid for option "size"') - } -} - -function alloc (size, fill, encoding) { - assertSize(size) - if (size <= 0) { - return createBuffer(size) - } - if (fill !== undefined) { - // Only pay attention to encoding if it's a string. This - // prevents accidentally sending in a number that would - // be interpretted as a start offset. - return typeof encoding === 'string' - ? createBuffer(size).fill(fill, encoding) - : createBuffer(size).fill(fill) - } - return createBuffer(size) -} - -/** - * Creates a new filled Buffer instance. - * alloc(size[, fill[, encoding]]) - **/ -Buffer.alloc = function (size, fill, encoding) { - return alloc(size, fill, encoding) -} - -function allocUnsafe (size) { - assertSize(size) - return createBuffer(size < 0 ? 0 : checked(size) | 0) -} - -/** - * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. - * */ -Buffer.allocUnsafe = function (size) { - return allocUnsafe(size) -} -/** - * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. - */ -Buffer.allocUnsafeSlow = function (size) { - return allocUnsafe(size) -} - -function fromString (string, encoding) { - if (typeof encoding !== 'string' || encoding === '') { - encoding = 'utf8' - } - - if (!Buffer.isEncoding(encoding)) { - throw new TypeError('Unknown encoding: ' + encoding) - } - - var length = byteLength(string, encoding) | 0 - var buf = createBuffer(length) - - var actual = buf.write(string, encoding) - - if (actual !== length) { - // Writing a hex string, for example, that contains invalid characters will - // cause everything after the first invalid character to be ignored. (e.g. - // 'abxxcd' will be treated as 'ab') - buf = buf.slice(0, actual) - } - - return buf -} - -function fromArrayLike (array) { - var length = array.length < 0 ? 0 : checked(array.length) | 0 - var buf = createBuffer(length) - for (var i = 0; i < length; i += 1) { - buf[i] = array[i] & 255 - } - return buf -} - -function fromArrayBuffer (array, byteOffset, length) { - if (byteOffset < 0 || array.byteLength < byteOffset) { - throw new RangeError('"offset" is outside of buffer bounds') - } - - if (array.byteLength < byteOffset + (length || 0)) { - throw new RangeError('"length" is outside of buffer bounds') - } - - var buf - if (byteOffset === undefined && length === undefined) { - buf = new Uint8Array(array) - } else if (length === undefined) { - buf = new Uint8Array(array, byteOffset) - } else { - buf = new Uint8Array(array, byteOffset, length) - } - - // Return an augmented `Uint8Array` instance - buf.__proto__ = Buffer.prototype - return buf -} - -function fromObject (obj) { - if (Buffer.isBuffer(obj)) { - var len = checked(obj.length) | 0 - var buf = createBuffer(len) - - if (buf.length === 0) { - return buf - } - - obj.copy(buf, 0, 0, len) - return buf - } - - if (obj.length !== undefined) { - if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) { - return createBuffer(0) - } - return fromArrayLike(obj) - } - - if (obj.type === 'Buffer' && Array.isArray(obj.data)) { - return fromArrayLike(obj.data) - } -} - -function checked (length) { - // Note: cannot use `length < K_MAX_LENGTH` here because that fails when - // length is NaN (which is otherwise coerced to zero.) - if (length >= K_MAX_LENGTH) { - throw new RangeError('Attempt to allocate Buffer larger than maximum ' + - 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes') - } - return length | 0 -} - -function SlowBuffer (length) { - if (+length != length) { // eslint-disable-line eqeqeq - length = 0 - } - return Buffer.alloc(+length) -} - -Buffer.isBuffer = function isBuffer (b) { - return b != null && b._isBuffer === true && - b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false -} - -Buffer.compare = function compare (a, b) { - if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength) - if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength) - if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { - throw new TypeError( - 'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array' - ) - } - - if (a === b) return 0 - - var x = a.length - var y = b.length - - for (var i = 0, len = Math.min(x, y); i < len; ++i) { - if (a[i] !== b[i]) { - x = a[i] - y = b[i] - break - } - } - - if (x < y) return -1 - if (y < x) return 1 - return 0 -} - -Buffer.isEncoding = function isEncoding (encoding) { - switch (String(encoding).toLowerCase()) { - case 'hex': - case 'utf8': - case 'utf-8': - case 'ascii': - case 'latin1': - case 'binary': - case 'base64': - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return true - default: - return false - } -} - -Buffer.concat = function concat (list, length) { - if (!Array.isArray(list)) { - throw new TypeError('"list" argument must be an Array of Buffers') - } - - if (list.length === 0) { - return Buffer.alloc(0) - } - - var i - if (length === undefined) { - length = 0 - for (i = 0; i < list.length; ++i) { - length += list[i].length - } - } - - var buffer = Buffer.allocUnsafe(length) - var pos = 0 - for (i = 0; i < list.length; ++i) { - var buf = list[i] - if (isInstance(buf, Uint8Array)) { - buf = Buffer.from(buf) - } - if (!Buffer.isBuffer(buf)) { - throw new TypeError('"list" argument must be an Array of Buffers') - } - buf.copy(buffer, pos) - pos += buf.length - } - return buffer -} - -function byteLength (string, encoding) { - if (Buffer.isBuffer(string)) { - return string.length - } - if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) { - return string.byteLength - } - if (typeof string !== 'string') { - throw new TypeError( - 'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' + - 'Received type ' + typeof string - ) - } - - var len = string.length - var mustMatch = (arguments.length > 2 && arguments[2] === true) - if (!mustMatch && len === 0) return 0 - - // Use a for loop to avoid recursion - var loweredCase = false - for (;;) { - switch (encoding) { - case 'ascii': - case 'latin1': - case 'binary': - return len - case 'utf8': - case 'utf-8': - return utf8ToBytes(string).length - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return len * 2 - case 'hex': - return len >>> 1 - case 'base64': - return base64ToBytes(string).length - default: - if (loweredCase) { - return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8 - } - encoding = ('' + encoding).toLowerCase() - loweredCase = true - } - } -} -Buffer.byteLength = byteLength - -function slowToString (encoding, start, end) { - var loweredCase = false - - // No need to verify that "this.length <= MAX_UINT32" since it's a read-only - // property of a typed array. - - // This behaves neither like String nor Uint8Array in that we set start/end - // to their upper/lower bounds if the value passed is out of range. - // undefined is handled specially as per ECMA-262 6th Edition, - // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. - if (start === undefined || start < 0) { - start = 0 - } - // Return early if start > this.length. Done here to prevent potential uint32 - // coercion fail below. - if (start > this.length) { - return '' - } - - if (end === undefined || end > this.length) { - end = this.length - } - - if (end <= 0) { - return '' - } - - // Force coersion to uint32. This will also coerce falsey/NaN values to 0. - end >>>= 0 - start >>>= 0 - - if (end <= start) { - return '' - } - - if (!encoding) encoding = 'utf8' - - while (true) { - switch (encoding) { - case 'hex': - return hexSlice(this, start, end) - - case 'utf8': - case 'utf-8': - return utf8Slice(this, start, end) - - case 'ascii': - return asciiSlice(this, start, end) - - case 'latin1': - case 'binary': - return latin1Slice(this, start, end) - - case 'base64': - return base64Slice(this, start, end) - - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return utf16leSlice(this, start, end) - - default: - if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) - encoding = (encoding + '').toLowerCase() - loweredCase = true - } - } -} - -// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package) -// to detect a Buffer instance. It's not possible to use `instanceof Buffer` -// reliably in a browserify context because there could be multiple different -// copies of the 'buffer' package in use. This method works even for Buffer -// instances that were created from another copy of the `buffer` package. -// See: https://github.com/feross/buffer/issues/154 -Buffer.prototype._isBuffer = true - -function swap (b, n, m) { - var i = b[n] - b[n] = b[m] - b[m] = i -} - -Buffer.prototype.swap16 = function swap16 () { - var len = this.length - if (len % 2 !== 0) { - throw new RangeError('Buffer size must be a multiple of 16-bits') - } - for (var i = 0; i < len; i += 2) { - swap(this, i, i + 1) - } - return this -} - -Buffer.prototype.swap32 = function swap32 () { - var len = this.length - if (len % 4 !== 0) { - throw new RangeError('Buffer size must be a multiple of 32-bits') - } - for (var i = 0; i < len; i += 4) { - swap(this, i, i + 3) - swap(this, i + 1, i + 2) - } - return this -} - -Buffer.prototype.swap64 = function swap64 () { - var len = this.length - if (len % 8 !== 0) { - throw new RangeError('Buffer size must be a multiple of 64-bits') - } - for (var i = 0; i < len; i += 8) { - swap(this, i, i + 7) - swap(this, i + 1, i + 6) - swap(this, i + 2, i + 5) - swap(this, i + 3, i + 4) - } - return this -} - -Buffer.prototype.toString = function toString () { - var length = this.length - if (length === 0) return '' - if (arguments.length === 0) return utf8Slice(this, 0, length) - return slowToString.apply(this, arguments) -} - -Buffer.prototype.toLocaleString = Buffer.prototype.toString - -Buffer.prototype.equals = function equals (b) { - if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') - if (this === b) return true - return Buffer.compare(this, b) === 0 -} - -Buffer.prototype.inspect = function inspect () { - var str = '' - var max = exports.INSPECT_MAX_BYTES - str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim() - if (this.length > max) str += ' ... ' - return '' -} - -Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { - if (isInstance(target, Uint8Array)) { - target = Buffer.from(target, target.offset, target.byteLength) - } - if (!Buffer.isBuffer(target)) { - throw new TypeError( - 'The "target" argument must be one of type Buffer or Uint8Array. ' + - 'Received type ' + (typeof target) - ) - } - - if (start === undefined) { - start = 0 - } - if (end === undefined) { - end = target ? target.length : 0 - } - if (thisStart === undefined) { - thisStart = 0 - } - if (thisEnd === undefined) { - thisEnd = this.length - } - - if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { - throw new RangeError('out of range index') - } - - if (thisStart >= thisEnd && start >= end) { - return 0 - } - if (thisStart >= thisEnd) { - return -1 - } - if (start >= end) { - return 1 - } - - start >>>= 0 - end >>>= 0 - thisStart >>>= 0 - thisEnd >>>= 0 - - if (this === target) return 0 - - var x = thisEnd - thisStart - var y = end - start - var len = Math.min(x, y) - - var thisCopy = this.slice(thisStart, thisEnd) - var targetCopy = target.slice(start, end) - - for (var i = 0; i < len; ++i) { - if (thisCopy[i] !== targetCopy[i]) { - x = thisCopy[i] - y = targetCopy[i] - break - } - } - - if (x < y) return -1 - if (y < x) return 1 - return 0 -} - -// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, -// OR the last index of `val` in `buffer` at offset <= `byteOffset`. -// -// Arguments: -// - buffer - a Buffer to search -// - val - a string, Buffer, or number -// - byteOffset - an index into `buffer`; will be clamped to an int32 -// - encoding - an optional encoding, relevant is val is a string -// - dir - true for indexOf, false for lastIndexOf -function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { - // Empty buffer means no match - if (buffer.length === 0) return -1 - - // Normalize byteOffset - if (typeof byteOffset === 'string') { - encoding = byteOffset - byteOffset = 0 - } else if (byteOffset > 0x7fffffff) { - byteOffset = 0x7fffffff - } else if (byteOffset < -0x80000000) { - byteOffset = -0x80000000 - } - byteOffset = +byteOffset // Coerce to Number. - if (numberIsNaN(byteOffset)) { - // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer - byteOffset = dir ? 0 : (buffer.length - 1) - } - - // Normalize byteOffset: negative offsets start from the end of the buffer - if (byteOffset < 0) byteOffset = buffer.length + byteOffset - if (byteOffset >= buffer.length) { - if (dir) return -1 - else byteOffset = buffer.length - 1 - } else if (byteOffset < 0) { - if (dir) byteOffset = 0 - else return -1 - } - - // Normalize val - if (typeof val === 'string') { - val = Buffer.from(val, encoding) - } - - // Finally, search either indexOf (if dir is true) or lastIndexOf - if (Buffer.isBuffer(val)) { - // Special case: looking for empty string/buffer always fails - if (val.length === 0) { - return -1 - } - return arrayIndexOf(buffer, val, byteOffset, encoding, dir) - } else if (typeof val === 'number') { - val = val & 0xFF // Search for a byte value [0-255] - if (typeof Uint8Array.prototype.indexOf === 'function') { - if (dir) { - return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) - } else { - return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) - } - } - return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) - } - - throw new TypeError('val must be string, number or Buffer') -} - -function arrayIndexOf (arr, val, byteOffset, encoding, dir) { - var indexSize = 1 - var arrLength = arr.length - var valLength = val.length - - if (encoding !== undefined) { - encoding = String(encoding).toLowerCase() - if (encoding === 'ucs2' || encoding === 'ucs-2' || - encoding === 'utf16le' || encoding === 'utf-16le') { - if (arr.length < 2 || val.length < 2) { - return -1 - } - indexSize = 2 - arrLength /= 2 - valLength /= 2 - byteOffset /= 2 - } - } - - function read (buf, i) { - if (indexSize === 1) { - return buf[i] - } else { - return buf.readUInt16BE(i * indexSize) - } - } - - var i - if (dir) { - var foundIndex = -1 - for (i = byteOffset; i < arrLength; i++) { - if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { - if (foundIndex === -1) foundIndex = i - if (i - foundIndex + 1 === valLength) return foundIndex * indexSize - } else { - if (foundIndex !== -1) i -= i - foundIndex - foundIndex = -1 - } - } - } else { - if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength - for (i = byteOffset; i >= 0; i--) { - var found = true - for (var j = 0; j < valLength; j++) { - if (read(arr, i + j) !== read(val, j)) { - found = false - break - } - } - if (found) return i - } - } - - return -1 -} - -Buffer.prototype.includes = function includes (val, byteOffset, encoding) { - return this.indexOf(val, byteOffset, encoding) !== -1 -} - -Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { - return bidirectionalIndexOf(this, val, byteOffset, encoding, true) -} - -Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { - return bidirectionalIndexOf(this, val, byteOffset, encoding, false) -} - -function hexWrite (buf, string, offset, length) { - offset = Number(offset) || 0 - var remaining = buf.length - offset - if (!length) { - length = remaining - } else { - length = Number(length) - if (length > remaining) { - length = remaining - } - } - - var strLen = string.length - - if (length > strLen / 2) { - length = strLen / 2 - } - for (var i = 0; i < length; ++i) { - var parsed = parseInt(string.substr(i * 2, 2), 16) - if (numberIsNaN(parsed)) return i - buf[offset + i] = parsed - } - return i -} - -function utf8Write (buf, string, offset, length) { - return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) -} - -function asciiWrite (buf, string, offset, length) { - return blitBuffer(asciiToBytes(string), buf, offset, length) -} - -function latin1Write (buf, string, offset, length) { - return asciiWrite(buf, string, offset, length) -} - -function base64Write (buf, string, offset, length) { - return blitBuffer(base64ToBytes(string), buf, offset, length) -} - -function ucs2Write (buf, string, offset, length) { - return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) -} - -Buffer.prototype.write = function write (string, offset, length, encoding) { - // Buffer#write(string) - if (offset === undefined) { - encoding = 'utf8' - length = this.length - offset = 0 - // Buffer#write(string, encoding) - } else if (length === undefined && typeof offset === 'string') { - encoding = offset - length = this.length - offset = 0 - // Buffer#write(string, offset[, length][, encoding]) - } else if (isFinite(offset)) { - offset = offset >>> 0 - if (isFinite(length)) { - length = length >>> 0 - if (encoding === undefined) encoding = 'utf8' - } else { - encoding = length - length = undefined - } - } else { - throw new Error( - 'Buffer.write(string, encoding, offset[, length]) is no longer supported' - ) - } - - var remaining = this.length - offset - if (length === undefined || length > remaining) length = remaining - - if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { - throw new RangeError('Attempt to write outside buffer bounds') - } - - if (!encoding) encoding = 'utf8' - - var loweredCase = false - for (;;) { - switch (encoding) { - case 'hex': - return hexWrite(this, string, offset, length) - - case 'utf8': - case 'utf-8': - return utf8Write(this, string, offset, length) - - case 'ascii': - return asciiWrite(this, string, offset, length) - - case 'latin1': - case 'binary': - return latin1Write(this, string, offset, length) - - case 'base64': - // Warning: maxLength not taken into account in base64Write - return base64Write(this, string, offset, length) - - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return ucs2Write(this, string, offset, length) - - default: - if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) - encoding = ('' + encoding).toLowerCase() - loweredCase = true - } - } -} - -Buffer.prototype.toJSON = function toJSON () { - return { - type: 'Buffer', - data: Array.prototype.slice.call(this._arr || this, 0) - } -} - -function base64Slice (buf, start, end) { - if (start === 0 && end === buf.length) { - return base64.fromByteArray(buf) - } else { - return base64.fromByteArray(buf.slice(start, end)) - } -} - -function utf8Slice (buf, start, end) { - end = Math.min(buf.length, end) - var res = [] - - var i = start - while (i < end) { - var firstByte = buf[i] - var codePoint = null - var bytesPerSequence = (firstByte > 0xEF) ? 4 - : (firstByte > 0xDF) ? 3 - : (firstByte > 0xBF) ? 2 - : 1 - - if (i + bytesPerSequence <= end) { - var secondByte, thirdByte, fourthByte, tempCodePoint - - switch (bytesPerSequence) { - case 1: - if (firstByte < 0x80) { - codePoint = firstByte - } - break - case 2: - secondByte = buf[i + 1] - if ((secondByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) - if (tempCodePoint > 0x7F) { - codePoint = tempCodePoint - } - } - break - case 3: - secondByte = buf[i + 1] - thirdByte = buf[i + 2] - if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) - if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { - codePoint = tempCodePoint - } - } - break - case 4: - secondByte = buf[i + 1] - thirdByte = buf[i + 2] - fourthByte = buf[i + 3] - if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) - if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { - codePoint = tempCodePoint - } - } - } - } - - if (codePoint === null) { - // we did not generate a valid codePoint so insert a - // replacement char (U+FFFD) and advance only 1 byte - codePoint = 0xFFFD - bytesPerSequence = 1 - } else if (codePoint > 0xFFFF) { - // encode to utf16 (surrogate pair dance) - codePoint -= 0x10000 - res.push(codePoint >>> 10 & 0x3FF | 0xD800) - codePoint = 0xDC00 | codePoint & 0x3FF - } - - res.push(codePoint) - i += bytesPerSequence - } - - return decodeCodePointsArray(res) -} - -// Based on http://stackoverflow.com/a/22747272/680742, the browser with -// the lowest limit is Chrome, with 0x10000 args. -// We go 1 magnitude less, for safety -var MAX_ARGUMENTS_LENGTH = 0x1000 - -function decodeCodePointsArray (codePoints) { - var len = codePoints.length - if (len <= MAX_ARGUMENTS_LENGTH) { - return String.fromCharCode.apply(String, codePoints) // avoid extra slice() - } - - // Decode in chunks to avoid "call stack size exceeded". - var res = '' - var i = 0 - while (i < len) { - res += String.fromCharCode.apply( - String, - codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) - ) - } - return res -} - -function asciiSlice (buf, start, end) { - var ret = '' - end = Math.min(buf.length, end) - - for (var i = start; i < end; ++i) { - ret += String.fromCharCode(buf[i] & 0x7F) - } - return ret -} - -function latin1Slice (buf, start, end) { - var ret = '' - end = Math.min(buf.length, end) - - for (var i = start; i < end; ++i) { - ret += String.fromCharCode(buf[i]) - } - return ret -} - -function hexSlice (buf, start, end) { - var len = buf.length - - if (!start || start < 0) start = 0 - if (!end || end < 0 || end > len) end = len - - var out = '' - for (var i = start; i < end; ++i) { - out += toHex(buf[i]) - } - return out -} - -function utf16leSlice (buf, start, end) { - var bytes = buf.slice(start, end) - var res = '' - for (var i = 0; i < bytes.length; i += 2) { - res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256)) - } - return res -} - -Buffer.prototype.slice = function slice (start, end) { - var len = this.length - start = ~~start - end = end === undefined ? len : ~~end - - if (start < 0) { - start += len - if (start < 0) start = 0 - } else if (start > len) { - start = len - } - - if (end < 0) { - end += len - if (end < 0) end = 0 - } else if (end > len) { - end = len - } - - if (end < start) end = start - - var newBuf = this.subarray(start, end) - // Return an augmented `Uint8Array` instance - newBuf.__proto__ = Buffer.prototype - return newBuf -} - -/* - * Need to make sure that buffer isn't trying to write out of bounds. - */ -function checkOffset (offset, ext, length) { - if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') - if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') -} - -Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) checkOffset(offset, byteLength, this.length) - - var val = this[offset] - var mul = 1 - var i = 0 - while (++i < byteLength && (mul *= 0x100)) { - val += this[offset + i] * mul - } - - return val -} - -Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) { - checkOffset(offset, byteLength, this.length) - } - - var val = this[offset + --byteLength] - var mul = 1 - while (byteLength > 0 && (mul *= 0x100)) { - val += this[offset + --byteLength] * mul - } - - return val -} - -Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 1, this.length) - return this[offset] -} - -Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 2, this.length) - return this[offset] | (this[offset + 1] << 8) -} - -Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 2, this.length) - return (this[offset] << 8) | this[offset + 1] -} - -Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 4, this.length) - - return ((this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16)) + - (this[offset + 3] * 0x1000000) -} - -Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 4, this.length) - - return (this[offset] * 0x1000000) + - ((this[offset + 1] << 16) | - (this[offset + 2] << 8) | - this[offset + 3]) -} - -Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) checkOffset(offset, byteLength, this.length) - - var val = this[offset] - var mul = 1 - var i = 0 - while (++i < byteLength && (mul *= 0x100)) { - val += this[offset + i] * mul - } - mul *= 0x80 - - if (val >= mul) val -= Math.pow(2, 8 * byteLength) - - return val -} - -Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) checkOffset(offset, byteLength, this.length) - - var i = byteLength - var mul = 1 - var val = this[offset + --i] - while (i > 0 && (mul *= 0x100)) { - val += this[offset + --i] * mul - } - mul *= 0x80 - - if (val >= mul) val -= Math.pow(2, 8 * byteLength) - - return val -} - -Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 1, this.length) - if (!(this[offset] & 0x80)) return (this[offset]) - return ((0xff - this[offset] + 1) * -1) -} - -Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 2, this.length) - var val = this[offset] | (this[offset + 1] << 8) - return (val & 0x8000) ? val | 0xFFFF0000 : val -} - -Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 2, this.length) - var val = this[offset + 1] | (this[offset] << 8) - return (val & 0x8000) ? val | 0xFFFF0000 : val -} - -Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 4, this.length) - - return (this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16) | - (this[offset + 3] << 24) -} - -Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 4, this.length) - - return (this[offset] << 24) | - (this[offset + 1] << 16) | - (this[offset + 2] << 8) | - (this[offset + 3]) -} - -Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 4, this.length) - return ieee754.read(this, offset, true, 23, 4) -} - -Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 4, this.length) - return ieee754.read(this, offset, false, 23, 4) -} - -Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 8, this.length) - return ieee754.read(this, offset, true, 52, 8) -} - -Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { - offset = offset >>> 0 - if (!noAssert) checkOffset(offset, 8, this.length) - return ieee754.read(this, offset, false, 52, 8) -} - -function checkInt (buf, value, offset, ext, max, min) { - if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') - if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') - if (offset + ext > buf.length) throw new RangeError('Index out of range') -} - -Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { - value = +value - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) { - var maxBytes = Math.pow(2, 8 * byteLength) - 1 - checkInt(this, value, offset, byteLength, maxBytes, 0) - } - - var mul = 1 - var i = 0 - this[offset] = value & 0xFF - while (++i < byteLength && (mul *= 0x100)) { - this[offset + i] = (value / mul) & 0xFF - } - - return offset + byteLength -} - -Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { - value = +value - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) { - var maxBytes = Math.pow(2, 8 * byteLength) - 1 - checkInt(this, value, offset, byteLength, maxBytes, 0) - } - - var i = byteLength - 1 - var mul = 1 - this[offset + i] = value & 0xFF - while (--i >= 0 && (mul *= 0x100)) { - this[offset + i] = (value / mul) & 0xFF - } - - return offset + byteLength -} - -Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) - this[offset] = (value & 0xff) - return offset + 1 -} - -Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) - this[offset] = (value & 0xff) - this[offset + 1] = (value >>> 8) - return offset + 2 -} - -Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) - this[offset] = (value >>> 8) - this[offset + 1] = (value & 0xff) - return offset + 2 -} - -Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) - this[offset + 3] = (value >>> 24) - this[offset + 2] = (value >>> 16) - this[offset + 1] = (value >>> 8) - this[offset] = (value & 0xff) - return offset + 4 -} - -Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) - this[offset] = (value >>> 24) - this[offset + 1] = (value >>> 16) - this[offset + 2] = (value >>> 8) - this[offset + 3] = (value & 0xff) - return offset + 4 -} - -Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) { - var limit = Math.pow(2, (8 * byteLength) - 1) - - checkInt(this, value, offset, byteLength, limit - 1, -limit) - } - - var i = 0 - var mul = 1 - var sub = 0 - this[offset] = value & 0xFF - while (++i < byteLength && (mul *= 0x100)) { - if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { - sub = 1 - } - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF - } - - return offset + byteLength -} - -Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) { - var limit = Math.pow(2, (8 * byteLength) - 1) - - checkInt(this, value, offset, byteLength, limit - 1, -limit) - } - - var i = byteLength - 1 - var mul = 1 - var sub = 0 - this[offset + i] = value & 0xFF - while (--i >= 0 && (mul *= 0x100)) { - if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { - sub = 1 - } - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF - } - - return offset + byteLength -} - -Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) - if (value < 0) value = 0xff + value + 1 - this[offset] = (value & 0xff) - return offset + 1 -} - -Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) - this[offset] = (value & 0xff) - this[offset + 1] = (value >>> 8) - return offset + 2 -} - -Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) - this[offset] = (value >>> 8) - this[offset + 1] = (value & 0xff) - return offset + 2 -} - -Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) - this[offset] = (value & 0xff) - this[offset + 1] = (value >>> 8) - this[offset + 2] = (value >>> 16) - this[offset + 3] = (value >>> 24) - return offset + 4 -} - -Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) - if (value < 0) value = 0xffffffff + value + 1 - this[offset] = (value >>> 24) - this[offset + 1] = (value >>> 16) - this[offset + 2] = (value >>> 8) - this[offset + 3] = (value & 0xff) - return offset + 4 -} - -function checkIEEE754 (buf, value, offset, ext, max, min) { - if (offset + ext > buf.length) throw new RangeError('Index out of range') - if (offset < 0) throw new RangeError('Index out of range') -} - -function writeFloat (buf, value, offset, littleEndian, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) { - checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) - } - ieee754.write(buf, value, offset, littleEndian, 23, 4) - return offset + 4 -} - -Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { - return writeFloat(this, value, offset, true, noAssert) -} - -Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { - return writeFloat(this, value, offset, false, noAssert) -} - -function writeDouble (buf, value, offset, littleEndian, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) { - checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) - } - ieee754.write(buf, value, offset, littleEndian, 52, 8) - return offset + 8 -} - -Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { - return writeDouble(this, value, offset, true, noAssert) -} - -Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { - return writeDouble(this, value, offset, false, noAssert) -} - -// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) -Buffer.prototype.copy = function copy (target, targetStart, start, end) { - if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer') - if (!start) start = 0 - if (!end && end !== 0) end = this.length - if (targetStart >= target.length) targetStart = target.length - if (!targetStart) targetStart = 0 - if (end > 0 && end < start) end = start - - // Copy 0 bytes; we're done - if (end === start) return 0 - if (target.length === 0 || this.length === 0) return 0 - - // Fatal error conditions - if (targetStart < 0) { - throw new RangeError('targetStart out of bounds') - } - if (start < 0 || start >= this.length) throw new RangeError('Index out of range') - if (end < 0) throw new RangeError('sourceEnd out of bounds') - - // Are we oob? - if (end > this.length) end = this.length - if (target.length - targetStart < end - start) { - end = target.length - targetStart + start - } - - var len = end - start - - if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') { - // Use built-in when available, missing from IE11 - this.copyWithin(targetStart, start, end) - } else if (this === target && start < targetStart && targetStart < end) { - // descending copy from end - for (var i = len - 1; i >= 0; --i) { - target[i + targetStart] = this[i + start] - } - } else { - Uint8Array.prototype.set.call( - target, - this.subarray(start, end), - targetStart - ) - } - - return len -} - -// Usage: -// buffer.fill(number[, offset[, end]]) -// buffer.fill(buffer[, offset[, end]]) -// buffer.fill(string[, offset[, end]][, encoding]) -Buffer.prototype.fill = function fill (val, start, end, encoding) { - // Handle string cases: - if (typeof val === 'string') { - if (typeof start === 'string') { - encoding = start - start = 0 - end = this.length - } else if (typeof end === 'string') { - encoding = end - end = this.length - } - if (encoding !== undefined && typeof encoding !== 'string') { - throw new TypeError('encoding must be a string') - } - if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { - throw new TypeError('Unknown encoding: ' + encoding) - } - if (val.length === 1) { - var code = val.charCodeAt(0) - if ((encoding === 'utf8' && code < 128) || - encoding === 'latin1') { - // Fast path: If `val` fits into a single byte, use that numeric value. - val = code - } - } - } else if (typeof val === 'number') { - val = val & 255 - } - - // Invalid ranges are not set to a default, so can range check early. - if (start < 0 || this.length < start || this.length < end) { - throw new RangeError('Out of range index') - } - - if (end <= start) { - return this - } - - start = start >>> 0 - end = end === undefined ? this.length : end >>> 0 - - if (!val) val = 0 - - var i - if (typeof val === 'number') { - for (i = start; i < end; ++i) { - this[i] = val - } - } else { - var bytes = Buffer.isBuffer(val) - ? val - : Buffer.from(val, encoding) - var len = bytes.length - if (len === 0) { - throw new TypeError('The value "' + val + - '" is invalid for argument "value"') - } - for (i = 0; i < end - start; ++i) { - this[i + start] = bytes[i % len] - } - } - - return this -} - -// HELPER FUNCTIONS -// ================ - -var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g - -function base64clean (str) { - // Node takes equal signs as end of the Base64 encoding - str = str.split('=')[0] - // Node strips out invalid characters like \n and \t from the string, base64-js does not - str = str.trim().replace(INVALID_BASE64_RE, '') - // Node converts strings with length < 2 to '' - if (str.length < 2) return '' - // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not - while (str.length % 4 !== 0) { - str = str + '=' - } - return str -} - -function toHex (n) { - if (n < 16) return '0' + n.toString(16) - return n.toString(16) -} - -function utf8ToBytes (string, units) { - units = units || Infinity - var codePoint - var length = string.length - var leadSurrogate = null - var bytes = [] - - for (var i = 0; i < length; ++i) { - codePoint = string.charCodeAt(i) - - // is surrogate component - if (codePoint > 0xD7FF && codePoint < 0xE000) { - // last char was a lead - if (!leadSurrogate) { - // no lead yet - if (codePoint > 0xDBFF) { - // unexpected trail - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - continue - } else if (i + 1 === length) { - // unpaired lead - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - continue - } - - // valid lead - leadSurrogate = codePoint - - continue - } - - // 2 leads in a row - if (codePoint < 0xDC00) { - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - leadSurrogate = codePoint - continue - } - - // valid surrogate pair - codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 - } else if (leadSurrogate) { - // valid bmp char, but last char was a lead - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - } - - leadSurrogate = null - - // encode utf8 - if (codePoint < 0x80) { - if ((units -= 1) < 0) break - bytes.push(codePoint) - } else if (codePoint < 0x800) { - if ((units -= 2) < 0) break - bytes.push( - codePoint >> 0x6 | 0xC0, - codePoint & 0x3F | 0x80 - ) - } else if (codePoint < 0x10000) { - if ((units -= 3) < 0) break - bytes.push( - codePoint >> 0xC | 0xE0, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ) - } else if (codePoint < 0x110000) { - if ((units -= 4) < 0) break - bytes.push( - codePoint >> 0x12 | 0xF0, - codePoint >> 0xC & 0x3F | 0x80, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ) - } else { - throw new Error('Invalid code point') - } - } - - return bytes -} - -function asciiToBytes (str) { - var byteArray = [] - for (var i = 0; i < str.length; ++i) { - // Node's code seems to be doing this and not & 0x7F.. - byteArray.push(str.charCodeAt(i) & 0xFF) - } - return byteArray -} - -function utf16leToBytes (str, units) { - var c, hi, lo - var byteArray = [] - for (var i = 0; i < str.length; ++i) { - if ((units -= 2) < 0) break - - c = str.charCodeAt(i) - hi = c >> 8 - lo = c % 256 - byteArray.push(lo) - byteArray.push(hi) - } - - return byteArray -} - -function base64ToBytes (str) { - return base64.toByteArray(base64clean(str)) -} - -function blitBuffer (src, dst, offset, length) { - for (var i = 0; i < length; ++i) { - if ((i + offset >= dst.length) || (i >= src.length)) break - dst[i + offset] = src[i] - } - return i -} - -// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass -// the `instanceof` check but they should be treated as of that type. -// See: https://github.com/feross/buffer/issues/166 -function isInstance (obj, type) { - return obj instanceof type || - (obj != null && obj.constructor != null && obj.constructor.name != null && - obj.constructor.name === type.name) -} -function numberIsNaN (obj) { - // For IE11 support - return obj !== obj // eslint-disable-line no-self-compare -} - -},{"base64-js":24,"ieee754":31}],29:[function(require,module,exports){ -(function (Buffer){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// NOTE: These type checking functions intentionally don't use `instanceof` -// because it is fragile and can be easily faked with `Object.create()`. - -function isArray(arg) { - if (Array.isArray) { - return Array.isArray(arg); - } - return objectToString(arg) === '[object Array]'; -} -exports.isArray = isArray; - -function isBoolean(arg) { - return typeof arg === 'boolean'; -} -exports.isBoolean = isBoolean; - -function isNull(arg) { - return arg === null; -} -exports.isNull = isNull; - -function isNullOrUndefined(arg) { - return arg == null; -} -exports.isNullOrUndefined = isNullOrUndefined; - -function isNumber(arg) { - return typeof arg === 'number'; -} -exports.isNumber = isNumber; - -function isString(arg) { - return typeof arg === 'string'; -} -exports.isString = isString; - -function isSymbol(arg) { - return typeof arg === 'symbol'; -} -exports.isSymbol = isSymbol; - -function isUndefined(arg) { - return arg === void 0; -} -exports.isUndefined = isUndefined; - -function isRegExp(re) { - return objectToString(re) === '[object RegExp]'; -} -exports.isRegExp = isRegExp; - -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} -exports.isObject = isObject; - -function isDate(d) { - return objectToString(d) === '[object Date]'; -} -exports.isDate = isDate; - -function isError(e) { - return (objectToString(e) === '[object Error]' || e instanceof Error); -} -exports.isError = isError; - -function isFunction(arg) { - return typeof arg === 'function'; -} -exports.isFunction = isFunction; - -function isPrimitive(arg) { - return arg === null || - typeof arg === 'boolean' || - typeof arg === 'number' || - typeof arg === 'string' || - typeof arg === 'symbol' || // ES6 symbol - typeof arg === 'undefined'; -} -exports.isPrimitive = isPrimitive; - -exports.isBuffer = Buffer.isBuffer; - -function objectToString(o) { - return Object.prototype.toString.call(o); -} - -}).call(this,{"isBuffer":require("../../is-buffer/index.js")}) -},{"../../is-buffer/index.js":33}],30:[function(require,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -var objectCreate = Object.create || objectCreatePolyfill -var objectKeys = Object.keys || objectKeysPolyfill -var bind = Function.prototype.bind || functionBindPolyfill - -function EventEmitter() { - if (!this._events || !Object.prototype.hasOwnProperty.call(this, '_events')) { - this._events = objectCreate(null); - this._eventsCount = 0; - } - - this._maxListeners = this._maxListeners || undefined; -} -module.exports = EventEmitter; - -// Backwards-compat with node 0.10.x -EventEmitter.EventEmitter = EventEmitter; - -EventEmitter.prototype._events = undefined; -EventEmitter.prototype._maxListeners = undefined; - -// By default EventEmitters will print a warning if more than 10 listeners are -// added to it. This is a useful default which helps finding memory leaks. -var defaultMaxListeners = 10; - -var hasDefineProperty; -try { - var o = {}; - if (Object.defineProperty) Object.defineProperty(o, 'x', { value: 0 }); - hasDefineProperty = o.x === 0; -} catch (err) { hasDefineProperty = false } -if (hasDefineProperty) { - Object.defineProperty(EventEmitter, 'defaultMaxListeners', { - enumerable: true, - get: function() { - return defaultMaxListeners; - }, - set: function(arg) { - // check whether the input is a positive number (whose value is zero or - // greater and not a NaN). - if (typeof arg !== 'number' || arg < 0 || arg !== arg) - throw new TypeError('"defaultMaxListeners" must be a positive number'); - defaultMaxListeners = arg; - } - }); -} else { - EventEmitter.defaultMaxListeners = defaultMaxListeners; -} - -// Obviously not all Emitters should be limited to 10. This function allows -// that to be increased. Set to zero for unlimited. -EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { - if (typeof n !== 'number' || n < 0 || isNaN(n)) - throw new TypeError('"n" argument must be a positive number'); - this._maxListeners = n; - return this; -}; - -function $getMaxListeners(that) { - if (that._maxListeners === undefined) - return EventEmitter.defaultMaxListeners; - return that._maxListeners; -} - -EventEmitter.prototype.getMaxListeners = function getMaxListeners() { - return $getMaxListeners(this); -}; - -// These standalone emit* functions are used to optimize calling of event -// handlers for fast cases because emit() itself often has a variable number of -// arguments and can be deoptimized because of that. These functions always have -// the same number of arguments and thus do not get deoptimized, so the code -// inside them can execute faster. -function emitNone(handler, isFn, self) { - if (isFn) - handler.call(self); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].call(self); - } -} -function emitOne(handler, isFn, self, arg1) { - if (isFn) - handler.call(self, arg1); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].call(self, arg1); - } -} -function emitTwo(handler, isFn, self, arg1, arg2) { - if (isFn) - handler.call(self, arg1, arg2); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].call(self, arg1, arg2); - } -} -function emitThree(handler, isFn, self, arg1, arg2, arg3) { - if (isFn) - handler.call(self, arg1, arg2, arg3); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].call(self, arg1, arg2, arg3); - } -} - -function emitMany(handler, isFn, self, args) { - if (isFn) - handler.apply(self, args); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].apply(self, args); - } -} - -EventEmitter.prototype.emit = function emit(type) { - var er, handler, len, args, i, events; - var doError = (type === 'error'); - - events = this._events; - if (events) - doError = (doError && events.error == null); - else if (!doError) - return false; - - // If there is no 'error' event listener then throw. - if (doError) { - if (arguments.length > 1) - er = arguments[1]; - if (er instanceof Error) { - throw er; // Unhandled 'error' event - } else { - // At least give some kind of context to the user - var err = new Error('Unhandled "error" event. (' + er + ')'); - err.context = er; - throw err; - } - return false; - } - - handler = events[type]; - - if (!handler) - return false; - - var isFn = typeof handler === 'function'; - len = arguments.length; - switch (len) { - // fast cases - case 1: - emitNone(handler, isFn, this); - break; - case 2: - emitOne(handler, isFn, this, arguments[1]); - break; - case 3: - emitTwo(handler, isFn, this, arguments[1], arguments[2]); - break; - case 4: - emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]); - break; - // slower - default: - args = new Array(len - 1); - for (i = 1; i < len; i++) - args[i - 1] = arguments[i]; - emitMany(handler, isFn, this, args); - } - - return true; -}; - -function _addListener(target, type, listener, prepend) { - var m; - var events; - var existing; - - if (typeof listener !== 'function') - throw new TypeError('"listener" argument must be a function'); - - events = target._events; - if (!events) { - events = target._events = objectCreate(null); - target._eventsCount = 0; - } else { - // To avoid recursion in the case that type === "newListener"! Before - // adding it to the listeners, first emit "newListener". - if (events.newListener) { - target.emit('newListener', type, - listener.listener ? listener.listener : listener); - - // Re-assign `events` because a newListener handler could have caused the - // this._events to be assigned to a new object - events = target._events; - } - existing = events[type]; - } - - if (!existing) { - // Optimize the case of one listener. Don't need the extra array object. - existing = events[type] = listener; - ++target._eventsCount; - } else { - if (typeof existing === 'function') { - // Adding the second element, need to change to array. - existing = events[type] = - prepend ? [listener, existing] : [existing, listener]; - } else { - // If we've already got an array, just append. - if (prepend) { - existing.unshift(listener); - } else { - existing.push(listener); - } - } - - // Check for listener leak - if (!existing.warned) { - m = $getMaxListeners(target); - if (m && m > 0 && existing.length > m) { - existing.warned = true; - var w = new Error('Possible EventEmitter memory leak detected. ' + - existing.length + ' "' + String(type) + '" listeners ' + - 'added. Use emitter.setMaxListeners() to ' + - 'increase limit.'); - w.name = 'MaxListenersExceededWarning'; - w.emitter = target; - w.type = type; - w.count = existing.length; - if (typeof console === 'object' && console.warn) { - console.warn('%s: %s', w.name, w.message); - } - } - } - } - - return target; -} - -EventEmitter.prototype.addListener = function addListener(type, listener) { - return _addListener(this, type, listener, false); -}; - -EventEmitter.prototype.on = EventEmitter.prototype.addListener; - -EventEmitter.prototype.prependListener = - function prependListener(type, listener) { - return _addListener(this, type, listener, true); - }; - -function onceWrapper() { - if (!this.fired) { - this.target.removeListener(this.type, this.wrapFn); - this.fired = true; - switch (arguments.length) { - case 0: - return this.listener.call(this.target); - case 1: - return this.listener.call(this.target, arguments[0]); - case 2: - return this.listener.call(this.target, arguments[0], arguments[1]); - case 3: - return this.listener.call(this.target, arguments[0], arguments[1], - arguments[2]); - default: - var args = new Array(arguments.length); - for (var i = 0; i < args.length; ++i) - args[i] = arguments[i]; - this.listener.apply(this.target, args); - } - } -} - -function _onceWrap(target, type, listener) { - var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; - var wrapped = bind.call(onceWrapper, state); - wrapped.listener = listener; - state.wrapFn = wrapped; - return wrapped; -} - -EventEmitter.prototype.once = function once(type, listener) { - if (typeof listener !== 'function') - throw new TypeError('"listener" argument must be a function'); - this.on(type, _onceWrap(this, type, listener)); - return this; -}; - -EventEmitter.prototype.prependOnceListener = - function prependOnceListener(type, listener) { - if (typeof listener !== 'function') - throw new TypeError('"listener" argument must be a function'); - this.prependListener(type, _onceWrap(this, type, listener)); - return this; - }; - -// Emits a 'removeListener' event if and only if the listener was removed. -EventEmitter.prototype.removeListener = - function removeListener(type, listener) { - var list, events, position, i, originalListener; - - if (typeof listener !== 'function') - throw new TypeError('"listener" argument must be a function'); - - events = this._events; - if (!events) - return this; - - list = events[type]; - if (!list) - return this; - - if (list === listener || list.listener === listener) { - if (--this._eventsCount === 0) - this._events = objectCreate(null); - else { - delete events[type]; - if (events.removeListener) - this.emit('removeListener', type, list.listener || listener); - } - } else if (typeof list !== 'function') { - position = -1; - - for (i = list.length - 1; i >= 0; i--) { - if (list[i] === listener || list[i].listener === listener) { - originalListener = list[i].listener; - position = i; - break; - } - } - - if (position < 0) - return this; - - if (position === 0) - list.shift(); - else - spliceOne(list, position); - - if (list.length === 1) - events[type] = list[0]; - - if (events.removeListener) - this.emit('removeListener', type, originalListener || listener); - } - - return this; - }; - -EventEmitter.prototype.removeAllListeners = - function removeAllListeners(type) { - var listeners, events, i; - - events = this._events; - if (!events) - return this; - - // not listening for removeListener, no need to emit - if (!events.removeListener) { - if (arguments.length === 0) { - this._events = objectCreate(null); - this._eventsCount = 0; - } else if (events[type]) { - if (--this._eventsCount === 0) - this._events = objectCreate(null); - else - delete events[type]; - } - return this; - } - - // emit removeListener for all listeners on all events - if (arguments.length === 0) { - var keys = objectKeys(events); - var key; - for (i = 0; i < keys.length; ++i) { - key = keys[i]; - if (key === 'removeListener') continue; - this.removeAllListeners(key); - } - this.removeAllListeners('removeListener'); - this._events = objectCreate(null); - this._eventsCount = 0; - return this; - } - - listeners = events[type]; - - if (typeof listeners === 'function') { - this.removeListener(type, listeners); - } else if (listeners) { - // LIFO order - for (i = listeners.length - 1; i >= 0; i--) { - this.removeListener(type, listeners[i]); - } - } - - return this; - }; - -function _listeners(target, type, unwrap) { - var events = target._events; - - if (!events) - return []; - - var evlistener = events[type]; - if (!evlistener) - return []; - - if (typeof evlistener === 'function') - return unwrap ? [evlistener.listener || evlistener] : [evlistener]; - - return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); -} - -EventEmitter.prototype.listeners = function listeners(type) { - return _listeners(this, type, true); -}; - -EventEmitter.prototype.rawListeners = function rawListeners(type) { - return _listeners(this, type, false); -}; - -EventEmitter.listenerCount = function(emitter, type) { - if (typeof emitter.listenerCount === 'function') { - return emitter.listenerCount(type); - } else { - return listenerCount.call(emitter, type); - } -}; - -EventEmitter.prototype.listenerCount = listenerCount; -function listenerCount(type) { - var events = this._events; - - if (events) { - var evlistener = events[type]; - - if (typeof evlistener === 'function') { - return 1; - } else if (evlistener) { - return evlistener.length; - } - } - - return 0; -} - -EventEmitter.prototype.eventNames = function eventNames() { - return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : []; -}; - -// About 1.5x faster than the two-arg version of Array#splice(). -function spliceOne(list, index) { - for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) - list[i] = list[k]; - list.pop(); -} - -function arrayClone(arr, n) { - var copy = new Array(n); - for (var i = 0; i < n; ++i) - copy[i] = arr[i]; - return copy; -} - -function unwrapListeners(arr) { - var ret = new Array(arr.length); - for (var i = 0; i < ret.length; ++i) { - ret[i] = arr[i].listener || arr[i]; - } - return ret; -} - -function objectCreatePolyfill(proto) { - var F = function() {}; - F.prototype = proto; - return new F; -} -function objectKeysPolyfill(obj) { - var keys = []; - for (var k in obj) if (Object.prototype.hasOwnProperty.call(obj, k)) { - keys.push(k); - } - return k; -} -function functionBindPolyfill(context) { - var fn = this; - return function () { - return fn.apply(context, arguments); - }; -} - -},{}],31:[function(require,module,exports){ -exports.read = function (buffer, offset, isLE, mLen, nBytes) { - var e, m - var eLen = nBytes * 8 - mLen - 1 - var eMax = (1 << eLen) - 1 - var eBias = eMax >> 1 - var nBits = -7 - var i = isLE ? (nBytes - 1) : 0 - var d = isLE ? -1 : 1 - var s = buffer[offset + i] - - i += d - - e = s & ((1 << (-nBits)) - 1) - s >>= (-nBits) - nBits += eLen - for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} - - m = e & ((1 << (-nBits)) - 1) - e >>= (-nBits) - nBits += mLen - for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} - - if (e === 0) { - e = 1 - eBias - } else if (e === eMax) { - return m ? NaN : ((s ? -1 : 1) * Infinity) - } else { - m = m + Math.pow(2, mLen) - e = e - eBias - } - return (s ? -1 : 1) * m * Math.pow(2, e - mLen) -} - -exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { - var e, m, c - var eLen = nBytes * 8 - mLen - 1 - var eMax = (1 << eLen) - 1 - var eBias = eMax >> 1 - var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) - var i = isLE ? 0 : (nBytes - 1) - var d = isLE ? 1 : -1 - var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 - - value = Math.abs(value) - - if (isNaN(value) || value === Infinity) { - m = isNaN(value) ? 1 : 0 - e = eMax - } else { - e = Math.floor(Math.log(value) / Math.LN2) - if (value * (c = Math.pow(2, -e)) < 1) { - e-- - c *= 2 - } - if (e + eBias >= 1) { - value += rt / c - } else { - value += rt * Math.pow(2, 1 - eBias) - } - if (value * c >= 2) { - e++ - c /= 2 - } - - if (e + eBias >= eMax) { - m = 0 - e = eMax - } else if (e + eBias >= 1) { - m = (value * c - 1) * Math.pow(2, mLen) - e = e + eBias - } else { - m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) - e = 0 - } - } - - for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} - - e = (e << mLen) | m - eLen += mLen - for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} - - buffer[offset + i - d] |= s * 128 -} - -},{}],32:[function(require,module,exports){ -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor - } -} - -},{}],33:[function(require,module,exports){ -/*! - * Determine if an object is a Buffer - * - * @author Feross Aboukhadijeh - * @license MIT - */ - -// The _isBuffer check is for Safari 5-7 support, because it's missing -// Object.prototype.constructor. Remove this eventually -module.exports = function (obj) { - return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer) -} - -function isBuffer (obj) { - return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) -} - -// For Node v0.10 support. Remove this eventually. -function isSlowBuffer (obj) { - return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0)) -} - -},{}],34:[function(require,module,exports){ -var toString = {}.toString; - -module.exports = Array.isArray || function (arr) { - return toString.call(arr) == '[object Array]'; -}; - -},{}],35:[function(require,module,exports){ -'use strict'; - - -var TYPED_OK = (typeof Uint8Array !== 'undefined') && - (typeof Uint16Array !== 'undefined') && - (typeof Int32Array !== 'undefined'); - -function _has(obj, key) { - return Object.prototype.hasOwnProperty.call(obj, key); -} - -exports.assign = function (obj /*from1, from2, from3, ...*/) { - var sources = Array.prototype.slice.call(arguments, 1); - while (sources.length) { - var source = sources.shift(); - if (!source) { continue; } - - if (typeof source !== 'object') { - throw new TypeError(source + 'must be non-object'); - } - - for (var p in source) { - if (_has(source, p)) { - obj[p] = source[p]; - } - } - } - - return obj; -}; - - -// reduce buffer size, avoiding mem copy -exports.shrinkBuf = function (buf, size) { - if (buf.length === size) { return buf; } - if (buf.subarray) { return buf.subarray(0, size); } - buf.length = size; - return buf; -}; - - -var fnTyped = { - arraySet: function (dest, src, src_offs, len, dest_offs) { - if (src.subarray && dest.subarray) { - dest.set(src.subarray(src_offs, src_offs + len), dest_offs); - return; - } - // Fallback to ordinary array - for (var i = 0; i < len; i++) { - dest[dest_offs + i] = src[src_offs + i]; - } - }, - // Join array of chunks to single array. - flattenChunks: function (chunks) { - var i, l, len, pos, chunk, result; - - // calculate data length - len = 0; - for (i = 0, l = chunks.length; i < l; i++) { - len += chunks[i].length; - } - - // join chunks - result = new Uint8Array(len); - pos = 0; - for (i = 0, l = chunks.length; i < l; i++) { - chunk = chunks[i]; - result.set(chunk, pos); - pos += chunk.length; - } - - return result; - } -}; - -var fnUntyped = { - arraySet: function (dest, src, src_offs, len, dest_offs) { - for (var i = 0; i < len; i++) { - dest[dest_offs + i] = src[src_offs + i]; - } - }, - // Join array of chunks to single array. - flattenChunks: function (chunks) { - return [].concat.apply([], chunks); - } -}; - - -// Enable/Disable typed arrays use, for testing -// -exports.setTyped = function (on) { - if (on) { - exports.Buf8 = Uint8Array; - exports.Buf16 = Uint16Array; - exports.Buf32 = Int32Array; - exports.assign(exports, fnTyped); - } else { - exports.Buf8 = Array; - exports.Buf16 = Array; - exports.Buf32 = Array; - exports.assign(exports, fnUntyped); - } -}; - -exports.setTyped(TYPED_OK); - -},{}],36:[function(require,module,exports){ -'use strict'; - -// Note: adler32 takes 12% for level 0 and 2% for level 6. -// It isn't worth it to make additional optimizations as in original. -// Small size is preferable. - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -function adler32(adler, buf, len, pos) { - var s1 = (adler & 0xffff) |0, - s2 = ((adler >>> 16) & 0xffff) |0, - n = 0; - - while (len !== 0) { - // Set limit ~ twice less than 5552, to keep - // s2 in 31-bits, because we force signed ints. - // in other case %= will fail. - n = len > 2000 ? 2000 : len; - len -= n; - - do { - s1 = (s1 + buf[pos++]) |0; - s2 = (s2 + s1) |0; - } while (--n); - - s1 %= 65521; - s2 %= 65521; - } - - return (s1 | (s2 << 16)) |0; -} - - -module.exports = adler32; - -},{}],37:[function(require,module,exports){ -'use strict'; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -module.exports = { - - /* Allowed flush values; see deflate() and inflate() below for details */ - Z_NO_FLUSH: 0, - Z_PARTIAL_FLUSH: 1, - Z_SYNC_FLUSH: 2, - Z_FULL_FLUSH: 3, - Z_FINISH: 4, - Z_BLOCK: 5, - Z_TREES: 6, - - /* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ - Z_OK: 0, - Z_STREAM_END: 1, - Z_NEED_DICT: 2, - Z_ERRNO: -1, - Z_STREAM_ERROR: -2, - Z_DATA_ERROR: -3, - //Z_MEM_ERROR: -4, - Z_BUF_ERROR: -5, - //Z_VERSION_ERROR: -6, - - /* compression levels */ - Z_NO_COMPRESSION: 0, - Z_BEST_SPEED: 1, - Z_BEST_COMPRESSION: 9, - Z_DEFAULT_COMPRESSION: -1, - - - Z_FILTERED: 1, - Z_HUFFMAN_ONLY: 2, - Z_RLE: 3, - Z_FIXED: 4, - Z_DEFAULT_STRATEGY: 0, - - /* Possible values of the data_type field (though see inflate()) */ - Z_BINARY: 0, - Z_TEXT: 1, - //Z_ASCII: 1, // = Z_TEXT (deprecated) - Z_UNKNOWN: 2, - - /* The deflate compression method */ - Z_DEFLATED: 8 - //Z_NULL: null // Use -1 or null inline, depending on var type -}; - -},{}],38:[function(require,module,exports){ -'use strict'; - -// Note: we can't get significant speed boost here. -// So write code to minimize size - no pregenerated tables -// and array tools dependencies. - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -// Use ordinary array, since untyped makes no boost here -function makeTable() { - var c, table = []; - - for (var n = 0; n < 256; n++) { - c = n; - for (var k = 0; k < 8; k++) { - c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); - } - table[n] = c; - } - - return table; -} - -// Create table on load. Just 255 signed longs. Not a problem. -var crcTable = makeTable(); - - -function crc32(crc, buf, len, pos) { - var t = crcTable, - end = pos + len; - - crc ^= -1; - - for (var i = pos; i < end; i++) { - crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF]; - } - - return (crc ^ (-1)); // >>> 0; -} - - -module.exports = crc32; - -},{}],39:[function(require,module,exports){ -'use strict'; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -var utils = require('../utils/common'); -var trees = require('./trees'); -var adler32 = require('./adler32'); -var crc32 = require('./crc32'); -var msg = require('./messages'); - -/* Public constants ==========================================================*/ -/* ===========================================================================*/ - - -/* Allowed flush values; see deflate() and inflate() below for details */ -var Z_NO_FLUSH = 0; -var Z_PARTIAL_FLUSH = 1; -//var Z_SYNC_FLUSH = 2; -var Z_FULL_FLUSH = 3; -var Z_FINISH = 4; -var Z_BLOCK = 5; -//var Z_TREES = 6; - - -/* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ -var Z_OK = 0; -var Z_STREAM_END = 1; -//var Z_NEED_DICT = 2; -//var Z_ERRNO = -1; -var Z_STREAM_ERROR = -2; -var Z_DATA_ERROR = -3; -//var Z_MEM_ERROR = -4; -var Z_BUF_ERROR = -5; -//var Z_VERSION_ERROR = -6; - - -/* compression levels */ -//var Z_NO_COMPRESSION = 0; -//var Z_BEST_SPEED = 1; -//var Z_BEST_COMPRESSION = 9; -var Z_DEFAULT_COMPRESSION = -1; - - -var Z_FILTERED = 1; -var Z_HUFFMAN_ONLY = 2; -var Z_RLE = 3; -var Z_FIXED = 4; -var Z_DEFAULT_STRATEGY = 0; - -/* Possible values of the data_type field (though see inflate()) */ -//var Z_BINARY = 0; -//var Z_TEXT = 1; -//var Z_ASCII = 1; // = Z_TEXT -var Z_UNKNOWN = 2; - - -/* The deflate compression method */ -var Z_DEFLATED = 8; - -/*============================================================================*/ - - -var MAX_MEM_LEVEL = 9; -/* Maximum value for memLevel in deflateInit2 */ -var MAX_WBITS = 15; -/* 32K LZ77 window */ -var DEF_MEM_LEVEL = 8; - - -var LENGTH_CODES = 29; -/* number of length codes, not counting the special END_BLOCK code */ -var LITERALS = 256; -/* number of literal bytes 0..255 */ -var L_CODES = LITERALS + 1 + LENGTH_CODES; -/* number of Literal or Length codes, including the END_BLOCK code */ -var D_CODES = 30; -/* number of distance codes */ -var BL_CODES = 19; -/* number of codes used to transfer the bit lengths */ -var HEAP_SIZE = 2 * L_CODES + 1; -/* maximum heap size */ -var MAX_BITS = 15; -/* All codes must not exceed MAX_BITS bits */ - -var MIN_MATCH = 3; -var MAX_MATCH = 258; -var MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1); - -var PRESET_DICT = 0x20; - -var INIT_STATE = 42; -var EXTRA_STATE = 69; -var NAME_STATE = 73; -var COMMENT_STATE = 91; -var HCRC_STATE = 103; -var BUSY_STATE = 113; -var FINISH_STATE = 666; - -var BS_NEED_MORE = 1; /* block not completed, need more input or more output */ -var BS_BLOCK_DONE = 2; /* block flush performed */ -var BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */ -var BS_FINISH_DONE = 4; /* finish done, accept no more input or output */ - -var OS_CODE = 0x03; // Unix :) . Don't detect, use this default. - -function err(strm, errorCode) { - strm.msg = msg[errorCode]; - return errorCode; -} - -function rank(f) { - return ((f) << 1) - ((f) > 4 ? 9 : 0); -} - -function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } } - - -/* ========================================================================= - * Flush as much pending output as possible. All deflate() output goes - * through this function so some applications may wish to modify it - * to avoid allocating a large strm->output buffer and copying into it. - * (See also read_buf()). - */ -function flush_pending(strm) { - var s = strm.state; - - //_tr_flush_bits(s); - var len = s.pending; - if (len > strm.avail_out) { - len = strm.avail_out; - } - if (len === 0) { return; } - - utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out); - strm.next_out += len; - s.pending_out += len; - strm.total_out += len; - strm.avail_out -= len; - s.pending -= len; - if (s.pending === 0) { - s.pending_out = 0; - } -} - - -function flush_block_only(s, last) { - trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last); - s.block_start = s.strstart; - flush_pending(s.strm); -} - - -function put_byte(s, b) { - s.pending_buf[s.pending++] = b; -} - - -/* ========================================================================= - * Put a short in the pending buffer. The 16-bit value is put in MSB order. - * IN assertion: the stream state is correct and there is enough room in - * pending_buf. - */ -function putShortMSB(s, b) { -// put_byte(s, (Byte)(b >> 8)); -// put_byte(s, (Byte)(b & 0xff)); - s.pending_buf[s.pending++] = (b >>> 8) & 0xff; - s.pending_buf[s.pending++] = b & 0xff; -} - - -/* =========================================================================== - * Read a new buffer from the current input stream, update the adler32 - * and total number of bytes read. All deflate() input goes through - * this function so some applications may wish to modify it to avoid - * allocating a large strm->input buffer and copying from it. - * (See also flush_pending()). - */ -function read_buf(strm, buf, start, size) { - var len = strm.avail_in; - - if (len > size) { len = size; } - if (len === 0) { return 0; } - - strm.avail_in -= len; - - // zmemcpy(buf, strm->next_in, len); - utils.arraySet(buf, strm.input, strm.next_in, len, start); - if (strm.state.wrap === 1) { - strm.adler = adler32(strm.adler, buf, len, start); - } - - else if (strm.state.wrap === 2) { - strm.adler = crc32(strm.adler, buf, len, start); - } - - strm.next_in += len; - strm.total_in += len; - - return len; -} - - -/* =========================================================================== - * Set match_start to the longest match starting at the given string and - * return its length. Matches shorter or equal to prev_length are discarded, - * in which case the result is equal to prev_length and match_start is - * garbage. - * IN assertions: cur_match is the head of the hash chain for the current - * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 - * OUT assertion: the match length is not greater than s->lookahead. - */ -function longest_match(s, cur_match) { - var chain_length = s.max_chain_length; /* max hash chain length */ - var scan = s.strstart; /* current string */ - var match; /* matched string */ - var len; /* length of current match */ - var best_len = s.prev_length; /* best match length so far */ - var nice_match = s.nice_match; /* stop if match long enough */ - var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ? - s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/; - - var _win = s.window; // shortcut - - var wmask = s.w_mask; - var prev = s.prev; - - /* Stop when cur_match becomes <= limit. To simplify the code, - * we prevent matches with the string of window index 0. - */ - - var strend = s.strstart + MAX_MATCH; - var scan_end1 = _win[scan + best_len - 1]; - var scan_end = _win[scan + best_len]; - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - /* Do not waste too much time if we already have a good match: */ - if (s.prev_length >= s.good_match) { - chain_length >>= 2; - } - /* Do not look for matches beyond the end of the input. This is necessary - * to make deflate deterministic. - */ - if (nice_match > s.lookahead) { nice_match = s.lookahead; } - - // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); - - do { - // Assert(cur_match < s->strstart, "no future"); - match = cur_match; - - /* Skip to next match if the match length cannot increase - * or if the match length is less than 2. Note that the checks below - * for insufficient lookahead only occur occasionally for performance - * reasons. Therefore uninitialized memory will be accessed, and - * conditional jumps will be made that depend on those values. - * However the length of the match is limited to the lookahead, so - * the output of deflate is not affected by the uninitialized values. - */ - - if (_win[match + best_len] !== scan_end || - _win[match + best_len - 1] !== scan_end1 || - _win[match] !== _win[scan] || - _win[++match] !== _win[scan + 1]) { - continue; - } - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2; - match++; - // Assert(*scan == *match, "match[2]?"); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - /*jshint noempty:false*/ - } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && - _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && - _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && - _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && - scan < strend); - - // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - - len = MAX_MATCH - (strend - scan); - scan = strend - MAX_MATCH; - - if (len > best_len) { - s.match_start = cur_match; - best_len = len; - if (len >= nice_match) { - break; - } - scan_end1 = _win[scan + best_len - 1]; - scan_end = _win[scan + best_len]; - } - } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0); - - if (best_len <= s.lookahead) { - return best_len; - } - return s.lookahead; -} - - -/* =========================================================================== - * Fill the window when the lookahead becomes insufficient. - * Updates strstart and lookahead. - * - * IN assertion: lookahead < MIN_LOOKAHEAD - * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD - * At least one byte has been read, or avail_in == 0; reads are - * performed for at least two bytes (required for the zip translate_eol - * option -- not supported here). - */ -function fill_window(s) { - var _w_size = s.w_size; - var p, n, m, more, str; - - //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); - - do { - more = s.window_size - s.lookahead - s.strstart; - - // JS ints have 32 bit, block below not needed - /* Deal with !@#$% 64K limit: */ - //if (sizeof(int) <= 2) { - // if (more == 0 && s->strstart == 0 && s->lookahead == 0) { - // more = wsize; - // - // } else if (more == (unsigned)(-1)) { - // /* Very unlikely, but possible on 16 bit machine if - // * strstart == 0 && lookahead == 1 (input done a byte at time) - // */ - // more--; - // } - //} - - - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) { - - utils.arraySet(s.window, s.window, _w_size, _w_size, 0); - s.match_start -= _w_size; - s.strstart -= _w_size; - /* we now have strstart >= MAX_DIST */ - s.block_start -= _w_size; - - /* Slide the hash table (could be avoided with 32 bit values - at the expense of memory usage). We slide even when level == 0 - to keep the hash table consistent if we switch back to level > 0 - later. (Using level 0 permanently is not an optimal usage of - zlib, so we don't care about this pathological case.) - */ - - n = s.hash_size; - p = n; - do { - m = s.head[--p]; - s.head[p] = (m >= _w_size ? m - _w_size : 0); - } while (--n); - - n = _w_size; - p = n; - do { - m = s.prev[--p]; - s.prev[p] = (m >= _w_size ? m - _w_size : 0); - /* If n is not on any hash chain, prev[n] is garbage but - * its value will never be used. - */ - } while (--n); - - more += _w_size; - } - if (s.strm.avail_in === 0) { - break; - } - - /* If there was no sliding: - * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - * more == window_size - lookahead - strstart - * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - * => more >= window_size - 2*WSIZE + 2 - * In the BIG_MEM or MMAP case (not yet supported), - * window_size == input_size + MIN_LOOKAHEAD && - * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - * Otherwise, window_size == 2*WSIZE so more >= 2. - * If there was sliding, more >= WSIZE. So in all cases, more >= 2. - */ - //Assert(more >= 2, "more < 2"); - n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more); - s.lookahead += n; - - /* Initialize the hash value now that we have some input: */ - if (s.lookahead + s.insert >= MIN_MATCH) { - str = s.strstart - s.insert; - s.ins_h = s.window[str]; - - /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */ - s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask; -//#if MIN_MATCH != 3 -// Call update_hash() MIN_MATCH-3 more times -//#endif - while (s.insert) { - /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ - s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask; - - s.prev[str & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = str; - str++; - s.insert--; - if (s.lookahead + s.insert < MIN_MATCH) { - break; - } - } - } - /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - * but this is not important since only literal bytes will be emitted. - */ - - } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0); - - /* If the WIN_INIT bytes after the end of the current data have never been - * written, then zero those bytes in order to avoid memory check reports of - * the use of uninitialized (or uninitialised as Julian writes) bytes by - * the longest match routines. Update the high water mark for the next - * time through here. WIN_INIT is set to MAX_MATCH since the longest match - * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. - */ -// if (s.high_water < s.window_size) { -// var curr = s.strstart + s.lookahead; -// var init = 0; -// -// if (s.high_water < curr) { -// /* Previous high water mark below current data -- zero WIN_INIT -// * bytes or up to end of window, whichever is less. -// */ -// init = s.window_size - curr; -// if (init > WIN_INIT) -// init = WIN_INIT; -// zmemzero(s->window + curr, (unsigned)init); -// s->high_water = curr + init; -// } -// else if (s->high_water < (ulg)curr + WIN_INIT) { -// /* High water mark at or above current data, but below current data -// * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up -// * to end of window, whichever is less. -// */ -// init = (ulg)curr + WIN_INIT - s->high_water; -// if (init > s->window_size - s->high_water) -// init = s->window_size - s->high_water; -// zmemzero(s->window + s->high_water, (unsigned)init); -// s->high_water += init; -// } -// } -// -// Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, -// "not enough room for search"); -} - -/* =========================================================================== - * Copy without compression as much as possible from the input stream, return - * the current block state. - * This function does not insert new strings in the dictionary since - * uncompressible data is probably not useful. This function is used - * only for the level=0 compression option. - * NOTE: this function should be optimized to avoid extra copying from - * window to pending_buf. - */ -function deflate_stored(s, flush) { - /* Stored blocks are limited to 0xffff bytes, pending_buf is limited - * to pending_buf_size, and each stored block has a 5 byte header: - */ - var max_block_size = 0xffff; - - if (max_block_size > s.pending_buf_size - 5) { - max_block_size = s.pending_buf_size - 5; - } - - /* Copy as much as possible from input to output: */ - for (;;) { - /* Fill the window as much as possible: */ - if (s.lookahead <= 1) { - - //Assert(s->strstart < s->w_size+MAX_DIST(s) || - // s->block_start >= (long)s->w_size, "slide too late"); -// if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) || -// s.block_start >= s.w_size)) { -// throw new Error("slide too late"); -// } - - fill_window(s); - if (s.lookahead === 0 && flush === Z_NO_FLUSH) { - return BS_NEED_MORE; - } - - if (s.lookahead === 0) { - break; - } - /* flush the current block */ - } - //Assert(s->block_start >= 0L, "block gone"); -// if (s.block_start < 0) throw new Error("block gone"); - - s.strstart += s.lookahead; - s.lookahead = 0; - - /* Emit a stored block if pending_buf will be full: */ - var max_start = s.block_start + max_block_size; - - if (s.strstart === 0 || s.strstart >= max_start) { - /* strstart == 0 is possible when wraparound on 16-bit machine */ - s.lookahead = s.strstart - max_start; - s.strstart = max_start; - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - - - } - /* Flush if we may have to slide, otherwise block_start may become - * negative and the data will be gone: - */ - if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - - s.insert = 0; - - if (flush === Z_FINISH) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - - if (s.strstart > s.block_start) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - - return BS_NEED_MORE; -} - -/* =========================================================================== - * Compress as much as possible from the input stream, return the current - * block state. - * This function does not perform lazy evaluation of matches and inserts - * new strings in the dictionary only for unmatched strings or for short - * matches. It is used only for the fast compression options. - */ -function deflate_fast(s, flush) { - var hash_head; /* head of the hash chain */ - var bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s.lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { - break; /* flush the current block */ - } - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = 0/*NIL*/; - if (s.lookahead >= MIN_MATCH) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - - /* Find the longest match, discarding those <= prev_length. - * At this point we have always match_length < MIN_MATCH - */ - if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s.match_length = longest_match(s, hash_head); - /* longest_match() sets match_start */ - } - if (s.match_length >= MIN_MATCH) { - // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only - - /*** _tr_tally_dist(s, s.strstart - s.match_start, - s.match_length - MIN_MATCH, bflush); ***/ - bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH); - - s.lookahead -= s.match_length; - - /* Insert new strings in the hash table only if the match length - * is not too large. This saves time but degrades compression. - */ - if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) { - s.match_length--; /* string at strstart already in table */ - do { - s.strstart++; - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - /* strstart never exceeds WSIZE-MAX_MATCH, so there are - * always MIN_MATCH bytes ahead. - */ - } while (--s.match_length !== 0); - s.strstart++; - } else - { - s.strstart += s.match_length; - s.match_length = 0; - s.ins_h = s.window[s.strstart]; - /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */ - s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask; - -//#if MIN_MATCH != 3 -// Call UPDATE_HASH() MIN_MATCH-3 more times -//#endif - /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not - * matter since it will be recomputed at next deflate call. - */ - } - } else { - /* No match, output a literal byte */ - //Tracevv((stderr,"%c", s.window[s.strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = trees._tr_tally(s, 0, s.window[s.strstart]); - - s.lookahead--; - s.strstart++; - } - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1); - if (flush === Z_FINISH) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.last_lit) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_BLOCK_DONE; -} - -/* =========================================================================== - * Same as above, but achieves better compression. We use a lazy - * evaluation for matches: a match is finally adopted only if there is - * no better match at the next window position. - */ -function deflate_slow(s, flush) { - var hash_head; /* head of hash chain */ - var bflush; /* set if current block must be flushed */ - - var max_insert; - - /* Process the input block. */ - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s.lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { break; } /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = 0/*NIL*/; - if (s.lookahead >= MIN_MATCH) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - - /* Find the longest match, discarding those <= prev_length. - */ - s.prev_length = s.match_length; - s.prev_match = s.match_start; - s.match_length = MIN_MATCH - 1; - - if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match && - s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s.match_length = longest_match(s, hash_head); - /* longest_match() sets match_start */ - - if (s.match_length <= 5 && - (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) { - - /* If prev_match is also MIN_MATCH, match_start is garbage - * but we will ignore the current match anyway. - */ - s.match_length = MIN_MATCH - 1; - } - } - /* If there was a match at the previous step and the current - * match is not better, output the previous match: - */ - if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) { - max_insert = s.strstart + s.lookahead - MIN_MATCH; - /* Do not insert strings in hash table beyond this. */ - - //check_match(s, s.strstart-1, s.prev_match, s.prev_length); - - /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match, - s.prev_length - MIN_MATCH, bflush);***/ - bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH); - /* Insert in hash table all strings up to the end of the match. - * strstart-1 and strstart are already inserted. If there is not - * enough lookahead, the last two strings are not inserted in - * the hash table. - */ - s.lookahead -= s.prev_length - 1; - s.prev_length -= 2; - do { - if (++s.strstart <= max_insert) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - } while (--s.prev_length !== 0); - s.match_available = 0; - s.match_length = MIN_MATCH - 1; - s.strstart++; - - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - - } else if (s.match_available) { - /* If there was no match at the previous position, output a - * single literal. If there was a match but the current match - * is longer, truncate the previous match to a single literal. - */ - //Tracevv((stderr,"%c", s->window[s->strstart-1])); - /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ - bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]); - - if (bflush) { - /*** FLUSH_BLOCK_ONLY(s, 0) ***/ - flush_block_only(s, false); - /***/ - } - s.strstart++; - s.lookahead--; - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - } else { - /* There is no previous match to compare with, wait for - * the next step to decide. - */ - s.match_available = 1; - s.strstart++; - s.lookahead--; - } - } - //Assert (flush != Z_NO_FLUSH, "no flush?"); - if (s.match_available) { - //Tracevv((stderr,"%c", s->window[s->strstart-1])); - /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ - bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]); - - s.match_available = 0; - } - s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1; - if (flush === Z_FINISH) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.last_lit) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - - return BS_BLOCK_DONE; -} - - -/* =========================================================================== - * For Z_RLE, simply look for runs of bytes, generate matches only of distance - * one. Do not maintain a hash table. (It will be regenerated if this run of - * deflate switches away from Z_RLE.) - */ -function deflate_rle(s, flush) { - var bflush; /* set if current block must be flushed */ - var prev; /* byte at distance one to match */ - var scan, strend; /* scan goes up to strend for length of run */ - - var _win = s.window; - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the longest run, plus one for the unrolled loop. - */ - if (s.lookahead <= MAX_MATCH) { - fill_window(s); - if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { break; } /* flush the current block */ - } - - /* See how many times the previous byte repeats */ - s.match_length = 0; - if (s.lookahead >= MIN_MATCH && s.strstart > 0) { - scan = s.strstart - 1; - prev = _win[scan]; - if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) { - strend = s.strstart + MAX_MATCH; - do { - /*jshint noempty:false*/ - } while (prev === _win[++scan] && prev === _win[++scan] && - prev === _win[++scan] && prev === _win[++scan] && - prev === _win[++scan] && prev === _win[++scan] && - prev === _win[++scan] && prev === _win[++scan] && - scan < strend); - s.match_length = MAX_MATCH - (strend - scan); - if (s.match_length > s.lookahead) { - s.match_length = s.lookahead; - } - } - //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); - } - - /* Emit match if have run of MIN_MATCH or longer, else emit literal */ - if (s.match_length >= MIN_MATCH) { - //check_match(s, s.strstart, s.strstart - 1, s.match_length); - - /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/ - bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH); - - s.lookahead -= s.match_length; - s.strstart += s.match_length; - s.match_length = 0; - } else { - /* No match, output a literal byte */ - //Tracevv((stderr,"%c", s->window[s->strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = trees._tr_tally(s, 0, s.window[s.strstart]); - - s.lookahead--; - s.strstart++; - } - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - s.insert = 0; - if (flush === Z_FINISH) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.last_lit) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_BLOCK_DONE; -} - -/* =========================================================================== - * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. - * (It will be regenerated if this run of deflate switches away from Huffman.) - */ -function deflate_huff(s, flush) { - var bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we have a literal to write. */ - if (s.lookahead === 0) { - fill_window(s); - if (s.lookahead === 0) { - if (flush === Z_NO_FLUSH) { - return BS_NEED_MORE; - } - break; /* flush the current block */ - } - } - - /* Output a literal byte */ - s.match_length = 0; - //Tracevv((stderr,"%c", s->window[s->strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = trees._tr_tally(s, 0, s.window[s.strstart]); - s.lookahead--; - s.strstart++; - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - s.insert = 0; - if (flush === Z_FINISH) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.last_lit) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_BLOCK_DONE; -} - -/* Values for max_lazy_match, good_match and max_chain_length, depending on - * the desired pack level (0..9). The values given below have been tuned to - * exclude worst case performance for pathological files. Better values may be - * found for specific files. - */ -function Config(good_length, max_lazy, nice_length, max_chain, func) { - this.good_length = good_length; - this.max_lazy = max_lazy; - this.nice_length = nice_length; - this.max_chain = max_chain; - this.func = func; -} - -var configuration_table; - -configuration_table = [ - /* good lazy nice chain */ - new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */ - new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */ - new Config(4, 5, 16, 8, deflate_fast), /* 2 */ - new Config(4, 6, 32, 32, deflate_fast), /* 3 */ - - new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */ - new Config(8, 16, 32, 32, deflate_slow), /* 5 */ - new Config(8, 16, 128, 128, deflate_slow), /* 6 */ - new Config(8, 32, 128, 256, deflate_slow), /* 7 */ - new Config(32, 128, 258, 1024, deflate_slow), /* 8 */ - new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */ -]; - - -/* =========================================================================== - * Initialize the "longest match" routines for a new zlib stream - */ -function lm_init(s) { - s.window_size = 2 * s.w_size; - - /*** CLEAR_HASH(s); ***/ - zero(s.head); // Fill with NIL (= 0); - - /* Set the default configuration parameters: - */ - s.max_lazy_match = configuration_table[s.level].max_lazy; - s.good_match = configuration_table[s.level].good_length; - s.nice_match = configuration_table[s.level].nice_length; - s.max_chain_length = configuration_table[s.level].max_chain; - - s.strstart = 0; - s.block_start = 0; - s.lookahead = 0; - s.insert = 0; - s.match_length = s.prev_length = MIN_MATCH - 1; - s.match_available = 0; - s.ins_h = 0; -} - - -function DeflateState() { - this.strm = null; /* pointer back to this zlib stream */ - this.status = 0; /* as the name implies */ - this.pending_buf = null; /* output still pending */ - this.pending_buf_size = 0; /* size of pending_buf */ - this.pending_out = 0; /* next pending byte to output to the stream */ - this.pending = 0; /* nb of bytes in the pending buffer */ - this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ - this.gzhead = null; /* gzip header information to write */ - this.gzindex = 0; /* where in extra, name, or comment */ - this.method = Z_DEFLATED; /* can only be DEFLATED */ - this.last_flush = -1; /* value of flush param for previous deflate call */ - - this.w_size = 0; /* LZ77 window size (32K by default) */ - this.w_bits = 0; /* log2(w_size) (8..16) */ - this.w_mask = 0; /* w_size - 1 */ - - this.window = null; - /* Sliding window. Input bytes are read into the second half of the window, - * and move to the first half later to keep a dictionary of at least wSize - * bytes. With this organization, matches are limited to a distance of - * wSize-MAX_MATCH bytes, but this ensures that IO is always - * performed with a length multiple of the block size. - */ - - this.window_size = 0; - /* Actual size of window: 2*wSize, except when the user input buffer - * is directly used as sliding window. - */ - - this.prev = null; - /* Link to older string with same hash index. To limit the size of this - * array to 64K, this link is maintained only for the last 32K strings. - * An index in this array is thus a window index modulo 32K. - */ - - this.head = null; /* Heads of the hash chains or NIL. */ - - this.ins_h = 0; /* hash index of string to be inserted */ - this.hash_size = 0; /* number of elements in hash table */ - this.hash_bits = 0; /* log2(hash_size) */ - this.hash_mask = 0; /* hash_size-1 */ - - this.hash_shift = 0; - /* Number of bits by which ins_h must be shifted at each input - * step. It must be such that after MIN_MATCH steps, the oldest - * byte no longer takes part in the hash key, that is: - * hash_shift * MIN_MATCH >= hash_bits - */ - - this.block_start = 0; - /* Window position at the beginning of the current output block. Gets - * negative when the window is moved backwards. - */ - - this.match_length = 0; /* length of best match */ - this.prev_match = 0; /* previous match */ - this.match_available = 0; /* set if previous match exists */ - this.strstart = 0; /* start of string to insert */ - this.match_start = 0; /* start of matching string */ - this.lookahead = 0; /* number of valid bytes ahead in window */ - - this.prev_length = 0; - /* Length of the best match at previous step. Matches not greater than this - * are discarded. This is used in the lazy match evaluation. - */ - - this.max_chain_length = 0; - /* To speed up deflation, hash chains are never searched beyond this - * length. A higher limit improves compression ratio but degrades the - * speed. - */ - - this.max_lazy_match = 0; - /* Attempt to find a better match only when the current match is strictly - * smaller than this value. This mechanism is used only for compression - * levels >= 4. - */ - // That's alias to max_lazy_match, don't use directly - //this.max_insert_length = 0; - /* Insert new strings in the hash table only if the match length is not - * greater than this length. This saves time but degrades compression. - * max_insert_length is used only for compression levels <= 3. - */ - - this.level = 0; /* compression level (1..9) */ - this.strategy = 0; /* favor or force Huffman coding*/ - - this.good_match = 0; - /* Use a faster search when the previous match is longer than this */ - - this.nice_match = 0; /* Stop searching when current match exceeds this */ - - /* used by trees.c: */ - - /* Didn't use ct_data typedef below to suppress compiler warning */ - - // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ - // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ - // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ - - // Use flat array of DOUBLE size, with interleaved fata, - // because JS does not support effective - this.dyn_ltree = new utils.Buf16(HEAP_SIZE * 2); - this.dyn_dtree = new utils.Buf16((2 * D_CODES + 1) * 2); - this.bl_tree = new utils.Buf16((2 * BL_CODES + 1) * 2); - zero(this.dyn_ltree); - zero(this.dyn_dtree); - zero(this.bl_tree); - - this.l_desc = null; /* desc. for literal tree */ - this.d_desc = null; /* desc. for distance tree */ - this.bl_desc = null; /* desc. for bit length tree */ - - //ush bl_count[MAX_BITS+1]; - this.bl_count = new utils.Buf16(MAX_BITS + 1); - /* number of codes at each bit length for an optimal tree */ - - //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ - this.heap = new utils.Buf16(2 * L_CODES + 1); /* heap used to build the Huffman trees */ - zero(this.heap); - - this.heap_len = 0; /* number of elements in the heap */ - this.heap_max = 0; /* element of largest frequency */ - /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. - * The same heap array is used to build all trees. - */ - - this.depth = new utils.Buf16(2 * L_CODES + 1); //uch depth[2*L_CODES+1]; - zero(this.depth); - /* Depth of each subtree used as tie breaker for trees of equal frequency - */ - - this.l_buf = 0; /* buffer index for literals or lengths */ - - this.lit_bufsize = 0; - /* Size of match buffer for literals/lengths. There are 4 reasons for - * limiting lit_bufsize to 64K: - * - frequencies can be kept in 16 bit counters - * - if compression is not successful for the first block, all input - * data is still in the window so we can still emit a stored block even - * when input comes from standard input. (This can also be done for - * all blocks if lit_bufsize is not greater than 32K.) - * - if compression is not successful for a file smaller than 64K, we can - * even emit a stored file instead of a stored block (saving 5 bytes). - * This is applicable only for zip (not gzip or zlib). - * - creating new Huffman trees less frequently may not provide fast - * adaptation to changes in the input data statistics. (Take for - * example a binary file with poorly compressible code followed by - * a highly compressible string table.) Smaller buffer sizes give - * fast adaptation but have of course the overhead of transmitting - * trees more frequently. - * - I can't count above 4 - */ - - this.last_lit = 0; /* running index in l_buf */ - - this.d_buf = 0; - /* Buffer index for distances. To simplify the code, d_buf and l_buf have - * the same number of elements. To use different lengths, an extra flag - * array would be necessary. - */ - - this.opt_len = 0; /* bit length of current block with optimal trees */ - this.static_len = 0; /* bit length of current block with static trees */ - this.matches = 0; /* number of string matches in current block */ - this.insert = 0; /* bytes at end of window left to insert */ - - - this.bi_buf = 0; - /* Output buffer. bits are inserted starting at the bottom (least - * significant bits). - */ - this.bi_valid = 0; - /* Number of valid bits in bi_buf. All bits above the last valid bit - * are always zero. - */ - - // Used for window memory init. We safely ignore it for JS. That makes - // sense only for pointers and memory check tools. - //this.high_water = 0; - /* High water mark offset in window for initialized bytes -- bytes above - * this are set to zero in order to avoid memory check warnings when - * longest match routines access bytes past the input. This is then - * updated to the new high water mark. - */ -} - - -function deflateResetKeep(strm) { - var s; - - if (!strm || !strm.state) { - return err(strm, Z_STREAM_ERROR); - } - - strm.total_in = strm.total_out = 0; - strm.data_type = Z_UNKNOWN; - - s = strm.state; - s.pending = 0; - s.pending_out = 0; - - if (s.wrap < 0) { - s.wrap = -s.wrap; - /* was made negative by deflate(..., Z_FINISH); */ - } - s.status = (s.wrap ? INIT_STATE : BUSY_STATE); - strm.adler = (s.wrap === 2) ? - 0 // crc32(0, Z_NULL, 0) - : - 1; // adler32(0, Z_NULL, 0) - s.last_flush = Z_NO_FLUSH; - trees._tr_init(s); - return Z_OK; -} - - -function deflateReset(strm) { - var ret = deflateResetKeep(strm); - if (ret === Z_OK) { - lm_init(strm.state); - } - return ret; -} - - -function deflateSetHeader(strm, head) { - if (!strm || !strm.state) { return Z_STREAM_ERROR; } - if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; } - strm.state.gzhead = head; - return Z_OK; -} - - -function deflateInit2(strm, level, method, windowBits, memLevel, strategy) { - if (!strm) { // === Z_NULL - return Z_STREAM_ERROR; - } - var wrap = 1; - - if (level === Z_DEFAULT_COMPRESSION) { - level = 6; - } - - if (windowBits < 0) { /* suppress zlib wrapper */ - wrap = 0; - windowBits = -windowBits; - } - - else if (windowBits > 15) { - wrap = 2; /* write gzip wrapper instead */ - windowBits -= 16; - } - - - if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED || - windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || - strategy < 0 || strategy > Z_FIXED) { - return err(strm, Z_STREAM_ERROR); - } - - - if (windowBits === 8) { - windowBits = 9; - } - /* until 256-byte window bug fixed */ - - var s = new DeflateState(); - - strm.state = s; - s.strm = strm; - - s.wrap = wrap; - s.gzhead = null; - s.w_bits = windowBits; - s.w_size = 1 << s.w_bits; - s.w_mask = s.w_size - 1; - - s.hash_bits = memLevel + 7; - s.hash_size = 1 << s.hash_bits; - s.hash_mask = s.hash_size - 1; - s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH); - - s.window = new utils.Buf8(s.w_size * 2); - s.head = new utils.Buf16(s.hash_size); - s.prev = new utils.Buf16(s.w_size); - - // Don't need mem init magic for JS. - //s.high_water = 0; /* nothing written to s->window yet */ - - s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ - - s.pending_buf_size = s.lit_bufsize * 4; - - //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); - //s->pending_buf = (uchf *) overlay; - s.pending_buf = new utils.Buf8(s.pending_buf_size); - - // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`) - //s->d_buf = overlay + s->lit_bufsize/sizeof(ush); - s.d_buf = 1 * s.lit_bufsize; - - //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; - s.l_buf = (1 + 2) * s.lit_bufsize; - - s.level = level; - s.strategy = strategy; - s.method = method; - - return deflateReset(strm); -} - -function deflateInit(strm, level) { - return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY); -} - - -function deflate(strm, flush) { - var old_flush, s; - var beg, val; // for gzip header write only - - if (!strm || !strm.state || - flush > Z_BLOCK || flush < 0) { - return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR; - } - - s = strm.state; - - if (!strm.output || - (!strm.input && strm.avail_in !== 0) || - (s.status === FINISH_STATE && flush !== Z_FINISH)) { - return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR); - } - - s.strm = strm; /* just in case */ - old_flush = s.last_flush; - s.last_flush = flush; - - /* Write the header */ - if (s.status === INIT_STATE) { - - if (s.wrap === 2) { // GZIP header - strm.adler = 0; //crc32(0L, Z_NULL, 0); - put_byte(s, 31); - put_byte(s, 139); - put_byte(s, 8); - if (!s.gzhead) { // s->gzhead == Z_NULL - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, s.level === 9 ? 2 : - (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? - 4 : 0)); - put_byte(s, OS_CODE); - s.status = BUSY_STATE; - } - else { - put_byte(s, (s.gzhead.text ? 1 : 0) + - (s.gzhead.hcrc ? 2 : 0) + - (!s.gzhead.extra ? 0 : 4) + - (!s.gzhead.name ? 0 : 8) + - (!s.gzhead.comment ? 0 : 16) - ); - put_byte(s, s.gzhead.time & 0xff); - put_byte(s, (s.gzhead.time >> 8) & 0xff); - put_byte(s, (s.gzhead.time >> 16) & 0xff); - put_byte(s, (s.gzhead.time >> 24) & 0xff); - put_byte(s, s.level === 9 ? 2 : - (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? - 4 : 0)); - put_byte(s, s.gzhead.os & 0xff); - if (s.gzhead.extra && s.gzhead.extra.length) { - put_byte(s, s.gzhead.extra.length & 0xff); - put_byte(s, (s.gzhead.extra.length >> 8) & 0xff); - } - if (s.gzhead.hcrc) { - strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0); - } - s.gzindex = 0; - s.status = EXTRA_STATE; - } - } - else // DEFLATE header - { - var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8; - var level_flags = -1; - - if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) { - level_flags = 0; - } else if (s.level < 6) { - level_flags = 1; - } else if (s.level === 6) { - level_flags = 2; - } else { - level_flags = 3; - } - header |= (level_flags << 6); - if (s.strstart !== 0) { header |= PRESET_DICT; } - header += 31 - (header % 31); - - s.status = BUSY_STATE; - putShortMSB(s, header); - - /* Save the adler32 of the preset dictionary: */ - if (s.strstart !== 0) { - putShortMSB(s, strm.adler >>> 16); - putShortMSB(s, strm.adler & 0xffff); - } - strm.adler = 1; // adler32(0L, Z_NULL, 0); - } - } - -//#ifdef GZIP - if (s.status === EXTRA_STATE) { - if (s.gzhead.extra/* != Z_NULL*/) { - beg = s.pending; /* start of bytes to update crc */ - - while (s.gzindex < (s.gzhead.extra.length & 0xffff)) { - if (s.pending === s.pending_buf_size) { - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); - } - flush_pending(strm); - beg = s.pending; - if (s.pending === s.pending_buf_size) { - break; - } - } - put_byte(s, s.gzhead.extra[s.gzindex] & 0xff); - s.gzindex++; - } - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); - } - if (s.gzindex === s.gzhead.extra.length) { - s.gzindex = 0; - s.status = NAME_STATE; - } - } - else { - s.status = NAME_STATE; - } - } - if (s.status === NAME_STATE) { - if (s.gzhead.name/* != Z_NULL*/) { - beg = s.pending; /* start of bytes to update crc */ - //int val; - - do { - if (s.pending === s.pending_buf_size) { - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); - } - flush_pending(strm); - beg = s.pending; - if (s.pending === s.pending_buf_size) { - val = 1; - break; - } - } - // JS specific: little magic to add zero terminator to end of string - if (s.gzindex < s.gzhead.name.length) { - val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff; - } else { - val = 0; - } - put_byte(s, val); - } while (val !== 0); - - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); - } - if (val === 0) { - s.gzindex = 0; - s.status = COMMENT_STATE; - } - } - else { - s.status = COMMENT_STATE; - } - } - if (s.status === COMMENT_STATE) { - if (s.gzhead.comment/* != Z_NULL*/) { - beg = s.pending; /* start of bytes to update crc */ - //int val; - - do { - if (s.pending === s.pending_buf_size) { - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); - } - flush_pending(strm); - beg = s.pending; - if (s.pending === s.pending_buf_size) { - val = 1; - break; - } - } - // JS specific: little magic to add zero terminator to end of string - if (s.gzindex < s.gzhead.comment.length) { - val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff; - } else { - val = 0; - } - put_byte(s, val); - } while (val !== 0); - - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); - } - if (val === 0) { - s.status = HCRC_STATE; - } - } - else { - s.status = HCRC_STATE; - } - } - if (s.status === HCRC_STATE) { - if (s.gzhead.hcrc) { - if (s.pending + 2 > s.pending_buf_size) { - flush_pending(strm); - } - if (s.pending + 2 <= s.pending_buf_size) { - put_byte(s, strm.adler & 0xff); - put_byte(s, (strm.adler >> 8) & 0xff); - strm.adler = 0; //crc32(0L, Z_NULL, 0); - s.status = BUSY_STATE; - } - } - else { - s.status = BUSY_STATE; - } - } -//#endif - - /* Flush as much pending output as possible */ - if (s.pending !== 0) { - flush_pending(strm); - if (strm.avail_out === 0) { - /* Since avail_out is 0, deflate will be called again with - * more output space, but possibly with both pending and - * avail_in equal to zero. There won't be anything to do, - * but this is not an error situation so make sure we - * return OK instead of BUF_ERROR at next call of deflate: - */ - s.last_flush = -1; - return Z_OK; - } - - /* Make sure there is something to do and avoid duplicate consecutive - * flushes. For repeated and useless calls with Z_FINISH, we keep - * returning Z_STREAM_END instead of Z_BUF_ERROR. - */ - } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) && - flush !== Z_FINISH) { - return err(strm, Z_BUF_ERROR); - } - - /* User must not provide more input after the first FINISH: */ - if (s.status === FINISH_STATE && strm.avail_in !== 0) { - return err(strm, Z_BUF_ERROR); - } - - /* Start a new block or continue the current one. - */ - if (strm.avail_in !== 0 || s.lookahead !== 0 || - (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) { - var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) : - (s.strategy === Z_RLE ? deflate_rle(s, flush) : - configuration_table[s.level].func(s, flush)); - - if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) { - s.status = FINISH_STATE; - } - if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) { - if (strm.avail_out === 0) { - s.last_flush = -1; - /* avoid BUF_ERROR next call, see above */ - } - return Z_OK; - /* If flush != Z_NO_FLUSH && avail_out == 0, the next call - * of deflate should use the same flush parameter to make sure - * that the flush is complete. So we don't have to output an - * empty block here, this will be done at next call. This also - * ensures that for a very small output buffer, we emit at most - * one empty block. - */ - } - if (bstate === BS_BLOCK_DONE) { - if (flush === Z_PARTIAL_FLUSH) { - trees._tr_align(s); - } - else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ - - trees._tr_stored_block(s, 0, 0, false); - /* For a full flush, this empty block will be recognized - * as a special marker by inflate_sync(). - */ - if (flush === Z_FULL_FLUSH) { - /*** CLEAR_HASH(s); ***/ /* forget history */ - zero(s.head); // Fill with NIL (= 0); - - if (s.lookahead === 0) { - s.strstart = 0; - s.block_start = 0; - s.insert = 0; - } - } - } - flush_pending(strm); - if (strm.avail_out === 0) { - s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */ - return Z_OK; - } - } - } - //Assert(strm->avail_out > 0, "bug2"); - //if (strm.avail_out <= 0) { throw new Error("bug2");} - - if (flush !== Z_FINISH) { return Z_OK; } - if (s.wrap <= 0) { return Z_STREAM_END; } - - /* Write the trailer */ - if (s.wrap === 2) { - put_byte(s, strm.adler & 0xff); - put_byte(s, (strm.adler >> 8) & 0xff); - put_byte(s, (strm.adler >> 16) & 0xff); - put_byte(s, (strm.adler >> 24) & 0xff); - put_byte(s, strm.total_in & 0xff); - put_byte(s, (strm.total_in >> 8) & 0xff); - put_byte(s, (strm.total_in >> 16) & 0xff); - put_byte(s, (strm.total_in >> 24) & 0xff); - } - else - { - putShortMSB(s, strm.adler >>> 16); - putShortMSB(s, strm.adler & 0xffff); - } - - flush_pending(strm); - /* If avail_out is zero, the application will call deflate again - * to flush the rest. - */ - if (s.wrap > 0) { s.wrap = -s.wrap; } - /* write the trailer only once! */ - return s.pending !== 0 ? Z_OK : Z_STREAM_END; -} - -function deflateEnd(strm) { - var status; - - if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) { - return Z_STREAM_ERROR; - } - - status = strm.state.status; - if (status !== INIT_STATE && - status !== EXTRA_STATE && - status !== NAME_STATE && - status !== COMMENT_STATE && - status !== HCRC_STATE && - status !== BUSY_STATE && - status !== FINISH_STATE - ) { - return err(strm, Z_STREAM_ERROR); - } - - strm.state = null; - - return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK; -} - - -/* ========================================================================= - * Initializes the compression dictionary from the given byte - * sequence without producing any compressed output. - */ -function deflateSetDictionary(strm, dictionary) { - var dictLength = dictionary.length; - - var s; - var str, n; - var wrap; - var avail; - var next; - var input; - var tmpDict; - - if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) { - return Z_STREAM_ERROR; - } - - s = strm.state; - wrap = s.wrap; - - if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) { - return Z_STREAM_ERROR; - } - - /* when using zlib wrappers, compute Adler-32 for provided dictionary */ - if (wrap === 1) { - /* adler32(strm->adler, dictionary, dictLength); */ - strm.adler = adler32(strm.adler, dictionary, dictLength, 0); - } - - s.wrap = 0; /* avoid computing Adler-32 in read_buf */ - - /* if dictionary would fill window, just replace the history */ - if (dictLength >= s.w_size) { - if (wrap === 0) { /* already empty otherwise */ - /*** CLEAR_HASH(s); ***/ - zero(s.head); // Fill with NIL (= 0); - s.strstart = 0; - s.block_start = 0; - s.insert = 0; - } - /* use the tail */ - // dictionary = dictionary.slice(dictLength - s.w_size); - tmpDict = new utils.Buf8(s.w_size); - utils.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0); - dictionary = tmpDict; - dictLength = s.w_size; - } - /* insert dictionary into window and hash */ - avail = strm.avail_in; - next = strm.next_in; - input = strm.input; - strm.avail_in = dictLength; - strm.next_in = 0; - strm.input = dictionary; - fill_window(s); - while (s.lookahead >= MIN_MATCH) { - str = s.strstart; - n = s.lookahead - (MIN_MATCH - 1); - do { - /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ - s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask; - - s.prev[str & s.w_mask] = s.head[s.ins_h]; - - s.head[s.ins_h] = str; - str++; - } while (--n); - s.strstart = str; - s.lookahead = MIN_MATCH - 1; - fill_window(s); - } - s.strstart += s.lookahead; - s.block_start = s.strstart; - s.insert = s.lookahead; - s.lookahead = 0; - s.match_length = s.prev_length = MIN_MATCH - 1; - s.match_available = 0; - strm.next_in = next; - strm.input = input; - strm.avail_in = avail; - s.wrap = wrap; - return Z_OK; -} - - -exports.deflateInit = deflateInit; -exports.deflateInit2 = deflateInit2; -exports.deflateReset = deflateReset; -exports.deflateResetKeep = deflateResetKeep; -exports.deflateSetHeader = deflateSetHeader; -exports.deflate = deflate; -exports.deflateEnd = deflateEnd; -exports.deflateSetDictionary = deflateSetDictionary; -exports.deflateInfo = 'pako deflate (from Nodeca project)'; - -/* Not implemented -exports.deflateBound = deflateBound; -exports.deflateCopy = deflateCopy; -exports.deflateParams = deflateParams; -exports.deflatePending = deflatePending; -exports.deflatePrime = deflatePrime; -exports.deflateTune = deflateTune; -*/ - -},{"../utils/common":35,"./adler32":36,"./crc32":38,"./messages":43,"./trees":44}],40:[function(require,module,exports){ -'use strict'; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -// See state defs from inflate.js -var BAD = 30; /* got a data error -- remain here until reset */ -var TYPE = 12; /* i: waiting for type bits, including last-flag bit */ - -/* - Decode literal, length, and distance codes and write out the resulting - literal and match bytes until either not enough input or output is - available, an end-of-block is encountered, or a data error is encountered. - When large enough input and output buffers are supplied to inflate(), for - example, a 16K input buffer and a 64K output buffer, more than 95% of the - inflate execution time is spent in this routine. - - Entry assumptions: - - state.mode === LEN - strm.avail_in >= 6 - strm.avail_out >= 258 - start >= strm.avail_out - state.bits < 8 - - On return, state.mode is one of: - - LEN -- ran out of enough output space or enough available input - TYPE -- reached end of block code, inflate() to interpret next block - BAD -- error in block data - - Notes: - - - The maximum input bits used by a length/distance pair is 15 bits for the - length code, 5 bits for the length extra, 15 bits for the distance code, - and 13 bits for the distance extra. This totals 48 bits, or six bytes. - Therefore if strm.avail_in >= 6, then there is enough input to avoid - checking for available input while decoding. - - - The maximum bytes that a single length/distance pair can output is 258 - bytes, which is the maximum length that can be coded. inflate_fast() - requires strm.avail_out >= 258 for each loop to avoid checking for - output space. - */ -module.exports = function inflate_fast(strm, start) { - var state; - var _in; /* local strm.input */ - var last; /* have enough input while in < last */ - var _out; /* local strm.output */ - var beg; /* inflate()'s initial strm.output */ - var end; /* while out < end, enough space available */ -//#ifdef INFLATE_STRICT - var dmax; /* maximum distance from zlib header */ -//#endif - var wsize; /* window size or zero if not using window */ - var whave; /* valid bytes in the window */ - var wnext; /* window write index */ - // Use `s_window` instead `window`, avoid conflict with instrumentation tools - var s_window; /* allocated sliding window, if wsize != 0 */ - var hold; /* local strm.hold */ - var bits; /* local strm.bits */ - var lcode; /* local strm.lencode */ - var dcode; /* local strm.distcode */ - var lmask; /* mask for first level of length codes */ - var dmask; /* mask for first level of distance codes */ - var here; /* retrieved table entry */ - var op; /* code bits, operation, extra bits, or */ - /* window position, window bytes to copy */ - var len; /* match length, unused bytes */ - var dist; /* match distance */ - var from; /* where to copy match from */ - var from_source; - - - var input, output; // JS specific, because we have no pointers - - /* copy state to local variables */ - state = strm.state; - //here = state.here; - _in = strm.next_in; - input = strm.input; - last = _in + (strm.avail_in - 5); - _out = strm.next_out; - output = strm.output; - beg = _out - (start - strm.avail_out); - end = _out + (strm.avail_out - 257); -//#ifdef INFLATE_STRICT - dmax = state.dmax; -//#endif - wsize = state.wsize; - whave = state.whave; - wnext = state.wnext; - s_window = state.window; - hold = state.hold; - bits = state.bits; - lcode = state.lencode; - dcode = state.distcode; - lmask = (1 << state.lenbits) - 1; - dmask = (1 << state.distbits) - 1; - - - /* decode literals and length/distances until end-of-block or not enough - input data or output space */ - - top: - do { - if (bits < 15) { - hold += input[_in++] << bits; - bits += 8; - hold += input[_in++] << bits; - bits += 8; - } - - here = lcode[hold & lmask]; - - dolen: - for (;;) { // Goto emulation - op = here >>> 24/*here.bits*/; - hold >>>= op; - bits -= op; - op = (here >>> 16) & 0xff/*here.op*/; - if (op === 0) { /* literal */ - //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - // "inflate: literal '%c'\n" : - // "inflate: literal 0x%02x\n", here.val)); - output[_out++] = here & 0xffff/*here.val*/; - } - else if (op & 16) { /* length base */ - len = here & 0xffff/*here.val*/; - op &= 15; /* number of extra bits */ - if (op) { - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - } - len += hold & ((1 << op) - 1); - hold >>>= op; - bits -= op; - } - //Tracevv((stderr, "inflate: length %u\n", len)); - if (bits < 15) { - hold += input[_in++] << bits; - bits += 8; - hold += input[_in++] << bits; - bits += 8; - } - here = dcode[hold & dmask]; - - dodist: - for (;;) { // goto emulation - op = here >>> 24/*here.bits*/; - hold >>>= op; - bits -= op; - op = (here >>> 16) & 0xff/*here.op*/; - - if (op & 16) { /* distance base */ - dist = here & 0xffff/*here.val*/; - op &= 15; /* number of extra bits */ - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - } - } - dist += hold & ((1 << op) - 1); -//#ifdef INFLATE_STRICT - if (dist > dmax) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break top; - } -//#endif - hold >>>= op; - bits -= op; - //Tracevv((stderr, "inflate: distance %u\n", dist)); - op = _out - beg; /* max distance in output */ - if (dist > op) { /* see if copy from window */ - op = dist - op; /* distance back in window */ - if (op > whave) { - if (state.sane) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break top; - } - -// (!) This block is disabled in zlib defaults, -// don't enable it for binary compatibility -//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR -// if (len <= op - whave) { -// do { -// output[_out++] = 0; -// } while (--len); -// continue top; -// } -// len -= op - whave; -// do { -// output[_out++] = 0; -// } while (--op > whave); -// if (op === 0) { -// from = _out - dist; -// do { -// output[_out++] = output[from++]; -// } while (--len); -// continue top; -// } -//#endif - } - from = 0; // window index - from_source = s_window; - if (wnext === 0) { /* very common case */ - from += wsize - op; - if (op < len) { /* some from window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - else if (wnext < op) { /* wrap around window */ - from += wsize + wnext - op; - op -= wnext; - if (op < len) { /* some from end of window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = 0; - if (wnext < len) { /* some from start of window */ - op = wnext; - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - } - else { /* contiguous in window */ - from += wnext - op; - if (op < len) { /* some from window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - while (len > 2) { - output[_out++] = from_source[from++]; - output[_out++] = from_source[from++]; - output[_out++] = from_source[from++]; - len -= 3; - } - if (len) { - output[_out++] = from_source[from++]; - if (len > 1) { - output[_out++] = from_source[from++]; - } - } - } - else { - from = _out - dist; /* copy direct from output */ - do { /* minimum length is three */ - output[_out++] = output[from++]; - output[_out++] = output[from++]; - output[_out++] = output[from++]; - len -= 3; - } while (len > 2); - if (len) { - output[_out++] = output[from++]; - if (len > 1) { - output[_out++] = output[from++]; - } - } - } - } - else if ((op & 64) === 0) { /* 2nd level distance code */ - here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))]; - continue dodist; - } - else { - strm.msg = 'invalid distance code'; - state.mode = BAD; - break top; - } - - break; // need to emulate goto via "continue" - } - } - else if ((op & 64) === 0) { /* 2nd level length code */ - here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))]; - continue dolen; - } - else if (op & 32) { /* end-of-block */ - //Tracevv((stderr, "inflate: end of block\n")); - state.mode = TYPE; - break top; - } - else { - strm.msg = 'invalid literal/length code'; - state.mode = BAD; - break top; - } - - break; // need to emulate goto via "continue" - } - } while (_in < last && _out < end); - - /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ - len = bits >> 3; - _in -= len; - bits -= len << 3; - hold &= (1 << bits) - 1; - - /* update state and return */ - strm.next_in = _in; - strm.next_out = _out; - strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last)); - strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end)); - state.hold = hold; - state.bits = bits; - return; -}; - -},{}],41:[function(require,module,exports){ -'use strict'; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -var utils = require('../utils/common'); -var adler32 = require('./adler32'); -var crc32 = require('./crc32'); -var inflate_fast = require('./inffast'); -var inflate_table = require('./inftrees'); - -var CODES = 0; -var LENS = 1; -var DISTS = 2; - -/* Public constants ==========================================================*/ -/* ===========================================================================*/ - - -/* Allowed flush values; see deflate() and inflate() below for details */ -//var Z_NO_FLUSH = 0; -//var Z_PARTIAL_FLUSH = 1; -//var Z_SYNC_FLUSH = 2; -//var Z_FULL_FLUSH = 3; -var Z_FINISH = 4; -var Z_BLOCK = 5; -var Z_TREES = 6; - - -/* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ -var Z_OK = 0; -var Z_STREAM_END = 1; -var Z_NEED_DICT = 2; -//var Z_ERRNO = -1; -var Z_STREAM_ERROR = -2; -var Z_DATA_ERROR = -3; -var Z_MEM_ERROR = -4; -var Z_BUF_ERROR = -5; -//var Z_VERSION_ERROR = -6; - -/* The deflate compression method */ -var Z_DEFLATED = 8; - - -/* STATES ====================================================================*/ -/* ===========================================================================*/ - - -var HEAD = 1; /* i: waiting for magic header */ -var FLAGS = 2; /* i: waiting for method and flags (gzip) */ -var TIME = 3; /* i: waiting for modification time (gzip) */ -var OS = 4; /* i: waiting for extra flags and operating system (gzip) */ -var EXLEN = 5; /* i: waiting for extra length (gzip) */ -var EXTRA = 6; /* i: waiting for extra bytes (gzip) */ -var NAME = 7; /* i: waiting for end of file name (gzip) */ -var COMMENT = 8; /* i: waiting for end of comment (gzip) */ -var HCRC = 9; /* i: waiting for header crc (gzip) */ -var DICTID = 10; /* i: waiting for dictionary check value */ -var DICT = 11; /* waiting for inflateSetDictionary() call */ -var TYPE = 12; /* i: waiting for type bits, including last-flag bit */ -var TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */ -var STORED = 14; /* i: waiting for stored size (length and complement) */ -var COPY_ = 15; /* i/o: same as COPY below, but only first time in */ -var COPY = 16; /* i/o: waiting for input or output to copy stored block */ -var TABLE = 17; /* i: waiting for dynamic block table lengths */ -var LENLENS = 18; /* i: waiting for code length code lengths */ -var CODELENS = 19; /* i: waiting for length/lit and distance code lengths */ -var LEN_ = 20; /* i: same as LEN below, but only first time in */ -var LEN = 21; /* i: waiting for length/lit/eob code */ -var LENEXT = 22; /* i: waiting for length extra bits */ -var DIST = 23; /* i: waiting for distance code */ -var DISTEXT = 24; /* i: waiting for distance extra bits */ -var MATCH = 25; /* o: waiting for output space to copy string */ -var LIT = 26; /* o: waiting for output space to write literal */ -var CHECK = 27; /* i: waiting for 32-bit check value */ -var LENGTH = 28; /* i: waiting for 32-bit length (gzip) */ -var DONE = 29; /* finished check, done -- remain here until reset */ -var BAD = 30; /* got a data error -- remain here until reset */ -var MEM = 31; /* got an inflate() memory error -- remain here until reset */ -var SYNC = 32; /* looking for synchronization bytes to restart inflate() */ - -/* ===========================================================================*/ - - - -var ENOUGH_LENS = 852; -var ENOUGH_DISTS = 592; -//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); - -var MAX_WBITS = 15; -/* 32K LZ77 window */ -var DEF_WBITS = MAX_WBITS; - - -function zswap32(q) { - return (((q >>> 24) & 0xff) + - ((q >>> 8) & 0xff00) + - ((q & 0xff00) << 8) + - ((q & 0xff) << 24)); -} - - -function InflateState() { - this.mode = 0; /* current inflate mode */ - this.last = false; /* true if processing last block */ - this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ - this.havedict = false; /* true if dictionary provided */ - this.flags = 0; /* gzip header method and flags (0 if zlib) */ - this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */ - this.check = 0; /* protected copy of check value */ - this.total = 0; /* protected copy of output count */ - // TODO: may be {} - this.head = null; /* where to save gzip header information */ - - /* sliding window */ - this.wbits = 0; /* log base 2 of requested window size */ - this.wsize = 0; /* window size or zero if not using window */ - this.whave = 0; /* valid bytes in the window */ - this.wnext = 0; /* window write index */ - this.window = null; /* allocated sliding window, if needed */ - - /* bit accumulator */ - this.hold = 0; /* input bit accumulator */ - this.bits = 0; /* number of bits in "in" */ - - /* for string and stored block copying */ - this.length = 0; /* literal or length of data to copy */ - this.offset = 0; /* distance back to copy string from */ - - /* for table and code decoding */ - this.extra = 0; /* extra bits needed */ - - /* fixed and dynamic code tables */ - this.lencode = null; /* starting table for length/literal codes */ - this.distcode = null; /* starting table for distance codes */ - this.lenbits = 0; /* index bits for lencode */ - this.distbits = 0; /* index bits for distcode */ - - /* dynamic table building */ - this.ncode = 0; /* number of code length code lengths */ - this.nlen = 0; /* number of length code lengths */ - this.ndist = 0; /* number of distance code lengths */ - this.have = 0; /* number of code lengths in lens[] */ - this.next = null; /* next available space in codes[] */ - - this.lens = new utils.Buf16(320); /* temporary storage for code lengths */ - this.work = new utils.Buf16(288); /* work area for code table building */ - - /* - because we don't have pointers in js, we use lencode and distcode directly - as buffers so we don't need codes - */ - //this.codes = new utils.Buf32(ENOUGH); /* space for code tables */ - this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */ - this.distdyn = null; /* dynamic table for distance codes (JS specific) */ - this.sane = 0; /* if false, allow invalid distance too far */ - this.back = 0; /* bits back of last unprocessed length/lit */ - this.was = 0; /* initial length of match */ -} - -function inflateResetKeep(strm) { - var state; - - if (!strm || !strm.state) { return Z_STREAM_ERROR; } - state = strm.state; - strm.total_in = strm.total_out = state.total = 0; - strm.msg = ''; /*Z_NULL*/ - if (state.wrap) { /* to support ill-conceived Java test suite */ - strm.adler = state.wrap & 1; - } - state.mode = HEAD; - state.last = 0; - state.havedict = 0; - state.dmax = 32768; - state.head = null/*Z_NULL*/; - state.hold = 0; - state.bits = 0; - //state.lencode = state.distcode = state.next = state.codes; - state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS); - state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS); - - state.sane = 1; - state.back = -1; - //Tracev((stderr, "inflate: reset\n")); - return Z_OK; -} - -function inflateReset(strm) { - var state; - - if (!strm || !strm.state) { return Z_STREAM_ERROR; } - state = strm.state; - state.wsize = 0; - state.whave = 0; - state.wnext = 0; - return inflateResetKeep(strm); - -} - -function inflateReset2(strm, windowBits) { - var wrap; - var state; - - /* get the state */ - if (!strm || !strm.state) { return Z_STREAM_ERROR; } - state = strm.state; - - /* extract wrap request from windowBits parameter */ - if (windowBits < 0) { - wrap = 0; - windowBits = -windowBits; - } - else { - wrap = (windowBits >> 4) + 1; - if (windowBits < 48) { - windowBits &= 15; - } - } - - /* set number of window bits, free window if different */ - if (windowBits && (windowBits < 8 || windowBits > 15)) { - return Z_STREAM_ERROR; - } - if (state.window !== null && state.wbits !== windowBits) { - state.window = null; - } - - /* update state and reset the rest of it */ - state.wrap = wrap; - state.wbits = windowBits; - return inflateReset(strm); -} - -function inflateInit2(strm, windowBits) { - var ret; - var state; - - if (!strm) { return Z_STREAM_ERROR; } - //strm.msg = Z_NULL; /* in case we return an error */ - - state = new InflateState(); - - //if (state === Z_NULL) return Z_MEM_ERROR; - //Tracev((stderr, "inflate: allocated\n")); - strm.state = state; - state.window = null/*Z_NULL*/; - ret = inflateReset2(strm, windowBits); - if (ret !== Z_OK) { - strm.state = null/*Z_NULL*/; - } - return ret; -} - -function inflateInit(strm) { - return inflateInit2(strm, DEF_WBITS); -} - - -/* - Return state with length and distance decoding tables and index sizes set to - fixed code decoding. Normally this returns fixed tables from inffixed.h. - If BUILDFIXED is defined, then instead this routine builds the tables the - first time it's called, and returns those tables the first time and - thereafter. This reduces the size of the code by about 2K bytes, in - exchange for a little execution time. However, BUILDFIXED should not be - used for threaded applications, since the rewriting of the tables and virgin - may not be thread-safe. - */ -var virgin = true; - -var lenfix, distfix; // We have no pointers in JS, so keep tables separate - -function fixedtables(state) { - /* build fixed huffman tables if first call (may not be thread safe) */ - if (virgin) { - var sym; - - lenfix = new utils.Buf32(512); - distfix = new utils.Buf32(32); - - /* literal/length table */ - sym = 0; - while (sym < 144) { state.lens[sym++] = 8; } - while (sym < 256) { state.lens[sym++] = 9; } - while (sym < 280) { state.lens[sym++] = 7; } - while (sym < 288) { state.lens[sym++] = 8; } - - inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 }); - - /* distance table */ - sym = 0; - while (sym < 32) { state.lens[sym++] = 5; } - - inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 }); - - /* do this just once */ - virgin = false; - } - - state.lencode = lenfix; - state.lenbits = 9; - state.distcode = distfix; - state.distbits = 5; -} - - -/* - Update the window with the last wsize (normally 32K) bytes written before - returning. If window does not exist yet, create it. This is only called - when a window is already in use, or when output has been written during this - inflate call, but the end of the deflate stream has not been reached yet. - It is also called to create a window for dictionary data when a dictionary - is loaded. - - Providing output buffers larger than 32K to inflate() should provide a speed - advantage, since only the last 32K of output is copied to the sliding window - upon return from inflate(), and since all distances after the first 32K of - output will fall in the output data, making match copies simpler and faster. - The advantage may be dependent on the size of the processor's data caches. - */ -function updatewindow(strm, src, end, copy) { - var dist; - var state = strm.state; - - /* if it hasn't been done already, allocate space for the window */ - if (state.window === null) { - state.wsize = 1 << state.wbits; - state.wnext = 0; - state.whave = 0; - - state.window = new utils.Buf8(state.wsize); - } - - /* copy state->wsize or less output bytes into the circular window */ - if (copy >= state.wsize) { - utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0); - state.wnext = 0; - state.whave = state.wsize; - } - else { - dist = state.wsize - state.wnext; - if (dist > copy) { - dist = copy; - } - //zmemcpy(state->window + state->wnext, end - copy, dist); - utils.arraySet(state.window, src, end - copy, dist, state.wnext); - copy -= dist; - if (copy) { - //zmemcpy(state->window, end - copy, copy); - utils.arraySet(state.window, src, end - copy, copy, 0); - state.wnext = copy; - state.whave = state.wsize; - } - else { - state.wnext += dist; - if (state.wnext === state.wsize) { state.wnext = 0; } - if (state.whave < state.wsize) { state.whave += dist; } - } - } - return 0; -} - -function inflate(strm, flush) { - var state; - var input, output; // input/output buffers - var next; /* next input INDEX */ - var put; /* next output INDEX */ - var have, left; /* available input and output */ - var hold; /* bit buffer */ - var bits; /* bits in bit buffer */ - var _in, _out; /* save starting available input and output */ - var copy; /* number of stored or match bytes to copy */ - var from; /* where to copy match bytes from */ - var from_source; - var here = 0; /* current decoding table entry */ - var here_bits, here_op, here_val; // paked "here" denormalized (JS specific) - //var last; /* parent table entry */ - var last_bits, last_op, last_val; // paked "last" denormalized (JS specific) - var len; /* length to copy for repeats, bits to drop */ - var ret; /* return code */ - var hbuf = new utils.Buf8(4); /* buffer for gzip header crc calculation */ - var opts; - - var n; // temporary var for NEED_BITS - - var order = /* permutation of code lengths */ - [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]; - - - if (!strm || !strm.state || !strm.output || - (!strm.input && strm.avail_in !== 0)) { - return Z_STREAM_ERROR; - } - - state = strm.state; - if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */ - - - //--- LOAD() --- - put = strm.next_out; - output = strm.output; - left = strm.avail_out; - next = strm.next_in; - input = strm.input; - have = strm.avail_in; - hold = state.hold; - bits = state.bits; - //--- - - _in = have; - _out = left; - ret = Z_OK; - - inf_leave: // goto emulation - for (;;) { - switch (state.mode) { - case HEAD: - if (state.wrap === 0) { - state.mode = TYPEDO; - break; - } - //=== NEEDBITS(16); - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */ - state.check = 0/*crc32(0L, Z_NULL, 0)*/; - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - state.check = crc32(state.check, hbuf, 2, 0); - //===// - - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = FLAGS; - break; - } - state.flags = 0; /* expect zlib header */ - if (state.head) { - state.head.done = false; - } - if (!(state.wrap & 1) || /* check if zlib header allowed */ - (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) { - strm.msg = 'incorrect header check'; - state.mode = BAD; - break; - } - if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) { - strm.msg = 'unknown compression method'; - state.mode = BAD; - break; - } - //--- DROPBITS(4) ---// - hold >>>= 4; - bits -= 4; - //---// - len = (hold & 0x0f)/*BITS(4)*/ + 8; - if (state.wbits === 0) { - state.wbits = len; - } - else if (len > state.wbits) { - strm.msg = 'invalid window size'; - state.mode = BAD; - break; - } - state.dmax = 1 << len; - //Tracev((stderr, "inflate: zlib header ok\n")); - strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; - state.mode = hold & 0x200 ? DICTID : TYPE; - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - break; - case FLAGS: - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.flags = hold; - if ((state.flags & 0xff) !== Z_DEFLATED) { - strm.msg = 'unknown compression method'; - state.mode = BAD; - break; - } - if (state.flags & 0xe000) { - strm.msg = 'unknown header flags set'; - state.mode = BAD; - break; - } - if (state.head) { - state.head.text = ((hold >> 8) & 1); - } - if (state.flags & 0x0200) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - state.check = crc32(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = TIME; - /* falls through */ - case TIME: - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (state.head) { - state.head.time = hold; - } - if (state.flags & 0x0200) { - //=== CRC4(state.check, hold) - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - hbuf[2] = (hold >>> 16) & 0xff; - hbuf[3] = (hold >>> 24) & 0xff; - state.check = crc32(state.check, hbuf, 4, 0); - //=== - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = OS; - /* falls through */ - case OS: - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (state.head) { - state.head.xflags = (hold & 0xff); - state.head.os = (hold >> 8); - } - if (state.flags & 0x0200) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - state.check = crc32(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = EXLEN; - /* falls through */ - case EXLEN: - if (state.flags & 0x0400) { - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.length = hold; - if (state.head) { - state.head.extra_len = hold; - } - if (state.flags & 0x0200) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = (hold >>> 8) & 0xff; - state.check = crc32(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - } - else if (state.head) { - state.head.extra = null/*Z_NULL*/; - } - state.mode = EXTRA; - /* falls through */ - case EXTRA: - if (state.flags & 0x0400) { - copy = state.length; - if (copy > have) { copy = have; } - if (copy) { - if (state.head) { - len = state.head.extra_len - state.length; - if (!state.head.extra) { - // Use untyped array for more convenient processing later - state.head.extra = new Array(state.head.extra_len); - } - utils.arraySet( - state.head.extra, - input, - next, - // extra field is limited to 65536 bytes - // - no need for additional size check - copy, - /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/ - len - ); - //zmemcpy(state.head.extra + len, next, - // len + copy > state.head.extra_max ? - // state.head.extra_max - len : copy); - } - if (state.flags & 0x0200) { - state.check = crc32(state.check, input, copy, next); - } - have -= copy; - next += copy; - state.length -= copy; - } - if (state.length) { break inf_leave; } - } - state.length = 0; - state.mode = NAME; - /* falls through */ - case NAME: - if (state.flags & 0x0800) { - if (have === 0) { break inf_leave; } - copy = 0; - do { - // TODO: 2 or 1 bytes? - len = input[next + copy++]; - /* use constant limit because in js we should not preallocate memory */ - if (state.head && len && - (state.length < 65536 /*state.head.name_max*/)) { - state.head.name += String.fromCharCode(len); - } - } while (len && copy < have); - - if (state.flags & 0x0200) { - state.check = crc32(state.check, input, copy, next); - } - have -= copy; - next += copy; - if (len) { break inf_leave; } - } - else if (state.head) { - state.head.name = null; - } - state.length = 0; - state.mode = COMMENT; - /* falls through */ - case COMMENT: - if (state.flags & 0x1000) { - if (have === 0) { break inf_leave; } - copy = 0; - do { - len = input[next + copy++]; - /* use constant limit because in js we should not preallocate memory */ - if (state.head && len && - (state.length < 65536 /*state.head.comm_max*/)) { - state.head.comment += String.fromCharCode(len); - } - } while (len && copy < have); - if (state.flags & 0x0200) { - state.check = crc32(state.check, input, copy, next); - } - have -= copy; - next += copy; - if (len) { break inf_leave; } - } - else if (state.head) { - state.head.comment = null; - } - state.mode = HCRC; - /* falls through */ - case HCRC: - if (state.flags & 0x0200) { - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (hold !== (state.check & 0xffff)) { - strm.msg = 'header crc mismatch'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - } - if (state.head) { - state.head.hcrc = ((state.flags >> 9) & 1); - state.head.done = true; - } - strm.adler = state.check = 0; - state.mode = TYPE; - break; - case DICTID: - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - strm.adler = state.check = zswap32(hold); - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = DICT; - /* falls through */ - case DICT: - if (state.havedict === 0) { - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - return Z_NEED_DICT; - } - strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; - state.mode = TYPE; - /* falls through */ - case TYPE: - if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; } - /* falls through */ - case TYPEDO: - if (state.last) { - //--- BYTEBITS() ---// - hold >>>= bits & 7; - bits -= bits & 7; - //---// - state.mode = CHECK; - break; - } - //=== NEEDBITS(3); */ - while (bits < 3) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.last = (hold & 0x01)/*BITS(1)*/; - //--- DROPBITS(1) ---// - hold >>>= 1; - bits -= 1; - //---// - - switch ((hold & 0x03)/*BITS(2)*/) { - case 0: /* stored block */ - //Tracev((stderr, "inflate: stored block%s\n", - // state.last ? " (last)" : "")); - state.mode = STORED; - break; - case 1: /* fixed block */ - fixedtables(state); - //Tracev((stderr, "inflate: fixed codes block%s\n", - // state.last ? " (last)" : "")); - state.mode = LEN_; /* decode codes */ - if (flush === Z_TREES) { - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - break inf_leave; - } - break; - case 2: /* dynamic block */ - //Tracev((stderr, "inflate: dynamic codes block%s\n", - // state.last ? " (last)" : "")); - state.mode = TABLE; - break; - case 3: - strm.msg = 'invalid block type'; - state.mode = BAD; - } - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - break; - case STORED: - //--- BYTEBITS() ---// /* go to byte boundary */ - hold >>>= bits & 7; - bits -= bits & 7; - //---// - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) { - strm.msg = 'invalid stored block lengths'; - state.mode = BAD; - break; - } - state.length = hold & 0xffff; - //Tracev((stderr, "inflate: stored length %u\n", - // state.length)); - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = COPY_; - if (flush === Z_TREES) { break inf_leave; } - /* falls through */ - case COPY_: - state.mode = COPY; - /* falls through */ - case COPY: - copy = state.length; - if (copy) { - if (copy > have) { copy = have; } - if (copy > left) { copy = left; } - if (copy === 0) { break inf_leave; } - //--- zmemcpy(put, next, copy); --- - utils.arraySet(output, input, next, copy, put); - //---// - have -= copy; - next += copy; - left -= copy; - put += copy; - state.length -= copy; - break; - } - //Tracev((stderr, "inflate: stored end\n")); - state.mode = TYPE; - break; - case TABLE: - //=== NEEDBITS(14); */ - while (bits < 14) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257; - //--- DROPBITS(5) ---// - hold >>>= 5; - bits -= 5; - //---// - state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1; - //--- DROPBITS(5) ---// - hold >>>= 5; - bits -= 5; - //---// - state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4; - //--- DROPBITS(4) ---// - hold >>>= 4; - bits -= 4; - //---// -//#ifndef PKZIP_BUG_WORKAROUND - if (state.nlen > 286 || state.ndist > 30) { - strm.msg = 'too many length or distance symbols'; - state.mode = BAD; - break; - } -//#endif - //Tracev((stderr, "inflate: table sizes ok\n")); - state.have = 0; - state.mode = LENLENS; - /* falls through */ - case LENLENS: - while (state.have < state.ncode) { - //=== NEEDBITS(3); - while (bits < 3) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.lens[order[state.have++]] = (hold & 0x07);//BITS(3); - //--- DROPBITS(3) ---// - hold >>>= 3; - bits -= 3; - //---// - } - while (state.have < 19) { - state.lens[order[state.have++]] = 0; - } - // We have separate tables & no pointers. 2 commented lines below not needed. - //state.next = state.codes; - //state.lencode = state.next; - // Switch to use dynamic table - state.lencode = state.lendyn; - state.lenbits = 7; - - opts = { bits: state.lenbits }; - ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts); - state.lenbits = opts.bits; - - if (ret) { - strm.msg = 'invalid code lengths set'; - state.mode = BAD; - break; - } - //Tracev((stderr, "inflate: code lengths ok\n")); - state.have = 0; - state.mode = CODELENS; - /* falls through */ - case CODELENS: - while (state.have < state.nlen + state.ndist) { - for (;;) { - here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/ - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if ((here_bits) <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - if (here_val < 16) { - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.lens[state.have++] = here_val; - } - else { - if (here_val === 16) { - //=== NEEDBITS(here.bits + 2); - n = here_bits + 2; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - if (state.have === 0) { - strm.msg = 'invalid bit length repeat'; - state.mode = BAD; - break; - } - len = state.lens[state.have - 1]; - copy = 3 + (hold & 0x03);//BITS(2); - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - } - else if (here_val === 17) { - //=== NEEDBITS(here.bits + 3); - n = here_bits + 3; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - len = 0; - copy = 3 + (hold & 0x07);//BITS(3); - //--- DROPBITS(3) ---// - hold >>>= 3; - bits -= 3; - //---// - } - else { - //=== NEEDBITS(here.bits + 7); - n = here_bits + 7; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - len = 0; - copy = 11 + (hold & 0x7f);//BITS(7); - //--- DROPBITS(7) ---// - hold >>>= 7; - bits -= 7; - //---// - } - if (state.have + copy > state.nlen + state.ndist) { - strm.msg = 'invalid bit length repeat'; - state.mode = BAD; - break; - } - while (copy--) { - state.lens[state.have++] = len; - } - } - } - - /* handle error breaks in while */ - if (state.mode === BAD) { break; } - - /* check for end-of-block code (better have one) */ - if (state.lens[256] === 0) { - strm.msg = 'invalid code -- missing end-of-block'; - state.mode = BAD; - break; - } - - /* build code tables -- note: do not change the lenbits or distbits - values here (9 and 6) without reading the comments in inftrees.h - concerning the ENOUGH constants, which depend on those values */ - state.lenbits = 9; - - opts = { bits: state.lenbits }; - ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts); - // We have separate tables & no pointers. 2 commented lines below not needed. - // state.next_index = opts.table_index; - state.lenbits = opts.bits; - // state.lencode = state.next; - - if (ret) { - strm.msg = 'invalid literal/lengths set'; - state.mode = BAD; - break; - } - - state.distbits = 6; - //state.distcode.copy(state.codes); - // Switch to use dynamic table - state.distcode = state.distdyn; - opts = { bits: state.distbits }; - ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts); - // We have separate tables & no pointers. 2 commented lines below not needed. - // state.next_index = opts.table_index; - state.distbits = opts.bits; - // state.distcode = state.next; - - if (ret) { - strm.msg = 'invalid distances set'; - state.mode = BAD; - break; - } - //Tracev((stderr, 'inflate: codes ok\n')); - state.mode = LEN_; - if (flush === Z_TREES) { break inf_leave; } - /* falls through */ - case LEN_: - state.mode = LEN; - /* falls through */ - case LEN: - if (have >= 6 && left >= 258) { - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - inflate_fast(strm, _out); - //--- LOAD() --- - put = strm.next_out; - output = strm.output; - left = strm.avail_out; - next = strm.next_in; - input = strm.input; - have = strm.avail_in; - hold = state.hold; - bits = state.bits; - //--- - - if (state.mode === TYPE) { - state.back = -1; - } - break; - } - state.back = 0; - for (;;) { - here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/ - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if (here_bits <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - if (here_op && (here_op & 0xf0) === 0) { - last_bits = here_bits; - last_op = here_op; - last_val = here_val; - for (;;) { - here = state.lencode[last_val + - ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)]; - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if ((last_bits + here_bits) <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - //--- DROPBITS(last.bits) ---// - hold >>>= last_bits; - bits -= last_bits; - //---// - state.back += last_bits; - } - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.back += here_bits; - state.length = here_val; - if (here_op === 0) { - //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - // "inflate: literal '%c'\n" : - // "inflate: literal 0x%02x\n", here.val)); - state.mode = LIT; - break; - } - if (here_op & 32) { - //Tracevv((stderr, "inflate: end of block\n")); - state.back = -1; - state.mode = TYPE; - break; - } - if (here_op & 64) { - strm.msg = 'invalid literal/length code'; - state.mode = BAD; - break; - } - state.extra = here_op & 15; - state.mode = LENEXT; - /* falls through */ - case LENEXT: - if (state.extra) { - //=== NEEDBITS(state.extra); - n = state.extra; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/; - //--- DROPBITS(state.extra) ---// - hold >>>= state.extra; - bits -= state.extra; - //---// - state.back += state.extra; - } - //Tracevv((stderr, "inflate: length %u\n", state.length)); - state.was = state.length; - state.mode = DIST; - /* falls through */ - case DIST: - for (;;) { - here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/ - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if ((here_bits) <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - if ((here_op & 0xf0) === 0) { - last_bits = here_bits; - last_op = here_op; - last_val = here_val; - for (;;) { - here = state.distcode[last_val + - ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)]; - here_bits = here >>> 24; - here_op = (here >>> 16) & 0xff; - here_val = here & 0xffff; - - if ((last_bits + here_bits) <= bits) { break; } - //--- PULLBYTE() ---// - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - //--- DROPBITS(last.bits) ---// - hold >>>= last_bits; - bits -= last_bits; - //---// - state.back += last_bits; - } - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.back += here_bits; - if (here_op & 64) { - strm.msg = 'invalid distance code'; - state.mode = BAD; - break; - } - state.offset = here_val; - state.extra = (here_op) & 15; - state.mode = DISTEXT; - /* falls through */ - case DISTEXT: - if (state.extra) { - //=== NEEDBITS(state.extra); - n = state.extra; - while (bits < n) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/; - //--- DROPBITS(state.extra) ---// - hold >>>= state.extra; - bits -= state.extra; - //---// - state.back += state.extra; - } -//#ifdef INFLATE_STRICT - if (state.offset > state.dmax) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break; - } -//#endif - //Tracevv((stderr, "inflate: distance %u\n", state.offset)); - state.mode = MATCH; - /* falls through */ - case MATCH: - if (left === 0) { break inf_leave; } - copy = _out - left; - if (state.offset > copy) { /* copy from window */ - copy = state.offset - copy; - if (copy > state.whave) { - if (state.sane) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break; - } -// (!) This block is disabled in zlib defaults, -// don't enable it for binary compatibility -//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR -// Trace((stderr, "inflate.c too far\n")); -// copy -= state.whave; -// if (copy > state.length) { copy = state.length; } -// if (copy > left) { copy = left; } -// left -= copy; -// state.length -= copy; -// do { -// output[put++] = 0; -// } while (--copy); -// if (state.length === 0) { state.mode = LEN; } -// break; -//#endif - } - if (copy > state.wnext) { - copy -= state.wnext; - from = state.wsize - copy; - } - else { - from = state.wnext - copy; - } - if (copy > state.length) { copy = state.length; } - from_source = state.window; - } - else { /* copy from output */ - from_source = output; - from = put - state.offset; - copy = state.length; - } - if (copy > left) { copy = left; } - left -= copy; - state.length -= copy; - do { - output[put++] = from_source[from++]; - } while (--copy); - if (state.length === 0) { state.mode = LEN; } - break; - case LIT: - if (left === 0) { break inf_leave; } - output[put++] = state.length; - left--; - state.mode = LEN; - break; - case CHECK: - if (state.wrap) { - //=== NEEDBITS(32); - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - // Use '|' instead of '+' to make sure that result is signed - hold |= input[next++] << bits; - bits += 8; - } - //===// - _out -= left; - strm.total_out += _out; - state.total += _out; - if (_out) { - strm.adler = state.check = - /*UPDATE(state.check, put - _out, _out);*/ - (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out)); - - } - _out = left; - // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too - if ((state.flags ? hold : zswap32(hold)) !== state.check) { - strm.msg = 'incorrect data check'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - //Tracev((stderr, "inflate: check matches trailer\n")); - } - state.mode = LENGTH; - /* falls through */ - case LENGTH: - if (state.wrap && state.flags) { - //=== NEEDBITS(32); - while (bits < 32) { - if (have === 0) { break inf_leave; } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (hold !== (state.total & 0xffffffff)) { - strm.msg = 'incorrect length check'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - //Tracev((stderr, "inflate: length matches trailer\n")); - } - state.mode = DONE; - /* falls through */ - case DONE: - ret = Z_STREAM_END; - break inf_leave; - case BAD: - ret = Z_DATA_ERROR; - break inf_leave; - case MEM: - return Z_MEM_ERROR; - case SYNC: - /* falls through */ - default: - return Z_STREAM_ERROR; - } - } - - // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave" - - /* - Return from inflate(), updating the total counts and the check value. - If there was no progress during the inflate() call, return a buffer - error. Call updatewindow() to create and/or update the window state. - Note: a memory error from inflate() is non-recoverable. - */ - - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - - if (state.wsize || (_out !== strm.avail_out && state.mode < BAD && - (state.mode < CHECK || flush !== Z_FINISH))) { - if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) { - state.mode = MEM; - return Z_MEM_ERROR; - } - } - _in -= strm.avail_in; - _out -= strm.avail_out; - strm.total_in += _in; - strm.total_out += _out; - state.total += _out; - if (state.wrap && _out) { - strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/ - (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out)); - } - strm.data_type = state.bits + (state.last ? 64 : 0) + - (state.mode === TYPE ? 128 : 0) + - (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0); - if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) { - ret = Z_BUF_ERROR; - } - return ret; -} - -function inflateEnd(strm) { - - if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) { - return Z_STREAM_ERROR; - } - - var state = strm.state; - if (state.window) { - state.window = null; - } - strm.state = null; - return Z_OK; -} - -function inflateGetHeader(strm, head) { - var state; - - /* check state */ - if (!strm || !strm.state) { return Z_STREAM_ERROR; } - state = strm.state; - if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; } - - /* save header structure */ - state.head = head; - head.done = false; - return Z_OK; -} - -function inflateSetDictionary(strm, dictionary) { - var dictLength = dictionary.length; - - var state; - var dictid; - var ret; - - /* check state */ - if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; } - state = strm.state; - - if (state.wrap !== 0 && state.mode !== DICT) { - return Z_STREAM_ERROR; - } - - /* check for correct dictionary identifier */ - if (state.mode === DICT) { - dictid = 1; /* adler32(0, null, 0)*/ - /* dictid = adler32(dictid, dictionary, dictLength); */ - dictid = adler32(dictid, dictionary, dictLength, 0); - if (dictid !== state.check) { - return Z_DATA_ERROR; - } - } - /* copy dictionary to window using updatewindow(), which will amend the - existing dictionary if appropriate */ - ret = updatewindow(strm, dictionary, dictLength, dictLength); - if (ret) { - state.mode = MEM; - return Z_MEM_ERROR; - } - state.havedict = 1; - // Tracev((stderr, "inflate: dictionary set\n")); - return Z_OK; -} - -exports.inflateReset = inflateReset; -exports.inflateReset2 = inflateReset2; -exports.inflateResetKeep = inflateResetKeep; -exports.inflateInit = inflateInit; -exports.inflateInit2 = inflateInit2; -exports.inflate = inflate; -exports.inflateEnd = inflateEnd; -exports.inflateGetHeader = inflateGetHeader; -exports.inflateSetDictionary = inflateSetDictionary; -exports.inflateInfo = 'pako inflate (from Nodeca project)'; - -/* Not implemented -exports.inflateCopy = inflateCopy; -exports.inflateGetDictionary = inflateGetDictionary; -exports.inflateMark = inflateMark; -exports.inflatePrime = inflatePrime; -exports.inflateSync = inflateSync; -exports.inflateSyncPoint = inflateSyncPoint; -exports.inflateUndermine = inflateUndermine; -*/ - -},{"../utils/common":35,"./adler32":36,"./crc32":38,"./inffast":40,"./inftrees":42}],42:[function(require,module,exports){ -'use strict'; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -var utils = require('../utils/common'); - -var MAXBITS = 15; -var ENOUGH_LENS = 852; -var ENOUGH_DISTS = 592; -//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); - -var CODES = 0; -var LENS = 1; -var DISTS = 2; - -var lbase = [ /* Length codes 257..285 base */ - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 -]; - -var lext = [ /* Length codes 257..285 extra */ - 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78 -]; - -var dbase = [ /* Distance codes 0..29 base */ - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, - 8193, 12289, 16385, 24577, 0, 0 -]; - -var dext = [ /* Distance codes 0..29 extra */ - 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, - 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, - 28, 28, 29, 29, 64, 64 -]; - -module.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts) -{ - var bits = opts.bits; - //here = opts.here; /* table entry for duplication */ - - var len = 0; /* a code's length in bits */ - var sym = 0; /* index of code symbols */ - var min = 0, max = 0; /* minimum and maximum code lengths */ - var root = 0; /* number of index bits for root table */ - var curr = 0; /* number of index bits for current table */ - var drop = 0; /* code bits to drop for sub-table */ - var left = 0; /* number of prefix codes available */ - var used = 0; /* code entries in table used */ - var huff = 0; /* Huffman code */ - var incr; /* for incrementing code, index */ - var fill; /* index for replicating entries */ - var low; /* low bits for current root entry */ - var mask; /* mask for low root bits */ - var next; /* next available space in table */ - var base = null; /* base value table to use */ - var base_index = 0; -// var shoextra; /* extra bits table to use */ - var end; /* use base and extra for symbol > end */ - var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */ - var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */ - var extra = null; - var extra_index = 0; - - var here_bits, here_op, here_val; - - /* - Process a set of code lengths to create a canonical Huffman code. The - code lengths are lens[0..codes-1]. Each length corresponds to the - symbols 0..codes-1. The Huffman code is generated by first sorting the - symbols by length from short to long, and retaining the symbol order - for codes with equal lengths. Then the code starts with all zero bits - for the first code of the shortest length, and the codes are integer - increments for the same length, and zeros are appended as the length - increases. For the deflate format, these bits are stored backwards - from their more natural integer increment ordering, and so when the - decoding tables are built in the large loop below, the integer codes - are incremented backwards. - - This routine assumes, but does not check, that all of the entries in - lens[] are in the range 0..MAXBITS. The caller must assure this. - 1..MAXBITS is interpreted as that code length. zero means that that - symbol does not occur in this code. - - The codes are sorted by computing a count of codes for each length, - creating from that a table of starting indices for each length in the - sorted table, and then entering the symbols in order in the sorted - table. The sorted table is work[], with that space being provided by - the caller. - - The length counts are used for other purposes as well, i.e. finding - the minimum and maximum length codes, determining if there are any - codes at all, checking for a valid set of lengths, and looking ahead - at length counts to determine sub-table sizes when building the - decoding tables. - */ - - /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ - for (len = 0; len <= MAXBITS; len++) { - count[len] = 0; - } - for (sym = 0; sym < codes; sym++) { - count[lens[lens_index + sym]]++; - } - - /* bound code lengths, force root to be within code lengths */ - root = bits; - for (max = MAXBITS; max >= 1; max--) { - if (count[max] !== 0) { break; } - } - if (root > max) { - root = max; - } - if (max === 0) { /* no symbols to code at all */ - //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */ - //table.bits[opts.table_index] = 1; //here.bits = (var char)1; - //table.val[opts.table_index++] = 0; //here.val = (var short)0; - table[table_index++] = (1 << 24) | (64 << 16) | 0; - - - //table.op[opts.table_index] = 64; - //table.bits[opts.table_index] = 1; - //table.val[opts.table_index++] = 0; - table[table_index++] = (1 << 24) | (64 << 16) | 0; - - opts.bits = 1; - return 0; /* no symbols, but wait for decoding to report error */ - } - for (min = 1; min < max; min++) { - if (count[min] !== 0) { break; } - } - if (root < min) { - root = min; - } - - /* check for an over-subscribed or incomplete set of lengths */ - left = 1; - for (len = 1; len <= MAXBITS; len++) { - left <<= 1; - left -= count[len]; - if (left < 0) { - return -1; - } /* over-subscribed */ - } - if (left > 0 && (type === CODES || max !== 1)) { - return -1; /* incomplete set */ - } - - /* generate offsets into symbol table for each length for sorting */ - offs[1] = 0; - for (len = 1; len < MAXBITS; len++) { - offs[len + 1] = offs[len] + count[len]; - } - - /* sort symbols by length, by symbol order within each length */ - for (sym = 0; sym < codes; sym++) { - if (lens[lens_index + sym] !== 0) { - work[offs[lens[lens_index + sym]]++] = sym; - } - } - - /* - Create and fill in decoding tables. In this loop, the table being - filled is at next and has curr index bits. The code being used is huff - with length len. That code is converted to an index by dropping drop - bits off of the bottom. For codes where len is less than drop + curr, - those top drop + curr - len bits are incremented through all values to - fill the table with replicated entries. - - root is the number of index bits for the root table. When len exceeds - root, sub-tables are created pointed to by the root entry with an index - of the low root bits of huff. This is saved in low to check for when a - new sub-table should be started. drop is zero when the root table is - being filled, and drop is root when sub-tables are being filled. - - When a new sub-table is needed, it is necessary to look ahead in the - code lengths to determine what size sub-table is needed. The length - counts are used for this, and so count[] is decremented as codes are - entered in the tables. - - used keeps track of how many table entries have been allocated from the - provided *table space. It is checked for LENS and DIST tables against - the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in - the initial root table size constants. See the comments in inftrees.h - for more information. - - sym increments through all symbols, and the loop terminates when - all codes of length max, i.e. all codes, have been processed. This - routine permits incomplete codes, so another loop after this one fills - in the rest of the decoding tables with invalid code markers. - */ - - /* set up for code type */ - // poor man optimization - use if-else instead of switch, - // to avoid deopts in old v8 - if (type === CODES) { - base = extra = work; /* dummy value--not used */ - end = 19; - - } else if (type === LENS) { - base = lbase; - base_index -= 257; - extra = lext; - extra_index -= 257; - end = 256; - - } else { /* DISTS */ - base = dbase; - extra = dext; - end = -1; - } - - /* initialize opts for loop */ - huff = 0; /* starting code */ - sym = 0; /* starting code symbol */ - len = min; /* starting code length */ - next = table_index; /* current table to fill in */ - curr = root; /* current table index bits */ - drop = 0; /* current bits to drop from code for index */ - low = -1; /* trigger new sub-table when len > root */ - used = 1 << root; /* use root table entries */ - mask = used - 1; /* mask for comparing low */ - - /* check available table space */ - if ((type === LENS && used > ENOUGH_LENS) || - (type === DISTS && used > ENOUGH_DISTS)) { - return 1; - } - - /* process all codes and make table entries */ - for (;;) { - /* create table entry */ - here_bits = len - drop; - if (work[sym] < end) { - here_op = 0; - here_val = work[sym]; - } - else if (work[sym] > end) { - here_op = extra[extra_index + work[sym]]; - here_val = base[base_index + work[sym]]; - } - else { - here_op = 32 + 64; /* end of block */ - here_val = 0; - } - - /* replicate for those indices with low len bits equal to huff */ - incr = 1 << (len - drop); - fill = 1 << curr; - min = fill; /* save offset to next table */ - do { - fill -= incr; - table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0; - } while (fill !== 0); - - /* backwards increment the len-bit code huff */ - incr = 1 << (len - 1); - while (huff & incr) { - incr >>= 1; - } - if (incr !== 0) { - huff &= incr - 1; - huff += incr; - } else { - huff = 0; - } - - /* go to next symbol, update count, len */ - sym++; - if (--count[len] === 0) { - if (len === max) { break; } - len = lens[lens_index + work[sym]]; - } - - /* create new sub-table if needed */ - if (len > root && (huff & mask) !== low) { - /* if first time, transition to sub-tables */ - if (drop === 0) { - drop = root; - } - - /* increment past last table */ - next += min; /* here min is 1 << curr */ - - /* determine length of next table */ - curr = len - drop; - left = 1 << curr; - while (curr + drop < max) { - left -= count[curr + drop]; - if (left <= 0) { break; } - curr++; - left <<= 1; - } - - /* check for enough space */ - used += 1 << curr; - if ((type === LENS && used > ENOUGH_LENS) || - (type === DISTS && used > ENOUGH_DISTS)) { - return 1; - } - - /* point entry in root table to sub-table */ - low = huff & mask; - /*table.op[low] = curr; - table.bits[low] = root; - table.val[low] = next - opts.table_index;*/ - table[low] = (root << 24) | (curr << 16) | (next - table_index) |0; - } - } - - /* fill in remaining table entry if code is incomplete (guaranteed to have - at most one remaining entry, since if the code is incomplete, the - maximum code length that was allowed to get this far is one bit) */ - if (huff !== 0) { - //table.op[next + huff] = 64; /* invalid code marker */ - //table.bits[next + huff] = len - drop; - //table.val[next + huff] = 0; - table[next + huff] = ((len - drop) << 24) | (64 << 16) |0; - } - - /* set return parameters */ - //opts.table_index += used; - opts.bits = root; - return 0; -}; - -},{"../utils/common":35}],43:[function(require,module,exports){ -'use strict'; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -module.exports = { - 2: 'need dictionary', /* Z_NEED_DICT 2 */ - 1: 'stream end', /* Z_STREAM_END 1 */ - 0: '', /* Z_OK 0 */ - '-1': 'file error', /* Z_ERRNO (-1) */ - '-2': 'stream error', /* Z_STREAM_ERROR (-2) */ - '-3': 'data error', /* Z_DATA_ERROR (-3) */ - '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */ - '-5': 'buffer error', /* Z_BUF_ERROR (-5) */ - '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ -}; - -},{}],44:[function(require,module,exports){ -'use strict'; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -var utils = require('../utils/common'); - -/* Public constants ==========================================================*/ -/* ===========================================================================*/ - - -//var Z_FILTERED = 1; -//var Z_HUFFMAN_ONLY = 2; -//var Z_RLE = 3; -var Z_FIXED = 4; -//var Z_DEFAULT_STRATEGY = 0; - -/* Possible values of the data_type field (though see inflate()) */ -var Z_BINARY = 0; -var Z_TEXT = 1; -//var Z_ASCII = 1; // = Z_TEXT -var Z_UNKNOWN = 2; - -/*============================================================================*/ - - -function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } } - -// From zutil.h - -var STORED_BLOCK = 0; -var STATIC_TREES = 1; -var DYN_TREES = 2; -/* The three kinds of block type */ - -var MIN_MATCH = 3; -var MAX_MATCH = 258; -/* The minimum and maximum match lengths */ - -// From deflate.h -/* =========================================================================== - * Internal compression state. - */ - -var LENGTH_CODES = 29; -/* number of length codes, not counting the special END_BLOCK code */ - -var LITERALS = 256; -/* number of literal bytes 0..255 */ - -var L_CODES = LITERALS + 1 + LENGTH_CODES; -/* number of Literal or Length codes, including the END_BLOCK code */ - -var D_CODES = 30; -/* number of distance codes */ - -var BL_CODES = 19; -/* number of codes used to transfer the bit lengths */ - -var HEAP_SIZE = 2 * L_CODES + 1; -/* maximum heap size */ - -var MAX_BITS = 15; -/* All codes must not exceed MAX_BITS bits */ - -var Buf_size = 16; -/* size of bit buffer in bi_buf */ - - -/* =========================================================================== - * Constants - */ - -var MAX_BL_BITS = 7; -/* Bit length codes must not exceed MAX_BL_BITS bits */ - -var END_BLOCK = 256; -/* end of block literal code */ - -var REP_3_6 = 16; -/* repeat previous bit length 3-6 times (2 bits of repeat count) */ - -var REPZ_3_10 = 17; -/* repeat a zero length 3-10 times (3 bits of repeat count) */ - -var REPZ_11_138 = 18; -/* repeat a zero length 11-138 times (7 bits of repeat count) */ - -/* eslint-disable comma-spacing,array-bracket-spacing */ -var extra_lbits = /* extra bits for each length code */ - [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]; - -var extra_dbits = /* extra bits for each distance code */ - [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]; - -var extra_blbits = /* extra bits for each bit length code */ - [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]; - -var bl_order = - [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]; -/* eslint-enable comma-spacing,array-bracket-spacing */ - -/* The lengths of the bit length codes are sent in order of decreasing - * probability, to avoid transmitting the lengths for unused bit length codes. - */ - -/* =========================================================================== - * Local data. These are initialized only once. - */ - -// We pre-fill arrays with 0 to avoid uninitialized gaps - -var DIST_CODE_LEN = 512; /* see definition of array dist_code below */ - -// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1 -var static_ltree = new Array((L_CODES + 2) * 2); -zero(static_ltree); -/* The static literal tree. Since the bit lengths are imposed, there is no - * need for the L_CODES extra codes used during heap construction. However - * The codes 286 and 287 are needed to build a canonical tree (see _tr_init - * below). - */ - -var static_dtree = new Array(D_CODES * 2); -zero(static_dtree); -/* The static distance tree. (Actually a trivial tree since all codes use - * 5 bits.) - */ - -var _dist_code = new Array(DIST_CODE_LEN); -zero(_dist_code); -/* Distance codes. The first 256 values correspond to the distances - * 3 .. 258, the last 256 values correspond to the top 8 bits of - * the 15 bit distances. - */ - -var _length_code = new Array(MAX_MATCH - MIN_MATCH + 1); -zero(_length_code); -/* length code for each normalized match length (0 == MIN_MATCH) */ - -var base_length = new Array(LENGTH_CODES); -zero(base_length); -/* First normalized length for each code (0 = MIN_MATCH) */ - -var base_dist = new Array(D_CODES); -zero(base_dist); -/* First normalized distance for each code (0 = distance of 1) */ - - -function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) { - - this.static_tree = static_tree; /* static tree or NULL */ - this.extra_bits = extra_bits; /* extra bits for each code or NULL */ - this.extra_base = extra_base; /* base index for extra_bits */ - this.elems = elems; /* max number of elements in the tree */ - this.max_length = max_length; /* max bit length for the codes */ - - // show if `static_tree` has data or dummy - needed for monomorphic objects - this.has_stree = static_tree && static_tree.length; -} - - -var static_l_desc; -var static_d_desc; -var static_bl_desc; - - -function TreeDesc(dyn_tree, stat_desc) { - this.dyn_tree = dyn_tree; /* the dynamic tree */ - this.max_code = 0; /* largest code with non zero frequency */ - this.stat_desc = stat_desc; /* the corresponding static tree */ -} - - - -function d_code(dist) { - return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)]; -} - - -/* =========================================================================== - * Output a short LSB first on the stream. - * IN assertion: there is enough room in pendingBuf. - */ -function put_short(s, w) { -// put_byte(s, (uch)((w) & 0xff)); -// put_byte(s, (uch)((ush)(w) >> 8)); - s.pending_buf[s.pending++] = (w) & 0xff; - s.pending_buf[s.pending++] = (w >>> 8) & 0xff; -} - - -/* =========================================================================== - * Send a value on a given number of bits. - * IN assertion: length <= 16 and value fits in length bits. - */ -function send_bits(s, value, length) { - if (s.bi_valid > (Buf_size - length)) { - s.bi_buf |= (value << s.bi_valid) & 0xffff; - put_short(s, s.bi_buf); - s.bi_buf = value >> (Buf_size - s.bi_valid); - s.bi_valid += length - Buf_size; - } else { - s.bi_buf |= (value << s.bi_valid) & 0xffff; - s.bi_valid += length; - } -} - - -function send_code(s, c, tree) { - send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/); -} - - -/* =========================================================================== - * Reverse the first len bits of a code, using straightforward code (a faster - * method would use a table) - * IN assertion: 1 <= len <= 15 - */ -function bi_reverse(code, len) { - var res = 0; - do { - res |= code & 1; - code >>>= 1; - res <<= 1; - } while (--len > 0); - return res >>> 1; -} - - -/* =========================================================================== - * Flush the bit buffer, keeping at most 7 bits in it. - */ -function bi_flush(s) { - if (s.bi_valid === 16) { - put_short(s, s.bi_buf); - s.bi_buf = 0; - s.bi_valid = 0; - - } else if (s.bi_valid >= 8) { - s.pending_buf[s.pending++] = s.bi_buf & 0xff; - s.bi_buf >>= 8; - s.bi_valid -= 8; - } -} - - -/* =========================================================================== - * Compute the optimal bit lengths for a tree and update the total bit length - * for the current block. - * IN assertion: the fields freq and dad are set, heap[heap_max] and - * above are the tree nodes sorted by increasing frequency. - * OUT assertions: the field len is set to the optimal bit length, the - * array bl_count contains the frequencies for each bit length. - * The length opt_len is updated; static_len is also updated if stree is - * not null. - */ -function gen_bitlen(s, desc) -// deflate_state *s; -// tree_desc *desc; /* the tree descriptor */ -{ - var tree = desc.dyn_tree; - var max_code = desc.max_code; - var stree = desc.stat_desc.static_tree; - var has_stree = desc.stat_desc.has_stree; - var extra = desc.stat_desc.extra_bits; - var base = desc.stat_desc.extra_base; - var max_length = desc.stat_desc.max_length; - var h; /* heap index */ - var n, m; /* iterate over the tree elements */ - var bits; /* bit length */ - var xbits; /* extra bits */ - var f; /* frequency */ - var overflow = 0; /* number of elements with bit length too large */ - - for (bits = 0; bits <= MAX_BITS; bits++) { - s.bl_count[bits] = 0; - } - - /* In a first pass, compute the optimal bit lengths (which may - * overflow in the case of the bit length tree). - */ - tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */ - - for (h = s.heap_max + 1; h < HEAP_SIZE; h++) { - n = s.heap[h]; - bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1; - if (bits > max_length) { - bits = max_length; - overflow++; - } - tree[n * 2 + 1]/*.Len*/ = bits; - /* We overwrite tree[n].Dad which is no longer needed */ - - if (n > max_code) { continue; } /* not a leaf node */ - - s.bl_count[bits]++; - xbits = 0; - if (n >= base) { - xbits = extra[n - base]; - } - f = tree[n * 2]/*.Freq*/; - s.opt_len += f * (bits + xbits); - if (has_stree) { - s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits); - } - } - if (overflow === 0) { return; } - - // Trace((stderr,"\nbit length overflow\n")); - /* This happens for example on obj2 and pic of the Calgary corpus */ - - /* Find the first bit length which could increase: */ - do { - bits = max_length - 1; - while (s.bl_count[bits] === 0) { bits--; } - s.bl_count[bits]--; /* move one leaf down the tree */ - s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */ - s.bl_count[max_length]--; - /* The brother of the overflow item also moves one step up, - * but this does not affect bl_count[max_length] - */ - overflow -= 2; - } while (overflow > 0); - - /* Now recompute all bit lengths, scanning in increasing frequency. - * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all - * lengths instead of fixing only the wrong ones. This idea is taken - * from 'ar' written by Haruhiko Okumura.) - */ - for (bits = max_length; bits !== 0; bits--) { - n = s.bl_count[bits]; - while (n !== 0) { - m = s.heap[--h]; - if (m > max_code) { continue; } - if (tree[m * 2 + 1]/*.Len*/ !== bits) { - // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); - s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/; - tree[m * 2 + 1]/*.Len*/ = bits; - } - n--; - } - } -} - - -/* =========================================================================== - * Generate the codes for a given tree and bit counts (which need not be - * optimal). - * IN assertion: the array bl_count contains the bit length statistics for - * the given tree and the field len is set for all tree elements. - * OUT assertion: the field code is set for all tree elements of non - * zero code length. - */ -function gen_codes(tree, max_code, bl_count) -// ct_data *tree; /* the tree to decorate */ -// int max_code; /* largest code with non zero frequency */ -// ushf *bl_count; /* number of codes at each bit length */ -{ - var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */ - var code = 0; /* running code value */ - var bits; /* bit index */ - var n; /* code index */ - - /* The distribution counts are first used to generate the code values - * without bit reversal. - */ - for (bits = 1; bits <= MAX_BITS; bits++) { - next_code[bits] = code = (code + bl_count[bits - 1]) << 1; - } - /* Check that the bit counts in bl_count are consistent. The last code - * must be all ones. - */ - //Assert (code + bl_count[MAX_BITS]-1 == (1< length code (0..28) */ - length = 0; - for (code = 0; code < LENGTH_CODES - 1; code++) { - base_length[code] = length; - for (n = 0; n < (1 << extra_lbits[code]); n++) { - _length_code[length++] = code; - } - } - //Assert (length == 256, "tr_static_init: length != 256"); - /* Note that the length 255 (match length 258) can be represented - * in two different ways: code 284 + 5 bits or code 285, so we - * overwrite length_code[255] to use the best encoding: - */ - _length_code[length - 1] = code; - - /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ - dist = 0; - for (code = 0; code < 16; code++) { - base_dist[code] = dist; - for (n = 0; n < (1 << extra_dbits[code]); n++) { - _dist_code[dist++] = code; - } - } - //Assert (dist == 256, "tr_static_init: dist != 256"); - dist >>= 7; /* from now on, all distances are divided by 128 */ - for (; code < D_CODES; code++) { - base_dist[code] = dist << 7; - for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) { - _dist_code[256 + dist++] = code; - } - } - //Assert (dist == 256, "tr_static_init: 256+dist != 512"); - - /* Construct the codes of the static literal tree */ - for (bits = 0; bits <= MAX_BITS; bits++) { - bl_count[bits] = 0; - } - - n = 0; - while (n <= 143) { - static_ltree[n * 2 + 1]/*.Len*/ = 8; - n++; - bl_count[8]++; - } - while (n <= 255) { - static_ltree[n * 2 + 1]/*.Len*/ = 9; - n++; - bl_count[9]++; - } - while (n <= 279) { - static_ltree[n * 2 + 1]/*.Len*/ = 7; - n++; - bl_count[7]++; - } - while (n <= 287) { - static_ltree[n * 2 + 1]/*.Len*/ = 8; - n++; - bl_count[8]++; - } - /* Codes 286 and 287 do not exist, but we must include them in the - * tree construction to get a canonical Huffman tree (longest code - * all ones) - */ - gen_codes(static_ltree, L_CODES + 1, bl_count); - - /* The static distance tree is trivial: */ - for (n = 0; n < D_CODES; n++) { - static_dtree[n * 2 + 1]/*.Len*/ = 5; - static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5); - } - - // Now data ready and we can init static trees - static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS); - static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS); - static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS); - - //static_init_done = true; -} - - -/* =========================================================================== - * Initialize a new block. - */ -function init_block(s) { - var n; /* iterates over tree elements */ - - /* Initialize the trees. */ - for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; } - for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; } - for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; } - - s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1; - s.opt_len = s.static_len = 0; - s.last_lit = s.matches = 0; -} - - -/* =========================================================================== - * Flush the bit buffer and align the output on a byte boundary - */ -function bi_windup(s) -{ - if (s.bi_valid > 8) { - put_short(s, s.bi_buf); - } else if (s.bi_valid > 0) { - //put_byte(s, (Byte)s->bi_buf); - s.pending_buf[s.pending++] = s.bi_buf; - } - s.bi_buf = 0; - s.bi_valid = 0; -} - -/* =========================================================================== - * Copy a stored block, storing first the length and its - * one's complement if requested. - */ -function copy_block(s, buf, len, header) -//DeflateState *s; -//charf *buf; /* the input data */ -//unsigned len; /* its length */ -//int header; /* true if block header must be written */ -{ - bi_windup(s); /* align on byte boundary */ - - if (header) { - put_short(s, len); - put_short(s, ~len); - } -// while (len--) { -// put_byte(s, *buf++); -// } - utils.arraySet(s.pending_buf, s.window, buf, len, s.pending); - s.pending += len; -} - -/* =========================================================================== - * Compares to subtrees, using the tree depth as tie breaker when - * the subtrees have equal frequency. This minimizes the worst case length. - */ -function smaller(tree, n, m, depth) { - var _n2 = n * 2; - var _m2 = m * 2; - return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ || - (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m])); -} - -/* =========================================================================== - * Restore the heap property by moving down the tree starting at node k, - * exchanging a node with the smallest of its two sons if necessary, stopping - * when the heap property is re-established (each father smaller than its - * two sons). - */ -function pqdownheap(s, tree, k) -// deflate_state *s; -// ct_data *tree; /* the tree to restore */ -// int k; /* node to move down */ -{ - var v = s.heap[k]; - var j = k << 1; /* left son of k */ - while (j <= s.heap_len) { - /* Set j to the smallest of the two sons: */ - if (j < s.heap_len && - smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) { - j++; - } - /* Exit if v is smaller than both sons */ - if (smaller(tree, v, s.heap[j], s.depth)) { break; } - - /* Exchange v with the smallest son */ - s.heap[k] = s.heap[j]; - k = j; - - /* And continue down the tree, setting j to the left son of k */ - j <<= 1; - } - s.heap[k] = v; -} - - -// inlined manually -// var SMALLEST = 1; - -/* =========================================================================== - * Send the block data compressed using the given Huffman trees - */ -function compress_block(s, ltree, dtree) -// deflate_state *s; -// const ct_data *ltree; /* literal tree */ -// const ct_data *dtree; /* distance tree */ -{ - var dist; /* distance of matched string */ - var lc; /* match length or unmatched char (if dist == 0) */ - var lx = 0; /* running index in l_buf */ - var code; /* the code to send */ - var extra; /* number of extra bits to send */ - - if (s.last_lit !== 0) { - do { - dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]); - lc = s.pending_buf[s.l_buf + lx]; - lx++; - - if (dist === 0) { - send_code(s, lc, ltree); /* send a literal byte */ - //Tracecv(isgraph(lc), (stderr," '%c' ", lc)); - } else { - /* Here, lc is the match length - MIN_MATCH */ - code = _length_code[lc]; - send_code(s, code + LITERALS + 1, ltree); /* send the length code */ - extra = extra_lbits[code]; - if (extra !== 0) { - lc -= base_length[code]; - send_bits(s, lc, extra); /* send the extra length bits */ - } - dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - //Assert (code < D_CODES, "bad d_code"); - - send_code(s, code, dtree); /* send the distance code */ - extra = extra_dbits[code]; - if (extra !== 0) { - dist -= base_dist[code]; - send_bits(s, dist, extra); /* send the extra distance bits */ - } - } /* literal or match pair ? */ - - /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ - //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, - // "pendingBuf overflow"); - - } while (lx < s.last_lit); - } - - send_code(s, END_BLOCK, ltree); -} - - -/* =========================================================================== - * Construct one Huffman tree and assigns the code bit strings and lengths. - * Update the total bit length for the current block. - * IN assertion: the field freq is set for all tree elements. - * OUT assertions: the fields len and code are set to the optimal bit length - * and corresponding code. The length opt_len is updated; static_len is - * also updated if stree is not null. The field max_code is set. - */ -function build_tree(s, desc) -// deflate_state *s; -// tree_desc *desc; /* the tree descriptor */ -{ - var tree = desc.dyn_tree; - var stree = desc.stat_desc.static_tree; - var has_stree = desc.stat_desc.has_stree; - var elems = desc.stat_desc.elems; - var n, m; /* iterate over heap elements */ - var max_code = -1; /* largest code with non zero frequency */ - var node; /* new node being created */ - - /* Construct the initial heap, with least frequent element in - * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. - * heap[0] is not used. - */ - s.heap_len = 0; - s.heap_max = HEAP_SIZE; - - for (n = 0; n < elems; n++) { - if (tree[n * 2]/*.Freq*/ !== 0) { - s.heap[++s.heap_len] = max_code = n; - s.depth[n] = 0; - - } else { - tree[n * 2 + 1]/*.Len*/ = 0; - } - } - - /* The pkzip format requires that at least one distance code exists, - * and that at least one bit should be sent even if there is only one - * possible code. So to avoid special checks later on we force at least - * two codes of non zero frequency. - */ - while (s.heap_len < 2) { - node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0); - tree[node * 2]/*.Freq*/ = 1; - s.depth[node] = 0; - s.opt_len--; - - if (has_stree) { - s.static_len -= stree[node * 2 + 1]/*.Len*/; - } - /* node is 0 or 1 so it does not have extra bits */ - } - desc.max_code = max_code; - - /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, - * establish sub-heaps of increasing lengths: - */ - for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); } - - /* Construct the Huffman tree by repeatedly combining the least two - * frequent nodes. - */ - node = elems; /* next internal node of the tree */ - do { - //pqremove(s, tree, n); /* n = node of least frequency */ - /*** pqremove ***/ - n = s.heap[1/*SMALLEST*/]; - s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--]; - pqdownheap(s, tree, 1/*SMALLEST*/); - /***/ - - m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */ - - s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */ - s.heap[--s.heap_max] = m; - - /* Create a new node father of n and m */ - tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/; - s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1; - tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node; - - /* and insert the new node in the heap */ - s.heap[1/*SMALLEST*/] = node++; - pqdownheap(s, tree, 1/*SMALLEST*/); - - } while (s.heap_len >= 2); - - s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/]; - - /* At this point, the fields freq and dad are set. We can now - * generate the bit lengths. - */ - gen_bitlen(s, desc); - - /* The field len is now set, we can generate the bit codes */ - gen_codes(tree, max_code, s.bl_count); -} - - -/* =========================================================================== - * Scan a literal or distance tree to determine the frequencies of the codes - * in the bit length tree. - */ -function scan_tree(s, tree, max_code) -// deflate_state *s; -// ct_data *tree; /* the tree to be scanned */ -// int max_code; /* and its largest code of non zero frequency */ -{ - var n; /* iterates over all tree elements */ - var prevlen = -1; /* last emitted length */ - var curlen; /* length of current code */ - - var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ - - var count = 0; /* repeat count of the current code */ - var max_count = 7; /* max repeat count */ - var min_count = 4; /* min repeat count */ - - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } - tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */ - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; - - if (++count < max_count && curlen === nextlen) { - continue; - - } else if (count < min_count) { - s.bl_tree[curlen * 2]/*.Freq*/ += count; - - } else if (curlen !== 0) { - - if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; } - s.bl_tree[REP_3_6 * 2]/*.Freq*/++; - - } else if (count <= 10) { - s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++; - - } else { - s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++; - } - - count = 0; - prevlen = curlen; - - if (nextlen === 0) { - max_count = 138; - min_count = 3; - - } else if (curlen === nextlen) { - max_count = 6; - min_count = 3; - - } else { - max_count = 7; - min_count = 4; - } - } -} - - -/* =========================================================================== - * Send a literal or distance tree in compressed form, using the codes in - * bl_tree. - */ -function send_tree(s, tree, max_code) -// deflate_state *s; -// ct_data *tree; /* the tree to be scanned */ -// int max_code; /* and its largest code of non zero frequency */ -{ - var n; /* iterates over all tree elements */ - var prevlen = -1; /* last emitted length */ - var curlen; /* length of current code */ - - var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ - - var count = 0; /* repeat count of the current code */ - var max_count = 7; /* max repeat count */ - var min_count = 4; /* min repeat count */ - - /* tree[max_code+1].Len = -1; */ /* guard already set */ - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; - - if (++count < max_count && curlen === nextlen) { - continue; - - } else if (count < min_count) { - do { send_code(s, curlen, s.bl_tree); } while (--count !== 0); - - } else if (curlen !== 0) { - if (curlen !== prevlen) { - send_code(s, curlen, s.bl_tree); - count--; - } - //Assert(count >= 3 && count <= 6, " 3_6?"); - send_code(s, REP_3_6, s.bl_tree); - send_bits(s, count - 3, 2); - - } else if (count <= 10) { - send_code(s, REPZ_3_10, s.bl_tree); - send_bits(s, count - 3, 3); - - } else { - send_code(s, REPZ_11_138, s.bl_tree); - send_bits(s, count - 11, 7); - } - - count = 0; - prevlen = curlen; - if (nextlen === 0) { - max_count = 138; - min_count = 3; - - } else if (curlen === nextlen) { - max_count = 6; - min_count = 3; - - } else { - max_count = 7; - min_count = 4; - } - } -} - - -/* =========================================================================== - * Construct the Huffman tree for the bit lengths and return the index in - * bl_order of the last bit length code to send. - */ -function build_bl_tree(s) { - var max_blindex; /* index of last bit length code of non zero freq */ - - /* Determine the bit length frequencies for literal and distance trees */ - scan_tree(s, s.dyn_ltree, s.l_desc.max_code); - scan_tree(s, s.dyn_dtree, s.d_desc.max_code); - - /* Build the bit length tree: */ - build_tree(s, s.bl_desc); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - */ - - /* Determine the number of bit length codes to send. The pkzip format - * requires that at least 4 bit length codes be sent. (appnote.txt says - * 3 but the actual value used is 4.) - */ - for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) { - if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) { - break; - } - } - /* Update opt_len to include the bit length tree and counts */ - s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; - //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", - // s->opt_len, s->static_len)); - - return max_blindex; -} - - -/* =========================================================================== - * Send the header for a block using dynamic Huffman trees: the counts, the - * lengths of the bit length codes, the literal tree and the distance tree. - * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. - */ -function send_all_trees(s, lcodes, dcodes, blcodes) -// deflate_state *s; -// int lcodes, dcodes, blcodes; /* number of codes for each tree */ -{ - var rank; /* index in bl_order */ - - //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); - //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, - // "too many codes"); - //Tracev((stderr, "\nbl counts: ")); - send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ - send_bits(s, dcodes - 1, 5); - send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ - for (rank = 0; rank < blcodes; rank++) { - //Tracev((stderr, "\nbl code %2d ", bl_order[rank])); - send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3); - } - //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); - - send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */ - //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); - - send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */ - //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); -} - - -/* =========================================================================== - * Check if the data type is TEXT or BINARY, using the following algorithm: - * - TEXT if the two conditions below are satisfied: - * a) There are no non-portable control characters belonging to the - * "black list" (0..6, 14..25, 28..31). - * b) There is at least one printable character belonging to the - * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). - * - BINARY otherwise. - * - The following partially-portable control characters form a - * "gray list" that is ignored in this detection algorithm: - * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). - * IN assertion: the fields Freq of dyn_ltree are set. - */ -function detect_data_type(s) { - /* black_mask is the bit mask of black-listed bytes - * set bits 0..6, 14..25, and 28..31 - * 0xf3ffc07f = binary 11110011111111111100000001111111 - */ - var black_mask = 0xf3ffc07f; - var n; - - /* Check for non-textual ("black-listed") bytes. */ - for (n = 0; n <= 31; n++, black_mask >>>= 1) { - if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) { - return Z_BINARY; - } - } - - /* Check for textual ("white-listed") bytes. */ - if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 || - s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) { - return Z_TEXT; - } - for (n = 32; n < LITERALS; n++) { - if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) { - return Z_TEXT; - } - } - - /* There are no "black-listed" or "white-listed" bytes: - * this stream either is empty or has tolerated ("gray-listed") bytes only. - */ - return Z_BINARY; -} - - -var static_init_done = false; - -/* =========================================================================== - * Initialize the tree data structures for a new zlib stream. - */ -function _tr_init(s) -{ - - if (!static_init_done) { - tr_static_init(); - static_init_done = true; - } - - s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc); - s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc); - s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc); - - s.bi_buf = 0; - s.bi_valid = 0; - - /* Initialize the first block of the first file: */ - init_block(s); -} - - -/* =========================================================================== - * Send a stored block - */ -function _tr_stored_block(s, buf, stored_len, last) -//DeflateState *s; -//charf *buf; /* input block */ -//ulg stored_len; /* length of input block */ -//int last; /* one if this is the last block for a file */ -{ - send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */ - copy_block(s, buf, stored_len, true); /* with header */ -} - - -/* =========================================================================== - * Send one empty static block to give enough lookahead for inflate. - * This takes 10 bits, of which 7 may remain in the bit buffer. - */ -function _tr_align(s) { - send_bits(s, STATIC_TREES << 1, 3); - send_code(s, END_BLOCK, static_ltree); - bi_flush(s); -} - - -/* =========================================================================== - * Determine the best encoding for the current block: dynamic trees, static - * trees or store, and output the encoded block to the zip file. - */ -function _tr_flush_block(s, buf, stored_len, last) -//DeflateState *s; -//charf *buf; /* input block, or NULL if too old */ -//ulg stored_len; /* length of input block */ -//int last; /* one if this is the last block for a file */ -{ - var opt_lenb, static_lenb; /* opt_len and static_len in bytes */ - var max_blindex = 0; /* index of last bit length code of non zero freq */ - - /* Build the Huffman trees unless a stored block is forced */ - if (s.level > 0) { - - /* Check if the file is binary or text */ - if (s.strm.data_type === Z_UNKNOWN) { - s.strm.data_type = detect_data_type(s); - } - - /* Construct the literal and distance trees */ - build_tree(s, s.l_desc); - // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, - // s->static_len)); - - build_tree(s, s.d_desc); - // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, - // s->static_len)); - /* At this point, opt_len and static_len are the total bit lengths of - * the compressed block data, excluding the tree representations. - */ - - /* Build the bit length tree for the above two trees, and get the index - * in bl_order of the last bit length code to send. - */ - max_blindex = build_bl_tree(s); - - /* Determine the best encoding. Compute the block lengths in bytes. */ - opt_lenb = (s.opt_len + 3 + 7) >>> 3; - static_lenb = (s.static_len + 3 + 7) >>> 3; - - // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", - // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, - // s->last_lit)); - - if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; } - - } else { - // Assert(buf != (char*)0, "lost buf"); - opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ - } - - if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) { - /* 4: two words for the lengths */ - - /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - * Otherwise we can't have processed more than WSIZE input bytes since - * the last block flush, because compression would have been - * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to - * transform a block into a stored block. - */ - _tr_stored_block(s, buf, stored_len, last); - - } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) { - - send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3); - compress_block(s, static_ltree, static_dtree); - - } else { - send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3); - send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1); - compress_block(s, s.dyn_ltree, s.dyn_dtree); - } - // Assert (s->compressed_len == s->bits_sent, "bad compressed size"); - /* The above check is made mod 2^32, for files larger than 512 MB - * and uLong implemented on 32 bits. - */ - init_block(s); - - if (last) { - bi_windup(s); - } - // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, - // s->compressed_len-7*last)); -} - -/* =========================================================================== - * Save the match info and tally the frequency counts. Return true if - * the current block must be flushed. - */ -function _tr_tally(s, dist, lc) -// deflate_state *s; -// unsigned dist; /* distance of matched string */ -// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ -{ - //var out_length, in_length, dcode; - - s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff; - s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff; - - s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff; - s.last_lit++; - - if (dist === 0) { - /* lc is the unmatched char */ - s.dyn_ltree[lc * 2]/*.Freq*/++; - } else { - s.matches++; - /* Here, lc is the match length - MIN_MATCH */ - dist--; /* dist = match distance - 1 */ - //Assert((ush)dist < (ush)MAX_DIST(s) && - // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && - // (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); - - s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++; - s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++; - } - -// (!) This block is disabled in zlib defaults, -// don't enable it for binary compatibility - -//#ifdef TRUNCATE_BLOCK -// /* Try to guess if it is profitable to stop the current block here */ -// if ((s.last_lit & 0x1fff) === 0 && s.level > 2) { -// /* Compute an upper bound for the compressed length */ -// out_length = s.last_lit*8; -// in_length = s.strstart - s.block_start; -// -// for (dcode = 0; dcode < D_CODES; dcode++) { -// out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]); -// } -// out_length >>>= 3; -// //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", -// // s->last_lit, in_length, out_length, -// // 100L - out_length*100L/in_length)); -// if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) { -// return true; -// } -// } -//#endif - - return (s.last_lit === s.lit_bufsize - 1); - /* We avoid equality with lit_bufsize because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ -} - -exports._tr_init = _tr_init; -exports._tr_stored_block = _tr_stored_block; -exports._tr_flush_block = _tr_flush_block; -exports._tr_tally = _tr_tally; -exports._tr_align = _tr_align; - -},{"../utils/common":35}],45:[function(require,module,exports){ -'use strict'; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -function ZStream() { - /* next input byte */ - this.input = null; // JS specific, because we have no pointers - this.next_in = 0; - /* number of bytes available at input */ - this.avail_in = 0; - /* total number of input bytes read so far */ - this.total_in = 0; - /* next output byte should be put there */ - this.output = null; // JS specific, because we have no pointers - this.next_out = 0; - /* remaining free space at output */ - this.avail_out = 0; - /* total number of bytes output so far */ - this.total_out = 0; - /* last error message, NULL if no error */ - this.msg = ''/*Z_NULL*/; - /* not visible by applications */ - this.state = null; - /* best guess about the data type: binary or text */ - this.data_type = 2/*Z_UNKNOWN*/; - /* adler32 value of the uncompressed data */ - this.adler = 0; -} - -module.exports = ZStream; - -},{}],46:[function(require,module,exports){ -(function (process){ -'use strict'; - -if (!process.version || - process.version.indexOf('v0.') === 0 || - process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { - module.exports = nextTick; -} else { - module.exports = process.nextTick; -} - -function nextTick(fn, arg1, arg2, arg3) { - if (typeof fn !== 'function') { - throw new TypeError('"callback" argument must be a function'); - } - var len = arguments.length; - var args, i; - switch (len) { - case 0: - case 1: - return process.nextTick(fn); - case 2: - return process.nextTick(function afterTickOne() { - fn.call(null, arg1); - }); - case 3: - return process.nextTick(function afterTickTwo() { - fn.call(null, arg1, arg2); - }); - case 4: - return process.nextTick(function afterTickThree() { - fn.call(null, arg1, arg2, arg3); - }); - default: - args = new Array(len - 1); - i = 0; - while (i < args.length) { - args[i++] = arguments[i]; - } - return process.nextTick(function afterTick() { - fn.apply(null, args); - }); - } -} - -}).call(this,require('_process')) -},{"_process":47}],47:[function(require,module,exports){ -// shim for using process in browser -var process = module.exports = {}; - -// cached from whatever global is present so that test runners that stub it -// don't break things. But we need to wrap it in a try catch in case it is -// wrapped in strict mode code which doesn't define any globals. It's inside a -// function because try/catches deoptimize in certain engines. - -var cachedSetTimeout; -var cachedClearTimeout; - -function defaultSetTimout() { - throw new Error('setTimeout has not been defined'); -} -function defaultClearTimeout () { - throw new Error('clearTimeout has not been defined'); -} -(function () { - try { - if (typeof setTimeout === 'function') { - cachedSetTimeout = setTimeout; - } else { - cachedSetTimeout = defaultSetTimout; - } - } catch (e) { - cachedSetTimeout = defaultSetTimout; - } - try { - if (typeof clearTimeout === 'function') { - cachedClearTimeout = clearTimeout; - } else { - cachedClearTimeout = defaultClearTimeout; - } - } catch (e) { - cachedClearTimeout = defaultClearTimeout; - } -} ()) -function runTimeout(fun) { - if (cachedSetTimeout === setTimeout) { - //normal enviroments in sane situations - return setTimeout(fun, 0); - } - // if setTimeout wasn't available but was latter defined - if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { - cachedSetTimeout = setTimeout; - return setTimeout(fun, 0); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedSetTimeout(fun, 0); - } catch(e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedSetTimeout.call(null, fun, 0); - } catch(e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error - return cachedSetTimeout.call(this, fun, 0); - } - } - - -} -function runClearTimeout(marker) { - if (cachedClearTimeout === clearTimeout) { - //normal enviroments in sane situations - return clearTimeout(marker); - } - // if clearTimeout wasn't available but was latter defined - if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { - cachedClearTimeout = clearTimeout; - return clearTimeout(marker); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedClearTimeout(marker); - } catch (e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedClearTimeout.call(null, marker); - } catch (e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. - // Some versions of I.E. have different rules for clearTimeout vs setTimeout - return cachedClearTimeout.call(this, marker); - } - } - - - -} -var queue = []; -var draining = false; -var currentQueue; -var queueIndex = -1; - -function cleanUpNextTick() { - if (!draining || !currentQueue) { - return; - } - draining = false; - if (currentQueue.length) { - queue = currentQueue.concat(queue); - } else { - queueIndex = -1; - } - if (queue.length) { - drainQueue(); - } -} - -function drainQueue() { - if (draining) { - return; - } - var timeout = runTimeout(cleanUpNextTick); - draining = true; - - var len = queue.length; - while(len) { - currentQueue = queue; - queue = []; - while (++queueIndex < len) { - if (currentQueue) { - currentQueue[queueIndex].run(); - } - } - queueIndex = -1; - len = queue.length; - } - currentQueue = null; - draining = false; - runClearTimeout(timeout); -} - -process.nextTick = function (fun) { - var args = new Array(arguments.length - 1); - if (arguments.length > 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - runTimeout(drainQueue); - } -}; - -// v8 likes predictible objects -function Item(fun, array) { - this.fun = fun; - this.array = array; -} -Item.prototype.run = function () { - this.fun.apply(null, this.array); -}; -process.title = 'browser'; -process.browser = true; -process.env = {}; -process.argv = []; -process.version = ''; // empty string to avoid regexp issues -process.versions = {}; - -function noop() {} - -process.on = noop; -process.addListener = noop; -process.once = noop; -process.off = noop; -process.removeListener = noop; -process.removeAllListeners = noop; -process.emit = noop; -process.prependListener = noop; -process.prependOnceListener = noop; - -process.listeners = function (name) { return [] } - -process.binding = function (name) { - throw new Error('process.binding is not supported'); -}; - -process.cwd = function () { return '/' }; -process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); -}; -process.umask = function() { return 0; }; - -},{}],48:[function(require,module,exports){ -module.exports = require('./lib/_stream_duplex.js'); - -},{"./lib/_stream_duplex.js":49}],49:[function(require,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// a duplex stream is just a stream that is both readable and writable. -// Since JS doesn't have multiple prototypal inheritance, this class -// prototypally inherits from Readable, and then parasitically from -// Writable. - -'use strict'; - -/**/ - -var processNextTick = require('process-nextick-args'); -/**/ - -/**/ -var objectKeys = Object.keys || function (obj) { - var keys = []; - for (var key in obj) { - keys.push(key); - }return keys; -}; -/**/ - -module.exports = Duplex; - -/**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ - -var Readable = require('./_stream_readable'); -var Writable = require('./_stream_writable'); - -util.inherits(Duplex, Readable); - -var keys = objectKeys(Writable.prototype); -for (var v = 0; v < keys.length; v++) { - var method = keys[v]; - if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; -} - -function Duplex(options) { - if (!(this instanceof Duplex)) return new Duplex(options); - - Readable.call(this, options); - Writable.call(this, options); - - if (options && options.readable === false) this.readable = false; - - if (options && options.writable === false) this.writable = false; - - this.allowHalfOpen = true; - if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; - - this.once('end', onend); -} - -// the no-half-open enforcer -function onend() { - // if we allow half-open state, or if the writable side ended, - // then we're ok. - if (this.allowHalfOpen || this._writableState.ended) return; - - // no more data can be written. - // But allow more writes to happen in this tick. - processNextTick(onEndNT, this); -} - -function onEndNT(self) { - self.end(); -} - -Object.defineProperty(Duplex.prototype, 'destroyed', { - get: function () { - if (this._readableState === undefined || this._writableState === undefined) { - return false; - } - return this._readableState.destroyed && this._writableState.destroyed; - }, - set: function (value) { - // we ignore the value if the stream - // has not been initialized yet - if (this._readableState === undefined || this._writableState === undefined) { - return; - } - - // backward compatibility, the user is explicitly - // managing destroyed - this._readableState.destroyed = value; - this._writableState.destroyed = value; - } -}); - -Duplex.prototype._destroy = function (err, cb) { - this.push(null); - this.end(); - - processNextTick(cb, err); -}; - -function forEach(xs, f) { - for (var i = 0, l = xs.length; i < l; i++) { - f(xs[i], i); - } -} -},{"./_stream_readable":51,"./_stream_writable":53,"core-util-is":29,"inherits":32,"process-nextick-args":46}],50:[function(require,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// a passthrough stream. -// basically just the most minimal sort of Transform stream. -// Every written chunk gets output as-is. - -'use strict'; - -module.exports = PassThrough; - -var Transform = require('./_stream_transform'); - -/**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ - -util.inherits(PassThrough, Transform); - -function PassThrough(options) { - if (!(this instanceof PassThrough)) return new PassThrough(options); - - Transform.call(this, options); -} - -PassThrough.prototype._transform = function (chunk, encoding, cb) { - cb(null, chunk); -}; -},{"./_stream_transform":52,"core-util-is":29,"inherits":32}],51:[function(require,module,exports){ -(function (process,global){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -'use strict'; - -/**/ - -var processNextTick = require('process-nextick-args'); -/**/ - -module.exports = Readable; - -/**/ -var isArray = require('isarray'); -/**/ - -/**/ -var Duplex; -/**/ - -Readable.ReadableState = ReadableState; - -/**/ -var EE = require('events').EventEmitter; - -var EElistenerCount = function (emitter, type) { - return emitter.listeners(type).length; -}; -/**/ - -/**/ -var Stream = require('./internal/streams/stream'); -/**/ - -// TODO(bmeurer): Change this back to const once hole checks are -// properly optimized away early in Ignition+TurboFan. -/**/ -var Buffer = require('safe-buffer').Buffer; -var OurUint8Array = global.Uint8Array || function () {}; -function _uint8ArrayToBuffer(chunk) { - return Buffer.from(chunk); -} -function _isUint8Array(obj) { - return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; -} -/**/ - -/**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ - -/**/ -var debugUtil = require('util'); -var debug = void 0; -if (debugUtil && debugUtil.debuglog) { - debug = debugUtil.debuglog('stream'); -} else { - debug = function () {}; -} -/**/ - -var BufferList = require('./internal/streams/BufferList'); -var destroyImpl = require('./internal/streams/destroy'); -var StringDecoder; - -util.inherits(Readable, Stream); - -var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; - -function prependListener(emitter, event, fn) { - // Sadly this is not cacheable as some libraries bundle their own - // event emitter implementation with them. - if (typeof emitter.prependListener === 'function') { - return emitter.prependListener(event, fn); - } else { - // This is a hack to make sure that our error handler is attached before any - // userland ones. NEVER DO THIS. This is here only because this code needs - // to continue to work with older versions of Node.js that do not include - // the prependListener() method. The goal is to eventually remove this hack. - if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; - } -} - -function ReadableState(options, stream) { - Duplex = Duplex || require('./_stream_duplex'); - - options = options || {}; - - // object stream flag. Used to make read(n) ignore n and to - // make all the buffer merging and length checks go away - this.objectMode = !!options.objectMode; - - if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; - - // the point at which it stops calling _read() to fill the buffer - // Note: 0 is a valid value, means "don't call _read preemptively ever" - var hwm = options.highWaterMark; - var defaultHwm = this.objectMode ? 16 : 16 * 1024; - this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; - - // cast to ints. - this.highWaterMark = Math.floor(this.highWaterMark); - - // A linked list is used to store data chunks instead of an array because the - // linked list can remove elements from the beginning faster than - // array.shift() - this.buffer = new BufferList(); - this.length = 0; - this.pipes = null; - this.pipesCount = 0; - this.flowing = null; - this.ended = false; - this.endEmitted = false; - this.reading = false; - - // a flag to be able to tell if the event 'readable'/'data' is emitted - // immediately, or on a later tick. We set this to true at first, because - // any actions that shouldn't happen until "later" should generally also - // not happen before the first read call. - this.sync = true; - - // whenever we return null, then we set a flag to say - // that we're awaiting a 'readable' event emission. - this.needReadable = false; - this.emittedReadable = false; - this.readableListening = false; - this.resumeScheduled = false; - - // has it been destroyed - this.destroyed = false; - - // Crypto is kind of old and crusty. Historically, its default string - // encoding is 'binary' so we have to make this configurable. - // Everything else in the universe uses 'utf8', though. - this.defaultEncoding = options.defaultEncoding || 'utf8'; - - // the number of writers that are awaiting a drain event in .pipe()s - this.awaitDrain = 0; - - // if true, a maybeReadMore has been scheduled - this.readingMore = false; - - this.decoder = null; - this.encoding = null; - if (options.encoding) { - if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; - this.decoder = new StringDecoder(options.encoding); - this.encoding = options.encoding; - } -} - -function Readable(options) { - Duplex = Duplex || require('./_stream_duplex'); - - if (!(this instanceof Readable)) return new Readable(options); - - this._readableState = new ReadableState(options, this); - - // legacy - this.readable = true; - - if (options) { - if (typeof options.read === 'function') this._read = options.read; - - if (typeof options.destroy === 'function') this._destroy = options.destroy; - } - - Stream.call(this); -} - -Object.defineProperty(Readable.prototype, 'destroyed', { - get: function () { - if (this._readableState === undefined) { - return false; - } - return this._readableState.destroyed; - }, - set: function (value) { - // we ignore the value if the stream - // has not been initialized yet - if (!this._readableState) { - return; - } - - // backward compatibility, the user is explicitly - // managing destroyed - this._readableState.destroyed = value; - } -}); - -Readable.prototype.destroy = destroyImpl.destroy; -Readable.prototype._undestroy = destroyImpl.undestroy; -Readable.prototype._destroy = function (err, cb) { - this.push(null); - cb(err); -}; - -// Manually shove something into the read() buffer. -// This returns true if the highWaterMark has not been hit yet, -// similar to how Writable.write() returns true if you should -// write() some more. -Readable.prototype.push = function (chunk, encoding) { - var state = this._readableState; - var skipChunkCheck; - - if (!state.objectMode) { - if (typeof chunk === 'string') { - encoding = encoding || state.defaultEncoding; - if (encoding !== state.encoding) { - chunk = Buffer.from(chunk, encoding); - encoding = ''; - } - skipChunkCheck = true; - } - } else { - skipChunkCheck = true; - } - - return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); -}; - -// Unshift should *always* be something directly out of read() -Readable.prototype.unshift = function (chunk) { - return readableAddChunk(this, chunk, null, true, false); -}; - -function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { - var state = stream._readableState; - if (chunk === null) { - state.reading = false; - onEofChunk(stream, state); - } else { - var er; - if (!skipChunkCheck) er = chunkInvalid(state, chunk); - if (er) { - stream.emit('error', er); - } else if (state.objectMode || chunk && chunk.length > 0) { - if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { - chunk = _uint8ArrayToBuffer(chunk); - } - - if (addToFront) { - if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); - } else if (state.ended) { - stream.emit('error', new Error('stream.push() after EOF')); - } else { - state.reading = false; - if (state.decoder && !encoding) { - chunk = state.decoder.write(chunk); - if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); - } else { - addChunk(stream, state, chunk, false); - } - } - } else if (!addToFront) { - state.reading = false; - } - } - - return needMoreData(state); -} - -function addChunk(stream, state, chunk, addToFront) { - if (state.flowing && state.length === 0 && !state.sync) { - stream.emit('data', chunk); - stream.read(0); - } else { - // update the buffer info. - state.length += state.objectMode ? 1 : chunk.length; - if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); - - if (state.needReadable) emitReadable(stream); - } - maybeReadMore(stream, state); -} - -function chunkInvalid(state, chunk) { - var er; - if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { - er = new TypeError('Invalid non-string/buffer chunk'); - } - return er; -} - -// if it's past the high water mark, we can push in some more. -// Also, if we have no data yet, we can stand some -// more bytes. This is to work around cases where hwm=0, -// such as the repl. Also, if the push() triggered a -// readable event, and the user called read(largeNumber) such that -// needReadable was set, then we ought to push more, so that another -// 'readable' event will be triggered. -function needMoreData(state) { - return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); -} - -Readable.prototype.isPaused = function () { - return this._readableState.flowing === false; -}; - -// backwards compatibility. -Readable.prototype.setEncoding = function (enc) { - if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; - this._readableState.decoder = new StringDecoder(enc); - this._readableState.encoding = enc; - return this; -}; - -// Don't raise the hwm > 8MB -var MAX_HWM = 0x800000; -function computeNewHighWaterMark(n) { - if (n >= MAX_HWM) { - n = MAX_HWM; - } else { - // Get the next highest power of 2 to prevent increasing hwm excessively in - // tiny amounts - n--; - n |= n >>> 1; - n |= n >>> 2; - n |= n >>> 4; - n |= n >>> 8; - n |= n >>> 16; - n++; - } - return n; -} - -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function howMuchToRead(n, state) { - if (n <= 0 || state.length === 0 && state.ended) return 0; - if (state.objectMode) return 1; - if (n !== n) { - // Only flow one buffer at a time - if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; - } - // If we're asking for more than the current hwm, then raise the hwm. - if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); - if (n <= state.length) return n; - // Don't have enough - if (!state.ended) { - state.needReadable = true; - return 0; - } - return state.length; -} - -// you can override either this method, or the async _read(n) below. -Readable.prototype.read = function (n) { - debug('read', n); - n = parseInt(n, 10); - var state = this._readableState; - var nOrig = n; - - if (n !== 0) state.emittedReadable = false; - - // if we're doing read(0) to trigger a readable event, but we - // already have a bunch of data in the buffer, then just trigger - // the 'readable' event and move on. - if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { - debug('read: emitReadable', state.length, state.ended); - if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); - return null; - } - - n = howMuchToRead(n, state); - - // if we've ended, and we're now clear, then finish it up. - if (n === 0 && state.ended) { - if (state.length === 0) endReadable(this); - return null; - } - - // All the actual chunk generation logic needs to be - // *below* the call to _read. The reason is that in certain - // synthetic stream cases, such as passthrough streams, _read - // may be a completely synchronous operation which may change - // the state of the read buffer, providing enough data when - // before there was *not* enough. - // - // So, the steps are: - // 1. Figure out what the state of things will be after we do - // a read from the buffer. - // - // 2. If that resulting state will trigger a _read, then call _read. - // Note that this may be asynchronous, or synchronous. Yes, it is - // deeply ugly to write APIs this way, but that still doesn't mean - // that the Readable class should behave improperly, as streams are - // designed to be sync/async agnostic. - // Take note if the _read call is sync or async (ie, if the read call - // has returned yet), so that we know whether or not it's safe to emit - // 'readable' etc. - // - // 3. Actually pull the requested chunks out of the buffer and return. - - // if we need a readable event, then we need to do some reading. - var doRead = state.needReadable; - debug('need readable', doRead); - - // if we currently have less than the highWaterMark, then also read some - if (state.length === 0 || state.length - n < state.highWaterMark) { - doRead = true; - debug('length less than watermark', doRead); - } - - // however, if we've ended, then there's no point, and if we're already - // reading, then it's unnecessary. - if (state.ended || state.reading) { - doRead = false; - debug('reading or ended', doRead); - } else if (doRead) { - debug('do read'); - state.reading = true; - state.sync = true; - // if the length is currently zero, then we *need* a readable event. - if (state.length === 0) state.needReadable = true; - // call internal read method - this._read(state.highWaterMark); - state.sync = false; - // If _read pushed data synchronously, then `reading` will be false, - // and we need to re-evaluate how much data we can return to the user. - if (!state.reading) n = howMuchToRead(nOrig, state); - } - - var ret; - if (n > 0) ret = fromList(n, state);else ret = null; - - if (ret === null) { - state.needReadable = true; - n = 0; - } else { - state.length -= n; - } - - if (state.length === 0) { - // If we have nothing in the buffer, then we want to know - // as soon as we *do* get something into the buffer. - if (!state.ended) state.needReadable = true; - - // If we tried to read() past the EOF, then emit end on the next tick. - if (nOrig !== n && state.ended) endReadable(this); - } - - if (ret !== null) this.emit('data', ret); - - return ret; -}; - -function onEofChunk(stream, state) { - if (state.ended) return; - if (state.decoder) { - var chunk = state.decoder.end(); - if (chunk && chunk.length) { - state.buffer.push(chunk); - state.length += state.objectMode ? 1 : chunk.length; - } - } - state.ended = true; - - // emit 'readable' now to make sure it gets picked up. - emitReadable(stream); -} - -// Don't emit readable right away in sync mode, because this can trigger -// another read() call => stack overflow. This way, it might trigger -// a nextTick recursion warning, but that's not so bad. -function emitReadable(stream) { - var state = stream._readableState; - state.needReadable = false; - if (!state.emittedReadable) { - debug('emitReadable', state.flowing); - state.emittedReadable = true; - if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream); - } -} - -function emitReadable_(stream) { - debug('emit readable'); - stream.emit('readable'); - flow(stream); -} - -// at this point, the user has presumably seen the 'readable' event, -// and called read() to consume some data. that may have triggered -// in turn another _read(n) call, in which case reading = true if -// it's in progress. -// However, if we're not ended, or reading, and the length < hwm, -// then go ahead and try to read some more preemptively. -function maybeReadMore(stream, state) { - if (!state.readingMore) { - state.readingMore = true; - processNextTick(maybeReadMore_, stream, state); - } -} - -function maybeReadMore_(stream, state) { - var len = state.length; - while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { - debug('maybeReadMore read 0'); - stream.read(0); - if (len === state.length) - // didn't get any data, stop spinning. - break;else len = state.length; - } - state.readingMore = false; -} - -// abstract method. to be overridden in specific implementation classes. -// call cb(er, data) where data is <= n in length. -// for virtual (non-string, non-buffer) streams, "length" is somewhat -// arbitrary, and perhaps not very meaningful. -Readable.prototype._read = function (n) { - this.emit('error', new Error('_read() is not implemented')); -}; - -Readable.prototype.pipe = function (dest, pipeOpts) { - var src = this; - var state = this._readableState; - - switch (state.pipesCount) { - case 0: - state.pipes = dest; - break; - case 1: - state.pipes = [state.pipes, dest]; - break; - default: - state.pipes.push(dest); - break; - } - state.pipesCount += 1; - debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); - - var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; - - var endFn = doEnd ? onend : unpipe; - if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn); - - dest.on('unpipe', onunpipe); - function onunpipe(readable, unpipeInfo) { - debug('onunpipe'); - if (readable === src) { - if (unpipeInfo && unpipeInfo.hasUnpiped === false) { - unpipeInfo.hasUnpiped = true; - cleanup(); - } - } - } - - function onend() { - debug('onend'); - dest.end(); - } - - // when the dest drains, it reduces the awaitDrain counter - // on the source. This would be more elegant with a .once() - // handler in flow(), but adding and removing repeatedly is - // too slow. - var ondrain = pipeOnDrain(src); - dest.on('drain', ondrain); - - var cleanedUp = false; - function cleanup() { - debug('cleanup'); - // cleanup event handlers once the pipe is broken - dest.removeListener('close', onclose); - dest.removeListener('finish', onfinish); - dest.removeListener('drain', ondrain); - dest.removeListener('error', onerror); - dest.removeListener('unpipe', onunpipe); - src.removeListener('end', onend); - src.removeListener('end', unpipe); - src.removeListener('data', ondata); - - cleanedUp = true; - - // if the reader is waiting for a drain event from this - // specific writer, then it would cause it to never start - // flowing again. - // So, if this is awaiting a drain, then we just call it now. - // If we don't know, then assume that we are waiting for one. - if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); - } - - // If the user pushes more data while we're writing to dest then we'll end up - // in ondata again. However, we only want to increase awaitDrain once because - // dest will only emit one 'drain' event for the multiple writes. - // => Introduce a guard on increasing awaitDrain. - var increasedAwaitDrain = false; - src.on('data', ondata); - function ondata(chunk) { - debug('ondata'); - increasedAwaitDrain = false; - var ret = dest.write(chunk); - if (false === ret && !increasedAwaitDrain) { - // If the user unpiped during `dest.write()`, it is possible - // to get stuck in a permanently paused state if that write - // also returned false. - // => Check whether `dest` is still a piping destination. - if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { - debug('false write response, pause', src._readableState.awaitDrain); - src._readableState.awaitDrain++; - increasedAwaitDrain = true; - } - src.pause(); - } - } - - // if the dest has an error, then stop piping into it. - // however, don't suppress the throwing behavior for this. - function onerror(er) { - debug('onerror', er); - unpipe(); - dest.removeListener('error', onerror); - if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); - } - - // Make sure our error handler is attached before userland ones. - prependListener(dest, 'error', onerror); - - // Both close and finish should trigger unpipe, but only once. - function onclose() { - dest.removeListener('finish', onfinish); - unpipe(); - } - dest.once('close', onclose); - function onfinish() { - debug('onfinish'); - dest.removeListener('close', onclose); - unpipe(); - } - dest.once('finish', onfinish); - - function unpipe() { - debug('unpipe'); - src.unpipe(dest); - } - - // tell the dest that it's being piped to - dest.emit('pipe', src); - - // start the flow if it hasn't been started already. - if (!state.flowing) { - debug('pipe resume'); - src.resume(); - } - - return dest; -}; - -function pipeOnDrain(src) { - return function () { - var state = src._readableState; - debug('pipeOnDrain', state.awaitDrain); - if (state.awaitDrain) state.awaitDrain--; - if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { - state.flowing = true; - flow(src); - } - }; -} - -Readable.prototype.unpipe = function (dest) { - var state = this._readableState; - var unpipeInfo = { hasUnpiped: false }; - - // if we're not piping anywhere, then do nothing. - if (state.pipesCount === 0) return this; - - // just one destination. most common case. - if (state.pipesCount === 1) { - // passed in one, but it's not the right one. - if (dest && dest !== state.pipes) return this; - - if (!dest) dest = state.pipes; - - // got a match. - state.pipes = null; - state.pipesCount = 0; - state.flowing = false; - if (dest) dest.emit('unpipe', this, unpipeInfo); - return this; - } - - // slow case. multiple pipe destinations. - - if (!dest) { - // remove all. - var dests = state.pipes; - var len = state.pipesCount; - state.pipes = null; - state.pipesCount = 0; - state.flowing = false; - - for (var i = 0; i < len; i++) { - dests[i].emit('unpipe', this, unpipeInfo); - }return this; - } - - // try to find the right one. - var index = indexOf(state.pipes, dest); - if (index === -1) return this; - - state.pipes.splice(index, 1); - state.pipesCount -= 1; - if (state.pipesCount === 1) state.pipes = state.pipes[0]; - - dest.emit('unpipe', this, unpipeInfo); - - return this; -}; - -// set up data events if they are asked for -// Ensure readable listeners eventually get something -Readable.prototype.on = function (ev, fn) { - var res = Stream.prototype.on.call(this, ev, fn); - - if (ev === 'data') { - // Start flowing on next tick if stream isn't explicitly paused - if (this._readableState.flowing !== false) this.resume(); - } else if (ev === 'readable') { - var state = this._readableState; - if (!state.endEmitted && !state.readableListening) { - state.readableListening = state.needReadable = true; - state.emittedReadable = false; - if (!state.reading) { - processNextTick(nReadingNextTick, this); - } else if (state.length) { - emitReadable(this); - } - } - } - - return res; -}; -Readable.prototype.addListener = Readable.prototype.on; - -function nReadingNextTick(self) { - debug('readable nexttick read 0'); - self.read(0); -} - -// pause() and resume() are remnants of the legacy readable stream API -// If the user uses them, then switch into old mode. -Readable.prototype.resume = function () { - var state = this._readableState; - if (!state.flowing) { - debug('resume'); - state.flowing = true; - resume(this, state); - } - return this; -}; - -function resume(stream, state) { - if (!state.resumeScheduled) { - state.resumeScheduled = true; - processNextTick(resume_, stream, state); - } -} - -function resume_(stream, state) { - if (!state.reading) { - debug('resume read 0'); - stream.read(0); - } - - state.resumeScheduled = false; - state.awaitDrain = 0; - stream.emit('resume'); - flow(stream); - if (state.flowing && !state.reading) stream.read(0); -} - -Readable.prototype.pause = function () { - debug('call pause flowing=%j', this._readableState.flowing); - if (false !== this._readableState.flowing) { - debug('pause'); - this._readableState.flowing = false; - this.emit('pause'); - } - return this; -}; - -function flow(stream) { - var state = stream._readableState; - debug('flow', state.flowing); - while (state.flowing && stream.read() !== null) {} -} - -// wrap an old-style stream as the async data source. -// This is *not* part of the readable stream interface. -// It is an ugly unfortunate mess of history. -Readable.prototype.wrap = function (stream) { - var state = this._readableState; - var paused = false; - - var self = this; - stream.on('end', function () { - debug('wrapped end'); - if (state.decoder && !state.ended) { - var chunk = state.decoder.end(); - if (chunk && chunk.length) self.push(chunk); - } - - self.push(null); - }); - - stream.on('data', function (chunk) { - debug('wrapped data'); - if (state.decoder) chunk = state.decoder.write(chunk); - - // don't skip over falsy values in objectMode - if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; - - var ret = self.push(chunk); - if (!ret) { - paused = true; - stream.pause(); - } - }); - - // proxy all the other methods. - // important when wrapping filters and duplexes. - for (var i in stream) { - if (this[i] === undefined && typeof stream[i] === 'function') { - this[i] = function (method) { - return function () { - return stream[method].apply(stream, arguments); - }; - }(i); - } - } - - // proxy certain important events. - for (var n = 0; n < kProxyEvents.length; n++) { - stream.on(kProxyEvents[n], self.emit.bind(self, kProxyEvents[n])); - } - - // when we try to consume some more bytes, simply unpause the - // underlying stream. - self._read = function (n) { - debug('wrapped _read', n); - if (paused) { - paused = false; - stream.resume(); - } - }; - - return self; -}; - -// exposed for testing purposes only. -Readable._fromList = fromList; - -// Pluck off n bytes from an array of buffers. -// Length is the combined lengths of all the buffers in the list. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function fromList(n, state) { - // nothing buffered - if (state.length === 0) return null; - - var ret; - if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { - // read it all, truncate the list - if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); - state.buffer.clear(); - } else { - // read part of list - ret = fromListPartial(n, state.buffer, state.decoder); - } - - return ret; -} - -// Extracts only enough buffered data to satisfy the amount requested. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function fromListPartial(n, list, hasStrings) { - var ret; - if (n < list.head.data.length) { - // slice is the same for buffers and strings - ret = list.head.data.slice(0, n); - list.head.data = list.head.data.slice(n); - } else if (n === list.head.data.length) { - // first chunk is a perfect match - ret = list.shift(); - } else { - // result spans more than one buffer - ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); - } - return ret; -} - -// Copies a specified amount of characters from the list of buffered data -// chunks. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function copyFromBufferString(n, list) { - var p = list.head; - var c = 1; - var ret = p.data; - n -= ret.length; - while (p = p.next) { - var str = p.data; - var nb = n > str.length ? str.length : n; - if (nb === str.length) ret += str;else ret += str.slice(0, n); - n -= nb; - if (n === 0) { - if (nb === str.length) { - ++c; - if (p.next) list.head = p.next;else list.head = list.tail = null; - } else { - list.head = p; - p.data = str.slice(nb); - } - break; - } - ++c; - } - list.length -= c; - return ret; -} - -// Copies a specified amount of bytes from the list of buffered data chunks. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function copyFromBuffer(n, list) { - var ret = Buffer.allocUnsafe(n); - var p = list.head; - var c = 1; - p.data.copy(ret); - n -= p.data.length; - while (p = p.next) { - var buf = p.data; - var nb = n > buf.length ? buf.length : n; - buf.copy(ret, ret.length - n, 0, nb); - n -= nb; - if (n === 0) { - if (nb === buf.length) { - ++c; - if (p.next) list.head = p.next;else list.head = list.tail = null; - } else { - list.head = p; - p.data = buf.slice(nb); - } - break; - } - ++c; - } - list.length -= c; - return ret; -} - -function endReadable(stream) { - var state = stream._readableState; - - // If we get here before consuming all the bytes, then that is a - // bug in node. Should never happen. - if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); - - if (!state.endEmitted) { - state.ended = true; - processNextTick(endReadableNT, state, stream); - } -} - -function endReadableNT(state, stream) { - // Check that we didn't get one last unshift. - if (!state.endEmitted && state.length === 0) { - state.endEmitted = true; - stream.readable = false; - stream.emit('end'); - } -} - -function forEach(xs, f) { - for (var i = 0, l = xs.length; i < l; i++) { - f(xs[i], i); - } -} - -function indexOf(xs, x) { - for (var i = 0, l = xs.length; i < l; i++) { - if (xs[i] === x) return i; - } - return -1; -} -}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./_stream_duplex":49,"./internal/streams/BufferList":54,"./internal/streams/destroy":55,"./internal/streams/stream":56,"_process":47,"core-util-is":29,"events":30,"inherits":32,"isarray":34,"process-nextick-args":46,"safe-buffer":62,"string_decoder/":57,"util":25}],52:[function(require,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// a transform stream is a readable/writable stream where you do -// something with the data. Sometimes it's called a "filter", -// but that's not a great name for it, since that implies a thing where -// some bits pass through, and others are simply ignored. (That would -// be a valid example of a transform, of course.) -// -// While the output is causally related to the input, it's not a -// necessarily symmetric or synchronous transformation. For example, -// a zlib stream might take multiple plain-text writes(), and then -// emit a single compressed chunk some time in the future. -// -// Here's how this works: -// -// The Transform stream has all the aspects of the readable and writable -// stream classes. When you write(chunk), that calls _write(chunk,cb) -// internally, and returns false if there's a lot of pending writes -// buffered up. When you call read(), that calls _read(n) until -// there's enough pending readable data buffered up. -// -// In a transform stream, the written data is placed in a buffer. When -// _read(n) is called, it transforms the queued up data, calling the -// buffered _write cb's as it consumes chunks. If consuming a single -// written chunk would result in multiple output chunks, then the first -// outputted bit calls the readcb, and subsequent chunks just go into -// the read buffer, and will cause it to emit 'readable' if necessary. -// -// This way, back-pressure is actually determined by the reading side, -// since _read has to be called to start processing a new chunk. However, -// a pathological inflate type of transform can cause excessive buffering -// here. For example, imagine a stream where every byte of input is -// interpreted as an integer from 0-255, and then results in that many -// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in -// 1kb of data being output. In this case, you could write a very small -// amount of input, and end up with a very large amount of output. In -// such a pathological inflating mechanism, there'd be no way to tell -// the system to stop doing the transform. A single 4MB write could -// cause the system to run out of memory. -// -// However, even in such a pathological case, only a single written chunk -// would be consumed, and then the rest would wait (un-transformed) until -// the results of the previous transformed chunk were consumed. - -'use strict'; - -module.exports = Transform; - -var Duplex = require('./_stream_duplex'); - -/**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ - -util.inherits(Transform, Duplex); - -function TransformState(stream) { - this.afterTransform = function (er, data) { - return afterTransform(stream, er, data); - }; - - this.needTransform = false; - this.transforming = false; - this.writecb = null; - this.writechunk = null; - this.writeencoding = null; -} - -function afterTransform(stream, er, data) { - var ts = stream._transformState; - ts.transforming = false; - - var cb = ts.writecb; - - if (!cb) { - return stream.emit('error', new Error('write callback called multiple times')); - } - - ts.writechunk = null; - ts.writecb = null; - - if (data !== null && data !== undefined) stream.push(data); - - cb(er); - - var rs = stream._readableState; - rs.reading = false; - if (rs.needReadable || rs.length < rs.highWaterMark) { - stream._read(rs.highWaterMark); - } -} - -function Transform(options) { - if (!(this instanceof Transform)) return new Transform(options); - - Duplex.call(this, options); - - this._transformState = new TransformState(this); - - var stream = this; - - // start out asking for a readable event once data is transformed. - this._readableState.needReadable = true; - - // we have implemented the _read method, and done the other things - // that Readable wants before the first _read call, so unset the - // sync guard flag. - this._readableState.sync = false; - - if (options) { - if (typeof options.transform === 'function') this._transform = options.transform; - - if (typeof options.flush === 'function') this._flush = options.flush; - } - - // When the writable side finishes, then flush out anything remaining. - this.once('prefinish', function () { - if (typeof this._flush === 'function') this._flush(function (er, data) { - done(stream, er, data); - });else done(stream); - }); -} - -Transform.prototype.push = function (chunk, encoding) { - this._transformState.needTransform = false; - return Duplex.prototype.push.call(this, chunk, encoding); -}; - -// This is the part where you do stuff! -// override this function in implementation classes. -// 'chunk' is an input chunk. -// -// Call `push(newChunk)` to pass along transformed output -// to the readable side. You may call 'push' zero or more times. -// -// Call `cb(err)` when you are done with this chunk. If you pass -// an error, then that'll put the hurt on the whole operation. If you -// never call cb(), then you'll never get another chunk. -Transform.prototype._transform = function (chunk, encoding, cb) { - throw new Error('_transform() is not implemented'); -}; - -Transform.prototype._write = function (chunk, encoding, cb) { - var ts = this._transformState; - ts.writecb = cb; - ts.writechunk = chunk; - ts.writeencoding = encoding; - if (!ts.transforming) { - var rs = this._readableState; - if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); - } -}; - -// Doesn't matter what the args are here. -// _transform does all the work. -// That we got here means that the readable side wants more data. -Transform.prototype._read = function (n) { - var ts = this._transformState; - - if (ts.writechunk !== null && ts.writecb && !ts.transforming) { - ts.transforming = true; - this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); - } else { - // mark that we need a transform, so that any data that comes in - // will get processed, now that we've asked for it. - ts.needTransform = true; - } -}; - -Transform.prototype._destroy = function (err, cb) { - var _this = this; - - Duplex.prototype._destroy.call(this, err, function (err2) { - cb(err2); - _this.emit('close'); - }); -}; - -function done(stream, er, data) { - if (er) return stream.emit('error', er); - - if (data !== null && data !== undefined) stream.push(data); - - // if there's nothing in the write buffer, then that means - // that nothing more will ever be provided - var ws = stream._writableState; - var ts = stream._transformState; - - if (ws.length) throw new Error('Calling transform done when ws.length != 0'); - - if (ts.transforming) throw new Error('Calling transform done when still transforming'); - - return stream.push(null); -} -},{"./_stream_duplex":49,"core-util-is":29,"inherits":32}],53:[function(require,module,exports){ -(function (process,global){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// A bit simpler than readable streams. -// Implement an async ._write(chunk, encoding, cb), and it'll handle all -// the drain event emission and buffering. - -'use strict'; - -/**/ - -var processNextTick = require('process-nextick-args'); -/**/ - -module.exports = Writable; - -/* */ -function WriteReq(chunk, encoding, cb) { - this.chunk = chunk; - this.encoding = encoding; - this.callback = cb; - this.next = null; -} - -// It seems a linked list but it is not -// there will be only 2 of these for each stream -function CorkedRequest(state) { - var _this = this; - - this.next = null; - this.entry = null; - this.finish = function () { - onCorkedFinish(_this, state); - }; -} -/* */ - -/**/ -var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick; -/**/ - -/**/ -var Duplex; -/**/ - -Writable.WritableState = WritableState; - -/**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ - -/**/ -var internalUtil = { - deprecate: require('util-deprecate') -}; -/**/ - -/**/ -var Stream = require('./internal/streams/stream'); -/**/ - -/**/ -var Buffer = require('safe-buffer').Buffer; -var OurUint8Array = global.Uint8Array || function () {}; -function _uint8ArrayToBuffer(chunk) { - return Buffer.from(chunk); -} -function _isUint8Array(obj) { - return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; -} -/**/ - -var destroyImpl = require('./internal/streams/destroy'); - -util.inherits(Writable, Stream); - -function nop() {} - -function WritableState(options, stream) { - Duplex = Duplex || require('./_stream_duplex'); - - options = options || {}; - - // object stream flag to indicate whether or not this stream - // contains buffers or objects. - this.objectMode = !!options.objectMode; - - if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode; - - // the point at which write() starts returning false - // Note: 0 is a valid value, means that we always return false if - // the entire buffer is not flushed immediately on write() - var hwm = options.highWaterMark; - var defaultHwm = this.objectMode ? 16 : 16 * 1024; - this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; - - // cast to ints. - this.highWaterMark = Math.floor(this.highWaterMark); - - // if _final has been called - this.finalCalled = false; - - // drain event flag. - this.needDrain = false; - // at the start of calling end() - this.ending = false; - // when end() has been called, and returned - this.ended = false; - // when 'finish' is emitted - this.finished = false; - - // has it been destroyed - this.destroyed = false; - - // should we decode strings into buffers before passing to _write? - // this is here so that some node-core streams can optimize string - // handling at a lower level. - var noDecode = options.decodeStrings === false; - this.decodeStrings = !noDecode; - - // Crypto is kind of old and crusty. Historically, its default string - // encoding is 'binary' so we have to make this configurable. - // Everything else in the universe uses 'utf8', though. - this.defaultEncoding = options.defaultEncoding || 'utf8'; - - // not an actual buffer we keep track of, but a measurement - // of how much we're waiting to get pushed to some underlying - // socket or file. - this.length = 0; - - // a flag to see when we're in the middle of a write. - this.writing = false; - - // when true all writes will be buffered until .uncork() call - this.corked = 0; - - // a flag to be able to tell if the onwrite cb is called immediately, - // or on a later tick. We set this to true at first, because any - // actions that shouldn't happen until "later" should generally also - // not happen before the first write call. - this.sync = true; - - // a flag to know if we're processing previously buffered items, which - // may call the _write() callback in the same tick, so that we don't - // end up in an overlapped onwrite situation. - this.bufferProcessing = false; - - // the callback that's passed to _write(chunk,cb) - this.onwrite = function (er) { - onwrite(stream, er); - }; - - // the callback that the user supplies to write(chunk,encoding,cb) - this.writecb = null; - - // the amount that is being written when _write is called. - this.writelen = 0; - - this.bufferedRequest = null; - this.lastBufferedRequest = null; - - // number of pending user-supplied write callbacks - // this must be 0 before 'finish' can be emitted - this.pendingcb = 0; - - // emit prefinish if the only thing we're waiting for is _write cbs - // This is relevant for synchronous Transform streams - this.prefinished = false; - - // True if the error was already emitted and should not be thrown again - this.errorEmitted = false; - - // count buffered requests - this.bufferedRequestCount = 0; - - // allocate the first CorkedRequest, there is always - // one allocated and free to use, and we maintain at most two - this.corkedRequestsFree = new CorkedRequest(this); -} - -WritableState.prototype.getBuffer = function getBuffer() { - var current = this.bufferedRequest; - var out = []; - while (current) { - out.push(current); - current = current.next; - } - return out; -}; - -(function () { - try { - Object.defineProperty(WritableState.prototype, 'buffer', { - get: internalUtil.deprecate(function () { - return this.getBuffer(); - }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') - }); - } catch (_) {} -})(); - -// Test _writableState for inheritance to account for Duplex streams, -// whose prototype chain only points to Readable. -var realHasInstance; -if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { - realHasInstance = Function.prototype[Symbol.hasInstance]; - Object.defineProperty(Writable, Symbol.hasInstance, { - value: function (object) { - if (realHasInstance.call(this, object)) return true; - - return object && object._writableState instanceof WritableState; - } - }); -} else { - realHasInstance = function (object) { - return object instanceof this; - }; -} - -function Writable(options) { - Duplex = Duplex || require('./_stream_duplex'); - - // Writable ctor is applied to Duplexes, too. - // `realHasInstance` is necessary because using plain `instanceof` - // would return false, as no `_writableState` property is attached. - - // Trying to use the custom `instanceof` for Writable here will also break the - // Node.js LazyTransform implementation, which has a non-trivial getter for - // `_writableState` that would lead to infinite recursion. - if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { - return new Writable(options); - } - - this._writableState = new WritableState(options, this); - - // legacy. - this.writable = true; - - if (options) { - if (typeof options.write === 'function') this._write = options.write; - - if (typeof options.writev === 'function') this._writev = options.writev; - - if (typeof options.destroy === 'function') this._destroy = options.destroy; - - if (typeof options.final === 'function') this._final = options.final; - } - - Stream.call(this); -} - -// Otherwise people can pipe Writable streams, which is just wrong. -Writable.prototype.pipe = function () { - this.emit('error', new Error('Cannot pipe, not readable')); -}; - -function writeAfterEnd(stream, cb) { - var er = new Error('write after end'); - // TODO: defer error events consistently everywhere, not just the cb - stream.emit('error', er); - processNextTick(cb, er); -} - -// Checks that a user-supplied chunk is valid, especially for the particular -// mode the stream is in. Currently this means that `null` is never accepted -// and undefined/non-string values are only allowed in object mode. -function validChunk(stream, state, chunk, cb) { - var valid = true; - var er = false; - - if (chunk === null) { - er = new TypeError('May not write null values to stream'); - } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { - er = new TypeError('Invalid non-string/buffer chunk'); - } - if (er) { - stream.emit('error', er); - processNextTick(cb, er); - valid = false; - } - return valid; -} - -Writable.prototype.write = function (chunk, encoding, cb) { - var state = this._writableState; - var ret = false; - var isBuf = _isUint8Array(chunk) && !state.objectMode; - - if (isBuf && !Buffer.isBuffer(chunk)) { - chunk = _uint8ArrayToBuffer(chunk); - } - - if (typeof encoding === 'function') { - cb = encoding; - encoding = null; - } - - if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; - - if (typeof cb !== 'function') cb = nop; - - if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { - state.pendingcb++; - ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); - } - - return ret; -}; - -Writable.prototype.cork = function () { - var state = this._writableState; - - state.corked++; -}; - -Writable.prototype.uncork = function () { - var state = this._writableState; - - if (state.corked) { - state.corked--; - - if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); - } -}; - -Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { - // node::ParseEncoding() requires lower case. - if (typeof encoding === 'string') encoding = encoding.toLowerCase(); - if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); - this._writableState.defaultEncoding = encoding; - return this; -}; - -function decodeChunk(state, chunk, encoding) { - if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { - chunk = Buffer.from(chunk, encoding); - } - return chunk; -} - -// if we're already writing something, then just put this -// in the queue, and wait our turn. Otherwise, call _write -// If we return false, then we need a drain event, so set that flag. -function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { - if (!isBuf) { - var newChunk = decodeChunk(state, chunk, encoding); - if (chunk !== newChunk) { - isBuf = true; - encoding = 'buffer'; - chunk = newChunk; - } - } - var len = state.objectMode ? 1 : chunk.length; - - state.length += len; - - var ret = state.length < state.highWaterMark; - // we must ensure that previous needDrain will not be reset to false. - if (!ret) state.needDrain = true; - - if (state.writing || state.corked) { - var last = state.lastBufferedRequest; - state.lastBufferedRequest = { - chunk: chunk, - encoding: encoding, - isBuf: isBuf, - callback: cb, - next: null - }; - if (last) { - last.next = state.lastBufferedRequest; - } else { - state.bufferedRequest = state.lastBufferedRequest; - } - state.bufferedRequestCount += 1; - } else { - doWrite(stream, state, false, len, chunk, encoding, cb); - } - - return ret; -} - -function doWrite(stream, state, writev, len, chunk, encoding, cb) { - state.writelen = len; - state.writecb = cb; - state.writing = true; - state.sync = true; - if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); - state.sync = false; -} - -function onwriteError(stream, state, sync, er, cb) { - --state.pendingcb; - - if (sync) { - // defer the callback if we are being called synchronously - // to avoid piling up things on the stack - processNextTick(cb, er); - // this can emit finish, and it will always happen - // after error - processNextTick(finishMaybe, stream, state); - stream._writableState.errorEmitted = true; - stream.emit('error', er); - } else { - // the caller expect this to happen before if - // it is async - cb(er); - stream._writableState.errorEmitted = true; - stream.emit('error', er); - // this can emit finish, but finish must - // always follow error - finishMaybe(stream, state); - } -} - -function onwriteStateUpdate(state) { - state.writing = false; - state.writecb = null; - state.length -= state.writelen; - state.writelen = 0; -} - -function onwrite(stream, er) { - var state = stream._writableState; - var sync = state.sync; - var cb = state.writecb; - - onwriteStateUpdate(state); - - if (er) onwriteError(stream, state, sync, er, cb);else { - // Check if we're actually ready to finish, but don't emit yet - var finished = needFinish(state); - - if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { - clearBuffer(stream, state); - } - - if (sync) { - /**/ - asyncWrite(afterWrite, stream, state, finished, cb); - /**/ - } else { - afterWrite(stream, state, finished, cb); - } - } -} - -function afterWrite(stream, state, finished, cb) { - if (!finished) onwriteDrain(stream, state); - state.pendingcb--; - cb(); - finishMaybe(stream, state); -} - -// Must force callback to be called on nextTick, so that we don't -// emit 'drain' before the write() consumer gets the 'false' return -// value, and has a chance to attach a 'drain' listener. -function onwriteDrain(stream, state) { - if (state.length === 0 && state.needDrain) { - state.needDrain = false; - stream.emit('drain'); - } -} - -// if there's something in the buffer waiting, then process it -function clearBuffer(stream, state) { - state.bufferProcessing = true; - var entry = state.bufferedRequest; - - if (stream._writev && entry && entry.next) { - // Fast case, write everything using _writev() - var l = state.bufferedRequestCount; - var buffer = new Array(l); - var holder = state.corkedRequestsFree; - holder.entry = entry; - - var count = 0; - var allBuffers = true; - while (entry) { - buffer[count] = entry; - if (!entry.isBuf) allBuffers = false; - entry = entry.next; - count += 1; - } - buffer.allBuffers = allBuffers; - - doWrite(stream, state, true, state.length, buffer, '', holder.finish); - - // doWrite is almost always async, defer these to save a bit of time - // as the hot path ends with doWrite - state.pendingcb++; - state.lastBufferedRequest = null; - if (holder.next) { - state.corkedRequestsFree = holder.next; - holder.next = null; - } else { - state.corkedRequestsFree = new CorkedRequest(state); - } - } else { - // Slow case, write chunks one-by-one - while (entry) { - var chunk = entry.chunk; - var encoding = entry.encoding; - var cb = entry.callback; - var len = state.objectMode ? 1 : chunk.length; - - doWrite(stream, state, false, len, chunk, encoding, cb); - entry = entry.next; - // if we didn't call the onwrite immediately, then - // it means that we need to wait until it does. - // also, that means that the chunk and cb are currently - // being processed, so move the buffer counter past them. - if (state.writing) { - break; - } - } - - if (entry === null) state.lastBufferedRequest = null; - } - - state.bufferedRequestCount = 0; - state.bufferedRequest = entry; - state.bufferProcessing = false; -} - -Writable.prototype._write = function (chunk, encoding, cb) { - cb(new Error('_write() is not implemented')); -}; - -Writable.prototype._writev = null; - -Writable.prototype.end = function (chunk, encoding, cb) { - var state = this._writableState; - - if (typeof chunk === 'function') { - cb = chunk; - chunk = null; - encoding = null; - } else if (typeof encoding === 'function') { - cb = encoding; - encoding = null; - } - - if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); - - // .end() fully uncorks - if (state.corked) { - state.corked = 1; - this.uncork(); - } - - // ignore unnecessary end() calls. - if (!state.ending && !state.finished) endWritable(this, state, cb); -}; - -function needFinish(state) { - return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; -} -function callFinal(stream, state) { - stream._final(function (err) { - state.pendingcb--; - if (err) { - stream.emit('error', err); - } - state.prefinished = true; - stream.emit('prefinish'); - finishMaybe(stream, state); - }); -} -function prefinish(stream, state) { - if (!state.prefinished && !state.finalCalled) { - if (typeof stream._final === 'function') { - state.pendingcb++; - state.finalCalled = true; - processNextTick(callFinal, stream, state); - } else { - state.prefinished = true; - stream.emit('prefinish'); - } - } -} - -function finishMaybe(stream, state) { - var need = needFinish(state); - if (need) { - prefinish(stream, state); - if (state.pendingcb === 0) { - state.finished = true; - stream.emit('finish'); - } - } - return need; -} - -function endWritable(stream, state, cb) { - state.ending = true; - finishMaybe(stream, state); - if (cb) { - if (state.finished) processNextTick(cb);else stream.once('finish', cb); - } - state.ended = true; - stream.writable = false; -} - -function onCorkedFinish(corkReq, state, err) { - var entry = corkReq.entry; - corkReq.entry = null; - while (entry) { - var cb = entry.callback; - state.pendingcb--; - cb(err); - entry = entry.next; - } - if (state.corkedRequestsFree) { - state.corkedRequestsFree.next = corkReq; - } else { - state.corkedRequestsFree = corkReq; - } -} - -Object.defineProperty(Writable.prototype, 'destroyed', { - get: function () { - if (this._writableState === undefined) { - return false; - } - return this._writableState.destroyed; - }, - set: function (value) { - // we ignore the value if the stream - // has not been initialized yet - if (!this._writableState) { - return; - } - - // backward compatibility, the user is explicitly - // managing destroyed - this._writableState.destroyed = value; - } -}); - -Writable.prototype.destroy = destroyImpl.destroy; -Writable.prototype._undestroy = destroyImpl.undestroy; -Writable.prototype._destroy = function (err, cb) { - this.end(); - cb(err); -}; -}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./_stream_duplex":49,"./internal/streams/destroy":55,"./internal/streams/stream":56,"_process":47,"core-util-is":29,"inherits":32,"process-nextick-args":46,"safe-buffer":62,"util-deprecate":64}],54:[function(require,module,exports){ -'use strict'; - -/**/ - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var Buffer = require('safe-buffer').Buffer; -/**/ - -function copyBuffer(src, target, offset) { - src.copy(target, offset); -} - -module.exports = function () { - function BufferList() { - _classCallCheck(this, BufferList); - - this.head = null; - this.tail = null; - this.length = 0; - } - - BufferList.prototype.push = function push(v) { - var entry = { data: v, next: null }; - if (this.length > 0) this.tail.next = entry;else this.head = entry; - this.tail = entry; - ++this.length; - }; - - BufferList.prototype.unshift = function unshift(v) { - var entry = { data: v, next: this.head }; - if (this.length === 0) this.tail = entry; - this.head = entry; - ++this.length; - }; - - BufferList.prototype.shift = function shift() { - if (this.length === 0) return; - var ret = this.head.data; - if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; - --this.length; - return ret; - }; - - BufferList.prototype.clear = function clear() { - this.head = this.tail = null; - this.length = 0; - }; - - BufferList.prototype.join = function join(s) { - if (this.length === 0) return ''; - var p = this.head; - var ret = '' + p.data; - while (p = p.next) { - ret += s + p.data; - }return ret; - }; - - BufferList.prototype.concat = function concat(n) { - if (this.length === 0) return Buffer.alloc(0); - if (this.length === 1) return this.head.data; - var ret = Buffer.allocUnsafe(n >>> 0); - var p = this.head; - var i = 0; - while (p) { - copyBuffer(p.data, ret, i); - i += p.data.length; - p = p.next; - } - return ret; - }; - - return BufferList; -}(); -},{"safe-buffer":62}],55:[function(require,module,exports){ -'use strict'; - -/**/ - -var processNextTick = require('process-nextick-args'); -/**/ - -// undocumented cb() API, needed for core, not for public API -function destroy(err, cb) { - var _this = this; - - var readableDestroyed = this._readableState && this._readableState.destroyed; - var writableDestroyed = this._writableState && this._writableState.destroyed; - - if (readableDestroyed || writableDestroyed) { - if (cb) { - cb(err); - } else if (err && (!this._writableState || !this._writableState.errorEmitted)) { - processNextTick(emitErrorNT, this, err); - } - return; - } - - // we set destroyed to true before firing error callbacks in order - // to make it re-entrance safe in case destroy() is called within callbacks - - if (this._readableState) { - this._readableState.destroyed = true; - } - - // if this is a duplex stream mark the writable part as destroyed as well - if (this._writableState) { - this._writableState.destroyed = true; - } - - this._destroy(err || null, function (err) { - if (!cb && err) { - processNextTick(emitErrorNT, _this, err); - if (_this._writableState) { - _this._writableState.errorEmitted = true; - } - } else if (cb) { - cb(err); - } - }); -} - -function undestroy() { - if (this._readableState) { - this._readableState.destroyed = false; - this._readableState.reading = false; - this._readableState.ended = false; - this._readableState.endEmitted = false; - } - - if (this._writableState) { - this._writableState.destroyed = false; - this._writableState.ended = false; - this._writableState.ending = false; - this._writableState.finished = false; - this._writableState.errorEmitted = false; - } -} - -function emitErrorNT(self, err) { - self.emit('error', err); -} - -module.exports = { - destroy: destroy, - undestroy: undestroy -}; -},{"process-nextick-args":46}],56:[function(require,module,exports){ -module.exports = require('events').EventEmitter; - -},{"events":30}],57:[function(require,module,exports){ -'use strict'; - -var Buffer = require('safe-buffer').Buffer; - -var isEncoding = Buffer.isEncoding || function (encoding) { - encoding = '' + encoding; - switch (encoding && encoding.toLowerCase()) { - case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': - return true; - default: - return false; - } -}; - -function _normalizeEncoding(enc) { - if (!enc) return 'utf8'; - var retried; - while (true) { - switch (enc) { - case 'utf8': - case 'utf-8': - return 'utf8'; - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return 'utf16le'; - case 'latin1': - case 'binary': - return 'latin1'; - case 'base64': - case 'ascii': - case 'hex': - return enc; - default: - if (retried) return; // undefined - enc = ('' + enc).toLowerCase(); - retried = true; - } - } -}; - -// Do not cache `Buffer.isEncoding` when checking encoding names as some -// modules monkey-patch it to support additional encodings -function normalizeEncoding(enc) { - var nenc = _normalizeEncoding(enc); - if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); - return nenc || enc; -} - -// StringDecoder provides an interface for efficiently splitting a series of -// buffers into a series of JS strings without breaking apart multi-byte -// characters. -exports.StringDecoder = StringDecoder; -function StringDecoder(encoding) { - this.encoding = normalizeEncoding(encoding); - var nb; - switch (this.encoding) { - case 'utf16le': - this.text = utf16Text; - this.end = utf16End; - nb = 4; - break; - case 'utf8': - this.fillLast = utf8FillLast; - nb = 4; - break; - case 'base64': - this.text = base64Text; - this.end = base64End; - nb = 3; - break; - default: - this.write = simpleWrite; - this.end = simpleEnd; - return; - } - this.lastNeed = 0; - this.lastTotal = 0; - this.lastChar = Buffer.allocUnsafe(nb); -} - -StringDecoder.prototype.write = function (buf) { - if (buf.length === 0) return ''; - var r; - var i; - if (this.lastNeed) { - r = this.fillLast(buf); - if (r === undefined) return ''; - i = this.lastNeed; - this.lastNeed = 0; - } else { - i = 0; - } - if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); - return r || ''; -}; - -StringDecoder.prototype.end = utf8End; - -// Returns only complete characters in a Buffer -StringDecoder.prototype.text = utf8Text; - -// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer -StringDecoder.prototype.fillLast = function (buf) { - if (this.lastNeed <= buf.length) { - buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); - return this.lastChar.toString(this.encoding, 0, this.lastTotal); - } - buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); - this.lastNeed -= buf.length; -}; - -// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a -// continuation byte. -function utf8CheckByte(byte) { - if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; - return -1; -} - -// Checks at most 3 bytes at the end of a Buffer in order to detect an -// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) -// needed to complete the UTF-8 character (if applicable) are returned. -function utf8CheckIncomplete(self, buf, i) { - var j = buf.length - 1; - if (j < i) return 0; - var nb = utf8CheckByte(buf[j]); - if (nb >= 0) { - if (nb > 0) self.lastNeed = nb - 1; - return nb; - } - if (--j < i) return 0; - nb = utf8CheckByte(buf[j]); - if (nb >= 0) { - if (nb > 0) self.lastNeed = nb - 2; - return nb; - } - if (--j < i) return 0; - nb = utf8CheckByte(buf[j]); - if (nb >= 0) { - if (nb > 0) { - if (nb === 2) nb = 0;else self.lastNeed = nb - 3; - } - return nb; - } - return 0; -} - -// Validates as many continuation bytes for a multi-byte UTF-8 character as -// needed or are available. If we see a non-continuation byte where we expect -// one, we "replace" the validated continuation bytes we've seen so far with -// UTF-8 replacement characters ('\ufffd'), to match v8's UTF-8 decoding -// behavior. The continuation byte check is included three times in the case -// where all of the continuation bytes for a character exist in the same buffer. -// It is also done this way as a slight performance increase instead of using a -// loop. -function utf8CheckExtraBytes(self, buf, p) { - if ((buf[0] & 0xC0) !== 0x80) { - self.lastNeed = 0; - return '\ufffd'.repeat(p); - } - if (self.lastNeed > 1 && buf.length > 1) { - if ((buf[1] & 0xC0) !== 0x80) { - self.lastNeed = 1; - return '\ufffd'.repeat(p + 1); - } - if (self.lastNeed > 2 && buf.length > 2) { - if ((buf[2] & 0xC0) !== 0x80) { - self.lastNeed = 2; - return '\ufffd'.repeat(p + 2); - } - } - } -} - -// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. -function utf8FillLast(buf) { - var p = this.lastTotal - this.lastNeed; - var r = utf8CheckExtraBytes(this, buf, p); - if (r !== undefined) return r; - if (this.lastNeed <= buf.length) { - buf.copy(this.lastChar, p, 0, this.lastNeed); - return this.lastChar.toString(this.encoding, 0, this.lastTotal); - } - buf.copy(this.lastChar, p, 0, buf.length); - this.lastNeed -= buf.length; -} - -// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a -// partial character, the character's bytes are buffered until the required -// number of bytes are available. -function utf8Text(buf, i) { - var total = utf8CheckIncomplete(this, buf, i); - if (!this.lastNeed) return buf.toString('utf8', i); - this.lastTotal = total; - var end = buf.length - (total - this.lastNeed); - buf.copy(this.lastChar, 0, end); - return buf.toString('utf8', i, end); -} - -// For UTF-8, a replacement character for each buffered byte of a (partial) -// character needs to be added to the output. -function utf8End(buf) { - var r = buf && buf.length ? this.write(buf) : ''; - if (this.lastNeed) return r + '\ufffd'.repeat(this.lastTotal - this.lastNeed); - return r; -} - -// UTF-16LE typically needs two bytes per character, but even if we have an even -// number of bytes available, we need to check if we end on a leading/high -// surrogate. In that case, we need to wait for the next two bytes in order to -// decode the last character properly. -function utf16Text(buf, i) { - if ((buf.length - i) % 2 === 0) { - var r = buf.toString('utf16le', i); - if (r) { - var c = r.charCodeAt(r.length - 1); - if (c >= 0xD800 && c <= 0xDBFF) { - this.lastNeed = 2; - this.lastTotal = 4; - this.lastChar[0] = buf[buf.length - 2]; - this.lastChar[1] = buf[buf.length - 1]; - return r.slice(0, -1); - } - } - return r; - } - this.lastNeed = 1; - this.lastTotal = 2; - this.lastChar[0] = buf[buf.length - 1]; - return buf.toString('utf16le', i, buf.length - 1); -} - -// For UTF-16LE we do not explicitly append special replacement characters if we -// end on a partial character, we simply let v8 handle that. -function utf16End(buf) { - var r = buf && buf.length ? this.write(buf) : ''; - if (this.lastNeed) { - var end = this.lastTotal - this.lastNeed; - return r + this.lastChar.toString('utf16le', 0, end); - } - return r; -} - -function base64Text(buf, i) { - var n = (buf.length - i) % 3; - if (n === 0) return buf.toString('base64', i); - this.lastNeed = 3 - n; - this.lastTotal = 3; - if (n === 1) { - this.lastChar[0] = buf[buf.length - 1]; - } else { - this.lastChar[0] = buf[buf.length - 2]; - this.lastChar[1] = buf[buf.length - 1]; - } - return buf.toString('base64', i, buf.length - n); -} - -function base64End(buf) { - var r = buf && buf.length ? this.write(buf) : ''; - if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); - return r; -} - -// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) -function simpleWrite(buf) { - return buf.toString(this.encoding); -} - -function simpleEnd(buf) { - return buf && buf.length ? this.write(buf) : ''; -} -},{"safe-buffer":62}],58:[function(require,module,exports){ -module.exports = require('./readable').PassThrough - -},{"./readable":59}],59:[function(require,module,exports){ -exports = module.exports = require('./lib/_stream_readable.js'); -exports.Stream = exports; -exports.Readable = exports; -exports.Writable = require('./lib/_stream_writable.js'); -exports.Duplex = require('./lib/_stream_duplex.js'); -exports.Transform = require('./lib/_stream_transform.js'); -exports.PassThrough = require('./lib/_stream_passthrough.js'); - -},{"./lib/_stream_duplex.js":49,"./lib/_stream_passthrough.js":50,"./lib/_stream_readable.js":51,"./lib/_stream_transform.js":52,"./lib/_stream_writable.js":53}],60:[function(require,module,exports){ -module.exports = require('./readable').Transform - -},{"./readable":59}],61:[function(require,module,exports){ -module.exports = require('./lib/_stream_writable.js'); - -},{"./lib/_stream_writable.js":53}],62:[function(require,module,exports){ -/* eslint-disable node/no-deprecated-api */ -var buffer = require('buffer') -var Buffer = buffer.Buffer - -// alternative to using Object.keys for old browsers -function copyProps (src, dst) { - for (var key in src) { - dst[key] = src[key] - } -} -if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { - module.exports = buffer -} else { - // Copy properties from require('buffer') - copyProps(buffer, exports) - exports.Buffer = SafeBuffer -} - -function SafeBuffer (arg, encodingOrOffset, length) { - return Buffer(arg, encodingOrOffset, length) -} - -// Copy static methods from Buffer -copyProps(Buffer, SafeBuffer) - -SafeBuffer.from = function (arg, encodingOrOffset, length) { - if (typeof arg === 'number') { - throw new TypeError('Argument must not be a number') - } - return Buffer(arg, encodingOrOffset, length) -} - -SafeBuffer.alloc = function (size, fill, encoding) { - if (typeof size !== 'number') { - throw new TypeError('Argument must be a number') - } - var buf = Buffer(size) - if (fill !== undefined) { - if (typeof encoding === 'string') { - buf.fill(fill, encoding) - } else { - buf.fill(fill) - } - } else { - buf.fill(0) - } - return buf -} - -SafeBuffer.allocUnsafe = function (size) { - if (typeof size !== 'number') { - throw new TypeError('Argument must be a number') - } - return Buffer(size) -} - -SafeBuffer.allocUnsafeSlow = function (size) { - if (typeof size !== 'number') { - throw new TypeError('Argument must be a number') - } - return buffer.SlowBuffer(size) -} - -},{"buffer":28}],63:[function(require,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -module.exports = Stream; - -var EE = require('events').EventEmitter; -var inherits = require('inherits'); - -inherits(Stream, EE); -Stream.Readable = require('readable-stream/readable.js'); -Stream.Writable = require('readable-stream/writable.js'); -Stream.Duplex = require('readable-stream/duplex.js'); -Stream.Transform = require('readable-stream/transform.js'); -Stream.PassThrough = require('readable-stream/passthrough.js'); - -// Backwards-compat with node 0.4.x -Stream.Stream = Stream; - - - -// old-style streams. Note that the pipe method (the only relevant -// part of this class) is overridden in the Readable class. - -function Stream() { - EE.call(this); -} - -Stream.prototype.pipe = function(dest, options) { - var source = this; - - function ondata(chunk) { - if (dest.writable) { - if (false === dest.write(chunk) && source.pause) { - source.pause(); - } - } - } - - source.on('data', ondata); - - function ondrain() { - if (source.readable && source.resume) { - source.resume(); - } - } - - dest.on('drain', ondrain); - - // If the 'end' option is not supplied, dest.end() will be called when - // source gets the 'end' or 'close' events. Only dest.end() once. - if (!dest._isStdio && (!options || options.end !== false)) { - source.on('end', onend); - source.on('close', onclose); - } - - var didOnEnd = false; - function onend() { - if (didOnEnd) return; - didOnEnd = true; - - dest.end(); - } - - - function onclose() { - if (didOnEnd) return; - didOnEnd = true; - - if (typeof dest.destroy === 'function') dest.destroy(); - } - - // don't leave dangling pipes when there are errors. - function onerror(er) { - cleanup(); - if (EE.listenerCount(this, 'error') === 0) { - throw er; // Unhandled stream error in pipe. - } - } - - source.on('error', onerror); - dest.on('error', onerror); - - // remove all the event listeners that were added. - function cleanup() { - source.removeListener('data', ondata); - dest.removeListener('drain', ondrain); - - source.removeListener('end', onend); - source.removeListener('close', onclose); - - source.removeListener('error', onerror); - dest.removeListener('error', onerror); - - source.removeListener('end', cleanup); - source.removeListener('close', cleanup); - - dest.removeListener('close', cleanup); - } - - source.on('end', cleanup); - source.on('close', cleanup); - - dest.on('close', cleanup); - - dest.emit('pipe', source); - - // Allow for unix-like usage: A.pipe(B).pipe(C) - return dest; -}; - -},{"events":30,"inherits":32,"readable-stream/duplex.js":48,"readable-stream/passthrough.js":58,"readable-stream/readable.js":59,"readable-stream/transform.js":60,"readable-stream/writable.js":61}],64:[function(require,module,exports){ -(function (global){ - -/** - * Module exports. - */ - -module.exports = deprecate; - -/** - * Mark that a method should not be used. - * Returns a modified function which warns once by default. - * - * If `localStorage.noDeprecation = true` is set, then it is a no-op. - * - * If `localStorage.throwDeprecation = true` is set, then deprecated functions - * will throw an Error when invoked. - * - * If `localStorage.traceDeprecation = true` is set, then deprecated functions - * will invoke `console.trace()` instead of `console.error()`. - * - * @param {Function} fn - the function to deprecate - * @param {String} msg - the string to print to the console when `fn` is invoked - * @returns {Function} a new "deprecated" version of `fn` - * @api public - */ - -function deprecate (fn, msg) { - if (config('noDeprecation')) { - return fn; - } - - var warned = false; - function deprecated() { - if (!warned) { - if (config('throwDeprecation')) { - throw new Error(msg); - } else if (config('traceDeprecation')) { - console.trace(msg); - } else { - console.warn(msg); - } - warned = true; - } - return fn.apply(this, arguments); - } - - return deprecated; -} - -/** - * Checks `localStorage` for boolean values for the given `name`. - * - * @param {String} name - * @returns {Boolean} - * @api private - */ - -function config (name) { - // accessing global.localStorage can trigger a DOMException in sandboxed iframes - try { - if (!global.localStorage) return false; - } catch (_) { - return false; - } - var val = global.localStorage[name]; - if (null == val) return false; - return String(val).toLowerCase() === 'true'; -} - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],65:[function(require,module,exports){ -arguments[4][32][0].apply(exports,arguments) -},{"dup":32}],66:[function(require,module,exports){ -module.exports = function isBuffer(arg) { - return arg && typeof arg === 'object' - && typeof arg.copy === 'function' - && typeof arg.fill === 'function' - && typeof arg.readUInt8 === 'function'; -} -},{}],67:[function(require,module,exports){ -(function (process,global){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -var formatRegExp = /%[sdj%]/g; -exports.format = function(f) { - if (!isString(f)) { - var objects = []; - for (var i = 0; i < arguments.length; i++) { - objects.push(inspect(arguments[i])); - } - return objects.join(' '); - } - - var i = 1; - var args = arguments; - var len = args.length; - var str = String(f).replace(formatRegExp, function(x) { - if (x === '%%') return '%'; - if (i >= len) return x; - switch (x) { - case '%s': return String(args[i++]); - case '%d': return Number(args[i++]); - case '%j': - try { - return JSON.stringify(args[i++]); - } catch (_) { - return '[Circular]'; - } - default: - return x; - } - }); - for (var x = args[i]; i < len; x = args[++i]) { - if (isNull(x) || !isObject(x)) { - str += ' ' + x; - } else { - str += ' ' + inspect(x); - } - } - return str; -}; - - -// Mark that a method should not be used. -// Returns a modified function which warns once by default. -// If --no-deprecation is set, then it is a no-op. -exports.deprecate = function(fn, msg) { - // Allow for deprecating things in the process of starting up. - if (isUndefined(global.process)) { - return function() { - return exports.deprecate(fn, msg).apply(this, arguments); - }; - } - - if (process.noDeprecation === true) { - return fn; - } - - var warned = false; - function deprecated() { - if (!warned) { - if (process.throwDeprecation) { - throw new Error(msg); - } else if (process.traceDeprecation) { - console.trace(msg); - } else { - console.error(msg); - } - warned = true; - } - return fn.apply(this, arguments); - } - - return deprecated; -}; - - -var debugs = {}; -var debugEnviron; -exports.debuglog = function(set) { - if (isUndefined(debugEnviron)) - debugEnviron = process.env.NODE_DEBUG || ''; - set = set.toUpperCase(); - if (!debugs[set]) { - if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { - var pid = process.pid; - debugs[set] = function() { - var msg = exports.format.apply(exports, arguments); - console.error('%s %d: %s', set, pid, msg); - }; - } else { - debugs[set] = function() {}; - } - } - return debugs[set]; -}; - - -/** - * Echos the value of a value. Trys to print the value out - * in the best way possible given the different types. - * - * @param {Object} obj The object to print out. - * @param {Object} opts Optional options object that alters the output. - */ -/* legacy: obj, showHidden, depth, colors*/ -function inspect(obj, opts) { - // default options - var ctx = { - seen: [], - stylize: stylizeNoColor - }; - // legacy... - if (arguments.length >= 3) ctx.depth = arguments[2]; - if (arguments.length >= 4) ctx.colors = arguments[3]; - if (isBoolean(opts)) { - // legacy... - ctx.showHidden = opts; - } else if (opts) { - // got an "options" object - exports._extend(ctx, opts); - } - // set default options - if (isUndefined(ctx.showHidden)) ctx.showHidden = false; - if (isUndefined(ctx.depth)) ctx.depth = 2; - if (isUndefined(ctx.colors)) ctx.colors = false; - if (isUndefined(ctx.customInspect)) ctx.customInspect = true; - if (ctx.colors) ctx.stylize = stylizeWithColor; - return formatValue(ctx, obj, ctx.depth); -} -exports.inspect = inspect; - - -// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics -inspect.colors = { - 'bold' : [1, 22], - 'italic' : [3, 23], - 'underline' : [4, 24], - 'inverse' : [7, 27], - 'white' : [37, 39], - 'grey' : [90, 39], - 'black' : [30, 39], - 'blue' : [34, 39], - 'cyan' : [36, 39], - 'green' : [32, 39], - 'magenta' : [35, 39], - 'red' : [31, 39], - 'yellow' : [33, 39] -}; - -// Don't use 'blue' not visible on cmd.exe -inspect.styles = { - 'special': 'cyan', - 'number': 'yellow', - 'boolean': 'yellow', - 'undefined': 'grey', - 'null': 'bold', - 'string': 'green', - 'date': 'magenta', - // "name": intentionally not styling - 'regexp': 'red' -}; - - -function stylizeWithColor(str, styleType) { - var style = inspect.styles[styleType]; - - if (style) { - return '\u001b[' + inspect.colors[style][0] + 'm' + str + - '\u001b[' + inspect.colors[style][1] + 'm'; - } else { - return str; - } -} - - -function stylizeNoColor(str, styleType) { - return str; -} - - -function arrayToHash(array) { - var hash = {}; - - array.forEach(function(val, idx) { - hash[val] = true; - }); - - return hash; -} - - -function formatValue(ctx, value, recurseTimes) { - // Provide a hook for user-specified inspect functions. - // Check that value is an object with an inspect function on it - if (ctx.customInspect && - value && - isFunction(value.inspect) && - // Filter out the util module, it's inspect function is special - value.inspect !== exports.inspect && - // Also filter out any prototype objects using the circular check. - !(value.constructor && value.constructor.prototype === value)) { - var ret = value.inspect(recurseTimes, ctx); - if (!isString(ret)) { - ret = formatValue(ctx, ret, recurseTimes); - } - return ret; - } - - // Primitive types cannot have properties - var primitive = formatPrimitive(ctx, value); - if (primitive) { - return primitive; - } - - // Look up the keys of the object. - var keys = Object.keys(value); - var visibleKeys = arrayToHash(keys); - - if (ctx.showHidden) { - keys = Object.getOwnPropertyNames(value); - } - - // IE doesn't make error fields non-enumerable - // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx - if (isError(value) - && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { - return formatError(value); - } - - // Some type of object without properties can be shortcutted. - if (keys.length === 0) { - if (isFunction(value)) { - var name = value.name ? ': ' + value.name : ''; - return ctx.stylize('[Function' + name + ']', 'special'); - } - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } - if (isDate(value)) { - return ctx.stylize(Date.prototype.toString.call(value), 'date'); - } - if (isError(value)) { - return formatError(value); - } - } - - var base = '', array = false, braces = ['{', '}']; - - // Make Array say that they are Array - if (isArray(value)) { - array = true; - braces = ['[', ']']; - } - - // Make functions say that they are functions - if (isFunction(value)) { - var n = value.name ? ': ' + value.name : ''; - base = ' [Function' + n + ']'; - } - - // Make RegExps say that they are RegExps - if (isRegExp(value)) { - base = ' ' + RegExp.prototype.toString.call(value); - } - - // Make dates with properties first say the date - if (isDate(value)) { - base = ' ' + Date.prototype.toUTCString.call(value); - } - - // Make error with message first say the error - if (isError(value)) { - base = ' ' + formatError(value); - } - - if (keys.length === 0 && (!array || value.length == 0)) { - return braces[0] + base + braces[1]; - } - - if (recurseTimes < 0) { - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } else { - return ctx.stylize('[Object]', 'special'); - } - } - - ctx.seen.push(value); - - var output; - if (array) { - output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); - } else { - output = keys.map(function(key) { - return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); - }); - } - - ctx.seen.pop(); - - return reduceToSingleString(output, base, braces); -} - - -function formatPrimitive(ctx, value) { - if (isUndefined(value)) - return ctx.stylize('undefined', 'undefined'); - if (isString(value)) { - var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') - .replace(/'/g, "\\'") - .replace(/\\"/g, '"') + '\''; - return ctx.stylize(simple, 'string'); - } - if (isNumber(value)) - return ctx.stylize('' + value, 'number'); - if (isBoolean(value)) - return ctx.stylize('' + value, 'boolean'); - // For some reason typeof null is "object", so special case here. - if (isNull(value)) - return ctx.stylize('null', 'null'); -} - - -function formatError(value) { - return '[' + Error.prototype.toString.call(value) + ']'; -} - - -function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { - var output = []; - for (var i = 0, l = value.length; i < l; ++i) { - if (hasOwnProperty(value, String(i))) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - String(i), true)); - } else { - output.push(''); - } - } - keys.forEach(function(key) { - if (!key.match(/^\d+$/)) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - key, true)); - } - }); - return output; -} - - -function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { - var name, str, desc; - desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; - if (desc.get) { - if (desc.set) { - str = ctx.stylize('[Getter/Setter]', 'special'); - } else { - str = ctx.stylize('[Getter]', 'special'); - } - } else { - if (desc.set) { - str = ctx.stylize('[Setter]', 'special'); - } - } - if (!hasOwnProperty(visibleKeys, key)) { - name = '[' + key + ']'; - } - if (!str) { - if (ctx.seen.indexOf(desc.value) < 0) { - if (isNull(recurseTimes)) { - str = formatValue(ctx, desc.value, null); - } else { - str = formatValue(ctx, desc.value, recurseTimes - 1); - } - if (str.indexOf('\n') > -1) { - if (array) { - str = str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n').substr(2); - } else { - str = '\n' + str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n'); - } - } - } else { - str = ctx.stylize('[Circular]', 'special'); - } - } - if (isUndefined(name)) { - if (array && key.match(/^\d+$/)) { - return str; - } - name = JSON.stringify('' + key); - if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { - name = name.substr(1, name.length - 2); - name = ctx.stylize(name, 'name'); - } else { - name = name.replace(/'/g, "\\'") - .replace(/\\"/g, '"') - .replace(/(^"|"$)/g, "'"); - name = ctx.stylize(name, 'string'); - } - } - - return name + ': ' + str; -} - - -function reduceToSingleString(output, base, braces) { - var numLinesEst = 0; - var length = output.reduce(function(prev, cur) { - numLinesEst++; - if (cur.indexOf('\n') >= 0) numLinesEst++; - return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; - }, 0); - - if (length > 60) { - return braces[0] + - (base === '' ? '' : base + '\n ') + - ' ' + - output.join(',\n ') + - ' ' + - braces[1]; - } - - return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; -} - - -// NOTE: These type checking functions intentionally don't use `instanceof` -// because it is fragile and can be easily faked with `Object.create()`. -function isArray(ar) { - return Array.isArray(ar); -} -exports.isArray = isArray; - -function isBoolean(arg) { - return typeof arg === 'boolean'; -} -exports.isBoolean = isBoolean; - -function isNull(arg) { - return arg === null; -} -exports.isNull = isNull; - -function isNullOrUndefined(arg) { - return arg == null; -} -exports.isNullOrUndefined = isNullOrUndefined; - -function isNumber(arg) { - return typeof arg === 'number'; -} -exports.isNumber = isNumber; - -function isString(arg) { - return typeof arg === 'string'; -} -exports.isString = isString; - -function isSymbol(arg) { - return typeof arg === 'symbol'; -} -exports.isSymbol = isSymbol; - -function isUndefined(arg) { - return arg === void 0; -} -exports.isUndefined = isUndefined; - -function isRegExp(re) { - return isObject(re) && objectToString(re) === '[object RegExp]'; -} -exports.isRegExp = isRegExp; - -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} -exports.isObject = isObject; - -function isDate(d) { - return isObject(d) && objectToString(d) === '[object Date]'; -} -exports.isDate = isDate; - -function isError(e) { - return isObject(e) && - (objectToString(e) === '[object Error]' || e instanceof Error); -} -exports.isError = isError; - -function isFunction(arg) { - return typeof arg === 'function'; -} -exports.isFunction = isFunction; - -function isPrimitive(arg) { - return arg === null || - typeof arg === 'boolean' || - typeof arg === 'number' || - typeof arg === 'string' || - typeof arg === 'symbol' || // ES6 symbol - typeof arg === 'undefined'; -} -exports.isPrimitive = isPrimitive; - -exports.isBuffer = require('./support/isBuffer'); - -function objectToString(o) { - return Object.prototype.toString.call(o); -} - - -function pad(n) { - return n < 10 ? '0' + n.toString(10) : n.toString(10); -} - - -var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', - 'Oct', 'Nov', 'Dec']; - -// 26 Feb 16:19:34 -function timestamp() { - var d = new Date(); - var time = [pad(d.getHours()), - pad(d.getMinutes()), - pad(d.getSeconds())].join(':'); - return [d.getDate(), months[d.getMonth()], time].join(' '); -} - - -// log is just a thin wrapper to console.log that prepends a timestamp -exports.log = function() { - console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); -}; - - -/** - * Inherit the prototype methods from one constructor into another. - * - * The Function.prototype.inherits from lang.js rewritten as a standalone - * function (not on Function.prototype). NOTE: If this file is to be loaded - * during bootstrapping this function needs to be rewritten using some native - * functions as prototype setup using normal JavaScript does not work as - * expected during bootstrapping (see mirror.js in r114903). - * - * @param {function} ctor Constructor function which needs to inherit the - * prototype. - * @param {function} superCtor Constructor function to inherit prototype from. - */ -exports.inherits = require('inherits'); - -exports._extend = function(origin, add) { - // Don't do anything if add isn't an object - if (!add || !isObject(add)) return origin; - - var keys = Object.keys(add); - var i = keys.length; - while (i--) { - origin[keys[i]] = add[keys[i]]; - } - return origin; -}; - -function hasOwnProperty(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -} - -}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./support/isBuffer":66,"_process":47,"inherits":65}]},{},[20])(20) -}); \ No newline at end of file diff --git a/node_modules/pngjs/coverage/lcov-report/base.css b/node_modules/pngjs/coverage/lcov-report/base.css deleted file mode 100644 index ac7c23c..0000000 --- a/node_modules/pngjs/coverage/lcov-report/base.css +++ /dev/null @@ -1,354 +0,0 @@ -body, -html { - margin: 0; - padding: 0; - height: 100%; -} -body { - font-family: Helvetica Neue, Helvetica, Arial; - font-size: 14px; - color: #333; -} -.small { - font-size: 12px; -} -*, -*:after, -*:before { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -h1 { - font-size: 20px; - margin: 0; -} -h2 { - font-size: 14px; -} -pre { - font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; - margin: 0; - padding: 0; - -moz-tab-size: 2; - -o-tab-size: 2; - tab-size: 2; -} -a { - color: #0074d9; - text-decoration: none; -} -a:hover { - text-decoration: underline; -} -.strong { - font-weight: bold; -} -.space-top1 { - padding: 10px 0 0 0; -} -.pad2y { - padding: 20px 0; -} -.pad1y { - padding: 10px 0; -} -.pad2x { - padding: 0 20px; -} -.pad2 { - padding: 20px; -} -.pad1 { - padding: 10px; -} -.space-left2 { - padding-left: 55px; -} -.space-right2 { - padding-right: 20px; -} -.center { - text-align: center; -} -.clearfix { - display: block; -} -.clearfix:after { - content: ""; - display: block; - height: 0; - clear: both; - visibility: hidden; -} -.fl { - float: left; -} -@media only screen and (max-width: 640px) { - .col3 { - width: 100%; - max-width: 100%; - } - .hide-mobile { - display: none !important; - } -} - -.quiet { - color: #7f7f7f; - color: rgba(0, 0, 0, 0.5); -} -.quiet a { - opacity: 0.7; -} - -.fraction { - font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; - font-size: 10px; - color: #555; - background: #e8e8e8; - padding: 4px 5px; - border-radius: 3px; - vertical-align: middle; -} - -div.path a:link, -div.path a:visited { - color: #333; -} -table.coverage { - border-collapse: collapse; - margin: 10px 0 0 0; - padding: 0; -} - -table.coverage td { - margin: 0; - padding: 0; - vertical-align: top; -} -table.coverage td.line-count { - text-align: right; - padding: 0 5px 0 20px; -} -table.coverage td.line-coverage { - text-align: right; - padding-right: 10px; - min-width: 20px; -} - -table.coverage td span.cline-any { - display: inline-block; - padding: 0 5px; - width: 100%; -} -.missing-if-branch { - display: inline-block; - margin-right: 5px; - border-radius: 3px; - position: relative; - padding: 0 4px; - background: #333; - color: yellow; -} - -.skip-if-branch { - display: none; - margin-right: 10px; - position: relative; - padding: 0 4px; - background: #ccc; - color: white; -} -.missing-if-branch .typ, -.skip-if-branch .typ { - color: inherit !important; -} -.coverage-summary { - border-collapse: collapse; - width: 100%; -} -.coverage-summary tr { - border-bottom: 1px solid #bbb; -} -.keyline-all { - border: 1px solid #ddd; -} -.coverage-summary td, -.coverage-summary th { - padding: 10px; -} -.coverage-summary tbody { - border: 1px solid #bbb; -} -.coverage-summary td { - border-right: 1px solid #bbb; -} -.coverage-summary td:last-child { - border-right: none; -} -.coverage-summary th { - text-align: left; - font-weight: normal; - white-space: nowrap; -} -.coverage-summary th.file { - border-right: none !important; -} -.coverage-summary th.pct { -} -.coverage-summary th.pic, -.coverage-summary th.abs, -.coverage-summary td.pct, -.coverage-summary td.abs { - text-align: right; -} -.coverage-summary td.file { - white-space: nowrap; -} -.coverage-summary td.pic { - min-width: 120px !important; -} -.coverage-summary tfoot td { -} - -.coverage-summary .sorter { - height: 10px; - width: 7px; - display: inline-block; - margin-left: 0.5em; - background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; -} -.coverage-summary .sorted .sorter { - background-position: 0 -20px; -} -.coverage-summary .sorted-desc .sorter { - background-position: 0 -10px; -} -.status-line { - height: 10px; -} -/* yellow */ -.cbranch-no { - background: yellow !important; - color: #111; -} -/* dark red */ -.red.solid, -.status-line.low, -.low .cover-fill { - background: #c21f39; -} -.low .chart { - border: 1px solid #c21f39; -} -.highlighted, -.highlighted .cstat-no, -.highlighted .fstat-no, -.highlighted .cbranch-no { - background: #c21f39 !important; -} -/* medium red */ -.cstat-no, -.fstat-no, -.cbranch-no, -.cbranch-no { - background: #f6c6ce; -} -/* light red */ -.low, -.cline-no { - background: #fce1e5; -} -/* light green */ -.high, -.cline-yes { - background: rgb(230, 245, 208); -} -/* medium green */ -.cstat-yes { - background: rgb(161, 215, 106); -} -/* dark green */ -.status-line.high, -.high .cover-fill { - background: rgb(77, 146, 33); -} -.high .chart { - border: 1px solid rgb(77, 146, 33); -} -/* dark yellow (gold) */ -.status-line.medium, -.medium .cover-fill { - background: #f9cd0b; -} -.medium .chart { - border: 1px solid #f9cd0b; -} -/* light yellow */ -.medium { - background: #fff4c2; -} - -.cstat-skip { - background: #ddd; - color: #111; -} -.fstat-skip { - background: #ddd; - color: #111 !important; -} -.cbranch-skip { - background: #ddd !important; - color: #111; -} - -span.cline-neutral { - background: #eaeaea; -} - -.coverage-summary td.empty { - opacity: 0.5; - padding-top: 4px; - padding-bottom: 4px; - line-height: 1; - color: #888; -} - -.cover-fill, -.cover-empty { - display: inline-block; - height: 12px; -} -.chart { - line-height: 0; -} -.cover-empty { - background: white; -} -.cover-full { - border-right: none !important; -} -pre.prettyprint { - border: none !important; - padding: 0 !important; - margin: 0 !important; -} -.com { - color: #999 !important; -} -.ignore-none { - color: #999; - font-weight: normal; -} - -.wrapper { - min-height: 100%; - height: auto !important; - height: 100%; - margin: 0 auto -48px; -} -.footer, -.push { - height: 48px; -} diff --git a/node_modules/pngjs/coverage/lcov-report/bitmapper.js.html b/node_modules/pngjs/coverage/lcov-report/bitmapper.js.html deleted file mode 100644 index bafa89b..0000000 --- a/node_modules/pngjs/coverage/lcov-report/bitmapper.js.html +++ /dev/null @@ -1,881 +0,0 @@ - - - - - - Code coverage report for bitmapper.js - - - - - - - - - -
    -
    -

    All files bitmapper.js

    -
    - -
    - 94.37% - Statements - 134/142 -
    - - -
    - 72.41% - Branches - 21/29 -
    - - -
    - 89.47% - Functions - 17/19 -
    - - -
    - 94.16% - Lines - 129/137 -
    - - -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268  -  -1x -  -1x -  -  -  -  -  -  -313632x -  -  -  -313632x -313632x -313632x -313632x -313632x -  -  -  -  -  -8192x -  -  -  -8192x -8192x -8192x -8192x -8192x -  -  -  -  -  -1228160x -  -  -  -1228160x -1228160x -1228160x -1228160x -  -  -  -  -  -272640x -  -  -  -272640x -272640x -272640x -272640x -  -  -  -1x -  -  -  -  -  -  -1193380x -1193380x -1193380x -1193380x -1193380x -  -  -  -  -  -8192x -8192x -8192x -8192x -8192x -  -  -  -  -  -24576x -24576x -24576x -24576x -  -  -  -  -  -8192x -8192x -8192x -8192x -  -  -  -  -209x -209x -  -  -334250x -  -  -334250x -334250x -  -334250x -  -  -  -149504x -149504x -149504x -149504x -  -49612x -49612x -49612x -49612x -  -2968x -2968x -2968x -2968x -2968x -2968x -  -132166x -132166x -132166x -132166x -132166x -132166x -132166x -132166x -132166x -132166x -  -  -  -209x -  -1234340x -334250x -  -1234340x -1234340x -1234340x -  -  -8106x -  -  -209x -  -  -  -  -  -  -  -  -210x -210x -210x -210x -7288x -1822624x -1822624x -1822624x -  -  -210x -  -  -  -  -529x -529x -529x -529x -8106x -1234340x -1234340x -1234340x -  -8106x -  -  -  -1x -335x -335x -335x -335x -335x -  -  -335x -209x -  -  -335x -269x -  -66x -  -335x -335x -  -  -  -335x -72x -72x -  -263x -263x -2732114x -2732114x -2732114x -  -263x -  -  -335x -739x -210x -  -  -  -  -  -  -  -  -529x -  -  -  -  -  -  -  -  -  -335x -126x -  -  -  -209x -  -  -335x -  - 
    "use strict";
    - 
    -let interlaceUtils = require("./interlace");
    - 
    -let pixelBppMapper = [
    -  // 0 - dummy entry
    -  function () {},
    - 
    -  // 1 - L
    -  // 0: 0, 1: 0, 2: 0, 3: 0xff
    -  function (pxData, data, pxPos, rawPos) {
    -    Iif (rawPos === data.length) {
    -      throw new Error("Ran out of data");
    -    }
    - 
    -    let pixel = data[rawPos];
    -    pxData[pxPos] = pixel;
    -    pxData[pxPos + 1] = pixel;
    -    pxData[pxPos + 2] = pixel;
    -    pxData[pxPos + 3] = 0xff;
    -  },
    - 
    -  // 2 - LA
    -  // 0: 0, 1: 0, 2: 0, 3: 1
    -  function (pxData, data, pxPos, rawPos) {
    -    Iif (rawPos + 1 >= data.length) {
    -      throw new Error("Ran out of data");
    -    }
    - 
    -    let pixel = data[rawPos];
    -    pxData[pxPos] = pixel;
    -    pxData[pxPos + 1] = pixel;
    -    pxData[pxPos + 2] = pixel;
    -    pxData[pxPos + 3] = data[rawPos + 1];
    -  },
    - 
    -  // 3 - RGB
    -  // 0: 0, 1: 1, 2: 2, 3: 0xff
    -  function (pxData, data, pxPos, rawPos) {
    -    Iif (rawPos + 2 >= data.length) {
    -      throw new Error("Ran out of data");
    -    }
    - 
    -    pxData[pxPos] = data[rawPos];
    -    pxData[pxPos + 1] = data[rawPos + 1];
    -    pxData[pxPos + 2] = data[rawPos + 2];
    -    pxData[pxPos + 3] = 0xff;
    -  },
    - 
    -  // 4 - RGBA
    -  // 0: 0, 1: 1, 2: 2, 3: 3
    -  function (pxData, data, pxPos, rawPos) {
    -    Iif (rawPos + 3 >= data.length) {
    -      throw new Error("Ran out of data");
    -    }
    - 
    -    pxData[pxPos] = data[rawPos];
    -    pxData[pxPos + 1] = data[rawPos + 1];
    -    pxData[pxPos + 2] = data[rawPos + 2];
    -    pxData[pxPos + 3] = data[rawPos + 3];
    -  },
    -];
    - 
    -let pixelBppCustomMapper = [
    -  // 0 - dummy entry
    -  function () {},
    - 
    -  // 1 - L
    -  // 0: 0, 1: 0, 2: 0, 3: 0xff
    -  function (pxData, pixelData, pxPos, maxBit) {
    -    let pixel = pixelData[0];
    -    pxData[pxPos] = pixel;
    -    pxData[pxPos + 1] = pixel;
    -    pxData[pxPos + 2] = pixel;
    -    pxData[pxPos + 3] = maxBit;
    -  },
    - 
    -  // 2 - LA
    -  // 0: 0, 1: 0, 2: 0, 3: 1
    -  function (pxData, pixelData, pxPos) {
    -    let pixel = pixelData[0];
    -    pxData[pxPos] = pixel;
    -    pxData[pxPos + 1] = pixel;
    -    pxData[pxPos + 2] = pixel;
    -    pxData[pxPos + 3] = pixelData[1];
    -  },
    - 
    -  // 3 - RGB
    -  // 0: 0, 1: 1, 2: 2, 3: 0xff
    -  function (pxData, pixelData, pxPos, maxBit) {
    -    pxData[pxPos] = pixelData[0];
    -    pxData[pxPos + 1] = pixelData[1];
    -    pxData[pxPos + 2] = pixelData[2];
    -    pxData[pxPos + 3] = maxBit;
    -  },
    - 
    -  // 4 - RGBA
    -  // 0: 0, 1: 1, 2: 2, 3: 3
    -  function (pxData, pixelData, pxPos) {
    -    pxData[pxPos] = pixelData[0];
    -    pxData[pxPos + 1] = pixelData[1];
    -    pxData[pxPos + 2] = pixelData[2];
    -    pxData[pxPos + 3] = pixelData[3];
    -  },
    -];
    - 
    -function bitRetriever(data, depth) {
    -  let leftOver = [];
    -  let i = 0;
    - 
    -  function split() {
    -    Iif (i === data.length) {
    -      throw new Error("Ran out of data");
    -    }
    -    let byte = data[i];
    -    i++;
    -    let byte8, byte7, byte6, byte5, byte4, byte3, byte2, byte1;
    -    switch (depth) {
    -      default:
    -        throw new Error("unrecognised depth");
    -      case 16:
    -        byte2 = data[i];
    -        i++;
    -        leftOver.push((byte << 8) + byte2);
    -        break;
    -      case 4:
    -        byte2 = byte & 0x0f;
    -        byte1 = byte >> 4;
    -        leftOver.push(byte1, byte2);
    -        break;
    -      case 2:
    -        byte4 = byte & 3;
    -        byte3 = (byte >> 2) & 3;
    -        byte2 = (byte >> 4) & 3;
    -        byte1 = (byte >> 6) & 3;
    -        leftOver.push(byte1, byte2, byte3, byte4);
    -        break;
    -      case 1:
    -        byte8 = byte & 1;
    -        byte7 = (byte >> 1) & 1;
    -        byte6 = (byte >> 2) & 1;
    -        byte5 = (byte >> 3) & 1;
    -        byte4 = (byte >> 4) & 1;
    -        byte3 = (byte >> 5) & 1;
    -        byte2 = (byte >> 6) & 1;
    -        byte1 = (byte >> 7) & 1;
    -        leftOver.push(byte1, byte2, byte3, byte4, byte5, byte6, byte7, byte8);
    -        break;
    -    }
    -  }
    - 
    -  return {
    -    get: function (count) {
    -      while (leftOver.length < count) {
    -        split();
    -      }
    -      let returner = leftOver.slice(0, count);
    -      leftOver = leftOver.slice(count);
    -      return returner;
    -    },
    -    resetAfterLine: function () {
    -      leftOver.length = 0;
    -    },
    -    end: function () {
    -      Iif (i !== data.length) {
    -        throw new Error("extra data found");
    -      }
    -    },
    -  };
    -}
    - 
    -function mapImage8Bit(image, pxData, getPxPos, bpp, data, rawPos) {
    -  // eslint-disable-line max-params
    -  let imageWidth = image.width;
    -  let imageHeight = image.height;
    -  let imagePass = image.index;
    -  for (let y = 0; y < imageHeight; y++) {
    -    for (let x = 0; x < imageWidth; x++) {
    -      let pxPos = getPxPos(x, y, imagePass);
    -      pixelBppMapper[bpp](pxData, data, pxPos, rawPos);
    -      rawPos += bpp; //eslint-disable-line no-param-reassign
    -    }
    -  }
    -  return rawPos;
    -}
    - 
    -function mapImageCustomBit(image, pxData, getPxPos, bpp, bits, maxBit) {
    -  // eslint-disable-line max-params
    -  let imageWidth = image.width;
    -  let imageHeight = image.height;
    -  let imagePass = image.index;
    -  for (let y = 0; y < imageHeight; y++) {
    -    for (let x = 0; x < imageWidth; x++) {
    -      let pixelData = bits.get(bpp);
    -      let pxPos = getPxPos(x, y, imagePass);
    -      pixelBppCustomMapper[bpp](pxData, pixelData, pxPos, maxBit);
    -    }
    -    bits.resetAfterLine();
    -  }
    -}
    - 
    -exports.dataToBitMap = function (data, bitmapInfo) {
    -  let width = bitmapInfo.width;
    -  let height = bitmapInfo.height;
    -  let depth = bitmapInfo.depth;
    -  let bpp = bitmapInfo.bpp;
    -  let interlace = bitmapInfo.interlace;
    -  let bits;
    - 
    -  if (depth !== 8) {
    -    bits = bitRetriever(data, depth);
    -  }
    -  let pxData;
    -  if (depth <= 8) {
    -    pxData = Buffer.alloc(width * height * 4);
    -  } else {
    -    pxData = new Uint16Array(width * height * 4);
    -  }
    -  let maxBit = Math.pow(2, depth) - 1;
    -  let rawPos = 0;
    -  let images;
    -  let getPxPos;
    - 
    -  if (interlace) {
    -    images = interlaceUtils.getImagePasses(width, height);
    -    getPxPos = interlaceUtils.getInterlaceIterator(width, height);
    -  } else {
    -    let nonInterlacedPxPos = 0;
    -    getPxPos = function () {
    -      let returner = nonInterlacedPxPos;
    -      nonInterlacedPxPos += 4;
    -      return returner;
    -    };
    -    images = [{ width: width, height: height }];
    -  }
    - 
    -  for (let imageIndex = 0; imageIndex < images.length; imageIndex++) {
    -    if (depth === 8) {
    -      rawPos = mapImage8Bit(
    -        images[imageIndex],
    -        pxData,
    -        getPxPos,
    -        bpp,
    -        data,
    -        rawPos
    -      );
    -    } else {
    -      mapImageCustomBit(
    -        images[imageIndex],
    -        pxData,
    -        getPxPos,
    -        bpp,
    -        bits,
    -        maxBit
    -      );
    -    }
    -  }
    -  if (depth === 8) {
    -    Iif (rawPos !== data.length) {
    -      throw new Error("extra data found");
    -    }
    -  } else {
    -    bits.end();
    -  }
    - 
    -  return pxData;
    -};
    - 
    - -
    -
    - - - - - - - - - \ No newline at end of file diff --git a/node_modules/pngjs/coverage/lcov-report/bitpacker.js.html b/node_modules/pngjs/coverage/lcov-report/bitpacker.js.html deleted file mode 100644 index 50cca23..0000000 --- a/node_modules/pngjs/coverage/lcov-report/bitpacker.js.html +++ /dev/null @@ -1,554 +0,0 @@ - - - - - - Code coverage report for bitpacker.js - - - - - - - - - -
    -
    -

    All files bitpacker.js

    -
    - -
    - 11.36% - Statements - 10/88 -
    - - -
    - 6.12% - Branches - 3/49 -
    - - -
    - 66.67% - Functions - 2/3 -
    - - -
    - 11.63% - Lines - 10/86 -
    - - -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159  -  -1x -  -1x -  -325x -  -  -325x -325x -325x -325x -  -325x -  -  -325x -325x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
    "use strict";
    - 
    -let constants = require("./constants");
    - 
    -module.exports = function (dataIn, width, height, options) {
    -  let outHasAlpha =
    -    [constants.COLORTYPE_COLOR_ALPHA, constants.COLORTYPE_ALPHA].indexOf(
    -      options.colorType
    -    ) !== -1;
    -  Eif (options.colorType === options.inputColorType) {
    -    let bigEndian = (function () {
    -      let buffer = new ArrayBuffer(2);
    -      new DataView(buffer).setInt16(0, 256, true /* littleEndian */);
    -      // Int16Array uses the platform's endianness.
    -      return new Int16Array(buffer)[0] !== 256;
    -    })();
    -    // If no need to convert to grayscale and alpha is present/absent in both, take a fast route
    -    Eif (options.bitDepth === 8 || (options.bitDepth === 16 && bigEndian)) {
    -      return dataIn;
    -    }
    -  }
    - 
    -  // map to a UInt16 array if data is 16bit, fix endianness below
    -  let data = options.bitDepth !== 16 ? dataIn : new Uint16Array(dataIn.buffer);
    - 
    -  let maxValue = 255;
    -  let inBpp = constants.COLORTYPE_TO_BPP_MAP[options.inputColorType];
    -  if (inBpp === 4 && !options.inputHasAlpha) {
    -    inBpp = 3;
    -  }
    -  let outBpp = constants.COLORTYPE_TO_BPP_MAP[options.colorType];
    -  if (options.bitDepth === 16) {
    -    maxValue = 65535;
    -    outBpp *= 2;
    -  }
    -  let outData = Buffer.alloc(width * height * outBpp);
    - 
    -  let inIndex = 0;
    -  let outIndex = 0;
    - 
    -  let bgColor = options.bgColor || {};
    -  if (bgColor.red === undefined) {
    -    bgColor.red = maxValue;
    -  }
    -  if (bgColor.green === undefined) {
    -    bgColor.green = maxValue;
    -  }
    -  if (bgColor.blue === undefined) {
    -    bgColor.blue = maxValue;
    -  }
    - 
    -  function getRGBA() {
    -    let red;
    -    let green;
    -    let blue;
    -    let alpha = maxValue;
    -    switch (options.inputColorType) {
    -      case constants.COLORTYPE_COLOR_ALPHA:
    -        alpha = data[inIndex + 3];
    -        red = data[inIndex];
    -        green = data[inIndex + 1];
    -        blue = data[inIndex + 2];
    -        break;
    -      case constants.COLORTYPE_COLOR:
    -        red = data[inIndex];
    -        green = data[inIndex + 1];
    -        blue = data[inIndex + 2];
    -        break;
    -      case constants.COLORTYPE_ALPHA:
    -        alpha = data[inIndex + 1];
    -        red = data[inIndex];
    -        green = red;
    -        blue = red;
    -        break;
    -      case constants.COLORTYPE_GRAYSCALE:
    -        red = data[inIndex];
    -        green = red;
    -        blue = red;
    -        break;
    -      default:
    -        throw new Error(
    -          "input color type:" +
    -            options.inputColorType +
    -            " is not supported at present"
    -        );
    -    }
    - 
    -    if (options.inputHasAlpha) {
    -      if (!outHasAlpha) {
    -        alpha /= maxValue;
    -        red = Math.min(
    -          Math.max(Math.round((1 - alpha) * bgColor.red + alpha * red), 0),
    -          maxValue
    -        );
    -        green = Math.min(
    -          Math.max(Math.round((1 - alpha) * bgColor.green + alpha * green), 0),
    -          maxValue
    -        );
    -        blue = Math.min(
    -          Math.max(Math.round((1 - alpha) * bgColor.blue + alpha * blue), 0),
    -          maxValue
    -        );
    -      }
    -    }
    -    return { red: red, green: green, blue: blue, alpha: alpha };
    -  }
    - 
    -  for (let y = 0; y < height; y++) {
    -    for (let x = 0; x < width; x++) {
    -      let rgba = getRGBA(data, inIndex);
    - 
    -      switch (options.colorType) {
    -        case constants.COLORTYPE_COLOR_ALPHA:
    -        case constants.COLORTYPE_COLOR:
    -          if (options.bitDepth === 8) {
    -            outData[outIndex] = rgba.red;
    -            outData[outIndex + 1] = rgba.green;
    -            outData[outIndex + 2] = rgba.blue;
    -            if (outHasAlpha) {
    -              outData[outIndex + 3] = rgba.alpha;
    -            }
    -          } else {
    -            outData.writeUInt16BE(rgba.red, outIndex);
    -            outData.writeUInt16BE(rgba.green, outIndex + 2);
    -            outData.writeUInt16BE(rgba.blue, outIndex + 4);
    -            if (outHasAlpha) {
    -              outData.writeUInt16BE(rgba.alpha, outIndex + 6);
    -            }
    -          }
    -          break;
    -        case constants.COLORTYPE_ALPHA:
    -        case constants.COLORTYPE_GRAYSCALE: {
    -          // Convert to grayscale and alpha
    -          let grayscale = (rgba.red + rgba.green + rgba.blue) / 3;
    -          if (options.bitDepth === 8) {
    -            outData[outIndex] = grayscale;
    -            if (outHasAlpha) {
    -              outData[outIndex + 1] = rgba.alpha;
    -            }
    -          } else {
    -            outData.writeUInt16BE(grayscale, outIndex);
    -            if (outHasAlpha) {
    -              outData.writeUInt16BE(rgba.alpha, outIndex + 2);
    -            }
    -          }
    -          break;
    -        }
    -        default:
    -          throw new Error("unrecognised color Type " + options.colorType);
    -      }
    - 
    -      inIndex += inBpp;
    -      outIndex += outBpp;
    -    }
    -  }
    - 
    -  return outData;
    -};
    - 
    - -
    -
    - - - - - - - - - \ No newline at end of file diff --git a/node_modules/pngjs/coverage/lcov-report/block-navigation.js b/node_modules/pngjs/coverage/lcov-report/block-navigation.js deleted file mode 100644 index 81d08c0..0000000 --- a/node_modules/pngjs/coverage/lcov-report/block-navigation.js +++ /dev/null @@ -1,77 +0,0 @@ -/* eslint-disable */ -var jumpToCode = (function init() { - // Classes of code we would like to highlight in the file view - var missingCoverageClasses = [".cbranch-no", ".cstat-no", ".fstat-no"]; - - // Elements to highlight in the file listing view - var fileListingElements = ["td.pct.low"]; - - // We don't want to select elements that are direct descendants of another match - var notSelector = ":not(" + missingCoverageClasses.join("):not(") + ") > "; // becomes `:not(a):not(b) > ` - - // Selecter that finds elements on the page to which we can jump - var selector = - fileListingElements.join(", ") + - ", " + - notSelector + - missingCoverageClasses.join(", " + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` - - // The NodeList of matching elements - var missingCoverageElements = document.querySelectorAll(selector); - - var currentIndex; - - function toggleClass(index) { - missingCoverageElements.item(currentIndex).classList.remove("highlighted"); - missingCoverageElements.item(index).classList.add("highlighted"); - } - - function makeCurrent(index) { - toggleClass(index); - currentIndex = index; - missingCoverageElements.item(index).scrollIntoView({ - behavior: "smooth", - block: "center", - inline: "center", - }); - } - - function goToPrevious() { - var nextIndex = 0; - if (typeof currentIndex !== "number" || currentIndex === 0) { - nextIndex = missingCoverageElements.length - 1; - } else if (missingCoverageElements.length > 1) { - nextIndex = currentIndex - 1; - } - - makeCurrent(nextIndex); - } - - function goToNext() { - var nextIndex = 0; - - if ( - typeof currentIndex === "number" && - currentIndex < missingCoverageElements.length - 1 - ) { - nextIndex = currentIndex + 1; - } - - makeCurrent(nextIndex); - } - - return function jump(event) { - switch (event.which) { - case 78: // n - case 74: // j - goToNext(); - break; - case 66: // b - case 75: // k - case 80: // p - goToPrevious(); - break; - } - }; -})(); -window.addEventListener("keydown", jumpToCode); diff --git a/node_modules/pngjs/coverage/lcov-report/chunkstream.js.html b/node_modules/pngjs/coverage/lcov-report/chunkstream.js.html deleted file mode 100644 index 552ffba..0000000 --- a/node_modules/pngjs/coverage/lcov-report/chunkstream.js.html +++ /dev/null @@ -1,647 +0,0 @@ - - - - - - Code coverage report for chunkstream.js - - - - - - - - - -
    -
    -

    All files chunkstream.js

    -
    - -
    - 90.11% - Statements - 82/91 -
    - - -
    - 81.4% - Branches - 35/43 -
    - - -
    - 100% - Functions - 10/10 -
    - - -
    - 90.11% - Lines - 82/91 -
    - - -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190  -  -1x -1x -  -1x -529x -  -529x -529x -  -529x -529x -  -529x -529x -  -1x -  -1x -13318x -  -  -  -  -  -13318x -  -13318x -  -  -13318x -  -  -  -  -  -  -  -  -1x -943x -  -  -  -  -  -943x -943x -  -  -  -  -943x -943x -  -943x -  -  -943x -346x -  -  -943x -  -  -1x -311x -  -  -  -311x -  -  -311x -  -  -  -  -311x -309x -  -2x -2x -  -  -  -1x -  -1x -311x -3x -  -  -311x -  -  -1x -327x -  -  -  -327x -327x -327x -  -327x -  -  -1x -  -741x -  -  -741x -  -  -741x -568x -568x -  -568x -  -  -173x -173x -  -173x -  -  -  -1x -12408x -  -12408x -12408x -12408x -  -  -12408x -12617x -12617x -  -12617x -12617x -  -  -12617x -11863x -  -  -  -  -12408x -532x -  -  -12408x -  -12408x -  -  -1x -14263x -  -14263x -15656x -  -  -15656x -741x -14915x -  -  -12408x -  -  -  -2507x -  -  -  -14263x -2x -  -  -  -  -  - 
    "use strict";
    - 
    -let util = require("util");
    -let Stream = require("stream");
    - 
    -let ChunkStream = (module.exports = function () {
    -  Stream.call(this);
    - 
    -  this._buffers = [];
    -  this._buffered = 0;
    - 
    -  this._reads = [];
    -  this._paused = false;
    - 
    -  this._encoding = "utf8";
    -  this.writable = true;
    -});
    -util.inherits(ChunkStream, Stream);
    - 
    -ChunkStream.prototype.read = function (length, callback) {
    -  this._reads.push({
    -    length: Math.abs(length), // if length < 0 then at most this length
    -    allowLess: length < 0,
    -    func: callback,
    -  });
    - 
    -  process.nextTick(
    -    function () {
    -      this._process();
    - 
    -      // its paused and there is not enought data then ask for more
    -      Iif (this._paused && this._reads.length > 0) {
    -        this._paused = false;
    - 
    -        this.emit("drain");
    -      }
    -    }.bind(this)
    -  );
    -};
    - 
    -ChunkStream.prototype.write = function (data, encoding) {
    -  Iif (!this.writable) {
    -    this.emit("error", new Error("Stream not writable"));
    -    return false;
    -  }
    - 
    -  let dataBuffer;
    -  Eif (Buffer.isBuffer(data)) {
    -    dataBuffer = data;
    -  } else {
    -    dataBuffer = Buffer.from(data, encoding || this._encoding);
    -  }
    - 
    -  this._buffers.push(dataBuffer);
    -  this._buffered += dataBuffer.length;
    - 
    -  this._process();
    - 
    -  // ok if there are no more read requests
    -  if (this._reads && this._reads.length === 0) {
    -    this._paused = true;
    -  }
    - 
    -  return this.writable && !this._paused;
    -};
    - 
    -ChunkStream.prototype.end = function (data, encoding) {
    -  Iif (data) {
    -    this.write(data, encoding);
    -  }
    - 
    -  this.writable = false;
    - 
    -  // already destroyed
    -  Iif (!this._buffers) {
    -    return;
    -  }
    - 
    -  // enqueue or handle end
    -  if (this._buffers.length === 0) {
    -    this._end();
    -  } else {
    -    this._buffers.push(null);
    -    this._process();
    -  }
    -};
    - 
    -ChunkStream.prototype.destroySoon = ChunkStream.prototype.end;
    - 
    -ChunkStream.prototype._end = function () {
    -  if (this._reads.length > 0) {
    -    this.emit("error", new Error("Unexpected end of input"));
    -  }
    - 
    -  this.destroy();
    -};
    - 
    -ChunkStream.prototype.destroy = function () {
    -  Iif (!this._buffers) {
    -    return;
    -  }
    - 
    -  this.writable = false;
    -  this._reads = null;
    -  this._buffers = null;
    - 
    -  this.emit("close");
    -};
    - 
    -ChunkStream.prototype._processReadAllowingLess = function (read) {
    -  // ok there is any data so that we can satisfy this request
    -  this._reads.shift(); // == read
    - 
    -  // first we need to peek into first buffer
    -  let smallerBuf = this._buffers[0];
    - 
    -  // ok there is more data than we need
    -  if (smallerBuf.length > read.length) {
    -    this._buffered -= read.length;
    -    this._buffers[0] = smallerBuf.slice(read.length);
    - 
    -    read.func.call(this, smallerBuf.slice(0, read.length));
    -  } else {
    -    // ok this is less than maximum length so use it all
    -    this._buffered -= smallerBuf.length;
    -    this._buffers.shift(); // == smallerBuf
    - 
    -    read.func.call(this, smallerBuf);
    -  }
    -};
    - 
    -ChunkStream.prototype._processRead = function (read) {
    -  this._reads.shift(); // == read
    - 
    -  let pos = 0;
    -  let count = 0;
    -  let data = Buffer.alloc(read.length);
    - 
    -  // create buffer for all data
    -  while (pos < read.length) {
    -    let buf = this._buffers[count++];
    -    let len = Math.min(buf.length, read.length - pos);
    - 
    -    buf.copy(data, pos, 0, len);
    -    pos += len;
    - 
    -    // last buffer wasn't used all so just slice it and leave
    -    if (len !== buf.length) {
    -      this._buffers[--count] = buf.slice(len);
    -    }
    -  }
    - 
    -  // remove all used buffers
    -  if (count > 0) {
    -    this._buffers.splice(0, count);
    -  }
    - 
    -  this._buffered -= read.length;
    - 
    -  read.func.call(this, data);
    -};
    - 
    -ChunkStream.prototype._process = function () {
    -  try {
    -    // as long as there is any data and read requests
    -    while (this._buffered > 0 && this._reads && this._reads.length > 0) {
    -      let read = this._reads[0];
    - 
    -      // read any data (but no more than length)
    -      if (read.allowLess) {
    -        this._processReadAllowingLess(read);
    -      } else if (this._buffered >= read.length) {
    -        // ok we can meet some expectations
    - 
    -        this._processRead(read);
    -      } else {
    -        // not enought data to satisfy first request in queue
    -        // so we need to wait for more
    -        break;
    -      }
    -    }
    - 
    -    if (this._buffers && !this.writable) {
    -      this._end();
    -    }
    -  } catch (ex) {
    -    this.emit("error", ex);
    -  }
    -};
    - 
    - -
    -
    - - - - - - - - - \ No newline at end of file diff --git a/node_modules/pngjs/coverage/lcov-report/constants.js.html b/node_modules/pngjs/coverage/lcov-report/constants.js.html deleted file mode 100644 index a6edd80..0000000 --- a/node_modules/pngjs/coverage/lcov-report/constants.js.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - Code coverage report for constants.js - - - - - - - - - -
    -
    -

    All files constants.js

    -
    - -
    - 100% - Statements - 1/1 -
    - - -
    - 100% - Branches - 0/0 -
    - - -
    - 100% - Functions - 0/0 -
    - - -
    - 100% - Lines - 1/1 -
    - - -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
    "use strict";
    - 
    -module.exports = {
    -  PNG_SIGNATURE: [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a],
    - 
    -  TYPE_IHDR: 0x49484452,
    -  TYPE_IEND: 0x49454e44,
    -  TYPE_IDAT: 0x49444154,
    -  TYPE_PLTE: 0x504c5445,
    -  TYPE_tRNS: 0x74524e53, // eslint-disable-line camelcase
    -  TYPE_gAMA: 0x67414d41, // eslint-disable-line camelcase
    - 
    -  // color-type bits
    -  COLORTYPE_GRAYSCALE: 0,
    -  COLORTYPE_PALETTE: 1,
    -  COLORTYPE_COLOR: 2,
    -  COLORTYPE_ALPHA: 4, // e.g. grayscale and alpha
    - 
    -  // color-type combinations
    -  COLORTYPE_PALETTE_COLOR: 3,
    -  COLORTYPE_COLOR_ALPHA: 6,
    - 
    -  COLORTYPE_TO_BPP_MAP: {
    -    0: 1,
    -    2: 3,
    -    3: 1,
    -    4: 2,
    -    6: 4,
    -  },
    - 
    -  GAMMA_DIVISION: 100000,
    -};
    - 
    - -
    -
    - - - - - - - - - \ No newline at end of file diff --git a/node_modules/pngjs/coverage/lcov-report/crc.js.html b/node_modules/pngjs/coverage/lcov-report/crc.js.html deleted file mode 100644 index 53fc72a..0000000 --- a/node_modules/pngjs/coverage/lcov-report/crc.js.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - Code coverage report for crc.js - - - - - - - - - -
    -
    -

    All files crc.js

    -
    - -
    - 100% - Statements - 26/26 -
    - - -
    - 100% - Branches - 2/2 -
    - - -
    - 100% - Functions - 5/5 -
    - - -
    - 100% - Lines - 22/22 -
    - - -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41  -  -1x -  -1x -1x -256x -256x -2048x -1024x -  -1024x -  -  -256x -  -  -  -1x -2461x -  -  -1x -4839x -823519x -  -4839x -  -  -1x -2195x -  -  -1x -1592x -1592x -305287x -  -1592x -  - 
    "use strict";
    - 
    -let crcTable = [];
    - 
    -(function () {
    -  for (let i = 0; i < 256; i++) {
    -    let currentCrc = i;
    -    for (let j = 0; j < 8; j++) {
    -      if (currentCrc & 1) {
    -        currentCrc = 0xedb88320 ^ (currentCrc >>> 1);
    -      } else {
    -        currentCrc = currentCrc >>> 1;
    -      }
    -    }
    -    crcTable[i] = currentCrc;
    -  }
    -})();
    - 
    -let CrcCalculator = (module.exports = function () {
    -  this._crc = -1;
    -});
    - 
    -CrcCalculator.prototype.write = function (data) {
    -  for (let i = 0; i < data.length; i++) {
    -    this._crc = crcTable[(this._crc ^ data[i]) & 0xff] ^ (this._crc >>> 8);
    -  }
    -  return true;
    -};
    - 
    -CrcCalculator.prototype.crc32 = function () {
    -  return this._crc ^ -1;
    -};
    - 
    -CrcCalculator.crc32 = function (buf) {
    -  let crc = -1;
    -  for (let i = 0; i < buf.length; i++) {
    -    crc = crcTable[(crc ^ buf[i]) & 0xff] ^ (crc >>> 8);
    -  }
    -  return crc ^ -1;
    -};
    - 
    - -
    -
    - - - - - - - - - \ No newline at end of file diff --git a/node_modules/pngjs/coverage/lcov-report/favicon.png b/node_modules/pngjs/coverage/lcov-report/favicon.png deleted file mode 100644 index 6691817834a957c938e7f09640a37a645fb31457..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 540 zcmV+%0^|LOP)wSzy{h>9elhJ=8GnBQmf?)AI(^#wDA_`!QTxaXXE&bjxo zTGCc%V|W`}Lwz0rDO*qBbGY-M@aNENIZ1rK?nOAibaC*vb%CF;I_~lkJawax%_+1J zLn(#pv_v{f0`v`Cfp6()7MB(>IoTAiQdKxgxX?VyV&KVZ7b$vn<8|Z<9$35C+G_8SH0x6Y(xB&~bmn%r}ceRwbc0000 - - - - Code coverage report for filter-pack.js - - - - - - - - - -
    -
    -

    All files filter-pack.js

    -
    - -
    - 95.83% - Statements - 92/96 -
    - - -
    - 81.82% - Branches - 36/44 -
    - - -
    - 100% - Functions - 11/11 -
    - - -
    - 95.24% - Lines - 80/84 -
    - - -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172  -  -1x -  -  -44x -5136x -  -  -  -  -10490x -10490x -  -10490x -2776736x -  -10490x -  -  -  -637x -107032x -107032x -  -107032x -  -  -  -  -10490x -10490x -2776736x -2776736x -  -2776736x -  -  -10490x -  -  -  -2670x -581344x -581344x -  -581344x -  -  -  -  -10490x -10490x -10490x -2776736x -2776736x -  -2776736x -  -  -10490x -  -  -  -208x -204096x -204096x -204096x -  -204096x -  -  -  -  -10490x -10490x -2776736x -2776736x -2776736x -  -2776736x -  -  -10490x -  -  -  -6931x -1879128x -1879128x -  -1879128x -1879128x -  -1879128x -  -  -  -  -10490x -10490x -2776736x -2776736x -  -2776736x -2776736x -  -2776736x -  -  -10490x -  -  -1x -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -1x -  -325x -325x -  -  -  -  -  -  -325x -  -  -325x -325x -325x -325x -  -325x -  -325x -10490x -  -10490x -  -10490x -52450x -52450x -35370x -35370x -  -  -  -  -10490x -10490x -10490x -10490x -10490x -  -325x -  - 
    "use strict";
    - 
    -let paethPredictor = require("./paeth-predictor");
    - 
    -function filterNone(pxData, pxPos, byteWidth, rawData, rawPos) {
    -  for (let x = 0; x < byteWidth; x++) {
    -    rawData[rawPos + x] = pxData[pxPos + x];
    -  }
    -}
    - 
    -function filterSumNone(pxData, pxPos, byteWidth) {
    -  let sum = 0;
    -  let length = pxPos + byteWidth;
    - 
    -  for (let i = pxPos; i < length; i++) {
    -    sum += Math.abs(pxData[i]);
    -  }
    -  return sum;
    -}
    - 
    -function filterSub(pxData, pxPos, byteWidth, rawData, rawPos, bpp) {
    -  for (let x = 0; x < byteWidth; x++) {
    -    let left = x >= bpp ? pxData[pxPos + x - bpp] : 0;
    -    let val = pxData[pxPos + x] - left;
    - 
    -    rawData[rawPos + x] = val;
    -  }
    -}
    - 
    -function filterSumSub(pxData, pxPos, byteWidth, bpp) {
    -  let sum = 0;
    -  for (let x = 0; x < byteWidth; x++) {
    -    let left = x >= bpp ? pxData[pxPos + x - bpp] : 0;
    -    let val = pxData[pxPos + x] - left;
    - 
    -    sum += Math.abs(val);
    -  }
    - 
    -  return sum;
    -}
    - 
    -function filterUp(pxData, pxPos, byteWidth, rawData, rawPos) {
    -  for (let x = 0; x < byteWidth; x++) {
    -    let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0;
    -    let val = pxData[pxPos + x] - up;
    - 
    -    rawData[rawPos + x] = val;
    -  }
    -}
    - 
    -function filterSumUp(pxData, pxPos, byteWidth) {
    -  let sum = 0;
    -  let length = pxPos + byteWidth;
    -  for (let x = pxPos; x < length; x++) {
    -    let up = pxPos > 0 ? pxData[x - byteWidth] : 0;
    -    let val = pxData[x] - up;
    - 
    -    sum += Math.abs(val);
    -  }
    - 
    -  return sum;
    -}
    - 
    -function filterAvg(pxData, pxPos, byteWidth, rawData, rawPos, bpp) {
    -  for (let x = 0; x < byteWidth; x++) {
    -    let left = x >= bpp ? pxData[pxPos + x - bpp] : 0;
    -    let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0;
    -    let val = pxData[pxPos + x] - ((left + up) >> 1);
    - 
    -    rawData[rawPos + x] = val;
    -  }
    -}
    - 
    -function filterSumAvg(pxData, pxPos, byteWidth, bpp) {
    -  let sum = 0;
    -  for (let x = 0; x < byteWidth; x++) {
    -    let left = x >= bpp ? pxData[pxPos + x - bpp] : 0;
    -    let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0;
    -    let val = pxData[pxPos + x] - ((left + up) >> 1);
    - 
    -    sum += Math.abs(val);
    -  }
    - 
    -  return sum;
    -}
    - 
    -function filterPaeth(pxData, pxPos, byteWidth, rawData, rawPos, bpp) {
    -  for (let x = 0; x < byteWidth; x++) {
    -    let left = x >= bpp ? pxData[pxPos + x - bpp] : 0;
    -    let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0;
    -    let upleft =
    -      pxPos > 0 && x >= bpp ? pxData[pxPos + x - (byteWidth + bpp)] : 0;
    -    let val = pxData[pxPos + x] - paethPredictor(left, up, upleft);
    - 
    -    rawData[rawPos + x] = val;
    -  }
    -}
    - 
    -function filterSumPaeth(pxData, pxPos, byteWidth, bpp) {
    -  let sum = 0;
    -  for (let x = 0; x < byteWidth; x++) {
    -    let left = x >= bpp ? pxData[pxPos + x - bpp] : 0;
    -    let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0;
    -    let upleft =
    -      pxPos > 0 && x >= bpp ? pxData[pxPos + x - (byteWidth + bpp)] : 0;
    -    let val = pxData[pxPos + x] - paethPredictor(left, up, upleft);
    - 
    -    sum += Math.abs(val);
    -  }
    - 
    -  return sum;
    -}
    - 
    -let filters = {
    -  0: filterNone,
    -  1: filterSub,
    -  2: filterUp,
    -  3: filterAvg,
    -  4: filterPaeth,
    -};
    - 
    -let filterSums = {
    -  0: filterSumNone,
    -  1: filterSumSub,
    -  2: filterSumUp,
    -  3: filterSumAvg,
    -  4: filterSumPaeth,
    -};
    - 
    -module.exports = function (pxData, width, height, options, bpp) {
    -  let filterTypes;
    -  Eif (!("filterType" in options) || options.filterType === -1) {
    -    filterTypes = [0, 1, 2, 3, 4];
    -  } else if (typeof options.filterType === "number") {
    -    filterTypes = [options.filterType];
    -  } else {
    -    throw new Error("unrecognised filter types");
    -  }
    - 
    -  Iif (options.bitDepth === 16) {
    -    bpp *= 2;
    -  }
    -  let byteWidth = width * bpp;
    -  let rawPos = 0;
    -  let pxPos = 0;
    -  let rawData = Buffer.alloc((byteWidth + 1) * height);
    - 
    -  let sel = filterTypes[0];
    - 
    -  for (let y = 0; y < height; y++) {
    -    Eif (filterTypes.length > 1) {
    -      // find best filter for this line (with lowest sum of values)
    -      let min = Infinity;
    - 
    -      for (let i = 0; i < filterTypes.length; i++) {
    -        let sum = filterSums[filterTypes[i]](pxData, pxPos, byteWidth, bpp);
    -        if (sum < min) {
    -          sel = filterTypes[i];
    -          min = sum;
    -        }
    -      }
    -    }
    - 
    -    rawData[rawPos] = sel;
    -    rawPos++;
    -    filters[sel](pxData, pxPos, byteWidth, rawData, rawPos, bpp);
    -    rawPos += byteWidth;
    -    pxPos += byteWidth;
    -  }
    -  return rawData;
    -};
    - 
    - -
    -
    - - - - - - - - - \ No newline at end of file diff --git a/node_modules/pngjs/coverage/lcov-report/filter-parse-async.js.html b/node_modules/pngjs/coverage/lcov-report/filter-parse-async.js.html deleted file mode 100644 index 06f25f1..0000000 --- a/node_modules/pngjs/coverage/lcov-report/filter-parse-async.js.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - Code coverage report for filter-parse-async.js - - - - - - - - - -
    -
    -

    All files filter-parse-async.js

    -
    - -
    - 100% - Statements - 12/12 -
    - - -
    - 100% - Branches - 0/0 -
    - - -
    - 100% - Functions - 3/3 -
    - - -
    - 100% - Lines - 12/12 -
    - - -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25  -  -1x -1x -1x -  -1x -176x -  -176x -176x -176x -  -  -9057x -  -  -173x -  -  -  -176x -  -1x - 
    "use strict";
    - 
    -let util = require("util");
    -let ChunkStream = require("./chunkstream");
    -let Filter = require("./filter-parse");
    - 
    -let FilterAsync = (module.exports = function (bitmapInfo) {
    -  ChunkStream.call(this);
    - 
    -  let buffers = [];
    -  let that = this;
    -  this._filter = new Filter(bitmapInfo, {
    -    read: this.read.bind(this),
    -    write: function (buffer) {
    -      buffers.push(buffer);
    -    },
    -    complete: function () {
    -      that.emit("complete", Buffer.concat(buffers));
    -    },
    -  });
    - 
    -  this._filter.start();
    -});
    -util.inherits(FilterAsync, ChunkStream);
    - 
    - -
    -
    - - - - - - - - - \ No newline at end of file diff --git a/node_modules/pngjs/coverage/lcov-report/filter-parse-sync.js.html b/node_modules/pngjs/coverage/lcov-report/filter-parse-sync.js.html deleted file mode 100644 index df91a35..0000000 --- a/node_modules/pngjs/coverage/lcov-report/filter-parse-sync.js.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - Code coverage report for filter-parse-sync.js - - - - - - - - - -
    -
    -

    All files filter-parse-sync.js

    -
    - -
    - 100% - Statements - 10/10 -
    - - -
    - 100% - Branches - 0/0 -
    - - -
    - 100% - Functions - 3/3 -
    - - -
    - 100% - Lines - 10/10 -
    - - -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22  -  -1x -1x -  -1x -162x -162x -162x -  -  -6337x -  -  -  -  -162x -162x -  -162x -  - 
    "use strict";
    - 
    -let SyncReader = require("./sync-reader");
    -let Filter = require("./filter-parse");
    - 
    -exports.process = function (inBuffer, bitmapInfo) {
    -  let outBuffers = [];
    -  let reader = new SyncReader(inBuffer);
    -  let filter = new Filter(bitmapInfo, {
    -    read: reader.read.bind(reader),
    -    write: function (bufferPart) {
    -      outBuffers.push(bufferPart);
    -    },
    -    complete: function () {},
    -  });
    - 
    -  filter.start();
    -  reader.process();
    - 
    -  return Buffer.concat(outBuffers);
    -};
    - 
    - -
    -
    - - - - - - - - - \ No newline at end of file diff --git a/node_modules/pngjs/coverage/lcov-report/filter-parse.js.html b/node_modules/pngjs/coverage/lcov-report/filter-parse.js.html deleted file mode 100644 index 945757c..0000000 --- a/node_modules/pngjs/coverage/lcov-report/filter-parse.js.html +++ /dev/null @@ -1,611 +0,0 @@ - - - - - - Code coverage report for filter-parse.js - - - - - - - - - -
    -
    -

    All files filter-parse.js

    -
    - -
    - 98.96% - Statements - 95/96 -
    - - -
    - 97.14% - Branches - 34/35 -
    - - -
    - 100% - Functions - 8/8 -
    - - -
    - 98.9% - Lines - 90/91 -
    - - -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178  -  -1x -1x -  -  -742x -742x -531x -  -742x -  -  -1x -338x -338x -338x -338x -338x -  -338x -338x -338x -  -338x -338x -338x -72x -72x -476x -  -  -  -  -  -  -266x -  -  -  -  -  -  -  -  -  -  -338x -127x -211x -66x -  -145x -  -  -  -1x -338x -  -  -  -  -  -1x -  -  -  -  -1939x -1939x -  -1939x -3563504x -3563504x -3563504x -  -  -  -1x -  -  -  -  -800x -  -800x -330256x -330256x -330256x -  -  -  -1x -  -  -  -  -172x -172x -172x -  -172x -9952x -9952x -9952x -9952x -9952x -  -  -  -1x -  -  -  -  -4165x -4165x -4165x -  -4165x -1152544x -1152544x -1152544x -1152544x -1152544x -1152544x -  -  -  -1x -15394x -  -15394x -15394x -  -15394x -8318x -  -7076x -  -7076x -  -1939x -1939x -  -800x -800x -  -172x -172x -  -4165x -4165x -  -  -  -  -  -15394x -  -15394x -15394x -739x -739x -739x -  -14655x -  -  -15394x -  -15059x -  -335x -335x -  -  - 
    "use strict";
    - 
    -let interlaceUtils = require("./interlace");
    -let paethPredictor = require("./paeth-predictor");
    - 
    -function getByteWidth(width, bpp, depth) {
    -  let byteWidth = width * bpp;
    -  if (depth !== 8) {
    -    byteWidth = Math.ceil(byteWidth / (8 / depth));
    -  }
    -  return byteWidth;
    -}
    - 
    -let Filter = (module.exports = function (bitmapInfo, dependencies) {
    -  let width = bitmapInfo.width;
    -  let height = bitmapInfo.height;
    -  let interlace = bitmapInfo.interlace;
    -  let bpp = bitmapInfo.bpp;
    -  let depth = bitmapInfo.depth;
    - 
    -  this.read = dependencies.read;
    -  this.write = dependencies.write;
    -  this.complete = dependencies.complete;
    - 
    -  this._imageIndex = 0;
    -  this._images = [];
    -  if (interlace) {
    -    let passes = interlaceUtils.getImagePasses(width, height);
    -    for (let i = 0; i < passes.length; i++) {
    -      this._images.push({
    -        byteWidth: getByteWidth(passes[i].width, bpp, depth),
    -        height: passes[i].height,
    -        lineIndex: 0,
    -      });
    -    }
    -  } else {
    -    this._images.push({
    -      byteWidth: getByteWidth(width, bpp, depth),
    -      height: height,
    -      lineIndex: 0,
    -    });
    -  }
    - 
    -  // when filtering the line we look at the pixel to the left
    -  // the spec also says it is done on a byte level regardless of the number of pixels
    -  // so if the depth is byte compatible (8 or 16) we subtract the bpp in order to compare back
    -  // a pixel rather than just a different byte part. However if we are sub byte, we ignore.
    -  if (depth === 8) {
    -    this._xComparison = bpp;
    -  } else if (depth === 16) {
    -    this._xComparison = bpp * 2;
    -  } else {
    -    this._xComparison = 1;
    -  }
    -});
    - 
    -Filter.prototype.start = function () {
    -  this.read(
    -    this._images[this._imageIndex].byteWidth + 1,
    -    this._reverseFilterLine.bind(this)
    -  );
    -};
    - 
    -Filter.prototype._unFilterType1 = function (
    -  rawData,
    -  unfilteredLine,
    -  byteWidth
    -) {
    -  let xComparison = this._xComparison;
    -  let xBiggerThan = xComparison - 1;
    - 
    -  for (let x = 0; x < byteWidth; x++) {
    -    let rawByte = rawData[1 + x];
    -    let f1Left = x > xBiggerThan ? unfilteredLine[x - xComparison] : 0;
    -    unfilteredLine[x] = rawByte + f1Left;
    -  }
    -};
    - 
    -Filter.prototype._unFilterType2 = function (
    -  rawData,
    -  unfilteredLine,
    -  byteWidth
    -) {
    -  let lastLine = this._lastLine;
    - 
    -  for (let x = 0; x < byteWidth; x++) {
    -    let rawByte = rawData[1 + x];
    -    let f2Up = lastLine ? lastLine[x] : 0;
    -    unfilteredLine[x] = rawByte + f2Up;
    -  }
    -};
    - 
    -Filter.prototype._unFilterType3 = function (
    -  rawData,
    -  unfilteredLine,
    -  byteWidth
    -) {
    -  let xComparison = this._xComparison;
    -  let xBiggerThan = xComparison - 1;
    -  let lastLine = this._lastLine;
    - 
    -  for (let x = 0; x < byteWidth; x++) {
    -    let rawByte = rawData[1 + x];
    -    let f3Up = lastLine ? lastLine[x] : 0;
    -    let f3Left = x > xBiggerThan ? unfilteredLine[x - xComparison] : 0;
    -    let f3Add = Math.floor((f3Left + f3Up) / 2);
    -    unfilteredLine[x] = rawByte + f3Add;
    -  }
    -};
    - 
    -Filter.prototype._unFilterType4 = function (
    -  rawData,
    -  unfilteredLine,
    -  byteWidth
    -) {
    -  let xComparison = this._xComparison;
    -  let xBiggerThan = xComparison - 1;
    -  let lastLine = this._lastLine;
    - 
    -  for (let x = 0; x < byteWidth; x++) {
    -    let rawByte = rawData[1 + x];
    -    let f4Up = lastLine ? lastLine[x] : 0;
    -    let f4Left = x > xBiggerThan ? unfilteredLine[x - xComparison] : 0;
    -    let f4UpLeft = x > xBiggerThan && lastLine ? lastLine[x - xComparison] : 0;
    -    let f4Add = paethPredictor(f4Left, f4Up, f4UpLeft);
    -    unfilteredLine[x] = rawByte + f4Add;
    -  }
    -};
    - 
    -Filter.prototype._reverseFilterLine = function (rawData) {
    -  let filter = rawData[0];
    -  let unfilteredLine;
    -  let currentImage = this._images[this._imageIndex];
    -  let byteWidth = currentImage.byteWidth;
    - 
    -  if (filter === 0) {
    -    unfilteredLine = rawData.slice(1, byteWidth + 1);
    -  } else {
    -    unfilteredLine = Buffer.alloc(byteWidth);
    - 
    -    switch (filter) {
    -      case 1:
    -        this._unFilterType1(rawData, unfilteredLine, byteWidth);
    -        break;
    -      case 2:
    -        this._unFilterType2(rawData, unfilteredLine, byteWidth);
    -        break;
    -      case 3:
    -        this._unFilterType3(rawData, unfilteredLine, byteWidth);
    -        break;
    -      case 4:
    -        this._unFilterType4(rawData, unfilteredLine, byteWidth);
    -        break;
    -      default:
    -        throw new Error("Unrecognised filter type - " + filter);
    -    }
    -  }
    - 
    -  this.write(unfilteredLine);
    - 
    -  currentImage.lineIndex++;
    -  if (currentImage.lineIndex >= currentImage.height) {
    -    this._lastLine = null;
    -    this._imageIndex++;
    -    currentImage = this._images[this._imageIndex];
    -  } else {
    -    this._lastLine = unfilteredLine;
    -  }
    - 
    -  if (currentImage) {
    -    // read, using the byte width that may be from the new current image
    -    this.read(currentImage.byteWidth + 1, this._reverseFilterLine.bind(this));
    -  } else {
    -    this._lastLine = null;
    -    this.complete();
    -  }
    -};
    - 
    - -
    -
    - - - - - - - - - \ No newline at end of file diff --git a/node_modules/pngjs/coverage/lcov-report/format-normaliser.js.html b/node_modules/pngjs/coverage/lcov-report/format-normaliser.js.html deleted file mode 100644 index c61afcf..0000000 --- a/node_modules/pngjs/coverage/lcov-report/format-normaliser.js.html +++ /dev/null @@ -1,359 +0,0 @@ - - - - - - Code coverage report for format-normaliser.js - - - - - - - - - -
    -
    -

    All files format-normaliser.js

    -
    - -
    - 98.21% - Statements - 55/56 -
    - - -
    - 95.24% - Branches - 20/21 -
    - - -
    - 100% - Functions - 4/4 -
    - - -
    - 97.87% - Lines - 46/47 -
    - - -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94  -  -  -131x -  -131x -4912x -1418436x -  -1418436x -  -  -  -1418436x -5673744x -  -1418436x -  -  -  -  -  -12x -12x -384x -12288x -  -12288x -6144x -2762x -  -6144x -  -  -  -  -2718x -  -12288x -5480x -21920x -  -  -12288x -  -  -  -  -  -106x -106x -106x -  -106x -3392x -108544x -434176x -  -  -  -108544x -  -  -  -  -1x -335x -335x -335x -335x -335x -335x -  -335x -  -335x -  -131x -  -204x -12x -  -  -204x -  -106x -66x -  -106x -  -  -335x -  - 
    "use strict";
    - 
    -function dePalette(indata, outdata, width, height, palette) {
    -  let pxPos = 0;
    -  // use values from palette
    -  for (let y = 0; y < height; y++) {
    -    for (let x = 0; x < width; x++) {
    -      let color = palette[indata[pxPos]];
    - 
    -      Iif (!color) {
    -        throw new Error("index " + indata[pxPos] + " not in palette");
    -      }
    - 
    -      for (let i = 0; i < 4; i++) {
    -        outdata[pxPos + i] = color[i];
    -      }
    -      pxPos += 4;
    -    }
    -  }
    -}
    - 
    -function replaceTransparentColor(indata, outdata, width, height, transColor) {
    -  let pxPos = 0;
    -  for (let y = 0; y < height; y++) {
    -    for (let x = 0; x < width; x++) {
    -      let makeTrans = false;
    - 
    -      if (transColor.length === 1) {
    -        if (transColor[0] === indata[pxPos]) {
    -          makeTrans = true;
    -        }
    -      } else if (
    -        transColor[0] === indata[pxPos] &&
    -        transColor[1] === indata[pxPos + 1] &&
    -        transColor[2] === indata[pxPos + 2]
    -      ) {
    -        makeTrans = true;
    -      }
    -      if (makeTrans) {
    -        for (let i = 0; i < 4; i++) {
    -          outdata[pxPos + i] = 0;
    -        }
    -      }
    -      pxPos += 4;
    -    }
    -  }
    -}
    - 
    -function scaleDepth(indata, outdata, width, height, depth) {
    -  let maxOutSample = 255;
    -  let maxInSample = Math.pow(2, depth) - 1;
    -  let pxPos = 0;
    - 
    -  for (let y = 0; y < height; y++) {
    -    for (let x = 0; x < width; x++) {
    -      for (let i = 0; i < 4; i++) {
    -        outdata[pxPos + i] = Math.floor(
    -          (indata[pxPos + i] * maxOutSample) / maxInSample + 0.5
    -        );
    -      }
    -      pxPos += 4;
    -    }
    -  }
    -}
    - 
    -module.exports = function (indata, imageData) {
    -  let depth = imageData.depth;
    -  let width = imageData.width;
    -  let height = imageData.height;
    -  let colorType = imageData.colorType;
    -  let transColor = imageData.transColor;
    -  let palette = imageData.palette;
    - 
    -  let outdata = indata; // only different for 16 bits
    - 
    -  if (colorType === 3) {
    -    // paletted
    -    dePalette(indata, outdata, width, height, palette);
    -  } else {
    -    if (transColor) {
    -      replaceTransparentColor(indata, outdata, width, height, transColor);
    -    }
    -    // if it needs scaling
    -    if (depth !== 8) {
    -      // if we need to change the buffer size
    -      if (depth === 16) {
    -        outdata = Buffer.alloc(width * height * 4);
    -      }
    -      scaleDepth(indata, outdata, width, height, depth);
    -    }
    -  }
    -  return outdata;
    -};
    - 
    - -
    -
    - - - - - - - - - \ No newline at end of file diff --git a/node_modules/pngjs/coverage/lcov-report/index.html b/node_modules/pngjs/coverage/lcov-report/index.html deleted file mode 100644 index 51ecafd..0000000 --- a/node_modules/pngjs/coverage/lcov-report/index.html +++ /dev/null @@ -1,426 +0,0 @@ - - - - - - Code coverage report for All files - - - - - - - - - -
    -
    -

    All files

    -
    - -
    - 82.72% - Statements - 1034/1250 -
    - - -
    - 67.59% - Branches - 317/469 -
    - - -
    - 90.26% - Functions - 139/154 -
    - - -
    - 82.53% - Lines - 992/1202 -
    - - -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FileStatementsBranchesFunctionsLines
    bitmapper.js -
    -
    94.37%134/14272.41%21/2989.47%17/1994.16%129/137
    bitpacker.js -
    -
    11.36%10/886.12%3/4966.67%2/311.63%10/86
    chunkstream.js -
    -
    90.11%82/9181.4%35/43100%10/1090.11%82/91
    constants.js -
    -
    100%1/1100%0/0100%0/0100%1/1
    crc.js -
    -
    100%26/26100%2/2100%5/5100%22/22
    filter-pack.js -
    -
    95.83%92/9681.82%36/44100%11/1195.24%80/84
    filter-parse-async.js -
    -
    100%12/12100%0/0100%3/3100%12/12
    filter-parse-sync.js -
    -
    100%10/10100%0/0100%3/3100%10/10
    filter-parse.js -
    -
    98.96%95/9697.14%34/35100%8/898.9%90/91
    format-normaliser.js -
    -
    98.21%55/5695.24%20/21100%4/497.87%46/47
    interlace.js -
    -
    100%32/32100%8/8100%3/3100%29/29
    packer-async.js -
    -
    100%24/2475%3/4100%4/4100%24/24
    packer-sync.js -
    -
    25%6/248.33%1/120%0/125%6/24
    packer.js -
    -
    94.74%54/5767.86%19/28100%9/994.74%54/57
    paeth-predictor.js -
    -
    100%10/10100%6/6100%1/1100%10/10
    parser-async.js -
    -
    88.75%71/8072.73%16/2284.62%11/1388.75%71/80
    parser-sync.js -
    -
    93.33%42/4578.57%11/14100%8/893.33%42/45
    parser.js -
    -
    90.57%144/15985.45%47/55100%20/2090.32%140/155
    png-sync.js -
    -
    83.33%5/6100%2/250%1/283.33%5/6
    png.js -
    -
    54.17%52/9641.18%14/3456.25%9/1656.52%52/92
    sync-inflate.js -
    -
    75.31%61/8162%31/5087.5%7/875.31%61/81
    sync-reader.js -
    -
    88.89%16/1872.73%8/11100%3/388.89%16/18
    -
    -
    -
    - - - - - - - - - \ No newline at end of file diff --git a/node_modules/pngjs/coverage/lcov-report/interlace.js.html b/node_modules/pngjs/coverage/lcov-report/interlace.js.html deleted file mode 100644 index d67b087..0000000 --- a/node_modules/pngjs/coverage/lcov-report/interlace.js.html +++ /dev/null @@ -1,365 +0,0 @@ - - - - - - Code coverage report for interlace.js - - - - - - - - - -
    -
    -

    All files interlace.js

    -
    - -
    - 100% - Statements - 32/32 -
    - - -
    - 100% - Branches - 8/8 -
    - - -
    - 100% - Functions - 3/3 -
    - - -
    - 100% - Lines - 29/29 -
    - - -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -144x -144x -144x -144x -144x -144x -1008x -1008x -1008x -1008x -1556x -672x -  -884x -  -  -1008x -1360x -552x -  -808x -  -  -1008x -952x -  -  -144x -  -  -1x -72x -324850x -  -324850x -  -324850x -  -324850x -  -324850x -  -  - 
    "use strict";
    - 
    -// Adam 7
    -//   0 1 2 3 4 5 6 7
    -// 0 x 6 4 6 x 6 4 6
    -// 1 7 7 7 7 7 7 7 7
    -// 2 5 6 5 6 5 6 5 6
    -// 3 7 7 7 7 7 7 7 7
    -// 4 3 6 4 6 3 6 4 6
    -// 5 7 7 7 7 7 7 7 7
    -// 6 5 6 5 6 5 6 5 6
    -// 7 7 7 7 7 7 7 7 7
    - 
    -let imagePasses = [
    -  {
    -    // pass 1 - 1px
    -    x: [0],
    -    y: [0],
    -  },
    -  {
    -    // pass 2 - 1px
    -    x: [4],
    -    y: [0],
    -  },
    -  {
    -    // pass 3 - 2px
    -    x: [0, 4],
    -    y: [4],
    -  },
    -  {
    -    // pass 4 - 4px
    -    x: [2, 6],
    -    y: [0, 4],
    -  },
    -  {
    -    // pass 5 - 8px
    -    x: [0, 2, 4, 6],
    -    y: [2, 6],
    -  },
    -  {
    -    // pass 6 - 16px
    -    x: [1, 3, 5, 7],
    -    y: [0, 2, 4, 6],
    -  },
    -  {
    -    // pass 7 - 32px
    -    x: [0, 1, 2, 3, 4, 5, 6, 7],
    -    y: [1, 3, 5, 7],
    -  },
    -];
    - 
    -exports.getImagePasses = function (width, height) {
    -  let images = [];
    -  let xLeftOver = width % 8;
    -  let yLeftOver = height % 8;
    -  let xRepeats = (width - xLeftOver) / 8;
    -  let yRepeats = (height - yLeftOver) / 8;
    -  for (let i = 0; i < imagePasses.length; i++) {
    -    let pass = imagePasses[i];
    -    let passWidth = xRepeats * pass.x.length;
    -    let passHeight = yRepeats * pass.y.length;
    -    for (let j = 0; j < pass.x.length; j++) {
    -      if (pass.x[j] < xLeftOver) {
    -        passWidth++;
    -      } else {
    -        break;
    -      }
    -    }
    -    for (let j = 0; j < pass.y.length; j++) {
    -      if (pass.y[j] < yLeftOver) {
    -        passHeight++;
    -      } else {
    -        break;
    -      }
    -    }
    -    if (passWidth > 0 && passHeight > 0) {
    -      images.push({ width: passWidth, height: passHeight, index: i });
    -    }
    -  }
    -  return images;
    -};
    - 
    -exports.getInterlaceIterator = function (width) {
    -  return function (x, y, pass) {
    -    let outerXLeftOver = x % imagePasses[pass].x.length;
    -    let outerX =
    -      ((x - outerXLeftOver) / imagePasses[pass].x.length) * 8 +
    -      imagePasses[pass].x[outerXLeftOver];
    -    let outerYLeftOver = y % imagePasses[pass].y.length;
    -    let outerY =
    -      ((y - outerYLeftOver) / imagePasses[pass].y.length) * 8 +
    -      imagePasses[pass].y[outerYLeftOver];
    -    return outerX * 4 + outerY * width * 4;
    -  };
    -};
    - 
    - -
    -
    - - - - - - - - - \ No newline at end of file diff --git a/node_modules/pngjs/coverage/lcov-report/packer-async.js.html b/node_modules/pngjs/coverage/lcov-report/packer-async.js.html deleted file mode 100644 index 55365c7..0000000 --- a/node_modules/pngjs/coverage/lcov-report/packer-async.js.html +++ /dev/null @@ -1,230 +0,0 @@ - - - - - - Code coverage report for packer-async.js - - - - - - - - - -
    -
    -

    All files packer-async.js

    -
    - -
    - 100% - Statements - 24/24 -
    - - -
    - 75% - Branches - 3/4 -
    - - -
    - 100% - Functions - 4/4 -
    - - -
    - 100% - Lines - 24/24 -
    - - -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51  -  -1x -1x -1x -1x -  -1x -353x -  -353x -  -353x -353x -  -353x -  -1x -  -1x -  -325x -325x -  -325x -290x -  -  -325x -  -  -325x -  -325x -  -  -652x -  -  -  -325x -  -  -325x -325x -  -  -  -325x -  - 
    "use strict";
    - 
    -let util = require("util");
    -let Stream = require("stream");
    -let constants = require("./constants");
    -let Packer = require("./packer");
    - 
    -let PackerAsync = (module.exports = function (opt) {
    -  Stream.call(this);
    - 
    -  let options = opt || {};
    - 
    -  this._packer = new Packer(options);
    -  this._deflate = this._packer.createDeflate();
    - 
    -  this.readable = true;
    -});
    -util.inherits(PackerAsync, Stream);
    - 
    -PackerAsync.prototype.pack = function (data, width, height, gamma) {
    -  // Signature
    -  this.emit("data", Buffer.from(constants.PNG_SIGNATURE));
    -  this.emit("data", this._packer.packIHDR(width, height));
    - 
    -  if (gamma) {
    -    this.emit("data", this._packer.packGAMA(gamma));
    -  }
    - 
    -  let filteredData = this._packer.filterData(data, width, height);
    - 
    -  // compress it
    -  this._deflate.on("error", this.emit.bind(this, "error"));
    - 
    -  this._deflate.on(
    -    "data",
    -    function (compressedData) {
    -      this.emit("data", this._packer.packIDAT(compressedData));
    -    }.bind(this)
    -  );
    - 
    -  this._deflate.on(
    -    "end",
    -    function () {
    -      this.emit("data", this._packer.packIEND());
    -      this.emit("end");
    -    }.bind(this)
    -  );
    - 
    -  this._deflate.end(filteredData);
    -};
    - 
    - -
    -
    - - - - - - - - - \ No newline at end of file diff --git a/node_modules/pngjs/coverage/lcov-report/packer-sync.js.html b/node_modules/pngjs/coverage/lcov-report/packer-sync.js.html deleted file mode 100644 index 86283b5..0000000 --- a/node_modules/pngjs/coverage/lcov-report/packer-sync.js.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - - Code coverage report for packer-sync.js - - - - - - - - - -
    -
    -

    All files packer-sync.js

    -
    - -
    - 25% - Statements - 6/24 -
    - - -
    - 8.33% - Branches - 1/12 -
    - - -
    - 0% - Functions - 0/1 -
    - - -
    - 25% - Lines - 6/24 -
    - - -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57  -  -1x -1x -1x -  -  -1x -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
    "use strict";
    - 
    -let hasSyncZlib = true;
    -let zlib = require("zlib");
    -Iif (!zlib.deflateSync) {
    -  hasSyncZlib = false;
    -}
    -let constants = require("./constants");
    -let Packer = require("./packer");
    - 
    -module.exports = function (metaData, opt) {
    -  if (!hasSyncZlib) {
    -    throw new Error(
    -      "To use the sync capability of this library in old node versions, please pin pngjs to v2.3.0"
    -    );
    -  }
    - 
    -  let options = opt || {};
    - 
    -  let packer = new Packer(options);
    - 
    -  let chunks = [];
    - 
    -  // Signature
    -  chunks.push(Buffer.from(constants.PNG_SIGNATURE));
    - 
    -  // Header
    -  chunks.push(packer.packIHDR(metaData.width, metaData.height));
    - 
    -  if (metaData.gamma) {
    -    chunks.push(packer.packGAMA(metaData.gamma));
    -  }
    - 
    -  let filteredData = packer.filterData(
    -    metaData.data,
    -    metaData.width,
    -    metaData.height
    -  );
    - 
    -  // compress it
    -  let compressedData = zlib.deflateSync(
    -    filteredData,
    -    packer.getDeflateOptions()
    -  );
    -  filteredData = null;
    - 
    -  if (!compressedData || !compressedData.length) {
    -    throw new Error("bad png - invalid compressed data response");
    -  }
    -  chunks.push(packer.packIDAT(compressedData));
    - 
    -  // End
    -  chunks.push(packer.packIEND());
    - 
    -  return Buffer.concat(chunks);
    -};
    - 
    - -
    -
    - - - - - - - - - \ No newline at end of file diff --git a/node_modules/pngjs/coverage/lcov-report/packer.js.html b/node_modules/pngjs/coverage/lcov-report/packer.js.html deleted file mode 100644 index 606e193..0000000 --- a/node_modules/pngjs/coverage/lcov-report/packer.js.html +++ /dev/null @@ -1,467 +0,0 @@ - - - - - - Code coverage report for packer.js - - - - - - - - - -
    -
    -

    All files packer.js

    -
    - -
    - 94.74% - Statements - 54/57 -
    - - -
    - 67.86% - Branches - 19/28 -
    - - -
    - 100% - Functions - 9/9 -
    - - -
    - 94.74% - Lines - 54/57 -
    - - -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130  -  -1x -1x -1x -1x -1x -  -1x -353x -  -353x -353x -  -353x -  -353x -  -353x -353x -  -353x -  -  -  -353x -  -  -  -  -353x -  -  -  -  -  -  -  -  -  -  -  -353x -  -  -  -  -  -  -  -  -  -  -  -  -  -353x -  -  -  -  -  -  -1x -353x -  -  -  -  -  -  -1x -353x -  -  -1x -  -325x -  -  -325x -325x -325x -  -  -1x -1592x -1592x -  -1592x -1592x -  -1592x -1267x -  -  -1592x -  -  -  -1592x -  -  -1x -290x -290x -290x -  -  -1x -325x -325x -325x -325x -325x -325x -325x -325x -  -325x -  -  -1x -652x -  -  -1x -325x -  - 
    "use strict";
    - 
    -let constants = require("./constants");
    -let CrcStream = require("./crc");
    -let bitPacker = require("./bitpacker");
    -let filter = require("./filter-pack");
    -let zlib = require("zlib");
    - 
    -let Packer = (module.exports = function (options) {
    -  this._options = options;
    - 
    -  options.deflateChunkSize = options.deflateChunkSize || 32 * 1024;
    -  options.deflateLevel =
    -    options.deflateLevel != null ? options.deflateLevel : 9;
    -  options.deflateStrategy =
    -    options.deflateStrategy != null ? options.deflateStrategy : 3;
    -  options.inputHasAlpha =
    -    options.inputHasAlpha != null ? options.inputHasAlpha : true;
    -  options.deflateFactory = options.deflateFactory || zlib.createDeflate;
    -  options.bitDepth = options.bitDepth || 8;
    -  // This is outputColorType
    -  options.colorType =
    -    typeof options.colorType === "number"
    -      ? options.colorType
    -      : constants.COLORTYPE_COLOR_ALPHA;
    -  options.inputColorType =
    -    typeof options.inputColorType === "number"
    -      ? options.inputColorType
    -      : constants.COLORTYPE_COLOR_ALPHA;
    - 
    -  Iif (
    -    [
    -      constants.COLORTYPE_GRAYSCALE,
    -      constants.COLORTYPE_COLOR,
    -      constants.COLORTYPE_COLOR_ALPHA,
    -      constants.COLORTYPE_ALPHA,
    -    ].indexOf(options.colorType) === -1
    -  ) {
    -    throw new Error(
    -      "option color type:" + options.colorType + " is not supported at present"
    -    );
    -  }
    -  Iif (
    -    [
    -      constants.COLORTYPE_GRAYSCALE,
    -      constants.COLORTYPE_COLOR,
    -      constants.COLORTYPE_COLOR_ALPHA,
    -      constants.COLORTYPE_ALPHA,
    -    ].indexOf(options.inputColorType) === -1
    -  ) {
    -    throw new Error(
    -      "option input color type:" +
    -        options.inputColorType +
    -        " is not supported at present"
    -    );
    -  }
    -  Iif (options.bitDepth !== 8 && options.bitDepth !== 16) {
    -    throw new Error(
    -      "option bit depth:" + options.bitDepth + " is not supported at present"
    -    );
    -  }
    -});
    - 
    -Packer.prototype.getDeflateOptions = function () {
    -  return {
    -    chunkSize: this._options.deflateChunkSize,
    -    level: this._options.deflateLevel,
    -    strategy: this._options.deflateStrategy,
    -  };
    -};
    - 
    -Packer.prototype.createDeflate = function () {
    -  return this._options.deflateFactory(this.getDeflateOptions());
    -};
    - 
    -Packer.prototype.filterData = function (data, width, height) {
    -  // convert to correct format for filtering (e.g. right bpp and bit depth)
    -  let packedData = bitPacker(data, width, height, this._options);
    - 
    -  // filter pixel data
    -  let bpp = constants.COLORTYPE_TO_BPP_MAP[this._options.colorType];
    -  let filteredData = filter(packedData, width, height, this._options, bpp);
    -  return filteredData;
    -};
    - 
    -Packer.prototype._packChunk = function (type, data) {
    -  let len = data ? data.length : 0;
    -  let buf = Buffer.alloc(len + 12);
    - 
    -  buf.writeUInt32BE(len, 0);
    -  buf.writeUInt32BE(type, 4);
    - 
    -  if (data) {
    -    data.copy(buf, 8);
    -  }
    - 
    -  buf.writeInt32BE(
    -    CrcStream.crc32(buf.slice(4, buf.length - 4)),
    -    buf.length - 4
    -  );
    -  return buf;
    -};
    - 
    -Packer.prototype.packGAMA = function (gamma) {
    -  let buf = Buffer.alloc(4);
    -  buf.writeUInt32BE(Math.floor(gamma * constants.GAMMA_DIVISION), 0);
    -  return this._packChunk(constants.TYPE_gAMA, buf);
    -};
    - 
    -Packer.prototype.packIHDR = function (width, height) {
    -  let buf = Buffer.alloc(13);
    -  buf.writeUInt32BE(width, 0);
    -  buf.writeUInt32BE(height, 4);
    -  buf[8] = this._options.bitDepth; // Bit depth
    -  buf[9] = this._options.colorType; // colorType
    -  buf[10] = 0; // compression
    -  buf[11] = 0; // filter
    -  buf[12] = 0; // interlace
    - 
    -  return this._packChunk(constants.TYPE_IHDR, buf);
    -};
    - 
    -Packer.prototype.packIDAT = function (data) {
    -  return this._packChunk(constants.TYPE_IDAT, data);
    -};
    - 
    -Packer.prototype.packIEND = function () {
    -  return this._packChunk(constants.TYPE_IEND, null);
    -};
    - 
    - -
    -
    - - - - - - - - - \ No newline at end of file diff --git a/node_modules/pngjs/coverage/lcov-report/paeth-predictor.js.html b/node_modules/pngjs/coverage/lcov-report/paeth-predictor.js.html deleted file mode 100644 index 6385999..0000000 --- a/node_modules/pngjs/coverage/lcov-report/paeth-predictor.js.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - Code coverage report for paeth-predictor.js - - - - - - - - - -
    -
    -

    All files paeth-predictor.js

    -
    - -
    - 100% - Statements - 10/10 -
    - - -
    - 100% - Branches - 6/6 -
    - - -
    - 100% - Functions - 1/1 -
    - - -
    - 100% - Lines - 10/10 -
    - - -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17  -  -1x -5808408x -5808408x -5808408x -5808408x -  -5808408x -5156742x -  -651666x -539893x -  -111773x -  - 
    "use strict";
    - 
    -module.exports = function paethPredictor(left, above, upLeft) {
    -  let paeth = left + above - upLeft;
    -  let pLeft = Math.abs(paeth - left);
    -  let pAbove = Math.abs(paeth - above);
    -  let pUpLeft = Math.abs(paeth - upLeft);
    - 
    -  if (pLeft <= pAbove && pLeft <= pUpLeft) {
    -    return left;
    -  }
    -  if (pAbove <= pUpLeft) {
    -    return above;
    -  }
    -  return upLeft;
    -};
    - 
    - -
    -
    - - - - - - - - - \ No newline at end of file diff --git a/node_modules/pngjs/coverage/lcov-report/parser-async.js.html b/node_modules/pngjs/coverage/lcov-report/parser-async.js.html deleted file mode 100644 index 77074ff..0000000 --- a/node_modules/pngjs/coverage/lcov-report/parser-async.js.html +++ /dev/null @@ -1,575 +0,0 @@ - - - - - - Code coverage report for parser-async.js - - - - - - - - - -
    -
    -

    All files parser-async.js

    -
    - -
    - 88.75% - Statements - 71/80 -
    - - -
    - 72.73% - Branches - 16/22 -
    - - -
    - 84.62% - Functions - 11/13 -
    - - -
    - 88.75% - Lines - 71/80 -
    - - -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166  -  -1x -1x -1x -1x -1x -1x -1x -  -1x -353x -  -353x -  -  -  -  -  -  -  -  -  -  -  -353x -353x -  -353x -  -1x -  -1x -14x -  -14x -  -14x -  -14x -1x -  -  -14x -2x -  -  -  -2x -  -  -14x -  -  -1x -741x -174x -36x -  -36x -36x -  -36x -  -  -138x -  -  -  -  -  -138x -138x -  -138x -138x -  -138x -138x -  -  -  -  -  -  -138x -  -138x -138x -487x -  -  -  -487x -  -  -  -487x -  -487x -  -  -138x -  -  -741x -  -  -1x -176x -176x -  -176x -  -  -1x -7x -  -  -1x -77x -  -  -1x -15x -  -  -1x -  -  -174x -  -  -1x -173x -  -  -  -173x -1x -  -  -172x -  -  -  -1x -173x -  -  -  -  -  -173x -173x -  -173x -173x -  -  -  -  -  -173x -  - 
    "use strict";
    - 
    -let util = require("util");
    -let zlib = require("zlib");
    -let ChunkStream = require("./chunkstream");
    -let FilterAsync = require("./filter-parse-async");
    -let Parser = require("./parser");
    -let bitmapper = require("./bitmapper");
    -let formatNormaliser = require("./format-normaliser");
    - 
    -let ParserAsync = (module.exports = function (options) {
    -  ChunkStream.call(this);
    - 
    -  this._parser = new Parser(options, {
    -    read: this.read.bind(this),
    -    error: this._handleError.bind(this),
    -    metadata: this._handleMetaData.bind(this),
    -    gamma: this.emit.bind(this, "gamma"),
    -    palette: this._handlePalette.bind(this),
    -    transColor: this._handleTransColor.bind(this),
    -    finished: this._finished.bind(this),
    -    inflateData: this._inflateData.bind(this),
    -    simpleTransparency: this._simpleTransparency.bind(this),
    -    headersFinished: this._headersFinished.bind(this),
    -  });
    -  this._options = options;
    -  this.writable = true;
    - 
    -  this._parser.start();
    -});
    -util.inherits(ParserAsync, ChunkStream);
    - 
    -ParserAsync.prototype._handleError = function (err) {
    -  this.emit("error", err);
    - 
    -  this.writable = false;
    - 
    -  this.destroy();
    - 
    -  if (this._inflate && this._inflate.destroy) {
    -    this._inflate.destroy();
    -  }
    - 
    -  if (this._filter) {
    -    this._filter.destroy();
    -    // For backward compatibility with Node 7 and below.
    -    // Suppress errors due to _inflate calling write() even after
    -    // it's destroy()'ed.
    -    this._filter.on("error", function () {});
    -  }
    - 
    -  this.errord = true;
    -};
    - 
    -ParserAsync.prototype._inflateData = function (data) {
    -  if (!this._inflate) {
    -    if (this._bitmapInfo.interlace) {
    -      this._inflate = zlib.createInflate();
    - 
    -      this._inflate.on("error", this.emit.bind(this, "error"));
    -      this._filter.on("complete", this._complete.bind(this));
    - 
    -      this._inflate.pipe(this._filter);
    -    } else {
    -      let rowSize =
    -        ((this._bitmapInfo.width *
    -          this._bitmapInfo.bpp *
    -          this._bitmapInfo.depth +
    -          7) >>
    -          3) +
    -        1;
    -      let imageSize = rowSize * this._bitmapInfo.height;
    -      let chunkSize = Math.max(imageSize, zlib.Z_MIN_CHUNK);
    - 
    -      this._inflate = zlib.createInflate({ chunkSize: chunkSize });
    -      let leftToInflate = imageSize;
    - 
    -      let emitError = this.emit.bind(this, "error");
    -      this._inflate.on("error", function (err) {
    -        if (!leftToInflate) {
    -          return;
    -        }
    - 
    -        emitError(err);
    -      });
    -      this._filter.on("complete", this._complete.bind(this));
    - 
    -      let filterWrite = this._filter.write.bind(this._filter);
    -      this._inflate.on("data", function (chunk) {
    -        Iif (!leftToInflate) {
    -          return;
    -        }
    - 
    -        Iif (chunk.length > leftToInflate) {
    -          chunk = chunk.slice(0, leftToInflate);
    -        }
    - 
    -        leftToInflate -= chunk.length;
    - 
    -        filterWrite(chunk);
    -      });
    - 
    -      this._inflate.on("end", this._filter.end.bind(this._filter));
    -    }
    -  }
    -  this._inflate.write(data);
    -};
    - 
    -ParserAsync.prototype._handleMetaData = function (metaData) {
    -  this._metaData = metaData;
    -  this._bitmapInfo = Object.create(metaData);
    - 
    -  this._filter = new FilterAsync(this._bitmapInfo);
    -};
    - 
    -ParserAsync.prototype._handleTransColor = function (transColor) {
    -  this._bitmapInfo.transColor = transColor;
    -};
    - 
    -ParserAsync.prototype._handlePalette = function (palette) {
    -  this._bitmapInfo.palette = palette;
    -};
    - 
    -ParserAsync.prototype._simpleTransparency = function () {
    -  this._metaData.alpha = true;
    -};
    - 
    -ParserAsync.prototype._headersFinished = function () {
    -  // Up until this point, we don't know if we have a tRNS chunk (alpha)
    -  // so we can't emit metadata any earlier
    -  this.emit("metadata", this._metaData);
    -};
    - 
    -ParserAsync.prototype._finished = function () {
    -  Iif (this.errord) {
    -    return;
    -  }
    - 
    -  if (!this._inflate) {
    -    this.emit("error", "No Inflate block");
    -  } else {
    -    // no more data to inflate
    -    this._inflate.end();
    -  }
    -};
    - 
    -ParserAsync.prototype._complete = function (filteredData) {
    -  Iif (this.errord) {
    -    return;
    -  }
    - 
    -  let normalisedBitmapData;
    - 
    -  try {
    -    let bitmapData = bitmapper.dataToBitMap(filteredData, this._bitmapInfo);
    - 
    -    normalisedBitmapData = formatNormaliser(bitmapData, this._bitmapInfo);
    -    bitmapData = null;
    -  } catch (ex) {
    -    this._handleError(ex);
    -    return;
    -  }
    - 
    -  this.emit("parsed", normalisedBitmapData);
    -};
    - 
    - -
    -
    - - - - - - - - - \ No newline at end of file diff --git a/node_modules/pngjs/coverage/lcov-report/parser-sync.js.html b/node_modules/pngjs/coverage/lcov-report/parser-sync.js.html deleted file mode 100644 index 6ced1a9..0000000 --- a/node_modules/pngjs/coverage/lcov-report/parser-sync.js.html +++ /dev/null @@ -1,404 +0,0 @@ - - - - - - Code coverage report for parser-sync.js - - - - - - - - - -
    -
    -

    All files parser-sync.js

    -
    - -
    - 93.33% - Statements - 42/45 -
    - - -
    - 78.57% - Branches - 11/14 -
    - - -
    - 100% - Functions - 8/8 -
    - - -
    - 93.33% - Lines - 42/45 -
    - - -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109  -  -1x -1x -1x -1x -  -  -1x -1x -1x -1x -1x -  -1x -176x -  -  -  -  -  -  -  -13x -  -  -  -  -165x -  -  -  -5x -  -  -  -73x -  -  -  -12x -  -  -  -  -147x -  -  -176x -  -492x -  -  -176x -  -176x -  -  -  -  -  -  -  -  -  -  -176x -176x -  -176x -13x -  -  -  -163x -163x -  -  -163x -36x -  -  -127x -127x -127x -  -  -  -  -162x -  -162x -  -  -  -162x -162x -  -162x -162x -  -162x -  -162x -162x -  -162x -  - 
    "use strict";
    - 
    -let hasSyncZlib = true;
    -let zlib = require("zlib");
    -let inflateSync = require("./sync-inflate");
    -Iif (!zlib.deflateSync) {
    -  hasSyncZlib = false;
    -}
    -let SyncReader = require("./sync-reader");
    -let FilterSync = require("./filter-parse-sync");
    -let Parser = require("./parser");
    -let bitmapper = require("./bitmapper");
    -let formatNormaliser = require("./format-normaliser");
    - 
    -module.exports = function (buffer, options) {
    -  Iif (!hasSyncZlib) {
    -    throw new Error(
    -      "To use the sync capability of this library in old node versions, please pin pngjs to v2.3.0"
    -    );
    -  }
    - 
    -  let err;
    -  function handleError(_err_) {
    -    err = _err_;
    -  }
    - 
    -  let metaData;
    -  function handleMetaData(_metaData_) {
    -    metaData = _metaData_;
    -  }
    - 
    -  function handleTransColor(transColor) {
    -    metaData.transColor = transColor;
    -  }
    - 
    -  function handlePalette(palette) {
    -    metaData.palette = palette;
    -  }
    - 
    -  function handleSimpleTransparency() {
    -    metaData.alpha = true;
    -  }
    - 
    -  let gamma;
    -  function handleGamma(_gamma_) {
    -    gamma = _gamma_;
    -  }
    - 
    -  let inflateDataList = [];
    -  function handleInflateData(inflatedData) {
    -    inflateDataList.push(inflatedData);
    -  }
    - 
    -  let reader = new SyncReader(buffer);
    - 
    -  let parser = new Parser(options, {
    -    read: reader.read.bind(reader),
    -    error: handleError,
    -    metadata: handleMetaData,
    -    gamma: handleGamma,
    -    palette: handlePalette,
    -    transColor: handleTransColor,
    -    inflateData: handleInflateData,
    -    simpleTransparency: handleSimpleTransparency,
    -  });
    - 
    -  parser.start();
    -  reader.process();
    - 
    -  if (err) {
    -    throw err;
    -  }
    - 
    -  //join together the inflate datas
    -  let inflateData = Buffer.concat(inflateDataList);
    -  inflateDataList.length = 0;
    - 
    -  let inflatedData;
    -  if (metaData.interlace) {
    -    inflatedData = zlib.inflateSync(inflateData);
    -  } else {
    -    let rowSize =
    -      ((metaData.width * metaData.bpp * metaData.depth + 7) >> 3) + 1;
    -    let imageSize = rowSize * metaData.height;
    -    inflatedData = inflateSync(inflateData, {
    -      chunkSize: imageSize,
    -      maxLength: imageSize,
    -    });
    -  }
    -  inflateData = null;
    - 
    -  Iif (!inflatedData || !inflatedData.length) {
    -    throw new Error("bad png - invalid inflate data response");
    -  }
    - 
    -  let unfilteredData = FilterSync.process(inflatedData, metaData);
    -  inflateData = null;
    - 
    -  let bitmapData = bitmapper.dataToBitMap(unfilteredData, metaData);
    -  unfilteredData = null;
    - 
    -  let normalisedBitmapData = formatNormaliser(bitmapData, metaData);
    - 
    -  metaData.data = normalisedBitmapData;
    -  metaData.gamma = gamma || 0;
    - 
    -  return metaData;
    -};
    - 
    - -
    -
    - - - - - - - - - \ No newline at end of file diff --git a/node_modules/pngjs/coverage/lcov-report/parser.js.html b/node_modules/pngjs/coverage/lcov-report/parser.js.html deleted file mode 100644 index efc9504..0000000 --- a/node_modules/pngjs/coverage/lcov-report/parser.js.html +++ /dev/null @@ -1,950 +0,0 @@ - - - - - - Code coverage report for parser.js - - - - - - - - - -
    -
    -

    All files parser.js

    -
    - -
    - 90.57% - Statements - 144/159 -
    - - -
    - 85.45% - Branches - 47/55 -
    - - -
    - 100% - Functions - 20/20 -
    - - -
    - 90.32% - Lines - 140/155 -
    - - -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291  -  -1x -1x -  -1x -529x -529x -  -529x -529x -529x -  -  -529x -529x -  -529x -529x -529x -529x -529x -529x -529x -  -529x -529x -529x -529x -529x -529x -529x -529x -529x -529x -529x -  -  -1x -529x -  -  -1x -365x -  -365x -2867x -13x -13x -  -  -352x -  -  -1x -  -2461x -  -  -2461x -2461x -2461x -9844x -  -  -  -  -  -2461x -  -  -  -2461x -  -  -  -  -2461x -2461x -  -2461x -2205x -  -  -256x -  -  -  -  -256x -  -  -1x -256x -  -  -1x -2195x -  -  -1x -2195x -2195x -  -  -2195x -4x -4x -  -  -2191x -1855x -  -  -  -1x -351x -  -1x -351x -  -351x -351x -351x -351x -351x -351x -351x -  -  -  -  -  -  -351x -  -  -  -  -  -  -6x -6x -  -345x -4x -4x -  -341x -  -  -  -341x -  -  -  -341x -  -  -  -  -341x -  -341x -  -341x -  -341x -  -  -  -  -  -  -  -  -  -  -  -341x -  -  -1x -135x -  -1x -135x -  -135x -  -  -135x -7350x -  -  -135x -  -135x -  -  -1x -27x -27x -  -1x -27x -  -  -27x -15x -  -  -  -15x -  -  -  -15x -529x -  -15x -  -  -  -  -27x -  -6x -  -27x -6x -  -  -  -  -  -  -27x -  -  -1x -296x -  -1x -296x -296x -  -296x -  -  -1x -1233x -337x -337x -  -1233x -  -1x -1233x -  -1233x -  -  -  -  -  -  -1233x -1233x -  -1233x -173x -  -1060x -  -  -  -1x -336x -  -1x -336x -  -336x -336x -  -336x -173x -  -  - 
    "use strict";
    - 
    -let constants = require("./constants");
    -let CrcCalculator = require("./crc");
    - 
    -let Parser = (module.exports = function (options, dependencies) {
    -  this._options = options;
    -  options.checkCRC = options.checkCRC !== false;
    - 
    -  this._hasIHDR = false;
    -  this._hasIEND = false;
    -  this._emittedHeadersFinished = false;
    - 
    -  // input flags/metadata
    -  this._palette = [];
    -  this._colorType = 0;
    - 
    -  this._chunks = {};
    -  this._chunks[constants.TYPE_IHDR] = this._handleIHDR.bind(this);
    -  this._chunks[constants.TYPE_IEND] = this._handleIEND.bind(this);
    -  this._chunks[constants.TYPE_IDAT] = this._handleIDAT.bind(this);
    -  this._chunks[constants.TYPE_PLTE] = this._handlePLTE.bind(this);
    -  this._chunks[constants.TYPE_tRNS] = this._handleTRNS.bind(this);
    -  this._chunks[constants.TYPE_gAMA] = this._handleGAMA.bind(this);
    - 
    -  this.read = dependencies.read;
    -  this.error = dependencies.error;
    -  this.metadata = dependencies.metadata;
    -  this.gamma = dependencies.gamma;
    -  this.transColor = dependencies.transColor;
    -  this.palette = dependencies.palette;
    -  this.parsed = dependencies.parsed;
    -  this.inflateData = dependencies.inflateData;
    -  this.finished = dependencies.finished;
    -  this.simpleTransparency = dependencies.simpleTransparency;
    -  this.headersFinished = dependencies.headersFinished || function () {};
    -});
    - 
    -Parser.prototype.start = function () {
    -  this.read(constants.PNG_SIGNATURE.length, this._parseSignature.bind(this));
    -};
    - 
    -Parser.prototype._parseSignature = function (data) {
    -  let signature = constants.PNG_SIGNATURE;
    - 
    -  for (let i = 0; i < signature.length; i++) {
    -    if (data[i] !== signature[i]) {
    -      this.error(new Error("Invalid file signature"));
    -      return;
    -    }
    -  }
    -  this.read(8, this._parseChunkBegin.bind(this));
    -};
    - 
    -Parser.prototype._parseChunkBegin = function (data) {
    -  // chunk content length
    -  let length = data.readUInt32BE(0);
    - 
    -  // chunk type
    -  let type = data.readUInt32BE(4);
    -  let name = "";
    -  for (let i = 4; i < 8; i++) {
    -    name += String.fromCharCode(data[i]);
    -  }
    - 
    -  //console.log('chunk ', name, length);
    - 
    -  // chunk flags
    -  let ancillary = Boolean(data[4] & 0x20); // or critical
    -  //    priv = Boolean(data[5] & 0x20), // or public
    -  //    safeToCopy = Boolean(data[7] & 0x20); // or unsafe
    - 
    -  Iif (!this._hasIHDR && type !== constants.TYPE_IHDR) {
    -    this.error(new Error("Expected IHDR on beggining"));
    -    return;
    -  }
    - 
    -  this._crc = new CrcCalculator();
    -  this._crc.write(Buffer.from(name));
    - 
    -  if (this._chunks[type]) {
    -    return this._chunks[type](length);
    -  }
    - 
    -  Iif (!ancillary) {
    -    this.error(new Error("Unsupported critical chunk type " + name));
    -    return;
    -  }
    - 
    -  this.read(length + 4, this._skipChunk.bind(this));
    -};
    - 
    -Parser.prototype._skipChunk = function (/*data*/) {
    -  this.read(8, this._parseChunkBegin.bind(this));
    -};
    - 
    -Parser.prototype._handleChunkEnd = function () {
    -  this.read(4, this._parseChunkEnd.bind(this));
    -};
    - 
    -Parser.prototype._parseChunkEnd = function (data) {
    -  let fileCrc = data.readInt32BE(0);
    -  let calcCrc = this._crc.crc32();
    - 
    -  // check CRC
    -  if (this._options.checkCRC && calcCrc !== fileCrc) {
    -    this.error(new Error("Crc error - " + fileCrc + " - " + calcCrc));
    -    return;
    -  }
    - 
    -  if (!this._hasIEND) {
    -    this.read(8, this._parseChunkBegin.bind(this));
    -  }
    -};
    - 
    -Parser.prototype._handleIHDR = function (length) {
    -  this.read(length, this._parseIHDR.bind(this));
    -};
    -Parser.prototype._parseIHDR = function (data) {
    -  this._crc.write(data);
    - 
    -  let width = data.readUInt32BE(0);
    -  let height = data.readUInt32BE(4);
    -  let depth = data[8];
    -  let colorType = data[9]; // bits: 1 palette, 2 color, 4 alpha
    -  let compr = data[10];
    -  let filter = data[11];
    -  let interlace = data[12];
    - 
    -  // console.log('    width', width, 'height', height,
    -  //     'depth', depth, 'colorType', colorType,
    -  //     'compr', compr, 'filter', filter, 'interlace', interlace
    -  // );
    - 
    -  if (
    -    depth !== 8 &&
    -    depth !== 4 &&
    -    depth !== 2 &&
    -    depth !== 1 &&
    -    depth !== 16
    -  ) {
    -    this.error(new Error("Unsupported bit depth " + depth));
    -    return;
    -  }
    -  if (!(colorType in constants.COLORTYPE_TO_BPP_MAP)) {
    -    this.error(new Error("Unsupported color type"));
    -    return;
    -  }
    -  Iif (compr !== 0) {
    -    this.error(new Error("Unsupported compression method"));
    -    return;
    -  }
    -  Iif (filter !== 0) {
    -    this.error(new Error("Unsupported filter method"));
    -    return;
    -  }
    -  Iif (interlace !== 0 && interlace !== 1) {
    -    this.error(new Error("Unsupported interlace method"));
    -    return;
    -  }
    - 
    -  this._colorType = colorType;
    - 
    -  let bpp = constants.COLORTYPE_TO_BPP_MAP[this._colorType];
    - 
    -  this._hasIHDR = true;
    - 
    -  this.metadata({
    -    width: width,
    -    height: height,
    -    depth: depth,
    -    interlace: Boolean(interlace),
    -    palette: Boolean(colorType & constants.COLORTYPE_PALETTE),
    -    color: Boolean(colorType & constants.COLORTYPE_COLOR),
    -    alpha: Boolean(colorType & constants.COLORTYPE_ALPHA),
    -    bpp: bpp,
    -    colorType: colorType,
    -  });
    - 
    -  this._handleChunkEnd();
    -};
    - 
    -Parser.prototype._handlePLTE = function (length) {
    -  this.read(length, this._parsePLTE.bind(this));
    -};
    -Parser.prototype._parsePLTE = function (data) {
    -  this._crc.write(data);
    - 
    -  let entries = Math.floor(data.length / 3);
    -  // console.log('Palette:', entries);
    - 
    -  for (let i = 0; i < entries; i++) {
    -    this._palette.push([data[i * 3], data[i * 3 + 1], data[i * 3 + 2], 0xff]);
    -  }
    - 
    -  this.palette(this._palette);
    - 
    -  this._handleChunkEnd();
    -};
    - 
    -Parser.prototype._handleTRNS = function (length) {
    -  this.simpleTransparency();
    -  this.read(length, this._parseTRNS.bind(this));
    -};
    -Parser.prototype._parseTRNS = function (data) {
    -  this._crc.write(data);
    - 
    -  // palette
    -  if (this._colorType === constants.COLORTYPE_PALETTE_COLOR) {
    -    Iif (this._palette.length === 0) {
    -      this.error(new Error("Transparency chunk must be after palette"));
    -      return;
    -    }
    -    Iif (data.length > this._palette.length) {
    -      this.error(new Error("More transparent colors than palette size"));
    -      return;
    -    }
    -    for (let i = 0; i < data.length; i++) {
    -      this._palette[i][3] = data[i];
    -    }
    -    this.palette(this._palette);
    -  }
    - 
    -  // for colorType 0 (grayscale) and 2 (rgb)
    -  // there might be one gray/color defined as transparent
    -  if (this._colorType === constants.COLORTYPE_GRAYSCALE) {
    -    // grey, 2 bytes
    -    this.transColor([data.readUInt16BE(0)]);
    -  }
    -  if (this._colorType === constants.COLORTYPE_COLOR) {
    -    this.transColor([
    -      data.readUInt16BE(0),
    -      data.readUInt16BE(2),
    -      data.readUInt16BE(4),
    -    ]);
    -  }
    - 
    -  this._handleChunkEnd();
    -};
    - 
    -Parser.prototype._handleGAMA = function (length) {
    -  this.read(length, this._parseGAMA.bind(this));
    -};
    -Parser.prototype._parseGAMA = function (data) {
    -  this._crc.write(data);
    -  this.gamma(data.readUInt32BE(0) / constants.GAMMA_DIVISION);
    - 
    -  this._handleChunkEnd();
    -};
    - 
    -Parser.prototype._handleIDAT = function (length) {
    -  if (!this._emittedHeadersFinished) {
    -    this._emittedHeadersFinished = true;
    -    this.headersFinished();
    -  }
    -  this.read(-length, this._parseIDAT.bind(this, length));
    -};
    -Parser.prototype._parseIDAT = function (length, data) {
    -  this._crc.write(data);
    - 
    -  Iif (
    -    this._colorType === constants.COLORTYPE_PALETTE_COLOR &&
    -    this._palette.length === 0
    -  ) {
    -    throw new Error("Expected palette not found");
    -  }
    - 
    -  this.inflateData(data);
    -  let leftOverLength = length - data.length;
    - 
    -  if (leftOverLength > 0) {
    -    this._handleIDAT(leftOverLength);
    -  } else {
    -    this._handleChunkEnd();
    -  }
    -};
    - 
    -Parser.prototype._handleIEND = function (length) {
    -  this.read(length, this._parseIEND.bind(this));
    -};
    -Parser.prototype._parseIEND = function (data) {
    -  this._crc.write(data);
    - 
    -  this._hasIEND = true;
    -  this._handleChunkEnd();
    - 
    -  if (this.finished) {
    -    this.finished();
    -  }
    -};
    - 
    - -
    -
    - - - - - - - - - \ No newline at end of file diff --git a/node_modules/pngjs/coverage/lcov-report/png-sync.js.html b/node_modules/pngjs/coverage/lcov-report/png-sync.js.html deleted file mode 100644 index 848f6a6..0000000 --- a/node_modules/pngjs/coverage/lcov-report/png-sync.js.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for png-sync.js - - - - - - - - - -
    -
    -

    All files png-sync.js

    -
    - -
    - 83.33% - Statements - 5/6 -
    - - -
    - 100% - Branches - 2/2 -
    - - -
    - 50% - Functions - 1/2 -
    - - -
    - 83.33% - Lines - 5/6 -
    - - -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13  -  -1x -1x -  -1x -176x -  -  -1x -  -  - 
    "use strict";
    - 
    -let parse = require("./parser-sync");
    -let pack = require("./packer-sync");
    - 
    -exports.read = function (buffer, options) {
    -  return parse(buffer, options || {});
    -};
    - 
    -exports.write = function (png, options) {
    -  return pack(png, options);
    -};
    - 
    - -
    -
    - - - - - - - - - \ No newline at end of file diff --git a/node_modules/pngjs/coverage/lcov-report/png.js.html b/node_modules/pngjs/coverage/lcov-report/png.js.html deleted file mode 100644 index baa8803..0000000 --- a/node_modules/pngjs/coverage/lcov-report/png.js.html +++ /dev/null @@ -1,662 +0,0 @@ - - - - - - Code coverage report for png.js - - - - - - - - - -
    -
    -

    All files png.js

    -
    - -
    - 54.17% - Statements - 52/96 -
    - - -
    - 41.18% - Branches - 14/34 -
    - - -
    - 56.25% - Functions - 9/16 -
    - - -
    - 56.52% - Lines - 52/92 -
    - - -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195  -  -1x -1x -1x -1x -1x -  -1x -353x -  -353x -  -  -353x -353x -  -353x -  -  -  -  -353x -  -  -  -353x -353x -  -353x -  -353x -353x -353x -353x -353x -  -  -173x -173x -  -  -  -353x -353x -353x -353x -353x -  -1x -  -1x -  -1x -325x -  -  -  -  -325x -  -325x -  -  -  -325x -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -412x -412x -  -  -1x -175x -  -  -1x -174x -174x -  -174x -  -  -1x -149x -  -  -1x -378x -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  - 
    "use strict";
    - 
    -let util = require("util");
    -let Stream = require("stream");
    -let Parser = require("./parser-async");
    -let Packer = require("./packer-async");
    -let PNGSync = require("./png-sync");
    - 
    -let PNG = (exports.PNG = function (options) {
    -  Stream.call(this);
    - 
    -  options = options || {}; // eslint-disable-line no-param-reassign
    - 
    -  // coerce pixel dimensions to integers (also coerces undefined -> 0):
    -  this.width = options.width | 0;
    -  this.height = options.height | 0;
    - 
    -  this.data =
    -    this.width > 0 && this.height > 0
    -      ? Buffer.alloc(4 * this.width * this.height)
    -      : null;
    - 
    -  Iif (options.fill && this.data) {
    -    this.data.fill(0);
    -  }
    - 
    -  this.gamma = 0;
    -  this.readable = this.writable = true;
    - 
    -  this._parser = new Parser(options);
    - 
    -  this._parser.on("error", this.emit.bind(this, "error"));
    -  this._parser.on("close", this._handleClose.bind(this));
    -  this._parser.on("metadata", this._metadata.bind(this));
    -  this._parser.on("gamma", this._gamma.bind(this));
    -  this._parser.on(
    -    "parsed",
    -    function (data) {
    -      this.data = data;
    -      this.emit("parsed", data);
    -    }.bind(this)
    -  );
    - 
    -  this._packer = new Packer(options);
    -  this._packer.on("data", this.emit.bind(this, "data"));
    -  this._packer.on("end", this.emit.bind(this, "end"));
    -  this._parser.on("close", this._handleClose.bind(this));
    -  this._packer.on("error", this.emit.bind(this, "error"));
    -});
    -util.inherits(PNG, Stream);
    - 
    -PNG.sync = PNGSync;
    - 
    -PNG.prototype.pack = function () {
    -  Iif (!this.data || !this.data.length) {
    -    this.emit("error", "No data provided");
    -    return this;
    -  }
    - 
    -  process.nextTick(
    -    function () {
    -      this._packer.pack(this.data, this.width, this.height, this.gamma);
    -    }.bind(this)
    -  );
    - 
    -  return this;
    -};
    - 
    -PNG.prototype.parse = function (data, callback) {
    -  if (callback) {
    -    let onParsed, onError;
    - 
    -    onParsed = function (parsedData) {
    -      this.removeListener("error", onError);
    - 
    -      this.data = parsedData;
    -      callback(null, this);
    -    }.bind(this);
    - 
    -    onError = function (err) {
    -      this.removeListener("parsed", onParsed);
    - 
    -      callback(err, null);
    -    }.bind(this);
    - 
    -    this.once("parsed", onParsed);
    -    this.once("error", onError);
    -  }
    - 
    -  this.end(data);
    -  return this;
    -};
    - 
    -PNG.prototype.write = function (data) {
    -  this._parser.write(data);
    -  return true;
    -};
    - 
    -PNG.prototype.end = function (data) {
    -  this._parser.end(data);
    -};
    - 
    -PNG.prototype._metadata = function (metadata) {
    -  this.width = metadata.width;
    -  this.height = metadata.height;
    - 
    -  this.emit("metadata", metadata);
    -};
    - 
    -PNG.prototype._gamma = function (gamma) {
    -  this.gamma = gamma;
    -};
    - 
    -PNG.prototype._handleClose = function () {
    -  Iif (!this._parser.writable && !this._packer.readable) {
    -    this.emit("close");
    -  }
    -};
    - 
    -PNG.bitblt = function (src, dst, srcX, srcY, width, height, deltaX, deltaY) {
    -  // eslint-disable-line max-params
    -  // coerce pixel dimensions to integers (also coerces undefined -> 0):
    -  /* eslint-disable no-param-reassign */
    -  srcX |= 0;
    -  srcY |= 0;
    -  width |= 0;
    -  height |= 0;
    -  deltaX |= 0;
    -  deltaY |= 0;
    -  /* eslint-enable no-param-reassign */
    - 
    -  if (
    -    srcX > src.width ||
    -    srcY > src.height ||
    -    srcX + width > src.width ||
    -    srcY + height > src.height
    -  ) {
    -    throw new Error("bitblt reading outside image");
    -  }
    - 
    -  if (
    -    deltaX > dst.width ||
    -    deltaY > dst.height ||
    -    deltaX + width > dst.width ||
    -    deltaY + height > dst.height
    -  ) {
    -    throw new Error("bitblt writing outside image");
    -  }
    - 
    -  for (let y = 0; y < height; y++) {
    -    src.data.copy(
    -      dst.data,
    -      ((deltaY + y) * dst.width + deltaX) << 2,
    -      ((srcY + y) * src.width + srcX) << 2,
    -      ((srcY + y) * src.width + srcX + width) << 2
    -    );
    -  }
    -};
    - 
    -PNG.prototype.bitblt = function (
    -  dst,
    -  srcX,
    -  srcY,
    -  width,
    -  height,
    -  deltaX,
    -  deltaY
    -) {
    -  // eslint-disable-line max-params
    - 
    -  PNG.bitblt(this, dst, srcX, srcY, width, height, deltaX, deltaY);
    -  return this;
    -};
    - 
    -PNG.adjustGamma = function (src) {
    -  if (src.gamma) {
    -    for (let y = 0; y < src.height; y++) {
    -      for (let x = 0; x < src.width; x++) {
    -        let idx = (src.width * y + x) << 2;
    - 
    -        for (let i = 0; i < 3; i++) {
    -          let sample = src.data[idx + i] / 255;
    -          sample = Math.pow(sample, 1 / 2.2 / src.gamma);
    -          src.data[idx + i] = Math.round(sample * 255);
    -        }
    -      }
    -    }
    -    src.gamma = 0;
    -  }
    -};
    - 
    -PNG.prototype.adjustGamma = function () {
    -  PNG.adjustGamma(this);
    -};
    - 
    - -
    -
    - - - - - - - - - \ No newline at end of file diff --git a/node_modules/pngjs/coverage/lcov-report/prettify.css b/node_modules/pngjs/coverage/lcov-report/prettify.css deleted file mode 100644 index 006492c..0000000 --- a/node_modules/pngjs/coverage/lcov-report/prettify.css +++ /dev/null @@ -1,101 +0,0 @@ -.pln { - color: #000; -} -@media screen { - .str { - color: #080; - } - .kwd { - color: #008; - } - .com { - color: #800; - } - .typ { - color: #606; - } - .lit { - color: #066; - } - .pun, - .opn, - .clo { - color: #660; - } - .tag { - color: #008; - } - .atn { - color: #606; - } - .atv { - color: #080; - } - .dec, - .var { - color: #606; - } - .fun { - color: red; - } -} -@media print, projection { - .str { - color: #060; - } - .kwd { - color: #006; - font-weight: bold; - } - .com { - color: #600; - font-style: italic; - } - .typ { - color: #404; - font-weight: bold; - } - .lit { - color: #044; - } - .pun, - .opn, - .clo { - color: #440; - } - .tag { - color: #006; - font-weight: bold; - } - .atn { - color: #404; - } - .atv { - color: #060; - } -} -pre.prettyprint { - padding: 2px; - border: 1px solid #888; -} -ol.linenums { - margin-top: 0; - margin-bottom: 0; -} -li.L0, -li.L1, -li.L2, -li.L3, -li.L5, -li.L6, -li.L7, -li.L8 { - list-style-type: none; -} -li.L1, -li.L3, -li.L5, -li.L7, -li.L9 { - background: #eee; -} diff --git a/node_modules/pngjs/coverage/lcov-report/prettify.js b/node_modules/pngjs/coverage/lcov-report/prettify.js deleted file mode 100644 index 7c0a2fe..0000000 --- a/node_modules/pngjs/coverage/lcov-report/prettify.js +++ /dev/null @@ -1,1007 +0,0 @@ -/* eslint-disable */ -window.PR_SHOULD_USE_CONTINUATION = true; -(function () { - var h = ["break,continue,do,else,for,if,return,while"]; - var u = [ - h, - "auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile", - ]; - var p = [ - u, - "catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof", - ]; - var l = [ - p, - "alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where", - ]; - var x = [ - p, - "abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient", - ]; - var R = [ - x, - "as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var", - ]; - var r = - "all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes"; - var w = [ - p, - "debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN", - ]; - var s = - "caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"; - var I = [ - h, - "and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None", - ]; - var f = [ - h, - "alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END", - ]; - var H = [h, "case,done,elif,esac,eval,fi,function,in,local,set,then,until"]; - var A = [l, R, w, s + I, f, H]; - var e = /^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/; - var C = "str"; - var z = "kwd"; - var j = "com"; - var O = "typ"; - var G = "lit"; - var L = "pun"; - var F = "pln"; - var m = "tag"; - var E = "dec"; - var J = "src"; - var P = "atn"; - var n = "atv"; - var N = "nocode"; - var M = - "(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*"; - function k(Z) { - var ad = 0; - var S = false; - var ac = false; - for (var V = 0, U = Z.length; V < U; ++V) { - var ae = Z[V]; - if (ae.ignoreCase) { - ac = true; - } else { - if ( - /[a-z]/i.test( - ae.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, "") - ) - ) { - S = true; - ac = false; - break; - } - } - } - var Y = { b: 8, t: 9, n: 10, v: 11, f: 12, r: 13 }; - function ab(ah) { - var ag = ah.charCodeAt(0); - if (ag !== 92) { - return ag; - } - var af = ah.charAt(1); - ag = Y[af]; - if (ag) { - return ag; - } else { - if ("0" <= af && af <= "7") { - return parseInt(ah.substring(1), 8); - } else { - if (af === "u" || af === "x") { - return parseInt(ah.substring(2), 16); - } else { - return ah.charCodeAt(1); - } - } - } - } - function T(af) { - if (af < 32) { - return (af < 16 ? "\\x0" : "\\x") + af.toString(16); - } - var ag = String.fromCharCode(af); - if (ag === "\\" || ag === "-" || ag === "[" || ag === "]") { - ag = "\\" + ag; - } - return ag; - } - function X(am) { - var aq = am - .substring(1, am.length - 1) - .match( - new RegExp( - "\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]", - "g" - ) - ); - var ak = []; - var af = []; - var ao = aq[0] === "^"; - for (var ar = ao ? 1 : 0, aj = aq.length; ar < aj; ++ar) { - var ah = aq[ar]; - if (/\\[bdsw]/i.test(ah)) { - ak.push(ah); - } else { - var ag = ab(ah); - var al; - if (ar + 2 < aj && "-" === aq[ar + 1]) { - al = ab(aq[ar + 2]); - ar += 2; - } else { - al = ag; - } - af.push([ag, al]); - if (!(al < 65 || ag > 122)) { - if (!(al < 65 || ag > 90)) { - af.push([Math.max(65, ag) | 32, Math.min(al, 90) | 32]); - } - if (!(al < 97 || ag > 122)) { - af.push([Math.max(97, ag) & ~32, Math.min(al, 122) & ~32]); - } - } - } - } - af.sort(function (av, au) { - return av[0] - au[0] || au[1] - av[1]; - }); - var ai = []; - var ap = [NaN, NaN]; - for (var ar = 0; ar < af.length; ++ar) { - var at = af[ar]; - if (at[0] <= ap[1] + 1) { - ap[1] = Math.max(ap[1], at[1]); - } else { - ai.push((ap = at)); - } - } - var an = ["["]; - if (ao) { - an.push("^"); - } - an.push.apply(an, ak); - for (var ar = 0; ar < ai.length; ++ar) { - var at = ai[ar]; - an.push(T(at[0])); - if (at[1] > at[0]) { - if (at[1] + 1 > at[0]) { - an.push("-"); - } - an.push(T(at[1])); - } - } - an.push("]"); - return an.join(""); - } - function W(al) { - var aj = al.source.match( - new RegExp( - "(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)", - "g" - ) - ); - var ah = aj.length; - var an = []; - for (var ak = 0, am = 0; ak < ah; ++ak) { - var ag = aj[ak]; - if (ag === "(") { - ++am; - } else { - if ("\\" === ag.charAt(0)) { - var af = +ag.substring(1); - if (af && af <= am) { - an[af] = -1; - } - } - } - } - for (var ak = 1; ak < an.length; ++ak) { - if (-1 === an[ak]) { - an[ak] = ++ad; - } - } - for (var ak = 0, am = 0; ak < ah; ++ak) { - var ag = aj[ak]; - if (ag === "(") { - ++am; - if (an[am] === undefined) { - aj[ak] = "(?:"; - } - } else { - if ("\\" === ag.charAt(0)) { - var af = +ag.substring(1); - if (af && af <= am) { - aj[ak] = "\\" + an[am]; - } - } - } - } - for (var ak = 0, am = 0; ak < ah; ++ak) { - if ("^" === aj[ak] && "^" !== aj[ak + 1]) { - aj[ak] = ""; - } - } - if (al.ignoreCase && S) { - for (var ak = 0; ak < ah; ++ak) { - var ag = aj[ak]; - var ai = ag.charAt(0); - if (ag.length >= 2 && ai === "[") { - aj[ak] = X(ag); - } else { - if (ai !== "\\") { - aj[ak] = ag.replace(/[a-zA-Z]/g, function (ao) { - var ap = ao.charCodeAt(0); - return "[" + String.fromCharCode(ap & ~32, ap | 32) + "]"; - }); - } - } - } - } - return aj.join(""); - } - var aa = []; - for (var V = 0, U = Z.length; V < U; ++V) { - var ae = Z[V]; - if (ae.global || ae.multiline) { - throw new Error("" + ae); - } - aa.push("(?:" + W(ae) + ")"); - } - return new RegExp(aa.join("|"), ac ? "gi" : "g"); - } - function a(V) { - var U = /(?:^|\s)nocode(?:\s|$)/; - var X = []; - var T = 0; - var Z = []; - var W = 0; - var S; - if (V.currentStyle) { - S = V.currentStyle.whiteSpace; - } else { - if (window.getComputedStyle) { - S = document.defaultView - .getComputedStyle(V, null) - .getPropertyValue("white-space"); - } - } - var Y = S && "pre" === S.substring(0, 3); - function aa(ab) { - switch (ab.nodeType) { - case 1: - if (U.test(ab.className)) { - return; - } - for (var ae = ab.firstChild; ae; ae = ae.nextSibling) { - aa(ae); - } - var ad = ab.nodeName; - if ("BR" === ad || "LI" === ad) { - X[W] = "\n"; - Z[W << 1] = T++; - Z[(W++ << 1) | 1] = ab; - } - break; - case 3: - case 4: - var ac = ab.nodeValue; - if (ac.length) { - if (!Y) { - ac = ac.replace(/[ \t\r\n]+/g, " "); - } else { - ac = ac.replace(/\r\n?/g, "\n"); - } - X[W] = ac; - Z[W << 1] = T; - T += ac.length; - Z[(W++ << 1) | 1] = ab; - } - break; - } - } - aa(V); - return { sourceCode: X.join("").replace(/\n$/, ""), spans: Z }; - } - function B(S, U, W, T) { - if (!U) { - return; - } - var V = { sourceCode: U, basePos: S }; - W(V); - T.push.apply(T, V.decorations); - } - var v = /\S/; - function o(S) { - var V = undefined; - for (var U = S.firstChild; U; U = U.nextSibling) { - var T = U.nodeType; - V = T === 1 ? (V ? S : U) : T === 3 ? (v.test(U.nodeValue) ? S : V) : V; - } - return V === S ? undefined : V; - } - function g(U, T) { - var S = {}; - var V; - (function () { - var ad = U.concat(T); - var ah = []; - var ag = {}; - for (var ab = 0, Z = ad.length; ab < Z; ++ab) { - var Y = ad[ab]; - var ac = Y[3]; - if (ac) { - for (var ae = ac.length; --ae >= 0; ) { - S[ac.charAt(ae)] = Y; - } - } - var af = Y[1]; - var aa = "" + af; - if (!ag.hasOwnProperty(aa)) { - ah.push(af); - ag[aa] = null; - } - } - ah.push(/[\0-\uffff]/); - V = k(ah); - })(); - var X = T.length; - var W = function (ah) { - var Z = ah.sourceCode, - Y = ah.basePos; - var ad = [Y, F]; - var af = 0; - var an = Z.match(V) || []; - var aj = {}; - for (var ae = 0, aq = an.length; ae < aq; ++ae) { - var ag = an[ae]; - var ap = aj[ag]; - var ai = void 0; - var am; - if (typeof ap === "string") { - am = false; - } else { - var aa = S[ag.charAt(0)]; - if (aa) { - ai = ag.match(aa[1]); - ap = aa[0]; - } else { - for (var ao = 0; ao < X; ++ao) { - aa = T[ao]; - ai = ag.match(aa[1]); - if (ai) { - ap = aa[0]; - break; - } - } - if (!ai) { - ap = F; - } - } - am = ap.length >= 5 && "lang-" === ap.substring(0, 5); - if (am && !(ai && typeof ai[1] === "string")) { - am = false; - ap = J; - } - if (!am) { - aj[ag] = ap; - } - } - var ab = af; - af += ag.length; - if (!am) { - ad.push(Y + ab, ap); - } else { - var al = ai[1]; - var ak = ag.indexOf(al); - var ac = ak + al.length; - if (ai[2]) { - ac = ag.length - ai[2].length; - ak = ac - al.length; - } - var ar = ap.substring(5); - B(Y + ab, ag.substring(0, ak), W, ad); - B(Y + ab + ak, al, q(ar, al), ad); - B(Y + ab + ac, ag.substring(ac), W, ad); - } - } - ah.decorations = ad; - }; - return W; - } - function i(T) { - var W = [], - S = []; - if (T.tripleQuotedStrings) { - W.push([ - C, - /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/, - null, - "'\"", - ]); - } else { - if (T.multiLineStrings) { - W.push([ - C, - /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/, - null, - "'\"`", - ]); - } else { - W.push([ - C, - /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/, - null, - "\"'", - ]); - } - } - if (T.verbatimStrings) { - S.push([C, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]); - } - var Y = T.hashComments; - if (Y) { - if (T.cStyleComments) { - if (Y > 1) { - W.push([j, /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, "#"]); - } else { - W.push([ - j, - /^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/, - null, - "#", - ]); - } - S.push([ - C, - /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/, - null, - ]); - } else { - W.push([j, /^#[^\r\n]*/, null, "#"]); - } - } - if (T.cStyleComments) { - S.push([j, /^\/\/[^\r\n]*/, null]); - S.push([j, /^\/\*[\s\S]*?(?:\*\/|$)/, null]); - } - if (T.regexLiterals) { - var X = - "/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/"; - S.push(["lang-regex", new RegExp("^" + M + "(" + X + ")")]); - } - var V = T.types; - if (V) { - S.push([O, V]); - } - var U = ("" + T.keywords).replace(/^ | $/g, ""); - if (U.length) { - S.push([ - z, - new RegExp("^(?:" + U.replace(/[\s,]+/g, "|") + ")\\b"), - null, - ]); - } - W.push([F, /^\s+/, null, " \r\n\t\xA0"]); - S.push( - [G, /^@[a-z_$][a-z_$@0-9]*/i, null], - [O, /^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/, null], - [F, /^[a-z_$][a-z_$@0-9]*/i, null], - [ - G, - new RegExp( - "^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*", - "i" - ), - null, - "0123456789", - ], - [F, /^\\[\s\S]?/, null], - [L, /^.[^\s\w\.$@\'\"\`\/\#\\]*/, null] - ); - return g(W, S); - } - var K = i({ - keywords: A, - hashComments: true, - cStyleComments: true, - multiLineStrings: true, - regexLiterals: true, - }); - function Q(V, ag) { - var U = /(?:^|\s)nocode(?:\s|$)/; - var ab = /\r\n?|\n/; - var ac = V.ownerDocument; - var S; - if (V.currentStyle) { - S = V.currentStyle.whiteSpace; - } else { - if (window.getComputedStyle) { - S = ac.defaultView - .getComputedStyle(V, null) - .getPropertyValue("white-space"); - } - } - var Z = S && "pre" === S.substring(0, 3); - var af = ac.createElement("LI"); - while (V.firstChild) { - af.appendChild(V.firstChild); - } - var W = [af]; - function ae(al) { - switch (al.nodeType) { - case 1: - if (U.test(al.className)) { - break; - } - if ("BR" === al.nodeName) { - ad(al); - if (al.parentNode) { - al.parentNode.removeChild(al); - } - } else { - for (var an = al.firstChild; an; an = an.nextSibling) { - ae(an); - } - } - break; - case 3: - case 4: - if (Z) { - var am = al.nodeValue; - var aj = am.match(ab); - if (aj) { - var ai = am.substring(0, aj.index); - al.nodeValue = ai; - var ah = am.substring(aj.index + aj[0].length); - if (ah) { - var ak = al.parentNode; - ak.insertBefore(ac.createTextNode(ah), al.nextSibling); - } - ad(al); - if (!ai) { - al.parentNode.removeChild(al); - } - } - } - break; - } - } - function ad(ak) { - while (!ak.nextSibling) { - ak = ak.parentNode; - if (!ak) { - return; - } - } - function ai(al, ar) { - var aq = ar ? al.cloneNode(false) : al; - var ao = al.parentNode; - if (ao) { - var ap = ai(ao, 1); - var an = al.nextSibling; - ap.appendChild(aq); - for (var am = an; am; am = an) { - an = am.nextSibling; - ap.appendChild(am); - } - } - return aq; - } - var ah = ai(ak.nextSibling, 0); - for (var aj; (aj = ah.parentNode) && aj.nodeType === 1; ) { - ah = aj; - } - W.push(ah); - } - for (var Y = 0; Y < W.length; ++Y) { - ae(W[Y]); - } - if (ag === (ag | 0)) { - W[0].setAttribute("value", ag); - } - var aa = ac.createElement("OL"); - aa.className = "linenums"; - var X = Math.max(0, (ag - 1) | 0) || 0; - for (var Y = 0, T = W.length; Y < T; ++Y) { - af = W[Y]; - af.className = "L" + ((Y + X) % 10); - if (!af.firstChild) { - af.appendChild(ac.createTextNode("\xA0")); - } - aa.appendChild(af); - } - V.appendChild(aa); - } - function D(ac) { - var aj = /\bMSIE\b/.test(navigator.userAgent); - var am = /\n/g; - var al = ac.sourceCode; - var an = al.length; - var V = 0; - var aa = ac.spans; - var T = aa.length; - var ah = 0; - var X = ac.decorations; - var Y = X.length; - var Z = 0; - X[Y] = an; - var ar, aq; - for (aq = ar = 0; aq < Y; ) { - if (X[aq] !== X[aq + 2]) { - X[ar++] = X[aq++]; - X[ar++] = X[aq++]; - } else { - aq += 2; - } - } - Y = ar; - for (aq = ar = 0; aq < Y; ) { - var at = X[aq]; - var ab = X[aq + 1]; - var W = aq + 2; - while (W + 2 <= Y && X[W + 1] === ab) { - W += 2; - } - X[ar++] = at; - X[ar++] = ab; - aq = W; - } - Y = X.length = ar; - var ae = null; - while (ah < T) { - var af = aa[ah]; - var S = aa[ah + 2] || an; - var ag = X[Z]; - var ap = X[Z + 2] || an; - var W = Math.min(S, ap); - var ak = aa[ah + 1]; - var U; - if (ak.nodeType !== 1 && (U = al.substring(V, W))) { - if (aj) { - U = U.replace(am, "\r"); - } - ak.nodeValue = U; - var ai = ak.ownerDocument; - var ao = ai.createElement("SPAN"); - ao.className = X[Z + 1]; - var ad = ak.parentNode; - ad.replaceChild(ao, ak); - ao.appendChild(ak); - if (V < S) { - aa[ah + 1] = ak = ai.createTextNode(al.substring(W, S)); - ad.insertBefore(ak, ao.nextSibling); - } - } - V = W; - if (V >= S) { - ah += 2; - } - if (V >= ap) { - Z += 2; - } - } - } - var t = {}; - function c(U, V) { - for (var S = V.length; --S >= 0; ) { - var T = V[S]; - if (!t.hasOwnProperty(T)) { - t[T] = U; - } else { - if (window.console) { - console.warn("cannot override language handler %s", T); - } - } - } - } - function q(T, S) { - if (!(T && t.hasOwnProperty(T))) { - T = /^\s*]*(?:>|$)/], - [j, /^<\!--[\s\S]*?(?:-\->|$)/], - ["lang-", /^<\?([\s\S]+?)(?:\?>|$)/], - ["lang-", /^<%([\s\S]+?)(?:%>|$)/], - [L, /^(?:<[%?]|[%?]>)/], - ["lang-", /^]*>([\s\S]+?)<\/xmp\b[^>]*>/i], - ["lang-js", /^]*>([\s\S]*?)(<\/script\b[^>]*>)/i], - ["lang-css", /^]*>([\s\S]*?)(<\/style\b[^>]*>)/i], - ["lang-in.tag", /^(<\/?[a-z][^<>]*>)/i], - ] - ), - ["default-markup", "htm", "html", "mxml", "xhtml", "xml", "xsl"] - ); - c( - g( - [ - [F, /^[\s]+/, null, " \t\r\n"], - [n, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, "\"'"], - ], - [ - [m, /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i], - [P, /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i], - ["lang-uq.val", /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/], - [L, /^[=<>\/]+/], - ["lang-js", /^on\w+\s*=\s*\"([^\"]+)\"/i], - ["lang-js", /^on\w+\s*=\s*\'([^\']+)\'/i], - ["lang-js", /^on\w+\s*=\s*([^\"\'>\s]+)/i], - ["lang-css", /^style\s*=\s*\"([^\"]+)\"/i], - ["lang-css", /^style\s*=\s*\'([^\']+)\'/i], - ["lang-css", /^style\s*=\s*([^\"\'>\s]+)/i], - ] - ), - ["in.tag"] - ); - c(g([], [[n, /^[\s\S]+/]]), ["uq.val"]); - c(i({ keywords: l, hashComments: true, cStyleComments: true, types: e }), [ - "c", - "cc", - "cpp", - "cxx", - "cyc", - "m", - ]); - c(i({ keywords: "null,true,false" }), ["json"]); - c( - i({ - keywords: R, - hashComments: true, - cStyleComments: true, - verbatimStrings: true, - types: e, - }), - ["cs"] - ); - c(i({ keywords: x, cStyleComments: true }), ["java"]); - c(i({ keywords: H, hashComments: true, multiLineStrings: true }), [ - "bsh", - "csh", - "sh", - ]); - c( - i({ - keywords: I, - hashComments: true, - multiLineStrings: true, - tripleQuotedStrings: true, - }), - ["cv", "py"] - ); - c( - i({ - keywords: s, - hashComments: true, - multiLineStrings: true, - regexLiterals: true, - }), - ["perl", "pl", "pm"] - ); - c( - i({ - keywords: f, - hashComments: true, - multiLineStrings: true, - regexLiterals: true, - }), - ["rb"] - ); - c(i({ keywords: w, cStyleComments: true, regexLiterals: true }), ["js"]); - c( - i({ - keywords: r, - hashComments: 3, - cStyleComments: true, - multilineStrings: true, - tripleQuotedStrings: true, - regexLiterals: true, - }), - ["coffee"] - ); - c(g([], [[C, /^[\s\S]+/]]), ["regex"]); - function d(V) { - var U = V.langExtension; - try { - var S = a(V.sourceNode); - var T = S.sourceCode; - V.sourceCode = T; - V.spans = S.spans; - V.basePos = 0; - q(U, T)(V); - D(V); - } catch (W) { - if ("console" in window) { - console.log(W && W.stack ? W.stack : W); - } - } - } - function y(W, V, U) { - var S = document.createElement("PRE"); - S.innerHTML = W; - if (U) { - Q(S, U); - } - var T = { langExtension: V, numberLines: U, sourceNode: S }; - d(T); - return S.innerHTML; - } - function b(ad) { - function Y(af) { - return document.getElementsByTagName(af); - } - var ac = [Y("pre"), Y("code"), Y("xmp")]; - var T = []; - for (var aa = 0; aa < ac.length; ++aa) { - for (var Z = 0, V = ac[aa].length; Z < V; ++Z) { - T.push(ac[aa][Z]); - } - } - ac = null; - var W = Date; - if (!W.now) { - W = { - now: function () { - return +new Date(); - }, - }; - } - var X = 0; - var S; - var ab = /\blang(?:uage)?-([\w.]+)(?!\S)/; - var ae = /\bprettyprint\b/; - function U() { - var ag = window.PR_SHOULD_USE_CONTINUATION ? W.now() + 250 : Infinity; - for (; X < T.length && W.now() < ag; X++) { - var aj = T[X]; - var ai = aj.className; - if (ai.indexOf("prettyprint") >= 0) { - var ah = ai.match(ab); - var am; - if (!ah && (am = o(aj)) && "CODE" === am.tagName) { - ah = am.className.match(ab); - } - if (ah) { - ah = ah[1]; - } - var al = false; - for (var ak = aj.parentNode; ak; ak = ak.parentNode) { - if ( - (ak.tagName === "pre" || - ak.tagName === "code" || - ak.tagName === "xmp") && - ak.className && - ak.className.indexOf("prettyprint") >= 0 - ) { - al = true; - break; - } - } - if (!al) { - var af = aj.className.match(/\blinenums\b(?::(\d+))?/); - af = af ? (af[1] && af[1].length ? +af[1] : true) : false; - if (af) { - Q(aj, af); - } - S = { langExtension: ah, sourceNode: aj, numberLines: af }; - d(S); - } - } - } - if (X < T.length) { - setTimeout(U, 250); - } else { - if (ad) { - ad(); - } - } - } - U(); - } - window.prettyPrintOne = y; - window.prettyPrint = b; - window.PR = { - createSimpleLexer: g, - registerLangHandler: c, - sourceDecorator: i, - PR_ATTRIB_NAME: P, - PR_ATTRIB_VALUE: n, - PR_COMMENT: j, - PR_DECLARATION: E, - PR_KEYWORD: z, - PR_LITERAL: G, - PR_NOCODE: N, - PR_PLAIN: F, - PR_PUNCTUATION: L, - PR_SOURCE: J, - PR_STRING: C, - PR_TAG: m, - PR_TYPE: O, - }; -})(); -PR.registerLangHandler( - PR.createSimpleLexer( - [], - [ - [PR.PR_DECLARATION, /^]*(?:>|$)/], - [PR.PR_COMMENT, /^<\!--[\s\S]*?(?:-\->|$)/], - [PR.PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/], - ["lang-", /^<\?([\s\S]+?)(?:\?>|$)/], - ["lang-", /^<%([\s\S]+?)(?:%>|$)/], - ["lang-", /^]*>([\s\S]+?)<\/xmp\b[^>]*>/i], - [ - "lang-handlebars", - /^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i, - ], - ["lang-js", /^]*>([\s\S]*?)(<\/script\b[^>]*>)/i], - ["lang-css", /^]*>([\s\S]*?)(<\/style\b[^>]*>)/i], - ["lang-in.tag", /^(<\/?[a-z][^<>]*>)/i], - [PR.PR_DECLARATION, /^{{[#^>/]?\s*[\w.][^}]*}}/], - [PR.PR_DECLARATION, /^{{&?\s*[\w.][^}]*}}/], - [PR.PR_DECLARATION, /^{{{>?\s*[\w.][^}]*}}}/], - [PR.PR_COMMENT, /^{{![^}]*}}/], - ] - ), - ["handlebars", "hbs"] -); -PR.registerLangHandler( - PR.createSimpleLexer( - [[PR.PR_PLAIN, /^[ \t\r\n\f]+/, null, " \t\r\n\f"]], - [ - [ - PR.PR_STRING, - /^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/, - null, - ], - [ - PR.PR_STRING, - /^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/, - null, - ], - ["lang-css-str", /^url\(([^\)\"\']*)\)/i], - [ - PR.PR_KEYWORD, - /^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i, - null, - ], - [ - "lang-css-kw", - /^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i, - ], - [PR.PR_COMMENT, /^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//], - [PR.PR_COMMENT, /^(?:)/], - [PR.PR_LITERAL, /^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i], - [PR.PR_LITERAL, /^#(?:[0-9a-f]{3}){1,2}/i], - [ - PR.PR_PLAIN, - /^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i, - ], - [PR.PR_PUNCTUATION, /^[^\s\w\'\"]+/], - ] - ), - ["css"] -); -PR.registerLangHandler( - PR.createSimpleLexer( - [], - [ - [ - PR.PR_KEYWORD, - /^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i, - ], - ] - ), - ["css-kw"] -); -PR.registerLangHandler( - PR.createSimpleLexer([], [[PR.PR_STRING, /^[^\)\"\']+/]]), - ["css-str"] -); diff --git a/node_modules/pngjs/coverage/lcov-report/sort-arrow-sprite.png b/node_modules/pngjs/coverage/lcov-report/sort-arrow-sprite.png deleted file mode 100644 index 03f704a609c6fd0dbfdac63466a7d7c958b5cbf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jii$m5978H@?Fn+^JD|Y9yzj{W`447Gxa{7*dM7nnnD-Lb z6^}Hx2)'; - } - } - return cols; - } - // attaches a data attribute to every tr element with an object - // of data values keyed by column name - function loadRowData(tableRow) { - var tableCols = tableRow.querySelectorAll("td"), - colNode, - col, - data = {}, - i, - val; - for (i = 0; i < tableCols.length; i += 1) { - colNode = tableCols[i]; - col = cols[i]; - val = colNode.getAttribute("data-value"); - if (col.type === "number") { - val = Number(val); - } - data[col.key] = val; - } - return data; - } - // loads all row data - function loadData() { - var rows = getTableBody().querySelectorAll("tr"), - i; - - for (i = 0; i < rows.length; i += 1) { - rows[i].data = loadRowData(rows[i]); - } - } - // sorts the table using the data for the ith column - function sortByIndex(index, desc) { - var key = cols[index].key, - sorter = function (a, b) { - a = a.data[key]; - b = b.data[key]; - return a < b ? -1 : a > b ? 1 : 0; - }, - finalSorter = sorter, - tableBody = document.querySelector(".coverage-summary tbody"), - rowNodes = tableBody.querySelectorAll("tr"), - rows = [], - i; - - if (desc) { - finalSorter = function (a, b) { - return -1 * sorter(a, b); - }; - } - - for (i = 0; i < rowNodes.length; i += 1) { - rows.push(rowNodes[i]); - tableBody.removeChild(rowNodes[i]); - } - - rows.sort(finalSorter); - - for (i = 0; i < rows.length; i += 1) { - tableBody.appendChild(rows[i]); - } - } - // removes sort indicators for current column being sorted - function removeSortIndicators() { - var col = getNthColumn(currentSort.index), - cls = col.className; - - cls = cls.replace(/ sorted$/, "").replace(/ sorted-desc$/, ""); - col.className = cls; - } - // adds sort indicators for current column being sorted - function addSortIndicators() { - getNthColumn(currentSort.index).className += currentSort.desc - ? " sorted-desc" - : " sorted"; - } - // adds event listeners for all sorter widgets - function enableUI() { - var i, - el, - ithSorter = function ithSorter(i) { - var col = cols[i]; - - return function () { - var desc = col.defaultDescSort; - - if (currentSort.index === i) { - desc = !currentSort.desc; - } - sortByIndex(i, desc); - removeSortIndicators(); - currentSort.index = i; - currentSort.desc = desc; - addSortIndicators(); - }; - }; - for (i = 0; i < cols.length; i += 1) { - if (cols[i].sortable) { - // add the click event handler on the th so users - // dont have to click on those tiny arrows - el = getNthColumn(i).querySelector(".sorter").parentElement; - if (el.addEventListener) { - el.addEventListener("click", ithSorter(i)); - } else { - el.attachEvent("onclick", ithSorter(i)); - } - } - } - } - // adds sorting functionality to the UI - return function () { - if (!getTable()) { - return; - } - cols = loadColumns(); - loadData(); - addSortIndicators(); - enableUI(); - }; -})(); - -window.addEventListener("load", addSorting); diff --git a/node_modules/pngjs/coverage/lcov-report/sync-inflate.js.html b/node_modules/pngjs/coverage/lcov-report/sync-inflate.js.html deleted file mode 100644 index 9ae5a14..0000000 --- a/node_modules/pngjs/coverage/lcov-report/sync-inflate.js.html +++ /dev/null @@ -1,584 +0,0 @@ - - - - - - Code coverage report for sync-inflate.js - - - - - - - - - -
    -
    -

    All files sync-inflate.js

    -
    - -
    - 75.31% - Statements - 61/81 -
    - - -
    - 62% - Branches - 31/50 -
    - - -
    - 87.5% - Functions - 7/8 -
    - - -
    - 75.31% - Lines - 61/81 -
    - - -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169  -  -1x -1x -1x -  -1x -  -  -127x -  -  -  -127x -9x -  -  -127x -  -  -127x -127x -  -127x -127x -  -  -  -  -  -  -  -  -126x -  -  -  -  -126x -  -  -  -126x -126x -  -  -1x -127x -  -  -  -127x -  -127x -127x -127x -127x -  -127x -127x -  -  -127x -1x -  -  -  -126x -  -  -  -126x -126x -  -126x -126x -126x -  -126x -9x -  -  -126x -126x -126x -  -126x -126x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -127x -  -127x -127x -  -  -  -  -  -  -  -  -  -127x -  -  -127x -1x -  -  -126x -  -  -  -  -  -  -  -  -126x -126x -  -126x -  -  -1x -  -  -127x -  -  -127x -  -  -  -127x -127x -  -  -  -127x -  -  -  -127x -  -  -1x -1x -1x -1x - 
    "use strict";
    - 
    -let assert = require("assert").ok;
    -let zlib = require("zlib");
    -let util = require("util");
    - 
    -let kMaxLength = require("buffer").kMaxLength;
    - 
    -function Inflate(opts) {
    -  Iif (!(this instanceof Inflate)) {
    -    return new Inflate(opts);
    -  }
    - 
    -  if (opts && opts.chunkSize < zlib.Z_MIN_CHUNK) {
    -    opts.chunkSize = zlib.Z_MIN_CHUNK;
    -  }
    - 
    -  zlib.Inflate.call(this, opts);
    - 
    -  // Node 8 --> 9 compatibility check
    -  this._offset = this._offset === undefined ? this._outOffset : this._offset;
    -  this._buffer = this._buffer || this._outBuffer;
    - 
    -  Eif (opts && opts.maxLength != null) {
    -    this._maxLength = opts.maxLength;
    -  }
    -}
    - 
    -function createInflate(opts) {
    -  return new Inflate(opts);
    -}
    - 
    -function _close(engine, callback) {
    -  Iif (callback) {
    -    process.nextTick(callback);
    -  }
    - 
    -  // Caller may invoke .close after a zlib error (which will null _handle).
    -  Iif (!engine._handle) {
    -    return;
    -  }
    - 
    -  engine._handle.close();
    -  engine._handle = null;
    -}
    - 
    -Inflate.prototype._processChunk = function (chunk, flushFlag, asyncCb) {
    -  Iif (typeof asyncCb === "function") {
    -    return zlib.Inflate._processChunk.call(this, chunk, flushFlag, asyncCb);
    -  }
    - 
    -  let self = this;
    - 
    -  let availInBefore = chunk && chunk.length;
    -  let availOutBefore = this._chunkSize - this._offset;
    -  let leftToInflate = this._maxLength;
    -  let inOff = 0;
    - 
    -  let buffers = [];
    -  let nread = 0;
    - 
    -  let error;
    -  this.on("error", function (err) {
    -    error = err;
    -  });
    - 
    -  function handleChunk(availInAfter, availOutAfter) {
    -    Iif (self._hadError) {
    -      return;
    -    }
    - 
    -    let have = availOutBefore - availOutAfter;
    -    assert(have >= 0, "have should not go down");
    - 
    -    Eif (have > 0) {
    -      let out = self._buffer.slice(self._offset, self._offset + have);
    -      self._offset += have;
    - 
    -      if (out.length > leftToInflate) {
    -        out = out.slice(0, leftToInflate);
    -      }
    - 
    -      buffers.push(out);
    -      nread += out.length;
    -      leftToInflate -= out.length;
    - 
    -      Eif (leftToInflate === 0) {
    -        return false;
    -      }
    -    }
    - 
    -    if (availOutAfter === 0 || self._offset >= self._chunkSize) {
    -      availOutBefore = self._chunkSize;
    -      self._offset = 0;
    -      self._buffer = Buffer.allocUnsafe(self._chunkSize);
    -    }
    - 
    -    if (availOutAfter === 0) {
    -      inOff += availInBefore - availInAfter;
    -      availInBefore = availInAfter;
    - 
    -      return true;
    -    }
    - 
    -    return false;
    -  }
    - 
    -  assert(this._handle, "zlib binding closed");
    -  let res;
    -  do {
    -    res = this._handle.writeSync(
    -      flushFlag,
    -      chunk, // in
    -      inOff, // in_off
    -      availInBefore, // in_len
    -      this._buffer, // out
    -      this._offset, //out_off
    -      availOutBefore
    -    ); // out_len
    -    // Node 8 --> 9 compatibility check
    -    res = res || this._writeState;
    -  } while (!this._hadError && handleChunk(res[0], res[1]));
    - 
    -  if (this._hadError) {
    -    throw error;
    -  }
    - 
    -  Iif (nread >= kMaxLength) {
    -    _close(this);
    -    throw new RangeError(
    -      "Cannot create final Buffer. It would be larger than 0x" +
    -        kMaxLength.toString(16) +
    -        " bytes"
    -    );
    -  }
    - 
    -  let buf = Buffer.concat(buffers, nread);
    -  _close(this);
    - 
    -  return buf;
    -};
    - 
    -util.inherits(Inflate, zlib.Inflate);
    - 
    -function zlibBufferSync(engine, buffer) {
    -  Iif (typeof buffer === "string") {
    -    buffer = Buffer.from(buffer);
    -  }
    -  Iif (!(buffer instanceof Buffer)) {
    -    throw new TypeError("Not a string or buffer");
    -  }
    - 
    -  let flushFlag = engine._finishFlushFlag;
    -  Iif (flushFlag == null) {
    -    flushFlag = zlib.Z_FINISH;
    -  }
    - 
    -  return engine._processChunk(buffer, flushFlag);
    -}
    - 
    -function inflateSync(buffer, opts) {
    -  return zlibBufferSync(new Inflate(opts), buffer);
    -}
    - 
    -module.exports = exports = inflateSync;
    -exports.Inflate = Inflate;
    -exports.createInflate = createInflate;
    -exports.inflateSync = inflateSync;
    - 
    - -
    -
    - - - - - - - - - \ No newline at end of file diff --git a/node_modules/pngjs/coverage/lcov-report/sync-reader.js.html b/node_modules/pngjs/coverage/lcov-report/sync-reader.js.html deleted file mode 100644 index 576dd88..0000000 --- a/node_modules/pngjs/coverage/lcov-report/sync-reader.js.html +++ /dev/null @@ -1,215 +0,0 @@ - - - - - - Code coverage report for sync-reader.js - - - - - - - - - -
    -
    -

    All files sync-reader.js

    -
    - -
    - 88.89% - Statements - 16/18 -
    - - -
    - 72.73% - Branches - 8/11 -
    - - -
    - 100% - Functions - 3/3 -
    - - -
    - 88.89% - Lines - 16/18 -
    - - -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46  -  -1x -338x -338x -  -  -1x -9900x -  -  -  -  -  -  -1x -  -338x -9900x -  -9900x -  -  -  -  -9900x -  -9900x -  -9900x -  -9900x -  -  -  -  -  -338x -  -  -  -338x -13x -  -  - 
    "use strict";
    - 
    -let SyncReader = (module.exports = function (buffer) {
    -  this._buffer = buffer;
    -  this._reads = [];
    -});
    - 
    -SyncReader.prototype.read = function (length, callback) {
    -  this._reads.push({
    -    length: Math.abs(length), // if length < 0 then at most this length
    -    allowLess: length < 0,
    -    func: callback,
    -  });
    -};
    - 
    -SyncReader.prototype.process = function () {
    -  // as long as there is any data and read requests
    -  while (this._reads.length > 0 && this._buffer.length) {
    -    let read = this._reads[0];
    - 
    -    Eif (
    -      this._buffer.length &&
    -      (this._buffer.length >= read.length || read.allowLess)
    -    ) {
    -      // ok there is any data so that we can satisfy this request
    -      this._reads.shift(); // == read
    - 
    -      let buf = this._buffer;
    - 
    -      this._buffer = buf.slice(read.length);
    - 
    -      read.func.call(this, buf.slice(0, read.length));
    -    } else {
    -      break;
    -    }
    -  }
    - 
    -  Iif (this._reads.length > 0) {
    -    return new Error("There are some read requests waitng on finished stream");
    -  }
    - 
    -  if (this._buffer.length > 0) {
    -    return new Error("unrecognised content at end of stream");
    -  }
    -};
    - 
    - -
    -
    - - - - - - - - - \ No newline at end of file diff --git a/node_modules/pngjs/coverage/lcov.info b/node_modules/pngjs/coverage/lcov.info deleted file mode 100644 index 1a7a647..0000000 --- a/node_modules/pngjs/coverage/lcov.info +++ /dev/null @@ -1,2177 +0,0 @@ -TN: -SF:lib\bitmapper.js -FN:7,(anonymous_0) -FN:11,(anonymous_1) -FN:25,(anonymous_2) -FN:39,(anonymous_3) -FN:52,(anonymous_4) -FN:66,(anonymous_5) -FN:70,(anonymous_6) -FN:80,(anonymous_7) -FN:90,(anonymous_8) -FN:99,(anonymous_9) -FN:107,bitRetriever -FN:111,split -FN:153,(anonymous_12) -FN:161,(anonymous_13) -FN:164,(anonymous_14) -FN:172,mapImage8Bit -FN:187,mapImageCustomBit -FN:202,(anonymous_17) -FN:229,(anonymous_18) -FNF:19 -FNH:17 -FNDA:0,(anonymous_0) -FNDA:313632,(anonymous_1) -FNDA:8192,(anonymous_2) -FNDA:1228160,(anonymous_3) -FNDA:272640,(anonymous_4) -FNDA:0,(anonymous_5) -FNDA:1193380,(anonymous_6) -FNDA:8192,(anonymous_7) -FNDA:24576,(anonymous_8) -FNDA:8192,(anonymous_9) -FNDA:209,bitRetriever -FNDA:334250,split -FNDA:1234340,(anonymous_12) -FNDA:8106,(anonymous_13) -FNDA:209,(anonymous_14) -FNDA:210,mapImage8Bit -FNDA:529,mapImageCustomBit -FNDA:335,(anonymous_17) -FNDA:2732114,(anonymous_18) -DA:3,1 -DA:5,1 -DA:12,313632 -DA:13,0 -DA:16,313632 -DA:17,313632 -DA:18,313632 -DA:19,313632 -DA:20,313632 -DA:26,8192 -DA:27,0 -DA:30,8192 -DA:31,8192 -DA:32,8192 -DA:33,8192 -DA:34,8192 -DA:40,1228160 -DA:41,0 -DA:44,1228160 -DA:45,1228160 -DA:46,1228160 -DA:47,1228160 -DA:53,272640 -DA:54,0 -DA:57,272640 -DA:58,272640 -DA:59,272640 -DA:60,272640 -DA:64,1 -DA:71,1193380 -DA:72,1193380 -DA:73,1193380 -DA:74,1193380 -DA:75,1193380 -DA:81,8192 -DA:82,8192 -DA:83,8192 -DA:84,8192 -DA:85,8192 -DA:91,24576 -DA:92,24576 -DA:93,24576 -DA:94,24576 -DA:100,8192 -DA:101,8192 -DA:102,8192 -DA:103,8192 -DA:108,209 -DA:109,209 -DA:112,334250 -DA:113,0 -DA:115,334250 -DA:116,334250 -DA:118,334250 -DA:120,0 -DA:122,149504 -DA:123,149504 -DA:124,149504 -DA:125,149504 -DA:127,49612 -DA:128,49612 -DA:129,49612 -DA:130,49612 -DA:132,2968 -DA:133,2968 -DA:134,2968 -DA:135,2968 -DA:136,2968 -DA:137,2968 -DA:139,132166 -DA:140,132166 -DA:141,132166 -DA:142,132166 -DA:143,132166 -DA:144,132166 -DA:145,132166 -DA:146,132166 -DA:147,132166 -DA:148,132166 -DA:152,209 -DA:154,1234340 -DA:155,334250 -DA:157,1234340 -DA:158,1234340 -DA:159,1234340 -DA:162,8106 -DA:165,209 -DA:166,0 -DA:174,210 -DA:175,210 -DA:176,210 -DA:177,210 -DA:178,7288 -DA:179,1822624 -DA:180,1822624 -DA:181,1822624 -DA:184,210 -DA:189,529 -DA:190,529 -DA:191,529 -DA:192,529 -DA:193,8106 -DA:194,1234340 -DA:195,1234340 -DA:196,1234340 -DA:198,8106 -DA:202,1 -DA:203,335 -DA:204,335 -DA:205,335 -DA:206,335 -DA:207,335 -DA:210,335 -DA:211,209 -DA:214,335 -DA:215,269 -DA:217,66 -DA:219,335 -DA:220,335 -DA:224,335 -DA:225,72 -DA:226,72 -DA:228,263 -DA:229,263 -DA:230,2732114 -DA:231,2732114 -DA:232,2732114 -DA:234,263 -DA:237,335 -DA:238,739 -DA:239,210 -DA:248,529 -DA:258,335 -DA:259,126 -DA:260,0 -DA:263,209 -DA:266,335 -LF:137 -LH:129 -BRDA:12,0,0,0 -BRDA:12,0,1,313632 -BRDA:26,1,0,0 -BRDA:26,1,1,8192 -BRDA:40,2,0,0 -BRDA:40,2,1,1228160 -BRDA:53,3,0,0 -BRDA:53,3,1,272640 -BRDA:112,4,0,0 -BRDA:112,4,1,334250 -BRDA:118,5,0,0 -BRDA:118,5,1,149504 -BRDA:118,5,2,49612 -BRDA:118,5,3,2968 -BRDA:118,5,4,132166 -BRDA:165,6,0,0 -BRDA:165,6,1,209 -BRDA:210,7,0,209 -BRDA:210,7,1,126 -BRDA:214,8,0,269 -BRDA:214,8,1,66 -BRDA:224,9,0,72 -BRDA:224,9,1,263 -BRDA:238,10,0,210 -BRDA:238,10,1,529 -BRDA:258,11,0,126 -BRDA:258,11,1,209 -BRDA:259,12,0,0 -BRDA:259,12,1,126 -BRF:29 -BRH:21 -end_of_record -TN: -SF:lib\bitpacker.js -FN:5,(anonymous_0) -FN:11,(anonymous_1) -FN:52,getRGBA -FNF:3 -FNH:2 -FNDA:325,(anonymous_0) -FNDA:325,(anonymous_1) -FNDA:0,getRGBA -DA:3,1 -DA:5,1 -DA:7,325 -DA:10,325 -DA:11,325 -DA:12,325 -DA:13,325 -DA:15,325 -DA:18,325 -DA:19,325 -DA:24,0 -DA:26,0 -DA:27,0 -DA:28,0 -DA:29,0 -DA:31,0 -DA:32,0 -DA:33,0 -DA:34,0 -DA:36,0 -DA:38,0 -DA:39,0 -DA:41,0 -DA:42,0 -DA:43,0 -DA:45,0 -DA:46,0 -DA:48,0 -DA:49,0 -DA:56,0 -DA:57,0 -DA:59,0 -DA:60,0 -DA:61,0 -DA:62,0 -DA:63,0 -DA:65,0 -DA:66,0 -DA:67,0 -DA:68,0 -DA:70,0 -DA:71,0 -DA:72,0 -DA:73,0 -DA:74,0 -DA:76,0 -DA:77,0 -DA:78,0 -DA:79,0 -DA:81,0 -DA:88,0 -DA:89,0 -DA:90,0 -DA:91,0 -DA:95,0 -DA:99,0 -DA:105,0 -DA:108,0 -DA:109,0 -DA:110,0 -DA:112,0 -DA:115,0 -DA:116,0 -DA:117,0 -DA:118,0 -DA:119,0 -DA:120,0 -DA:123,0 -DA:124,0 -DA:125,0 -DA:126,0 -DA:127,0 -DA:130,0 -DA:134,0 -DA:135,0 -DA:136,0 -DA:137,0 -DA:138,0 -DA:141,0 -DA:142,0 -DA:143,0 -DA:146,0 -DA:149,0 -DA:152,0 -DA:153,0 -DA:157,0 -LF:86 -LH:10 -BRDA:10,0,0,325 -BRDA:10,0,1,0 -BRDA:18,1,0,325 -BRDA:18,1,1,0 -BRDA:18,2,0,325 -BRDA:18,2,1,0 -BRDA:18,2,2,0 -BRDA:24,3,0,0 -BRDA:24,3,1,0 -BRDA:28,4,0,0 -BRDA:28,4,1,0 -BRDA:28,5,0,0 -BRDA:28,5,1,0 -BRDA:32,6,0,0 -BRDA:32,6,1,0 -BRDA:41,7,0,0 -BRDA:41,7,1,0 -BRDA:42,8,0,0 -BRDA:42,8,1,0 -BRDA:45,9,0,0 -BRDA:45,9,1,0 -BRDA:48,10,0,0 -BRDA:48,10,1,0 -BRDA:57,11,0,0 -BRDA:57,11,1,0 -BRDA:57,11,2,0 -BRDA:57,11,3,0 -BRDA:57,11,4,0 -BRDA:88,12,0,0 -BRDA:88,12,1,0 -BRDA:89,13,0,0 -BRDA:89,13,1,0 -BRDA:112,14,0,0 -BRDA:112,14,1,0 -BRDA:112,14,2,0 -BRDA:112,14,3,0 -BRDA:112,14,4,0 -BRDA:115,15,0,0 -BRDA:115,15,1,0 -BRDA:119,16,0,0 -BRDA:119,16,1,0 -BRDA:126,17,0,0 -BRDA:126,17,1,0 -BRDA:135,18,0,0 -BRDA:135,18,1,0 -BRDA:137,19,0,0 -BRDA:137,19,1,0 -BRDA:142,20,0,0 -BRDA:142,20,1,0 -BRF:49 -BRH:3 -end_of_record -TN: -SF:lib\chunkstream.js -FN:6,(anonymous_0) -FN:20,(anonymous_1) -FN:28,(anonymous_2) -FN:41,(anonymous_3) -FN:67,(anonymous_4) -FN:90,(anonymous_5) -FN:98,(anonymous_6) -FN:110,(anonymous_7) -FN:132,(anonymous_8) -FN:163,(anonymous_9) -FNF:10 -FNH:10 -FNDA:529,(anonymous_0) -FNDA:13318,(anonymous_1) -FNDA:13318,(anonymous_2) -FNDA:943,(anonymous_3) -FNDA:311,(anonymous_4) -FNDA:311,(anonymous_5) -FNDA:327,(anonymous_6) -FNDA:741,(anonymous_7) -FNDA:12408,(anonymous_8) -FNDA:14263,(anonymous_9) -DA:3,1 -DA:4,1 -DA:6,1 -DA:7,529 -DA:9,529 -DA:10,529 -DA:12,529 -DA:13,529 -DA:15,529 -DA:16,529 -DA:18,1 -DA:20,1 -DA:21,13318 -DA:27,13318 -DA:29,13318 -DA:32,13318 -DA:33,0 -DA:35,0 -DA:41,1 -DA:42,943 -DA:43,0 -DA:44,0 -DA:48,943 -DA:49,943 -DA:51,0 -DA:54,943 -DA:55,943 -DA:57,943 -DA:60,943 -DA:61,346 -DA:64,943 -DA:67,1 -DA:68,311 -DA:69,0 -DA:72,311 -DA:75,311 -DA:76,0 -DA:80,311 -DA:81,309 -DA:83,2 -DA:84,2 -DA:88,1 -DA:90,1 -DA:91,311 -DA:92,3 -DA:95,311 -DA:98,1 -DA:99,327 -DA:100,0 -DA:103,327 -DA:104,327 -DA:105,327 -DA:107,327 -DA:110,1 -DA:112,741 -DA:115,741 -DA:118,741 -DA:119,568 -DA:120,568 -DA:122,568 -DA:125,173 -DA:126,173 -DA:128,173 -DA:132,1 -DA:133,12408 -DA:135,12408 -DA:136,12408 -DA:137,12408 -DA:140,12408 -DA:141,12617 -DA:142,12617 -DA:144,12617 -DA:145,12617 -DA:148,12617 -DA:149,11863 -DA:154,12408 -DA:155,532 -DA:158,12408 -DA:160,12408 -DA:163,1 -DA:164,14263 -DA:166,14263 -DA:167,15656 -DA:170,15656 -DA:171,741 -DA:172,14915 -DA:175,12408 -DA:179,2507 -DA:183,14263 -DA:184,2 -DA:187,0 -LF:91 -LH:82 -BRDA:32,0,0,0 -BRDA:32,0,1,13318 -BRDA:32,1,0,13318 -BRDA:32,1,1,10215 -BRDA:42,2,0,0 -BRDA:42,2,1,943 -BRDA:48,3,0,943 -BRDA:48,3,1,0 -BRDA:51,4,0,0 -BRDA:51,4,1,0 -BRDA:60,5,0,346 -BRDA:60,5,1,597 -BRDA:60,6,0,943 -BRDA:60,6,1,929 -BRDA:64,7,0,943 -BRDA:64,7,1,929 -BRDA:68,8,0,0 -BRDA:68,8,1,311 -BRDA:75,9,0,0 -BRDA:75,9,1,311 -BRDA:80,10,0,309 -BRDA:80,10,1,2 -BRDA:91,11,0,3 -BRDA:91,11,1,308 -BRDA:99,12,0,0 -BRDA:99,12,1,327 -BRDA:118,13,0,568 -BRDA:118,13,1,173 -BRDA:148,14,0,11863 -BRDA:148,14,1,754 -BRDA:154,15,0,532 -BRDA:154,15,1,11876 -BRDA:166,16,0,27412 -BRDA:166,16,1,15708 -BRDA:166,16,2,15671 -BRDA:170,17,0,741 -BRDA:170,17,1,14915 -BRDA:172,18,0,12408 -BRDA:172,18,1,2507 -BRDA:183,19,0,2 -BRDA:183,19,1,14261 -BRDA:183,20,0,14263 -BRDA:183,20,1,14213 -BRF:43 -BRH:35 -end_of_record -TN: -SF:lib\constants.js -FNF:0 -FNH:0 -DA:3,1 -LF:1 -LH:1 -BRF:0 -BRH:0 -end_of_record -TN: -SF:lib\crc.js -FN:5,(anonymous_0) -FN:19,(anonymous_1) -FN:23,(anonymous_2) -FN:30,(anonymous_3) -FN:34,(anonymous_4) -FNF:5 -FNH:5 -FNDA:1,(anonymous_0) -FNDA:2461,(anonymous_1) -FNDA:4839,(anonymous_2) -FNDA:2195,(anonymous_3) -FNDA:1592,(anonymous_4) -DA:3,1 -DA:5,1 -DA:6,1 -DA:7,256 -DA:8,256 -DA:9,2048 -DA:10,1024 -DA:12,1024 -DA:15,256 -DA:19,1 -DA:20,2461 -DA:23,1 -DA:24,4839 -DA:25,823519 -DA:27,4839 -DA:30,1 -DA:31,2195 -DA:34,1 -DA:35,1592 -DA:36,1592 -DA:37,305287 -DA:39,1592 -LF:22 -LH:22 -BRDA:9,0,0,1024 -BRDA:9,0,1,1024 -BRF:2 -BRH:2 -end_of_record -TN: -SF:lib\filter-pack.js -FN:5,filterNone -FN:11,filterSumNone -FN:21,filterSub -FN:30,filterSumSub -FN:42,filterUp -FN:51,filterSumUp -FN:64,filterAvg -FN:74,filterSumAvg -FN:87,filterPaeth -FN:99,filterSumPaeth -FN:130,(anonymous_10) -FNF:11 -FNH:11 -FNDA:44,filterNone -FNDA:10490,filterSumNone -FNDA:637,filterSub -FNDA:10490,filterSumSub -FNDA:2670,filterUp -FNDA:10490,filterSumUp -FNDA:208,filterAvg -FNDA:10490,filterSumAvg -FNDA:6931,filterPaeth -FNDA:10490,filterSumPaeth -FNDA:325,(anonymous_10) -DA:3,1 -DA:6,44 -DA:7,5136 -DA:12,10490 -DA:13,10490 -DA:15,10490 -DA:16,2776736 -DA:18,10490 -DA:22,637 -DA:23,107032 -DA:24,107032 -DA:26,107032 -DA:31,10490 -DA:32,10490 -DA:33,2776736 -DA:34,2776736 -DA:36,2776736 -DA:39,10490 -DA:43,2670 -DA:44,581344 -DA:45,581344 -DA:47,581344 -DA:52,10490 -DA:53,10490 -DA:54,10490 -DA:55,2776736 -DA:56,2776736 -DA:58,2776736 -DA:61,10490 -DA:65,208 -DA:66,204096 -DA:67,204096 -DA:68,204096 -DA:70,204096 -DA:75,10490 -DA:76,10490 -DA:77,2776736 -DA:78,2776736 -DA:79,2776736 -DA:81,2776736 -DA:84,10490 -DA:88,6931 -DA:89,1879128 -DA:90,1879128 -DA:92,1879128 -DA:93,1879128 -DA:95,1879128 -DA:100,10490 -DA:101,10490 -DA:102,2776736 -DA:103,2776736 -DA:105,2776736 -DA:106,2776736 -DA:108,2776736 -DA:111,10490 -DA:114,1 -DA:122,1 -DA:130,1 -DA:132,325 -DA:133,325 -DA:134,0 -DA:135,0 -DA:137,0 -DA:140,325 -DA:141,0 -DA:143,325 -DA:144,325 -DA:145,325 -DA:146,325 -DA:148,325 -DA:150,325 -DA:151,10490 -DA:153,10490 -DA:155,10490 -DA:156,52450 -DA:157,52450 -DA:158,35370 -DA:159,35370 -DA:164,10490 -DA:165,10490 -DA:166,10490 -DA:167,10490 -DA:168,10490 -DA:170,325 -LF:84 -LH:80 -BRDA:23,0,0,104484 -BRDA:23,0,1,2548 -BRDA:33,1,0,2734776 -BRDA:33,1,1,41960 -BRDA:44,2,0,581344 -BRDA:44,2,1,0 -BRDA:55,3,0,2734120 -BRDA:55,3,1,42616 -BRDA:66,4,0,203264 -BRDA:66,4,1,832 -BRDA:67,5,0,204096 -BRDA:67,5,1,0 -BRDA:77,6,0,2734776 -BRDA:77,6,1,41960 -BRDA:78,7,0,2734120 -BRDA:78,7,1,42616 -BRDA:89,8,0,1851404 -BRDA:89,8,1,27724 -BRDA:90,9,0,1879128 -BRDA:90,9,1,0 -BRDA:92,10,0,1851404 -BRDA:92,10,1,27724 -BRDA:92,11,0,1879128 -BRDA:92,11,1,1879128 -BRDA:102,12,0,2734776 -BRDA:102,12,1,41960 -BRDA:103,13,0,2734120 -BRDA:103,13,1,42616 -BRDA:105,14,0,2693460 -BRDA:105,14,1,83276 -BRDA:105,15,0,2776736 -BRDA:105,15,1,2734120 -BRDA:132,16,0,325 -BRDA:132,16,1,0 -BRDA:132,17,0,325 -BRDA:132,17,1,1 -BRDA:134,18,0,0 -BRDA:134,18,1,0 -BRDA:140,19,0,0 -BRDA:140,19,1,325 -BRDA:151,20,0,10490 -BRDA:151,20,1,0 -BRDA:157,21,0,35370 -BRDA:157,21,1,17080 -BRF:44 -BRH:36 -end_of_record -TN: -SF:lib\filter-parse-async.js -FN:7,(anonymous_0) -FN:14,(anonymous_1) -FN:17,(anonymous_2) -FNF:3 -FNH:3 -FNDA:176,(anonymous_0) -FNDA:9057,(anonymous_1) -FNDA:173,(anonymous_2) -DA:3,1 -DA:4,1 -DA:5,1 -DA:7,1 -DA:8,176 -DA:10,176 -DA:11,176 -DA:12,176 -DA:15,9057 -DA:18,173 -DA:22,176 -DA:24,1 -LF:12 -LH:12 -BRF:0 -BRH:0 -end_of_record -TN: -SF:lib\filter-parse-sync.js -FN:6,(anonymous_0) -FN:11,(anonymous_1) -FN:14,(anonymous_2) -FNF:3 -FNH:3 -FNDA:162,(anonymous_0) -FNDA:6337,(anonymous_1) -FNDA:162,(anonymous_2) -DA:3,1 -DA:4,1 -DA:6,1 -DA:7,162 -DA:8,162 -DA:9,162 -DA:12,6337 -DA:17,162 -DA:18,162 -DA:20,162 -LF:10 -LH:10 -BRF:0 -BRH:0 -end_of_record -TN: -SF:lib\filter-parse.js -FN:6,getByteWidth -FN:14,(anonymous_1) -FN:57,(anonymous_2) -FN:64,(anonymous_3) -FN:79,(anonymous_4) -FN:93,(anonymous_5) -FN:111,(anonymous_6) -FN:130,(anonymous_7) -FNF:8 -FNH:8 -FNDA:742,getByteWidth -FNDA:338,(anonymous_1) -FNDA:338,(anonymous_2) -FNDA:1939,(anonymous_3) -FNDA:800,(anonymous_4) -FNDA:172,(anonymous_5) -FNDA:4165,(anonymous_6) -FNDA:15394,(anonymous_7) -DA:3,1 -DA:4,1 -DA:7,742 -DA:8,742 -DA:9,531 -DA:11,742 -DA:14,1 -DA:15,338 -DA:16,338 -DA:17,338 -DA:18,338 -DA:19,338 -DA:21,338 -DA:22,338 -DA:23,338 -DA:25,338 -DA:26,338 -DA:27,338 -DA:28,72 -DA:29,72 -DA:30,476 -DA:37,266 -DA:48,338 -DA:49,127 -DA:50,211 -DA:51,66 -DA:53,145 -DA:57,1 -DA:58,338 -DA:64,1 -DA:69,1939 -DA:70,1939 -DA:72,1939 -DA:73,3563504 -DA:74,3563504 -DA:75,3563504 -DA:79,1 -DA:84,800 -DA:86,800 -DA:87,330256 -DA:88,330256 -DA:89,330256 -DA:93,1 -DA:98,172 -DA:99,172 -DA:100,172 -DA:102,172 -DA:103,9952 -DA:104,9952 -DA:105,9952 -DA:106,9952 -DA:107,9952 -DA:111,1 -DA:116,4165 -DA:117,4165 -DA:118,4165 -DA:120,4165 -DA:121,1152544 -DA:122,1152544 -DA:123,1152544 -DA:124,1152544 -DA:125,1152544 -DA:126,1152544 -DA:130,1 -DA:131,15394 -DA:133,15394 -DA:134,15394 -DA:136,15394 -DA:137,8318 -DA:139,7076 -DA:141,7076 -DA:143,1939 -DA:144,1939 -DA:146,800 -DA:147,800 -DA:149,172 -DA:150,172 -DA:152,4165 -DA:153,4165 -DA:155,0 -DA:159,15394 -DA:161,15394 -DA:162,15394 -DA:163,739 -DA:164,739 -DA:165,739 -DA:167,14655 -DA:170,15394 -DA:172,15059 -DA:174,335 -DA:175,335 -LF:91 -LH:90 -BRDA:8,0,0,531 -BRDA:8,0,1,211 -BRDA:27,1,0,72 -BRDA:27,1,1,266 -BRDA:48,2,0,127 -BRDA:48,2,1,211 -BRDA:50,3,0,66 -BRDA:50,3,1,145 -BRDA:74,4,0,3557696 -BRDA:74,4,1,5808 -BRDA:88,5,0,330000 -BRDA:88,5,1,256 -BRDA:104,6,0,9536 -BRDA:104,6,1,416 -BRDA:105,7,0,9554 -BRDA:105,7,1,398 -BRDA:122,8,0,1152288 -BRDA:122,8,1,256 -BRDA:123,9,0,1137296 -BRDA:123,9,1,15248 -BRDA:124,10,0,1137048 -BRDA:124,10,1,15496 -BRDA:124,11,0,1152544 -BRDA:124,11,1,1137296 -BRDA:136,12,0,8318 -BRDA:136,12,1,7076 -BRDA:141,13,0,1939 -BRDA:141,13,1,800 -BRDA:141,13,2,172 -BRDA:141,13,3,4165 -BRDA:141,13,4,0 -BRDA:162,14,0,739 -BRDA:162,14,1,14655 -BRDA:170,15,0,15059 -BRDA:170,15,1,335 -BRF:35 -BRH:34 -end_of_record -TN: -SF:lib\format-normaliser.js -FN:3,dePalette -FN:22,replaceTransparentColor -FN:49,scaleDepth -FN:66,(anonymous_3) -FNF:4 -FNH:4 -FNDA:131,dePalette -FNDA:12,replaceTransparentColor -FNDA:106,scaleDepth -FNDA:335,(anonymous_3) -DA:4,131 -DA:6,131 -DA:7,4912 -DA:8,1418436 -DA:10,1418436 -DA:11,0 -DA:14,1418436 -DA:15,5673744 -DA:17,1418436 -DA:23,12 -DA:24,12 -DA:25,384 -DA:26,12288 -DA:28,12288 -DA:29,6144 -DA:30,2762 -DA:32,6144 -DA:37,2718 -DA:39,12288 -DA:40,5480 -DA:41,21920 -DA:44,12288 -DA:50,106 -DA:51,106 -DA:52,106 -DA:54,106 -DA:55,3392 -DA:56,108544 -DA:57,434176 -DA:61,108544 -DA:66,1 -DA:67,335 -DA:68,335 -DA:69,335 -DA:70,335 -DA:71,335 -DA:72,335 -DA:74,335 -DA:76,335 -DA:78,131 -DA:80,204 -DA:81,12 -DA:84,204 -DA:86,106 -DA:87,66 -DA:89,106 -DA:92,335 -LF:47 -LH:46 -BRDA:10,0,0,0 -BRDA:10,0,1,1418436 -BRDA:28,1,0,6144 -BRDA:28,1,1,6144 -BRDA:29,2,0,2762 -BRDA:29,2,1,3382 -BRDA:32,3,0,2718 -BRDA:32,3,1,3426 -BRDA:33,4,0,6144 -BRDA:33,4,1,2718 -BRDA:33,4,2,2718 -BRDA:39,5,0,5480 -BRDA:39,5,1,6808 -BRDA:76,6,0,131 -BRDA:76,6,1,204 -BRDA:80,7,0,12 -BRDA:80,7,1,192 -BRDA:84,8,0,106 -BRDA:84,8,1,98 -BRDA:86,9,0,66 -BRDA:86,9,1,40 -BRF:21 -BRH:20 -end_of_record -TN: -SF:lib\interlace.js -FN:52,(anonymous_0) -FN:83,(anonymous_1) -FN:84,(anonymous_2) -FNF:3 -FNH:3 -FNDA:144,(anonymous_0) -FNDA:72,(anonymous_1) -FNDA:324850,(anonymous_2) -DA:14,1 -DA:52,1 -DA:53,144 -DA:54,144 -DA:55,144 -DA:56,144 -DA:57,144 -DA:58,144 -DA:59,1008 -DA:60,1008 -DA:61,1008 -DA:62,1008 -DA:63,1556 -DA:64,672 -DA:66,884 -DA:69,1008 -DA:70,1360 -DA:71,552 -DA:73,808 -DA:76,1008 -DA:77,952 -DA:80,144 -DA:83,1 -DA:84,72 -DA:85,324850 -DA:87,324850 -DA:89,324850 -DA:91,324850 -DA:93,324850 -LF:29 -LH:29 -BRDA:63,0,0,672 -BRDA:63,0,1,884 -BRDA:70,1,0,552 -BRDA:70,1,1,808 -BRDA:76,2,0,952 -BRDA:76,2,1,56 -BRDA:76,3,0,1008 -BRDA:76,3,1,980 -BRF:8 -BRH:8 -end_of_record -TN: -SF:lib\packer-async.js -FN:8,(anonymous_0) -FN:20,(anonymous_1) -FN:36,(anonymous_2) -FN:43,(anonymous_3) -FNF:4 -FNH:4 -FNDA:353,(anonymous_0) -FNDA:325,(anonymous_1) -FNDA:652,(anonymous_2) -FNDA:325,(anonymous_3) -DA:3,1 -DA:4,1 -DA:5,1 -DA:6,1 -DA:8,1 -DA:9,353 -DA:11,353 -DA:13,353 -DA:14,353 -DA:16,353 -DA:18,1 -DA:20,1 -DA:22,325 -DA:23,325 -DA:25,325 -DA:26,290 -DA:29,325 -DA:32,325 -DA:34,325 -DA:37,652 -DA:41,325 -DA:44,325 -DA:45,325 -DA:49,325 -LF:24 -LH:24 -BRDA:11,0,0,353 -BRDA:11,0,1,0 -BRDA:25,1,0,290 -BRDA:25,1,1,35 -BRF:4 -BRH:3 -end_of_record -TN: -SF:lib\packer-sync.js -FN:11,(anonymous_0) -FNF:1 -FNH:0 -FNDA:0,(anonymous_0) -DA:3,1 -DA:4,1 -DA:5,1 -DA:6,0 -DA:8,1 -DA:9,1 -DA:11,1 -DA:12,0 -DA:13,0 -DA:18,0 -DA:20,0 -DA:22,0 -DA:25,0 -DA:28,0 -DA:30,0 -DA:31,0 -DA:34,0 -DA:41,0 -DA:45,0 -DA:47,0 -DA:48,0 -DA:50,0 -DA:53,0 -DA:55,0 -LF:24 -LH:6 -BRDA:5,0,0,0 -BRDA:5,0,1,1 -BRDA:12,1,0,0 -BRDA:12,1,1,0 -BRDA:18,2,0,0 -BRDA:18,2,1,0 -BRDA:30,3,0,0 -BRDA:30,3,1,0 -BRDA:47,4,0,0 -BRDA:47,4,1,0 -BRDA:47,5,0,0 -BRDA:47,5,1,0 -BRF:12 -BRH:1 -end_of_record -TN: -SF:lib\packer.js -FN:9,(anonymous_0) -FN:64,(anonymous_1) -FN:72,(anonymous_2) -FN:76,(anonymous_3) -FN:86,(anonymous_4) -FN:104,(anonymous_5) -FN:110,(anonymous_6) -FN:123,(anonymous_7) -FN:127,(anonymous_8) -FNF:9 -FNH:9 -FNDA:353,(anonymous_0) -FNDA:353,(anonymous_1) -FNDA:353,(anonymous_2) -FNDA:325,(anonymous_3) -FNDA:1592,(anonymous_4) -FNDA:290,(anonymous_5) -FNDA:325,(anonymous_6) -FNDA:652,(anonymous_7) -FNDA:325,(anonymous_8) -DA:3,1 -DA:4,1 -DA:5,1 -DA:6,1 -DA:7,1 -DA:9,1 -DA:10,353 -DA:12,353 -DA:13,353 -DA:15,353 -DA:17,353 -DA:19,353 -DA:20,353 -DA:22,353 -DA:26,353 -DA:31,353 -DA:39,0 -DA:43,353 -DA:51,0 -DA:57,353 -DA:58,0 -DA:64,1 -DA:65,353 -DA:72,1 -DA:73,353 -DA:76,1 -DA:78,325 -DA:81,325 -DA:82,325 -DA:83,325 -DA:86,1 -DA:87,1592 -DA:88,1592 -DA:90,1592 -DA:91,1592 -DA:93,1592 -DA:94,1267 -DA:97,1592 -DA:101,1592 -DA:104,1 -DA:105,290 -DA:106,290 -DA:107,290 -DA:110,1 -DA:111,325 -DA:112,325 -DA:113,325 -DA:114,325 -DA:115,325 -DA:116,325 -DA:117,325 -DA:118,325 -DA:120,325 -DA:123,1 -DA:124,652 -DA:127,1 -DA:128,325 -LF:57 -LH:54 -BRDA:12,0,0,353 -BRDA:12,0,1,353 -BRDA:14,1,0,0 -BRDA:14,1,1,353 -BRDA:16,2,0,0 -BRDA:16,2,1,353 -BRDA:18,3,0,0 -BRDA:18,3,1,353 -BRDA:19,4,0,353 -BRDA:19,4,1,353 -BRDA:20,5,0,353 -BRDA:20,5,1,353 -BRDA:23,6,0,0 -BRDA:23,6,1,353 -BRDA:27,7,0,0 -BRDA:27,7,1,353 -BRDA:31,8,0,0 -BRDA:31,8,1,353 -BRDA:43,9,0,0 -BRDA:43,9,1,353 -BRDA:57,10,0,0 -BRDA:57,10,1,353 -BRDA:57,11,0,353 -BRDA:57,11,1,0 -BRDA:87,12,0,1267 -BRDA:87,12,1,325 -BRDA:93,13,0,1267 -BRDA:93,13,1,325 -BRF:28 -BRH:19 -end_of_record -TN: -SF:lib\paeth-predictor.js -FN:3,paethPredictor -FNF:1 -FNH:1 -FNDA:5808408,paethPredictor -DA:3,1 -DA:4,5808408 -DA:5,5808408 -DA:6,5808408 -DA:7,5808408 -DA:9,5808408 -DA:10,5156742 -DA:12,651666 -DA:13,539893 -DA:15,111773 -LF:10 -LH:10 -BRDA:9,0,0,5156742 -BRDA:9,0,1,651666 -BRDA:9,1,0,5808408 -BRDA:9,1,1,5231305 -BRDA:12,2,0,539893 -BRDA:12,2,1,111773 -BRF:6 -BRH:6 -end_of_record -TN: -SF:lib\parser-async.js -FN:11,(anonymous_0) -FN:33,(anonymous_1) -FN:49,(anonymous_2) -FN:55,(anonymous_3) -FN:79,(anonymous_4) -FN:89,(anonymous_5) -FN:109,(anonymous_6) -FN:116,(anonymous_7) -FN:120,(anonymous_8) -FN:124,(anonymous_9) -FN:128,(anonymous_10) -FN:134,(anonymous_11) -FN:147,(anonymous_12) -FNF:13 -FNH:11 -FNDA:353,(anonymous_0) -FNDA:14,(anonymous_1) -FNDA:0,(anonymous_2) -FNDA:741,(anonymous_3) -FNDA:0,(anonymous_4) -FNDA:487,(anonymous_5) -FNDA:176,(anonymous_6) -FNDA:7,(anonymous_7) -FNDA:77,(anonymous_8) -FNDA:15,(anonymous_9) -FNDA:174,(anonymous_10) -FNDA:173,(anonymous_11) -FNDA:173,(anonymous_12) -DA:3,1 -DA:4,1 -DA:5,1 -DA:6,1 -DA:7,1 -DA:8,1 -DA:9,1 -DA:11,1 -DA:12,353 -DA:14,353 -DA:26,353 -DA:27,353 -DA:29,353 -DA:31,1 -DA:33,1 -DA:34,14 -DA:36,14 -DA:38,14 -DA:40,14 -DA:41,1 -DA:44,14 -DA:45,2 -DA:49,2 -DA:52,14 -DA:55,1 -DA:56,741 -DA:57,174 -DA:58,36 -DA:60,36 -DA:61,36 -DA:63,36 -DA:66,138 -DA:72,138 -DA:73,138 -DA:75,138 -DA:76,138 -DA:78,138 -DA:79,138 -DA:80,0 -DA:81,0 -DA:84,0 -DA:86,138 -DA:88,138 -DA:89,138 -DA:90,487 -DA:91,0 -DA:94,487 -DA:95,0 -DA:98,487 -DA:100,487 -DA:103,138 -DA:106,741 -DA:109,1 -DA:110,176 -DA:111,176 -DA:113,176 -DA:116,1 -DA:117,7 -DA:120,1 -DA:121,77 -DA:124,1 -DA:125,15 -DA:128,1 -DA:131,174 -DA:134,1 -DA:135,173 -DA:136,0 -DA:139,173 -DA:140,1 -DA:143,172 -DA:147,1 -DA:148,173 -DA:149,0 -DA:154,173 -DA:155,173 -DA:157,173 -DA:158,173 -DA:160,0 -DA:161,0 -DA:164,173 -LF:80 -LH:71 -BRDA:40,0,0,1 -BRDA:40,0,1,13 -BRDA:40,1,0,14 -BRDA:40,1,1,1 -BRDA:44,2,0,2 -BRDA:44,2,1,12 -BRDA:56,3,0,174 -BRDA:56,3,1,567 -BRDA:57,4,0,36 -BRDA:57,4,1,138 -BRDA:80,5,0,0 -BRDA:80,5,1,0 -BRDA:90,6,0,0 -BRDA:90,6,1,487 -BRDA:94,7,0,0 -BRDA:94,7,1,487 -BRDA:135,8,0,0 -BRDA:135,8,1,173 -BRDA:139,9,0,1 -BRDA:139,9,1,172 -BRDA:148,10,0,0 -BRDA:148,10,1,173 -BRF:22 -BRH:16 -end_of_record -TN: -SF:lib\parser-sync.js -FN:15,(anonymous_0) -FN:23,handleError -FN:28,handleMetaData -FN:32,handleTransColor -FN:36,handlePalette -FN:40,handleSimpleTransparency -FN:45,handleGamma -FN:50,handleInflateData -FNF:8 -FNH:8 -FNDA:176,(anonymous_0) -FNDA:13,handleError -FNDA:165,handleMetaData -FNDA:5,handleTransColor -FNDA:73,handlePalette -FNDA:12,handleSimpleTransparency -FNDA:147,handleGamma -FNDA:492,handleInflateData -DA:3,1 -DA:4,1 -DA:5,1 -DA:6,1 -DA:7,0 -DA:9,1 -DA:10,1 -DA:11,1 -DA:12,1 -DA:13,1 -DA:15,1 -DA:16,176 -DA:17,0 -DA:24,13 -DA:29,165 -DA:33,5 -DA:37,73 -DA:41,12 -DA:46,147 -DA:49,176 -DA:51,492 -DA:54,176 -DA:56,176 -DA:67,176 -DA:68,176 -DA:70,176 -DA:71,13 -DA:75,163 -DA:76,163 -DA:79,163 -DA:80,36 -DA:83,127 -DA:84,127 -DA:85,127 -DA:90,162 -DA:92,162 -DA:93,0 -DA:96,162 -DA:97,162 -DA:99,162 -DA:100,162 -DA:102,162 -DA:104,162 -DA:105,162 -DA:107,162 -LF:45 -LH:42 -BRDA:6,0,0,0 -BRDA:6,0,1,1 -BRDA:16,1,0,0 -BRDA:16,1,1,176 -BRDA:70,2,0,13 -BRDA:70,2,1,163 -BRDA:79,3,0,36 -BRDA:79,3,1,127 -BRDA:92,4,0,0 -BRDA:92,4,1,162 -BRDA:92,5,0,162 -BRDA:92,5,1,162 -BRDA:105,6,0,162 -BRDA:105,6,1,17 -BRF:14 -BRH:11 -end_of_record -TN: -SF:lib\parser.js -FN:6,(anonymous_0) -FN:36,(anonymous_1) -FN:39,(anonymous_2) -FN:43,(anonymous_3) -FN:55,(anonymous_4) -FN:93,(anonymous_5) -FN:97,(anonymous_6) -FN:101,(anonymous_7) -FN:116,(anonymous_8) -FN:119,(anonymous_9) -FN:183,(anonymous_10) -FN:186,(anonymous_11) -FN:201,(anonymous_12) -FN:205,(anonymous_13) -FN:241,(anonymous_14) -FN:244,(anonymous_15) -FN:251,(anonymous_16) -FN:258,(anonymous_17) -FN:278,(anonymous_18) -FN:281,(anonymous_19) -FNF:20 -FNH:20 -FNDA:529,(anonymous_0) -FNDA:163,(anonymous_1) -FNDA:529,(anonymous_2) -FNDA:365,(anonymous_3) -FNDA:2461,(anonymous_4) -FNDA:256,(anonymous_5) -FNDA:2195,(anonymous_6) -FNDA:2195,(anonymous_7) -FNDA:351,(anonymous_8) -FNDA:351,(anonymous_9) -FNDA:135,(anonymous_10) -FNDA:135,(anonymous_11) -FNDA:27,(anonymous_12) -FNDA:27,(anonymous_13) -FNDA:296,(anonymous_14) -FNDA:296,(anonymous_15) -FNDA:1233,(anonymous_16) -FNDA:1233,(anonymous_17) -FNDA:336,(anonymous_18) -FNDA:336,(anonymous_19) -DA:3,1 -DA:4,1 -DA:6,1 -DA:7,529 -DA:8,529 -DA:10,529 -DA:11,529 -DA:12,529 -DA:15,529 -DA:16,529 -DA:18,529 -DA:19,529 -DA:20,529 -DA:21,529 -DA:22,529 -DA:23,529 -DA:24,529 -DA:26,529 -DA:27,529 -DA:28,529 -DA:29,529 -DA:30,529 -DA:31,529 -DA:32,529 -DA:33,529 -DA:34,529 -DA:35,529 -DA:36,529 -DA:39,1 -DA:40,529 -DA:43,1 -DA:44,365 -DA:46,365 -DA:47,2867 -DA:48,13 -DA:49,13 -DA:52,352 -DA:55,1 -DA:57,2461 -DA:60,2461 -DA:61,2461 -DA:62,2461 -DA:63,9844 -DA:69,2461 -DA:73,2461 -DA:74,0 -DA:75,0 -DA:78,2461 -DA:79,2461 -DA:81,2461 -DA:82,2205 -DA:85,256 -DA:86,0 -DA:87,0 -DA:90,256 -DA:93,1 -DA:94,256 -DA:97,1 -DA:98,2195 -DA:101,1 -DA:102,2195 -DA:103,2195 -DA:106,2195 -DA:107,4 -DA:108,4 -DA:111,2191 -DA:112,1855 -DA:116,1 -DA:117,351 -DA:119,1 -DA:120,351 -DA:122,351 -DA:123,351 -DA:124,351 -DA:125,351 -DA:126,351 -DA:127,351 -DA:128,351 -DA:135,351 -DA:142,6 -DA:143,6 -DA:145,345 -DA:146,4 -DA:147,4 -DA:149,341 -DA:150,0 -DA:151,0 -DA:153,341 -DA:154,0 -DA:155,0 -DA:157,341 -DA:158,0 -DA:159,0 -DA:162,341 -DA:164,341 -DA:166,341 -DA:168,341 -DA:180,341 -DA:183,1 -DA:184,135 -DA:186,1 -DA:187,135 -DA:189,135 -DA:192,135 -DA:193,7350 -DA:196,135 -DA:198,135 -DA:201,1 -DA:202,27 -DA:203,27 -DA:205,1 -DA:206,27 -DA:209,27 -DA:210,15 -DA:211,0 -DA:212,0 -DA:214,15 -DA:215,0 -DA:216,0 -DA:218,15 -DA:219,529 -DA:221,15 -DA:226,27 -DA:228,6 -DA:230,27 -DA:231,6 -DA:238,27 -DA:241,1 -DA:242,296 -DA:244,1 -DA:245,296 -DA:246,296 -DA:248,296 -DA:251,1 -DA:252,1233 -DA:253,337 -DA:254,337 -DA:256,1233 -DA:258,1 -DA:259,1233 -DA:261,1233 -DA:265,0 -DA:268,1233 -DA:269,1233 -DA:271,1233 -DA:272,173 -DA:274,1060 -DA:278,1 -DA:279,336 -DA:281,1 -DA:282,336 -DA:284,336 -DA:285,336 -DA:287,336 -DA:288,173 -LF:155 -LH:140 -BRDA:36,0,0,529 -BRDA:36,0,1,176 -BRDA:47,1,0,13 -BRDA:47,1,1,2854 -BRDA:73,2,0,0 -BRDA:73,2,1,2461 -BRDA:73,3,0,2461 -BRDA:73,3,1,351 -BRDA:81,4,0,2205 -BRDA:81,4,1,256 -BRDA:85,5,0,0 -BRDA:85,5,1,256 -BRDA:106,6,0,4 -BRDA:106,6,1,2191 -BRDA:106,7,0,2195 -BRDA:106,7,1,2195 -BRDA:111,8,0,1855 -BRDA:111,8,1,336 -BRDA:135,9,0,6 -BRDA:135,9,1,345 -BRDA:136,10,0,351 -BRDA:136,10,1,219 -BRDA:136,10,2,132 -BRDA:136,10,3,101 -BRDA:136,10,4,72 -BRDA:145,11,0,4 -BRDA:145,11,1,341 -BRDA:149,12,0,0 -BRDA:149,12,1,341 -BRDA:153,13,0,0 -BRDA:153,13,1,341 -BRDA:157,14,0,0 -BRDA:157,14,1,341 -BRDA:157,15,0,341 -BRDA:157,15,1,72 -BRDA:209,16,0,15 -BRDA:209,16,1,12 -BRDA:210,17,0,0 -BRDA:210,17,1,15 -BRDA:214,18,0,0 -BRDA:214,18,1,15 -BRDA:226,19,0,6 -BRDA:226,19,1,21 -BRDA:230,20,0,6 -BRDA:230,20,1,21 -BRDA:252,21,0,337 -BRDA:252,21,1,896 -BRDA:261,22,0,0 -BRDA:261,22,1,1233 -BRDA:262,23,0,1233 -BRDA:262,23,1,131 -BRDA:271,24,0,173 -BRDA:271,24,1,1060 -BRDA:287,25,0,173 -BRDA:287,25,1,163 -BRF:55 -BRH:47 -end_of_record -TN: -SF:lib\png-sync.js -FN:6,(anonymous_0) -FN:10,(anonymous_1) -FNF:2 -FNH:1 -FNDA:176,(anonymous_0) -FNDA:0,(anonymous_1) -DA:3,1 -DA:4,1 -DA:6,1 -DA:7,176 -DA:10,1 -DA:11,0 -LF:6 -LH:5 -BRDA:7,0,0,176 -BRDA:7,0,1,176 -BRF:2 -BRH:2 -end_of_record -TN: -SF:lib\png.js -FN:9,(anonymous_0) -FN:38,(anonymous_1) -FN:54,(anonymous_2) -FN:61,(anonymous_3) -FN:69,(anonymous_4) -FN:73,(anonymous_5) -FN:80,(anonymous_6) -FN:94,(anonymous_7) -FN:99,(anonymous_8) -FN:103,(anonymous_9) -FN:110,(anonymous_10) -FN:114,(anonymous_11) -FN:120,(anonymous_12) -FN:160,(anonymous_13) -FN:175,(anonymous_14) -FN:192,(anonymous_15) -FNF:16 -FNH:9 -FNDA:353,(anonymous_0) -FNDA:173,(anonymous_1) -FNDA:325,(anonymous_2) -FNDA:325,(anonymous_3) -FNDA:0,(anonymous_4) -FNDA:0,(anonymous_5) -FNDA:0,(anonymous_6) -FNDA:412,(anonymous_7) -FNDA:175,(anonymous_8) -FNDA:174,(anonymous_9) -FNDA:149,(anonymous_10) -FNDA:378,(anonymous_11) -FNDA:0,(anonymous_12) -FNDA:0,(anonymous_13) -FNDA:0,(anonymous_14) -FNDA:0,(anonymous_15) -DA:3,1 -DA:4,1 -DA:5,1 -DA:6,1 -DA:7,1 -DA:9,1 -DA:10,353 -DA:12,353 -DA:15,353 -DA:16,353 -DA:18,353 -DA:23,353 -DA:24,0 -DA:27,353 -DA:28,353 -DA:30,353 -DA:32,353 -DA:33,353 -DA:34,353 -DA:35,353 -DA:36,353 -DA:39,173 -DA:40,173 -DA:44,353 -DA:45,353 -DA:46,353 -DA:47,353 -DA:48,353 -DA:50,1 -DA:52,1 -DA:54,1 -DA:55,325 -DA:56,0 -DA:57,0 -DA:60,325 -DA:62,325 -DA:66,325 -DA:69,1 -DA:70,0 -DA:73,0 -DA:74,0 -DA:76,0 -DA:77,0 -DA:80,0 -DA:81,0 -DA:83,0 -DA:86,0 -DA:87,0 -DA:90,0 -DA:91,0 -DA:94,1 -DA:95,412 -DA:96,412 -DA:99,1 -DA:100,175 -DA:103,1 -DA:104,174 -DA:105,174 -DA:107,174 -DA:110,1 -DA:111,149 -DA:114,1 -DA:115,378 -DA:116,0 -DA:120,1 -DA:124,0 -DA:125,0 -DA:126,0 -DA:127,0 -DA:128,0 -DA:129,0 -DA:132,0 -DA:138,0 -DA:141,0 -DA:147,0 -DA:150,0 -DA:151,0 -DA:160,1 -DA:171,0 -DA:172,0 -DA:175,1 -DA:176,0 -DA:177,0 -DA:178,0 -DA:179,0 -DA:181,0 -DA:182,0 -DA:183,0 -DA:184,0 -DA:188,0 -DA:192,1 -DA:193,0 -LF:92 -LH:52 -BRDA:12,0,0,353 -BRDA:12,0,1,348 -BRDA:19,1,0,1 -BRDA:19,1,1,352 -BRDA:19,2,0,353 -BRDA:19,2,1,1 -BRDA:23,3,0,0 -BRDA:23,3,1,353 -BRDA:23,4,0,353 -BRDA:23,4,1,0 -BRDA:55,5,0,0 -BRDA:55,5,1,325 -BRDA:55,6,0,325 -BRDA:55,6,1,325 -BRDA:70,7,0,0 -BRDA:70,7,1,0 -BRDA:115,8,0,0 -BRDA:115,8,1,378 -BRDA:115,9,0,378 -BRDA:115,9,1,378 -BRDA:132,10,0,0 -BRDA:132,10,1,0 -BRDA:133,11,0,0 -BRDA:133,11,1,0 -BRDA:133,11,2,0 -BRDA:133,11,3,0 -BRDA:141,12,0,0 -BRDA:141,12,1,0 -BRDA:142,13,0,0 -BRDA:142,13,1,0 -BRDA:142,13,2,0 -BRDA:142,13,3,0 -BRDA:176,14,0,0 -BRDA:176,14,1,0 -BRF:34 -BRH:14 -end_of_record -TN: -SF:lib\sync-inflate.js -FN:9,Inflate -FN:29,createInflate -FN:33,_close -FN:47,(anonymous_3) -FN:63,(anonymous_4) -FN:67,handleChunk -FN:145,zlibBufferSync -FN:161,inflateSync -FNF:8 -FNH:7 -FNDA:127,Inflate -FNDA:0,createInflate -FNDA:126,_close -FNDA:127,(anonymous_3) -FNDA:1,(anonymous_4) -FNDA:126,handleChunk -FNDA:127,zlibBufferSync -FNDA:127,inflateSync -DA:3,1 -DA:4,1 -DA:5,1 -DA:7,1 -DA:10,127 -DA:11,0 -DA:14,127 -DA:15,9 -DA:18,127 -DA:21,127 -DA:22,127 -DA:24,127 -DA:25,127 -DA:30,0 -DA:34,126 -DA:35,0 -DA:39,126 -DA:40,0 -DA:43,126 -DA:44,126 -DA:47,1 -DA:48,127 -DA:49,0 -DA:52,127 -DA:54,127 -DA:55,127 -DA:56,127 -DA:57,127 -DA:59,127 -DA:60,127 -DA:63,127 -DA:64,1 -DA:68,126 -DA:69,0 -DA:72,126 -DA:73,126 -DA:75,126 -DA:76,126 -DA:77,126 -DA:79,126 -DA:80,9 -DA:83,126 -DA:84,126 -DA:85,126 -DA:87,126 -DA:88,126 -DA:92,0 -DA:93,0 -DA:94,0 -DA:95,0 -DA:98,0 -DA:99,0 -DA:100,0 -DA:102,0 -DA:105,0 -DA:108,127 -DA:110,127 -DA:111,127 -DA:121,127 -DA:124,127 -DA:125,1 -DA:128,126 -DA:129,0 -DA:130,0 -DA:137,126 -DA:138,126 -DA:140,126 -DA:143,1 -DA:146,127 -DA:147,0 -DA:149,127 -DA:150,0 -DA:153,127 -DA:154,127 -DA:155,0 -DA:158,127 -DA:162,127 -DA:165,1 -DA:166,1 -DA:167,1 -DA:168,1 -LF:81 -LH:61 -BRDA:10,0,0,0 -BRDA:10,0,1,127 -BRDA:14,1,0,9 -BRDA:14,1,1,118 -BRDA:14,2,0,127 -BRDA:14,2,1,127 -BRDA:21,3,0,127 -BRDA:21,3,1,0 -BRDA:22,4,0,127 -BRDA:22,4,1,127 -BRDA:24,5,0,127 -BRDA:24,5,1,0 -BRDA:24,6,0,127 -BRDA:24,6,1,127 -BRDA:34,7,0,0 -BRDA:34,7,1,126 -BRDA:39,8,0,0 -BRDA:39,8,1,126 -BRDA:48,9,0,0 -BRDA:48,9,1,127 -BRDA:54,10,0,127 -BRDA:54,10,1,127 -BRDA:68,11,0,0 -BRDA:68,11,1,126 -BRDA:75,12,0,126 -BRDA:75,12,1,0 -BRDA:79,13,0,9 -BRDA:79,13,1,117 -BRDA:87,14,0,126 -BRDA:87,14,1,0 -BRDA:92,15,0,0 -BRDA:92,15,1,0 -BRDA:92,16,0,0 -BRDA:92,16,1,0 -BRDA:98,17,0,0 -BRDA:98,17,1,0 -BRDA:122,18,0,127 -BRDA:122,18,1,126 -BRDA:121,19,0,127 -BRDA:121,19,1,127 -BRDA:124,20,0,1 -BRDA:124,20,1,126 -BRDA:128,21,0,0 -BRDA:128,21,1,126 -BRDA:146,22,0,0 -BRDA:146,22,1,127 -BRDA:149,23,0,0 -BRDA:149,23,1,127 -BRDA:154,24,0,0 -BRDA:154,24,1,127 -BRF:50 -BRH:31 -end_of_record -TN: -SF:lib\sync-reader.js -FN:3,(anonymous_0) -FN:8,(anonymous_1) -FN:16,(anonymous_2) -FNF:3 -FNH:3 -FNDA:338,(anonymous_0) -FNDA:9900,(anonymous_1) -FNDA:338,(anonymous_2) -DA:3,1 -DA:4,338 -DA:5,338 -DA:8,1 -DA:9,9900 -DA:16,1 -DA:18,338 -DA:19,9900 -DA:21,9900 -DA:26,9900 -DA:28,9900 -DA:30,9900 -DA:32,9900 -DA:34,0 -DA:38,338 -DA:39,0 -DA:42,338 -DA:43,13 -LF:18 -LH:16 -BRDA:18,0,0,10238 -BRDA:18,0,1,9900 -BRDA:21,1,0,9900 -BRDA:21,1,1,0 -BRDA:22,2,0,9900 -BRDA:22,2,1,9900 -BRDA:22,2,2,0 -BRDA:38,3,0,0 -BRDA:38,3,1,338 -BRDA:42,4,0,13 -BRDA:42,4,1,325 -BRF:11 -BRH:8 -end_of_record diff --git a/node_modules/pngjs/lib/bitmapper.js b/node_modules/pngjs/lib/bitmapper.js deleted file mode 100644 index 18378a0..0000000 --- a/node_modules/pngjs/lib/bitmapper.js +++ /dev/null @@ -1,267 +0,0 @@ -"use strict"; - -let interlaceUtils = require("./interlace"); - -let pixelBppMapper = [ - // 0 - dummy entry - function () {}, - - // 1 - L - // 0: 0, 1: 0, 2: 0, 3: 0xff - function (pxData, data, pxPos, rawPos) { - if (rawPos === data.length) { - throw new Error("Ran out of data"); - } - - let pixel = data[rawPos]; - pxData[pxPos] = pixel; - pxData[pxPos + 1] = pixel; - pxData[pxPos + 2] = pixel; - pxData[pxPos + 3] = 0xff; - }, - - // 2 - LA - // 0: 0, 1: 0, 2: 0, 3: 1 - function (pxData, data, pxPos, rawPos) { - if (rawPos + 1 >= data.length) { - throw new Error("Ran out of data"); - } - - let pixel = data[rawPos]; - pxData[pxPos] = pixel; - pxData[pxPos + 1] = pixel; - pxData[pxPos + 2] = pixel; - pxData[pxPos + 3] = data[rawPos + 1]; - }, - - // 3 - RGB - // 0: 0, 1: 1, 2: 2, 3: 0xff - function (pxData, data, pxPos, rawPos) { - if (rawPos + 2 >= data.length) { - throw new Error("Ran out of data"); - } - - pxData[pxPos] = data[rawPos]; - pxData[pxPos + 1] = data[rawPos + 1]; - pxData[pxPos + 2] = data[rawPos + 2]; - pxData[pxPos + 3] = 0xff; - }, - - // 4 - RGBA - // 0: 0, 1: 1, 2: 2, 3: 3 - function (pxData, data, pxPos, rawPos) { - if (rawPos + 3 >= data.length) { - throw new Error("Ran out of data"); - } - - pxData[pxPos] = data[rawPos]; - pxData[pxPos + 1] = data[rawPos + 1]; - pxData[pxPos + 2] = data[rawPos + 2]; - pxData[pxPos + 3] = data[rawPos + 3]; - }, -]; - -let pixelBppCustomMapper = [ - // 0 - dummy entry - function () {}, - - // 1 - L - // 0: 0, 1: 0, 2: 0, 3: 0xff - function (pxData, pixelData, pxPos, maxBit) { - let pixel = pixelData[0]; - pxData[pxPos] = pixel; - pxData[pxPos + 1] = pixel; - pxData[pxPos + 2] = pixel; - pxData[pxPos + 3] = maxBit; - }, - - // 2 - LA - // 0: 0, 1: 0, 2: 0, 3: 1 - function (pxData, pixelData, pxPos) { - let pixel = pixelData[0]; - pxData[pxPos] = pixel; - pxData[pxPos + 1] = pixel; - pxData[pxPos + 2] = pixel; - pxData[pxPos + 3] = pixelData[1]; - }, - - // 3 - RGB - // 0: 0, 1: 1, 2: 2, 3: 0xff - function (pxData, pixelData, pxPos, maxBit) { - pxData[pxPos] = pixelData[0]; - pxData[pxPos + 1] = pixelData[1]; - pxData[pxPos + 2] = pixelData[2]; - pxData[pxPos + 3] = maxBit; - }, - - // 4 - RGBA - // 0: 0, 1: 1, 2: 2, 3: 3 - function (pxData, pixelData, pxPos) { - pxData[pxPos] = pixelData[0]; - pxData[pxPos + 1] = pixelData[1]; - pxData[pxPos + 2] = pixelData[2]; - pxData[pxPos + 3] = pixelData[3]; - }, -]; - -function bitRetriever(data, depth) { - let leftOver = []; - let i = 0; - - function split() { - if (i === data.length) { - throw new Error("Ran out of data"); - } - let byte = data[i]; - i++; - let byte8, byte7, byte6, byte5, byte4, byte3, byte2, byte1; - switch (depth) { - default: - throw new Error("unrecognised depth"); - case 16: - byte2 = data[i]; - i++; - leftOver.push((byte << 8) + byte2); - break; - case 4: - byte2 = byte & 0x0f; - byte1 = byte >> 4; - leftOver.push(byte1, byte2); - break; - case 2: - byte4 = byte & 3; - byte3 = (byte >> 2) & 3; - byte2 = (byte >> 4) & 3; - byte1 = (byte >> 6) & 3; - leftOver.push(byte1, byte2, byte3, byte4); - break; - case 1: - byte8 = byte & 1; - byte7 = (byte >> 1) & 1; - byte6 = (byte >> 2) & 1; - byte5 = (byte >> 3) & 1; - byte4 = (byte >> 4) & 1; - byte3 = (byte >> 5) & 1; - byte2 = (byte >> 6) & 1; - byte1 = (byte >> 7) & 1; - leftOver.push(byte1, byte2, byte3, byte4, byte5, byte6, byte7, byte8); - break; - } - } - - return { - get: function (count) { - while (leftOver.length < count) { - split(); - } - let returner = leftOver.slice(0, count); - leftOver = leftOver.slice(count); - return returner; - }, - resetAfterLine: function () { - leftOver.length = 0; - }, - end: function () { - if (i !== data.length) { - throw new Error("extra data found"); - } - }, - }; -} - -function mapImage8Bit(image, pxData, getPxPos, bpp, data, rawPos) { - // eslint-disable-line max-params - let imageWidth = image.width; - let imageHeight = image.height; - let imagePass = image.index; - for (let y = 0; y < imageHeight; y++) { - for (let x = 0; x < imageWidth; x++) { - let pxPos = getPxPos(x, y, imagePass); - pixelBppMapper[bpp](pxData, data, pxPos, rawPos); - rawPos += bpp; //eslint-disable-line no-param-reassign - } - } - return rawPos; -} - -function mapImageCustomBit(image, pxData, getPxPos, bpp, bits, maxBit) { - // eslint-disable-line max-params - let imageWidth = image.width; - let imageHeight = image.height; - let imagePass = image.index; - for (let y = 0; y < imageHeight; y++) { - for (let x = 0; x < imageWidth; x++) { - let pixelData = bits.get(bpp); - let pxPos = getPxPos(x, y, imagePass); - pixelBppCustomMapper[bpp](pxData, pixelData, pxPos, maxBit); - } - bits.resetAfterLine(); - } -} - -exports.dataToBitMap = function (data, bitmapInfo) { - let width = bitmapInfo.width; - let height = bitmapInfo.height; - let depth = bitmapInfo.depth; - let bpp = bitmapInfo.bpp; - let interlace = bitmapInfo.interlace; - let bits; - - if (depth !== 8) { - bits = bitRetriever(data, depth); - } - let pxData; - if (depth <= 8) { - pxData = Buffer.alloc(width * height * 4); - } else { - pxData = new Uint16Array(width * height * 4); - } - let maxBit = Math.pow(2, depth) - 1; - let rawPos = 0; - let images; - let getPxPos; - - if (interlace) { - images = interlaceUtils.getImagePasses(width, height); - getPxPos = interlaceUtils.getInterlaceIterator(width, height); - } else { - let nonInterlacedPxPos = 0; - getPxPos = function () { - let returner = nonInterlacedPxPos; - nonInterlacedPxPos += 4; - return returner; - }; - images = [{ width: width, height: height }]; - } - - for (let imageIndex = 0; imageIndex < images.length; imageIndex++) { - if (depth === 8) { - rawPos = mapImage8Bit( - images[imageIndex], - pxData, - getPxPos, - bpp, - data, - rawPos - ); - } else { - mapImageCustomBit( - images[imageIndex], - pxData, - getPxPos, - bpp, - bits, - maxBit - ); - } - } - if (depth === 8) { - if (rawPos !== data.length) { - throw new Error("extra data found"); - } - } else { - bits.end(); - } - - return pxData; -}; diff --git a/node_modules/pngjs/lib/bitpacker.js b/node_modules/pngjs/lib/bitpacker.js deleted file mode 100644 index d7a4e65..0000000 --- a/node_modules/pngjs/lib/bitpacker.js +++ /dev/null @@ -1,158 +0,0 @@ -"use strict"; - -let constants = require("./constants"); - -module.exports = function (dataIn, width, height, options) { - let outHasAlpha = - [constants.COLORTYPE_COLOR_ALPHA, constants.COLORTYPE_ALPHA].indexOf( - options.colorType - ) !== -1; - if (options.colorType === options.inputColorType) { - let bigEndian = (function () { - let buffer = new ArrayBuffer(2); - new DataView(buffer).setInt16(0, 256, true /* littleEndian */); - // Int16Array uses the platform's endianness. - return new Int16Array(buffer)[0] !== 256; - })(); - // If no need to convert to grayscale and alpha is present/absent in both, take a fast route - if (options.bitDepth === 8 || (options.bitDepth === 16 && bigEndian)) { - return dataIn; - } - } - - // map to a UInt16 array if data is 16bit, fix endianness below - let data = options.bitDepth !== 16 ? dataIn : new Uint16Array(dataIn.buffer); - - let maxValue = 255; - let inBpp = constants.COLORTYPE_TO_BPP_MAP[options.inputColorType]; - if (inBpp === 4 && !options.inputHasAlpha) { - inBpp = 3; - } - let outBpp = constants.COLORTYPE_TO_BPP_MAP[options.colorType]; - if (options.bitDepth === 16) { - maxValue = 65535; - outBpp *= 2; - } - let outData = Buffer.alloc(width * height * outBpp); - - let inIndex = 0; - let outIndex = 0; - - let bgColor = options.bgColor || {}; - if (bgColor.red === undefined) { - bgColor.red = maxValue; - } - if (bgColor.green === undefined) { - bgColor.green = maxValue; - } - if (bgColor.blue === undefined) { - bgColor.blue = maxValue; - } - - function getRGBA() { - let red; - let green; - let blue; - let alpha = maxValue; - switch (options.inputColorType) { - case constants.COLORTYPE_COLOR_ALPHA: - alpha = data[inIndex + 3]; - red = data[inIndex]; - green = data[inIndex + 1]; - blue = data[inIndex + 2]; - break; - case constants.COLORTYPE_COLOR: - red = data[inIndex]; - green = data[inIndex + 1]; - blue = data[inIndex + 2]; - break; - case constants.COLORTYPE_ALPHA: - alpha = data[inIndex + 1]; - red = data[inIndex]; - green = red; - blue = red; - break; - case constants.COLORTYPE_GRAYSCALE: - red = data[inIndex]; - green = red; - blue = red; - break; - default: - throw new Error( - "input color type:" + - options.inputColorType + - " is not supported at present" - ); - } - - if (options.inputHasAlpha) { - if (!outHasAlpha) { - alpha /= maxValue; - red = Math.min( - Math.max(Math.round((1 - alpha) * bgColor.red + alpha * red), 0), - maxValue - ); - green = Math.min( - Math.max(Math.round((1 - alpha) * bgColor.green + alpha * green), 0), - maxValue - ); - blue = Math.min( - Math.max(Math.round((1 - alpha) * bgColor.blue + alpha * blue), 0), - maxValue - ); - } - } - return { red: red, green: green, blue: blue, alpha: alpha }; - } - - for (let y = 0; y < height; y++) { - for (let x = 0; x < width; x++) { - let rgba = getRGBA(data, inIndex); - - switch (options.colorType) { - case constants.COLORTYPE_COLOR_ALPHA: - case constants.COLORTYPE_COLOR: - if (options.bitDepth === 8) { - outData[outIndex] = rgba.red; - outData[outIndex + 1] = rgba.green; - outData[outIndex + 2] = rgba.blue; - if (outHasAlpha) { - outData[outIndex + 3] = rgba.alpha; - } - } else { - outData.writeUInt16BE(rgba.red, outIndex); - outData.writeUInt16BE(rgba.green, outIndex + 2); - outData.writeUInt16BE(rgba.blue, outIndex + 4); - if (outHasAlpha) { - outData.writeUInt16BE(rgba.alpha, outIndex + 6); - } - } - break; - case constants.COLORTYPE_ALPHA: - case constants.COLORTYPE_GRAYSCALE: { - // Convert to grayscale and alpha - let grayscale = (rgba.red + rgba.green + rgba.blue) / 3; - if (options.bitDepth === 8) { - outData[outIndex] = grayscale; - if (outHasAlpha) { - outData[outIndex + 1] = rgba.alpha; - } - } else { - outData.writeUInt16BE(grayscale, outIndex); - if (outHasAlpha) { - outData.writeUInt16BE(rgba.alpha, outIndex + 2); - } - } - break; - } - default: - throw new Error("unrecognised color Type " + options.colorType); - } - - inIndex += inBpp; - outIndex += outBpp; - } - } - - return outData; -}; diff --git a/node_modules/pngjs/lib/chunkstream.js b/node_modules/pngjs/lib/chunkstream.js deleted file mode 100644 index 95b46d4..0000000 --- a/node_modules/pngjs/lib/chunkstream.js +++ /dev/null @@ -1,189 +0,0 @@ -"use strict"; - -let util = require("util"); -let Stream = require("stream"); - -let ChunkStream = (module.exports = function () { - Stream.call(this); - - this._buffers = []; - this._buffered = 0; - - this._reads = []; - this._paused = false; - - this._encoding = "utf8"; - this.writable = true; -}); -util.inherits(ChunkStream, Stream); - -ChunkStream.prototype.read = function (length, callback) { - this._reads.push({ - length: Math.abs(length), // if length < 0 then at most this length - allowLess: length < 0, - func: callback, - }); - - process.nextTick( - function () { - this._process(); - - // its paused and there is not enought data then ask for more - if (this._paused && this._reads && this._reads.length > 0) { - this._paused = false; - - this.emit("drain"); - } - }.bind(this) - ); -}; - -ChunkStream.prototype.write = function (data, encoding) { - if (!this.writable) { - this.emit("error", new Error("Stream not writable")); - return false; - } - - let dataBuffer; - if (Buffer.isBuffer(data)) { - dataBuffer = data; - } else { - dataBuffer = Buffer.from(data, encoding || this._encoding); - } - - this._buffers.push(dataBuffer); - this._buffered += dataBuffer.length; - - this._process(); - - // ok if there are no more read requests - if (this._reads && this._reads.length === 0) { - this._paused = true; - } - - return this.writable && !this._paused; -}; - -ChunkStream.prototype.end = function (data, encoding) { - if (data) { - this.write(data, encoding); - } - - this.writable = false; - - // already destroyed - if (!this._buffers) { - return; - } - - // enqueue or handle end - if (this._buffers.length === 0) { - this._end(); - } else { - this._buffers.push(null); - this._process(); - } -}; - -ChunkStream.prototype.destroySoon = ChunkStream.prototype.end; - -ChunkStream.prototype._end = function () { - if (this._reads.length > 0) { - this.emit("error", new Error("Unexpected end of input")); - } - - this.destroy(); -}; - -ChunkStream.prototype.destroy = function () { - if (!this._buffers) { - return; - } - - this.writable = false; - this._reads = null; - this._buffers = null; - - this.emit("close"); -}; - -ChunkStream.prototype._processReadAllowingLess = function (read) { - // ok there is any data so that we can satisfy this request - this._reads.shift(); // == read - - // first we need to peek into first buffer - let smallerBuf = this._buffers[0]; - - // ok there is more data than we need - if (smallerBuf.length > read.length) { - this._buffered -= read.length; - this._buffers[0] = smallerBuf.slice(read.length); - - read.func.call(this, smallerBuf.slice(0, read.length)); - } else { - // ok this is less than maximum length so use it all - this._buffered -= smallerBuf.length; - this._buffers.shift(); // == smallerBuf - - read.func.call(this, smallerBuf); - } -}; - -ChunkStream.prototype._processRead = function (read) { - this._reads.shift(); // == read - - let pos = 0; - let count = 0; - let data = Buffer.alloc(read.length); - - // create buffer for all data - while (pos < read.length) { - let buf = this._buffers[count++]; - let len = Math.min(buf.length, read.length - pos); - - buf.copy(data, pos, 0, len); - pos += len; - - // last buffer wasn't used all so just slice it and leave - if (len !== buf.length) { - this._buffers[--count] = buf.slice(len); - } - } - - // remove all used buffers - if (count > 0) { - this._buffers.splice(0, count); - } - - this._buffered -= read.length; - - read.func.call(this, data); -}; - -ChunkStream.prototype._process = function () { - try { - // as long as there is any data and read requests - while (this._buffered > 0 && this._reads && this._reads.length > 0) { - let read = this._reads[0]; - - // read any data (but no more than length) - if (read.allowLess) { - this._processReadAllowingLess(read); - } else if (this._buffered >= read.length) { - // ok we can meet some expectations - - this._processRead(read); - } else { - // not enought data to satisfy first request in queue - // so we need to wait for more - break; - } - } - - if (this._buffers && !this.writable) { - this._end(); - } - } catch (ex) { - this.emit("error", ex); - } -}; diff --git a/node_modules/pngjs/lib/constants.js b/node_modules/pngjs/lib/constants.js deleted file mode 100644 index 21fdad6..0000000 --- a/node_modules/pngjs/lib/constants.js +++ /dev/null @@ -1,32 +0,0 @@ -"use strict"; - -module.exports = { - PNG_SIGNATURE: [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a], - - TYPE_IHDR: 0x49484452, - TYPE_IEND: 0x49454e44, - TYPE_IDAT: 0x49444154, - TYPE_PLTE: 0x504c5445, - TYPE_tRNS: 0x74524e53, // eslint-disable-line camelcase - TYPE_gAMA: 0x67414d41, // eslint-disable-line camelcase - - // color-type bits - COLORTYPE_GRAYSCALE: 0, - COLORTYPE_PALETTE: 1, - COLORTYPE_COLOR: 2, - COLORTYPE_ALPHA: 4, // e.g. grayscale and alpha - - // color-type combinations - COLORTYPE_PALETTE_COLOR: 3, - COLORTYPE_COLOR_ALPHA: 6, - - COLORTYPE_TO_BPP_MAP: { - 0: 1, - 2: 3, - 3: 1, - 4: 2, - 6: 4, - }, - - GAMMA_DIVISION: 100000, -}; diff --git a/node_modules/pngjs/lib/crc.js b/node_modules/pngjs/lib/crc.js deleted file mode 100644 index 950ec8a..0000000 --- a/node_modules/pngjs/lib/crc.js +++ /dev/null @@ -1,40 +0,0 @@ -"use strict"; - -let crcTable = []; - -(function () { - for (let i = 0; i < 256; i++) { - let currentCrc = i; - for (let j = 0; j < 8; j++) { - if (currentCrc & 1) { - currentCrc = 0xedb88320 ^ (currentCrc >>> 1); - } else { - currentCrc = currentCrc >>> 1; - } - } - crcTable[i] = currentCrc; - } -})(); - -let CrcCalculator = (module.exports = function () { - this._crc = -1; -}); - -CrcCalculator.prototype.write = function (data) { - for (let i = 0; i < data.length; i++) { - this._crc = crcTable[(this._crc ^ data[i]) & 0xff] ^ (this._crc >>> 8); - } - return true; -}; - -CrcCalculator.prototype.crc32 = function () { - return this._crc ^ -1; -}; - -CrcCalculator.crc32 = function (buf) { - let crc = -1; - for (let i = 0; i < buf.length; i++) { - crc = crcTable[(crc ^ buf[i]) & 0xff] ^ (crc >>> 8); - } - return crc ^ -1; -}; diff --git a/node_modules/pngjs/lib/filter-pack.js b/node_modules/pngjs/lib/filter-pack.js deleted file mode 100644 index 32c85c4..0000000 --- a/node_modules/pngjs/lib/filter-pack.js +++ /dev/null @@ -1,171 +0,0 @@ -"use strict"; - -let paethPredictor = require("./paeth-predictor"); - -function filterNone(pxData, pxPos, byteWidth, rawData, rawPos) { - for (let x = 0; x < byteWidth; x++) { - rawData[rawPos + x] = pxData[pxPos + x]; - } -} - -function filterSumNone(pxData, pxPos, byteWidth) { - let sum = 0; - let length = pxPos + byteWidth; - - for (let i = pxPos; i < length; i++) { - sum += Math.abs(pxData[i]); - } - return sum; -} - -function filterSub(pxData, pxPos, byteWidth, rawData, rawPos, bpp) { - for (let x = 0; x < byteWidth; x++) { - let left = x >= bpp ? pxData[pxPos + x - bpp] : 0; - let val = pxData[pxPos + x] - left; - - rawData[rawPos + x] = val; - } -} - -function filterSumSub(pxData, pxPos, byteWidth, bpp) { - let sum = 0; - for (let x = 0; x < byteWidth; x++) { - let left = x >= bpp ? pxData[pxPos + x - bpp] : 0; - let val = pxData[pxPos + x] - left; - - sum += Math.abs(val); - } - - return sum; -} - -function filterUp(pxData, pxPos, byteWidth, rawData, rawPos) { - for (let x = 0; x < byteWidth; x++) { - let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0; - let val = pxData[pxPos + x] - up; - - rawData[rawPos + x] = val; - } -} - -function filterSumUp(pxData, pxPos, byteWidth) { - let sum = 0; - let length = pxPos + byteWidth; - for (let x = pxPos; x < length; x++) { - let up = pxPos > 0 ? pxData[x - byteWidth] : 0; - let val = pxData[x] - up; - - sum += Math.abs(val); - } - - return sum; -} - -function filterAvg(pxData, pxPos, byteWidth, rawData, rawPos, bpp) { - for (let x = 0; x < byteWidth; x++) { - let left = x >= bpp ? pxData[pxPos + x - bpp] : 0; - let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0; - let val = pxData[pxPos + x] - ((left + up) >> 1); - - rawData[rawPos + x] = val; - } -} - -function filterSumAvg(pxData, pxPos, byteWidth, bpp) { - let sum = 0; - for (let x = 0; x < byteWidth; x++) { - let left = x >= bpp ? pxData[pxPos + x - bpp] : 0; - let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0; - let val = pxData[pxPos + x] - ((left + up) >> 1); - - sum += Math.abs(val); - } - - return sum; -} - -function filterPaeth(pxData, pxPos, byteWidth, rawData, rawPos, bpp) { - for (let x = 0; x < byteWidth; x++) { - let left = x >= bpp ? pxData[pxPos + x - bpp] : 0; - let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0; - let upleft = - pxPos > 0 && x >= bpp ? pxData[pxPos + x - (byteWidth + bpp)] : 0; - let val = pxData[pxPos + x] - paethPredictor(left, up, upleft); - - rawData[rawPos + x] = val; - } -} - -function filterSumPaeth(pxData, pxPos, byteWidth, bpp) { - let sum = 0; - for (let x = 0; x < byteWidth; x++) { - let left = x >= bpp ? pxData[pxPos + x - bpp] : 0; - let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0; - let upleft = - pxPos > 0 && x >= bpp ? pxData[pxPos + x - (byteWidth + bpp)] : 0; - let val = pxData[pxPos + x] - paethPredictor(left, up, upleft); - - sum += Math.abs(val); - } - - return sum; -} - -let filters = { - 0: filterNone, - 1: filterSub, - 2: filterUp, - 3: filterAvg, - 4: filterPaeth, -}; - -let filterSums = { - 0: filterSumNone, - 1: filterSumSub, - 2: filterSumUp, - 3: filterSumAvg, - 4: filterSumPaeth, -}; - -module.exports = function (pxData, width, height, options, bpp) { - let filterTypes; - if (!("filterType" in options) || options.filterType === -1) { - filterTypes = [0, 1, 2, 3, 4]; - } else if (typeof options.filterType === "number") { - filterTypes = [options.filterType]; - } else { - throw new Error("unrecognised filter types"); - } - - if (options.bitDepth === 16) { - bpp *= 2; - } - let byteWidth = width * bpp; - let rawPos = 0; - let pxPos = 0; - let rawData = Buffer.alloc((byteWidth + 1) * height); - - let sel = filterTypes[0]; - - for (let y = 0; y < height; y++) { - if (filterTypes.length > 1) { - // find best filter for this line (with lowest sum of values) - let min = Infinity; - - for (let i = 0; i < filterTypes.length; i++) { - let sum = filterSums[filterTypes[i]](pxData, pxPos, byteWidth, bpp); - if (sum < min) { - sel = filterTypes[i]; - min = sum; - } - } - } - - rawData[rawPos] = sel; - rawPos++; - filters[sel](pxData, pxPos, byteWidth, rawData, rawPos, bpp); - rawPos += byteWidth; - pxPos += byteWidth; - } - return rawData; -}; diff --git a/node_modules/pngjs/lib/filter-parse-async.js b/node_modules/pngjs/lib/filter-parse-async.js deleted file mode 100644 index 832b86c..0000000 --- a/node_modules/pngjs/lib/filter-parse-async.js +++ /dev/null @@ -1,24 +0,0 @@ -"use strict"; - -let util = require("util"); -let ChunkStream = require("./chunkstream"); -let Filter = require("./filter-parse"); - -let FilterAsync = (module.exports = function (bitmapInfo) { - ChunkStream.call(this); - - let buffers = []; - let that = this; - this._filter = new Filter(bitmapInfo, { - read: this.read.bind(this), - write: function (buffer) { - buffers.push(buffer); - }, - complete: function () { - that.emit("complete", Buffer.concat(buffers)); - }, - }); - - this._filter.start(); -}); -util.inherits(FilterAsync, ChunkStream); diff --git a/node_modules/pngjs/lib/filter-parse-sync.js b/node_modules/pngjs/lib/filter-parse-sync.js deleted file mode 100644 index 6924d16..0000000 --- a/node_modules/pngjs/lib/filter-parse-sync.js +++ /dev/null @@ -1,21 +0,0 @@ -"use strict"; - -let SyncReader = require("./sync-reader"); -let Filter = require("./filter-parse"); - -exports.process = function (inBuffer, bitmapInfo) { - let outBuffers = []; - let reader = new SyncReader(inBuffer); - let filter = new Filter(bitmapInfo, { - read: reader.read.bind(reader), - write: function (bufferPart) { - outBuffers.push(bufferPart); - }, - complete: function () {}, - }); - - filter.start(); - reader.process(); - - return Buffer.concat(outBuffers); -}; diff --git a/node_modules/pngjs/lib/filter-parse.js b/node_modules/pngjs/lib/filter-parse.js deleted file mode 100644 index 3a32e5e..0000000 --- a/node_modules/pngjs/lib/filter-parse.js +++ /dev/null @@ -1,177 +0,0 @@ -"use strict"; - -let interlaceUtils = require("./interlace"); -let paethPredictor = require("./paeth-predictor"); - -function getByteWidth(width, bpp, depth) { - let byteWidth = width * bpp; - if (depth !== 8) { - byteWidth = Math.ceil(byteWidth / (8 / depth)); - } - return byteWidth; -} - -let Filter = (module.exports = function (bitmapInfo, dependencies) { - let width = bitmapInfo.width; - let height = bitmapInfo.height; - let interlace = bitmapInfo.interlace; - let bpp = bitmapInfo.bpp; - let depth = bitmapInfo.depth; - - this.read = dependencies.read; - this.write = dependencies.write; - this.complete = dependencies.complete; - - this._imageIndex = 0; - this._images = []; - if (interlace) { - let passes = interlaceUtils.getImagePasses(width, height); - for (let i = 0; i < passes.length; i++) { - this._images.push({ - byteWidth: getByteWidth(passes[i].width, bpp, depth), - height: passes[i].height, - lineIndex: 0, - }); - } - } else { - this._images.push({ - byteWidth: getByteWidth(width, bpp, depth), - height: height, - lineIndex: 0, - }); - } - - // when filtering the line we look at the pixel to the left - // the spec also says it is done on a byte level regardless of the number of pixels - // so if the depth is byte compatible (8 or 16) we subtract the bpp in order to compare back - // a pixel rather than just a different byte part. However if we are sub byte, we ignore. - if (depth === 8) { - this._xComparison = bpp; - } else if (depth === 16) { - this._xComparison = bpp * 2; - } else { - this._xComparison = 1; - } -}); - -Filter.prototype.start = function () { - this.read( - this._images[this._imageIndex].byteWidth + 1, - this._reverseFilterLine.bind(this) - ); -}; - -Filter.prototype._unFilterType1 = function ( - rawData, - unfilteredLine, - byteWidth -) { - let xComparison = this._xComparison; - let xBiggerThan = xComparison - 1; - - for (let x = 0; x < byteWidth; x++) { - let rawByte = rawData[1 + x]; - let f1Left = x > xBiggerThan ? unfilteredLine[x - xComparison] : 0; - unfilteredLine[x] = rawByte + f1Left; - } -}; - -Filter.prototype._unFilterType2 = function ( - rawData, - unfilteredLine, - byteWidth -) { - let lastLine = this._lastLine; - - for (let x = 0; x < byteWidth; x++) { - let rawByte = rawData[1 + x]; - let f2Up = lastLine ? lastLine[x] : 0; - unfilteredLine[x] = rawByte + f2Up; - } -}; - -Filter.prototype._unFilterType3 = function ( - rawData, - unfilteredLine, - byteWidth -) { - let xComparison = this._xComparison; - let xBiggerThan = xComparison - 1; - let lastLine = this._lastLine; - - for (let x = 0; x < byteWidth; x++) { - let rawByte = rawData[1 + x]; - let f3Up = lastLine ? lastLine[x] : 0; - let f3Left = x > xBiggerThan ? unfilteredLine[x - xComparison] : 0; - let f3Add = Math.floor((f3Left + f3Up) / 2); - unfilteredLine[x] = rawByte + f3Add; - } -}; - -Filter.prototype._unFilterType4 = function ( - rawData, - unfilteredLine, - byteWidth -) { - let xComparison = this._xComparison; - let xBiggerThan = xComparison - 1; - let lastLine = this._lastLine; - - for (let x = 0; x < byteWidth; x++) { - let rawByte = rawData[1 + x]; - let f4Up = lastLine ? lastLine[x] : 0; - let f4Left = x > xBiggerThan ? unfilteredLine[x - xComparison] : 0; - let f4UpLeft = x > xBiggerThan && lastLine ? lastLine[x - xComparison] : 0; - let f4Add = paethPredictor(f4Left, f4Up, f4UpLeft); - unfilteredLine[x] = rawByte + f4Add; - } -}; - -Filter.prototype._reverseFilterLine = function (rawData) { - let filter = rawData[0]; - let unfilteredLine; - let currentImage = this._images[this._imageIndex]; - let byteWidth = currentImage.byteWidth; - - if (filter === 0) { - unfilteredLine = rawData.slice(1, byteWidth + 1); - } else { - unfilteredLine = Buffer.alloc(byteWidth); - - switch (filter) { - case 1: - this._unFilterType1(rawData, unfilteredLine, byteWidth); - break; - case 2: - this._unFilterType2(rawData, unfilteredLine, byteWidth); - break; - case 3: - this._unFilterType3(rawData, unfilteredLine, byteWidth); - break; - case 4: - this._unFilterType4(rawData, unfilteredLine, byteWidth); - break; - default: - throw new Error("Unrecognised filter type - " + filter); - } - } - - this.write(unfilteredLine); - - currentImage.lineIndex++; - if (currentImage.lineIndex >= currentImage.height) { - this._lastLine = null; - this._imageIndex++; - currentImage = this._images[this._imageIndex]; - } else { - this._lastLine = unfilteredLine; - } - - if (currentImage) { - // read, using the byte width that may be from the new current image - this.read(currentImage.byteWidth + 1, this._reverseFilterLine.bind(this)); - } else { - this._lastLine = null; - this.complete(); - } -}; diff --git a/node_modules/pngjs/lib/format-normaliser.js b/node_modules/pngjs/lib/format-normaliser.js deleted file mode 100644 index 634d566..0000000 --- a/node_modules/pngjs/lib/format-normaliser.js +++ /dev/null @@ -1,93 +0,0 @@ -"use strict"; - -function dePalette(indata, outdata, width, height, palette) { - let pxPos = 0; - // use values from palette - for (let y = 0; y < height; y++) { - for (let x = 0; x < width; x++) { - let color = palette[indata[pxPos]]; - - if (!color) { - throw new Error("index " + indata[pxPos] + " not in palette"); - } - - for (let i = 0; i < 4; i++) { - outdata[pxPos + i] = color[i]; - } - pxPos += 4; - } - } -} - -function replaceTransparentColor(indata, outdata, width, height, transColor) { - let pxPos = 0; - for (let y = 0; y < height; y++) { - for (let x = 0; x < width; x++) { - let makeTrans = false; - - if (transColor.length === 1) { - if (transColor[0] === indata[pxPos]) { - makeTrans = true; - } - } else if ( - transColor[0] === indata[pxPos] && - transColor[1] === indata[pxPos + 1] && - transColor[2] === indata[pxPos + 2] - ) { - makeTrans = true; - } - if (makeTrans) { - for (let i = 0; i < 4; i++) { - outdata[pxPos + i] = 0; - } - } - pxPos += 4; - } - } -} - -function scaleDepth(indata, outdata, width, height, depth) { - let maxOutSample = 255; - let maxInSample = Math.pow(2, depth) - 1; - let pxPos = 0; - - for (let y = 0; y < height; y++) { - for (let x = 0; x < width; x++) { - for (let i = 0; i < 4; i++) { - outdata[pxPos + i] = Math.floor( - (indata[pxPos + i] * maxOutSample) / maxInSample + 0.5 - ); - } - pxPos += 4; - } - } -} - -module.exports = function (indata, imageData) { - let depth = imageData.depth; - let width = imageData.width; - let height = imageData.height; - let colorType = imageData.colorType; - let transColor = imageData.transColor; - let palette = imageData.palette; - - let outdata = indata; // only different for 16 bits - - if (colorType === 3) { - // paletted - dePalette(indata, outdata, width, height, palette); - } else { - if (transColor) { - replaceTransparentColor(indata, outdata, width, height, transColor); - } - // if it needs scaling - if (depth !== 8) { - // if we need to change the buffer size - if (depth === 16) { - outdata = Buffer.alloc(width * height * 4); - } - scaleDepth(indata, outdata, width, height, depth); - } - } - return outdata; -}; diff --git a/node_modules/pngjs/lib/interlace.js b/node_modules/pngjs/lib/interlace.js deleted file mode 100644 index a035cb1..0000000 --- a/node_modules/pngjs/lib/interlace.js +++ /dev/null @@ -1,95 +0,0 @@ -"use strict"; - -// Adam 7 -// 0 1 2 3 4 5 6 7 -// 0 x 6 4 6 x 6 4 6 -// 1 7 7 7 7 7 7 7 7 -// 2 5 6 5 6 5 6 5 6 -// 3 7 7 7 7 7 7 7 7 -// 4 3 6 4 6 3 6 4 6 -// 5 7 7 7 7 7 7 7 7 -// 6 5 6 5 6 5 6 5 6 -// 7 7 7 7 7 7 7 7 7 - -let imagePasses = [ - { - // pass 1 - 1px - x: [0], - y: [0], - }, - { - // pass 2 - 1px - x: [4], - y: [0], - }, - { - // pass 3 - 2px - x: [0, 4], - y: [4], - }, - { - // pass 4 - 4px - x: [2, 6], - y: [0, 4], - }, - { - // pass 5 - 8px - x: [0, 2, 4, 6], - y: [2, 6], - }, - { - // pass 6 - 16px - x: [1, 3, 5, 7], - y: [0, 2, 4, 6], - }, - { - // pass 7 - 32px - x: [0, 1, 2, 3, 4, 5, 6, 7], - y: [1, 3, 5, 7], - }, -]; - -exports.getImagePasses = function (width, height) { - let images = []; - let xLeftOver = width % 8; - let yLeftOver = height % 8; - let xRepeats = (width - xLeftOver) / 8; - let yRepeats = (height - yLeftOver) / 8; - for (let i = 0; i < imagePasses.length; i++) { - let pass = imagePasses[i]; - let passWidth = xRepeats * pass.x.length; - let passHeight = yRepeats * pass.y.length; - for (let j = 0; j < pass.x.length; j++) { - if (pass.x[j] < xLeftOver) { - passWidth++; - } else { - break; - } - } - for (let j = 0; j < pass.y.length; j++) { - if (pass.y[j] < yLeftOver) { - passHeight++; - } else { - break; - } - } - if (passWidth > 0 && passHeight > 0) { - images.push({ width: passWidth, height: passHeight, index: i }); - } - } - return images; -}; - -exports.getInterlaceIterator = function (width) { - return function (x, y, pass) { - let outerXLeftOver = x % imagePasses[pass].x.length; - let outerX = - ((x - outerXLeftOver) / imagePasses[pass].x.length) * 8 + - imagePasses[pass].x[outerXLeftOver]; - let outerYLeftOver = y % imagePasses[pass].y.length; - let outerY = - ((y - outerYLeftOver) / imagePasses[pass].y.length) * 8 + - imagePasses[pass].y[outerYLeftOver]; - return outerX * 4 + outerY * width * 4; - }; -}; diff --git a/node_modules/pngjs/lib/packer-async.js b/node_modules/pngjs/lib/packer-async.js deleted file mode 100644 index f3df73a..0000000 --- a/node_modules/pngjs/lib/packer-async.js +++ /dev/null @@ -1,50 +0,0 @@ -"use strict"; - -let util = require("util"); -let Stream = require("stream"); -let constants = require("./constants"); -let Packer = require("./packer"); - -let PackerAsync = (module.exports = function (opt) { - Stream.call(this); - - let options = opt || {}; - - this._packer = new Packer(options); - this._deflate = this._packer.createDeflate(); - - this.readable = true; -}); -util.inherits(PackerAsync, Stream); - -PackerAsync.prototype.pack = function (data, width, height, gamma) { - // Signature - this.emit("data", Buffer.from(constants.PNG_SIGNATURE)); - this.emit("data", this._packer.packIHDR(width, height)); - - if (gamma) { - this.emit("data", this._packer.packGAMA(gamma)); - } - - let filteredData = this._packer.filterData(data, width, height); - - // compress it - this._deflate.on("error", this.emit.bind(this, "error")); - - this._deflate.on( - "data", - function (compressedData) { - this.emit("data", this._packer.packIDAT(compressedData)); - }.bind(this) - ); - - this._deflate.on( - "end", - function () { - this.emit("data", this._packer.packIEND()); - this.emit("end"); - }.bind(this) - ); - - this._deflate.end(filteredData); -}; diff --git a/node_modules/pngjs/lib/packer-sync.js b/node_modules/pngjs/lib/packer-sync.js deleted file mode 100644 index f5ab0b3..0000000 --- a/node_modules/pngjs/lib/packer-sync.js +++ /dev/null @@ -1,56 +0,0 @@ -"use strict"; - -let hasSyncZlib = true; -let zlib = require("zlib"); -if (!zlib.deflateSync) { - hasSyncZlib = false; -} -let constants = require("./constants"); -let Packer = require("./packer"); - -module.exports = function (metaData, opt) { - if (!hasSyncZlib) { - throw new Error( - "To use the sync capability of this library in old node versions, please pin pngjs to v2.3.0" - ); - } - - let options = opt || {}; - - let packer = new Packer(options); - - let chunks = []; - - // Signature - chunks.push(Buffer.from(constants.PNG_SIGNATURE)); - - // Header - chunks.push(packer.packIHDR(metaData.width, metaData.height)); - - if (metaData.gamma) { - chunks.push(packer.packGAMA(metaData.gamma)); - } - - let filteredData = packer.filterData( - metaData.data, - metaData.width, - metaData.height - ); - - // compress it - let compressedData = zlib.deflateSync( - filteredData, - packer.getDeflateOptions() - ); - filteredData = null; - - if (!compressedData || !compressedData.length) { - throw new Error("bad png - invalid compressed data response"); - } - chunks.push(packer.packIDAT(compressedData)); - - // End - chunks.push(packer.packIEND()); - - return Buffer.concat(chunks); -}; diff --git a/node_modules/pngjs/lib/packer.js b/node_modules/pngjs/lib/packer.js deleted file mode 100644 index 4aba12c..0000000 --- a/node_modules/pngjs/lib/packer.js +++ /dev/null @@ -1,129 +0,0 @@ -"use strict"; - -let constants = require("./constants"); -let CrcStream = require("./crc"); -let bitPacker = require("./bitpacker"); -let filter = require("./filter-pack"); -let zlib = require("zlib"); - -let Packer = (module.exports = function (options) { - this._options = options; - - options.deflateChunkSize = options.deflateChunkSize || 32 * 1024; - options.deflateLevel = - options.deflateLevel != null ? options.deflateLevel : 9; - options.deflateStrategy = - options.deflateStrategy != null ? options.deflateStrategy : 3; - options.inputHasAlpha = - options.inputHasAlpha != null ? options.inputHasAlpha : true; - options.deflateFactory = options.deflateFactory || zlib.createDeflate; - options.bitDepth = options.bitDepth || 8; - // This is outputColorType - options.colorType = - typeof options.colorType === "number" - ? options.colorType - : constants.COLORTYPE_COLOR_ALPHA; - options.inputColorType = - typeof options.inputColorType === "number" - ? options.inputColorType - : constants.COLORTYPE_COLOR_ALPHA; - - if ( - [ - constants.COLORTYPE_GRAYSCALE, - constants.COLORTYPE_COLOR, - constants.COLORTYPE_COLOR_ALPHA, - constants.COLORTYPE_ALPHA, - ].indexOf(options.colorType) === -1 - ) { - throw new Error( - "option color type:" + options.colorType + " is not supported at present" - ); - } - if ( - [ - constants.COLORTYPE_GRAYSCALE, - constants.COLORTYPE_COLOR, - constants.COLORTYPE_COLOR_ALPHA, - constants.COLORTYPE_ALPHA, - ].indexOf(options.inputColorType) === -1 - ) { - throw new Error( - "option input color type:" + - options.inputColorType + - " is not supported at present" - ); - } - if (options.bitDepth !== 8 && options.bitDepth !== 16) { - throw new Error( - "option bit depth:" + options.bitDepth + " is not supported at present" - ); - } -}); - -Packer.prototype.getDeflateOptions = function () { - return { - chunkSize: this._options.deflateChunkSize, - level: this._options.deflateLevel, - strategy: this._options.deflateStrategy, - }; -}; - -Packer.prototype.createDeflate = function () { - return this._options.deflateFactory(this.getDeflateOptions()); -}; - -Packer.prototype.filterData = function (data, width, height) { - // convert to correct format for filtering (e.g. right bpp and bit depth) - let packedData = bitPacker(data, width, height, this._options); - - // filter pixel data - let bpp = constants.COLORTYPE_TO_BPP_MAP[this._options.colorType]; - let filteredData = filter(packedData, width, height, this._options, bpp); - return filteredData; -}; - -Packer.prototype._packChunk = function (type, data) { - let len = data ? data.length : 0; - let buf = Buffer.alloc(len + 12); - - buf.writeUInt32BE(len, 0); - buf.writeUInt32BE(type, 4); - - if (data) { - data.copy(buf, 8); - } - - buf.writeInt32BE( - CrcStream.crc32(buf.slice(4, buf.length - 4)), - buf.length - 4 - ); - return buf; -}; - -Packer.prototype.packGAMA = function (gamma) { - let buf = Buffer.alloc(4); - buf.writeUInt32BE(Math.floor(gamma * constants.GAMMA_DIVISION), 0); - return this._packChunk(constants.TYPE_gAMA, buf); -}; - -Packer.prototype.packIHDR = function (width, height) { - let buf = Buffer.alloc(13); - buf.writeUInt32BE(width, 0); - buf.writeUInt32BE(height, 4); - buf[8] = this._options.bitDepth; // Bit depth - buf[9] = this._options.colorType; // colorType - buf[10] = 0; // compression - buf[11] = 0; // filter - buf[12] = 0; // interlace - - return this._packChunk(constants.TYPE_IHDR, buf); -}; - -Packer.prototype.packIDAT = function (data) { - return this._packChunk(constants.TYPE_IDAT, data); -}; - -Packer.prototype.packIEND = function () { - return this._packChunk(constants.TYPE_IEND, null); -}; diff --git a/node_modules/pngjs/lib/paeth-predictor.js b/node_modules/pngjs/lib/paeth-predictor.js deleted file mode 100644 index 9634497..0000000 --- a/node_modules/pngjs/lib/paeth-predictor.js +++ /dev/null @@ -1,16 +0,0 @@ -"use strict"; - -module.exports = function paethPredictor(left, above, upLeft) { - let paeth = left + above - upLeft; - let pLeft = Math.abs(paeth - left); - let pAbove = Math.abs(paeth - above); - let pUpLeft = Math.abs(paeth - upLeft); - - if (pLeft <= pAbove && pLeft <= pUpLeft) { - return left; - } - if (pAbove <= pUpLeft) { - return above; - } - return upLeft; -}; diff --git a/node_modules/pngjs/lib/parser-async.js b/node_modules/pngjs/lib/parser-async.js deleted file mode 100644 index a69d153..0000000 --- a/node_modules/pngjs/lib/parser-async.js +++ /dev/null @@ -1,165 +0,0 @@ -"use strict"; - -let util = require("util"); -let zlib = require("zlib"); -let ChunkStream = require("./chunkstream"); -let FilterAsync = require("./filter-parse-async"); -let Parser = require("./parser"); -let bitmapper = require("./bitmapper"); -let formatNormaliser = require("./format-normaliser"); - -let ParserAsync = (module.exports = function (options) { - ChunkStream.call(this); - - this._parser = new Parser(options, { - read: this.read.bind(this), - error: this._handleError.bind(this), - metadata: this._handleMetaData.bind(this), - gamma: this.emit.bind(this, "gamma"), - palette: this._handlePalette.bind(this), - transColor: this._handleTransColor.bind(this), - finished: this._finished.bind(this), - inflateData: this._inflateData.bind(this), - simpleTransparency: this._simpleTransparency.bind(this), - headersFinished: this._headersFinished.bind(this), - }); - this._options = options; - this.writable = true; - - this._parser.start(); -}); -util.inherits(ParserAsync, ChunkStream); - -ParserAsync.prototype._handleError = function (err) { - this.emit("error", err); - - this.writable = false; - - this.destroy(); - - if (this._inflate && this._inflate.destroy) { - this._inflate.destroy(); - } - - if (this._filter) { - this._filter.destroy(); - // For backward compatibility with Node 7 and below. - // Suppress errors due to _inflate calling write() even after - // it's destroy()'ed. - this._filter.on("error", function () {}); - } - - this.errord = true; -}; - -ParserAsync.prototype._inflateData = function (data) { - if (!this._inflate) { - if (this._bitmapInfo.interlace) { - this._inflate = zlib.createInflate(); - - this._inflate.on("error", this.emit.bind(this, "error")); - this._filter.on("complete", this._complete.bind(this)); - - this._inflate.pipe(this._filter); - } else { - let rowSize = - ((this._bitmapInfo.width * - this._bitmapInfo.bpp * - this._bitmapInfo.depth + - 7) >> - 3) + - 1; - let imageSize = rowSize * this._bitmapInfo.height; - let chunkSize = Math.max(imageSize, zlib.Z_MIN_CHUNK); - - this._inflate = zlib.createInflate({ chunkSize: chunkSize }); - let leftToInflate = imageSize; - - let emitError = this.emit.bind(this, "error"); - this._inflate.on("error", function (err) { - if (!leftToInflate) { - return; - } - - emitError(err); - }); - this._filter.on("complete", this._complete.bind(this)); - - let filterWrite = this._filter.write.bind(this._filter); - this._inflate.on("data", function (chunk) { - if (!leftToInflate) { - return; - } - - if (chunk.length > leftToInflate) { - chunk = chunk.slice(0, leftToInflate); - } - - leftToInflate -= chunk.length; - - filterWrite(chunk); - }); - - this._inflate.on("end", this._filter.end.bind(this._filter)); - } - } - this._inflate.write(data); -}; - -ParserAsync.prototype._handleMetaData = function (metaData) { - this._metaData = metaData; - this._bitmapInfo = Object.create(metaData); - - this._filter = new FilterAsync(this._bitmapInfo); -}; - -ParserAsync.prototype._handleTransColor = function (transColor) { - this._bitmapInfo.transColor = transColor; -}; - -ParserAsync.prototype._handlePalette = function (palette) { - this._bitmapInfo.palette = palette; -}; - -ParserAsync.prototype._simpleTransparency = function () { - this._metaData.alpha = true; -}; - -ParserAsync.prototype._headersFinished = function () { - // Up until this point, we don't know if we have a tRNS chunk (alpha) - // so we can't emit metadata any earlier - this.emit("metadata", this._metaData); -}; - -ParserAsync.prototype._finished = function () { - if (this.errord) { - return; - } - - if (!this._inflate) { - this.emit("error", "No Inflate block"); - } else { - // no more data to inflate - this._inflate.end(); - } -}; - -ParserAsync.prototype._complete = function (filteredData) { - if (this.errord) { - return; - } - - let normalisedBitmapData; - - try { - let bitmapData = bitmapper.dataToBitMap(filteredData, this._bitmapInfo); - - normalisedBitmapData = formatNormaliser(bitmapData, this._bitmapInfo); - bitmapData = null; - } catch (ex) { - this._handleError(ex); - return; - } - - this.emit("parsed", normalisedBitmapData); -}; diff --git a/node_modules/pngjs/lib/parser-sync.js b/node_modules/pngjs/lib/parser-sync.js deleted file mode 100644 index e79796b..0000000 --- a/node_modules/pngjs/lib/parser-sync.js +++ /dev/null @@ -1,108 +0,0 @@ -"use strict"; - -let hasSyncZlib = true; -let zlib = require("zlib"); -let inflateSync = require("./sync-inflate"); -if (!zlib.deflateSync) { - hasSyncZlib = false; -} -let SyncReader = require("./sync-reader"); -let FilterSync = require("./filter-parse-sync"); -let Parser = require("./parser"); -let bitmapper = require("./bitmapper"); -let formatNormaliser = require("./format-normaliser"); - -module.exports = function (buffer, options) { - if (!hasSyncZlib) { - throw new Error( - "To use the sync capability of this library in old node versions, please pin pngjs to v2.3.0" - ); - } - - let err; - function handleError(_err_) { - err = _err_; - } - - let metaData; - function handleMetaData(_metaData_) { - metaData = _metaData_; - } - - function handleTransColor(transColor) { - metaData.transColor = transColor; - } - - function handlePalette(palette) { - metaData.palette = palette; - } - - function handleSimpleTransparency() { - metaData.alpha = true; - } - - let gamma; - function handleGamma(_gamma_) { - gamma = _gamma_; - } - - let inflateDataList = []; - function handleInflateData(inflatedData) { - inflateDataList.push(inflatedData); - } - - let reader = new SyncReader(buffer); - - let parser = new Parser(options, { - read: reader.read.bind(reader), - error: handleError, - metadata: handleMetaData, - gamma: handleGamma, - palette: handlePalette, - transColor: handleTransColor, - inflateData: handleInflateData, - simpleTransparency: handleSimpleTransparency, - }); - - parser.start(); - reader.process(); - - if (err) { - throw err; - } - - //join together the inflate datas - let inflateData = Buffer.concat(inflateDataList); - inflateDataList.length = 0; - - let inflatedData; - if (metaData.interlace) { - inflatedData = zlib.inflateSync(inflateData); - } else { - let rowSize = - ((metaData.width * metaData.bpp * metaData.depth + 7) >> 3) + 1; - let imageSize = rowSize * metaData.height; - inflatedData = inflateSync(inflateData, { - chunkSize: imageSize, - maxLength: imageSize, - }); - } - inflateData = null; - - if (!inflatedData || !inflatedData.length) { - throw new Error("bad png - invalid inflate data response"); - } - - let unfilteredData = FilterSync.process(inflatedData, metaData); - inflateData = null; - - let bitmapData = bitmapper.dataToBitMap(unfilteredData, metaData); - unfilteredData = null; - - let normalisedBitmapData = formatNormaliser(bitmapData, metaData); - - metaData.data = normalisedBitmapData; - metaData.gamma = gamma || 0; - - return metaData; -}; diff --git a/node_modules/pngjs/lib/parser.js b/node_modules/pngjs/lib/parser.js deleted file mode 100644 index 51a8f2a..0000000 --- a/node_modules/pngjs/lib/parser.js +++ /dev/null @@ -1,290 +0,0 @@ -"use strict"; - -let constants = require("./constants"); -let CrcCalculator = require("./crc"); - -let Parser = (module.exports = function (options, dependencies) { - this._options = options; - options.checkCRC = options.checkCRC !== false; - - this._hasIHDR = false; - this._hasIEND = false; - this._emittedHeadersFinished = false; - - // input flags/metadata - this._palette = []; - this._colorType = 0; - - this._chunks = {}; - this._chunks[constants.TYPE_IHDR] = this._handleIHDR.bind(this); - this._chunks[constants.TYPE_IEND] = this._handleIEND.bind(this); - this._chunks[constants.TYPE_IDAT] = this._handleIDAT.bind(this); - this._chunks[constants.TYPE_PLTE] = this._handlePLTE.bind(this); - this._chunks[constants.TYPE_tRNS] = this._handleTRNS.bind(this); - this._chunks[constants.TYPE_gAMA] = this._handleGAMA.bind(this); - - this.read = dependencies.read; - this.error = dependencies.error; - this.metadata = dependencies.metadata; - this.gamma = dependencies.gamma; - this.transColor = dependencies.transColor; - this.palette = dependencies.palette; - this.parsed = dependencies.parsed; - this.inflateData = dependencies.inflateData; - this.finished = dependencies.finished; - this.simpleTransparency = dependencies.simpleTransparency; - this.headersFinished = dependencies.headersFinished || function () {}; -}); - -Parser.prototype.start = function () { - this.read(constants.PNG_SIGNATURE.length, this._parseSignature.bind(this)); -}; - -Parser.prototype._parseSignature = function (data) { - let signature = constants.PNG_SIGNATURE; - - for (let i = 0; i < signature.length; i++) { - if (data[i] !== signature[i]) { - this.error(new Error("Invalid file signature")); - return; - } - } - this.read(8, this._parseChunkBegin.bind(this)); -}; - -Parser.prototype._parseChunkBegin = function (data) { - // chunk content length - let length = data.readUInt32BE(0); - - // chunk type - let type = data.readUInt32BE(4); - let name = ""; - for (let i = 4; i < 8; i++) { - name += String.fromCharCode(data[i]); - } - - //console.log('chunk ', name, length); - - // chunk flags - let ancillary = Boolean(data[4] & 0x20); // or critical - // priv = Boolean(data[5] & 0x20), // or public - // safeToCopy = Boolean(data[7] & 0x20); // or unsafe - - if (!this._hasIHDR && type !== constants.TYPE_IHDR) { - this.error(new Error("Expected IHDR on beggining")); - return; - } - - this._crc = new CrcCalculator(); - this._crc.write(Buffer.from(name)); - - if (this._chunks[type]) { - return this._chunks[type](length); - } - - if (!ancillary) { - this.error(new Error("Unsupported critical chunk type " + name)); - return; - } - - this.read(length + 4, this._skipChunk.bind(this)); -}; - -Parser.prototype._skipChunk = function (/*data*/) { - this.read(8, this._parseChunkBegin.bind(this)); -}; - -Parser.prototype._handleChunkEnd = function () { - this.read(4, this._parseChunkEnd.bind(this)); -}; - -Parser.prototype._parseChunkEnd = function (data) { - let fileCrc = data.readInt32BE(0); - let calcCrc = this._crc.crc32(); - - // check CRC - if (this._options.checkCRC && calcCrc !== fileCrc) { - this.error(new Error("Crc error - " + fileCrc + " - " + calcCrc)); - return; - } - - if (!this._hasIEND) { - this.read(8, this._parseChunkBegin.bind(this)); - } -}; - -Parser.prototype._handleIHDR = function (length) { - this.read(length, this._parseIHDR.bind(this)); -}; -Parser.prototype._parseIHDR = function (data) { - this._crc.write(data); - - let width = data.readUInt32BE(0); - let height = data.readUInt32BE(4); - let depth = data[8]; - let colorType = data[9]; // bits: 1 palette, 2 color, 4 alpha - let compr = data[10]; - let filter = data[11]; - let interlace = data[12]; - - // console.log(' width', width, 'height', height, - // 'depth', depth, 'colorType', colorType, - // 'compr', compr, 'filter', filter, 'interlace', interlace - // ); - - if ( - depth !== 8 && - depth !== 4 && - depth !== 2 && - depth !== 1 && - depth !== 16 - ) { - this.error(new Error("Unsupported bit depth " + depth)); - return; - } - if (!(colorType in constants.COLORTYPE_TO_BPP_MAP)) { - this.error(new Error("Unsupported color type")); - return; - } - if (compr !== 0) { - this.error(new Error("Unsupported compression method")); - return; - } - if (filter !== 0) { - this.error(new Error("Unsupported filter method")); - return; - } - if (interlace !== 0 && interlace !== 1) { - this.error(new Error("Unsupported interlace method")); - return; - } - - this._colorType = colorType; - - let bpp = constants.COLORTYPE_TO_BPP_MAP[this._colorType]; - - this._hasIHDR = true; - - this.metadata({ - width: width, - height: height, - depth: depth, - interlace: Boolean(interlace), - palette: Boolean(colorType & constants.COLORTYPE_PALETTE), - color: Boolean(colorType & constants.COLORTYPE_COLOR), - alpha: Boolean(colorType & constants.COLORTYPE_ALPHA), - bpp: bpp, - colorType: colorType, - }); - - this._handleChunkEnd(); -}; - -Parser.prototype._handlePLTE = function (length) { - this.read(length, this._parsePLTE.bind(this)); -}; -Parser.prototype._parsePLTE = function (data) { - this._crc.write(data); - - let entries = Math.floor(data.length / 3); - // console.log('Palette:', entries); - - for (let i = 0; i < entries; i++) { - this._palette.push([data[i * 3], data[i * 3 + 1], data[i * 3 + 2], 0xff]); - } - - this.palette(this._palette); - - this._handleChunkEnd(); -}; - -Parser.prototype._handleTRNS = function (length) { - this.simpleTransparency(); - this.read(length, this._parseTRNS.bind(this)); -}; -Parser.prototype._parseTRNS = function (data) { - this._crc.write(data); - - // palette - if (this._colorType === constants.COLORTYPE_PALETTE_COLOR) { - if (this._palette.length === 0) { - this.error(new Error("Transparency chunk must be after palette")); - return; - } - if (data.length > this._palette.length) { - this.error(new Error("More transparent colors than palette size")); - return; - } - for (let i = 0; i < data.length; i++) { - this._palette[i][3] = data[i]; - } - this.palette(this._palette); - } - - // for colorType 0 (grayscale) and 2 (rgb) - // there might be one gray/color defined as transparent - if (this._colorType === constants.COLORTYPE_GRAYSCALE) { - // grey, 2 bytes - this.transColor([data.readUInt16BE(0)]); - } - if (this._colorType === constants.COLORTYPE_COLOR) { - this.transColor([ - data.readUInt16BE(0), - data.readUInt16BE(2), - data.readUInt16BE(4), - ]); - } - - this._handleChunkEnd(); -}; - -Parser.prototype._handleGAMA = function (length) { - this.read(length, this._parseGAMA.bind(this)); -}; -Parser.prototype._parseGAMA = function (data) { - this._crc.write(data); - this.gamma(data.readUInt32BE(0) / constants.GAMMA_DIVISION); - - this._handleChunkEnd(); -}; - -Parser.prototype._handleIDAT = function (length) { - if (!this._emittedHeadersFinished) { - this._emittedHeadersFinished = true; - this.headersFinished(); - } - this.read(-length, this._parseIDAT.bind(this, length)); -}; -Parser.prototype._parseIDAT = function (length, data) { - this._crc.write(data); - - if ( - this._colorType === constants.COLORTYPE_PALETTE_COLOR && - this._palette.length === 0 - ) { - throw new Error("Expected palette not found"); - } - - this.inflateData(data); - let leftOverLength = length - data.length; - - if (leftOverLength > 0) { - this._handleIDAT(leftOverLength); - } else { - this._handleChunkEnd(); - } -}; - -Parser.prototype._handleIEND = function (length) { - this.read(length, this._parseIEND.bind(this)); -}; -Parser.prototype._parseIEND = function (data) { - this._crc.write(data); - - this._hasIEND = true; - this._handleChunkEnd(); - - if (this.finished) { - this.finished(); - } -}; diff --git a/node_modules/pngjs/lib/png-sync.js b/node_modules/pngjs/lib/png-sync.js deleted file mode 100644 index 68cac9b..0000000 --- a/node_modules/pngjs/lib/png-sync.js +++ /dev/null @@ -1,12 +0,0 @@ -"use strict"; - -let parse = require("./parser-sync"); -let pack = require("./packer-sync"); - -exports.read = function (buffer, options) { - return parse(buffer, options || {}); -}; - -exports.write = function (png, options) { - return pack(png, options); -}; diff --git a/node_modules/pngjs/lib/png.js b/node_modules/pngjs/lib/png.js deleted file mode 100644 index 0b8af3f..0000000 --- a/node_modules/pngjs/lib/png.js +++ /dev/null @@ -1,194 +0,0 @@ -"use strict"; - -let util = require("util"); -let Stream = require("stream"); -let Parser = require("./parser-async"); -let Packer = require("./packer-async"); -let PNGSync = require("./png-sync"); - -let PNG = (exports.PNG = function (options) { - Stream.call(this); - - options = options || {}; // eslint-disable-line no-param-reassign - - // coerce pixel dimensions to integers (also coerces undefined -> 0): - this.width = options.width | 0; - this.height = options.height | 0; - - this.data = - this.width > 0 && this.height > 0 - ? Buffer.alloc(4 * this.width * this.height) - : null; - - if (options.fill && this.data) { - this.data.fill(0); - } - - this.gamma = 0; - this.readable = this.writable = true; - - this._parser = new Parser(options); - - this._parser.on("error", this.emit.bind(this, "error")); - this._parser.on("close", this._handleClose.bind(this)); - this._parser.on("metadata", this._metadata.bind(this)); - this._parser.on("gamma", this._gamma.bind(this)); - this._parser.on( - "parsed", - function (data) { - this.data = data; - this.emit("parsed", data); - }.bind(this) - ); - - this._packer = new Packer(options); - this._packer.on("data", this.emit.bind(this, "data")); - this._packer.on("end", this.emit.bind(this, "end")); - this._parser.on("close", this._handleClose.bind(this)); - this._packer.on("error", this.emit.bind(this, "error")); -}); -util.inherits(PNG, Stream); - -PNG.sync = PNGSync; - -PNG.prototype.pack = function () { - if (!this.data || !this.data.length) { - this.emit("error", "No data provided"); - return this; - } - - process.nextTick( - function () { - this._packer.pack(this.data, this.width, this.height, this.gamma); - }.bind(this) - ); - - return this; -}; - -PNG.prototype.parse = function (data, callback) { - if (callback) { - let onParsed, onError; - - onParsed = function (parsedData) { - this.removeListener("error", onError); - - this.data = parsedData; - callback(null, this); - }.bind(this); - - onError = function (err) { - this.removeListener("parsed", onParsed); - - callback(err, null); - }.bind(this); - - this.once("parsed", onParsed); - this.once("error", onError); - } - - this.end(data); - return this; -}; - -PNG.prototype.write = function (data) { - this._parser.write(data); - return true; -}; - -PNG.prototype.end = function (data) { - this._parser.end(data); -}; - -PNG.prototype._metadata = function (metadata) { - this.width = metadata.width; - this.height = metadata.height; - - this.emit("metadata", metadata); -}; - -PNG.prototype._gamma = function (gamma) { - this.gamma = gamma; -}; - -PNG.prototype._handleClose = function () { - if (!this._parser.writable && !this._packer.readable) { - this.emit("close"); - } -}; - -PNG.bitblt = function (src, dst, srcX, srcY, width, height, deltaX, deltaY) { - // eslint-disable-line max-params - // coerce pixel dimensions to integers (also coerces undefined -> 0): - /* eslint-disable no-param-reassign */ - srcX |= 0; - srcY |= 0; - width |= 0; - height |= 0; - deltaX |= 0; - deltaY |= 0; - /* eslint-enable no-param-reassign */ - - if ( - srcX > src.width || - srcY > src.height || - srcX + width > src.width || - srcY + height > src.height - ) { - throw new Error("bitblt reading outside image"); - } - - if ( - deltaX > dst.width || - deltaY > dst.height || - deltaX + width > dst.width || - deltaY + height > dst.height - ) { - throw new Error("bitblt writing outside image"); - } - - for (let y = 0; y < height; y++) { - src.data.copy( - dst.data, - ((deltaY + y) * dst.width + deltaX) << 2, - ((srcY + y) * src.width + srcX) << 2, - ((srcY + y) * src.width + srcX + width) << 2 - ); - } -}; - -PNG.prototype.bitblt = function ( - dst, - srcX, - srcY, - width, - height, - deltaX, - deltaY -) { - // eslint-disable-line max-params - - PNG.bitblt(this, dst, srcX, srcY, width, height, deltaX, deltaY); - return this; -}; - -PNG.adjustGamma = function (src) { - if (src.gamma) { - for (let y = 0; y < src.height; y++) { - for (let x = 0; x < src.width; x++) { - let idx = (src.width * y + x) << 2; - - for (let i = 0; i < 3; i++) { - let sample = src.data[idx + i] / 255; - sample = Math.pow(sample, 1 / 2.2 / src.gamma); - src.data[idx + i] = Math.round(sample * 255); - } - } - } - src.gamma = 0; - } -}; - -PNG.prototype.adjustGamma = function () { - PNG.adjustGamma(this); -}; diff --git a/node_modules/pngjs/lib/sync-inflate.js b/node_modules/pngjs/lib/sync-inflate.js deleted file mode 100644 index 4da0d5f..0000000 --- a/node_modules/pngjs/lib/sync-inflate.js +++ /dev/null @@ -1,168 +0,0 @@ -"use strict"; - -let assert = require("assert").ok; -let zlib = require("zlib"); -let util = require("util"); - -let kMaxLength = require("buffer").kMaxLength; - -function Inflate(opts) { - if (!(this instanceof Inflate)) { - return new Inflate(opts); - } - - if (opts && opts.chunkSize < zlib.Z_MIN_CHUNK) { - opts.chunkSize = zlib.Z_MIN_CHUNK; - } - - zlib.Inflate.call(this, opts); - - // Node 8 --> 9 compatibility check - this._offset = this._offset === undefined ? this._outOffset : this._offset; - this._buffer = this._buffer || this._outBuffer; - - if (opts && opts.maxLength != null) { - this._maxLength = opts.maxLength; - } -} - -function createInflate(opts) { - return new Inflate(opts); -} - -function _close(engine, callback) { - if (callback) { - process.nextTick(callback); - } - - // Caller may invoke .close after a zlib error (which will null _handle). - if (!engine._handle) { - return; - } - - engine._handle.close(); - engine._handle = null; -} - -Inflate.prototype._processChunk = function (chunk, flushFlag, asyncCb) { - if (typeof asyncCb === "function") { - return zlib.Inflate._processChunk.call(this, chunk, flushFlag, asyncCb); - } - - let self = this; - - let availInBefore = chunk && chunk.length; - let availOutBefore = this._chunkSize - this._offset; - let leftToInflate = this._maxLength; - let inOff = 0; - - let buffers = []; - let nread = 0; - - let error; - this.on("error", function (err) { - error = err; - }); - - function handleChunk(availInAfter, availOutAfter) { - if (self._hadError) { - return; - } - - let have = availOutBefore - availOutAfter; - assert(have >= 0, "have should not go down"); - - if (have > 0) { - let out = self._buffer.slice(self._offset, self._offset + have); - self._offset += have; - - if (out.length > leftToInflate) { - out = out.slice(0, leftToInflate); - } - - buffers.push(out); - nread += out.length; - leftToInflate -= out.length; - - if (leftToInflate === 0) { - return false; - } - } - - if (availOutAfter === 0 || self._offset >= self._chunkSize) { - availOutBefore = self._chunkSize; - self._offset = 0; - self._buffer = Buffer.allocUnsafe(self._chunkSize); - } - - if (availOutAfter === 0) { - inOff += availInBefore - availInAfter; - availInBefore = availInAfter; - - return true; - } - - return false; - } - - assert(this._handle, "zlib binding closed"); - let res; - do { - res = this._handle.writeSync( - flushFlag, - chunk, // in - inOff, // in_off - availInBefore, // in_len - this._buffer, // out - this._offset, //out_off - availOutBefore - ); // out_len - // Node 8 --> 9 compatibility check - res = res || this._writeState; - } while (!this._hadError && handleChunk(res[0], res[1])); - - if (this._hadError) { - throw error; - } - - if (nread >= kMaxLength) { - _close(this); - throw new RangeError( - "Cannot create final Buffer. It would be larger than 0x" + - kMaxLength.toString(16) + - " bytes" - ); - } - - let buf = Buffer.concat(buffers, nread); - _close(this); - - return buf; -}; - -util.inherits(Inflate, zlib.Inflate); - -function zlibBufferSync(engine, buffer) { - if (typeof buffer === "string") { - buffer = Buffer.from(buffer); - } - if (!(buffer instanceof Buffer)) { - throw new TypeError("Not a string or buffer"); - } - - let flushFlag = engine._finishFlushFlag; - if (flushFlag == null) { - flushFlag = zlib.Z_FINISH; - } - - return engine._processChunk(buffer, flushFlag); -} - -function inflateSync(buffer, opts) { - return zlibBufferSync(new Inflate(opts), buffer); -} - -module.exports = exports = inflateSync; -exports.Inflate = Inflate; -exports.createInflate = createInflate; -exports.inflateSync = inflateSync; diff --git a/node_modules/pngjs/lib/sync-reader.js b/node_modules/pngjs/lib/sync-reader.js deleted file mode 100644 index 15cbd4c..0000000 --- a/node_modules/pngjs/lib/sync-reader.js +++ /dev/null @@ -1,45 +0,0 @@ -"use strict"; - -let SyncReader = (module.exports = function (buffer) { - this._buffer = buffer; - this._reads = []; -}); - -SyncReader.prototype.read = function (length, callback) { - this._reads.push({ - length: Math.abs(length), // if length < 0 then at most this length - allowLess: length < 0, - func: callback, - }); -}; - -SyncReader.prototype.process = function () { - // as long as there is any data and read requests - while (this._reads.length > 0 && this._buffer.length) { - let read = this._reads[0]; - - if ( - this._buffer.length && - (this._buffer.length >= read.length || read.allowLess) - ) { - // ok there is any data so that we can satisfy this request - this._reads.shift(); // == read - - let buf = this._buffer; - - this._buffer = buf.slice(read.length); - - read.func.call(this, buf.slice(0, read.length)); - } else { - break; - } - } - - if (this._reads.length > 0) { - return new Error("There are some read requests waitng on finished stream"); - } - - if (this._buffer.length > 0) { - return new Error("unrecognised content at end of stream"); - } -}; diff --git a/node_modules/pngjs/package.json b/node_modules/pngjs/package.json deleted file mode 100644 index 12a9871..0000000 --- a/node_modules/pngjs/package.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "name": "pngjs", - "version": "5.0.0", - "description": "PNG encoder/decoder in pure JS, supporting any bit size & interlace, async & sync with full test suite.", - "contributors": [ - "Alexandre Paré", - "Gaurav Mali", - "Gusts Kaksis", - "Kuba Niegowski", - "Luke Page", - "Pietajan De Potter", - "Steven Sojka", - "liangzeng", - "Michael Vogt", - "Xin-Xin Wang", - "toriningen", - "Eugene Kulabuhov" - ], - "homepage": "https://github.com/lukeapage/pngjs", - "keywords": [ - "PNG", - "decoder", - "encoder", - "js-png", - "node-png", - "parser", - "png", - "png-js", - "png-parse", - "pngjs" - ], - "engines": { - "node": ">=10.13.0" - }, - "main": "./lib/png.js", - "directories": { - "lib": "lib", - "example": "examples", - "test": "test" - }, - "scripts": { - "build": "yarn prepublish", - "prepublish": "yarn browserify", - "browserify": "browserify lib/png.js --standalone png > browser.js", - "coverage": "nyc --reporter=lcov --reporter=text-summary tape test/*-spec.js nolarge", - "test": "yarn lint && yarn prettier:check && tape test/*-spec.js | tap-dot && node test/run-compare", - "lint": "eslint .", - "prettier:write": "prettier --write .", - "prettier:check": "prettier --check ." - }, - "repository": { - "type": "git", - "url": "git://github.com/lukeapage/pngjs.git" - }, - "license": "MIT", - "bugs": { - "url": "https://github.com/lukeapage/pngjs/issues" - }, - "devDependencies": { - "browserify": "16.5.1", - "buffer-equal": "1.0.0", - "codecov": "3.6.5", - "connect": "3.7.0", - "eslint": "6.8.0", - "eslint-config-prettier": "6.10.1", - "nyc": "15.0.1", - "prettier": "2.0.4", - "puppeteer": "2.1.1", - "serve-static": "1.14.1", - "tap-dot": "2.0.0", - "tape": "4.13.2" - } -} diff --git a/node_modules/postcss-import/LICENSE b/node_modules/postcss-import/LICENSE deleted file mode 100644 index 13983fb..0000000 --- a/node_modules/postcss-import/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Maxime Thirouin, Jason Campbell & Kevin Mårtensson - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/postcss-import/README.md b/node_modules/postcss-import/README.md deleted file mode 100644 index ac0148e..0000000 --- a/node_modules/postcss-import/README.md +++ /dev/null @@ -1,244 +0,0 @@ -# postcss-import - -[![Build](https://img.shields.io/travis/postcss/postcss-import/master)](https://travis-ci.org/postcss/postcss-import) -[![Version](https://img.shields.io/npm/v/postcss-import)](https://github.com/postcss/postcss-import/blob/master/CHANGELOG.md) -[![postcss compatibility](https://img.shields.io/npm/dependency-version/postcss-import/peer/postcss)](https://postcss.org/) - -> [PostCSS](https://github.com/postcss/postcss) plugin to transform `@import` -rules by inlining content. - -This plugin can consume local files, node modules or web_modules. -To resolve path of an `@import` rule, it can look into root directory -(by default `process.cwd()`), `web_modules`, `node_modules` -or local modules. -_When importing a module, it will look for `index.css` or file referenced in -`package.json` in the `style` or `main` fields._ -You can also provide manually multiples paths where to look at. - -**Notes:** - -- **This plugin should probably be used as the first plugin of your list. -This way, other plugins will work on the AST as if there were only a single file -to process, and will probably work as you can expect**. -- This plugin works great with -[postcss-url](https://github.com/postcss/postcss-url) plugin, -which will allow you to adjust assets `url()` (or even inline them) after -inlining imported files. -- In order to optimize output, **this plugin will only import a file once** on -a given scope (root, media query...). -Tests are made from the path & the content of imported files (using a hash -table). -If this behavior is not what you want, look at `skipDuplicates` option -- If you are looking for **Glob Imports**, you can use [postcss-import-ext-glob](https://github.com/dimitrinicolas/postcss-import-ext-glob) to extend postcss-import. -- Imports which are not modified (by `options.filter` or because they are remote - imports) are moved to the top of the output. -- **This plugin attempts to follow the CSS `@import` spec**; `@import` - statements must precede all other statements (besides `@charset`). - -## Installation - -```console -$ npm install -D postcss-import -``` - -## Usage - -Unless your stylesheet is in the same place where you run postcss -(`process.cwd()`), you will need to use `from` option to make relative imports -work. - -```js -// dependencies -const fs = require("fs") -const postcss = require("postcss") -const atImport = require("postcss-import") - -// css to be processed -const css = fs.readFileSync("css/input.css", "utf8") - -// process css -postcss() - .use(atImport()) - .process(css, { - // `from` option is needed here - from: "css/input.css" - }) - .then((result) => { - const output = result.css - - console.log(output) - }) -``` - -`css/input.css`: - -```css -/* can consume `node_modules`, `web_modules` or local modules */ -@import "cssrecipes-defaults"; /* == @import "../node_modules/cssrecipes-defaults/index.css"; */ -@import "normalize.css"; /* == @import "../node_modules/normalize.css/normalize.css"; */ - -@import "foo.css"; /* relative to css/ according to `from` option above */ - -@import "bar.css" (min-width: 25em); - -@import 'baz.css' layer(baz-layer); - -body { - background: black; -} -``` - -will give you: - -```css -/* ... content of ../node_modules/cssrecipes-defaults/index.css */ -/* ... content of ../node_modules/normalize.css/normalize.css */ - -/* ... content of css/foo.css */ - -@media (min-width: 25em) { -/* ... content of css/bar.css */ -} - -@layer baz-layer { -/* ... content of css/baz.css */ -} - -body { - background: black; -} -``` - -Checkout the [tests](test) for more examples. - -### Options - -### `filter` -Type: `Function` -Default: `() => true` - -Only transform imports for which the test function returns `true`. Imports for -which the test function returns `false` will be left as is. The function gets -the path to import as an argument and should return a boolean. - -#### `root` - -Type: `String` -Default: `process.cwd()` or _dirname of -[the postcss `from`](https://github.com/postcss/postcss#node-source)_ - -Define the root where to resolve path (eg: place where `node_modules` are). -Should not be used that much. -_Note: nested `@import` will additionally benefit of the relative dirname of -imported files._ - -#### `path` - -Type: `String|Array` -Default: `[]` - -A string or an array of paths in where to look for files. - -#### `plugins` - -Type: `Array` -Default: `undefined` - -An array of plugins to be applied on each imported files. - -#### `resolve` - -Type: `Function` -Default: `null` - -You can provide a custom path resolver with this option. This function gets -`(id, basedir, importOptions)` arguments and should return a path, an array of -paths or a promise resolving to the path(s). If you do not return an absolute -path, your path will be resolved to an absolute path using the default -resolver. -You can use [resolve](https://github.com/substack/node-resolve) for this. - -#### `load` - -Type: `Function` -Default: null - -You can overwrite the default loading way by setting this option. -This function gets `(filename, importOptions)` arguments and returns content or -promised content. - -#### `skipDuplicates` - -Type: `Boolean` -Default: `true` - -By default, similar files (based on the same content) are being skipped. -It's to optimize output and skip similar files like `normalize.css` for example. -If this behavior is not what you want, just set this option to `false` to -disable it. - -#### `addModulesDirectories` - -Type: `Array` -Default: `[]` - -An array of folder names to add to [Node's resolver](https://github.com/substack/node-resolve). -Values will be appended to the default resolve directories: -`["node_modules", "web_modules"]`. - -This option is only for adding additional directories to default resolver. If -you provide your own resolver via the `resolve` configuration option above, then -this value will be ignored. - -#### `nameLayer` - -Type: `Function` -Default: `null` - -You can provide a custom naming function for anonymous layers (`@import 'baz.css' layer;`). -This function gets `(index, rootFilename)` arguments and should return a unique string. - -This option only influences imports without a layer name. -Without this option the plugin will warn on anonymous layers. - -#### Example with some options - -```js -const postcss = require("postcss") -const atImport = require("postcss-import") - -postcss() - .use(atImport({ - path: ["src/css"], - })) - .process(cssString) - .then((result) => { - const { css } = result - }) -``` - -## `dependency` Message Support - -`postcss-import` adds a message to `result.messages` for each `@import`. Messages are in the following format: - -``` -{ - type: 'dependency', - file: absoluteFilePath, - parent: fileContainingTheImport -} -``` - -This is mainly for use by postcss runners that implement file watching. - ---- - -## CONTRIBUTING - -* ⇄ Pull requests and ★ Stars are always welcome. -* For bugs and feature requests, please create an issue. -* Pull requests must be accompanied by passing automated tests (`$ npm test`). - -## [Changelog](CHANGELOG.md) - -## [License](LICENSE) diff --git a/node_modules/postcss-import/index.js b/node_modules/postcss-import/index.js deleted file mode 100644 index d324a7e..0000000 --- a/node_modules/postcss-import/index.js +++ /dev/null @@ -1,420 +0,0 @@ -"use strict" -// builtin tooling -const path = require("path") - -// internal tooling -const joinMedia = require("./lib/join-media") -const joinLayer = require("./lib/join-layer") -const resolveId = require("./lib/resolve-id") -const loadContent = require("./lib/load-content") -const processContent = require("./lib/process-content") -const parseStatements = require("./lib/parse-statements") -const assignLayerNames = require("./lib/assign-layer-names") -const dataURL = require("./lib/data-url") - -function AtImport(options) { - options = { - root: process.cwd(), - path: [], - skipDuplicates: true, - resolve: resolveId, - load: loadContent, - plugins: [], - addModulesDirectories: [], - nameLayer: null, - ...options, - } - - options.root = path.resolve(options.root) - - // convert string to an array of a single element - if (typeof options.path === "string") options.path = [options.path] - - if (!Array.isArray(options.path)) options.path = [] - - options.path = options.path.map(p => path.resolve(options.root, p)) - - return { - postcssPlugin: "postcss-import", - Once(styles, { result, atRule, postcss }) { - const state = { - importedFiles: {}, - hashFiles: {}, - rootFilename: null, - anonymousLayerCounter: 0, - } - - if (styles.source?.input?.file) { - state.rootFilename = styles.source.input.file - state.importedFiles[styles.source.input.file] = {} - } - - if (options.plugins && !Array.isArray(options.plugins)) { - throw new Error("plugins option must be an array") - } - - if (options.nameLayer && typeof options.nameLayer !== "function") { - throw new Error("nameLayer option must be a function") - } - - return parseStyles(result, styles, options, state, [], []).then( - bundle => { - applyRaws(bundle) - applyMedia(bundle) - applyStyles(bundle, styles) - } - ) - - function applyRaws(bundle) { - bundle.forEach((stmt, index) => { - if (index === 0) return - - if (stmt.parent) { - const { before } = stmt.parent.node.raws - if (stmt.type === "nodes") stmt.nodes[0].raws.before = before - else stmt.node.raws.before = before - } else if (stmt.type === "nodes") { - stmt.nodes[0].raws.before = stmt.nodes[0].raws.before || "\n" - } - }) - } - - function applyMedia(bundle) { - bundle.forEach(stmt => { - if ( - (!stmt.media.length && !stmt.layer.length) || - stmt.type === "charset" - ) { - return - } - - if (stmt.layer.length > 1) { - assignLayerNames(stmt.layer, stmt.node, state, options) - } - - if (stmt.type === "import") { - const parts = [stmt.fullUri] - - const media = stmt.media.join(", ") - - if (stmt.layer.length) { - const layerName = stmt.layer.join(".") - - let layerParams = "layer" - if (layerName) { - layerParams = `layer(${layerName})` - } - - parts.push(layerParams) - } - - if (media) { - parts.push(media) - } - - stmt.node.params = parts.join(" ") - } else if (stmt.type === "media") { - if (stmt.layer.length) { - const layerNode = atRule({ - name: "layer", - params: stmt.layer.join("."), - source: stmt.node.source, - }) - - if (stmt.parentMedia?.length) { - const mediaNode = atRule({ - name: "media", - params: stmt.parentMedia.join(", "), - source: stmt.node.source, - }) - - mediaNode.append(layerNode) - layerNode.append(stmt.node) - stmt.node = mediaNode - } else { - layerNode.append(stmt.node) - stmt.node = layerNode - } - } else { - stmt.node.params = stmt.media.join(", ") - } - } else { - const { nodes } = stmt - const { parent } = nodes[0] - - let outerAtRule - let innerAtRule - if (stmt.media.length && stmt.layer.length) { - const mediaNode = atRule({ - name: "media", - params: stmt.media.join(", "), - source: parent.source, - }) - - const layerNode = atRule({ - name: "layer", - params: stmt.layer.join("."), - source: parent.source, - }) - - mediaNode.append(layerNode) - innerAtRule = layerNode - outerAtRule = mediaNode - } else if (stmt.media.length) { - const mediaNode = atRule({ - name: "media", - params: stmt.media.join(", "), - source: parent.source, - }) - - innerAtRule = mediaNode - outerAtRule = mediaNode - } else if (stmt.layer.length) { - const layerNode = atRule({ - name: "layer", - params: stmt.layer.join("."), - source: parent.source, - }) - - innerAtRule = layerNode - outerAtRule = layerNode - } - - parent.insertBefore(nodes[0], outerAtRule) - - // remove nodes - nodes.forEach(node => { - node.parent = undefined - }) - - // better output - nodes[0].raws.before = nodes[0].raws.before || "\n" - - // wrap new rules with media query and/or layer at rule - innerAtRule.append(nodes) - - stmt.type = "media" - stmt.node = outerAtRule - delete stmt.nodes - } - }) - } - - function applyStyles(bundle, styles) { - styles.nodes = [] - - // Strip additional statements. - bundle.forEach(stmt => { - if (["charset", "import", "media"].includes(stmt.type)) { - stmt.node.parent = undefined - styles.append(stmt.node) - } else if (stmt.type === "nodes") { - stmt.nodes.forEach(node => { - node.parent = undefined - styles.append(node) - }) - } - }) - } - - function parseStyles(result, styles, options, state, media, layer) { - const statements = parseStatements(result, styles) - - return Promise.resolve(statements) - .then(stmts => { - // process each statement in series - return stmts.reduce((promise, stmt) => { - return promise.then(() => { - stmt.media = joinMedia(media, stmt.media || []) - stmt.parentMedia = media - stmt.layer = joinLayer(layer, stmt.layer || []) - - // skip protocol base uri (protocol://url) or protocol-relative - if ( - stmt.type !== "import" || - /^(?:[a-z]+:)?\/\//i.test(stmt.uri) - ) { - return - } - - if (options.filter && !options.filter(stmt.uri)) { - // rejected by filter - return - } - - return resolveImportId(result, stmt, options, state) - }) - }, Promise.resolve()) - }) - .then(() => { - let charset - const imports = [] - const bundle = [] - - function handleCharset(stmt) { - if (!charset) charset = stmt - // charsets aren't case-sensitive, so convert to lower case to compare - else if ( - stmt.node.params.toLowerCase() !== - charset.node.params.toLowerCase() - ) { - throw new Error( - `Incompatable @charset statements: - ${stmt.node.params} specified in ${stmt.node.source.input.file} - ${charset.node.params} specified in ${charset.node.source.input.file}` - ) - } - } - - // squash statements and their children - statements.forEach(stmt => { - if (stmt.type === "charset") handleCharset(stmt) - else if (stmt.type === "import") { - if (stmt.children) { - stmt.children.forEach((child, index) => { - if (child.type === "import") imports.push(child) - else if (child.type === "charset") handleCharset(child) - else bundle.push(child) - // For better output - if (index === 0) child.parent = stmt - }) - } else imports.push(stmt) - } else if (stmt.type === "media" || stmt.type === "nodes") { - bundle.push(stmt) - } - }) - - return charset - ? [charset, ...imports.concat(bundle)] - : imports.concat(bundle) - }) - } - - function resolveImportId(result, stmt, options, state) { - if (dataURL.isValid(stmt.uri)) { - return loadImportContent(result, stmt, stmt.uri, options, state).then( - result => { - stmt.children = result - } - ) - } - - const atRule = stmt.node - let sourceFile - if (atRule.source?.input?.file) { - sourceFile = atRule.source.input.file - } - const base = sourceFile - ? path.dirname(atRule.source.input.file) - : options.root - - return Promise.resolve(options.resolve(stmt.uri, base, options)) - .then(paths => { - if (!Array.isArray(paths)) paths = [paths] - // Ensure that each path is absolute: - return Promise.all( - paths.map(file => { - return !path.isAbsolute(file) - ? resolveId(file, base, options) - : file - }) - ) - }) - .then(resolved => { - // Add dependency messages: - resolved.forEach(file => { - result.messages.push({ - type: "dependency", - plugin: "postcss-import", - file, - parent: sourceFile, - }) - }) - - return Promise.all( - resolved.map(file => { - return loadImportContent(result, stmt, file, options, state) - }) - ) - }) - .then(result => { - // Merge loaded statements - stmt.children = result.reduce((result, statements) => { - return statements ? result.concat(statements) : result - }, []) - }) - } - - function loadImportContent(result, stmt, filename, options, state) { - const atRule = stmt.node - const { media, layer } = stmt - - assignLayerNames(layer, atRule, state, options) - - if (options.skipDuplicates) { - // skip files already imported at the same scope - if (state.importedFiles[filename]?.[media]?.[layer]) { - return - } - - // save imported files to skip them next time - if (!state.importedFiles[filename]) { - state.importedFiles[filename] = {} - } - if (!state.importedFiles[filename][media]) { - state.importedFiles[filename][media] = {} - } - state.importedFiles[filename][media][layer] = true - } - - return Promise.resolve(options.load(filename, options)).then( - content => { - if (content.trim() === "") { - result.warn(`${filename} is empty`, { node: atRule }) - return - } - - // skip previous imported files not containing @import rules - if (state.hashFiles[content]?.[media]?.[layer]) { - return - } - - return processContent( - result, - content, - filename, - options, - postcss - ).then(importedResult => { - const styles = importedResult.root - result.messages = result.messages.concat(importedResult.messages) - - if (options.skipDuplicates) { - const hasImport = styles.some(child => { - return child.type === "atrule" && child.name === "import" - }) - if (!hasImport) { - // save hash files to skip them next time - if (!state.hashFiles[content]) { - state.hashFiles[content] = {} - } - if (!state.hashFiles[content][media]) { - state.hashFiles[content][media] = {} - } - state.hashFiles[content][media][layer] = true - } - } - - // recursion: import @import from imported file - return parseStyles(result, styles, options, state, media, layer) - }) - } - ) - } - }, - } -} - -AtImport.postcss = true - -module.exports = AtImport diff --git a/node_modules/postcss-import/lib/assign-layer-names.js b/node_modules/postcss-import/lib/assign-layer-names.js deleted file mode 100644 index 18cfcc7..0000000 --- a/node_modules/postcss-import/lib/assign-layer-names.js +++ /dev/null @@ -1,17 +0,0 @@ -"use strict" - -module.exports = function (layer, node, state, options) { - layer.forEach((layerPart, i) => { - if (layerPart.trim() === "") { - if (options.nameLayer) { - layer[i] = options - .nameLayer(state.anonymousLayerCounter++, state.rootFilename) - .toString() - } else { - throw node.error( - `When using anonymous layers in @import you must also set the "nameLayer" plugin option` - ) - } - } - }) -} diff --git a/node_modules/postcss-import/lib/data-url.js b/node_modules/postcss-import/lib/data-url.js deleted file mode 100644 index a59c5fb..0000000 --- a/node_modules/postcss-import/lib/data-url.js +++ /dev/null @@ -1,17 +0,0 @@ -"use strict" - -const dataURLRegexp = /^data:text\/css;base64,/i - -function isValid(url) { - return dataURLRegexp.test(url) -} - -function contents(url) { - // "data:text/css;base64,".length === 21 - return Buffer.from(url.slice(21), "base64").toString() -} - -module.exports = { - isValid, - contents, -} diff --git a/node_modules/postcss-import/lib/join-layer.js b/node_modules/postcss-import/lib/join-layer.js deleted file mode 100644 index 9d91519..0000000 --- a/node_modules/postcss-import/lib/join-layer.js +++ /dev/null @@ -1,9 +0,0 @@ -"use strict" - -module.exports = function (parentLayer, childLayer) { - if (!parentLayer.length && childLayer.length) return childLayer - if (parentLayer.length && !childLayer.length) return parentLayer - if (!parentLayer.length && !childLayer.length) return [] - - return parentLayer.concat(childLayer) -} diff --git a/node_modules/postcss-import/lib/join-media.js b/node_modules/postcss-import/lib/join-media.js deleted file mode 100644 index fcaaecd..0000000 --- a/node_modules/postcss-import/lib/join-media.js +++ /dev/null @@ -1,28 +0,0 @@ -"use strict" - -const startsWithKeywordRegexp = /^(all|not|only|print|screen)/i - -module.exports = function (parentMedia, childMedia) { - if (!parentMedia.length && childMedia.length) return childMedia - if (parentMedia.length && !childMedia.length) return parentMedia - if (!parentMedia.length && !childMedia.length) return [] - - const media = [] - - parentMedia.forEach(parentItem => { - const parentItemStartsWithKeyword = startsWithKeywordRegexp.test(parentItem) - - childMedia.forEach(childItem => { - const childItemStartsWithKeyword = startsWithKeywordRegexp.test(childItem) - if (parentItem !== childItem) { - if (childItemStartsWithKeyword && !parentItemStartsWithKeyword) { - media.push(`${childItem} and ${parentItem}`) - } else { - media.push(`${parentItem} and ${childItem}`) - } - } - }) - }) - - return media -} diff --git a/node_modules/postcss-import/lib/load-content.js b/node_modules/postcss-import/lib/load-content.js deleted file mode 100644 index c10b57e..0000000 --- a/node_modules/postcss-import/lib/load-content.js +++ /dev/null @@ -1,12 +0,0 @@ -"use strict" - -const readCache = require("read-cache") -const dataURL = require("./data-url") - -module.exports = filename => { - if (dataURL.isValid(filename)) { - return dataURL.contents(filename) - } - - return readCache(filename, "utf-8") -} diff --git a/node_modules/postcss-import/lib/parse-statements.js b/node_modules/postcss-import/lib/parse-statements.js deleted file mode 100644 index 0c94e5a..0000000 --- a/node_modules/postcss-import/lib/parse-statements.js +++ /dev/null @@ -1,172 +0,0 @@ -"use strict" - -// external tooling -const valueParser = require("postcss-value-parser") - -// extended tooling -const { stringify } = valueParser - -function split(params, start) { - const list = [] - const last = params.reduce((item, node, index) => { - if (index < start) return "" - if (node.type === "div" && node.value === ",") { - list.push(item) - return "" - } - return item + stringify(node) - }, "") - list.push(last) - return list -} - -module.exports = function (result, styles) { - const statements = [] - let nodes = [] - - styles.each(node => { - let stmt - if (node.type === "atrule") { - if (node.name === "import") stmt = parseImport(result, node) - else if (node.name === "media") stmt = parseMedia(result, node) - else if (node.name === "charset") stmt = parseCharset(result, node) - } - - if (stmt) { - if (nodes.length) { - statements.push({ - type: "nodes", - nodes, - media: [], - layer: [], - }) - nodes = [] - } - statements.push(stmt) - } else nodes.push(node) - }) - - if (nodes.length) { - statements.push({ - type: "nodes", - nodes, - media: [], - layer: [], - }) - } - - return statements -} - -function parseMedia(result, atRule) { - const params = valueParser(atRule.params).nodes - return { - type: "media", - node: atRule, - media: split(params, 0), - layer: [], - } -} - -function parseCharset(result, atRule) { - if (atRule.prev()) { - return result.warn("@charset must precede all other statements", { - node: atRule, - }) - } - return { - type: "charset", - node: atRule, - media: [], - layer: [], - } -} - -function parseImport(result, atRule) { - let prev = atRule.prev() - if (prev) { - do { - if ( - prev.type !== "comment" && - (prev.type !== "atrule" || - (prev.name !== "import" && - prev.name !== "charset" && - !(prev.name === "layer" && !prev.nodes))) - ) { - return result.warn( - "@import must precede all other statements (besides @charset or empty @layer)", - { node: atRule } - ) - } - prev = prev.prev() - } while (prev) - } - - if (atRule.nodes) { - return result.warn( - "It looks like you didn't end your @import statement correctly. " + - "Child nodes are attached to it.", - { node: atRule } - ) - } - - const params = valueParser(atRule.params).nodes - const stmt = { - type: "import", - node: atRule, - media: [], - layer: [], - } - - // prettier-ignore - if ( - !params.length || - ( - params[0].type !== "string" || - !params[0].value - ) && - ( - params[0].type !== "function" || - params[0].value !== "url" || - !params[0].nodes.length || - !params[0].nodes[0].value - ) - ) { - return result.warn(`Unable to find uri in '${ atRule.toString() }'`, { - node: atRule, - }) - } - - if (params[0].type === "string") stmt.uri = params[0].value - else stmt.uri = params[0].nodes[0].value - stmt.fullUri = stringify(params[0]) - - let remainder = params - if (remainder.length > 2) { - if ( - (remainder[2].type === "word" || remainder[2].type === "function") && - remainder[2].value === "layer" - ) { - if (remainder[1].type !== "space") { - return result.warn("Invalid import layer statement", { node: atRule }) - } - - if (remainder[2].nodes) { - stmt.layer = [stringify(remainder[2].nodes)] - } else { - stmt.layer = [""] - } - remainder = remainder.slice(2) - } - } - - if (remainder.length > 2) { - if (remainder[1].type !== "space") { - return result.warn("Invalid import media statement", { node: atRule }) - } - - stmt.media = split(remainder, 2) - } - - return stmt -} diff --git a/node_modules/postcss-import/lib/process-content.js b/node_modules/postcss-import/lib/process-content.js deleted file mode 100644 index ec413e0..0000000 --- a/node_modules/postcss-import/lib/process-content.js +++ /dev/null @@ -1,59 +0,0 @@ -"use strict" - -// builtin tooling -const path = require("path") - -// placeholder tooling -let sugarss - -module.exports = function processContent( - result, - content, - filename, - options, - postcss -) { - const { plugins } = options - const ext = path.extname(filename) - - const parserList = [] - - // SugarSS support: - if (ext === ".sss") { - if (!sugarss) { - try { - sugarss = require("sugarss") - } catch {} // Ignore - } - if (sugarss) - return runPostcss(postcss, content, filename, plugins, [sugarss]) - } - - // Syntax support: - if (result.opts.syntax?.parse) { - parserList.push(result.opts.syntax.parse) - } - - // Parser support: - if (result.opts.parser) parserList.push(result.opts.parser) - // Try the default as a last resort: - parserList.push(null) - - return runPostcss(postcss, content, filename, plugins, parserList) -} - -function runPostcss(postcss, content, filename, plugins, parsers, index) { - if (!index) index = 0 - return postcss(plugins) - .process(content, { - from: filename, - parser: parsers[index], - }) - .catch(err => { - // If there's an error, try the next parser - index++ - // If there are no parsers left, throw it - if (index === parsers.length) throw err - return runPostcss(postcss, content, filename, plugins, parsers, index) - }) -} diff --git a/node_modules/postcss-import/lib/resolve-id.js b/node_modules/postcss-import/lib/resolve-id.js deleted file mode 100644 index ffef034..0000000 --- a/node_modules/postcss-import/lib/resolve-id.js +++ /dev/null @@ -1,42 +0,0 @@ -"use strict" - -// external tooling -const resolve = require("resolve") - -const moduleDirectories = ["web_modules", "node_modules"] - -function resolveModule(id, opts) { - return new Promise((res, rej) => { - resolve(id, opts, (err, path) => (err ? rej(err) : res(path))) - }) -} - -module.exports = function (id, base, options) { - const paths = options.path - - const resolveOpts = { - basedir: base, - moduleDirectory: moduleDirectories.concat(options.addModulesDirectories), - paths, - extensions: [".css"], - packageFilter: function processPackage(pkg) { - if (pkg.style) pkg.main = pkg.style - else if (!pkg.main || !/\.css$/.test(pkg.main)) pkg.main = "index.css" - return pkg - }, - preserveSymlinks: false, - } - - return resolveModule(`./${id}`, resolveOpts) - .catch(() => resolveModule(id, resolveOpts)) - .catch(() => { - if (paths.indexOf(base) === -1) paths.unshift(base) - - throw new Error( - `Failed to find '${id}' - in [ - ${paths.join(",\n ")} - ]` - ) - }) -} diff --git a/node_modules/postcss-import/package.json b/node_modules/postcss-import/package.json deleted file mode 100644 index a81ea5f..0000000 --- a/node_modules/postcss-import/package.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "name": "postcss-import", - "version": "15.1.0", - "description": "PostCSS plugin to import CSS files", - "keywords": [ - "css", - "postcss", - "postcss-plugin", - "import", - "node modules", - "npm" - ], - "author": "Maxime Thirouin", - "license": "MIT", - "repository": "https://github.com/postcss/postcss-import.git", - "files": [ - "index.js", - "lib" - ], - "engines": { - "node": ">=14.0.0" - }, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "devDependencies": { - "ava": "^5.0.0", - "eslint": "^8.2.0", - "eslint-config-problems": "^7.0.0", - "eslint-plugin-prettier": "^4.0.0", - "postcss": "^8.0.0", - "postcss-scss": "^4.0.0", - "prettier": "~2.8.0", - "sugarss": "^4.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - }, - "scripts": { - "ci": "eslint . && ava", - "lint": "eslint . --fix", - "pretest": "npm run lint", - "test": "ava" - }, - "eslintConfig": { - "extends": "eslint-config-problems", - "env": { - "node": true - }, - "plugins": [ - "prettier" - ], - "rules": { - "prettier/prettier": [ - "error", - { - "semi": false, - "arrowParens": "avoid" - } - ] - } - } -} diff --git a/node_modules/postcss-js/LICENSE b/node_modules/postcss-js/LICENSE deleted file mode 100644 index d3bd672..0000000 --- a/node_modules/postcss-js/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright 2015 Andrey Sitnik - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/postcss-js/README.md b/node_modules/postcss-js/README.md deleted file mode 100644 index a29e3b0..0000000 --- a/node_modules/postcss-js/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# PostCSS JS - - - -[PostCSS] for CSS-in-JS and styles in JS objects. - -For example, to use [Stylelint] or [RTLCSS] plugins in your workflow. - - - Sponsored by Evil Martians - - -[Stylelint]: https://github.com/stylelint/stylelint -[PostCSS]: https://github.com/postcss/postcss -[RTLCSS]: https://github.com/MohammadYounes/rtlcss - - -## Docs -Read full docs **[here](https://github.com/postcss/postcss-js#readme)**. diff --git a/node_modules/postcss-js/async.js b/node_modules/postcss-js/async.js deleted file mode 100644 index 4c2f3c6..0000000 --- a/node_modules/postcss-js/async.js +++ /dev/null @@ -1,15 +0,0 @@ -let postcss = require('postcss') - -let processResult = require('./process-result') -let parse = require('./parser') - -module.exports = function async(plugins) { - let processor = postcss(plugins) - return async input => { - let result = await processor.process(input, { - parser: parse, - from: undefined - }) - return processResult(result) - } -} diff --git a/node_modules/postcss-js/index.js b/node_modules/postcss-js/index.js deleted file mode 100644 index 8a4274e..0000000 --- a/node_modules/postcss-js/index.js +++ /dev/null @@ -1,11 +0,0 @@ -let objectify = require('./objectifier') -let parse = require('./parser') -let async = require('./async') -let sync = require('./sync') - -module.exports = { - objectify, - parse, - async, - sync -} diff --git a/node_modules/postcss-js/index.mjs b/node_modules/postcss-js/index.mjs deleted file mode 100644 index d14b61c..0000000 --- a/node_modules/postcss-js/index.mjs +++ /dev/null @@ -1,8 +0,0 @@ -import index from './index.js' - -export default index - -export const objectify = index.objectify -export const parse = index.parse -export const async = index.async -export const sync = index.sync diff --git a/node_modules/postcss-js/objectifier.js b/node_modules/postcss-js/objectifier.js deleted file mode 100644 index a4708b8..0000000 --- a/node_modules/postcss-js/objectifier.js +++ /dev/null @@ -1,85 +0,0 @@ -let camelcase = require('camelcase-css') - -let UNITLESS = { - boxFlex: true, - boxFlexGroup: true, - columnCount: true, - flex: true, - flexGrow: true, - flexPositive: true, - flexShrink: true, - flexNegative: true, - fontWeight: true, - lineClamp: true, - lineHeight: true, - opacity: true, - order: true, - orphans: true, - tabSize: true, - widows: true, - zIndex: true, - zoom: true, - fillOpacity: true, - strokeDashoffset: true, - strokeOpacity: true, - strokeWidth: true -} - -function atRule(node) { - if (typeof node.nodes === 'undefined') { - return true - } else { - return process(node) - } -} - -function process(node) { - let name - let result = {} - - node.each(child => { - if (child.type === 'atrule') { - name = '@' + child.name - if (child.params) name += ' ' + child.params - if (typeof result[name] === 'undefined') { - result[name] = atRule(child) - } else if (Array.isArray(result[name])) { - result[name].push(atRule(child)) - } else { - result[name] = [result[name], atRule(child)] - } - } else if (child.type === 'rule') { - let body = process(child) - if (result[child.selector]) { - for (let i in body) { - result[child.selector][i] = body[i] - } - } else { - result[child.selector] = body - } - } else if (child.type === 'decl') { - if (child.prop[0] === '-' && child.prop[1] === '-') { - name = child.prop - } else if (child.parent && child.parent.selector === ':export') { - name = child.prop - } else { - name = camelcase(child.prop) - } - let value = child.value - if (!isNaN(child.value) && UNITLESS[name]) { - value = parseFloat(child.value) - } - if (child.important) value += ' !important' - if (typeof result[name] === 'undefined') { - result[name] = value - } else if (Array.isArray(result[name])) { - result[name].push(value) - } else { - result[name] = [result[name], value] - } - } - }) - return result -} - -module.exports = process diff --git a/node_modules/postcss-js/package.json b/node_modules/postcss-js/package.json deleted file mode 100644 index ce0ff35..0000000 --- a/node_modules/postcss-js/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "postcss-js", - "version": "4.0.1", - "description": "PostCSS for CSS-in-JS and styles in JS objects", - "keywords": [ - "postcss", - "postcss-runner", - "js", - "inline", - "react", - "css", - "cssinjs" - ], - "author": "Andrey Sitnik ", - "license": "MIT", - "repository": "postcss/postcss-js", - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "exports": { - ".": { - "require": "./index.js", - "import": "./index.mjs" - }, - "./package.json": "./package.json", - "./async": "./async.js", - "./objectifier": "./objectifier.js", - "./parser": "./parser.js", - "./process-result": "./process-result.js", - "./sync": "./sync.js" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - }, - "dependencies": { - "camelcase-css": "^2.0.1" - } -} diff --git a/node_modules/postcss-js/parser.js b/node_modules/postcss-js/parser.js deleted file mode 100644 index 17ae264..0000000 --- a/node_modules/postcss-js/parser.js +++ /dev/null @@ -1,104 +0,0 @@ -let postcss = require('postcss') - -let IMPORTANT = /\s*!important\s*$/i - -let UNITLESS = { - 'box-flex': true, - 'box-flex-group': true, - 'column-count': true, - 'flex': true, - 'flex-grow': true, - 'flex-positive': true, - 'flex-shrink': true, - 'flex-negative': true, - 'font-weight': true, - 'line-clamp': true, - 'line-height': true, - 'opacity': true, - 'order': true, - 'orphans': true, - 'tab-size': true, - 'widows': true, - 'z-index': true, - 'zoom': true, - 'fill-opacity': true, - 'stroke-dashoffset': true, - 'stroke-opacity': true, - 'stroke-width': true -} - -function dashify(str) { - return str - .replace(/([A-Z])/g, '-$1') - .replace(/^ms-/, '-ms-') - .toLowerCase() -} - -function decl(parent, name, value) { - if (value === false || value === null) return - - if (!name.startsWith('--')) { - name = dashify(name) - } - - if (typeof value === 'number') { - if (value === 0 || UNITLESS[name]) { - value = value.toString() - } else { - value += 'px' - } - } - - if (name === 'css-float') name = 'float' - - if (IMPORTANT.test(value)) { - value = value.replace(IMPORTANT, '') - parent.push(postcss.decl({ prop: name, value, important: true })) - } else { - parent.push(postcss.decl({ prop: name, value })) - } -} - -function atRule(parent, parts, value) { - let node = postcss.atRule({ name: parts[1], params: parts[3] || '' }) - if (typeof value === 'object') { - node.nodes = [] - parse(value, node) - } - parent.push(node) -} - -function parse(obj, parent) { - let name, value, node - for (name in obj) { - value = obj[name] - if (value === null || typeof value === 'undefined') { - continue - } else if (name[0] === '@') { - let parts = name.match(/@(\S+)(\s+([\W\w]*)\s*)?/) - if (Array.isArray(value)) { - for (let i of value) { - atRule(parent, parts, i) - } - } else { - atRule(parent, parts, value) - } - } else if (Array.isArray(value)) { - for (let i of value) { - decl(parent, name, i) - } - } else if (typeof value === 'object') { - node = postcss.rule({ selector: name }) - parse(value, node) - parent.push(node) - } else { - decl(parent, name, value) - } - } -} - -module.exports = function (obj) { - let root = postcss.root() - parse(obj, root) - return root -} diff --git a/node_modules/postcss-js/process-result.js b/node_modules/postcss-js/process-result.js deleted file mode 100644 index 215a95c..0000000 --- a/node_modules/postcss-js/process-result.js +++ /dev/null @@ -1,11 +0,0 @@ -let objectify = require('./objectifier') - -module.exports = function processResult(result) { - if (console && console.warn) { - result.warnings().forEach(warn => { - let source = warn.plugin || 'PostCSS' - console.warn(source + ': ' + warn.text) - }) - } - return objectify(result.root) -} diff --git a/node_modules/postcss-js/sync.js b/node_modules/postcss-js/sync.js deleted file mode 100644 index 745bd27..0000000 --- a/node_modules/postcss-js/sync.js +++ /dev/null @@ -1,12 +0,0 @@ -let postcss = require('postcss') - -let processResult = require('./process-result') -let parse = require('./parser') - -module.exports = function (plugins) { - let processor = postcss(plugins) - return input => { - let result = processor.process(input, { parser: parse, from: undefined }) - return processResult(result) - } -} diff --git a/node_modules/postcss-load-config/LICENSE b/node_modules/postcss-load-config/LICENSE deleted file mode 100644 index 458e8a3..0000000 --- a/node_modules/postcss-load-config/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright Michael Ciniawsky - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/postcss-load-config/README.md b/node_modules/postcss-load-config/README.md deleted file mode 100644 index 9de4de2..0000000 --- a/node_modules/postcss-load-config/README.md +++ /dev/null @@ -1,466 +0,0 @@ - - -
    - - - - - -

    Load Config

    -
    - -

    Install

    - -```bash -npm i -D postcss-load-config -``` - -

    Usage

    - -```bash -npm i -S|-D postcss-plugin -``` - -Install all required PostCSS plugins and save them to your **package.json** `dependencies`/`devDependencies` - -Then create a PostCSS config file by choosing one of the following formats - -### `package.json` - -Create a **`postcss`** section in your project's **`package.json`** - -``` -Project (Root) - |– client - |– public - | - |- package.json -``` - -```json -{ - "postcss": { - "parser": "sugarss", - "map": false, - "plugins": { - "postcss-plugin": {} - } - } -} -``` - -### `.postcssrc` - -Create a **`.postcssrc`** file in JSON or YAML format - -> ℹ️ It's recommended to use an extension (e.g **`.postcssrc.json`** or **`.postcssrc.yml`**) instead of `.postcssrc` - -``` -Project (Root) - |– client - |– public - | - |- (.postcssrc|.postcssrc.json|.postcssrc.yml) - |- package.json -``` - -**`.postcssrc.json`** -```json -{ - "parser": "sugarss", - "map": false, - "plugins": { - "postcss-plugin": {} - } -} -``` - -**`.postcssrc.yml`** -```yaml -parser: sugarss -map: false -plugins: - postcss-plugin: {} -``` - -### `.postcssrc.js` or `postcss.config.js` - -You may need some logic within your config. -In this case create JS file named: -- `.postcssrc.js` -- `.postcssrc.mjs` -- `.postcssrc.cjs` -- `.postcssrc.ts` -- `.postcssrc.cts` -- `postcss.config.js` -- `postcss.config.mjs` -- `postcss.config.cjs` -- `postcss.config.ts` -- `postcss.config.cts` - -``` -Project (Root) - |– client - |– public - |- (.postcssrc|postcss.config).(js|mjs|cjs|ts|cts) - |- package.json -``` - -You can export the config as an `{Object}` - -**.postcssrc.js** -```js -module.exports = { - parser: 'sugarss', - map: false, - plugins: { - 'postcss-plugin': {} - } -} -``` - -Or export a `{Function}` that returns the config (more about the `ctx` param below) - -**.postcssrc.js** -```js -module.exports = (ctx) => ({ - parser: ctx.parser ? 'sugarss' : false, - map: ctx.env === 'development' ? ctx.map : false, - plugins: { - 'postcss-plugin': ctx.options.plugin - } -}) -``` - -Plugins can be loaded either using an `{Object}` or an `{Array}` - -#### `{Object}` - -**.postcssrc.js** -```js -module.exports = ({ env }) => ({ - ...options, - plugins: { - 'postcss-plugin': env === 'production' ? {} : false - } -}) -``` - -> ℹ️ When using an `{Object}`, the key can be a Node.js module name, a path to a JavaScript file that is relative to the directory of the PostCSS config file, or an absolute path to a JavaScript file. - -#### `{Array}` - -**.postcssrc.js** -```js -module.exports = ({ env }) => ({ - ...options, - plugins: [ - env === 'production' ? require('postcss-plugin')() : false - ] -}) -``` -> :warning: When using an `{Array}`, make sure to `require()` each plugin - -

    Options

    - -|Name|Type|Default|Description| -|:--:|:--:|:-----:|:----------| -|[**`to`**](#to)|`{String}`|`undefined`|Destination File Path| -|[**`map`**](#map)|`{String\|Object}`|`false`|Enable/Disable Source Maps| -|[**`from`**](#from)|`{String}`|`undefined`|Source File Path| -|[**`parser`**](#parser)|`{String\|Function}`|`false`|Custom PostCSS Parser| -|[**`syntax`**](#syntax)|`{String\|Function}`|`false`|Custom PostCSS Syntax| -|[**`stringifier`**](#stringifier)|`{String\|Function}`|`false`|Custom PostCSS Stringifier| - -### `parser` - -**.postcssrc.js** -```js -module.exports = { - parser: 'sugarss' -} -``` - -### `syntax` - -**.postcssrc.js** -```js -module.exports = { - syntax: 'postcss-scss' -} -``` - -### `stringifier` - -**.postcssrc.js** -```js -module.exports = { - stringifier: 'midas' -} -``` - -### [**`map`**](https://github.com/postcss/postcss/blob/master/docs/source-maps.md) - -**.postcssrc.js** -```js -module.exports = { - map: 'inline' -} -``` - -> :warning: In most cases `options.from` && `options.to` are set by the third-party which integrates this package (CLI, gulp, webpack). It's unlikely one needs to set/use `options.from` && `options.to` within a config file. Unless you're a third-party plugin author using this module and its Node API directly **dont't set `options.from` && `options.to` yourself** - -### `to` - -```js -module.exports = { - to: 'path/to/dest.css' -} -``` - -### `from` - -```js -module.exports = { - from: 'path/to/src.css' -} -``` - -

    Plugins

    - -### `{} || null` - -The plugin will be loaded with defaults - -```js -'postcss-plugin': {} || null -``` - -**.postcssrc.js** -```js -module.exports = { - plugins: { - 'postcss-plugin': {} || null - } -} -``` - -> :warning: `{}` must be an **empty** `{Object}` literal - -### `{Object}` - -The plugin will be loaded with given options - -```js -'postcss-plugin': { option: '', option: '' } -``` - -**.postcssrc.js** -```js -module.exports = { - plugins: { - 'postcss-plugin': { option: '', option: '' } - } -} -``` - -### `false` - -The plugin will not be loaded - -```js -'postcss-plugin': false -``` - -**.postcssrc.js** -```js -module.exports = { - plugins: { - 'postcss-plugin': false - } -} -``` - -### `Ordering` - -Plugin **execution order** is determined by declaration in the plugins section (**top-down**) - -```js -{ - plugins: { - 'postcss-plugin': {}, // [0] - 'postcss-plugin': {}, // [1] - 'postcss-plugin': {} // [2] - } -} -``` - -

    Context

    - -When using a `{Function}` (`postcss.config.js` or `.postcssrc.js`), it's possible to pass context to `postcss-load-config`, which will be evaluated while loading your config. By default `ctx.env (process.env.NODE_ENV)` and `ctx.cwd (process.cwd())` are available on the `ctx` `{Object}` - -> ℹ️ Most third-party integrations add additional properties to the `ctx` (e.g `postcss-loader`). Check the specific module's README for more information about what is available on the respective `ctx` - -

    Examples

    - -**postcss.config.js** - -```js -module.exports = (ctx) => ({ - parser: ctx.parser ? 'sugarss' : false, - map: ctx.env === 'development' ? ctx.map : false, - plugins: { - 'postcss-import': {}, - 'postcss-nested': {}, - cssnano: ctx.env === 'production' ? {} : false - } -}) -``` - -
    - -
    - -```json -"scripts": { - "build": "NODE_ENV=production node postcss", - "start": "NODE_ENV=development node postcss" -} -``` - -```js -const { readFileSync } = require('fs') - -const postcss = require('postcss') -const postcssrc = require('postcss-load-config') - -const css = readFileSync('index.sss', 'utf8') - -const ctx = { parser: true, map: 'inline' } - -postcssrc(ctx).then(({ plugins, options }) => { - postcss(plugins) - .process(css, options) - .then((result) => console.log(result.css)) -}) -``` - -
    - -
    - -```json -"scripts": { - "build": "NODE_ENV=production gulp", - "start": "NODE_ENV=development gulp" -} -``` - -```js -const { task, src, dest, series, watch } = require('gulp') - -const postcss = require('gulp-postcssrc') - -const css = () => { - src('src/*.css') - .pipe(postcss()) - .pipe(dest('dest')) -}) - -task('watch', () => { - watch(['src/*.css', 'postcss.config.js'], css) -}) - -task('default', series(css, 'watch')) -``` - -
    - -
    - -```json -"scripts": { - "build": "NODE_ENV=production webpack", - "start": "NODE_ENV=development webpack-dev-server" -} -``` - -**webpack.config.js** -```js -module.exports = (env) => ({ - module: { - rules: [ - { - test: /\.css$/, - use: [ - 'style-loader', - 'css-loader', - 'postcss-loader' - ] - } - ] - } -}) -``` - -

    Maintainers

    - - - - - - - - -
    - -
    - Michael Ciniawsky -
    - -
    - Mateusz Derks -
    - -

    Contributors

    - - - - - - - - - - -
    - -
    - Ryan Dunckel -
    - -
    - Patrick Gilday -
    - -
    - Dalton Santos -
    - -
    - François Wouts -
    = 14" - }, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - }, - "postcss": { - "optional": true - } - }, - "keywords": [ - "postcss", - "postcssrc", - "postcss.config.js" - ], - "author": "Michael Ciniawky ", - "contributors": [ - "Ryan Dunckel", - "Mateusz Derks", - "Dalton Santos", - "Patrick Gilday", - "François Wouts" - ], - "repository": "postcss/postcss-load-config", - "license": "MIT" -} diff --git a/node_modules/postcss-load-config/src/index.d.ts b/node_modules/postcss-load-config/src/index.d.ts deleted file mode 100644 index 4979220..0000000 --- a/node_modules/postcss-load-config/src/index.d.ts +++ /dev/null @@ -1,65 +0,0 @@ -// based on @types/postcss-load-config@2.0.1 -// Type definitions for postcss-load-config 2.1 -import Processor from 'postcss/lib/processor'; -import { Plugin, ProcessOptions, Transformer } from 'postcss'; -import { Options as ConfigOptions } from "lilconfig"; - -declare function postcssrc( - ctx?: postcssrc.ConfigContext, - path?: string, - options?: ConfigOptions -): Promise; - -declare namespace postcssrc { - // In the ConfigContext, these three options can be instances of the - // appropriate class, or strings. If they are strings, postcss-load-config will - // require() them and pass the instances along. - export interface ProcessOptionsPreload { - parser?: string | ProcessOptions['parser']; - stringifier?: string | ProcessOptions['stringifier']; - syntax?: string | ProcessOptions['syntax']; - } - - // The remaining ProcessOptions, sans the three above. - export type RemainingProcessOptions = Pick< - ProcessOptions, - Exclude - >; - - // Additional context options that postcss-load-config understands. - export interface Context { - cwd?: string; - env?: string; - } - - // The full shape of the ConfigContext. - export type ConfigContext = Context & - ProcessOptionsPreload & - RemainingProcessOptions; - - // Result of postcssrc is a Promise containing the filename plus the options - // and plugins that are ready to pass on to postcss. - export type ResultPlugin = Plugin | Transformer | Processor; - - export interface Result { - file: string; - options: ProcessOptions; - plugins: ResultPlugin[]; - } - - export type ConfigPlugin = Transformer | Plugin | Processor; - - export interface Config { - parser?: string | ProcessOptions['parser'] | false; - stringifier?: string | ProcessOptions['stringifier'] | false; - syntax?: string | ProcessOptions['syntax'] | false; - map?: string | false; - from?: string; - to?: string; - plugins?: Array | Record; - } - - export type ConfigFn = (ctx: ConfigContext) => Config | Promise; -} - -export = postcssrc; diff --git a/node_modules/postcss-load-config/src/index.js b/node_modules/postcss-load-config/src/index.js deleted file mode 100644 index ce86aaa..0000000 --- a/node_modules/postcss-load-config/src/index.js +++ /dev/null @@ -1,185 +0,0 @@ -'use strict' - -const resolve = require('path').resolve -const url = require('url') - -const config = require('lilconfig') -const yaml = require('yaml') - -const loadOptions = require('./options.js') -const loadPlugins = require('./plugins.js') - -/* istanbul ignore next */ -const interopRequireDefault = (obj) => obj && obj.__esModule ? obj : { default: obj } - -/** - * Process the result from cosmiconfig - * - * @param {Object} ctx Config Context - * @param {Object} result Cosmiconfig result - * - * @return {Object} PostCSS Config - */ -const processResult = (ctx, result) => { - const file = result.filepath || '' - let config = interopRequireDefault(result.config).default || {} - - if (typeof config === 'function') { - config = config(ctx) - } else { - config = Object.assign({}, config, ctx) - } - - if (!config.plugins) { - config.plugins = [] - } - - return { - plugins: loadPlugins(config, file), - options: loadOptions(config, file), - file - } -} - -/** - * Builds the Config Context - * - * @param {Object} ctx Config Context - * - * @return {Object} Config Context - */ -const createContext = (ctx) => { - /** - * @type {Object} - * - * @prop {String} cwd=process.cwd() Config search start location - * @prop {String} env=process.env.NODE_ENV Config Enviroment, will be set to `development` by `postcss-load-config` if `process.env.NODE_ENV` is `undefined` - */ - ctx = Object.assign({ - cwd: process.cwd(), - env: process.env.NODE_ENV - }, ctx) - - if (!ctx.env) { - process.env.NODE_ENV = 'development' - } - - return ctx -} - -const importDefault = async filepath => { - const module = await import(url.pathToFileURL(filepath).href) - return module.default -} - -const addTypeScriptLoader = (options = {}, loader) => { - const moduleName = 'postcss' - - return { - ...options, - searchPlaces: [ - ...(options.searchPlaces || []), - 'package.json', - `.${moduleName}rc`, - `.${moduleName}rc.json`, - `.${moduleName}rc.yaml`, - `.${moduleName}rc.yml`, - `.${moduleName}rc.ts`, - `.${moduleName}rc.cts`, - `.${moduleName}rc.js`, - `.${moduleName}rc.cjs`, - `.${moduleName}rc.mjs`, - `${moduleName}.config.ts`, - `${moduleName}.config.cts`, - `${moduleName}.config.js`, - `${moduleName}.config.cjs`, - `${moduleName}.config.mjs` - ], - loaders: { - ...options.loaders, - '.yaml': (filepath, content) => yaml.parse(content), - '.yml': (filepath, content) => yaml.parse(content), - '.js': importDefault, - '.cjs': importDefault, - '.mjs': importDefault, - '.ts': loader, - '.cts': loader - } - } -} - -const withTypeScriptLoader = (rcFunc) => { - return (ctx, path, options) => { - return rcFunc(ctx, path, addTypeScriptLoader(options, (configFile) => { - let registerer = { enabled () {} } - - try { - // Register TypeScript compiler instance - registerer = require('ts-node').register({ - // transpile to cjs even if compilerOptions.module in tsconfig is not Node16/NodeNext. - moduleTypes: { '**/*.cts': 'cjs' } - }) - - return require(configFile) - } catch (err) { - if (err.code === 'MODULE_NOT_FOUND') { - throw new Error( - `'ts-node' is required for the TypeScript configuration files. Make sure it is installed\nError: ${err.message}` - ) - } - - throw err - } finally { - registerer.enabled(false) - } - })) - } -} - -/** - * Load Config - * - * @method rc - * - * @param {Object} ctx Config Context - * @param {String} path Config Path - * @param {Object} options Config Options - * - * @return {Promise} config PostCSS Config - */ -const rc = withTypeScriptLoader((ctx, path, options) => { - /** - * @type {Object} The full Config Context - */ - ctx = createContext(ctx) - - /** - * @type {String} `process.cwd()` - */ - path = path ? resolve(path) : process.cwd() - - return config.lilconfig('postcss', options) - .search(path) - .then((result) => { - if (!result) { - throw new Error(`No PostCSS Config found in: ${path}`) - } - - return processResult(ctx, result) - }) -}) - -/** - * Autoload Config for PostCSS - * - * @author Michael Ciniawsky @michael-ciniawsky - * @license MIT - * - * @module postcss-load-config - * @version 2.1.0 - * - * @requires comsiconfig - * @requires ./options - * @requires ./plugins - */ -module.exports = rc diff --git a/node_modules/postcss-load-config/src/options.js b/node_modules/postcss-load-config/src/options.js deleted file mode 100644 index d3ef2d6..0000000 --- a/node_modules/postcss-load-config/src/options.js +++ /dev/null @@ -1,47 +0,0 @@ -'use strict' - -const req = require('./req.js') - -/** - * Load Options - * - * @private - * @method options - * - * @param {Object} config PostCSS Config - * - * @return {Object} options PostCSS Options - */ -const options = (config, file) => { - if (config.parser && typeof config.parser === 'string') { - try { - config.parser = req(config.parser, file) - } catch (err) { - throw new Error(`Loading PostCSS Parser failed: ${err.message}\n\n(@${file})`) - } - } - - if (config.syntax && typeof config.syntax === 'string') { - try { - config.syntax = req(config.syntax, file) - } catch (err) { - throw new Error(`Loading PostCSS Syntax failed: ${err.message}\n\n(@${file})`) - } - } - - if (config.stringifier && typeof config.stringifier === 'string') { - try { - config.stringifier = req(config.stringifier, file) - } catch (err) { - throw new Error(`Loading PostCSS Stringifier failed: ${err.message}\n\n(@${file})`) - } - } - - if (config.plugins) { - delete config.plugins - } - - return config -} - -module.exports = options diff --git a/node_modules/postcss-load-config/src/plugins.js b/node_modules/postcss-load-config/src/plugins.js deleted file mode 100644 index 6cb994b..0000000 --- a/node_modules/postcss-load-config/src/plugins.js +++ /dev/null @@ -1,85 +0,0 @@ -'use strict' - -const req = require('./req.js') - -/** - * Plugin Loader - * - * @private - * @method load - * - * @param {String} plugin PostCSS Plugin Name - * @param {Object} options PostCSS Plugin Options - * - * @return {Function} PostCSS Plugin - */ -const load = (plugin, options, file) => { - try { - if ( - options === null || - options === undefined || - Object.keys(options).length === 0 - ) { - return req(plugin, file) - } else { - return req(plugin, file)(options) - } - } catch (err) { - throw new Error(`Loading PostCSS Plugin failed: ${err.message}\n\n(@${file})`) - } -} - -/** - * Load Plugins - * - * @private - * @method plugins - * - * @param {Object} config PostCSS Config Plugins - * - * @return {Array} plugins PostCSS Plugins - */ -const plugins = (config, file) => { - let plugins = [] - - if (Array.isArray(config.plugins)) { - plugins = config.plugins.filter(Boolean) - } else { - plugins = Object.keys(config.plugins) - .filter((plugin) => { - return config.plugins[plugin] !== false ? plugin : '' - }) - .map((plugin) => { - return load(plugin, config.plugins[plugin], file) - }) - } - - if (plugins.length && plugins.length > 0) { - plugins.forEach((plugin, i) => { - if (plugin.default) { - plugin = plugin.default - } - - if (plugin.postcss === true) { - plugin = plugin() - } else if (plugin.postcss) { - plugin = plugin.postcss - } - - if ( - // eslint-disable-next-line - !( - (typeof plugin === 'object' && Array.isArray(plugin.plugins)) || - (typeof plugin === 'object' && plugin.postcssPlugin) || - (typeof plugin === 'function') - ) - ) { - throw new TypeError(`Invalid PostCSS Plugin found at: plugins[${i}]\n\n(@${file})`) - } - }) - } - - return plugins -} - -module.exports = plugins diff --git a/node_modules/postcss-load-config/src/req.js b/node_modules/postcss-load-config/src/req.js deleted file mode 100644 index 42020c9..0000000 --- a/node_modules/postcss-load-config/src/req.js +++ /dev/null @@ -1,10 +0,0 @@ -// eslint-disable-next-line n/no-deprecated-api -const { createRequire, createRequireFromPath } = require('module') - -function req (name, rootFile) { - const create = createRequire || createRequireFromPath - const require = create(rootFile) - return require(name) -} - -module.exports = req diff --git a/node_modules/postcss-nested/LICENSE b/node_modules/postcss-nested/LICENSE deleted file mode 100644 index 1ae47a2..0000000 --- a/node_modules/postcss-nested/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright 2014 Andrey Sitnik - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/postcss-nested/README.md b/node_modules/postcss-nested/README.md deleted file mode 100644 index c65988d..0000000 --- a/node_modules/postcss-nested/README.md +++ /dev/null @@ -1,85 +0,0 @@ -# PostCSS Nested - - - -[PostCSS] plugin to unwrap nested rules closer to Sass syntax. - -```css -.phone { - &_title { - width: 500px; - @media (max-width: 500px) { - width: auto; - } - body.is_dark & { - color: white; - } - } - img { - display: block; - } -} - -.title { - font-size: var(--font); - - @at-root html { - --font: 16px; - } -} -``` - -will be processed to: - -```css -.phone_title { - width: 500px; -} -@media (max-width: 500px) { - .phone_title { - width: auto; - } -} -body.is_dark .phone_title { - color: white; -} -.phone img { - display: block; -} - -.title { - font-size: var(--font); -} -html { - --font: 16px; -} -``` - -Related plugins: - -- Use [`postcss-current-selector`] **after** this plugin if you want - to use current selector in properties or variables values. -- Use [`postcss-nested-ancestors`] **before** this plugin if you want - to reference any ancestor element directly in your selectors with `^&`. - -Alternatives: - -- See also [`postcss-nesting`], which implements [CSSWG draft]. -- [`postcss-nested-props`] for nested properties like `font-size`. - - - Sponsored by Evil Martians - - -[`postcss-current-selector`]: https://github.com/komlev/postcss-current-selector -[`postcss-nested-ancestors`]: https://github.com/toomuchdesign/postcss-nested-ancestors -[`postcss-nested-props`]: https://github.com/jedmao/postcss-nested-props -[`postcss-nesting`]: https://github.com/csstools/postcss-plugins/tree/main/plugins/postcss-nesting -[CSSWG draft]: https://drafts.csswg.org/css-nesting-1/ -[PostCSS]: https://github.com/postcss/postcss - -## Docs -Read full docs **[here](https://github.com/postcss/postcss-nested#readme)**. diff --git a/node_modules/postcss-nested/index.d.ts b/node_modules/postcss-nested/index.d.ts deleted file mode 100644 index 5367682..0000000 --- a/node_modules/postcss-nested/index.d.ts +++ /dev/null @@ -1,41 +0,0 @@ -// Original definitions (@types/postcss-nested) -// by Maxim Vorontsov - -import { PluginCreator } from 'postcss' - -declare namespace nested { - interface Options { - /** - * By default, plugin will bubble only `@media`, `@supports` and `@layer` - * at-rules. Use this option to add your custom at-rules to this list. - */ - bubble?: string[] - - /** - * By default, plugin will unwrap only `@font-face`, `@keyframes`, - * and `@document` at-rules. You can add your custom at-rules - * to this list by this option. - */ - unwrap?: string[] - - /** - * By default, plugin will strip out any empty selector generated - * by intermediate nesting levels. You can set this option to `true` - * to preserve them. - */ - preserveEmpty?: boolean - - /** - * The plugin supports the SCSS custom at-rule `@at-root` which breaks - * rule blocks out of their nested position. If you want, you can choose - * a new custom name for this rule in your code. - */ - rootRuleName?: string - } - - type Nested = PluginCreator -} - -declare const nested: nested.Nested - -export = nested diff --git a/node_modules/postcss-nested/index.js b/node_modules/postcss-nested/index.js deleted file mode 100644 index 79831b6..0000000 --- a/node_modules/postcss-nested/index.js +++ /dev/null @@ -1,361 +0,0 @@ -const { AtRule, Rule } = require('postcss') -let parser = require('postcss-selector-parser') - -/** - * Run a selector string through postcss-selector-parser - */ -function parse(rawSelector, rule) { - let nodes - try { - parser(parsed => { - nodes = parsed - }).processSync(rawSelector) - } catch (e) { - if (rawSelector.includes(':')) { - throw rule ? rule.error('Missed semicolon') : e - } else { - throw rule ? rule.error(e.message) : e - } - } - return nodes.at(0) -} - -/** - * Replaces the "&" token in a node's selector with the parent selector - * similar to what SCSS does. - * - * Mutates the nodes list - */ -function interpolateAmpInSelector(nodes, parent) { - let replaced = false - nodes.each(node => { - if (node.type === 'nesting') { - let clonedParent = parent.clone({}) - if (node.value !== '&') { - node.replaceWith( - parse(node.value.replace('&', clonedParent.toString())) - ) - } else { - node.replaceWith(clonedParent) - } - replaced = true - } else if ('nodes' in node && node.nodes) { - if (interpolateAmpInSelector(node, parent)) { - replaced = true - } - } - }) - return replaced -} - -/** - * Combines parent and child selectors, in a SCSS-like way - */ -function mergeSelectors(parent, child) { - let merged = [] - parent.selectors.forEach(sel => { - let parentNode = parse(sel, parent) - - child.selectors.forEach(selector => { - if (!selector) { - return - } - let node = parse(selector, child) - let replaced = interpolateAmpInSelector(node, parentNode) - if (!replaced) { - node.prepend(parser.combinator({ value: ' ' })) - node.prepend(parentNode.clone({})) - } - merged.push(node.toString()) - }) - }) - return merged -} - -/** - * Move a child and its preceeding comment(s) to after "after" - */ -function breakOut(child, after) { - let prev = child.prev() - after.after(child) - while (prev && prev.type === 'comment') { - let nextPrev = prev.prev() - after.after(prev) - prev = nextPrev - } - return child -} - -function createFnAtruleChilds(bubble) { - return function atruleChilds(rule, atrule, bubbling, mergeSels = bubbling) { - let children = [] - atrule.each(child => { - if (child.type === 'rule' && bubbling) { - if (mergeSels) { - child.selectors = mergeSelectors(rule, child) - } - } else if (child.type === 'atrule' && child.nodes) { - if (bubble[child.name]) { - atruleChilds(rule, child, mergeSels) - } else if (atrule[rootRuleMergeSel] !== false) { - children.push(child) - } - } else { - children.push(child) - } - }) - if (bubbling) { - if (children.length) { - let clone = rule.clone({ nodes: [] }) - for (let child of children) { - clone.append(child) - } - atrule.prepend(clone) - } - } - } -} - -function pickDeclarations(selector, declarations, after) { - let parent = new Rule({ - nodes: [], - selector - }) - parent.append(declarations) - after.after(parent) - return parent -} - -function atruleNames(defaults, custom) { - let list = {} - for (let name of defaults) { - list[name] = true - } - if (custom) { - for (let name of custom) { - list[name.replace(/^@/, '')] = true - } - } - return list -} - -function parseRootRuleParams(params) { - params = params.trim() - let braceBlock = params.match(/^\((.*)\)$/) - if (!braceBlock) { - return { selector: params, type: 'basic' } - } - let bits = braceBlock[1].match(/^(with(?:out)?):(.+)$/) - if (bits) { - let allowlist = bits[1] === 'with' - let rules = Object.fromEntries( - bits[2] - .trim() - .split(/\s+/) - .map(name => [name, true]) - ) - if (allowlist && rules.all) { - return { type: 'noop' } - } - let escapes = rule => !!rules[rule] - if (rules.all) { - escapes = () => true - } else if (allowlist) { - escapes = rule => (rule === 'all' ? false : !rules[rule]) - } - - return { - escapes, - type: 'withrules' - } - } - // Unrecognized brace block - return { type: 'unknown' } -} - -function getAncestorRules(leaf) { - let lineage = [] - let parent = leaf.parent - - while (parent && parent instanceof AtRule) { - lineage.push(parent) - parent = parent.parent - } - return lineage -} - -function unwrapRootRule(rule) { - let escapes = rule[rootRuleEscapes] - - if (!escapes) { - rule.after(rule.nodes) - } else { - let nodes = rule.nodes - - let topEscaped - let topEscapedIdx = -1 - let breakoutLeaf - let breakoutRoot - let clone - - let lineage = getAncestorRules(rule) - lineage.forEach((parent, i) => { - if (escapes(parent.name)) { - topEscaped = parent - topEscapedIdx = i - breakoutRoot = clone - } else { - let oldClone = clone - clone = parent.clone({ nodes: [] }) - oldClone && clone.append(oldClone) - breakoutLeaf = breakoutLeaf || clone - } - }) - - if (!topEscaped) { - rule.after(nodes) - } else if (!breakoutRoot) { - topEscaped.after(nodes) - } else { - let leaf = breakoutLeaf - leaf.append(nodes) - topEscaped.after(breakoutRoot) - } - - if (rule.next() && topEscaped) { - let restRoot - lineage.slice(0, topEscapedIdx + 1).forEach((parent, i, arr) => { - let oldRoot = restRoot - restRoot = parent.clone({ nodes: [] }) - oldRoot && restRoot.append(oldRoot) - - let nextSibs = [] - let _child = arr[i - 1] || rule - let next = _child.next() - while (next) { - nextSibs.push(next) - next = next.next() - } - restRoot.append(nextSibs) - }) - restRoot && (breakoutRoot || nodes[nodes.length - 1]).after(restRoot) - } - } - - rule.remove() -} - -const rootRuleMergeSel = Symbol('rootRuleMergeSel') -const rootRuleEscapes = Symbol('rootRuleEscapes') - -function normalizeRootRule(rule) { - let { params } = rule - let { escapes, selector, type } = parseRootRuleParams(params) - if (type === 'unknown') { - throw rule.error( - `Unknown @${rule.name} parameter ${JSON.stringify(params)}` - ) - } - if (type === 'basic' && selector) { - let selectorBlock = new Rule({ nodes: rule.nodes, selector }) - rule.removeAll() - rule.append(selectorBlock) - } - rule[rootRuleEscapes] = escapes - rule[rootRuleMergeSel] = escapes ? !escapes('all') : type === 'noop' -} - -const hasRootRule = Symbol('hasRootRule') - -module.exports = (opts = {}) => { - let bubble = atruleNames( - ['media', 'supports', 'layer', 'container', 'starting-style'], - opts.bubble - ) - let atruleChilds = createFnAtruleChilds(bubble) - let unwrap = atruleNames( - [ - 'document', - 'font-face', - 'keyframes', - '-webkit-keyframes', - '-moz-keyframes' - ], - opts.unwrap - ) - let rootRuleName = (opts.rootRuleName || 'at-root').replace(/^@/, '') - let preserveEmpty = opts.preserveEmpty - - return { - Once(root) { - root.walkAtRules(rootRuleName, node => { - normalizeRootRule(node) - root[hasRootRule] = true - }) - }, - - postcssPlugin: 'postcss-nested', - - RootExit(root) { - if (root[hasRootRule]) { - root.walkAtRules(rootRuleName, unwrapRootRule) - root[hasRootRule] = false - } - }, - - Rule(rule) { - let unwrapped = false - let after = rule - let copyDeclarations = false - let declarations = [] - - rule.each(child => { - if (child.type === 'rule') { - if (declarations.length) { - after = pickDeclarations(rule.selector, declarations, after) - declarations = [] - } - - copyDeclarations = true - unwrapped = true - child.selectors = mergeSelectors(rule, child) - after = breakOut(child, after) - } else if (child.type === 'atrule') { - if (declarations.length) { - after = pickDeclarations(rule.selector, declarations, after) - declarations = [] - } - if (child.name === rootRuleName) { - unwrapped = true - atruleChilds(rule, child, true, child[rootRuleMergeSel]) - after = breakOut(child, after) - } else if (bubble[child.name]) { - copyDeclarations = true - unwrapped = true - atruleChilds(rule, child, true) - after = breakOut(child, after) - } else if (unwrap[child.name]) { - copyDeclarations = true - unwrapped = true - atruleChilds(rule, child, false) - after = breakOut(child, after) - } else if (copyDeclarations) { - declarations.push(child) - } - } else if (child.type === 'decl' && copyDeclarations) { - declarations.push(child) - } - }) - - if (declarations.length) { - after = pickDeclarations(rule.selector, declarations, after) - } - - if (unwrapped && preserveEmpty !== true) { - rule.raws.semicolon = true - if (rule.nodes.length === 0) rule.remove() - } - } - } -} -module.exports.postcss = true diff --git a/node_modules/postcss-nested/package.json b/node_modules/postcss-nested/package.json deleted file mode 100644 index abc8e6c..0000000 --- a/node_modules/postcss-nested/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "postcss-nested", - "version": "6.2.0", - "description": "PostCSS plugin to unwrap nested rules like how Sass does it", - "keywords": [ - "postcss", - "css", - "postcss-plugin", - "sass", - "nested" - ], - "author": "Andrey Sitnik ", - "license": "MIT", - "repository": "postcss/postcss-nested", - "engines": { - "node": ">=12.0" - }, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "peerDependencies": { - "postcss": "^8.2.14" - }, - "dependencies": { - "postcss-selector-parser": "^6.1.1" - } -} diff --git a/node_modules/postcss-selector-parser/API.md b/node_modules/postcss-selector-parser/API.md deleted file mode 100644 index c8e55ee..0000000 --- a/node_modules/postcss-selector-parser/API.md +++ /dev/null @@ -1,872 +0,0 @@ -# API Documentation - -*Please use only this documented API when working with the parser. Methods -not documented here are subject to change at any point.* - -## `parser` function - -This is the module's main entry point. - -```js -const parser = require('postcss-selector-parser'); -``` - -### `parser([transform], [options])` - -Creates a new `processor` instance - -```js -const processor = parser(); -``` - -Or, with optional transform function - -```js -const transform = selectors => { - selectors.walkUniversals(selector => { - selector.remove(); - }); -}; - -const processor = parser(transform) - -// Example -const result = processor.processSync('*.class'); -// => .class -``` - -[See processor documentation](#processor) - -Arguments: - -* `transform (function)`: Provide a function to work with the parsed AST. -* `options (object)`: Provide default options for all calls on the returned `Processor`. - -### `parser.attribute([props])` - -Creates a new attribute selector. - -```js -parser.attribute({attribute: 'href'}); -// => [href] -``` - -Arguments: - -* `props (object)`: The new node's properties. - -### `parser.className([props])` - -Creates a new class selector. - -```js -parser.className({value: 'button'}); -// => .button -``` - -Arguments: - -* `props (object)`: The new node's properties. - -### `parser.combinator([props])` - -Creates a new selector combinator. - -```js -parser.combinator({value: '+'}); -// => + -``` - -Arguments: - -* `props (object)`: The new node's properties. - -Notes: -* **Descendant Combinators** The value of descendant combinators created by the - parser always just a single space (`" "`). For descendant selectors with no - comments, additional space is now stored in `node.spaces.before`. Depending - on the location of comments, additional spaces may be stored in - `node.raws.spaces.before`, `node.raws.spaces.after`, or `node.raws.value`. -* **Named Combinators** Although, nonstandard and unlikely to ever become a standard, - named combinators like `/deep/` and `/for/` are parsed as combinators. The - `node.value` is name after being unescaped and normalized as lowercase. The - original value for the combinator name is stored in `node.raws.value`. - - -### `parser.comment([props])` - -Creates a new comment. - -```js -parser.comment({value: '/* Affirmative, Dave. I read you. */'}); -// => /* Affirmative, Dave. I read you. */ -``` - -Arguments: - -* `props (object)`: The new node's properties. - -### `parser.id([props])` - -Creates a new id selector. - -```js -parser.id({value: 'search'}); -// => #search -``` - -Arguments: - -* `props (object)`: The new node's properties. - -### `parser.nesting([props])` - -Creates a new nesting selector. - -```js -parser.nesting(); -// => & -``` - -Arguments: - -* `props (object)`: The new node's properties. - -### `parser.pseudo([props])` - -Creates a new pseudo selector. - -```js -parser.pseudo({value: '::before'}); -// => ::before -``` - -Arguments: - -* `props (object)`: The new node's properties. - -### `parser.root([props])` - -Creates a new root node. - -```js -parser.root(); -// => (empty) -``` - -Arguments: - -* `props (object)`: The new node's properties. - -### `parser.selector([props])` - -Creates a new selector node. - -```js -parser.selector(); -// => (empty) -``` - -Arguments: - -* `props (object)`: The new node's properties. - -### `parser.string([props])` - -Creates a new string node. - -```js -parser.string(); -// => (empty) -``` - -Arguments: - -* `props (object)`: The new node's properties. - -### `parser.tag([props])` - -Creates a new tag selector. - -```js -parser.tag({value: 'button'}); -// => button -``` - -Arguments: - -* `props (object)`: The new node's properties. - -### `parser.universal([props])` - -Creates a new universal selector. - -```js -parser.universal(); -// => * -``` - -Arguments: - -* `props (object)`: The new node's properties. - -## Node types - -### `node.type` - -A string representation of the selector type. It can be one of the following; -`attribute`, `class`, `combinator`, `comment`, `id`, `nesting`, `pseudo`, -`root`, `selector`, `string`, `tag`, or `universal`. Note that for convenience, -these constants are exposed on the main `parser` as uppercased keys. So for -example you can get `id` by querying `parser.ID`. - -```js -parser.attribute({attribute: 'href'}).type; -// => 'attribute' -``` - -### `node.parent` - -Returns the parent node. - -```js -root.nodes[0].parent === root; -``` - -### `node.toString()`, `String(node)`, or `'' + node` - -Returns a string representation of the node. - -```js -const id = parser.id({value: 'search'}); -console.log(String(id)); -// => #search -``` - -### `node.next()` & `node.prev()` - -Returns the next/previous child of the parent node. - -```js -const next = id.next(); -if (next && next.type !== 'combinator') { - throw new Error('Qualified IDs are not allowed!'); -} -``` - -### `node.replaceWith(node)` - -Replace a node with another. - -```js -const attr = selectors.first.first; -const className = parser.className({value: 'test'}); -attr.replaceWith(className); -``` - -Arguments: - -* `node`: The node to substitute the original with. - -### `node.remove()` - -Removes the node from its parent node. - -```js -if (node.type === 'id') { - node.remove(); -} -``` - -### `node.clone([opts])` - -Returns a copy of a node, detached from any parent containers that the -original might have had. - -```js -const cloned = node.clone(); -``` - -### `node.isAtPosition(line, column)` - -Return a `boolean` indicating whether this node includes the character at the -position of the given line and column. Returns `undefined` if the nodes lack -sufficient source metadata to determine the position. - -Arguments: - -* `line`: 1-index based line number relative to the start of the selector. -* `column`: 1-index based column number relative to the start of the selector. - -### `node.spaces` - -Extra whitespaces around the node will be moved into `node.spaces.before` and -`node.spaces.after`. So for example, these spaces will be moved as they have -no semantic meaning: - -```css - h1 , h2 {} -``` - -For descendent selectors, the value is always a single space. - -```css -h1 h2 {} -``` - -Additional whitespace is found in either the `node.spaces.before` and `node.spaces.after` depending on the presence of comments or other whitespace characters. If the actual whitespace does not start or end with a single space, the node's raw value is set to the actual space(s) found in the source. - -### `node.source` - -An object describing the node's start/end, line/column source position. - -Within the following CSS, the `.bar` class node ... - -```css -.foo, - .bar {} -``` - -... will contain the following `source` object. - -```js -source: { - start: { - line: 2, - column: 3 - }, - end: { - line: 2, - column: 6 - } -} -``` - -### `node.sourceIndex` - -The zero-based index of the node within the original source string. - -Within the following CSS, the `.baz` class node will have a `sourceIndex` of `12`. - -```css -.foo, .bar, .baz {} -``` - -## Container types - -The `root`, `selector`, and `pseudo` nodes have some helper methods for working -with their children. - -### `container.nodes` - -An array of the container's children. - -```js -// Input: h1 h2 -selectors.at(0).nodes.length // => 3 -selectors.at(0).nodes[0].value // => 'h1' -selectors.at(0).nodes[1].value // => ' ' -``` - -### `container.first` & `container.last` - -The first/last child of the container. - -```js -selector.first === selector.nodes[0]; -selector.last === selector.nodes[selector.nodes.length - 1]; -``` - -### `container.at(index)` - -Returns the node at position `index`. - -```js -selector.at(0) === selector.first; -selector.at(0) === selector.nodes[0]; -``` - -Arguments: - -* `index`: The index of the node to return. - -### `container.atPosition(line, column)` - -Returns the node at the source position `line` and `column`. - -```js -// Input: :not(.foo),\n#foo > :matches(ol, ul) -selector.atPosition(1, 1); // => :not(.foo) -selector.atPosition(2, 1); // => \n#foo -``` - -Arguments: - -* `line`: The line number of the node to return. -* `column`: The column number of the node to return. - -### `container.index(node)` - -Return the index of the node within its container. - -```js -selector.index(selector.nodes[2]) // => 2 -``` - -Arguments: - -* `node`: A node within the current container. - -### `container.length` - -Proxy to the length of the container's nodes. - -```js -container.length === container.nodes.length -``` - -### `container` Array iterators - -The container class provides proxies to certain Array methods; these are: - -* `container.map === container.nodes.map` -* `container.reduce === container.nodes.reduce` -* `container.every === container.nodes.every` -* `container.some === container.nodes.some` -* `container.filter === container.nodes.filter` -* `container.sort === container.nodes.sort` - -Note that these methods only work on a container's immediate children; recursive -iteration is provided by `container.walk`. - -### `container.each(callback)` - -Iterate the container's immediate children, calling `callback` for each child. -You may return `false` within the callback to break the iteration. - -```js -let className; -selectors.each((selector, index) => { - if (selector.type === 'class') { - className = selector.value; - return false; - } -}); -``` - -Note that unlike `Array#forEach()`, this iterator is safe to use whilst adding -or removing nodes from the container. - -Arguments: - -* `callback (function)`: A function to call for each node, which receives `node` - and `index` arguments. - -### `container.walk(callback)` - -Like `container#each`, but will also iterate child nodes as long as they are -`container` types. - -```js -selectors.walk((selector, index) => { - // all nodes -}); -``` - -Arguments: - -* `callback (function)`: A function to call for each node, which receives `node` - and `index` arguments. - -This iterator is safe to use whilst mutating `container.nodes`, -like `container#each`. - -### `container.walk` proxies - -The container class provides proxy methods for iterating over types of nodes, -so that it is easier to write modules that target specific selectors. Those -methods are: - -* `container.walkAttributes` -* `container.walkClasses` -* `container.walkCombinators` -* `container.walkComments` -* `container.walkIds` -* `container.walkNesting` -* `container.walkPseudos` -* `container.walkTags` -* `container.walkUniversals` - -### `container.split(callback)` - -This method allows you to split a group of nodes by returning `true` from -a callback. It returns an array of arrays, where each inner array corresponds -to the groups that you created via the callback. - -```js -// (input) => h1 h2>>h3 -const list = selectors.first.split(selector => { - return selector.type === 'combinator'; -}); - -// (node values) => [['h1', ' '], ['h2', '>>'], ['h3']] -``` - -Arguments: - -* `callback (function)`: A function to call for each node, which receives `node` - as an argument. - -### `container.prepend(node)` & `container.append(node)` - -Add a node to the start/end of the container. Note that doing so will set -the parent property of the node to this container. - -```js -const id = parser.id({value: 'search'}); -selector.append(id); -``` - -Arguments: - -* `node`: The node to add. - -### `container.insertBefore(old, new)` & `container.insertAfter(old, new)` - -Add a node before or after an existing node in a container: - -```js -selectors.walk(selector => { - if (selector.type !== 'class') { - const className = parser.className({value: 'theme-name'}); - selector.parent.insertAfter(selector, className); - } -}); -``` - -Arguments: - -* `old`: The existing node in the container. -* `new`: The new node to add before/after the existing node. - -### `container.removeChild(node)` - -Remove the node from the container. Note that you can also use -`node.remove()` if you would like to remove just a single node. - -```js -selector.length // => 2 -selector.remove(id) -selector.length // => 1; -id.parent // undefined -``` - -Arguments: - -* `node`: The node to remove. - -### `container.removeAll()` or `container.empty()` - -Remove all children from the container. - -```js -selector.removeAll(); -selector.length // => 0 -``` - -## Root nodes - -A root node represents a comma separated list of selectors. Indeed, all -a root's `toString()` method does is join its selector children with a ','. -Other than this, it has no special functionality and acts like a container. - -### `root.trailingComma` - -This will be set to `true` if the input has a trailing comma, in order to -support parsing of legacy CSS hacks. - -## Selector nodes - -A selector node represents a single complex selector. For example, this -selector string `h1 h2 h3, [href] > p`, is represented as two selector nodes. -It has no special functionality of its own. - -## Pseudo nodes - -A pseudo selector extends a container node; if it has any parameters of its -own (such as `h1:not(h2, h3)`), they will be its children. Note that the pseudo -`value` will always contain the colons preceding the pseudo identifier. This -is so that both `:before` and `::before` are properly represented in the AST. - -## Attribute nodes - -### `attribute.quoted` - -Returns `true` if the attribute's value is wrapped in quotation marks, false if it is not. -Remains `undefined` if there is no attribute value. - -```css -[href=foo] /* false */ -[href='foo'] /* true */ -[href="foo"] /* true */ -[href] /* undefined */ -``` - -### `attribute.qualifiedAttribute` - -Returns the attribute name qualified with the namespace if one is given. - -### `attribute.offsetOf(part)` - - Returns the offset of the attribute part specified relative to the - start of the node of the output string. This is useful in raising - error messages about a specific part of the attribute, especially - in combination with `attribute.sourceIndex`. - - Returns `-1` if the name is invalid or the value doesn't exist in this - attribute. - - The legal values for `part` are: - - * `"ns"` - alias for "namespace" - * `"namespace"` - the namespace if it exists. - * `"attribute"` - the attribute name - * `"attributeNS"` - the start of the attribute or its namespace - * `"operator"` - the match operator of the attribute - * `"value"` - The value (string or identifier) - * `"insensitive"` - the case insensitivity flag - -### `attribute.raws.unquoted` - -Returns the unquoted content of the attribute's value. -Remains `undefined` if there is no attribute value. - -```css -[href=foo] /* foo */ -[href='foo'] /* foo */ -[href="foo"] /* foo */ -[href] /* undefined */ -``` - -### `attribute.spaces` - -Like `node.spaces` with the `before` and `after` values containing the spaces -around the element, the parts of the attribute can also have spaces before -and after them. The for each of `attribute`, `operator`, `value` and -`insensitive` there is corresponding property of the same nam in -`node.spaces` that has an optional `before` or `after` string containing only -whitespace. - -Note that corresponding values in `attributes.raws.spaces` contain values -including any comments. If set, these values will override the -`attribute.spaces` value. Take care to remove them if changing -`attribute.spaces`. - -### `attribute.raws` - -The raws object stores comments and other information necessary to re-render -the node exactly as it was in the source. - -If a comment is embedded within the identifiers for the `namespace`, `attribute` -or `value` then a property is placed in the raws for that value containing the full source of the propery including comments. - -If a comment is embedded within the space between parts of the attribute -then the raw for that space is set accordingly. - -Setting an attribute's property `raws` value to be deleted. - -For now, changing the spaces required also updating or removing any of the -raws values that override them. - -Example: `[ /*before*/ href /* after-attr */ = /* after-operator */ te/*inside-value*/st/* wow */ /*omg*/i/*bbq*/ /*whodoesthis*/]` would parse as: - -```js -{ - attribute: "href", - operator: "=", - value: "test", - spaces: { - before: '', - after: '', - attribute: { before: ' ', after: ' ' }, - operator: { after: ' ' }, - value: { after: ' ' }, - insensitive: { after: ' ' } - }, - raws: { - spaces: { - attribute: { before: ' /*before*/ ', after: ' /* after-attr */ ' }, - operator: { after: ' /* after-operator */ ' }, - value: { after: '/* wow */ /*omg*/' }, - insensitive: { after: '/*bbq*/ /*whodoesthis*/' } - }, - unquoted: 'test', - value: 'te/*inside-value*/st' - } -} -``` - -## `Processor` - -### `ProcessorOptions` - -* `lossless` - When `true`, whitespace is preserved. Defaults to `true`. -* `updateSelector` - When `true`, if any processor methods are passed a postcss - `Rule` node instead of a string, then that Rule's selector is updated - with the results of the processing. Defaults to `true`. - -### `process|processSync(selectors, [options])` - -Processes the `selectors`, returning a string from the result of processing. - -Note: when the `updateSelector` option is set, the rule's selector -will be updated with the resulting string. - -**Example:** - -```js -const parser = require("postcss-selector-parser"); -const processor = parser(); - -let result = processor.processSync(' .class'); -console.log(result); -// => .class - -// Asynchronous operation -let promise = processor.process(' .class').then(result => { - console.log(result) - // => .class -}); - -// To have the parser normalize whitespace values, utilize the options -result = processor.processSync(' .class ', {lossless: false}); -console.log(result); -// => .class - -// For better syntax errors, pass a PostCSS Rule node. -const postcss = require('postcss'); -rule = postcss.rule({selector: ' #foo > a, .class '}); -processor.process(rule, {lossless: false, updateSelector: true}).then(result => { - console.log(result); - // => #foo>a,.class - console.log("rule:", rule.selector); - // => rule: #foo>a,.class -}) -``` - -Arguments: - -* `selectors (string|postcss.Rule)`: Either a selector string or a PostCSS Rule - node. -* `[options] (object)`: Process options - - -### `ast|astSync(selectors, [options])` - -Like `process()` and `processSync()` but after -processing the `selectors` these methods return the `Root` node of the result -instead of a string. - -Note: when the `updateSelector` option is set, the rule's selector -will be updated with the resulting string. - -### `transform|transformSync(selectors, [options])` - -Like `process()` and `processSync()` but after -processing the `selectors` these methods return the value returned by the -processor callback. - -Note: when the `updateSelector` option is set, the rule's selector -will be updated with the resulting string. - -### Error Handling Within Selector Processors - -The root node passed to the selector processor callback -has a method `error(message, options)` that returns an -error object. This method should always be used to raise -errors relating to the syntax of selectors. The options -to this method are passed to postcss's error constructor -([documentation](http://postcss.org/api/#container-error)). - -#### Async Error Example - -```js -let processor = (root) => { - return new Promise((resolve, reject) => { - root.walkClasses((classNode) => { - if (/^(.*)[-_]/.test(classNode.value)) { - let msg = "classes may not have underscores or dashes in them"; - reject(root.error(msg, { - index: classNode.sourceIndex + RegExp.$1.length + 1, - word: classNode.value - })); - } - }); - resolve(); - }); -}; - -const postcss = require("postcss"); -const parser = require("postcss-selector-parser"); -const selectorProcessor = parser(processor); -const plugin = postcss.plugin('classValidator', (options) => { - return (root) => { - let promises = []; - root.walkRules(rule => { - promises.push(selectorProcessor.process(rule)); - }); - return Promise.all(promises); - }; -}); -postcss(plugin()).process(` -.foo-bar { - color: red; -} -`.trim(), {from: 'test.css'}).catch((e) => console.error(e.toString())); - -// CssSyntaxError: classValidator: ./test.css:1:5: classes may not have underscores or dashes in them -// -// > 1 | .foo-bar { -// | ^ -// 2 | color: red; -// 3 | } -``` - -#### Synchronous Error Example - -```js -let processor = (root) => { - root.walkClasses((classNode) => { - if (/.*[-_]/.test(classNode.value)) { - let msg = "classes may not have underscores or dashes in them"; - throw root.error(msg, { - index: classNode.sourceIndex, - word: classNode.value - }); - } - }); -}; - -const postcss = require("postcss"); -const parser = require("postcss-selector-parser"); -const selectorProcessor = parser(processor); -const plugin = postcss.plugin('classValidator', (options) => { - return (root) => { - root.walkRules(rule => { - selectorProcessor.processSync(rule); - }); - }; -}); -postcss(plugin()).process(` -.foo-bar { - color: red; -} -`.trim(), {from: 'test.css'}).catch((e) => console.error(e.toString())); - -// CssSyntaxError: classValidator: ./test.css:1:5: classes may not have underscores or dashes in them -// -// > 1 | .foo-bar { -// | ^ -// 2 | color: red; -// 3 | } -``` diff --git a/node_modules/postcss-selector-parser/CHANGELOG.md b/node_modules/postcss-selector-parser/CHANGELOG.md deleted file mode 100644 index 14ffadc..0000000 --- a/node_modules/postcss-selector-parser/CHANGELOG.md +++ /dev/null @@ -1,549 +0,0 @@ -# 6.1.2 - -- Fixed: erroneous trailing combinators in pseudos - -# 6.1.1 - -- Fixed: improve typings of constructor helpers (#292) - -# 6.1.0 - -- Feature: add `sourceIndex` to `Selector` nodes (#290) - -# 6.0.16 - -- Fixed: add missing `index` argument to `each`/`walk` callback types (#289) - -# 6.0.15 - -- Fixed: Node#prev and Node#next type for the first/last node - -# 6.0.14 - -- Fixed: type definitions - -# 6.0.13 - -- Fixed: throw on unexpected pipe symbols - -# 6.0.12 - -- Fixed: `clone` arguments should be optional - -# 6.0.11 - -- Fixed: parse attribute case insensitivity flag - -# 6.0.10 - -- Fixed: `isPseudoElement()` supports `:first-letter` and `:first-line` - -# 6.0.9 - -- Fixed: `Combinator.raws` property type - -# 6.0.8 - -- Fixed: reduced size - -# 6.0.7 - -- Fixed: parse animation percents - -# 6.0.6 - -- Fixed: parse quoted attributes containing a newline correctly - -# 6.0.5 - -- Perf: rework unesc for a 63+% performance boost - -# 6.0.4 - -- Fixed: ts errors - -# 6.0.3 - -- Fixed: replace node built-in "util" module with "util-deprecate" -- Fixed: handle uppercase pseudo elements -- Fixed: do not create invalid combinator before comment - -# 6.0.2 - -- Fixed an issue with parsing and stringifying an empty attribute value - -# 6.0.1 - -- Fixed an issue with unicode surrogate pair parsing - -# 6.0.0 - -- Updated: `cssesc` to 3.0.0 (major) -- Fixed: Issues with escaped `id` and `class` selectors - -# 5.0.0 - -- Allow escaped dot within class name. -- Update PostCSS to 7.0.7 (patch) - -# 5.0.0-rc.4 - -- Fixed an issue where comments immediately after an insensitive (in attribute) - were not parsed correctly. -- Updated `cssesc` to 2.0.0 (major). -- Removed outdated integration tests. -- Added tests for custom selectors, tags with attributes, the universal - selector with pseudos, and tokens after combinators. - -# 5.0.0-rc.1 - -To ease adoption of the v5.0 release, we have relaxed the node version -check performed by npm at installation time to allow for node 4, which -remains officially unsupported, but likely to continue working for the -time being. - -# 5.0.0-rc.0 - -This release has **BREAKING CHANGES** that were required to fix regressions -in 4.0.0 and to make the Combinator Node API consistent for all combinator -types. Please read carefully. - -## Summary of Changes - -* The way a descendent combinator that isn't a single space character (E.g. `.a .b`) is stored in the AST has changed. -* Named Combinators (E.g. `.a /for/ .b`) are now properly parsed as a combinator. -* It is now possible to look up a node based on the source location of a character in that node and to query nodes if they contain some character. -* Several bug fixes that caused the parser to hang and run out of memory when a `/` was encountered have been fixed. -* The minimum supported version of Node is now `v6.0.0`. - -### Changes to the Descendent Combinator - -In prior releases, the value of a descendant combinator with multiple spaces included all the spaces. - -* `.a .b`: Extra spaces are now stored as space before. - - Old & Busted: - - `combinator.value === " "` - - New hotness: - - `combinator.value === " " && combinator.spaces.before === " "` -* `.a /*comment*/.b`: A comment at the end of the combinator causes extra space to become after space. - - Old & Busted: - - `combinator.value === " "` - - `combinator.raws.value === " /*comment/"` - - New hotness: - - `combinator.value === " "` - - `combinator.spaces.after === " "` - - `combinator.raws.spaces.after === " /*comment*/"` -* `.a.b`: whitespace that doesn't start or end with a single space character is stored as a raw value. - - Old & Busted: - - `combinator.value === "\n"` - - `combinator.raws.value === undefined` - - New hotness: - - `combinator.value === " "` - - `combinator.raws.value === "\n"` - -### Support for "Named Combinators" - -Although, nonstandard and unlikely to ever become a standard, combinators like `/deep/` and `/for/` are now properly supported. - -Because they've been taken off the standardization track, there is no spec-official name for combinators of the form `//`. However, I talked to [Tab Atkins](https://twitter.com/tabatkins) and we agreed to call them "named combinators" so now they are called that. - -Before this release such named combinators were parsed without intention and generated three nodes of type `"tag"` where the first and last nodes had a value of `"/"`. - -* `.a /for/ .b` is parsed as a combinator. - - Old & Busted: - - `root.nodes[0].nodes[1].type === "tag"` - - `root.nodes[0].nodes[1].value === "/"` - - New hotness: - - `root.nodes[0].nodes[1].type === "combinator"` - - `root.nodes[0].nodes[1].value === "/for/"` -* `.a /F\6fR/ .b` escapes are handled and uppercase is normalized. - - Old & Busted: - - `root.nodes[0].nodes[2].type === "tag"` - - `root.nodes[0].nodes[2].value === "F\\6fR"` - - New hotness: - - `root.nodes[0].nodes[1].type === "combinator"` - - `root.nodes[0].nodes[1].value === "/for/"` - - `root.nodes[0].nodes[1].raws.value === "/F\\6fR/"` - -### Source position checks and lookups - -A new API was added to look up a node based on the source location. - -```js -const selectorParser = require("postcss-selector-parser"); -// You can find the most specific node for any given character -let combinator = selectorParser.astSync(".a > .b").atPosition(1,4); -combinator.toString() === " > "; -// You can check if a node includes a specific character -// Whitespace surrounding the node that is owned by that node -// is included in the check. -[2,3,4,5,6].map(column => combinator.isAtPosition(1, column)); -// => [false, true, true, true, false] -``` - -# 4.0.0 - -This release has **BREAKING CHANGES** that were required to fix bugs regarding values with escape sequences. Please read carefully. - -* **Identifiers with escapes** - CSS escape sequences are now hidden from the public API by default. - The normal value of a node like a class name or ID, or an aspect of a node such as attribute - selector's value, is unescaped. Escapes representing Non-ascii characters are unescaped into - unicode characters. For example: `bu\tton, .\31 00, #i\2764\FE0Fu, [attr="value is \"quoted\""]` - will parse respectively to the values `button`, `100`, `i❤️u`, `value is "quoted"`. - The original escape sequences for these values can be found in the corresponding property name - in `node.raws`. Where possible, deprecation warnings were added, but the nature - of escape handling makes it impossible to detect what is escaped or not. Our expectation is - that most users are neither expecting nor handling escape sequences in their use of this library, - and so for them, this is a bug fix. Users who are taking care to handle escapes correctly can - now update their code to remove the escape handling and let us do it for them. - -* **Mutating values with escapes** - When you make an update to a node property that has escape handling - The value is assumed to be unescaped, and any special characters are escaped automatically and - the corresponding `raws` value is immediately updated. This can result in changes to the original - escape format. Where the exact value of the escape sequence is important there are methods that - allow both values to be set in conjunction. There are a number of new convenience methods for - manipulating values that involve escapes, especially for attributes values where the quote mark - is involved. See https://github.com/postcss/postcss-selector-parser/pull/133 for an extensive - write-up on these changes. - - -**Upgrade/API Example** - -In `3.x` there was no unescape handling and internal consistency of several properties was the caller's job to maintain. It was very easy for the developer -to create a CSS file that did not parse correctly when some types of values -were in use. - -```js -const selectorParser = require("postcss-selector-parser"); -let attr = selectorParser.attribute({attribute: "id", operator: "=", value: "a-value"}); -attr.value; // => "a-value" -attr.toString(); // => [id=a-value] -// Add quotes to an attribute's value. -// All these values have to be set by the caller to be consistent: -// no internal consistency is maintained. -attr.raws.unquoted = attr.value -attr.value = "'" + attr.value + "'"; -attr.value; // => "'a-value'" -attr.quoted = true; -attr.toString(); // => "[id='a-value']" -``` - -In `4.0` there is a convenient API for setting and mutating values -that may need escaping. Especially for attributes. - -```js -const selectorParser = require("postcss-selector-parser"); - -// The constructor requires you specify the exact escape sequence -let className = selectorParser.className({value: "illegal class name", raws: {value: "illegal\\ class\\ name"}}); -className.toString(); // => '.illegal\\ class\\ name' - -// So it's better to set the value as a property -className = selectorParser.className(); -// Most properties that deal with identifiers work like this -className.value = "escape for me"; -className.value; // => 'escape for me' -className.toString(); // => '.escape\\ for\\ me' - -// emoji and all non-ascii are escaped to ensure it works in every css file. -className.value = "😱🦄😍"; -className.value; // => '😱🦄😍' -className.toString(); // => '.\\1F631\\1F984\\1F60D' - -// you can control the escape sequence if you want, or do bad bad things -className.setPropertyAndEscape('value', 'xxxx', 'yyyy'); -className.value; // => "xxxx" -className.toString(); // => ".yyyy" - -// Pass a value directly through to the css output without escaping it. -className.setPropertyWithoutEscape('value', '$REPLACE_ME$'); -className.value; // => "$REPLACE_ME$" -className.toString(); // => ".$REPLACE_ME$" - -// The biggest changes are to the Attribute class -// passing quoteMark explicitly is required to avoid a deprecation warning. -let attr = selectorParser.attribute({attribute: "id", operator: "=", value: "a-value", quoteMark: null}); -attr.toString(); // => "[id=a-value]" -// Get the value with quotes on it and any necessary escapes. -// This is the same as reading attr.value in 3.x. -attr.getQuotedValue(); // => "a-value"; -attr.quoteMark; // => null - -// Add quotes to an attribute's value. -attr.quoteMark = "'"; // This is all that's required. -attr.toString(); // => "[id='a-value']" -attr.quoted; // => true -// The value is still the same, only the quotes have changed. -attr.value; // => a-value -attr.getQuotedValue(); // => "'a-value'"; - -// deprecated assignment, no warning because there's no escapes -attr.value = "new-value"; -// no quote mark is needed so it is removed -attr.getQuotedValue(); // => "new-value"; - -// deprecated assignment, -attr.value = "\"a 'single quoted' value\""; -// > (node:27859) DeprecationWarning: Assigning an attribute a value containing characters that might need to be escaped is deprecated. Call attribute.setValue() instead. -attr.getQuotedValue(); // => '"a \'single quoted\' value"'; -// quote mark inferred from first and last characters. -attr.quoteMark; // => '"' - -// setValue takes options to make manipulating the value simple. -attr.setValue('foo', {smart: true}); -// foo doesn't require any escapes or quotes. -attr.toString(); // => '[id=foo]' -attr.quoteMark; // => null - -// An explicit quote mark can be specified -attr.setValue('foo', {quoteMark: '"'}); -attr.toString(); // => '[id="foo"]' - -// preserves quote mark by default -attr.setValue('bar'); -attr.toString(); // => '[id="bar"]' -attr.quoteMark = null; -attr.toString(); // => '[id=bar]' - -// with no arguments, it preserves quote mark even when it's not a great idea -attr.setValue('a value \n that should be quoted'); -attr.toString(); // => '[id=a\\ value\\ \\A\\ that\\ should\\ be\\ quoted]' - -// smart preservation with a specified default -attr.setValue('a value \n that should be quoted', {smart: true, preferCurrentQuoteMark: true, quoteMark: "'"}); -// => "[id='a value \\A that should be quoted']" -attr.quoteMark = '"'; -// => '[id="a value \\A that should be quoted"]' - -// this keeps double quotes because it wants to quote the value and the existing value has double quotes. -attr.setValue('this should be quoted', {smart: true, preferCurrentQuoteMark: true, quoteMark: "'"}); -// => '[id="this should be quoted"]' - -// picks single quotes because the value has double quotes -attr.setValue('a "double quoted" value', {smart: true, preferCurrentQuoteMark: true, quoteMark: "'"}); -// => "[id='a "double quoted" value']" - -// setPropertyAndEscape lets you do anything you want. Even things that are a bad idea and illegal. -attr.setPropertyAndEscape('value', 'xxxx', 'the password is 42'); -attr.value; // => "xxxx" -attr.toString(); // => "[id=the password is 42]" - -// Pass a value directly through to the css output without escaping it. -attr.setPropertyWithoutEscape('value', '$REPLACEMENT$'); -attr.value; // => "$REPLACEMENT$" -attr.toString(); // => "[id=$REPLACEMENT$]" -``` - -# 3.1.2 - -* Fix: Removed dot-prop dependency since it's no longer written in es5. - -# 3.1.1 - -* Fix: typescript definitions weren't in the published package. - -# 3.1.0 - -* Fixed numerous bugs in attribute nodes relating to the handling of comments - and whitespace. There's significant changes to `attrNode.spaces` and `attrNode.raws` since the `3.0.0` release. -* Added `Attribute#offsetOf(part)` to get the offset location of - attribute parts like `"operator"` and `"value"`. This is most - often added to `Attribute#sourceIndex` for error reporting. - -# 3.0.0 - -## Breaking changes - -* Some tweaks to the tokenizer/attribute selector parsing mean that whitespace - locations might be slightly different to the 2.x code. -* Better attribute selector parsing with more validation; postcss-selector-parser - no longer uses regular expressions to parse attribute selectors. -* Added an async API (thanks to @jacobp100); the default `process` API is now - async, and the sync API is now accessed through `processSync` instead. -* `process()` and `processSync()` now return a string instead of the Processor - instance. -* Tweaks handling of Less interpolation (thanks to @jwilsson). -* Removes support for Node 0.12. - -## Other changes - -* `ast()` and `astSync()` methods have been added to the `Processor`. These - return the `Root` node of the selectors after processing them. -* `transform()` and `transformSync()` methods have been added to the - `Processor`. These return the value returned by the processor callback - after processing the selectors. -* Set the parent when inserting a node (thanks to @chriseppstein). -* Correctly adjust indices when using insertBefore/insertAfter (thanks to @tivac). -* Fixes handling of namespaces with qualified tag selectors. -* `process`, `ast` and `transform` (and their sync variants) now accept a - `postcss` rule node. When provided, better errors are generated and selector - processing is automatically set back to the rule selector (unless the `updateSelector` option is set to `false`.) -* Now more memory efficient when tokenizing selectors. - -### Upgrade hints - -The pattern of: - -`rule.selector = processor.process(rule.selector).result.toString();` - -is now: - -`processor.processSync(rule)` - -# 2.2.3 - -* Resolves an issue where the parser would not reduce multiple spaces between an - ampersand and another simple selector in lossy mode (thanks to @adam-26). - -# 2.2.2 - -* No longer hangs on an unescaped semicolon; instead the parser will throw - an exception for these cases. - -# 2.2.1 - -* Allows a consumer to specify whitespace tokens when creating a new Node - (thanks to @Semigradsky). - -# 2.2.0 - -* Added a new option to normalize whitespace when parsing the selector string - (thanks to @adam-26). - -# 2.1.1 - -* Better unquoted value handling within attribute selectors - (thanks to @evilebottnawi). - -# 2.1.0 - -* Added: Use string constants for all node types & expose them on the main - parser instance (thanks to @Aweary). - -# 2.0.0 - -This release contains the following breaking changes: - -* Renamed all `eachInside` iterators to `walk`. For example, `eachTag` is now - `walkTags`, and `eachInside` is now `walk`. -* Renamed `Node#removeSelf()` to `Node#remove()`. -* Renamed `Container#remove()` to `Container#removeChild()`. -* Renamed `Node#raw` to `Node#raws` (thanks to @davidtheclark). -* Now parses `&` as the *nesting* selector, rather than a *tag* selector. -* Fixes misinterpretation of Sass interpolation (e.g. `#{foo}`) as an - id selector (thanks to @davidtheclark). - -and; - -* Fixes parsing of attribute selectors with equals signs in them - (e.g. `[data-attr="foo=bar"]`) (thanks to @montmanu). -* Adds `quoted` and `raw.unquoted` properties to attribute nodes - (thanks to @davidtheclark). - -# 1.3.3 - -* Fixes an infinite loop on `)` and `]` tokens when they had no opening pairs. - Now postcss-selector-parser will throw when it encounters these lone tokens. - -# 1.3.2 - -* Now uses plain integers rather than `str.charCodeAt(0)` for compiled builds. - -# 1.3.1 - -* Update flatten to v1.x (thanks to @shinnn). - -# 1.3.0 - -* Adds a new node type, `String`, to fix a crash on selectors such as - `foo:bar("test")`. - -# 1.2.1 - -* Fixes a crash when the parser encountered a trailing combinator. - -# 1.2.0 - -* A more descriptive error is thrown when the parser expects to find a - pseudo-class/pseudo-element (thanks to @ashelley). -* Adds support for line/column locations for selector nodes, as well as a - `Node#sourceIndex` method (thanks to @davidtheclark). - -# 1.1.4 - -* Fixes a crash when a selector started with a `>` combinator. The module will - now no longer throw if a selector has a leading/trailing combinator node. - -# 1.1.3 - -* Fixes a crash on `@` tokens. - -# 1.1.2 - -* Fixes an infinite loop caused by using parentheses in a non-pseudo element - context. - -# 1.1.1 - -* Fixes a crash when a backslash ended a selector string. - -# 1.1.0 - -* Adds support for replacing multiple nodes at once with `replaceWith` - (thanks to @jonathantneal). -* Parser no longer throws on sequential IDs and trailing commas, to support - parsing of selector hacks. - -# 1.0.1 - -* Fixes using `insertAfter` and `insertBefore` during iteration. - -# 1.0.0 - -* Adds `clone` and `replaceWith` methods to nodes. -* Adds `insertBefore` and `insertAfter` to containers. -* Stabilises API. - -# 0.0.5 - -* Fixes crash on extra whitespace inside a pseudo selector's parentheses. -* Adds sort function to the container class. -* Enables the parser to pass its input through without transforming. -* Iteration-safe `each` and `eachInside`. - -# 0.0.4 - -* Tidy up redundant duplication. -* Fixes a bug where the parser would loop infinitely on universal selectors - inside pseudo selectors. -* Adds `length` getter and `eachInside`, `map`, `reduce` to the container class. -* When a selector has been removed from the tree, the root node will no longer - cast it to a string. -* Adds node type iterators to the container class (e.g. `eachComment`). -* Adds filter function to the container class. -* Adds split function to the container class. -* Create new node types by doing `parser.id(opts)` etc. -* Adds support for pseudo classes anywhere in the selector. - -# 0.0.3 - -* Adds `next` and `prev` to the node class. -* Adds `first` and `last` getters to the container class. -* Adds `every` and `some` iterators to the container class. -* Add `empty` alias for `removeAll`. -* Combinators are now types of node. -* Fixes the at method so that it is not an alias for `index`. -* Tidy up creation of new nodes in the parser. -* Refactors how namespaces are handled for consistency & less redundant code. -* Refactors AST to use `nodes` exclusively, and eliminates excessive nesting. -* Fixes nested pseudo parsing. -* Fixes whitespace parsing. - -# 0.0.2 - -* Adds support for namespace selectors. -* Adds support for selectors joined by escaped spaces - such as `.\31\ 0`. - -# 0.0.1 - -* Initial release. diff --git a/node_modules/postcss-selector-parser/LICENSE-MIT b/node_modules/postcss-selector-parser/LICENSE-MIT deleted file mode 100644 index fd0e863..0000000 --- a/node_modules/postcss-selector-parser/LICENSE-MIT +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) Ben Briggs (http://beneb.info) - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/postcss-selector-parser/README.md b/node_modules/postcss-selector-parser/README.md deleted file mode 100644 index 28e44f2..0000000 --- a/node_modules/postcss-selector-parser/README.md +++ /dev/null @@ -1,49 +0,0 @@ -# postcss-selector-parser [![test](https://github.com/postcss/postcss-selector-parser/actions/workflows/test.yml/badge.svg)](https://github.com/postcss/postcss-selector-parser/actions/workflows/test.yml) - -> Selector parser with built in methods for working with selector strings. - -## Install - -With [npm](https://npmjs.com/package/postcss-selector-parser) do: - -``` -npm install postcss-selector-parser -``` - -## Quick Start - -```js -const parser = require('postcss-selector-parser'); -const transform = selectors => { - selectors.walk(selector => { - // do something with the selector - console.log(String(selector)) - }); -}; - -const transformed = parser(transform).processSync('h1, h2, h3'); -``` - -To normalize selector whitespace: - -```js -const parser = require('postcss-selector-parser'); -const normalized = parser().processSync('h1, h2, h3', {lossless: false}); -// -> h1,h2,h3 -``` - -Async support is provided through `parser.process` and will resolve a Promise -with the resulting selector string. - -## API - -Please see [API.md](API.md). - -## Credits - -* Huge thanks to Andrey Sitnik (@ai) for work on PostCSS which helped - accelerate this module's development. - -## License - -MIT diff --git a/node_modules/postcss-selector-parser/dist/index.js b/node_modules/postcss-selector-parser/dist/index.js deleted file mode 100644 index 995741a..0000000 --- a/node_modules/postcss-selector-parser/dist/index.js +++ /dev/null @@ -1,17 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports["default"] = void 0; -var _processor = _interopRequireDefault(require("./processor")); -var selectors = _interopRequireWildcard(require("./selectors")); -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } -var parser = function parser(processor) { - return new _processor["default"](processor); -}; -Object.assign(parser, selectors); -delete parser.__esModule; -var _default = parser; -exports["default"] = _default; -module.exports = exports.default; \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/parser.js b/node_modules/postcss-selector-parser/dist/parser.js deleted file mode 100644 index ada6158..0000000 --- a/node_modules/postcss-selector-parser/dist/parser.js +++ /dev/null @@ -1,1015 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports["default"] = void 0; -var _root = _interopRequireDefault(require("./selectors/root")); -var _selector = _interopRequireDefault(require("./selectors/selector")); -var _className = _interopRequireDefault(require("./selectors/className")); -var _comment = _interopRequireDefault(require("./selectors/comment")); -var _id = _interopRequireDefault(require("./selectors/id")); -var _tag = _interopRequireDefault(require("./selectors/tag")); -var _string = _interopRequireDefault(require("./selectors/string")); -var _pseudo = _interopRequireDefault(require("./selectors/pseudo")); -var _attribute = _interopRequireWildcard(require("./selectors/attribute")); -var _universal = _interopRequireDefault(require("./selectors/universal")); -var _combinator = _interopRequireDefault(require("./selectors/combinator")); -var _nesting = _interopRequireDefault(require("./selectors/nesting")); -var _sortAscending = _interopRequireDefault(require("./sortAscending")); -var _tokenize = _interopRequireWildcard(require("./tokenize")); -var tokens = _interopRequireWildcard(require("./tokenTypes")); -var types = _interopRequireWildcard(require("./selectors/types")); -var _util = require("./util"); -var _WHITESPACE_TOKENS, _Object$assign; -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } -var WHITESPACE_TOKENS = (_WHITESPACE_TOKENS = {}, _WHITESPACE_TOKENS[tokens.space] = true, _WHITESPACE_TOKENS[tokens.cr] = true, _WHITESPACE_TOKENS[tokens.feed] = true, _WHITESPACE_TOKENS[tokens.newline] = true, _WHITESPACE_TOKENS[tokens.tab] = true, _WHITESPACE_TOKENS); -var WHITESPACE_EQUIV_TOKENS = Object.assign({}, WHITESPACE_TOKENS, (_Object$assign = {}, _Object$assign[tokens.comment] = true, _Object$assign)); -function tokenStart(token) { - return { - line: token[_tokenize.FIELDS.START_LINE], - column: token[_tokenize.FIELDS.START_COL] - }; -} -function tokenEnd(token) { - return { - line: token[_tokenize.FIELDS.END_LINE], - column: token[_tokenize.FIELDS.END_COL] - }; -} -function getSource(startLine, startColumn, endLine, endColumn) { - return { - start: { - line: startLine, - column: startColumn - }, - end: { - line: endLine, - column: endColumn - } - }; -} -function getTokenSource(token) { - return getSource(token[_tokenize.FIELDS.START_LINE], token[_tokenize.FIELDS.START_COL], token[_tokenize.FIELDS.END_LINE], token[_tokenize.FIELDS.END_COL]); -} -function getTokenSourceSpan(startToken, endToken) { - if (!startToken) { - return undefined; - } - return getSource(startToken[_tokenize.FIELDS.START_LINE], startToken[_tokenize.FIELDS.START_COL], endToken[_tokenize.FIELDS.END_LINE], endToken[_tokenize.FIELDS.END_COL]); -} -function unescapeProp(node, prop) { - var value = node[prop]; - if (typeof value !== "string") { - return; - } - if (value.indexOf("\\") !== -1) { - (0, _util.ensureObject)(node, 'raws'); - node[prop] = (0, _util.unesc)(value); - if (node.raws[prop] === undefined) { - node.raws[prop] = value; - } - } - return node; -} -function indexesOf(array, item) { - var i = -1; - var indexes = []; - while ((i = array.indexOf(item, i + 1)) !== -1) { - indexes.push(i); - } - return indexes; -} -function uniqs() { - var list = Array.prototype.concat.apply([], arguments); - return list.filter(function (item, i) { - return i === list.indexOf(item); - }); -} -var Parser = /*#__PURE__*/function () { - function Parser(rule, options) { - if (options === void 0) { - options = {}; - } - this.rule = rule; - this.options = Object.assign({ - lossy: false, - safe: false - }, options); - this.position = 0; - this.css = typeof this.rule === 'string' ? this.rule : this.rule.selector; - this.tokens = (0, _tokenize["default"])({ - css: this.css, - error: this._errorGenerator(), - safe: this.options.safe - }); - var rootSource = getTokenSourceSpan(this.tokens[0], this.tokens[this.tokens.length - 1]); - this.root = new _root["default"]({ - source: rootSource - }); - this.root.errorGenerator = this._errorGenerator(); - var selector = new _selector["default"]({ - source: { - start: { - line: 1, - column: 1 - } - }, - sourceIndex: 0 - }); - this.root.append(selector); - this.current = selector; - this.loop(); - } - var _proto = Parser.prototype; - _proto._errorGenerator = function _errorGenerator() { - var _this = this; - return function (message, errorOptions) { - if (typeof _this.rule === 'string') { - return new Error(message); - } - return _this.rule.error(message, errorOptions); - }; - }; - _proto.attribute = function attribute() { - var attr = []; - var startingToken = this.currToken; - this.position++; - while (this.position < this.tokens.length && this.currToken[_tokenize.FIELDS.TYPE] !== tokens.closeSquare) { - attr.push(this.currToken); - this.position++; - } - if (this.currToken[_tokenize.FIELDS.TYPE] !== tokens.closeSquare) { - return this.expected('closing square bracket', this.currToken[_tokenize.FIELDS.START_POS]); - } - var len = attr.length; - var node = { - source: getSource(startingToken[1], startingToken[2], this.currToken[3], this.currToken[4]), - sourceIndex: startingToken[_tokenize.FIELDS.START_POS] - }; - if (len === 1 && !~[tokens.word].indexOf(attr[0][_tokenize.FIELDS.TYPE])) { - return this.expected('attribute', attr[0][_tokenize.FIELDS.START_POS]); - } - var pos = 0; - var spaceBefore = ''; - var commentBefore = ''; - var lastAdded = null; - var spaceAfterMeaningfulToken = false; - while (pos < len) { - var token = attr[pos]; - var content = this.content(token); - var next = attr[pos + 1]; - switch (token[_tokenize.FIELDS.TYPE]) { - case tokens.space: - // if ( - // len === 1 || - // pos === 0 && this.content(next) === '|' - // ) { - // return this.expected('attribute', token[TOKEN.START_POS], content); - // } - spaceAfterMeaningfulToken = true; - if (this.options.lossy) { - break; - } - if (lastAdded) { - (0, _util.ensureObject)(node, 'spaces', lastAdded); - var prevContent = node.spaces[lastAdded].after || ''; - node.spaces[lastAdded].after = prevContent + content; - var existingComment = (0, _util.getProp)(node, 'raws', 'spaces', lastAdded, 'after') || null; - if (existingComment) { - node.raws.spaces[lastAdded].after = existingComment + content; - } - } else { - spaceBefore = spaceBefore + content; - commentBefore = commentBefore + content; - } - break; - case tokens.asterisk: - if (next[_tokenize.FIELDS.TYPE] === tokens.equals) { - node.operator = content; - lastAdded = 'operator'; - } else if ((!node.namespace || lastAdded === "namespace" && !spaceAfterMeaningfulToken) && next) { - if (spaceBefore) { - (0, _util.ensureObject)(node, 'spaces', 'attribute'); - node.spaces.attribute.before = spaceBefore; - spaceBefore = ''; - } - if (commentBefore) { - (0, _util.ensureObject)(node, 'raws', 'spaces', 'attribute'); - node.raws.spaces.attribute.before = spaceBefore; - commentBefore = ''; - } - node.namespace = (node.namespace || "") + content; - var rawValue = (0, _util.getProp)(node, 'raws', 'namespace') || null; - if (rawValue) { - node.raws.namespace += content; - } - lastAdded = 'namespace'; - } - spaceAfterMeaningfulToken = false; - break; - case tokens.dollar: - if (lastAdded === "value") { - var oldRawValue = (0, _util.getProp)(node, 'raws', 'value'); - node.value += "$"; - if (oldRawValue) { - node.raws.value = oldRawValue + "$"; - } - break; - } - // Falls through - case tokens.caret: - if (next[_tokenize.FIELDS.TYPE] === tokens.equals) { - node.operator = content; - lastAdded = 'operator'; - } - spaceAfterMeaningfulToken = false; - break; - case tokens.combinator: - if (content === '~' && next[_tokenize.FIELDS.TYPE] === tokens.equals) { - node.operator = content; - lastAdded = 'operator'; - } - if (content !== '|') { - spaceAfterMeaningfulToken = false; - break; - } - if (next[_tokenize.FIELDS.TYPE] === tokens.equals) { - node.operator = content; - lastAdded = 'operator'; - } else if (!node.namespace && !node.attribute) { - node.namespace = true; - } - spaceAfterMeaningfulToken = false; - break; - case tokens.word: - if (next && this.content(next) === '|' && attr[pos + 2] && attr[pos + 2][_tokenize.FIELDS.TYPE] !== tokens.equals && - // this look-ahead probably fails with comment nodes involved. - !node.operator && !node.namespace) { - node.namespace = content; - lastAdded = 'namespace'; - } else if (!node.attribute || lastAdded === "attribute" && !spaceAfterMeaningfulToken) { - if (spaceBefore) { - (0, _util.ensureObject)(node, 'spaces', 'attribute'); - node.spaces.attribute.before = spaceBefore; - spaceBefore = ''; - } - if (commentBefore) { - (0, _util.ensureObject)(node, 'raws', 'spaces', 'attribute'); - node.raws.spaces.attribute.before = commentBefore; - commentBefore = ''; - } - node.attribute = (node.attribute || "") + content; - var _rawValue = (0, _util.getProp)(node, 'raws', 'attribute') || null; - if (_rawValue) { - node.raws.attribute += content; - } - lastAdded = 'attribute'; - } else if (!node.value && node.value !== "" || lastAdded === "value" && !(spaceAfterMeaningfulToken || node.quoteMark)) { - var _unescaped = (0, _util.unesc)(content); - var _oldRawValue = (0, _util.getProp)(node, 'raws', 'value') || ''; - var oldValue = node.value || ''; - node.value = oldValue + _unescaped; - node.quoteMark = null; - if (_unescaped !== content || _oldRawValue) { - (0, _util.ensureObject)(node, 'raws'); - node.raws.value = (_oldRawValue || oldValue) + content; - } - lastAdded = 'value'; - } else { - var insensitive = content === 'i' || content === "I"; - if ((node.value || node.value === '') && (node.quoteMark || spaceAfterMeaningfulToken)) { - node.insensitive = insensitive; - if (!insensitive || content === "I") { - (0, _util.ensureObject)(node, 'raws'); - node.raws.insensitiveFlag = content; - } - lastAdded = 'insensitive'; - if (spaceBefore) { - (0, _util.ensureObject)(node, 'spaces', 'insensitive'); - node.spaces.insensitive.before = spaceBefore; - spaceBefore = ''; - } - if (commentBefore) { - (0, _util.ensureObject)(node, 'raws', 'spaces', 'insensitive'); - node.raws.spaces.insensitive.before = commentBefore; - commentBefore = ''; - } - } else if (node.value || node.value === '') { - lastAdded = 'value'; - node.value += content; - if (node.raws.value) { - node.raws.value += content; - } - } - } - spaceAfterMeaningfulToken = false; - break; - case tokens.str: - if (!node.attribute || !node.operator) { - return this.error("Expected an attribute followed by an operator preceding the string.", { - index: token[_tokenize.FIELDS.START_POS] - }); - } - var _unescapeValue = (0, _attribute.unescapeValue)(content), - unescaped = _unescapeValue.unescaped, - quoteMark = _unescapeValue.quoteMark; - node.value = unescaped; - node.quoteMark = quoteMark; - lastAdded = 'value'; - (0, _util.ensureObject)(node, 'raws'); - node.raws.value = content; - spaceAfterMeaningfulToken = false; - break; - case tokens.equals: - if (!node.attribute) { - return this.expected('attribute', token[_tokenize.FIELDS.START_POS], content); - } - if (node.value) { - return this.error('Unexpected "=" found; an operator was already defined.', { - index: token[_tokenize.FIELDS.START_POS] - }); - } - node.operator = node.operator ? node.operator + content : content; - lastAdded = 'operator'; - spaceAfterMeaningfulToken = false; - break; - case tokens.comment: - if (lastAdded) { - if (spaceAfterMeaningfulToken || next && next[_tokenize.FIELDS.TYPE] === tokens.space || lastAdded === 'insensitive') { - var lastComment = (0, _util.getProp)(node, 'spaces', lastAdded, 'after') || ''; - var rawLastComment = (0, _util.getProp)(node, 'raws', 'spaces', lastAdded, 'after') || lastComment; - (0, _util.ensureObject)(node, 'raws', 'spaces', lastAdded); - node.raws.spaces[lastAdded].after = rawLastComment + content; - } else { - var lastValue = node[lastAdded] || ''; - var rawLastValue = (0, _util.getProp)(node, 'raws', lastAdded) || lastValue; - (0, _util.ensureObject)(node, 'raws'); - node.raws[lastAdded] = rawLastValue + content; - } - } else { - commentBefore = commentBefore + content; - } - break; - default: - return this.error("Unexpected \"" + content + "\" found.", { - index: token[_tokenize.FIELDS.START_POS] - }); - } - pos++; - } - unescapeProp(node, "attribute"); - unescapeProp(node, "namespace"); - this.newNode(new _attribute["default"](node)); - this.position++; - } - - /** - * return a node containing meaningless garbage up to (but not including) the specified token position. - * if the token position is negative, all remaining tokens are consumed. - * - * This returns an array containing a single string node if all whitespace, - * otherwise an array of comment nodes with space before and after. - * - * These tokens are not added to the current selector, the caller can add them or use them to amend - * a previous node's space metadata. - * - * In lossy mode, this returns only comments. - */; - _proto.parseWhitespaceEquivalentTokens = function parseWhitespaceEquivalentTokens(stopPosition) { - if (stopPosition < 0) { - stopPosition = this.tokens.length; - } - var startPosition = this.position; - var nodes = []; - var space = ""; - var lastComment = undefined; - do { - if (WHITESPACE_TOKENS[this.currToken[_tokenize.FIELDS.TYPE]]) { - if (!this.options.lossy) { - space += this.content(); - } - } else if (this.currToken[_tokenize.FIELDS.TYPE] === tokens.comment) { - var spaces = {}; - if (space) { - spaces.before = space; - space = ""; - } - lastComment = new _comment["default"]({ - value: this.content(), - source: getTokenSource(this.currToken), - sourceIndex: this.currToken[_tokenize.FIELDS.START_POS], - spaces: spaces - }); - nodes.push(lastComment); - } - } while (++this.position < stopPosition); - if (space) { - if (lastComment) { - lastComment.spaces.after = space; - } else if (!this.options.lossy) { - var firstToken = this.tokens[startPosition]; - var lastToken = this.tokens[this.position - 1]; - nodes.push(new _string["default"]({ - value: '', - source: getSource(firstToken[_tokenize.FIELDS.START_LINE], firstToken[_tokenize.FIELDS.START_COL], lastToken[_tokenize.FIELDS.END_LINE], lastToken[_tokenize.FIELDS.END_COL]), - sourceIndex: firstToken[_tokenize.FIELDS.START_POS], - spaces: { - before: space, - after: '' - } - })); - } - } - return nodes; - } - - /** - * - * @param {*} nodes - */; - _proto.convertWhitespaceNodesToSpace = function convertWhitespaceNodesToSpace(nodes, requiredSpace) { - var _this2 = this; - if (requiredSpace === void 0) { - requiredSpace = false; - } - var space = ""; - var rawSpace = ""; - nodes.forEach(function (n) { - var spaceBefore = _this2.lossySpace(n.spaces.before, requiredSpace); - var rawSpaceBefore = _this2.lossySpace(n.rawSpaceBefore, requiredSpace); - space += spaceBefore + _this2.lossySpace(n.spaces.after, requiredSpace && spaceBefore.length === 0); - rawSpace += spaceBefore + n.value + _this2.lossySpace(n.rawSpaceAfter, requiredSpace && rawSpaceBefore.length === 0); - }); - if (rawSpace === space) { - rawSpace = undefined; - } - var result = { - space: space, - rawSpace: rawSpace - }; - return result; - }; - _proto.isNamedCombinator = function isNamedCombinator(position) { - if (position === void 0) { - position = this.position; - } - return this.tokens[position + 0] && this.tokens[position + 0][_tokenize.FIELDS.TYPE] === tokens.slash && this.tokens[position + 1] && this.tokens[position + 1][_tokenize.FIELDS.TYPE] === tokens.word && this.tokens[position + 2] && this.tokens[position + 2][_tokenize.FIELDS.TYPE] === tokens.slash; - }; - _proto.namedCombinator = function namedCombinator() { - if (this.isNamedCombinator()) { - var nameRaw = this.content(this.tokens[this.position + 1]); - var name = (0, _util.unesc)(nameRaw).toLowerCase(); - var raws = {}; - if (name !== nameRaw) { - raws.value = "/" + nameRaw + "/"; - } - var node = new _combinator["default"]({ - value: "/" + name + "/", - source: getSource(this.currToken[_tokenize.FIELDS.START_LINE], this.currToken[_tokenize.FIELDS.START_COL], this.tokens[this.position + 2][_tokenize.FIELDS.END_LINE], this.tokens[this.position + 2][_tokenize.FIELDS.END_COL]), - sourceIndex: this.currToken[_tokenize.FIELDS.START_POS], - raws: raws - }); - this.position = this.position + 3; - return node; - } else { - this.unexpected(); - } - }; - _proto.combinator = function combinator() { - var _this3 = this; - if (this.content() === '|') { - return this.namespace(); - } - // We need to decide between a space that's a descendant combinator and meaningless whitespace at the end of a selector. - var nextSigTokenPos = this.locateNextMeaningfulToken(this.position); - if (nextSigTokenPos < 0 || this.tokens[nextSigTokenPos][_tokenize.FIELDS.TYPE] === tokens.comma || this.tokens[nextSigTokenPos][_tokenize.FIELDS.TYPE] === tokens.closeParenthesis) { - var nodes = this.parseWhitespaceEquivalentTokens(nextSigTokenPos); - if (nodes.length > 0) { - var last = this.current.last; - if (last) { - var _this$convertWhitespa = this.convertWhitespaceNodesToSpace(nodes), - space = _this$convertWhitespa.space, - rawSpace = _this$convertWhitespa.rawSpace; - if (rawSpace !== undefined) { - last.rawSpaceAfter += rawSpace; - } - last.spaces.after += space; - } else { - nodes.forEach(function (n) { - return _this3.newNode(n); - }); - } - } - return; - } - var firstToken = this.currToken; - var spaceOrDescendantSelectorNodes = undefined; - if (nextSigTokenPos > this.position) { - spaceOrDescendantSelectorNodes = this.parseWhitespaceEquivalentTokens(nextSigTokenPos); - } - var node; - if (this.isNamedCombinator()) { - node = this.namedCombinator(); - } else if (this.currToken[_tokenize.FIELDS.TYPE] === tokens.combinator) { - node = new _combinator["default"]({ - value: this.content(), - source: getTokenSource(this.currToken), - sourceIndex: this.currToken[_tokenize.FIELDS.START_POS] - }); - this.position++; - } else if (WHITESPACE_TOKENS[this.currToken[_tokenize.FIELDS.TYPE]]) { - // pass - } else if (!spaceOrDescendantSelectorNodes) { - this.unexpected(); - } - if (node) { - if (spaceOrDescendantSelectorNodes) { - var _this$convertWhitespa2 = this.convertWhitespaceNodesToSpace(spaceOrDescendantSelectorNodes), - _space = _this$convertWhitespa2.space, - _rawSpace = _this$convertWhitespa2.rawSpace; - node.spaces.before = _space; - node.rawSpaceBefore = _rawSpace; - } - } else { - // descendant combinator - var _this$convertWhitespa3 = this.convertWhitespaceNodesToSpace(spaceOrDescendantSelectorNodes, true), - _space2 = _this$convertWhitespa3.space, - _rawSpace2 = _this$convertWhitespa3.rawSpace; - if (!_rawSpace2) { - _rawSpace2 = _space2; - } - var spaces = {}; - var raws = { - spaces: {} - }; - if (_space2.endsWith(' ') && _rawSpace2.endsWith(' ')) { - spaces.before = _space2.slice(0, _space2.length - 1); - raws.spaces.before = _rawSpace2.slice(0, _rawSpace2.length - 1); - } else if (_space2.startsWith(' ') && _rawSpace2.startsWith(' ')) { - spaces.after = _space2.slice(1); - raws.spaces.after = _rawSpace2.slice(1); - } else { - raws.value = _rawSpace2; - } - node = new _combinator["default"]({ - value: ' ', - source: getTokenSourceSpan(firstToken, this.tokens[this.position - 1]), - sourceIndex: firstToken[_tokenize.FIELDS.START_POS], - spaces: spaces, - raws: raws - }); - } - if (this.currToken && this.currToken[_tokenize.FIELDS.TYPE] === tokens.space) { - node.spaces.after = this.optionalSpace(this.content()); - this.position++; - } - return this.newNode(node); - }; - _proto.comma = function comma() { - if (this.position === this.tokens.length - 1) { - this.root.trailingComma = true; - this.position++; - return; - } - this.current._inferEndPosition(); - var selector = new _selector["default"]({ - source: { - start: tokenStart(this.tokens[this.position + 1]) - }, - sourceIndex: this.tokens[this.position + 1][_tokenize.FIELDS.START_POS] - }); - this.current.parent.append(selector); - this.current = selector; - this.position++; - }; - _proto.comment = function comment() { - var current = this.currToken; - this.newNode(new _comment["default"]({ - value: this.content(), - source: getTokenSource(current), - sourceIndex: current[_tokenize.FIELDS.START_POS] - })); - this.position++; - }; - _proto.error = function error(message, opts) { - throw this.root.error(message, opts); - }; - _proto.missingBackslash = function missingBackslash() { - return this.error('Expected a backslash preceding the semicolon.', { - index: this.currToken[_tokenize.FIELDS.START_POS] - }); - }; - _proto.missingParenthesis = function missingParenthesis() { - return this.expected('opening parenthesis', this.currToken[_tokenize.FIELDS.START_POS]); - }; - _proto.missingSquareBracket = function missingSquareBracket() { - return this.expected('opening square bracket', this.currToken[_tokenize.FIELDS.START_POS]); - }; - _proto.unexpected = function unexpected() { - return this.error("Unexpected '" + this.content() + "'. Escaping special characters with \\ may help.", this.currToken[_tokenize.FIELDS.START_POS]); - }; - _proto.unexpectedPipe = function unexpectedPipe() { - return this.error("Unexpected '|'.", this.currToken[_tokenize.FIELDS.START_POS]); - }; - _proto.namespace = function namespace() { - var before = this.prevToken && this.content(this.prevToken) || true; - if (this.nextToken[_tokenize.FIELDS.TYPE] === tokens.word) { - this.position++; - return this.word(before); - } else if (this.nextToken[_tokenize.FIELDS.TYPE] === tokens.asterisk) { - this.position++; - return this.universal(before); - } - this.unexpectedPipe(); - }; - _proto.nesting = function nesting() { - if (this.nextToken) { - var nextContent = this.content(this.nextToken); - if (nextContent === "|") { - this.position++; - return; - } - } - var current = this.currToken; - this.newNode(new _nesting["default"]({ - value: this.content(), - source: getTokenSource(current), - sourceIndex: current[_tokenize.FIELDS.START_POS] - })); - this.position++; - }; - _proto.parentheses = function parentheses() { - var last = this.current.last; - var unbalanced = 1; - this.position++; - if (last && last.type === types.PSEUDO) { - var selector = new _selector["default"]({ - source: { - start: tokenStart(this.tokens[this.position]) - }, - sourceIndex: this.tokens[this.position][_tokenize.FIELDS.START_POS] - }); - var cache = this.current; - last.append(selector); - this.current = selector; - while (this.position < this.tokens.length && unbalanced) { - if (this.currToken[_tokenize.FIELDS.TYPE] === tokens.openParenthesis) { - unbalanced++; - } - if (this.currToken[_tokenize.FIELDS.TYPE] === tokens.closeParenthesis) { - unbalanced--; - } - if (unbalanced) { - this.parse(); - } else { - this.current.source.end = tokenEnd(this.currToken); - this.current.parent.source.end = tokenEnd(this.currToken); - this.position++; - } - } - this.current = cache; - } else { - // I think this case should be an error. It's used to implement a basic parse of media queries - // but I don't think it's a good idea. - var parenStart = this.currToken; - var parenValue = "("; - var parenEnd; - while (this.position < this.tokens.length && unbalanced) { - if (this.currToken[_tokenize.FIELDS.TYPE] === tokens.openParenthesis) { - unbalanced++; - } - if (this.currToken[_tokenize.FIELDS.TYPE] === tokens.closeParenthesis) { - unbalanced--; - } - parenEnd = this.currToken; - parenValue += this.parseParenthesisToken(this.currToken); - this.position++; - } - if (last) { - last.appendToPropertyAndEscape("value", parenValue, parenValue); - } else { - this.newNode(new _string["default"]({ - value: parenValue, - source: getSource(parenStart[_tokenize.FIELDS.START_LINE], parenStart[_tokenize.FIELDS.START_COL], parenEnd[_tokenize.FIELDS.END_LINE], parenEnd[_tokenize.FIELDS.END_COL]), - sourceIndex: parenStart[_tokenize.FIELDS.START_POS] - })); - } - } - if (unbalanced) { - return this.expected('closing parenthesis', this.currToken[_tokenize.FIELDS.START_POS]); - } - }; - _proto.pseudo = function pseudo() { - var _this4 = this; - var pseudoStr = ''; - var startingToken = this.currToken; - while (this.currToken && this.currToken[_tokenize.FIELDS.TYPE] === tokens.colon) { - pseudoStr += this.content(); - this.position++; - } - if (!this.currToken) { - return this.expected(['pseudo-class', 'pseudo-element'], this.position - 1); - } - if (this.currToken[_tokenize.FIELDS.TYPE] === tokens.word) { - this.splitWord(false, function (first, length) { - pseudoStr += first; - _this4.newNode(new _pseudo["default"]({ - value: pseudoStr, - source: getTokenSourceSpan(startingToken, _this4.currToken), - sourceIndex: startingToken[_tokenize.FIELDS.START_POS] - })); - if (length > 1 && _this4.nextToken && _this4.nextToken[_tokenize.FIELDS.TYPE] === tokens.openParenthesis) { - _this4.error('Misplaced parenthesis.', { - index: _this4.nextToken[_tokenize.FIELDS.START_POS] - }); - } - }); - } else { - return this.expected(['pseudo-class', 'pseudo-element'], this.currToken[_tokenize.FIELDS.START_POS]); - } - }; - _proto.space = function space() { - var content = this.content(); - // Handle space before and after the selector - if (this.position === 0 || this.prevToken[_tokenize.FIELDS.TYPE] === tokens.comma || this.prevToken[_tokenize.FIELDS.TYPE] === tokens.openParenthesis || this.current.nodes.every(function (node) { - return node.type === 'comment'; - })) { - this.spaces = this.optionalSpace(content); - this.position++; - } else if (this.position === this.tokens.length - 1 || this.nextToken[_tokenize.FIELDS.TYPE] === tokens.comma || this.nextToken[_tokenize.FIELDS.TYPE] === tokens.closeParenthesis) { - this.current.last.spaces.after = this.optionalSpace(content); - this.position++; - } else { - this.combinator(); - } - }; - _proto.string = function string() { - var current = this.currToken; - this.newNode(new _string["default"]({ - value: this.content(), - source: getTokenSource(current), - sourceIndex: current[_tokenize.FIELDS.START_POS] - })); - this.position++; - }; - _proto.universal = function universal(namespace) { - var nextToken = this.nextToken; - if (nextToken && this.content(nextToken) === '|') { - this.position++; - return this.namespace(); - } - var current = this.currToken; - this.newNode(new _universal["default"]({ - value: this.content(), - source: getTokenSource(current), - sourceIndex: current[_tokenize.FIELDS.START_POS] - }), namespace); - this.position++; - }; - _proto.splitWord = function splitWord(namespace, firstCallback) { - var _this5 = this; - var nextToken = this.nextToken; - var word = this.content(); - while (nextToken && ~[tokens.dollar, tokens.caret, tokens.equals, tokens.word].indexOf(nextToken[_tokenize.FIELDS.TYPE])) { - this.position++; - var current = this.content(); - word += current; - if (current.lastIndexOf('\\') === current.length - 1) { - var next = this.nextToken; - if (next && next[_tokenize.FIELDS.TYPE] === tokens.space) { - word += this.requiredSpace(this.content(next)); - this.position++; - } - } - nextToken = this.nextToken; - } - var hasClass = indexesOf(word, '.').filter(function (i) { - // Allow escaped dot within class name - var escapedDot = word[i - 1] === '\\'; - // Allow decimal numbers percent in @keyframes - var isKeyframesPercent = /^\d+\.\d+%$/.test(word); - return !escapedDot && !isKeyframesPercent; - }); - var hasId = indexesOf(word, '#').filter(function (i) { - return word[i - 1] !== '\\'; - }); - // Eliminate Sass interpolations from the list of id indexes - var interpolations = indexesOf(word, '#{'); - if (interpolations.length) { - hasId = hasId.filter(function (hashIndex) { - return !~interpolations.indexOf(hashIndex); - }); - } - var indices = (0, _sortAscending["default"])(uniqs([0].concat(hasClass, hasId))); - indices.forEach(function (ind, i) { - var index = indices[i + 1] || word.length; - var value = word.slice(ind, index); - if (i === 0 && firstCallback) { - return firstCallback.call(_this5, value, indices.length); - } - var node; - var current = _this5.currToken; - var sourceIndex = current[_tokenize.FIELDS.START_POS] + indices[i]; - var source = getSource(current[1], current[2] + ind, current[3], current[2] + (index - 1)); - if (~hasClass.indexOf(ind)) { - var classNameOpts = { - value: value.slice(1), - source: source, - sourceIndex: sourceIndex - }; - node = new _className["default"](unescapeProp(classNameOpts, "value")); - } else if (~hasId.indexOf(ind)) { - var idOpts = { - value: value.slice(1), - source: source, - sourceIndex: sourceIndex - }; - node = new _id["default"](unescapeProp(idOpts, "value")); - } else { - var tagOpts = { - value: value, - source: source, - sourceIndex: sourceIndex - }; - unescapeProp(tagOpts, "value"); - node = new _tag["default"](tagOpts); - } - _this5.newNode(node, namespace); - // Ensure that the namespace is used only once - namespace = null; - }); - this.position++; - }; - _proto.word = function word(namespace) { - var nextToken = this.nextToken; - if (nextToken && this.content(nextToken) === '|') { - this.position++; - return this.namespace(); - } - return this.splitWord(namespace); - }; - _proto.loop = function loop() { - while (this.position < this.tokens.length) { - this.parse(true); - } - this.current._inferEndPosition(); - return this.root; - }; - _proto.parse = function parse(throwOnParenthesis) { - switch (this.currToken[_tokenize.FIELDS.TYPE]) { - case tokens.space: - this.space(); - break; - case tokens.comment: - this.comment(); - break; - case tokens.openParenthesis: - this.parentheses(); - break; - case tokens.closeParenthesis: - if (throwOnParenthesis) { - this.missingParenthesis(); - } - break; - case tokens.openSquare: - this.attribute(); - break; - case tokens.dollar: - case tokens.caret: - case tokens.equals: - case tokens.word: - this.word(); - break; - case tokens.colon: - this.pseudo(); - break; - case tokens.comma: - this.comma(); - break; - case tokens.asterisk: - this.universal(); - break; - case tokens.ampersand: - this.nesting(); - break; - case tokens.slash: - case tokens.combinator: - this.combinator(); - break; - case tokens.str: - this.string(); - break; - // These cases throw; no break needed. - case tokens.closeSquare: - this.missingSquareBracket(); - case tokens.semicolon: - this.missingBackslash(); - default: - this.unexpected(); - } - } - - /** - * Helpers - */; - _proto.expected = function expected(description, index, found) { - if (Array.isArray(description)) { - var last = description.pop(); - description = description.join(', ') + " or " + last; - } - var an = /^[aeiou]/.test(description[0]) ? 'an' : 'a'; - if (!found) { - return this.error("Expected " + an + " " + description + ".", { - index: index - }); - } - return this.error("Expected " + an + " " + description + ", found \"" + found + "\" instead.", { - index: index - }); - }; - _proto.requiredSpace = function requiredSpace(space) { - return this.options.lossy ? ' ' : space; - }; - _proto.optionalSpace = function optionalSpace(space) { - return this.options.lossy ? '' : space; - }; - _proto.lossySpace = function lossySpace(space, required) { - if (this.options.lossy) { - return required ? ' ' : ''; - } else { - return space; - } - }; - _proto.parseParenthesisToken = function parseParenthesisToken(token) { - var content = this.content(token); - if (token[_tokenize.FIELDS.TYPE] === tokens.space) { - return this.requiredSpace(content); - } else { - return content; - } - }; - _proto.newNode = function newNode(node, namespace) { - if (namespace) { - if (/^ +$/.test(namespace)) { - if (!this.options.lossy) { - this.spaces = (this.spaces || '') + namespace; - } - namespace = true; - } - node.namespace = namespace; - unescapeProp(node, "namespace"); - } - if (this.spaces) { - node.spaces.before = this.spaces; - this.spaces = ''; - } - return this.current.append(node); - }; - _proto.content = function content(token) { - if (token === void 0) { - token = this.currToken; - } - return this.css.slice(token[_tokenize.FIELDS.START_POS], token[_tokenize.FIELDS.END_POS]); - }; - /** - * returns the index of the next non-whitespace, non-comment token. - * returns -1 if no meaningful token is found. - */ - _proto.locateNextMeaningfulToken = function locateNextMeaningfulToken(startPosition) { - if (startPosition === void 0) { - startPosition = this.position + 1; - } - var searchPosition = startPosition; - while (searchPosition < this.tokens.length) { - if (WHITESPACE_EQUIV_TOKENS[this.tokens[searchPosition][_tokenize.FIELDS.TYPE]]) { - searchPosition++; - continue; - } else { - return searchPosition; - } - } - return -1; - }; - _createClass(Parser, [{ - key: "currToken", - get: function get() { - return this.tokens[this.position]; - } - }, { - key: "nextToken", - get: function get() { - return this.tokens[this.position + 1]; - } - }, { - key: "prevToken", - get: function get() { - return this.tokens[this.position - 1]; - } - }]); - return Parser; -}(); -exports["default"] = Parser; -module.exports = exports.default; \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/processor.js b/node_modules/postcss-selector-parser/dist/processor.js deleted file mode 100644 index dbfa091..0000000 --- a/node_modules/postcss-selector-parser/dist/processor.js +++ /dev/null @@ -1,170 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports["default"] = void 0; -var _parser = _interopRequireDefault(require("./parser")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } -var Processor = /*#__PURE__*/function () { - function Processor(func, options) { - this.func = func || function noop() {}; - this.funcRes = null; - this.options = options; - } - var _proto = Processor.prototype; - _proto._shouldUpdateSelector = function _shouldUpdateSelector(rule, options) { - if (options === void 0) { - options = {}; - } - var merged = Object.assign({}, this.options, options); - if (merged.updateSelector === false) { - return false; - } else { - return typeof rule !== "string"; - } - }; - _proto._isLossy = function _isLossy(options) { - if (options === void 0) { - options = {}; - } - var merged = Object.assign({}, this.options, options); - if (merged.lossless === false) { - return true; - } else { - return false; - } - }; - _proto._root = function _root(rule, options) { - if (options === void 0) { - options = {}; - } - var parser = new _parser["default"](rule, this._parseOptions(options)); - return parser.root; - }; - _proto._parseOptions = function _parseOptions(options) { - return { - lossy: this._isLossy(options) - }; - }; - _proto._run = function _run(rule, options) { - var _this = this; - if (options === void 0) { - options = {}; - } - return new Promise(function (resolve, reject) { - try { - var root = _this._root(rule, options); - Promise.resolve(_this.func(root)).then(function (transform) { - var string = undefined; - if (_this._shouldUpdateSelector(rule, options)) { - string = root.toString(); - rule.selector = string; - } - return { - transform: transform, - root: root, - string: string - }; - }).then(resolve, reject); - } catch (e) { - reject(e); - return; - } - }); - }; - _proto._runSync = function _runSync(rule, options) { - if (options === void 0) { - options = {}; - } - var root = this._root(rule, options); - var transform = this.func(root); - if (transform && typeof transform.then === "function") { - throw new Error("Selector processor returned a promise to a synchronous call."); - } - var string = undefined; - if (options.updateSelector && typeof rule !== "string") { - string = root.toString(); - rule.selector = string; - } - return { - transform: transform, - root: root, - string: string - }; - } - - /** - * Process rule into a selector AST. - * - * @param rule {postcss.Rule | string} The css selector to be processed - * @param options The options for processing - * @returns {Promise} The AST of the selector after processing it. - */; - _proto.ast = function ast(rule, options) { - return this._run(rule, options).then(function (result) { - return result.root; - }); - } - - /** - * Process rule into a selector AST synchronously. - * - * @param rule {postcss.Rule | string} The css selector to be processed - * @param options The options for processing - * @returns {parser.Root} The AST of the selector after processing it. - */; - _proto.astSync = function astSync(rule, options) { - return this._runSync(rule, options).root; - } - - /** - * Process a selector into a transformed value asynchronously - * - * @param rule {postcss.Rule | string} The css selector to be processed - * @param options The options for processing - * @returns {Promise} The value returned by the processor. - */; - _proto.transform = function transform(rule, options) { - return this._run(rule, options).then(function (result) { - return result.transform; - }); - } - - /** - * Process a selector into a transformed value synchronously. - * - * @param rule {postcss.Rule | string} The css selector to be processed - * @param options The options for processing - * @returns {any} The value returned by the processor. - */; - _proto.transformSync = function transformSync(rule, options) { - return this._runSync(rule, options).transform; - } - - /** - * Process a selector into a new selector string asynchronously. - * - * @param rule {postcss.Rule | string} The css selector to be processed - * @param options The options for processing - * @returns {string} the selector after processing. - */; - _proto.process = function process(rule, options) { - return this._run(rule, options).then(function (result) { - return result.string || result.root.toString(); - }); - } - - /** - * Process a selector into a new selector string synchronously. - * - * @param rule {postcss.Rule | string} The css selector to be processed - * @param options The options for processing - * @returns {string} the selector after processing. - */; - _proto.processSync = function processSync(rule, options) { - var result = this._runSync(rule, options); - return result.string || result.root.toString(); - }; - return Processor; -}(); -exports["default"] = Processor; -module.exports = exports.default; \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/selectors/attribute.js b/node_modules/postcss-selector-parser/dist/selectors/attribute.js deleted file mode 100644 index 0351a22..0000000 --- a/node_modules/postcss-selector-parser/dist/selectors/attribute.js +++ /dev/null @@ -1,448 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports["default"] = void 0; -exports.unescapeValue = unescapeValue; -var _cssesc = _interopRequireDefault(require("cssesc")); -var _unesc = _interopRequireDefault(require("../util/unesc")); -var _namespace = _interopRequireDefault(require("./namespace")); -var _types = require("./types"); -var _CSSESC_QUOTE_OPTIONS; -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } -function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } -var deprecate = require("util-deprecate"); -var WRAPPED_IN_QUOTES = /^('|")([^]*)\1$/; -var warnOfDeprecatedValueAssignment = deprecate(function () {}, "Assigning an attribute a value containing characters that might need to be escaped is deprecated. " + "Call attribute.setValue() instead."); -var warnOfDeprecatedQuotedAssignment = deprecate(function () {}, "Assigning attr.quoted is deprecated and has no effect. Assign to attr.quoteMark instead."); -var warnOfDeprecatedConstructor = deprecate(function () {}, "Constructing an Attribute selector with a value without specifying quoteMark is deprecated. Note: The value should be unescaped now."); -function unescapeValue(value) { - var deprecatedUsage = false; - var quoteMark = null; - var unescaped = value; - var m = unescaped.match(WRAPPED_IN_QUOTES); - if (m) { - quoteMark = m[1]; - unescaped = m[2]; - } - unescaped = (0, _unesc["default"])(unescaped); - if (unescaped !== value) { - deprecatedUsage = true; - } - return { - deprecatedUsage: deprecatedUsage, - unescaped: unescaped, - quoteMark: quoteMark - }; -} -function handleDeprecatedContructorOpts(opts) { - if (opts.quoteMark !== undefined) { - return opts; - } - if (opts.value === undefined) { - return opts; - } - warnOfDeprecatedConstructor(); - var _unescapeValue = unescapeValue(opts.value), - quoteMark = _unescapeValue.quoteMark, - unescaped = _unescapeValue.unescaped; - if (!opts.raws) { - opts.raws = {}; - } - if (opts.raws.value === undefined) { - opts.raws.value = opts.value; - } - opts.value = unescaped; - opts.quoteMark = quoteMark; - return opts; -} -var Attribute = /*#__PURE__*/function (_Namespace) { - _inheritsLoose(Attribute, _Namespace); - function Attribute(opts) { - var _this; - if (opts === void 0) { - opts = {}; - } - _this = _Namespace.call(this, handleDeprecatedContructorOpts(opts)) || this; - _this.type = _types.ATTRIBUTE; - _this.raws = _this.raws || {}; - Object.defineProperty(_this.raws, 'unquoted', { - get: deprecate(function () { - return _this.value; - }, "attr.raws.unquoted is deprecated. Call attr.value instead."), - set: deprecate(function () { - return _this.value; - }, "Setting attr.raws.unquoted is deprecated and has no effect. attr.value is unescaped by default now.") - }); - _this._constructed = true; - return _this; - } - - /** - * Returns the Attribute's value quoted such that it would be legal to use - * in the value of a css file. The original value's quotation setting - * used for stringification is left unchanged. See `setValue(value, options)` - * if you want to control the quote settings of a new value for the attribute. - * - * You can also change the quotation used for the current value by setting quoteMark. - * - * Options: - * * quoteMark {'"' | "'" | null} - Use this value to quote the value. If this - * option is not set, the original value for quoteMark will be used. If - * indeterminate, a double quote is used. The legal values are: - * * `null` - the value will be unquoted and characters will be escaped as necessary. - * * `'` - the value will be quoted with a single quote and single quotes are escaped. - * * `"` - the value will be quoted with a double quote and double quotes are escaped. - * * preferCurrentQuoteMark {boolean} - if true, prefer the source quote mark - * over the quoteMark option value. - * * smart {boolean} - if true, will select a quote mark based on the value - * and the other options specified here. See the `smartQuoteMark()` - * method. - **/ - var _proto = Attribute.prototype; - _proto.getQuotedValue = function getQuotedValue(options) { - if (options === void 0) { - options = {}; - } - var quoteMark = this._determineQuoteMark(options); - var cssescopts = CSSESC_QUOTE_OPTIONS[quoteMark]; - var escaped = (0, _cssesc["default"])(this._value, cssescopts); - return escaped; - }; - _proto._determineQuoteMark = function _determineQuoteMark(options) { - return options.smart ? this.smartQuoteMark(options) : this.preferredQuoteMark(options); - } - - /** - * Set the unescaped value with the specified quotation options. The value - * provided must not include any wrapping quote marks -- those quotes will - * be interpreted as part of the value and escaped accordingly. - */; - _proto.setValue = function setValue(value, options) { - if (options === void 0) { - options = {}; - } - this._value = value; - this._quoteMark = this._determineQuoteMark(options); - this._syncRawValue(); - } - - /** - * Intelligently select a quoteMark value based on the value's contents. If - * the value is a legal CSS ident, it will not be quoted. Otherwise a quote - * mark will be picked that minimizes the number of escapes. - * - * If there's no clear winner, the quote mark from these options is used, - * then the source quote mark (this is inverted if `preferCurrentQuoteMark` is - * true). If the quoteMark is unspecified, a double quote is used. - * - * @param options This takes the quoteMark and preferCurrentQuoteMark options - * from the quoteValue method. - */; - _proto.smartQuoteMark = function smartQuoteMark(options) { - var v = this.value; - var numSingleQuotes = v.replace(/[^']/g, '').length; - var numDoubleQuotes = v.replace(/[^"]/g, '').length; - if (numSingleQuotes + numDoubleQuotes === 0) { - var escaped = (0, _cssesc["default"])(v, { - isIdentifier: true - }); - if (escaped === v) { - return Attribute.NO_QUOTE; - } else { - var pref = this.preferredQuoteMark(options); - if (pref === Attribute.NO_QUOTE) { - // pick a quote mark that isn't none and see if it's smaller - var quote = this.quoteMark || options.quoteMark || Attribute.DOUBLE_QUOTE; - var opts = CSSESC_QUOTE_OPTIONS[quote]; - var quoteValue = (0, _cssesc["default"])(v, opts); - if (quoteValue.length < escaped.length) { - return quote; - } - } - return pref; - } - } else if (numDoubleQuotes === numSingleQuotes) { - return this.preferredQuoteMark(options); - } else if (numDoubleQuotes < numSingleQuotes) { - return Attribute.DOUBLE_QUOTE; - } else { - return Attribute.SINGLE_QUOTE; - } - } - - /** - * Selects the preferred quote mark based on the options and the current quote mark value. - * If you want the quote mark to depend on the attribute value, call `smartQuoteMark(opts)` - * instead. - */; - _proto.preferredQuoteMark = function preferredQuoteMark(options) { - var quoteMark = options.preferCurrentQuoteMark ? this.quoteMark : options.quoteMark; - if (quoteMark === undefined) { - quoteMark = options.preferCurrentQuoteMark ? options.quoteMark : this.quoteMark; - } - if (quoteMark === undefined) { - quoteMark = Attribute.DOUBLE_QUOTE; - } - return quoteMark; - }; - _proto._syncRawValue = function _syncRawValue() { - var rawValue = (0, _cssesc["default"])(this._value, CSSESC_QUOTE_OPTIONS[this.quoteMark]); - if (rawValue === this._value) { - if (this.raws) { - delete this.raws.value; - } - } else { - this.raws.value = rawValue; - } - }; - _proto._handleEscapes = function _handleEscapes(prop, value) { - if (this._constructed) { - var escaped = (0, _cssesc["default"])(value, { - isIdentifier: true - }); - if (escaped !== value) { - this.raws[prop] = escaped; - } else { - delete this.raws[prop]; - } - } - }; - _proto._spacesFor = function _spacesFor(name) { - var attrSpaces = { - before: '', - after: '' - }; - var spaces = this.spaces[name] || {}; - var rawSpaces = this.raws.spaces && this.raws.spaces[name] || {}; - return Object.assign(attrSpaces, spaces, rawSpaces); - }; - _proto._stringFor = function _stringFor(name, spaceName, concat) { - if (spaceName === void 0) { - spaceName = name; - } - if (concat === void 0) { - concat = defaultAttrConcat; - } - var attrSpaces = this._spacesFor(spaceName); - return concat(this.stringifyProperty(name), attrSpaces); - } - - /** - * returns the offset of the attribute part specified relative to the - * start of the node of the output string. - * - * * "ns" - alias for "namespace" - * * "namespace" - the namespace if it exists. - * * "attribute" - the attribute name - * * "attributeNS" - the start of the attribute or its namespace - * * "operator" - the match operator of the attribute - * * "value" - The value (string or identifier) - * * "insensitive" - the case insensitivity flag; - * @param part One of the possible values inside an attribute. - * @returns -1 if the name is invalid or the value doesn't exist in this attribute. - */; - _proto.offsetOf = function offsetOf(name) { - var count = 1; - var attributeSpaces = this._spacesFor("attribute"); - count += attributeSpaces.before.length; - if (name === "namespace" || name === "ns") { - return this.namespace ? count : -1; - } - if (name === "attributeNS") { - return count; - } - count += this.namespaceString.length; - if (this.namespace) { - count += 1; - } - if (name === "attribute") { - return count; - } - count += this.stringifyProperty("attribute").length; - count += attributeSpaces.after.length; - var operatorSpaces = this._spacesFor("operator"); - count += operatorSpaces.before.length; - var operator = this.stringifyProperty("operator"); - if (name === "operator") { - return operator ? count : -1; - } - count += operator.length; - count += operatorSpaces.after.length; - var valueSpaces = this._spacesFor("value"); - count += valueSpaces.before.length; - var value = this.stringifyProperty("value"); - if (name === "value") { - return value ? count : -1; - } - count += value.length; - count += valueSpaces.after.length; - var insensitiveSpaces = this._spacesFor("insensitive"); - count += insensitiveSpaces.before.length; - if (name === "insensitive") { - return this.insensitive ? count : -1; - } - return -1; - }; - _proto.toString = function toString() { - var _this2 = this; - var selector = [this.rawSpaceBefore, '[']; - selector.push(this._stringFor('qualifiedAttribute', 'attribute')); - if (this.operator && (this.value || this.value === '')) { - selector.push(this._stringFor('operator')); - selector.push(this._stringFor('value')); - selector.push(this._stringFor('insensitiveFlag', 'insensitive', function (attrValue, attrSpaces) { - if (attrValue.length > 0 && !_this2.quoted && attrSpaces.before.length === 0 && !(_this2.spaces.value && _this2.spaces.value.after)) { - attrSpaces.before = " "; - } - return defaultAttrConcat(attrValue, attrSpaces); - })); - } - selector.push(']'); - selector.push(this.rawSpaceAfter); - return selector.join(''); - }; - _createClass(Attribute, [{ - key: "quoted", - get: function get() { - var qm = this.quoteMark; - return qm === "'" || qm === '"'; - }, - set: function set(value) { - warnOfDeprecatedQuotedAssignment(); - } - - /** - * returns a single (`'`) or double (`"`) quote character if the value is quoted. - * returns `null` if the value is not quoted. - * returns `undefined` if the quotation state is unknown (this can happen when - * the attribute is constructed without specifying a quote mark.) - */ - }, { - key: "quoteMark", - get: function get() { - return this._quoteMark; - } - - /** - * Set the quote mark to be used by this attribute's value. - * If the quote mark changes, the raw (escaped) value at `attr.raws.value` of the attribute - * value is updated accordingly. - * - * @param {"'" | '"' | null} quoteMark The quote mark or `null` if the value should be unquoted. - */, - set: function set(quoteMark) { - if (!this._constructed) { - this._quoteMark = quoteMark; - return; - } - if (this._quoteMark !== quoteMark) { - this._quoteMark = quoteMark; - this._syncRawValue(); - } - } - }, { - key: "qualifiedAttribute", - get: function get() { - return this.qualifiedName(this.raws.attribute || this.attribute); - } - }, { - key: "insensitiveFlag", - get: function get() { - return this.insensitive ? 'i' : ''; - } - }, { - key: "value", - get: function get() { - return this._value; - }, - set: - /** - * Before 3.0, the value had to be set to an escaped value including any wrapped - * quote marks. In 3.0, the semantics of `Attribute.value` changed so that the value - * is unescaped during parsing and any quote marks are removed. - * - * Because the ambiguity of this semantic change, if you set `attr.value = newValue`, - * a deprecation warning is raised when the new value contains any characters that would - * require escaping (including if it contains wrapped quotes). - * - * Instead, you should call `attr.setValue(newValue, opts)` and pass options that describe - * how the new value is quoted. - */ - function set(v) { - if (this._constructed) { - var _unescapeValue2 = unescapeValue(v), - deprecatedUsage = _unescapeValue2.deprecatedUsage, - unescaped = _unescapeValue2.unescaped, - quoteMark = _unescapeValue2.quoteMark; - if (deprecatedUsage) { - warnOfDeprecatedValueAssignment(); - } - if (unescaped === this._value && quoteMark === this._quoteMark) { - return; - } - this._value = unescaped; - this._quoteMark = quoteMark; - this._syncRawValue(); - } else { - this._value = v; - } - } - }, { - key: "insensitive", - get: function get() { - return this._insensitive; - } - - /** - * Set the case insensitive flag. - * If the case insensitive flag changes, the raw (escaped) value at `attr.raws.insensitiveFlag` - * of the attribute is updated accordingly. - * - * @param {true | false} insensitive true if the attribute should match case-insensitively. - */, - set: function set(insensitive) { - if (!insensitive) { - this._insensitive = false; - - // "i" and "I" can be used in "this.raws.insensitiveFlag" to store the original notation. - // When setting `attr.insensitive = false` both should be erased to ensure correct serialization. - if (this.raws && (this.raws.insensitiveFlag === 'I' || this.raws.insensitiveFlag === 'i')) { - this.raws.insensitiveFlag = undefined; - } - } - this._insensitive = insensitive; - } - }, { - key: "attribute", - get: function get() { - return this._attribute; - }, - set: function set(name) { - this._handleEscapes("attribute", name); - this._attribute = name; - } - }]); - return Attribute; -}(_namespace["default"]); -exports["default"] = Attribute; -Attribute.NO_QUOTE = null; -Attribute.SINGLE_QUOTE = "'"; -Attribute.DOUBLE_QUOTE = '"'; -var CSSESC_QUOTE_OPTIONS = (_CSSESC_QUOTE_OPTIONS = { - "'": { - quotes: 'single', - wrap: true - }, - '"': { - quotes: 'double', - wrap: true - } -}, _CSSESC_QUOTE_OPTIONS[null] = { - isIdentifier: true -}, _CSSESC_QUOTE_OPTIONS); -function defaultAttrConcat(attrValue, attrSpaces) { - return "" + attrSpaces.before + attrValue + attrSpaces.after; -} \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/selectors/className.js b/node_modules/postcss-selector-parser/dist/selectors/className.js deleted file mode 100644 index af32597..0000000 --- a/node_modules/postcss-selector-parser/dist/selectors/className.js +++ /dev/null @@ -1,50 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports["default"] = void 0; -var _cssesc = _interopRequireDefault(require("cssesc")); -var _util = require("../util"); -var _node = _interopRequireDefault(require("./node")); -var _types = require("./types"); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } -function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } -var ClassName = /*#__PURE__*/function (_Node) { - _inheritsLoose(ClassName, _Node); - function ClassName(opts) { - var _this; - _this = _Node.call(this, opts) || this; - _this.type = _types.CLASS; - _this._constructed = true; - return _this; - } - var _proto = ClassName.prototype; - _proto.valueToString = function valueToString() { - return '.' + _Node.prototype.valueToString.call(this); - }; - _createClass(ClassName, [{ - key: "value", - get: function get() { - return this._value; - }, - set: function set(v) { - if (this._constructed) { - var escaped = (0, _cssesc["default"])(v, { - isIdentifier: true - }); - if (escaped !== v) { - (0, _util.ensureObject)(this, "raws"); - this.raws.value = escaped; - } else if (this.raws) { - delete this.raws.value; - } - } - this._value = v; - } - }]); - return ClassName; -}(_node["default"]); -exports["default"] = ClassName; -module.exports = exports.default; \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/selectors/combinator.js b/node_modules/postcss-selector-parser/dist/selectors/combinator.js deleted file mode 100644 index c6449f4..0000000 --- a/node_modules/postcss-selector-parser/dist/selectors/combinator.js +++ /dev/null @@ -1,21 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports["default"] = void 0; -var _node = _interopRequireDefault(require("./node")); -var _types = require("./types"); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } -function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } -var Combinator = /*#__PURE__*/function (_Node) { - _inheritsLoose(Combinator, _Node); - function Combinator(opts) { - var _this; - _this = _Node.call(this, opts) || this; - _this.type = _types.COMBINATOR; - return _this; - } - return Combinator; -}(_node["default"]); -exports["default"] = Combinator; -module.exports = exports.default; \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/selectors/comment.js b/node_modules/postcss-selector-parser/dist/selectors/comment.js deleted file mode 100644 index 1709d5b..0000000 --- a/node_modules/postcss-selector-parser/dist/selectors/comment.js +++ /dev/null @@ -1,21 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports["default"] = void 0; -var _node = _interopRequireDefault(require("./node")); -var _types = require("./types"); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } -function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } -var Comment = /*#__PURE__*/function (_Node) { - _inheritsLoose(Comment, _Node); - function Comment(opts) { - var _this; - _this = _Node.call(this, opts) || this; - _this.type = _types.COMMENT; - return _this; - } - return Comment; -}(_node["default"]); -exports["default"] = Comment; -module.exports = exports.default; \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/selectors/constructors.js b/node_modules/postcss-selector-parser/dist/selectors/constructors.js deleted file mode 100644 index 6882593..0000000 --- a/node_modules/postcss-selector-parser/dist/selectors/constructors.js +++ /dev/null @@ -1,65 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports.universal = exports.tag = exports.string = exports.selector = exports.root = exports.pseudo = exports.nesting = exports.id = exports.comment = exports.combinator = exports.className = exports.attribute = void 0; -var _attribute = _interopRequireDefault(require("./attribute")); -var _className = _interopRequireDefault(require("./className")); -var _combinator = _interopRequireDefault(require("./combinator")); -var _comment = _interopRequireDefault(require("./comment")); -var _id = _interopRequireDefault(require("./id")); -var _nesting = _interopRequireDefault(require("./nesting")); -var _pseudo = _interopRequireDefault(require("./pseudo")); -var _root = _interopRequireDefault(require("./root")); -var _selector = _interopRequireDefault(require("./selector")); -var _string = _interopRequireDefault(require("./string")); -var _tag = _interopRequireDefault(require("./tag")); -var _universal = _interopRequireDefault(require("./universal")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } -var attribute = function attribute(opts) { - return new _attribute["default"](opts); -}; -exports.attribute = attribute; -var className = function className(opts) { - return new _className["default"](opts); -}; -exports.className = className; -var combinator = function combinator(opts) { - return new _combinator["default"](opts); -}; -exports.combinator = combinator; -var comment = function comment(opts) { - return new _comment["default"](opts); -}; -exports.comment = comment; -var id = function id(opts) { - return new _id["default"](opts); -}; -exports.id = id; -var nesting = function nesting(opts) { - return new _nesting["default"](opts); -}; -exports.nesting = nesting; -var pseudo = function pseudo(opts) { - return new _pseudo["default"](opts); -}; -exports.pseudo = pseudo; -var root = function root(opts) { - return new _root["default"](opts); -}; -exports.root = root; -var selector = function selector(opts) { - return new _selector["default"](opts); -}; -exports.selector = selector; -var string = function string(opts) { - return new _string["default"](opts); -}; -exports.string = string; -var tag = function tag(opts) { - return new _tag["default"](opts); -}; -exports.tag = tag; -var universal = function universal(opts) { - return new _universal["default"](opts); -}; -exports.universal = universal; \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/selectors/container.js b/node_modules/postcss-selector-parser/dist/selectors/container.js deleted file mode 100644 index 8600c54..0000000 --- a/node_modules/postcss-selector-parser/dist/selectors/container.js +++ /dev/null @@ -1,308 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports["default"] = void 0; -var _node = _interopRequireDefault(require("./node")); -var types = _interopRequireWildcard(require("./types")); -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } -function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } -function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } -var Container = /*#__PURE__*/function (_Node) { - _inheritsLoose(Container, _Node); - function Container(opts) { - var _this; - _this = _Node.call(this, opts) || this; - if (!_this.nodes) { - _this.nodes = []; - } - return _this; - } - var _proto = Container.prototype; - _proto.append = function append(selector) { - selector.parent = this; - this.nodes.push(selector); - return this; - }; - _proto.prepend = function prepend(selector) { - selector.parent = this; - this.nodes.unshift(selector); - return this; - }; - _proto.at = function at(index) { - return this.nodes[index]; - }; - _proto.index = function index(child) { - if (typeof child === 'number') { - return child; - } - return this.nodes.indexOf(child); - }; - _proto.removeChild = function removeChild(child) { - child = this.index(child); - this.at(child).parent = undefined; - this.nodes.splice(child, 1); - var index; - for (var id in this.indexes) { - index = this.indexes[id]; - if (index >= child) { - this.indexes[id] = index - 1; - } - } - return this; - }; - _proto.removeAll = function removeAll() { - for (var _iterator = _createForOfIteratorHelperLoose(this.nodes), _step; !(_step = _iterator()).done;) { - var node = _step.value; - node.parent = undefined; - } - this.nodes = []; - return this; - }; - _proto.empty = function empty() { - return this.removeAll(); - }; - _proto.insertAfter = function insertAfter(oldNode, newNode) { - newNode.parent = this; - var oldIndex = this.index(oldNode); - this.nodes.splice(oldIndex + 1, 0, newNode); - newNode.parent = this; - var index; - for (var id in this.indexes) { - index = this.indexes[id]; - if (oldIndex <= index) { - this.indexes[id] = index + 1; - } - } - return this; - }; - _proto.insertBefore = function insertBefore(oldNode, newNode) { - newNode.parent = this; - var oldIndex = this.index(oldNode); - this.nodes.splice(oldIndex, 0, newNode); - newNode.parent = this; - var index; - for (var id in this.indexes) { - index = this.indexes[id]; - if (index <= oldIndex) { - this.indexes[id] = index + 1; - } - } - return this; - }; - _proto._findChildAtPosition = function _findChildAtPosition(line, col) { - var found = undefined; - this.each(function (node) { - if (node.atPosition) { - var foundChild = node.atPosition(line, col); - if (foundChild) { - found = foundChild; - return false; - } - } else if (node.isAtPosition(line, col)) { - found = node; - return false; - } - }); - return found; - } - - /** - * Return the most specific node at the line and column number given. - * The source location is based on the original parsed location, locations aren't - * updated as selector nodes are mutated. - * - * Note that this location is relative to the location of the first character - * of the selector, and not the location of the selector in the overall document - * when used in conjunction with postcss. - * - * If not found, returns undefined. - * @param {number} line The line number of the node to find. (1-based index) - * @param {number} col The column number of the node to find. (1-based index) - */; - _proto.atPosition = function atPosition(line, col) { - if (this.isAtPosition(line, col)) { - return this._findChildAtPosition(line, col) || this; - } else { - return undefined; - } - }; - _proto._inferEndPosition = function _inferEndPosition() { - if (this.last && this.last.source && this.last.source.end) { - this.source = this.source || {}; - this.source.end = this.source.end || {}; - Object.assign(this.source.end, this.last.source.end); - } - }; - _proto.each = function each(callback) { - if (!this.lastEach) { - this.lastEach = 0; - } - if (!this.indexes) { - this.indexes = {}; - } - this.lastEach++; - var id = this.lastEach; - this.indexes[id] = 0; - if (!this.length) { - return undefined; - } - var index, result; - while (this.indexes[id] < this.length) { - index = this.indexes[id]; - result = callback(this.at(index), index); - if (result === false) { - break; - } - this.indexes[id] += 1; - } - delete this.indexes[id]; - if (result === false) { - return false; - } - }; - _proto.walk = function walk(callback) { - return this.each(function (node, i) { - var result = callback(node, i); - if (result !== false && node.length) { - result = node.walk(callback); - } - if (result === false) { - return false; - } - }); - }; - _proto.walkAttributes = function walkAttributes(callback) { - var _this2 = this; - return this.walk(function (selector) { - if (selector.type === types.ATTRIBUTE) { - return callback.call(_this2, selector); - } - }); - }; - _proto.walkClasses = function walkClasses(callback) { - var _this3 = this; - return this.walk(function (selector) { - if (selector.type === types.CLASS) { - return callback.call(_this3, selector); - } - }); - }; - _proto.walkCombinators = function walkCombinators(callback) { - var _this4 = this; - return this.walk(function (selector) { - if (selector.type === types.COMBINATOR) { - return callback.call(_this4, selector); - } - }); - }; - _proto.walkComments = function walkComments(callback) { - var _this5 = this; - return this.walk(function (selector) { - if (selector.type === types.COMMENT) { - return callback.call(_this5, selector); - } - }); - }; - _proto.walkIds = function walkIds(callback) { - var _this6 = this; - return this.walk(function (selector) { - if (selector.type === types.ID) { - return callback.call(_this6, selector); - } - }); - }; - _proto.walkNesting = function walkNesting(callback) { - var _this7 = this; - return this.walk(function (selector) { - if (selector.type === types.NESTING) { - return callback.call(_this7, selector); - } - }); - }; - _proto.walkPseudos = function walkPseudos(callback) { - var _this8 = this; - return this.walk(function (selector) { - if (selector.type === types.PSEUDO) { - return callback.call(_this8, selector); - } - }); - }; - _proto.walkTags = function walkTags(callback) { - var _this9 = this; - return this.walk(function (selector) { - if (selector.type === types.TAG) { - return callback.call(_this9, selector); - } - }); - }; - _proto.walkUniversals = function walkUniversals(callback) { - var _this10 = this; - return this.walk(function (selector) { - if (selector.type === types.UNIVERSAL) { - return callback.call(_this10, selector); - } - }); - }; - _proto.split = function split(callback) { - var _this11 = this; - var current = []; - return this.reduce(function (memo, node, index) { - var split = callback.call(_this11, node); - current.push(node); - if (split) { - memo.push(current); - current = []; - } else if (index === _this11.length - 1) { - memo.push(current); - } - return memo; - }, []); - }; - _proto.map = function map(callback) { - return this.nodes.map(callback); - }; - _proto.reduce = function reduce(callback, memo) { - return this.nodes.reduce(callback, memo); - }; - _proto.every = function every(callback) { - return this.nodes.every(callback); - }; - _proto.some = function some(callback) { - return this.nodes.some(callback); - }; - _proto.filter = function filter(callback) { - return this.nodes.filter(callback); - }; - _proto.sort = function sort(callback) { - return this.nodes.sort(callback); - }; - _proto.toString = function toString() { - return this.map(String).join(''); - }; - _createClass(Container, [{ - key: "first", - get: function get() { - return this.at(0); - } - }, { - key: "last", - get: function get() { - return this.at(this.length - 1); - } - }, { - key: "length", - get: function get() { - return this.nodes.length; - } - }]); - return Container; -}(_node["default"]); -exports["default"] = Container; -module.exports = exports.default; \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/selectors/guards.js b/node_modules/postcss-selector-parser/dist/selectors/guards.js deleted file mode 100644 index f06161e..0000000 --- a/node_modules/postcss-selector-parser/dist/selectors/guards.js +++ /dev/null @@ -1,58 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports.isComment = exports.isCombinator = exports.isClassName = exports.isAttribute = void 0; -exports.isContainer = isContainer; -exports.isIdentifier = void 0; -exports.isNamespace = isNamespace; -exports.isNesting = void 0; -exports.isNode = isNode; -exports.isPseudo = void 0; -exports.isPseudoClass = isPseudoClass; -exports.isPseudoElement = isPseudoElement; -exports.isUniversal = exports.isTag = exports.isString = exports.isSelector = exports.isRoot = void 0; -var _types = require("./types"); -var _IS_TYPE; -var IS_TYPE = (_IS_TYPE = {}, _IS_TYPE[_types.ATTRIBUTE] = true, _IS_TYPE[_types.CLASS] = true, _IS_TYPE[_types.COMBINATOR] = true, _IS_TYPE[_types.COMMENT] = true, _IS_TYPE[_types.ID] = true, _IS_TYPE[_types.NESTING] = true, _IS_TYPE[_types.PSEUDO] = true, _IS_TYPE[_types.ROOT] = true, _IS_TYPE[_types.SELECTOR] = true, _IS_TYPE[_types.STRING] = true, _IS_TYPE[_types.TAG] = true, _IS_TYPE[_types.UNIVERSAL] = true, _IS_TYPE); -function isNode(node) { - return typeof node === "object" && IS_TYPE[node.type]; -} -function isNodeType(type, node) { - return isNode(node) && node.type === type; -} -var isAttribute = isNodeType.bind(null, _types.ATTRIBUTE); -exports.isAttribute = isAttribute; -var isClassName = isNodeType.bind(null, _types.CLASS); -exports.isClassName = isClassName; -var isCombinator = isNodeType.bind(null, _types.COMBINATOR); -exports.isCombinator = isCombinator; -var isComment = isNodeType.bind(null, _types.COMMENT); -exports.isComment = isComment; -var isIdentifier = isNodeType.bind(null, _types.ID); -exports.isIdentifier = isIdentifier; -var isNesting = isNodeType.bind(null, _types.NESTING); -exports.isNesting = isNesting; -var isPseudo = isNodeType.bind(null, _types.PSEUDO); -exports.isPseudo = isPseudo; -var isRoot = isNodeType.bind(null, _types.ROOT); -exports.isRoot = isRoot; -var isSelector = isNodeType.bind(null, _types.SELECTOR); -exports.isSelector = isSelector; -var isString = isNodeType.bind(null, _types.STRING); -exports.isString = isString; -var isTag = isNodeType.bind(null, _types.TAG); -exports.isTag = isTag; -var isUniversal = isNodeType.bind(null, _types.UNIVERSAL); -exports.isUniversal = isUniversal; -function isPseudoElement(node) { - return isPseudo(node) && node.value && (node.value.startsWith("::") || node.value.toLowerCase() === ":before" || node.value.toLowerCase() === ":after" || node.value.toLowerCase() === ":first-letter" || node.value.toLowerCase() === ":first-line"); -} -function isPseudoClass(node) { - return isPseudo(node) && !isPseudoElement(node); -} -function isContainer(node) { - return !!(isNode(node) && node.walk); -} -function isNamespace(node) { - return isAttribute(node) || isTag(node); -} \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/selectors/id.js b/node_modules/postcss-selector-parser/dist/selectors/id.js deleted file mode 100644 index 8baef72..0000000 --- a/node_modules/postcss-selector-parser/dist/selectors/id.js +++ /dev/null @@ -1,25 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports["default"] = void 0; -var _node = _interopRequireDefault(require("./node")); -var _types = require("./types"); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } -function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } -var ID = /*#__PURE__*/function (_Node) { - _inheritsLoose(ID, _Node); - function ID(opts) { - var _this; - _this = _Node.call(this, opts) || this; - _this.type = _types.ID; - return _this; - } - var _proto = ID.prototype; - _proto.valueToString = function valueToString() { - return '#' + _Node.prototype.valueToString.call(this); - }; - return ID; -}(_node["default"]); -exports["default"] = ID; -module.exports = exports.default; \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/selectors/index.js b/node_modules/postcss-selector-parser/dist/selectors/index.js deleted file mode 100644 index f1f6b7f..0000000 --- a/node_modules/postcss-selector-parser/dist/selectors/index.js +++ /dev/null @@ -1,21 +0,0 @@ -"use strict"; - -exports.__esModule = true; -var _types = require("./types"); -Object.keys(_types).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (key in exports && exports[key] === _types[key]) return; - exports[key] = _types[key]; -}); -var _constructors = require("./constructors"); -Object.keys(_constructors).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (key in exports && exports[key] === _constructors[key]) return; - exports[key] = _constructors[key]; -}); -var _guards = require("./guards"); -Object.keys(_guards).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (key in exports && exports[key] === _guards[key]) return; - exports[key] = _guards[key]; -}); \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/selectors/namespace.js b/node_modules/postcss-selector-parser/dist/selectors/namespace.js deleted file mode 100644 index cc97647..0000000 --- a/node_modules/postcss-selector-parser/dist/selectors/namespace.js +++ /dev/null @@ -1,80 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports["default"] = void 0; -var _cssesc = _interopRequireDefault(require("cssesc")); -var _util = require("../util"); -var _node = _interopRequireDefault(require("./node")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } -function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } -var Namespace = /*#__PURE__*/function (_Node) { - _inheritsLoose(Namespace, _Node); - function Namespace() { - return _Node.apply(this, arguments) || this; - } - var _proto = Namespace.prototype; - _proto.qualifiedName = function qualifiedName(value) { - if (this.namespace) { - return this.namespaceString + "|" + value; - } else { - return value; - } - }; - _proto.valueToString = function valueToString() { - return this.qualifiedName(_Node.prototype.valueToString.call(this)); - }; - _createClass(Namespace, [{ - key: "namespace", - get: function get() { - return this._namespace; - }, - set: function set(namespace) { - if (namespace === true || namespace === "*" || namespace === "&") { - this._namespace = namespace; - if (this.raws) { - delete this.raws.namespace; - } - return; - } - var escaped = (0, _cssesc["default"])(namespace, { - isIdentifier: true - }); - this._namespace = namespace; - if (escaped !== namespace) { - (0, _util.ensureObject)(this, "raws"); - this.raws.namespace = escaped; - } else if (this.raws) { - delete this.raws.namespace; - } - } - }, { - key: "ns", - get: function get() { - return this._namespace; - }, - set: function set(namespace) { - this.namespace = namespace; - } - }, { - key: "namespaceString", - get: function get() { - if (this.namespace) { - var ns = this.stringifyProperty("namespace"); - if (ns === true) { - return ''; - } else { - return ns; - } - } else { - return ''; - } - } - }]); - return Namespace; -}(_node["default"]); -exports["default"] = Namespace; -; -module.exports = exports.default; \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/selectors/nesting.js b/node_modules/postcss-selector-parser/dist/selectors/nesting.js deleted file mode 100644 index 2189928..0000000 --- a/node_modules/postcss-selector-parser/dist/selectors/nesting.js +++ /dev/null @@ -1,22 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports["default"] = void 0; -var _node = _interopRequireDefault(require("./node")); -var _types = require("./types"); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } -function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } -var Nesting = /*#__PURE__*/function (_Node) { - _inheritsLoose(Nesting, _Node); - function Nesting(opts) { - var _this; - _this = _Node.call(this, opts) || this; - _this.type = _types.NESTING; - _this.value = '&'; - return _this; - } - return Nesting; -}(_node["default"]); -exports["default"] = Nesting; -module.exports = exports.default; \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/selectors/node.js b/node_modules/postcss-selector-parser/dist/selectors/node.js deleted file mode 100644 index 9a82951..0000000 --- a/node_modules/postcss-selector-parser/dist/selectors/node.js +++ /dev/null @@ -1,192 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports["default"] = void 0; -var _util = require("../util"); -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } -var cloneNode = function cloneNode(obj, parent) { - if (typeof obj !== 'object' || obj === null) { - return obj; - } - var cloned = new obj.constructor(); - for (var i in obj) { - if (!obj.hasOwnProperty(i)) { - continue; - } - var value = obj[i]; - var type = typeof value; - if (i === 'parent' && type === 'object') { - if (parent) { - cloned[i] = parent; - } - } else if (value instanceof Array) { - cloned[i] = value.map(function (j) { - return cloneNode(j, cloned); - }); - } else { - cloned[i] = cloneNode(value, cloned); - } - } - return cloned; -}; -var Node = /*#__PURE__*/function () { - function Node(opts) { - if (opts === void 0) { - opts = {}; - } - Object.assign(this, opts); - this.spaces = this.spaces || {}; - this.spaces.before = this.spaces.before || ''; - this.spaces.after = this.spaces.after || ''; - } - var _proto = Node.prototype; - _proto.remove = function remove() { - if (this.parent) { - this.parent.removeChild(this); - } - this.parent = undefined; - return this; - }; - _proto.replaceWith = function replaceWith() { - if (this.parent) { - for (var index in arguments) { - this.parent.insertBefore(this, arguments[index]); - } - this.remove(); - } - return this; - }; - _proto.next = function next() { - return this.parent.at(this.parent.index(this) + 1); - }; - _proto.prev = function prev() { - return this.parent.at(this.parent.index(this) - 1); - }; - _proto.clone = function clone(overrides) { - if (overrides === void 0) { - overrides = {}; - } - var cloned = cloneNode(this); - for (var name in overrides) { - cloned[name] = overrides[name]; - } - return cloned; - } - - /** - * Some non-standard syntax doesn't follow normal escaping rules for css. - * This allows non standard syntax to be appended to an existing property - * by specifying the escaped value. By specifying the escaped value, - * illegal characters are allowed to be directly inserted into css output. - * @param {string} name the property to set - * @param {any} value the unescaped value of the property - * @param {string} valueEscaped optional. the escaped value of the property. - */; - _proto.appendToPropertyAndEscape = function appendToPropertyAndEscape(name, value, valueEscaped) { - if (!this.raws) { - this.raws = {}; - } - var originalValue = this[name]; - var originalEscaped = this.raws[name]; - this[name] = originalValue + value; // this may trigger a setter that updates raws, so it has to be set first. - if (originalEscaped || valueEscaped !== value) { - this.raws[name] = (originalEscaped || originalValue) + valueEscaped; - } else { - delete this.raws[name]; // delete any escaped value that was created by the setter. - } - } - - /** - * Some non-standard syntax doesn't follow normal escaping rules for css. - * This allows the escaped value to be specified directly, allowing illegal - * characters to be directly inserted into css output. - * @param {string} name the property to set - * @param {any} value the unescaped value of the property - * @param {string} valueEscaped the escaped value of the property. - */; - _proto.setPropertyAndEscape = function setPropertyAndEscape(name, value, valueEscaped) { - if (!this.raws) { - this.raws = {}; - } - this[name] = value; // this may trigger a setter that updates raws, so it has to be set first. - this.raws[name] = valueEscaped; - } - - /** - * When you want a value to passed through to CSS directly. This method - * deletes the corresponding raw value causing the stringifier to fallback - * to the unescaped value. - * @param {string} name the property to set. - * @param {any} value The value that is both escaped and unescaped. - */; - _proto.setPropertyWithoutEscape = function setPropertyWithoutEscape(name, value) { - this[name] = value; // this may trigger a setter that updates raws, so it has to be set first. - if (this.raws) { - delete this.raws[name]; - } - } - - /** - * - * @param {number} line The number (starting with 1) - * @param {number} column The column number (starting with 1) - */; - _proto.isAtPosition = function isAtPosition(line, column) { - if (this.source && this.source.start && this.source.end) { - if (this.source.start.line > line) { - return false; - } - if (this.source.end.line < line) { - return false; - } - if (this.source.start.line === line && this.source.start.column > column) { - return false; - } - if (this.source.end.line === line && this.source.end.column < column) { - return false; - } - return true; - } - return undefined; - }; - _proto.stringifyProperty = function stringifyProperty(name) { - return this.raws && this.raws[name] || this[name]; - }; - _proto.valueToString = function valueToString() { - return String(this.stringifyProperty("value")); - }; - _proto.toString = function toString() { - return [this.rawSpaceBefore, this.valueToString(), this.rawSpaceAfter].join(''); - }; - _createClass(Node, [{ - key: "rawSpaceBefore", - get: function get() { - var rawSpace = this.raws && this.raws.spaces && this.raws.spaces.before; - if (rawSpace === undefined) { - rawSpace = this.spaces && this.spaces.before; - } - return rawSpace || ""; - }, - set: function set(raw) { - (0, _util.ensureObject)(this, "raws", "spaces"); - this.raws.spaces.before = raw; - } - }, { - key: "rawSpaceAfter", - get: function get() { - var rawSpace = this.raws && this.raws.spaces && this.raws.spaces.after; - if (rawSpace === undefined) { - rawSpace = this.spaces.after; - } - return rawSpace || ""; - }, - set: function set(raw) { - (0, _util.ensureObject)(this, "raws", "spaces"); - this.raws.spaces.after = raw; - } - }]); - return Node; -}(); -exports["default"] = Node; -module.exports = exports.default; \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/selectors/pseudo.js b/node_modules/postcss-selector-parser/dist/selectors/pseudo.js deleted file mode 100644 index 4371e59..0000000 --- a/node_modules/postcss-selector-parser/dist/selectors/pseudo.js +++ /dev/null @@ -1,26 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports["default"] = void 0; -var _container = _interopRequireDefault(require("./container")); -var _types = require("./types"); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } -function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } -var Pseudo = /*#__PURE__*/function (_Container) { - _inheritsLoose(Pseudo, _Container); - function Pseudo(opts) { - var _this; - _this = _Container.call(this, opts) || this; - _this.type = _types.PSEUDO; - return _this; - } - var _proto = Pseudo.prototype; - _proto.toString = function toString() { - var params = this.length ? '(' + this.map(String).join(',') + ')' : ''; - return [this.rawSpaceBefore, this.stringifyProperty("value"), params, this.rawSpaceAfter].join(''); - }; - return Pseudo; -}(_container["default"]); -exports["default"] = Pseudo; -module.exports = exports.default; \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/selectors/root.js b/node_modules/postcss-selector-parser/dist/selectors/root.js deleted file mode 100644 index 8c599d1..0000000 --- a/node_modules/postcss-selector-parser/dist/selectors/root.js +++ /dev/null @@ -1,44 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports["default"] = void 0; -var _container = _interopRequireDefault(require("./container")); -var _types = require("./types"); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } -function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } -var Root = /*#__PURE__*/function (_Container) { - _inheritsLoose(Root, _Container); - function Root(opts) { - var _this; - _this = _Container.call(this, opts) || this; - _this.type = _types.ROOT; - return _this; - } - var _proto = Root.prototype; - _proto.toString = function toString() { - var str = this.reduce(function (memo, selector) { - memo.push(String(selector)); - return memo; - }, []).join(','); - return this.trailingComma ? str + ',' : str; - }; - _proto.error = function error(message, options) { - if (this._error) { - return this._error(message, options); - } else { - return new Error(message); - } - }; - _createClass(Root, [{ - key: "errorGenerator", - set: function set(handler) { - this._error = handler; - } - }]); - return Root; -}(_container["default"]); -exports["default"] = Root; -module.exports = exports.default; \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/selectors/selector.js b/node_modules/postcss-selector-parser/dist/selectors/selector.js deleted file mode 100644 index 8cc4bc1..0000000 --- a/node_modules/postcss-selector-parser/dist/selectors/selector.js +++ /dev/null @@ -1,21 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports["default"] = void 0; -var _container = _interopRequireDefault(require("./container")); -var _types = require("./types"); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } -function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } -var Selector = /*#__PURE__*/function (_Container) { - _inheritsLoose(Selector, _Container); - function Selector(opts) { - var _this; - _this = _Container.call(this, opts) || this; - _this.type = _types.SELECTOR; - return _this; - } - return Selector; -}(_container["default"]); -exports["default"] = Selector; -module.exports = exports.default; \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/selectors/string.js b/node_modules/postcss-selector-parser/dist/selectors/string.js deleted file mode 100644 index 4749791..0000000 --- a/node_modules/postcss-selector-parser/dist/selectors/string.js +++ /dev/null @@ -1,21 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports["default"] = void 0; -var _node = _interopRequireDefault(require("./node")); -var _types = require("./types"); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } -function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } -var String = /*#__PURE__*/function (_Node) { - _inheritsLoose(String, _Node); - function String(opts) { - var _this; - _this = _Node.call(this, opts) || this; - _this.type = _types.STRING; - return _this; - } - return String; -}(_node["default"]); -exports["default"] = String; -module.exports = exports.default; \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/selectors/tag.js b/node_modules/postcss-selector-parser/dist/selectors/tag.js deleted file mode 100644 index 224e74d..0000000 --- a/node_modules/postcss-selector-parser/dist/selectors/tag.js +++ /dev/null @@ -1,21 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports["default"] = void 0; -var _namespace = _interopRequireDefault(require("./namespace")); -var _types = require("./types"); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } -function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } -var Tag = /*#__PURE__*/function (_Namespace) { - _inheritsLoose(Tag, _Namespace); - function Tag(opts) { - var _this; - _this = _Namespace.call(this, opts) || this; - _this.type = _types.TAG; - return _this; - } - return Tag; -}(_namespace["default"]); -exports["default"] = Tag; -module.exports = exports.default; \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/selectors/types.js b/node_modules/postcss-selector-parser/dist/selectors/types.js deleted file mode 100644 index 824cc0c..0000000 --- a/node_modules/postcss-selector-parser/dist/selectors/types.js +++ /dev/null @@ -1,28 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports.UNIVERSAL = exports.TAG = exports.STRING = exports.SELECTOR = exports.ROOT = exports.PSEUDO = exports.NESTING = exports.ID = exports.COMMENT = exports.COMBINATOR = exports.CLASS = exports.ATTRIBUTE = void 0; -var TAG = 'tag'; -exports.TAG = TAG; -var STRING = 'string'; -exports.STRING = STRING; -var SELECTOR = 'selector'; -exports.SELECTOR = SELECTOR; -var ROOT = 'root'; -exports.ROOT = ROOT; -var PSEUDO = 'pseudo'; -exports.PSEUDO = PSEUDO; -var NESTING = 'nesting'; -exports.NESTING = NESTING; -var ID = 'id'; -exports.ID = ID; -var COMMENT = 'comment'; -exports.COMMENT = COMMENT; -var COMBINATOR = 'combinator'; -exports.COMBINATOR = COMBINATOR; -var CLASS = 'class'; -exports.CLASS = CLASS; -var ATTRIBUTE = 'attribute'; -exports.ATTRIBUTE = ATTRIBUTE; -var UNIVERSAL = 'universal'; -exports.UNIVERSAL = UNIVERSAL; \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/selectors/universal.js b/node_modules/postcss-selector-parser/dist/selectors/universal.js deleted file mode 100644 index 5b58743..0000000 --- a/node_modules/postcss-selector-parser/dist/selectors/universal.js +++ /dev/null @@ -1,22 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports["default"] = void 0; -var _namespace = _interopRequireDefault(require("./namespace")); -var _types = require("./types"); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } -function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } -var Universal = /*#__PURE__*/function (_Namespace) { - _inheritsLoose(Universal, _Namespace); - function Universal(opts) { - var _this; - _this = _Namespace.call(this, opts) || this; - _this.type = _types.UNIVERSAL; - _this.value = '*'; - return _this; - } - return Universal; -}(_namespace["default"]); -exports["default"] = Universal; -module.exports = exports.default; \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/sortAscending.js b/node_modules/postcss-selector-parser/dist/sortAscending.js deleted file mode 100644 index 5666d5d..0000000 --- a/node_modules/postcss-selector-parser/dist/sortAscending.js +++ /dev/null @@ -1,11 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports["default"] = sortAscending; -function sortAscending(list) { - return list.sort(function (a, b) { - return a - b; - }); -} -; -module.exports = exports.default; \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/tokenTypes.js b/node_modules/postcss-selector-parser/dist/tokenTypes.js deleted file mode 100644 index 59d8e6c..0000000 --- a/node_modules/postcss-selector-parser/dist/tokenTypes.js +++ /dev/null @@ -1,70 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports.word = exports.tilde = exports.tab = exports.str = exports.space = exports.slash = exports.singleQuote = exports.semicolon = exports.plus = exports.pipe = exports.openSquare = exports.openParenthesis = exports.newline = exports.greaterThan = exports.feed = exports.equals = exports.doubleQuote = exports.dollar = exports.cr = exports.comment = exports.comma = exports.combinator = exports.colon = exports.closeSquare = exports.closeParenthesis = exports.caret = exports.bang = exports.backslash = exports.at = exports.asterisk = exports.ampersand = void 0; -var ampersand = 38; // `&`.charCodeAt(0); -exports.ampersand = ampersand; -var asterisk = 42; // `*`.charCodeAt(0); -exports.asterisk = asterisk; -var at = 64; // `@`.charCodeAt(0); -exports.at = at; -var comma = 44; // `,`.charCodeAt(0); -exports.comma = comma; -var colon = 58; // `:`.charCodeAt(0); -exports.colon = colon; -var semicolon = 59; // `;`.charCodeAt(0); -exports.semicolon = semicolon; -var openParenthesis = 40; // `(`.charCodeAt(0); -exports.openParenthesis = openParenthesis; -var closeParenthesis = 41; // `)`.charCodeAt(0); -exports.closeParenthesis = closeParenthesis; -var openSquare = 91; // `[`.charCodeAt(0); -exports.openSquare = openSquare; -var closeSquare = 93; // `]`.charCodeAt(0); -exports.closeSquare = closeSquare; -var dollar = 36; // `$`.charCodeAt(0); -exports.dollar = dollar; -var tilde = 126; // `~`.charCodeAt(0); -exports.tilde = tilde; -var caret = 94; // `^`.charCodeAt(0); -exports.caret = caret; -var plus = 43; // `+`.charCodeAt(0); -exports.plus = plus; -var equals = 61; // `=`.charCodeAt(0); -exports.equals = equals; -var pipe = 124; // `|`.charCodeAt(0); -exports.pipe = pipe; -var greaterThan = 62; // `>`.charCodeAt(0); -exports.greaterThan = greaterThan; -var space = 32; // ` `.charCodeAt(0); -exports.space = space; -var singleQuote = 39; // `'`.charCodeAt(0); -exports.singleQuote = singleQuote; -var doubleQuote = 34; // `"`.charCodeAt(0); -exports.doubleQuote = doubleQuote; -var slash = 47; // `/`.charCodeAt(0); -exports.slash = slash; -var bang = 33; // `!`.charCodeAt(0); -exports.bang = bang; -var backslash = 92; // '\\'.charCodeAt(0); -exports.backslash = backslash; -var cr = 13; // '\r'.charCodeAt(0); -exports.cr = cr; -var feed = 12; // '\f'.charCodeAt(0); -exports.feed = feed; -var newline = 10; // '\n'.charCodeAt(0); -exports.newline = newline; -var tab = 9; // '\t'.charCodeAt(0); - -// Expose aliases primarily for readability. -exports.tab = tab; -var str = singleQuote; - -// No good single character representation! -exports.str = str; -var comment = -1; -exports.comment = comment; -var word = -2; -exports.word = word; -var combinator = -3; -exports.combinator = combinator; \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/tokenize.js b/node_modules/postcss-selector-parser/dist/tokenize.js deleted file mode 100644 index bf61d26..0000000 --- a/node_modules/postcss-selector-parser/dist/tokenize.js +++ /dev/null @@ -1,239 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports.FIELDS = void 0; -exports["default"] = tokenize; -var t = _interopRequireWildcard(require("./tokenTypes")); -var _unescapable, _wordDelimiters; -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } -var unescapable = (_unescapable = {}, _unescapable[t.tab] = true, _unescapable[t.newline] = true, _unescapable[t.cr] = true, _unescapable[t.feed] = true, _unescapable); -var wordDelimiters = (_wordDelimiters = {}, _wordDelimiters[t.space] = true, _wordDelimiters[t.tab] = true, _wordDelimiters[t.newline] = true, _wordDelimiters[t.cr] = true, _wordDelimiters[t.feed] = true, _wordDelimiters[t.ampersand] = true, _wordDelimiters[t.asterisk] = true, _wordDelimiters[t.bang] = true, _wordDelimiters[t.comma] = true, _wordDelimiters[t.colon] = true, _wordDelimiters[t.semicolon] = true, _wordDelimiters[t.openParenthesis] = true, _wordDelimiters[t.closeParenthesis] = true, _wordDelimiters[t.openSquare] = true, _wordDelimiters[t.closeSquare] = true, _wordDelimiters[t.singleQuote] = true, _wordDelimiters[t.doubleQuote] = true, _wordDelimiters[t.plus] = true, _wordDelimiters[t.pipe] = true, _wordDelimiters[t.tilde] = true, _wordDelimiters[t.greaterThan] = true, _wordDelimiters[t.equals] = true, _wordDelimiters[t.dollar] = true, _wordDelimiters[t.caret] = true, _wordDelimiters[t.slash] = true, _wordDelimiters); -var hex = {}; -var hexChars = "0123456789abcdefABCDEF"; -for (var i = 0; i < hexChars.length; i++) { - hex[hexChars.charCodeAt(i)] = true; -} - -/** - * Returns the last index of the bar css word - * @param {string} css The string in which the word begins - * @param {number} start The index into the string where word's first letter occurs - */ -function consumeWord(css, start) { - var next = start; - var code; - do { - code = css.charCodeAt(next); - if (wordDelimiters[code]) { - return next - 1; - } else if (code === t.backslash) { - next = consumeEscape(css, next) + 1; - } else { - // All other characters are part of the word - next++; - } - } while (next < css.length); - return next - 1; -} - -/** - * Returns the last index of the escape sequence - * @param {string} css The string in which the sequence begins - * @param {number} start The index into the string where escape character (`\`) occurs. - */ -function consumeEscape(css, start) { - var next = start; - var code = css.charCodeAt(next + 1); - if (unescapable[code]) { - // just consume the escape char - } else if (hex[code]) { - var hexDigits = 0; - // consume up to 6 hex chars - do { - next++; - hexDigits++; - code = css.charCodeAt(next + 1); - } while (hex[code] && hexDigits < 6); - // if fewer than 6 hex chars, a trailing space ends the escape - if (hexDigits < 6 && code === t.space) { - next++; - } - } else { - // the next char is part of the current word - next++; - } - return next; -} -var FIELDS = { - TYPE: 0, - START_LINE: 1, - START_COL: 2, - END_LINE: 3, - END_COL: 4, - START_POS: 5, - END_POS: 6 -}; -exports.FIELDS = FIELDS; -function tokenize(input) { - var tokens = []; - var css = input.css.valueOf(); - var _css = css, - length = _css.length; - var offset = -1; - var line = 1; - var start = 0; - var end = 0; - var code, content, endColumn, endLine, escaped, escapePos, last, lines, next, nextLine, nextOffset, quote, tokenType; - function unclosed(what, fix) { - if (input.safe) { - // fyi: this is never set to true. - css += fix; - next = css.length - 1; - } else { - throw input.error('Unclosed ' + what, line, start - offset, start); - } - } - while (start < length) { - code = css.charCodeAt(start); - if (code === t.newline) { - offset = start; - line += 1; - } - switch (code) { - case t.space: - case t.tab: - case t.newline: - case t.cr: - case t.feed: - next = start; - do { - next += 1; - code = css.charCodeAt(next); - if (code === t.newline) { - offset = next; - line += 1; - } - } while (code === t.space || code === t.newline || code === t.tab || code === t.cr || code === t.feed); - tokenType = t.space; - endLine = line; - endColumn = next - offset - 1; - end = next; - break; - case t.plus: - case t.greaterThan: - case t.tilde: - case t.pipe: - next = start; - do { - next += 1; - code = css.charCodeAt(next); - } while (code === t.plus || code === t.greaterThan || code === t.tilde || code === t.pipe); - tokenType = t.combinator; - endLine = line; - endColumn = start - offset; - end = next; - break; - - // Consume these characters as single tokens. - case t.asterisk: - case t.ampersand: - case t.bang: - case t.comma: - case t.equals: - case t.dollar: - case t.caret: - case t.openSquare: - case t.closeSquare: - case t.colon: - case t.semicolon: - case t.openParenthesis: - case t.closeParenthesis: - next = start; - tokenType = code; - endLine = line; - endColumn = start - offset; - end = next + 1; - break; - case t.singleQuote: - case t.doubleQuote: - quote = code === t.singleQuote ? "'" : '"'; - next = start; - do { - escaped = false; - next = css.indexOf(quote, next + 1); - if (next === -1) { - unclosed('quote', quote); - } - escapePos = next; - while (css.charCodeAt(escapePos - 1) === t.backslash) { - escapePos -= 1; - escaped = !escaped; - } - } while (escaped); - tokenType = t.str; - endLine = line; - endColumn = start - offset; - end = next + 1; - break; - default: - if (code === t.slash && css.charCodeAt(start + 1) === t.asterisk) { - next = css.indexOf('*/', start + 2) + 1; - if (next === 0) { - unclosed('comment', '*/'); - } - content = css.slice(start, next + 1); - lines = content.split('\n'); - last = lines.length - 1; - if (last > 0) { - nextLine = line + last; - nextOffset = next - lines[last].length; - } else { - nextLine = line; - nextOffset = offset; - } - tokenType = t.comment; - line = nextLine; - endLine = nextLine; - endColumn = next - nextOffset; - } else if (code === t.slash) { - next = start; - tokenType = code; - endLine = line; - endColumn = start - offset; - end = next + 1; - } else { - next = consumeWord(css, start); - tokenType = t.word; - endLine = line; - endColumn = next - offset; - } - end = next + 1; - break; - } - - // Ensure that the token structure remains consistent - tokens.push([tokenType, - // [0] Token type - line, - // [1] Starting line - start - offset, - // [2] Starting column - endLine, - // [3] Ending line - endColumn, - // [4] Ending column - start, - // [5] Start position / Source index - end // [6] End position - ]); - - // Reset offset for the next token - if (nextOffset) { - offset = nextOffset; - nextOffset = null; - } - start = end; - } - return tokens; -} \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/util/ensureObject.js b/node_modules/postcss-selector-parser/dist/util/ensureObject.js deleted file mode 100644 index 494941a..0000000 --- a/node_modules/postcss-selector-parser/dist/util/ensureObject.js +++ /dev/null @@ -1,17 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports["default"] = ensureObject; -function ensureObject(obj) { - for (var _len = arguments.length, props = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - props[_key - 1] = arguments[_key]; - } - while (props.length > 0) { - var prop = props.shift(); - if (!obj[prop]) { - obj[prop] = {}; - } - obj = obj[prop]; - } -} -module.exports = exports.default; \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/util/getProp.js b/node_modules/postcss-selector-parser/dist/util/getProp.js deleted file mode 100644 index a2b7a07..0000000 --- a/node_modules/postcss-selector-parser/dist/util/getProp.js +++ /dev/null @@ -1,18 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports["default"] = getProp; -function getProp(obj) { - for (var _len = arguments.length, props = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - props[_key - 1] = arguments[_key]; - } - while (props.length > 0) { - var prop = props.shift(); - if (!obj[prop]) { - return undefined; - } - obj = obj[prop]; - } - return obj; -} -module.exports = exports.default; \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/util/index.js b/node_modules/postcss-selector-parser/dist/util/index.js deleted file mode 100644 index f96ec11..0000000 --- a/node_modules/postcss-selector-parser/dist/util/index.js +++ /dev/null @@ -1,13 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports.unesc = exports.stripComments = exports.getProp = exports.ensureObject = void 0; -var _unesc = _interopRequireDefault(require("./unesc")); -exports.unesc = _unesc["default"]; -var _getProp = _interopRequireDefault(require("./getProp")); -exports.getProp = _getProp["default"]; -var _ensureObject = _interopRequireDefault(require("./ensureObject")); -exports.ensureObject = _ensureObject["default"]; -var _stripComments = _interopRequireDefault(require("./stripComments")); -exports.stripComments = _stripComments["default"]; -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/util/stripComments.js b/node_modules/postcss-selector-parser/dist/util/stripComments.js deleted file mode 100644 index 0baa0e0..0000000 --- a/node_modules/postcss-selector-parser/dist/util/stripComments.js +++ /dev/null @@ -1,21 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports["default"] = stripComments; -function stripComments(str) { - var s = ""; - var commentStart = str.indexOf("/*"); - var lastEnd = 0; - while (commentStart >= 0) { - s = s + str.slice(lastEnd, commentStart); - var commentEnd = str.indexOf("*/", commentStart + 2); - if (commentEnd < 0) { - return s; - } - lastEnd = commentEnd + 2; - commentStart = str.indexOf("/*", lastEnd); - } - s = s + str.slice(lastEnd); - return s; -} -module.exports = exports.default; \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/dist/util/unesc.js b/node_modules/postcss-selector-parser/dist/util/unesc.js deleted file mode 100644 index 87396be..0000000 --- a/node_modules/postcss-selector-parser/dist/util/unesc.js +++ /dev/null @@ -1,76 +0,0 @@ -"use strict"; - -exports.__esModule = true; -exports["default"] = unesc; -// Many thanks for this post which made this migration much easier. -// https://mathiasbynens.be/notes/css-escapes - -/** - * - * @param {string} str - * @returns {[string, number]|undefined} - */ -function gobbleHex(str) { - var lower = str.toLowerCase(); - var hex = ''; - var spaceTerminated = false; - for (var i = 0; i < 6 && lower[i] !== undefined; i++) { - var code = lower.charCodeAt(i); - // check to see if we are dealing with a valid hex char [a-f|0-9] - var valid = code >= 97 && code <= 102 || code >= 48 && code <= 57; - // https://drafts.csswg.org/css-syntax/#consume-escaped-code-point - spaceTerminated = code === 32; - if (!valid) { - break; - } - hex += lower[i]; - } - if (hex.length === 0) { - return undefined; - } - var codePoint = parseInt(hex, 16); - var isSurrogate = codePoint >= 0xD800 && codePoint <= 0xDFFF; - // Add special case for - // "If this number is zero, or is for a surrogate, or is greater than the maximum allowed code point" - // https://drafts.csswg.org/css-syntax/#maximum-allowed-code-point - if (isSurrogate || codePoint === 0x0000 || codePoint > 0x10FFFF) { - return ["\uFFFD", hex.length + (spaceTerminated ? 1 : 0)]; - } - return [String.fromCodePoint(codePoint), hex.length + (spaceTerminated ? 1 : 0)]; -} -var CONTAINS_ESCAPE = /\\/; -function unesc(str) { - var needToProcess = CONTAINS_ESCAPE.test(str); - if (!needToProcess) { - return str; - } - var ret = ""; - for (var i = 0; i < str.length; i++) { - if (str[i] === "\\") { - var gobbled = gobbleHex(str.slice(i + 1, i + 7)); - if (gobbled !== undefined) { - ret += gobbled[0]; - i += gobbled[1]; - continue; - } - - // Retain a pair of \\ if double escaped `\\\\` - // https://github.com/postcss/postcss-selector-parser/commit/268c9a7656fb53f543dc620aa5b73a30ec3ff20e - if (str[i + 1] === "\\") { - ret += "\\"; - i++; - continue; - } - - // if \\ is at the end of the string retain it - // https://github.com/postcss/postcss-selector-parser/commit/01a6b346e3612ce1ab20219acc26abdc259ccefb - if (str.length === i + 1) { - ret += str[i]; - } - continue; - } - ret += str[i]; - } - return ret; -} -module.exports = exports.default; \ No newline at end of file diff --git a/node_modules/postcss-selector-parser/package.json b/node_modules/postcss-selector-parser/package.json deleted file mode 100644 index 0b074d0..0000000 --- a/node_modules/postcss-selector-parser/package.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "name": "postcss-selector-parser", - "version": "6.1.2", - "devDependencies": { - "@babel/cli": "^7.11.6", - "@babel/core": "^7.11.6", - "@babel/eslint-parser": "^7.11.5", - "@babel/eslint-plugin": "^7.11.5", - "@babel/plugin-proposal-class-properties": "^7.10.4", - "@babel/preset-env": "^7.11.5", - "@babel/register": "^7.11.5", - "ava": "^5.1.0", - "babel-plugin-add-module-exports": "^1.0.4", - "coveralls": "^3.1.0", - "del-cli": "^5.0.0", - "eslint": "^8.28.0", - "eslint-plugin-import": "^2.26.0", - "glob": "^8.0.3", - "minimist": "^1.2.5", - "nyc": "^15.1.0", - "postcss": "^8.4.31", - "semver": "^7.3.2", - "typescript": "^4.0.3" - }, - "main": "dist/index.js", - "types": "postcss-selector-parser.d.ts", - "files": [ - "API.md", - "CHANGELOG.md", - "LICENSE-MIT", - "dist", - "postcss-selector-parser.d.ts", - "!**/__tests__" - ], - "scripts": { - "typecheck": "tsc --noEmit --strict postcss-selector-parser.d.ts postcss-selector-parser.test.ts", - "pretest": "eslint src && npm run typecheck", - "prepare": "del-cli dist && BABEL_ENV=publish babel src --out-dir dist --ignore /__tests__/", - "lintfix": "eslint --fix src", - "report": "nyc report --reporter=html", - "test": "nyc ava src/__tests__/*.mjs", - "testone": "ava" - }, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "license": "MIT", - "engines": { - "node": ">=4" - }, - "homepage": "https://github.com/postcss/postcss-selector-parser", - "contributors": [ - { - "name": "Ben Briggs", - "email": "beneb.info@gmail.com", - "url": "http://beneb.info" - }, - { - "name": "Chris Eppstein", - "email": "chris@eppsteins.net", - "url": "http://twitter.com/chriseppstein" - } - ], - "repository": "postcss/postcss-selector-parser", - "ava": { - "require": [ - "@babel/register" - ], - "concurrency": 5, - "timeout": "25s", - "nodeArguments": [] - }, - "nyc": { - "exclude": [ - "node_modules", - "**/__tests__" - ] - } -} diff --git a/node_modules/postcss-selector-parser/postcss-selector-parser.d.ts b/node_modules/postcss-selector-parser/postcss-selector-parser.d.ts deleted file mode 100644 index af609e6..0000000 --- a/node_modules/postcss-selector-parser/postcss-selector-parser.d.ts +++ /dev/null @@ -1,555 +0,0 @@ -// Type definitions for postcss-selector-parser 2.2.3 -// Definitions by: Chris Eppstein - -/*~ Note that ES6 modules cannot directly export callable functions. - *~ This file should be imported using the CommonJS-style: - *~ import x = require('someLibrary'); - *~ - *~ Refer to the documentation to understand common - *~ workarounds for this limitation of ES6 modules. - */ - -/*~ This declaration specifies that the function - *~ is the exported object from the file - */ -export = parser; - -// A type that's T but not U. -type Diff = T extends U ? never : T; - -// TODO: Conditional types in TS 1.8 will really clean this up. -declare function parser(): parser.Processor; -declare function parser(processor: parser.AsyncProcessor): parser.Processor; -declare function parser(processor: parser.AsyncProcessor): parser.Processor; -declare function parser(processor: parser.SyncProcessor): parser.Processor; -declare function parser(processor: parser.SyncProcessor): parser.Processor; -declare function parser(processor?: parser.SyncProcessor | parser.AsyncProcessor): parser.Processor; - -/*~ If you want to expose types from your module as well, you can - *~ place them in this block. Often you will want to describe the - *~ shape of the return type of the function; that type should - *~ be declared in here, as this example shows. - */ -declare namespace parser { - /* copied from postcss -- so we don't need to add a dependency */ - type ErrorOptions = { - plugin?: string; - word?: string; - index?: number - }; - /* the bits we use of postcss.Rule, copied from postcss -- so we don't need to add a dependency */ - type PostCSSRuleNode = { - selector: string - /** - * @returns postcss.CssSyntaxError but it's a complex object, caller - * should cast to it if they have a dependency on postcss. - */ - error(message: string, options?: ErrorOptions): Error; - }; - /** Accepts a string */ - type Selectors = string | PostCSSRuleNode - type ProcessorFn = (root: parser.Root) => ReturnType; - type SyncProcessor = ProcessorFn; - type AsyncProcessor = ProcessorFn>; - - const TAG: "tag"; - const STRING: "string"; - const SELECTOR: "selector"; - const ROOT: "root"; - const PSEUDO: "pseudo"; - const NESTING: "nesting"; - const ID: "id"; - const COMMENT: "comment"; - const COMBINATOR: "combinator"; - const CLASS: "class"; - const ATTRIBUTE: "attribute"; - const UNIVERSAL: "universal"; - - interface NodeTypes { - tag: Tag, - string: String, - selector: Selector, - root: Root, - pseudo: Pseudo, - nesting: Nesting, - id: Identifier, - comment: Comment, - combinator: Combinator, - class: ClassName, - attribute: Attribute, - universal: Universal - } - - type Node = NodeTypes[keyof NodeTypes]; - - function isNode(node: any): node is Node; - - interface Options { - /** - * Preserve whitespace when true. Default: false; - */ - lossless: boolean; - /** - * When true and a postcss.Rule is passed, set the result of - * processing back onto the rule when done. Default: false. - */ - updateSelector: boolean; - } - class Processor< - TransformType = never, - SyncSelectorsType extends Selectors | never = Selectors - > { - res: Root; - readonly result: String; - ast(selectors: Selectors, options?: Partial): Promise; - astSync(selectors: SyncSelectorsType, options?: Partial): Root; - transform(selectors: Selectors, options?: Partial): Promise; - transformSync(selectors: SyncSelectorsType, options?: Partial): TransformType; - process(selectors: Selectors, options?: Partial): Promise; - processSync(selectors: SyncSelectorsType, options?: Partial): string; - } - interface ParserOptions { - css: string; - error: (message: string, options: ErrorOptions) => Error; - options: Options; - } - class Parser { - input: ParserOptions; - lossy: boolean; - position: number; - root: Root; - selectors: string; - current: Selector; - constructor(input: ParserOptions); - /** - * Raises an error, if the processor is invoked on - * a postcss Rule node, a better error message is raised. - */ - error(message: string, options?: ErrorOptions): void; - } - interface NodeSource { - start?: { - line: number, - column: number - }, - end?: { - line: number, - column: number - } - } - interface SpaceAround { - before: string; - after: string; - } - interface Spaces extends SpaceAround { - [spaceType: string]: string | Partial | undefined; - } - interface NodeOptions { - value: Value; - spaces?: Partial; - source?: NodeSource; - sourceIndex?: number; - } - interface Base< - Value extends string | undefined = string, - ParentType extends Container | undefined = Container | undefined - > { - type: keyof NodeTypes; - parent: ParentType; - value: Value; - spaces: Spaces; - source?: NodeSource; - sourceIndex: number; - rawSpaceBefore: string; - rawSpaceAfter: string; - remove(): Node; - replaceWith(...nodes: Node[]): Node; - next(): Node | undefined; - prev(): Node | undefined; - clone(opts?: {[override: string]:any}): this; - /** - * Return whether this node includes the character at the position of the given line and column. - * Returns undefined if the nodes lack sufficient source metadata to determine the position. - * @param line 1-index based line number relative to the start of the selector. - * @param column 1-index based column number relative to the start of the selector. - */ - isAtPosition(line: number, column: number): boolean | undefined; - /** - * Some non-standard syntax doesn't follow normal escaping rules for css, - * this allows the escaped value to be specified directly, allowing illegal characters to be - * directly inserted into css output. - * @param name the property to set - * @param value the unescaped value of the property - * @param valueEscaped optional. the escaped value of the property. - */ - setPropertyAndEscape(name: string, value: any, valueEscaped: string): void; - /** - * When you want a value to passed through to CSS directly. This method - * deletes the corresponding raw value causing the stringifier to fallback - * to the unescaped value. - * @param name the property to set. - * @param value The value that is both escaped and unescaped. - */ - setPropertyWithoutEscape(name: string, value: any): void; - /** - * Some non-standard syntax doesn't follow normal escaping rules for css. - * This allows non standard syntax to be appended to an existing property - * by specifying the escaped value. By specifying the escaped value, - * illegal characters are allowed to be directly inserted into css output. - * @param {string} name the property to set - * @param {any} value the unescaped value of the property - * @param {string} valueEscaped optional. the escaped value of the property. - */ - appendToPropertyAndEscape(name: string, value: any, valueEscaped: string): void; - toString(): string; - } - interface ContainerOptions extends NodeOptions { - nodes?: Array; - } - interface Container< - Value extends string | undefined = string, - Child extends Node = Node - > extends Base { - nodes: Array; - append(selector: Child): this; - prepend(selector: Child): this; - at(index: number): Child; - /** - * Return the most specific node at the line and column number given. - * The source location is based on the original parsed location, locations aren't - * updated as selector nodes are mutated. - * - * Note that this location is relative to the location of the first character - * of the selector, and not the location of the selector in the overall document - * when used in conjunction with postcss. - * - * If not found, returns undefined. - * @param line The line number of the node to find. (1-based index) - * @param col The column number of the node to find. (1-based index) - */ - atPosition(line: number, column: number): Child; - index(child: Child): number; - readonly first: Child; - readonly last: Child; - readonly length: number; - removeChild(child: Child): this; - removeAll(): this; - empty(): this; - insertAfter(oldNode: Child, newNode: Child): this; - insertBefore(oldNode: Child, newNode: Child): this; - each(callback: (node: Child, index: number) => boolean | void): boolean | undefined; - walk( - callback: (node: Node, index: number) => boolean | void - ): boolean | undefined; - walkAttributes( - callback: (node: Attribute) => boolean | void - ): boolean | undefined; - walkClasses( - callback: (node: ClassName) => boolean | void - ): boolean | undefined; - walkCombinators( - callback: (node: Combinator) => boolean | void - ): boolean | undefined; - walkComments( - callback: (node: Comment) => boolean | void - ): boolean | undefined; - walkIds( - callback: (node: Identifier) => boolean | void - ): boolean | undefined; - walkNesting( - callback: (node: Nesting) => boolean | void - ): boolean | undefined; - walkPseudos( - callback: (node: Pseudo) => boolean | void - ): boolean | undefined; - walkTags(callback: (node: Tag) => boolean | void): boolean | undefined; - split(callback: (node: Child) => boolean): [Child[], Child[]]; - map(callback: (node: Child) => T): T[]; - reduce( - callback: ( - previousValue: Child, - currentValue: Child, - currentIndex: number, - array: readonly Child[] - ) => Child - ): Child; - reduce( - callback: ( - previousValue: Child, - currentValue: Child, - currentIndex: number, - array: readonly Child[] - ) => Child, - initialValue: Child - ): Child; - reduce( - callback: ( - previousValue: T, - currentValue: Child, - currentIndex: number, - array: readonly Child[] - ) => T, - initialValue: T - ): T; - every(callback: (node: Child) => boolean): boolean; - some(callback: (node: Child) => boolean): boolean; - filter(callback: (node: Child) => boolean): Child[]; - sort(callback: (nodeA: Child, nodeB: Child) => number): Child[]; - toString(): string; - } - function isContainer(node: any): node is Root | Selector | Pseudo; - - interface NamespaceOptions extends NodeOptions { - namespace?: string | true; - } - interface Namespace extends Base { - /** alias for namespace */ - ns: string | true; - /** - * namespace prefix. - */ - namespace: string | true; - /** - * If a namespace exists, prefix the value provided with it, separated by |. - */ - qualifiedName(value: string): string; - /** - * A string representing the namespace suitable for output. - */ - readonly namespaceString: string; - } - function isNamespace(node: any): node is Attribute | Tag; - - interface Root extends Container { - type: "root"; - /** - * Raises an error, if the processor is invoked on - * a postcss Rule node, a better error message is raised. - */ - error(message: string, options?: ErrorOptions): Error; - nodeAt(line: number, column: number): Node - } - function root(opts: ContainerOptions): Root; - function isRoot(node: any): node is Root; - - interface _Selector extends Container> { - type: "selector"; - } - type Selector = _Selector; - function selector(opts: ContainerOptions): Selector; - function isSelector(node: any): node is Selector; - - interface CombinatorRaws { - value?: string; - spaces?: { - before?: string; - after?: string; - }; - } - interface Combinator extends Base { - type: "combinator"; - raws?: CombinatorRaws; - } - function combinator(opts: NodeOptions): Combinator; - function isCombinator(node: any): node is Combinator; - - interface ClassName extends Base { - type: "class"; - } - function className(opts: NamespaceOptions): ClassName; - function isClassName(node: any): node is ClassName; - - type AttributeOperator = "=" | "~=" | "|=" | "^=" | "$=" | "*="; - type QuoteMark = '"' | "'" | null; - interface PreferredQuoteMarkOptions { - quoteMark?: QuoteMark; - preferCurrentQuoteMark?: boolean; - } - interface SmartQuoteMarkOptions extends PreferredQuoteMarkOptions { - smart?: boolean; - } - interface AttributeOptions extends NamespaceOptions { - attribute: string; - operator?: AttributeOperator; - insensitive?: boolean; - quoteMark?: QuoteMark; - /** @deprecated Use quoteMark instead. */ - quoted?: boolean; - spaces?: { - before?: string; - after?: string; - attribute?: Partial; - operator?: Partial; - value?: Partial; - insensitive?: Partial; - } - raws: { - unquoted?: string; - attribute?: string; - operator?: string; - value?: string; - insensitive?: string; - spaces?: { - attribute?: Partial; - operator?: Partial; - value?: Partial; - insensitive?: Partial; - } - }; - } - interface Attribute extends Namespace { - type: "attribute"; - attribute: string; - operator?: AttributeOperator; - insensitive?: boolean; - quoteMark: QuoteMark; - quoted?: boolean; - spaces: { - before: string; - after: string; - attribute?: Partial; - operator?: Partial; - value?: Partial; - insensitive?: Partial; - } - raws: { - /** @deprecated The attribute value is unquoted, use that instead.. */ - unquoted?: string; - attribute?: string; - operator?: string; - /** The value of the attribute with quotes and escapes. */ - value?: string; - insensitive?: string; - spaces?: { - attribute?: Partial; - operator?: Partial; - value?: Partial; - insensitive?: Partial; - } - }; - /** - * The attribute name after having been qualified with a namespace. - */ - readonly qualifiedAttribute: string; - - /** - * The case insensitivity flag or an empty string depending on whether this - * attribute is case insensitive. - */ - readonly insensitiveFlag : 'i' | ''; - - /** - * Returns the attribute's value quoted such that it would be legal to use - * in the value of a css file. The original value's quotation setting - * used for stringification is left unchanged. See `setValue(value, options)` - * if you want to control the quote settings of a new value for the attribute or - * `set quoteMark(mark)` if you want to change the quote settings of the current - * value. - * - * You can also change the quotation used for the current value by setting quoteMark. - **/ - getQuotedValue(options?: SmartQuoteMarkOptions): string; - - /** - * Set the unescaped value with the specified quotation options. The value - * provided must not include any wrapping quote marks -- those quotes will - * be interpreted as part of the value and escaped accordingly. - * @param value - */ - setValue(value: string, options?: SmartQuoteMarkOptions): void; - - /** - * Intelligently select a quoteMark value based on the value's contents. If - * the value is a legal CSS ident, it will not be quoted. Otherwise a quote - * mark will be picked that minimizes the number of escapes. - * - * If there's no clear winner, the quote mark from these options is used, - * then the source quote mark (this is inverted if `preferCurrentQuoteMark` is - * true). If the quoteMark is unspecified, a double quote is used. - **/ - smartQuoteMark(options: PreferredQuoteMarkOptions): QuoteMark; - - /** - * Selects the preferred quote mark based on the options and the current quote mark value. - * If you want the quote mark to depend on the attribute value, call `smartQuoteMark(opts)` - * instead. - */ - preferredQuoteMark(options: PreferredQuoteMarkOptions): QuoteMark - - /** - * returns the offset of the attribute part specified relative to the - * start of the node of the output string. - * - * * "ns" - alias for "namespace" - * * "namespace" - the namespace if it exists. - * * "attribute" - the attribute name - * * "attributeNS" - the start of the attribute or its namespace - * * "operator" - the match operator of the attribute - * * "value" - The value (string or identifier) - * * "insensitive" - the case insensitivity flag; - * @param part One of the possible values inside an attribute. - * @returns -1 if the name is invalid or the value doesn't exist in this attribute. - */ - offsetOf(part: "ns" | "namespace" | "attribute" | "attributeNS" | "operator" | "value" | "insensitive"): number; - } - function attribute(opts: AttributeOptions): Attribute; - function isAttribute(node: any): node is Attribute; - - interface Pseudo extends Container { - type: "pseudo"; - } - function pseudo(opts: ContainerOptions): Pseudo; - /** - * Checks whether the node is the Pseudo subtype of node. - */ - function isPseudo(node: any): node is Pseudo; - - /** - * Checks whether the node is, specifically, a pseudo element instead of - * pseudo class. - */ - function isPseudoElement(node: any): node is Pseudo; - - /** - * Checks whether the node is, specifically, a pseudo class instead of - * pseudo element. - */ - function isPseudoClass(node: any): node is Pseudo; - - - interface Tag extends Namespace { - type: "tag"; - } - function tag(opts: NamespaceOptions): Tag; - function isTag(node: any): node is Tag; - - interface Comment extends Base { - type: "comment"; - } - function comment(opts: NodeOptions): Comment; - function isComment(node: any): node is Comment; - - interface Identifier extends Base { - type: "id"; - } - function id(opts: any): Identifier; - function isIdentifier(node: any): node is Identifier; - - interface Nesting extends Base { - type: "nesting"; - } - function nesting(opts?: any): Nesting; - function isNesting(node: any): node is Nesting; - - interface String extends Base { - type: "string"; - } - function string(opts: NodeOptions): String; - function isString(node: any): node is String; - - interface Universal extends Base { - type: "universal"; - } - function universal(opts?: NamespaceOptions): Universal; - function isUniversal(node: any): node is Universal; -} diff --git a/node_modules/postcss-value-parser/LICENSE b/node_modules/postcss-value-parser/LICENSE deleted file mode 100644 index 6dcaefc..0000000 --- a/node_modules/postcss-value-parser/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) Bogdan Chadkin - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/postcss-value-parser/README.md b/node_modules/postcss-value-parser/README.md deleted file mode 100644 index 3bd6a0d..0000000 --- a/node_modules/postcss-value-parser/README.md +++ /dev/null @@ -1,263 +0,0 @@ -# postcss-value-parser - -[![Travis CI](https://travis-ci.org/TrySound/postcss-value-parser.svg)](https://travis-ci.org/TrySound/postcss-value-parser) - -Transforms CSS declaration values and at-rule parameters into a tree of nodes, and provides a simple traversal API. - -## Usage - -```js -var valueParser = require('postcss-value-parser'); -var cssBackgroundValue = 'url(foo.png) no-repeat 40px 73%'; -var parsedValue = valueParser(cssBackgroundValue); -// parsedValue exposes an API described below, -// e.g. parsedValue.walk(..), parsedValue.toString(), etc. -``` - -For example, parsing the value `rgba(233, 45, 66, .5)` will return the following: - -```js -{ - nodes: [ - { - type: 'function', - value: 'rgba', - before: '', - after: '', - nodes: [ - { type: 'word', value: '233' }, - { type: 'div', value: ',', before: '', after: ' ' }, - { type: 'word', value: '45' }, - { type: 'div', value: ',', before: '', after: ' ' }, - { type: 'word', value: '66' }, - { type: 'div', value: ',', before: ' ', after: '' }, - { type: 'word', value: '.5' } - ] - } - ] -} -``` - -If you wanted to convert each `rgba()` value in `sourceCSS` to a hex value, you could do so like this: - -```js -var valueParser = require('postcss-value-parser'); - -var parsed = valueParser(sourceCSS); - -// walk() will visit all the of the nodes in the tree, -// invoking the callback for each. -parsed.walk(function (node) { - - // Since we only want to transform rgba() values, - // we can ignore anything else. - if (node.type !== 'function' && node.value !== 'rgba') return; - - // We can make an array of the rgba() arguments to feed to a - // convertToHex() function - var color = node.nodes.filter(function (node) { - return node.type === 'word'; - }).map(function (node) { - return Number(node.value); - }); // [233, 45, 66, .5] - - // Now we will transform the existing rgba() function node - // into a word node with the hex value - node.type = 'word'; - node.value = convertToHex(color); -}) - -parsed.toString(); // #E92D42 -``` - -## Nodes - -Each node is an object with these common properties: - -- **type**: The type of node (`word`, `string`, `div`, `space`, `comment`, or `function`). - Each type is documented below. -- **value**: Each node has a `value` property; but what exactly `value` means - is specific to the node type. Details are documented for each type below. -- **sourceIndex**: The starting index of the node within the original source - string. For example, given the source string `10px 20px`, the `word` node - whose value is `20px` will have a `sourceIndex` of `5`. - -### word - -The catch-all node type that includes keywords (e.g. `no-repeat`), -quantities (e.g. `20px`, `75%`, `1.5`), and hex colors (e.g. `#e6e6e6`). - -Node-specific properties: - -- **value**: The "word" itself. - -### string - -A quoted string value, e.g. `"something"` in `content: "something";`. - -Node-specific properties: - -- **value**: The text content of the string. -- **quote**: The quotation mark surrounding the string, either `"` or `'`. -- **unclosed**: `true` if the string was not closed properly. e.g. `"unclosed string `. - -### div - -A divider, for example - -- `,` in `animation-duration: 1s, 2s, 3s` -- `/` in `border-radius: 10px / 23px` -- `:` in `(min-width: 700px)` - -Node-specific properties: - -- **value**: The divider character. Either `,`, `/`, or `:` (see examples above). -- **before**: Whitespace before the divider. -- **after**: Whitespace after the divider. - -### space - -Whitespace used as a separator, e.g. ` ` occurring twice in `border: 1px solid black;`. - -Node-specific properties: - -- **value**: The whitespace itself. - -### comment - -A CSS comment starts with `/*` and ends with `*/` - -Node-specific properties: - -- **value**: The comment value without `/*` and `*/` -- **unclosed**: `true` if the comment was not closed properly. e.g. `/* comment without an end `. - -### function - -A CSS function, e.g. `rgb(0,0,0)` or `url(foo.bar)`. - -Function nodes have nodes nested within them: the function arguments. - -Additional properties: - -- **value**: The name of the function, e.g. `rgb` in `rgb(0,0,0)`. -- **before**: Whitespace after the opening parenthesis and before the first argument, - e.g. ` ` in `rgb( 0,0,0)`. -- **after**: Whitespace before the closing parenthesis and after the last argument, - e.g. ` ` in `rgb(0,0,0 )`. -- **nodes**: More nodes representing the arguments to the function. -- **unclosed**: `true` if the parentheses was not closed properly. e.g. `( unclosed-function `. - -Media features surrounded by parentheses are considered functions with an -empty value. For example, `(min-width: 700px)` parses to these nodes: - -```js -[ - { - type: 'function', value: '', before: '', after: '', - nodes: [ - { type: 'word', value: 'min-width' }, - { type: 'div', value: ':', before: '', after: ' ' }, - { type: 'word', value: '700px' } - ] - } -] -``` - -`url()` functions can be parsed a little bit differently depending on -whether the first character in the argument is a quotation mark. - -`url( /gfx/img/bg.jpg )` parses to: - -```js -{ type: 'function', sourceIndex: 0, value: 'url', before: ' ', after: ' ', nodes: [ - { type: 'word', sourceIndex: 5, value: '/gfx/img/bg.jpg' } -] } -``` - -`url( "/gfx/img/bg.jpg" )`, on the other hand, parses to: - -```js -{ type: 'function', sourceIndex: 0, value: 'url', before: ' ', after: ' ', nodes: [ - type: 'string', sourceIndex: 5, quote: '"', value: '/gfx/img/bg.jpg' }, -] } -``` - -### unicode-range - -The unicode-range CSS descriptor sets the specific range of characters to be -used from a font defined by @font-face and made available -for use on the current page (`unicode-range: U+0025-00FF`). - -Node-specific properties: - -- **value**: The "unicode-range" itself. - -## API - -``` -var valueParser = require('postcss-value-parser'); -``` - -### valueParser.unit(quantity) - -Parses `quantity`, distinguishing the number from the unit. Returns an object like the following: - -```js -// Given 2rem -{ - number: '2', - unit: 'rem' -} -``` - -If the `quantity` argument cannot be parsed as a number, returns `false`. - -*This function does not parse complete values*: you cannot pass it `1px solid black` and expect `px` as -the unit. Instead, you should pass it single quantities only. Parse `1px solid black`, then pass it -the stringified `1px` node (a `word` node) to parse the number and unit. - -### valueParser.stringify(nodes[, custom]) - -Stringifies a node or array of nodes. - -The `custom` function is called for each `node`; return a string to override the default behaviour. - -### valueParser.walk(nodes, callback[, bubble]) - -Walks each provided node, recursively walking all descendent nodes within functions. - -Returning `false` in the `callback` will prevent traversal of descendent nodes (within functions). -You can use this feature to for shallow iteration, walking over only the *immediate* children. -*Note: This only applies if `bubble` is `false` (which is the default).* - -By default, the tree is walked from the outermost node inwards. -To reverse the direction, pass `true` for the `bubble` argument. - -The `callback` is invoked with three arguments: `callback(node, index, nodes)`. - -- `node`: The current node. -- `index`: The index of the current node. -- `nodes`: The complete nodes array passed to `walk()`. - -Returns the `valueParser` instance. - -### var parsed = valueParser(value) - -Returns the parsed node tree. - -### parsed.nodes - -The array of nodes. - -### parsed.toString() - -Stringifies the node tree. - -### parsed.walk(callback[, bubble]) - -Walks each node inside `parsed.nodes`. See the documentation for `valueParser.walk()` above. - -# License - -MIT © [Bogdan Chadkin](mailto:trysound@yandex.ru) diff --git a/node_modules/postcss-value-parser/lib/index.d.ts b/node_modules/postcss-value-parser/lib/index.d.ts deleted file mode 100644 index 8759f3f..0000000 --- a/node_modules/postcss-value-parser/lib/index.d.ts +++ /dev/null @@ -1,177 +0,0 @@ -declare namespace postcssValueParser { - interface BaseNode { - /** - * The offset, inclusive, inside the CSS value at which the node starts. - */ - sourceIndex: number; - - /** - * The offset, exclusive, inside the CSS value at which the node ends. - */ - sourceEndIndex: number; - - /** - * The node's characteristic value - */ - value: string; - } - - interface ClosableNode { - /** - * Whether the parsed CSS value ended before the node was properly closed - */ - unclosed?: true; - } - - interface AdjacentAwareNode { - /** - * The token at the start of the node - */ - before: string; - - /** - * The token at the end of the node - */ - after: string; - } - - interface CommentNode extends BaseNode, ClosableNode { - type: "comment"; - } - - interface DivNode extends BaseNode, AdjacentAwareNode { - type: "div"; - } - - interface FunctionNode extends BaseNode, ClosableNode, AdjacentAwareNode { - type: "function"; - - /** - * Nodes inside the function - */ - nodes: Node[]; - } - - interface SpaceNode extends BaseNode { - type: "space"; - } - - interface StringNode extends BaseNode, ClosableNode { - type: "string"; - - /** - * The quote type delimiting the string - */ - quote: '"' | "'"; - } - - interface UnicodeRangeNode extends BaseNode { - type: "unicode-range"; - } - - interface WordNode extends BaseNode { - type: "word"; - } - - /** - * Any node parsed from a CSS value - */ - type Node = - | CommentNode - | DivNode - | FunctionNode - | SpaceNode - | StringNode - | UnicodeRangeNode - | WordNode; - - interface CustomStringifierCallback { - /** - * @param node The node to stringify - * @returns The serialized CSS representation of the node - */ - (nodes: Node): string | undefined; - } - - interface WalkCallback { - /** - * @param node The currently visited node - * @param index The index of the node in the series of parsed nodes - * @param nodes The series of parsed nodes - * @returns Returning `false` will prevent traversal of descendant nodes (only applies if `bubble` was set to `true` in the `walk()` call) - */ - (node: Node, index: number, nodes: Node[]): void | boolean; - } - - /** - * A CSS dimension, decomposed into its numeric and unit parts - */ - interface Dimension { - number: string; - unit: string; - } - - /** - * A wrapper around a parsed CSS value that allows for inspecting and walking nodes - */ - interface ParsedValue { - /** - * The series of parsed nodes - */ - nodes: Node[]; - - /** - * Walk all parsed nodes, applying a callback - * - * @param callback A visitor callback that will be executed for each node - * @param bubble When set to `true`, walking will be done inside-out instead of outside-in - */ - walk(callback: WalkCallback, bubble?: boolean): this; - } - - interface ValueParser { - /** - * Decompose a CSS dimension into its numeric and unit part - * - * @param value The dimension to decompose - * @returns An object representing `number` and `unit` part of the dimension or `false` if the decomposing fails - */ - unit(value: string): Dimension | false; - - /** - * Serialize a series of nodes into a CSS value - * - * @param nodes The nodes to stringify - * @param custom A custom stringifier callback - * @returns The generated CSS value - */ - stringify(nodes: Node | Node[], custom?: CustomStringifierCallback): string; - - /** - * Walk a series of nodes, applying a callback - * - * @param nodes The nodes to walk - * @param callback A visitor callback that will be executed for each node - * @param bubble When set to `true`, walking will be done inside-out instead of outside-in - */ - walk(nodes: Node[], callback: WalkCallback, bubble?: boolean): void; - - /** - * Parse a CSS value into a series of nodes to operate on - * - * @param value The value to parse - */ - new (value: string): ParsedValue; - - /** - * Parse a CSS value into a series of nodes to operate on - * - * @param value The value to parse - */ - (value: string): ParsedValue; - } -} - -declare const postcssValueParser: postcssValueParser.ValueParser; - -export = postcssValueParser; diff --git a/node_modules/postcss-value-parser/lib/index.js b/node_modules/postcss-value-parser/lib/index.js deleted file mode 100644 index f9ac0e6..0000000 --- a/node_modules/postcss-value-parser/lib/index.js +++ /dev/null @@ -1,28 +0,0 @@ -var parse = require("./parse"); -var walk = require("./walk"); -var stringify = require("./stringify"); - -function ValueParser(value) { - if (this instanceof ValueParser) { - this.nodes = parse(value); - return this; - } - return new ValueParser(value); -} - -ValueParser.prototype.toString = function() { - return Array.isArray(this.nodes) ? stringify(this.nodes) : ""; -}; - -ValueParser.prototype.walk = function(cb, bubble) { - walk(this.nodes, cb, bubble); - return this; -}; - -ValueParser.unit = require("./unit"); - -ValueParser.walk = walk; - -ValueParser.stringify = stringify; - -module.exports = ValueParser; diff --git a/node_modules/postcss-value-parser/lib/parse.js b/node_modules/postcss-value-parser/lib/parse.js deleted file mode 100644 index 950631c..0000000 --- a/node_modules/postcss-value-parser/lib/parse.js +++ /dev/null @@ -1,321 +0,0 @@ -var openParentheses = "(".charCodeAt(0); -var closeParentheses = ")".charCodeAt(0); -var singleQuote = "'".charCodeAt(0); -var doubleQuote = '"'.charCodeAt(0); -var backslash = "\\".charCodeAt(0); -var slash = "/".charCodeAt(0); -var comma = ",".charCodeAt(0); -var colon = ":".charCodeAt(0); -var star = "*".charCodeAt(0); -var uLower = "u".charCodeAt(0); -var uUpper = "U".charCodeAt(0); -var plus = "+".charCodeAt(0); -var isUnicodeRange = /^[a-f0-9?-]+$/i; - -module.exports = function(input) { - var tokens = []; - var value = input; - - var next, - quote, - prev, - token, - escape, - escapePos, - whitespacePos, - parenthesesOpenPos; - var pos = 0; - var code = value.charCodeAt(pos); - var max = value.length; - var stack = [{ nodes: tokens }]; - var balanced = 0; - var parent; - - var name = ""; - var before = ""; - var after = ""; - - while (pos < max) { - // Whitespaces - if (code <= 32) { - next = pos; - do { - next += 1; - code = value.charCodeAt(next); - } while (code <= 32); - token = value.slice(pos, next); - - prev = tokens[tokens.length - 1]; - if (code === closeParentheses && balanced) { - after = token; - } else if (prev && prev.type === "div") { - prev.after = token; - prev.sourceEndIndex += token.length; - } else if ( - code === comma || - code === colon || - (code === slash && - value.charCodeAt(next + 1) !== star && - (!parent || - (parent && parent.type === "function" && parent.value !== "calc"))) - ) { - before = token; - } else { - tokens.push({ - type: "space", - sourceIndex: pos, - sourceEndIndex: next, - value: token - }); - } - - pos = next; - - // Quotes - } else if (code === singleQuote || code === doubleQuote) { - next = pos; - quote = code === singleQuote ? "'" : '"'; - token = { - type: "string", - sourceIndex: pos, - quote: quote - }; - do { - escape = false; - next = value.indexOf(quote, next + 1); - if (~next) { - escapePos = next; - while (value.charCodeAt(escapePos - 1) === backslash) { - escapePos -= 1; - escape = !escape; - } - } else { - value += quote; - next = value.length - 1; - token.unclosed = true; - } - } while (escape); - token.value = value.slice(pos + 1, next); - token.sourceEndIndex = token.unclosed ? next : next + 1; - tokens.push(token); - pos = next + 1; - code = value.charCodeAt(pos); - - // Comments - } else if (code === slash && value.charCodeAt(pos + 1) === star) { - next = value.indexOf("*/", pos); - - token = { - type: "comment", - sourceIndex: pos, - sourceEndIndex: next + 2 - }; - - if (next === -1) { - token.unclosed = true; - next = value.length; - token.sourceEndIndex = next; - } - - token.value = value.slice(pos + 2, next); - tokens.push(token); - - pos = next + 2; - code = value.charCodeAt(pos); - - // Operation within calc - } else if ( - (code === slash || code === star) && - parent && - parent.type === "function" && - parent.value === "calc" - ) { - token = value[pos]; - tokens.push({ - type: "word", - sourceIndex: pos - before.length, - sourceEndIndex: pos + token.length, - value: token - }); - pos += 1; - code = value.charCodeAt(pos); - - // Dividers - } else if (code === slash || code === comma || code === colon) { - token = value[pos]; - - tokens.push({ - type: "div", - sourceIndex: pos - before.length, - sourceEndIndex: pos + token.length, - value: token, - before: before, - after: "" - }); - before = ""; - - pos += 1; - code = value.charCodeAt(pos); - - // Open parentheses - } else if (openParentheses === code) { - // Whitespaces after open parentheses - next = pos; - do { - next += 1; - code = value.charCodeAt(next); - } while (code <= 32); - parenthesesOpenPos = pos; - token = { - type: "function", - sourceIndex: pos - name.length, - value: name, - before: value.slice(parenthesesOpenPos + 1, next) - }; - pos = next; - - if (name === "url" && code !== singleQuote && code !== doubleQuote) { - next -= 1; - do { - escape = false; - next = value.indexOf(")", next + 1); - if (~next) { - escapePos = next; - while (value.charCodeAt(escapePos - 1) === backslash) { - escapePos -= 1; - escape = !escape; - } - } else { - value += ")"; - next = value.length - 1; - token.unclosed = true; - } - } while (escape); - // Whitespaces before closed - whitespacePos = next; - do { - whitespacePos -= 1; - code = value.charCodeAt(whitespacePos); - } while (code <= 32); - if (parenthesesOpenPos < whitespacePos) { - if (pos !== whitespacePos + 1) { - token.nodes = [ - { - type: "word", - sourceIndex: pos, - sourceEndIndex: whitespacePos + 1, - value: value.slice(pos, whitespacePos + 1) - } - ]; - } else { - token.nodes = []; - } - if (token.unclosed && whitespacePos + 1 !== next) { - token.after = ""; - token.nodes.push({ - type: "space", - sourceIndex: whitespacePos + 1, - sourceEndIndex: next, - value: value.slice(whitespacePos + 1, next) - }); - } else { - token.after = value.slice(whitespacePos + 1, next); - token.sourceEndIndex = next; - } - } else { - token.after = ""; - token.nodes = []; - } - pos = next + 1; - token.sourceEndIndex = token.unclosed ? next : pos; - code = value.charCodeAt(pos); - tokens.push(token); - } else { - balanced += 1; - token.after = ""; - token.sourceEndIndex = pos + 1; - tokens.push(token); - stack.push(token); - tokens = token.nodes = []; - parent = token; - } - name = ""; - - // Close parentheses - } else if (closeParentheses === code && balanced) { - pos += 1; - code = value.charCodeAt(pos); - - parent.after = after; - parent.sourceEndIndex += after.length; - after = ""; - balanced -= 1; - stack[stack.length - 1].sourceEndIndex = pos; - stack.pop(); - parent = stack[balanced]; - tokens = parent.nodes; - - // Words - } else { - next = pos; - do { - if (code === backslash) { - next += 1; - } - next += 1; - code = value.charCodeAt(next); - } while ( - next < max && - !( - code <= 32 || - code === singleQuote || - code === doubleQuote || - code === comma || - code === colon || - code === slash || - code === openParentheses || - (code === star && - parent && - parent.type === "function" && - parent.value === "calc") || - (code === slash && - parent.type === "function" && - parent.value === "calc") || - (code === closeParentheses && balanced) - ) - ); - token = value.slice(pos, next); - - if (openParentheses === code) { - name = token; - } else if ( - (uLower === token.charCodeAt(0) || uUpper === token.charCodeAt(0)) && - plus === token.charCodeAt(1) && - isUnicodeRange.test(token.slice(2)) - ) { - tokens.push({ - type: "unicode-range", - sourceIndex: pos, - sourceEndIndex: next, - value: token - }); - } else { - tokens.push({ - type: "word", - sourceIndex: pos, - sourceEndIndex: next, - value: token - }); - } - - pos = next; - } - } - - for (pos = stack.length - 1; pos; pos -= 1) { - stack[pos].unclosed = true; - stack[pos].sourceEndIndex = value.length; - } - - return stack[0].nodes; -}; diff --git a/node_modules/postcss-value-parser/lib/stringify.js b/node_modules/postcss-value-parser/lib/stringify.js deleted file mode 100644 index 6079671..0000000 --- a/node_modules/postcss-value-parser/lib/stringify.js +++ /dev/null @@ -1,48 +0,0 @@ -function stringifyNode(node, custom) { - var type = node.type; - var value = node.value; - var buf; - var customResult; - - if (custom && (customResult = custom(node)) !== undefined) { - return customResult; - } else if (type === "word" || type === "space") { - return value; - } else if (type === "string") { - buf = node.quote || ""; - return buf + value + (node.unclosed ? "" : buf); - } else if (type === "comment") { - return "/*" + value + (node.unclosed ? "" : "*/"); - } else if (type === "div") { - return (node.before || "") + value + (node.after || ""); - } else if (Array.isArray(node.nodes)) { - buf = stringify(node.nodes, custom); - if (type !== "function") { - return buf; - } - return ( - value + - "(" + - (node.before || "") + - buf + - (node.after || "") + - (node.unclosed ? "" : ")") - ); - } - return value; -} - -function stringify(nodes, custom) { - var result, i; - - if (Array.isArray(nodes)) { - result = ""; - for (i = nodes.length - 1; ~i; i -= 1) { - result = stringifyNode(nodes[i], custom) + result; - } - return result; - } - return stringifyNode(nodes, custom); -} - -module.exports = stringify; diff --git a/node_modules/postcss-value-parser/lib/unit.js b/node_modules/postcss-value-parser/lib/unit.js deleted file mode 100644 index c349661..0000000 --- a/node_modules/postcss-value-parser/lib/unit.js +++ /dev/null @@ -1,120 +0,0 @@ -var minus = "-".charCodeAt(0); -var plus = "+".charCodeAt(0); -var dot = ".".charCodeAt(0); -var exp = "e".charCodeAt(0); -var EXP = "E".charCodeAt(0); - -// Check if three code points would start a number -// https://www.w3.org/TR/css-syntax-3/#starts-with-a-number -function likeNumber(value) { - var code = value.charCodeAt(0); - var nextCode; - - if (code === plus || code === minus) { - nextCode = value.charCodeAt(1); - - if (nextCode >= 48 && nextCode <= 57) { - return true; - } - - var nextNextCode = value.charCodeAt(2); - - if (nextCode === dot && nextNextCode >= 48 && nextNextCode <= 57) { - return true; - } - - return false; - } - - if (code === dot) { - nextCode = value.charCodeAt(1); - - if (nextCode >= 48 && nextCode <= 57) { - return true; - } - - return false; - } - - if (code >= 48 && code <= 57) { - return true; - } - - return false; -} - -// Consume a number -// https://www.w3.org/TR/css-syntax-3/#consume-number -module.exports = function(value) { - var pos = 0; - var length = value.length; - var code; - var nextCode; - var nextNextCode; - - if (length === 0 || !likeNumber(value)) { - return false; - } - - code = value.charCodeAt(pos); - - if (code === plus || code === minus) { - pos++; - } - - while (pos < length) { - code = value.charCodeAt(pos); - - if (code < 48 || code > 57) { - break; - } - - pos += 1; - } - - code = value.charCodeAt(pos); - nextCode = value.charCodeAt(pos + 1); - - if (code === dot && nextCode >= 48 && nextCode <= 57) { - pos += 2; - - while (pos < length) { - code = value.charCodeAt(pos); - - if (code < 48 || code > 57) { - break; - } - - pos += 1; - } - } - - code = value.charCodeAt(pos); - nextCode = value.charCodeAt(pos + 1); - nextNextCode = value.charCodeAt(pos + 2); - - if ( - (code === exp || code === EXP) && - ((nextCode >= 48 && nextCode <= 57) || - ((nextCode === plus || nextCode === minus) && - nextNextCode >= 48 && - nextNextCode <= 57)) - ) { - pos += nextCode === plus || nextCode === minus ? 3 : 2; - - while (pos < length) { - code = value.charCodeAt(pos); - - if (code < 48 || code > 57) { - break; - } - - pos += 1; - } - } - - return { - number: value.slice(0, pos), - unit: value.slice(pos) - }; -}; diff --git a/node_modules/postcss-value-parser/lib/walk.js b/node_modules/postcss-value-parser/lib/walk.js deleted file mode 100644 index 7666c5b..0000000 --- a/node_modules/postcss-value-parser/lib/walk.js +++ /dev/null @@ -1,22 +0,0 @@ -module.exports = function walk(nodes, cb, bubble) { - var i, max, node, result; - - for (i = 0, max = nodes.length; i < max; i += 1) { - node = nodes[i]; - if (!bubble) { - result = cb(node, i, nodes); - } - - if ( - result !== false && - node.type === "function" && - Array.isArray(node.nodes) - ) { - walk(node.nodes, cb, bubble); - } - - if (bubble) { - cb(node, i, nodes); - } - } -}; diff --git a/node_modules/postcss-value-parser/package.json b/node_modules/postcss-value-parser/package.json deleted file mode 100644 index 02d744a..0000000 --- a/node_modules/postcss-value-parser/package.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "postcss-value-parser", - "version": "4.2.0", - "description": "Transforms css values and at-rule params into the tree", - "main": "lib/index.js", - "files": [ - "lib" - ], - "devDependencies": { - "eslint": "^5.16.0", - "husky": "^2.3.0", - "lint-staged": "^8.1.7", - "prettier": "^1.17.1", - "tap-spec": "^5.0.0", - "tape": "^4.10.2" - }, - "scripts": { - "lint:prettier": "prettier \"**/*.js\" \"**/*.ts\" --list-different", - "lint:js": "eslint . --cache", - "lint": "yarn lint:js && yarn lint:prettier", - "pretest": "yarn lint", - "test": "tape test/*.js | tap-spec" - }, - "eslintConfig": { - "env": { - "es6": true, - "node": true - }, - "extends": "eslint:recommended" - }, - "lint-staged": { - "*.js": [ - "eslint", - "prettier --write", - "git add" - ] - }, - "husky": { - "hooks": { - "pre-commit": "lint-staged" - } - }, - "author": "Bogdan Chadkin ", - "license": "MIT", - "homepage": "https://github.com/TrySound/postcss-value-parser", - "repository": { - "type": "git", - "url": "https://github.com/TrySound/postcss-value-parser.git" - }, - "keywords": [ - "postcss", - "value", - "parser" - ], - "bugs": { - "url": "https://github.com/TrySound/postcss-value-parser/issues" - } -} diff --git a/node_modules/postcss/LICENSE b/node_modules/postcss/LICENSE deleted file mode 100644 index da057b4..0000000 --- a/node_modules/postcss/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright 2013 Andrey Sitnik - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/postcss/README.md b/node_modules/postcss/README.md deleted file mode 100644 index 05fed07..0000000 --- a/node_modules/postcss/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# PostCSS - -Philosopher’s stone, logo of PostCSS - -PostCSS is a tool for transforming styles with JS plugins. -These plugins can lint your CSS, support variables and mixins, -transpile future CSS syntax, inline images, and more. - -PostCSS is used by industry leaders including Wikipedia, Twitter, Alibaba, -and JetBrains. The [Autoprefixer] and [Stylelint] PostCSS plugins are some of the most popular CSS tools. - ---- - -  Built by - Evil Martians, go-to agency for developer tools. - ---- - -[Abstract Syntax Tree]: https://en.wikipedia.org/wiki/Abstract_syntax_tree -[Evil Martians]: https://evilmartians.com/?utm_source=postcss -[Autoprefixer]: https://github.com/postcss/autoprefixer -[Stylelint]: https://stylelint.io/ -[plugins]: https://github.com/postcss/postcss#plugins - - -## Docs -Read full docs **[here](https://postcss.org/)**. diff --git a/node_modules/postcss/lib/at-rule.d.ts b/node_modules/postcss/lib/at-rule.d.ts deleted file mode 100644 index 89fb505..0000000 --- a/node_modules/postcss/lib/at-rule.d.ts +++ /dev/null @@ -1,140 +0,0 @@ -import Container, { - ContainerProps, - ContainerWithChildren -} from './container.js' - -declare namespace AtRule { - export interface AtRuleRaws extends Record { - /** - * The space symbols after the last child of the node to the end of the node. - */ - after?: string - - /** - * The space between the at-rule name and its parameters. - */ - afterName?: string - - /** - * The space symbols before the node. It also stores `*` - * and `_` symbols before the declaration (IE hack). - */ - before?: string - - /** - * The symbols between the last parameter and `{` for rules. - */ - between?: string - - /** - * The rule’s selector with comments. - */ - params?: { - raw: string - value: string - } - - /** - * Contains `true` if the last child has an (optional) semicolon. - */ - semicolon?: boolean - } - - export interface AtRuleProps extends ContainerProps { - /** Name of the at-rule. */ - name: string - /** Parameters following the name of the at-rule. */ - params?: number | string - /** Information used to generate byte-to-byte equal node string as it was in the origin input. */ - raws?: AtRuleRaws - } - - // eslint-disable-next-line @typescript-eslint/no-use-before-define - export { AtRule_ as default } -} - -/** - * Represents an at-rule. - * - * ```js - * Once (root, { AtRule }) { - * let media = new AtRule({ name: 'media', params: 'print' }) - * media.append(…) - * root.append(media) - * } - * ``` - * - * If it’s followed in the CSS by a `{}` block, this node will have - * a nodes property representing its children. - * - * ```js - * const root = postcss.parse('@charset "UTF-8"; @media print {}') - * - * const charset = root.first - * charset.type //=> 'atrule' - * charset.nodes //=> undefined - * - * const media = root.last - * media.nodes //=> [] - * ``` - */ -declare class AtRule_ extends Container { - /** - * An array containing the layer’s children. - * - * ```js - * const root = postcss.parse('@layer example { a { color: black } }') - * const layer = root.first - * layer.nodes.length //=> 1 - * layer.nodes[0].selector //=> 'a' - * ``` - * - * Can be `undefinded` if the at-rule has no body. - * - * ```js - * const root = postcss.parse('@layer a, b, c;') - * const layer = root.first - * layer.nodes //=> undefined - * ``` - */ - nodes: Container['nodes'] | undefined - parent: ContainerWithChildren | undefined - - raws: AtRule.AtRuleRaws - type: 'atrule' - /** - * The at-rule’s name immediately follows the `@`. - * - * ```js - * const root = postcss.parse('@media print {}') - * const media = root.first - * media.name //=> 'media' - * ``` - */ - get name(): string - set name(value: string) - - /** - * The at-rule’s parameters, the values that follow the at-rule’s name - * but precede any `{}` block. - * - * ```js - * const root = postcss.parse('@media print, screen {}') - * const media = root.first - * media.params //=> 'print, screen' - * ``` - */ - get params(): string - - set params(value: string) - - constructor(defaults?: AtRule.AtRuleProps) - assign(overrides: AtRule.AtRuleProps | object): this - clone(overrides?: Partial): this - cloneAfter(overrides?: Partial): this - cloneBefore(overrides?: Partial): this -} - -declare class AtRule extends AtRule_ {} - -export = AtRule diff --git a/node_modules/postcss/lib/at-rule.js b/node_modules/postcss/lib/at-rule.js deleted file mode 100644 index 9486447..0000000 --- a/node_modules/postcss/lib/at-rule.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict' - -let Container = require('./container') - -class AtRule extends Container { - constructor(defaults) { - super(defaults) - this.type = 'atrule' - } - - append(...children) { - if (!this.proxyOf.nodes) this.nodes = [] - return super.append(...children) - } - - prepend(...children) { - if (!this.proxyOf.nodes) this.nodes = [] - return super.prepend(...children) - } -} - -module.exports = AtRule -AtRule.default = AtRule - -Container.registerAtRule(AtRule) diff --git a/node_modules/postcss/lib/comment.d.ts b/node_modules/postcss/lib/comment.d.ts deleted file mode 100644 index 6f1f66f..0000000 --- a/node_modules/postcss/lib/comment.d.ts +++ /dev/null @@ -1,68 +0,0 @@ -import Container from './container.js' -import Node, { NodeProps } from './node.js' - -declare namespace Comment { - export interface CommentRaws extends Record { - /** - * The space symbols before the node. - */ - before?: string - - /** - * The space symbols between `/*` and the comment’s text. - */ - left?: string - - /** - * The space symbols between the comment’s text. - */ - right?: string - } - - export interface CommentProps extends NodeProps { - /** Information used to generate byte-to-byte equal node string as it was in the origin input. */ - raws?: CommentRaws - /** Content of the comment. */ - text: string - } - - // eslint-disable-next-line @typescript-eslint/no-use-before-define - export { Comment_ as default } -} - -/** - * It represents a class that handles - * [CSS comments](https://developer.mozilla.org/en-US/docs/Web/CSS/Comments) - * - * ```js - * Once (root, { Comment }) { - * const note = new Comment({ text: 'Note: …' }) - * root.append(note) - * } - * ``` - * - * Remember that CSS comments inside selectors, at-rule parameters, - * or declaration values will be stored in the `raws` properties - * explained above. - */ -declare class Comment_ extends Node { - parent: Container | undefined - raws: Comment.CommentRaws - type: 'comment' - /** - * The comment's text. - */ - get text(): string - - set text(value: string) - - constructor(defaults?: Comment.CommentProps) - assign(overrides: Comment.CommentProps | object): this - clone(overrides?: Partial): this - cloneAfter(overrides?: Partial): this - cloneBefore(overrides?: Partial): this -} - -declare class Comment extends Comment_ {} - -export = Comment diff --git a/node_modules/postcss/lib/comment.js b/node_modules/postcss/lib/comment.js deleted file mode 100644 index c566506..0000000 --- a/node_modules/postcss/lib/comment.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' - -let Node = require('./node') - -class Comment extends Node { - constructor(defaults) { - super(defaults) - this.type = 'comment' - } -} - -module.exports = Comment -Comment.default = Comment diff --git a/node_modules/postcss/lib/container.d.ts b/node_modules/postcss/lib/container.d.ts deleted file mode 100644 index c2b310b..0000000 --- a/node_modules/postcss/lib/container.d.ts +++ /dev/null @@ -1,483 +0,0 @@ -import AtRule from './at-rule.js' -import Comment from './comment.js' -import Declaration from './declaration.js' -import Node, { ChildNode, ChildProps, NodeProps } from './node.js' -import { Root } from './postcss.js' -import Rule from './rule.js' - -declare namespace Container { - export type ContainerWithChildren = { - nodes: Child[] - } & ( - | AtRule - | Root - | Rule - ) - - export interface ValueOptions { - /** - * String that’s used to narrow down values and speed up the regexp search. - */ - fast?: string - - /** - * An array of property names. - */ - props?: readonly string[] - } - - export interface ContainerProps extends NodeProps { - nodes?: readonly (ChildProps | Node)[] - } - - /** - * All types that can be passed into container methods to create or add a new - * child node. - */ - export type NewChild = - | ChildProps - | Node - | readonly ChildProps[] - | readonly Node[] - | readonly string[] - | string - | undefined - - // eslint-disable-next-line @typescript-eslint/no-use-before-define - export { Container_ as default } -} - -/** - * The `Root`, `AtRule`, and `Rule` container nodes - * inherit some common methods to help work with their children. - * - * Note that all containers can store any content. If you write a rule inside - * a rule, PostCSS will parse it. - */ -declare abstract class Container_ extends Node { - /** - * An array containing the container’s children. - * - * ```js - * const root = postcss.parse('a { color: black }') - * root.nodes.length //=> 1 - * root.nodes[0].selector //=> 'a' - * root.nodes[0].nodes[0].prop //=> 'color' - * ``` - */ - nodes: Child[] | undefined - - /** - * The container’s first child. - * - * ```js - * rule.first === rules.nodes[0] - * ``` - */ - get first(): Child | undefined - - /** - * The container’s last child. - * - * ```js - * rule.last === rule.nodes[rule.nodes.length - 1] - * ``` - */ - get last(): Child | undefined - /** - * Inserts new nodes to the end of the container. - * - * ```js - * const decl1 = new Declaration({ prop: 'color', value: 'black' }) - * const decl2 = new Declaration({ prop: 'background-color', value: 'white' }) - * rule.append(decl1, decl2) - * - * root.append({ name: 'charset', params: '"UTF-8"' }) // at-rule - * root.append({ selector: 'a' }) // rule - * rule.append({ prop: 'color', value: 'black' }) // declaration - * rule.append({ text: 'Comment' }) // comment - * - * root.append('a {}') - * root.first.append('color: black; z-index: 1') - * ``` - * - * @param nodes New nodes. - * @return This node for methods chain. - */ - append(...nodes: Container.NewChild[]): this - assign(overrides: Container.ContainerProps | object): this - clone(overrides?: Partial): this - - cloneAfter(overrides?: Partial): this - - cloneBefore(overrides?: Partial): this - /** - * Iterates through the container’s immediate children, - * calling `callback` for each child. - * - * Returning `false` in the callback will break iteration. - * - * This method only iterates through the container’s immediate children. - * If you need to recursively iterate through all the container’s descendant - * nodes, use `Container#walk`. - * - * Unlike the for `{}`-cycle or `Array#forEach` this iterator is safe - * if you are mutating the array of child nodes during iteration. - * PostCSS will adjust the current index to match the mutations. - * - * ```js - * const root = postcss.parse('a { color: black; z-index: 1 }') - * const rule = root.first - * - * for (const decl of rule.nodes) { - * decl.cloneBefore({ prop: '-webkit-' + decl.prop }) - * // Cycle will be infinite, because cloneBefore moves the current node - * // to the next index - * } - * - * rule.each(decl => { - * decl.cloneBefore({ prop: '-webkit-' + decl.prop }) - * // Will be executed only for color and z-index - * }) - * ``` - * - * @param callback Iterator receives each node and index. - * @return Returns `false` if iteration was broke. - */ - each( - callback: (node: Child, index: number) => false | void - ): false | undefined - - /** - * Returns `true` if callback returns `true` - * for all of the container’s children. - * - * ```js - * const noPrefixes = rule.every(i => i.prop[0] !== '-') - * ``` - * - * @param condition Iterator returns true or false. - * @return Is every child pass condition. - */ - every( - condition: (node: Child, index: number, nodes: Child[]) => boolean - ): boolean - /** - * Returns a `child`’s index within the `Container#nodes` array. - * - * ```js - * rule.index( rule.nodes[2] ) //=> 2 - * ``` - * - * @param child Child of the current container. - * @return Child index. - */ - index(child: Child | number): number - - /** - * Insert new node after old node within the container. - * - * @param oldNode Child or child’s index. - * @param newNode New node. - * @return This node for methods chain. - */ - insertAfter(oldNode: Child | number, newNode: Container.NewChild): this - - /** - * Traverses the container’s descendant nodes, calling callback - * for each comment node. - * - * Like `Container#each`, this method is safe - * to use if you are mutating arrays during iteration. - * - * ```js - * root.walkComments(comment => { - * comment.remove() - * }) - * ``` - * - * @param callback Iterator receives each node and index. - * @return Returns `false` if iteration was broke. - */ - - /** - * Insert new node before old node within the container. - * - * ```js - * rule.insertBefore(decl, decl.clone({ prop: '-webkit-' + decl.prop })) - * ``` - * - * @param oldNode Child or child’s index. - * @param newNode New node. - * @return This node for methods chain. - */ - insertBefore(oldNode: Child | number, newNode: Container.NewChild): this - /** - * Inserts new nodes to the start of the container. - * - * ```js - * const decl1 = new Declaration({ prop: 'color', value: 'black' }) - * const decl2 = new Declaration({ prop: 'background-color', value: 'white' }) - * rule.prepend(decl1, decl2) - * - * root.append({ name: 'charset', params: '"UTF-8"' }) // at-rule - * root.append({ selector: 'a' }) // rule - * rule.append({ prop: 'color', value: 'black' }) // declaration - * rule.append({ text: 'Comment' }) // comment - * - * root.append('a {}') - * root.first.append('color: black; z-index: 1') - * ``` - * - * @param nodes New nodes. - * @return This node for methods chain. - */ - prepend(...nodes: Container.NewChild[]): this - - /** - * Add child to the end of the node. - * - * ```js - * rule.push(new Declaration({ prop: 'color', value: 'black' })) - * ``` - * - * @param child New node. - * @return This node for methods chain. - */ - push(child: Child): this - - /** - * Removes all children from the container - * and cleans their parent properties. - * - * ```js - * rule.removeAll() - * rule.nodes.length //=> 0 - * ``` - * - * @return This node for methods chain. - */ - removeAll(): this - - /** - * Removes node from the container and cleans the parent properties - * from the node and its children. - * - * ```js - * rule.nodes.length //=> 5 - * rule.removeChild(decl) - * rule.nodes.length //=> 4 - * decl.parent //=> undefined - * ``` - * - * @param child Child or child’s index. - * @return This node for methods chain. - */ - removeChild(child: Child | number): this - - replaceValues( - pattern: RegExp | string, - replaced: { (substring: string, ...args: any[]): string } | string - ): this - /** - * Passes all declaration values within the container that match pattern - * through callback, replacing those values with the returned result - * of callback. - * - * This method is useful if you are using a custom unit or function - * and need to iterate through all values. - * - * ```js - * root.replaceValues(/\d+rem/, { fast: 'rem' }, string => { - * return 15 * parseInt(string) + 'px' - * }) - * ``` - * - * @param pattern Replace pattern. - * @param {object} options Options to speed up the search. - * @param replaced String to replace pattern or callback - * that returns a new value. The callback - * will receive the same arguments - * as those passed to a function parameter - * of `String#replace`. - * @return This node for methods chain. - */ - replaceValues( - pattern: RegExp | string, - options: Container.ValueOptions, - replaced: { (substring: string, ...args: any[]): string } | string - ): this - - /** - * Returns `true` if callback returns `true` for (at least) one - * of the container’s children. - * - * ```js - * const hasPrefix = rule.some(i => i.prop[0] === '-') - * ``` - * - * @param condition Iterator returns true or false. - * @return Is some child pass condition. - */ - some( - condition: (node: Child, index: number, nodes: Child[]) => boolean - ): boolean - - /** - * Traverses the container’s descendant nodes, calling callback - * for each node. - * - * Like container.each(), this method is safe to use - * if you are mutating arrays during iteration. - * - * If you only need to iterate through the container’s immediate children, - * use `Container#each`. - * - * ```js - * root.walk(node => { - * // Traverses all descendant nodes. - * }) - * ``` - * - * @param callback Iterator receives each node and index. - * @return Returns `false` if iteration was broke. - */ - walk( - callback: (node: ChildNode, index: number) => false | void - ): false | undefined - - /** - * Traverses the container’s descendant nodes, calling callback - * for each at-rule node. - * - * If you pass a filter, iteration will only happen over at-rules - * that have matching names. - * - * Like `Container#each`, this method is safe - * to use if you are mutating arrays during iteration. - * - * ```js - * root.walkAtRules(rule => { - * if (isOld(rule.name)) rule.remove() - * }) - * - * let first = false - * root.walkAtRules('charset', rule => { - * if (!first) { - * first = true - * } else { - * rule.remove() - * } - * }) - * ``` - * - * @param name String or regular expression to filter at-rules by name. - * @param callback Iterator receives each node and index. - * @return Returns `false` if iteration was broke. - */ - walkAtRules( - nameFilter: RegExp | string, - callback: (atRule: AtRule, index: number) => false | void - ): false | undefined - walkAtRules( - callback: (atRule: AtRule, index: number) => false | void - ): false | undefined - - walkComments( - callback: (comment: Comment, indexed: number) => false | void - ): false | undefined - walkComments( - callback: (comment: Comment, indexed: number) => false | void - ): false | undefined - - /** - * Traverses the container’s descendant nodes, calling callback - * for each declaration node. - * - * If you pass a filter, iteration will only happen over declarations - * with matching properties. - * - * ```js - * root.walkDecls(decl => { - * checkPropertySupport(decl.prop) - * }) - * - * root.walkDecls('border-radius', decl => { - * decl.remove() - * }) - * - * root.walkDecls(/^background/, decl => { - * decl.value = takeFirstColorFromGradient(decl.value) - * }) - * ``` - * - * Like `Container#each`, this method is safe - * to use if you are mutating arrays during iteration. - * - * @param prop String or regular expression to filter declarations - * by property name. - * @param callback Iterator receives each node and index. - * @return Returns `false` if iteration was broke. - */ - walkDecls( - propFilter: RegExp | string, - callback: (decl: Declaration, index: number) => false | void - ): false | undefined - walkDecls( - callback: (decl: Declaration, index: number) => false | void - ): false | undefined - /** - * Traverses the container’s descendant nodes, calling callback - * for each rule node. - * - * If you pass a filter, iteration will only happen over rules - * with matching selectors. - * - * Like `Container#each`, this method is safe - * to use if you are mutating arrays during iteration. - * - * ```js - * const selectors = [] - * root.walkRules(rule => { - * selectors.push(rule.selector) - * }) - * console.log(`Your CSS uses ${ selectors.length } selectors`) - * ``` - * - * @param selector String or regular expression to filter rules by selector. - * @param callback Iterator receives each node and index. - * @return Returns `false` if iteration was broke. - */ - walkRules( - selectorFilter: RegExp | string, - callback: (rule: Rule, index: number) => false | void - ): false | undefined - walkRules( - callback: (rule: Rule, index: number) => false | void - ): false | undefined - /** - * An internal method that converts a {@link NewChild} into a list of actual - * child nodes that can then be added to this container. - * - * This ensures that the nodes' parent is set to this container, that they use - * the correct prototype chain, and that they're marked as dirty. - * - * @param mnodes The new node or nodes to add. - * @param sample A node from whose raws the new node's `before` raw should be - * taken. - * @param type This should be set to `'prepend'` if the new nodes will be - * inserted at the beginning of the container. - * @hidden - */ - protected normalize( - nodes: Container.NewChild, - sample: Node | undefined, - type?: 'prepend' | false - ): Child[] -} - -declare class Container< - Child extends Node = ChildNode -> extends Container_ {} - -export = Container diff --git a/node_modules/postcss/lib/container.js b/node_modules/postcss/lib/container.js deleted file mode 100644 index edb07cc..0000000 --- a/node_modules/postcss/lib/container.js +++ /dev/null @@ -1,447 +0,0 @@ -'use strict' - -let Comment = require('./comment') -let Declaration = require('./declaration') -let Node = require('./node') -let { isClean, my } = require('./symbols') - -let AtRule, parse, Root, Rule - -function cleanSource(nodes) { - return nodes.map(i => { - if (i.nodes) i.nodes = cleanSource(i.nodes) - delete i.source - return i - }) -} - -function markTreeDirty(node) { - node[isClean] = false - if (node.proxyOf.nodes) { - for (let i of node.proxyOf.nodes) { - markTreeDirty(i) - } - } -} - -class Container extends Node { - get first() { - if (!this.proxyOf.nodes) return undefined - return this.proxyOf.nodes[0] - } - - get last() { - if (!this.proxyOf.nodes) return undefined - return this.proxyOf.nodes[this.proxyOf.nodes.length - 1] - } - - append(...children) { - for (let child of children) { - let nodes = this.normalize(child, this.last) - for (let node of nodes) this.proxyOf.nodes.push(node) - } - - this.markDirty() - - return this - } - - cleanRaws(keepBetween) { - super.cleanRaws(keepBetween) - if (this.nodes) { - for (let node of this.nodes) node.cleanRaws(keepBetween) - } - } - - each(callback) { - if (!this.proxyOf.nodes) return undefined - let iterator = this.getIterator() - - let index, result - while (this.indexes[iterator] < this.proxyOf.nodes.length) { - index = this.indexes[iterator] - result = callback(this.proxyOf.nodes[index], index) - if (result === false) break - - this.indexes[iterator] += 1 - } - - delete this.indexes[iterator] - return result - } - - every(condition) { - return this.nodes.every(condition) - } - - getIterator() { - if (!this.lastEach) this.lastEach = 0 - if (!this.indexes) this.indexes = {} - - this.lastEach += 1 - let iterator = this.lastEach - this.indexes[iterator] = 0 - - return iterator - } - - getProxyProcessor() { - return { - get(node, prop) { - if (prop === 'proxyOf') { - return node - } else if (!node[prop]) { - return node[prop] - } else if ( - prop === 'each' || - (typeof prop === 'string' && prop.startsWith('walk')) - ) { - return (...args) => { - return node[prop]( - ...args.map(i => { - if (typeof i === 'function') { - return (child, index) => i(child.toProxy(), index) - } else { - return i - } - }) - ) - } - } else if (prop === 'every' || prop === 'some') { - return cb => { - return node[prop]((child, ...other) => - cb(child.toProxy(), ...other) - ) - } - } else if (prop === 'root') { - return () => node.root().toProxy() - } else if (prop === 'nodes') { - return node.nodes.map(i => i.toProxy()) - } else if (prop === 'first' || prop === 'last') { - return node[prop].toProxy() - } else { - return node[prop] - } - }, - - set(node, prop, value) { - if (node[prop] === value) return true - node[prop] = value - if (prop === 'name' || prop === 'params' || prop === 'selector') { - node.markDirty() - } - return true - } - } - } - - index(child) { - if (typeof child === 'number') return child - if (child.proxyOf) child = child.proxyOf - return this.proxyOf.nodes.indexOf(child) - } - - insertAfter(exist, add) { - let existIndex = this.index(exist) - let nodes = this.normalize(add, this.proxyOf.nodes[existIndex]).reverse() - existIndex = this.index(exist) - for (let node of nodes) this.proxyOf.nodes.splice(existIndex + 1, 0, node) - - let index - for (let id in this.indexes) { - index = this.indexes[id] - if (existIndex < index) { - this.indexes[id] = index + nodes.length - } - } - - this.markDirty() - - return this - } - - insertBefore(exist, add) { - let existIndex = this.index(exist) - let type = existIndex === 0 ? 'prepend' : false - let nodes = this.normalize( - add, - this.proxyOf.nodes[existIndex], - type - ).reverse() - existIndex = this.index(exist) - for (let node of nodes) this.proxyOf.nodes.splice(existIndex, 0, node) - - let index - for (let id in this.indexes) { - index = this.indexes[id] - if (existIndex <= index) { - this.indexes[id] = index + nodes.length - } - } - - this.markDirty() - - return this - } - - normalize(nodes, sample) { - if (typeof nodes === 'string') { - nodes = cleanSource(parse(nodes).nodes) - } else if (typeof nodes === 'undefined') { - nodes = [] - } else if (Array.isArray(nodes)) { - nodes = nodes.slice(0) - for (let i of nodes) { - if (i.parent) i.parent.removeChild(i, 'ignore') - } - } else if (nodes.type === 'root' && this.type !== 'document') { - nodes = nodes.nodes.slice(0) - for (let i of nodes) { - if (i.parent) i.parent.removeChild(i, 'ignore') - } - } else if (nodes.type) { - nodes = [nodes] - } else if (nodes.prop) { - if (typeof nodes.value === 'undefined') { - throw new Error('Value field is missed in node creation') - } else if (typeof nodes.value !== 'string') { - nodes.value = String(nodes.value) - } - nodes = [new Declaration(nodes)] - } else if (nodes.selector || nodes.selectors) { - nodes = [new Rule(nodes)] - } else if (nodes.name) { - nodes = [new AtRule(nodes)] - } else if (nodes.text) { - nodes = [new Comment(nodes)] - } else { - throw new Error('Unknown node type in node creation') - } - - let processed = nodes.map(i => { - /* c8 ignore next */ - if (!i[my]) Container.rebuild(i) - i = i.proxyOf - if (i.parent) i.parent.removeChild(i) - if (i[isClean]) markTreeDirty(i) - - if (!i.raws) i.raws = {} - if (typeof i.raws.before === 'undefined') { - if (sample && typeof sample.raws.before !== 'undefined') { - i.raws.before = sample.raws.before.replace(/\S/g, '') - } - } - i.parent = this.proxyOf - return i - }) - - return processed - } - - prepend(...children) { - children = children.reverse() - for (let child of children) { - let nodes = this.normalize(child, this.first, 'prepend').reverse() - for (let node of nodes) this.proxyOf.nodes.unshift(node) - for (let id in this.indexes) { - this.indexes[id] = this.indexes[id] + nodes.length - } - } - - this.markDirty() - - return this - } - - push(child) { - child.parent = this - this.proxyOf.nodes.push(child) - return this - } - - removeAll() { - for (let node of this.proxyOf.nodes) node.parent = undefined - this.proxyOf.nodes = [] - - this.markDirty() - - return this - } - - removeChild(child) { - child = this.index(child) - this.proxyOf.nodes[child].parent = undefined - this.proxyOf.nodes.splice(child, 1) - - let index - for (let id in this.indexes) { - index = this.indexes[id] - if (index >= child) { - this.indexes[id] = index - 1 - } - } - - this.markDirty() - - return this - } - - replaceValues(pattern, opts, callback) { - if (!callback) { - callback = opts - opts = {} - } - - this.walkDecls(decl => { - if (opts.props && !opts.props.includes(decl.prop)) return - if (opts.fast && !decl.value.includes(opts.fast)) return - - decl.value = decl.value.replace(pattern, callback) - }) - - this.markDirty() - - return this - } - - some(condition) { - return this.nodes.some(condition) - } - - walk(callback) { - return this.each((child, i) => { - let result - try { - result = callback(child, i) - } catch (e) { - throw child.addToError(e) - } - if (result !== false && child.walk) { - result = child.walk(callback) - } - - return result - }) - } - - walkAtRules(name, callback) { - if (!callback) { - callback = name - return this.walk((child, i) => { - if (child.type === 'atrule') { - return callback(child, i) - } - }) - } - if (name instanceof RegExp) { - return this.walk((child, i) => { - if (child.type === 'atrule' && name.test(child.name)) { - return callback(child, i) - } - }) - } - return this.walk((child, i) => { - if (child.type === 'atrule' && child.name === name) { - return callback(child, i) - } - }) - } - - walkComments(callback) { - return this.walk((child, i) => { - if (child.type === 'comment') { - return callback(child, i) - } - }) - } - - walkDecls(prop, callback) { - if (!callback) { - callback = prop - return this.walk((child, i) => { - if (child.type === 'decl') { - return callback(child, i) - } - }) - } - if (prop instanceof RegExp) { - return this.walk((child, i) => { - if (child.type === 'decl' && prop.test(child.prop)) { - return callback(child, i) - } - }) - } - return this.walk((child, i) => { - if (child.type === 'decl' && child.prop === prop) { - return callback(child, i) - } - }) - } - - walkRules(selector, callback) { - if (!callback) { - callback = selector - - return this.walk((child, i) => { - if (child.type === 'rule') { - return callback(child, i) - } - }) - } - if (selector instanceof RegExp) { - return this.walk((child, i) => { - if (child.type === 'rule' && selector.test(child.selector)) { - return callback(child, i) - } - }) - } - return this.walk((child, i) => { - if (child.type === 'rule' && child.selector === selector) { - return callback(child, i) - } - }) - } -} - -Container.registerParse = dependant => { - parse = dependant -} - -Container.registerRule = dependant => { - Rule = dependant -} - -Container.registerAtRule = dependant => { - AtRule = dependant -} - -Container.registerRoot = dependant => { - Root = dependant -} - -module.exports = Container -Container.default = Container - -/* c8 ignore start */ -Container.rebuild = node => { - if (node.type === 'atrule') { - Object.setPrototypeOf(node, AtRule.prototype) - } else if (node.type === 'rule') { - Object.setPrototypeOf(node, Rule.prototype) - } else if (node.type === 'decl') { - Object.setPrototypeOf(node, Declaration.prototype) - } else if (node.type === 'comment') { - Object.setPrototypeOf(node, Comment.prototype) - } else if (node.type === 'root') { - Object.setPrototypeOf(node, Root.prototype) - } - - node[my] = true - - if (node.nodes) { - node.nodes.forEach(child => { - Container.rebuild(child) - }) - } -} -/* c8 ignore stop */ diff --git a/node_modules/postcss/lib/css-syntax-error.d.ts b/node_modules/postcss/lib/css-syntax-error.d.ts deleted file mode 100644 index e540d84..0000000 --- a/node_modules/postcss/lib/css-syntax-error.d.ts +++ /dev/null @@ -1,248 +0,0 @@ -import { FilePosition } from './input.js' - -declare namespace CssSyntaxError { - /** - * A position that is part of a range. - */ - export interface RangePosition { - /** - * The column number in the input. - */ - column: number - - /** - * The line number in the input. - */ - line: number - } - - // eslint-disable-next-line @typescript-eslint/no-use-before-define - export { CssSyntaxError_ as default } -} - -/** - * The CSS parser throws this error for broken CSS. - * - * Custom parsers can throw this error for broken custom syntax using - * the `Node#error` method. - * - * PostCSS will use the input source map to detect the original error location. - * If you wrote a Sass file, compiled it to CSS and then parsed it with PostCSS, - * PostCSS will show the original position in the Sass file. - * - * If you need the position in the PostCSS input - * (e.g., to debug the previous compiler), use `error.input.file`. - * - * ```js - * // Raising error from plugin - * throw node.error('Unknown variable', { plugin: 'postcss-vars' }) - * ``` - * - * ```js - * // Catching and checking syntax error - * try { - * postcss.parse('a{') - * } catch (error) { - * if (error.name === 'CssSyntaxError') { - * error //=> CssSyntaxError - * } - * } - * ``` - */ -declare class CssSyntaxError_ extends Error { - /** - * Source column of the error. - * - * ```js - * error.column //=> 1 - * error.input.column //=> 4 - * ``` - * - * PostCSS will use the input source map to detect the original location. - * If you need the position in the PostCSS input, use `error.input.column`. - */ - column?: number - - /** - * Source column of the error's end, exclusive. Provided if the error pertains - * to a range. - * - * ```js - * error.endColumn //=> 1 - * error.input.endColumn //=> 4 - * ``` - * - * PostCSS will use the input source map to detect the original location. - * If you need the position in the PostCSS input, use `error.input.endColumn`. - */ - endColumn?: number - - /** - * Source line of the error's end, exclusive. Provided if the error pertains - * to a range. - * - * ```js - * error.endLine //=> 3 - * error.input.endLine //=> 4 - * ``` - * - * PostCSS will use the input source map to detect the original location. - * If you need the position in the PostCSS input, use `error.input.endLine`. - */ - endLine?: number - - /** - * Absolute path to the broken file. - * - * ```js - * error.file //=> 'a.sass' - * error.input.file //=> 'a.css' - * ``` - * - * PostCSS will use the input source map to detect the original location. - * If you need the position in the PostCSS input, use `error.input.file`. - */ - file?: string - - /** - * Input object with PostCSS internal information - * about input file. If input has source map - * from previous tool, PostCSS will use origin - * (for example, Sass) source. You can use this - * object to get PostCSS input source. - * - * ```js - * error.input.file //=> 'a.css' - * error.file //=> 'a.sass' - * ``` - */ - input?: FilePosition - - /** - * Source line of the error. - * - * ```js - * error.line //=> 2 - * error.input.line //=> 4 - * ``` - * - * PostCSS will use the input source map to detect the original location. - * If you need the position in the PostCSS input, use `error.input.line`. - */ - line?: number - - /** - * Full error text in the GNU error format - * with plugin, file, line and column. - * - * ```js - * error.message //=> 'a.css:1:1: Unclosed block' - * ``` - */ - message: string - - /** - * Always equal to `'CssSyntaxError'`. You should always check error type - * by `error.name === 'CssSyntaxError'` - * instead of `error instanceof CssSyntaxError`, - * because npm could have several PostCSS versions. - * - * ```js - * if (error.name === 'CssSyntaxError') { - * error //=> CssSyntaxError - * } - * ``` - */ - name: 'CssSyntaxError' - - /** - * Plugin name, if error came from plugin. - * - * ```js - * error.plugin //=> 'postcss-vars' - * ``` - */ - plugin?: string - - /** - * Error message. - * - * ```js - * error.message //=> 'Unclosed block' - * ``` - */ - reason: string - - /** - * Source code of the broken file. - * - * ```js - * error.source //=> 'a { b {} }' - * error.input.source //=> 'a b { }' - * ``` - */ - source?: string - - stack: string - - /** - * Instantiates a CSS syntax error. Can be instantiated for a single position - * or for a range. - * @param message Error message. - * @param lineOrStartPos If for a single position, the line number, or if for - * a range, the inclusive start position of the error. - * @param columnOrEndPos If for a single position, the column number, or if for - * a range, the exclusive end position of the error. - * @param source Source code of the broken file. - * @param file Absolute path to the broken file. - * @param plugin PostCSS plugin name, if error came from plugin. - */ - constructor( - message: string, - lineOrStartPos?: CssSyntaxError.RangePosition | number, - columnOrEndPos?: CssSyntaxError.RangePosition | number, - source?: string, - file?: string, - plugin?: string - ) - - /** - * Returns a few lines of CSS source that caused the error. - * - * If the CSS has an input source map without `sourceContent`, - * this method will return an empty string. - * - * ```js - * error.showSourceCode() //=> " 4 | } - * // 5 | a { - * // > 6 | bad - * // | ^ - * // 7 | } - * // 8 | b {" - * ``` - * - * @param color Whether arrow will be colored red by terminal - * color codes. By default, PostCSS will detect - * color support by `process.stdout.isTTY` - * and `process.env.NODE_DISABLE_COLORS`. - * @return Few lines of CSS source that caused the error. - */ - showSourceCode(color?: boolean): string - - /** - * Returns error position, message and source code of the broken part. - * - * ```js - * error.toString() //=> "CssSyntaxError: app.css:1:1: Unclosed block - * // > 1 | a { - * // | ^" - * ``` - * - * @return Error position, message and source code. - */ - toString(): string -} - -declare class CssSyntaxError extends CssSyntaxError_ {} - -export = CssSyntaxError diff --git a/node_modules/postcss/lib/css-syntax-error.js b/node_modules/postcss/lib/css-syntax-error.js deleted file mode 100644 index 275a4f6..0000000 --- a/node_modules/postcss/lib/css-syntax-error.js +++ /dev/null @@ -1,133 +0,0 @@ -'use strict' - -let pico = require('picocolors') - -let terminalHighlight = require('./terminal-highlight') - -class CssSyntaxError extends Error { - constructor(message, line, column, source, file, plugin) { - super(message) - this.name = 'CssSyntaxError' - this.reason = message - - if (file) { - this.file = file - } - if (source) { - this.source = source - } - if (plugin) { - this.plugin = plugin - } - if (typeof line !== 'undefined' && typeof column !== 'undefined') { - if (typeof line === 'number') { - this.line = line - this.column = column - } else { - this.line = line.line - this.column = line.column - this.endLine = column.line - this.endColumn = column.column - } - } - - this.setMessage() - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, CssSyntaxError) - } - } - - setMessage() { - this.message = this.plugin ? this.plugin + ': ' : '' - this.message += this.file ? this.file : '' - if (typeof this.line !== 'undefined') { - this.message += ':' + this.line + ':' + this.column - } - this.message += ': ' + this.reason - } - - showSourceCode(color) { - if (!this.source) return '' - - let css = this.source - if (color == null) color = pico.isColorSupported - - let aside = text => text - let mark = text => text - let highlight = text => text - if (color) { - let { bold, gray, red } = pico.createColors(true) - mark = text => bold(red(text)) - aside = text => gray(text) - if (terminalHighlight) { - highlight = text => terminalHighlight(text) - } - } - - let lines = css.split(/\r?\n/) - let start = Math.max(this.line - 3, 0) - let end = Math.min(this.line + 2, lines.length) - let maxWidth = String(end).length - - return lines - .slice(start, end) - .map((line, index) => { - let number = start + 1 + index - let gutter = ' ' + (' ' + number).slice(-maxWidth) + ' | ' - if (number === this.line) { - if (line.length > 160) { - let padding = 20 - let subLineStart = Math.max(0, this.column - padding) - let subLineEnd = Math.max( - this.column + padding, - this.endColumn + padding - ) - let subLine = line.slice(subLineStart, subLineEnd) - - let spacing = - aside(gutter.replace(/\d/g, ' ')) + - line - .slice(0, Math.min(this.column - 1, padding - 1)) - .replace(/[^\t]/g, ' ') - - return ( - mark('>') + - aside(gutter) + - highlight(subLine) + - '\n ' + - spacing + - mark('^') - ) - } - - let spacing = - aside(gutter.replace(/\d/g, ' ')) + - line.slice(0, this.column - 1).replace(/[^\t]/g, ' ') - - return ( - mark('>') + - aside(gutter) + - highlight(line) + - '\n ' + - spacing + - mark('^') - ) - } - - return ' ' + aside(gutter) + highlight(line) - }) - .join('\n') - } - - toString() { - let code = this.showSourceCode() - if (code) { - code = '\n\n' + code + '\n' - } - return this.name + ': ' + this.message + code - } -} - -module.exports = CssSyntaxError -CssSyntaxError.default = CssSyntaxError diff --git a/node_modules/postcss/lib/declaration.d.ts b/node_modules/postcss/lib/declaration.d.ts deleted file mode 100644 index d489b42..0000000 --- a/node_modules/postcss/lib/declaration.d.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { ContainerWithChildren } from './container.js' -import Node from './node.js' - -declare namespace Declaration { - export interface DeclarationRaws extends Record { - /** - * The space symbols before the node. It also stores `*` - * and `_` symbols before the declaration (IE hack). - */ - before?: string - - /** - * The symbols between the property and value for declarations. - */ - between?: string - - /** - * The content of the important statement, if it is not just `!important`. - */ - important?: string - - /** - * Declaration value with comments. - */ - value?: { - raw: string - value: string - } - } - - export interface DeclarationProps { - /** Whether the declaration has an `!important` annotation. */ - important?: boolean - /** Name of the declaration. */ - prop: string - /** Information used to generate byte-to-byte equal node string as it was in the origin input. */ - raws?: DeclarationRaws - /** Value of the declaration. */ - value: string - } - - // eslint-disable-next-line @typescript-eslint/no-use-before-define - export { Declaration_ as default } -} - -/** - * It represents a class that handles - * [CSS declarations](https://developer.mozilla.org/en-US/docs/Web/CSS/Syntax#css_declarations) - * - * ```js - * Once (root, { Declaration }) { - * const color = new Declaration({ prop: 'color', value: 'black' }) - * root.append(color) - * } - * ``` - * - * ```js - * const root = postcss.parse('a { color: black }') - * const decl = root.first?.first - * - * decl.type //=> 'decl' - * decl.toString() //=> ' color: black' - * ``` - */ -declare class Declaration_ extends Node { - parent: ContainerWithChildren | undefined - raws: Declaration.DeclarationRaws - - type: 'decl' - - /** - * It represents a specificity of the declaration. - * - * If true, the CSS declaration will have an - * [important](https://developer.mozilla.org/en-US/docs/Web/CSS/important) - * specifier. - * - * ```js - * const root = postcss.parse('a { color: black !important; color: red }') - * - * root.first.first.important //=> true - * root.first.last.important //=> undefined - * ``` - */ - get important(): boolean - set important(value: boolean) - - /** - * The property name for a CSS declaration. - * - * ```js - * const root = postcss.parse('a { color: black }') - * const decl = root.first.first - * - * decl.prop //=> 'color' - * ``` - */ - get prop(): string - - set prop(value: string) - - /** - * The property value for a CSS declaration. - * - * Any CSS comments inside the value string will be filtered out. - * CSS comments present in the source value will be available in - * the `raws` property. - * - * Assigning new `value` would ignore the comments in `raws` - * property while compiling node to string. - * - * ```js - * const root = postcss.parse('a { color: black }') - * const decl = root.first.first - * - * decl.value //=> 'black' - * ``` - */ - get value(): string - set value(value: string) - - /** - * It represents a getter that returns `true` if a declaration starts with - * `--` or `$`, which are used to declare variables in CSS and SASS/SCSS. - * - * ```js - * const root = postcss.parse(':root { --one: 1 }') - * const one = root.first.first - * - * one.variable //=> true - * ``` - * - * ```js - * const root = postcss.parse('$one: 1') - * const one = root.first - * - * one.variable //=> true - * ``` - */ - get variable(): boolean - constructor(defaults?: Declaration.DeclarationProps) - - assign(overrides: Declaration.DeclarationProps | object): this - clone(overrides?: Partial): this - cloneAfter(overrides?: Partial): this - cloneBefore(overrides?: Partial): this -} - -declare class Declaration extends Declaration_ {} - -export = Declaration diff --git a/node_modules/postcss/lib/declaration.js b/node_modules/postcss/lib/declaration.js deleted file mode 100644 index 65a03aa..0000000 --- a/node_modules/postcss/lib/declaration.js +++ /dev/null @@ -1,24 +0,0 @@ -'use strict' - -let Node = require('./node') - -class Declaration extends Node { - get variable() { - return this.prop.startsWith('--') || this.prop[0] === '$' - } - - constructor(defaults) { - if ( - defaults && - typeof defaults.value !== 'undefined' && - typeof defaults.value !== 'string' - ) { - defaults = { ...defaults, value: String(defaults.value) } - } - super(defaults) - this.type = 'decl' - } -} - -module.exports = Declaration -Declaration.default = Declaration diff --git a/node_modules/postcss/lib/document.d.ts b/node_modules/postcss/lib/document.d.ts deleted file mode 100644 index f9e8063..0000000 --- a/node_modules/postcss/lib/document.d.ts +++ /dev/null @@ -1,69 +0,0 @@ -import Container, { ContainerProps } from './container.js' -import { ProcessOptions } from './postcss.js' -import Result from './result.js' -import Root from './root.js' - -declare namespace Document { - export interface DocumentProps extends ContainerProps { - nodes?: readonly Root[] - - /** - * Information to generate byte-to-byte equal node string as it was - * in the origin input. - * - * Every parser saves its own properties. - */ - raws?: Record - } - - // eslint-disable-next-line @typescript-eslint/no-use-before-define - export { Document_ as default } -} - -/** - * Represents a file and contains all its parsed nodes. - * - * **Experimental:** some aspects of this node could change within minor - * or patch version releases. - * - * ```js - * const document = htmlParser( - * '' - * ) - * document.type //=> 'document' - * document.nodes.length //=> 2 - * ``` - */ -declare class Document_ extends Container { - nodes: Root[] - parent: undefined - type: 'document' - - constructor(defaults?: Document.DocumentProps) - - assign(overrides: Document.DocumentProps | object): this - clone(overrides?: Partial): this - cloneAfter(overrides?: Partial): this - cloneBefore(overrides?: Partial): this - - /** - * Returns a `Result` instance representing the document’s CSS roots. - * - * ```js - * const root1 = postcss.parse(css1, { from: 'a.css' }) - * const root2 = postcss.parse(css2, { from: 'b.css' }) - * const document = postcss.document() - * document.append(root1) - * document.append(root2) - * const result = document.toResult({ to: 'all.css', map: true }) - * ``` - * - * @param opts Options. - * @return Result with current document’s CSS. - */ - toResult(options?: ProcessOptions): Result -} - -declare class Document extends Document_ {} - -export = Document diff --git a/node_modules/postcss/lib/document.js b/node_modules/postcss/lib/document.js deleted file mode 100644 index 4468991..0000000 --- a/node_modules/postcss/lib/document.js +++ /dev/null @@ -1,33 +0,0 @@ -'use strict' - -let Container = require('./container') - -let LazyResult, Processor - -class Document extends Container { - constructor(defaults) { - // type needs to be passed to super, otherwise child roots won't be normalized correctly - super({ type: 'document', ...defaults }) - - if (!this.nodes) { - this.nodes = [] - } - } - - toResult(opts = {}) { - let lazy = new LazyResult(new Processor(), this, opts) - - return lazy.stringify() - } -} - -Document.registerLazyResult = dependant => { - LazyResult = dependant -} - -Document.registerProcessor = dependant => { - Processor = dependant -} - -module.exports = Document -Document.default = Document diff --git a/node_modules/postcss/lib/fromJSON.d.ts b/node_modules/postcss/lib/fromJSON.d.ts deleted file mode 100644 index e1deedb..0000000 --- a/node_modules/postcss/lib/fromJSON.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { JSONHydrator } from './postcss.js' - -interface FromJSON extends JSONHydrator { - default: FromJSON -} - -declare const fromJSON: FromJSON - -export = fromJSON diff --git a/node_modules/postcss/lib/fromJSON.js b/node_modules/postcss/lib/fromJSON.js deleted file mode 100644 index c9ac1a8..0000000 --- a/node_modules/postcss/lib/fromJSON.js +++ /dev/null @@ -1,54 +0,0 @@ -'use strict' - -let AtRule = require('./at-rule') -let Comment = require('./comment') -let Declaration = require('./declaration') -let Input = require('./input') -let PreviousMap = require('./previous-map') -let Root = require('./root') -let Rule = require('./rule') - -function fromJSON(json, inputs) { - if (Array.isArray(json)) return json.map(n => fromJSON(n)) - - let { inputs: ownInputs, ...defaults } = json - if (ownInputs) { - inputs = [] - for (let input of ownInputs) { - let inputHydrated = { ...input, __proto__: Input.prototype } - if (inputHydrated.map) { - inputHydrated.map = { - ...inputHydrated.map, - __proto__: PreviousMap.prototype - } - } - inputs.push(inputHydrated) - } - } - if (defaults.nodes) { - defaults.nodes = json.nodes.map(n => fromJSON(n, inputs)) - } - if (defaults.source) { - let { inputId, ...source } = defaults.source - defaults.source = source - if (inputId != null) { - defaults.source.input = inputs[inputId] - } - } - if (defaults.type === 'root') { - return new Root(defaults) - } else if (defaults.type === 'decl') { - return new Declaration(defaults) - } else if (defaults.type === 'rule') { - return new Rule(defaults) - } else if (defaults.type === 'comment') { - return new Comment(defaults) - } else if (defaults.type === 'atrule') { - return new AtRule(defaults) - } else { - throw new Error('Unknown node type: ' + json.type) - } -} - -module.exports = fromJSON -fromJSON.default = fromJSON diff --git a/node_modules/postcss/lib/input.d.ts b/node_modules/postcss/lib/input.d.ts deleted file mode 100644 index 3207da3..0000000 --- a/node_modules/postcss/lib/input.d.ts +++ /dev/null @@ -1,227 +0,0 @@ -import { CssSyntaxError, ProcessOptions } from './postcss.js' -import PreviousMap from './previous-map.js' - -declare namespace Input { - export interface FilePosition { - /** - * Column of inclusive start position in source file. - */ - column: number - - /** - * Column of exclusive end position in source file. - */ - endColumn?: number - - /** - * Line of exclusive end position in source file. - */ - endLine?: number - - /** - * Offset of exclusive end position in source file. - */ - endOffset?: number - - /** - * Absolute path to the source file. - */ - file?: string - - /** - * Line of inclusive start position in source file. - */ - line: number - - /** - * Offset of inclusive start position in source file. - */ - offset: number - - /** - * Source code. - */ - source?: string - - /** - * URL for the source file. - */ - url: string - } - - // eslint-disable-next-line @typescript-eslint/no-use-before-define - export { Input_ as default } -} - -/** - * Represents the source CSS. - * - * ```js - * const root = postcss.parse(css, { from: file }) - * const input = root.source.input - * ``` - */ -declare class Input_ { - /** - * Input CSS source. - * - * ```js - * const input = postcss.parse('a{}', { from: file }).input - * input.css //=> "a{}" - * ``` - */ - css: string - - /** - * Input source with support for non-CSS documents. - * - * ```js - * const input = postcss.parse('a{}', { from: file, document: '' }).input - * input.document //=> "" - * input.css //=> "a{}" - * ``` - */ - document: string - - /** - * The absolute path to the CSS source file defined - * with the `from` option. - * - * ```js - * const root = postcss.parse(css, { from: 'a.css' }) - * root.source.input.file //=> '/home/ai/a.css' - * ``` - */ - file?: string - - /** - * The flag to indicate whether or not the source code has Unicode BOM. - */ - hasBOM: boolean - - /** - * The unique ID of the CSS source. It will be created if `from` option - * is not provided (because PostCSS does not know the file path). - * - * ```js - * const root = postcss.parse(css) - * root.source.input.file //=> undefined - * root.source.input.id //=> "" - * ``` - */ - id?: string - - /** - * The input source map passed from a compilation step before PostCSS - * (for example, from Sass compiler). - * - * ```js - * root.source.input.map.consumer().sources //=> ['a.sass'] - * ``` - */ - map: PreviousMap - - /** - * The CSS source identifier. Contains `Input#file` if the user - * set the `from` option, or `Input#id` if they did not. - * - * ```js - * const root = postcss.parse(css, { from: 'a.css' }) - * root.source.input.from //=> "/home/ai/a.css" - * - * const root = postcss.parse(css) - * root.source.input.from //=> "" - * ``` - */ - get from(): string - - /** - * @param css Input CSS source. - * @param opts Process options. - */ - constructor(css: string, opts?: ProcessOptions) - - /** - * Returns `CssSyntaxError` with information about the error and its position. - */ - error( - message: string, - start: - | { - column: number - line: number - } - | { - offset: number - }, - end: - | { - column: number - line: number - } - | { - offset: number - }, - opts?: { plugin?: CssSyntaxError['plugin'] } - ): CssSyntaxError - error( - message: string, - line: number, - column: number, - opts?: { plugin?: CssSyntaxError['plugin'] } - ): CssSyntaxError - error( - message: string, - offset: number, - opts?: { plugin?: CssSyntaxError['plugin'] } - ): CssSyntaxError - - /** - * Converts source line and column to offset. - * - * @param line Source line. - * @param column Source column. - * @return Source offset. - */ - fromLineAndColumn(line: number, column: number): number - - /** - * Converts source offset to line and column. - * - * @param offset Source offset. - */ - fromOffset(offset: number): { col: number; line: number } | null - - /** - * Reads the input source map and returns a symbol position - * in the input source (e.g., in a Sass file that was compiled - * to CSS before being passed to PostCSS). Optionally takes an - * end position, exclusive. - * - * ```js - * root.source.input.origin(1, 1) //=> { file: 'a.css', line: 3, column: 1 } - * root.source.input.origin(1, 1, 1, 4) - * //=> { file: 'a.css', line: 3, column: 1, endLine: 3, endColumn: 4 } - * ``` - * - * @param line Line for inclusive start position in input CSS. - * @param column Column for inclusive start position in input CSS. - * @param endLine Line for exclusive end position in input CSS. - * @param endColumn Column for exclusive end position in input CSS. - * - * @return Position in input source. - */ - origin( - line: number, - column: number, - endLine?: number, - endColumn?: number - ): false | Input.FilePosition - - /** Converts this to a JSON-friendly object representation. */ - toJSON(): object -} - -declare class Input extends Input_ {} - -export = Input diff --git a/node_modules/postcss/lib/input.js b/node_modules/postcss/lib/input.js deleted file mode 100644 index bb0ccf5..0000000 --- a/node_modules/postcss/lib/input.js +++ /dev/null @@ -1,265 +0,0 @@ -'use strict' - -let { nanoid } = require('nanoid/non-secure') -let { isAbsolute, resolve } = require('path') -let { SourceMapConsumer, SourceMapGenerator } = require('source-map-js') -let { fileURLToPath, pathToFileURL } = require('url') - -let CssSyntaxError = require('./css-syntax-error') -let PreviousMap = require('./previous-map') -let terminalHighlight = require('./terminal-highlight') - -let lineToIndexCache = Symbol('lineToIndexCache') - -let sourceMapAvailable = Boolean(SourceMapConsumer && SourceMapGenerator) -let pathAvailable = Boolean(resolve && isAbsolute) - -function getLineToIndex(input) { - if (input[lineToIndexCache]) return input[lineToIndexCache] - let lines = input.css.split('\n') - let lineToIndex = new Array(lines.length) - let prevIndex = 0 - - for (let i = 0, l = lines.length; i < l; i++) { - lineToIndex[i] = prevIndex - prevIndex += lines[i].length + 1 - } - - input[lineToIndexCache] = lineToIndex - return lineToIndex -} - -class Input { - get from() { - return this.file || this.id - } - - constructor(css, opts = {}) { - if ( - css === null || - typeof css === 'undefined' || - (typeof css === 'object' && !css.toString) - ) { - throw new Error(`PostCSS received ${css} instead of CSS string`) - } - - this.css = css.toString() - - if (this.css[0] === '\uFEFF' || this.css[0] === '\uFFFE') { - this.hasBOM = true - this.css = this.css.slice(1) - } else { - this.hasBOM = false - } - - this.document = this.css - if (opts.document) this.document = opts.document.toString() - - if (opts.from) { - if ( - !pathAvailable || - /^\w+:\/\//.test(opts.from) || - isAbsolute(opts.from) - ) { - this.file = opts.from - } else { - this.file = resolve(opts.from) - } - } - - if (pathAvailable && sourceMapAvailable) { - let map = new PreviousMap(this.css, opts) - if (map.text) { - this.map = map - let file = map.consumer().file - if (!this.file && file) this.file = this.mapResolve(file) - } - } - - if (!this.file) { - this.id = '' - } - if (this.map) this.map.file = this.from - } - - error(message, line, column, opts = {}) { - let endColumn, endLine, endOffset, offset, result - - if (line && typeof line === 'object') { - let start = line - let end = column - if (typeof start.offset === 'number') { - offset = start.offset - let pos = this.fromOffset(offset) - line = pos.line - column = pos.col - } else { - line = start.line - column = start.column - offset = this.fromLineAndColumn(line, column) - } - if (typeof end.offset === 'number') { - endOffset = end.offset - let pos = this.fromOffset(endOffset) - endLine = pos.line - endColumn = pos.col - } else { - endLine = end.line - endColumn = end.column - endOffset = this.fromLineAndColumn(end.line, end.column) - } - } else if (!column) { - offset = line - let pos = this.fromOffset(offset) - line = pos.line - column = pos.col - } else { - offset = this.fromLineAndColumn(line, column) - } - - let origin = this.origin(line, column, endLine, endColumn) - if (origin) { - result = new CssSyntaxError( - message, - origin.endLine === undefined - ? origin.line - : { column: origin.column, line: origin.line }, - origin.endLine === undefined - ? origin.column - : { column: origin.endColumn, line: origin.endLine }, - origin.source, - origin.file, - opts.plugin - ) - } else { - result = new CssSyntaxError( - message, - endLine === undefined ? line : { column, line }, - endLine === undefined ? column : { column: endColumn, line: endLine }, - this.css, - this.file, - opts.plugin - ) - } - - result.input = { column, endColumn, endLine, endOffset, line, offset, source: this.css } - if (this.file) { - if (pathToFileURL) { - result.input.url = pathToFileURL(this.file).toString() - } - result.input.file = this.file - } - - return result - } - - fromLineAndColumn(line, column) { - let lineToIndex = getLineToIndex(this) - let index = lineToIndex[line - 1] - return index + column - 1 - } - - fromOffset(offset) { - let lineToIndex = getLineToIndex(this) - let lastLine = lineToIndex[lineToIndex.length - 1] - - let min = 0 - if (offset >= lastLine) { - min = lineToIndex.length - 1 - } else { - let max = lineToIndex.length - 2 - let mid - while (min < max) { - mid = min + ((max - min) >> 1) - if (offset < lineToIndex[mid]) { - max = mid - 1 - } else if (offset >= lineToIndex[mid + 1]) { - min = mid + 1 - } else { - min = mid - break - } - } - } - return { - col: offset - lineToIndex[min] + 1, - line: min + 1 - } - } - - mapResolve(file) { - if (/^\w+:\/\//.test(file)) { - return file - } - return resolve(this.map.consumer().sourceRoot || this.map.root || '.', file) - } - - origin(line, column, endLine, endColumn) { - if (!this.map) return false - let consumer = this.map.consumer() - - let from = consumer.originalPositionFor({ column, line }) - if (!from.source) return false - - let to - if (typeof endLine === 'number') { - to = consumer.originalPositionFor({ column: endColumn, line: endLine }) - } - - let fromUrl - - if (isAbsolute(from.source)) { - fromUrl = pathToFileURL(from.source) - } else { - fromUrl = new URL( - from.source, - this.map.consumer().sourceRoot || pathToFileURL(this.map.mapFile) - ) - } - - let result = { - column: from.column, - endColumn: to && to.column, - endLine: to && to.line, - line: from.line, - url: fromUrl.toString() - } - - if (fromUrl.protocol === 'file:') { - if (fileURLToPath) { - result.file = fileURLToPath(fromUrl) - } else { - /* c8 ignore next 2 */ - throw new Error(`file: protocol is not available in this PostCSS build`) - } - } - - let source = consumer.sourceContentFor(from.source) - if (source) result.source = source - - return result - } - - toJSON() { - let json = {} - for (let name of ['hasBOM', 'css', 'file', 'id']) { - if (this[name] != null) { - json[name] = this[name] - } - } - if (this.map) { - json.map = { ...this.map } - if (json.map.consumerCache) { - json.map.consumerCache = undefined - } - } - return json - } -} - -module.exports = Input -Input.default = Input - -if (terminalHighlight && terminalHighlight.registerInput) { - terminalHighlight.registerInput(Input) -} diff --git a/node_modules/postcss/lib/lazy-result.d.ts b/node_modules/postcss/lib/lazy-result.d.ts deleted file mode 100644 index 2eb7279..0000000 --- a/node_modules/postcss/lib/lazy-result.d.ts +++ /dev/null @@ -1,190 +0,0 @@ -import Document from './document.js' -import { SourceMap } from './postcss.js' -import Processor from './processor.js' -import Result, { Message, ResultOptions } from './result.js' -import Root from './root.js' -import Warning from './warning.js' - -declare namespace LazyResult { - // eslint-disable-next-line @typescript-eslint/no-use-before-define - export { LazyResult_ as default } -} - -/** - * A Promise proxy for the result of PostCSS transformations. - * - * A `LazyResult` instance is returned by `Processor#process`. - * - * ```js - * const lazy = postcss([autoprefixer]).process(css) - * ``` - */ -declare class LazyResult_ - implements PromiseLike> -{ - /** - * Processes input CSS through synchronous and asynchronous plugins - * and calls onRejected for each error thrown in any plugin. - * - * It implements standard Promise API. - * - * ```js - * postcss([autoprefixer]).process(css).then(result => { - * console.log(result.css) - * }).catch(error => { - * console.error(error) - * }) - * ``` - */ - catch: Promise>['catch'] - - /** - * Processes input CSS through synchronous and asynchronous plugins - * and calls onFinally on any error or when all plugins will finish work. - * - * It implements standard Promise API. - * - * ```js - * postcss([autoprefixer]).process(css).finally(() => { - * console.log('processing ended') - * }) - * ``` - */ - finally: Promise>['finally'] - - /** - * Processes input CSS through synchronous and asynchronous plugins - * and calls `onFulfilled` with a Result instance. If a plugin throws - * an error, the `onRejected` callback will be executed. - * - * It implements standard Promise API. - * - * ```js - * postcss([autoprefixer]).process(css, { from: cssPath }).then(result => { - * console.log(result.css) - * }) - * ``` - */ - then: Promise>['then'] - - /** - * An alias for the `css` property. Use it with syntaxes - * that generate non-CSS output. - * - * This property will only work with synchronous plugins. - * If the processor contains any asynchronous plugins - * it will throw an error. - * - * PostCSS runners should always use `LazyResult#then`. - */ - get content(): string - - /** - * Processes input CSS through synchronous plugins, converts `Root` - * to a CSS string and returns `Result#css`. - * - * This property will only work with synchronous plugins. - * If the processor contains any asynchronous plugins - * it will throw an error. - * - * PostCSS runners should always use `LazyResult#then`. - */ - get css(): string - - /** - * Processes input CSS through synchronous plugins - * and returns `Result#map`. - * - * This property will only work with synchronous plugins. - * If the processor contains any asynchronous plugins - * it will throw an error. - * - * PostCSS runners should always use `LazyResult#then`. - */ - get map(): SourceMap - - /** - * Processes input CSS through synchronous plugins - * and returns `Result#messages`. - * - * This property will only work with synchronous plugins. If the processor - * contains any asynchronous plugins it will throw an error. - * - * PostCSS runners should always use `LazyResult#then`. - */ - get messages(): Message[] - - /** - * Options from the `Processor#process` call. - */ - get opts(): ResultOptions - - /** - * Returns a `Processor` instance, which will be used - * for CSS transformations. - */ - get processor(): Processor - - /** - * Processes input CSS through synchronous plugins - * and returns `Result#root`. - * - * This property will only work with synchronous plugins. If the processor - * contains any asynchronous plugins it will throw an error. - * - * PostCSS runners should always use `LazyResult#then`. - */ - get root(): RootNode - - /** - * Returns the default string description of an object. - * Required to implement the Promise interface. - */ - get [Symbol.toStringTag](): string - - /** - * @param processor Processor used for this transformation. - * @param css CSS to parse and transform. - * @param opts Options from the `Processor#process` or `Root#toResult`. - */ - constructor(processor: Processor, css: string, opts: ResultOptions) - - /** - * Run plugin in async way and return `Result`. - * - * @return Result with output content. - */ - async(): Promise> - - /** - * Run plugin in sync way and return `Result`. - * - * @return Result with output content. - */ - sync(): Result - - /** - * Alias for the `LazyResult#css` property. - * - * ```js - * lazy + '' === lazy.css - * ``` - * - * @return Output CSS. - */ - toString(): string - - /** - * Processes input CSS through synchronous plugins - * and calls `Result#warnings`. - * - * @return Warnings from plugins. - */ - warnings(): Warning[] -} - -declare class LazyResult< - RootNode = Document | Root -> extends LazyResult_ {} - -export = LazyResult diff --git a/node_modules/postcss/lib/lazy-result.js b/node_modules/postcss/lib/lazy-result.js deleted file mode 100644 index 1ea52b8..0000000 --- a/node_modules/postcss/lib/lazy-result.js +++ /dev/null @@ -1,550 +0,0 @@ -'use strict' - -let Container = require('./container') -let Document = require('./document') -let MapGenerator = require('./map-generator') -let parse = require('./parse') -let Result = require('./result') -let Root = require('./root') -let stringify = require('./stringify') -let { isClean, my } = require('./symbols') -let warnOnce = require('./warn-once') - -const TYPE_TO_CLASS_NAME = { - atrule: 'AtRule', - comment: 'Comment', - decl: 'Declaration', - document: 'Document', - root: 'Root', - rule: 'Rule' -} - -const PLUGIN_PROPS = { - AtRule: true, - AtRuleExit: true, - Comment: true, - CommentExit: true, - Declaration: true, - DeclarationExit: true, - Document: true, - DocumentExit: true, - Once: true, - OnceExit: true, - postcssPlugin: true, - prepare: true, - Root: true, - RootExit: true, - Rule: true, - RuleExit: true -} - -const NOT_VISITORS = { - Once: true, - postcssPlugin: true, - prepare: true -} - -const CHILDREN = 0 - -function isPromise(obj) { - return typeof obj === 'object' && typeof obj.then === 'function' -} - -function getEvents(node) { - let key = false - let type = TYPE_TO_CLASS_NAME[node.type] - if (node.type === 'decl') { - key = node.prop.toLowerCase() - } else if (node.type === 'atrule') { - key = node.name.toLowerCase() - } - - if (key && node.append) { - return [ - type, - type + '-' + key, - CHILDREN, - type + 'Exit', - type + 'Exit-' + key - ] - } else if (key) { - return [type, type + '-' + key, type + 'Exit', type + 'Exit-' + key] - } else if (node.append) { - return [type, CHILDREN, type + 'Exit'] - } else { - return [type, type + 'Exit'] - } -} - -function toStack(node) { - let events - if (node.type === 'document') { - events = ['Document', CHILDREN, 'DocumentExit'] - } else if (node.type === 'root') { - events = ['Root', CHILDREN, 'RootExit'] - } else { - events = getEvents(node) - } - - return { - eventIndex: 0, - events, - iterator: 0, - node, - visitorIndex: 0, - visitors: [] - } -} - -function cleanMarks(node) { - node[isClean] = false - if (node.nodes) node.nodes.forEach(i => cleanMarks(i)) - return node -} - -let postcss = {} - -class LazyResult { - get content() { - return this.stringify().content - } - - get css() { - return this.stringify().css - } - - get map() { - return this.stringify().map - } - - get messages() { - return this.sync().messages - } - - get opts() { - return this.result.opts - } - - get processor() { - return this.result.processor - } - - get root() { - return this.sync().root - } - - get [Symbol.toStringTag]() { - return 'LazyResult' - } - - constructor(processor, css, opts) { - this.stringified = false - this.processed = false - - let root - if ( - typeof css === 'object' && - css !== null && - (css.type === 'root' || css.type === 'document') - ) { - root = cleanMarks(css) - } else if (css instanceof LazyResult || css instanceof Result) { - root = cleanMarks(css.root) - if (css.map) { - if (typeof opts.map === 'undefined') opts.map = {} - if (!opts.map.inline) opts.map.inline = false - opts.map.prev = css.map - } - } else { - let parser = parse - if (opts.syntax) parser = opts.syntax.parse - if (opts.parser) parser = opts.parser - if (parser.parse) parser = parser.parse - - try { - root = parser(css, opts) - } catch (error) { - this.processed = true - this.error = error - } - - if (root && !root[my]) { - /* c8 ignore next 2 */ - Container.rebuild(root) - } - } - - this.result = new Result(processor, root, opts) - this.helpers = { ...postcss, postcss, result: this.result } - this.plugins = this.processor.plugins.map(plugin => { - if (typeof plugin === 'object' && plugin.prepare) { - return { ...plugin, ...plugin.prepare(this.result) } - } else { - return plugin - } - }) - } - - async() { - if (this.error) return Promise.reject(this.error) - if (this.processed) return Promise.resolve(this.result) - if (!this.processing) { - this.processing = this.runAsync() - } - return this.processing - } - - catch(onRejected) { - return this.async().catch(onRejected) - } - - finally(onFinally) { - return this.async().then(onFinally, onFinally) - } - - getAsyncError() { - throw new Error('Use process(css).then(cb) to work with async plugins') - } - - handleError(error, node) { - let plugin = this.result.lastPlugin - try { - if (node) node.addToError(error) - this.error = error - if (error.name === 'CssSyntaxError' && !error.plugin) { - error.plugin = plugin.postcssPlugin - error.setMessage() - } else if (plugin.postcssVersion) { - if (process.env.NODE_ENV !== 'production') { - let pluginName = plugin.postcssPlugin - let pluginVer = plugin.postcssVersion - let runtimeVer = this.result.processor.version - let a = pluginVer.split('.') - let b = runtimeVer.split('.') - - if (a[0] !== b[0] || parseInt(a[1]) > parseInt(b[1])) { - // eslint-disable-next-line no-console - console.error( - 'Unknown error from PostCSS plugin. Your current PostCSS ' + - 'version is ' + - runtimeVer + - ', but ' + - pluginName + - ' uses ' + - pluginVer + - '. Perhaps this is the source of the error below.' - ) - } - } - } - } catch (err) { - /* c8 ignore next 3 */ - // eslint-disable-next-line no-console - if (console && console.error) console.error(err) - } - return error - } - - prepareVisitors() { - this.listeners = {} - let add = (plugin, type, cb) => { - if (!this.listeners[type]) this.listeners[type] = [] - this.listeners[type].push([plugin, cb]) - } - for (let plugin of this.plugins) { - if (typeof plugin === 'object') { - for (let event in plugin) { - if (!PLUGIN_PROPS[event] && /^[A-Z]/.test(event)) { - throw new Error( - `Unknown event ${event} in ${plugin.postcssPlugin}. ` + - `Try to update PostCSS (${this.processor.version} now).` - ) - } - if (!NOT_VISITORS[event]) { - if (typeof plugin[event] === 'object') { - for (let filter in plugin[event]) { - if (filter === '*') { - add(plugin, event, plugin[event][filter]) - } else { - add( - plugin, - event + '-' + filter.toLowerCase(), - plugin[event][filter] - ) - } - } - } else if (typeof plugin[event] === 'function') { - add(plugin, event, plugin[event]) - } - } - } - } - } - this.hasListener = Object.keys(this.listeners).length > 0 - } - - async runAsync() { - this.plugin = 0 - for (let i = 0; i < this.plugins.length; i++) { - let plugin = this.plugins[i] - let promise = this.runOnRoot(plugin) - if (isPromise(promise)) { - try { - await promise - } catch (error) { - throw this.handleError(error) - } - } - } - - this.prepareVisitors() - if (this.hasListener) { - let root = this.result.root - while (!root[isClean]) { - root[isClean] = true - let stack = [toStack(root)] - while (stack.length > 0) { - let promise = this.visitTick(stack) - if (isPromise(promise)) { - try { - await promise - } catch (e) { - let node = stack[stack.length - 1].node - throw this.handleError(e, node) - } - } - } - } - - if (this.listeners.OnceExit) { - for (let [plugin, visitor] of this.listeners.OnceExit) { - this.result.lastPlugin = plugin - try { - if (root.type === 'document') { - let roots = root.nodes.map(subRoot => - visitor(subRoot, this.helpers) - ) - - await Promise.all(roots) - } else { - await visitor(root, this.helpers) - } - } catch (e) { - throw this.handleError(e) - } - } - } - } - - this.processed = true - return this.stringify() - } - - runOnRoot(plugin) { - this.result.lastPlugin = plugin - try { - if (typeof plugin === 'object' && plugin.Once) { - if (this.result.root.type === 'document') { - let roots = this.result.root.nodes.map(root => - plugin.Once(root, this.helpers) - ) - - if (isPromise(roots[0])) { - return Promise.all(roots) - } - - return roots - } - - return plugin.Once(this.result.root, this.helpers) - } else if (typeof plugin === 'function') { - return plugin(this.result.root, this.result) - } - } catch (error) { - throw this.handleError(error) - } - } - - stringify() { - if (this.error) throw this.error - if (this.stringified) return this.result - this.stringified = true - - this.sync() - - let opts = this.result.opts - let str = stringify - if (opts.syntax) str = opts.syntax.stringify - if (opts.stringifier) str = opts.stringifier - if (str.stringify) str = str.stringify - - let map = new MapGenerator(str, this.result.root, this.result.opts) - let data = map.generate() - this.result.css = data[0] - this.result.map = data[1] - - return this.result - } - - sync() { - if (this.error) throw this.error - if (this.processed) return this.result - this.processed = true - - if (this.processing) { - throw this.getAsyncError() - } - - for (let plugin of this.plugins) { - let promise = this.runOnRoot(plugin) - if (isPromise(promise)) { - throw this.getAsyncError() - } - } - - this.prepareVisitors() - if (this.hasListener) { - let root = this.result.root - while (!root[isClean]) { - root[isClean] = true - this.walkSync(root) - } - if (this.listeners.OnceExit) { - if (root.type === 'document') { - for (let subRoot of root.nodes) { - this.visitSync(this.listeners.OnceExit, subRoot) - } - } else { - this.visitSync(this.listeners.OnceExit, root) - } - } - } - - return this.result - } - - then(onFulfilled, onRejected) { - if (process.env.NODE_ENV !== 'production') { - if (!('from' in this.opts)) { - warnOnce( - 'Without `from` option PostCSS could generate wrong source map ' + - 'and will not find Browserslist config. Set it to CSS file path ' + - 'or to `undefined` to prevent this warning.' - ) - } - } - return this.async().then(onFulfilled, onRejected) - } - - toString() { - return this.css - } - - visitSync(visitors, node) { - for (let [plugin, visitor] of visitors) { - this.result.lastPlugin = plugin - let promise - try { - promise = visitor(node, this.helpers) - } catch (e) { - throw this.handleError(e, node.proxyOf) - } - if (node.type !== 'root' && node.type !== 'document' && !node.parent) { - return true - } - if (isPromise(promise)) { - throw this.getAsyncError() - } - } - } - - visitTick(stack) { - let visit = stack[stack.length - 1] - let { node, visitors } = visit - - if (node.type !== 'root' && node.type !== 'document' && !node.parent) { - stack.pop() - return - } - - if (visitors.length > 0 && visit.visitorIndex < visitors.length) { - let [plugin, visitor] = visitors[visit.visitorIndex] - visit.visitorIndex += 1 - if (visit.visitorIndex === visitors.length) { - visit.visitors = [] - visit.visitorIndex = 0 - } - this.result.lastPlugin = plugin - try { - return visitor(node.toProxy(), this.helpers) - } catch (e) { - throw this.handleError(e, node) - } - } - - if (visit.iterator !== 0) { - let iterator = visit.iterator - let child - while ((child = node.nodes[node.indexes[iterator]])) { - node.indexes[iterator] += 1 - if (!child[isClean]) { - child[isClean] = true - stack.push(toStack(child)) - return - } - } - visit.iterator = 0 - delete node.indexes[iterator] - } - - let events = visit.events - while (visit.eventIndex < events.length) { - let event = events[visit.eventIndex] - visit.eventIndex += 1 - if (event === CHILDREN) { - if (node.nodes && node.nodes.length) { - node[isClean] = true - visit.iterator = node.getIterator() - } - return - } else if (this.listeners[event]) { - visit.visitors = this.listeners[event] - return - } - } - stack.pop() - } - - walkSync(node) { - node[isClean] = true - let events = getEvents(node) - for (let event of events) { - if (event === CHILDREN) { - if (node.nodes) { - node.each(child => { - if (!child[isClean]) this.walkSync(child) - }) - } - } else { - let visitors = this.listeners[event] - if (visitors) { - if (this.visitSync(visitors, node.toProxy())) return - } - } - } - } - - warnings() { - return this.sync().warnings() - } -} - -LazyResult.registerPostcss = dependant => { - postcss = dependant -} - -module.exports = LazyResult -LazyResult.default = LazyResult - -Root.registerLazyResult(LazyResult) -Document.registerLazyResult(LazyResult) diff --git a/node_modules/postcss/lib/list.d.ts b/node_modules/postcss/lib/list.d.ts deleted file mode 100644 index e262ad3..0000000 --- a/node_modules/postcss/lib/list.d.ts +++ /dev/null @@ -1,60 +0,0 @@ -declare namespace list { - type List = { - /** - * Safely splits comma-separated values (such as those for `transition-*` - * and `background` properties). - * - * ```js - * Once (root, { list }) { - * list.comma('black, linear-gradient(white, black)') - * //=> ['black', 'linear-gradient(white, black)'] - * } - * ``` - * - * @param str Comma-separated values. - * @return Split values. - */ - comma(str: string): string[] - - default: List - - /** - * Safely splits space-separated values (such as those for `background`, - * `border-radius`, and other shorthand properties). - * - * ```js - * Once (root, { list }) { - * list.space('1px calc(10% + 1px)') //=> ['1px', 'calc(10% + 1px)'] - * } - * ``` - * - * @param str Space-separated values. - * @return Split values. - */ - space(str: string): string[] - - /** - * Safely splits values. - * - * ```js - * Once (root, { list }) { - * list.split('1px calc(10% + 1px)', [' ', '\n', '\t']) //=> ['1px', 'calc(10% + 1px)'] - * } - * ``` - * - * @param string separated values. - * @param separators array of separators. - * @param last boolean indicator. - * @return Split values. - */ - split( - string: string, - separators: readonly string[], - last: boolean - ): string[] - } -} - -declare const list: list.List - -export = list diff --git a/node_modules/postcss/lib/list.js b/node_modules/postcss/lib/list.js deleted file mode 100644 index 1b31f98..0000000 --- a/node_modules/postcss/lib/list.js +++ /dev/null @@ -1,58 +0,0 @@ -'use strict' - -let list = { - comma(string) { - return list.split(string, [','], true) - }, - - space(string) { - let spaces = [' ', '\n', '\t'] - return list.split(string, spaces) - }, - - split(string, separators, last) { - let array = [] - let current = '' - let split = false - - let func = 0 - let inQuote = false - let prevQuote = '' - let escape = false - - for (let letter of string) { - if (escape) { - escape = false - } else if (letter === '\\') { - escape = true - } else if (inQuote) { - if (letter === prevQuote) { - inQuote = false - } - } else if (letter === '"' || letter === "'") { - inQuote = true - prevQuote = letter - } else if (letter === '(') { - func += 1 - } else if (letter === ')') { - if (func > 0) func -= 1 - } else if (func === 0) { - if (separators.includes(letter)) split = true - } - - if (split) { - if (current !== '') array.push(current.trim()) - current = '' - split = false - } else { - current += letter - } - } - - if (last || current !== '') array.push(current.trim()) - return array - } -} - -module.exports = list -list.default = list diff --git a/node_modules/postcss/lib/map-generator.js b/node_modules/postcss/lib/map-generator.js deleted file mode 100644 index 89069d3..0000000 --- a/node_modules/postcss/lib/map-generator.js +++ /dev/null @@ -1,368 +0,0 @@ -'use strict' - -let { dirname, relative, resolve, sep } = require('path') -let { SourceMapConsumer, SourceMapGenerator } = require('source-map-js') -let { pathToFileURL } = require('url') - -let Input = require('./input') - -let sourceMapAvailable = Boolean(SourceMapConsumer && SourceMapGenerator) -let pathAvailable = Boolean(dirname && resolve && relative && sep) - -class MapGenerator { - constructor(stringify, root, opts, cssString) { - this.stringify = stringify - this.mapOpts = opts.map || {} - this.root = root - this.opts = opts - this.css = cssString - this.originalCSS = cssString - this.usesFileUrls = !this.mapOpts.from && this.mapOpts.absolute - - this.memoizedFileURLs = new Map() - this.memoizedPaths = new Map() - this.memoizedURLs = new Map() - } - - addAnnotation() { - let content - - if (this.isInline()) { - content = - 'data:application/json;base64,' + this.toBase64(this.map.toString()) - } else if (typeof this.mapOpts.annotation === 'string') { - content = this.mapOpts.annotation - } else if (typeof this.mapOpts.annotation === 'function') { - content = this.mapOpts.annotation(this.opts.to, this.root) - } else { - content = this.outputFile() + '.map' - } - let eol = '\n' - if (this.css.includes('\r\n')) eol = '\r\n' - - this.css += eol + '/*# sourceMappingURL=' + content + ' */' - } - - applyPrevMaps() { - for (let prev of this.previous()) { - let from = this.toUrl(this.path(prev.file)) - let root = prev.root || dirname(prev.file) - let map - - if (this.mapOpts.sourcesContent === false) { - map = new SourceMapConsumer(prev.text) - if (map.sourcesContent) { - map.sourcesContent = null - } - } else { - map = prev.consumer() - } - - this.map.applySourceMap(map, from, this.toUrl(this.path(root))) - } - } - - clearAnnotation() { - if (this.mapOpts.annotation === false) return - - if (this.root) { - let node - for (let i = this.root.nodes.length - 1; i >= 0; i--) { - node = this.root.nodes[i] - if (node.type !== 'comment') continue - if (node.text.startsWith('# sourceMappingURL=')) { - this.root.removeChild(i) - } - } - } else if (this.css) { - this.css = this.css.replace(/\n*\/\*#[\S\s]*?\*\/$/gm, '') - } - } - - generate() { - this.clearAnnotation() - if (pathAvailable && sourceMapAvailable && this.isMap()) { - return this.generateMap() - } else { - let result = '' - this.stringify(this.root, i => { - result += i - }) - return [result] - } - } - - generateMap() { - if (this.root) { - this.generateString() - } else if (this.previous().length === 1) { - let prev = this.previous()[0].consumer() - prev.file = this.outputFile() - this.map = SourceMapGenerator.fromSourceMap(prev, { - ignoreInvalidMapping: true - }) - } else { - this.map = new SourceMapGenerator({ - file: this.outputFile(), - ignoreInvalidMapping: true - }) - this.map.addMapping({ - generated: { column: 0, line: 1 }, - original: { column: 0, line: 1 }, - source: this.opts.from - ? this.toUrl(this.path(this.opts.from)) - : '' - }) - } - - if (this.isSourcesContent()) this.setSourcesContent() - if (this.root && this.previous().length > 0) this.applyPrevMaps() - if (this.isAnnotation()) this.addAnnotation() - - if (this.isInline()) { - return [this.css] - } else { - return [this.css, this.map] - } - } - - generateString() { - this.css = '' - this.map = new SourceMapGenerator({ - file: this.outputFile(), - ignoreInvalidMapping: true - }) - - let line = 1 - let column = 1 - - let noSource = '' - let mapping = { - generated: { column: 0, line: 0 }, - original: { column: 0, line: 0 }, - source: '' - } - - let last, lines - this.stringify(this.root, (str, node, type) => { - this.css += str - - if (node && type !== 'end') { - mapping.generated.line = line - mapping.generated.column = column - 1 - if (node.source && node.source.start) { - mapping.source = this.sourcePath(node) - mapping.original.line = node.source.start.line - mapping.original.column = node.source.start.column - 1 - this.map.addMapping(mapping) - } else { - mapping.source = noSource - mapping.original.line = 1 - mapping.original.column = 0 - this.map.addMapping(mapping) - } - } - - lines = str.match(/\n/g) - if (lines) { - line += lines.length - last = str.lastIndexOf('\n') - column = str.length - last - } else { - column += str.length - } - - if (node && type !== 'start') { - let p = node.parent || { raws: {} } - let childless = - node.type === 'decl' || (node.type === 'atrule' && !node.nodes) - if (!childless || node !== p.last || p.raws.semicolon) { - if (node.source && node.source.end) { - mapping.source = this.sourcePath(node) - mapping.original.line = node.source.end.line - mapping.original.column = node.source.end.column - 1 - mapping.generated.line = line - mapping.generated.column = column - 2 - this.map.addMapping(mapping) - } else { - mapping.source = noSource - mapping.original.line = 1 - mapping.original.column = 0 - mapping.generated.line = line - mapping.generated.column = column - 1 - this.map.addMapping(mapping) - } - } - } - }) - } - - isAnnotation() { - if (this.isInline()) { - return true - } - if (typeof this.mapOpts.annotation !== 'undefined') { - return this.mapOpts.annotation - } - if (this.previous().length) { - return this.previous().some(i => i.annotation) - } - return true - } - - isInline() { - if (typeof this.mapOpts.inline !== 'undefined') { - return this.mapOpts.inline - } - - let annotation = this.mapOpts.annotation - if (typeof annotation !== 'undefined' && annotation !== true) { - return false - } - - if (this.previous().length) { - return this.previous().some(i => i.inline) - } - return true - } - - isMap() { - if (typeof this.opts.map !== 'undefined') { - return !!this.opts.map - } - return this.previous().length > 0 - } - - isSourcesContent() { - if (typeof this.mapOpts.sourcesContent !== 'undefined') { - return this.mapOpts.sourcesContent - } - if (this.previous().length) { - return this.previous().some(i => i.withContent()) - } - return true - } - - outputFile() { - if (this.opts.to) { - return this.path(this.opts.to) - } else if (this.opts.from) { - return this.path(this.opts.from) - } else { - return 'to.css' - } - } - - path(file) { - if (this.mapOpts.absolute) return file - if (file.charCodeAt(0) === 60 /* `<` */) return file - if (/^\w+:\/\//.test(file)) return file - let cached = this.memoizedPaths.get(file) - if (cached) return cached - - let from = this.opts.to ? dirname(this.opts.to) : '.' - - if (typeof this.mapOpts.annotation === 'string') { - from = dirname(resolve(from, this.mapOpts.annotation)) - } - - let path = relative(from, file) - this.memoizedPaths.set(file, path) - - return path - } - - previous() { - if (!this.previousMaps) { - this.previousMaps = [] - if (this.root) { - this.root.walk(node => { - if (node.source && node.source.input.map) { - let map = node.source.input.map - if (!this.previousMaps.includes(map)) { - this.previousMaps.push(map) - } - } - }) - } else { - let input = new Input(this.originalCSS, this.opts) - if (input.map) this.previousMaps.push(input.map) - } - } - - return this.previousMaps - } - - setSourcesContent() { - let already = {} - if (this.root) { - this.root.walk(node => { - if (node.source) { - let from = node.source.input.from - if (from && !already[from]) { - already[from] = true - let fromUrl = this.usesFileUrls - ? this.toFileUrl(from) - : this.toUrl(this.path(from)) - this.map.setSourceContent(fromUrl, node.source.input.css) - } - } - }) - } else if (this.css) { - let from = this.opts.from - ? this.toUrl(this.path(this.opts.from)) - : '' - this.map.setSourceContent(from, this.css) - } - } - - sourcePath(node) { - if (this.mapOpts.from) { - return this.toUrl(this.mapOpts.from) - } else if (this.usesFileUrls) { - return this.toFileUrl(node.source.input.from) - } else { - return this.toUrl(this.path(node.source.input.from)) - } - } - - toBase64(str) { - if (Buffer) { - return Buffer.from(str).toString('base64') - } else { - return window.btoa(unescape(encodeURIComponent(str))) - } - } - - toFileUrl(path) { - let cached = this.memoizedFileURLs.get(path) - if (cached) return cached - - if (pathToFileURL) { - let fileURL = pathToFileURL(path).toString() - this.memoizedFileURLs.set(path, fileURL) - - return fileURL - } else { - throw new Error( - '`map.absolute` option is not available in this PostCSS build' - ) - } - } - - toUrl(path) { - let cached = this.memoizedURLs.get(path) - if (cached) return cached - - if (sep === '\\') { - path = path.replace(/\\/g, '/') - } - - let url = encodeURI(path).replace(/[#?]/g, encodeURIComponent) - this.memoizedURLs.set(path, url) - - return url - } -} - -module.exports = MapGenerator diff --git a/node_modules/postcss/lib/no-work-result.d.ts b/node_modules/postcss/lib/no-work-result.d.ts deleted file mode 100644 index 094f30a..0000000 --- a/node_modules/postcss/lib/no-work-result.d.ts +++ /dev/null @@ -1,46 +0,0 @@ -import LazyResult from './lazy-result.js' -import { SourceMap } from './postcss.js' -import Processor from './processor.js' -import Result, { Message, ResultOptions } from './result.js' -import Root from './root.js' -import Warning from './warning.js' - -declare namespace NoWorkResult { - // eslint-disable-next-line @typescript-eslint/no-use-before-define - export { NoWorkResult_ as default } -} - -/** - * A Promise proxy for the result of PostCSS transformations. - * This lazy result instance doesn't parse css unless `NoWorkResult#root` or `Result#root` - * are accessed. See the example below for details. - * A `NoWork` instance is returned by `Processor#process` ONLY when no plugins defined. - * - * ```js - * const noWorkResult = postcss().process(css) // No plugins are defined. - * // CSS is not parsed - * let root = noWorkResult.root // now css is parsed because we accessed the root - * ``` - */ -declare class NoWorkResult_ implements LazyResult { - catch: Promise>['catch'] - finally: Promise>['finally'] - then: Promise>['then'] - get content(): string - get css(): string - get map(): SourceMap - get messages(): Message[] - get opts(): ResultOptions - get processor(): Processor - get root(): Root - get [Symbol.toStringTag](): string - constructor(processor: Processor, css: string, opts: ResultOptions) - async(): Promise> - sync(): Result - toString(): string - warnings(): Warning[] -} - -declare class NoWorkResult extends NoWorkResult_ {} - -export = NoWorkResult diff --git a/node_modules/postcss/lib/no-work-result.js b/node_modules/postcss/lib/no-work-result.js deleted file mode 100644 index dd46182..0000000 --- a/node_modules/postcss/lib/no-work-result.js +++ /dev/null @@ -1,138 +0,0 @@ -'use strict' - -let MapGenerator = require('./map-generator') -let parse = require('./parse') -const Result = require('./result') -let stringify = require('./stringify') -let warnOnce = require('./warn-once') - -class NoWorkResult { - get content() { - return this.result.css - } - - get css() { - return this.result.css - } - - get map() { - return this.result.map - } - - get messages() { - return [] - } - - get opts() { - return this.result.opts - } - - get processor() { - return this.result.processor - } - - get root() { - if (this._root) { - return this._root - } - - let root - let parser = parse - - try { - root = parser(this._css, this._opts) - } catch (error) { - this.error = error - } - - if (this.error) { - throw this.error - } else { - this._root = root - return root - } - } - - get [Symbol.toStringTag]() { - return 'NoWorkResult' - } - - constructor(processor, css, opts) { - css = css.toString() - this.stringified = false - - this._processor = processor - this._css = css - this._opts = opts - this._map = undefined - let root - - let str = stringify - this.result = new Result(this._processor, root, this._opts) - this.result.css = css - - let self = this - Object.defineProperty(this.result, 'root', { - get() { - return self.root - } - }) - - let map = new MapGenerator(str, root, this._opts, css) - if (map.isMap()) { - let [generatedCSS, generatedMap] = map.generate() - if (generatedCSS) { - this.result.css = generatedCSS - } - if (generatedMap) { - this.result.map = generatedMap - } - } else { - map.clearAnnotation() - this.result.css = map.css - } - } - - async() { - if (this.error) return Promise.reject(this.error) - return Promise.resolve(this.result) - } - - catch(onRejected) { - return this.async().catch(onRejected) - } - - finally(onFinally) { - return this.async().then(onFinally, onFinally) - } - - sync() { - if (this.error) throw this.error - return this.result - } - - then(onFulfilled, onRejected) { - if (process.env.NODE_ENV !== 'production') { - if (!('from' in this._opts)) { - warnOnce( - 'Without `from` option PostCSS could generate wrong source map ' + - 'and will not find Browserslist config. Set it to CSS file path ' + - 'or to `undefined` to prevent this warning.' - ) - } - } - - return this.async().then(onFulfilled, onRejected) - } - - toString() { - return this._css - } - - warnings() { - return [] - } -} - -module.exports = NoWorkResult -NoWorkResult.default = NoWorkResult diff --git a/node_modules/postcss/lib/node.d.ts b/node_modules/postcss/lib/node.d.ts deleted file mode 100644 index a09fe4d..0000000 --- a/node_modules/postcss/lib/node.d.ts +++ /dev/null @@ -1,556 +0,0 @@ -import AtRule = require('./at-rule.js') -import { AtRuleProps } from './at-rule.js' -import Comment, { CommentProps } from './comment.js' -import Container, { NewChild } from './container.js' -import CssSyntaxError from './css-syntax-error.js' -import Declaration, { DeclarationProps } from './declaration.js' -import Document from './document.js' -import Input from './input.js' -import { Stringifier, Syntax } from './postcss.js' -import Result from './result.js' -import Root from './root.js' -import Rule, { RuleProps } from './rule.js' -import Warning, { WarningOptions } from './warning.js' - -declare namespace Node { - export type ChildNode = AtRule.default | Comment | Declaration | Rule - - export type AnyNode = - | AtRule.default - | Comment - | Declaration - | Document - | Root - | Rule - - export type ChildProps = - | AtRuleProps - | CommentProps - | DeclarationProps - | RuleProps - - export interface Position { - /** - * Source line in file. In contrast to `offset` it starts from 1. - */ - column: number - - /** - * Source column in file. - */ - line: number - - /** - * Source offset in file. It starts from 0. - */ - offset: number - } - - export interface Range { - /** - * End position, exclusive. - */ - end: Position - - /** - * Start position, inclusive. - */ - start: Position - } - - /** - * Source represents an interface for the {@link Node.source} property. - */ - export interface Source { - /** - * The inclusive ending position for the source - * code of a node. - * - * However, `end.offset` of a non `Root` node is the exclusive position. - * See https://github.com/postcss/postcss/pull/1879 for details. - * - * ```js - * const root = postcss.parse('a { color: black }') - * const a = root.first - * const color = a.first - * - * // The offset of `Root` node is the inclusive position - * css.source.end // { line: 1, column: 19, offset: 18 } - * - * // The offset of non `Root` node is the exclusive position - * a.source.end // { line: 1, column: 18, offset: 18 } - * color.source.end // { line: 1, column: 16, offset: 16 } - * ``` - */ - end?: Position - - /** - * The source file from where a node has originated. - */ - input: Input - - /** - * The inclusive starting position for the source - * code of a node. - */ - start?: Position - } - - /** - * Interface represents an interface for an object received - * as parameter by Node class constructor. - */ - export interface NodeProps { - source?: Source - } - - export interface NodeErrorOptions { - /** - * An ending index inside a node's string that should be highlighted as - * source of error. - */ - endIndex?: number - /** - * An index inside a node's string that should be highlighted as source - * of error. - */ - index?: number - /** - * Plugin name that created this error. PostCSS will set it automatically. - */ - plugin?: string - /** - * A word inside a node's string, that should be highlighted as source - * of error. - */ - word?: string - } - - // eslint-disable-next-line @typescript-eslint/no-shadow - class Node extends Node_ {} - export { Node as default } -} - -/** - * It represents an abstract class that handles common - * methods for other CSS abstract syntax tree nodes. - * - * Any node that represents CSS selector or value should - * not extend the `Node` class. - */ -declare abstract class Node_ { - /** - * It represents parent of the current node. - * - * ```js - * root.nodes[0].parent === root //=> true - * ``` - */ - parent: Container | Document | undefined - - /** - * It represents unnecessary whitespace and characters present - * in the css source code. - * - * Information to generate byte-to-byte equal node string as it was - * in the origin input. - * - * The properties of the raws object are decided by parser, - * the default parser uses the following properties: - * - * * `before`: the space symbols before the node. It also stores `*` - * and `_` symbols before the declaration (IE hack). - * * `after`: the space symbols after the last child of the node - * to the end of the node. - * * `between`: the symbols between the property and value - * for declarations, selector and `{` for rules, or last parameter - * and `{` for at-rules. - * * `semicolon`: contains true if the last child has - * an (optional) semicolon. - * * `afterName`: the space between the at-rule name and its parameters. - * * `left`: the space symbols between `/*` and the comment’s text. - * * `right`: the space symbols between the comment’s text - * and */. - * - `important`: the content of the important statement, - * if it is not just `!important`. - * - * PostCSS filters out the comments inside selectors, declaration values - * and at-rule parameters but it stores the origin content in raws. - * - * ```js - * const root = postcss.parse('a {\n color:black\n}') - * root.first.first.raws //=> { before: '\n ', between: ':' } - * ``` - */ - raws: any - - /** - * It represents information related to origin of a node and is required - * for generating source maps. - * - * The nodes that are created manually using the public APIs - * provided by PostCSS will have `source` undefined and - * will be absent in the source map. - * - * For this reason, the plugin developer should consider - * duplicating nodes as the duplicate node will have the - * same source as the original node by default or assign - * source to a node created manually. - * - * ```js - * decl.source.input.from //=> '/home/ai/source.css' - * decl.source.start //=> { line: 10, column: 2 } - * decl.source.end //=> { line: 10, column: 12 } - * ``` - * - * ```js - * // Incorrect method, source not specified! - * const prefixed = postcss.decl({ - * prop: '-moz-' + decl.prop, - * value: decl.value - * }) - * - * // Correct method, source is inherited when duplicating. - * const prefixed = decl.clone({ - * prop: '-moz-' + decl.prop - * }) - * ``` - * - * ```js - * if (atrule.name === 'add-link') { - * const rule = postcss.rule({ - * selector: 'a', - * source: atrule.source - * }) - * - * atrule.parent.insertBefore(atrule, rule) - * } - * ``` - */ - source?: Node.Source - - /** - * It represents type of a node in - * an abstract syntax tree. - * - * A type of node helps in identification of a node - * and perform operation based on it's type. - * - * ```js - * const declaration = new Declaration({ - * prop: 'color', - * value: 'black' - * }) - * - * declaration.type //=> 'decl' - * ``` - */ - type: string - - constructor(defaults?: object) - - /** - * Insert new node after current node to current node’s parent. - * - * Just alias for `node.parent.insertAfter(node, add)`. - * - * ```js - * decl.after('color: black') - * ``` - * - * @param newNode New node. - * @return This node for methods chain. - */ - after( - newNode: Node | Node.ChildProps | readonly Node[] | string | undefined - ): this - - /** - * It assigns properties to an existing node instance. - * - * ```js - * decl.assign({ prop: 'word-wrap', value: 'break-word' }) - * ``` - * - * @param overrides New properties to override the node. - * - * @return `this` for method chaining. - */ - assign(overrides: object): this - - /** - * Insert new node before current node to current node’s parent. - * - * Just alias for `node.parent.insertBefore(node, add)`. - * - * ```js - * decl.before('content: ""') - * ``` - * - * @param newNode New node. - * @return This node for methods chain. - */ - before( - newNode: Node | Node.ChildProps | readonly Node[] | string | undefined - ): this - - /** - * Clear the code style properties for the node and its children. - * - * ```js - * node.raws.before //=> ' ' - * node.cleanRaws() - * node.raws.before //=> undefined - * ``` - * - * @param keepBetween Keep the `raws.between` symbols. - */ - cleanRaws(keepBetween?: boolean): void - - /** - * It creates clone of an existing node, which includes all the properties - * and their values, that includes `raws` but not `type`. - * - * ```js - * decl.raws.before //=> "\n " - * const cloned = decl.clone({ prop: '-moz-' + decl.prop }) - * cloned.raws.before //=> "\n " - * cloned.toString() //=> -moz-transform: scale(0) - * ``` - * - * @param overrides New properties to override in the clone. - * - * @return Duplicate of the node instance. - */ - clone(overrides?: object): this - - /** - * Shortcut to clone the node and insert the resulting cloned node - * after the current node. - * - * @param overrides New properties to override in the clone. - * @return New node. - */ - cloneAfter(overrides?: object): this - - /** - * Shortcut to clone the node and insert the resulting cloned node - * before the current node. - * - * ```js - * decl.cloneBefore({ prop: '-moz-' + decl.prop }) - * ``` - * - * @param overrides Mew properties to override in the clone. - * - * @return New node - */ - cloneBefore(overrides?: object): this - - /** - * It creates an instance of the class `CssSyntaxError` and parameters passed - * to this method are assigned to the error instance. - * - * The error instance will have description for the - * error, original position of the node in the - * source, showing line and column number. - * - * If any previous map is present, it would be used - * to get original position of the source. - * - * The Previous Map here is referred to the source map - * generated by previous compilation, example: Less, - * Stylus and Sass. - * - * This method returns the error instance instead of - * throwing it. - * - * ```js - * if (!variables[name]) { - * throw decl.error(`Unknown variable ${name}`, { word: name }) - * // CssSyntaxError: postcss-vars:a.sass:4:3: Unknown variable $black - * // color: $black - * // a - * // ^ - * // background: white - * } - * ``` - * - * @param message Description for the error instance. - * @param options Options for the error instance. - * - * @return Error instance is returned. - */ - error(message: string, options?: Node.NodeErrorOptions): CssSyntaxError - - /** - * Returns the next child of the node’s parent. - * Returns `undefined` if the current node is the last child. - * - * ```js - * if (comment.text === 'delete next') { - * const next = comment.next() - * if (next) { - * next.remove() - * } - * } - * ``` - * - * @return Next node. - */ - next(): Node.ChildNode | undefined - - /** - * Get the position for a word or an index inside the node. - * - * @param opts Options. - * @return Position. - */ - positionBy(opts?: Pick): Node.Position - - /** - * Convert string index to line/column. - * - * @param index The symbol number in the node’s string. - * @return Symbol position in file. - */ - positionInside(index: number): Node.Position - - /** - * Returns the previous child of the node’s parent. - * Returns `undefined` if the current node is the first child. - * - * ```js - * const annotation = decl.prev() - * if (annotation.type === 'comment') { - * readAnnotation(annotation.text) - * } - * ``` - * - * @return Previous node. - */ - prev(): Node.ChildNode | undefined - - /** - * Get the range for a word or start and end index inside the node. - * The start index is inclusive; the end index is exclusive. - * - * @param opts Options. - * @return Range. - */ - rangeBy( - opts?: Pick - ): Node.Range - - /** - * Returns a `raws` value. If the node is missing - * the code style property (because the node was manually built or cloned), - * PostCSS will try to autodetect the code style property by looking - * at other nodes in the tree. - * - * ```js - * const root = postcss.parse('a { background: white }') - * root.nodes[0].append({ prop: 'color', value: 'black' }) - * root.nodes[0].nodes[1].raws.before //=> undefined - * root.nodes[0].nodes[1].raw('before') //=> ' ' - * ``` - * - * @param prop Name of code style property. - * @param defaultType Name of default value, it can be missed - * if the value is the same as prop. - * @return {string} Code style value. - */ - raw(prop: string, defaultType?: string): string - - /** - * It removes the node from its parent and deletes its parent property. - * - * ```js - * if (decl.prop.match(/^-webkit-/)) { - * decl.remove() - * } - * ``` - * - * @return `this` for method chaining. - */ - remove(): this - - /** - * Inserts node(s) before the current node and removes the current node. - * - * ```js - * AtRule: { - * mixin: atrule => { - * atrule.replaceWith(mixinRules[atrule.params]) - * } - * } - * ``` - * - * @param nodes Mode(s) to replace current one. - * @return Current node to methods chain. - */ - replaceWith(...nodes: NewChild[]): this - - /** - * Finds the Root instance of the node’s tree. - * - * ```js - * root.nodes[0].nodes[0].root() === root - * ``` - * - * @return Root parent. - */ - root(): Root - - /** - * Fix circular links on `JSON.stringify()`. - * - * @return Cleaned object. - */ - toJSON(): object - - /** - * It compiles the node to browser readable cascading style sheets string - * depending on it's type. - * - * ```js - * new Rule({ selector: 'a' }).toString() //=> "a {}" - * ``` - * - * @param stringifier A syntax to use in string generation. - * @return CSS string of this node. - */ - toString(stringifier?: Stringifier | Syntax): string - - /** - * It is a wrapper for {@link Result#warn}, providing convenient - * way of generating warnings. - * - * ```js - * Declaration: { - * bad: (decl, { result }) => { - * decl.warn(result, 'Deprecated property: bad') - * } - * } - * ``` - * - * @param result The `Result` instance that will receive the warning. - * @param message Description for the warning. - * @param options Options for the warning. - * - * @return `Warning` instance is returned - */ - warn(result: Result, message: string, options?: WarningOptions): Warning - - /** - * If this node isn't already dirty, marks it and its ancestors as such. This - * indicates to the LazyResult processor that the {@link Root} has been - * modified by the current plugin and may need to be processed again by other - * plugins. - */ - protected markDirty(): void -} - -declare class Node extends Node_ {} - -export = Node diff --git a/node_modules/postcss/lib/node.js b/node_modules/postcss/lib/node.js deleted file mode 100644 index b403b71..0000000 --- a/node_modules/postcss/lib/node.js +++ /dev/null @@ -1,449 +0,0 @@ -'use strict' - -let CssSyntaxError = require('./css-syntax-error') -let Stringifier = require('./stringifier') -let stringify = require('./stringify') -let { isClean, my } = require('./symbols') - -function cloneNode(obj, parent) { - let cloned = new obj.constructor() - - for (let i in obj) { - if (!Object.prototype.hasOwnProperty.call(obj, i)) { - /* c8 ignore next 2 */ - continue - } - if (i === 'proxyCache') continue - let value = obj[i] - let type = typeof value - - if (i === 'parent' && type === 'object') { - if (parent) cloned[i] = parent - } else if (i === 'source') { - cloned[i] = value - } else if (Array.isArray(value)) { - cloned[i] = value.map(j => cloneNode(j, cloned)) - } else { - if (type === 'object' && value !== null) value = cloneNode(value) - cloned[i] = value - } - } - - return cloned -} - -function sourceOffset(inputCSS, position) { - // Not all custom syntaxes support `offset` in `source.start` and `source.end` - if (position && typeof position.offset !== 'undefined') { - return position.offset - } - - let column = 1 - let line = 1 - let offset = 0 - - for (let i = 0; i < inputCSS.length; i++) { - if (line === position.line && column === position.column) { - offset = i - break - } - - if (inputCSS[i] === '\n') { - column = 1 - line += 1 - } else { - column += 1 - } - } - - return offset -} - -class Node { - get proxyOf() { - return this - } - - constructor(defaults = {}) { - this.raws = {} - this[isClean] = false - this[my] = true - - for (let name in defaults) { - if (name === 'nodes') { - this.nodes = [] - for (let node of defaults[name]) { - if (typeof node.clone === 'function') { - this.append(node.clone()) - } else { - this.append(node) - } - } - } else { - this[name] = defaults[name] - } - } - } - - addToError(error) { - error.postcssNode = this - if (error.stack && this.source && /\n\s{4}at /.test(error.stack)) { - let s = this.source - error.stack = error.stack.replace( - /\n\s{4}at /, - `$&${s.input.from}:${s.start.line}:${s.start.column}$&` - ) - } - return error - } - - after(add) { - this.parent.insertAfter(this, add) - return this - } - - assign(overrides = {}) { - for (let name in overrides) { - this[name] = overrides[name] - } - return this - } - - before(add) { - this.parent.insertBefore(this, add) - return this - } - - cleanRaws(keepBetween) { - delete this.raws.before - delete this.raws.after - if (!keepBetween) delete this.raws.between - } - - clone(overrides = {}) { - let cloned = cloneNode(this) - for (let name in overrides) { - cloned[name] = overrides[name] - } - return cloned - } - - cloneAfter(overrides = {}) { - let cloned = this.clone(overrides) - this.parent.insertAfter(this, cloned) - return cloned - } - - cloneBefore(overrides = {}) { - let cloned = this.clone(overrides) - this.parent.insertBefore(this, cloned) - return cloned - } - - error(message, opts = {}) { - if (this.source) { - let { end, start } = this.rangeBy(opts) - return this.source.input.error( - message, - { column: start.column, line: start.line }, - { column: end.column, line: end.line }, - opts - ) - } - return new CssSyntaxError(message) - } - - getProxyProcessor() { - return { - get(node, prop) { - if (prop === 'proxyOf') { - return node - } else if (prop === 'root') { - return () => node.root().toProxy() - } else { - return node[prop] - } - }, - - set(node, prop, value) { - if (node[prop] === value) return true - node[prop] = value - if ( - prop === 'prop' || - prop === 'value' || - prop === 'name' || - prop === 'params' || - prop === 'important' || - /* c8 ignore next */ - prop === 'text' - ) { - node.markDirty() - } - return true - } - } - } - - /* c8 ignore next 3 */ - markClean() { - this[isClean] = true - } - - markDirty() { - if (this[isClean]) { - this[isClean] = false - let next = this - while ((next = next.parent)) { - next[isClean] = false - } - } - } - - next() { - if (!this.parent) return undefined - let index = this.parent.index(this) - return this.parent.nodes[index + 1] - } - - positionBy(opts = {}) { - let pos = this.source.start - if (opts.index) { - pos = this.positionInside(opts.index) - } else if (opts.word) { - let inputString = - 'document' in this.source.input - ? this.source.input.document - : this.source.input.css - let stringRepresentation = inputString.slice( - sourceOffset(inputString, this.source.start), - sourceOffset(inputString, this.source.end) - ) - let index = stringRepresentation.indexOf(opts.word) - if (index !== -1) pos = this.positionInside(index) - } - return pos - } - - positionInside(index) { - let column = this.source.start.column - let line = this.source.start.line - let inputString = - 'document' in this.source.input - ? this.source.input.document - : this.source.input.css - let offset = sourceOffset(inputString, this.source.start) - let end = offset + index - - for (let i = offset; i < end; i++) { - if (inputString[i] === '\n') { - column = 1 - line += 1 - } else { - column += 1 - } - } - - return { column, line, offset: end } - } - - prev() { - if (!this.parent) return undefined - let index = this.parent.index(this) - return this.parent.nodes[index - 1] - } - - rangeBy(opts = {}) { - let inputString = - 'document' in this.source.input - ? this.source.input.document - : this.source.input.css - let start = { - column: this.source.start.column, - line: this.source.start.line, - offset: sourceOffset(inputString, this.source.start) - } - let end = this.source.end - ? { - column: this.source.end.column + 1, - line: this.source.end.line, - offset: - typeof this.source.end.offset === 'number' - ? // `source.end.offset` is exclusive, so we don't need to add 1 - this.source.end.offset - : // Since line/column in this.source.end is inclusive, - // the `sourceOffset(... , this.source.end)` returns an inclusive offset. - // So, we add 1 to convert it to exclusive. - sourceOffset(inputString, this.source.end) + 1 - } - : { - column: start.column + 1, - line: start.line, - offset: start.offset + 1 - } - - if (opts.word) { - let stringRepresentation = inputString.slice( - sourceOffset(inputString, this.source.start), - sourceOffset(inputString, this.source.end) - ) - let index = stringRepresentation.indexOf(opts.word) - if (index !== -1) { - start = this.positionInside(index) - end = this.positionInside(index + opts.word.length) - } - } else { - if (opts.start) { - start = { - column: opts.start.column, - line: opts.start.line, - offset: sourceOffset(inputString, opts.start) - } - } else if (opts.index) { - start = this.positionInside(opts.index) - } - - if (opts.end) { - end = { - column: opts.end.column, - line: opts.end.line, - offset: sourceOffset(inputString, opts.end) - } - } else if (typeof opts.endIndex === 'number') { - end = this.positionInside(opts.endIndex) - } else if (opts.index) { - end = this.positionInside(opts.index + 1) - } - } - - if ( - end.line < start.line || - (end.line === start.line && end.column <= start.column) - ) { - end = { - column: start.column + 1, - line: start.line, - offset: start.offset + 1 - } - } - - return { end, start } - } - - raw(prop, defaultType) { - let str = new Stringifier() - return str.raw(this, prop, defaultType) - } - - remove() { - if (this.parent) { - this.parent.removeChild(this) - } - this.parent = undefined - return this - } - - replaceWith(...nodes) { - if (this.parent) { - let bookmark = this - let foundSelf = false - for (let node of nodes) { - if (node === this) { - foundSelf = true - } else if (foundSelf) { - this.parent.insertAfter(bookmark, node) - bookmark = node - } else { - this.parent.insertBefore(bookmark, node) - } - } - - if (!foundSelf) { - this.remove() - } - } - - return this - } - - root() { - let result = this - while (result.parent && result.parent.type !== 'document') { - result = result.parent - } - return result - } - - toJSON(_, inputs) { - let fixed = {} - let emitInputs = inputs == null - inputs = inputs || new Map() - let inputsNextIndex = 0 - - for (let name in this) { - if (!Object.prototype.hasOwnProperty.call(this, name)) { - /* c8 ignore next 2 */ - continue - } - if (name === 'parent' || name === 'proxyCache') continue - let value = this[name] - - if (Array.isArray(value)) { - fixed[name] = value.map(i => { - if (typeof i === 'object' && i.toJSON) { - return i.toJSON(null, inputs) - } else { - return i - } - }) - } else if (typeof value === 'object' && value.toJSON) { - fixed[name] = value.toJSON(null, inputs) - } else if (name === 'source') { - if (value == null) continue - let inputId = inputs.get(value.input) - if (inputId == null) { - inputId = inputsNextIndex - inputs.set(value.input, inputsNextIndex) - inputsNextIndex++ - } - fixed[name] = { - end: value.end, - inputId, - start: value.start - } - } else { - fixed[name] = value - } - } - - if (emitInputs) { - fixed.inputs = [...inputs.keys()].map(input => input.toJSON()) - } - - return fixed - } - - toProxy() { - if (!this.proxyCache) { - this.proxyCache = new Proxy(this, this.getProxyProcessor()) - } - return this.proxyCache - } - - toString(stringifier = stringify) { - if (stringifier.stringify) stringifier = stringifier.stringify - let result = '' - stringifier(this, i => { - result += i - }) - return result - } - - warn(result, text, opts = {}) { - let data = { node: this } - for (let i in opts) data[i] = opts[i] - return result.warn(text, data) - } -} - -module.exports = Node -Node.default = Node diff --git a/node_modules/postcss/lib/parse.d.ts b/node_modules/postcss/lib/parse.d.ts deleted file mode 100644 index 4c943a4..0000000 --- a/node_modules/postcss/lib/parse.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Parser } from './postcss.js' - -interface Parse extends Parser { - default: Parse -} - -declare const parse: Parse - -export = parse diff --git a/node_modules/postcss/lib/parse.js b/node_modules/postcss/lib/parse.js deleted file mode 100644 index 00a1037..0000000 --- a/node_modules/postcss/lib/parse.js +++ /dev/null @@ -1,42 +0,0 @@ -'use strict' - -let Container = require('./container') -let Input = require('./input') -let Parser = require('./parser') - -function parse(css, opts) { - let input = new Input(css, opts) - let parser = new Parser(input) - try { - parser.parse() - } catch (e) { - if (process.env.NODE_ENV !== 'production') { - if (e.name === 'CssSyntaxError' && opts && opts.from) { - if (/\.scss$/i.test(opts.from)) { - e.message += - '\nYou tried to parse SCSS with ' + - 'the standard CSS parser; ' + - 'try again with the postcss-scss parser' - } else if (/\.sass/i.test(opts.from)) { - e.message += - '\nYou tried to parse Sass with ' + - 'the standard CSS parser; ' + - 'try again with the postcss-sass parser' - } else if (/\.less$/i.test(opts.from)) { - e.message += - '\nYou tried to parse Less with ' + - 'the standard CSS parser; ' + - 'try again with the postcss-less parser' - } - } - } - throw e - } - - return parser.root -} - -module.exports = parse -parse.default = parse - -Container.registerParse(parse) diff --git a/node_modules/postcss/lib/parser.js b/node_modules/postcss/lib/parser.js deleted file mode 100644 index 64fb5d8..0000000 --- a/node_modules/postcss/lib/parser.js +++ /dev/null @@ -1,611 +0,0 @@ -'use strict' - -let AtRule = require('./at-rule') -let Comment = require('./comment') -let Declaration = require('./declaration') -let Root = require('./root') -let Rule = require('./rule') -let tokenizer = require('./tokenize') - -const SAFE_COMMENT_NEIGHBOR = { - empty: true, - space: true -} - -function findLastWithPosition(tokens) { - for (let i = tokens.length - 1; i >= 0; i--) { - let token = tokens[i] - let pos = token[3] || token[2] - if (pos) return pos - } -} - -class Parser { - constructor(input) { - this.input = input - - this.root = new Root() - this.current = this.root - this.spaces = '' - this.semicolon = false - - this.createTokenizer() - this.root.source = { input, start: { column: 1, line: 1, offset: 0 } } - } - - atrule(token) { - let node = new AtRule() - node.name = token[1].slice(1) - if (node.name === '') { - this.unnamedAtrule(node, token) - } - this.init(node, token[2]) - - let type - let prev - let shift - let last = false - let open = false - let params = [] - let brackets = [] - - while (!this.tokenizer.endOfFile()) { - token = this.tokenizer.nextToken() - type = token[0] - - if (type === '(' || type === '[') { - brackets.push(type === '(' ? ')' : ']') - } else if (type === '{' && brackets.length > 0) { - brackets.push('}') - } else if (type === brackets[brackets.length - 1]) { - brackets.pop() - } - - if (brackets.length === 0) { - if (type === ';') { - node.source.end = this.getPosition(token[2]) - node.source.end.offset++ - this.semicolon = true - break - } else if (type === '{') { - open = true - break - } else if (type === '}') { - if (params.length > 0) { - shift = params.length - 1 - prev = params[shift] - while (prev && prev[0] === 'space') { - prev = params[--shift] - } - if (prev) { - node.source.end = this.getPosition(prev[3] || prev[2]) - node.source.end.offset++ - } - } - this.end(token) - break - } else { - params.push(token) - } - } else { - params.push(token) - } - - if (this.tokenizer.endOfFile()) { - last = true - break - } - } - - node.raws.between = this.spacesAndCommentsFromEnd(params) - if (params.length) { - node.raws.afterName = this.spacesAndCommentsFromStart(params) - this.raw(node, 'params', params) - if (last) { - token = params[params.length - 1] - node.source.end = this.getPosition(token[3] || token[2]) - node.source.end.offset++ - this.spaces = node.raws.between - node.raws.between = '' - } - } else { - node.raws.afterName = '' - node.params = '' - } - - if (open) { - node.nodes = [] - this.current = node - } - } - - checkMissedSemicolon(tokens) { - let colon = this.colon(tokens) - if (colon === false) return - - let founded = 0 - let token - for (let j = colon - 1; j >= 0; j--) { - token = tokens[j] - if (token[0] !== 'space') { - founded += 1 - if (founded === 2) break - } - } - // If the token is a word, e.g. `!important`, `red` or any other valid property's value. - // Then we need to return the colon after that word token. [3] is the "end" colon of that word. - // And because we need it after that one we do +1 to get the next one. - throw this.input.error( - 'Missed semicolon', - token[0] === 'word' ? token[3] + 1 : token[2] - ) - } - - colon(tokens) { - let brackets = 0 - let prev, token, type - for (let [i, element] of tokens.entries()) { - token = element - type = token[0] - - if (type === '(') { - brackets += 1 - } - if (type === ')') { - brackets -= 1 - } - if (brackets === 0 && type === ':') { - if (!prev) { - this.doubleColon(token) - } else if (prev[0] === 'word' && prev[1] === 'progid') { - continue - } else { - return i - } - } - - prev = token - } - return false - } - - comment(token) { - let node = new Comment() - this.init(node, token[2]) - node.source.end = this.getPosition(token[3] || token[2]) - node.source.end.offset++ - - let text = token[1].slice(2, -2) - if (/^\s*$/.test(text)) { - node.text = '' - node.raws.left = text - node.raws.right = '' - } else { - let match = text.match(/^(\s*)([^]*\S)(\s*)$/) - node.text = match[2] - node.raws.left = match[1] - node.raws.right = match[3] - } - } - - createTokenizer() { - this.tokenizer = tokenizer(this.input) - } - - decl(tokens, customProperty) { - let node = new Declaration() - this.init(node, tokens[0][2]) - - let last = tokens[tokens.length - 1] - if (last[0] === ';') { - this.semicolon = true - tokens.pop() - } - - node.source.end = this.getPosition( - last[3] || last[2] || findLastWithPosition(tokens) - ) - node.source.end.offset++ - - while (tokens[0][0] !== 'word') { - if (tokens.length === 1) this.unknownWord(tokens) - node.raws.before += tokens.shift()[1] - } - node.source.start = this.getPosition(tokens[0][2]) - - node.prop = '' - while (tokens.length) { - let type = tokens[0][0] - if (type === ':' || type === 'space' || type === 'comment') { - break - } - node.prop += tokens.shift()[1] - } - - node.raws.between = '' - - let token - while (tokens.length) { - token = tokens.shift() - - if (token[0] === ':') { - node.raws.between += token[1] - break - } else { - if (token[0] === 'word' && /\w/.test(token[1])) { - this.unknownWord([token]) - } - node.raws.between += token[1] - } - } - - if (node.prop[0] === '_' || node.prop[0] === '*') { - node.raws.before += node.prop[0] - node.prop = node.prop.slice(1) - } - - let firstSpaces = [] - let next - while (tokens.length) { - next = tokens[0][0] - if (next !== 'space' && next !== 'comment') break - firstSpaces.push(tokens.shift()) - } - - this.precheckMissedSemicolon(tokens) - - for (let i = tokens.length - 1; i >= 0; i--) { - token = tokens[i] - if (token[1].toLowerCase() === '!important') { - node.important = true - let string = this.stringFrom(tokens, i) - string = this.spacesFromEnd(tokens) + string - if (string !== ' !important') node.raws.important = string - break - } else if (token[1].toLowerCase() === 'important') { - let cache = tokens.slice(0) - let str = '' - for (let j = i; j > 0; j--) { - let type = cache[j][0] - if (str.trim().startsWith('!') && type !== 'space') { - break - } - str = cache.pop()[1] + str - } - if (str.trim().startsWith('!')) { - node.important = true - node.raws.important = str - tokens = cache - } - } - - if (token[0] !== 'space' && token[0] !== 'comment') { - break - } - } - - let hasWord = tokens.some(i => i[0] !== 'space' && i[0] !== 'comment') - - if (hasWord) { - node.raws.between += firstSpaces.map(i => i[1]).join('') - firstSpaces = [] - } - this.raw(node, 'value', firstSpaces.concat(tokens), customProperty) - - if (node.value.includes(':') && !customProperty) { - this.checkMissedSemicolon(tokens) - } - } - - doubleColon(token) { - throw this.input.error( - 'Double colon', - { offset: token[2] }, - { offset: token[2] + token[1].length } - ) - } - - emptyRule(token) { - let node = new Rule() - this.init(node, token[2]) - node.selector = '' - node.raws.between = '' - this.current = node - } - - end(token) { - if (this.current.nodes && this.current.nodes.length) { - this.current.raws.semicolon = this.semicolon - } - this.semicolon = false - - this.current.raws.after = (this.current.raws.after || '') + this.spaces - this.spaces = '' - - if (this.current.parent) { - this.current.source.end = this.getPosition(token[2]) - this.current.source.end.offset++ - this.current = this.current.parent - } else { - this.unexpectedClose(token) - } - } - - endFile() { - if (this.current.parent) this.unclosedBlock() - if (this.current.nodes && this.current.nodes.length) { - this.current.raws.semicolon = this.semicolon - } - this.current.raws.after = (this.current.raws.after || '') + this.spaces - this.root.source.end = this.getPosition(this.tokenizer.position()) - } - - freeSemicolon(token) { - this.spaces += token[1] - if (this.current.nodes) { - let prev = this.current.nodes[this.current.nodes.length - 1] - if (prev && prev.type === 'rule' && !prev.raws.ownSemicolon) { - prev.raws.ownSemicolon = this.spaces - this.spaces = '' - prev.source.end = this.getPosition(token[2]) - prev.source.end.offset += prev.raws.ownSemicolon.length - } - } - } - - // Helpers - - getPosition(offset) { - let pos = this.input.fromOffset(offset) - return { - column: pos.col, - line: pos.line, - offset - } - } - - init(node, offset) { - this.current.push(node) - node.source = { - input: this.input, - start: this.getPosition(offset) - } - node.raws.before = this.spaces - this.spaces = '' - if (node.type !== 'comment') this.semicolon = false - } - - other(start) { - let end = false - let type = null - let colon = false - let bracket = null - let brackets = [] - let customProperty = start[1].startsWith('--') - - let tokens = [] - let token = start - while (token) { - type = token[0] - tokens.push(token) - - if (type === '(' || type === '[') { - if (!bracket) bracket = token - brackets.push(type === '(' ? ')' : ']') - } else if (customProperty && colon && type === '{') { - if (!bracket) bracket = token - brackets.push('}') - } else if (brackets.length === 0) { - if (type === ';') { - if (colon) { - this.decl(tokens, customProperty) - return - } else { - break - } - } else if (type === '{') { - this.rule(tokens) - return - } else if (type === '}') { - this.tokenizer.back(tokens.pop()) - end = true - break - } else if (type === ':') { - colon = true - } - } else if (type === brackets[brackets.length - 1]) { - brackets.pop() - if (brackets.length === 0) bracket = null - } - - token = this.tokenizer.nextToken() - } - - if (this.tokenizer.endOfFile()) end = true - if (brackets.length > 0) this.unclosedBracket(bracket) - - if (end && colon) { - if (!customProperty) { - while (tokens.length) { - token = tokens[tokens.length - 1][0] - if (token !== 'space' && token !== 'comment') break - this.tokenizer.back(tokens.pop()) - } - } - this.decl(tokens, customProperty) - } else { - this.unknownWord(tokens) - } - } - - parse() { - let token - while (!this.tokenizer.endOfFile()) { - token = this.tokenizer.nextToken() - - switch (token[0]) { - case 'space': - this.spaces += token[1] - break - - case ';': - this.freeSemicolon(token) - break - - case '}': - this.end(token) - break - - case 'comment': - this.comment(token) - break - - case 'at-word': - this.atrule(token) - break - - case '{': - this.emptyRule(token) - break - - default: - this.other(token) - break - } - } - this.endFile() - } - - precheckMissedSemicolon(/* tokens */) { - // Hook for Safe Parser - } - - raw(node, prop, tokens, customProperty) { - let token, type - let length = tokens.length - let value = '' - let clean = true - let next, prev - - for (let i = 0; i < length; i += 1) { - token = tokens[i] - type = token[0] - if (type === 'space' && i === length - 1 && !customProperty) { - clean = false - } else if (type === 'comment') { - prev = tokens[i - 1] ? tokens[i - 1][0] : 'empty' - next = tokens[i + 1] ? tokens[i + 1][0] : 'empty' - if (!SAFE_COMMENT_NEIGHBOR[prev] && !SAFE_COMMENT_NEIGHBOR[next]) { - if (value.slice(-1) === ',') { - clean = false - } else { - value += token[1] - } - } else { - clean = false - } - } else { - value += token[1] - } - } - if (!clean) { - let raw = tokens.reduce((all, i) => all + i[1], '') - node.raws[prop] = { raw, value } - } - node[prop] = value - } - - rule(tokens) { - tokens.pop() - - let node = new Rule() - this.init(node, tokens[0][2]) - - node.raws.between = this.spacesAndCommentsFromEnd(tokens) - this.raw(node, 'selector', tokens) - this.current = node - } - - spacesAndCommentsFromEnd(tokens) { - let lastTokenType - let spaces = '' - while (tokens.length) { - lastTokenType = tokens[tokens.length - 1][0] - if (lastTokenType !== 'space' && lastTokenType !== 'comment') break - spaces = tokens.pop()[1] + spaces - } - return spaces - } - - // Errors - - spacesAndCommentsFromStart(tokens) { - let next - let spaces = '' - while (tokens.length) { - next = tokens[0][0] - if (next !== 'space' && next !== 'comment') break - spaces += tokens.shift()[1] - } - return spaces - } - - spacesFromEnd(tokens) { - let lastTokenType - let spaces = '' - while (tokens.length) { - lastTokenType = tokens[tokens.length - 1][0] - if (lastTokenType !== 'space') break - spaces = tokens.pop()[1] + spaces - } - return spaces - } - - stringFrom(tokens, from) { - let result = '' - for (let i = from; i < tokens.length; i++) { - result += tokens[i][1] - } - tokens.splice(from, tokens.length - from) - return result - } - - unclosedBlock() { - let pos = this.current.source.start - throw this.input.error('Unclosed block', pos.line, pos.column) - } - - unclosedBracket(bracket) { - throw this.input.error( - 'Unclosed bracket', - { offset: bracket[2] }, - { offset: bracket[2] + 1 } - ) - } - - unexpectedClose(token) { - throw this.input.error( - 'Unexpected }', - { offset: token[2] }, - { offset: token[2] + 1 } - ) - } - - unknownWord(tokens) { - throw this.input.error( - 'Unknown word ' + tokens[0][1], - { offset: tokens[0][2] }, - { offset: tokens[0][2] + tokens[0][1].length } - ) - } - - unnamedAtrule(node, token) { - throw this.input.error( - 'At-rule without name', - { offset: token[2] }, - { offset: token[2] + token[1].length } - ) - } -} - -module.exports = Parser diff --git a/node_modules/postcss/lib/postcss.d.mts b/node_modules/postcss/lib/postcss.d.mts deleted file mode 100644 index d343f3c..0000000 --- a/node_modules/postcss/lib/postcss.d.mts +++ /dev/null @@ -1,69 +0,0 @@ -export { - // Type-only exports - AcceptedPlugin, - - AnyNode, - atRule, - AtRule, - AtRuleProps, - Builder, - ChildNode, - ChildProps, - comment, - Comment, - CommentProps, - Container, - ContainerProps, - CssSyntaxError, - decl, - Declaration, - DeclarationProps, - // postcss function / namespace - default, - document, - Document, - DocumentProps, - FilePosition, - fromJSON, - Helpers, - Input, - - JSONHydrator, - // This is a class, but it’s not re-exported. That’s why it’s exported as type-only here. - type LazyResult, - list, - Message, - Node, - NodeErrorOptions, - NodeProps, - OldPlugin, - parse, - Parser, - // @ts-expect-error This value exists, but it’s untyped. - plugin, - Plugin, - PluginCreator, - Position, - Postcss, - ProcessOptions, - Processor, - Result, - root, - Root, - RootProps, - rule, - Rule, - RuleProps, - Source, - SourceMap, - SourceMapOptions, - Stringifier, - // Value exports from postcss.mjs - stringify, - Syntax, - TransformCallback, - Transformer, - Warning, - - WarningOptions -} from './postcss.js' diff --git a/node_modules/postcss/lib/postcss.d.ts b/node_modules/postcss/lib/postcss.d.ts deleted file mode 100644 index c5e3605..0000000 --- a/node_modules/postcss/lib/postcss.d.ts +++ /dev/null @@ -1,458 +0,0 @@ -import { RawSourceMap, SourceMapGenerator } from 'source-map-js' - -import AtRule, { AtRuleProps } from './at-rule.js' -import Comment, { CommentProps } from './comment.js' -import Container, { ContainerProps, NewChild } from './container.js' -import CssSyntaxError from './css-syntax-error.js' -import Declaration, { DeclarationProps } from './declaration.js' -import Document, { DocumentProps } from './document.js' -import Input, { FilePosition } from './input.js' -import LazyResult from './lazy-result.js' -import list from './list.js' -import Node, { - AnyNode, - ChildNode, - ChildProps, - NodeErrorOptions, - NodeProps, - Position, - Source -} from './node.js' -import Processor from './processor.js' -import Result, { Message } from './result.js' -import Root, { RootProps } from './root.js' -import Rule, { RuleProps } from './rule.js' -import Warning, { WarningOptions } from './warning.js' - -type DocumentProcessor = ( - document: Document, - helper: postcss.Helpers -) => Promise | void -type RootProcessor = ( - root: Root, - helper: postcss.Helpers -) => Promise | void -type DeclarationProcessor = ( - decl: Declaration, - helper: postcss.Helpers -) => Promise | void -type RuleProcessor = ( - rule: Rule, - helper: postcss.Helpers -) => Promise | void -type AtRuleProcessor = ( - atRule: AtRule, - helper: postcss.Helpers -) => Promise | void -type CommentProcessor = ( - comment: Comment, - helper: postcss.Helpers -) => Promise | void - -interface Processors { - /** - * Will be called on all`AtRule` nodes. - * - * Will be called again on node or children changes. - */ - AtRule?: { [name: string]: AtRuleProcessor } | AtRuleProcessor - - /** - * Will be called on all `AtRule` nodes, when all children will be processed. - * - * Will be called again on node or children changes. - */ - AtRuleExit?: { [name: string]: AtRuleProcessor } | AtRuleProcessor - - /** - * Will be called on all `Comment` nodes. - * - * Will be called again on node or children changes. - */ - Comment?: CommentProcessor - - /** - * Will be called on all `Comment` nodes after listeners - * for `Comment` event. - * - * Will be called again on node or children changes. - */ - CommentExit?: CommentProcessor - - /** - * Will be called on all `Declaration` nodes after listeners - * for `Declaration` event. - * - * Will be called again on node or children changes. - */ - Declaration?: { [prop: string]: DeclarationProcessor } | DeclarationProcessor - - /** - * Will be called on all `Declaration` nodes. - * - * Will be called again on node or children changes. - */ - DeclarationExit?: - | { [prop: string]: DeclarationProcessor } - | DeclarationProcessor - - /** - * Will be called on `Document` node. - * - * Will be called again on children changes. - */ - Document?: DocumentProcessor - - /** - * Will be called on `Document` node, when all children will be processed. - * - * Will be called again on children changes. - */ - DocumentExit?: DocumentProcessor - - /** - * Will be called on `Root` node once. - */ - Once?: RootProcessor - - /** - * Will be called on `Root` node once, when all children will be processed. - */ - OnceExit?: RootProcessor - - /** - * Will be called on `Root` node. - * - * Will be called again on children changes. - */ - Root?: RootProcessor - - /** - * Will be called on `Root` node, when all children will be processed. - * - * Will be called again on children changes. - */ - RootExit?: RootProcessor - - /** - * Will be called on all `Rule` nodes. - * - * Will be called again on node or children changes. - */ - Rule?: RuleProcessor - - /** - * Will be called on all `Rule` nodes, when all children will be processed. - * - * Will be called again on node or children changes. - */ - RuleExit?: RuleProcessor -} - -declare namespace postcss { - export { - AnyNode, - AtRule, - AtRuleProps, - ChildNode, - ChildProps, - Comment, - CommentProps, - Container, - ContainerProps, - CssSyntaxError, - Declaration, - DeclarationProps, - Document, - DocumentProps, - FilePosition, - Input, - LazyResult, - list, - Message, - NewChild, - Node, - NodeErrorOptions, - NodeProps, - Position, - Processor, - Result, - Root, - RootProps, - Rule, - RuleProps, - Source, - Warning, - WarningOptions - } - - export type SourceMap = { - toJSON(): RawSourceMap - } & SourceMapGenerator - - export type Helpers = { postcss: Postcss; result: Result } & Postcss - - export interface Plugin extends Processors { - postcssPlugin: string - prepare?: (result: Result) => Processors - } - - export interface PluginCreator { - (opts?: PluginOptions): Plugin | Processor - postcss: true - } - - export interface Transformer extends TransformCallback { - postcssPlugin: string - postcssVersion: string - } - - export interface TransformCallback { - (root: Root, result: Result): Promise | void - } - - export interface OldPlugin extends Transformer { - (opts?: T): Transformer - postcss: Transformer - } - - export type AcceptedPlugin = - | { - postcss: Processor | TransformCallback - } - | OldPlugin - | Plugin - | PluginCreator - | Processor - | TransformCallback - - export interface Parser { - ( - css: { toString(): string } | string, - opts?: Pick - ): RootNode - } - - export interface Builder { - (part: string, node?: AnyNode, type?: 'end' | 'start'): void - } - - export interface Stringifier { - (node: AnyNode, builder: Builder): void - } - - export interface JSONHydrator { - (data: object): Node - (data: object[]): Node[] - } - - export interface Syntax { - /** - * Function to generate AST by string. - */ - parse?: Parser - - /** - * Class to generate string by AST. - */ - stringify?: Stringifier - } - - export interface SourceMapOptions { - /** - * Use absolute path in generated source map. - */ - absolute?: boolean - - /** - * Indicates that PostCSS should add annotation comments to the CSS. - * By default, PostCSS will always add a comment with a path - * to the source map. PostCSS will not add annotations to CSS files - * that do not contain any comments. - * - * By default, PostCSS presumes that you want to save the source map as - * `opts.to + '.map'` and will use this path in the annotation comment. - * A different path can be set by providing a string value for annotation. - * - * If you have set `inline: true`, annotation cannot be disabled. - */ - annotation?: ((file: string, root: Root) => string) | boolean | string - - /** - * Override `from` in map’s sources. - */ - from?: string - - /** - * Indicates that the source map should be embedded in the output CSS - * as a Base64-encoded comment. By default, it is `true`. - * But if all previous maps are external, not inline, PostCSS will not embed - * the map even if you do not set this option. - * - * If you have an inline source map, the result.map property will be empty, - * as the source map will be contained within the text of `result.css`. - */ - inline?: boolean - - /** - * Source map content from a previous processing step (e.g., Sass). - * - * PostCSS will try to read the previous source map - * automatically (based on comments within the source CSS), but you can use - * this option to identify it manually. - * - * If desired, you can omit the previous map with prev: `false`. - */ - prev?: ((file: string) => string) | boolean | object | string - - /** - * Indicates that PostCSS should set the origin content (e.g., Sass source) - * of the source map. By default, it is true. But if all previous maps do not - * contain sources content, PostCSS will also leave it out even if you - * do not set this option. - */ - sourcesContent?: boolean - } - - export interface ProcessOptions { - /** - * Input file if it is not simple CSS file, but HTML with

    ~e>-y_c|M2r%e!lB|F3;P~pPt6SipFJC71m7G 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πRyu5l)*3n4Gvdp=){b^ERdz# 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⋙O5bYlhi(xBH1Z^); z=?^0Nq=CA&XY5-@N%Az~NA&Fm>QW#7S?O;LMVpRbI-a4Qdxvfxm1KB=0bO@6?d#AE zMtF>~4e=991x>nr@1Yc{S4`_Qlj6nR%es9eFFiTjK0C~IB+pS-BW73Esd*#rwBb56 zN$DJ2Z}i)>T07#&dWJk9raTsL6|iMSR3d!Z1*ml-b51|cWyY8qno>xwd?T?uzfh z^DLMniThb`sqo=)a>e+b^bI;XzRTg+-C%4~Ik27CvAS=p+16;?H}|3dIM*xdCfu3I zyG~^;R%wV;R5&l3-e7D};6ImUXT{%GYR%B!cv64k9%bFHGIuHOZk4%FrEk*TSRO8J zFrr4ZTzyMj=qPJk#F~@+l-bK_yM~f%@$CKFB$oNL2*1=JG-kxNBvS9cKGXfUNUw2~ zojYE7C&}zTxDfuTlVtF>_(ETCA?p*%+GJ%vvb>M2%$rtzqb_HDx(tug8SL@+h-YN- z1a-B}|D2KkT5AzWG*Jf&_zn8@lZ}sUW|3X@1R+YS$Jb=t<1y#@vlw#L1Gcrn&fI5v z_uH9ucJ@|X7W_>aJ}WCii76TLE>B_M))KNJluqIiPNZFV5DZ#E>WX{G<4YvuL;?}*P(WKAW)(dv#8QXhSW2x`6 z(+`6-i|6E@WcZ$(lFZ7l1ZxH^h3RS=_$Wp>9Og!n3M6_PmuSf{%yc_-v0L5F;eusT z47tCd_K#b;=t#jbD^^Cl2Zm~6DOzQ;wMtUgYNPN>LU3bIv|>3xh$hy)W~$xvlAWB& zEerVAy6Vm`!EM>r#WPE`Tn`+iORf4vIi-(01>s=5)Ue@*XyJ*Oi+ zr?;vNq=z2B_sE0vkCr*VPJW))UpONuSn|EP<%tEdvb4+i^cI=%sY5D#@B=Xe?R*t* z=C~_rQN@1rkZKxea~9xT7TXlx z)4G@jk+lHa)Bz@xxmhGk02&iU1~*8`7?m={nZ|h2I4ouS#5N8mqQj3ES~``-w`g_z zURYRVl#Z3g8R(7pZ6w7XWXerdnRu_AB3)m!l&(&Rh;j8EQ-Q!!P+!PGHmOBDgyS(8 z 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 iTv)>w+i{V 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หWVRw4 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 VJd@>5d! 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�ETs5+#CtrtOeb9lqzc}$cFDdb-n9aum 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%0DW6`JPq&vfb2RG|-D^nvT8k6pB& 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%0Aw+7zJwsgNyC2g!(nvHI~LM6fjn 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%0AM%OFKoSQ_NMH6V#S$cZCY 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

f{;jXL&|iGkKotUrZegOK*oftJVB`-||KN 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 jpFJM}lV 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�&#M7$)}%6~`D3u& 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%0AnNwupJw<_XeU)aBL0L;GJk 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�UuY9a9E(bW6H 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%0AgI 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